rtracklayer/DESCRIPTION0000644000175100017510000000326012612032142015615 0ustar00biocbuildbiocbuildPackage: rtracklayer Title: R interface to genome browsers and their annotation tracks Version: 1.30.1 Author: Michael Lawrence, Vince Carey, Robert Gentleman Depends: R (>= 2.10), methods, GenomicRanges (>= 1.21.20) Imports: XML (>= 1.98-0), BiocGenerics (>= 0.13.8), S4Vectors (>= 0.7.11), IRanges (>= 2.3.7), XVector (>= 0.9.4), GenomeInfoDb (>= 1.3.14), Biostrings (>= 2.37.1), zlibbioc, RCurl (>= 1.4-2), Rsamtools (>= 1.17.8), GenomicAlignments (>= 1.5.4), tools Suggests: BSgenome (>= 1.33.4), humanStemCell, microRNA (>= 1.1.1), genefilter, limma, org.Hs.eg.db, hgu133plus2.db, BSgenome.Hsapiens.UCSC.hg19, TxDb.Hsapiens.UCSC.hg19.knownGene LinkingTo: S4Vectors, IRanges, XVector Description: Extensible framework for interacting with multiple genome browsers (currently UCSC built-in) and manipulating annotation tracks in various formats (currently GFF, BED, bedGraph, BED15, WIG, BigWig and 2bit built-in). The user may export/import tracks to/from the supported browsers, as well as query and modify the browser state, such as the current viewport. Maintainer: Michael Lawrence License: Artistic-2.0 ExtraLicenses: The files in the 'src/ucsc' directory are licensed for all use by Jim Kent, in a manner compatible with the Artistic 2.0 license. Collate: io.R web.R ranges.R trackDb.R browser.R ucsc.R readGFF.R gff.R bed.R wig.R utils.R bigWig.R chain.R quickload.R twobit.R fasta.R tabix.R bam.R trackTable.R index.R compression.R test_rtracklayer_package.R ncbi.R biocViews: Annotation,Visualization,DataImport NeedsCompilation: yes Packaged: 2015-10-22 00:57:06 UTC; biocbuild rtracklayer/NAMESPACE0000644000175100017510000001151612607264731015350 0ustar00biocbuildbiocbuilduseDynLib(rtracklayer, .registration = TRUE) ## ============================================================ ## Import ## ============================================================ import(methods) import(BiocGenerics) import(zlibbioc) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### base packages ### importFrom("stats", offset, setNames) importFrom("utils", count.fields, URLdecode, URLencode, browseURL, download.file, read.table, type.convert, write.table) importFrom("tools", file_path_as_absolute, file_ext, file_path_sans_ext) importFrom("grDevices", col2rgb, rgb) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Non-bioconductor packages ### importFrom("XML", getNodeSet, xmlValue, xmlAttrs, htmlTreeParse, xmlInternalTreeParse, parseURI, newXMLNode, xmlChildren, addChildren, removeChildren) importMethodsFrom("XML", saveXML) importFrom("RCurl", curlUnescape, fileUpload, getCurlHandle, getForm, getURL, postForm) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Bioconductor packages ### import(S4Vectors) import(XVector) import(GenomeInfoDb) import(IRanges) import(GenomicRanges) importFrom("Biostrings", get_seqtype_conversion_lookup, writeXStringSet, DNAStringSet, DNA_BASES, DNA_ALPHABET, alphabetFrequency) importMethodsFrom("Biostrings", masks, "masks<-", getSeq) importClassesFrom("Biostrings", DNAStringSet, XStringSet) importFrom("Rsamtools", indexTabix, bgzip, TabixFile, index) importMethodsFrom("Rsamtools", ScanBamParam, asBam, headerTabix, isOpen, path, scanTabix) importClassesFrom("Rsamtools", RsamtoolsFile, TabixFile, BamFile) importMethodsFrom("GenomicAlignments", readGAlignments, cigar, last, first) importClassesFrom("GenomicAlignments", GAlignments) ## ============================================================ ## Export ## ============================================================ exportClasses(BrowserSession, BrowserView, BrowserViewList, UCSCSession, UCSCView, UCSCData, TrackLine, BasicTrackLine, GraphTrackLine, Bed15TrackLine, UCSCTrackModes, BigWigSelection, UCSCSchema, Quickload, QuickloadGenome, GenomicRangesORGenomicRangesList) ## File classes exportClasses(RTLFile, CompressedFile, GFFFile, UCSCFile, BEDFile, WIGFile, ChainFile, FastaFile, GFF1File, GFF2File, GFF3File, BEDGraphFile, BED15File, GTFFile, GVFFile, BigWigFile, BigWigFileList, TwoBitFile) exportMethods(activeView, "activeView<-", blocks, browseGenome, browserSession, "browserSession<-", browserView, browserViews, close, export, export.bed, export.bed15, export.bedGraph, export.gff, export.gff1, export.gff2, export.gff3, export.ucsc, export.wig, export.bw, export.2bit, import, import.bed, import.bed15, import.bedGraph, import.gff, import.gff1, import.gff2, import.gff3, import.ucsc, import.wig, import.bw, import.chain, import.2bit, exportToTabix, "track<-", track, trackNames, "trackNames<-", getTable, tableNames, trackName, "trackName<-", tableName, "tableName<-", ucscTrackModes, "ucscTrackModes<-", ucscSchema, coerce, initialize, show, summary, "[", ucscTableQuery, genome, "genome<-", chrom, "chrom<-", range, "range<-", visible, "visible<-", liftOver, offset, reversed, nrow, formatDescription, referenceSequence, "referenceSequence<-", asBED, asGFF, split, ## from IRanges start, end, "start<-", "end<-", score, "score<-", as.data.frame, space, mcols, ## from GenomicRanges strand, seqinfo, "seqinfo<-", ## from BSgenome organism, releaseDate, getSeq ) export(genomeBrowsers, start, end, strand, "start<-", "end<-", width, "width<-", ranges, values, GenomicData, GenomicSelection, score, "score<-", as.data.frame, space, ucscGenomes, readGFFPragmas, sniffGFFVersion, GFFcolnames, readGFF, readGFFAsGRanges, BigWigSelection, GRangesForUCSCGenome, GRangesForBSGenome, summary, seqinfo, genome, "genome<-", uri, Quickload, quickload, QuickloadGenome, organism, releaseDate, mcols, wigToBigWig, SeqinfoForBSGenome, SeqinfoForUCSCGenome, resource, path, FileForFormat) export(GFFFile, UCSCFile, BEDFile, WIGFile, ChainFile, FastaFile, GFF1File, GFF2File, GFF3File, BEDGraphFile, BED15File, GTFFile, GVFFile, BigWigFile, BigWigFileList, TwoBitFile) rtracklayer/NEWS0000644000175100017510000001113612607264731014626 0ustar00biocbuildbiocbuildCHANGES IN VERSION 1.30 ----------------------- NEW FEATURES o Add readGFF(), a fast and flexible GFF/GTF parser implemented in C. See ?readGFF for more information. SIGNIFICANT USER-VISIBLE CHANGES o import.gff() now uses readGFF() internally which makes it at least 5x faster in most use cases and dramatically reduces its memory footprint. CHANGES IN VERSION 1.26 ----------------------- NEW FEATURES o ucscGenomes() retrieves organism information o New function exportToTabix() exports a GRanges to a tabix-indexed tab separated file that contains all of the metadata columns. Use import,TabixFile to load specific ranges of data back into a GRanges. o BigWig import/export to/from Integer/Numeric/RleList is now much more efficient, and uses a more efficient storage format within the BigWig file, when possible. SIGNIFICANT USER-VISIBLE CHANGES o BSgenome export methods are now in BSgenome. BUG FIXES o Handling of quotes in GFF3 is now consistent with the spec. CHANGES IN VERSION 1.22 ----------------------- NEW FEATURES o import,BigWigFile gains an asRle parameter that returns the data as an RleList (assuming it tiles the sequence); much faster than importing a GRanges and calling coverage() on it. o add export,RleList,BigWigFile method for direct (and much more efficient) output of RleLists (like coverage) to BigWig files. SIGNIFICANT USER-VISIBLE CHANGES o UCSCData now extends GRanges instead of RangedData (thanks Herve) BUG FIXES o handle different Set-Cookie header field casing; often due to proxies (thanks to Altuna Akalin) o attempt to more gracefully handle UCSC truncation of large data downloads o handle re-directs due to UCSC mirroring (thanks Martin Morgan) CHANGES IN VERSION 1.20 ----------------------- NEW FEATURES o Table query interface supports multiple query ranges. o Files (RTLFile objects) can be directly uploaded to UCSC, via track<-. SIGNIFICANT USER-VISIBLE CHANGES o All methods with asRangedData argument now have it default to FALSE, instead of TRUE. A warning is issued if the argument is missing. Eventually, we will drop all support for RangedData import (export will still work via automatic coercion to GRanges). BUG FIXES o Chromosome list for a genome is now downloaded from the table browser, instead of the Genome Browser page. This supports genomes with more than 1000 contigs. o BEDX+Y formats now work when a track line is present, and the extraCols argument is used for the column names. o path.expand() is now called for paths passed off to the Kent library. o Order of metadata columns upon GFF import no longer depends on LC_COLLATE. CHANGES IN VERSION 1.17 ----------------------- NEW FEATURES o Export of GappedAlignments objects as BAM files. There is also a corresponding import method. o Support for BEDX+Y import using the extraCols parameter to import. o Direct export of RleList objects to BigWig files. CHANGES IN VERSION 1.15 ----------------------- NEW FEATURES o Integrated with tabix via Rsamtools. BED and GFF export methods now generate a tabix index, if index=TRUE. Most import() methods gain a 'which' argument that takes advantage of tabix, when available. o Added wigToBigWig() function for efficient conversion of WIG to BigWig. o Added SeqinfoForBSGenome() and SeqinfoForUCSCGenome() for conveniently retrieving Seqinfo objects for a given genome. o Added support for FASTA import/export via Biostrings. o GTF and GVF files are now parsed as GFF. SIGNIFICANT USER-VISIBLE CHANGES o The import/export API is now based on RTLFile objects, which wrap a file path, URL or connection. There is an RTLFile subclass for every file format. This makes it easier to extend rtracklayer (export, import) with new file types. The existing API is still supported (and even encouraged for most uses). o Handle CSV attributes in GFF3 using CharacterList columns. o BED columns thickStart/thickEnd translate to an IRanges column named "thick". The blockStarts/Sizes/Count columns now map to a single RangesList "blocks" column. BUG FIXES o Numerous fixes in the import/export methods, as a result of implementing a full unit test suite. If something was not working for you in the past, please try again. o Compression and connections should now work fairly uniformly across file types. (start date: 29 March, 2012) rtracklayer/R/0000755000175100017510000000000012612017250014312 5ustar00biocbuildbiocbuildrtracklayer/R/bam.R0000644000175100017510000001131512607264731015211 0ustar00biocbuildbiocbuild### ========================================================================= ### BAM support (wrappers around Rsamtools) ### ------------------------------------------------------------------------- setMethod("import", "BamFile", function(con, format, text, use.names = FALSE, param = ScanBamParam(...), ...) { if (!missing(format)) checkArgFormat(con, format) readGAlignments(con, use.names = use.names, param = param) }) setMethod("export", c("GAlignments", "BamFile"), function(object, con, format, index = TRUE) { sam_path <- paste(file_path_sans_ext(path(con)), ".sam", sep = "") sam_con <- file(sam_path, "w") on.exit(close(sam_con)) si <- seqinfo(object) has_info <- seqlevels(si)[!is.na(seqlevels(si)) & !is.na(seqlengths(si))] si <- si[has_info] if (length(si)) { header <- paste0("@SQ", "\tSN:", seqlevels(si), "\tLN:", seqlengths(si)) has_genome <- !is.na(genome(si)) header[has_genome] <- paste0(header[has_genome], "\tAS:", genome(si)[has_genome]) writeLines(header, sam_con) } emd <- mcols(object) aln <- paste(if (!is.null(names(object))) names(object) else "*", if (!is.null(emd[["flag"]])) emd[["flag"]] else ifelse(strand(object) == "-", "16", "0"), seqnames(object), start(object), if (!is.null(emd[["mapq"]])) emd[["mapq"]] else "255", cigar(object), if (!is.null(emd[["mrnm"]])) emd[["mrnm"]] else "*", if (!is.null(emd[["mpos"]])) emd[["mpos"]] else "0", if (!is.null(emd[["isize"]])) emd[["isize"]] else "0", if (is(object, "GappedReads")) object@qseq else if (!is.null(emd[["seq"]])) emd[["seq"]] else "*", if (!is.null(emd[["qual"]])) emd[["qual"]] else "*", sep = "\t") custom <- emd[nchar(names(emd)) == 2L] if (length(custom) > 0L) { type.map <- c(integer = "i", numeric = "f", character = "Z", factor = "Z") custom.class <- sapply(custom, class) custom.type <- type.map[custom.class] unknown.class <- custom.class[is.na(custom.type)] if (length(unknown.class) > 0L) { warning("these classes are not yet valid for BAM tag export: ", paste(unknown.class, collapse=", ")) custom <- custom[!is.na(custom.type)] } tags <- mapply(paste0, names(custom), ":", custom.type, ":", as.list(custom), SIMPLIFY=FALSE) aln <- do.call(paste, c(list(aln), tags, sep = "\t")) } writeLines(aln, sam_con) close(sam_con) on.exit() bam <- asBam(sam_path, file_path_sans_ext(sam_path), overwrite = TRUE, indexDestination = index) unlink(sam_path) invisible(bam) }) setMethod("export", c("GAlignmentPairs", "BamFile"), function(object, con, format, ...) { ga <- as(object, "GAlignments") collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(object)) getMateAttribute <- function(FUN) { c(FUN(last(object)), FUN(first(object)))[collate_subscript] } if (is.null(mcols(ga)$mrnm)) { mcols(ga)$mrnm <- getMateAttribute(seqnames) } if (is.null(mcols(ga)$mpos)) { mcols(ga)$mpos <- getMateAttribute(start) } ### FIXME: we cannot infer whether the pair is 'proper' (0x2) ### nor whether the alignment is 'primary' (0x100) if (is.null(mcols(ga)$flag)) { mcols(ga)$flag <- 0x1 + # all paired ifelse(strand(ga) == "-", 0x10, 0) + ifelse(getMateAttribute(strand) == "-", 0x20, 0) + c(0x40, 0x80) # left vs. right } if (is.null(names(ga))) { names(ga) <- as.character(rep(seq_len(length(object)), each=2L)) } export(ga, con, ...) }) setMethod("export", c("ANY", "BamFile"), function(object, con, format, ...) { export(as(object, "GAlignments"), con, ...) }) rtracklayer/R/bed.R0000644000175100017510000005040712607264731015211 0ustar00biocbuildbiocbuild### ========================================================================= ### BED (Browser Extended Display) support (including bedGraph and BED15) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BEDFile", contains = "RTLFile") BEDFile <- function(resource) { new("BEDFile", resource = resource) } setClass("BEDGraphFile", contains = "BEDFile") BEDGraphFile <- function(resource) { new("BEDGraphFile", resource = resource) } setClass("BED15File", contains = "BEDFile") BED15File <- function(resource) { new("BED15File", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bed", function(object, con, ...) standardGeneric("export.bed")) setMethod("export.bed", "ANY", function(object, con, ...) { export(object, con, "bed", ...) }) setMethod("export", c("ANY", "BEDFile"), function(object, con, format, ...) { if (!missing(format)) checkArgFormat(con, format) cl <- class(object) if (hasMethod("asBED", class(object))) object <- asBED(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "GenomicRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } export(track, con, ...) }) setMethod("export", c("GenomicRanges", "BEDFile"), function(object, con, format, append = FALSE, index = FALSE, ignore.strand = FALSE, trackLine = NULL) { if (!is.null(trackLine)) { object <- UCSCData(object, trackLine) trackLine <- TRUE return(callGeneric()) } if (!missing(format)) checkArgFormat(con, format) name <- strand <- thickStart <- thickEnd <- color <- NULL blockCount <- blockSizes <- blockStarts <- NULL if (index) object <- sortBySeqnameAndStart(object) df <- data.frame(seqnames(object), start(object) - 1L, end(object)) score <- score(object) if (!is.null(score)) { if (!is.numeric(score) || any(is.na(score))) stop("Scores must be non-NA numeric values") } if (is(con, "BEDGraphFile")) { if (is.null(score)) ## bedGraph requires score score <- 0 df$score <- score } else { toCSV <- function(x) { if (is(x, "IntegerList")) { x <- unlist(lapply(x, paste, collapse = ","), use.names=FALSE) } else if (!is.character(x) && !is.null(x)) stop("Could not convert block coordinates to CSV") x } blockSizes <- blockStarts <- NULL if (!is.null(object$blocks)) { blockSizes <- toCSV(width(object$blocks)) blockStarts <- toCSV(start(object$blocks) - 1L) } if (is(con, "BED15File") && is.null(blockSizes)) blockStarts <- blockSizes <- "" # bed15 must have all 15 cols if (!is.null(blockSizes) || !is.null(blockStarts)) { if (is.null(blockSizes)) stop("'blockStarts' specified without 'blockSizes'") if (is.null(blockStarts)) stop("'blockSizes' specified without 'blockStarts'") lastBlock <- function(x) as.integer(sub(".*,", "", sub(",$", "", x))) lastSize <- lastBlock(blockSizes) lastStart <- lastBlock(blockStarts) if (any(df[[2]] + lastSize + lastStart != df[[3]]) || any(sub(",.*", "", blockStarts) != "0")) stop("blocks must span entire feature") blockCount <- elementLengths(object$blocks) if (!is.null(object$blockCount)) if (!identical(blockCount, as.integer(object$blockCount))) stop("incorrect block counts given block sizes") } if (is.null(color)) color <- object$itemRgb if (is.null(color) && !is.null(blockCount)) color <- "0" ## blocks require color else if (!is.null(color)) { nacol <- is.na(color) if (!is.matrix(color)) colmat <- col2rgb(color) color <- paste(colmat[1,], colmat[2,], colmat[3,], sep = ",") color[nacol] <- "0" } thickStart <- object$thickStart thickEnd <- object$thickEnd if (!is.null(object$thick)) { thickStart <- start(object$thick) thickEnd <- end(object$thick) } ## color requires thick ranges if (is.null(thickStart) && !is.null(color)) { thickStart <- start(object) thickEnd <- end(object) } strand <- if (ignore.strand) NULL else strand(object) if (!is.null(strand)) { strand[strand == "*"] <- NA } if (!is.null(thickStart) && is.null(strand)) { strand <- rep(NA, length(object)) } if (!is.null(strand) && is.null(score)) score <- 0 name <- object$name if (is.null(name)) name <- names(object) if (!is.null(score) && is.null(name)) name <- rep(NA, length(object)) df$name <- name df$score <- score df$strand <- strand df$thickStart <- if (!is.null(thickStart)) thickStart - 1L else NULL df$thickEnd <- thickEnd df$itemRgb <- color df$blockCount <- blockCount df$blockSizes <- blockSizes df$blockStarts <- blockStarts if (is(con, "BED15File")) { df$expCount <- object$expCount df$expIds <- object$expIds df$expScores <- object$expScores } } scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) file <- con con <- connection(con, if (append) "a" else "w") on.exit(release(con)) write.table(df, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE, na = ".") release(con) if (index) invisible(indexTrack(file)) else invisible(file) }) setMethod("export", c("UCSCData", "BEDFile"), function(object, con, format, trackLine = TRUE, ...) { if (!missing(format)) checkArgFormat(con, format) if (trackLine) { export.ucsc(object, con, ...) } else { trackLine <- NULL callNextMethod() } invisible(con) }) setMethod("export", c("GRangesList", "BEDFile"), function(object, con, format, ...) { object <- asBED(object) callGeneric() }) setMethod("export", c("GenomicRangesList", "BEDFile"), .export_GenomicRangesList_RTLFile) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bed", function(con, ...) standardGeneric("import.bed")) setMethod("import.bed", "ANY", function(con, ...) { import(con, format = "bed", ...) }) scanTrackLine <- function(con) { con <- connectionForResource(con, "r") line <- "#" while(length(grep("^ *#", line))) # skip initial comments line <- readLines(con, 1, warn = FALSE) if (length(grep("^track", line)) > 0) line else { pushBack(line, con) NULL } } setMethod("import", "BEDFile", function(con, format, text, trackLine = TRUE, genome = NA, colnames = NULL, which = NULL, seqinfo = NULL, extraCols = character()) { if (!missing(format)) checkArgFormat(con, format) file <- con con <- queryForConnection(con, which) if (attr(con, "usedWhich")) which <- NULL if (is.null(seqinfo)) seqinfo <- attr(con, "seqinfo") ## check for a track line line <- scanTrackLine(con) if (!is.null(line) && trackLine) { pushBack(line, con) ans <- import.ucsc(initialize(file, resource = con), drop = TRUE, trackLine = FALSE, genome = genome, colnames = colnames, which = which, seqinfo = seqinfo, extraCols = extraCols) return(ans) } if (is(file, "BEDGraphFile")) { bedClasses <- c("character", "integer", "integer", "numeric") bedNames <- c("chrom", "start", "end", "score") } else { bedNames <- c("chrom", "start", "end", "name", "score", "strand", "thickStart", "thickEnd", "itemRgb", "blockCount", "blockSizes", "blockStarts") bedClasses <- c("character", "integer", "integer", "character", "numeric", "character", "integer", "integer", "character", "integer", "character", "character") } if (is(file, "BED15File")) bedNames <- c(bedNames, "expCount", "expIds", "expScores") normArgColnames <- function(validNames) { if (is.null(colnames)) colnames <- validNames else { colnames <- unique(c(head(bedNames, 3), as.character(colnames))) if ("thick" %in% colnames) colnames <- c(setdiff(colnames, "thick"), "thickStart", "thickEnd") if ("blocks" %in% colnames) colnames <- c(setdiff(colnames, "blocks"), "blockStarts", "blockSizes", "blockCount") missingCols <- setdiff(colnames, validNames) if (length(missingCols)) stop("Requested column(s) ", paste("'", missingCols, "'", sep = "", collapse = ", "), " are not valid columns or were not found in the file") } colnames } ## read a single line to get ncols up-front, ## and thus specify all col classes ## FIXME: reading in 'as.is' to save memory, line <- readLines(con, 1, warn=FALSE) ## UCSC seems to use '#' at beginning to indicate comment. while(length(line) && (!nzchar(line) || substring(line, 1, 1) == "#")) { line <- readLines(con, 1, warn=FALSE) } if (length(line)) { `tail<-` <- function(x, n, value) if (n != 0) c(head(x, -n), value) else x pushBack(line, con) colsInFile <- seq_len(length(strsplit(line, "[\t ]")[[1]])) presentNames <- bedNames[colsInFile] tail(presentNames, length(extraCols)) <- names(extraCols) bedNames <- presentNames presentClasses <- bedClasses[colsInFile] tail(presentClasses, length(extraCols)) <- unname(extraCols) colnames <- normArgColnames(presentNames) bedClasses <- ifelse(presentNames %in% colnames, presentClasses, "NULL") bed <- DataFrame(read.table(con, colClasses = bedClasses, as.is = TRUE, na.strings = ".", comment.char = "")) } else { if (is.null(colnames)) colnames <- character() else colnames <- normArgColnames(bedNames) keepCols <- bedNames %in% colnames bed <- DataFrame(as.list(sapply(bedClasses[keepCols], vector))) } colnames(bed) <- bedNames[bedNames %in% colnames] bed <- bed[substring(bed$chrom, 1, 1) != "#",] if (!is.null(bed$thickStart)) { thickEnd <- bed$thickEnd if (is.null(thickEnd)) thickEnd <- bed$end bed$thick <- IRanges(bed$thickStart + 1L, thickEnd) bed$thickStart <- bed$thickEnd <- NULL } color <- bed$itemRgb if (is.character(color)) { # could be NULL spec <- color != "0" cols <- unlist(strsplit(color[spec], ",", fixed=TRUE), use.names=FALSE) cols <- matrix(as.integer(cols), 3) color <- rep(NA, nrow(bed)) color[spec] <- rgb(cols[1,], cols[2,], cols[3,], max = 255) bed$itemRgb <- color } fromCSV <- function(b) { as.integer(unlist(strsplit(b, ",", fixed = TRUE))) } if (!is.null(bed$blockStarts)) { blocks <- relist(IRanges(fromCSV(bed$blockStarts) + 1L, width = fromCSV(bed$blockSizes)), PartitioningByWidth(bed$blockCount)) names(blocks) <- NULL bed$blockStarts <- bed$blockSizes <- bed$blockCount <- NULL bed$blocks <- blocks } GenomicData(IRanges(bed$start + 1L, bed$end), bed[-(1:3)], chrom = bed$chrom, genome = genome, seqinfo = seqinfo, which = which) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BED15 (Microarray) Support ### setMethod("import", "BED15File", function(con, format, text, trackLine = NULL, genome = NA, which = NULL) { if (!missing(format)) checkArgFormat(con, format) if (is.null(trackLine)) return(import.ucsc(con, TRUE, genome = genome, which = which)) bed <- callNextMethod() if (!length(bed)) return(bed) ids <- strsplit(values(bed)$expIds[1], ",", fixed=TRUE)[[1]] expNames <- trackLine@expNames[as.integer(ids) + 1L] scores <- unlist(strsplit(values(bed)$expScores, ",", fixed=TRUE), use.names=FALSE) scores <- as.numeric(scores) scores[scores == -10000] <- NA # stupid UCSC convention scores <- split(scores, gl(length(expNames), 1, length(scores))) names(scores) <- expNames nonExpCols <- setdiff(colnames(values(bed)), c("expCount", "expScores", "expIds")) values(bed) <- values(bed)[,nonExpCols] values(bed) <- cbind(values(bed), do.call(DataFrame, scores)) bed }) setGeneric("import.bed15", function(con, ...) standardGeneric("import.bed15"), signature = "con") setMethod("import.bed15", "ANY", function(con, ...) { import(con, "bed15", ...) }) setGeneric("export.bed15", function(object, con, ...) standardGeneric("export.bed15")) setMethod("export.bed15", "ANY", function(object, con, ...) { export(object, con, "bed15", ...) }) ### FIXME: dispatch will break when 'object' is a UCSCData ### Possible solution: just merge this code with the main BEDFile method? setMethod("export", c("GenomicRanges", "BED15File"), function(object, con, format, expNames = NULL, trackLine = NULL, ...) { if (!missing(format)) checkArgFormat(con, format) if (is.null(trackLine)) { ## ensure we do not override existing track line parameter if (is.null(expNames) && is(object, "UCSCData") && is(object@trackLine, "Bed15TrackLine")) expNames <- object@trackLine@expNames return(export.ucsc(object, con, expNames = expNames, ...)) } expNames <- trackLine@expNames object$expCount <- rep(length(expNames), length(object)) object$expIds <- rep(paste(seq_along(expNames)-1, collapse=","), length(object)) scores <- as.list(unlist(values(object[,expNames]))) scores <- do.call(paste, c(scores, sep = ",")) scores <- gsub("NA", "-10000", scores, fixed=TRUE) object$expScores <- scores callNextMethod(object, con, ...) }) setClass("Bed15TrackLine", representation(expStep = "numeric", expScale = "numeric", expNames = "characterORNULL"), prototype(expStep = 0.5, expScale = 3.0), contains = "BasicTrackLine") # not sure which fields work setAs("Bed15TrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") paste(str, " type=array ", " expScale=", from@expScale, " expStep=", from@expStep, " expNames=\"", paste(from@expNames, collapse=","), "\"", sep = "") }) setAs("character", "Bed15TrackLine", function(from) { line <- new("Bed15TrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) line@expScale <- as.numeric(vals[["expScale"]]) line@expStep <- as.numeric(vals[["expStep"]]) line@expNames <- strsplit(vals[["expNames"]], ",", fixed=TRUE)[[1]] line }) setMethod("fileFormat", "Bed15TrackLine", function(x) "bed15") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### bedGraph (formerly subset of WIG) support ### setGeneric("import.bedGraph", function(con, ...) standardGeneric("import.bedGraph"), signature = "con") setMethod("import.bedGraph", "ANY", function(con, ...) { import(con, "bedGraph", ...) }) setGeneric("export.bedGraph", function(object, con, ...) standardGeneric("export.bedGraph")) setMethod("export.bedGraph", "ANY", function(object, con, ...) { export(object, con, "bedGraph", ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion ### setGeneric("asBED", function(x, ...) standardGeneric("asBED")) setMethod("asBED", "GRangesList", function(x) { x_range <- range(x) if (any(elementLengths(x_range) != 1L)) stop("Empty or multi-strand/seqname elements not supported by BED") gr <- unlist(x_range, use.names=FALSE) values(gr) <- values(x) values(gr)$name <- names(x) x_ranges <- ranges(unlist(x, use.names=FALSE)) ord_start <- order(start(x_ranges)) x_ranges <- shift(x_ranges, 1L - rep(start(gr), elementLengths(x)))[ord_start] values(gr)$blocks <- split(x_ranges, togroup(x)[ord_start]) gr }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### setGeneric("blocks", function(x, ...) standardGeneric("blocks")) setMethod("blocks", "RangedData", function(x) { blocks(as(x, "GRanges")) }) setMethod("blocks", "GenomicRanges", function(x) { block_counts <- elementLengths(values(x)$blocks) gr <- GRanges(rep(seqnames(x), block_counts), shift(unlist(values(x)$blocks, use.names = FALSE), rep(start(x), block_counts) - 1L), rep(strand(x), block_counts)) seqinfo(gr) <- seqinfo(x) split(gr, togroup(values(x)$blocks)) }) rtracklayer/R/bigWig.R0000644000175100017510000003024212607264731015662 0ustar00biocbuildbiocbuild### ========================================================================= ### BigWig support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BigWigFile", contains = "RTLFile") setClass("BWFile", contains = "BigWigFile") BigWigFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("BigWigFile", resource = path) } BWFile <- BigWigFile setMethod("seqinfo", "BigWigFile", function(x) { seqlengths <- .Call(BWGFile_seqlengths, path.expand(path(x))) Seqinfo(names(seqlengths), seqlengths) # no circularity information }) setClass("BigWigFileList", contains = "SimpleList", prototype = prototype(elementType = "BigWigFile")) BigWigFileList <- function(path) { new("BigWigFileList", listData = (lapply(path, BigWigFile))) } setMethod(path, "BigWigFileList", function(object, ...) { sapply(as.list(object), path) }) .allowedColNames <- list(bigWig = "score") .validateColNames <- function(object, format) { allowedColNames <- .allowedColNames[[format]] invalidColNames <- setdiff(colnames(object), allowedColNames) if (length(invalidColNames)) paste("Column names", paste("'", invalidColNames, "'", sep = "", collapse=", "), "are invalid for the", format, "format.") else NULL } setClass("BigWigSelection", prototype = prototype(colnames = "score"), contains = "RangedSelection") setValidity("BigWigSelection", function(object) { .validateColNames(object, "bigWig") }) BigWigSelection <- function(ranges = RangesList(), colnames = "score") { if (!is.character(colnames) || (length(colnames) && !identical(colnames, "score"))) stop("'score' is the only valid column for BigWig") if (is.character(ranges)) new("BigWigSelection", GenomicSelection(ranges, colnames = colnames)) else { if (is(ranges, "BigWigFile")) ranges <- seqinfo(ranges) new("BigWigSelection", ranges = as(ranges, "RangesList"), colnames = colnames) } } setAs("RangesList", "BigWigSelection", function(from) { new("BigWigSelection", as(from, "RangedSelection"), colnames = "score") }) setAs("GenomicRanges", "BigWigSelection", function(from) { as(as(from, "RangesList"), "BigWigSelection") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bw", function(object, con, ...) standardGeneric("export.bw")) setMethod("export.bw", "ANY", function(object, con, ...) { export(object, con, "BigWig", ...) }) setMethod("export", c("ANY", "BigWigFile"), function(object, con, format, ...) { object <- as(object, "GRanges") callGeneric() }) setMethod("export", c("GenomicRanges", "BigWigFile"), function(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep", "bedGraph"), compress = TRUE) { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) object <- sortBySeqnameAndStart(object) score <- score(object) if (!is.numeric(score) || any(is.na(score))) stop("The score must be numeric, without any NA's") if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") seqlengths <- seqlengths(object) if (any(is.na(seqlengths))) stop("Unable to determine seqlengths; either specify ", "'seqlengths' or specify a genome on 'object' that ", "is known to BSgenome or UCSC") sectionPtr <- NULL # keep adding to the same linked list .bigWigWriter <- function(chromData, con, dataFormat, append) { if (length(chromData) == 0L) return() if (any(tail(start(chromData), -1) <= head(end(chromData), -1))) stop("BigWig ranges cannot overlap") sectionPtr <<- .Call(BWGSectionList_add, sectionPtr, as.vector(seqnames(chromData)[1]), as(ranges(chromData), "IRanges"), as.numeric(score(chromData)), dataFormat) } dataFormat <- match.arg(dataFormat) if (dataFormat == "auto") format <- chooseGraphType(object) else format <- dataFormat on.exit(.Call(BWGSectionList_cleanup, sectionPtr)) if (format == "bedGraph") lapply(split(object, seqnames(object)), .bigWigWriter, con, dataFormat) else export.wig(object, con, dataFormat = dataFormat, writer = .bigWigWriter, trackLine = FALSE) storage.mode(seqlengths) <- "integer" invisible(BigWigFile(.Call(BWGSectionList_write, sectionPtr, seqlengths, compress, con))) }) setMethod("export", c("List", "BigWigFile"), function(object, con, format, compress = TRUE) { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") seqlengths <- elementLengths(object) sectionPtr <- NULL # keep adding to the same linked list on.exit(.Call(BWGSectionList_cleanup, sectionPtr)) writer <- BigWigWriter(object) for(chr in names(object)) { sectionPtr <- writer(chr, sectionPtr) } invisible(BigWigFile(.Call(BWGSectionList_write, sectionPtr, seqlengths, compress, con))) }) setGeneric("BigWigWriter", function(x) standardGeneric("BigWigWriter")) setMethod("BigWigWriter", "RleList", function(x) { function(chr, sectionPtr) { .Call(BWGSectionList_add, sectionPtr, chr, ranges(x[[chr]]), as.numeric(runValue(x[[chr]])), "bedGraph") } }) setMethods("BigWigWriter", list("IntegerList", "NumericList"), function(x) { function(chr, sectionPtr) { .Call(BWGSectionList_add, sectionPtr, chr, NULL, as.numeric(x[[chr]]), "fixedStep") } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bw", function(con, ...) standardGeneric("import.bw")) setMethod("import.bw", "ANY", function(con, ...) { import(con, "BigWig", ...) }) ### FIXME: For chr20, WGS coverage, coercion RangedData->GRanges takes ### 2X as long as reading. The most common use case is reading long ### vectors as Rles. Constructing an RleList is complicated by ### 'which'. As long as 'which' spans chromosomes, we can quickly ### coerce the GRanges (or faster yet, a RangedData) to an ### RleList. Consumes memory, but time cost is minimal, when 'which' ### is trivial (an entire genome or chromosome). ### Consider the use cases: ### - Extract whole genome or whole chromosome coverage as Rle (ChIP-seq) ### - Use rdToRle() fast path ### - Extract single position coverage for millions of variants ### - Slow to query by position, so extract whole genome/chromosome (above), ### then use findRun trick. ### - Extract single position coverage for a hundred hot-spot variants ### - rdToRle() should be fast enough, followed by findRun trick. ### - Extract coverage for one/all genes and summarize (RNA-seq?) ### - probably want summarize,BigWigFile setMethod("import", "BigWigFile", function(con, format, text, selection = BigWigSelection(which, ...), which = con, asRle = FALSE, as = c("GRanges", "RleList", "NumericList"), ...) { if (asRle) { warning("'asRle' argument has been deprecated, ", "use 'as=\"RleList\"' instead") as <- "RleList" } if (!missing(format)) checkArgFormat(con, format) as <- match.arg(as) selection <- as(selection, "BigWigSelection") validObject(selection) si <- seqinfo(con) which <- ranges(selection) badSpaces <- setdiff(names(which), seqlevels(si)) if (length(badSpaces) > 0L) warning("'which' contains seqlevels not known to BigWig file: ", paste(badSpaces, collapse = ", ")) which <- which[names(which) %in% seqlevels(si)] flatWhich <- unlist(which, use.names = FALSE) if (is.null(flatWhich)) flatWhich <- IRanges() which <- split(flatWhich, factor(space(which), seqlevels(si))) if (as != "NumericList") { which <- as(which, "NormalIRangesList") } rd <- .Call(BWGFile_query, path.expand(path(con)), as.list(which), identical(colnames(selection), "score"), as == "NumericList") if (as == "NumericList") { rd <- as(rd, "NumericList") names(rd) <- rep(names(which), elementLengths(which)) metadata(rd) <- list(ranges = as(which, "GRanges")) rd } else { seqinfo(rd) <- si if (as == "RleList") { rdToRle(rd) } else if (as == "GRanges") { strand(rd) <- "*" rd <- as(rd, "GRanges") } else rd } }) rdToRle <- function(x) { RleList(mapply(function(r, v, sl) { coverage(r, width=sl, weight=v$score) }, ranges(x), values(x), seqlengths(x), SIMPLIFY=FALSE), compress=FALSE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Summary ### setMethod("summary", "BigWigFile", function(object, which = as(seqinfo(object), "GenomicRanges"), size = 1L, type = c("mean", "min", "max", "coverage", "sd"), defaultValue = NA_real_, asRle = FALSE, ...) { ### FIXME: could do with "GenomicRanges" here, but ### coercions generally only exist for GRanges specifically which <- as(which, "GRanges") if (!is.numeric(size)) stop("'size' must be numeric") size <- recycleIntegerArg(size, "size", length(which)) type <- match.arg(type) if (type == "sd") type <- "std" if (!isSingleNumberOrNA(defaultValue)) stop("'defaultValue' must be a single number or NA") summaryList <- .Call(BWGFile_summary, path.expand(path(object)), as.character(seqnames(which)), ranges(which), size, type, as.numeric(defaultValue)) tiles <- tile(which, n = size) if (asRle) { setNames(RleList(mapply(Rle, summaryList, as.list(width(tiles))), compress=FALSE), names(which)) } else { tiles <- unlist(tiles) tiles$score <- unlist(summaryList) relist(tiles, summaryList) } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Conversion ### wigToBigWig <- function(x, seqinfo, dest = paste(file_path_sans_ext(x, TRUE), "bw", sep = ".")) { if (!isSingleString(x)) stop("'x' must be a single string, the path to a WIG file") if (!isSingleString(dest)) stop("'dest' must be a single string, the path to the BigWig output") if (!is(seqinfo, "Seqinfo")) stop("'seqinfo' must be NULL or a Seqinfo object") seqlengths <- seqlengths(seqinfo) if (any(is.na(seqlengths))) stop("'seqlengths(seqinfo)' must not contain any 'NA' values") x <- path.expand(x) dest <- path.expand(dest) ans <- .Call(BWGFile_fromWIG, x, seqlengths, dest) invisible(BigWigFile(ans)) } rtracklayer/R/browser.R0000644000175100017510000001667512607264731016153 0ustar00biocbuildbiocbuild## central abstraction, represents a genome browser ## Question: is a browser session a database of tracks? No question ## that a browser has a track database. The question is of ## inheritance. Historically, browser session has had all the behavior ## we expect from a track database. But it is so much more. In ## particular, it has a list of views. We want to separate the data ## from the views. It is tempting to have the model (tracks) and views ## in separate objects, composed together in a session. However, the ## reality is that browser sessions are monolithic: UCSC can view only ## data UCSC knows, IGB can view only data IGB knows. Thus, we use ## simple inheritance here, saving many refactoring headaches. setClass("BrowserSession", contains = c("TrackDb", "VIRTUAL")) ## alias for names() for clarity in the session context setGeneric("trackNames", function(object, ...) standardGeneric("trackNames")) setGeneric("trackNames<-", function(object, ..., value) standardGeneric("trackNames<-")) setMethod("names", "BrowserSession", function(x) trackNames(x)) setMethod("trackNames", "BrowserSession", function(object) names(object)) ## a single genome view in a session setClass("BrowserView", representation(session = "BrowserSession"), contains = "VIRTUAL") # create one or more browser views setGeneric("browserView", function(object, range, track, ...) standardGeneric("browserView")) # get the views from the browser setGeneric("browserViews", function(object, ...) standardGeneric("browserViews")) # get/set active view setGeneric("activeView", function(object) standardGeneric("activeView")) setGeneric("activeView<-", function(object, value) standardGeneric("activeView<-")) setMethod("activeView", "BrowserSession", function(object) { views <- browserViews(object) active <- sapply(views, activeView) if (any(active)) views[[tail(which(active),1)]] else NULL }) setMethod("show", "BrowserSession", function(object) { cat("A genome browser session of class '", class(object), "' with ", length(browserViews(object)), " views and ", length(trackNames(object)), " tracks\n", sep ="") }) # close a session or view setGeneric("close", function(con, ...) standardGeneric("close")) # FIXME: what about isOpen? # get/set visibility of view tracks setGeneric("visible", function(object, ...) standardGeneric("visible")) setMethod("visible", "BrowserView", function(object) { trackNames(browserSession(object)) %in% trackNames(object) }) setGeneric("visible<-", function(object, ..., value) standardGeneric("visible<-")) setReplaceMethod("visible", "BrowserView", function(object, value) { trackNames(object) <- names(value)[value] object }) # get/set the selected features in e.g. a view # this can return a list, with a logical vector for each track setGeneric("selectedFeatures", function(object, ...) standardGeneric("selectedFeatures")) setGeneric("selectedFeatures<-", function(object, value) standardGeneric("selectedFeatures<-")) setMethod("show", "BrowserView", function(object) { range <- range(object) cat(class(object), "of", paste(names(range), ":", unlist(start(range)), "-", unlist(end(range)), sep = ""), "\n") nms <- paste("'", names(trackNames(object)), "'", sep = "") cat(S4Vectors:::labeledLine("trackNames", nms)) }) setClass("BrowserViewList", contains = "SimpleList", prototype = prototype(elementType = "BrowserView")) BrowserViewList <- function(...) { views <- list(...) if (length(views) == 1 && is.list(views[[1L]])) views <- views[[1L]] if (!all(sapply(views, is, "BrowserView"))) stop("all elements in '...' must be BrowserView objects") S4Vectors:::new_SimpleList_from_list("BrowserViewList", views) } # get genome range of active view (or default if no views) setMethod("range", "BrowserSession", function(x, ..., na.rm) { if (length(...) > 0) stop("arguments in '...' ignored") view <- activeView(x) if (!is.null(view)) range(view) else NULL }) setGeneric("range<-", function(x, ..., value) standardGeneric("range<-")) ## just the genome, for convenience setMethod("genome", "BrowserSession", function(x) genome(range(x))) setReplaceMethod("genome", "BrowserSession", function(x, value) { if (!isSingleString(value)) stop("'genome' must be a single string") genome(range(x)) <- value x }) # high-level entry point setGeneric("browseGenome", function(object, ...) standardGeneric("browseGenome")) setMethod("browseGenome", "missing", function(object, ...) browseGenome(GenomicRangesList(), ...)) setMethod("browseGenome", "RangedData", function(object, ...) browseGenome(as(object, "GRanges"), ...)) setMethod("browseGenome", "RangedDataList", function(object, ...) browseGenome(as(object, "GenomicRangesList"), ...)) setClassUnion("GenomicRangesORGenomicRangesList", c("GenomicRanges", "GenomicRangesList")) setMethod("browseGenome", "GenomicRangesORGenomicRangesList", function(object, browser = "UCSC", range = base::range(object), view = TRUE, trackParams = list(), viewParams = list(), name = "customTrack", ...) { # initialize session of type identified by 'browser' session <- browserSession(browser, ...) # load 'object' trackParams <- c(list(session), trackParams) if (is(object, "GenomicRanges")) trackParams <- c(trackParams, name = name) session <- do.call(`track<-`, c(trackParams, list(value = object))) # open view of 'range' if (view) { if (!missing(range)) range <- normGenomeRange(range, session) viewParams <- c(list(session, range), viewParams) do.call(browserView, viewParams) } session }) # list names of available genome browsers genomeBrowsers <- function(where = topenv(parent.frame())) { cl <- getClass("BrowserSession", where = where) browsers <- names(cl@subclasses) browsers <- browsers[!sapply(browsers, isVirtualClass, where)] sub("Session$", "", browsers) } # obtain a browser session setGeneric("browserSession", function(object, ...) standardGeneric("browserSession")) # instantiate a browser session by name setMethod("browserSession", "character", function(object, ...) { class <- paste(object, "Session", sep = "") if (!extends(class, "BrowserSession")) stop("Browser named '", object, "' is unsupported.") new(class, ...) }) setMethod("browserSession", "missing", function(object, ...) browserSession("UCSC", ...)) # get one from a view setMethod("browserSession", "BrowserView", function(object) object@session) setGeneric("login", function(x, username, password, ...) standardGeneric("login"), signature = "x") setGeneric("saveView", function(x, ...) standardGeneric("saveView")) setGeneric("restoreView", function(x, ...) standardGeneric("restoreView")) rtracklayer/R/chain.R0000644000175100017510000001127512607264731015541 0ustar00biocbuildbiocbuild### ========================================================================= ### Chain file parsing and lift over ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("ChainBlock", representation(ranges = "IRanges", # start in A, width offset = "integer", # offset to start in B score = "integer", # rle scores space = "character", # rle spaces reversed = "logical", # rle reversal length = "integer")) # lengths for rle slots ##setMethod("length", "ChainBlock", function(x) length(x@offset)) setClass("Chain", prototype = prototype(elementType = "ChainBlock"), contains = "SimpleList") setClass("ChainFile", contains = "RTLFile") ChainFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("ChainFile", resource = path) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.chain", function(con, ...) standardGeneric("import.chain")) setMethod("import.chain", "ANY", function(con, ...) { import(con, "chain", ...) }) setMethod("import", "ChainFile", function(con, format, text, exclude = "_") { if (!missing(format)) checkArgFormat(con, format) if (!is(connection(con), "file")) { stop("chain import currently only handles local, uncompressed files") } .Call("readChain", path.expand(path(con)), as.character(exclude), PACKAGE="rtracklayer") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessors ### setMethod("ranges", "ChainBlock", function(x) x@ranges) setMethod("offset", "ChainBlock", function(object) object@offset) setMethod("score", "ChainBlock", function(x) Rle(x@score, x@length)) setMethod("space", "ChainBlock", function(x) Rle(x@space, x@length)) setGeneric("reversed", function(x, ...) standardGeneric("reversed")) setMethod("reversed", "ChainBlock", function(x) Rle(x@reversed, x@length)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Liftover ### flipStrandSimple <- function(strand, flip) { strand <- as.vector(strand) flipped <- ifelse(flip, ifelse(strand == "+", "-", ifelse(strand == "-", "+", strand)), strand) strand(flipped) } flipStrandTricky <- function(strand, flip) { strandCodes <- c("+" = 1L, "-" = -1L, "*" = 0L) strandInt <- strandCodes[as.vector(strand)] flipped <- ifelse(flip, strandInt * -1L, strandInt) + 2L strandRevCodes <- factor(c("-", "*", "+"), levels(strand())) strandRevCodes[as.vector(flipped)] } setGeneric("liftOver", function(x, chain, ...) standardGeneric("liftOver")) setMethod("liftOver", c("GenomicRanges", "Chain"), function(x, chain) { liftOverSpace <- function(gr, chain, subind) { r <- ranges(gr) ol <- findOverlaps(r, ranges(chain)) shits <- subjectHits(ol) r <- ranges(ol, r, ranges(chain)) rev <- as.vector(reversed(chain)[shits]) starts <- ifelse(rev, start(reflect(r, ranges(chain)[shits])), start(r)) strand <- flipStrandTricky(strand(gr)[queryHits(ol)], rev) r <- IRanges(starts, width=width(r)) offsets <- offset(chain)[shits] spaces <- space(chain)[shits] ind[[as.character(seqnames(gr)[1])]] <<- subind[queryHits(ol)] GRanges(spaces, IRanges(start(r) - offsets, end(r) - offsets), strand = strand, values(gr)[queryHits(ol),,drop=FALSE]) } rl <- split(x, seqnames(x), drop = TRUE) unchainedNames <- setdiff(names(rl), names(chain)) if (length(unchainedNames)) message("Discarding unchained sequences: ", paste(unchainedNames, collapse = ", ")) sharedNames <- intersect(names(rl), names(chain)) ind <- split(seq_len(length(x)), as.vector(seqnames(x)))[sharedNames] liftedList <- mapply(liftOverSpace, rl[sharedNames], chain[sharedNames], ind, SIMPLIFY=FALSE) lifted <- unlist(GRangesList(liftedList), use.names=FALSE) f <- structure(unlist(ind, use.names=FALSE), levels=seq_len(length(x)), class="factor") setNames(split(lifted, f), names(x)) }) rtracklayer/R/compression.R0000644000175100017510000000626412607264731017022 0ustar00biocbuildbiocbuild### ========================================================================= ### Compression ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### General ### setClass("CompressedFile", contains = c("RTLFile", "VIRTUAL")) setGeneric("decompress", function(con, ...) standardGeneric("decompress")) setMethod("decompress", "ANY", function(con, ...) con) setMethod("decompress", "CompressedFile", function(con, ...) { resource <- resource(con) if (is.character(resource)) manage(gzfile(resource)) # handles gzip, bzip2 and xz else stop("Cannot decompress connection") }) setMethod("decompress", "character", function(con, ...) { file <- try(FileForFormat(con), silent = TRUE) if (!is(file, "try-error")) { decompressed <- decompress(file) if (!identical(file, decompressed)) con <- decompressed } con }) ## should only happen internally (user would not give compression as format) setMethod("import", c("CompressedFile", "missing"), function(con, format, text, ...) { desc <- resourceDescription(con) con <- FileForFormat(resource(con), file_ext(file_path_sans_ext(desc))) import(con, ...) }) ## 'compress' is a simple alias for 'decompress', since connections are two-way compress <- decompress ## should only happen internally (user would not give compression as format) setMethod("export", c("ANY", "CompressedFile", "missing"), function(object, con, format, ...) { desc <- resourceDescription(con) con <- FileForFormat(resource(con), file_ext(file_path_sans_ext(desc))) export(object, con, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GZip ### setClass("GZFile", contains = "CompressedFile") GZFile <- function(resource) { new("GZFile", resource = resource) } setMethod("decompress", "GZFile", function(con) { ungzip(resource(con)) }) setGeneric("ungzip", function(x, ...) standardGeneric("ungzip")) setMethod("ungzip", "character", function(x) { uri <- .parseURI(x) if (uri$scheme != "" && uri$scheme != "file") con <- gzcon(url(x)) else con <- gzfile(uri$path) manage(con) }) setMethod("ungzip", "connection", function(x) { gzcon(x) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BGZip (Block-wise gzip files; extension used by Rsamtools::bgzip()) ### setClass("BGZFile", contains = "GZFile") BGZFile <- function(resource) { new("BGZFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BZip2 ### setClass("BZ2File", contains = "CompressedFile") BZ2File <- function(resource) { new("BZ2File", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### XZ ### setClass("XZFile", contains = "CompressedFile") XZFile <- function(resource) { new("XZFile", resource = resource) } rtracklayer/R/fasta.R0000644000175100017510000000234512607264731015553 0ustar00biocbuildbiocbuild### ========================================================================= ### FASTA support ### ------------------------------------------------------------------------- ### ### Since we have 2bit, we might as well have FASTA ### setClass("FastaFile", contains = "RTLFile") FastaFile <- function(resource) { new("FastaFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setMethod("export", c("ANY", "FastaFile"), function(object, con, ...) { export(as(object, "DNAStringSet"), con, ...) }) setMethod("export", c("XStringSet", "FastaFile"), function(object, con, format, ...) { writeXStringSet(object, path(con), format = "fasta", ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setMethod("import", "FastaFile", function(con, format, text, type = c("DNA", "RNA", "AA", "B"), ...) { if (!missing(format)) checkArgFormat(con, format) readFun <- get(paste0("read", match.arg(type), "StringSet"), getNamespace("Biostrings")) readFun(path(con), format = "fasta", ...) }) rtracklayer/R/gff.R0000644000175100017510000003512412607264731015220 0ustar00biocbuildbiocbuild### ========================================================================= ### GFF (General Feature Format) support (all three versions, plus GTF) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("GFFFile", contains = "RTLFile") ## private GFFFile <- function(resource, version = c("", "1", "2", "3")) { version <- match.arg(version) new(gffFileClass(version), resource = resource) } setClass("GFF1File", contains = "GFFFile") GFF1File <- function(resource) { GFFFile(resource, "1") } setClass("GFF2File", contains = "GFFFile") GFF2File <- function(resource) { GFFFile(resource, "2") } setClass("GFF3File", contains = "GFFFile") GFF3File <- function(resource) { GFFFile(resource, "3") } setClass("GTFFile", contains = "GFF2File") GTFFile <- function(resource) { new("GTFFile", GFF2File(resource)) } setClass("GVFFile", contains = "GFF3File") GVFFile <- function(resource) { new("GVFFile", GFF3File(resource)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.gff", function(object, con, ...) standardGeneric("export.gff")) setMethod("export.gff", "ANY", function(object, con, ...) { export(object, con, ...) }) setMethod("export", c("ANY", "GFFFile"), function(object, con, format, ...) { if (hasMethod("asGFF", class(object))) object <- asGFF(object) res <- try(as(object, "GRanges"), silent = TRUE) if (is(res, "try-error")) { res <- try(as(object, "GenomicRangedDataList"), silent = TRUE) if (is(res, "try-error")) stop("cannot export object of class '", class(object), "': ", res) } object <- res if (!missing(format)) checkArgFormat(con, format) export(object, con, ...) }) setMethod("export", c("GRangesList", "GFFFile"), function(object, con, format, ...) { object <- asGFF(object) callGeneric() } ) setMethod("export", c("GenomicRanges", "GFFFile"), function(object, con, format, version = c("1", "2", "3"), source = "rtracklayer", append = FALSE, index = FALSE) { if (!missing(format)) checkArgFormat(con, format) if (!missing(version) || !length(gffFileVersion(con))) con <- asGFFVersion(con, match.arg(version)) version <- gffFileVersion(con) file <- con con <- resource(con) if (!append) { cat("", file = con) # clear any existing file gffComment(con, "gff-version", version) sourceVersion <- try(package.version(source), TRUE) if (!inherits(sourceVersion, "try-error")) gffComment(con, "source-version", source, sourceVersion) gffComment(con, "date", base::format(Sys.time(), "%Y-%m-%d")) genome <- singleGenome(genome(object)) if (!is.na(genome)) gffComment(con, "genome-build", paste(".", genome, sep = "\t")) } if (index) object <- sortBySeqnameAndStart(object) seqname <- seqnames(object) if (is.null(object$ID)) object$ID <- names(object) if (version == "3") seqname <- urlEncode(seqname, "a-zA-Z0-9.:^*$@!+_?|-") if (!is.null(object$source) && missing(source)) source <- object$source if (version == "3") source <- urlEncode(source, "\t\n\r;=%&,", FALSE) feature <- object$type if (is.null(feature)) feature <- "sequence_feature" score <- score(object) if (is.null(score)) { score <- NA } else { if (!("score" %in% colnames(mcols(object)))) ## avoid outputting as attribute colnames(mcols(object))[1] <- "score" } strand <- strand(object) if (is.null(strand)) strand <- NA frame <- object$phase if (is.null(frame)) frame <- NA table <- data.frame(seqname, source, feature, start(object), end(object), score, strand, frame) attrs <- NULL if (version == "1") { attrs <- object$group if (is.null(attrs)) attrs <- as.vector(seqname) } else { builtin <- c("type", "score", "phase", "source") custom <- setdiff(colnames(mcols(object)), builtin) if (length(custom)) { if (version == "3") tvsep <- "=" else tvsep <- " " attrs <- mcols(object) attrs <- as.data.frame(sapply(custom, function(name) { x <- attrs[[name]] x_flat <- if (is(x, "List")) unlist(x, use.names=FALSE) else x x_char <- as.character(x_flat) x_char <- sub(" *$", "", sub("^ *", "", as.character(x_char))) if (version == "3") x_char <- urlEncode(x_char, "%\t\n\r;=&,", FALSE) if (is(x, "List")) { x_char[is.na(x_char)] <- "." x_char <- pasteCollapse(relist(x_char, x)) x_char[elementLengths(x) == 0] <- NA } ## FIXME: add option so these become "." instead of removing x_char[is.na(x_char)] <- "\r" if (!is.numeric(x_flat) && version != "3") x_char <- paste0("\"", x_char, "\"") paste(name, x_char, sep = tvsep) }, simplify = FALSE)) if (version == "3") sep <- ";" else sep <- "; " attrs <- do.call(paste, c(attrs, sep = sep)) attrs <- gsub("[^;]*?\r\"?(;|$)", "", attrs) attrs[nchar(attrs) == 0] <- NA } } scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) if (!is.null(attrs)) { # write out the rows with attributes first write.table(cbind(table, attrs)[!is.na(attrs),], con, sep = "\t", na = ".", quote = FALSE, col.names = FALSE, row.names = FALSE, append = TRUE) table <- table[is.na(attrs),] } write.table(table, con, sep = "\t", na = ".", quote = FALSE, col.names = FALSE, row.names = FALSE, append = TRUE) if (index) indexTrack(file) invisible(NULL) }) setMethod("export", c("GenomicRangesList", "GFFFile"), .export_GenomicRangesList_RTLFile) setGeneric("export.gff1", function(object, con, ...) standardGeneric("export.gff1")) setMethod("export.gff1", "ANY", function(object, con, ...) export(object, con, "gff1", ...)) setGeneric("export.gff2", function(object, con, ...) standardGeneric("export.gff2")) setMethod("export.gff2", "ANY", function(object, con, ...) export(object, con, "gff2", ...)) setGeneric("export.gff3", function(object, con, ...) standardGeneric("export.gff3")) setMethod("export.gff3", "ANY", function(object, con, ...) export(object, con, "gff3", ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.gff", function(con, ...) standardGeneric("import.gff")) setMethod("import.gff", "ANY", function(con, ...) { import(con, "gff", ...) }) setMethod("import", "GFFFile", function(con, format, text, version = c("", "1", "2", "3"), genome = NA, colnames = NULL, which = NULL, feature.type = NULL, sequenceRegionsAsSeqinfo = FALSE) { if (!missing(format)) checkArgFormat(con, format) if (!missing(version)) con <- asGFFVersion(con, match.arg(version)) stopifnot(isTRUEorFALSE(sequenceRegionsAsSeqinfo)) ## download the file first if it's remote if (is.character(resource(con))) { uri <- .parseURI(resource(con)) if (uri$scheme %in% c("ftp", "http")) { destfile <- tempfile() download.file(resource(con), destfile) con@resource <- destfile } } sniffed <- .sniffGFFVersion(resource(con)) version <- gffFileVersion(con) if (!length(version)) { if (is.null(sniffed)) sniffed <- "1" con <- asGFFVersion(con, sniffed) } if (length(version) && !is.null(sniffed) && !identical(sniffed, version)) warning("gff-version directive indicates version is ", sniffed, ", not ", version) if (is.na(genome)) { genome <- genome(con) if (is.null(genome)) genome <- NA } ### FIXME: a queryForLines() function would be more efficient ## Temporarily disable use of Tabix Index. ## TODO: Restore use of Tabix Index! #con <- queryForResource(con, which) con <- queryForResource(con) gr <- readGFFAsGRanges(con, version=version, colnames=colnames, filter=list(type=feature.type), genome=genome, sequenceRegionsAsSeqinfo= sequenceRegionsAsSeqinfo, speciesAsMetadata=TRUE) if (is.na(genome)) { ans_seqinfo <- seqinfo(gr) } else { ans_seqinfo <- NULL } GenomicData(ranges(gr), mcols(gr), strand = strand(gr), chrom = seqnames(gr), genome = genome, seqinfo = ans_seqinfo, which = if (attr(con, "usedWhich")) NULL else which, metadata = metadata(gr)) }) setGeneric("import.gff1", function(con, ...) standardGeneric("import.gff1")) setMethod("import.gff1", "ANY", function(con, ...) import(con, "gff1", ...)) setGeneric("import.gff2", function(con, ...) standardGeneric("import.gff2")) setMethod("import.gff2", "ANY", function(con, ...) import(con, "gff2", ...)) setGeneric("import.gff3", function(con, ...) standardGeneric("import.gff3")) setMethod("import.gff3", "ANY", function(con, ...) import(con, "gff3", ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### DNAStringSet from fasta data ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion ### setGeneric("asGFF", function(x, ...) standardGeneric("asGFF")) setMethod("asGFF", "GRangesList", function(x, parentType = "mRNA", childType = "exon") { parent_range <- range(x) if (!all(elementLengths(parent_range) == 1)) stop("Elements in a group must be on same sequence and strand") parents <- unlist(parent_range, use.names = FALSE) children <- unlist(x, use.names = FALSE) makeId <- function(x, prefix) { paste(prefix, seq_len(length(x)), sep = "") } parentIds <- makeId(parents, parentType) values(parents)$type <- parentType values(parents)$ID <- parentIds values(parents)$Name <- names(x) values(children)$type <- childType values(children)$ID <- makeId(children, childType) values(children)$Name <- names(children) values(children)$Parent <- rep.int(parentIds, elementLengths(x)) allColumns <- union(colnames(values(parents)), colnames(values(children))) rectifyDataFrame <- function(x) { x[setdiff(allColumns, colnames(x))] <- DataFrame(NA) x[allColumns] } values(children) <- rectifyDataFrame(values(children)) values(parents) <- rectifyDataFrame(values(parents)) c(parents, children) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### scanGFFDirectives <- function(con, tag = NULL) { con <- connection(con, "r") directives <- character() lines <- line <- readLines(con, n = 1) while(grepl("^#", line)) { if (grepl("^##", line)) { directives <- c(directives, line) } line <- readLines(con, n = 1) if (length(line) == 0L) break lines <- c(lines, line) } pushBack(lines, con) sub("^[^[:space:]]* ", "", grep(paste0("^##", tag), directives, value = TRUE)) } gffGenomeBuild <- function(x) { genome_build <- scanGFFDirectives(x, "genome-build") unlist(strsplit(genome_build, "\t", fixed = TRUE)) } setMethod("provider", "GFFFile", function(x) { gffGenomeBuild(x)[1] }) setMethod("providerVersion", "GFFFile", function(x) { gffGenomeBuild(x)[2] }) setMethod("genome", "GFFFile", function(x) providerVersion(x)) gffComment <- function(con, ...) cat("##", paste(...), "\n", sep = "", file = con, append = TRUE) .sniffGFFVersion <- function(con) { con <- connectionForResource(con, "r") version <- NULL lines <- line <- readLines(con, n = 1) while(grepl("^#", line)) { if (grepl("^##gff-version", line)) { version <- sub("^##gff-version ", "", line) break } line <- readLines(con, n = 1) lines <- c(lines, line) } pushBack(lines, con) version } gffFileClass <- function(version) { paste("GFF", version, "File", sep = "") } gffFileVersion <- function(file) { versions <- c("1", "2", "3") unlist(Filter(function(v) is(file, gffFileClass(v)), versions)) } asGFFVersion <- function(con, version) { if (!is(con, gffFileClass(version))) { if (class(con) != "GFFFile") warning("Treating a '", class(con), "' as GFF version '", version, "'") con <- GFFFile(resource(con), version) } con } rtracklayer/R/index.R0000644000175100017510000000562412607264731015567 0ustar00biocbuildbiocbuild### ========================================================================= ### Separate index support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### queryForResource ### ## There is some question as to whether the import routines should ## recurse through import.tabix, or perform the query ## internally. Currently, we are taking the latter route, because it ## is consistent with (gzip) decoding and it allows the parsers more ## flexibility. setGeneric("queryForResource", function(x, which = NULL, ...) standardGeneric("queryForResource")) ## Attaches 'usedWhich' attribute, an optimization hint indicating ## that subsetting by 'which' has been performed and is no longer ## necessary. Probably premature. setMethod("queryForResource", "RTLFile", function(x, which = NULL, ...) { r <- resource(x) ans <- structure(r, usedWhich = FALSE) if (!is.null(which) && is.character(r)) { x_tbi <- paste(r, "tbi", sep = ".") if (file.exists(x_tbi)) ans <- queryForResource(TabixFile(r), which = which, ...) } ans }) setMethod("queryForResource", "TabixFile", function(x, which, header = TRUE, ...) { tabixHeader <- headerTabix(x) si <- Seqinfo(tabixHeader$seqnames) if (is.null(which)) { buffer <- connectionForResource(path(x), "r") if (!header) readLines(buffer, tabixHeader$skip) } else { buffer <- manage(file()) if (header) { skippedLines <- readLines(path(x), tabixHeader$skip) writeLines(skippedLines, buffer) } lines <- unlist(scanTabix(x, param = which), use.names = FALSE) writeLines(lines, buffer) si <- merge(si, seqinfo(which)) } structure(buffer, usedWhich = TRUE, seqinfo = si) }) queryForConnection <- function(x, which = NULL, ...) { resource <- queryForResource(x, which = which, ...) con <- connectionForResource(resource) structure(con, usedWhich = attr(resource, "usedWhich")) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### indexTrack: attempt to build an index for a track ### ### This is an obscene hack ### indexTrack <- function(con, ...) { indexed <- NULL formats <- eval(formals(indexTabix)$format) uri <- path(con) parsed_uri <- .parseURI(uri) if (!uriIsLocal(parsed_uri)) stop("'con' must be a path to a local file") original_path <- parsed_uri$path path <- bgzip(original_path, overwrite = TRUE) format <- Find(function(f) { is(con, paste(toupper(f), "File", sep = "")) }, formats) if (!is.null(format)) { indexTabix(path, format, ...) } else { indexTabix(path, ...) } indexed <- TabixFile(path) unlink(original_path) invisible(indexed) } rtracklayer/R/io.R0000644000175100017510000002203412607264730015060 0ustar00biocbuildbiocbuild### ========================================================================= ### Import/export support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes files and connections ### ### RTLFile is a base class for high-level file abstractions, where ### subclasses are associated with a particular file format/type. It ### wraps a low-level representation of a file, currently either a ### path/URL or connection. setClass("RTLFile", representation(resource = "characterORconnection"), contains = "VIRTUAL") resource <- function(x) x@resource connection <- function(x, open = "") { connectionForResource(resource(x), open = open) } resourceDescription <- function(x) { r <- resource(x) if (is(r, "connection")) r <- summary(r)$description r } fileFormat <- function(x) { tolower(sub("File$", "", class(x))) } setMethod("path", "RTLFile", function(object) { r <- resource(object) if (!is.character(r)) stop("Connection resource requested as a path") r }) setMethod("show", "RTLFile", function(object) { r <- resource(object) if (!isSingleString(r)) r <- summary(r)$description cat(class(object), "object\nresource:", r, "\n") }) FileForFormat <- function(path, format = file_ext(path)) { if (!(isSingleString(path) || is(path, "connection"))) stop("'path' must be a single string or a connection object") if (!isSingleString(format)) stop("'format' must be a single string") if (format == "") stop("Cannot detect format (no extension found in file name)") fileClassName <- paste0(format, "File") signatureClasses <- function(fun, pos) { matrix(unlist(findMethods(fun)@signatures), 3)[pos,] } fileClassNames <- unique(c(signatureClasses(export, 2), signatureClasses(import, 1))) fileClassNames <- fileClassNames[grepl("File$", fileClassNames)] fileSubClassNames <- unlist(lapply(fileClassNames, function(x) { names(getClassDef(x)@subclasses) }), use.names = FALSE) fileClassNames <- c(fileClassNames, fileSubClassNames) fileClassIndex <- match(tolower(fileClassName), tolower(fileClassNames)) if (is.na(fileClassIndex)) stop("Format '", format, "' unsupported") fileClassName <- fileClassNames[fileClassIndex] fileClass <- getClass(fileClassName) pkg <- packageSlot(fileClass) if (is.null(pkg)) ns <- topenv() else ns <- getNamespace(pkg[1]) constructorName <- fileClassName if(!exists(constructorName, ns)) { parentClassNames <- names(getClass(constructorName)@contains) constructorName <- names(which(sapply(parentClassNames, exists, ns)))[1] if (is.na(constructorName)) stop("No constructor found for ", fileClassName) } get(constructorName, ns)(path) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export", function(object, con, format, ...) standardGeneric("export")) setMethod("export", c(con = "connection", format = "character"), function(object, con, format, ...) { export(object, FileForFormat(con, format), ...) }) setMethod("export", c(con = "connection", format = "missing"), function(object, con, format, ...) { format <- file_ext(summary(con)$description) export(object, con, format, ...) }) setMethod("export", c(con = "missing", format = "character"), function(object, con, format, ...) { con <- file() on.exit(close(con)) export(object, con, format, ...) text <- readLines(con, warn = FALSE) text }) setMethod("export", c(con = "character", format = "missing"), function(object, con, format, ...) { export(object, FileForFormat(con), ...) }) setMethod("export", c(con = "character", format = "character"), function(object, con, format, ...) { export(object, FileForFormat(con, format), ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import", function(con, format, text, ...) standardGeneric("import")) setMethod("import", c("connection", "character"), function(con, format, text, ...) { import(FileForFormat(con, format), ...) }) setMethod("import", c("connection", "missing"), function(con, format, text, ...) { format <- file_ext(summary(con)$description) import(con, format, ...) }) setMethod("import", c("character", "missing"), function(con, format, text, ...) { import(FileForFormat(con), ...) }) setMethod("import", c("character", "character"), function(con, format, text, ...) { import(FileForFormat(con, format), ...) }) setMethod("import", c(con = "missing", text = "character"), function(con, format, text, ...) { con <- file() on.exit(close(con)) writeLines(text, con) obj <- import(FileForFormat(con, format), ...) obj }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### setGeneric("bestFileFormat", function(x, dest, ...) standardGeneric("bestFileFormat")) setClassUnion("RangedDataORGenomicRanges", c("RangedData", "GenomicRanges")) setMethod("bestFileFormat", c("RangedDataORGenomicRanges", "ANY"), function(x, dest) { ## have numbers on a single strand, use BigWig if (is.numeric(score(x)) && length(unique(strand(x))) == 1L) "bw" else "bed" }) setMethod("bestFileFormat", c("GRangesList", "ANY"), function(x, dest) { "bed" # need hierarchical structure }) setMethod("bestFileFormat", c("RleList", "ANY"), function(x, dest) { "bw" # e.g., coverage }) setMethod("bestFileFormat", c("RangesList", "ANY"), function(x, dest) { "bed" # just ranges... }) ## Uses XML::parseURI, except first checks for Windows drive letter. ## There are no known URI schemes that are only a single character. .parseURI <- function(uri) { windowsDriveLetter <- .Platform$OS.type == "windows" && grepl("^[A-Za-z]:[/\\]", uri) hasScheme <- grepl("^[A-Za-z]+:", uri) && !windowsDriveLetter if (!hasScheme) { parsed <- parseURI("") parsed$path <- uri } else { parsed <- parseURI(uri) if (parsed$scheme == "file" && .Platform$OS.type == "windows") parsed$path <- substring(parsed$path, 2) # trim '/' from '/C:/foo/bar.txt' } parsed } normURI <- function(x) { if (!isSingleString(x)) stop("URI must be a single, non-NA string") uri <- .parseURI(x) if (uri$scheme == "") # /// (vs. //) needed for Windows x <- paste("file:///", file_path_as_absolute(x), sep = "") x } createResource <- function(x, dir = FALSE, content = "") { uri <- .parseURI(x) if (uri$scheme == "file" || uri$scheme == "") { if (!file.exists(uri$path)) { if (dir) dir.create(uri$path, recursive = TRUE) else writeLines(content, uri$path) } else warning("Path '", uri$path, "' already exists") } else stop("Cannot create a resource that is not a local file") } uriExists <- function(x) { uri <- .parseURI(x) if (uriIsLocal(x)) { exists <- file.exists(uri$path) } else { txt <- getURL(x, header = TRUE) exists <- grepl("^HTTP/\\d+\\.\\d+ 200 OK", txt) } exists } uriIsLocal <- function(x) { x$scheme == "file" || x$scheme == "" } uriIsWritable <- function(x) { uri <- .parseURI(x) if (uriIsLocal(uri)) { !file.access(uri$path, 2) || (!file.exists(uri$path) && uriIsWritable(dirname(uri$path))) } else FALSE } checkArgFormat <- function(con, format) { if (toupper(format) != substring(toupper(sub("File$", "", class(con))), 1, nchar(format))) stop("Cannot treat a '", class(con), "' as format '", format, "'") } connectionForResource <- function(x, open = "") { resource <- decompress(x) if (is.character(resource)) { if (!nzchar(resource)) stop("path cannot be an empty string") uri <- .parseURI(resource) if (uri$scheme != "") con <- url(resource) else con <- file(resource) con <- manage(con) } else con <- resource if (!isOpen(con) && nzchar(open)) { open(con, open) } con } ## Connection management (similar to memory management) manage <- function(con) { if (!is.null(attr(con, "finalizerEnv"))) return(con) env <- new.env() finalizer <- function(obj) { if (exists("con", parent.env(environment()), inherits=FALSE)) { close(con) rm(con, inherits = TRUE) TRUE } else FALSE } env$finalizer <- finalizer reg.finalizer(env, finalizer) attr(con, "finalizerEnv") <- env rm(env) con } unmanage <- function(con) { attr(con, "finalizerEnv") <- NULL con } release <- function(con) { env <- attr(con, "finalizerEnv") if (!is.null(env)) env$finalizer() else FALSE } rtracklayer/R/ncbi.R0000644000175100017510000000160212607264730015362 0ustar00biocbuildbiocbuildNCBI_TAX_URL <- "http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi" isNCBISpeciesURL <- function(url) { substring(url, 1L, nchar(NCBI_TAX_URL)) == NCBI_TAX_URL } metadataFromNCBI <- function(url) { html <- httpGet(url) list("Taxonomy ID"=parseTaxonomyIdFromNCBI(html), "Organism"=parseOrganismFromNCBI(html)) } parseTaxonomyIdFromNCBI <- function(html) { unlist(getNodeSet(html, "//input[@name='old_id']/@value"), use.names=FALSE) } taxonomyIdFromNCBI <- function(species) { url <- paste0(NCBI_TAX_URL, "?name=", URLencode(species)) parseTaxonomyIdFromNCBI(httpGet(url)) } parseOrganismFromNCBI <- function(html) { title <- xmlValue(getNodeSet(html, "//title/text()")[[1L]]) sub(".*\\((.*?)\\).*", "\\1", title) } speciesFromNCBI <- function(id) { url <- paste0(NCBI_TAX_URL, "?id=", URLencode(id)) parseOrganismFromNCBI(httpGet(url)) } rtracklayer/R/quickload.R0000644000175100017510000003015612607264731016432 0ustar00biocbuildbiocbuild### ========================================================================= ### Quickload support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Quickload class ### setClass("Quickload", representation(uri = "character")) uri <- function(x, ...) x@uri Quickload_contents <- function(x) { read.table(contentsFile(x), sep = "\t", col.names = c("dir", "title"), colClasses = "character") } setMethod("genome", "Quickload", function(x) { contents <- Quickload_contents(x) as.character(structure(contents$dir, names = contents$title)) }) setMethod("names", "Quickload", genome) setMethod("length", "Quickload", function(x) length(names(x))) setMethod("[[", "Quickload", function (x, i, j, ...) { if (!missing(j)) warning("argument 'j' ignored") QuickloadGenome(x, i, ...) }) setMethod("$", "Quickload", function (x, name) { QuickloadGenome(x, name) }) Quickload <- function(uri = "quickload", create = FALSE) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") if (create) { if (uriExists(uri)) { message("NOTE: '", uri, "' already exists") create <- FALSE } ## must create this before calling normURI (requires existence) else createResource(uri, dir = TRUE) } ql <- new("Quickload", uri = normURI(uri)) if (create) createResource(contentsFile(ql)) ql } setAs("character", "Quickload", function(from) Quickload(from)) setMethod("show", "Quickload", function(object) { cat(class(object), "repository\nuri:", uri(object), "\n") cat(S4Vectors:::labeledLine("genomes", genome(object))) }) contentsFile <- function(x) file.path(uri(x), "contents.txt") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### QuickloadGenome class ### setClass("QuickloadGenome", representation(quickload = "Quickload", genome = "character"), contains = "TrackDb") setMethod("uri", "QuickloadGenome", function(x) file.path(uri(quickload(x)), genome(x))) quickload <- function(x, ...) x@quickload setMethod("genome", "QuickloadGenome", function(x) x@genome) setMethod("seqinfo", "QuickloadGenome", function(x) { genome_info <- read.table(genomeFile(x), sep = "\t", col.names = c("seqnames", "seqlengths"), colClasses = c("character", "integer")) Seqinfo(genome_info$seqnames, genome_info$seqlengths, genome = rep(genome(x), nrow(genome_info))) }) setReplaceMethod("seqinfo", "QuickloadGenome", function(x, value) { if (uriIsWritable(genomeFile(x))) { df <- as.data.frame(value)[1] write.table(df, genomeFile(x), quote = FALSE, col.names = FALSE, sep = "\t") } else stop("Repository is read only; cannot write seqinfo") x }) setMethod("releaseDate", "QuickloadGenome", function(x) { sub(".*?_(.*?)_([^_]*)$", "\\1 \\2", genome(x)) }) setMethod("organism", "QuickloadGenome", function(object) { gsub("_", " ", sub("(.*?)_.*?_[^_]*$", "\\1", genome(object))) }) setMethod("length", "QuickloadGenome", function(x) { length(names(x)) }) QuickloadGenome_annotFiles <- function(x) { xmlChildren(xmlInternalTreeParse(annotsFile(x)))$files } setMethod("names", "QuickloadGenome", function(x) { x_mcols <- mcols(x) structure(sapply(as.character(x_mcols$name), URLdecode), names = as.character(x_mcols$title)) }) setMethod("mcols", "QuickloadGenome", function(x) { files <- QuickloadGenome_annotFiles(x) if (!length(xmlChildren(files))) new("DataFrame", nrows = length(x)) else Reduce(function(x, y) merge(as.data.frame(as.list(x)), as.data.frame(as.list(y)), all = TRUE), lapply(xmlChildren(files), xmlAttrs)) }) setMethod("toString", "QuickloadGenome", function(x) { Quickload_contents(quickload(x))[genome(x),"title"] }) addGenomeToContents <- function(x, title) { contents <- Quickload_contents(quickload(x)) if (!genome(x) %in% contents$dir) { contents <- rbind(contents, data.frame(genome(x), title)) if (uriIsWritable(contentsFile(quickload(x)))) write.table(contents, contentsFile(quickload(x)), quote = FALSE, row.names = FALSE, col.names = FALSE, sep = "\t") else stop("Repository is read only; cannot add genome to contents") } else warning("Genome '", genome(x), "' already in contents; not replaced") } setMethod("toString", "GenomeDescription", function(x) { paste(organism(x), provider(x), providerVersion(x)) }) ## Not sure where this method should land. I'm sure it will be useful ## for publishing adhoc genomes through Quickload. setMethod("seqinfo", "DNAStringSet", function(x) { x_names <- names(x) if (is.null(x_names)) x_names <- as.character(seq(length(x))) Seqinfo(x_names, width(x)) }) QuickloadGenome <- function(quickload, genome, create = FALSE, seqinfo = GenomicRanges::seqinfo(genome), title = toString(genome)) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") quickload <- as(quickload, "Quickload") genome <- normArgGenome(genome) genome_id <- quickloadGenomeId(genome) qlg <- new("QuickloadGenome", quickload = quickload, genome = genome_id) if (create) { if (is.character(genome) && missing(seqinfo)) stop("No seqinfo for genome '", genome, "'") createQuickloadGenome(qlg, seqinfo, title) } qlg } setMethod("show", "QuickloadGenome", function(object) { cat(class(object), "track database\ngenome:", genome(object), "\nquickload:", uri(quickload(object)), "\n") cat(S4Vectors:::labeledLine("names", names(object))) }) genomeFile <- function(x) file.path(uri(x), "mod_chromInfo.txt") annotsFile <- function(x) file.path(uri(x), "annots.xml") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import of tracks/sequence from Quickload ### setMethod("track", "QuickloadGenome", function(object, name, ...) { object_mcols <- mcols(object) if (!name %in% object_mcols$title) stop("Track '", name, "' does not exist") md <- as.list(object_mcols[object_mcols$title == name,]) rd <- import(file.path(uri(object), md$name), ...) metadata(rd)$quickload <- md rd }) ## Since a QuickloadGenome can store only a ## single referenece genome, it is best to treat it as a "slot". setGeneric("referenceSequence", function(x, ...) standardGeneric("referenceSequence")) referenceSequenceFile <- function(x) { paste(file.path(uri(x), genome(x)), ".2bit", sep = "") } setMethod("referenceSequence", "QuickloadGenome", function(x, which = as(seqinfo(x), "GenomicRanges"), ...) { import(referenceSequenceFile(x), which = which, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export of tracks/sequence to Quickload ### ### FIXME: check for file URI scheme setGeneric("sortBySeqnameAndStart", function(x) standardGeneric("sortBySeqnameAndStart")) ## Seems not really possible for GRangesList setMethod("sortBySeqnameAndStart", "RangedDataORGenomicRanges", function(x) { x[order(as.factor(seqnames(x)), start(x)),] }) setMethod("sortBySeqnameAndStart", "RangesList", function(x) { x.flat <- unlist(x, use.names=FALSE) relist(x.flat[order(space(x), start(x.flat))], x) }) .exportToQuickload <- function(object, name, format = bestFileFormat(value, object), index = TRUE, metadata = character(), ..., value) { if (is(object, "Annotated")) { value_metadata <- metadata(value)$quickload value_metadata[names(metadata)] <- metadata metadata <- value_metadata } filename <- paste(name, format, sep = ".") path <- paste(uri(object), filename, sep = "/") seqinfo(value) <- seqinfo(object) file <- export(value, path, format = format, index = index, ...) track(object, name, index = FALSE, metadata = metadata) <- file object } setReplaceMethod("track", signature(object = "QuickloadGenome", value = "ANY"), .exportToQuickload) setReplaceMethod("track", signature(object = "QuickloadGenome", value = "RsamtoolsFile"), function(object, name, metadata = character(), ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name, metadata = metadata) <- URLencode(path(value)) copyResourceToQuickload(object, URLencode(index(value))) object }) setReplaceMethod("track", signature(object = "QuickloadGenome", value = "RTLFile"), function(object, name, metadata = character(), ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name, metadata = metadata) <- URLencode(path(value)) object }) copyResourceToQuickload <- function(object, uri) { parsed_uri <- .parseURI(uri) if (parsed_uri$scheme == "") uri <- paste("file://", uri, sep = "") filename <- basename(uri) object_uri <- .parseURI(uri(object)) if (uriIsLocal(object_uri)) { dest_file <- file.path(object_uri$path, filename) if (paste(uri(object), filename, sep = "/") != uri) ### FIXME: URLdecode() here because of R bug download.file(URLdecode(uri), dest_file) } else stop("Quickload is not local; cannot copy track") filename } setReplaceMethod("track", signature(object = "QuickloadGenome", value = "character"), function(object, name = basename(object), metadata = character(), ..., value) { file <- copyResourceToQuickload(object, value) files <- QuickloadGenome_annotFiles(object) ## make sure we have the three required attributes attrs <- c(name = file, title = name) attrs[names(metadata)] <- metadata filenames <- getNodeSet(files, "//@name") if (file %in% filenames) { removeChildren(files, match(file, filenames)) } files <- addChildren(files, newXMLNode("file", attrs = attrs)) saveXML(files, annotsFile(object)) object }) setGeneric("referenceSequence<-", function(x, ..., value) standardGeneric("referenceSequence<-")) setReplaceMethod("referenceSequence", signature(x = "QuickloadGenome", value = "ANY"), function(x, name, ..., value) { export.2bit(value, referenceSequenceFile(x)) x }) ### Not exported yet setGeneric("synonyms", function(x, ...) standardGeneric("synonyms")) synonymFile <- function(x) file.path(uri(x), "synonyms.txt") setMethod("synonyms", "QuickloadGenome", function(x) { CharacterList(strsplit(readLines(synonymFile(x)), "\t")) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### normArgGenome <- function(genome) { if (is.character(genome)) { bs_genome <- BSGenomeForID(genome) if (!is.null(bs_genome)) genome <- bs_genome } genome } quickloadGenomeId <- function(genome) { if (!is.character(genome)) { species <- sub("^(.).*? ", "\\1_", organism(genome)) date <- sub("\\. ", "_", releaseDate(genome)) paste(species, date, sep = "_") } else genome } createQuickloadGenome <- function(x, seqinfo, title) { if (genome(x) %in% genome(quickload(x))) { message("NOTE: Genome '", genome(x), "' already exists") return() } createResource(uri(x), dir = TRUE) createResource(annotsFile(x), content = "") seqinfo(x) <- seqinfo addGenomeToContents(x, title) } rtracklayer/R/ranges.R0000644000175100017510000002504612607264730015736 0ustar00biocbuildbiocbuild### ========================================================================= ### Genome-oriented methods for GRanges/RangedData/RangesList classes ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### RangedData/GRanges convenience constructor ### GenomicData <- function(ranges, ..., strand = NULL, chrom = NULL, genome = NA, seqinfo = NULL, which = NULL, metadata = list()) { if (is.null(genome)) genome <- NA if (!isSingleStringOrNA(genome)) stop("'genome' must be a single string, or NULL, or NA") if (!is.null(seqinfo)) { if (is.na(genome)) genome <- singleGenome(genome(seqinfo)) else if (!all(genome == genome(seqinfo), na.rm=TRUE)) stop("'genome' ", genome, "' does not match that in 'seqinfo'") } if (is.null(seqinfo) && !is.na(genome)) seqinfo <- seqinfoForGenome(genome) if (!is(ranges, "Ranges")) { if (is(ranges, "data.frame") || is(ranges, "DataTable")) { colnames(ranges)[match("chrom", colnames(ranges))] <- "space" } if (is.na(genome)) genome <- NULL # universe expects NULL if unknown gd <- RangedData(ranges, universe = genome) # direct coercion gd <- as(gd, "GRanges") } else { if (length(chrom) > length(ranges)) stop("length of 'chrom' greater than length of 'ranges'") if (length(chrom) > 0 && (length(ranges) %% length(chrom) != 0)) stop("length of 'ranges' not a multiple of 'chrom' length") if (is.null(seqinfo)) seqinfo <- Seqinfo(as.character(unique(chrom)), genome = genome) if (!(is.factor(chrom) || is(chrom, "Rle") && is.factor(runValue(chrom)))) chrom <- factor(chrom, seqlevels(seqinfo)) normStrand <- function(strand) { strand <- as.character(strand) strand[is.na(strand)] <- "*" strand(strand) } if (!(is.null(strand) || is(strand, "Rle"))) strand <- normStrand(strand) if (is.null(chrom)) chrom <- Rle(factor("1"), length(ranges)) dots <- list(...) if (length(dots) == 1) { dots <- dots[[1L]] if ((is(dots, "data.frame") || is(dots, "DataTable")) && !is.null(dots[["strand"]])) { strand <- dots[["strand"]] dots[["strand"]] <- NULL return(GenomicData(ranges = ranges, dots, strand = strand, chrom = chrom, genome = genome, seqinfo = seqinfo, which = which, metadata = metadata)) } } if (is.null(strand)) strand <- Rle("*", length(ranges)) if (!is.null(seqinfo)) chrom <- factor(as.character(chrom), seqlevels(seqinfo)) df <- DataFrame(...) invalidNames <- names(df) %in% GenomicRanges:::INVALID.GR.COLNAMES names(df)[invalidNames] <- paste0(".", names(df)[invalidNames]) gd <- GRanges(seqnames = chrom, ranges = ranges, strand = strand, df) if (!is.null(genome)) genome(gd) <- genome } if (!is.null(seqinfo)) seqinfo(gd) <- seqinfo if (!is.null(which)) gd <- subsetByOverlaps(gd, which) metadata(gd) <- metadata gd } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Automatic seqinfo lookup ### seqinfoForGenome <- function(genome, method = c("auto", "BSgenome", "UCSC")) { method <- match.arg(method) if (method == "auto" || method == "BSgenome") sl <- SeqinfoForBSGenome(genome) if (method == "UCSC" || (method == "auto" && is.null(sl))) sl <- SeqinfoForUCSCGenome(genome) sl } BSGenomeForID <- function(genome) { if (!suppressWarnings(requireNamespace("BSgenome", quietly=TRUE))) return(NULL) bsgenome <- try(BSgenome::getBSgenome(genome), silent=TRUE) if (inherits(bsgenome, "try-error")) return(NULL) bsgenome } SeqinfoForBSGenome <- function(genome) { bsgenome <- BSGenomeForID(genome) if (!is.null(bsgenome)) seqinfo(bsgenome) else NULL } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Convience constructor for GRanges over an entire genome ### GRangesForGenome <- function(genome, chrom = NULL, ranges = NULL, ..., method = c("auto", "BSgenome", "UCSC"), seqinfo = NULL) { if (missing(genome) || !isSingleString(genome)) stop("'genome' must be a single string identifying a genome") if (is.null(seqinfo)) seqinfo <- seqinfoForGenome(genome, match.arg(method)) if (is.null(seqinfo)) stop("Failed to obtain information for genome '", genome, "'") if (!is.null(ranges) && !is(ranges, "Ranges")) stop("'ranges' must be NULL or a Ranges object") if (is.null(chrom)) chrom <- seqnames(seqinfo) else { badChrom <- setdiff(chrom, seqnames(seqinfo)) if (length(badChrom)) stop("Chromosome(s) ", paste(badChrom, collapse = ", "), "are invalid for: ", genome) } if (is.null(ranges)) ranges <- IRanges(1L, seqlengths(seqinfo)[chrom]) gr <- GRanges(chrom, ranges, seqlengths = seqlengths(seqinfo), ...) seqinfo(gr) <- seqinfo gr } GRangesForBSGenome <- function(genome, chrom = NULL, ranges = NULL, ...) { GRangesForGenome(genome, chrom = chrom, ranges = ranges, method = "BSgenome", seqinfo = NULL, ...) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### score: for internal convenience ### setMethod("score", "ANY", function(x) NULL) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### chrom(): Returns chromosome name vector of length 'length(x)'. ### Not to be confused with 'seqnames', which returns a List for ### RangesList and a vector of length 'nrow(x)' for RangedData. ### More or less a pre-GenomicRanges relic. ### setGeneric("chrom", function(x, ...) standardGeneric("chrom")) setMethod("chrom", "RangedData", function(x) chrom(ranges(x))) setMethod("chrom", "GRanges", function(x) seqnames(x)) setMethod("chrom", "RangesList", function(x) { names(x) }) setGeneric("chrom<-", function(x, ..., value) standardGeneric("chrom<-")) setReplaceMethod("chrom", "RangedData", function(x, value) { chrom(ranges(x)) <- value x }) setReplaceMethod("chrom", "GRanges", function(x, value) { seqnames(x) <- value x }) ### ========================================================================= ### Genome-oriented conveniences for RangedSelection classes ### ------------------------------------------------------------------------- GenomicSelection <- function(genome, chrom = NULL, colnames = character(0)) { if (missing(genome) || !isSingleString(genome)) stop("'genome' must be a single string identifying a genome") si <- seqinfoForGenome(genome) if (is.null(si)) stop("Failed to obtain information for genome '", genome, "'") lens <- seqlengths(si) if (is.null(chrom)) chrom <- names(lens) else { if (!is.character(chrom)) stop("'chrom' must be NULL or a character vector") invalidChroms <- setdiff(chrom, names(lens)) if (length(invalidChroms)) stop("'chrom' contains invalid chromosomes: ", paste(invalidChroms, collapse = ", ")) lens <- lens[chrom] } RangedSelection(split(IRanges(1, lens), factor(chrom, chrom)), colnames) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### ## Individual sessions/views only support a single genome at a time, ## whereas range data structures can have multiple genomes. We try to ## rectify this here. singleGenome <- function(x) { x1 <- unname(x[1]) if (!all(is.na(x)) && (any(is.na(x)) || any(x != x1))) stop("Multiple genomes encountered; only one supported") x1 } ## normalize 'range', using 'session' for default genome ## if 'single' is 'TRUE', only one interval should come out of this normGenomeRange <- function(range, session, max.length = 1L) { ## the user can specify a portion of the genome in several ways: ## - String identifying a genome ## - RangesList ## - GRanges, the preferred way, possibly from GRangesForUCSCGenome() ## - We do not allow Ranges, since it does not make sense to have one range ## over many chromosomes if (is.character(range)) { range <- singleGenome(range) genome(session) <- range return(GRangesForGenome(range, seqinfo = seqinfo(session))) } if (is(range, "Seqinfo")) range <- as(range, "GRanges") if (!is(range, "RangesList") && !is(range, "GenomicRanges")) stop("'range' should be a genome string, RangesList, GRanges or Seqinfo") genome <- genome(session) if (length(seqinfo(range)) == 0L) { ## hack: need to avoid calling seqlengths(session) here, so use 'foo' seqinfo(range) <- Seqinfo("foo", genome = genome) } else { rangeGenome <- singleGenome(genome(range)) if (!is.na(rangeGenome) && rangeGenome != genome) { genome(session) <- rangeGenome on.exit(genome(session) <- genome) } si <- seqinfo(session) seqinfo(range, new2old = match(seqlevels(si), seqlevels(range))) <- merge(si, seqinfo(range)) } if (is(range, "RangesList")) { range <- GRangesForGenome(singleGenome(genome(range)), names(range), unlist(range), seqinfo = seqinfo(session)) } else if (is(range, "GenomicRanges")) { strand(range) <- "*" mcols(range) <- NULL } if (length(range) > max.length) { warning("number of ranges (", length(range), ") exceeds limit of ", max.length) } if (max.length == 1L) { if (length(unique(seqnames(range))) > max.length) stop("'range' must contain ranges on a single chromosome") range(range) } else { head(range, max.length) } } spansGenome <- function(x) { strand(x) <- "*" x <- reduce(x) w <- structure(width(x), names = as.character(seqnames(x))) identical(w[names(seqlengths(x))], seqlengths(x)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Questionable utilities ### # replace fields in 'x' with those in 'y', if given ## mergeRange <- function(x, y) ## { ## if (length(genome(y))) ## genome(x) <- genome(y) ## if (length(y)) ## x[[1]] <- y[[1]] ## if (length(names(y))) ## names(x)[1] <- names(y)[1] ## x ## } ## take 'y', filling in info from 'x' if necessary mergeRange <- function(x, y) { if (!length(genome(y))) { genome(y) <- genome(x) if (!length(names(y)) && length(y) == length(x)) { names(y) <- names(x) if (!length(unlist(y)) && length(x)) y[[1]] <- x[[1]] } } if (!length(genome(y))) stop("Genome must be specified") if (length(unlist(y)) && !length(names(y))) stop("Chromosome must be specified if an interval is specified") y } rtracklayer/R/readGFF.R0000644000175100017510000004122112612017250015673 0ustar00biocbuildbiocbuild### ========================================================================= ### readGFF() ### ------------------------------------------------------------------------- .make_filexp_from_filepath <- function(filepath) { if (isSingleString(filepath)) return(XVector:::open_input_files(filepath)[[1L]]) if (!is(filepath, "connection")) stop(wmsg("'filepath' must be a single string or a connection")) if (!isSeekable(filepath)) stop(wmsg("connection is not seekable")) filepath } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFFPragmas() ### readGFFPragmas <- function(filepath) { filexp <- .make_filexp_from_filepath(filepath) if (is(filexp, "connection")) { if (!isOpen(filexp)) { open(filexp) on.exit(close(filexp)) } if (seek(filexp) != 0) { warning(wmsg("connection is not positioned at the start ", "of the file, rewinding it"), immediate.=TRUE) seek(filexp, where=0) } } .Call(read_gff_pragmas, filexp) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### sniffGFFVersion() ### .get_version_from_pragmas <- function(pragmas) { attrcol_fmt <- attr(pragmas, "attrcol_fmt") idx <- grep("^##gff-version", pragmas) if (length(idx) == 0L) { if (is.null(attrcol_fmt)) stop(wmsg("'attr(pragmas, \"attrcol_fmt\")' is NULL")) return(attrcol_fmt) } version <- sub("^##gff-version", "", pragmas[idx]) version <- unique(version) if (length(version) > 1L) { warning(wmsg("more than one GFF version specified in the file, ", "returning the first one")) version <- version[[1L]] } version <- suppressWarnings(as.integer(version)) if (is.na(version)) { warning(wmsg("unrecognized GFF version specified in the file")) if (is.null(attrcol_fmt)) stop(wmsg("'attr(pragmas, \"attrcol_fmt\")' is NULL")) return(attrcol_fmt) } version } sniffGFFVersion <- function(filepath) { pragmas <- readGFFPragmas(filepath) .get_version_from_pragmas(pragmas) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GFFcolnames() ### ### Return the 9 standard GFF columns as specified at: ### http://www.sequenceontology.org/resources/gff3.html ### GFFcolnames <- function(GFF1=FALSE) { if (!isTRUEorFALSE(GFF1)) stop(wmsg("'GFF1' must be TRUE or FALSE")) .Call(gff_colnames, GFF1) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFF() ### ### Returns 0L, 1L, 2L, or 3L. .normarg_version <- function(version=0) { if (is.character(version)) { ## For compatibility with "import" method for GFFFile objects. if (length(version) == 0L) return(0L) if (isSingleString(version)) { IMPORT_STYLE_VERSIONS <- c("", "1", "2", "3") m <- match(version, IMPORT_STYLE_VERSIONS) if (is.na(m)) stop(wmsg("when a single string, 'version' must ", "be \"\", \"1\", \"2\", or \"3\"")) version <- m - 1L return(version) } } if (isSingleNumber(version)) { if (!is.integer(version)) version <- as.integer(version) if (version < 0L || version > 3L) stop(wmsg("'version' must be 0, 1, 2, or 3")) return(version) } stop(wmsg("'version' must be a single number")) } .prepare_colmap_and_tags <- function(columns=NULL, tags=NULL, attrcol_fmt=0L) { ## Check 'columns'. if (!(is.null(columns) || is.character(columns))) stop(wmsg("'columns' must be NULL or a character vector")) GFF_colnames <- GFFcolnames(attrcol_fmt == 1L) ## Check 'tags'. if (!is.null(tags)) { if (!is.character(tags)) stop(wmsg("'tags' must be NULL or character vector")) if (any(is.na(tags)) || anyDuplicated(tags)) stop(wmsg("'tags' cannot contain NAs or duplicates")) if (attrcol_fmt == 1L) { ## Move any GFF colname found in 'tags' to 'columns'. columns <- union(columns, intersect(tags, GFF_colnames)) tags <- setdiff(tags, GFF_colnames) if (length(tags) != 0L) warning(wmsg("trying to extract tags from a GFF1 file")) } } ## Prepare 'colmap'. if (is.null(columns)) { colmap <- seq_along(GFF_colnames) if (attrcol_fmt != 1L) { stopifnot(GFF_colnames[[length(GFF_colnames)]] == "attributes") ## We don't load the "attributes" column unless the user ## requested no tags (i.e. by setting 'tags' to character(0)). if (!(is.character(tags) && length(tags) == 0L)) colmap[[length(GFF_colnames)]] <- NA_integer_ } } else if (is.character(columns)) { if (!all(columns %in% GFF_colnames)) { in1string <- paste0(GFF_colnames, collapse=", ") stop(wmsg("'columns' must contain valid GFF columns. ", "Valid GFF columns are: ", in1string)) } if (anyDuplicated(columns)) stop(wmsg("'columns' cannot contain duplicates")) colmap <- match(GFF_colnames, columns) } else { stop(wmsg("'columns' must be NULL or a character vector")) } list(colmap=colmap, tags=tags) } .normarg_filter <- function(filter, attrcol_fmt=0L) { GFF_colnames <- GFFcolnames(attrcol_fmt == 1L) if (is.null(filter)) return(NULL) if (!is.list(filter)) stop(wmsg("'filter' must be NULL or a named list")) filter_names <- names(filter) if (is.null(filter_names)) stop(wmsg("'filter' must have names")) if (attrcol_fmt == 1L) { valid_filter_names <- GFF_colnames } else { valid_filter_names <- head(GFF_colnames, n=-1L) } if (!all(filter_names %in% valid_filter_names)) { in1string <- paste0(valid_filter_names, collapse=", ") if (attrcol_fmt == 1L) { excluding_note <- "" } else { excluding_note <- "(excluding \"attributes\")" } stop(wmsg("The names on 'filter' must be valid GFF columns ", excluding_note, ". ", "Valid 'filter' names: ", in1string)) } if (anyDuplicated(filter_names)) stop(wmsg("the names on 'filter' must be unique")) unname(filter[valid_filter_names]) } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). .is_multi_tag <- function(df, ntag, attrcol_fmt=0L) { if (ntag == 0L || attrcol_fmt != 3L) return(logical(ntag)) multi_tags <- c("Parent", "Alias", "Note", "Dbxref", "Ontology_term") sapply(seq_len(ntag) + ncol(df) - ntag, function(j) colnames(df)[[j]] %in% multi_tags || any(grepl(",", df[[j]], fixed=TRUE))) } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). 'decode_idx' must be a non-empty integer vector ### indicating which columns to decode. The columns to decode must be character ### vectors. .url_decode_cols <- function(df, decode_idx) { decoded_cols <- lapply(setNames(decode_idx, colnames(df)[decode_idx]), function(j) urlDecode(df[[j]], na.strings=NA_character_)) df[decode_idx] <- decoded_cols df } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). 'split_idx' must be a non-empty integer vector ### indicating which columns to split. The columns to split must be character ### vectors. Split values are passed thru urlDecode() unless 'raw_data' is ### TRUE. Always returns a DataFrame. .strsplit_cols <- function(df, split_idx, raw_data) { split_cols <- lapply(setNames(split_idx, colnames(df)[split_idx]), function(j) { col <- df[[j]] ## Probably the most efficient way to create an empty CharacterList ## of arbitrary length. split_col <- relist(character(0), PartitioningByEnd(rep.int(0L, length(col)))) not_na <- !is.na(col) tmp <- strsplit(col[not_na], ",", fixed=TRUE) split_col[not_na] <- CharacterList(tmp) if (raw_data) return(split_col) relist(urlDecode(unlist(split_col)), split_col) }) ## Surprisingly sticking the CharacterList cols back into 'df' works ## even if 'df' is an ordinary data frame! df[split_idx] <- split_cols ans <- DataFrame(df, check.names=FALSE) ## "show" method for DataFrame is broken if some colnames are the empty ## string so we rename this column (in our case, we know there can only ## be one). m <- match("", colnames(ans)) if (!is.na(m)) colnames(ans)[m] <- "__empty_tag__" ans } readGFF <- function(filepath, version=0, columns=NULL, tags=NULL, filter=NULL, nrows=-1, raw_data=FALSE) { ## Check 'filepath'. filexp <- .make_filexp_from_filepath(filepath) if (is(filexp, "connection")) { if (!isOpen(filexp)) { open(filexp) on.exit(close(filexp)) } if (seek(filexp) != 0) { warning(wmsg("connection is not positioned at the start ", "of the file, rewinding it"), immediate.=TRUE) seek(filexp, where=0) } } ## Check 'version'. version <- .normarg_version(version) ## Get pragmas lines. pragmas <- .Call(read_gff_pragmas, filexp) ## Rewind file. if (is(filexp, "connection")) { seek(filexp, where=0) } else { XVector:::rewind_filexp(filexp) } if (version == 0L) { attrcol_fmt <- .get_version_from_pragmas(pragmas) } else { attrcol_fmt <- version } ## Prepare 'colmap' and normalize 'tags'. colmap_and_tags <- .prepare_colmap_and_tags(columns, tags, attrcol_fmt) colmap <- colmap_and_tags$colmap tags <- colmap_and_tags$tags ## Normalize 'filter'. filter <- .normarg_filter(filter, attrcol_fmt) ## Normalize 'nrows'. if (!isSingleNumber(nrows)) stop(wmsg("'nrows' must be a single number")) if (!is.integer(nrows)) nrows <- as.integer(nrows) ## Check 'raw_data'. if (!isTRUEorFALSE(raw_data)) stop(wmsg("'raw_data' must be TRUE or FALSE")) ## 1st pass. scan_ans <- .Call(scan_gff, filexp, attrcol_fmt, tags, filter, nrows) if (is.null(tags)) tags <- scan_ans[[1L]] nrows <- scan_ans[[2L]] ## Rewind file. if (is(filexp, "connection")) { seek(filexp, where=0) } else { XVector:::rewind_filexp(filexp) } ## 2nd pass: return 'ans' as an ordinary data frame. ans <- .Call(load_gff, filexp, attrcol_fmt, tags, filter, nrows, pragmas, colmap, raw_data) ncol0 <- attr(ans, "ncol0") ntag <- attr(ans, "ntag") # should be the same as 'length(tags)' ## Post-process standard GFF cols. if (!raw_data) { if (attrcol_fmt == 1L) { #factor_colnames <- c("seqid", "source", "type", "strand", "group") factor_colnames <- c("seqid", "source", "type", "group") } else { #factor_colnames <- c("seqid", "source", "type", "strand") factor_colnames <- c("seqid", "source", "type") } m <- match(factor_colnames, head(colnames(ans), n=ncol0)) m <- m[!is.na(m)] factor_cols <- lapply(setNames(m, colnames(ans)[m]), function(j) factor(ans[[j]], levels=unique(ans[[j]]))) ans[m] <- factor_cols } ## Post-process tags. if (ntag != 0L) { is_multi_tag <- .is_multi_tag(ans, ntag, attrcol_fmt) if (!raw_data) { decode_idx <- which(!is_multi_tag) + ncol0 if (length(decode_idx) != 0L) ans <- .url_decode_cols(ans, decode_idx) } split_idx <- which(is_multi_tag) + ncol0 if (length(split_idx) != 0L) { ## Returns 'ans' as a DataFrame. ans <- .strsplit_cols(ans, split_idx, raw_data) } } ## 'ans' could have lost its readGFF-specific attributes (e.g. if it was ## turned into a DataFrame), so we restore them and cross our fingers that ## they won't clash with the DataFrame slots the day the internals of ## DataFrame objects happen to change (very unlikely though). if (is.null(attr(ans, "pragmas"))) attr(ans, "pragmas") <- pragmas if (is.null(attr(ans, "attrcol_fmt"))) attr(ans, "attrcol_fmt") <- attrcol_fmt if (is.null(attr(ans, "ncol0"))) attr(ans, "ncol0") <- ncol0 if (is.null(attr(ans, "ntag"))) attr(ans, "ntag") <- ntag if (is.null(attr(ans, "raw_data"))) attr(ans, "raw_data") <- raw_data ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFFAsGRanges() ### ### Used in "import" method for GFFFile objects. ### Not exported (user should use import()). ### ### sequence-region => Seqinfo -- by Michael .parseSequenceRegionsAsSeqinfo <- function(lines) { sr <- grep("##sequence-region", lines, value=TRUE) srcon <- file() on.exit(close(srcon)) writeLines(sr, srcon) srt <- read.table(srcon, comment.char="", colClasses=list(NULL, "character", "integer", "integer")) if (any(srt[[2L]] != 1L)) { warning("One or more ##sequence-region directives do not start at 1. ", "The assumptions made by 'sequenceRegionsAsSeqinfo=TRUE' ", "have been violated.") } Seqinfo(srt[[1L]], srt[[3L]]) } ### -- by Michael .parseSpeciesAsMetadata <- function(lines) { species <- unique(grep("##species", lines, fixed=TRUE, value=TRUE)) if (length(species) > 1L) { stop("multiple species definitions found") } metadata <- list() if (length(species) == 1L) { species <- sub("##species ", "", species, fixed=TRUE) if (isNCBISpeciesURL(species)) { ncbiError <- function(e) { warning("failed to retrieve organism information from NCBI") } metadata <- tryCatch(metadataFromNCBI(species), error = ncbiError) } } metadata } readGFFAsGRanges <- function(filepath, version=0, colnames=NULL, filter=NULL, genome=NA, sequenceRegionsAsSeqinfo=FALSE, speciesAsMetadata=FALSE) { if (!isSingleStringOrNA(genome)) stop(wmsg("'genome' must be a single string or NA")) if (!isTRUEorFALSE(sequenceRegionsAsSeqinfo)) stop(wmsg("'sequenceRegionsAsSeqinfo' must be TRUE or FALSE")) if (!isTRUEorFALSE(speciesAsMetadata)) stop(wmsg("'speciesAsMetadata' must be TRUE or FALSE")) ## Read as data frame. if (is.null(colnames)) { df <- readGFF(filepath, version=version, filter=filter) } else { if (!is.character(colnames)) stop(wmsg("'colnames' must be a character vector")) ## Split 'colnames' between 'columns' and 'tags'. GFF_colnames <- GFFcolnames() columns <- intersect(colnames, GFF_colnames) tags <- setdiff(colnames, GFF_colnames) core_columns <- c("seqid", "start", "end", "strand") columns <- union(columns, core_columns) df <- readGFF(filepath, version=version, columns=columns, tags=tags, filter=filter) } ## Get 'ans_seqinfo' from pragmas. pragmas <- attr(df, "pragmas") attrcol_fmt <- attr(df, "attrcol_fmt") if (sequenceRegionsAsSeqinfo && attrcol_fmt == 3L) { ans_seqinfo <- .parseSequenceRegionsAsSeqinfo(pragmas) } else { ans_seqinfo <- NULL } ## Get 'ans_metadata' from pragmas. if (speciesAsMetadata) { ans_metadata <- .parseSpeciesAsMetadata(pragmas) } else { ans_metadata <- list() } ## Turn data frame into GRanges. ## TODO: Maybe we should be able to pass the metadata to ## makeGRangesFromDataFrame()? if (is.null(colnames)) { ans <- makeGRangesFromDataFrame(df, keep.extra.columns=TRUE, seqinfo=ans_seqinfo, seqnames.field="seqid") } else { ans <- makeGRangesFromDataFrame(df, seqinfo=ans_seqinfo, seqnames.field="seqid") mcols(ans) <- df[ , colnames, drop=FALSE] } genome(ans) <- genome metadata(ans) <- ans_metadata ans } rtracklayer/R/tabix.R0000644000175100017510000000345312607264730015564 0ustar00biocbuildbiocbuild### ========================================================================= ### Tabix support ### ------------------------------------------------------------------------- ### setMethod("import", c("TabixFile", "character"), function(con, format, text, which = if (is.na(genome)) NULL else as(seqinfoForGenome(genome), "GenomicRanges"), genome = NA, header = TRUE, ...) { buffer <- queryForResource(con, which, header = header) on.exit(release(buffer)) file <- try(FileForFormat(buffer, format), silent = TRUE) if (is(file, "try-error")) { tabixHeader <- headerTabix(con) args <- list(...) if (is.null(args$comment.char)) args$comment.char <- tabixHeader$comment skip <- tabixHeader$skip if (header) { skip <- skip - 1L } do.call(import.tabSeparated, c(list(buffer), genome = genome, tabixHeader$indexColumns, skip = skip, header = header, args)) } else import(file, genome = genome, ...) }) setMethod("import", c("TabixFile", "missing"), function(con, format, text, ...) { import(con, file_ext(file_path_sans_ext(path(con))), ...) }) setGeneric("exportToTabix", function(object, con, ...) standardGeneric("exportToTabix")) setMethod("exportToTabix", c("ANY", "character"), function(object, con, ...) { con <- TabSeparatedFile(con) export(sort(object, ignore.strand=TRUE), con, row.names=FALSE, col.names=TRUE, ...) indexTrack(con, seq=1L, start=2L, end=3L, skip=1L) }) rtracklayer/R/test_rtracklayer_package.R0000644000175100017510000000007612607264731021511 0ustar00biocbuildbiocbuild.test <- function() BiocGenerics:::testPackage("rtracklayer") rtracklayer/R/trackDb.R0000644000175100017510000000262012607264730016022 0ustar00biocbuildbiocbuild### ========================================================================= ### TrackDb class ### ------------------------------------------------------------------------- ### ### Represents a database or source of tracks, i.e, interval datasets ### setClass("TrackDb") setGeneric("track<-", function(object, ..., value) standardGeneric("track<-")) ## load a track into a database setReplaceMethod("track", c("TrackDb", "ANY"), function(object, name = deparse(substitute(value)), ..., value) { track(object, name, ...) <- GenomicRangesList(as(value, "GRanges", strict = FALSE)) object }) setClassUnion("RangedDataORRangedDataList", c("RangedData", "RangedDataList")) setMethod("[[<-", c("TrackDb", value="ANY"), function(x, i, j, ..., value) { if (!missing(j)) warning("argument 'j' ignored") track(x, i, ...) <- value x }) setMethod("$<-", c("TrackDb", value="ANY"), function(x, name, value) { x[[name]] <- value x }) setGeneric("track", function(object, ...) standardGeneric("track")) setMethod("[[", "TrackDb", function (x, i, j, ...) { if (!missing(j)) warning("argument 'j' ignored") track(x, i, ...) }) setMethod("$", "TrackDb", function (x, name) { x[[name]] }) rtracklayer/R/trackTable.R0000644000175100017510000000324112607264730016524 0ustar00biocbuildbiocbuild### ========================================================================= ### Arbitrary track table support ### ------------------------------------------------------------------------- ### ### At this point, this is internal, in support of the tabix stuff ### setClass("TabSeparatedFile", contains = "RTLFile") TabSeparatedFile <- function(resource) { new("TabSeparatedFile", resource = resource) } setGeneric("import.tabSeparated", function(con, genome = NA, seqnames = 1L, start = 2L, end = 3L, ...) standardGeneric("import.tabSeparated"), signature = "con") setMethod("import.tabSeparated", "characterORconnection", function(con, genome = NA, seqnames = 1L, start = 2L, end = 3L, ...) { tab <- read.table(con, sep = "\t", ...) GenomicData(IRanges(tab[[start]], tab[[end]]), tab[-c(seqnames, start, end)], chrom = tab[[seqnames]], genome = genome) }) setGeneric("export.tabSeparated", function(object, con, ...) standardGeneric("export.tabSeparated")) setMethod("export.tabSeparated", "ANY", function(object, con, ...) { export(object, con, "tabSeparated", ...) }) setMethod("export", c("ANY", "TabSeparatedFile"), function(object, con, ...) { df <- as.data.frame(object) write.table(df, path(con), sep="\t", ...) }) setMethod("export", c("GenomicRanges", "TabSeparatedFile"), function(object, con, ...) { object <- as.data.frame(object, row.names=NULL) object$width <- NULL export(object, con, ...) }) rtracklayer/R/twobit.R0000644000175100017510000001025112607264730015757 0ustar00biocbuildbiocbuild### ========================================================================= ### UCSC 2bit support ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TwoBitFile class ### setClass("TwoBitFile", contains = "RTLFile") setClass("2BitFile", contains = "TwoBitFile") twoBitPath <- function(path) { uri <- .parseURI(path) if (!uriIsLocal(uri)) stop("TwoBit driver handles only local file paths") path.expand(uri$path) } TwoBitFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("TwoBitFile", resource = twoBitPath(path)) } `2BitFile` <- TwoBitFile setMethod("seqinfo", "TwoBitFile", function(x) { seqlengths <- .Call(TwoBitFile_seqlengths, path(x)) Seqinfo(names(seqlengths), seqlengths) # no circularity or genome information }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.2bit", function(object, con, ...) standardGeneric("export.2bit")) setMethod("export.2bit", "ANY", function(object, con, ...) { export(object, con, "2bit", ...) }) setMethod("export", c("ANY", "TwoBitFile"), function(object, con, format, ...) { object <- as(object, "DNAStringSet") callGeneric() }) setMethod("export", c("DNAStringSet", "TwoBitFile"), function(object, con, format) { if (!missing(format)) checkArgFormat(con, format) seqnames <- names(object) if (is.null(seqnames)) seqnames <- as.character(seq(length(object))) freq <- alphabetFrequency(object) unsupported.chars <- setdiff(DNA_ALPHABET, c(DNA_BASES, "N")) if (any(rowSums(freq[,unsupported.chars,drop=FALSE]) > 0L)) { stop("One or more strings contain unsupported ambiguity ", "characters.\nStrings can contain only A, C, G, T or N.") } if (any(width(object) == 0L)) { stop("Empty strings are not yet supported") } invisible(.TwoBits_export(mapply(.DNAString_to_twoBit, object, seqnames), twoBitPath(path(con)))) }) ## Hidden export of a list of twoBit pointers. ## NOT exported (but used in the BSgenome package). .TwoBits_export <- function(object, con) { if (!isSingleString(con)) stop("'con' must be a single, non-NA string") if (!all(sapply(object, function(x) typeof(x) == "externalptr" && is(x, "twoBit")))) stop("'object' must be a list of 'twoBit' pointers") .Call(TwoBits_write, object, con) } ## NOT exported (but used in the BSgenome package). .DNAString_to_twoBit <- function(object, seqname) { if (!isSingleString(seqname)) stop("'seqname' must be a single, non-NA string") if (!is(object, "DNAString") && !is(object, "MaskedDNAString")) stop("'object' must be a DNAString") object_masks <- masks(object) if (!is.null(object_masks)) { object_mask <- collapse(object_masks)[[1]] active(masks(object)) <- FALSE # so we get the real sequence } else object_mask <- IRanges() .Call(DNAString_to_twoBit, as.character(object), object_mask, seqname) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.2bit", function(con, ...) standardGeneric("import.2bit")) setMethod("import.2bit", "ANY", function(con, ...) { import(con, "2bit", ...) }) setMethod("import", "TwoBitFile", function(con, format, text, which = as(seqinfo(con), "GenomicRanges"), ...) { lkup <- get_seqtype_conversion_lookup("B", "DNA") ans <- .Call(TwoBitFile_read, twoBitPath(path(con)), as.character(seqnames(which)), as(ranges(which), "IRanges"), lkup) names(ans) <- names(which) ans }) setMethod("getSeq", "TwoBitFile", function(x, which = as(seqinfo(con), "GenomicRanges")) { import(x, which = which) }) rtracklayer/R/ucsc.R0000644000175100017510000017604712607264731015425 0ustar00biocbuildbiocbuild# UCSC genome browser interface # every UCSC session is identified by a 'hguid' setClass("UCSCSession", representation(url = "character", hguid = "character", views = "environment"), contains = "BrowserSession") # gets an 'hgsid' to initialize the session setMethod("initialize", "UCSCSession", function(.Object, url = "http://genome.ucsc.edu/cgi-bin/", user = NULL, session = NULL, force = FALSE, ...) { .Object@url <- url .Object@views <- new.env() gwURL <- ucscURL(.Object, "gateway") if (force) { gwURL <- paste0(gwURL, '?redirect="manual"') } gw <- httpGet(gwURL, cookiefile = tempfile(), header = TRUE, .parse=FALSE, ...) if (grepl("redirectTd", gw)) { url <- sub(".*?a href=\"h([^[:space:]]+cgi-bin/).*", "h\\1", gw) return(initialize(.Object, url, user=user, session=session, force=TRUE, ...)) } cookie <- grep("Set-[Cc]ookie: hguid[^=]*=", gw) if (!length(cookie)) stop("Failed to obtain 'hguid' cookie") hguid <- sub(".*Set-Cookie: (hguid[^=]*=[^;]*);.*", "\\1", gw) .Object@hguid <- hguid if (!is.null(user) && !is.null(session)) { ## bring in other session ucscGet(.Object, "tracks", list(hgS_doOtherUser = "submit", hgS_otherUserName = user, hgS_otherUserSessionName = session)) } .Object }) setMethod("seqlengths", "UCSCSession", function(x) { query <- ucscTableQuery(x, range = GRanges(), table = "chromInfo") chromInfo <- getTable(query) setNames(chromInfo$size, chromInfo$chrom) }) setMethod("seqnames", "UCSCSession", function(x) names(seqlengths(x))) setMethod("seqinfo", "UCSCSession", function(x) { sl <- seqlengths(x) Seqinfo(names(sl), sl, genome = genome(x)) # no circularity information }) normArgTrackData <- function(value, session) { genomes <- vapply(value, function(x) singleGenome(genome(x)), character(1L)) genomes[is.na(genomes)] <- "" tapply(value, unlist(genomes), function(tracks) { genome <- singleGenome(genome(tracks[[1]])) if (!is.na(genome)) genome(session) <- genome spaces <- do.call(c, unname(lapply(tracks, seqnames))) badSpaces <- setdiff(spaces, seqnames(session)) if (length(badSpaces) > 0L) stop("Invalid chromosomes for ", genome(session), ": ", paste(badSpaces, collapse = ", ")) }) value } setReplaceMethod("track", c("UCSCSession", "GenomicRangesList"), function(object, name = names(value), format = c("auto", "bed", "wig", "gff1", "bed15", "bedGraph"), ..., value) { format <- match.arg(format) if (length(value)) { ## upload values in blocks, one for each genome value <- normArgTrackData(value, object) names(value) <- name genomes <- sapply(value, function(x) singleGenome(genome(x))) genomes[is.na(genomes)] <- "" tapply(value, unlist(genomes), function(tracks) { form <- ucscForm(tracks, format, ...) response <- ucscPost(object, "custom", form) ### FIXME: need to check for error }) } object }) setReplaceMethod("track", c("UCSCSession", "RTLFile"), function(object, name = names(value), ..., value) { form <- ucscForm(value, genome(object), ...) response <- ucscPost(object, "custom", form) object }) setMethod("browserViews", "UCSCSession", function(object) object@views$instances) ## get the list of track names setMethod("trackNames", "UCSCSession", function(object) ucscTracks(object)@ids) ## get the current range setMethod("range", "UCSCSession", function(x, ..., na.rm) range(ucscCart(x))) setReplaceMethod("range", "UCSCSession", function(x, value) { ucscGet(x, "cart", ucscForm(normGenomeRange(value, x))) x }) setMethod("genome", "UCSCSession", function(x) { genome(ucscCart(x)) }) setReplaceMethod("genome", "UCSCSession", function(x, value) { if (!isSingleString(value)) stop("'genome' must be a single non-NA string") ucscGet(x, "gateway", list(db = value)) if (genome(x) != value) stop("Failed to set session genome to '", value, "'") x }) SeqinfoForUCSCGenome <- function(genome) { tryCatch({ session <- browserSession("UCSC") genome(session) <- genome seqinfo(session) }, error = function(cond) NULL) } GRangesForUCSCGenome <- function(genome, chrom = NULL, ranges = NULL, ...) { GRangesForGenome(genome, chrom = chrom, ranges = ranges, method = "UCSC", seqinfo = NULL, ...) } ## context for querying UCSC tables setClass("UCSCTableQuery", representation(session = "UCSCSession", track = "characterORNULL", table = "characterORNULL", range = "GRanges", outputType = "characterORNULL", NAMES = "characterORNULL", intersectTrack = "characterORNULL")) setMethod("show", "UCSCTableQuery", function(object) { cat("Get ") if (!is.null(tableName(object))) cat("table '", tableName(object), "' from ", sep = "") cat("track '", names(trackName(object)), "' within ", sep = "") range <- range(object) if (length(range) > 1) start <- end <- chrom <- "*" else { chrom <- as.character(seqnames(range)) start <- start(range) end <- end(range) } cat(genome(range)[1], ":", chrom, ":", start, "-", end, sep="") for (itrack in names(intersectTrack(object))) cat(" &", itrack) cat("\n") }) setMethod("browserSession", "UCSCTableQuery", function(object) { object@session }) setGeneric("browserSession<-", function(object, ..., value) standardGeneric("browserSession<-")) setReplaceMethod("browserSession", c("UCSCTableQuery", "UCSCSession"), function(object, value) { object@session <- value object }) setMethod("range", "UCSCTableQuery", function(x, ..., na.rm) x@range) setReplaceMethod("range", "UCSCTableQuery", function(x, value) { x@range <- normTableQueryRange(value, browserSession(x)) x }) setGeneric("trackName", function(x, ...) standardGeneric("trackName")) setMethod("trackName", "UCSCTableQuery", function(x) x@track) setGeneric("trackName<-", function(x, ..., value) standardGeneric("trackName<-")) setReplaceMethod("trackName", "UCSCTableQuery", function(x, value) { x@track <- normArgTrack(value, x) x }) setGeneric("tableName", function(x, ...) standardGeneric("tableName")) setMethod("tableName", "UCSCTableQuery", function(x) x@table) normArgTable <- function(name, query) { if (!is.null(name)) { if (!isSingleString(name)) stop("table name must be a single string or NULL") if (!name %in% tableNames(query)) stop("unknown table name '", name, "'") } name } setGeneric("tableName<-", function(x, ..., value) standardGeneric("tableName<-")) setReplaceMethod("tableName", "UCSCTableQuery", function(x, value) { x@table <- normArgTable(value, x) x }) setMethod("names", "UCSCTableQuery", function(x) x@NAMES) setReplaceMethod("names", "UCSCTableQuery", function(x, value) { x@NAMES <- value x }) setGeneric("intersectTrack", function(x, ...) standardGeneric("intersectTrack")) setMethod("intersectTrack", "UCSCTableQuery", function(x) x@intersectTrack) setGeneric("intersectTrack<-", function(x, ..., value) standardGeneric("intersectTrack<-")) setReplaceMethod("intersectTrack", "UCSCTableQuery", function(x, value) { x@intersectTrack <- normArgTrack(value, x, TRUE) x }) ## not exported setGeneric("outputType", function(x, ...) standardGeneric("outputType")) setMethod("outputType", "UCSCTableQuery", function(x) x@outputType) setGeneric("outputType<-", function(x, ..., value) standardGeneric("outputType<-")) setReplaceMethod("outputType", "UCSCTableQuery", function(x, value) { x@outputType <- value x }) normArgTrack <- function(name, trackids) { if (is.null(name)) return(name) if (!isSingleString(name)) stop("'track' must be a single string") if (is(trackids, "UCSCTableQuery")) trackids <- trackNames(trackids) if (!(name %in% trackids)) { mapped_name <- trackids[name] if (is.na(mapped_name)) stop("Unknown track: ", name) name <- mapped_name } else names(name) <- name name } normTableQueryRange <- function(range, x) { normGenomeRange(range, x, max.length = 1000L) } setGeneric("ucscTableQuery", function(x, ...) standardGeneric("ucscTableQuery")) setMethod("ucscTableQuery", "UCSCSession", function(x, track = NULL, range = genome(x), table = NULL, names = NULL, intersectTrack = NULL) { if (!is(names, "characterORNULL")) stop("'names' must be 'NULL' or a character vector") ## only inherit the genome from the session range <- normTableQueryRange(range, x) query <- new("UCSCTableQuery", session = x, range = range, NAMES = names) ## the following line must always happen to initialize the session ## otherwise stuff can go haywire trackids <- trackNames(query) if (!is.null(track) || !is.null(intersectTrack)) { query@track <- normArgTrack(track, trackids) query@intersectTrack <- normArgTrack(intersectTrack, trackids) } tableName(query) <- table query }) ucscTableGet <- function(query, .parse = TRUE, tracks = FALSE, ...) ucscGet(browserSession(query), "tables", c(ucscForm(query, tracks = tracks), ...), .parse = .parse) ucscTablePost <- function(query, .parse = TRUE, tracks = FALSE, ...) ucscPost(browserSession(query), "tables", c(ucscForm(query, tracks = tracks), list(...)), .parse = .parse) ## gets the track names available from the table browser setMethod("trackNames", "UCSCTableQuery", function(object) { doc <- ucscTableGet(object, tracks = TRUE) track_path <- "//select[@name = 'hgta_track']/option/@value" tracks <- unlist(getNodeSet(doc, track_path)) label_path <- "//select[@name = 'hgta_track']/option/text()" labels <- sub("\n.*$", "", sapply(getNodeSet(doc, label_path), xmlValue)) names(tracks) <- labels tracks }) ## returns a character vector of table names for a given track name + range setGeneric("tableNames", function(object, ...) standardGeneric("tableNames")) setMethod("tableNames", "UCSCTableQuery", function(object, trackOnly = FALSE) { doc <- ucscTableGet(object) table_path <- "//select[@name = 'hgta_table']/option/@value" tables <- unlist(getNodeSet(doc, table_path)) outputType <- outputType(object) if (trackOnly) { trackOutputs <- c("wigData", "wigBed", "bed") if (!is.null(outputType)) outputType <- intersect(trackOutputs, outputType) else outputType <- trackOutputs } if (!is.null(outputType)) { checkOutput <- function(table) { object@table <- table # avoid accessor to skip check outputs <- ucscTableOutputs(object) any(outputType %in% outputs) } tables <- tables[sapply(tables, checkOutput)] } unname(tables) }) setGeneric("ucscTableOutputs", function(object, ...) standardGeneric("ucscTableOutputs")) ## returns a character vector of available output types for the table ## not exported setMethod("ucscTableOutputs", "UCSCTableQuery", function(object) { doc <- ucscTableGet(object) output_path <- "//select[@name = 'hgta_outputType']/option/@value" unlist(getNodeSet(doc, output_path)) }) setClass("UCSCSchema", representation(genome = "character", tableName = "character", rowCount = "integer", formatDescription = "character"), contains = "DataFrame") setMethod("genome", "UCSCSchema", function(x) { x@genome }) setMethod("tableName", "UCSCSchema", function(x) { x@tableName }) setMethod("nrow", "UCSCSchema", function(x) { x@rowCount }) setGeneric("formatDescription", function(x, ...) standardGeneric("formatDescription")) setMethod("formatDescription", "UCSCSchema", function(x) { x@formatDescription }) setClass("UCSCLinks", representation(genome = "character", tableName = "character", fieldName = "character", viaName = "character")) setClass("UCSCSchemaDescription", representation(schema = "UCSCSchema", links = "UCSCLinks", sample = "DataFrame")) setGeneric("ucscSchemaDescription", function(object, ...) standardGeneric("ucscSchemaDescription")) ## not currently exported, just ucscSchema() is public setMethod("ucscSchemaDescription", "UCSCTableQuery", function(object) { alphaNum <- function(x) gsub("^ *", "", gsub("[^a-zA-Z0-9()+,. _'-]", "", x)) getBoldLabeledField <- function(name) { expr <- sprintf("//b[text() = '%s:']/following::text()[1]", name) alphaNum(xmlValue(getNodeSet(doc, expr)[[1]])) } getDataFrame <- function(tableNode) { getColumn <- function(ind) { ## FIXME: special treatment required for missing cells ## Is there a way to get child counts for every node in XPath? expr <- sprintf("tr/td[%d]", ind) children <- sapply(getNodeSet(tableNode, expr), xmlChildren) col <- rep(NA, length(children)) col[elementLengths(children) > 0] <- alphaNum(sapply(unlist(children), xmlValue)) col } columnNames <- sapply(getNodeSet(tableNode, "tr[1]/th//text()"), xmlValue) columns <- lapply(seq_along(columnNames), getColumn) names(columns) <- columnNames columns <- columns[elementLengths(columns) > 0] DataFrame(columns) } doc <- ucscTableGet(object, hgta_doSchema = "describe table schema") genome <- getBoldLabeledField("Database") tableName <- getBoldLabeledField("Primary Table") rowCount <- as.integer(gsub(",", "", getBoldLabeledField("Row Count"))) format <- getBoldLabeledField("Format description") schemaNode <- getNodeSet(doc, "//table[tr[1]/th[3]/text() = 'SQL type']")[[1]] schema <- getDataFrame(schemaNode) schema$RType <- sapply(schema$example, function(x) class(type.convert(x))) schema$RType[!nzchar(schema$example)] <- "factor" linkNode <- getNodeSet(doc, "//div[@class = 'subheadingBar' and contains(text(), 'Connected Tables and Joining Fields')]/following::table[1]/tr[2]/td[2]") if (length(linkNode)) { ## this is apparently optional linkNode <- linkNode[[1]] linkTable <- sapply(getNodeSet(linkNode, "a/text()"), xmlValue) linkText <- sapply(getNodeSet(linkNode, "text()"), xmlValue) linkMat <- matrix(linkText, nrow=2) linkGenome <- alphaNum(linkMat[1,]) linkGenome <- substring(linkGenome, 1, nchar(linkGenome)-1L) linkSplit <- matrix(unlist(strsplit(linkMat[2,], " ", fixed=TRUE)), 3) linkField <- substring(linkSplit[1,], 2) linkVia <- sub(".*?\\.(.*?)\\)", "\\1", linkSplit[3,]) links <- new("UCSCLinks", genome = linkGenome, tableName = linkTable, fieldName = linkField, viaName = linkVia) } else links <- new("UCSCLinks") sampNode <- getNodeSet(doc, "//div[@class = 'subheadingBar' and contains(text(), 'Sample')]/following::table[1]//table//table")[[1]] sample <- getDataFrame(sampNode) schema <- new("UCSCSchema", schema, genome = genome, tableName = tableName, rowCount = rowCount, formatDescription = format) new("UCSCSchemaDescription", schema = schema, links = links, sample = sample) }) setGeneric("ucscSchema", function(object, ...) standardGeneric("ucscSchema")) setMethod("ucscSchema", "UCSCSchemaDescription", function(object) { object@schema }) setMethod("ucscSchema", "UCSCTableQuery", function(object) { ucscSchema(ucscSchemaDescription(object)) }) .uploadTableBrowserRanges <- function(query, hgsid) { lines <- export(query@range, format = "bed", ignore.strand = TRUE) text <- paste(paste(lines, collapse = "\n"), "\n", sep = "") upload <- fileUpload("ranges.bed", text, "text/plain") ucscTablePost(query, hgta_enteredUserRegionFile = upload, hgta_enteredUserRegions = "", hgta_doSubmitUserRegions = "submit", hgsid = hgsid) } ## export data from UCSC (internal utility) ucscExport <- function(object) { get_hgsid <- function(node) getNodeSet(node, "//input[@name = 'hgsid']/@value")[[1]] hgsid <- NULL if (!is.null(names(object))) { # filter by names text <- paste(names(object), collapse = "\n") output <- ucscTablePost(object, hgta_doPastedIdentiers = "submit", hgta_pastedIdentifiers = text) error <- getNodeSet(output, "//script[contains(text(), '{showWarnBox')]/text()") if (length(error)) warning(sub(".*'
  • (.*?)'.*", "\\1", xmlValue(error[[1]]))) hgsid <- get_hgsid(output) } if (!is.null(intersectTrack(object))) { itrack <- intersectTrack(object) iquery <- object iquery@track <- itrack itable <- tableNames(iquery, TRUE) if (!length(itable)) stop("No table for intersection track: ", itrack) if (length(itable) > 1) # for now anyway itable <- itable[1] output <- ucscTableGet(object, hgta_nextIntersectGroup = "allTracks", hgta_nextIntersectTrack = itrack, hgta_nextIntersectTable = itable, hgta_nextIntersectOp = "any", hgta_doIntersectSubmit = "submit", boolshad.hgta_nextInvertTable = "0", boolshad.hgta_nextInvertTable2 = "0", hgsid = hgsid) hgsid <- get_hgsid(output) } if (length(object@range) > 1) { output <- .uploadTableBrowserRanges(object, hgsid) hgsid <- get_hgsid(output) } followup <- NULL if (outputType(object) == "bed") { ## some formats have extra pages followup <- list(hgta_doGetBed = "get BED", hgta_printCustomTrackHeaders = "on", boolshad.hgta_printCustomTrackHeaders = "1") } output <- ucscTableGet(object, !is.null(followup), hgta_doTopSubmit = "get output", hgsid = hgsid) if (!is.null(followup)) { hgsid <- get_hgsid(output) form <- c(followup, list(hgsid = hgsid)) output <- ucscGet(browserSession(object), "tables", form, .parse = FALSE) } output } setMethod("track", "UCSCSession", function(object, name, ...) { track(ucscTableQuery(object, track=name, ...)) }) inconsistentFieldCounts <- function(x) { con <- file() on.exit(close(con)) writeLines(x, con) length(unique(count.fields(con, skip=2L, sep="\t")) > 1L) } outputTruncated <- function(x) { has.msg <- grepl("^-", tail(x, 1)) has.msg #|| inconsistentFieldCounts(x) } ## download a trackSet by name setMethod("track", "UCSCTableQuery", function(object) { tables <- tableNames(object) table <- tableName(object) if (!is.null(table) && !(table %in% tables)) stop("Unknown table: '", table, "'. Valid table names: ", tables) formats <- c("wigData", "wigBed", "bed") ## attempt to automatically determine the table if (!is.null(table)) tables <- table for (table in tables) { object@table <- table outputs <- ucscTableOutputs(object) if (any(formats %in% outputs)) break } if (!any(formats %in% outputs)) stop("No supported output types") if ("wigData" %in% outputs) { # track stored as wig format <- "wig" output <- "wigData" } else { format <- output <- "bed" if ("wigBed" %in% outputs) output <- "wigBed" } outputType(object) <- output output <- ucscExport(object) if (outputTruncated(output)) stop("Output is incomplete: ", "track may have more than 100,000 elements. ", "Try downloading the data via the UCSC FTP site.") import(text = output, format = format, seqinfo = seqinfo(range(object))) }) ## grab sequences for features in 'track' at 'range' ## setMethod("getSeq", "UCSCSession", ## function(object, range, table = "gold") ## { ## followup <- list(hgta_doGenomicDna = "get sequence", ## hgSeq.casing = "upper", ## hgSeq.repMasking = "lower") ## output <- ucscExport(object, range, "gold", table, "sequence", ## followup) ## con <- file() ## writeLines(output, con) ## set <- read.DNAStringSet(con, "fasta") ## close(con) ## set ## }) ## get a data.frame from a UCSC table ## think about taking specific columns setGeneric("getTable", function(object, ...) standardGeneric("getTable")) setMethod("getTable", "UCSCTableQuery", function(object) { if (!("primaryTable" %in% ucscTableOutputs(object))) stop("tabular output format not available") outputType(object) <- "primaryTable" if (is.null(tableName(object))) # must specify a table name tableName(object) <- tableNames(object)[1] output <- ucscExport(object) ## since '#' is not treated as a comment, we discard the ## error message, leaving only the header if (grepl("\\n# No results", output)) output <- gsub("\\n.*", "", output) f <- file() writeLines(output, f) header <- readChar(f, 1) ## strip off the '#' header prefix tab <- read.table(f, sep = "\t", header=TRUE, comment.char = "", quote = "") close(f) tab }) setMethod("getTable", "UCSCSession", function(object, name, range = base::range(object), table = NULL) { getTable(ucscTableQuery(object, name, range, table)) }) ## UCSC genome view setClass("UCSCView", representation(hgsid = "character"), contains = "BrowserView") ## create a view for the given session, position and track visibility settings ## if 'tracks' is a character vector (but not a UCSCTrackModes instance) it is ## assumed to name the tracks that should be in the view. otherwise, an ## attempt is made to coerce it to a UCSCTrackModes instance. setMethod("browserView", "UCSCSession", function(object, range, track, imagewidth = 800, ...) { form <- list() if (!missing(range)) { if (is(range, "RangesList")) range <- range[elementLengths(range) > 0L] if (length(range) > 1) { ranges <- range views <- vector("list", length(ranges)) for (i in seq(length(ranges))) { range <- ranges[i] views[[i]] <- callGeneric() } return(BrowserViewList(views)) } range <- normGenomeRange(range, object) form <- c(form, ucscForm(range)) } view <- new("UCSCView", session = object) ## new hgsid for each browser launch doc <- ucscGet(object, "gateway") node <- getNodeSet(doc, "//input[@name = 'hgsid']/@value")[[1]] hgsid <- node ##xmlValue(node) view@hgsid <- as.character(hgsid) ## figure out track modes origModes <- modes <- ucscTrackModes(view) if (!missing(track)) { if (class(track) == "character") trackNames(modes) <- track else { userModes <- as(track, "UCSCTrackModes") modes[names(userModes)] <- userModes } } argModes <- ucscTrackModes(...) modes[names(argModes)] <- argModes modes <- modes[modes != origModes] form <- c(form, ucscForm(modes), ucscForm(view)) if (!missing(imagewidth)) form <- c(form, pix = imagewidth) ## launch a web browser ucscShow(object, "tracks", form) ## save this view object@views$instances <- c(object@views$instances, view) view }) # every view has a "mode" (hide, dense, pack, squish, full) for each track ### FIXME: probably should be merged with ucscTracks ### Or just leave it; ucscTracks might become more complex, while we ### need a simple way to manipulate track modes. setClass("UCSCTrackModes", representation(labels = "character"), contains = "character") # get/set track modes to/from e.g. a view setGeneric("ucscTrackModes", function(object, ...) standardGeneric("ucscTrackModes")) # convenience constructor for track mode object setMethod("ucscTrackModes", "character", function(object, labels, hide = character(), dense = character(), pack = character(), squish = character(), full = character()) { object[hide] <- "hide" object[dense] <- "dense" object[pack] <- "pack" object[squish] <- "squish" object[full] <- "full" if (missing(labels)) labels <- names(object) new("UCSCTrackModes", object, labels = as.character(labels)) }) setMethod("ucscTrackModes", "missing", function(object, ...) ucscTrackModes(character(), ...)) setMethod("ucscTrackModes", "UCSCView", function(object) { ucscTrackModes(ucscTracks(object)) }) setMethod("ucscTrackModes", "UCSCSession", function(object) { ucscTrackModes(ucscTracks(object)) }) setGeneric("ucscTrackModes<-", function(object, value) standardGeneric("ucscTrackModes<-")) setReplaceMethod("ucscTrackModes", c("UCSCView", "UCSCTrackModes"), function(object, value) { # FIXME: needs to be more extensible browserView(object@session, range(object), value) }) setReplaceMethod("ucscTrackModes", c("UCSCView", "character"), function(object, value) { ucscTrackModes(object) <- ucscTrackModes(value) object }) ## subsetting UCSCTrackModes ## if not in ids, try labels resolveTrackIndex <- function(object, i) { if (is.character(i)) { missing <- !(i %in% names(object)) matching <- match(i[missing], object@labels) if (any(is.na(matching))) { unmatched <- i[missing][is.na(matching)] stop("Unknown track(s): ", paste(unmatched, collapse = ", ")) } i[missing] <- names(object)[matching] } i } setMethod("[", "UCSCTrackModes", function(x, i, j, ..., drop=FALSE) { vec <- x@.Data names(vec) <- names(x) names(x@labels) <- names(x) ind <- resolveTrackIndex(x, i) initialize(x, vec[ind], labels = x@labels[ind]) }) setReplaceMethod("[", "UCSCTrackModes", function(x, i, j, ..., value) { vec <- x@.Data names(vec) <- names(x) vec[resolveTrackIndex(x, i)] <- value x@.Data <- as.vector(vec) x }) # handle simple track show/hide setMethod("trackNames", "UCSCTrackModes", function(object) { visible <- object != "hide" tracks <- names(object)[visible] names(tracks) <- object@labels[visible] tracks }) setReplaceMethod("trackNames", "UCSCTrackModes", function(object, value) { value <- resolveTrackIndex(object, value) spec <- names(object) %in% value object[!spec] <- "hide" object[spec & object == "hide"] <- "full" object }) setMethod("trackNames", "UCSCView", function(object) { tracks <- ucscTracks(object) modes <- ucscTrackModes(tracks) tracks@ids[tracks@ids %in% trackNames(modes)] }) setReplaceMethod("trackNames", "UCSCView", function(object, value) { trackNames(ucscTrackModes(object)) <- value object }) setMethod("visible", "UCSCView", function(object) { modes <- ucscTrackModes(object) vis <- modes != "hide" names(vis) <- modes@labels vis }) setReplaceMethod("visible", "UCSCView", function(object, value) { modes <- ucscTrackModes(object) modes[value & modes == "hide"] <- "full" modes[!value] <- "hide" ucscTrackModes(object) <- modes object }) setMethod("range", "UCSCView", function(x, ..., na.rm) range(ucscCart(x))) setReplaceMethod("range", "UCSCView", function(x, value) { browserView(x@session, value, ucscTrackModes(x)) }) # only one view per session; a view is always active setMethod("activeView", "UCSCView", function(object) TRUE) # ucscTrackSet # visual properties are specified by a "track line" for UCSC setClass("TrackLine", representation(name = "character", description = "character", visibility = "character", color = "integer", priority = "numeric"), prototype(name = "R Track")) setMethod("show", "TrackLine", function(object) { cat(as(object, "character"), "\n") }) setClass("BasicTrackLine", representation(itemRgb = "logical", useScore = "logical", group = "character", db = "character", offset = "numeric", url = "character", htmlUrl = "character", colorByStrand = "matrix"), contains = "TrackLine") ucscPair <- function(key, value) paste(key, value, sep = "=") # to a text line setAs("TrackLine", "character", function(from) { checkString <- function(str, len) { ## These are more annoying than useful ## if (nchar(gsub("[a-zA-Z0-9_ ]", "", str))) ## warning("The string '", str, ## "' contains non-standard characters.") ## if (nchar(str) > len) { ## str <- substring(str, 1, len) ## warning("The string '", str, "' must be less than ", len, ## " characters; it has been truncated.") ## } if (regexpr(" ", str)[1] != -1) str <- paste("\"", str, "\"", sep="") str } str <- "track" name <- from@name if (length(name)) str <- paste(str, " name=", checkString(name, 15), sep="") desc <- from@description if (length(desc)) str <- paste(str, " description=", checkString(desc, 60), sep="") vis <- from@visibility if (length(vis)) str <- paste(str, " visibility=", vis, sep="") color <- from@color if (length(color)) str <- paste(str, " color=", paste(color, collapse=","), sep="") priority <- from@priority if (length(priority)) str <- paste(str, " priority=", priority, sep="") str }) setAs("BasicTrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") itemRgb <- from@itemRgb if (length(itemRgb)) str <- paste(str, " itemRgb=", if (itemRgb) "on" else "off", sep = "") useScore <- from@useScore if (length(useScore)) str <- paste(str, " useScore=", if (useScore) "1" else "0", sep = "") group <- from@group if (length(group)) str <- paste(str, " group=", group, sep="") db <- from@db if (length(db)) str <- paste(str, " db=", db, sep="") offset <- from@offset if (length(offset)) str <- paste(str, " offset=", offset, sep="") url <- from@url if (length(url)) str <- paste(str, " url=", "\"", url, "\"", sep="") htmlUrl <- from@htmlUrl if (length(htmlUrl)) str <- paste(str, " htmlUrl=", "\"", htmlUrl, "\"", sep="") colorByStrand <- from@colorByStrand if (length(colorByStrand)) { colors <- paste(colorByStrand[1,], colorByStrand[2,], colorByStrand[3,], sep = ",", collapse = " ") str <- paste(str, " colorByStrand=", colors, sep = "") } str }) ucscParsePairs <- function(str) { str <- sub("^[[:alpha:]]*[[:blank:]]", "", str) split <- as.character(read.table(sep = "=", comment.char = "", as.is = TRUE, strip.white = TRUE, text = str)) vals <- character(0) if (length(split)) { mixed <- tail(head(split, -1), -1) tags <- head(split, 1) vals <- tail(split, 1) if (length(mixed)) { tags <- c(tags, sub(".*[[:space:]]([[:alnum:]]*)$", "\\1", mixed)) vals <- c(sub("(.*)[[:space:]][[:alnum:]]*$", "\\1", mixed), vals) } names(vals) <- tags } vals } # from a text line setAs("character", "TrackLine", function(from) { line <- new("TrackLine") vals <- ucscParsePairs(from) if (!is.na(vals["name"])) line@name <- vals[["name"]] if (!is.na(vals["description"])) line@description <- vals[["description"]] if (!is.na(vals["visibility"])) line@visibility <- vals[["visibility"]] if (!is.na(vals["color"])) line@color <- as.integer(strsplit(vals[["color"]], ",")[[1]]) if (!is.na(vals["priority"])) line@priority <- as.numeric(vals[["priority"]]) line }) setAs("character", "BasicTrackLine", function(from) { line <- new("BasicTrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) if (!is.na(vals["itemRgb"])) line@itemRgb <- tolower(vals[["itemRgb"]]) == "on" if (!is.na(vals["useScore"])) line@useScore <- vals[["useScore"]] == "1" if (!is.na(vals["group"])) line@group <- vals[["group"]] if (!is.na(vals["db"])) line@db <- vals[["db"]] if (!is.na(vals["offset"])) line@offset <- as.integer(vals[["offset"]]) if (!is.na(vals["url"])) line@url <- vals[["url"]] if (!is.na(vals["htmlUrl"])) line@htmlUrl <- vals[["htmlUrl"]] if (!is.na(vals["colorByStrand"])) { colorToken <- strsplit(strsplit(vals[["colorByStrand"]], " ")[[1]], ",") line@colorByStrand <- matrix(as.integer(unlist(colorToken)), nrow = 3) } line }) setClass("GraphTrackLine", representation(altColor = "integer", autoScale = "logical", alwaysZero = "logical", gridDefault = "logical", maxHeightPixels = "integer", graphType = "character", viewLimits = "numeric", yLineMark = "numeric", yLineOnOff = "logical", windowingFunction = "character", smoothingWindow = "numeric", type = "character"), contains = "TrackLine") setAs("GraphTrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") type <- if (from@type == "wig") "wiggle_0" else "bedGraph" str <- paste(str, " type=", type, sep = "") color <- from@altColor if (length(color)) str <- paste(str, " altColor=", paste(color, collapse=","), sep="") autoScale <- from@autoScale onoff <- function(x) if (x) "on" else "off" if (length(autoScale)) str <- paste(str, " autoScale=", onoff(autoScale), sep = "") alwaysZero <- from@alwaysZero if (length(alwaysZero)) str <- paste(str, " alwaysZero=", onoff(alwaysZero), sep = "") gridDefault <- from@gridDefault if (length(gridDefault)) str <- paste(str, " gridDefault=", onoff(gridDefault), sep = "") maxHeightPixels <- from@maxHeightPixels if (length(maxHeightPixels)) str <- paste(str, " maxHeightPixels=", paste(maxHeightPixels, collapse=":"), sep = "") graphType <- from@graphType if (length(graphType)) str <- paste(str, " graphType=", graphType, sep = "") viewLimits <- from@viewLimits if (length(viewLimits)) str <- paste(str, " viewLimits=", paste(viewLimits, collapse = ":"), sep = "") yLineMark <- from@yLineMark if (length(yLineMark)) str <- paste(str, " yLineMark=", yLineMark, sep = "") yLineOnOff <- from@yLineOnOff if (length(yLineOnOff)) str <- paste(str, " yLineOnOff=", onoff(yLineOnOff), sep = "") windowingFunction <- from@windowingFunction if (length(windowingFunction)) str <- paste(str, " windowingFunction=", windowingFunction, sep = "") smoothingWindow <- from@smoothingWindow if (length(smoothingWindow)) str <- paste(str, " smoothingWindow=", smoothingWindow, sep = "") str }) setAs("character", "GraphTrackLine", function(from) { line <- new("GraphTrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) type <- vals[["type"]] if (!(type %in% c("wiggle_0", "bedGraph"))) stop("Unknown graph track type: ", type) line@type <- if (type == "wiggle_0") "wig" else "bedGraph" if (!is.na(vals["altColor"])) line@altColor <- as.integer(strsplit(vals[["altColor"]], ",")[[1]]) if (!is.na(vals["autoScale"])) line@autoScale <- tolower(vals[["autoScale"]]) == "on" if (!is.na(vals["alwaysZero"])) line@alwaysZero <- tolower(vals[["alwaysZero"]]) == "on" if (!is.na(vals["gridDefault"])) line@gridDefault <- tolower(vals[["gridDefault"]]) == "on" if (!is.na(vals["maxHeightPixels"])) line@maxHeightPixels <- as.integer(strsplit(vals[["maxHeightPixels"]], ":")[[1]]) if (!is.na(vals["graphType"])) line@graphType <- vals[["graphType"]] if (!is.na(vals["viewLimits"])) line@viewLimits <- as.numeric(strsplit(vals[["viewLimits"]], ":")[[1]]) if (!is.na(vals["yLineMark"])) line@yLineMark <- as.numeric(vals[["yLineMark"]]) if (!is.na(vals["yLineOnOff"])) line@yLineOnOff <- tolower(vals[["yLineOnOff"]]) == "on" if (!is.na(vals["windowingFunction"])) line@windowingFunction <- vals[["windowingFunction"]] if (!is.na(vals["smoothingWindow"])) line@smoothingWindow <- as.numeric(vals[["smoothingWindow"]]) line }) setAs("BasicTrackLine", "GraphTrackLine", function(from) new("GraphTrackLine", from)) setAs("GraphTrackLine", "BasicTrackLine", function(from) new("BasicTrackLine", from)) setClass("UCSCData", representation(trackLine = "TrackLine"), prototype(trackLine = new("BasicTrackLine")), "GRanges") UCSCData <- function(ranges, trackLine = NULL) { ucsc <- as(ranges, "UCSCData") ucsc@trackLine <- trackLine ucsc } setMethod("show", "UCSCData", function(object) { if (!is.null(object@trackLine@name)) cat("UCSC track '", object@trackLine@name, "'\n", sep = "") callNextMethod() }) chooseGraphType <- function(from) { r <- ranges(from) type <- "bedGraph" ## decide whether compression is a good idea steps <- diff(sort(start(r))) if (length(unique(width(r))) == 1L && # all spans must be the same for WIG (length(unique(steps)) == 1L || # fixed-step makes sense ((3L * length(unique(width(r)))) < length(r) && # makes sense wrt size mean(steps) < 100))) # dense enough for UCSC efficiency type <- "wig" type } setAs("GRanges", "UCSCData", function(from) { line <- metadata(from)$trackLine if (is.null(line)) { if (is.numeric(score(from))) { # have numbers, let's plot them type <- chooseGraphType(from) line <- new("GraphTrackLine", type = type) } else { line <- new("BasicTrackLine") db <- unique(genome(from)) if (length(db) == 1 && !is.na(db)) line@db <- db } } else { metadata(from)$trackLine <- NULL } new("UCSCData", as(from, "GRanges"), trackLine = line) }) setAs("UCSCData", "GRanges", function(from) { gr <- new("GRanges") for (what in slotNames(gr)) slot(gr, what) <- slot(from, what) metadata(gr)$trackLine <- from@trackLine gr }) setAs("RangedData", "UCSCData", function(from) { line <- metadata(ranges(from))$trackLine if (is.null(line)) { if (is.numeric(score(from))) { # have numbers, let's plot them type <- chooseGraphType(from) line <- new("GraphTrackLine", type = type) } else { line <- new("BasicTrackLine") db <- unique(genome(from)) if (length(db) == 1 && !is.na(db)) line@db <- db } } new("UCSCData", as(from, "GRanges"), trackLine = line) }) setAs("UCSCData", "RangedData", function(from) { as(as(from, "GRanges"), "RangedData") }) splitUCSCData <- function(x, f, drop=FALSE, ...) { GenomicRangesList( lapply(split(seq_along(x), f, drop=drop, ...), function(i) x[i]) ) } setMethod("split", "UCSCData", splitUCSCData) setMethod("split", c("UCSCData", "Vector"), splitUCSCData) setClass("UCSCFile", contains = "RTLFile") UCSCFile <- function(resource) { new("UCSCFile", resource = resource) } ## the 'ucsc' format is a meta format with a track line followed by ## features formatted as 'wig', 'bed', 'bed15', 'bedGraph', 'gff', or ## really any text track format. setGeneric("export.ucsc", function(object, con, ...) standardGeneric("export.ucsc")) setMethod("export.ucsc", c("ANY", "RTLFile"), function(object, con, subformat = "auto", ...) { if (subformat == "auto" && !is(con, "UCSCFile")) subformat <- fileFormat(con) export(object, UCSCFile(resource(con)), subformat, ...) }) setMethod("export.ucsc", c("ANY", "ANY"), function(object, con, ...) { export(object, con, "ucsc", ...) }) .export_GenomicRangesList_RTLFile <- function(object, con, format, ...) { export(object, UCSCFile(resource(con)), subformat = fileFormat(con), ...) } setMethod("export", c("GenomicRangesList", "UCSCFile"), function(object, con, format, append = FALSE, index = FALSE, ...) { if (isTRUE(index) && length(object) > 1) stop("Cannot index multiple tracks in a single file") trackNames <- names(object) if (is.null(trackNames)) trackNames <- paste("R Track", seq_len(length(object))) ucsc <- unlist(lapply(object, is, "UCSCData")) lines <- unlist(lapply(object[ucsc], slot, "trackLine")) trackNames[ucsc] <- as.character(sapply(lines, slot, "name")) for (i in seq_len(length(object))) { export(object[[i]], con, name = trackNames[i], append = append, index = index, ...) append <- TRUE } }) trackLineClass <- function(subformat) { subformat <- tolower(subformat) if (subformat == "wig" || subformat == "bedgraph") "GraphTrackLine" else if (subformat == "bed15") "Bed15TrackLine" else "BasicTrackLine" } setGeneric("fileFormat", function(x) standardGeneric("fileFormat")) setMethod("fileFormat", "TrackLine", function(x) "bed") setMethod("fileFormat", "GraphTrackLine", function(x) x@type) setMethod("bestFileFormat", c("UCSCData", "ANY"), function(x, dest) { fileFormat(x@trackLine) }) setMethod("export", c("ANY", "UCSCFile"), function(object, con, format, ...) { cl <- class(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "GenomicRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } object <- track callGeneric() }) setMethod("export", c("GenomicRanges", "UCSCFile"), function(object, con, format, ...) { object <- as(object, "UCSCData") callGeneric() }) setMethod("export", c("UCSCData", "UCSCFile"), function(object, con, format, subformat = "auto", append = FALSE, index = FALSE, ...) { auto <- FALSE if (subformat == "auto") { auto <- TRUE subformat <- bestFileFormat(object, con) } graphFormat <- tolower(subformat) %in% c("wig", "bedgraph") if (graphFormat) { strand <- as.character(strand(object)) strand[is.na(strand)] <- "NA" isStrandDisjoint <- function(track) { all(tapply(ranges(track), seqnames(track), function(r) { isDisjoint(r) && all(width(r) > 0) }), na.rm=TRUE) } if (!all(unlist(lapply(split(object, strand), isStrandDisjoint)))) { if (auto) { subformat <- "bed" graphFormat <- FALSE } else stop("Track not compatible with WIG/bedGraph: ", "Overlapping features must be on separate strands", " and every feature width must be positive") } } lineClass <- trackLineClass(subformat) if (!is(object@trackLine, lineClass)) object@trackLine <- as(object@trackLine, lineClass) if (is(object@trackLine, "GraphTrackLine")) object@trackLine@type <- subformat args <- list(...) lineArgs <- names(args) %in% slotNames(lineClass) for (argName in names(args)[lineArgs]) slot(object@trackLine, argName) <- args[[argName]] if (is(object@trackLine, "BasicTrackLine") && length(object@trackLine@offset)) ranges(object) <- shift(ranges(object), -object@trackLine@offset) trackLine <- NULL if (graphFormat) { strand <- as.character(strand(object)) strand[is.na(strand)] <- "NA" if (!all(strand[1] == strand)) { nameMap <- c("+" = "p", "-" = "m", "NA" = "NA") strand <- factor(strand) name <- paste(object@trackLine@name, nameMap[levels(strand)]) tracks <- split(object, strand) export(tracks, con, subformat, append, trackNames = name, ...) return() } } else if (subformat == "bed15") { if (is.null(object@trackLine@expNames)) object@trackLine@expNames <- colnames(object) trackLine <- object@trackLine } file <- con con <- connection(con, if (append) "a" else "w") on.exit(release(con)) cat(as(object@trackLine, "character"), "\n", file=con, sep = "") do.call(export, c(list(as(object, "GRanges"), unmanage(con), subformat), args[!lineArgs], trackLine = trackLine)) release(con) if (index) indexTrack(FileForFormat(resource(file), subformat), skip = 1L) else invisible(file) }) setGeneric("import.ucsc", function(con, ...) standardGeneric("import.ucsc")) setMethod("import.ucsc", "ANY", function(con, ...) { import(con, "ucsc", ...) }) setMethod("import.ucsc", "RTLFile", function(con, subformat = "auto", ...) { if (!is(con, "UCSCFile")) { format <- fileFormat(con) if (subformat != "auto" && format != subformat) stop("Attempt to import '", class(con), "' as ", subformat) subformat <- format } import.ucsc(resource(con), subformat = subformat, ...) }) parseFormatFromTrackLine <- function(x) { if (!grepl("type=", x)) NULL else { type <- sub(".*type=\"(.*?)\".*", "\\1", x) if (type == "array") "bed15" else if (type == "wiggle_0") "wig" else type } } setMethod("import", "UCSCFile", function(con, format, text, subformat = "auto", drop = FALSE, genome = NA, ...) { lines <- readLines(resource(con), warn = FALSE) tracks <- grep("^track", lines) trackLines <- lines[tracks] starts <- tracks + 1L ends <- c(tail(tracks, -1) - 1L, length(lines)) makeTrackSet <- function(i) { if (subformat == "auto") { subformat <- parseFormatFromTrackLine(trackLines[i]) if (is.null(subformat)) { p <- resourceDescription(con) subformat <- file_ext(p) } } line <- as(trackLines[i], trackLineClass(subformat)) if (starts[i] <= ends[i]) { text <- window(lines, starts[i], ends[i]) } else { text <- character() } if (is.na(genome) && is(line, "BasicTrackLine") && length(line@db)) genome <- line@db if (subformat == "bed15") { # need to pass track line ucsc <- import(format = "bed15", text = text, trackLine = line, genome = genome, ...) } else { ucsc <- import(format = subformat, text = text, genome = genome, ...) } if (is(line, "BasicTrackLine") && length(line@offset)) ranges(ucsc) <- shift(ranges(ucsc), line@offset) ucsc <- as(ucsc, "UCSCData", FALSE) ucsc@trackLine <- line ucsc } tsets <- lapply(seq_along(trackLines), makeTrackSet) trackNames <- sapply(tsets, function(x) x@trackLine@name) if (!any(is.na(trackNames))) names(tsets) <- trackNames if (drop && length(tsets) == 1) return(tsets[[1]]) ans <- do.call(RangedDataList, lapply(tsets, as, "RangedData")) GenomicRangesList( lapply(ans, function(rd) { line <- metadata(ranges(rd))$trackLine if (is.null(line)) Class <- "GRanges" else Class <- "UCSCData" as(rd, Class) })) }) setMethod("login", "UCSCSession", function(x, username, password) { ucscPost(x, "hgLogin", list(hgLogin.do.displayLogin = "Login", hgLogin_userName = username, hgLogin_password = password)) }) setMethod("saveView", "UCSCView", function(x, name, username, password, share = TRUE) { if (!missing(username)) login(browserSession(x), username, password) ucscPost(x, "hgSession", list(hgS_newSessionName = name, hgS_newSessionShare = if (share) "on" else "off")) }) setMethod("restoreView", "UCSCSession", function(x, name, username, password) { if (!missing(username)) login(x, username, password) ucscPost(x, "hgSession", setNames(list("use"), paste0("hgS_load_", name))) }) ############ INTERNAL API ############ ## every cgi variable is stored in the 'cart' setClass("ucscCart", contains = "character") setGeneric("ucscCart", function(object, ...) standardGeneric("ucscCart")) setMethod("ucscCart", "UCSCSession", function(object, form = ucscForm(activeView(object))) { node <- ucscGet(object, "cart", form) raw <- xmlValue(getNodeSet(node, "//pre/text()")[[1]]) lines <- strsplit(raw, "\n")[[1]] fields <- strsplit(lines, " ") pairs <- fields[sapply(fields, length) == 2] mat <- matrix(unlist(pairs), nrow = 2) vals <- mat[2,] names(vals) <- mat[1,] new("ucscCart", vals) }) setMethod("ucscCart", "UCSCView", function(object) { ucscCart(object@session, ucscForm(object)) }) setMethod("genome", "ucscCart", function(x) x[["db"]]) setMethod("range", "ucscCart", function(x, ..., na.rm) { pos <- x["position"] posSplit <- strsplit(pos, ":")[[1]] range <- as.numeric(gsub(",", "", strsplit(posSplit[2], "-")[[1]])) GRangesForUCSCGenome(x[["db"]], posSplit[1], IRanges(range[1], range[2])) }) ### track information setClass("ucscTracks", representation(ids = "character", modes = "character")) setGeneric("ucscTracks", function(object, ...) standardGeneric("ucscTracks")) setMethod("ucscTracks", "UCSCSession", function(object, form = list()) { tracks <- ucscGet(object, "tracks", form) nodes <- getNodeSet(tracks, "//select/option[@selected]/text()") trackModes <- sapply(nodes, xmlValue) nodes <- getNodeSet(tracks, "//select/@name") trackIds <- unlist(nodes) ##trackIds <- sapply(nodes, xmlValue) nodes <- getNodeSet(tracks, "//select/../a/text()") names(trackIds) <- sub("^ ", "", sapply(nodes, xmlValue)) new("ucscTracks", ids = trackIds, modes = trackModes) }) setMethod("ucscTracks", "UCSCView", function(object) { ucscTracks(object@session, ucscForm(object)) }) setMethod("ucscTrackModes", "ucscTracks", function(object) { modes <- object@modes labels <- names(object@ids) names(modes) <- object@ids ucscTrackModes(modes, labels) }) ## List available UCSC genomes .getOrganism <- function(db){ .ucsc <- "http://genome.ucsc.edu/cgi-bin" .tryQuery <- function(url, query) tryCatch({ htmlTreeParse(url, useInternalNodes=TRUE)[[query]] }, error=function(err) { warning(conditionMessage(err)) NA_character_ }) urls <- sprintf("%s/hgGateway?db=%s", .ucsc, db) sapply(urls, .tryQuery, "string(//div[@id='sectTtl']/i)") } ucscGenomes <- function(organism=FALSE) { url <- "http://genome.ucsc.edu/FAQ/FAQreleases" doc <- httpGet(url) table <- getNodeSet(doc, "//table[@class='descTbl']")[[1L]] species <- sapply(getNodeSet(table, "tr/td[1]"), xmlValue) dbs <- sapply(getNodeSet(table, "tr/td[2]"), xmlValue) dates <- sapply(getNodeSet(table, "tr/td[3]"), xmlValue) nms <- sapply(getNodeSet(table, "tr/td[4]"), xmlValue) status <- sapply(getNodeSet(table, "tr/td[5]"), xmlValue) .cleanTableCells <- function(x) { x <- sub("^ *", "", x) ## Some empty cells in the table of UCSC genome releases seem to contain ## invisible junk. This junk seems to vary from one platform to the other ## (not clear why, maybe some sort of local issue?). ## There must be a simplest way to get rid of this junk... ## TODO: Test this on Windows! is_empty_cell <- x %in% c("", "\xc2\xa0", "\xc3\x82\xc2\xa0") x[is_empty_cell] <- "" x } df <- data.frame(db=.cleanTableCells(dbs), species=.cleanTableCells(species), date=.cleanTableCells(dates), name=.cleanTableCells(nms), status=.cleanTableCells(status), stringsAsFactors=FALSE) COLS <- c("UCSC VERSION", "SPECIES", "RELEASE DATE", "RELEASE NAME", "STATUS") if (!identical(as.character(df[1L, ]), COLS)) stop("table of UCSC genome releases (found at ", url, "#release1) ", "doesn't have expected columns ", paste(COLS, collapse=", ")) df <- df[-1L, ] df <- df[df$db != "" , ] not_empty <- df$species != "" df$species <- rep.int(df$species[not_empty], diff(which(c(not_empty, TRUE)))) df <- df[df$status == "Available", -5L] if (organism) df$organism <- .getOrganism(df$db) rownames(df) <- NULL df } # form creation setGeneric("ucscForm", function(object, ...) standardGeneric("ucscForm")) setMethod("ucscForm", "RangesList", function(object) { form <- list() genome <- singleGenome(genome(object)) if (!is.na(genome)) form <- c(form, db = genome) chrom <- space(object) if (!is.null(chrom)) { if (!length(chrom)) chrom <- levels(chrom)[1] scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) position <- chrom if (length(unlist(start(object)))) position <- paste(chrom, ":", unlist(start(object)), "-", unlist(end(object)), sep = "") form <- c(form, position = position) } form }) setMethod("ucscForm", "GRanges", function(object) { scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) form <- list() genome <- singleGenome(genome(object)) if (!is.na(genome)) form <- c(form, db = genome) if (length(object) > 0L) { object <- object[1] c(form, position = paste(seqnames(object), ":", unlist(start(object)), "-", unlist(end(object)), sep = "")) } else form }) setMethod("ucscForm", "UCSCTrackModes", function(object) { as.list(object) }) setMethod("ucscForm", "UCSCView", function(object) { if (length(object@hgsid)) list(hgsid = as.character(object@hgsid)) else list() }) setOldClass("FileUploadInfo") setMethod("ucscForm", "FileUploadInfo", function(object, genome = NA_character_, ...) { form <- list(Submit = "Submit", hgt.customFile = object) if (!is.na(genome)) form <- c(form, db = genome) form }) setMethod("ucscForm", "GenomicRangesList", function(object, format, ...) { lines <- export(object, format = "ucsc", subformat = format, ...) text <- paste(paste(lines, collapse = "\n"), "\n", sep = "") filename <- paste("track", format, sep = ".") upload <- fileUpload(filename, text, "text/plain") genome <- singleGenome(genome(object)) ucscForm(upload, genome) }) setMethod("ucscForm", "RTLFile", function(object, genome, ...) { upload <- fileUpload(path(object), "text/plain") ucscForm(upload, genome) }) setMethod("ucscForm", "UCSCTableQuery", function(object, tracks = FALSE) { ## range (ie genome) is required range <- object@range table <- object@table form <- list() if (length(range) == 1) { form <- c(form, ucscForm(range)) } if (is.null(object@track) && !tracks) { form <- c(form, list(hgta_group = "allTables")) if (is.null(table)) table <- "chromInfo" } else form <- c(form, list(hgta_group = "allTracks", hgta_track = object@track)) if (spansGenome(range)) regionType <- "genome" else if (length(range) == 1) regionType <- "range" else regionType <- "userRegions" form <- c(form, hgta_regionType = regionType, hgta_table = table) if (!is.null(object@outputType)) { form <- c(form, hgta_outputType = object@outputType) } form$hgta_compressType <- "none" # TODO: support gzip form }) setMethod("ucscForm", "NULL", function(object) list()) # Transforming to a cookie string setGeneric("ucscCookie", function(object, ...) standardGeneric("ucscCookie")) setMethod("ucscCookie", "UCSCSession", function(object) { object@hguid }) # HTTP wrappers # URL constants for UCSC ucscURLTable <- c(gateway = "hgGateway", tracks = "hgTracks", custom = "hgCustom", tables = "hgTables", cart = "cartDump") ucscURL <- function(object, key) { path <- ucscURLTable[key] if (is.na(path)) stop("Key '", key, "' does not match a known URL") else paste(object@url, path, sep="") } # convenience wrappers for _initialized_ sessions ucscShow <- function(object, key, .form = list(), ...) httpShow(ucscURL(object, key), .form, ...) ucscPost <- function(object, key, .form = list(), ...) httpPost(ucscURL(object, key), .form, ..., cookie = ucscCookie(object)) ucscGet <- function(object, key, .form = list(), ...) httpGet(ucscURL(object, key), .form, ..., cookie = ucscCookie(object)) rtracklayer/R/utils.R0000644000175100017510000000075212607264731015615 0ustar00biocbuildbiocbuild### ========================================================================= ### Utilities ### ------------------------------------------------------------------------- pasteCollapse <- function(x, collapse = ",") { if (!is(x, "CharacterList")) stop("'x' must be a CharacterList") if (!isSingleString(collapse) || nchar(collapse) != 1L) stop("'collapse' must be a single string, with a single character") x <- as.list(x) .Call(CharacterList_pasteCollapse, x, collapse) } rtracklayer/R/web.R0000644000175100017510000000345212607264730015231 0ustar00biocbuildbiocbuildhtmlErrorHandler <- function(msg, code, domain, line, col, level, filename) { if (!length(level)) stop("Unknown HTML parse error") if (level > 2) stop("Failed to Parse HTML [", line, ":", col, "]: ", msg) } htmlParse <- function(str) suppressWarnings(htmlTreeParse(str, asText = TRUE, useInternalNodes = TRUE, error = htmlErrorHandler)) httpGet <- function(url, .form = list(), .parse = TRUE, ...) { if (length(.form) == 0) out <- getURL(url, useragent = "rtracklayer", ...) else out <- getForm(url, .params = .form, .opts = list(..., useragent = "rtracklayer")) if (.parse) htmlParse(out) else out } httpPost <- function(url, .form = list(), .parse = TRUE, ...) { form <- postForm(url, .params = .form, .opts = list(..., useragent = "rtracklayer")) if (.parse) htmlParse(form) else form } httpShow <- function(url, .form = list(), ...) browseURL(urlForm(url, .form, ...)) urlForm <- function(url, .form = list(), ...) { values <- urlEncode(as.character(c(.form, ...))) query <- paste(names(.form), values, sep = "=", collapse = "&") paste(url, query, sep = "?") } # differs from URLencode (vectorized, only encodes specified chars) urlEncode <- function(str, chars = "-a-zA-Z0-9$_.+!*'(),", keep = TRUE) { str <- as.character(str) bad <- chars if (keep) bad <- gsub(paste("[", chars, "]", sep=""), "", str) bad <- unique(unlist(strsplit(bad, ""))) code <- paste("%", charToRaw(paste(bad, collapse="")), sep="") for (i in seq_along(bad)) str <- gsub(bad[i], code[i], str, fixed = TRUE) str } # differs from URLdecode (vectorized) urlDecode <- function(str, na.strings="NA") { ans <- curlUnescape(str) if (!identical(na.strings, "NA")) ans[is.na(str)] <- na.strings ans } rtracklayer/R/wig.R0000644000175100017510000002132312607264731015240 0ustar00biocbuildbiocbuild### ========================================================================= ### WIG (Wiggle) support (fixedStep and variableStep, legacy bedGraph) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("WIGFile", contains = "RTLFile") WIGFile <- function(resource) { new("WIGFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.wig", function(object, con, ...) standardGeneric("export.wig")) setMethod("export.wig", "ANY", function(object, con, ...) { export(object, con, "wig", ...) }) setMethod("export", c("ANY", "WIGFile"), function(object, con, ...) { cl <- class(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "GenomicRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } export(track, con, ...) }) .wigWriter <- function(chromData, con, dataFormat, append) { con <- connection(con, if (append) "a" else "w") on.exit(release(con)) cat(dataFormat, file = con) cat(" chrom=", as.character(seqnames(chromData)[1]), file = con, sep = "") data <- score(chromData) starts <- start(chromData) if (dataFormat == "variableStep") data <- cbind(starts, data) else { cat(" start=", starts[1], file = con, sep = "") step <- if (length(starts) == 1) 0 else starts[2] - starts[1] cat(" step=", step, file = con, sep = "") } cat(" span=", width(chromData)[1], file = con, sep = "") cat("\n", file = con, sep = "") write.table(data, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE) } setMethod("export", c("GenomicRanges", "WIGFile"), function(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep"), writer = .wigWriter, append = FALSE, ...) { if (!missing(format)) checkArgFormat(con, format) if (!is.numeric(score(object)) || any(is.na(score(object)))) stop("The score must be numeric, without any NA's") scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) dataFormat <- match.arg(dataFormat) doBlock <- function(chromData) { if (length(chromData) == 0L) return() if (is.unsorted(start(chromData))) chromData <- chromData[order(start(chromData)),] starts <- start(chromData) ends <- end(chromData) if (!all(tail(starts, -1) - head(ends, -1) > 0)) stop("Features cannot overlap. ", "Note that WIG does not distinguish between strands - ", "try exporting two tracks, one for each strand.") spans <- ends - starts + 1 if (length(starts) == 1) steps <- 0 else steps <- diff(starts) fixedSpan <- all(spans[1] == spans) if (!fixedSpan) stop("The span must be uniform for Wiggle export. ", "Consider bedGraph or bigWig as alternatives.") fixedStep <- all(steps[1] == steps) if (dataFormat == "auto") { dataFormat <- "variableStep" if (fixedStep) dataFormat <- "fixedStep" } if (dataFormat != "variableStep" && !fixedStep) stop("Step not uniform: consider variableStep") ans <- writer(chromData, con, dataFormat, append) append <<- TRUE ans } dataFormat <- match.arg(dataFormat) lapply(split(object, seqnames(object)), doBlock) invisible(con) }) setMethod("export", c("UCSCData", "WIGFile"), function(object, con, format, trackLine = TRUE, ...) { if (!missing(format)) checkArgFormat(con, format) if (trackLine) { export.ucsc(object, con, ...) } else { callNextMethod() } invisible(con) }) setMethod("export", c("GenomicRangesList", "WIGFile"), .export_GenomicRangesList_RTLFile) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.wig", function(con, ...) standardGeneric("import.wig")) setMethod("import.wig", "ANY", function(con, ...) { import(con, "wig", ...) }) setMethod("import", "WIGFile", function(con, format, text, genome = NA, trackLine = TRUE, which = NULL, seqinfo = NULL, ...) { if (!missing(format)) checkArgFormat(con, format) file <- con con <- connection(con, "r") ## check for a track line line <- scanTrackLine(con) if (!is.null(line) && trackLine) { pushBack(line, con) return(import.ucsc(initialize(file, resource = con), drop = TRUE, trackLine = FALSE, genome = genome, which = which, seqinfo = seqinfo, ...)) } lines <- readLines(con, warn = FALSE) formatInds <- grep("chrom=", lines, fixed=TRUE) formatLines <- lines[formatInds] starts <- formatInds + 1L ends <- c(tail(formatInds, -1) - 1L, length(lines)) format <- gsub("^([^ ]*) .*", "\\1", formatLines) parsedFormat <- lapply(formatLines, ucscParsePairs) chrom <- sapply(parsedFormat, `[[`, "chrom") if (is.null(seqinfo) && !is.null(genome) && !is.na(genome)) seqinfo <- seqinfoForGenome(genome) if (!is.null(seqinfo)) seqlevels <- seqlevels(seqinfo) else seqlevels <- unique(chrom) if (length(formatLines)) { parseData <- function(i) { ## parse format line formatVals <- parsedFormat[[i]] # parse the data values block_lines <- window(lines, starts[i], ends[i]) if (!length(block_lines)) { gr <- GRanges(score = numeric()) seqlevels(gr) <- seqlevels return(gr) } block_lines <- grep("^#", block_lines, invert = TRUE, value = TRUE) if (format[i] == "variableStep") { ## assume the same white space for every row sep <- sub(".*?([[:space:]]+).*", "\\1", block_lines[1]) split_lines <- strsplit(block_lines, sep, fixed=TRUE) mat <- matrix(as.numeric(unlist(split_lines)), nrow = 2) start <- mat[1,] score <- mat[2,] } else { start <- seq(as.integer(formatVals["start"]), by = as.integer(formatVals["step"]), length.out = length(block_lines)) score <- as.numeric(block_lines) } span <- formatVals["span"] if (is.na(span)) span <- 1 end <- start + as.integer(span) - 1 gd <- GenomicData(IRanges(start, end), score = score, chrom = formatVals[["chrom"]], which = which) seqlevels(gd) <- seqlevels gd } parseInds <- seq_along(formatInds) if (!is.null(which)) { message("For efficiency, consider converting this WIG file", " to a BigWig file;\nsee ?wigToBigWig") which <- as(which, "RangesList") parseInds <- parseInds[chrom %in% names(which)] } resultList <- lapply(parseInds, parseData) gd <- do.call(c, resultList) if (!is.null(seqinfo)) seqinfo(gd) <- seqinfo else if (!is.null(genome)) genome(gd) <- genome gd } else { import(text = lines, format = "bedGraph", genome = genome, which = which, seqinfo = seqinfo) } }) rtracklayer/TODO0000644000175100017510000000045312607264731014617 0ustar00biocbuildbiocbuild- List subtracks for a supertrack in the UCSC browser - Up-front column selection - Chunked importing (pass a chunk size and callback to import) - Attach to existing saved sessions - Represent formats with formal class in I/O framework, rather than ".format" - Port to track reading and writing to Crtracklayer/build/0000755000175100017510000000000012612032142015205 5ustar00biocbuildbiocbuildrtracklayer/build/vignette.rds0000644000175100017510000000030412612032142017541 0ustar00biocbuildbiocbuild‹‹àb```b`fbb`b2™… 1# 'æ/*)JLÎÎI¬L-Ò Ê+G“æF’Ƨ³ % MšÅ` C„Á’E@À„¤˜5/17µÍv—Ô‚Ô¼ð?ìúÿ£iáðN­,Ï/‚éAQÃUÃâ–™“ ³7$³Îapqƒ2ƒÐÝ€a>Šû9‹òËõ`~à{øèMÎI,F÷(WJbI¢^ZP?ÈÝ`ô«L¸rtracklayer/configure.ac0000644000175100017510000000173412607264731016420 0ustar00biocbuildbiocbuildAC_PREREQ([2.65]) AC_INIT("rtracklayer") ### NOTE: ideally, we would generate a config.h here and use the ### results of these checks. Way too lazy to attempt anything, but at ### least the configure output can help diagnose build issues. ## Checks for libraries AC_CHECK_LIB([z], [gzeof],,[AC_MSG_ERROR([need libz with gzeof])]) ## Checks for headers AC_CHECK_HEADERS([zlib.h arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h strings.h sys/file.h sys/socket.h sys/time.h termios.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UID_T # Checks for library functions. AC_FUNC_FORK AC_FUNC_MALLOC AC_FUNC_MKTIME AC_FUNC_REALLOC AC_FUNC_STRTOD AC_CHECK_FUNCS([bzero dup2 getcwd gethostbyname gettimeofday memmove memset mkdir regcomp select socket sqrt strcasecmp strchr strcspn strdup strerror strrchr strspn strstr uname]) AC_OUTPUT(src/Makevars) rtracklayer/data/0000755000175100017510000000000012607264731015036 5ustar00biocbuildbiocbuildrtracklayer/data/cpneTrack.rda0000644000175100017510000223662412607264731017457 0ustar00biocbuildbiocbuildý7zXZi"Þ6!ÏXÌâªïþ])TW"änRÊŸãXg€ÆqÅjnçj-' “ø$ ûÑöv}Öq5ìç)²( Jpá³Ü—Ã**6¶4CïůDzG‘ÃÞéÐÐ2ó¼pLþî!/èLZZkg]”ˆ/ÕX¾Sç{]†Õ#"bøÊ![$µÎŠÆnõ åc*»dù¬P"^çíêD± ¨lTV3ï|ð¢R&€&,ŠD¥¥uà2 pœë¬¼ &+‡Z2ˆwuÎEº |^4gøü\q¹IŒ§Yà8Pn~š‘o1kiš§k”Kçæ£;ÑThiÖw„é¢Iû2½©©5µSÓ9ž'a’i) G/0}ˆ,XJxÛóô~‰*ü0Hf5šálÝg²/ÚÇášn‰%¡Äð“á3©yŸÅí¸< 6¤t/oRˆùÏ­Q‚ÒƒNŽúæ‰BÒþˆx¸¥e:º ø½ß@$G„XÕ8†%lY$g×–¢3ê•üîR¶ÿäÚÄôÒŒ-eÿ©RùÖÂØµuûÎeáËsë« QÓ–ZÄiÊS–D ‰ëO€Ë!Á&r’Kë‘õõ¹¢ø%éèÈ…ê  –‡,„Rž[Z“š›dGç¼ÉSG±ü(¹™ŒÒ l×S ÒödïPb v²´aÚ %^R“&äÐSÊ×T ¢ìF¡AÁñC z ‘ŽiÖÒ£‚.8/“&yÞã¨v¢¾•~QÈæìN¢¢ŒDspi'‡…U¢Ó|Q@,’£‚’=»r ×ÚôÒˆúe^Sxmÿ³ÊkÖÀûæ2(2ÀùŒüïülG «,Æcм¤Ãgá |£YÄïÓMènö,ô°=å@r!Uípš¾)q ½˜ã!œo¿wæöN¤ÖZwŠ=I©¯ÕRæy§`Rz¢·B¬µ¸‘|Ô 87î£X=úhÄ!W²¨žsÑŽ»b.œ0y!É«$æÍlPi‡ü} ]ÓÚõ¥ª™#¾´ë—Óa¹iX½3:+Kp äqäÙãx¢@ê#ì1Öºº +» kâLŸ‚n€$í/Éfl°î„ɧˆïÈ]âŠ|„>6¬zÂ{A`$ô嘓 (dÊ{ĨÆè[ß³ÓÕC"úëêDÄZbÑÒ™O´Åš^í¿– T ÷ñ Oá0-÷ÊgÓ=”$À[NA¶âMSz´z>Æ=®‘ÜŒ#âºC&œo•\ŠÜdTs)?œ¦`‰£pQiÄ ²ÚáªVÐ+A‘Xñ@©D­o©K¬Ý£7]ðy™wéš “<*=à±î @ÛšNee4äGÑÃ~눥ýÖK=ëB{p1…³ŸAöö˜­'J£0Ïï\BAO÷>È\Îÿ |—å_uÛŽ‡Ë5.TMi¢¹tæ@³uyžxLâëL¾A2Œ7vpùžÂÑ¿ÖiWö‘£™r ýð'ÈЪX8àZÿ”ØÁE.z‡Î` A1ŒBòüå²?íñÕÉpÔ÷9¤çHçCE·•Õº³^m‰–ã(Æ/ªBtD×wøï´9Û[¸ùÏñÆ£ö&߆€&îËÊê?¬)à0´²&þ‰ZC•VÆJ‘fX3”|‚L}|VFUrÊ£@ºÿŸ.“ô#€úŠÿ¾Ò›)7‹Í½Ó_Ž_VÈ~^8iTnÕ¶ÙoÃöªÀª°š‘ó§Æ™U?Ó.Ò˜¦ît¸¢á21H‡L ñ†Fý‡ÏÏ=À:´ U²¹›mc7AÁ XOÄ‚ù®Þ©Bš)íR¦6Ӕਭì/ŸÙlœK®´˜•“’LZˆ‹—£H´ã,Lž"ðtICmýGŒKG‚äémª9+§ÿ0€¯³&F"º ÏÓ ±èEGt¡©øjq‘ˆ–ÚÁ:>ÊRl|è7Ÿ€”¤ ÝuÁ Nl;$ygf IÚæJäf±–ÌX¸ñ” B(gÄymè;!̨ó5ã@&Í…ïg£µ—®›ýÌ”Æ6vI˜.ªÛ—¡E(–Îö‚Ú} úá³¶™š—ØýdÅrÍìqÛ?ŒFÎ%sÙÆì7©ï+œ÷KùdåðuÕ ÝíC§ Qki2Ňx€lÝ·»Ð´ÜJ50¨%â ¶ë2ÂL¢w*=årRZ±¸ZzZ›­{j_ÞŠáý W×÷3.åë/å^4–†n§ðÔ’açe H:¢Z1„*Û)Èj׊Ý)‚düÒ…¶W@Ì>¤åÄÈèBw#Aî?îma`#xC&…—d<–jh#ê&yÂÞ ?–]›<97øGÞ Ø$“ýyõ^è£=À¦û‰Þ)\¦“ ú^‹°„ƒ6?.º‹µHô-T½~ÒDhxÃêºÝ_nØšft˜Aþn—™š1áºÇ— ÚuªædN>½Íj¼ˆ›ŠFøè³AýH.æy²‰¿Üdp˜ªçì|<‰yE"»g\C%•íæ#Yê:ãˆV*%rb þr1 ÞÆ¶VèEbEl3@·öMŸtéؼoi,—°Å°s ¿ß´Ó*L‡4ÄãLÁ)r´+tBrPs6¢¡nê›Þ0i±JŸÐòé#e³h§Š ²¼šÑêrBk¡J ÙJ÷uÖベ—Šöì!½¸ãƒ¡¡yóLH#mBÍý;@½ýÙ©Q–YÍô‚Jì1ó‰žÞd3'Ä¥ÓpF½ p%£D…µá«×Oëå¬M0‘~ïLG…q":Ë9ÿâ©Î¥ /úýÇí¿ª ·($Rž7¼Pí¨¹éü/\ò/àÚ«n`»³ÎÅ¥Ãe_c%'y›`è^S÷®†KtDóo áó ÊјL´'ž?Ð D‹Ã&!cŸÚÁ!¢ÐÉðë&ûªS^íü›`–ü¥4t-Ç_ê^,”aáCkÀY÷"” À äxØs7°1¸Cz)ëÙ–ëY0Úè69zj.9±œF&çt‡¶Ã:ÎR± ;µ‚7HÎì6ñS'Kª-|¾£õx&äõ¿cLfì6—7[É®E>Ã2:Ôx… :þ+n (õ“H°:’!¾•FO~S‘ÙS‚LÓÀë¬ãN`Aïü‘ÞÖÛ+÷f i&4…øýŠì‘r0@xXßôúf)Ñ 8Ã`æ3hÊKvÂ1 ʽq}%!‘{r£Û ‰ÔHù]náÎ8µ<üöL𠪇%qÜÏ XäÆû0^Tu}æ­˜YuuC¹¸þL±Æâgi›@– „ª¼M^Õ^F}˜sWõØŒO• Ó}¨Îô!û…e1e»•(ÛÈÁÕ(Pœ)@*çÐhøè/= &3Yß1T“¼u@è¿É»YæÞR‡Ì5…“ÀÚc¾€vw¯¯yæ’Ø‰;T÷û¸´TÈk Óå¿¢ãbB4HåΉ×ત}Ù&÷•û—“9èãÒ{/Gžû®9Ò(Ç¥^LIþðqݶïežÄróQ-òÒF36lC¡£˜Où/»}[MÃì“øƒ’8t"œË½o•ÿeŒ÷žpfyð¼žC‰ÂËÏ4,l"ìë¨Þ ÿ’b¦}ð{?ë–>‚¢êsI°Ött[á¯lù|è[¼Ëã¾`ßíë¾gš-Jlão“8„¨ÿ2Gvü/C4Ã`Çý‡·ò‰Zj‚Ô¿ì=;wŠÂ ÿúó£š1óþ{ލvM“ÏÿÛ$_?¾u´œ÷Ápèþgôïûš¼û!nƒ÷ÞÔóää]Ê€IÅà²&!`ÏíbØÍŸH8Ùðh I}#çíïT•·PT‚Ú.Ä—Mð¡Ö’=ÉX¦fŽ¨Ý‘x£ÎË„¸çó(ötà0W+ÝŸ«³ŠlñÞ¥óRÑvM+W+®4¦ ~¹$m“ðÑ~ÚÙñé I{9tNkþôʰCï5ò£€âžlW¢n–ÝQûFÍý¯oÁ—âùð‰Ü‰;³BÙ;õoÓåH9fýÖª?Ä Ôæ—(^µl ƒw¬t£Ü]@ÞL59.nm!²´Z°]ÏÓZÂæÞ?âûÇ/¶Çraãáö„F†áµ¦A¯“ÏÓz¨Š¡–`%#†´œ$¨Å®>·±:ò š!/ë§\¹$õÜÖñ‘Ç8¸l;GºÐ°ø 2;r8Ê%¥ÈúÐfQ.?}·JR¹©¥Ô]⹈•©ÀPÌÇPÔíîÈuôMBdá41šî¥ñ0Xp*º5•hÔ|¦™<ß@÷ÛSèß‹$ƒROÀŽ’Ír©¿JÇÉ®+Í$zõ¹QòÑ0)ƒYÃO7±“<ÅU&_ŒÎùzJ#ª k«”ca7¹Ý Ƹ×s9UûÔv‹.Œ!¿âÑ—ç>ÃQhEÓi[îÀ}ÆV`O¡7¼}Eú=Ú¦Ùñ§£E;"'·ë«ô–-§²ÆdXÄÓ×)+>DÍp£V7ê }Ùë÷¶.>Ù9-X uÕ—ã\ËaùÍ|LÆT{/¡äZÓ‚·¦EòÜÎB£h=ûThòÉfÒP&©\%ýC{eË*Ÿä©üç¦.ßÌ©fG®ÀŠýíBLwoE%Ò¾ö"HZ¹»ÝÞ­·•w 5­hÔíg×ÕœK±öSŠŒF•OÄÍt2üSt‡X©ƒ~”a¹êKÄt7È/,òd¼vÉß!žØ¬6¤–l®¿AJä℈:h:X'zEñGs²Ö¯ˆ¥Æ&E碜鸓z€¹Û‚.Uwmw•yˆCûÖ¦z|—±p~6pGÍÀ¯ÆªX¿#2  eú2ã:•rYŠL^oÚ¤‘LïÖ3ÓÝo‘GÓÞ÷ðÏêC&N’bÆ,„Ý]Ý}&˲À´ì‚‹[¹gä›°M Ýk1΢ÏËÜ×45$F«¤k^‘ÌhZÿ«/X³š¢Ež‘#u@Þ|ô1pi³3]bRT°ê&É;Þ! Õ#‚‹y§˜aÚ|ÐûžÖˆœŒýϳrp«­52ÇlxúfoðSl).螘H%‹ê¡|ü±^{ÔW{zbNðtm6FÄ0“ò ‹ªLæcU½áD–U‹¯nÞߢ¾ßž¦~`ê·‹¦ÇÝ/ƒò4Ìùƒee¥µ¾Tʆg¨äXÝý½÷ƒ’9ëÙh&NTgåzý¿»™c3¼A?IËåÜÿ³¾÷/eÚâWGc¼ˆ>)Öt²ŠOÐ>×l×\¢Á@¶Àp§2r¿5W ¬2ˆÑ¡š!ohúë³F¡ÖÏ¥Ø0+Ï´JL#k:.¯;GJ¢[ΪS ÕuÛkU·ž@ÈËûm“J_IXK7b…×Òù×ΞD§Ž‚Ê–Ü&±;u·í¾mwqTÝ]ºK¨T ¾¢pË'$Þ0Ú¦ËQCùjâ#;ÚOãýD(Ž“çÓ§M¯žpF8Î*r± 4©¢®t5’%ö‡Š…âÒ³0áhó4C÷•Nœü×Mþü÷;mø{&aðh7ùJÊG_kÇYà2~¼¤/¼èÀr^#”Û îY)<¼óæP ³rT3*ŠÐqbîÞlM¥.¤$ô·äwÞÔêk6ÆpC¬ÃÌ«æzÙ”‘JYÕÎ8·Ð êݧ7Óï„WÛà`}Sr¡K¡Îã ™÷…‰ å?«ÇDDýVŽ3æà†ãÁƒ¦KL}øªOs¾Â¯ö‹Éôˆw*†÷ŸÐtÄÿ¯>”]Ø$ –9»3SEÄKlòC±¨ˆPþª«ÔþæÏ]ö›a„Kfåâ…ÚTXÇl}J7;²‹ÒsüN^<•h<“Ù´>:çã„Èü™*× Õ b-õ±$ÖjàC>^ŒXát##(ôÙà9Š)ÞPDgúGÿÐXÆ$ís¥g±y†±Þ­`“‘óž58üÕ ° 6Ѱ}¤Ót ¡L,ûG°Ã.碮ò|,t¶-˜±œDÅêÏL\g»`ŠRØ¡ÊüS‰æ\Õû(†&úBhô…?g¥ê ×Ù÷ÓH6Ëe:™¸.(1àyß2ÚãÁ}ßK­µëPʆæ tjoE°Ý›#n™Ìûkýþ2ŸË ·ÆÁxþ–¼ôø­Xj-Kn†¼eªP«ê# Ý›þ#ñå¯ÂÀ0ÄF?ó™NU"Ýõ“sCCê°H!ܫɜ+çmi(®§IíEi®©ê\ ;)ÛˆOJÛ/þh–Ô)ïâÂËæ®«\ÌøA|ù² ¦(ú1ÑÝq{ƒ/H2`WñÝÜ©{Ç0µ˜´K\TÊç§Àúé Ÿà=Y¢¥3ß´zUÜ¿;»Ñõöà˜ž^ÌÅ…Fâ/lÔè¤-P_/15Ñ{/;¶üo£ÍQ­Ê¹ZŠaa¯ÀÍna–`M~}Ðë4ÃŽ—z:³ \¡k9ž¥ýgyW•å%Ízéï u5ùÎyÜûrXÔÜÆ %OŸû/:SqîÌ‘^üëGÐì·ù\§Mqâ [Ɇ•E+Ý%f)PÞós:Ù5F<[ºë æ>†ÁÕ¸Kã&¸KMw×m4Üm÷“+1öZpH ŸÎãÕ„ùu{ÂÂLf×EVg½€\*ZH^k¨ò˜A&Îqc¬nàk.k!ü+b0nÉY±N¹Mò"AÆäVµ²;aè{p…©°PFh¸¨Ê› ¶áµék~þs:Zšh¾yë„Õ,`Rï ~-)¬böÔÄ50\1…']ßkJÕe#•wj,ôT^=yV%³p¤êäRí´[EL•äºË¤à(éac‹¿ìÏ àvÊž+OS B=HYÆ|•}Ö‡"îÀm~\HÖöFNc©QN.ÈN¬YZvpüƒPY'H4 ŒØ]b¶b}S¹”¤½`±ÇÆÌ=¢vùôŠ­Ëåûý—Õ-"£5UÞÚ‡¼u}éœOa²ÙmÊN”%¤]ÇXC…h¤È_A³•$CÙÒº “{Èú¾àD¤fHˆ¸ÇòYƒ*ñ‡ŠžµØ&€B“Vù‡èë2æ$¥k§Î›Hšñ¼ÎÁÉKÃêg‚Êú±uh†²&;›§rò!f§W‹Æ‚ÂA\Tv%ºH:@á±u]üj¾÷q’0S›xê]z©× Îðé—¯.ºOé¡*2‘&WË$`U&kÙÔvë~]óþ õ!(ƒ¡£6[=³ÚÌ9׿"þ‡ªÑ yWv6ûv”^µ)™@GˆY„Ž«$Nô5¶bÊj»ªðUØF±?/Чk»nfÌ{0ß–‘;t}`É)†Hݼ¤ŒŒ µÀN ãw{/_!EÍ”õ4µåïýìò°îþñ.Y 7\2ü )‡¶¾ìšàkr8$âÉØœv½Eð›‡D÷Xª7©”ó,sßQéûضãϼT›ç*sìNH GîçñfãsíúÑdX>Ñä}‰o(8ˆ¬‘6.¬'Û­¥q6&ñšW&EÙªŠ§ØÚ‹h}öc TÚÇ,…­´j4ŸŠ1Á:«Ë[íß­<ŒöÐåŸ ù숓q‡‰§£ †€¥lV6~ä< ïdÐjÇ @ÕhëX£ò}\õSrZ/€?îå'Ño†Î•iáBŸ ”äÛÍÔåOE-Åû$e›Î«»`PÆ·ßÜ‹ðÓg:WEäÚfrp{øÚpÜ„…ý9Á±º¼ôA 6C+%yoOžÃ::üÕL€®¨hî+ZA8Ü)Æs¯ ,§†²Ÿ‰æ÷;ú]báçý›>¯9òjŸ~ûÆJ¡ª4J”‹2„ED¼¨º³O|ÿ¬Nø¿Ì¶Ø6½²6¡JxAë¤?ôô'þ¾?÷]ãdÖ$[?!¹:f,?W>Ž1S[~<(KNKØÁkËï<«†„õó݈õØ Çù*³=žúfªo°±ÒƒáÙ/2‚ŒôsÐ ƒ*a”gÈĬ֮ ß@ŒJl«açŸ%Ç–{kž4sïªÀN¸´üýŸæ¿{»Öòž1h–ï­%ÛÖ|&Ké¼sËÔêø¿ŽçÖG§Â±µ[ª©ÄÐH€­ZÁ|!içÑyÁkùP×U…·2¿èЫ. ºL©}…Åë²yº;+ahš÷Ѷ¡SU‚¦\æuÛÈ‚yf×¾3”ÒWyŸ”EÓ;¥[™¬,8jË”öö )Ǥɂ€à©ˆ ´–£}Í›*× ˜å7˜nf '{?Û.!úØ ÑÒ Æ1™YÚŽHÏ+äÛbÕÄÏòJY¦LÒlÒhœwRSGž¢E°SMQæ\ùG·¶Ánãc}Tµó«DfCàsTÎy‰óYÍsD ÛV`b/^Ùòr —ÒÄíbÜ«_¯ÌCÈ×}ÑÁØ‚Ñq$í×X’OR”©T#y€_¬Jð·@Á8óßüËoçË„úmžÅ·ãΧdé¼3ñôéyò×D¹í2‰S×àF¬¦n™þ˜÷z›èI 6—5´0 (þý9¾½Zµ}î|6£¼ô¾OØHÍ_ÛO™ŒyØxžWai|y¦ÃÞÍZbœý´~Èκ‰ ç42åÙo³¶ÅÜîHŒX E 2¼Ø,l@ˆœôÀŒ¼ƒtÀ÷^ðÂóâ@ÃNz;Gí…š°‘óÍ²ÈøŒ×j‡`Iðõ8HôPÿ«Ñ=*îÉßÎ:çõ!‚…EÒʵ›!*†?Kùe#Rg¾æ,ï03æË$i+«\Cÿ¡#lO›ËLHÖãAve±w‹ÕzZ#$çx¬é ³Á=—ž Ûƒa=ÄÊDHÐÅ*鯷$œÍbÝÆly*©a_´±‘2ä™âŸYNUM†œwdj¿ûñjœº“"›ñ,l/T<Õ.äÿ-dä“BCèÝZ5Åå®aôÖÞŠ"ì6¤Fi õxHˆ(ô«5¥#(ó,Q<ö©Ë]NsЇ¤3Èø«î­ÅŸ*ð<›šªÊþ²[ÒÂ: þ<â¹>«Þ¾…tGeZÔJäiÃã%O#³* /e¿Y‘>ƒNŠaE!mjŒî¯.aõê˜8S_m)"3 ²(ëZ꽃€Lþ0ºãŒ™è¬œ´Ë3XL¨Û|ÿ |r]ïNYõ¡.*YaJÒFëÓI‚!Œ‰hÿ=8!Òúâü›9: 3û1’‰Ø–gÂx«ß*Œ»>4Þ•mp mÁ×Ësß#˜†›ì<§šÍúVÕK‘Õc>hÏCqæ#}¡öY^‡9‚°ò@O|`6Æõ v—È=—æ?d½)Àí ¸>9S sÚÛËü MíM¿¡oþ‰ö‘R)x˜‹è~•ǦjÑz4\Ô¯f@Šm— ^xŠ$¥:&8×fÂ,žÿÆJ„´‚öl¬z¹°¼|ÁV ÇøURlëÓîëö…s9(ÉAç3Š ;Æ!pøÁw¿î-ÄM{Ɖ NÝõ13à“ºíC‘r½ê6øJ|݇*4”"9ƒí43¬ÝšÒŸId!fã´¢#–½óÒö ¹ºcGTDé0õ[¡æuCs:}O&”mÃÀ¼c«½Œ9 OI¶+þ¥Mô…Û”1HÞBa ‹ _‚>¯1h…¯¥a"ê #z7Ã,XÒu@P4Ðpc@Ét3—r¬ú߯Ï÷±a«¯>Î ®ótžo—MqI[± Û|7ÊEŸþhò+ƒ¹Ê–(ýp‘Ä f$×è>±M½^ªæë¶¨Øáêž_3’›¤Y‚Œ=8¥_…8wƒ*Ì„Õý…Q¾Zû3ªõ·kÝJQ•ˆÎvòC!ª"å(o :&oÙq{N_¤Ï D<Ó©òSèT…§¬ƒé _ôY|­Hðí4È—>[ŒX=ð]˺a9ä:,`(€q˜Õx7nNø5àb¦"¦ÌdŒ “*žOØ/ÍïÏûŒhÚqáfêO$Ý»°5¬Õ£ÛkÖ„fÛ;r'x‡´»åéEüýt;N>Ðn¾§wƒqßëžÍ/å» gR_6wJ«Ú¢¼À.Š\ÛYê è\¿câ3ãD¯@oKùÏ 2kJ¯ n<QóRßQNÞ3Ÿà#JšÅêßœ°kÑòP™ H®ê—ùÐ ï›I¦Ï¡NØ},›á½×$ÑRx¡æ_^ÝDRu6ö­já/Þ\…T‚ɰM·8:üÕ|l ÌÃ<Þ%{æ‘Ê¢¬ßþöb$P˜ò_}s‹BC}®5KD²§‡J€߃^¢7Í”*õˆÓBxçã|¼p„<–°Ë2ÙЋ$‘êhhfØÆL¹\`bJ©Ì3…ŸîÙ5Ä íÈŽÚˆ5«3Ä»·ä†ÚÒŒ á8 üy:7!õuf\Es©EsúÁöÈHÉ(¼%5ñDþ€r  ùña̼‚#ïMRý-?½˜Áß&þ½´®4G£E.(ç´›ºÍ#L5w‡qFn/(PÜ5˹…ùé¤u#l3YVhÖo¼Ö§×Æùcpr·1îD½d]ˆfšŸ úEde>ªMSw*Mp?*¢Îb~îÈ øóQž›Û‰©×—hyZšn× ‹Á¬$= ˆl8® zÍù…$lw[·zUÕ‡ Š XXCmâ?Óèg¯P[p¯â7ìûã¸1NxRò4ºiÊã¦ýØÉ¡fMÑ‘Š˜ÏnÄQÉeù|Ž> ¢ßi-4RË\yßä… ­ñZcvëºÄ­?÷ óËSÄ.øp¹ c,®ùg`øÔÆj¹O#Ö…vx¿tÑ‚‹mQ•¼vàÑΗ֘ׯÞè7§äËÊïz{-ØÒ.ös 58ZÁÝ÷Í/‰¡ôÍ|@ŸÒ[ø¬´ÌSE‘&võQU/Ä\¯1ð{zÂÕ­Fg>JÒ,—á(h©;íÝ^åYèzX¯ð¸"‚ѲBÛ¨q ÛËÝ)iix|m×µ±[¯æÙ”1 y3ÛØÿ-ðo!ÑMí…˜kôLz ó‹~Po¿;çZCú,mR‰äÅ |PµO6˜¯1ô—l RÁf¾e'2ç-ÀÑ2 ötÌăEw¶ ï•F¡¯Mž¾E–]Êq¹\BD÷òÒMj<^KcзȎ¬[µ©!#P×9áçJx¶Û#Ä‚tª)šDGÄØìUÊÖC·¾Çá!aÙ«¥37l>ßm3ï!ÙaŒ÷³u!ˆvC ‹‹É瓆ô¢Ñ³³2^möˆŠçvBýn¢ÌòÃoŒ,®E(žgîÏuç}ÛOI:fán°ü¿‘zQ£‡ÙåpÂäq”ºBÇXŒz3¹¹7pŸ‰'ð\%90L̵QwL(¾¶£–ì™ Ðµ‘EåHÞœøÁÖ´µ,eé$m P‰0Ë”@ˆ¤J)(vÊ*…:@‘´úÒy¬«ûËš~#zHI$áÛ|ÿ֚ϸǎ«~ç¶`œ v B¹G‡|§:d¿v< ~æÒ2kpŒÞ3[|5”§ŸÃÍ î3«ìhÉ®{ÃPðÁ´>ä ¦Ú¾^õxœ%/Mmµà‚î=ù8ÔÎsYHþŸ´ ¢nªZ|®—ƒË³åH«|2qv£`ER^Ѝ óÊ¡¶3a¸ [dÅ.Wf+ìpÎz<û•ì#¦äl¬i—t‚¸•3¸-Ê;.K)ïÕžxL¦Š‚xYiõÓ‰ÕæîÁCbñúAÏ'ë$ã?I>Ú$€Bzæÿ§Ó üêrE«î}m÷È[{!Gþš‚P÷´õ ÷Z;X)ó!“û‚kܧxG©£çV'¦¯PÔ£×8ï~ó²qÒ‡«Ü5tF_‡‘ö1Ò«¦èü‡Ð²¢ÜÆÏp^Óf°dýŸ£É¨‹¤WÇÆ0‰Æ\:›š‡§ÁÑ)ìfÔ0¦JM[óåÔƒÿ¥‚ ÜYsù…÷Å:‚}O’®–(0´BÒ¤ÐHb‚Wûø­ÝO©k¦§9’ºš2sÓ掓9.Ôâ<†|˜Ó`qû³×!“Å`‰Z\|¬;ºŒ†<¶¬dW÷¯ÜZ?¬Ö‚Úgþ›lQíÄ4{ x-¼&¾,­†»”ÚÓmtSìùŠ'Š÷:öË7*Ó¾3ËKRÞ/¨!ž”æøïhâö’=ûrÖ£$D›² ÿÂd@4¤r7é.’-&À#?ͬ¸®|û6=²§h®¦¤Ù<¯8ôÌQ7¤Zñ±và^“ï*ÓIÁoÐB®×§™¾7ýžøˆ!k[PoŠUB$)Çþ·ÜP[QÓ9y<ƒæÅ1^ðé>yá× 5Ìâ8úSɵé ïÇò¼ip¨…Eª@ð÷¼Zá*ºÅÀãgÁ_§&³/Cè9\±ñgAbĉçÞuO«; ÌdäW;› áÝÛ:K²þIðƒ#“Œ|5šéº»“1}î—€^s 8áDÂyw¢«¬!¶¢ˆ¼á.ùŠœO'Â}ìsºj)t-7âáʰÈ$¯L704¤[¿ô>ϥíAJÀ,dûÙwQZ¸IeDÜ.3Â'ª59¯¬O$ .1EÃωÛË)xÅêßjÚý»)dѺ.¹„(|Äè°ÙðÝ^jæv¶»Ê‘ fðiÐfuêÂStbVq%Ãi(c/R'j®:'ÿΫ'ú@ Œ@§Ð?Ž|I˜x/4€l ˼6äcjîJ¡/9léVm8 †]Äp¼ºôA´`2åð²!#bê7k¦i¥»>]¦õb§úDtÛ¢àGóK1— ºZÔ'l¡¯ˆÌs˜8(´ÑD—3…‹(¼GçRHÞ”¤€pü4HªUÑ pL ^Ьô×oŸZ ýˆ$1ƒpõ’cÖVEJ¬Ž„cv^ÐÏõ›W.á·D‰šJB }â…]\+Õ„SÉó>è¸2I8¼´›UM˜‹XQìè4bnÛgC¨K%@³ÝA‘’D°»-ØçùfCL7Þ5eãiú^kôŒõ¸†m•vC°DÂ:GØAè;k‰QdøÝh@æb1”«æ²Šgýœ÷¼”pƒpåyÎ)ޱ`DšfðX£YÛÕ±ðMŽšp^b~1ò¯§îºýByÞg/I»Yì…%}á©}×1ïÀ7”¥S©D‡˜ÒqI$ÓA:ªuƒI­òRpQ;®\DßR`kú,ŽÅ„~°ÝÒ‹‚ újíñìÉæ¿´cl–æ€ÿ© Ù@m'V‡Uå`OŒ¡-DÞÙÇlö!ŽõèÉywèHßdî_†Ü. |¨ž=Sy¶<‰Àe±²Ëì{Ç­+ËŸ.›Šš÷ÍÜ#Oú”é híãéf&¸«…3ÚµÂ3&ѯdAÜÐômo9Ãúóá)>Dý>~Å}F+Žl¼[™¨PϺØàetåB—ÓZ¦Ø(!îã«ÝªLNa)9¡ÐÁ…›KÝÙ7E ¯õ°Q€A.£bƒâg²r.Ô RÝÚþ*•¶÷úÛâ©â2V/@žþ62ÓºäT @Ï·âÚÊ&ÙžýÈÇHJýcÞœ{Äy©^~ö`ÎϽ5x»¹­Ø5ŒLéúZüÛ„F€÷á°¸$Øm)̧¨6™¦œ~­ß¼:F&@ÜŒò’a§ùé‚u€ƒQf“Ã"»ì y*ìe)æKÙ—;ÛéBòQ¿*§kGx?Àòß$…8»*>†•H:ËB`›»ìc«t²sOwpÕ#çÀeßd¹QŠÏ4p¨ÝĖ–†¨´0†J·Yë—!š=oo2åe. C>{} æåÓàï…_Dfnêÿ9%k#иOFà=®H[‚PŠ LÕ‚äP±÷øò\[®FmmY×£ÄéF±nö¯ë€7Ë·hBhq€·w­ÀÞPëjTÅwß4hgúªŒ‚têÁ”½bžP…Ãu ªXðÕš’&­V»ö@!|ûLË'!¿wÞ\Z[‰gŒ{b!äœ\÷ào¦ÝÙ‡Z\O¬U}/= Åi‚ŠMÔ™¡ï}𭹓A󖵫0I* l‘㑃`©—‡4 óP<ç¯çÇ‹{XÞ‚VÝ)±…f–Mça¹6혱bctâÓ-P|)Ä|1ãæ„ƒþ¤\L:sè/f§4!RçdéjBVÅß7gƒE‘õ¥"+U^뻢㈙3û·hÝõW¾[Ò‚ €ï¦óru¹žNCn«èŸ‘hkÔ"AðBÖYQôùìÕ£¨Óªí†¸ Ãeû±Öòè Ø¤Ö¸'rŽœ¸3FÌOe+5Ú“bÛU>WØŠÌN­4î„?Îß0kÂ6sõìã«Âm.ok=îŠZlÆìÄKâ[ªÒGµ;•cód16t;ï_¿Jž©y |”PxšëÙ ý˽w½P¶×UbÁ(¯øÁeÄŸ~}œ–:0AêHœÖUjFž]T=!øŸ¨hÊs=±Öïá&[ÞnwœõÈÞ*Qa»5Y-ýHŒ•cK»9ÑÎ·s'‰ëÂÚ]TÃè¡°ˆã~ž| ²âwN®i¥Ún÷ÒÇÌiØ ´éd˜–²äÐ>SÃØÖª0vqý9Yµ-÷ÜÏP½Ïó$Úm„ŸéEý¹U  dc’‡V†LX±~ÚCõ^ôÙÌ h¬º›oåøDÎÈ3J ª]עЈ9ÿã#>miÒ~hòÂc,K×Ußõò]tð|\­ ˜•A(fgô:ƒiiÎ"–ºÜU 9m^dݱàߊBKš;i–ÏMè¸ï4øä‰™Ιó{j- "³>¿5fœ–åbüg¾xˆ¹áœH¢Ù;`4ïH`Æ%WEÑê Ä¥•ãTC %mÊè<í]mèë½÷H·°5QהŀÞv±ºsu&Z™Ñ=«7oå†Ý§?º*N¯é³Ó.eõgvü=…‡£ÙP `;'3;¹ æ¸"¨ñøÃ³Í«ŽÈö^pœyØ09¨®¤¥; µ´®d-Ó³àÉõ¬·1×S‰ þɬvM:'‡4.óã‹}¸ðê9@öz?PõPoîΟ „1¦Q"Ǿ,˜ÏèÂÚô¼šÝQp&ì5 XîC¡‰–ÛíiÌ>Š(½ ÛT¥Ú^ÅÇU¯¯YîlP›t”g|ÞE3Ý!m/ÓíªkÊ÷Ôùä¸óQð­ £ûvÞg(»¹Üò2EV£¾Uá)$>ðïFYÛ¤±íÔ½§Œ®ð‚ÓÍľ!È hXÀõ‹²á¨,¯Å¬Ç9€—ç¾ØS #ó‰†Ü£èß8œÄ+Ö1jw2Ö„ÆÒpðÓ$cRã3bNr·”îçk`óJ£Zÿ¾ÅJ}>QˆcvËEãËì;*xéÑŸvÈ›®&õó[pT} ³ôQ;Ëd×ã s~÷V(³4@„jà#?ôN’ƒJïßÜÀ@-}Þ½ÎËi«Gl“ËúÚ!·å0$ƒ¹ V©á\acÑX¯ø§Ud›ÐÔ²V¦½ã6†n‚†óøy7b¹tOE8zÞj¿ß¿ˆ_ÉÃ}t‹(ì½áÒ6Lo¿ç0£Ž¤#™u×ã÷SUC½‡="›ÄÎU$óí™ç½…ëfAeÃ…À…‡ç_ZÍ®•® u¢Ê» ˜Týػ/„ZÅîÔ_·¼™¬$nÆýÍ ¢ëœ1½í Fe‚’:ÇWÑjìD¯ËÓUSªîçKχêŒö ÎZª£7ëÍ6cgîKøÃ‰ÎÞòöe¾Åxt*Pª‹ ªsÑs(³Vã&”¦žK_¥ÇCŠ‘‘¹£Œ–^,ÜŠ#­Zòþ¾ë¹[Sâ¥ìYüÖåKàtÍ}è/bzˆÇ– R /8°öV°£Åˆç eãþÌ­s ÖÉyc?ÁÍ8лÍêÂq>¡*£6¼!¸~ØFûaˆ1 ‹rögo¾ ”ùºNñî¿ÒqÆs xø¾yYþ”åhùI˜M£Æqßâ§ þš¡„Ø,»UyRKOô³ðüc垆]6×Ì÷jKéçþ­K¥Oƒ}Ë©clK÷ó~™çÅ3™ŠJ±0Qþ ©/P¯êŸdÌï-ÏcŽQõ¤-8ü{?œü½„ˆ3;¼óÔ©7âhÄ#‹äÀ©±h©!Å–7Æ5(¼ÇZª½îÛ%2pZk§YŠŒ6F2m¼ðSNiçdž¯Òb€€V^ü“Ó(YÃx>ºbáù‡E°Aç#Ç gȯº‡IýÒ%ŽtRÜ’Ïxû¥†ÿÿDΟ²ûfýgó矀0`¼6ÉL°Ç@•6Vöž8”ðÆ´Á?—Ÿ ’5rã9;"Á[ý+Q\i³t‹¾% ›Âr¯Â‡Eâý¦¬Oü÷üÒBcƒ„£ï>µ}ü/R3gx˦Ÿ$:Ϧ¡9aïžùA:¯p´¡Ç—zùâLù+I¹÷x«ù¹ë³6$D8“6xÌyH—Y€ îÙ}Ç4Tu7~·±ÄÉnÓ9gÝR˜@¨À+@èàæöUi­¿>¬äúoX^ìXX¥qÒ”Ç ©fwdV* ƒðÖnFŽEIà 3£–øŽq?|RÖœ`ÑÌ6œè=–[2ˆË\©(AúͧBbV&Ë5Þ‘×ö’¡Þí6‡nXT b-™Ë87(¡éBëL*9}cbÖHÏl÷½\Ð.ŽvÁw•”ë-Áz¯iíª¾BøºÂž¹d¹ÜxULþwGAÒ)dZ:…Mè©ÏpÙ¯˜­Kðùîu!Y›ÖUB|)õ"žý$¹kN­ÿê”í1ðý= ú†ðÓC‹ÎèU·ˆf0¶Ì_ âïœYýû™~´_úÆI¼K/X¾òÔ…HÐ"Þ¡ä–¢©8™AçÝŒ:#‡Û˯/+C|‡3NùÙY87zµ5×Ê-= 2v3 !vŽ’Ü&°ûçNÉNٔűá‡ÛHè¢mîLФ¬ÁÎ$E]°Ñ QCq¦ëDÕ2³HûŠM¶X«2ÖNÃQC:B8Obå”]´ i&yX%˜åB[¶ü¦£ÛòŒׯ’bÛþv V¢Dn¤é|Á-ç ®^Ñ|hŠ¿K<¢õ”Vè•Esqöñ:Šß›Ìgsa»vá„HššSØ8;­ô`]«.St:LΫîª'21Lf°kUÑØäÅ\ð˜ZPÐØ[In™ÎU¡Ú:Ù¯ †^VÃæP%cQIlºW}í1ÜRa%ò‰änøú>ßxø)ñè9;¨m_6¹b]™sz¹ö3G&6ÑéK–Ihcª¤ª çÇY— 2;þ®d„âr =¼È"?ʘ\`—@ +<ºoáÌ(‡àîéIƒä,n Ý¿e+?ú%²˜aiqý¾!–úªŒà(®±{!?á-Ivÿ­¨LÆ%YæônŒ"&«ÑËL¡uPjá`°ïYÐ öú)t‚@þMmKÉ?ßsœ¯–ÅÈQžÉ\œbáþjªÿ¤ÿ‰ß#Tþ)MÀ[ûo Öç%À´ñùt8ÕÓVr1j8°$ã÷³ú‚Y‰)ý½*"í†v†Íë©ø—hµ{È Ña£…5­d¢=Ä%³"MßôsÿErÍšÚ_¦£Fhxr£½®è>Ô€çO®í6Šp$’ÏD±äÒ<Ö WeoÖªëÿÌWKêàÁ ;ÿ><ŠÐÈvÖfM­aÐS áHßvµëðÏýÝxÍ¥«—=;‰ý+‹UuJå²5¬\*S@å°‹1 ±tŒvyXaö3DÔÇQHi8ªòž"ö¶ëç¦Æ/”Ný’¼ÉÎ>FGÄ"|O·Œ²‚ƒ5Pñžå%9ì1è‰õfìIÙ¤øbŸñ–êkeì»ÜmÄ{„n:5B§‰qNL±Ä¦²qÞ"AIúN}$uìÄ]hi5`Aa¿n®«ÎBÎ÷»A¨ª—çÌútÚìÕ±rõÆ;uñÌbìrlÅŽ¼²ì’†ÝlX‘’ç®Gp*r«ÍYÔA9q¶(ú¥=v5ÍòT/&­l`\KPaèà#ñ@…ØüvCܬi¢ ,‘eT1`Óß–Å5‹=ŽŒ±¬æ_»¨Î„¶;©Œ‡Ôç‹ÝÿÀÚ8©´ËñƒóÞ¬W|wæÈÜ=a0 Æt€5ÅÔlc»?+¢Gþ˜ÓÝàÜÜS ©?÷ùáy¤kBQÃJønþÝ9¥Bª‰V2Ô‡ˆ$P‡Ì‡Í'ýþÓÍ14*ÙEWM°+¿rK„Õ€ãâ½!몓+î?÷†U©£dÓnlô ãÀOù¡ÓR ÕqÀ‚{©I¶| ×Tg—•"Ü-|=ÞÝ5M©î¥)íö®¼mžßÁUiŠÂ †•ÓµÞQ  K÷Y/:(ÿŒ7=VÏ0?!îBr&ßÊý[ÿxu·Ð¢Zà“®ÆH!/¦Á¥_ný^P yãYøf®QI±ñ²',Î×wmFH¸Örµ3½[h]³º—95ž4éUo¥aˆC‹Ç!¯÷¥£Q_Zè.Þ¼ÒŸ–|Bì‡Á"RYwÔ‹ÅsfÞb8A’ D¶ÁáOçÁÏa«òshA-E€W‹žµðAùœtM‹ì!D_vâíZ*1÷Àã3—vÖ¹å3”¡š™N÷¹¢½Ä]ä¾ÝG@ATXBƒƒ˜hOpÓ˜îY«Iéeê“D^¦±yƒ5C€…ï_põ°ÏÍé Lž›@@t}‹&QG ¼OÞÏ&]CR}wjWÛÞRÒ;Û9ß…Î]ÿ]Þ†ŽÛë¤|@cº€bÈ£VñY籆&è>å®içk7"L¨QFÖ+ßNT¥R1-4ÙÙÆyï «²‡¶M5"»’ÊÙhHµS¥œ:W½MZë' vÿÁòôüFŸñ‘@½Š:ó*=pâ€ÇñìÇ,æŠnÞ{…®ýÍ{ž¼š:0àÚêëªf„aU•n«1¦§ Dï›éz5'¸o}*F¯ý"ú¸0÷f×2fêFÍæ_9{CÖ'ÄT$·Ã ®ùܶž®Ã#‚êËátâø CË=\ 8ýäĶ}}h+àDn¶@àË™©ç ƒ uNxÑÏ»÷rŽÑ`ËJì“ýßÙFÁ›Æ0k<· ˆ¸lÙ~á,‘h‰ìu&=¤ä%Ì þÒb­zT2À²A£ä”]Ù¹$d¢æ›¹P¼[MÔªéù›¦Ý!Ù·3û?Á‚’ü ‚:êÞ¼)‹1€çÙ­;F\¥ëóiÈö¡»¸d$¿œ-g3”‘•±AÈ+Tdap &kÙ$yæŠ1¯À ЉTÙÙ¢Šö+;¹¯ÔÝÖœ‰›¬^@\ÊŽŸÍñn¨b#óöF¹ˆûXð1€ìb>6æ 5ÓCeXª›røŠâ¨È¢u¡°Z›á?ªY "Rœ¼Þ0žï+¤â†‡¼_ È(ò^é×$È”…d¹ŒòwaâU\57mͧ޶ô˜| ³–]gA¡ÄUô‹Ô~ÅQt°2‡èÒ‡4PÙm3 ¹Ä±|rãôÐb÷Û ©Üÿ:òqÿ±A„vÍÂ,» ŽeïB'Ì2n7hþe÷¨Ñ½Íäct{#G' ‹Ðoã@ÐùiÒëæÂH6älš…åÌ©šúªz—X½Þ`µÃ¤½žª°Gq£ŠûÞcÓ—(@5޾ÔÕ–oÓúÑ’ŸhG˜2s‰ºCFF¤-'*°nFŸc¡dvY…Ũ6 ;LÉ’¬‘Uöˆ 0×uºÖÖéƒOí¬Ø¿–s22œR:°EéÀ¯_å°ºµ¹¿Î¾ÇaÑŸˇü¬B[:ãEW,dG—çDÂ(œýÈJ²Æ®6Þ¹ÏØæþrý¿ƒÕ9CL‰Wë0 dj<²ŸµW«‚5PJL³ù\#ät¬¾›«ª ¡iŠwØds gÒL(7£o‰X7ê`×WACЮpe“õ'Aöt¤©ué ]­d='ºW“ƒŠÇ”"Neê,Èw¤Y TqMlúËU¼ÐqóÏéG‹³ºÐ¶Q–Ÿð»' úbFq¦ª¹¸¡*eÝþíÉXÁÖEgïé°êñóúÃO93§Ž<™®öÚFƒb²þ逞øÆ%^àœ_zfš¬œÖK‡Mµ ½˜uMæ©Ûïr¿^ƒŠ^î¯>†r`3TQB8ÓXï?†½cÍÄün©ÜKž BÕv¡^óŒo&¬”°4Õ?ï]sÕ¼žê(ölqë +Ú÷£Tâ‡J{ýF¬ë[Ïë슔ä䃺 EV8erŸ»Jíƒmç¶ÖÍ1[5Õ‰úù6.ïí¢@Cew­ Eb0ÄJY¹—jtt‚Aý—ÊéñfDz¬óu  “z©h~|®ò¢!ã" ø8œi³’N‹Ä(<¤ÍÚÀF>Þ|(xF«è Œ ×½)ÖÌwò¨mR0¸p†]_2Ð%¨>³ÃÚsHì*65Q&™jõ— »6«7ð=)JxQÝ6è©'Ph™¸¼,õ"p$“{)-=ÿ ÎGæµv@±—ebÕ}~ÎYGJúUÜv$Å%ÑÍD¨MöŽ˜[FHÁìEöÅ馵5jñ-tšÄ²×üŠ4ŸP«³s|¨$,4§–'·C7Hv»ÌÕÓ¿8*wõ…õ>kÏ+ÄÇ„É!¸îŒwêŒ8‘ć{E€ôãp`@sÖ¤û¶ìSL>Ë¡&<í»©ß6Mþ¶<ÐYĘ´¬R"_€€}zòx¯í§<çݼ&ÇÕj¾˜( àî7¥ú4¿ŸS³Q÷y3sž•÷v0\KìÒö)<ÏdØÜâ!FÙÁ¾²=•M¿z¥% èH[qÜkÔAÎâI†­veÓõ|§Ù‹aè$×'¦z©Àœ„@7¯+|‡JMªÇê'‹×Š`¹¬Ôóy¸Û ˜ò„…I›ê@Wn8nú¯.8µƒ‚–ö?ž®…Å¥£²A®0”y~ŽóoB™òÂ"Ö=ŽÒ$Å85ò1Nq…ALkEïm§%©¥Ü¦Æ^[g^6°X¶šeiÀ™yRõÌôVs5*ÖP†„*Î|˜˜âÐN¿Û¢Áâ¿eþ_¦G†Æi .}L—F…ZõCÊ Ûèöã/³‹›`“T¯›r©¬Æ8®°mmX;ËZøâ¦ô‘¡±ÒÏ•ïNråø„'8–6œ&³hZ Ë'Áã iYØ­ÁM2CàŠÇÊÀ­w¶‡!("y5ÃxÎÌØnyÁáåá~M‹ñFCYïþ’µ9ǧñžuK^á”®Ôàb”<˜i{½bÍêf籘Çz‹*›®·‹ÂÿÄÔ÷¨…‹Ï{Î ‘˜:;‡3@U-ÓDK›º÷?È`c9%_|ðöí[ŽÉxnLyZ?•†²Tš9ÇšZyæ¤íø¿ë½)Û«Lˆã«Ä‹p_š'¢ôäŸÁÉ“¹ÜP˜à-bª<) =þV¬Þ‘Ú¹à† 7 þȳMû›jíYqóÊ è6düÇoÓ¢ ”W„÷÷κ3É]ÉÊRßY¹å:!èSTÊ,ùU@™1ZŒ´ª‚§çwƒog*Ï(šsò#$ ê]X.þhN'`‹Ñ6 PÄ›–Ð ¬8<õ;]s~Vj>$Ík+ÂÅ‘ÆÈ è4ùòØ÷4Þk”0î”`N„ •Ô î+õ+BhŸ`!Sïóˆl¡aéíM9rÀ•Þ–TŸ'5ý<°o È¢=X«wÍç5šYBãÓaªM¦R·óΆnT!7fRDG®Éï°–!’È9ÙKÂFqs{‰YpwíºŸ‚æ£Xb¡ èÏâ‚O(½ºã[WO­_Ðï ‹ „z˜çž´X3KÅ’õ*c€²/®Õ¹—XÌV\ëU½Ø=ö 'n5ÌKŽ¿¡+bkÕU\?8K¾îªÉšQep[ è0z/a†˜ik˜!ôD&d»9ÿ ÞNØ<ÁÜ–NHÔ)-͈V–Ë>¯6Eþ²–±³Ñ‹uËF`V’ÌbœüXX¥…„ŽÌ&›ËeÏaÅ—c¼Þ_ß­³ã×ÝÂgkÊMÃ+“ãXGÚ"]Ý´"äJøêða¸ò¿QzÒzsk¤¤˜#ÂOõdLªÙäµí`Q^Ê#üO^ÔÆ/2Eò&(Ë«$S<‘μî¬ÊõÁjP3ðhB΢Ñ>Üy˜ŸwÔ:4€g/„¤xÝ)«BåjUa¹Iƒ_óG¸µ˜¼åxáG´>ñ“ú•ëѽxƒJ?¿L¥„7"áUådKFÍ4~E-„W©H¯_ã½@ò“mðÌ6þ/ ÜØ1WÖ¬Ê0l5N¸ž„¶¡KDV,³µÏiU&Žßc”Ävu‹ÍFC><ùç@?¥C—™7*Ôê¦7ý=ÿ®îÆì15§2º÷/}OûK–WÐÛÖê[°³{ñœê`Qн½×o+ún-¸ÄÙyE€kÊò-ÀvóèÍŘ´Œ Ca óª _íȤ¾©aá°©\9Èj7kÒ¸Þá"„7£µ"G·SV6+ÆþŸ7u‡4œ0.k?¤Ä‚T—òƒðqÅÎÀ 'gg÷Š4ëÓ*%RÉKPb ë9ç˜Î ¡Ð[g"B‚øú£\Æ’z Z× ›~aÏÃd1³V…À°² -Ioô‚Ñ‘Ò-ßBí(šÎ<ÞÝÎZÅE¡¥£€ 6Ën¤èaQBî]}“qâÑj•|Å•ò‹gg¨Ë …™ÚUVøðËdsÝbõuš¼8lñ¾ë*·¯óM穎ŸêÏþê*?!nz:.œ¤¼¨Í$“/É´R;Ôu {›ºÇ¾¨™O\Ï u^Nz®Ýö^SðäžÅÛc¨ÿÛÆj>6dÕ1¥=ÛÄCɾ^b£êÆ48ýUkÕΛÑau *É2&qÉBv1¾ý¨ÎÍÐ̲fž¹<}wÁ(Z`Åé‡sxd¯*¥º°\,½Óüí¡ã]jô¤aÃã·”ž¡¯Oמk†K­Ì“Ûb«‰ §€Xw±eÔÙÂÓÏ< q½™ÙËZÔ€¼1À¯J˜q`vh½ÝåBQé³£Ur‚S$VÚs>Íf‰1¢Ok~yšø} @ÅÄjªû®•zñènäë Ñ÷Îñ. +e§ôüÐ?DU#¤ÒÇ•á3}•ƒ‡k€€ˆÉ¢Mó Õl–—tJºìÎDßЧ Üñ8BæÅÏ„¶åéŸÆ@ärÖ=ÇÜá$ „Qˆ}ÒXz]Ì|øP(QwÙ2ƒÓ±_K­dÎ ºm k–=4Zì°Rƒµ¼s⿈äíUªh± òóÖ¶¹ NBlh¯QŠrj¸õ á>È-¤ìÕ´À£Xoòc y]x5^¬¶y;0+ ªu¿ü§‘´ê½ëó×q‡i¾>ŠGîÍ_ݱNçë–=“u¼ï À´ëøœè2kð(XKúÿôÝQƒÐ© $f^"üqAããÄ¥H²šBšWgÏqá‹0äZ²,‚Æ 5žÎ–·KĹÅ6·—[ ïî*Š¢ÞÐpUDççàŸõýsp#Ò`¢[̵Õ{y5dîšjh9ó¾Ú*¾X(|“{ØO‰E Îò!fs²á Ø^iÛ}î>m~QÄ®¬›Tså «kœ Ø[Ëݳ­•rBZ§Â?wvÍ;>⯀”÷ª´º•“·w0ºBQyàîökc“êa/hŠ Ü%R£á¨naÔúe§À‹u*Áw¹1cDÁ9ÍY5ü¯ñÉDS†hÄÊ>{ºÕðô94’oжjÝê–ó) ôaÝž'õç.ßc›6’of’®Þ41 'QY <‘•еw/C¥©A£*/Z£•‹¤=v Á)a/ «•·…fK ½8ËB¼Ô)*´V7“·†8ÿ›“‚‰öû’üW½çíš]?¡G4L;³•We†uåvdº±«X©yÔæ£ñû2ú亅Ü-nlISJ¾1‘‹&%6^:íÆ´ÄÙǦ÷ÍøÚd:¸ŸR‹Kº‚´c5/ÉÅ¥T¨YÒ³JÒ¶@Û‚–e¼ °[ e-%6¹w´ ðÿâzCsEKð¤;kJÅ5O‹À‡ƒ6úyúÒ°¹óHÊãi{rxzú‘fã‘­×´.·Gë¸^kOF ˆ96t¡Œ‹¬Oõ»û|'vʤœº&Ê%XEïU̲’5ÿÔj$Ú̧YÔü'-Û&ºŠ?ØþÑܪn2ŽËV†+ +®î¼¡§M(n±ù¯Ã¯v4’´©‘æ$ûI»ªÀ«ÝcZ•0jv®@0ˆÛß`=4MSн©*˸C1°H1Ê•Á¼ ÿÚ‘…3Tz’“½xiÑXšŸ•™UPVꆵpª6¥ŸåXj¤ ½ñ~µW÷ê½^‘^—˜`ndðpø¹EZÎ’¤ãíP‘‹µu6žb÷ÒÏŒÊý$ »MÙA3b`¿ëü¥D!¦äÂt}Äá ‡¯~jxLfeoÒÊ¥«ãPæX»å?-)Öü!ƒÒºsÉkÕ~‘T3¢;<°/c1Ÿ×úí¢÷¨UѧWîÁÄ´sRtIØ|ü±DÈi“·q2nõ"´wOeÔ¤¨œ¼Yºß“»Ï rˆÐsضYœ‚øyY ý.ü³€fyk3rð<·Æ?F=@*¼4ÌÃÿ»[ ­ ÔßÂ;ŒtšµÍFþOUë °¡^Ecû…NB[»©Øêá¶(&,†${Üõô§+êg9M‹]^{å¯åP'fMüî)P(àëÇ>8í«ÿȬð:8$oÚ=” žÁ†àP5uîUN™Å—&gÜ.ò däwéÕZcPÈF¡(M9˜ ïlTMRðQºå„W5Âõ¿d<çG: `íD÷i¥ý1òë~K­ÞžÃÄú|º„¤œÛL`áœ.²À{_Â;‹__9WªrM¬™¹ÿeŽC²6©»Ar7£Š—ySñëj×Õ× q&ÔaÿȯÁÏý€¾!1ðá¢~iåYVŽ`hˆD`Ÿ¢…‹Åó¯¿Â Ô»‘­òÆJ+”:=dTq|¼™XÝ3[¼û¤[.¥ý ]yv]3ÿÛš/`®ª^Ü´úeo"Ù–Á e.qOzéà‰ïL5ù¨A¤]Çûä$› #ªhÈbÈi;/LË9aÒE¢†;¥[ü÷qdTh!aAÞ¨ŠkB‘»O3ã]xj Feto̼ۮ{ò‘¾PßGÿ¦È;žú)¿Ý֤氼ÌðhÊ ÓD¦cùŽ‘iÇ ÖÄë'㛬~G)m9!;éwéÛyüÖå›/dÆ‘ÛÿwV‰ÆðøÓCC'ïÌVÑ‹&¹¥Ê@¯ø¥§TZ7-©(œ]b”‚œÈàVX¨rh†BïÝ6WWZ©,&7?Îñ«êï9Wõ´€×5¤¢ û¹‹9nÇñˆ™Ö¨0(FëÿŒôab{™Âïñf=X³2†&]»Èˆt[Ï13bʵŒSzäû1øQÇéµEÿ!Ã@)ªsƒ{ó_°PìÞİÀN^áõä:4æ ¼h9‚ãÓú½ Þ»äXþ8%ˆI¡ýžDÂI³,þ]3Œš«ïhÆ„]Ë ôήN×™¯w{4¬ñÕô Ÿ7ÛäÍÑsì…lQù“yê60=”c×"‘Ðf’~|=ƒK³N#Ó:ÊÈj”±¦êçÄ¥ˆFZéWåZãð‹#Q;ǯ5œà¾¿èfý¸¶$<Þ& 3ýánÜLªí‹à¸—3™hŽ/Ã…7ÐŒÇ2~å²Î@gÚ÷¼Œfx¼”,:pߺâÅ]=w\÷½1»‚« MgJ·4î·¦º®uA &l:ÔОíåìû¸aé–¦6 ôšªÿd“5z…ØÆÒµIljе9¯&%cÏlÚŸ*ñ3ðloáŠzÚnÑ=¯¬šßHI&Ñ%R »ãŸ@‰É—T«#Ññ–²îõY‘œÎ˜Iû2Ì‘Iä3 8[D2ÚggŽ!¸‘úqýf_kUE õç-å ѰˬȈK`}܉É\–rutó 74à^ýgnœ"(X‡¥)÷²¶Â=ç…\zƒj„$nË7üƒo·¼Úrîú6Ã1'´ïM'®v*/©bßEâÑ’Ö‚cÉ6fM‰Z%jƒñ¿0TòxÑ“€8xWOÁ€Â“ ¼À¼ýXíï@Ãz4q=~·a• è¢ÓIRþP'±ë1ŸÐÈ sÓºŸÙÝíÞo£,ã÷˵IBÌ:Ì €–ÔO¨kí®ÆC¡ñïß=ýTcÑxÎhƒ*lõˆºq*1}?ñb"ÚçÕ ÐRœ·Ó%¶­)6RscòÆ£/ôÔY—ˮ°«ùYT–Ý£ 5ðzàû;$@ »N, N•î΄ab£0/8¾öGÓkØ- rç©u¼šqQúrÓØ‘gFÀ=.šë7µP¤ñ”ÎOµ?ç¢ïþb…4qÝ^“ÈUÅ=«£%ß¹ýüãùгÒáñk¦bw¸&­»X_Wt+\P|>°}že¡ÕSb[¡®È†dÔ; :\KrœËtG5à"Ä;Ðæ…¢XŸ`Ä{m¿œ’–²\ qXM_‘0¢S¸ìèê÷÷ñÆŽÏæEÃu‚‹ I+×îu«=ñàBN ë ÊWø;D@+†T€/29›Ã½˜øq†Ø$yŠΓO* †ußkqËÝá¿óøúd²‘,ÅÀ²—bn÷²oÛ§<µ²¤{3m˜ràa¶€Ê`d3]ûR «ëø; ÊQD„pdÒè/2®õš:ÁFæáhk6›¡bÅS[ñÞ‹!¾¿Ó/¹áL•9ê#¯ÍåÆù=ÕÌð•}ÈeR&çqD`T²4àÂFóÀ*¥•ÛÖ½kæsÚ™…lj]-+aD’tÏ[Üw¾â'¤9ûË}žž5;÷Ó9Sj`õj >ðÄÄi_M2@3%÷†Æß$%ªBu?Ï[t¢kú‹mBF‘Ý1Èó|mÎŒ\Ý€Çsã¤X³Ø’x<á–ØQtkP‰¶1„Üo@Ã+ÑQtð H "tü}"Ô“½.… _)îCÍXæWÀ¥Èrb(ß$5‚#§ÿe&‚y¢ÞÛe˜“û2wÃ#p-MBixn¶æZ¾okVãqÒ sãâ®X¹ÇB9¤ììCW0[÷rT½Â×ï¼÷-a½«d2™öôÓmkêWš- «ð",W/¡þ¢A² ÀOß™þÌ™N`Ý÷X€“–-C$xÁB7ÓìóÂ}Eó|¨\d…pÂJ!îÒx¢}|Yž©'ÊÁ®ÃX=j¥–gBãDN c~æ Ê5ªyš–RP« Xk!{ï‹9Î(”¡›¨ˆiXñâŠ#e›ëÙá_]ñü>4B6ê…r Mê†I} :•ø¬í””é£EºS“øHGvÀ N>«d_ùö'ü,>¿:QŽùÇlÒ:ÙãŽ'uíÁ·&ÃPï*NêõsÁ®“I‘ìÜFqýÓYJô•Ä5³:Öåºip ”,<ohÀ £|A÷Z’3´r’ßÇ((@‡QAÞ ̯\‚.’¤Ê<ñÅÓ5owñ|¾‹ò?M'-ž‚˜ô+ùïöð>‹3ñº'‘nœ°£ú0.³RüÀûHê´$ô`R‰JŸ°üxЋ'¸,ФÍDZÉÐpA áëPëðŸ&ñ¾ƒ‘ønÎîÞJD@?ZgŸã©\°dv± J‚©Gt=ØÂ( êöÄÙÓ-­Ál¬È”¯èí܇©¹ªrÖf²F09!sò̼9:-2) Õ0o>2^Óí±»*0õ¾RíêŽ_,ÆÉaæ¨XßMã ÿ¤ÚÊš ,D$CÜQDsŠÒ3k³•¨RâˆáMù“ÞŠ¾G[BÞ–34W€¶ Ì|œh¨\=¾)Ä­–‰ dHÉ›ªî¸÷[ZÕ«~ž~?ê<< † Cr¬…¾ÖšL´ú}¬àÓu÷šNu#Ek+ ²ÃX r;ʵ¸Ð™5s @è==]”«–yÝ>«¶œÇðçLLY\¯Ýs•nÊ ÉðÆ‚WivskiÒÖ.jN¾Zƒ%ýŽd-Àãc¶OèÒ­Óþ~ö¿ÀÏÕ}w”è\/êB¼B£ËãdF²á?'î‰ „b ?2íð„ bN©Áé:ÿ–ï톯§Ÿ¬ôqÚ”Ye[ÇÉ-al“óôº)»'Õ½$ÛêûQÒ‚é#;¹Î{ApÂ"UoEÁà`:¿×’ |Ö)êFé=*4žpÛØä)R©]…2ŠMÃLœ«ºqáäCüø3Ù… &×ìtòù ÓÂËãÏÓH»B(Ò=P–qɵ—[õñ1Òé+«=}ÑgFÌ+NòÞËVC×@pZâ:LHТTW…4ŸNÑ~“ZAK ¹°.µ…?œ3NÄ%æüˆ2”Èp·ËÄ‹Uëðð0„1¶4‚Rª©šÃÂZ¡„þŠ~D×¥È9ŒÝj,t_¢(5rÍ¿åh$ßõ9b/Ø« R߆.ªÅÐ.Ý”ÜSÄ!–Š|èª?_›+ã·KwzÓCÂ*“‘R*Ñ·d:Iúšxìã¡O·-¶¦Ì¥@6(5c:1Öbr´hEäÏ’I];ñLÎ~ –*@ešU¹ç¹òìR:Êo·åôå#‰Þ4 Tù¢Öü§Ëù‰Ú›}<_5Ðbñò)b-_ˆèÿÚ_f¾©p…£;Ÿ„‚ð8L~ñ꾋Ïx ‘C·‰­·<ÒqºQÁJ7ÏîÜЭ?e›vùã3‚ØãS`/ß  (}<¾ã¾çæËXn¼KY7ÃϪ¶b?Ê4{íTYªwð/kÛÈ¿«m8=asÊ9Yºqñðÿ5å?}ò"Pr$j„)(íþŸ¶IQÃRÍŸÙπѦµŽr,•Ëôrî¿ÄÒ)ÍW Àë²gãYß«¬#ûïˆrBåhÝ!€l¶Û€ìó˜ÛyL&kâkînΠ½Æ.ƒ„Æ—œ„V C ‹kæûøÖ «ÈQÓ©¥Ïî‡ÿtÕ¾ëXÁY8ƘSl5lÀ«J ~,“¹§jdqO_·âL{ ᦧ$ª0ÿ‰:Au>ɉã|ø?=¥€žaýxêeˆ=æL´Ï»ÑÕ]à.†í)å3‡ÿï¿Â,FùÆÂ ÃÃ'Ôõb[áôjO¹~ðºÈšKKà0ž¿¨ÑJ刵øb¿ú!»±ÐÇ|úÏ^ë…‚0ã èZ‘ŠÊ‚ JCC®ö)(âÿÄÜ7Û¬Wð‘2µÆê²úœ?‚Z¬w‡q»;¹µöó2ÈßÒGu‘½moˆkÆ‘»]üÄ\[P-Ì’‹@@¢I Á±Š3ÎÅ?€Ž>×´PÕ€9Ã"¶ž·ío‘ ¾ó\sÑÖè»l ûéˆN+¥Q¨ Dú°ñ÷ÅŸq^áZòì½)fuÃï@?ˆæPb\(zưÙ/8w…8j ‰þÝq“jóitºÞÑ_C*(¡ê…ÐÕЗq /âꊯÁUöž;`²Îú”~ ÁKuR§=Üa 9êÞÒî[e‘Û(iý“Ê•œhåYõæ’œã3…Õ œþ!€0'UŒá°Z‘n®8}Â9êÐE€‡Îñõ‰»€›]=Ó9¥HB8?ævKš3rîû¶#cï>År4´ÕÉ˨îÿb{ÏÉY#êK8ÊXXeš¸GêÓ9Žm6ƒm&Ç×rˆÛ#.ž¹ôõïÑgã"šÔ€ ìb½ßnëãÎÇ‚Kš5…Û¯?ß]Ìvðt˜šô«„•º)3ô Y_Wá5‚êJ½ô¤*å77N;fB »A÷£~×Aû§¬‚‡íõ;>HõZlûBþÔz1ÛÄä[%,O½óWEI°÷èõ§Õü)„Ñ!4cØÇÚ¡öÊ»‡`en„©›<ﲎ1^  Be_+' ôQ':¥ÿ=‚pTk)Ùm·ø•ÌÈ`èð©sÀF$õÆ“wü%ìöË`J¨À„€5VIz[ônƒ£ð£qE»P_ 悇òdr™ «ÕHxóöµÁÅó¿²KVÍ™ØYmªõ8F\cÙv:¸ø– g§%ßjl7‰MÈ®µm WŽ£út%B“y^L«äÀpã,œ¨÷¿ì%«2ë¬ ý-O×IN7d€9lçÚçwQtDrå†jY&¥“¶\±>ík˜ŠÈ¶ë†]œ)#T§Ü•YG•ýg¬Â±Mg¦Ç‹—‡ÏÛÎ.SÀëŠ1ÿ#sæÌgÈ”GîÒØ ÊÒ3sM†*«¿/ŽîÚè&*;‰ˆÜ¬J)ãKz¨?Âýg<€°Rki„J¾ðu0Åê.·ÓÃy­Hë'caF$Oê„á.”2*ѾmmÂc­ z[þ ˱vI„ae˜SuûǪø÷X÷€œ8b€ªøn‘ÉäÙq*ÀQb¾’Û\èËþ/ °õ¢Av‘)^'¯TŒMÿ©Õ¥n>Yc꽨èÿóÕÇcQZÇIí7Þ­ÿ$7ûf—ûiB&vJ×Ïup£¡á®i'ï(ÂôS‘5;àA?,)Ž<…__3¡ø .׺j¬7µkKX€Ó$‚ÞgßGÊEÈ)…ãÛÿC×ù_k#¾'¡>M‘CÆ©§Ñ#Àò,Öòy¢¹çn¨œ$ƒ6®¹«7q¼`¿•V‘ôB÷D,:FŽVb¯Ûi¢ëEúo89D™Þy ›.n“ü5Ű4·´¢“-˜¾ôÎFq”ò©Ð4ìàu´²Æ·y,bȤ«t†*ç¿Zõ~'"‰XÊû/†W…øVÛbú›ÈÜ‹­’;çð°W‡˜©Çª|ˆ©Ý¦ 'Þ qñj¶Nx^Òš‹}"Ö+P2c v/*6Ûö¨¨p|áõ†g™ :-&JuÍ)L¬VÊv;ߟÿºÝ·J±¨âï/Ûîɲ* ™ãKw H@Áú9mð¾ÑÊDovÙÝZá +SøVÓÞ#ܞÁ·ytßAí¿b®«}[h©ßž;³÷C L‚!4…“PŸ°£ÇŽ ¢]Mÿr’í¤ü’jݬ”ù÷á§ÎèþSBcÆ(%óE:ápÂ?ÿÓíö k“Â6ŸhÌ-.’<ÛÛ:Ÿ”ÛørhÈ"ÙEÛè¶å6Hø¨@NžŽv“ƒî’Ü«20çDZ¦Þiîc®ãÇ‹ˆþe´„(¬=?ô16^õ&%öÑ1Hêçdz!<Ÿ9Z‡Õ¬ºù¤…¡r¾aÚ²-áò#’çw_#뙈;Ú¦Òüu þXÝdP*x Š‚Óaó¬LÔµ¦ž¸F»¶IO{š#é’"ÊküÆ‘Ó2‡«§Ýœ¶¶YNßtãýv楹ëzp^g¼êJw°‹n D™‹!dGv%<õ<}ªKƒHwGëL4šþƒÕPÁ6ÇïŽts}Ÿ¡{²ëö Pñ.ÑÌÞ¾3Ñô$À ³Ï07áÅ„D€S%RÑMƒ(ê§8• à}ápà9§z(4JÞ3^ï»÷sS–"AÄ –Pq·ð%kn!_À¦ñ>CŽáXk½+¸â|ÞS@äˆëä¡›o–{‘| ¨ £>Ëqm•©ÉêÃé/ĶíÒóæZe•:ïÉY2=‹¿juF¿½+>k¸+ëyõ.Ä%M ±À“özé;0Çm àçñ_|(eœ ¥Ç»²w\¼c‡¸“øj¥vGÝÁÀ g•³Ÿüy×ÅýØ–yi‚éSºg2|\ÿsÕøT/è¢ÙšiKHkE™ø¨í3ñÁŽ­O‡Qmï-á!$MìAñ$J"”À÷+^M 0j;†a(4P¬¦ÛB™ÌIžýT>Ù˜3–háÀ²iŠÅ5…Ð1]Ÿ×PhÔ†+ynèå™Z šACuÞí¸ø÷¾"heQ¸¬WÓ;±%¨.BqD!îFR¢¸çU–ë® ß.¼úÛ/TãìÖ™µšy‡ç6<õ•€ÒŒrín8ÔþEA¤´=XDTÚ×\~ÉíhÊI‹½óGbÛÌf#–!xqs€òßÝÛ"ÝC`¦ûú¶\Ó/ÿR…©º×‘¨§h ùüCŸ‘ØvÓðd=ªAýµ[!†j‡9½»èÖég…{ä[â‰ö“ÛT^ª€ÙžýœîÒ˜ÃJã[ÑP]9ïvÃåHä °ýdÅÇ¥›(>Ò3˜Ô©Wß3Øv5ñ勎²ÝúkL¡,jä“(¢Éû潕’ïá]±x4_gá.^¿jšº0y-tîŒÃúí 9Jñi†›ÞàÝTAÞdH•PïŠ;:¿òöœXéãq×€Nª-nãœQã\ü2ü¿@€Ÿ?À 5A »“]d;"£9 Šk%]N­'’Óõ|F~ù4hyåûú̳@RÅ<ö«”u–ûK…(@|Òôž hx¿ šæw'¨L×°þSâûƒ9jŠÀþ':¢ ‹Þ+Vš­Ô)Ûo‡CÉA»N¨—ÉŽ/î>Ø–Ä+d„5 “¾öÑÙ¼NÏä·ÈŒ‡p…å›âKè xÂTfo:ñÃÜ^rGîÞR{îv}R3TÛ ™Ÿ)í¥`“Âd>Ø1l1€žwAÂ>VR>9ûù·ŠI³Åç¸í?^Sú­ÓT¨ÿܺ%>ïò1MIn«(0è^§þÀ#Å·JD¼ Ÿnòj“ÜD 9ˆTÎi)Çê÷ !O°ÍÝÐD ~ƒf85ÑÕ`_^1ÙÅ!å “9У³æ3¶äuÓ[Ñ/Á™2 RDwò=¸mÀˆ}íéKɵ}ðE<¿(Æ©ÕΊyŒQÑð!hÈ`Vÿøí¡òÆÓÆý…ë*š¥þ"d©’´>ÓŽ±‘ע¦;3.ZÀÒL¸ç:×°~Î’`^—« (p“SɳÚr ýÿ]¶_7¸å)‰7UØš4ïÇOCõd«$XúÝԪɉéÔ hÔB9 w5{`b`Æ(,&§OY<0%3êý ø¢ÛßQ 0 ¯F¸¼ˆe• óÞܶÇĆ4ÐÆ© ôé/ÆoÑ‹ŽoçY_dØhH+¯ÆlÙŽ‘õþ§”ô4Ê•Wpó‡DÜs¦¾ÍŽG{4ÈqC;Ãê/ðP˜Và!âHG çâ´æDÝåâ >ŧÜ8;¦„ ŠÒ'Èñ–·™—ˆ*wûQȶyz`#”%M¡–ÄñmÌÏ—ù!;2 ,¼ÆÀé¸Ñe‰¥€œ9/ÐÀäLí0:cÌqShìC§LÌO«ÝA†wΉ£&3ü˜0×"ÐÔŵÉÖAnp£ÏD`¨/9Œ’ú·Œ7.CÆ‹¡–Ëf»5=#\ã3Xõ£Ú»-¡{ô4áëocCß)æéÿxupaÍX^³YÓ `©†E“þYˆ-X……+×Õo]G"¬ÚÅ| {;GfÀܪ¹w—íàÖÙØÕþŠ·%yìxJoIéAGñÒJé"r&@ºêi^ñâÅi™ù—0W¢4ÆédÑ5Œ@kázÉ›%¼ð ¹gÿ_‡«{ì_…FB­ã—V82ÁØE€ Ô5=ŽÓ/Ê,ht§'hª“<0¹ þV F)²·›> Ù}#~‰)¥R½ÓÆIYÌ—?5#Ó-dœ—Ëïm­ÏF_×vµÒª¸Ÿ\G,¯^˜#³våøš<=5Æ4p§¬lÃ"»„Ø|CíEjƒóiNÊËúÌ:qQ¼–ï:ƒfgÙ¥þ×qÛþ3ºFÉcÐÒ²SpwøŸÏë¶'R ÛeY~ÝNÍ ûXs2PyšmrI8R­ÄiÒ÷Í9tòÙ]¦÷MžÅzÁ¼Ï�müJƒSsøGS°ˆ¹¥ÚÄ*û«Ov™¿i?´™ Jµi#ò-‰sÐß1IÔÙÝ>ÔYë™i2¬†óJ®%(œ "W.³/þIä42W´=Uv¢b+`Æé%ˆ×A–5‚±E^®nšiØÁ€›+MîIvÇ”9/0ÉMCøì|HS´ðF‘'äÏvøIIš;¨”LÎyЀµ¤ÒŽñô8’ùµr— ðÆdƒø?ØÚEw‡Þ‰‰í¬*ƒc†Ê›fškµC*ħšªÔU#ÛAlÍ&õœä¦pÈY èÓÐóüó²ó*?)(Ðd¥ÎáÄŲ„ñWK.òÿ¼ÙÕg"íºÝ#¤<+f•9͹Û_yA’‡¶Æl]ίʩä$ñ¥n™¢ecØb x§÷’ÿ¦¾\:çƒ>€ÃCÐŒQc¥_ÒŽGh)žŒ¬®I*_t Y-FòÃèʦÁãõQº^·Wœõùä·=õƒFÞ]µ˜žW‡dk‹É¤4ͽe—§‘ ?4móyWñH¾AY!ãL«Ñ¥~.Ö&ýƒÊxXWãü°/ó*Q\Rjõá ‘Q  T?‹$OjBî¾’ò¸†ÞT‘ìö¤–Ó"ލ[¨,¹:ôAÌgÞ[T­æº£wµ1 ƒxcMŽñ.¿Æ?Cœ—HËTïñIéÞš¾¦ÎÓà†Ú!•¸Áßwxtˆh³'R´…NI@5à…¼zÁMœ„Á­ÇâWÄŠJÖ¹‚R=t%ßÂ*(ÓV5¥’Ø3îF. (Yw×YMÁ ¾[Ÿ®"ÝIÙ£aâî±s×¢ñb/Æñ•0¨ÃÈiÎÄò+³2Ç­¹±ÌdÌÆƒ³*di ‡9ÅÑNìï‚Æ·¡«Á+kÕû8þ׸»!¡®&“Š(òÜ}\uNÒ÷þÀd @^ä‘ÂGŽG°½HQ{Á“» TK»ÅØœY{nÊàTò8N¢æª~0r1ŸYè;%rÂæöÛ’1ÝÁ•¿ùÓß8Id%ñŽÿÙZGs—4A`nöãX©¾[÷G”Öì ó+B1$¿¸Í2nÅ•"O˜œ—27!cž¶0r±Äû £}>e½í‚…üºlÖÑs(ã [hñ¹/Z®EA:i³Ìç(³:À¤¹(îy¹ü‰f»·`Êh¥h¢м²J>ú!f.Oze}´`/´+eëV!ÔuÍV#"hCgÀñÇB¶Õã®íŸ|höå{^Üyw%éë® 4(¢á³døáiÉZˆ²xc6L?4챞M3åŸÙ‡^Ô­­3Ê2‘ªsÉVëDvîµæÀ½åïYãûa´:/&mSs»p{Æœšt2‘S‹+ìQ¾–Rô®ë¼Ñ…´YÔÚ?ø4†OŒ´jsϨ†›m–ØxK:[÷1bÂÔ@ Z«7γH%îW@ÛZž'Ü ÕIpeŠ•¢CX ²±žÐ!Ngw}†V ¥4&ލº2^ô_kýß¡†‚n$=±Uúæ úƒþŸŠÁG4; ÏfëË “˜µøtyfž(!Ês­ÉÀÜÂ9·\S}aä9tÞaÑuÎV•ï¼4Í f{-«„-ïfØ1FÐA K¢‘Àd¾M7ùÓ(q¹Hz'jIÀ†3 Ç’ÅÈCÑìL°_ðƒë÷{5‘eP¬ ÎÆãçØ¿Å 3‹d›q6°ÃÖOZÇñûŸ±‘_5ê2.’RØ‘Ž WøR¶[ˆÁÁ§0¢÷7z¿IîÔF÷–g)Ê4]Ì_ðùÜP!è?Z+8_@j^ß6•k «OÕ«;²#¤EŹè«á¬íÖ“{D¤ˆ7aÞO‹¶¤Mµ¯e:E¨P½±¬E¡‘ŠeÒSå91“¬á/I‡Qmx綾\ŠÜ~*[xD(RUÛ\û°6æ‹¿„¸¸óH ü­´\ŸîòV¡ÐñdœélŽš#^bÝ}KDzJíæö jknƒúë Êu‚ê;(*a×'â  Ò6Öo†ÕO…ß ƒ‘ñ”&)‰a+…Ap*9ueÄÚ}OÓ®n á¨z˜¡ªH‚ÔàR=.èÚ b#ÂIï`ÝeØä–Gw¨5w!zò(Û&sÂÑÂObà¯W6ñ=3»ð…ÀŠÅ•ЕòÔCô«0ÉUjÅRœíÆê ·Eªiüß2ÏÇ«<ÚHÖ¹Xñ¸8.—Òaz‘÷Ó;ÇzÅ”×å3òœrt=­˜×¦ ØøÒ˜·¤Aañ¦”%‘V'ÙR¿dc©ËñŸnƒô>çÀåÈ¢*R¾ÉñNÇ7VRÁPqjÝkmM QÔeFiäí¹“ZÊ¢[œÎ÷Í JAÚ 'Y~÷{¯ 1j£‹f¦''ß!o}"ÈŸ «5aµn§‰§•æ=ùÃu[7Û4{öisäA­½¶Fµ ÕênwPµFÔÔÊAöñQm‚dmµ‚<ÇÒbA\bl劂ÌüX]20›wí†#é’¸\…´3²±4&Ç4:™eKzZݬæÍÞd­Z·mÕù¹X™eOö‘º+3D⡯ïz ~½È[]úÐy‘Âë šÀâ~[Àj˜ù8(‰EtŒËζ„?Æø´€ÁØßFâKÝî«ûDÎàGý)Ž´®1õ AOù-ÛÃêÇEn•f$MϨÈMM¡\TýãvÛŒŽôª­æWr!t8H§bQÓHÆSÆ… ¾H«åýåâè jlÝqð¯þÞ¹ßÇo:tMH> dê_­wïÿoÐ|ñõ––#ØP<Êêb‰l+ ³}ÒWN é7Â>Õ—Q|üÛT˜ku÷$¸7¥@Q­-9ÓJ$h O“lêÛ' 8PU.d![0ýçVPV0ÞJO5È¡úúÍq¬Þ¶ußò©°”V¹Y{w ¯²ÙAså¥ÊÕ½6^Ù¥´íÎ$JŒgx3ä`5@R;¾Œx‚‚L :òò•8+6Pü¢HÉb´—zbJ"dðñLË¡àef[ÛS=URÈ»Ã-¦!I˜%I-T„43IjÊóQãìÆËbІ0èâÐ$µMs#û-ŒHpBL¾ÖMóÊMë×ë}ãW{bCm\ˆ–¬Ý_þP2ºÚP”Kî÷ A½ãbô›éyV¾›3‘œÊ.j WlUQé^Œ¡á¬ÂÉGGÔH¼†pog¾¡Yz“áTJ2LåÑ0åÝÑ¥]øó¾þ¸QgØúKë<$›ÐÐæ¿ÐåtØÀJÇ­‹6‘²ùUèe¬«I¤taÚd¸­ø=îv›–#K‹„¯5™$oð+]|ŒH%ïD-à/´„QYy­ ·Ý‹|AÀY>Ø®/-Q–%;Dv3`Ì¡O²>FR7O ØÎîûE‡Æ¿ ü³‡üMjD—:'§?oU!‹e»_è[­øÌháÒ¨_ÊqM,2ÃBódà ùë€1Ä¥{©ìnTH’;-w&¨¾F× Q^yj+ÖÊ^öêÓV÷<(¶åVî/éfG–ÞÏldê’ŸÀ…éGªÀ#·õãyd…íJ"ÚÂD,6ž¯EŠy>?ëÇŠxlÔ¡.ÞâB#k´§’¡JaÉb†ŒN·ƒ³Ø¥é ØŒW¼ë °¼Uœ©FK­8_LnZI7ƒQß”|µz¦¾åå²ø½¨ê•z¹X†©¾œ&e-K~¶„¼†ô¤'%2q–œl¶!ÁŒ·¾Á6*Ç@òÜ>Èó£ï«Ê¶v¥V=Íù.môd/xTXÔÓ¢Ó%mõ†ã«ÂE^ë© ›ý]IŸ¥@êгþ­Ê…lœd áp@²B~éUóºodÑK¡þ–ØÏœ–&g¡àÔípB‚_*Ë~7²J]v_±Köøí ?È.+Vµ®pŽ9f<ÐÓÉ´Ï ^Ö1U+Z‘¥áµ¾– †~[È ÌP¬µÙ/NJˆ?@Û¨¬²‡ˆ9„$è,L¨‹&¤R‚;ŽNm÷Yö* `}Þ©!鹉äÅ !B“@þ]ïc]¨•Å-ÙŽ©<>kEjHeqÄÅÄÜñ¦®-P§JŽmÂ~iu?J¨l]B]È©u;IaœG(NÞ‡S•Ê{1 ƒXCÕ)ŠkžÁ¶ŸE#î¹ø2ų©È‰ÐW ¦.†„^ùºÜsÅl›è`;Ž]®ß㮃µ;ôòÉ‹Æb ò# ãSÿÇåêí/èg­¤ôŒÍå´BVØ@}Ašq™Ñ^tyÆ„PO/ÃFŠk°× ׄ> Þ X ‘4S p¤j 8 ¸)õCFÕ÷…3–„ï™pf–í3‚ÉÓ;À2…ÏY 9DIÆ'SÜ"ÖP$w~ÂobšÒà¿ãŽ;6;V²ôø¼ù¶!Óø©¬Ò–V*A–n4p'?{êyõiZ{~p† Ðý¦¨5)ÎvXbŠ:ÿZ’|[å[Åö¯ ïêbsƒjÜÞ¶¾uÎXÔCIù)°È­œ O=“6º‚:Ó3„†,Î|D èÏÖµOÇ•|Å™¼€­8áDvIæüÇïR¸FÅžq ο˜kÇœ·‡X4À3dK0D¼ÿŸöe¯j“Sˆ©Ï0G÷Ëœ9à¾q‹kqs¨eœ_{´Ÿú¡+ûƒïV+ÕÏ}Ô1ÞÓe¯Tq”±џ×=1ÌÙ0à]sÇ·ïa§^ÒwŒQæ©Såe™N >È0o Ë¢ÜU“•µÇ® ”NOÔÅÍkc ´µ lµÊü,¬UÇ"ca#cmú˜]G±8~Y85FA$6{iMŽ]Ÿ;GùŸ5/_@„ù’_]š’Á“‘Y\ñÛ¨&+rýZ†l'º."Aòö°þ4cèµu9:–3i÷{².XžË’@îŠëŸpê{‰(—,¬Ï8(d‡áwÈ%mÿC:gœ|0H31ý,Sè ðJ#Cs6€©¾’\I¿8àÙ-tV ¿y¬ŒÃ(þpÌGq¶½6(Ðx–¥/[°Ž± ­R …çðOQÐ %GHÁ×ÎËÈ„„ÌB…-È›—ȬPBL¦ª4š9*»-•ùnvêüºFÑ­Y Åx„É`pa­ CÞëûŠh”N!tµ†Ábôz´©Cw'bÐ`ܼXu!…ób6ç €Ñ÷ˆ¬6S”U ÿZQ†^ ïì ë[ó?ƒÇ_UQQî@_’ìr¿<ü \FÎô¸Ì^0éR\-W‰Œh6L“jÀªì¾ÙÒÍèdOy^‚Íàà›%›ÕœO“ªž4äœFÉriƒ‡åËëO°U$>ü†|œ×‘ÿѶ–ï"™eSü2íBc±ž+:]‚ñ:hÕÝ YöiwŠeØøìN°> Aë"è$ Z5ÄÒsñùyðæK$x–„g7 þBú ªÛT ÖªÚOxϲÛáTaê ÅyÑžwAê3ÂA•àÕóÿ0ãÝì>ØÔ²â.qÿº1xYìÈs q1D÷9OeLŸ×œoËBÔãe€£>6‰wGZœù¶VÚ”Ùe¶õ0å (´ð¤¢àf§Ydnï·éì&_ÔnŽ"ÆÇ ¤€D;#š ­#¯ûÊήÞYMú9öE£r/ÈF*»‚>CŸÅ…†S—ô¯ÓTQx„²­+w Cá¶’»>š@WþšÚWuì' 6Þí‚¡¦fmxF5xœAë¬å…>àá®áUÀ¡ïMø]¼· Ýà`ôI¹ŸZ~¢j1–9~‡â³ÃXãk‹y<:»6Ú|7ÆÄk_r¦öuG³ïÕðX ¸¯W£û1±ò­ÑÖžÄôù‡‰¥Ì9ÏCÍ}ƒ¡½ 6à*:Þå Q;$·?ýE±ZCì£sl{¡ùhS47êÙƒ>Ýp¿Ý'g0¡¸LUÚ^.)ëV¨5ü14åd}«]£¡zú;ÛAƒ”§ÚzHlÜù¯&þË ™ðÊ€'誧-}ÝøâR›5I´ˆÖ“ ó[ fŽÞ5%qó)×bnØÚoŸyœ1 P©i”ÿªÂ-mRw»Ô Þ©7 $é~˜ÑòõÑfÃÊÝç›çt›¹©Ôc1 ±é%>±¦Æ|-"n½ ²Æ—ÿê”Î0úW[ð'MÄ÷Ãòâel»'|Ïp áüYLPþ~Z¡8¬Y*hRRr„ÐÉ­üš5CXŠ!¦^(~ù]xñ{¯þp‚BÈ¢Mð¬ÅJS¸}!)/º&—ÃaÈ5«‰¹ÖÆk3Pó”™½fõCÀÃ{÷( ô» U–V§Œ›5¢.Š) îsÁ¶ b¶":Òú°‚r*Ç]Æxˆ'éÚæ»ÂìãÏ•¶¦¸y§½îœSD¾~b+é*[쬧¨ 9Ü„ÁI+ŒÇ!Áå•_|š«ÐP€‰kí:hkŒp¨›'Øì">8}‰~ôÂå ;[^öDó·çjhçÇŸŒüÉe›¯¶ìù&¯çÅWí›Q…AÆØ\CÄ3•òÎ…ØÞòM 7w!,4.êó¨¹í€ÄÖœ!-Ø¥y¯øÌkp$¨òa!¼Ø¹cv³÷>(lÙLß™z1•M\úÿ² Péùi·æE€ª6rx‡xÀë͵Lƒe?e±OΑ Ï;Øó¼¨™hÌ%¨IQ=–(ðR»ċ­}sõør61š×Õ3§U'û«iC¾º‘ó¬½+}L‡¶,š¯ãÝšß./usM1M|®ë*°—`2‡*X¸¯3mR VÆcÏ›—\ÑÔ3òýÖeq¸Å¸.^ˆá`ÝÈ]œ2ÿÓ ¢ì ?c\1—‚†:üt FÄ£¹˜–ÑW²jE`}Jî2íf:ºz"u w’ÆE:bGëðã à¯O³Ïd žÒeÀ:Tï™Âì.7¼Óè<!§ŠeVekPªm4—ävIû.Ç‚tíNãAæÏ’rÁ´àö¾ã{û/ä$síÙÁ|®Âž‹ÝJIä¡ !S>¯¥êô“¹ ¾BJ¨ùwž­“ Z*˹¹ÿe,0²Øf‘QàÉ„P2I· D¨'\õ»ÚÓ¼¨ÛT”ºÔzÄoÄ/ýY_!Øá™÷ ‚°óq«||a¹dÒâ%ï觬AF"ˆÙÁO°T)~¥Á6™ ^‹ç1ÆÓÈ—×Ð?”K †Uà!ÎhÚZ9 ¸x¾äîXQŸþö¾jØ‚98š½E‡Q—ýïï»':Smêúˆ :ÉQˆÏ ˆ¦ZuIdÌbÂLù=ð ªQ³#gT8ï([ó­cª÷£FýŸõ£Yw¯³hSœ‘AErÅ|'~Ë[4YbNÏ\“ AµY¯Þª‰hUÉÏ›\Ôé¢΢Òî œ¼@7­s½À)û‘ Œ®@;Ž!#$ð”‰é(—xØ6_2N#/F‰ôhÍYc€fVŸýSŒð¬=Ü€¥rUÊ1*|ˆR Å<ü·3(ÄTliÁîž^[e誚Q ûç+’®ucgũڀ7¹˜—àPR›‡*nM·üÄ›}á3O.ð…Ùw+΢`V™Un<?ÞŠÔ “ž÷Mùýý­¢ C•bqµ¼‡ !Ëôµc ¼Ø4ÀQ *ä% [6yÕ,È<˜»®í½âìíaÿ’:å5[˜7~ ⯻Š8S¶¡ @ʤ¹é\qKcþ’±­–L&j/ÓLÑÙ‚,Ú;Ïņò«Çeÿ”f2±%QCƣȼ¢n\G–ÆeT ÊqžÑàzÕB";,Â¥¶šê:¬nÒÐÀì©Ò”µ0ù@fRTítˆ‘§@Ë_³AQñÿ},5¿ÔÂøbw°ÅūҮ¶ ³KÆ€øtzò86%oµ-H]°âÍp¶õß罿TÏ‘‡?è Œ\f‰hƒ·—jûW70’Ô¼ø»—m㊥n¨‰K×íQ" ›RÀÿ öm` Æ}HÒ[ròV3×cj$w§¶fÿ8±ÏÄÖУnbÃj·OR @AÀ“ÆèÀ$]QÞ ”¢h9©ßTÃ{˜©9m¢ÔÛhòîÄ9í%#¢ñ°üdO8ìiÕ¢¸ù±HRÀ3¨2ä×TçBÀφ7^‡skÞP®îP‰©ÉÈðà »…¹v¢¨’$ûDzõ=©t ÛÉ]œþ\¸ð÷ô×&-¯=Nò^5düÔ§ˆsýy ÆU9W*ù÷²ƒg^ŠÂLU™0v¨ D´ä¼$kmÑ_KöXà<»¢@¹µ£bð3~Év· bKØåž…ª¹kOëöùqð_¾t"÷äœð·ªRÏU÷>5»¹ò'?{™‚.þíAê5—Æç˜±:/Šã@Ø“—bw%úE`Ðçtõ¾8•ÒºPú-é÷Cî­»ÄÓ!Û¼@Œ>óu3ýFÙZ¸’Ÿ¾ÛC¢>{˜·«.ô¤Ð»î0Nâ†V#E §Üøx –)ˆÂ~½œ§€# 2‘º`@5ݺŸ"3€ý%¾ŒÓÙPçüºÒªB³Ì!(áb_§‚©1¬ Í Å\J<– ?¹cHõÄî½ç ÖVÓ3/~!»ìÓêžÿ‘Âw P¾¦ï·ÑrBVaAÛ™šËº~ø‡âÌk+N¸ÿÎ$&nV@²ªÒüph '1—DÓ•~?Û±¹ïcÆÎ6Ëwù’]ú\Ô«_öáÝä„dŠÔT^“ÇWµw¤¼]0ÄÚ•^"˜«ê|†„ßÌŸÎ;ôY³+Ѐ@“{7ZKiÀö~ –k%7¯j5òï,VÓxmq87Wý¢.Ë£©»¨£VŒµbðˆ&¬Ñ$}¢Ôn9¼R'~D?:Q§Ÿ½—¼DZ(çIþ—Þ ¾XG5~^Í/CÔ3q_*¸P‚òìSÂý7þ…“Æ„QkÑÞÆ(˜ó+åÒ5Y¹ë68¼©çuM—?ä s¢ø—«W¡®W&÷Fr$qÜó Gn³Á%”›¦\(Y©$Ý~ ÈkEÁ:|•ê& :9lÿ!éʪü1pE"ƒä¶:q#ƒ‹ÁBG=ë݇²|8q@Ç1@@%!z±Ã;˜Ï ä„Äw¹µ#|x\êãÌË%žµ4†+³§T3Æ&A~>~Wóÿ|4ZL%„ÂÑ\)élëÐÂðž®90˜Ç:ú32¹Ó,"(í®ì[d¼[7EjJÙôr}2!)9Š7ÐŒƒä>ÉöÉj1¢Ñö®Œhç^®GŽ4ñStîØŸüý6K võ³ÿØšf\ >d”Æwäè˜Y F¸é;LPbØ2žD‘q1€—dÍéÁÓ¶HqA"¯Ÿ7íÚkɼFðæ¯Ç#ÝoœÐAJ†—!Pm’›äš8]²ñªºÄ…dfc¨ZžrÎúÍv´?=êóŠŒ$þ®Ö±µ%þiûPŠ;m‡ Žšì;ÍØÏ7&Â*ÊÊ׳&:άÙ…CØ üL¨;‰€DºlšgòýàÒÀîiMÆ‘’brn)ùËG☇kÈ\}Ô#PGdžP7„kMM(s!Ô'Có“o5ªf‡þPÏwfo›¹(%3ã¯uØZªgÖ¿ºX0”€FÙ*í\*ûžDôu-—÷×@Mà}MÍg‚“DÌ>Þ¡~‹qâšg˜#n»ó\ÂÂ=²'Fà¢GHÍËՎר~Oq~œ_m#±¿.ãµàivü »Õk—£‘kóå˜PG¥ãC^ýáâ»yaY!½ºy¶ïWÉ™À‡~0Ì`êV€½×ªvŽCµñ0îÁŽ÷LËc˳Br¡d“1AƒŒØ¿Xd )N$^MóO1ôjCš³í³‹Ùâ{·Aĉ^0ë°p,þHá7¦ QÎ=>_‡ ½ß»9ÙÏ‘èß‘ItzãR8 ÇŒñéN úñ ÿÆÀr’ͦ…küNì:ÆšAÛ æv‹ª‘(/ãÞgb9x±+‰Ù¦yúQ5ŸPNÖ#Ï­/èp]§ß Æ€×­wFGÑSòõp[Îa¡¶1n;öCb?— a[9xµtêÑÕh«‹Lºý™j<Ù„ApìéJ òRÎÄ#šßÙ³¦©{õ´ ršË&Óy?XæGª ¤)c ‰¦cÇÜšêö¯GMÎýåa\÷½Å,áb ð¹u W{àŸðÌ÷í,tjyh;wÃ4ÓŠ sG8U(e¥'W•I´(ÀïLnë¸Ê¦Çû‘åhèLÉ_j£Ždð_“ä¨8qgG5°E7Ú2ëoö”IcÓ¸©)wg±!i¡¤_ɸæó¢a†Î\†#\§³ìW5 PÙÓ™3jÔD˜ÎlË®q;lD@0u7¡ sœŸ]F5ËœÅã½¢Ÿ ÐõLN¥†Z굚ÿ5dYåô©Ëî+­ 2½…Qv?–”N ð ¬ë·“¤pÅŽýß×`‘jöœX/Í( '—ßpª~“R’,«¤‹kŠå*?#+Y€\Ø©ª`?jn_øi e7çö¿\È$ ıá¯ê ˜ H²`t÷f.®¤‡&¤ílõÕÜ/N"G`w2:®¼y>s»²`àìûñep“žÇšq{Æí(b+· n¡×±æ‰ö"]E·zˆél¯¥Ø©ß¬,v(úÃÀ Û…|r/Âq;C¦Ý°g1‰’Øúî“´õЀï’&è÷à=M7‰7«ÌÓ²V©>J%&*­-°¿Ø i…2ÀMíZ…³Ø7;«Ñí4ǽøän['/²­ŠÒ7aÀ‘%Ë 7úS»ûr±$lÕie°W0¾mi#ÏÔà¦þÓ¡­kÉ+9ð­–„ìk”äs~®\ª8áZó°¦-Lwˆ}#©¶±špÏ©–]ûÌLA¶VOÅÇÕ# „v‚%œŸ ‹Ìä£ÊŒwJŒ¥}2 ºMàçÑò¶ÏÄ-&KvdáBÚ$êþNHÛ¤þ„`^Äá¥ÕÖEC_Vñ¸õ…ñ5!u;ô‘–Æé¸ælÄ^þÛèwõ0²Ž_…a+Î,åÎXe;Ç6¥·4W¿mè꟭eɰ}ëÂ%²ÔЂ}êL»ü³£_ÜÜ­jk}¢Êu€®N0Ü©Wv½ºœÿ`þ2FÚ®³7|4¯à’Ø6lž+®ĸ”†ì¤¨o•ß[S¢…XL­A&@¹W;[ÆCáSª×¼éyÆT÷y³A FDŽjuW}(UŒs>kã‡ÌŠÒ€¥zÛQ{¨bä܆…êX2c‹”݆»²(Pè?ÙÛÎKø9ÃåPÎcÑÁ°Çü|­M)OŸK…;<­ö\V,Ÿ-%ûb´¿ð·Çœp†Är—Û%¶!VóT,ò;Ù1(2ëÀ ÓÌ´.´ËcÞ"j_ó½ìL½SœÄ-\hÃgŽ3^ú?Z)Y’ó×ì~å¬äMŽé‡oâqzËcüq3Köc§6B½Œfñ‹¥#åÝ,ÕýXYžÈ–`r]¬UX8!éR£/,LXPG  ð9Ï Na´¥$q¿Jª熼!|UÚk)OYà·TÀ¯TªŽïÞrùÈî¿4€ÝSºd\ L¸s€é­f`~\àñ®ÐF÷Û!!=ʉRš.ªÆ¦§b×ü§L¥¡[ÿIÙ›C#½Ã'íUðþ&‡°0Ë»‹ï~µjÉ@ðž0ê3¶R.\Ee9´]]˜'±rÂ"g‡NÍ’Å&çÅž"aÒÇþÙÊö°=Gs‹Å!Qs8ðn‹ªÅcE»¹$& ÒÞX o)iHÎ' '£3¯]€àØò¨wùÂémF'7xC”…å“êeмoøe§’ÔéžùÇ‹)³«@ÁY©IMóè,æ³¥,˜–ÓÇû÷šfN‘ IdC}êmßü‡ªéR”åÓH¾:» y«:çIúªÁ¸s,ži§©.Η©!þ è‚£Œq[q÷ÊÒ™¹à¾™ÑŽM9€ è‡=oðtÞà_OLŽpð]šOÂh¼Å”íy÷,:½ cŠÄ1ýýr× ÛxÅs§iìlÃù«óÿƒK¯qä› µmJM!‚w|Bû+M,*„@¤Úél4Ÿ 0‡x™OfL <Äè…,¡U[Ó:s•¾ö¸,ܼB^’À€èĬtXªoϼ5dZ½pñæW•T£3v›‡ø0k~ ¹¥›I¢&ɾ+ÜØU? 9&ÆeíÛqâ¢'ÒŸËäñ»zÝr' Ïvªæ^ž„~: –϶7ݰ8iIö+ºþ yn«U´;¥ ×­à¿åÒ}£MhåP$4~à¶«;Ê ÐPKåžÈÿ”%*)'´ÕBàÌ¥®£hG¶y÷ì@%þbê³Uýb’RRf2õ1¯vÜ +•ÏK@^ÍÜãÄUõÎÏìÆï¿ÂÛŠÌ©ú¿ÿKC0N…“/|³Àp^¼çÌ]*„’îeäì$q[n;hݼ, Œ™ ;}ƈà}4§wXÀ×)cVPÙÏ_˜k6`LªûÁ²«¨çIÏJ ‹Æ¿û"UlË2xèïÚéš)øœ†jä¹ÔígÔüL?7Y¤1§€)|·r‰ò}-½EHݪ”yö=ÆùÅŽœ¾Ó4YVÒɉ¹mZ°G‘^ºƒœtlmó¿`؉ÑÁ¸Q-5-ÓÜàSàAúiV ¸‰ÍCÿ‘æJi{ovP x®ù/×.iìvx^;iPëVJšl@@Úô; ÷£´dm€Ì Éh©¯žšÁ™L¯—ø·!cw䇌úêV¾AV2uÞ<k ¾ºUäu#×Þ8á~“>»U£/åÅ0뱆"xºal—õŠi¥þc×…£‘ݱ³¥c—7›ÇQ3'xZߘµKϪÛiÛú"©ÁÙõxÊl[ xµ}äë ˆ™õç?V³nLÆ•A~ø*p ܺaè×4Ýþ3ôæ*Åí*úåØÐHyжÃÕ½¥Âµ0$J|¾ù\r–JÚ³ùg·)¡OÄ!tÄÇÂ'ðÉ,ÏöCu{|dÆ}žh.@;ÊL¨É)TʶÊ`(KóÓC#¸dÄ6dYè8FçÅq·4(J`|œ hv>µ‹dÄ’ÞmÛ D>”š¼ÛjNPM#ob¿ˆ ·#€ÛÝÚK̆°ã‡É‘/?©ùs§n¨´ŸÒQÿ‡ÎbJ2¦:('D[ý¾(¾@èÿÛ ¬G¾éCrâýsWçtl Vi~9Dz™~ÝÄ%–Jë= n"Î`èþGuÂñXMkÒ_ÿú‡î’W›~™˜}ŒOêº×Ï/5ÛÇ…@Ó}AûfÇkõŒ"»mžB {jf行MRn3ˆ 2… º5öÞ m×Ù7\ôEÁRŸ€ÄDüÛp©&v…¥Ûu±NCÀT¾ß›ÞQeuŽ ÎñÏ€ãl@°yߪM½|_sv@+ØWÆ©FAk²o»•ßË×ÿXxòãçòâ¶×ÆêƒGÆx.ç³}æµØD2‡ì>:çN­°¢›Æ_¥‹HïÍÕ`Ö€`ÑÎ ÓË»ÝêΚ3+}ò,Ñ(Ò¾Ô)é n³”¸µ‘Óìko‘.¯úw”!íM‡ÊjKÊãF¤Æõ7´v”Q¦¸öØtѼíÏ{>“†„]Z;WPèz@²Õùb3Db_‡j,¸n?^ä웂‘33<‰6++•ÍñÛ¸?×ÚZh¸”PÿHrߨ päsO4–¬?MŸDïMƒ¿f¦¼>Z'#86@¬Xa,m0¥WHx[ýýaYšÛ]x¼ Q ç/·úëϹaL¯¤¡YMÕ\U'HÁßm4üÏ¢(}}Ì¡"Â#¼b {4Ørk„ëm8û¬Ötº@—fµ©ä¤Ëž®(ë‚BxÕ…þm9•W“óí‘B—ûÉ ´Æ­ãX<޽Æ]J¾H‚ÖñœËš¤ê´R‚R ,½80Œ¥|#™ÊÔ²Ö·£‰mgb–9<" d®«ì¦Ä»~Ûº¨ì*§›µty»/4ü(J`lÎ~Ù)|=WÝeB¨f¶ðTܳГu¢  ÒÑ.ñ¿>ÛOòtú5é¼1¶,ìž«þ>ŒÙ#°èûù\¾}Vú ¦¥<Ày†as(6¨Ïçm¡Ù?jÞ Ž†­ñ$ƒa®¿ºŽA÷‹ÊP7ÓõY€®ŽŠð±ü²$çR`·+¢lèqJÀº²Ýª“â$‹7 ‰¯8Ïx¤ÕƒnS˜§T¨y I¦v—‘ˆ4=½ÌµÒà*`÷ÒÑÒžÙŸÔÅãr‚þiG£A€è3.SþÂÙtgÃùå°â6„)@ªÍ ™$9õü{¸û_#·@:B5 góó*‰6À¹¬6;ÚcájP²mS¼€\Á'íº˜:—ØÊ&¯d.ýå®ïÒbqˆœQ2›¾ÂWÛ[ª¢´! 6 s ›÷ånó”ÎL»è³©ÚóJq¤e;¢S>'õP*=;6??|è´h>¨E ÊØÏ3ˆíéxÈî6Ô&ã·Sy9\ £C†YÁ÷šòÔÍU×1™Xšõîtç‚Ì ÛpåM}J·ë% ÿÔÑ ¹†)“Yƒö¸Fk¥²éÔˆLRKo!øiž/XŒ±>âäË|f$…šârwvÐ@ÕÑcW݇|üÿ(Fg~.Q_?Á±9/+Ý—K×kŸëµÃ@ãbkõ@}+¨†v»ææ1Q%ÿ e;ZE—ïòn9Ü« mP2JZ¡…"üñÄí¨]~s“ùbÃí™?ÝRIÈ;¤™™ò즪K{º)à%ÛžKœcÖ¨¸7/n"‡ŸÁ¢„ßkêZ×±>i²÷G’ ¨ ÍQ-¸ºÕ¯NØ:*i"àú•lŠFL¦ÑiøÊ@%ƒ°h.üri;x[ûD;N·À†ÀrÖJùTÓNJƒçô™ÇguMl¨½XÍYfë t³¼ Y)ߌ2çÖE†ÖðÉÇäN¾'}›‰¥içf?Š$óÄÿö{†£°ÉW#óY#"r‘‚q•æû@ /Ïj¢(éG[Þ¼EùúÞòïƒóIƒÇ(IIÃj…dci O4–†O0Œ ¡ö…í°()”«jPã¨NòÏ‹<ûžW„#2î¼–ÃÐà “ýûë+ä±·‰Ö/PhQ®Ç‘CþIi eC(²8 \ÂbÌ]l0õÊüÙ-ÍeyÓÂËÀòGæ7ÙšêÔb릧½1Y¸Ãj±v¸!FªÿG­£ÜbˆYŽG´ß´¸ QªÎ§ÝêϽ²Zí;…Ý‚þTƒ“¬´I$Rì°GuÎß1KGËÐô\%Òd+gdž¹™j”—iœC~ϳ9\gˆÔ·b‹:J”Mª´¥v2kþÿ# âÊõ‚KãénŒ¯¯µ ‰Ï”ít¹ëWºò4Ñ ÃFæ 6]ý8‰|Ø@•:€]H°x,äYšK*8h?×tZÓçÕBžòÄCd)¡¦5mëwè†o\&s¶s]€Ÿé‘ØG²žté™d U“Áî´6Z ‘Çcƒ @È Dyíbp&*Ç¢d×Í£½…ÂÃI·–r (‚Ô÷Qª3hQì(ŒsðP7ïÉö½öséðy»½©àâúÿCË RÒ,:Š%i…‚þ4_/dà$¢ØÌÆä±?Í£¼ ÿR0ˆ€‹c°hÜÓ–<%˜Hy ½¥©„úÄIxáE¦¨†÷»mXañ•ˆBlþ8̧ËñŒÀÖáœo€ŠÉϤÊʶ|ÊêNÞ·e5þVËM¿yküë«:¢‘a­á),–æWÿÐëÁ`)ö á¾½}Æœ}v‚=5Z¬¦¹IÒ{ç.1; ³B*EýyLòtNm«¦Ì=½@iÀÏÿ+y ]OJ;Nþa¥ï{j%+þákbd{¤ê‰&Û'í_øŠ .‘Ü21˨¼i¼ˆí ¡Ib;ŸÿhxPŸUßÔ£ù¹E ¹1½10´@h  ¶]´ND/Í' a»Ò’4Qßß ÀŽ(¯ÌçãwHæÒL&ಶBT\QÌóÞr»T¶ÛX‚F#ÂÖ®1»«½]·mHœjþ¯)B'û-ûaùYv—С–Îf\>ØŠÀù··Øé\Øáb‰+LN^ù[ƒ+gõÍíf7q)/†ZÞÊ-«ªÆ¤8hJˆûÆ„ uy¨bAC`[;S YQŽ—sˆŽÓqbú+MRìíù±l¢í‰c3×öœX_<¿Ó{Ëú€mÁªf‘Cë°õ¢ÎMnU× Ù†Qo¢¿RÒ&9ÒÏçMîmmÜCÿ3Çz <ጄÖVnF˜—¿ÿ›é”Kó$PPŒˆ#æÂÁ"Q·;áÐÆúŠLÂ,PŽ×|&N¾ÕúÑ, Oêépæå&Eé˜M¦BZ2Œ-Òë°áŸc,Œ8ƒi5x1¿2‘B8“Ä^ßRã|®¦×ÊƬ®íò{zxFŒp¼ Zë‡À`§B³ØMD¦ÃÞÆŠ”A,Õœì:©6S®æš2$9žç¾)Ä®Ïa)k þhß²§ðò4ù(\˜M0îÑÍ«#ûòÅÜÁ=æ y5¹û†Ê HÓŠ0ð‡¯Åûuã˜z­ã©H¸ñ¶›”íéº|ä^µá8|à³å‡úù sa.·uº†~Ôˆ¦lYºJàÀðÜjõÌé±€ÍÀꄹà8Z¯d;:Ú~ì°!A¯X²Í 0¡½‚}NÿÖ#LÄh#4'°„ådÐ’†Ž1 7GT ‚0H3µ…ÿã϶MC"ܾ›™1™Í¶¥˜$¹ÆÔT®üšÅ‚ü R)Þ¿öŸ^Ï™q±œ…þ¤Â껫ugKœÌ D3›ðüºL7—_‡ùµƒÙßMÆZNY—ÐT ¡@×ÙÞÁQë÷ÖˆgðˆVs!Š+…\°ã宓†à—’¾ÁU3£ÑÑ< .¡ÉLžçØ­ðR¦ü7i©¦ðË€øð–nf¸áᢕˆ›³ßÅi<Ê ¯¿DÐÈJ%æÄúÅ:ª©°g¹ešÇëK—r®¬Ê̲Žn[ʧ–=Mð¶„Zƒ"KêoeÂ<ÿ?§aeðc&Ã;áªU¦öð`û‹†ùÿƒ9R#‚È«÷f€'”5ŽÜï¯eI›•)ïkmŽ™ÇýÌê›AeÏðo‘£ä½õµ›Žáfìÿ6?L3©ÉºEŠ^D·e濌ªY!œU¯ofBu.$Gç)¿ñ…:ØV mù®ÞïÉÖÜ["+‚Q| 0­¤Ïy-ݱ~?¥Šœoj“çm i¤A›µ t’#¡©~À¦”¤O·Këí¨5šû.\Öл8¶3:”u¾-u-´æ#o¦ˆsO‹I¿ @\Ø}ÌÒèÈ=¥âÿò|?ÝûGDý£'šõ="]£–äfÇNà†¬‚óñû˜ Iï/9»îù2+»Ål1"ºb« ÐvÎóâñÍQѯø¹Néæ5TóÍ$wcó)IÅîzŽ2Q¸ymåE NŽ{AžÿVwDâøêÅG÷ù•]Híjé&Ipy)™Zø·O:”›6\O#+ûwñàî² ZÚÜ!þa²wÔbdeÖç ò S¿ø´Ùd·hÍs_ Ù'ÈXG3ඬq8¤÷:.ã,2„œvÅ’=ƒ"5‚ûŽbä/^#–Ÿ¡>KÆR]‰cêìM6R~¼r9s¯2º½TÔø1“d·3*„V-ç™ÂÉ‘öƒêé§ QŒz…­ —œ¤deÆEÆö ýGM]!|áÅ2rûÃ?°y¹D4VäªÛÐ*§ÕZ}ßqCÞ0ÙšI&3£_ßµ&Ú‡(Ï…´$€Û±;IÐĹÜ!Ø¢® nH…%»bòMÓ Ó´ݽ¥©Ãûƒ“÷¹"?É+O°=ióâU„3×Ä¿ß#õQáLëªh6Dc!•d,Eî……’÷UEF‚SϾ‚-ƒs‚ š µþ­Œ.Ø&œgX×®VÈÇÍħp´~R4ñ o¹ž,fÍ…-”]Ò!Õ+É?¾0!Î×§ìõs/˜“(ù §­+¹0ýq€Öç{—SѵÞ3[ YÝ@ ùâ󕿦¾ãƒM·¯)2R4nQýªûîçÏÖ‰s‚EUˆ·P¸žžØ¾òßÀ6ÄYšãó (ز žý{ÛùZ ËË€AÞùæNû¸ ùܯʓ~ŸDÈöϹêŠQÉ!§A‡uq3pË\.ˆ¿EAF¹h6Mtè©{“?” /æàbûÍNÊB(~b>ÎĦÃs%6©ÐTTÈT¢0™û'̘~lŒ¿pT´T˜ê„j.¥„7*˜þ¢u‡kæ)TsÙþD9ÚË1¸Ä‡«ÃÔi¥É\Ùáë—¯z…÷X­?ä:L¯D:Ò#¿˜úVÀd=x昙)TÜäKж´_à1‰¤D l¦Â÷À5 Šñ@TàÊ–—v˜ü 7RÐöGÛmÓ—ÀaW,føQV‡²¿Þ¡‰XN²¼9Íß[›qk=Ï60˜”½xöIúÕ’v.³_æþéà Üs“ò?â~Kk­s<™ Q¢i°°>T&`@JlÁzÙ‰ž)UK5eÔƒ—^ÇäA‡ ÿ ‡7*RÈ¿ÃÂÀ~ææ°ÆÔsc}žÔðÉ!C¤€\¡u1¼5#jà †û²ä”|ºTm6Nq+¡UåÉ…²ñ#Ð4KQ·ç2¸í«kQÐ7ã]î Kuíʵý°¹XçWYŠP ™<{å¡1ñ‚±ò:æQ+)uèFBÞB^VwÓŒ‡#KÙ0L˜ê( œóq—‚ÆÀ‹MíÔ*lˆó?çihAŒSÃ:Ò1ÎTxðsÂïhNT×gï!—" {]ûþ9£X\:\È3àVј[Ì`ÄœO×9®'R—h£EFæbÇÚàb(”²]Æ9p½—»OÍh…·´ÇO~ÀSJ[¤IÉL³¨½ düQ:ši…ãáãXy° ‡öY’ÕyiVæJÂtùÖ,cøÌãh=™­Ÿ"Sƒ«å2?-ꥫã[¬*eˆ]ñÉÀ߀ÿ?Þ‘y Y{„Ñ'9d:È}®/ª*Q&eP*ÎÂÚÜŸ•вßÇÏÞn€p(Vô1Rà +2`ýZThàrÆ…Š4øÆ„)¸QƒêDJx1­öèwYÖq†ã0#˜]”{…®k’çÀÝÈF‡å^ŒëRˆAл¬>aW±b<–h¨™ MŽ¥6~Ü$áRâ,À\æŽï|ºSZLWù‹Sí—Ã_Ó%–µ‘’eß *ãÌÏxÝ"Ý£ÔºÆwo—EžÓÚ•,k-4ÔÛ3Ï„ºÃ'/‘!è㶉bì¡z„•kÈs+üÔušyÓýFú7B©MÝ †´÷1lz8–áŒé‡G#˼ê .½ëꆦPÍo½žÐˆ§·#q(åw~ÞC¦cê‡k”¢@Ãå`Hʆ×±\K]Y-ü+ÆÅzþþ·¤ÎÄh}ªë†ÛEðÊîx s5rÂ~ ­0ÃGj–p ‚LD‡þu‚ó`ÓV)Ù—Õì0iâ|1×Å<ý›g‘óÞ¸ôô,º*¸µýFÅÖA؆ª†¹ ¦6T:``B‚[ÃâG²0<Àç°ä²fµMq«N °ø"ªñQ-£Ññ‹þ@f,öƶ¶ÚØÍ¨ f`;‰~ø-çÑ5É&”xŒýJ:Üü±²¼<Ê\êt”0 Àø`´VX¡§ƒF`ðrÖ1µ ©Ñú[#aö4ç³MôˆVî^Bæ†obe!kƒIŒçkà†%ÚQ‚ìÓ®˜ ${= Ë[§Þ_}|Y`ÑYÀxÌä©ÂÍ]Vr.fDø'(z'ILÍ‘jÀÂÚºqœŒÃáúœÇ²²°0Û>¤j‚ázM™“¨¡ÔAÏ\*îòSÿÖ)+ÏAºœ.Š=gñÑgmIUûDžÄǨÆ3˺^Ûý S;6)20½‹ÃƯn ´-ˆZZ.ÑŠi?BÉ;r]ÆòŸrjƶ±=³HId½kÜ–<Àâ·¥'J; œæÅbÅ'>å* éÛÛÒÿ‰Wz3¦¦Ç@Ízº›uªÕý5ʆF8…Kwb«ÖÇo† /‚¤ ó×R–8˜@˜¸%¿ ·håZÀ%§l¦§Ì‡ˆ@+ißJù_ŒU_)Å{cätºÚ<  (ÁdÑ+Ó{ˆr q@2ËʼON¨Ï¨õ(‘`ÚŠ¬³A°Õ:aoÚÉ £ýC º±úlh#¼°Äl[þ‚á…™p¿6Š(3ŒÄ{Ï{)šÞ—©ááÙg{w“¡1£Ì9MÆ4úAàŽ¨žýÛþÀ÷´jãfqõ6Ôi`‚"Á‚‡<Æ ”Á¸uÐg)Œ@ãÄ“gÊ×뉄JD,tþܧ“p/5Îýe¦uòpìO±¢ñ0ÓJô?xÕyY¤êc‹†‹¦…rÓ54’ÿbÎ"œÜçû™_X«µ§ éªÖƒ³ Ô FmžœÁÁac0LS—£¥“ä"‰á,ºeXÌ&õƒ–žuÅý«zsZ4fñÊ Âê(׵ݠ¶¼Yp–ë…ØŒàR“¦Èä´µ:º¢Ÿ+àGãÄL˜€e·før4òE;…¿9USk°¥çmEIæ•áöœæ*—¾ýëÖ)¼ÿþÅý®ÕK³jïDÝ|6¬>ks±_…× †º=bÑ4¤€Ý¦ ׳Q+šÇÙˆóB–¡.·¬¼öû;È@.B™K¬q9¤Ž1'gƒP„ˆðº³Õ|‰·”—URâën?LA¤ ‚l‚ÝòM_§a€é”ÿӊ̵ dLø`¥Õ9Q¾NÍß³¢G©,Ø5a ÞóO%{²†il»ØJõœ-· ± jz~Æ^£Ùœv&R lhùÑ«¤Œ%.E”å¹øåÜZ‘ÌØüÈxMÈ]¹¦„ízü0õÌ8"Xx„±·ø'ð~ìuSÎîlWV«¶žT ÑùF†üDÍúÞ>ÌdÛÇ—°ãï*ÁÃT.âç‡ A)×uG úÁõˆ~Pì‡Ãv+·sŒx¦÷#Çt„èe;Ûd(ì…öOœG u«r4 -êç¢jÿ@°3Žorøt¥a³ˆï lÖÓú ¼BFG©s«qud—b›”Ÿct~8ñ(¨_n¨?xÖŠz¨þ¶¶¬áM-åžÂ)'>î‘KÀløá‚ÒÌ¡–8·}m57ŸF Þ±£Zœ½ z;\Œ þhxmäô{dÁp¢hÚñYxýa!ùZ®ÀÓ¹\gC¿1ÑÝ 8Øì+m¼t#y_õfv&>×u,T†>íêDAýŠ|u’åh; ¨üP£Œ¯-[W¬†#AI@Á¿Þ'M(õÍoA„—žº®ÏñÐéÌ:íô`Ætû•8û]=^7VO‘[«K)̱.%¹™:]xËZûd6׃ØF`ȧ¹Ë:qi•n¤JÈ^·OŒbÇJº¨1—¡G³®ÆeÎ*#VpÓäð{”¾éÍ踖ú­o‹îá¬m–´Wm¤ ¥;ŸÎ µ£ †˜á_Žø¶´ö–´ QwÌ-ûÃ^Õ?¶/¦(SËW[鎈ë7ÙͲC¾PÅwé(i+¨¨Õšƒí!~×â 4!ÖèÜÅÇóôÚ{<4=º^ š¬sD#,?m0›M<Úê6Ö·Ôшåê&¿LÔ ,4áu/uÜV-íªdÉëg·Ëe€Ù›¿ey²6.:\( ÁQc fÂrdñ²P=±³ø"9Ê1ñý•‰µM8ûþÍkQ·¬^gU,gPßnü–ÀÃh)nt¦F™ç£K¦–-–¸b$7$Ç'¶ƒ÷çžÆÀ`óáQó`ù‹[KVçQß/Rí‹È§· ;PÞA 0¥Œk9B©Öãícãr^˜Q¤B§0³‹Ð°œÂ¯åÚ˜ÿ¾Ç9á:Û(~µ_éݶ S`-…¹a˜ˆ€WìMÖIX+­²z¬Sesu¿0M®ò䔃îò~QÃe?´¹ð$C°j]j¹gé®ÇÌ¢KÉM HCâK¢#p%@“P%®¹ÿV?(Äq‘e9$Õláhú·ŽRÁЪ‘â Ôj‘g$ƼöŒ2‡âÖDen;ÖBòê‚”TÞí9Y++³Žíýƒlv•G†ÌZ(2š67té‡9ÂÿÎFd}}‰ârµû¡ÆEÙ`þÄìŒØs ”íÎÛ—ðBh ûë§üT‹|sYÇ\¿{h?Tßö‡Œ[}顸~J¬ÞéÓ`ŠÈlMÈ%¥¦b}èZ ¤¡Š®YóvZzcÀ%À”TW[™„…Y®@&hVP”Ðî•Ù-Û$ì~$3X`ÿÝ|ï4ýÖi£…8—›•R†â±6£‡ $I!µØ>øÆA‚.*·üRsf»>D ó¦ÚÂGm æ˜Sø´?¸+(µ¦¹i\²†eÇúX×@\ËÚ<Ï#´J@Äh}sp!¬hNä¬ôÅ[e»U5IÀØ€óyë¥yl§¸ôÌøæ+|Õ jºßŒ‰UQe8Óõ?ôf ±¢!j‡jc˜vi˜¦Á¯dR»Ñ<ËšYs'S•~"½ÈMãHÖôŒ´^â7; éb—_ùñƒÏE‘MQB'>ûöeÇíZ\ ÖDúÔ¢­mÁî°ZüFÍ!÷¬[ùÿß–O¡¤ˆ·ˆ™|_ ­š‘:â¶C莯ÿ0V÷c´fêÓ~V+?×ΊÎ{Æy‚G(p˜!Ä\Äyf¶C ™LC­F»›ì{!œ&ªïœû៮'ö¼‡ÞÙü¶Hvó©,ýÎv©8<ä&ÙÖyà i[ûÌM[èDÜCa;®ì Ã!’<+ŸÀퟆš¢@É'æZ0ÈZ¾-Ìs-×ÜëZ׿‰u’bý“jwMÃÈç¼V’ IóM\K¿›X«GH’NVdaŒóJà™FǺcÏyuáe> û2‘†bmÐÅ?œ1̲³˜3¼W¯´„®²6µÖ5ü€¿tð„fër¯1®÷w”9G§þ;uô£Ý"ôˆ¸ø]UÚ…› D\h7 ;‰•W³!6©áåAZ¦S/æ~gîCÒ鯫£({¼m‡˜&÷2—<Öþi럑קá£AÜTþ¾ŒéUk®¥u”.9å>»êm†²•£@ÌÑ›=H"Q¦?D«Cè7²¥èä/5k‡ÃA‡&ÛºbýJl•eB_1p^5!_¡p&R‰W Š*†Üö)¬8þó¢=F†F\Öãà%¨Ü[7¨}`ÎV6»0wŠLXJÇ`™]^´O±Ê²F±xjö­2MPˆ\Ý—ª—ay@0î“?PFR¬9¿{ELµ”õ=ÄrŽ›ÿØÇH½RÒý$«{Vj‘¼àWs~N–П:û¦ Q…©?²sõ7´n™0uía=&2àB깜gIPW_0¥Uõ7ñ_€í%{)6ýKuËÿ´Sp™Ç¶iWUعÑxeC'äbbð%õ”áø*…£ùoªi0Hé–`Y˜,@|H¨ ¼rú§úÍ¿‡ú·\÷A ,ú-4”óoçèÍur‰—Ï“®‡isìuË]°³-XyÏLÄ CYLz)ÍãýX¯`£m—q¬3$Zš'…ŠŽfpo¥;ؼ¶Víµ ƒ"Õ¹’ÿ¶…ÄDÒ_}HVžÉ΢Tæ3}€º†€«"YÊrÇoW²#bÔ¹yŽ;تD=ühtWþž G ä'ÑvŠ%¦3)P›Àam·úÅÙGmÄ.IJ]h;†`üãW8u—£ŠÈ€4鮳ð%GðCÇÏß2O8ùxÂPšóh¸)!#.Šò¨;ÜñsèʤËaÕYUw]•ÔÍñ¹ð\`ÙM<]7EùˆÑ?ÚGboãˆq ‹šY·nªîîà¿B7¦ EÁÕï$ ·åàó0ò¬\õ2¶º‚½‚Œú5Õ·I­‚ïõÑñ¾Àðj¡?ØH›s ]tÜNRšæKÓðVG{Î<•HVh}»„–¸S½Ñäe_l¦è³¾ÍñCmd/³úίØCœD¯9½ï„Äp7âb¾Úõ6Ë©Œ°á0®ñ-Wß©5GøÏ†©€ØvÉ4€êÙé”*|È 嘟d4:‹Åé0¶`Ê÷öd>ÕKÚ,Añ޲'ÖÃÖ0-/s >Ï¾Óæçrè–k5šBÓ«3–p‘ârK b›^¥‚XE$’‹ŽFp=5}¹ÈFÒ7q.£:{þo‘Þð½ZAž«º¼“%ñ÷w÷%hJøW"äZGØC¹ìÇ…Ô¬1Y0~çÅ#¶ÞÄKFU¤L‰CœFâú3Ê ¥¥JÑ“Qiªm Ãƒ¸9³HY_èÄJ0D ¿‚ÿüªÎ“Lª$…t¥5М㌞rÖ'Ù%ÓYcëàYñ¿³#úýÞr ˆë›Âoƒoż€•KæÜ¬ƒzÖÛ¿K8¡2æ/]´nà6hØìkò(ÒKTM¹çÆwÅÈÑ­VÞç sº,ÙŽe2&›x²ñ™´œì¢ºÅ¥²1°[•ÖÐ=²‹Ñ=3­ãpäRu9!íÖ;DªW¶Û¿q¿3C'Øy"k:0ÒÔkåÌé¹)ÀÅV±¨U©=Hµ.‘[ae›ò@3Ìxö¨óxÇÄQ4ÍÝ@ ·¼ú¸ï(×sÊ¿9³Œý7®±ŒƒC¢ùwöytÒ¢còZ˜šZ›3{[QœÀCJÜð)Šm‚hãÛ{§|K ó Ëm/Ó/€âíÚ6ðŸÓÈÑ™OÝwñ%o'>àj‰¥]Ô_Rpgc­¨‚M,›.°9Ò^Ø&è¸èÙg&VNÆø[ ¿ÝH?½kÄkuíg°cV[\ðª;|Ftod¬Ó@µ$XòjáãÕƒÈ8•ïÛ”V}k¨1€[3ÅÝQńϾ!Ì+ »¿}ƶø ? þÌe«ZWÔ`é›B½ˆÑPº%+*§E!*Ò™Qœ‚ª©{-K³ä2‚›ödŸ{wíÊ…4¼ø"]tÉZçËò¯¹Ó1¹ºŸ.‡ " o@^SÍ•X$fÃJô4Lkk¬J¼Ñ5àÒÍ¡ôâdþ_•ÎxRêÍL ldw~N \4•ÎĈ£™ù0Dfp–v‹EíIfGíb7©)ÎëÚå;Fð^CÞ‡Z“ œ²Œpº€5nh…8·ó!ÈÛEIàÆtÔ ?gL\nÓ´œ|WÏŽ\~Q¿c˜Ë­v3lØhŸ~Ž^\rÁ”ü8‡‹þÕÁŽd}Ú[½SªµÏN5þt¢&jõ¾Å>eçVDˆ÷²ÊÝÉ\´¹<˜zÛïhU–eÃñåiîA•jŒìÁs˜èO4xr»>Ž@?ú×ñd‹à‚ˆ2胥‹‡·el#ÄŒªÌA\vòqñ˜D´óS=P™Mœ3¼Kªȉu´J}hÙ.¶‘°”_,ÊŽQŠÈ®·70füßk]Íߢo|Æ·6°×Ó)ʵHŠ`lÂŒš¤„IÇâñäܹßü|‹¼Úá$_ŠA,0ü°þLç݉»ª€ª1ý"sõ–®šï¾Ýñ? Ì¤„îÌNþ¼NRh —Šë¬%Ïø™Þ´ì‡(¬ìÑJ„Fˆ#Ìz¤sï4œ^¿:{žºŒôŠW³”P2[ZJc‡³{IñéƒöÎ#&a€àªPJ]»rŒ´#COBW46Šo—j«N`ˆŒù·“•M÷³Ìøfl»Mš_HçŒiú¸°×a_çN©ÆÜ¼&_œqœŒg$¬Ô8þ¥ÎrÞ™µc£X[Wõ ÒHt¸·soáz-°v…Dñ:›£ùA‘ŠùŸgßJ³ Éá8Y‰­Æ5”ãí@—dæð𦜘/sØÛ¢ú ö÷'W»Ô¥ÏX•È>õ»—€À¼æeªÊzLÚOp“ü•û¬ÁOË8ý„$¤µd[l”wÓì]‡Ã(عx6èì3•먥hvuýúÃoÆþ‹Íufè¨?ÀÕ¾;¡ 8h$ŠØºL{0°J]r;N,à@‰¸,Aò•×ã=áJç‘L@Ö¢x¶JÕ££¿€ò…kC›O¹îiÄ3îdùm4NP7cÍY÷ù{ù%5/-y‘ú]søŸÖ£ÛS‚«¥ð8:™¶è9Xæ$cwÆ8CÚëžÂº>B2Ñ;mÒ^«›V(xɱTZ?£Ûß™”Òb¢ž+?³qšVÌ1[E\¾¾Vwk„KRùá^@ ¾«ð3SKbßrpS%FÀH:/·Ìô"»Ùh’>„[x|¬¸ ÿ‚ÀñÞXãÀè¹ã HÉoùešÍÒÒJ7A¼´(!zTð¶vÆœÀ[!¥Ó|ƒÉ&ÃY¢ë“b°SÄFSB1R†z…½bŠ Ô(jàzµ³c,0Ãuúâ©^^ÍŽ=K˜ØÀbuJ˜˜4U|!–öR)ûºäh`—Ñ•º£™¦ŠŠ™[ÈÂ`oe ó,ê%᪫ÇîtqòA4¤W$F¸.°e|Ñ2È}^`°ˆ›&,ï¦ Â} ܨ<ÛLn¸ÉW[³á-YŸº{:I´'M±–Ru•ˆú»>£&&%ë“ÓÅLÔ¸™¥ òYºÀô#Ñ<3ªyøKœ=qAºZ4™µ5ñˆfkO±:Cs£tñãàóÙoéyíñ¾.¦ué;´Äãà ‹ Sñ¬šÑu¬ç[DûÆXw¡w¼ÊL©qczA\N=ðŽ“ 55\ROìméw0ˆ¼<–L줘·E"Ôå™—ÆÔW¢ºKã´æŠ¨ÚkæSnT2ç†Ä×^¢$®yIÅe‰Ô† -góÁ†ŒÑ€îmuŽfIÅ«fš¢@šò>6V3ôxзú1*k)ù›¸P‚#û˜ÉºWÃÊüp¤®2nå¤26‡]£oS{p=H#+ªbðpj¢[ÍS2¨ËD˜Q40¨K˜éOÊy i¶Íq_|Öa¥:F?OI.Ý9Sã¼4¿%ÁHT‡ý¼µ®„¤$émàiÒ½ýmùFÿ2Ü› %^Ƙÿ’ñÓÕð6N"*Ë;Â/ÐûùS|„4F¤2V+@‹^Xª[¯À¨ï¬èþ úx¾eâ£Æ€ò‰Bywâ‡ÿ©Œî·ß8Ö5Fí€1ïA¾ûRqt:ÅôŽn1ûº=®Û¡ï˜]µËq{X’s^šÃç>wÿÓ—ªxé®—uÂj#r©å-zÝÜ8€U0Þ•ŒvÆ÷¦q¿¿ƒ5¹Sò ªÝ2‰œö{èEo>žÞ´ŠàlºE¬ vÎîÅŒæ¿ÌAÅ¥ K8~^Láô°b¸¿ðãŠÌ=Ýæ°úÀ¾Óö½Ó± ¼JDì<¾O¤¹¶ãˆ¿~Œ2¶Jîl;k8ÙÞ PôŠPÁƒÍu÷C‡G–¸ˆ…xŽÁÒ´¥›Efëin·{#%ßu¡ËV®O©nÜp–²¡ý”õyãeTM<ҮХM+ÉM¸Ñ ËBI}™‘ÑCj'ÚÓÅQ©­¿o÷àÅŸÿK; XÜîÑ]*YhüW«ž•I*ª÷YÄ„yºt˜@¾iä&6þ:¼´çvWÌ Ë¡YÎàþøDnĪ a2xwMþ+ o!AM(xP?•c»ˆµÇÑ¿F¨á·#p4EQB~6“Ýv¬ŸWšëÿè'öa£¾éVeµúzhÓ í æ9ÿëQ÷6‹¥TQ‰zñ¶ý">5Ê p5wß/GxI»MoÕñ|.“XñßÛhuã15ˆ%Šuv,Že;äÏþèÑ95‘]ÕäQVXÂ4Ùo ‰é–kÒÕ_Y €Ä®Èæ,ã¹\È¿MÄ=­“‘QSL‚Gbô‘m½A0@è5éå#9ÇWuàa¤wEªré.’xÝ7èp­ÿh¿vASŸ‰Ì'Ä$:gŽ’ \ÂûlÉMSÑÁ~ŠýÿâÚ_U‰Zø»`„”É6ÏNPÀ¬Cf6ê{¼fØr¸¬k¥£ÄË‹ 8H¶&Ö¸"ü¼>WÁ"ýD0Mh$ëY3Ö3ŸUñ£µÉ¡ùÙv\þHhdâ—V9æhŒ—홢Ɗb|ÿЧ»bÙQy<çÆ²Ä«“tŸžWÂbdU¥ØÄø$@aÁ}[‰Sß™TúÅ#ÃÁÅÙVxmö¬S*­¦æ)‰g߇ûi^;«G„}úß R><Û¯6*|Û€.ª’‚ªáJAœ-’´=lÑäNâ3&–ŸÜɈŸåÍxaЃJ…—µ`×\P@N¢,(í4‚!<†Ç¯s­ˆd‚31ãšÍZ³7Üô{oñèÁvˆ >)å.˜Õúðð²‚hO¢¡ƒùEA딩÷xÉÊœ+Jz­u¤àó A-újà$àÆ/ªkuŽ¢u /ÄÃJÅ&^Zùz±«-ax‚LÎ!Š{ˆÐ½TCù‹ä¬þOv_ço~:åo¸Gë¢%~èè±{§µŸ5 3!ù÷£(4þ[ÒÅœ|ÖVY^-ßó¤c £ Aþ„Épz19-×Ì« þ‡r5Òw…Àk~x^!©gôJ¯µÈCÕtC~¤ê\âšéøŠ{wùçSç¶¹þÍühZo³F@› Ü­N½V²°©ÇÚhüå~qîq¾ñq„®£—dH¦ŠtÎÕל×%GQšŸ¼5ÈoSX:Žšx§]Sm´…$ úpÉÎKzã­x> ˜»¢€ËæÙâÁà*‹„Qy^ò;§Û€Ð§E ‡æJ; Q„/tׯpÌ ?&ؤ\ Q½Fš*ì°¸6%ÿÒ»€6ÔçÓÖŸ ’—"œBz9v‡…žÁ Ÿ·OÂÛKwe\ß(Y¢¦Ã-ÀÝŽ_²ƒÌ5Šÿ}HlDëÍu{¿JQ’>‘•ŸN<¬kÈbêÐ`kpØx7„ØHØ¿ÓIf¸Ä(Ô¼úÖ ŒŠ«ï^-…(ƒÔÉí ?€EEA7ˆcb‰«¡nj;¹^÷¢™“Ñ%¡ íÁE.I®ŸÿÆã’@F1O¥¨(Êú]€ÆÃ[çnÿÃÓ ÛüßMêN áÏÚõwCgzìJÕ®˜“špÛÄx\ˆÔ=®6·Éò,l:f€ïÈušÌÄ¢Í1HPë X‡µP‡y«>Ý„ ihåß ,ºŠH¢Sw…جÛT¯Ü"©ª}†WÏ}²î™ïðFÆk^žæþ$`¸–l¥Ê”®C_…¡ ‡“mÆXõÉd×vIWnu †iÞ¾é§à¦k¶¡1#å¾Òx§waÃkêØúùxËDa14BÙ <ÖY@pVxÀÝ‹:-ÑK“KĽ }J\‘Ó”ÿ˜¯ó^êSÉTÐþ½y¸#*ò(_a3‡HÕí–º­=TmØn–Kâ äÞf){üË­{ᄇGhgCù»¾GŽŽ£ã.uud´©Þ CR²kZˆhG«è—‰PLŸ”åßëpMO!,K÷]z‹WîÑ-örÇúOÀ!q¬Ü˜k ”ªÅÜZ¬Æ›˜—1‹ÃrFh>è[ÑžVGädu^n²ØËg×1áTÈš ÷‘ðPhÿÈ LùSJÖíT âA\ó:õ>ÁHÁ¡i`©9õ%Ú ]P'žÕ.ùÔH8|nÎ7¬¼ã”7ýk·„éú>EpÓ=|ø¼ÁaeT¼Í"—5m¼2eÍ£ýr.e‡\ɸC6š¨;OK·d?‚ !§š¼0~^±`%“ú?—=ÍúôDÀŸÁ*DY¦4wk ¡u8A ûTá»ht„Þ õ‰å*UF]ôBÍ 4|óÜÂ×Bª›@Z…±SÕ8V9²ÁhmàœÞª’óu[gz€hÙò›ÍÔX>k¼ËÏûÆå[ÐY‚ìíRì3î‰1j$3ëª3íÀž6@`žÿ¼×(pâcý[{-¿~ëž¡bÂjf߲͜kðIi¼Á2ôÇHËÁA%Z©@rhŽcƽœñê–Át ¢Ì°?PòUÓùü©ñ|2}¯™Û:Ï›†Ã+u®¥ff¬ÌÖ.ô(0×{ym(ÖÑ ‚L^W~B&žG]Sô£žÄ’‘¨)º² ,3)ôÒZí‚ÏKüs‘6l\6jS(ˆô¶=ô)/çBî’dUŸ$ÜïþF±…”óì\é!ÜÀ–ÚUð6äy­J½¤Nã /|ПmùüzLÎNX úBíôJjéÆ×±£ycP!­ ÀqÞ(U©&¯ºoÛãÜ×Q›7$§ŠòVí²·7B{Š¢¨ϵÎTJ}Â#mAéµ_üƒ3ˆJpUsdûþýÖ¬Fi™†U»Mç[ŽÞ¦˜úS¼¾ £‡&&XŽ©`)cÙÀ»3rÂÙ¶”p|ú ik„lͧAîSìàðãݸ‚Á„cÛÍ-?ÏkµQ±<öå—Öä¸ë,È4ÌæbæôÞ]"H¶n비­³$ÈŸcUÄY[1Ç­‹Pè4ú*†»íù„æSSýæ?Úû±£¸¶¾E¸dþVÊᇶN'Tò¬¾h¸í•oMÔÀ\©ú¢›s"N‡d Þ4»§–Á§ ž”¶Ã Êg@ûJÜwœ©_R¥òRˆ• “ÓÏßñ»ÊJÎü”Å©ŠxLVè™}S_ìnæú¡ é·OÓÂL‚Kø¥»›¼Ô<¼È9¿3ƒ£Â¦§pÕQkhå‡h¨h‚þ¸zìÔr.{—Ó§^#˜§tMØQPoÀ8ÇÏëÄ’¥y#Z®ýwÊK.®Ép•IMNuu¦â¾Kv¶L' c'­y1—Ìq·ôþú–«¸sàþ®DVu”uh¦Iùž oä/ШœiJ¨µ4ž±ŽŽ^ÚŘ™OR¸—j¸@‹¡±fÛÄÃ:£t%Î2Ôè9S5uow¼Ñ ZwQÅyàQ=Ÿwe/<¤Ÿ Aý°{n‹™[GÁék[¼½•žñUÙtd¾Jçª>ÀOV³~ÿâ"#‹b¼{G¹×ì»”KѶîr)à fmˆm†k”²æ:Cb'_1Óð¦6q’˜ý°6^¿¨PµgÅ‹EµÕùÁ„ÐÍ¿ ãÝˬOìøE›ò4T!{qYS?)EIk*! ¶oþÀoÍõÕâÇ4ºÜÙÆ“ä„{‰IŽœí³Úm ”°Ï~e;US(·þY~·NVñº÷°6sö98<Þ ª/ìÍãÚퟕٓµE4}¯²ãJ]zCØçñ ,7ob?‹C¿«£ ˆHjª%[t¢ÃTmÚ×fä›õ¼ Ǽæ‰)oy ]™¡Âa!ñ9b÷„Iþ’^Ä×b¦:ÓìN‚Þ<ÙÌ(Ýjê‹b™\61ÏÅYEeZALÖ &Ô¢{ ÕOv¢I ô¿âþGņ¤…%›ù4æðÓ û¦0…–jšÃ³w¶;`ûCK» X£S…Õ<¬‡JñQ‚êâÞé,àÀóCf¸) wæ†Ôõ*o#JÊñ”›¥xnjÆÈ¾ll ª­ú* ]¬¶{Ëÿ†ÍSu[nJ©rÇàVŠ ¥r Q:)Å­„ù¶µ¯à¼3ùxW’·ë7A.?seKŸÎÈž‰òéê _¹¯°ƒtÞtùì/…†j¢ô~äÜ×­€ÊT)—>”dÔ€7rÚ¾Ëù*%ÞÀÐÙYÒFGûo&×!ï—qX¼Bκµˆ­5öûeà— ÷i=ïnkS´|ËãÍÙá+K?¼夵×Ȥv[‡~ H3Æ#Ršœ*!²¶¬ÍÃ'0ìÌ~ åüÛZCظ,ы✦b˜4„iíqõ㊅¯jœA [@Öí<ü`¢ºíŸÂ4µÈµ0¤Ý “zJgöE/’>|I—=Á}Gêh!݆1l,¶lúªÝðÐw½ð›;j¢ì¥jÜ‹ào[Âù š :(SG††gQ~ýTe6Žß»ae  ~’!&ù‚ýmÁæ§g.ô•…œä„ NÉaºµM)³iXaÓƒŒ$ÜTn<é§÷ßá®Kª¼“Nu}>,²Ð|žØA4Ô »ŸÝ—ßÐïBTW\Œg"ë ía WþÁ×ö3Pì½nõ?}·®·Eˆ¡€§Ô@vIìÖ?ãîc¶¦î­J˜^l¹OºA€ Ï¥9Pˆ¨t혚ýìÞUe?dª·PmàXª :‘.¢£ðD Û—RâïŸ>pÛáFBÿgcÏŸs¶{óÚÉr[¶i(1étjþ@ ‘'m%¶¢ŠAµÏ»j鱡ìtó¥X¸6Ì ±ã1f"¢Ý£³²/è’£ÇfviEÖø–«ë#,×NH›wËúBEg_¦Ù‡5%2aòá¿ú\= <Ñá¡ñöއö»z…†ºk7XÀB/^bQ:–FÌhwÛZ6r⢋zÍ?ÑÃRÞÅ9$Z*_µz*®„]¸». µ0ÅŽóAKÖⲤ¯×ó*[»„µQaÝPâ¾R~Í›*‚•¢FE6|›Ub–5OFt9«ø7JÍ9Ü[„´f’½° •ªbŽc=ÈvF»Ò?YÖÛÓHO[Í2h@¯F¯Œ¬ g~p(Ï/²#•Îc\ÂNM­ï$òmŽŠ‚âÔ2}††î„›ñwîfhÏAqo{ó‰#p E™á(ÀÁöd`¼p¯U°#U²ª?áký’,ÞÓ}o ¸2q8£g¾ ¦ `ƒL˃<_ ¹nÀ‹æSü‹NŒµU¿ÖÐ.gRYßïpIÒzƒkqy£›.`èT )ÿ3†Nʼw õÞÒéM}o¯f„Ì–x‹<VÐ5,m¾~‹€èBuúçò'øRš4:ƒ±¨YÍß‚bWpw9RL&µÓ8fHŸL]d cŸ& 5øUóŽí^ =ÈÎE\äÍ]´Š[™'7](¥ävºH½‹P¾:f(&ÌJÁùç©_*Gôn>„†®*ë'm¸ìÜu_ü~Nê舩îpùÙÈ‹Iý‰Ý.ÏšÏ`E[+@×Èc›Cžzp¼}œæÂŠ· }L–>ÿ1XSE·ôÔØ˜{Ϋ2Å—ZñËJ¸…;dè?v}\†áÉ`Á°È|öá*Û/Èö¶f}ú “ìÍsÙÐâº>¯$mž Æk§»[[ÑûEgFí"c¥Œóú g’ eøD >ŠÃÔO‘÷?lAE—QK@̬ë`~_ôLýu ”ÞJÀ°ëo¿ßÎVÉè žž‹Zž$!éÅöFý£)Z~iAP`—×gÑs#*àsÙͽòõbÝU©8uáNte ˜ûÂF ×¼-(ŸŽi3Ì”-dʳŠio…‹3r…DFà˜év_®šcYߘfºÅ‚ˆÁ»Ì{.Ó¢°ãÔŠòyAÇ|w_äæ ÄÏ·#†1ï1‰ÿ ¿!ªNI7d×ßG¹'˜ÀÁb,ö·{ÃP²¨çVÍúÓDáÅ0޲rÆH ^;ål¤8“ƒY½²x—éó]Úà à+‹_þX:Jå@ÔàL·Â»x8T+‡©¼{|Ø)p/ªùº<¨±³·µhD‹—ê €~hø‡Ô…¶UÍAgÜ8<&à$D‘9DÓ#BÈ •Ž0 m Dm2r”¥r6Eu;ùP¶¼A·99,ÍôòËhnlV'5žÞü$¿Û¼þ»˜ó­CRƒ_9©¯ã:e•@åWgÖÃãíUñ6ƒúÇ-¿5ïü'*”H‘ õiÀk[P?¬D}5¡ Â^Å-ÇÌD¾Ž¢¾rÓ-Í€"Û(0{·Kê /äÇ&àD¾øš0´œcËV·Ïàk0 È…$¬¦h}”Š–q ÏÚ²õX5ÚaZ+ËHK;{è¾)9QÖ1ξ¹KBîUf’Ò5ÿ×Ò1füÔÍõB“;¡HN%Êœl —ìktò=Íûµ8²¢Î Ý­ÏìøÕ!³ú˜  bê%ܵ°Óâ¦h–Ý‘EšH4HI›9Gó¹aÑœÍÂlNEÒRå@F¬Ò»wÓtш,^ž º%˹-n÷‹Úx‚¦ätâÎctRR½Ÿø -yöõ¦FqÔwW¶aJ4ª Џsc)˜b7{ûÀ¡öy£Ä±à5]òQá§ÛþÂþ£À%CX¿TÕ%†C„kñÌŽiþó^£Ó£;sÍ«\w¨÷²$äû‚W€KR—²4Lìš² Æöµ}cQuLk`r»}ÝÿÌZ!ؽ`DÖo5„]@Ì29ÓØ”Ý2‚0k0ëFیݾ×Jaü= îhïºp©KC…!‚O‹—Ë_ùLZ4ðž³p›qà$uqz콿SÒê”L8½‡KOE{ @ÀΣ½n{n>øßJ£Q±f¯D$R—¦Ú¯ô0IyU%ÊQtÂzSô8,· ‚JM†ÞUîW¤!tüÒNt—oˤm†'þêú®UapýÊGáëmï›´ ŠÏY‹Ž¯VÓ e}„Sç¢)ô‹Çˆué±/åïL3‰ó”ªÛàõL›ô{*+Y¨:/ÏÿGĬ*Ò(±kQâ¿è~-¾…Æá§qùå£ÀB±Í(ƒe6-ýZ<_p‡)ÙrW¡ÕÉÜQe'4’ |+ìÁJ$-{ÜÈ0Ïÿ2å9Ÿ"é¦R°HFÊE/Í¥³_MD9ÌN‚ ê+ÕÄò^…/*Š«-FAen|2¾Ñ^Žo¾Ìd~[bÐe÷ÑE Qý¯V³òàñÚŠSŒC·X»{4„Ü þõ ¿òŸ˜Ïß+Àáh’¨£gC½º=þ¾kz{1F<›}+ikQ(ZÜÖšº>$žõ+w ÃÖpÚMH¯V™Ø9 ©ú¹?Ýâ¿Èʨ¾¨ê'äØýþcñjó5yh}}V~ùŒmLbRt¼„ðŽŸi„èÙ=Ic ï§«)8$¿¡Öci ¹-ÆÔ—ŸH>âuÏ÷Òl˜²À¾µ‚Cð ,Ynjæ€ÜÆcØUa]ØY…í„xBÁ«è,0[‘d¤½Åj½¿þ6“hkK¼‰™+È|¦`ÚéX-I˜œ¯MFñª6\zÀÑÄ©æRþçħvbf‹#sš~®Æf¬=Ì©Tö^F‘¥›7eßH¹iÚªŒ–$³À(Ê–°U†y v!$UoÁ`¬EZ®7½Å쀄 "yºÆþ¬«&[8}CfˆAdŒš3nÓr/ẹݠ¡8†g ´Ý|~½Q ·S GŽkG˜­º/@Öoôµ%Ý/>RE›Xar¡–×ëFÉtÂó}kèÔœ­hÒhAG³´6>RÊ׋«ch«„²‘ÀÅ`&㉫pûŒµÖ[€ö¬(wÇÃ'Œ{•Ð~–Wt÷ef:”×ÅxAéׄqOÐmtïT&rÅãækï‡m7”[¬lV ¼%×íœ{—Õ[&¨UpÆ›¿ØN±>ßkß ”Y>fñ‰ûã¨>Y&º4صúFÄTRÄ.T{U“€IBº«-%3_9ÝKÛvµªxH‹²]Ïžˆñµ5¾£‹ žõä|sªIB–û‡²g†û.•2t–C¼^øçiÿ°)ub¹$iëØGX‡9Á`„FckûçRqÉ)­˜ÒCg£7 d”óP,V,ôþOÒ¹”QµO¼<1xÓ`ã4œ” hlæ­œÑP¦m!þˇzFyþÇ uSìB´‚ ÎÜ”c½T»R5µ<*ˆi–®»è(É8´÷rIIh8D”T Ê/!vpŽ·ôœ¤™ùœ¼4•ÏÉŒ©îw¦Aô°ÍO—ŒjãËX2‹=±¢«äØNñÁ<ÉYOPO¶¹@±ß«ƒJÁNY¤pþáER  ™JvQd(¬ ТÔçiÑS5TˆšªàÓW)ݹï&%;1?“ÌWJg"ÄQÏ£³˜ýÆŸ.PlåEª]‚Å/Š~»´üDO©ÑãKÊ }|htÿu+ 9Çrœ9<¯La]þQÇ¬à†¤©¯š\EŠ{ª?Êbm@¯—‹ý<ÿ0!)”,̵?'x ìó‡¢{CõÉüø¿êö Ð98EN¨]†ÕðÑ.í1åî±P:~ó¢ï±qÌawÆ”\SÃ&^céÿ%°ÚŸÛLQŽKÌ•hè®íˆ­¨‡+Š*õþ›ŠŽÑLvÚåãŸÇÞ„ÌçVÈ%„äþ&à½ýÃÔè+8¢Þ2§¶¿ƒÿ+ÎT(Œ1>Í’­8.kc®èXÄ»ñä³0¢€t€9šFªKÍ›ØÙ_ƒÔ÷ì'¯]§Ú“c[¿-‚âÉfã‹®“eí['€.ìÙûamf[’øy´æ[ {ø¾Xáý3å«Ð¹ú¥ |«Eë")& dfBYN€·ÿOy|¢NªŠ:äåIžÜ†¼ÀD‰sèÅ0• °§ 8ÂókÄ×b}˜ =Š ü‹KibolZ]N>3gz—Z1ð/»¿ëÒõ)«“hXÕ[õ<"¾Ä»Lx.{s"5F±$Wµ s|xÄBþV¢m(oÇÐØ{Në;‡°ÈqsUgÑ9v›1²²x>eƒLüës᛽±%†0U¥D¨ È/çê\èâ)Z/‰/üÜavÈ£¥][ÉØ›EdDŒÄMiú|ü-ß5=™ÀJ~:“£hÜÚ^v `Ú=õá)±¾2 ˆ=/&ó®gÍO£1Þ¥7;[Šæ›=½›2<öí¿ÙˆæÐañÃtheû«¥v"WE ÿæOòñz&5’>Í4­ßŽx°ÖñCI‰-Ô’>¥¶µÒB¤ž©‘ü9§š^Ñ;÷ç½Iw·ˆê§$ªˆ¯ SÄ€hÇì¡«qûžH2¡Ëº «Xö”g<?“ÕÑÉÙª"¶˜Èl ÇPF62aá©(ýGqyÁ¤.ÙOhŒrºeË[B¬ºAêÍïæðjÅÖÎ×nÿ×`CàN»“à6â&ÏJºŠ[úÇaý„ Äz.Wxl¨å,¨IËÞæÍ !ôæß1ˆoa‹ûªëÙ éA¬¡^½ž=ÆŸèÆ8YÜ">Cõö"Ìéáú²}@5 V3ßj S OÝ••"H®ÑèÇßr¥I2öæûÙE>ÏŠÓ4ëŸÙâbjCåžù'W¶“×[ëp™ìa3OÅ ü{Ÿàûúºjùª‘ 1èø„  ææÆù„ôœ á'º-n£(4(ñ_ÍOEùÍBauGùNl²×VvøßðãÏ×a©JÄK-Ë^B­ƒ>k™Á&@â ´¿œèÖY[¥òÙÕUžòñôj)ÕâÆë#’lÆ6p;4¾+°™G^Ú^‹í§ÙÏ'M­+äi\ø48{n³Î…2@ë«Ð}í®‰DÕÒøÙ1ð_ Vù[iç°ì,4øê´j°Ô¡óÆ 3¶3Ø’¤“âÖ°a„ÝÆmJö3r(™! O¿ÈäKžSpJÝ÷Fô|ƒEHæ1NE9A+5Q‹¾iO^ÂÓlØFˆ5ÑG—É^‡K½ËC‹ñ†F-YÑ]lûùbeÁþ5ñú ¿ñ!îb KÈØý‹½VLàû¾>>>i§Nvз‚!ܲŽÿû­È“cÁ‰<‚< ßYÿým`cQV…³âûĈ;"ÝAeˆå.W‘g:ê€R™99ϳœMæÕ×jòËŠ‹2ˆ¼<—sáÛg¯“Ò~ÅL¤'PcÚùul(l‰?¬'"èúEI+a\à~7ÂåbÂ}¹ö+fwL>S2`\¿Ê†?~vÄŒËÝ[³ÙÁ9ÁÊ>FŸ#4¨ÊB4ˆ­b’buñ  gÄöç~ -àm'˜«M©ó†ßá¤êЦþ”½u $-j³5’Š„Ènm*Ú¯Ð߸Þëžy´w@ˆ,6ŸÌr¬o¼'7ùÓ­ M‡¹Ž5ýžÂ~þ~«eûÇ„·q°Kuö‡¯µ ´(á0;û•BVƬŒCU±0ï9•»‰0![ï^‘A7¨Æ.ßÔɦ?±“ׄê¶iiú³?ÍÉ÷?o§8ªè¾¿¬}‚'©aÝÆ.×1ÈZ·€Õ:4¨>E>]œNtzº>ó ñ4GP[ˆ6*â¹™Jpèô±Í¹Ë.¯jéš d¢féý“É£ºyò!Ò/*äÒ¨NøÙ,þH\nëqN<˜–“ëÁRñÕ»û{-tEšTØØí5›¹þ³)é6îuu|cÏx7‡Üb4¤—w<ÓSÃ3á2ï‘Zúˆ¾ËÚ`håŸô’­#Œ—ÕÅÚ¤EHº¬Æ%Ç^üN¤²¾À|9‰z<ÊŒ/@LíR €çrQÜ•$µúšªÆ8øKùå;«Î.¶Öœ™Ã¢ ÀaÅE^&Õ ‡2¦YçB¿z*Êä¹û£J8CõþøiÆã+±‰×DÓZørg3€O‰MüÙÈ‚L˜„Ôž×5;úa¡±÷ÃɪEÉ![÷/1Œ%k¥ðßEYñGýäØŸM˜?^Ú«f¡Úݼéý^2Þ ¿û0[%ªð68ІÁó RÐ"³»¤(?•—M©¦cíÚoÿp;x…Àðd‡òæv92…'˜GE¡™‚½ÉJ>0-߆NB RrÜëF§£ïGV6•Zga0[·ÄF•sd&™½»v|<ž) )Ç‹ç+£]!.ôJȨ÷6]t é•÷+‚²:_¼•&@A! ;êQþôˆ_Ø-DáèâjÇ*’2w˜77âí°R÷µÏÝ,È 7[PJCN¬„à-J®T´Å]3Sx¡´„ ÉF•íË!§D5iì†éæõŠ:@:!°äJÙs£Ü2‰xÓÊÛñ$uÆ"f¬¿$¦zV&£¹ZvX´ k[…$8°<²I‡ýLÅ|YHÖ)êB¼·ïG>Ÿ‹kç—m‡ÄÚ< PDÃYyà?:ó¨mDˆÛÓúeˆBø•#Qbí=¦ÍÇvË›º/Tõ¥(†.ÂòúH«¦·ˆM©CRwps©q‘GTtÎyÚ¾æá§ÂiŠ}«grfºÌZ·òD¤_ì«0™xL’Àuh 6·UÕ¤™ 7F´Z<1$¢Ê¡Ì=˜(lý>›ã¼ša”8Ÿ‹—RÕ¨_pòß I&WNÝm·3i ¿¤èDÉlù$Ø+™1iƒ‡ü€-{æùÆËj¨+6àÛYUãÔ)驘¤z­Jè°ä´ÖŸP僧^7:Ú·ª>°B‘Êß”?æªZ²?ÑÏvlú´Î̓¨£ýGA®Òá”úr¬IZãT¬âXf‘ó°¼ñÚÈ®wÄjÂó•û¡È#м-¶c#ŠóÌ@ËØM¹îF‹ž¡ÖÝh}fÛ– OK+'5.W4húç'&üþì*Í&Vf™E¬?g³:8bVy0¾ôU&s'ÅÀ }6t%½øêŒÀy±]âÃ-½:¤ö5T_¶ã$€ðk~vfë]NoU›µapŸPÔ¯ j¶ß.áu.Ó Êr„YÒU©fJÉ+aaÎÃ,bT¿|¤MT²]-K ©Æ SÞ§ƒwMoZ‰TŒ6 åµ oR*«‰3ÎtÝ€ÜK¿+Òí`­L´[Œ?±-º“TÜâ·ckC=§;XêÞÅò2:©Òáä®)?ˆù[íeÁ=€®®ùÑŠ0 ~+Ø¿¨œšÍA‡…ÆÅªáùÁcˆO€Þè°³ùœaM^µ¸DeE®`)ת׬‡è·—3¾ #Å¢93–„`½X¹¼øbâ·£ui¯42ŠÁgûÌ1—”w3sH™²…âv˜–uSøäÏp <”ÊGœé“ÖíZ¸—-AgGŸ‚<·æ”â—È·Àç°Nz¸»SYøÊëȲ´­öSøgÁº <äÈHàLF¹¡ÚôÁMaÍ%kÚÀ œ¶ä?x±HM7Ò(UuøÎËtT¸×š3<+°i±Ø¤÷F«t†$‡Êr:|q¨ÈA÷hü8¡Ô‚HœjËîp`štÊ»ó쉫q“ËXF«bN/0 [¬qQ oè9X´îâ»!âQ‚õ0ºÛ_š_Pëî.ÈÀOÁ+7ç53× •OϾ5Ø»$·rÂêmÖ Sz :½¹k '/kv¬‘W”èR'><¤Sd9\À¹nýîàÆ¯×Õ… çç›x¼oZùxÌ|bw,û”[½Ÿ3] x[˜IrT%teYn°C6¨Ýõðû,SÐo1&… P$aió„Šl,-WÌÈšAxÁ ö8Yç,À5#€ë‚É—©ÍÝŽEÉãXÙ£Ì?¯„\— …÷ÑÉwäàÂ×í¡ðÍ ­>rOç|ÒƒéÕŒ?ºáDVJxÍ„`\*-7¤ ËoÛh™ZYJ]‰&€ïªñ×_äË*<¡~ÄÒ í¿°=†*Mæ¤ ¯E+8Q|oòï‚õb>8a¼-œ29É«šðØ¡‚eKû:(œ™˜ç¦àÿ1¬KNåÊx^íbõ–©OàW†Œ4aИ<"¦#P"Ô{“=q·<ÔÎpÐLòú„À{¢MÊDˆ‡˜^|@‘•R†¶"Õº£Mï„ÈXÇÍâé+fuøË%ó ‡¼¼…Eý}+P\¡ }¸£•¢ZgЉõL·Êñ)û½§›w‰1l>Õ*ÿT›î4ÁòX(p—ØtbÎrTt¦òç­ Ïr+߯Ó-Ê‚3Ù#zÂ0Iª{$’Œ—ÛB¹tg´ãÙŠ³BËqqߛψêªú½«|ŒÞÁ.¨ò øš~h#èrŸŠ’2"àµÛ‚ ™Ö|Þ3M•¿œh˜IB**¢>'Úqðq–ëX¬nSQìäWwÊãP’lËWeܯ7¶lÌv€”ºµsí1¤–øÕƒùUízP¶óÍ5¸P1åQƒ¿ðÍýT3ÞÜz9¹ÒƒBIñÏп×Ê{ƒ€¨d[‘ñ¦ÇøY^–ÝÜZs04 ÕÿW¸â¿g°ÛT¶d4-ã/ ‹ÉÚÍt½†V=S)73@£OT0/ò¼²ë–OþUz]¢ H™ZQA½ÓïçPÓ¼FClÒ£ÔŸ‰ÑY BŸ¼<)C‚üæ$²è#=‘zˆ6§Ûi½µp$X#i^jåÞÐ,/ôì…¬2´ÃÏ`:l¼åŨà_Pç»W»âBé~¥'7qúcO›’†šzê0hœ¬Øž¬96F‹ò0‡â»_M§.Ö5dŒ=9ËOu‹207K ޳ˆ,ãÿ¿O{ÀA°eÐŒ|(tj™“¯z‘ëׄÒöº¢ØÂRÖ¹$üÏ[ÙîþãYQRý€µëÚ*8敞 $¡LPô:¢¹ùåÄòzùÈkªõ[¨|¢œÝ‘¨Ó3™(/×t½¯;K'NF«zyÓ:<ä|¬OJ`–=i¸ÒZjhâ¹âÂ4²•uµP]þJoÙˆ¯x+MÈex°S×é^Ó­‘-q8BÅ+ÄüG99ÿçäŸaK“DQGõ*_â­e­šþõvç±²ÞÄßJªReÕs–Q)ÒÓ<ÚþYi…¬._xŸ—â+‹àSïaToê´žfw­¿óS×›UKÒ¢sí0Ãîr Ž]cöú<‹¾V¹åƒ`wò¥¢Ž¯ñÕ¿Uu„^£JüTÎärpGa®*`ÌbãTê[Ãe`…ÏÔ·åÊ1Ê÷‘G&åÝôïó¬•㢌”$µ~G'|þl}Œ†‡–ŸÙÉæ}]Jí]WSU¶œßh͇Ö/S\q>?]AC¥ë-–ÆDK/˜,—üì&©ÂózßǤŸn×Ò&¸¼ùF,%Í”ýašôòÖÄç®·–Ží,à×ô;ê5úÝ×*9ò`¹\}…Ûò@QÕ °gü’½Ö•Ve²DBÅÂÇÏ<ã¤íßðœ·ÑËOÎñÌò³¡A­ ÈA4„¡H‚½Wõ4˜Ø%›m±Tbuoªzò~ª’›uÌ´¨ˆäyù–}$À#‡"F8xv‡u»­–Ža:aRê½Iá-Ö™Ì]ôeOVœ#%Y‚fòR²7ºÂéÁòö3¦€jWÐoÕusÁwJˆæ²b”Å[¦Ã0Kà ú/‹Ü0Œ²ªLe•oõ³ Î2`Þ×ûZœ)tœÃ)„ÀÙõ Ý3˜ãÞòÂjþ^åkj–ΧT-gD&α¼?¶*Áö %Hm¤ð ½pW *¦u ·ã\ŸÈKNÊÿ-ãëŸ 8bb­PµsD”œÃ6Q»µy[ù6NÖÄ㑠ñf1dèLÜWáðSÐFë»Ý§…zÏ+×ï ¬=ìå2©GéÒܤ©úeᜠ†èf0-~p(!ÉGÆÁÉƒÇÆçÚÎô:¿ëá¤Á×®ÒG; ,ÓãXµ© ;çƒÕ~£h¤dv7ˆ¼°IÕ}âÚK ëyGUq‡ÛÓ ‹nHw0Ãp0G1R–H•ž@1$oÉG²·­ƒË Mòåb"?ÊI¤í‡çÍF\ƒ<5‚×.#¢b7ñ@kDôů"r¤2Úaw¾Š* ¾noóßDqR*ã…«³ð‚‰Já.Šnš®e<¨OXélYÖ郦үøç úШf÷8LkkAü]ƒ¶ˆK¸EvÚÁÏV#•%…Kfñ~âmf”d ×Þ 0k÷ò'Ô¨.Û+î o“ºgpSÔ²×ÚŽÑãrYö•§=îpLruß©2À­{À§Ä^ùðìÅs¶²~0|ƒœ¼üˆB-µrrí¾b4b&4ê–G „6%x—󯿡êÊçÔ¢ˆƒëåÊŠ™œ¿!Ó'£Zîø0i=ü˜ukˆÔÒ½N!u§ÄáÙcð#­[礙Är±Â6cLÖ<üHËg ˆæW’OÀ6aÙb>¾Çé€/¸Î!\"-È– =Æð¶Â©•SÄwfŸšõÅõÎn£d¿ìçÔó3”fI8æþ´ê :ˆóð<{ ìö—>k÷+(ú‹R2°¡)nГN•d¡´Ã§ ÖwÛI°h¿æÉêÔ@›&v,ûÐêTÊ\ö¯jg$+Ÿ}øÌMx Ï~|Á#XË––0_X£{4é•’”XÉG2¶F¸žÃËÊG˜Êö‰=âÞÛ•?»ö.3{\«é¨ìœÞï!´ÛT!BúiÅìX („v«&DïI9}HŠ9 FÌqtª$Õ Vçê8` :'!?߯hÕÕr] sf|6ÌodAޖͳžc·Ä4ÌìêI&¼k P¾éÖ]Õ"·±ŽÆËa†CW=†<$Ž®¡š!΄wôã4@•«?0!!À eÄf†­³ØNÜö„9ORgô%®/#ë¨Ö³£µ°á °Hæ–,V6´¬ÔSSý^+<ã>Êf äB“ FWÚIvèÙ¶"­ºC.2I¼:`߯ɋYÏ»®ÚD„œ Ö.À]æÿàmÀ]4u ,“æ÷³õ"§÷uö±'ž•ŒÔ+ˆLWV4#3ê‰ih+žp¯:\CIèd8UçýÒuÃ~j¸dBqHryV/C‰Ê×ó&ñCKìȇ<ÒˆFí¿Ò<û?,'l…¯’T*ÙXŽçÎØ_ò•ß²Ò-—GÍI–ŽxA4Ç”³ê/.ÌJ¹ÌÝwr˜æiVï¼öC³)ºh¬dXîÚêæEÕ¬‚"êný“ç¢ÝÜ'IÔÕ&Ù)=N÷ÕôfG9MWÛjOŠZÿ_‘£Ý>ù2ÈHÙkþ=ô¶8™³@Ï:ΘËìqˆZ¶e»cfÜÑ—3{Õ}—»û÷»›\¼µv0¦_a½QÍ®CfF:(RPG!ZÞü\tã=“ãELþ!úἇiÜ— è¦?3ò3[ÇÖLÍz>²Ä?ûÁr|e’øóZºá¿ Æ©ƒÚÌÆÄÿ$(7úÜÌt¯ìm÷uxYçEWŒ>,e£&>Ò@‚­'ÞèSåÀ`•Ù,ü->uì`ôy‰¨YBY`«eÊ=ùÌCú€“Ešƒm"]bâþý¿k©ØcN !Ý‹{²=YÚ¹ìÈÞÓ˜ªê!ÛSžõØ"Á#Èr"‡±»GïÅJǵ¿Úg[+ 鎇ö•,´Suý§T 7bÂs†@X±vƒ…£bOâs“—£ŠÈ£`à’kç âÌàê•L×Ô˜&=µ‡ÃÉÝ °÷Ã2U„ ÇýŠøÎÆÌDŒœ-î«eÁ"Èv¸2aÄgÛåw)—²ˆ' KëÒî)Ômú„æn"¨umŠ™þ)K6jKé×ýnÎÕÿÀì‰ÌæÞ{›À(vµïse,Íqü†ÃvWÇÙ"C°Ÿ?Â;x©ˆÂ7 )âæ~Ž^†2òZŸ˜z¼ûp‚#ïÒµ3â €Ä:ÑŸóÖ—Ž'=tlê-äOj€eÿ_ÉÈÁ~¾ŒìôÄê!ß‘ªXP¦)j0 !縎™QƵãJ?<¸þóÔ¼+I =LJÔ¼r³¢Vçã½ØÅ Gû1 T“pižÉí"…ô{{½8ØÒü»–{ ñQbIFN8zFй©Ú«gB£–[˜˜Êq×ÈÞŸr%ï%{alô/w[6,N-:ŒÃ éb;ÁÖ›ÖAtìÎJ¥"®ä Ì¢ª;uö ÛM4`=Ì-¿föÆiE tݱéaC+Ñ„Rš¯Rw G8KçÔâ9®š‘91ÈÎa ¢>1˜MkAA¸Ë ö–ôSÆ—=ãÞà)€¶4pŒÿ!Å–Ä„ñtÓè%!ÕÏâ¦{+:}ØD*Ñp™´Ž\«ÏðÆ9¶7 ×Ir™K€Èˆæmý;iê~€‰¨ó°ÀqûÍuT›„} áS_óVÜ¥æ®úÞO6/]ýóX¯Nu)*où_–x‘k<ðGy°Ú̃CöK ‰ŽSœ9ÔôÚÿ_µóV9Â5ÁZ]¦ â¤â Jf3ÞcîüZõ#luŠÁj. û™] Ó½ 6;ËÝï#fF¨.Ð3ôØlõ¼Aà-*¾'ç÷'¢m €.„ž½p‰õ:¢ðû„K¯ÞØÍ}Þ4|¥» ˜¶QÄÌrb2·L¿ÿ©ªÅÿÄV¦Ñp’€ñÁE­]× Ûœÿÿ:ÛÈJ‚˜5†²xIñâÁôÝÚpƒ9ͯ‰_b^!îFÔá´~Dôe•Ujµ?œæÊ9&-ËôUðL ùlf§âÕ]ý?€ô~K¸sŽöVÂwQ%á£ï‚NÉ€›¥º {, ì͛ܪwÚŠE–91$öà‡Ls6,—–…úyÜÛVpEåI»ç¤ÞhµÖξþ.ÎiC¡ìtA¾1`ŠûÑn“ŒÝ\ñ¿Ì©Ÿˆ”awºÛ‚–0=PyŽ v_lCׇzP·Ì;O :¨´êß;D-UÍQ"ðÒ’$Cˆ‚!Ý 8dªŒæÏóˆ†%MBÇæp$;n¶Á¼1w͆²|…ëKMÒR‘°q’ôÈ þß~gn´ _²_•˜Ç7f®^öo2Ñ„õ¤[á{"~rÕ 3îþû¡4€L£ð¢·a‰øüëÚ×”¶¯J#•L?lŸ¨0_Ž»¢¦{à×¾µÒQ£m}Ïí%p?Ðÿw-wáã`IÓÄ­$,Î ½scáêMX8Zñµï“$¹mÛ1œ‹ټø5éåtš_…ýË„¯‡Èqª"6ßdoBÇ{Ž¡Æ·»)š˜ˆ}¬çffÇÄOM4”pJ¬Ž¥é=‰aNÊ-•QýéäLUMcsŠ;×Pe÷MÚu{c_»/ˆT¤Òpªû>á‡f)rà&Ò«Ÿ †s"0þÂrƒsFžy/¿Ý:4áƱ¡bšâmçĨ¨ñ)Øs‰J“Khڣ̦ ¡ºíº9×&©5XðÁsì’€ý/öÙùïüÃÂæ*í‹È^æ2a(áh4ZŒ ®Žíý3Ý×” fZ×däy< F¦Ú—N©ØšSÖé S½¦U@›P„qkæÈÛˆé@j¹æÀKá5ÁÀœ]æ%'öXãyGq›}Ž2Dþk’áýñí9€ÇÌ™|“iÅ­ Ê&±©Çˆ®#ؤ©aÊ*Šù£§—dt‡ýî_‡èûǵÍ¡­C;Ž"§°r”8œf”,LKµõSœ|«ÐíÑ”%!ØëzóywÉD:yž«a3;šÎ^l¹³Å¼¤OùDª‘£Æfx|Á7¼õoô¶uruqEÁ“L:Ââˆ?X°ãØ%U¹™jx…’GY:Ž,4ƒž¥ 9•gW§ÅùN<Úç"’{⬄R&FAÜõ²×<^^Ëœ2©H:U¬²[$ŸrÞÓØ’Š¥Äž…U¬ègÄ‹‘ÀìÇ#ê­ùsp¦J—ízàý„÷lìáÈði\JsÀë•æµ®ÇÌdXLL|¤ü¢ýMs®7¦»3[Ó!§™U╤ %elËí-ÖààH¤BáC;t 幄4c×ÏÇ©ä‰hÔʈى𯴃“·SN¡iÜh¿éóÊQ²s@9voå9n%wóû_Í…‚ y #ú”PÙ.9“êí.„”øP^»åà K¤ ½m¾Ø±G HlsÚœNÖ €A 9˜6ÏÝW.Þ·~¢ì6¯tP@À7–£pK¿ÿÈ øF]мÍ>V¾n·Ž…§ò5ÓÂÌÍ¡xó…ö囘Ê`‰ØÒ§ÉØ à’…®ÁŽ>ê±t*ûŠ•I0XjNÏéæ(,N´÷h€€Ïk{Ð`,àéí äç ,Ô?š‘}Ù¾±y§âiªXKñ?› ³¦>yv=ú?C†Q÷Øâ`Å™›&+U+AÞ‡™Oºê‘ÃÅãÇ›5䌰íÍ“T¯ÍŒqÞ¿eˤ³Ÿ„­ÿšà£Ñ U§k¦/ÏÖóX¸ö¾ÉÊ`n šƒé€e;¢*ðKçv6ó}¶úwY]… ”É2Àç®ö§»~V,žN?cåÉÜí¾œ¦ Þ&žE¢3ž9"Ç)irõ+b’틇›×à«‘U¯YT}På7ñn•î¢^fÃg2›Áñnƒ­ðÓÄGºnš¡ƒÏ~ìüN.tŠ’-ÂV ÄÁݱ56ë„6ÔꎖKs· qp7…ñ´Q<ËžGûÀŽ¿i~^ìï£ EýQhAÁ˾žÚJ[Ô ÜpBdù8›Ïv¤˜‹‚œäwÎDüÓÀ,Õ^»]Éü÷‘hñüN6Ât†½Ö£»®†¸G ’CA¤¦J\ËBÉ–,>Ê£&ýÀQõ莈¬,ͼ1 €u_rì×%JúšKj"í°š–øŠzO]w!÷7JŒ¡QG³3¶[÷›R`ŽŠ†’ícT )ŸPb뮺Ó-òä­¨tñkþ BñN„#>y…%«¹ÛBoRÿ%}p¤×€È†DD…÷ò¦zz3±T“;Tà1 ò·â„;9$"Zoä ˆWÂã!/w©Ææ}ýá]º¿#dP³\·lNøö§úÄfä3gqgÚl5|{ÅÓ¼ÅÔ¹‡°Tm׎ϤtýqWy+ïF1!¸(KlQsñq(ŸÈOÏçudŸÂp3;Fßí‹g8EÕ.áù—3Ü„ú=ÐøJZÿ®ÛªÐÆ. Á‚jz’,æü·_wáÔöŒA &†ýà{*SLžù­¢„Ÿe ÂpG[J¯ÙÓHv¶âu !µÇ:zïl^|´öÝ…Ê'm‡…pqåüc`U"ºWk’ÄEà–=“D=u Æ>â;j32vþQW™*¯ùƨî_ýEJQ9‹ÝÇÍÎ"ˆx¡IËMh¿s FB"±ø©Ý+Æ8+ÚPÞŒu H‚èO9S‚ú„꼌lÀMT38ËE’ ”’︆”¨ãàyK„àJ þsØ4w}ÀWòíê+ÍŒÀm<“ʼ†´ô9¤Ó™ >¡ðG¾ˆ(^û•¿ÿÁJA®ô¤Di¥7É=ñ<žbzæ¦ÊªPÏ:PzÀ· ,—ÊÜg¼3]$¿›FóìcºR%ªe„@¤É=’§gb=Œd¦š;!> ês1ßb®¤ûe(æX¬C'´ø{Xú]/*#9%Ó#%ÿG—ˆmÆç@GªÍü[„(±_FжüÕÎÎ,³8µ—LéWö•'´ÛᵜӰ*\å…€7ËXìåÙÒ=}ü»Þ³1q*Ÿ»¯© ¼4*+»uý‚à´Á½X¦²/j®•*@CLÐdY0q÷ì¦Ëûñ;·qÈ[Îð¸ÒK¸êNpõÿ2‡ˆðr€ì—¾[ÓOå¦{çðõÄ{ÝAO%Ïþ=¤I  -éNÀ,c£[¾uªà‘0I°tÙt$ôºý5x}ÈÏ·Á† ’pÚÄHzi§züoQîUgNöÿžø–ï9¥%ï¦Y¿(ÈoU- Ÿ?`z(ÎäÆþD‹3-*gÉe²‚”?ÜzQFáɾ_³ÓØ#Êg:«TBÅyöÒ9EÙ ,–²ç3Ræ·ç\þ5i3 È#¤^èÅ* ûy×e‰QÙa7­Si5k«ó'xLe Hõ±Ì¢‡ $úâ ¢Yñ<#¹â`6tÙÉF¦LÏ(ŽÝ¯Ú¢Äñ iZÓ¾öÙ\qAlo'Q⓳$O¬ƒ-r9²<¸0J Ð3lílãwÆ~ä!e10Ù(¿Ç‡”lÒâ+Ñ–úƒ0rê@+‡y«aD¬³´1‘i£ß—lA>†:»ü×qêP¥^UÄ9f k½!Xo þºüw€*œü»HÁU8Íó "Bݘ/â— nPù LYUG–Ù¦YÝ.^÷{žÖ]­Á¾Þ¹¿gÖãŽKJ± » p\.´EŒô>$ó¬é<ÐH{®®~‚ç/ÚÆê¬M…Û#èú4<8¾̹jƒbΣ½üaEhŒnÚ±oß1Ö8°•þ!)®hp·‚A‚è:¯&ºú@´¯ü¸ï¿‹w¯ôË—a;¬D›g Úˆ §8VõC›p°4b·žU‡ Œ¸¥ ÐŒ’fŒ` ¥,nû]¼êjŸƒÜŠPlWc0;AmŒHƒ`æ2=aoöbRiX—Â-¤ës<(ýÑ9%ÿ>Wd¯IÚù1¾v¡Iëp ޼Û\•ÀG= :XÉ/ŸùeÛŠÙ‚¼hå×6q/i¼98¡´çi[9òË4çÖ÷(8H mÞ–‰µuá©·ÌcïÛëÍŽ¢fðpó?«‚ØÑ¶Û ãzfÏ»œ%ox‡#::œ‰Q T$Ó5eP–ßr†ƒC"KXµE¹wcÍ|,v­é}¤¨Ej@¦àV6–X–~ã<˜»`$ˆ_ÅØL•/va®dOþ3±a›¢à 8´83ö«.O×7 vàëyõ#}xhæk/có(‘ü™}=½ç5w§ÈVé?¶l1Øæà9_·64ûS5©¡û]±Î¼?o$qÁÁúñb“QLY=¤`Ø¡,,':ÜjÑrýú7g™üYÈF³ø¡›xŸüPa’"¾I[W¨>£ŒP>«Ò毋šgÕH'¦2uà\Ë}ê±²§ ¯R X'üû4Ào®×äà5¯²î߸÷úˆ¹|SÃRÚ)ßæ®öa²Û>›¢IFõѲEÛ›žDyÁð#}È¢Oÿ}nl½Mæ[üƒ9BЫFÝ ]ÞŒøóŒìëý‹­ì«ÿÖçˆî6¯as’tÊ?Hàè_:<1<ÎAAâí¦¸{›€fÒR]b(_ÂZQg£¶£êYZ­ý.‚RI£î/¡î(2°X;Õb©Ùó±}M·¢7Äb¹òª³öÿéS…ZžXS9÷Zâ¶¹=«\&@U½ÁZfþ³õ“%XènnløeÍK5÷9—–}]ß,O&8UËV]ÁN«×,n jÜž>,íè/tª¾¢%Y"ŒóÌãÿV¤W¸¹ÑÖÙ4'á/o¸0ï›Ä"ut»„Íà‡yg„r…€«¢Æú]oá=4n³Ñz»‹{3ƒÑ•ö÷XJìv\™䬯5¤T†JÁ«¼/®¬ñI0ècX†“W™”n’{}”ÎT ¤CšGv´H6¬Θ(Ÿo€Ð8MRQi{ÉN•›Z½°·&ûü!Vüy?šü ¦uäucs©€+c{AñéÆ ©k`£»Ä©]àSòºx»MŸ+ÉvùåÁ¿)¾ÓäçiQSŒ™ª}Ϧ'˜µì’ƒ»]eõÎËä|T:K| ã?b0*Û2‹fºˆìÓ¾MnhaLˆ;rÝÜáz¥`9µOJ˜DQº„=9ð)†´N(ÞÄø ™‰>s©‹høv°¡ml_ÚZ+6÷¸þ°qÝ ¨@[v[-¾e®ä±Ù0î¹qª©2 QqUÝrZ´þÞÍ«ºV¤ÎíÕ½‘i À¯*7-é4¿‚U™Ú g!ƒphg¿ºVYúM³¥D!²ª»ûÜï¿ÌËT5äRpÜÃqÊ™Á¥å,˜1áÞ6¨@¬IßÚÀ‡õr­ ½ÿxÎÉÆ*3§ÂÄ옼6ø5î³Üp1$Åoj£ÚýM1ômF 9»Aë×u¤p¤~^RÄ:ôÆqòæþÑ!n¦ö#Š "Ãy‹2îfÐ3pk΢JýÚR;g¿.hëjêKmzö¹JŽÒÓìºû²uÿõöŸìop°`(\Íø²Ë•XrÍF¨ÞW0¥‘Ò<¶“³á–Ïe¶Ø¿ÌÏ[b“IäiLÒ?2¤ìê¿¶@Âв ¯ñòVwf¹'ž£˜Õtæ'7¼Ö–]yKˆ{dou•@£–³±â'Ù÷ OzÇs ™[”±®±*Öó÷ûNçÔÒ”/üšÒ|»C ?Œ\’ªÝƒºr'7ú~ XpdŸÑ©f/7<{{«[ÏÈ2ÁÂ᪠vzÎÛÇ v$3T «¢P•hæ©aqµ-•‡i Yý#v0×äJU´óòûh%¼€z=˜?ªŒw‘|Vëµbsmôüð`·T6ôî’/Ò—qB™;dnè8 $}j­ˆÄ²–eL/ž€h*›n2·“l4uŽ¢_¯çCB•µÓ Æ, µ†~ËÿY…YÛì҂‘đÖuÞj¥€ðÆ´` ÄÅ>’„øýEcl“c‘ª‰CÌ ”šö¥ç“ȸ•‡X7d”µñ7¯igp’y¯ÊÂáF*"Øÿx#ȱ¡Â¢'B†D¤W’~<4‡XF{¹.-¡y G/Œò$’<ò¦[<·» —›@. u=»5}ߊé©;<&Vˆj¼7“Fˆm[üö~µ8'³ÚNž«€J¹.†ê-ÿ Z¨q-I„4Æ-ÎxÝ4;S( SÔžkó<ä<Ó (¡S‚Ã^ E¡¿s¢R¬£¹ŽñA°am©gû]c³£ŸcØI‘7¤‚ÉbÇöQN/îÆE—¥Ô2§²øa@n µsèHµ«¹D`.'!@F\Ö 2ø´CËaÝgLÆvŽ3¹+kÞŠÍ*ÅÁòïÈšu­ì²&‡¢O´¸cm Hö¿þu ¼x:é=¾‘c:+ܘ&‚4'†P“š}¯ \ÇneyòŠ@{ˆ³waÿh^RÖa¸”ÊÊP/»½Ã. HÈŠ©¤œÐ¶–¾6^µ*Ó3i†³€ªÐ°žwºòì1V.6:¤ûêL·Ôp’†kn‚òVº“’=P`³‘ì‘`I¨Ðëà1 yxË‹˜Æ¬PÅߨ¼q¤¶!«NÝ™ùñÖøâZDÿÛgFªmŸF9s~kªs[Ë­U˜¹Î#Í„;03Hhï ¢¾m XRëv…yU%ó‘XˆºBÚx"®ƒ 2qܦ¢$…•׈<5¦¢×öÑEVdØZÂ碌À–3ý×îGB9Ýðœ§Å ôÌÅ<×"ðõYÅ¿¡øñ€/Ü5@]Y:e+ùÃï—zšq毳³ŠCc$…ö¢Ö$¿‰Aí²³¸ #$ÂÛEçܺ¼ªÌU4©|dN"_&ÝQÝ8EÄ4qæ!¬0{ zÜiƒïœ‚Qr`?ŒÜ­2ÙdÕ~ yó«#WMÔBœeÜg›ÊP§³­¼uˆFV Q·AšÕyïL t0ö³g[¨~«Žy ¾ Î0¨–Œ iÜ쪻Ò>Ùœßã érŒéL ”ÄÑÕa*×÷¢¿8UËìF#H³îéèôT=¾¶Ì6z(¶f3š<­lå|í.Lœ¸É.]¨eT0%Ë`ZÀ8Å’2›g ³/+ƒ¦^dL ‹ræM㦕âì¤ .ÛÙl) ¡ì*D·ß`sëÕØàýû“½­i£î{,T°×‚fs‹²2¹‰\¦”Æ8ý¦zjÝ«âB‰áEï\×CJÝåHJ’÷µâ?lƒ)ÖΠÆà–îßÒWLY†âŸÕág~˜Î‘¯¡ã zÓ)Ÿ}QõúòR`F´“Bl»Šþ¥$úï²"¡a¯`ôöe~ׇ&"‚¹ÜB¤Ô×[¼Æa+ž}Éú¼'í¥¢oQ¦¿or^»­¨¨ÎîÊo垀LQ[P`ráÁ„F¿ƒo_ùSò¼9]&ý‚œfæ*Š$tÅÛsÞ€˜OT€öZûlì°k(E¢ÍÄÖHø&âF~Ñ'w¾å¿VªQSÃþÏ ö©ø•Âo×"*´\2ö]Iö3ßæ‘ÏšÔÇ“9à~Ä‘•£IPŠ4ÉÜAýæ¤ØGì´?I¹Ù^Lõðެw)ä dÙà J’öz@n<™ —D“nü+|6hD|ç—,1µ—Ý¿+—Õ£ãÙ©‡J|&Ç 4nˆ%.eœ««ÉúAõ=€î²1©}Ñ.:ìz<ÙLÍ—¢Ÿ³GKrÄû°Òc±'›˜ð¡gTä¶j§­X]ç*ä;¢fȦõJ›½2?Ž2úäÃ]Wú9FÖ ²Šã–ib®_P,œ…b%wí›BêMM¿a48ÓɸþYƒªŽ!#’'ƒk¥ÛÝ6÷Ø×£·ÀѪÍAœ¸Ùó¦ÜAƒåÂùþ]¿Áœaè£ÇW‘§·ÌbÒ~²fKJ!Ûe:%sA!ºz¾À^æ $Ô¶®$iß17 ˜áæë#Æ“ª3‰é @ÄeG>s1*hXv¶uIµØfÙBל¥A‡D 5›‘tl¥/†¥—K}ý7h^ˆ®ŽÕÏËæ—n BKËì ÁÈ÷æAï|tÚ“çŒR¾GÙ)Dh§nÀØZ`‡PVÿIÁ(Óé?‹‡VÜΉ‹9ufÚFÃGMH†â§´‡¤ªÇ€ðŠM F”:°“=šåø=ú×n­£L/QQ_Öú]4Äü¥Ù°à¹ÏU"*GÎX»býþ=¼†|w#a»oó…Ç$ü6%«!„lv+]èd°÷"eóØ lø¨í€/RÁ;hUò€â NuæVï[J\iUPµÞþKE¯ŸaN4ŸŸ…‡Â3¥ùÝ2)c ÓÅS.g @⾚N±¢–dO¾Of.¸äÊUW}dÏü<Õ%ˆåh²þÁ‚·;ލO®)ù8øDîTŸßl?¡eñ€¸”Ï =HÑŒãGihê‰I j/®¥5åOm¡©Ö-Æ?xeDÏ~¶´Ë‹Í÷Ãào†táE™·„†µÔ¥6 èÍÖsDÛo¹¤;-ÒV’kòÈ+®«1š4}/Yg”@UƒÆí[Û»\×.š'fÐפ¢)À€\©F „P8Í t.ÏL6%¨r²Å²¥yÄà£ìkU˜a–»TšQ}'Îm|ÏÀ|G$èÙÀ‚vûë–&b/ì÷<&×ÚŸd'×F¾¤šÆøÚSØ3¬é¬ ´Ì§õÈŒÎÜ÷›#Êêý:3Ú^´cgKj5ALl²s—§,PŒþN‚,õñãû«j*õ¾…D+»ñÁVÝI1BiÇ“¨éä’¶ÊØ‚åÔ«(§Óµ•`ݓԩRìaë›IÀï7ð”Ysÿ+ Ih)ÚØCˆ™ë¯7•üh¨-weÿ~Å¢“o»ë%›M~¼e!³yV:Àö(Ù(ŽV=áS!€?wJH­ÎQ ¤-K¸»L•Ýè/ý`'Ê,¶Ã÷ìôó«yÙ°ÊÀ‚­àëè ý4‡IÃaIHÚi ÙZ­¨ØÌ{,-!ö‚µOa{dö®³7%~IN;èàêdKˆ Ϲ˜1ùG1™ø/kq…nN9n´4­‰z·utêÔ=å޴ʥݲ¶©CžÀ¬­“í‘5ƒïB)çIíÐ\jbp‰‰.lû©¸N9ª!«iúþ&ßn6v*æÞõw—iO36K 8jxŽp|È#óB „HÆJb\1 µÚ˘ÉDø"ÖÕßÛÂ!Æ=’¯ó”¼–Èò«Gž®S~iþ0p c’Ã}öjælÐÒZ_0œþ´åú¥6 $l¿7ý¦4qG !èìcþE Ã:”ÆtH¢©ETseú÷™B0~$pÿ “£”ør&AѸý¥i¿´/[½CLÓ·gùnÆòëes”Þù½Rçx2êú”\Ž|hœ›Ã5Ÿ…{÷M¸©*’/V--]’µø›þ%;¯ü¹¢;§‘æ¯bŸ‹ ÄÙU=FtÊòVk¹yƒiAòÍñ‹ÐÄž,8ÒÆ É½IA!;j˜~Au‘!›Í:vwŸŠÖ)X‡%‡–Ûû5ÛSW–ð”N~¿Ñ¡ÒU¾t} ØùnÖŸ·«gÖ÷ŸQ1ÏžäÃÀjòþÂp÷Á:dЗöléï\ð°Øõ&ÿ÷ùžy‚ª$ÚÁ;bÜ­«èè¼)xG`ßP%ü»o íðJF»ÿæÆe„ñ¿Æs`·Ä¬ØNˆL’ ­qÁþ™Ù¨o?#JUùå‚ 8v$¶_*XŸ¥~ˆµ©Ø`ç>Ê-;¶Îçf×;ÿY%\¡Ù ¾$^;ö6º:ÄJ•^].–‡ì!ëú_lKêhÏe—ÐçÞJ°Ú^½·_CYê„Næc×ÂVäé›HöN›<;ø­™,›Žk¥ø{û¡â ÙkJ⊅ðr~´®š4¾P¦‡,D’|°’°UíqÕ5@ÎÒzµ”þB³c *GÜ ÑúBN™p¢XT/q¨HÌp>+ÊÁrˆ}Ù‚›?U8ëߘ;g~ä…¥MNÒðÝ¡Ø}è=£­U_éÙh•ðí?¿“]­×²Æ «¥Ži¸õ\?Ë{†Í§(Wí\y‹ÖeŽOMaä‘y%Žó|ðg_ôÂÕveù«+WžzÖE$T}²0f¤t𷉡ø·-̈waÀÄ£[ºÓbµsËòœ´Yí­öï!Áè|>›9žÕ‹D°G¸í®LÈÐç²&/õjDî"ä£Jã¡Xs|“å¬ÙÀoìw ýK¹ó)’ÏF[œYÏÍÔ^4«ƒ¿T$ºÚ+qGeÞ¡cÕ!BéÚîcŒñ¥µ„é«3¬²§T”xZ ÖGáÖ©|ÌØ¿ýí3\„€Ýœ‹ñ‰³~»Wÿ´¯R²?ûáËyµ¡ÁQHnŸ¿Sá0_‹ú'o¾jKÆÝJÿâì&ù:ˆÛs ˆ}c&'ýRkI¢ÄýWµÄ>'U 6·ab9™s廞ƒûÒrP:Å4û!¿`¥ ž-ÿj=CçÝ“:Ryf~ôcf8öõ¿Æj,#A€?Kã”×°J5ÒªÙî·uÈEYKé¿ Šæ*„*Y!$ fez·+ƒB©C,¶)ÁžÉ¨biüõ5€h¿rß³<Ž`á˜Ú˪ù@=Ð3xÅ ¾ËK¸þF´É=×Å\Y4SÏ@!à–­㙦m Ödt*\JŠÐ4ÍÐ?yÄ9t®þÌ8ë.Z•9G?öДÒdxI•v¢½H€à@J"’‰p€Yd&ÔçµÅr³K, 6ÜâÑ™Pr€}gz<¡âb€» ƒ€ äÃtÈL–ä/V´KÇ ÷Ú›h¼y ×™®ï°þºÔ1/B\ÙP Mnyk/_-»è}ÔnÑ-,7 í„I‰kQ8a}{¸bÇ*°/ç—)/`Ь:¿ÇÚŠ}Wuè­ã#;{ÞÕÀ‚¨HY Ú¡Ëöú&¡L©«ððñ(¬i´dŸ•v/Y\JÖ©‚d¶s>YÉŠ­~B¢7o©J*Ý=§N¡6—ÀžŒiÔ=®%® Ó82X\,á˜íwB³IÁu°°X ž’2ŧëõÝÔ‡ ŸFíåpk£±‰?ó3tg´Ïn\xÆŒ€Æý&š»ÁÌŽ–5ƒÁ„;z9FKH×'o¾éo{Ãì2—kŠ„Rè«„{WÕ©o´ç­»sl”ɿӒ`‘ÃÞ:{Ö8à… ýɉ¢¨`þI©hs”e¤õ1Ÿú*žëÚ'[*é®IÒ•.1ö™Ì–ð u¡ƒˆ:OS­í púi£íÅU?«ÚÕÖž–~ <ñ÷ 9Çp|`j\bˤbúaùŸ•Øþåg›d¶xBr‹·R‚™'4N‹ÿß“ðþ†þWÆÊ±8f´*²ȃêHl5’lÒSÇÀ`vúN¦þ=kkè!q/¡VR[ñŒ~jcntßÃQ×ðº}pËÓc=i­¤j*%ŸJí{:„Ÿün匟◳š)'¨‚Î#›÷å˜zØ Vù7Öë ¨NE&Õ£—°Ì0$¹¶vÓ&”)ÿ¸ÏéŽÿŸTšC^¨>n%’2ZÈnš·u.äeaäR裡:ú Ü®­³ÚðŸ«Ä g#¥‚j,ß·†ÕcDüÑå>ÿ?!|õ6vóÁ%–þ»íºL™‚Âë`ˈyow27E,;áÍ‹|HìÊ·ÙÖÉÍŠyUb×6¥Ñœed˜åúx>Âr‚óFjºí*ÌŸžˆ2úÔ(溌fl¥nP{_«OhW¯êøêž°Ë[알ØÈÉþ¹ —|éh‘¸ê:qѰ Ÿ´Þ)Jˆ­“¤Ýsy¢q_|j7ö\¿—Så”&Æ ê'X’'–ÝñÍd²Ï²s‚só/vjZUÁÙÀbâv–ZL2ñr’’Ðw\°p´óÙ݆rã=ãÅ’«"8arº>Yßà÷v:á4j¬>즜ßF ÑžÆJKÎ;@JÂõPF¶ÿRYç62KG´}ýc‹ÆS•2ŠTå•uÉF¡˜(2A¯¥Ïšõ’‚¸‹ER8¡ÍýÃXF>€½†?„˜^‰úýÇ'—¥nµì%n"ò ¼1߸£÷Õ÷–§D×í¡‰”àéøS B  w.³ÈäžGëµ!ÁF+iãísšLìâξ®¡DæéÍŒg À ÿó¹’‚‡¸ÔÄ£× 8šåán™90{à”2Æðl‡cR‹ïÝõÞÜâiN³¦u>_áœ"ŒÇƨB4ª#äc«3Kçñ,¿… GW8Þë•S{rž§c×IĬv_•ëÎþBGµv&ÒÚ Ÿ±I†­rNóõÿ¢Áç®Ü!l3!‹ßwU´©ø\~^Ýt8YŽZVD•±0Äì·çÚÌÜX²dŠ\‡? ƒÙå^w ßKŸÚçuÛpWulB^‡ÚǬÅ[ ìÊ .méÚFvËfªh’2MͲ±YÍÝ©&ÿ’Nð1M†Èí¾‡ðóо¹åÒS{*>èb‘ ZèûÑ|çȧÓÑvîÇbpÎ=m–çxÎ4‘8Xp°PI„û€¶©òî)¨Nå§SO‚R1eê)§Û©}¼o­Z€¼¼”`6¡ˆMЦr¥JC×v*غ§iºÝ’ѦÆ&í0êPõÏ#‰«IÒ‡Úß23`tíãM‡™[ÃÂP®à‹µ«—”9ªÞv–Æ‚:€WK%f#ŠBïNäÕä+8û'§?J$XÈ…ôäRÔË\DšÄT‰Ý W<è»)}š¶j>=}†"Ö¹¹W‘’«ü«üM>ÈØÞÚúT–líÃ?‰K+ÞÕOAd{ÌkÞSTújÈTû¹íœ©Uð êצŸz˜n¹ÝÈŠÐÍß?w¤¨°‘që+kcr+eÅ |a¼·Õ3íp#ï°™ïÔèŒf¼ŽÌÌ809ÎNbƒÂp.µí·gÁ\˜S.™©8^˜ï›êbÂy!8œw{Çe$"(ݼ»VêY.)£FA™¬{Þʆã0«iz·»èܲc1g“×f“`©³`.é4°óœç̯肵 >êñ-;Ù B><¯>Ê8 ;ñÕxÂü"‚`Ìk!ž]nMßßc6-X¸xÞûØšŒÆ5!-"Åæc{!¨jbJ–"Øj{„{§ŠYš,çÌñÉúLUG7Q ’t™„Ã…my÷ç7‰<­Lþ¯½‚U&1‰¥^ŽKÌâƒ3-~ÁHÚ˜¹OzÓ9a+M53Bš’Š_ðqK[ŒqÓ»¿Ø‘%Ù:õd1ßÕ¥P%<'"PÇ$ªšrÕ± ¡*,ÁW:»\_TÍ/SÞ8ol½>˜æëÊË*ó÷åJðZQrŒÅ̽e13Ñ)×F‹Ð½ŽùS –/jæÏωSáÖýËâÞtÛ„®MtŽUòþã›ÚÈOºBéN*ÿW³ÚÌi)BnyWþ[üþ¢vŽÖn¹F”ªÍHÕ,áJ“&-í³ܶæS³ÚØÃóm¦AQ±ßû̱ü¬^‚0‡í¹Èjà™›@÷¼æžsÜQ“¸.Ò ÏiŠS‡dìuGfÛÚgJ¡€¥>çVŸÁ‰4œM¥‰¡K˜=K›oÔ1?(_F]ÙéxCÞ ž›0P“X7â–ሹð%‹¯Wå1™ÂRôÚI¢ÿ{¯¹9Îá[>¾v»FFmå nÖ%ÈnµÆH Jä´Ñ&Eé,Cf·E‰™ J¡= Ý#r8­U0ÌŽ¶o$ Ç‹~²=@˜HBÄzY„ãiÐ N×X_\Åý¢VºˆxâÚÜ«oØ5Ü£° ŒÖ1}jœà+JA‰ÜRÝÙìožuÈ;ÓÈñ@%ëéŸ /\ } I)âqI~ൟ`/¶pLü` #~;¾KþXÓû€“Vx¦æ¢[óbÌ/¶ó§Zxôá$þŽßIJ¸ñ3 N²ºe2õ2ù+ÕÑ£²ŸŠÊâ¥O2Ó¤ý’~¯T îs^ƒe\ŸpYÿ¸°ÝÜœ=§ ‹Ó¶MŸQ1V¹¿sœÔvwÂ*vàCy¢XWÆ(…†UÓÉÐYBøð}A1‡q |¼pb^ÑD}'—I7;f[SV‹öàLܷIÿæR½]sÖ¦±PAÝÇoBœ”¨ç«³pO!&ñ6ÖS>3ËYŒÑÇŸ‚K­ëE&/;Ñe¡Ã²;ÿX铦ÉÄÒÇ9ŸAø´'ÌNФ¡äAwzùʼnX‘X,†½ÁBq Ö¸Ûh–¶é‘ËfÈO)Ö"á¥$ƒîÅ5Bkù£,MÒ\?ª=xwä͈¨ ßrõ¾BBᮩwÖ¹]ØWø£#»]uS‰­øÙµ Õ ¸| Çéõú>õ2±vI˜…½ßðÖeOïõÔm?eåÄÙ¿Ëùd¤¡.éš¿<óŠ!^L†§„ÍlÌÕv1¹'¬±ß™œÂT˜ œP¡óW+Á3ó®?õÁzô(ÝnÎu¸É«ûWîaÎ"zÊ!=æ”ÅŠ‡~')C}0¿¼Ñ^ÅÍB ;ý“̉zñ›‹/Ý\—Šr6t…CHÛ™·*ê âUp„ÔþðLˆ1Ö˜•<Î#º:‹ÝËôÕ<ânMɾº˜­³‡ŠSV»kt¤†ãÓ‰è?Ïîe¿Ä2Š3¾û¶~2E³¤Yy†ù?’Ò¢[Ø `“®á›ü üü¼^L[5Ý]þWRLW¦sáªÞÎZ’¨Ý~DÿúIK·ó³áU4±ÛU$yí$oaå죳;Ò>°ƒ"c9‰{¨èçjüÉémK5Õ€úÆ‹ì8½ÈŽò0ä=÷ —ëw'æãKƒó?d¬¨ÑpùuÀâ£RH4”–KòMV Qµ¿r €%‹ÆÜ}öux¦üûè%2ö›‹U‹F–p’h?>„8’¥" >SoÿÛ•NMæï~àÔÓï7â(p¾œ\XÑ7NÅ« fË$ãoâCèÄ[O&ÛG Òüs6{ò¬Ÿ9ó‰-ÑZ5 bÐZý_ éÐmæÖÿìÌ[ª>gvÏâ ¶ZÊÞäíeyaú*K¯/Ö<‰-„zìSy:Ì'Ó¯(NCƒ6éþµRj³ö} ÔGèî•)¹ÁB"_}LÃ@tº°–‰Jñ`ÉX~81< ¹ ™ýX'§bôù³"øûAQ "Å#ä½uîŸáZÓÚél N;TWF±¡¾ôMæ{è@Í-Ê£.ZxT„3ÜœiªüÚ„5$¥F ­ÍÿÉ‹ó™Bp7t™™¾úâ#E6(­KÚ¿(‰•ÍY.Fy-¬tŒ 9p€‘4‚°>ú<ûS\pŸ±à.`j˜ÒžAÍ éWfžX;M¬`A&Pÿ€êPòÊ]ÆSÅú&[…¾˜é¶Z§3_iØEQ|öúœÄšÙ6Ñ©Y)À”B€ËƶÏ8©Ñæøa¯4šÐÙVïÖhç°-¼ ,$Å>côÂÖŒ!xŽÀsQ¤Òëep²Ÿ]Éö £aSÍ0q`ó”]ØÖ{Hx/Ø ¿z<ƒŠ@[PhÖR1(Ø•I8’VÜᆌ´4½ª•¡¡`‚³â~d]ãcgKôT*M¢þ£1#ó~,-2û×õ;ŒæÍ]%²¦ÍG»¾,ׯz—P—3†Þí·zqÜ#Ž}Ò™°«ö“HHSnÐà—mx˜ÖÕ|¡¦Ù÷†Ü äòz&ëôÏ5Ý'H½lå1!ÆëM‡Í†¢zèš_ò™„P7gý“Z>ðÐî›ñïã÷ñÒ1R_÷ÅNu!S~™h#Óěͯk wH…>$¶Ù\ìË ù?#q™€áÍgVLS2Þ!j»½6¸—¿çv¸®íK\jâ£NrÚS16y O÷SýǶ ±EÃK»¢2ŒL“7^räWN_ ºWšÑ—ÿ?ê&—ñŒŠ•z­ÑêWN°rÍ‘9üäœ|ÚìCÃ~ðsDü ‚Mf¼·ZŸ9Î9£¤!ª>ü-]#D¢“,W±LÏPáYõp[(ô_¦Þû5¿m66êæ%¡P„ùeõžà6q`,QÔ±©´¡à~¡ýÚ>S-F£’Þò7|e¨*‘\oSâR>ø5g¦àÏ-[£óRòËä¦eZ°käzò–ú®ßp³VÏ$"e¯ß‹(»®ýèûR«RÐíña>`ñïÆÁfíì Pt!ˆ éêÔJööÁÓŪŒ²¥öídðFR1ðƒ?î|ö›Ï4±£¤äM“$U+o_FgáÕ!8šõ22‡É¢£ÐÁ„";ÇŽj¸+‹áîƒ&™æfî…h+AØ' ¬2É^tå‰xÀ6 ÍŠœ èÕ-béõ]PÚ»•ž†£©¥Ìñ•07<‘…”g– ú€¼Fbб°}…é®ÃÑQì»$§ô‚{†!*ÈWõxâ^/ 30™ž6¶'_> ×~|bþñ¤ˆ±&?2ðµr¿=•ÉìÍY5n¨¥Á^]¨ÿ›¼nˆ*Ó7 iDÐ[*×7¥B!ÌÕÙïÅldNk®‰l¶ê¼KM¦ÛVõ0¦,jïŒ)Í¥Du§ƒË%-jžû ÖK’o@` eì“ÇéÀ`aÉYÚl{0¥Q•2¦f @ÀZº=© M’2ºWxoEúÆrv¯á.S¬¸kì…ÿ(@ £ì5¦5RI?VlðûÆ‚¦òÐ!!#5g1Ÿ4³0]@¶qŒç_,’¸/äë’~xQ¿+P£®¼YT\èiÐÄh<¿'ð¤š]Hk Ù  ò%—ëñÞþy™”êtÚ_¿}mt~¸|ñëá6GÈ{ê °¼è#KÛ…Nv½¹2}myR»Å„óx3Üõ²¼q›–. Å*N±LÉÇécàëeV¼1~…S~yS›ù@B²®¤ï‘p^iÇèM$[¿úEnJ ,þGÆxÝSoð}ÒCûCC©}ql™™ü/íÞÙˆ¸{ ÉË#Gü[“mé ºùŸpLòTD¥Y0³ :ÒÓl‰á´Úàm‹Lw¦îÜ0Ó1ó•éMz~á é¶O•:4Q[ÝYNjâуY¸çólËèžiD:L>ƒ™¥Ú§dœð¶þbhóÙû:sÏŠ¥Â]òù¿,¸úíÚÎfÁ¬@fÅk­ËPçæ¨–‘ó"!]V™©{ ï¡Ëì;'‘ˆ®tAðä¦pyT9Âs8D˜¢¨ê:ÝEc’Á\ÅäÄu%g»ÝꞢ¶~ßå¼’QJE/ˆÃN—Q6ÒÏ_:^!e7ÿ¿7ñ¿Žz!ZK½û€ÄÚh³4žQ²ø‚€Œ6€ ¯ß€m3òú[ÒÇä´|Õ ?³Ó‚þ ñáÍJdDúmóÚÿº$a‘•ÐÜÈ ÒÒ^ï+|Áž¹UVHòZÿ0NE-Ï$,ô mÌA h3Úù¿÷P’šÏܤüÆXX€ RËt³3Nrã_¥¶mpPìtP!gÞ¹‹&(émEpÌâÙR•ã·<ô\ëV@¨ŸÑS­¹ \ sj&•cžö?Gà\Q‡wÐU÷.u'šD¤Ë6|¨¨A¾¹›™|΋Ԅ ùŒ˜/>)ë<8@"˜€U«JäΛ`#àzrgÁ’e¤§Å~[%¨ÓŒê²óæ€ÝÛøÔçUù•Ì“77@Â'brô1*-@qð4§ÄÚúó/5Á@½RóbA` qΈhRKsuÈî€î¢\*:‚4xëÌë+¦yâWü3ÑóXŒ>§>|rÆù‚m»®¤•z%ºÇúÚE!ÿÈMkéeM ¾õŸ”î³§1 ^1Ùë ñoì;ξ2‰ë4é FÞ˜èÕÁOÊ?ÿ3y¯\}ÏEöøÂÏSXÇ?$¤åç,R-&g ìíÊš-ÙÒÏ«üÚh)ôÎ y¥m¥ô'g‰wêSYËE¸cÃIIzGFçÜ@Jœ«-Û ÑcEÏ­zúg-•(˜fÅmíò3º+3ˆ%MóÕ-ûôˆUqŒ1µºð,+][9[íÏg0Q(KŠù¢D‡¤Å؈Æyo<™vlØòC¾Á.Cm,¾üYÆ;¤MèWˆN=&ëf†3»C„UðÖe’âž³ïÇÍ673 uãN]iÇ] D¸ŒéÓÖrŠMaN³/ö¼’HZøXëF¯“t‚pM ‹F†u\ìp$-S6#ÒǺdîcn ‹çÒ •GyØ Tz] )ð!ëÎèÅ..ÿ;rò½õ˜5¼Lq÷ =Ey üßKŸ1_=w_NÁß”A™¯! ÕA:³J&&"=šty8¡ÞÅB½‘Ù_ÿ$wZ@];*+”>@ Š-°’µÕµæ×ÐuÙý?RèZãC…ܱóò™Äô“šÊÞìxIþO­öz‡¶9\W‘ÂucZIüÛèÙºŠî~ßÌ û”èZð“#‘"ÓZB=›‹’[kv7À\‰òeóˆaÇô÷6ÂEýCe?QÊ+Älì Sz]ÙC.Ùîu°—@Guûê÷µ*Æ#…>ÌEŒ—Ï‘œ‰ÝD™ë8^âSHŒ×s|LÉZ²¿ú &¿Ø+î}œ„¥Ð—θCóÅÓ'|gÒ\›é_ð`~]N“\˜‡@×¶Ì;d?M4X–g8½¨¦Ì ¶² Véåz¬¹Ü‡RœƒÉ.+ó ÄRvÔ˜ëÚG:S÷©±%ÉZàýYŠrÔÈÌZ±¡ÐaM@ {s½‹ô':S˜Ñ`ÇÎ?·1v0"XÊL‚D‘â¼ ØFTÂE'W¬šÌ0-ën\ßç1ô]¬¤"Ò*´~O?WQÑžòäsý¿»û¤ñWÿ†NeÀ… ÿÆ'!ÝE5–=áõÒ9g]GhÝ¿š€whÎ7âåu6ý:ÁpYÛ¬´>3žiÜuo¨OªÜä%¾Yþ0ûFk<¯ ϰ^WŽ.uLKo"С¬.ó_Õ¬¾Ò)¾0£²—Fùæ,îå=?H’·DµÛpKƒñWlÃiˆ_aê_u³C>â`±ƒ¢b¨„ÍHÃAËåI†i“/bÿ„ó©+>$]‚ÅÉ¢‚ëÿQè‹¶×Ƨÿ»-ÇÂI¡±-#Ñ÷âÿVÞ©Yæe«”,í¥£‹ËY=¯dîlÔï<}amï_ß`m-L×'ÌÀ‰_Á>OY‚8>Aí~ÓÀôGÔ´‹Vdx3šÝ“hË#‡­YE^Ù%éÚv³B5ûáj8×4Ù Œ—„ºwëQ»¤M²ºÍÞ´säúKtÜ͇®ZVþÃBqøEÃî ´‹b*"MÊú-¿Ð‰Ž7`ëRÍÀu³´©uÒ–ñõz8§Ò͵¬ÓÚñ·!Týש­üŠ/jGÙãg/3L³xþx_šÑËòÆÓÜí`éTf tŒÒO)ÖŠÂHã褜´²bïAÇòŠÈ FI,ngô쎬¡ñ æÊ)…YÂLSIç¹ÅÇ{¿bRö*:°a5bÍTjN³EF+¿ùÜ©<îYºû‘Šï6Ô­VpS0yu.„‡ú‡ŸÝ;'.ÄH^l&—&«À©úÅÐ~†?Ž7ÄXßFÿD^h|‹˜í°‰3{_Ÿpr,ïu‡þ`µÏH³Ë“¬Ÿ¤)ŽÏ4ö \`ŸòÓW˜üºÙd’ 7Dñ«‰‘é¬~}‘ßG6 rê™ÖY#Q–&¯g3RôÀ;1´Â‡Í(»îaœµ¡±<‘g•ÀßT‰ó¿à°Á‹yTžÇ6Ñrg?ÁMÌLmBg;ÙIÏ]ù¬ª(¡²Â£¦ó®çNË+mŽoï[Üäs ÒvnìJ/Œ.v§Žµ#z“TÊHôÿ‚Sšë3Æ–>x±~\Ÿ¦l¨>k;ùòt*`‰iä÷3ÀÅÅ\´û Fô §¸³¦7ÓéÆ=è[±TÆk7²3õø1Ÿvßþ±4¶Ì¸ôðæUUH.’ð^ÚÙ@ú˪šËGcø|‚½Ü·Ýä´ñ¸×8zGtSÈT+Î-àß;²OwÎêT<’}«ÌRKOù‡Ó)§’& Ø5Uç_Å-°´Ô#·ïò„íu„œsoÜ>µ²3 ¾`¹pß%»q+£5ÌÚ¥(ü=6¬ðAh£û¼Ÿ›Åç†Þìeá/ªý°1}ÊJ¶7í·Vq‡rÏÑê :%€bÍ€\¾ˆØôtf$Ókb·×5Vh†"£½y«òÙÇu¨nžu+Ot]ÄpœŸšU+I'P¿2ø$pÛ › c D%ÜÛ¯}­ýÇÙûµÄ¢{f<ïR‚©¢KÛB.Þ–_ÁuIèŽð5%#Ùp? LV Fs‘9Ó˜ªîŸ¼»¨ªÜW ã}M¿¢¡¿ˆuÊdjRg⬠£µR•dÖšxp~Vá˜÷ û"(Xêа©käòœÛ¥"[½k=çÑ9N Þ%’ïv´îM¦ße3":Sýë,³fµµ•i÷Ýo±ªi8a˜µ6ÀÔìýp óIžr®ÆÀ9Ñ&!  BìOeM†¾È=ƒ­ˆë\H%\ÙËŒ˜Í8Œÿäö6ÃDíd.¿&²zL‰¿qKÅÏ®\Í0\\¨!ÙÖyäukpWžÝ—¦{'BóU—©£áz¶£t:Ñ6yüuIÇ3GT(‚zÉìüLßù ʆ3ÍÒ¤ƒæ«ñ—Ûñ˜«£¿Þ4ƒšÀ©GÅñ·ÃØó9دsŠŸ¬é¨@ý­´¾¶n–Øeø&]…Ĭ¤(rzÛâwið¨êu‰ˆët¦h_3ájïùI²ò.L¡`ÁjªKؘ6KkåeU}Úß?aŦò‹¤D»µ ƒ¬:âZ¢)ôŒ—Ñÿ÷´ì Ôq瞎åšùf1ŒüîQ[°%J=E=±}°sZ „¾´É/á¸×^Šâök”C`GDýcíåáõî€Ô×ÉwX$Ø Ç”ÄZÃ:â+æ‡WArÈs9Â1@´¶$ÔN„:;aS//:cç)n’,¼!¨l®€DkL˜LĨ“½²ç"ã‰h:ÐêÖ7x7Z ž\5^ R>ô>~?ˆ˜D<:ÖžÈîzP®Æÿˆ,²>éËɵ¶ÊH„{Öå–¾È_¦îé¦&°(RÚ½7:‚0 ŠÇÞ}ÙsìID e:#«³|ä²Rd¹±Æß† ÃÚËy¥ ¨¶ö²ä3-y`)l» ]$’ñû¦cªëÝõÒ7Ô™Gݯ¿Ðø+C_k²}±‰ñHUéD0Áœ0“[ªñž™ÄKÅv.¨ÑTD¼(ªhÀõ?¸iq'++ÑŽ4ý/i¸U„N§Ù7W¨Æc²‘" ñi˜ã­ç§Ùsm6ô–)íVAÐñ‡¸÷R@fúy„P\Ú%†ÄÈ¢Á ¸9˜D‚Œ5ÝÅ_5ßÑî³RùÀ™ooð²ºQï¶1eèÓæ6fJÃs_ÑÕü¸Êª”aÀv ×ìéˆòÆÆïKËòÕ{ü£èO3^f aæD!·stΓð*´ ×i³«=‹`AÊ^FEòíñ ëTÑÐ\¬fþ¦Š;Èñía´×°ˆÑY‹ç¨ã7ñ•‘j·Ç0ÎÆŒNßnìã0.-b›xzµ*X[z*<¸X½Gë8×¥›È)÷@{ZZÁ‚´8ºPådéÉãl¥L1PY?f—“Ÿã²|4¹ÿ¥ý+´ ùáQç¼½"=y/CÒ„r–£©| XÄx ’#Ãc9>î.±¯.a­‡ÙiÌ•­ù\)Òî Ü¡pnLSâçb7v$ 5â{´arÑžÂÁß]ä{üsæ÷rH á¥ñwcN­9¸›énV…#/–…æ[Ø7†¾I¹ú¼”;1Û1¢ê mÀã¼'k[Új½fƒâ±¦¬ç·ô§«Í°&ž|zoò&YðÖb[×eõ(<–i÷ªÀásþdÆ!|»Ü¿­Ìûªë_øV x> öc e È1–ZAQ¨Î'šA^Or: àï>ãª(Pæ©2º¦5þ„ÓšohUºñíOÛ³Íî1Ñ¥Í~™ ’F JÁõ70ÔaÖ¹Ú®Ò#ÎZCçé.”l7œÅî†ÉsÜb¤ˆ©sÒKI[ñ…·×m¥lÁ•~n7‹"t &®KÓÞ@˜Zy\»í¿s| "[°ŽRåÓbi¾Ïž¦ Hø¦œY"Øk¸0W³a\Û=V)‚y·§„^üÙ!¡o[ß/¼ƒ)“Wz("]¹U ÀOÚA¿=EpV¾Â±ëF†À0£5ÇÉàà¸ÅØöÏ,¨LQ›ÜýÔKTY›eŠLà´gD#"Ä1“˜á b$ìãu‘êÏZ§B@kR] Ħäî‹Ì‘ÍDRgS¿ƒ%ÊŠóEîùÍYý¨ k”“ˆÃø·®hGN»¿…Í¥€õ…ü0¬ÖˆºiIåçk¸ßàÿË™íëóPAàÖoZÁÝ©Ûë­eËj4bfü:uön¡ÕÏ4Ñ¢e•_Lz¥H}ZÛ*‘«|ÑHÄ‘—«ý¶R¬ûfË {Þ£$h½¢£Æ+Àp§‚@€Œy_W.ÂkòØl‘)­òz9ÍÊ[­óâQiR_å‡uˆ1¹¢øôšÀܯ4#]xÔ½\u2Ço°®TÑw#£a9R2‡Å³ÿï.—¿‚ùf)X´&ze2)'ãG]„™-<Ûø.׌PʸÝj¡2*c7EI&„@B¬•|5Äù’†êMçó~ÚùŒÖlä êùïbÝ+—H@Ì“G—«u{‰9]dw~Bõó7Ä>ñ4*;©+†|•Ò$¹–ËVw‚v¿|#»Úgu®H ˆÒ6`ö‰¶Gè–g!¿)vF”BIJui6šXÙK3ç ‰»ºçÛÕe¯ˆÊe^Ð[Û"‘]0§ÜvµEôis¨<`Ç›èåÛ…=IP_Ík‹pÅc»L›C©lȉ ½áÇk¡lR€Ñz[ùQLHy*¥«i„ºùPÍúÛå eÝ.bèA­ók´†-ZØmriCçkÞÈC&il§ÁÞ˜^ÖK6¶žÐGì%ØPp)††k¡°É#@Úx©¶AÌóÙw4¢bí§qAäO¦Aá|Ü'Ò~F·³gŽÉTOÃÕè,!®*1]Q½Ú"?]k/±iU–€‹GžK°rë9_Ç$“…¥[QqAP›¬;…ù¬IÛ=ª8ØîÀt§=2k¾J®Ÿ—™uL…Ö:[MáKªT˜¨¿&Ewaàßûïy7¨“éÕs5Aa%ƒ!c:ü;rrTú^)Õl$C&έC+%…m¢¢’ާì0v4ë„…Ü#î÷ ?»ˆeȬWÚp~»¥Lª^ÿ»ÿ~_ï, $?ÇmàÝcÔÔóÞ^//Éwðï¢%Ê£œwŠuÌŒ¶d œÌ±Ì !3õÍú`¢1{p}Ýyc6–lþ†+3­ÞþWð‚Må…;oaùS©§{BâŠÈðjÞЄ™[Ò¦¦-R/3nE[Þ23ݤ'TL~ÕD߫ӓ§…eÙ`ƒu²O±aüéq*õ—\$˜@µ:ÅAs4!‚½3Íæ²Æ ¤k±X©Èl–!+ûú}fÝJg?CªCÄBœÜ3“å#*H6[µL7q=ØÒ-ÌÂlŸV<¨¾në*­„£írÆ®_¨4^tïÑûÕÆÍÛ‹ˆ¾`é¦xÿ²¾4[E-¥œÒáÀ»é¿n;kOˆú?ðqxôÕ‡)®ú|rE¬¤6Ï*t,¶AÖÖu¼®+u-0~jPæj39­Òcf7ÎÓ‡¤'YŒ·h¢«[²¥µúYy6h㬜¹>/[‡N§ ’•w .½UlD˜6™mDz¡À«çs¨­$s„÷#ç›Z›€J¨²`Þ0êT†4a¹ [/KŸÆái!'DÍ R‹Œfl‘ø»®^ý}>í½¬Þ…ÀK¬0¶¥Àõ¿F²¢C&XR‰DÛðži84¶ÐFtYCÔ$Ô1$e=nôí‘J¥ñùȮº‹;ÄRàT8'Ì´äX¢o‹; 0Iå±ê =a¿8XŽîo?hi˰_†©8ú9ƒ5š,슻ßTÕ Mô¸ŒÃ%hïðD•e"H¢ 'b‘?ðüͱwÊÏ@ä,J'ýÉOÔý0kåž•]AÐ_BM/ˆ¡Žx¥†Ï˜˜£ƒÉÛ‘\ÑÅ(N» ´Q`bWºQº_Æ“Ð4wBØg³.Ù8Óðf¯¥*"Ljý…¸Øãž VOV'°c=$•ç—{ì ýò=om"˜IÛ”ˆÉ‘O¹úŠè68Ýç©;ïfÔ\Cbn9tušiWÚâž þvkH\JÁÜbd½Iµ þ<”UÔ|dà8ûøƒŒ`³lcðh,`#JŸÍ8ßYR'A´"ÎDªO1ˆÇ—ŸÁ"Øáã"9IPdÐn·DØvÕÅEŽe¡rÊßS‹3#©"åvýa1WÛãUgw}nzÎÉ Tå7¿Ó”°Êû<¤Z’¾Ô¤¤œ(ìˆõ?¼Ñ†u}«åmTù¢‰á}kQÁpÀ‘Uâ4Õ!ŠXòIÜI¸P|ýt=ÚÛ"ñ*1ـߥ$¢: XôÃ]•þÎß+¥ 'u¼Átœ±à ‚Štpþ·Ȥb³éyüÛéœÓq—4·JØ æ ‰ ‹ðQC* F-F»(SÔFÿkiö§l2ö–:c»´˜ºqKW©™¦Ê†¿x3¡<øj»ƾGФ$…/‰¯uC:é?66¾y°¢#'äRÙ W¿þ¨"µšBö»³Så•*­=Ñž¶ âç”(û¸5o ‡ƒåÜáôcCþç§©3Ä'óL°Žnœq46Ñ:‚4Ј}%½ŒŽ®•£ØLNðÏOß§ËÈÊïÍWÌdBAðì ýðD¡BÇ_÷@Þ¸ñm”ªÎNØ5;™,\Àd™=ì˜ÿËm':Ð ôߢ岽B·  áíšÖR¼YÆ¥s …hО¦¹òÕ»:äR ׫]… ­ƒHöœÕ·|䑟SóÕœDT5ú¯´`UPhZŒp†’ˆÆn¨!üÏþü@ óÍcõq4ÙìpÜRX`­10ÜêҊЫ<Ø ïA3ç-?'YVU¼? ®àE-&­Ý7@üògÛ÷_F-è-Ú#ñ¿,é‘­*¢¹M9œ¡µ?ãiˆØVƒ§ÙO“üæ°ZhE2õ%~Z¦XÇ÷¥ÃÑâ+&Ó Ø¡èÃ|£Íœ—†ì.ç2ø:ÿ‘è"ÊžTF"Äk‰žÎÃ,—ÕæhŽ!y¬#ùæP/D`ŽÍØ:þ 1=¼%­Z\.¬!E`8˜ ­Ïª2 CëL…  ²x¹P÷Þ• ¶kÈŸt‹ßbÐ/ w;‰ð£=(®€sÍ'å^ïEä)@|¹Ö¤â*ÈsC{4ÔíH™~Tœ°ˆ‹Iùâ!E—}ð+E ˜Æ>ËT³’ê `Õ…ã߆‚T¬A$½›Ùò½ , »G`BÄjuîvî´*Ð{GÍ$LðŠZ®Ù>Šwû¨¼‰‹ý” ÕŸ•hÜYø RPÓ¶áãù©zr1Áã`øÚX¦¦18«DÓÜʇ0R|Ÿé5á•s;MmîŽÃM&¥»·×¹–J€_¾–Ó{“Ø! H±~ªèå_ÄË0Ó“Ï‚´q³¸÷hÁºÔÓ_°‡ä€íZ¶½ÙX—´{­;ϾuÝà’ŸPÓ(@Dö-£FÓ-t¾LÙ.6B[íDÚzRqÈþ–ީчûÀ­ "#l„‹Òç 5WÈ$zÛs?ãÁ¼aŠÒ¡Oav¨Û÷‚ÊÆ¼ÓLŠYàY\Óµ‡$G~)å´I¥nDETs›¶Z)Õ|SÜ®P,HFÀ ·`ߘß>&ès‰¦.ò‘ÂÎ"_|q£*OõP·—²û©ô˜ã[¬»;9×6@cJ~håÙ[ˆX„n•Av.À[§ahŸ`ÖFt.hä@þ‰ £nG ‚¹96uáº6“%úäzAÈÀW6×Åçñ"­éï×d|¯ó-+êå2ÂÛa-6é²Ïžâ¶Ï8¶E†ó¥€£YÍéÀ{¸²¢v8,´ð´ ýããà”•qc8 MàÖ'òš–úqÝ?Z´wEÙÉ1þÙqÇéa×—Ç‹<òmÿBfæÇ3ÃØ­±¹¹2Φ ÷#R©U™ÍÐÃÆä)’Rôœ­i@zÔÕ~ÃõñCtNü'=Ž5A‡ÕuFm_Ôn.VXfîb§ÿ1Ý´òf°Z¢à¡RÔþtDvÏÏ×Ç|[¢êÎ` `þ[»!/LV2ÈTsOèš¶pðr-—_eŸâw!é×I“š¨K–ñþïi{)ŸÝyÄX²Ƴ /üoƒê6ñźž>±êLmyN?Až¤š£úÃßåâÁÅ¥èŽ Ù’ùyç3K®9Ó¤¨\CìþÄ4?å¡ ¯t!s¹À‚„<5î½,¬öåj›|/½„A ù{ºoöêØÌÒ- fÿ_¦^î0ôt°áø»4”2^¹@˄íu51ýBÞÿ ;>ÃdŽPVà_Ø •gž½DPÕ-3Tp))1õ•}d?´Gª2ôž°úeaÇ7w/±Ä×J¼>d¢B‘Š"飬ËóY`eFQÂfÍÖ?9W,5ÊiR'™¤-L`tC‹¥"×¾ö 6ì_Uð@ŒÖ8ï]Уp[òbäŒK‚á€9´KG=NqKÚBKt+‚·$–JðWÄðJßמ‰ÈŒ—`•wÄ•ê´gн9~¢h¼³I ~‘~"¹O¶~e>YŸ‘¢V^ÏB³*Œï¢?Õ,`ÈŒ²—n óÁ4÷pþÐ*uXäòÕƒ”¼}³/®bb?[±1êiÚÖDˆu»³|¾˜°®B°÷åºô¾A5õ—bxŽyâl-Óð™ß½!g;ÖÔEÌ©Däù–&÷ rµ rç»Äm4™%dBZʲÒÑI;iOƒád³x}v«vÈ“(ÉñäíÖ’‘NÉõGI7ôh“ÆÑ]ir]6 €7…¯FYEèÚN :jY·Éò3€2I¡j?ÿ!‰Ýx>ŸºÜÓÙÞJ¼a¢%0Š[¦¬Ù‘Ú}ï×^Èçhg'J™Èùî k/xN¾e„YAþr)ê*»-€ äEÇK=Ëß ´¨æ”ÇËõo]ÃDÕï¦kjjü]Ó:Úñ%8KVµ9F^=þKBYBwS¤¶Y©°5ú«‚ÓlØÔ’›uõ/bl”ÛÐÅIçˆ!”Ícϵâ+ïE(èÐæ,åk±™¥c&6­í› @¨Ò ýºm ?*dŸ8œ±5ÀYF)PxÖw|³ZÖ׊/ذoñd¦arÀôÔø±çIÂqp–WtÑ™n…3G¹°C^ŸëôúúMÈÿÆïH­/%óö_)D3ä&¿¯* ré£ NÉ—âo>{ËÖrß“îîEÙÞ6Uȉø+~1ay —ÑÎÞ[‹Eñ(vÞ¤®w ¥Œð©µŸ¾Â_Xñö,߈Z"*&@>ÂÓˆ©yi°B3‚ŨaíŽîqî”%€x(\ï9ìÔxïæ=ª*®T5ª× 2¯sÚ‘±­þ˜‡‹NÑFAÛû+~ä 8½å¥ãPùbÈ-v< Êë…'ëy~Çý0sú~äôøyï8”]® hI ó¦ÈtËÛ/†Í혱”¿XLò Q°LÃe^r7êm=ŠƒþØk˜i«-Ñ×ÿ—»AƒK1œ™‰ÅI+Ÿ0À§íÛºò¶ùšv¿ô d£öïÒ{Ÿm ñŒXaï’|áSHµ ":Ó.>ÃÖÊœÊñ Æ÷NåG¬~,è4À5J†)mø½óv½±í‹ŒáœFèþ3óO‰öDIä¯6È l¢ÕRjÙi’¸£uv›Ñ¤ÿEÜõÞ±©ºþ(€¤^7T6pãG–’ó-&d‰ ïu²×IãÚÿóËÃÄsÑ«øæ-oB¨!Y*Ã1Q ñM«HëeS™·JßO…°R„X«boN¼¡B–úŸ=Ö5¶/'Š[“à¯HÑÐÄJ|þü“~ÚKû[E6Ij·‚Õ Üã窰dÍ]߯rApðø¾b¼4%Üb8Ô^¸ÍKá7Ìk’Áåáwȇûv&«¥ƒq<2¾ý2îýá &|Ö–ß9ü_ŒFïSùIÅ 9ÊŒO”¬"gv0œ+õžÞÂ÷µgþt^Â1¾Lbž´ åºB2º$•ɰý„Òn’€tý "eôÉêÇ¡.¶ %Õâ–(H@Sîô}W®-™ŒÚUEBGä篚gDýïôÁÅÀKÒ 3¹üÁˬ‘ÝΦñ3•‰¾â¸•3ã¬›ÊøûrúgG¦¿µ®u=›Õ¢2‘f½¶‹`_êUºÞWuùÛkäj x´<@LØóTYÅ`,¤bBC Cˆ÷fTm?]^€>(hT–q—Bª˜~ýR¥²Ó['I9\©Q$5‚Úï$`ãT6äõ~?JòmÿÖ^Sª³D¿´Kˆg32#¥â—sÐòÍÄ%Eå´§LØÒïô¦…SîÕv˜,k 0$ü6:1‡ÓÅn&ø%‡ƒ.·<Ì÷©lF­¨‚(«ôÄ™×WáÞä rúræQSÈ)VÖ#üÖ&•­"b°Z6Dìò¨0HG¦¢EQ;™L¶Sê”L²u  Z(zTò*mC„òÔcKÙdX‹9®[1ëÁçRào”žÆFþyí¶©ÄÕœf°fЪT®æƒΜôã8 òݾ~Ày·Jµµ¿·(ÙO^pÛ+( OÏÌ :K_í;TºîÔ|ȵ1¬¸&’üBûnjù²,\pŸ>ͩɄô”B)™Þ Rö~ß ‘À ¥>ûÃçÚ^Ñ '93ú‹Ê’âpwþƒ|Às$ƒ .ÅÜr2ÎÖË@«3†åy¹©LzÞ-¡‡8ÇKd´ôN¦$¦t3~ÿ—Ù;IóP*0Êøñü¼836~•QnL€+®YâÏkKr®k u  à¥ÆBäøšxÄGfð±Vï/ -H¯øvKý8«ç0k5Ÿ)ü²½ÔÔ=àÞ6ê¹äù寅sU#ê1òZz»K½fî7Ýí)ýa Э=P®à`™ÿRøºß¯ýÛ&j!• -Ôæ„S2¨*`w"è£|f‰\Æ›8ôþrùxc…F×ñ­é“?ΡDYü‘•E1$g "ï4KÍÚyUùØkˆá5©mtçAº…ú® “†È}¼¼CÀµ–Ù\±+ˆ!½?'yÇ££þç3àÐ="”wé[^¢áZ‘ äµ|U5óM‡£ªm0Yï›Q´øpÅõ!®¿ãŒQUæÕŽ<­~æà›[›ð[œ]Ïu7ÆÈ©ñ)BSÖ*!Š>Ó0ÍÃnRÈ"©žó"Öd¯(·ª•úHô€ C[Gx‡hHGpV¹Dµ~ÿ×.}"Áµ,ËJ{{j™š)ì„rcP! %ðЉ¶=S¾ÀûƦˆä•}ÄWé³ÒŒ‰òŽøµœ…Ïð }·7ÛHOŠR¹ bÒärZÃü°v’KÊ Þˆš™ ¢ÇX±èO·Èø5:ð¥A—„¿Éȹ÷Ed TЇ’>¼‡Ån3iªÐûx)Àñ’%lžæìQí•[U—B`Ý7¼ôþ22i3/é€ë‰‘Ac€:¥Š<ôÁ|5Y`hñj9z(”ÞðÎÕ‡Öo®ÖÜ ’£¤zŸ‡ç7réZ¨QhTÚ˜F¸mSå.ÇÙY´÷?‰2,V/ix޹¶‚Õ2×k¡ÃÑ>c( l*˜íç#ÑŒ}(ÇÀ‚ÞW”|×ÐFÖ?‚â|ªFkbäR Ô ¨ë ú *¸Æl‡íù•â£í*ô?A‚ 1dæ±JrsmsëÒ*árJÈX¬.B–|±åÈ>Joì%†mêxø½6ØqV£Dà¿ÐMÎM0Ýž:”4Á'ÏÌi$z"¼Üe8ÎÀ…÷@Rü™/1•Úz³ÊŠ;§BÑ ïŠsãEÇfà.êYsK¶MhV¨ãƒ#J’±+.Á¸" áÛ&Â^zvqqOÀq_¸ |®9D—öK¦BžîJ<É`²¨É$¿¨ÞƇÃ`:$ó½Ì>;s÷¸ýpôü.°ŽãTë².™?JšL ¤Çpxã–¢§_Ò}yÁ$žzUÎ GÀIu^ Y•,î¨6d´ù%N@•9\oKBKΚT)Qž#Í +Uª@á^7]VÅ”½C:XÀ9¶ yÒØäp”' ?q øx.¬œ |Á{uøÌ6åù@õƛΎWqzyšÙ€TìªfÔWü¿„ ‡L¦q|6$0n¬ý°€Ðít鈨˂ù£QñÓß û×UcdÎïïº>þ|ã*½ðÇÐd¥à!®™TµÚo˜`AZ©xž7€›¯Ó~±r¤ Ò`»9m”uþ•×›ç2PY½Xþ¶ƒ¬Ï4W³}ò)E;yŸ­.´=Sd?û¦”•'?9®Þ:ˆÝÄñ„!A°PjÅí*ê²€óT\)ŸÝ™"Ô)t[€DÊuF«%Ò°c8xXžTHÛ×dR%Ú\¥©þ›¬œå¿ ÆI³·øÂꤿ¦{„f ·ÇÈì3ÂoQä¼³½ WD7~‹²' Å훬çl7 O ¯JúÑVª)CyŸ¿´ pì}øï®HÊß~ù‡ÅŸ$³ð(KÓ©`0ê-n„l¾ ÌSžŒÑ®ou©¤7…¢dâ&“Ÿüé`bú§™Z×ÔÛ² ›˜§Þ‹Õ1 HwžÆyI¬óÅÎ2¬"'›òŸ·pœ8_ä—ç4pÞ‚é\ 8Uø«O]zckp#°Ä&5•ÍoT¨j(ZãÇÿX×Bšy‰¡'“»Sð&óý0)Í÷™m‘ÏE®~¡_˜±ÚÑòŸN4?ÚsÕV”´¨’̼ǦN,&èE¬•„$sß6˜*†6ŸúبP s^ÝiŠÝQjrSsèÞ¹ ÞíóýF:qåçEµ:$<3ËâÖ]ÿÏ~¦¥HC‘žR8ÆõQ€Ü±Ô–ÁÛ$ŸÖ%aÀÛßXbº³&2Þctzê–.³î'fƒÆÏ^±ôçŽGÍ)£5uS7¬EŠøŽë,⯙@ÊÂÕÞj/H×ö84ÝŠ¼qÖÝmZc¶›#\·„ÕÌ‚‘Ü쮇¨`Ìši5n‰43ªÌgS×@«xŒZÖ’áa§þ¦¥Žâá¦Ë¡á¶½ÏÕÈ ŸÝ'¦ B㢂‡zi¶m©¼Õ>(øá—«¢~‘ „ƒÑ‚ä|/y ¯ñ«Ø"Óútièô7"øW,£ë)æY¿d|sSQª‹ìë¿«!ä„ÀºRPJ÷NCrw¼îdY7ê누¿0¥E ê›™4Í ðwëøÜlÿ›4s‡ìÖ–w*‚‘FU—¹Vn:pãì˜;ù˜’úâa…G<ÛºúIøŠiVèh^L”~«ÙÿgUZŠ S0ñëv- À¼N+e™•íÏy«äÍc>e¡4±üŒ‹ìW¢CçÒòn™öu]®  W–ÈeG~Pž××›€yŸ[€$ê±¶æåmª`S€ÞÓ™EÆÍÚ¡4ö(^I DlìR…:Ž8×*Æ}í]w—Š=öbÛvÐÁØÇ›à%Ç\3ïxMÑïPÒŠÝ~ÛýÿBÖU-Z¥}—I°`dè—_XGL| AïqxE´Ðzò‚É& uW\~©»í¤§¥«£ë­Ëó¥!>Ù~þIC3¹Y@à-7L-$¦7§d/eõ2lÓSy˜™¡óíµ‡Ø2ƒ%1¡gˆ+Ý{à+|R1¸®Šð¿ª_hràÃk“‰{iVÛU'È]KƒW}N܆ü„¬kHš íÒU:+¡˜tu¡…ÃA†Ø‚r­Þ~ú›,„+ùù)uÙÌ%$Û×Ä ]>LLE]›ï¢ÜVû‹šó.†ómÅ·<ˆü…èwuº)ÕéîUt©´¿”Óý.Tâ¨]då‰ÚO÷äzyìY¯ÜfÛ¨ÂÙ4Ö WboþJp›,cñÖ9ØÓ÷C¦â°ÂHfE3¬"#¹7ºõ«Ò–ÈžÆjÃ; j®â¡;ÚÁò`8 š´¶ærsò̶éBè‘ç±ç©“/oÅí¦Ýc8E´ÈÁjZ‚™‡O*û­$úKÜü¸<ñIpÚH¹âx(fxNÀPi£Æ›8¶øsÑ¡ -‘h¹(‡KRþ —†ø$?Dó-tš˜ç!t½â3r"Õg›g#Nðž‚Ó­Pè{¬¿óé•¿Pö:LÁnY•$: çiÜíët3ÊÞ µ/¾ñœÒýÍDGÿ° ò¦Z» ÿ½ZRN!üÿd§&«I—2·ZÊŽ)3ƒtãl½˜¢ç¼]º{í»¬•”…pD@C¥“ˆ:|Tð<’£¯+e·i1M‰RMОcDøº|ÔÏø (æŽÀ‘i: p‰T` %ˆ}nÒ¿Uv·Jæ9Ò©YâÂDê±ÉºUä—DhªqSºuõÙÚ‡BÝÈ~ñÝFxOLMª&¿0»}pJN«_úmLÄ…]Þ $ýèy°°($|ÍOþ“ÐH±É)bÌÐ5Ö‡ 8±ÄÐÁéŠJY‰@gÛ̸j±q°0DZq“¶r[µD²“Ó….H)êjG åM,(M¸üAMQÒÉé¨[çÍu'þGž*yBpÃP¾@#$bh…õöy6’m×›ë«wíðùµ¡@!Ô’º$Æ×vñ†…KÛ,ÝOžžÓr5­pÕR”%w¡Ññ”š <3—0ÈZa›÷|¡9’6‘šìc3š•*‚IÃ-‚;–Òù¾hzfóWR:›D±Ç˜¤ô¿Šd­õ\h&ʶ×É?–*:_–ç¦SΜ”¸E)›x»¨9òí_¾wú{q„ÉåSÃ|Ü\sòi%Zg ×¥ør»p­ß’f²ŸØ³¡ïĹœ œ{QúAT8úi~ñ9F}¹-Ùi‹Lê‘?f2ÕŽ¯„ÏÈù}ʯ×ð1½’TDÎZm˜ôi[õQsªÀºç,@ $g²D«Žž®–A:ã~NƒQÇ!ßÙvTOUd¡ÿN£Œ6t|.z¾Måîù®éïáÕ‚ôØrÛ¬+_n~x›ZbæëµP|¶àMƒ'0Is\CóqƒÒçè¶Øó»0ªWçíu/ÈÐ:¯­g×þða‹'¢Ü´:'F„Ò×pöRîµ*¾Å£²€àxÖ ê="O£ÇX$Z˜ ~­t.àš”~cÑQðüòÑÛi|¡£cŽ› ·8UT¦”ÿá¬LBÆOŠCÌ…·Ó¹6”¶sP¤àßë·™äR,‡# ¸Ú´¸ëeye)*pfL§÷šC²]zvµ€.2å€bC½8ÒÙFÃqó€x<¯` ½Äö¼“Êt7I— ]pÊþßÑÓÝCûتùÜMÉGø|BäbFÇUPÚ©í‹ÿÚw~%¦~ÜzŽˆ‡œ IÔ—[¥xÎëú…jûºÓRýôVX³ÍÑŽú¢ñEãòØš%;”R«Wéä95³*TÑA±Ð³öü’í¾¦PÆsr*¶£^ÃF6q,Y§ t; Ãâ±æ}¨tkÿNÚg ¿7YàÏ"ž7oIó“ØåE¯HχíýÓN­ÞUÜQF:¼ÑjAzSÕ…å “®l{•Ý;S"8ú@^'ãâh #£Ð!CÇ%Yí5BÝ~8¤|Qn“d<Ø{Ì5¾ ÌŽ!ròc÷Øœ –8\@¹¬ƒq€ã†ÃåXõ1Ë/EÚÛè¥nXàjPO´e™ñx„½Ð!‚ŽzžÁ®Ù(Y?,ÚÙÅsvµÜ‚`ÔꪕéÀü¨`謙aÒð|¥S'ä’WÛ—Nàê.™m¶|ZxGŠPVãÙœ uÏ«ˆn›5çhä@õ*ܵ×Má>1YBÓZ=¦—•“ÕÖècRwj]-ÐÊ®ê2´x{bç‚“x¿‰ÌÑU ߫毊ýÛêe½\0–¬ÜuqÁº—wùFïÒqø™Ycþá ÕP¹Ÿ(8¥Oˆâ²‡‘³zÖ\:[’%] t³ú”Ù©vþB<ÿ‰A« îóvdý~ ˜¢| 1{qϨ²ÐïöP6$¿Ácƒ©ãkž³Øh)²Ë ¤&ÿ©8 „0eœi6¶Ô§„#ÜIYÚ1 ã-`'·Šß |æLâV³úvï¡V}@­5Ê:\ )(Ÿ“9ÝørNò™ü‚šêü庥«8ëjÚ~ºÓž4åñØþ¥Ðº)æ?‹/}z»O ±š£˜ÝrR·‰ƒq?¾™ß‚`¼æ=Ô/zœÜªy ¨Q¢Þst¶‘ªHŸÞÌÐì!½[üƪ8}{È^½6àC†”.Ëe-VwT®„i¦ÀRÇî瘜¹gŠ—M?>aÙu3yçÎ$ÅUê»;œlpl(6ˆŒÙÞ%8:ÿXÃ*2‹¼a+Â¥Œ÷;Ø£H®»Ìé§vøOmŸÙf‹’|ÿä+²côt N¢è+êÄ&'‚CÍ*WZB“‚ ?ß,öJ¤<ßM¸ðO³¢¾òFxöµØZgt1¼R~LÇÕFø> å·N_€ÇŸÌ!J\xo6Û‚˜p/º.©<è¨s1Ñ‚Þ~®RœÀ‘ÖNhÚq¥<È8&CSÔXjt«IÚY9Gæ ïvk…ã-Žâ#7iö2`_»iÎt_.mÖ@@³¢ ¹BÑCÉP¦b³«*PÔI¶º ÍÃóˬNÛ(„ü-¶{LÄ’ÔÁCJÖ ÆÌQh7F³7÷¬1 ’³3…EZ8¥ùÀ4!f€½kX—/$Õ¦€%«ûÙ³à'gáìÝø‘«•”lÞ‡uÃpÅ4÷\Ê¿ï$ 07,=Á°—i5m6²ãŒ¤-nƒ´sf‹Æ^S2"«ÓK®tºÀAFÞ¨œÓPܰéöŒTGVKµ'OyžìŠãï²¼ºòTäI¼r|™×Rx™£bËô¸C‡Xž¹á-Ï¡-cèàµEÒÒïk%[ìbÌ™ÄZ ›«¬ß!]çø¼ŠXÖTí™çÑŒ4ÓeDŸ¥Z2úì[†?mš{pÝ›gÍáL1ÌN´©ïXÿP-’›Ôè™xÜf¦øt!,-ýKéú1kzšü­= ô.zªÃ^ÍY­ˆ‘“Œ XãÒ±tv}ƒYj¡éþcßÙ9*GÕ©z5—^üs‡U•òL㔂®†ÉfˆQX*WÑc÷“T6-ÁöDã'Ãĉ9´ÒbÑ”§V-:'»Õ…ýÒV+X¢‡Gò¥ÉÛ`A›>6 'Üóõ.ŠéT ZB‹(渵À2€OÖ¥PÍv‚žër®Bs°Ÿ'yà{3¾ÄŠ…Ÿw Ñsè{0áÉŠeÞ®CÈû}ŒÂ‚R<=Ø¢£czPæª&à3i”ÔòG‡Î}x[ü/ªàõ'"OPiq¸>v®Ñ}nj( MµrTaÌ ùkJ¡÷7ñ²òé“~ÿHÃØw÷ä_÷펮׺à0äCT`vA v|Ãi«‡<õ}//;Û¶—W¸GÜ»zâå ,‚Äž^và̬ŒaÎÿSôaûì•§»òà<ë8Wí³;~66±Ï9R²¿ÃŸC¥B­Úöl쵫½ˆj[\¶å•” Ô²$΂döúm`öÊrµR‘2€8œðë WYMµ+í¨ÇÍ9ÜߪŠèZ‹>-Êùú lâ·•qoZ“± å/C™›p‹{ ˆ†2*#2Û¢V ™¾™C,‡Ï} +ïãUÖ-¡=‹S¹{H]kÙ‘æÙÔoÊãÙÜÎÎ-qu° 'œfQÑ9K Îä™Ã”Ú4Xû!³ºÍìÿ"GK»¬šÕ@ä¥jG#[¥Ò@«}6®“+O@W ¶WA:ù€›ÚL/lÚìs>pñíQMn”ub5®ì¢rÃ× ÐÜòí@˜Å¤‡¸FÃÿ÷‹¦†Ã Š]·£ð–·`&o{çy‘hù‰éýF‘$‚>3Xd‹Ï£YðÙ‹•ÁqA¡="üJKÏ€u08µ‰þúÐ,œ 5âaëg¼ –‚„œÀEÔ>Ïlœ@FˆCüۂuz{[eüõ"®<´²&º„èÐí2>JêZÒa¼““‚ºà㢵7M@tïvÀs4• ³õ¨ n’GXT:µG:>)Qç-¿iL{>…Æ`Ì ?ENvóÔ±;ðµ³nY¶¶‚ðŠö;Ò†”ǺŒ®{6½4È$$œ§†îÃ_«;ÔÎßÚxÆlH~@&PšãJ¯‹|qc¤ŽXD¤ðïñœK¤¢øxN˜¤˜Áy”/’ ’ñÉP®µxv¼zÃÃ*W•61z#H†G¨†‚ÌÌO˜¬7ªJó©ÙV”èà;ýºŸB†o¾}ãUìÓ®& /åÙ_qú‡y8 =RT¢žƒËj;™µ ¢hé*´Ê…m¯¸çÞœ&ê3{Ö?Ùo3`B™©†ž-ó½DŠðú~›,Sù(¨Sþe膌™†&êÖ'Ì9D"ß Ô ‹Ù®SDŸÚƒ•{-!ÌÝSéúõšv]clŒr ùr.l#õ¼~±µëÛ*zÝd $ó¶êhÑ>·’Sž/g:ÄÜø ¬ÑÀ&´á°‰¥ã<ÓUês„DA §P¼un Ž)¶¹ƒÝ´5]Á’­çg6&àÀˆ>B°4]‚.vCϬ§Ú¾¶s]Çy¹ôYjŽxw¥Ïky 1wI¥Ó*ÈB2@íÁ¿Õ)Ö8ÕØÏ³dûß*‰KŒÈzbZJ Àú¤Tu[£&6ÿ9ó³hÞVh4Nᾜ|QâÙÖÞ´ M==  µ°ß„¶jÀÞ3ºµ^öîüÌ\þ¼dF£¹OƒQø!h÷s1÷…–6Èféx©ƒ«NŠHo{#°ŠåµN§oãÊO¨؇¿÷¢…õe¼‚`…Ú'?Ô2r†8 0ÂúóXˆ0Ê­ì>IAD³€Å^>ñc¥ëÖsöÕ²âÖAØ0Eí,æÁ UðÂêIvHy^H¡™V ž}³Úc?ˆ9ìrL–ê¼òûXiâ˜[kêFÑV›?y,RÛB0™áó’×{j¦ÿŠÈ4¨\2ÓúÃ6~$i{*áJ¢\¹Ç8E…VœàòtݦØq˜ç¬ôÀy%{,¾Ë‰¬z¼Š¸Ô¸ÿˆMPfê£)ô^DaÔ^‡†ÈëßßÉd سÑÙ‹.ŽJ‚èS’s@92h å*÷Y:%¹˜ª¢]ˆóÌ˱Ïðš£â4Ì­s‘í9FâW¡Ùº*KöãGN–ûc$¢`…6ôÁŽˆËûùÄŽ0)Y©(”ºÅ%þ=Éè¨É”Õ%nëæsÐÔu·×H¶æH\+LçƒïÄ2uÉ-v`ûin„0Ì<Ó6–®Ãƒº?ö K"Usóç/ë^Ƭ-­÷ÔÉ•©]:/ÍQÎ R'°ºÀ5c†´ny˜ȇßÕ7S×oЛϙ¶0>â¦nëh“,i…«ó[ìàÙ÷ÍÙO2*rZí£% øûˆQ$M½aÿª=®~é<@E¹Ûb·_Ÿ;Òj$K(…HËMaaþ£69iI½v…Áëþ™ÝLá>Ù‹aÒÀÆ"q6y<Í>Æo֞ر¸h¼óT_„±¥”O½«Êc’ŽŽåéïÚÜrr|xòÛ½ôZ‡+Ù6Ó05ue·Å½Ö!¹&dü ³Z?|Ž5ú}c“Óà[~wlN¶õ-xudý£vRMY>´ê»C "ôå({3º‹@ŽMfž­zô¢˜ërp꾺ÅÈó*¥ ð$–iO¶êK¤ö¨Ö7²nduf…úßÙd1-J¨ÜbÆo »jlKï»f‘ßw¶äÀÌ™‡åû…J5R‡þ= •œ$¾ß•ù¡æzê’9®ñZ)x2þpÂv¾ ¹5ù¿é²J»×lÖSu±4…%‘Ä ¤íàKÀ¦3XŸq’&¦`(xÇ „ŒëXÁT{ÑC§HuH_™  …†–ejcÏ¢À:a×\·B­y q¯Ñáµ' ~y5…Î\©@qQ–(ÎÄùWð>Ø%ý vê¢ç¼Umi~ë§­þü4Oßu£|x=[4" M{(<@Wï&À1 1+:U1Æ· éEã øŸ`ü%Ä?!D½fÉöç< c~T­M\áÃ.Ìqì*߉ô‘Ïà{ìÖý»ÐaaEš }N<’Yïka°_¡€Ú`±XÔy&,´SðJ–›]ûdxG¶½@¸ºqKõÞÙMBx…9þŠ$~ˆ­î7º™ÕÈ»ÜæûÞù:ÖÈö>\}œ³ÒÖsfΟqÅÅÌø‰¥Ñ(/CbäyµUs Láx‹Y»ÞÇÁ©÷/ï-yê?oVD:Jyïso2¼£ O‰‰IœP1×¼^4ŠcØFpÍL±(³ÔléÕ58x¨vò8½ò÷ÆWÐë6%}<•^Hè0w ¸KþŠj‰4ó.k>^ÃÇ¿,¶Î(*ñ¶òw(–ø¼È»?ë‚7÷!™piñ2;r É:þ‘œ§ ¹÷¿ƒ‹ûM|'O:]-Úºý„ö„$\—ºv°Í ÛÎwRÚ^ÒA`¿µ¬¥N€T´Ô¡õÚñ±g:xqP¢ðZ¼nÜ~f\Èñ[ÿ,$WáK'ÒÎ=gá`bzLTQJ_ñOîjv º8$FÄØHÆa-]¬ªº-°-Œ_:r7+Hž]‘˜$8¯‹¥§?‹I²ï¦‹ !ê˜*ú5†¿Â‹q@KQÏni»øÅ°ËÃw¹õ‹7d¿7ËCæõÉvlkã=n@˜Ò<·›2i¾üźD¨Ÿô_hÀbh%×›àuƒ%u¬ç_ã{îd.Zâ[ cÀ„ˆ PY9Ü+Oo@š·1önj@3agg¯ú5\ÜôÝ=Y˜-ðã'ÄVÃÉS ï³x¬žÿøg*HØáÜ–³Ê’ikl’¨Gµ8¹€´”[ì^S›‡;]|o…4˜Z´£kŠÿ býy)Ë:B¿'vO´q°ëá—)/§^­£l}~;{‘_Ô¼ùz£Îs¡~kYZ©^¸I|‘Ñ8/¶ùc`£ 4 hgL†_ sÑ7¶ÅÄcûHïóxýÎ+žœ/e¯Í`a`×XF,ÝtÀ¼^9Ð27£ÉEø±‹îÂ:p…š¤¨CûjA ã/ë{äs®™² é¨ö´OÅfTºœžß! ëÎz zæà‘úÑš«u’ývÉã‘ﯽádã>OÏ(€k™ð­vÛÓhvØé3Š(ùÕeÃ=’‹I½3q\!˜ i‚Ï—ã§4Ëçý(¢Îe‘å|Õ¡¹çkÓáß)5ŸQÚ±:pEom^tZVQ¬ä™{ãªR–Ö„•c«ˆùš þE¢p½8•s± Tɺ°¹15=»’utÆ„[ÏÁ ÄÌGO7$¿5Œ’ͼ–új–þ±»'o“*§4EÜâ© ¡Ö›q‰´äŒ§ïõd”Q¹Cõ¶Þ·k™zl4í\ö!éH%!מ(µ_Ó—úÚ]þº1çkÀ_Î5¨ÿ@<‡†ŽÑ+Ïûùâ3Lé£ÀaˆëNgË”ø¦z'©ÄÖÆ ƒ¤Ú©Ð‘åä—Xms¨GÓX2¹…«ÞÒñýƒ©{N¸|L -ß¿l)|RØ;§0<#çKÅÿá6™5/‘öðºó`ƒ¡aËà¡âpu;ø²%ô7¿¥B:LÎ%ë<ŃfuÏ}gkáø-…ÑKƒá+N«Azç‹)§šIÌ ÿµô¿ûœB¾ˆÍí`ùöÆ¢³!hê@D(ƒ ¶ÅEƒ5¬2ÇiÙ\ÃEM ÖÁ€žWˆö=O¨ÕØ7È!‚Õ h. 34ƒ{©ÕIÇ¥DÈ«ó׈Ä5ªÅMu‹Á0ÝP–[1ÉziÎöÂÇ&/È{³è™¦æíûJ¢JæÙßIäuò&N„pw®¥­ƒé§ )Z4 Tid%õëFc–;$Hñêí3±1Qäó%óÜ!Oc5ö*RîD'_›4ä<‚7:\‹Õ›¦œý³ÊÚS€(Ï€cÚò•€|mÈm›tlfêÂÄKuF-]ÏÜ8,rF|¯ ÷ü‰Õ8c·Ç•Æ€9iˆ3ÿՔ—6ªnܧS)iÚ5ùÔõùI˜wq–žË`|„}lÌ}u²b¡ù7~OÀ¬q¬†× –Ƽq{¢9|”Â^¡ÔEžžâ‹W¤ôAâTìÖ,Ä aÔnÒ ŽXãÊLʵí'È<7&ù¹-&Ò>Eo‰AŸ2¥º˜JÞDŸÅê"ŽÉ³j ¢ ¶MƒæîvKÁþ]¾<. uhu‚ý:™Ö.¹ŽOWfmèa‡øœÔwjÒ…ü­„Nz¹Hr½ª±´®"qˆØÊPg.w̲@±ŠN~5õ$fà@ÌwüÀLeC/³¢÷ùéÊŸüªœNóK6WdŽg“Ŭ¦Ñ×xyi„|‰»VøD€¹{è˜ñlŸ½íÄ1cÖ8BU¶¡kÈç .úÉ0cŠhŽCíŒ+n´K ÒuÑ“¡5¦‡ ÐfÎD _Þ|&û SP{WADé¾Ó5HŒé•¶‡QÞL @ÿªq]](žìj<5tkˆ…ñ]C^ ý÷K9—Ìû½2&~Ý{'ÉÊÆ+óNJÈ-Ãöºd|G mÌ‚[•û›zjD ¸Â_«'^ ¸ñ…åv÷Æô­Ñ”RU”B?;kÒÅRSĦQt½™®mq“¦OÒ¡ábp'–ùâžn($â< ÝuÝíÞŸí-U=R‡¥‹ž5ÔïaæL)²ÀZ €ÍÔŒ\díÉ ÔÞ=%Ù»!Ã=úã&‡ú_ {ž5ômw¸, |:X%Ô=Ò& ªàióñ<ƒõº­TxŸ¥i£¡Øá‰¥H043#ê=£C–ƒÏ?–λ[X€(W4‡‹‘‡ ïZ¦¹Ÿ1QnýóËm%“B¤wô]­öte’eŠR˜ú+{DX©¸|UÛïl‹`¬èöv.€VuÁrXø¿×æ×<9ÖNóF:5;‹yÓ›‰ûÆýM[”_çÜÀR;¬ª°œËõ£UÖ\Æã`Ñ›‰Ç=6â:$©„äZ!è”X3‰œÓUŠZœ’\?‡Õ·Ô†²‹ë°¸iém"÷ êôÏôqAI+&c¥×}ÿÛ”®€‘=ÏEÈ,ŸÐgTþD…od§ÆþLý±ÈýL‘GŸ9B„Ì ‘€Òì½q¡àÛ¢ÑÁ?Ç·l„ôYíîË > ÂH!`Ùä5Æ·F?¤š)ƒµc¶¥z“|8N¿Ó¹s`nÐ,žDuí lߨ &§š­Óò)î\ÀÝoó8ëŒù=£ ¥æÐ“¸°9uPs'ÂßJësÆþÿ•Œ‘bz”pÄ,íêõ.!qŒ]¿7Ã’d‡\UÚ̺’\œÎÿ -oËß›^ÍáEHåñåÉY$xFžH¯¦€ìI0Úåeþ.råü!óH<Îëå6*ܸ×é\o¢³\;WÞmAÃnÊZmFiS¯ænʇã]©¡ýv‹Kù±Duÿ![ßíñ­•“€‚]èµfàÚfuh*¼‘M­Né½K¨i;n5¿ÍPSVíå…NöК)]|]ËMº-zóó8ý¤VE*——Ú‹{Thôò$ Ôò¨%*Wñ„v2ÛÕ?86ç§ÿ%Gÿþ­aÍ?X0 æË;UXÇì1<¹NM|ßš|SpÙÏv}°(KƒeÍQcÂrx¿‰³qH½!/³€´?BVAÌM‘2€ÇV[Ìôú–¨£Tà0³c8†®Ÿt%fjVõê9]ï6ú^ᇀ„¾EtÇ-K7ýÅY}r­<ÚR®û¦Õ£+PN¢Äã«rdŒZˆ²;'ü ÄÃ>:R°/½Ý®ü¡ƒæp5Ä}ÿÉþF…ƒIý!7•º§ÛrrÀØ‹;£ƒ£'ÓÖ³]’µÞâ\vLF +ˆ˜Hï>r]C#|y–Ûë'Û´ÔO±|è°ß,È|¸}ÎiÊ´E‹YÅqb´ìÊ|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG Ñ‘ª­`ºÎ±'\Y†éfRX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*lßµ;ðĽ._ª>KfBÿ“øqtlÐ}blX„ŽJRb…çÿè§GP BùÝS=ø)d ;€Ë*lßµ;ðĽ._ª>KfBÿ“øqxYø Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îoÁpMG Ñ‘ª­`ºÎ±'X1â>H-i‚4-‚lÚ»=aÂÔár…3ô‚GrÕîšæ†¼àhÒ+Úa(‘âL|Û0Ôæ*QÔ¸5œ¹„d¸Ô¢ó>p“—ì³Oá9ŒŠhû7\’sg) iÖàhI\6ó»HÄÚ'2¹ÓÝ_5ý&4¤b-®Cµ‹‡¶Ñ¿4Ùõv5FÄ¡)~¾I¶)ô>ž$Q_ÕM3\“žhoFßõ9ào5¾–LÞY÷rgØRl"€Z-W¶ihVΔ%ßÂ+?ppd.Õ4¥̤DŒîÃäA ‘7qèéZiÏ—žÒJÛ´½ïlirí‰_ñ'ˆz›€ŒÛ{9áýy„^ ôŒÖñlÚ©é±€zŽY Õ«>ž×Â) Ðþ“X3 œZwbQsÓP>„Äê\5RjØTÇ|±Õ&'NêI–ç(Umë›û¬F©ý!RúW ³=YË Ëìy×Áú0(±mß5eCp@f$²SJÿ”t…PÓ²Ž_5èëÓ̶xî6D­êPD;¥Ópó€W† ÀmbÊnm:ÂÄj«Šdå¢-Ö +7H'ÿ©hÚËÅ#zø¶L%ò×Vú©S4l8¬3uÏØoXµÓºÕ ?åŠ踟°Äâ{Ť©êAÒ‚†Œ A“g•=:¨öA6Ýî¿´eê¯xTÑKÎPª4ÞéØþ϶Z }![lpE”* ™ )üã@„žÏ+£’€ø*¿¬NÂ,S¬½×ËÌ;T@`ÇPÞ*Ôªa£I) ÷qsò÷­ÉÄpö£³bÅû«•“íeHdÆÔõócqÜ3ö*ù{±´—ƒ*l!ø¨è°{5žŽ=@šSÌ A‰¨ƒ`§Øé>»wnÀ².2ŸÀw0bÅS&V€áb·ÌÖ’ßê¶<äž2”J Da³Ÿè¼ Fû™˜Ÿ6zèªĪ|”úãÐNÿAÛÐóOBß1‹¡«¹Œâ~ÒVEâf<ª?Ôã˜~¨ò,·(U‰N•,`èY¹¿IžîÜã£LŒê¸ôԚϩ ¼•ê³ó¸î²á²ëF¢‹¸¶tGc¦±]?¤bËøÛ•ò ÁgÍ`„7c=,kºþØŽ+X¹Gä¡,¹½# ¯ñÈ?ÄUeÈÀÅØÛÖAµvÎZÍ¿ DVzS]Ú1:€:»œG“ÔP¿\AQœ®²4WC¤£+õ]UåE¼zøC¼io®O«&¯ð²…;¨ì]·êIˆrv¡Ê±ˆ÷¼DõÊ€9 äµèû "‰kãZ¥ÑçiËÌ#’Š$­— g?RFÀÊVOJ¶¸°è~Šo? l…³bòÖBiw†þpá\g S¢"›º:~XD™`í.<‘˜¯eÄùVb¦Â/¾Ò]ià†Û5:Ø®š'RÅãºÌÏïÞÓ±?»æ°Vù'ÄŸ9}"I›J¢¤½O䯝­Î¬†Gã§;¯oá´õ¦u(zÊ*<ëCÒ; ÿITh™5D²rÝÀdAä4wZæjè‘%à›(e8ê¡k,YÌ †UŸãØ–½hzù¸“*¯'15ŸÞ$èJ3Ç=aK6iËï˜D¶-næ³Ô?ÔCTòËEÔ+#Å8ÉX¥¿Â¦n@p%¬xQ™`úêyÙÕKH¡7úLžÖ˜Î{ŘS@ÜvýŽÎõA=¡®ìUÃh€~ápº:­àNœi&€»¬‰F’ÖÚÕ3‚ÿ°ÈI aNήªrmà~v½8FŸÆr«=7·É %o {6v¦ãKå¤cHzp«¬ãÄVË_vN5³Xå¤wk^Hyûǰ „ZS”“uƒ‰¥@‰Å¢·ÃxoŽLF å¶×B‚€‚¿ D:˜éõ&SÖ "wßåÐ]SR)*FÙ!J&SáTqgަìì^Þ”mF¬1Yß{pèúL ;¢5ü®§Ì‡`(LÍàÃõF¹{[ÎoõØI}¹Œ·‰Qph *ÉAy&˜ÙTöºÛ E› Æj_ÝvcSã£0$ô:ZX­v¦íbP ï‘àïÀ@ï$1ˆËÃp'Y4—ÖQFYÁ•u1¼ÙËñ¤z býîo'S¥<(æ–9›a3 ±zÊž™„hÁ”zÞºb}+V'Œàñ•¥C8@„ô” Ÿ+”4H]*Štœgöô&¿,6dé‹”©3h[u*–Ìa¶Gc™z!BêçèŽÐ{·3ÑÙmy–¤ˆ`³=yáö´vç¾Y"Åéö¬«[„`–™ëg}sýǨ¯ú®s–½o$ô¬§”Ã}÷Q"\7Õ‡r÷©º j Rì&Éú[Œû¶ LòÕu—‘jü³ˆ,¡îæ¹bôiQ…â'NdW4ŸcœH®|"@PòºÝô…SÎQåêÍ.*1|•TÇóV» @öìFU"é™à=‚îš"WáÎ~à¨8"¼2¢Wo Tn{Ž=¯¦ ¦mùPÿŒù¦„ÇV XKf>†îkmƒyÕ×øÔŒ´Q7¹­HJg]ŽÅ•™V>‹ká<¿¹Í±ÂF¿øa:±ðËÀÅŸ2ZQœZ€¡ßúkº1úqyO§1¹X „fTïÞ qŒj‚XªL’B"SÜÄø ߨeý,dõ A¿2¬£¨,½AÌç¿Úe7•ms{_fwÌ´¦òWB‡éÄw|˜ :›ãßÇOçL„Å×çNЏ´ÍTf;ÓŸ8ÿ$R·†2˜€„³FþqÇüÀv¯¼áðÇpÓ?iß Q 2-î>Ô!ì_<ªÖöV²¡gNÛÚ›ÓõÅpØÎžãEÆGðÒ±Uq¬*Ú”Gͯ‰ªô”¤iòášÐ=On¥$ŽÒ}¼*” `»š ¦¬"Ì+ÞçM«V®ÅªPp|"¹\ChJèÝ>òÇ®zr›Àg*œ5.1«Ê¿ò_B¿NUlÓÀÛˆåüô’¨ñK‘3™>®þÔáBOOQ wo}Ë|{[áTä{?÷»¥ï-Ìz0q¿¦&µëlê•—curBPg1ïù ˆ¬<íT[¬ê£fä× ŽÕ1ýÜâ|k.£'GDº“2ñÆC³ ï2¹‹¿©É¡Yµµã™\_å(3¹7KÞŸ%ËGfˆr‚(\[DßrëßÿlU´vV"`¿ÞÛbiáý‰!.»Ä)ŠÝ2\\z`—=Ä¡ @÷ý}lü§å! ¤¸™_@­âÙë‘YÒ‘¸ã²éPû¹iú[~%­¬_w< Mq¶û7½›3ªm7ÜÑzÕ«3cÓॎKo}!VÇáÁpk¼û]ÏðMâY‰ˆ;"ŠIÕ€A;T€£¥M:,í£¼Sén‡E­i4À„l©‰€­¹2”Ë’šüÒ2[ÁM¡+”-»-[‹œËÁã•O)vvÊ.쌢jH]ÇõDLØ Y…Jäò­ woN çëd{K§ùŸã1‘¾d.Cµa­Nt aÔðz” ªØM'ÏAã¡Õ¶¥Ú”QݪÐŪܠ€¾ÍO•x´×ìšVF×a—Lƾ~f¢Ô®¨|õ yž‘g1§Ü1;~έô[F¤Ç$ÈòQOŸÝx¹+<­ª"òxî\I3Xn®^}y¦]P¸¸†¡*8hw4HR»/Iù¬‚åz®M³Ad÷Œ4Ô3,ˆ ˹AŒ;ùnwq(’cÁGÑ@ rZEZ /µô·ï$>‘ ¼õ÷5o¨("à»yø-?ƒ#ÛžSfL6oß÷¹j¼»HöÃà+¶öw•´”0I¦ÃQƒüåqê¯uæAþzÚ®¹ü •#WU:Ž[)ïÙ“Äwô¾#éà‰Äí7÷£„Vâ|&1WLŽFãþèÈžÿç[ûCçu^Gx´¿à3<‚VDy¿àT| gJïIÙ^ô•›éÍ#Sr7¤0»}äq“ øXÉÐNNaøß-¶®ƒÚñþ×sr]ÑLÎÅ\´áʼnBö£ yÜŒ¨fä/ÏÔZqÎÐ?€þIíG-nU=„Ó½6«ÂÍÊ)6DIîS&L¿9± …€‰pdÊq Ž/¨<60U°y<#có»PM“pÀÊD}A^¥S±]Ó;<0ÂVD˜Ð_ÈrŸ‹¤ê<œ|M³þ(8Âòê‰ß29ܹM‡Y/Ržïç¥X\ÚªG¤mª0yØcÉ6PW’ù%î¼Q‡¿î/IûºýI”ù©»Œ)+ºWÝF GŽÅzýø€¢_¾pµ#šì%¼ø8Yz[°Ðˆòß}Ê<8s¿´ëCä1á\•]Îڒܾøœ@«¥ñ¬£œ|^é…üØÊ{j /Jô£˜\@êQ ½KDþ±-ÑÃT~‰qs¯ä–šÊ”’6PöŽé‘sªž£ÏÛ?WÄPÀü!¦uŸæ3cttâF6°þÏ´DªõÔ‡GTõع66¡¨á;úªmÌyS|üRÓ´ð,¥#é”î‹ú~„ýçXR ×Tb†÷}îëá÷ÂñiâžD­÷Fœ©îówûû˳•e@2‰øšJÙÔŒÊðO©kχÃ|Òù>çúi½èçX–¢ö¦Ï~Š–2ÓÄRéž#¥øÉêk(tq›áU†NKHìå-ç3¾½×ÊÄG² x3Ç'80ïÙöª02²Á©Û EÔ{¢7©ˆ«sŒ!" qÀN#o¬Òƒ~°ëF¨u¬(Ñ¼Ôæ‹­•K¸Ü‹MG_†Iðæ>Gµ²p§ËáÊž½Ã, ówŒÌâ&Û×vû³XçhÞAõ'M»!¥ ÉÂCx¨rq@HnVêíIüù½r …í¤ÆSát»`4áP!G ‘½ˆSŒÜ2’`\€žŨYÕYJq{Äb|2Eüa¬?ÂfµPvýÀ1ÎLÔê§JMâÂßA™1æãIÿF#€ªæ? #a‰tÈz†è|ú"1/X°.ГáQñ3Ó¿hæðBÚV‡?ü'¤¸[x|Ç7 ˆ`'·¯úqMÌk$ ñh×g~A¾WBë‚_Ÿi*³™ôæ¢:“ äц Ø £ls²6ö+„ÌÊè7=@¹àr`}á7kž©ýÿEÁ7³3ÑnÿÃæF"2*@J¼buL“‡„¾JæFQu# Lc!´?µŒxs$\ÂAúdZ¦`ðCÔ–eF€/Zk·¨oˆ³¬Khé2npj$«)"Ô´#Ôù²¡åÈËi²q¾é$¥bÈwu9 DG˜ÔÁp¼Êçqè"àý庉@ßúZÝ$#÷dÈNÌÔ–?DšEå]\Æe&…œ.pýÈ@ÈÑÛ^>ƒÓë7ñðrG1èUØF±ÞyZYdø¸¼{eסœô3_ËN(Æ7Z# Ñ EÇuŸ0sÿ’%e!KÈÊÛà[Oè ÄChÅFwÓ5ì#\ýû8sá×·.pŒ–ÌÇFeÉ;ß»`QìðÓ!}c €CQˆÈ Ï€•Íw³-ie¿Ô©^8ØmþS‚KéQ“””U¯.!ßß ž³%V;“ÔBÐÆ-óÉ×¥žºµïoÜl¦¹k2Š4¤4ÁCgûü©ý\â·‚m¢ûÖ|2F`«‰«JÖ/‘ÒŽd=}¦‚¬QI.§ŸB¢ÈúÑ*jh¥Ë:$ÄlTÚ¼”3êîEF;Ç*?Ò²_ptwvÖ×ôJÿ­ùtEj˜ßäû%¸©óÒRë mïZ‘ˤPó"t—¹èŒIô^»—q{%àRû¡Œ†2éú…\~?Úu Õx,?(] eúV=BNl±†T¶šV+*EOñrih³h™Ù¬ŸÔƒŠßÑ~}¿Š÷”°·›$dËz+&¥(øö•\C¨ªú2Íù³ê0D'‰òíÐì}þ!B y ®e­RQ÷²qúIÊÁö¸³d^)ˆâyöñ6 œÙî(ûH szø/$A%2}ü~Š_œXGƒ Þ4pô÷žX‡Ê;Ô®èºIØ<=3©ÇV¹޹uBc¸«UknöòhÍW¹Ú¦¾íFE£¦c[*‰iÃ`(¨Âûò ÕP’ëÉOé´\´"ØÜûköêãiÉÄìbÙ½þJoÇ»U½^˰Õ)µ7 ò‹Ø›Ï͈”Êè:d7`Äsæ^z0¥¹V¦hѤÈ$†ßQ¹4Ö¹õ÷_¾Jº8r5¤Þ°YX/î¿ÑúCÙ«ºÇÒW¸=œwÓ3˜aÚ|1ŽéU‡jѵŽixvÒ“x5£!LàÚ¶<ˆ·‘<CŽ…Ùî@èé„5;i}Å—+/ÔÒÖ)ªÒ_àæ9”Ÿ‘/ÝŽ&`]ükx‘+ÅmÊN(†vBu‘ù#¥ õ  >Mcƒß+Ýv.vÿØÔÓ¶yîH-F£™1…ÝVc ‹ †X|ûñÝø>c'òf]Àb:á –y:ħ»Ò>_ƒS„tÆÀmnD7·¿·Òq®!&Ûqü©8÷§J×°¡õ2KŒ˜¼´çV|o/Æ-"ýÔ°äÔTÜ•ªK›ü Võ÷,($ ïáŸÌ›¡û²$|WšBÂwlaÔR6¡®dn/|TQ1žXâå£]Ô:ð¶VšVŒg«.÷ßøë’ ”¥b¸‰>ÌóÒbÅ3²ˆãž}ôËÈÑfÔaÜ+šÁ1u–\¸H–0Œ`ÊFÓ~¿`Aþ¾nÿ­U72½l™#Œ³ $&Gé}}©ød²[ø;ç]WZDH‡‡äeù}夜žýõÞÅÅ5w΋ÜÒž€a9&® ëXeŽžÙ«­2Ð\½¬i.Ø;»›¢AòZÈà÷Z¡ðÉ™éGò‰¢róiû ‰*Û)¶³ynïá+ÿ#¨‘ÌĹq©¾#uÝV˜ Úó81_]¾Ýq‰µ³ˆO_§cø¯F4Êú¹ìâ´~paç!)½%?lPB^^s›!Ïk•pñÔ6Ô˜GxH6S>{ÝKÂYT¹ºÝ#5Hµõ1(„? ‚S{ŸRžÚ ƒÅ¨ÙY´,º™©—ƒ¼ž†ÄOh7µ>ßx±å/ß8€üK­gEñ“2eÀã¦.DxÂ70w*œŒhþƧjfNÝ+ÈX+„ç“Õ=tˆžbè·ï•œ¢9µébô(¨`¡Mm‹qý¾']½xŸ·´HM¾‚BÊŠn Õ¢*C…eú‡X5bˆÄJ[š ÍøTéÊÑyâ­¯ìÙãÐe6Å£“‰¤Á©kû¿EÎÏô.¨™™pöhik 㥮¡ÄÛœÏà.ÖKša憫¾#E=ä[\*XØ¢0AÃæA/Ó*5Uñ7ü?yyOJ@r¥k& ^-¾Ì?‡üo°YHg]ß9ÒÄ¥z<ö¤L˜}Üëֺʨ‚¿ÖªsBÎVædHë-R~Ö{ùDK>–p´êZp6•%ªg/ŸGh#E1WÕa÷ÛŸŽo—½Y5A.FQòs“v %Yp ³FdÕ¥=ÞÜm·‘¢à¾*t£)ˆ¹ZSuKÒ “ÇdÇׄ×û +h ËÓô㉺¢S/@ÒNýÑ0Ö*¤º /Níã-3Ès˜ND¾¾þ>w k éàjäA¡2Û^][qlduŠeÇ‹PÿB@mO”óÑ&ª¿Ë:Œ0M°  LÀH››òúÏî˜“ÖŠÛ iasP¶¥û ú^l.W÷êTÛ˜ë—ÍÝ ·¡óa ŸÉÌ@¦©EKÿä Œ뉘ØyKÒà2¡­ÁAT$BØÙ†X @¼NQ²‘"Y{|–ô+´³¿œñ Úísínt ŒAL†IÒb\³MC}¬ ‡­ØZv cÀjØ …Gªÿà{¢[Š©=ŽßÜÖ»de5^2%ÆZ:Æ/ «÷ˆ„ÄžtâÌèDÜ&‡–£V‚%)’T¥¦µ¦?¾²Œ<9ÇÙ ~ä#áBÊQ óåÑ_ø‘ZÄ&ªî C.É4ȃ±¥„o=eýŸ¦€d¥Ìû*¯_`Ö0R?!PëÎ`õ—Æ'pk'å«­îºï®ÙP ±*“µP#C³ÝöÍPˆÈÒ+ŠTÆ#.ж‡Ç_ÞµÂ@D:Å×üWÞ7ÊÊ®¤rv²3,ºw'»• Rkòÿ£zõ&Qdø×ÝÄÝåˆ Y= cQǨ®É²Øò£ûqUóaÝåXS)ú>y·{w&hniiçÄ ¿:±îðö°ÍNBC¢S«‚ë¥õiȤÎÇ‹¾Fì Æ€C44‰·¬nß*éf:pS𣸯áWiA–8ZZmszÍžËU«¹º.uý05#yè¢r²*i(üž·­êtIÕË„ Ü/e°Yס‘ùéH€üÕ‰ˆ÷.-Om€ðé:·:a•Ëâf¢‰ç™ëŠ?‡wåÁÐZE Éâ”_•‚kšvN¿Ìþ‘½TÕ"C°¡F±"BC °ÌZC4ÇU>.Å4cNŽæ¶'Cê ì •ÇŠcäÝÆRX«1 ÇØ"¹o~dç6‘Ä)f­¿»˜XwÀ èÜðo±©â‡o‚iÇì+nD8ž0úË’8»¬; ¾3,Ž+ܬ¢™µVŽ´¸Fáxç¤i§öÅäÿùCÝwS¸ïÈa'òªÈ`áÊÚQ舋&`2âÿÃê’=»j&$¡ïwY:Ciz±G‰ÙáÓÜ«äÞÂ%ç9é,0Çœ†Ñ/FhrçIiDÍTú-—Ü—ºáõ«A*¬#M6¤Ç®a¨Q‡ö9ålF¼ ©éˆ¶q—»Ñº±sÖrRùdݦ¥vj×â³±#]KÆ0”©…gugôZHøóË Ørf‰Ifî\¢ Vk(iR³þn/¡óm­%!ã-Ê[u·Š–&³µ]ˆpÆdy}dZ¥kžòMâÀ'ô ôH޼׫;ÆA²÷f¨Ô]ü1ÙêeLùG}^ù¶Ï÷ObL¦|¢7ík [5Ñ‹’~ž%"˜zîFÙ‘jDb¡Ns›.ËÝe v-éwP7J|7-Q§€ x÷AË!ôeµi9ƒÁiǵeËùmW^­–ýù×dƒœ>é«£Ò EaHžû/ræ~êU ül­? â\÷Ðÿ~¬è^«à!w'Š4ùOpuæaCj ¤J~™_oK²¶?"§M5OK0,±ë )g”Í?²<åz‚¤ÿPq–$9K…N¬+ª²xd ¡*(Î,Š$7zmIŒýÓMÚ’›…>¿´²{F…ô-¦ßi—è²óÀ…Y5I±~PÖí˪B‹:àîM‹Vƒþ§ç³ × %’=ÊÏt%qñêKNBûÚ/½[Ãß÷6¿zRÔËØ‚ˆœHULRÜR& !÷e‹‡ë“Pp´ïA¹æ}–þ°©å­íéç;œ3a($4“þ–—õ¯#ê…)?Sø¾ÕT·+,惧ê˜GiÈ>¢ÝW`7L…T¼(æÐ¹‹#ÇÇÚ•aø§4›½¤¤¶‹·9`95ld•³Çy·ä÷i³7ÿÔ©U—Q5¾ÅV#6ã¹,h.æõ‡WzŸŽXrç>@x°±™“Î)i–xh³.‹!¥ÿ†þ•‚m-Q|èᓤ×ó?Æ­W¡7ã®Í›}€l̉À‡zzŽóÞ<`HiÊdÜÅÍó¨o:d… ¨AÜ»OoF-\DÀt³“f;éÚ§Ƥ~n`†µÝéíú¬9]¶# <ŒP“Âó¨Ê๖ù„u5NH‚fÛ-ú¹îFçëÑò¼j4¡ú#Ò°‡ Ä]ÆÙí@þ9€kÄã+ûØ vdr‚@ŸÙg.FY‚¯`òèϵI[Õþ2F)´ù¯øJ”6Ÿ€ZY“\­Ÿë—&gOÎölŠvã—w…1ßü{jIêÞ8 ¼í ƒ°%σ›<=-?1,~Ò5bÜ”+”tÇtk£—“c¥“t \ˆÅ"Z´Ù\(HcH%-Á‚—ÜõàƒÂ?€¯‰oÝZŽí…¡÷Òw|SH8¥ÏCYêº.%–„•Íø&ìóÌ¥²~­•¢Hí£ É;¹,ìµ ÅL=½Bñ™PÇ[M‚_@œUÝcåÐ(‘x½¾9c:ÒÈÈa¿¥OÖ›ÙüÀ‰óN]coÁs^9ÁªãÍï,aõö]oƒ "a~y<\ðÜ ðŒ§¡[Á9§¿UŸ‘ΫiÈ>ÄÃù—èJLòÈ­À~“J?‰¢L—v.GpèPÇ÷(Âý­\òg-hÜÔ…]~!uf—m¡¸'Ó*C…ÉÁ¯C—I^=ÀWX ÒÃõ¡Úö71êYÄã©÷`n©BSšéP†˜²2%tJ+9‚ pÇôÜE™óïG‡h`œ6ä×èç7'ȼ“oçr|Ž~ß­ªð×®…qð7ȱ™èöGÐmJDno‡Áù`>¼U{j¨!HïþOI,Á»í]¤! 7bþ(d_Õh^ za†ÂIÞ,iꂽ¹/ «îH¿ðCþs°/*rt‘YœvØõ)fæJ ΡíiEÚx0F±ßŸ˜K¥ÓS›¯<ÉB¢u8miŽÆÑÉ„Œ)x¿Ä¿ÍÖjf ãÍÖL!‚ùz#¹1PZÍõx·,˜“A‘](å†ó<è=pTz#™Ñô¾¥7^˜9 :¯Ø€l¨}Lyà ¦.$÷̬â2x/½'|4ìß…°sî¼ý ;$ž`Êö….à2Åø§ýÚF ´ë‰;áï×#´R¸dПjb½ÈUfvîí~Ì"ãßN#>l|±DÄ·ÉÍûc³m!ð;„ÎéÿW‚ ›Zó°Jí)VÌh¥ ó­è­Œù EO¶óµ½ayÜ ü/w%qÊDuÇ_{ ÜùÎzsÁq ”š¯ïþïcÚ‡ŒÈ84ÊÍàX[W'ÂŒ€»|AKÄÀ43¦ûÎa>­Å ÆÓaß&¯ƒ×öN×é ¨h]1ôƒ¡És·ÁãÔw®¤þ¯­Dû‘:ò.þj¹¬9ó[˜V^ÉöÁFg‡_FúžŽ]Q¶ÈÃÓ©Ó) ßóž/=ˆÃÂl,ËR ©±3Åsòìq{ ««Òúâl¾ *o€—o¶µçx#—Î…åïèÔ{¯É :cÄ=­µwßíúgAæÖ™¶ç¦ìfzõ°åQÞ]—v,àܸYhé2?ãö“00Ø-nv¢À÷ˆÎÍßÏBÛž-’Zÿb”±Ž2«øÇäϺÈ.K6{ L'^{óm*+‹,Ò˜Ÿ’xCD ’…7˜ààgœÊúó×––9·ô?ÊàîÒŸ¥îž«ŠæüÊ’¡ yç w­ÁD,Ðê/$S™oà}IÁ°ÓFH§ÓÊeQàü³JÓïúU0WЧ«Öf^AÉgùPbfQ9VW¬åa÷Ì^ÛBgUštuÑNXò_Gf·kEøte†Ypn˜h ×4*ˆÀÔ7ê_®tD¸Q (‡˜ gl„ãÒ´ý©z[8É%çºa!šÎ¡ß“ Í"r¥i¶ Ùˆvö«ømt¡æzåXHÔ/c–,©†›Ôài”Ÿ<‰qíïZø^sÕß ‰P:õàŒ£G±s S€‡q… þ‰}Ïçδy/6˜Ë)–¾Âû³‘õ,Áµýg$¾‰h%ϪHí͵´§ö ¦ ¹´šFš:¥>0wÞõ5%mªÊãì¯ÌÀ’è§ž Ø]ʈЩ)‹Ú1’&mQ¯1Îâ’ŸùÞÕÑò–êäÆ.á n©ºç h¨â¢*Þµ£ ëÚ^80¤qR1Ä@jªÌN1žièßÐ`—ƒ}:üû³ ADl.i¨uÅxÛlÖ&íðlЀÝi˜Ë¿½?KÝ BßôhSæ¦ Ÿ¬f4Nç K•c°ô!mS}¸+±Î kX ÚH žK©˜?šð”-ž¤Ñµéh£uæcBÿ|E¹ÖeF¾¾h»s´…Øk,©A‰´Îw§’¨µG¦à?XOçg…üu_Œ˜òäAì¾vìÑZA‰¾±;]ñ1м*9O_ªGÍ´Ì_jó¶a‹¬nÒHD±y4¿) [CçÊ®¦PŸØp8M*ÎHüüAµ©²1ïíK–DãËVŸšqBöL3Û\Õ9 ìØ÷õ!.ŽóÝ$Ø×4–ìJÈ~U/ÀàF$LåÕ«ÛxmØ4þJzM"š@Ìá¹5á)0Òwð$Gf•XOMÙ¬iŸŸõ‚82=÷¯gñý“­ÀdnëóQ8š`d—®åÒbªÛ«Þ™ÏDŸX ,NƒHT3ç‰`Qd•&“©Àà(j÷¤¿#Ãßwe¯EgØ,ãƒ$ž¡Ð~ìaÓO‘O¥­vb‡|#F}›·™ï‘ZeMßÄiˆRÂL´y~å³<Œ±´¹Tª*V·Ý¿‚³Z€4øGž¹N%©Í÷…°ûDxC¬ü3GמTXÖ’Ìí0Hvg°þ¤Ü·µŽ@é½zŪ€3•mÅ:Èd,kó{ÐËwz3¬AäBw¾“°{¼FšÆïGVu20‡¢C»ÏÔüÉEr3Rú=N¨¯Cã  ÜOcc‚úà©3=óäUʺUes¬ü{Ÿå1*:JÌ-®Ÿb84rÔcŒÀMãŽÖFÈ!¿Í¾DÐÉ43Á û´£ 3òbÏæ¤ÏÑs÷á® U‹]éRÒx³y xëP?›§Úµælñü¹ ‡§|­`Øå9¯Z˜‚žÊ\Ë`‚±=Ü)èúX¶¡¨tXéLk_)¾ xVB¬MgwCÐýFÊ/3‘¾Ý&(ãòÓØžàù÷¯%Ιä*눞ˆEfÊ "êÅâ•Å„8ÀFÏÊšÓÎIù ·fA G„±M V.ƒðì¦Ð3V¾²Â(O-'”—ÁXˊƆráÓQ⊣^ÏÜ´s9¢L„Äb<2•gP˼É8a?q+Æñ€ô,Ä^´|bÔû|‘N-âð–½ø¼Ö>¡BÁ˜,ä©Õ€ÕÔ¡ôW_ÞOp“@“ÿ—.ú.ÄË»8¦]|î2·¹ ƒ´¡ÕÇà¢É5­‹cp›„‹»ÿ¢¦Örb›2Í<*â4ÖÙ}ižÕ! ²ŸøçlQþʬ W^G²îÇ*›a݈„®Et œ`î‘ ÔÖe£=¸mb™°;ú˜!|`OûžìÊÿE\L*òœÑŸ"Õ"x.óàÅÏÅMÀ†U† g Ç cºðÚEBÆzí kéhv¯vÅþʰƒìÙ¾@~ã„ffþj‡¨# … ¨^zEj>Ÿ¹ÂÎ Šø|ÐÑÖGt»âp…PV%à:á@„ØÚ„9b‹Jusç!ÒÅ7Ër‹8åõÆ?ÕÈ®ýûͬ2<êéÃå Ddš†ƒ‰@ê°a(¦ˆ”*Ê“··'‚=(‘A¨#›¿=7Ë´ÝÉàë} @}îÈŸäðuùý(J¶4Õñ†þ–eí^pE^ Œ¦Kf_vs „‹ n$áÁÞÁ©úu—-<xØ5–µÔ~24¡ƒˆÇ’s‹Üʬ¹GWù!¬ØQ_å8–@ÚN$5,.˜õn¯«>KíÂUWøÂ®Y"b ‰BÀµ®³¤LŽâÖRƒ‚À˜Bˆ_ig¼|´;z0hI¿G9§[iɳnüWÿQv‘ú Œ¨P–Å HC«BDï ©! ¢œv¢ÖEŽÃ9_´Ò{Â×ÑÑ=2AEáR7Ë[È-¤¬áº‡]¬b„ù±¤ŒŸžµ¶Û03‚½Q¬n[àÊÒCPHP±…çH¿¶ú~ýD0Æêß©N\èvoNhûcg„i©~‹ ¤—œF~L ·«u»„þrK=ܤ%{º^õ­>ùðQÚïeݪ ŸÛ0 hÆê7èMÈ(?Mø û=@îùÜ*y¾ñü_‚ÐŒñ×Ù´ ^Bx¦?¾4t,>oDÔàÀïã.Ñj†”³k[&]-GU§Ìú&rQ±f3ß<¦ùÕ~h­&R„L±NOšÍ?1p§ˆöǸÕß™ƒò¶ ½1ó mÉO)gÊnö ¡æ-Ò»¨? Lßû"~¸P ”^1-P·Ê*z(]JÅŽùDªÍ[Ý@¶Å™‰Ç«ìÝÓÌQ§{åuäXsX"£ ¾r!ttrµøí#”w [6,Œb4Ý÷Ìa(éžAi#¨&N6ÈÊOÈ07sÏ‘ Ñf ‡k™ VùôûÒÿÖh¬kæÍ¢[…°Ô•z¶¬|¼S³YŠr7[ Þ ^`ZUî˜Ûþ q›Üòɱæ[©i6 šQ½£c „¹ˆn¯é9fŠœ| pQ €#™Â_ÏÅÞF|¤¾.‘ͨjÈkŸeÔÅc›Ù~ƒ+‰c ræm–t(è[ûîhóW§Næ*“ñÆšŒVêËð–Þî|xŒrÀëãéÑŒtšºRÕšGîz[<<úˆ,Reõ,ŒTæó«ø›6:ð^Ò-¿™ 1p…„©¶x ¦ü·jXª‘^žL~EŠñÉ:eRTß,!F’¡hh¬êS¹‘²Þ¸`Ob+ .ÜGÎ. 7ü¸3ü °ú | á{¡ýæŽßŒ0Õ ëæW"K‹n¦§ßÚÔ÷tœÎO†ÁS|¯Ä_¤??ž×FfdT•ú=òn8¯5A‚ƶé—îÖ¦L(, ÂbôjƲ´D èf¤ã¹ˆ?rY%Á„c¡y2e|R¿S8»rÃÌ5?¥Ò¦Ï^îï:Êþ¥E¾¢6JæÏŸi­—©þ“ßße-hkw°NäÀE禮yJ˜ŠEN³ªQ¢ƒG}ÊDLAQïÝ{©Èè;¾6œòö¹ðNaU+q¿õ™’\Î’2 #“¯¦w,ǵ»lƒú²HM•³TÞ&Éf‘ÿ5DŒÏÖhž èB>øàÞ—ï_Zù ãoÌ*á_«}|•ˆ$’—øsk~ˆg é{%Ô¢³-,©~PÛïŸvnÕÞéþ^ååÖH­T)Ò ­Q#&ò#e°þ.ûÄ’‚Ëì€õ7H¬ 1ˆºyºÛ 3`Ü}Ã~é#þÛhÉõÈó'À/"`EK"[€‰µÚ#ЉüBÑ÷õê:ç™ xYœiøgqÎ2¹ÉÔ8¤À;<‘ Ëû袨øA ¶­ýâ[Y”]˜-/Nاçê½ä˜«"`‰­ý]psZ÷¿qNËíz-èÕËáDèŸdö'hœ{üÉöìšgd˜\HoKKkXf˜¿Ã$ž0QRRVðÖœ ¦;–¡ûð§#ø8¥ P»íH-Àë°Yc)Qº|CZæèJöW°Ÿ‡Ì¹èïÄ~$£«:ìV1¬ý®ó÷•»±b)¦Ù²öüº­\¤‚°‹nqÔ?¥žgÜÏ8ô:JÚ% kmœœI\ößÕŸ&2À#âc’pÉ\üšuÆDN8k~`c™0j‹teWcAæÅy£a'yä“cÚ»ë0‰ïB*Ä éÆÖ³ 9~x¡ZÕ)ãR^"]ë¯ÝüLú_…@ª«çAâÍ‹BD£/);·¥6¶¨P¥¯`ÅB™Á‹ö§­þšÏ­Uù¶hPù÷Јjð\öã™YÏâ.s?ˆÜ¯”€½Ùève¢ ¤¯£¸ ™”7¸œ~È':‰(Õ°~Xp§òcªF4F§êÈt1LÕ¼os>þÔæ§F ©0ú#çX-T`…yµêR–Dn=:©²{Ò¬¾3·<(^>ñÕfœÙÂó?nvÞJÐGRèYÛt8X÷A+_úÛßçÿ1Wž8 C@[ SÒÕåÎ2@¬ É#ðß‚ž-B^ÏlƒD ·Í«m„%eËŽo9$™åT.Úäù!ŸMÆI«[¾vFžY}ømù#ðé…á¤NBß”­¼¬Ju& RJÅ£n¡u ôúÌÙüüˆÔ8§[©ÚÃExäi…³gœ$«PóÝÊÉ}Ô:=B¡5Øó”hgž¡zÜU-6ýµLày£35ñJiJ¾`Ÿ?õã[ªn.ñêªÑ6=ŒTådÄROóRúµË‰ÂCÚð‚lè)ðCÁ%ôD³oµìl‰a Q:Tï;»$Ú›lT²¾ ²Å f§oQ~q_ÿÈ#6Ö`e¹ãh,Ù[†×DC…”e»cÆî®J´º'¦vƒŽnâÜEñžŠÀèj¾eU¼Ojbùaíh›û…ëÒ¾}…ŽW–BQ  Cˆ…PÌx(dŸõ„{\IQ §\ˆªHù³Ð|8Œ(ŽÙò<;#ÇK$½°5L&­Þf^[}!Ñ*NmjÄ*cG¾¿Au"Ld'@VG³¢”ÊÀ>kË>’'h²?EF¼´»àqÿÒ'ù“ò`Y.Ëô×<ª³‘VuÓXI”»æ(ò’LFj~§S·¢@šïi}²(ð• çcí ÝZs ^r½¼DD™òhòM’¿h „DÒ4ƒíIÇoƒ+æ¬~ô^ﬔ6oB$&W‘$w¦ïGC ÛúŒuàÆÈ™²QþïÕðÊfHy8s5nëóþá´HÚz£GáÉ)ݪݸ_Ë)DQ¥AÀ†¨’zÑÍ[WUdËOIƒ“û»K' zl°¡Kåëõü@àû¼bÖй8=*ûËðv Õ†ó—Ø\ëÔz|µSžkzä2ᣑr²înç¨YàJD–~Æ‹Xïü=*B'LYe’]«auIO¢¦¦Çß4UîÀPñÇtu½…¾±Š_0Tv}©kÆxé\Ûf 2 T³‹ c’¢/Ô‘uÔýz`¥&ødMƒÛ% ÃÏŽû´Eüšæ@ÏÃõ‹ý”äéúñðb‚Fª¶ªMˆðÕphNøâýŒ „:"ãð)dš«S?϶¢Ôu¹›š¿êHþ`÷Ì|ºé’ž qB‡ |Î&!k•P^Ïjyß"^èD¨M([„ vpÇàžLz‡‡F¼º­#Ù‰ËîD×¥*íÉ t6‡Mñ#£z‚®Øœ3±Û•6ÍÚÉTaiRD‚¿ P‹%ÇO+5r%W½Þd3"¥‰kb‹é‡`ô톬<]úÖSQ·Ãœß¹Ý±­ÿöãGŽ FYëUiUm5Eµ7 ¾ì=@ÌéÒ¾o†Å\ÅTµ]ž‚ÈM#Q5G”@xâ¡×BYÖvÚûM½òI²%iœœ˜Åey5ÎÉ#¡¤&œ}ßüšÔ´ýÃÁü‘¨+öŒÛÇ¿’£Ø“Kñ¾—Sþ”´õt¶‰N€ªCå~îB¬óµÆb :‹…Í™L)&ŽŸQÆ©">3óÄ|¡Ø8»±c:¨gêq„¶š1k Yð¶þ5X°¿¢=®·çܧIÕç—kV ›hÞÅŒ³,¨ èEQ̾Ô_¤Ræct½SʼBúÔ ød@ðS]ƒÅ`úZÁ ƒäe£v£˜µ Š?Ïm½\´· ¢¨=¿<—ØÖµK£!žÏys…w<õ?£Wfµ•àT¬HĀΠ¾Ô¸XóѸ"QË´-\Á‰é÷7N]Šìº~¡½¤.nu¢ƒ’qïPjNüW•ߥŸ\BÁ.´Á\í/S‡ÒÐ$nÄ}VãR0“×æÒžþ…‰_T8Å·çì‘Åì;n(µ‰Î¬]¨ ©O3 ¦ªmì»ìÛn½ :ΚiCí¼«rm³LÀ®[õñAê½°«ÑÖUkhscó4 ƒ ¶&šåO9žk‘&X½s)ŽˆA¤JV´²£9{6V²òÏÁü kÂpzBô{2´^ý¤ì^qé‘âvÙ+•&µ//õóIÙ>²Éè¹#Åý’âB²:¹-ûD¡ÒÕÇya^àc0¶ˆÑ¤|bßœKøË‹X¯IkÉp+³ù²ÜÎñ/á&ýÅ­^MûQÂìY YA¸ õÚ×:mùÿd°p!«ÓŠ v¢‚v¦Õ¹­ßé5wVIHîÈ’÷5¶Z¼<7êª=ÛñêlSèMF¬}þÕ’ƒvë>uþvšÉ#ÌïºGzìnI%ðÐŽ˜úàsø •ßÞ„„œ30¼³1%r_Jãñ´TZ`_üX [åoéÀšö pimMÚ#×q‹3Öéìüt"Ô*BÞ~¦Ø]½[{ÝÚ¥0®Ñ騲Fõ¶96iâ(MÁk¹çDk„YL!lÔI„6 ˆÇŒnŠ”D¦×†‘›!% Ì=Àß^ê~máä›Ùå;t#KaUv%ëzu(ß—§œâö’–MÓd×wødºkÿ5AеR…Ïò¨ÏBbYbK“  >Ÿ¥*Èrx §`²ån*„ùl¶ʎyÆý}Ÿðø¯b,¸œV#ý|ú2(¿J€hhÏçÜÈPâHsquÇ¢¶EN•¤x:©ä»ÍJ‚Y“eVh‹ îü•šl{WpJ,£üSy)õñ-iÐÕëB'ÝÒ¸„íùŽsed@÷FgãXit¢åÇ×"®FØÙV[\–Fn§àcDŸñƒAóºKûL1>±úq§Õ‰¦n:ÚŒaŠÓ'¤ïR§›þL«ú‹F‹ªVOäo÷Á± Ö´ríVYíãSÛ\¢&4«ª²B"8w¬d²¿ûy¿“”9‚±z²:)ÜBRQ`vXné™àðr/°û(U¿p—òýtw*‚CN§zÚìi>Wc L ©<âW‰MW¯ ÑH¿dŽ-7Ù<Ý… íýð²>êK Q¥ ½v2Ü‹û÷¶ÏÞªIñ`¦€ŲS¹ï8Ä ËѹéŒþzûV‹A˜4ÓÙ ¯Õ4Ú‚ÛK!ê2aW†ES:¸Û,m ¯ÒÇv²@ç'Î! ¥›:·4¾C²?$’7ŽH¦çý: t’7­–·¡ù@Khžh<®°‡O›¬kV‰£”•¦UÙ‡ßy÷Òr¸·§n0T- kÊ6lÅ¿Æ7i-ïvÐÿå cnå‡ ½OŸxÈíµâ±ö|‹×Yí¶|«Aïêã»ÆÃL9bN—-È, D¤ ‚€%–=~':f†žXÿôZy)£Ö„l[J‚à~{ª«æ®c«ûîg»uLÞûáÓLܸ$ºÁ,s³ŠFëé1™º1Ž#S.}ÃévFÓw¼“'ÊX7SzéŽ69¸o+Ú@Â%cód­®¶AY‹•ÉåÒC“™?ƒz‡.˜(o‹@JÀÌfþÃ.Á!“ö{¡ýë3`0u¿m;Ó ™­ÖAùuôàbF4ˆV~ŠÐ#ˆ·¯È¸RÒë½:¹RhµÚ߉ þÿQ‚DSÊuB—>Ÿ)$Eß3ËÂve$|n 8T‚%Ly5„VÄdʸñFÎÎJ)Qñ‘”²VÇÚt‰¶ÔB/Ïð>™K×Z¤Óæ¯Õá¼8Ùÿ5<Ðà/c€âJÕH8H9–7Íçµ(ûþß¿t¥Z¼ÈWìÎPe{¦ ̰Áãt©…ìÄáI8h¥-Žrç¢3kçä¢Ä6wêÛýÖQ}šÕ«‹ý"į̂°ÐÔ„âýݙܹ`¯ÈÅ[„Ê€?éøDw'œ”°¢¬“\­û<¸áöðQÅ"M"ºù¤s}7ªÆÖÁÒµå+m.ž|Y^; `7Te–#ìv0F8õ晉äîŒëôùݾÌó H»ÈÚ­å|N~±P`½h¢ò‚å­:‡n«¶;NÈ¿Q(¶+¦LfÞÅžSƒ[¨ ÖÂ×ësÚ²$Ë’ÅÃ6±Ü?k'FÌ”dºÄ…?ï³çU¨¾è¨}¨dYÆžzz¼Øg"¨ÍJc"b‹Ä]lï¯ãŒÕ©µeIϤVWDèXµX˜%–kØ4[`„а¥_žÃÎ "Yu›4` «9x`‚Fµ§ÚÕüªkßš÷¾!ŽNÐrÒú×pu"n/Áfú» üäþÛ]$Õúú¿¸¡‚k¸èí9?¤Fé¸>ÁQ3©™G0Ö[òŠ$'“ÍgPát?(M C ±•¤e¼tÐö:P!É5ƒù"û;o¿çQabC¢¥É©ckàÌîúÒ)˜Ñ6Bo³ìVÐL]âÐÜ7hú(W.—=ñýtµÄ„1kŠÐƒOnpºùÁHÙ<’bȸ¢}޶Ú3dòiUN½¥æÖâéœBÒŒ9öæ¥!ˆVdŒó±rcÚ¹õíSrêýZ¢¨]@±ñµš Š ´§—Þ^üšÊïÏEžž©Rc”òJUIÏ¥7OÀ.`O2>=¨iÌâ„Úr—ÙÖ†¹mV¢øPZ:úïx[´i«17¿¢Ë'·“=I‹á¯âcß“ 7=ØÜ·N2õ¯ÝJ÷ä…BÌD††Çh{ùFôÓꤗ6nZù¸ÑÂ@S²ù™æÖ„f+G&ÇàÊè2>}ÔßR¤3ó^€ÊÀ†OOyŽzM¹ŠË`jve=ùÈ¥2 Ú—š>è hw\ë^`o6͇V»ÆDÑ8㡹jÔw7ñd†Ç¹bAà –#j:±±âæ{ Ù·2î*›Ã›üøŸ8éeù\Ïh¬ ñç€ÞܘlQŸq‹(2†áÐRÂ:Emë¼+u̽B°Tè•-ƒ²#ˆÜžå•Ú‹jK| +þº#•©°Ê vëfyÚ%ÏB ZT«:M^›œ„éÏgÿãì¹Ø5©Pd-Òî¸AF¿xªâ3ºm…²,[ÇC„ÜÕÅUßïû^%¿zu•zÉ×À !¸™VÀÈæ”©$Xƒ^ÿsUUj< P¡¾üë`ëlÄnU¢©P©ÎO¸ã,VÁ.½S úP MæPr=Ç$µÎb±QŽ b•¢t—͎·yÎè^Ýø8ãšn ±‘fÞb˜¤Tñà´ÀÉæÝy€X_¨{áŽÍn-*ΠƦœvÔõö(ù@) jßÀtv sÑP@øïr-?µ²ëo2»ß&³B~;2á$(¸NíUë˜/"ÃFSÑŒÓ1”àÆ‘äͽÑ׊Êdœ ZRÐaª,³yKƒ”¶³Ù\Ô? ï´ yðÓ™jB8.ŸXZ}Û #»î_4ÐæIï°ù.8ƒçdzZíꨥ‡€*wÎIh†m-zøis îé„+^{´;dHØ¢^ÃV=~"¾?bÃîÎÑfJ¨a†nJ#4ë'4êZ¾¹'c»‡mV‹(©â’gù¼ak4‚Û[Ú )Çêy¨â‹ú~‡¾Cöv%wÙ@"=92;ð œ9¤(OÝq‰z|vMÇ—ââŠÊ .IeÜôC¸Îš‹€eÀ0@ÔáÈæÜáðÿ ¦›w/ŒÅµ ‹^ŸTã났],ki6ìÊwvÅÁ6¹‘¨uaH _õýcKðœ][ÁEMŸN¸±ù=ÉšÏcC8þÐ4G§aÌZǃ ?\ò÷É¢W.p2¯•~Ów?Q9›âßSä/ —ÄÝ Þ¼ÆÁÖ¦Â-ö^"t'²fOó¤ÓX঵´æXÊ8ÞJ:Z·TųMG„ký†Ï®À®IïM”ãàÕNg=#Çp:/{Ö¶lÙñ"%8É€WÊ!Rê´ŠíF yµiÈ?BùûñÀzbÍÐ!=>]ÞÑü‚89 ¹Å{?$åm´1X6mäû+Ý ¶0®†IQÞá8Ïî`LBŽf9s•/gdoå ´Gö~HY™þC*™üÍÂ=b’±£¡ ʃ»OÏ ¾LYeq'¹"Ý’‰<Ë#s°´öŠXkIÝF+\ù]ÊÞŒÏÃ'èÍÕ¹®3Ä\Ýe^ZlÁ5èNLŽÇ]bè1 ^çÀ^ì(™¹j.¹±Þˆs›gÛü*{®bƒŸ±à•»õÍä;“ì.w±7Ù³Ì:樶 ×‘ÿ†0Ø‘£x·9¥1у”*ËG®pr B*°ŠsxvkP±iã?RCöü}~6&¡ÒžxoùEgcÒp.ô“À@Wîf„=kJɸIµ¨šC0¯ 0®bØ = xAAQXýu)÷’8ÓƒbÜÆ ?uñ,ƒ†=ø¥Äö<0«ïãûo¬#¡•ËÀr$]¾=£ÚêT“ÏžÙB’¿ó0³ã¡“Df­ßjyÓ¶QÃBÑfyżƒèR'æ2B!™Ý Ñ- õ´ B¹ýÈÛm]×;ž4¬RPÂR Ájá¡CHH?Pá3™‘Ï3{Sü?t;˜ ‡üC4kæäÿÙZKÉ•hçn>QN2Ìm@i 1`O0Á:õåxr…i>-‡,olâTQPˆÁ 1Þž?“—DÛMê8ʳ‚rñàºE|%K&²±ƒP6ÛÏס¨"‘èø$@ƒrÀ%°ÁáŠs_,Þ@þŠj~¨ôÍåÂæDi×·òËb‚ó[öt{ßÊœC ì ÚSÞíªmáZ>'ÈÏLsA‰ ­Aøm“-ðÒŽQF`ýøfµHDX(*Ðx{Öz‹M%üÅz$\PŒg,x‡dTƒãÄˤÚÒ¸ŽOR*&™ºôÞ!Í Äš’º®%ÿš.(·Œ§€VÿùQÁ°ØÕ ¼Û ¶„š¥Ú‰Äˆ‚;,(͈²¾øÙfªŽ¾}³´bI Àü4ÀР䙡õýoNç ¤Ñùàýd§òVÊŽß´w»zBê£ÀQ‚ýõº÷ÎÉcò\ f×–ev‚xÕ‹zé†.‘rAóàGT2½]ÉÛA};óˆcq®»‚¿O˜Èκ÷õl¡%§¨XuÊ\"ß[ÅŠÛ`Fnð6S!MZþʃUîµ!ìNÊ!/ø˜•‡ëÐR‚BWr4ˆ .úöÙ}:ĵ@h/ëkóÝü[Ó$Èx‚æ4è²>6¬j²>ì6ùÄãû¸™ô’jXcð#…}Øg÷hœa=õç˜WF‡âO\²tn·òÜ=^CÄŽgÓ‹¯è%N ›óµÓ§ÐwÔ h4ª@bDÓdãÂikGñ„`ÙuóÕıç’DnÐEÚ¤+ ôXÌY³õïäR%-A$J¼Ã"¡D©KÒ~uI{áç»Ð€ôôP+A‰kB^ÄãbÔc€ùYäs‘™)®CÜ*«äzyûcl@öåÿÞ¿¨xKSÍ–q[ÔÔëvï¸Ä×à]?UîþPxÅ%=VÌßÅl_£°EHÀ‡Ïü¥TÆq5”øž×áÁ™éáWì†/Ëx«hA»€P©ƒîõaG¤'øèóãXAËyŠÏ;ÞÐŒ÷Øôüº´ÇÀAþɧô\gðkx6/Ö;ÞB["z ÀAVBwô'n`5S xV9ÀÔr¼ÇlKI¶®¿*BŠœÜAˆ1ž¥V˜¨u92§ª+Öw¨MCO³g ”¨òÕ$å…Ô¿Ú^`d4~’Y¼Àë‰NË%ÇÍ&mèàt(½˜Ñay'¹9±Ÿ¥¶M pºÐ—ï}ÔÝB>rYÂÀc/ ƒ& ÞÎä4!ÆD3æ‘¿¬!´èÕ6TT"1-‚HSݤ¯ðq0éŠÑŠäÄ9°Ä”ÏO´ }F˜j°X’ðËTé+8î qW€«Ð6¼g¢!O5—­µÝ»Ã/ézR;Ôuó–»Lc`YæÍøº˜YO¾kdR­)úÌFä½x8ª¼\“\^¿Ý ”?;MŒŠ HÛ† k`8®÷àÒ­ZFµAƒy£íÅö8¤qo–G5­+«zÿ­`SÁöq€– svÁȽ^£®dì:Éã(èÛƒNÓEÚ{ò ¦Þ¼hj‹¶Í­np’1j+…ÒCÖ¢3áª8Âjläú¦¹¬Lg¹Å§9Z­~™nÀ0è¸_ß#?ñD®~±AÓ½ç!@^t^ŒKžmùyÑ¢!ôX¼8+JFꟲZÄñ?†™-GætµÔç¹.¾öìCb«€ALi—(Qj¼“ÑbDsåuNWN«ƒVâ#ˆú–À! íU;Ø*C[ |úÉQ9j«Ñn o Çj ËÆÉ¥^ãxÛXÉôS|¹òp" D™ªh³< Š¥oDG°BUD)çgz´HUÞò¹i§ƒ²:¾äTå dX}ýl«€iz8ôÈ¿ &V<û]étstTîög×öFö3>š@ä×n¡‹PžÎ£Å^$+‚w4 Äôú²Œkt‰kØg‰ãLK~$(l±ª3âppùüDY¦8oÀ¥ùÛ勾¸ÙØ•›3å\!£S‹ž´Z—YR¥O­Ž@Fz!ìp¨Zõ@?Æÿaö|-ï(²Kڋ㤴q%¯«§¿?Ôê«1cs–…§ ó(=¨CÍçX˜ƒÚŠèçD¡’=:AȳŒNt·²X™°ðò–r µ×ï±—ú#æ|!èÔ æO’Cä‰\ ~|1†Gaëþßy´jß|évmñÓCÌï~xÙDô‰¶¨2š8ºÃ\œ–·¤É":«ѼCsò0]bi›Ô0çfø&°Ao¬“äƒÈu‡úšîïÁY¦¦Q§éFÍöò査…B£µ¼Ž!m3ÁˆšŒ$šr¹9U{Ç>iß„4úÄ= ›íô^=TšwbX»d¶ªrdbà;u§­¸%(–bŽ(åœ[’äDÌj•Ÿóž(/Ûüð±mJ-uPßO´«Q{“›ÂfB·ÒćÝÑ¥³ñò^¦¡áç3«:N‚p ÑʱA¨¿þM÷½íóŠ@àjÑQW$€ŒY»¶Ó0èÑ?…AÞ´±±Ï_¥a»mÜÓûÖ'’œ2E4,#…]Ö[uõ5g±‹L£v\Öÿÿæ¥Ô Z)šY¾c„r32w»¸aΔŽÝï“=î9n¼6á^ŨÿÆIba›!BØi¡j „Ƥ•ÐÉp¦st*’"‘©>©Óñ«Ã£”Ô–³¼üœ°‰zA·QÚX‚~ŠnxiKC#7b`·EÄ>Hç·ûm=¾X…ð•Ÿ{Ù³É_(&c±ºZ™$ÂÇ ioRùäÊ@O¤$ôéÓ·(%Ð~‰>{’[-µ¼C}¼U’9õU8lUUmQ,+‰nSõ†ð›ª ÛSëh¿)0¡HŸA@b3ýDîÅ¡°Õ‹Çô²4X]C¿õ€TÓFŒþkŒÿxQœûÇ¤Õ \iíVVÿtçD=@Fß¾½ß A_O;?àÎhÖŸäùƒÇ¿×ª¾ùÚûy²¶¡ûNÞ,‹þ*Ä!œ+ÔRÁݬ}éäûqíëPÞçccü8à•³"„#y©ABûVsê®ý?8mïöw¤íà»X3¡´KÄט‰ëØáÛ¶¹ »^ìÄ£$2™~*ÐÙ\æ=Á¤ú´Pb+ÓR/-¯ 3,° 7:FoŒ9Â(µ Å´ÁÆuȈÒgyÉOõ ;º¨² À˜Ju³}‚hݪ𱜼%ùC4¨UêD}‘<ÍÑ»KÕÆ5W„- ’FDMˆ5x•» ¿:œTLâ0õ™´XKx›8Õ+Fmž®’n#!ãâFIp•ï’K:”#ÂúÚ¸²«lUñ7$×$iúÒ2¼‡¾=Ñ…ÜT‰By¤e¹œa0ÔÌnc¾ SÖµøÜf²ÉîT¼ŒäqºÕ ÂéÐìØoÚÉ“6S]ö@ëèÇÛÙ»hb9Ù™ð_¬½¡›@xèMsi6ŽºÒa¥‚íX§–9Dj}^Mé’—ø5vvÏHc¬ƒÜ/}žLTR)«ëíwaë°]ñäÊ4ºU`u‘gð¦ÖñÍ£ËhD’ aT{FÔ×ÉÕ‡Ý{$A øå^£`”Š‹HQ—žÜÁWÐåIã~ôD•£øÓ¨WD¶vF‚z7=ÙUtDðš1b-ŽpäÏŒS4©ç#©ew,^J_í0)×§µ¥mBîsɰãÁÖöZïwšOég"dõ¥ñêß`}†E4ø Äýç–T:f£Ë^¯³{ŸégÏ‚]ÆÁ¹1¾öÞ°ÓX¿ª°‚c?ñ¼^¶n1ì–™f“©x×n•PÆíUenA/1g!]F·@îæ-ó¶kÜgÎcksBàR}‘½‹=W$>_`¾ ñ&'¦ÅomM€âû Níâ» “ÕÒO}Œ(ÛﳸÁ${V‘ýÈÞAc|‰ÀõFêö=m"8е®ds«àvM“œa‘±$_g9½¢6Ü€ÙM°yŠíÁËѸäºèí·Ê”Mb¶ó4š… O9/ !y’ÐçFuø{°Ôµ§=çÑÝ@Ømd?¿¬ã%'Ðæ¢¨Ëj{äåŽþÄ0wM:ëÞ¾®tÒ˜í‘JðBG©XÙ>/¨ùÉ/‚•qè6Zöœì#ÒI.†ÿ„gÑ©+‘Òú¢QÊ‹Û("5ȉ¸´(°âa!µüwϘ`•ºÑÜ2¿AŸ†k‘:1<«“xgÒȸmü±w äÕú©…'§=GWÓŽÁw<úÖî4»T—ØZö\l°)Û±¿b¡ÞiªÇÖ±¼ïV ×ü;¾¹i¿MVóêfº‡²“æ¹#¡uvEiºË;Ø\2Úhö ½}0s?£Ùµ ųþZQ1kb žLÕnœ¥ Ac¢ªuÆ2œ)š"'§W[š¬Å—¨çóyuä HB!+@õs}Š SŽ:Ð:WqÝpð›;r8Øîú¬€ytoÐõ†EY¶[šä—?ÃmåCšxÀÿµãâ]}e³«È#êV,w¡Rç&e3v– –‹ùÑî÷îª7>Ù¸gÍ[âÝügGà6ïÅÿkDâræ”ê«’¼‡¢IKÔáÁ]® °JéáÝX´-‰\΀se*½÷º—ò“ôuÈe [ùÿ+uA@sk¿©¥!#)Û7NÆi®[ÙÖ’ž%Ò4Òê‡v£™]åNb¿æå†g'¿>~VÜAa@×d '6‘`Œ^!»ÈÅ[¡þoMŠC†°›ÔN6ÙÍ*îMàb#ùù ê¿î C#TE§ß¡bÕ„Jèøî½ª[+bd´çú>šŠF§àÚ »™ÎM¶ûø:ó`Xµ> åqžÚ30ûn`øUXµ(…WìÞqo“›ê%79±Ìp8UÞ[L±ËnÐÌã;™¦EÈWYÕ}´“Ð;"Œo˜¡íÑóÖ·µ ¦Þ~ ?±jüÓ¼t!cÖÃê~a/¹?Éë¶©ÌQ i€@Q?L¦Ñ7¾®sdó“+錵g\s¤Ò( J89©§-ö9¶TòóPvxÍýÒ7½,î`–#ÂþWÏÀ[zûÛ§ÓÌ^Ö«ïÃMØpq˜]ää­ù!vèþO’9YãÚxìÔS:åGéxpoÇy CŸjø.~®ÊQ’½M÷á#ŸïSŽ>ñÏùì0ø‡ñÿ8;3Ãèa÷ó¼Ö‚a‡¡‘©4  «¢Ì;ÝÀþ€hzœ!ÙÚ ¦ùsÃѶ91µv pƒ!ñ$›¬õd“,4={ ÷x(X"·øãšrH/*Ý1¾è!ü›ugJê¼ÎxúçMr†£ê èò»¢7Ìhõƒg*øb•=2ÞnÏ ŒBSWŽ1a²CÀBhÞGÀ`œÆ]ðzŠº@¬Þ,«Žœ úÍ¿«íU)pÛk‰ŸMŠ;çDñ:ÝXóvâá‹¿ÁW‡š Ê U¢ÌG‘ð¤_š ±¹¹ïV…Mq(Æâ…ÒOK¼"v !Ö=Ú¡ ûô*ïÌHGä·…(ð]}çDB7¬¬Ò~ÙW‘=\ÜP9ö+a9 ‹qáTƒŒ>Íç_ɬ™pF´to›:Fî cm´uÐ¥r=óŽ‘E¾"ª–D°cYÈ^ÝÞ)Lþìý±@™¹,qï4ÅVgUêÊw.ˆùÓ…{Á×þÞP§Â894P¼dåQ<«azybiú±AÛÜ Žõ ðâÍ*€ÚÆíS­X·ºš®ª¦FÚªÕƒËzÌ`㔹 §µØ0K(È2÷KJDè:x]±gø._ªy4½a²‚ᅴܺ!€›=ÁЭ1ÇYæÑüŽÓ(æÒ¦h©]ZKé1FK3t–ìÍ6¸ ¢÷g),žÓêY[çœÓ#†ZSp¦7Å<ÓnY7šÒ"4CŸœiG/eë×jÒá®ê²á~U sµ§ZlIÞ7tÿVéOÂË)Bmu×A3V†ùã]XÆ&õ>º$·°¨Ä×”¥N²¬ ¦{²§ñžÉ“lgÀX”$û^Ó¹Y˜`‡+ಋ¹y=Ñïc×ÕiΟµÍvž×?û™÷Î9ãðŸ ÄS!âÔV -ƒ÷í Ý_‘EaŽwÕ²¤ˆa„„@a¤ãI’§ŠbŸe·é6}¸ƒŽ6¼³9§í¯éž¶H¤2ïd€J m±d<¸‘ü7»úº¬Ž;-ˆª”h]¸ ¾ úä>Òåè¶°Û/mÉ€×*~àø I>6h‘d‹9¾/ŸDI üo*`ÍY²Ë˜‡=Wç=m=¶Ü§ôú ” HÌ0!ÿ ­) ëfßÑëàñ“b ¦µ8n ˜=öÔwLjT0Ù²€µr¾ñtˆDDÇk¶€Ólé63¯®·‡Ó{(âH‰«`³çfû Eêø +MJ´Î±šžËæÇÇÂ÷¶#Ñ+dêµ`½–òRZºÃ€ë’½cmùLj¨I õi%a7ý¶Irû“ý‚Jm -65þùšéáWG„©MàêñåŒ<æEŒbt"m›„;³EjàûÕü™‡–Í~Nÿ¬ÐåÓ”ù™HEUV¸2ƒ!1rO5œæV€‡ÚÇÓŠ†ñ‰ßÿ¬óò½@òm÷ô¸¬bjºŒæjCÇS¶»X xòîYx;7Ñ4\3WdÈ•´‰ž¼ìh^’|ñånä+ge·¶¨¶%â%¢[¶5n›ÿK„Š̷&‚,‘y­¡tƒØZ]ÀXࡸ Csr‰u·‘+2û‚ ´¹F öû6%ÇÝßìå,àzô ¿l_4‹y,Ào ¸´µ”,ënÝ2‘ÒÀdjÀKAÜÚ#Ib\íåö¶h„@‹VÆQ£! ºŠ³áF‡‹h æAìY¼` rÛç‹|: Ôñ2ÎÕ”C2èürz’!Ô=œ~:<àcšm†ŠU–‡ïCz¡ÁDƒÐ©¬È‚¸jrü {ÿ1碖±y\™15@ ÊüÁu–äjöwšñä Ï¿¡Ä{=ò/×:D¨ê ]¶ëQ³È]58ÂZµb3tr6Xm%1òv‚„ü5™ùî¼|1'Iâ&§NލÚí$hßZµÞä1‡·ÿ )‰æ¹°ÿ@ döC¯"ÉøÿHjй=XŠ!­÷Ž8=ŒšxZÞÚ9á´Al{lcg÷Ë­(PbJ2§pކñfQùd7šŽ—$›eR_M7ëK焆²GQ-Þà΃ÖgGftiøž—–(GÊNÌ“øÜe 1ÿÌ´Êó,Œõ+RéÒ!h²ˆÑJLƹ#$¤óÌ¢±,æ4âå7ÜVžS“6D3FKVÕ«t æàéjÕîvðmC©R´½ æ^×;çêO!“êÔŸØŠ;#VðõJö¸S¹êöò–ûØ Š%³_tRQŒQ3›|Ëlç“|òÚöLRI°“ê³0…²í˯ë­òΓò`œ/Ð-¬*¨ÍîËHÄÜüÝAU1>½¤àÆÏá"v8ºxH ÀWXŽßdV4n/­~0gã=ÉG_Zøã1Rzƒœô^´;éíÕ2k˜“BS5ÂQ§¥ªCÉCÛ›wû%ù¦!J¶7W®ì2´,“Ö Š‘kl³¡f}Þ‰½¾Æ¢T®Ùs†쨦*¯‰Yr‘ºÔUµF穹ETLóè„1{~=Ø=XïøvO⟪kÞXœ§À®ØKÕ†ÞJ„c&o©›{ØE-ï gW—Û8«zÄi‘Íì4©ZË`—?°\‡iÂo°¬ ¦¦Ú×¢¶hžóΫ’hîŸÀô?XgvSÕŸÀsë|Wdogš›ð.B–Tòolhfý ‰¥ÈdèU °ÉÏ ×ý–årp™ø6ç_Ôù'ú–ÝE«[¸tüJæ¢á ®y˜Þ ‰ªèšj ÃZƒyŠÖ¢ çó•tª3é.%eÏÿzD[†OønÁÎA©òáQµ¾š5¨@M×]$/—¿€”  H«;œÏõüO³yë•&í i“7Š „çýÙhK1ñ¾ëe .¹)Ô$Qí$¬ “ž½|b+GÀ\Cî l¥Ïj .gÉxü’‹n”N@|šœÀ.Yʆ•xâ£B—ÛçG/¸s6É莎”„Ÿ@ ß“›%8Á7VÓUÇN‚ÅC‘ʵ¢Â¦±5È¢IÄYˆWÑç*Íãå&Å sI…Nëk*òq]£±Ûã6Ü(ƒ­]Õ†ü74‰„QðTYyÏd„€‹œ_2©%öàÓ4F"êѲmȃæÑŸiY¡0 ±¨s¨ Ž6Žu“ÅIýÜS_©f+%9é ñÜ8ÒÓPÛ¼þÝõ» à[`\äP¶oí–vW¢mûÐÛÿ¼ïèäDÁ(¼ûÞ„}”ýÉX†áë~Çó¶&”ÅôÐ é|t–¿¶ò½½æ/A£œDHÓzöXÍØt„MH«¢’‚ë¼$X Ê'<×nµKá^ïb×wž"Ó.­:G½3ô,ÉÙ~lÖ œ‹ó;° Þ‚(KagÓŽ$QÊp±ÀIû»=ùsQL™ca¶äFP¯è-3@´¸³.ˆ>÷ƒ&½_O¼ï8Ô;n´éùü2Œgc™¢ÛSíÈY${Öø^Jwáë3*”èÀcÉ/NòA¶}ƒ;!2W¼ÈMueÛÀ‰.c67ÚBÐ$Úâ|•æiÊC®ð^ ?÷'}“ÀÍ„}6Ö´[ H׉¦hsè¿|K†7,WäF°í¸9®\œ§£ Ý-ÿ1=üXìî.t_|›‚6C„ª üö_Fìè4žO€Ÿ.Ô=ç‹ÞÉŽ)<ÞMsbûûá÷Šó"¤smd-¤yïQHJ§þÝš<ƒ2Œi6Âúí—_à[üur0[ŒIFq(Ã!‰©[ª è´TP'2“ÖŶ ÿ¼–®Ì5ÿïš%¾ÎàPN.Ö-¥í‹E’²»a¼‡ö‚uêò¿ Nò‡ÛÌm%oM»’©´±•ŸÊ4rz¥¼ºŠkÄ“ßñ›\ü€­5ÇÄ~îQùæõ1w•Ôæ Ï÷î‘]r_[ŒüMÆ ¾™œçÔo1ÉtìAÜ*ìѨíŠKÚ’¡_”!}ÏœBÇ„»+ÉâÕÑÍ$õÿ«¿‰ÄȃÔQÅ:‰Ïå+ǹ– lðþ8ê„!d7´€«•·Vp:e϶v«Õf_8š¿?GVrLáŠÎômJ¥w’¼ëfV<=†kÞûÄ“#dòøÀˆFÔÔö®Ï 6&µE‘`I8ZþöJ*¾%*±XÓ*¨Rt}1=cak/=}Ví«Õ4Ëæ„÷|‡Ý4>[B»ay°ºÜÿm¾³‡Ù4§;a§ˆ¼î‘ æÛpo+ oÒd’…ÔY;Ø( ¤3Þ°_ئšÈC2º’¾Àmü¯ºYضôGÎ9«Bbmvdûgüq\á_PØ…»:S4¼Ù®ž˜…°l|÷€J=ãz«­sý_å¦ s?(§¥œ)ˆ¨2A½§WŸ4ge¼R1ïï–ºj®ä¦ír¾‰?&\çE¸2L!CpD@*¬{s¿C¿Í<§ç¤o…ìEX­C.6¥#ef×qxƒêxž*kãç¨üN¡úKZŒA^PëÙ D„ÉUƒ]&hÐÜ¢±n Þ`ÔRÿ­1DvÀ-fÐÉ5„e~ÿ0 êâ¶‹…N t4úpðàŒdÉ t’Ô=öx^ñGÛù6M!Še…5¦Õ¦ùÓl‰•S.ï§øî×ß…¿y{‰üU<¥yg„ÒËä«@”Ú[ÙX Üçv~°Ï¤j,Wò¡ÛöÑô"`ˆásÊ*_´‡° €oŒ"ÐvC!ÌëË6 ¯¼‡E¬¹%ÿT¿aLÞ©~iØç„‚ÞHÑK‡ƒ¹ëJZïáÆï*HûtXO—ùR{«(K4¡CR¯#»º²¡kp<“.2‘Å»Q±ß,ã³C Ü©3Ƶ#5³G ´œ·<ÃIâðõ·_ÎS¢Âb{ÌÎü-áËæ}foÙðÖ š¥Lé×q&+ÝŠ?ÏT {´ª­öJsíÌ\»ÇŠRêX-ÅVvÏ1 C×®¶2¹– –’+Km2`Ù4’ˆÜ_}© J¹‚%#L¾˜%4s{ä½xº¶7¿©B$¼5ÐÖ ýÅ»‡E˜÷¿ïJ{¸ÏÃÄ$Ìcb`E‹@½ «’Vcä°Mr‡X_vƒ¦¦½—"Ê]§éçÈ~³]ŠqZþ½Vãå®1Ì9™"ßû`ÚQ¥T@/ˆ8çÐrÖpÞ›I¹l½ª—òÄJ–P¥ó´T¼ÕÌH `±±]²m›Ù®~+å—Ý®Ô~nl©²¾³OÖªnJ+ýÂ5bö jâ§K‰÷IiÙ ¬·nAàöÖ =‹Xdüµ5'Úèäe cH]©’K­om¥îNË*’NÛCãDÇ?„ŽBYsÜõßóZfùØzßDFއ¨Ü¥$0tË*Ø€àn)QÚ ÈÃk.-yn<0>Ù⥤÷àMñØ`5R±›ƒÊËÒ¤úG(L̲ìî—7,Q>7­¶DXä([mF¢ -Ê(¤‚€É²›“ÑTvÐ(V1[Úžÿéôç7˜>;oJó•™ðú)7Á%ë°œÉx<ÀYhw¥¢×ßå™yB€6ùîˆ/ŽÀ=èû6Zt¨„:Õ;„ÏÈnž~ˆí)÷pð¶BYµdfi¼ñ.v|maE }.š;f{ñ '}àzk¨åˆÝŠ$˜õèÉóîO¸éXfN°‡ŸiÆ; ø½ë2ŒøÅs“ßÁ툃ºä˜ˆˆ*åÌ zg²‹*_6:¢½u4^œ¥}`p! Ÿ: CD$ LSÚ¯ˆwón1$Ý Ô1…¤,ÔµþÎ6:¿°lQI”ÑN3+ËhϦyH»Ö8ÓÕ,¹c¶„¢( §øT•õŠÞ·Ç•7b¥å!­íŸ«¼Ê‚˜Kléz«‡çÁ6'ª•ÇœF6F+˜Om5äðÞ›æ>¸"øn:·œbbÖŠe‰—Ž·#›0vÊ+ ëóOèñ Ê1æ«®$Êl(“Aúc#KÃR·pä ì ;I{ïÈÚäSø÷S…UÙ ò­ã†bGaÅxâr¤Ã~¯ÎÊçw§Ã"Oy„£è;L9‚»EDJ6›¬Í|v9¼yáÂ…‘ÜI„QR’É~`äÚ(4gqï(:WR“uR`Úœ½ÊÄ¦Ç òEI9ïm(„xÜÓÉ‚ý¶*§Ó„+¾$ÔðÝÃŒ9ôäì#ˆQ"Ç× VÑ!ÈGdS’ø /€Y¸ ôÁö¯¦ý+ \›x·Bñ["è´} FYöXn“ù¦‘A^ßþ ß¡i/û†^¹)–÷¢Ë•glÝ̵–]î™Ü|*-5f‘ÎúG¹yKÝV.ªÞиê•6ÀO€¼0YÈìø³—¬ðEâ"÷²ÇæFŠ aèA£0û£ß„%’0½rï@ÜüÝ|tv²áùqú—!ùËž:?d*û#ÒsÃ9ˆîÔçš'ªö>A6¦ìû\<üÖþ³1ænv•«ö‰ÇO4–¿V¯Ê¦N‚9ö{²ÚV‰ºÍÊœö›–¡TÐ~ÛZZXw{ãÉká{šI=•+ðJÛ¶bwzEvl9ÆueÑp¨'™‡ûv—ûÓ¾hAÚœÜãGñŒŸÉ} •y´!%”“îæ%ýb¾¥ßÜ®OíÄé‹÷œèÛ·)tºÝ£Z½Ž4Ù5«•…0d_-68PBõŽ·Ô×ãCxÑE‹~Œ.÷Ì]ä5Sâ*Ù H€!øÔ&xLI\ºâº} ÷Ü©Ýb ãž ý„tü/i/_ëÈ¡ßh7ÂæCÍtçFOÜåxäž®^IYÑVÓüí¶nG¾RØñ°B.}›3°N7·™Øûòz–ó_å$²ô§¦ µŒ¼ø”àà3¬Ÿµj8çä¹9à\uëÙ 1Ï便Œ)nkǃâ¯ñ^m¹C¾ ÿºßÍêýŸk ç8MNµ¬“:Æ+2Š`:~AA'¨fèAó)óó‡ì×7ö¸k\I _·`4ßF$h’™?o[–ÑjÅa²k }G>v‹+°< ôUÈKÛü{ö ÉÜkh5I_`Ø/*®&ÓÖ¸ ÒMô˜¸SWÜ{êØ×C¶Þ½Â.•è¬Õg”ìîJ&s‘±–Ó°íöfᵨu@Þ£Ây¡Ó>B MAM–Z²±{·NÔn„H)8üI¶YP¯0üt@„öRS@8Ñ‹»s¶bå5=µ†Ul(„Ûž¹ý&2¸!é–,R²”ú!AÒ¸ÙÁ¸‹0ýúYz¤iVù¤ñ§„ f±Ú a¸@þQQ™Xš’\úL•kÒ¹ÜÆŠÙóý½¶~däÀ„ÛdQÿ Z?´+”éWÕÑ·Æw΀¢Ý½õ8fv%neˆÕoŸ¬ï²O›3]v6O«XãèÆy?Õc‘ n–ynÿÈMc·t¨—›g/"åD‰ê£bÚ|2ùb‘s€Xío¤þ<>:I…>#ì¸ÚÅ›Ê`{0=·Gb1Wj\n“¸ÞÔÓ×2³“v—þ*»Ð|,”ÐqîZ¿74IþLr?^úŠò»º¾‚;£·°Yè¯$>6OJx¯5Þâ—¥[‹’ÍiBÊ×tµ”WC{:6 jæƒrÅI‰&!‰æýcuõ*‡Y‹U`ƒBÅ¢öÝ”¥W:ªüFËW ,ôµÄêÑK%ò€ÄK´Ì˰„’3þ=m»Å¬¶¿ŽCñèQLZëdõv‚s›îv½›)ôÇá3§[3䨭0SfÝVŸiqWAeTÄuò³±@à®hb)³Á$QÊMYòœµ0æsëÜ“µQ&k¹=/!¬jë+ÿ§Mía5NT¡‚úïz¢D>â«8Á‚”æûÕ¨I¼Á(Üúð-aI–ƒ½+íRÿñ¬ ovcIÌêQ9áBá@t(~KCA¿¤ò€×U––æ«Ç[r§ê«¯T¹Þ+>ƒ;s:¾ ÂÉîÜY³k¹‹ÛŸ÷;­«$f°´”,ƒ· ²ƒ4ÁAÙ«4z2n3˜òâ Õ%±2lKí?öé§ ¶+ÆJë­;V…V®µÀ¡ùq+¿Ù‰ô 'š´Ž›lAA3œÃáeÕ¼µ6òMó…·ú)oÿ‰û똬ê<³m½‡t€eë°…ÔßCd#ˆ 7‹ëHx¤fÐ;2&å‹ê¼Kä‡ÐF½úW¥`Áú€MŸœ{ø*õ¨(Øâ2Û~Gq…o³}'oö°Ìo¹Q‘¬ënÄ9"ø/ÕZÙ)SÁò.EG™ü9†÷qÛì$×~Pf‰ßknK¿¨ú¶£žÿ9†D„6Xá ÚmS«@ZcH/º¦FYü´õD'NuhÀùMOÃR$É£ÓRq¨#è Jê8²²ÒKfŽ‡Ì¿>”bHT­lq–€°TO«£ƒæç’Þg÷Þ‡õ5Ä–jG]ÄÁí‰'E‰aãbbvR+ûiá+GòBKöU±½tAã"»¨¸ ,nè–è£ü¼7žˆ–q*E\IÈÐ ½ÖÛÞÙbD£k9͆r‚ì\Q-=%§*0AŠ£a!°Hœ*‚ˆI?ß:˜l“üz®¨?ž¿‡fHŽ&ˆîñŠÝžYA’[X–œöu>ìžX[“½WŽTF·Þ!ƒ£]–ܵu ´±Ç C\å§@v¾<¼p€ _È'èµõlÀ±ñFA:Z3Â0Ճ満Ht…-2Û¸½ãõÌÿ¯á3¨ðâÖ-z;•C´v†Ìð÷ñËÌø> ‰´±ý¶o5÷v«ÚBŠŠÙÓìÓºHé[+wªO½yÊ] ¦95™úE“¥àlSz¼òYŸÑXC#“sº$Þ? û–Kð™t¾ïŠ ²8:úø÷ÚÅKcJ KXï<è½ËûÒMÆ6Š ”ºÊÿˆÁ”M’&£åZUÙÚf7R-¨?wuÖÔŠA+÷°Ãâ\±fèµ½·1?_•0uœ‘㌤E¾·4Æm²| ÷vLbîmU“àû¹þ#÷.-.ñ1 ór";¸†n÷Üÿ£a¶PT¿G!GU€¢èý²Ÿ('Í;‹òwðVÃ\¸=g$¢rõ™À2CĬ„ØÌ€&¶¬Æ*ºðï<Öü28Y¹B#†¿ƒº¾ËÜ4zâQ#k3„Áèv)Óªê¦ÞWQÂGÃ?¸°¥Ù_ï“]ä6¨Ñœ«Ž¡ÿ@®ë€RP—±SÎw!ÌçûE>+X/¢´Nê¿hÉgk¯×÷µÕç¸ãV㿤‚‡gÍMÇŠe”›¼ €Éégêx@¤/…wy‡•A#c†>ÜOƇ2½pš(=©Ðwt{ªÔkŸþÄâ“`±is¥rΔe¾Å~V)Hú”ì"‘’¿9³uŸªtdýÊäó0a;Ç»MÙ˜Àá…ÈnN»½gtpr©ó'´ÿ @¤¡+r¼vü•e©…aQ·>¤ÌÎb‹gnN%Óg6üóEJf`Q)b¿!¸ïý¨· ƒðË\HcÅtÞ—¦Å1ñêÑe󇫈ø iO¯ÀN>hpýL‰µõú§Áw5­"ty¯|‡±šÄðÈ”Yå_pv…"û?ârñÆ dVÈ ­²íÞšj×õªÒŠ–Œr“ê‘««•Þ[W$µ,ä_…÷— išþ¥ç#ùH÷ØÞ7Š¥k ÕÞÿŸ„~pëÇ”>ÖexªŸR‹#÷rñºtu:M?¯ïªÏÒ˜…Ãy¯ðAý~tüÓl·7Ç3X|x|ØžŒjg,§$AOïd|–F6§?®^4 ±âàġϋ£ [Œâ>±ìIãRR²óyí‚^Žvqk[!pÑolµü•dMdÅŒâÓžçè@I`¥&_4ÖÊtÃ{ó I·†/ŒÙ0\ÿB pIõ77o)s @¦Ròv*Áš—^‚ˆõ8ènü±Ò黑Òý*ò}ËpdW“yaÈq8ó=ª…<¬h•ËhH³Ck¾û&‰k•‚€CéÊÞ.6¸û¸Ú£¹›ã%±ê§q œCU‘ÙE$' ²U†Éÿrã>- |èózR¾lõ9ºTÛx¾³2¾j/ÄÆ».UàO×ù õ6â»7ª§2zç¦3ïCRøõ—~:«è§¡§¯„d‰ª$§ ¨ßG»#0cFó¶ªC³“U¼V+†Ôdƒ°üaâcÝü.ßÑ7ËjÎ…ßÄXwV´ìWn) gêaôZÙKuB~-KØ^K,¹ÈˆÂG%ÔÔßy0zÑN 4¶2Ï)t~*jj¢Îòˆw¸émÍjãºF²ËJ~½Æwó‚e½üÔ0«tlªØ».­øÖ‡øáu[|mp¦wUàã3}ŠÎÜë+!.à’¤Ý›'¸Dè–æ›Í—ûmãfAÐ6åÒÚ»/¶X=™—ñœéßã®´•J ‹(-kÑíLóC'Þ—ý +=ÚIÖyüÉU}+n4g˜¦OæBËol³¡UvÐFþ'ƒºœM~ä!®=óÁj #_ tvŒ´¸­&!Ÿ$BîÜlÚ’Xé³LQÇSXá,ª=:±( ŸämuÇvVwC&IºñœÜÔâbëˆàSKW´P^#VÍ‚ÿö¹¼º¬S³@¼y±N­ãiØÏ©ÃÜDF…®BƒLï/ÆMÒ’Í¥{¥ê!SqäÍÿàÐr§})2èÝTÑZCfc,Á®4ú)—OåÔ nA€[kPòi}Lí-™áÈcG&ÐÌÛÐë6ãs?¥vúýÅ"…wd5À#ôY|q~ŒN3'î“™â>½ÊÙ&fèû$Ô 7SrJþÎbp'BÓªú~‘\>‘tݲ^³¿vÕpT¾\¨wŒv¢ï&ø‘Ìpé`/ÿ´h¿ó¹þý!oAÙNºˆºM]ú„C¡4=ãé7DA@ñrAÅÉøôÞPø/é°>7pGˆsSøäæExß;¬…K£`÷ˆ‰»³l¾˜„8¾D\JQuˆ*”úΖlžg áÕ¾h·xK1PmA½¤)õŒæÞžLæ¶eêa/¦ë$Ø–GšTO'L¿¢PÜ©Št8 õGÍégÒ'«/0«Ö·%Ëçô,Ž“‡ ¤”ÐΗ¯¯ùB»Ø5]H¸9E|² v|€+ÆJùú¤^, ؤ_+Ó :©èg:ê H^”ôK}Ï«@Ï7Y¦¿•)=Ú“¦Ø^¯Ù´&Zjâÿß»`dl»°ÀŽ¥íƒµ‘W˜(Ù¡P &…´Ëx]†úSþf…ä‰{[ B{3.»U‰S€²ï&nú“¸‘!.5‘P„Lí—–ÉÜ{¡ÆH2Ǭyvå$ »ÂÝQ¯ ¦ÜÔ'<¨ïúÀëw<3F=£tó"º––¬fˆ«½Ëš@b ô˜ MЖà÷Y‰`''7Q-¬[˜ŠØMd»|¢>ú±\µÄ9ˆ€ñ ñ>½lÝr¢hÁ÷ ü‚a%¾¡£„tåÅj·d;¿ª ?„•¸¯hBR{ŽßÝ=À@ àóôhgMŒë6‚‰‹œ–€qw¶!lCôÕrXVpåú‡]š­À2±+Ä?ð—=ê׋2Bc³ Ý*^PXú)b+¶,Xd(CÉP\õ³‹.4,冡œ<.¡šhÎßžÏùoáù’¸ãoÆ8 5¨Ø9«4æj,‘ž–ÜR‘B`åçaVvx')G«Ÿ–’ÓsN#«Òª]v!Tòš®Êl»æÀàòÀ€nŒAØ«ê û ½Ï‰zu®ö_¿ nÞR÷D4¦«(¶)²i—&D~ôaøêæ±a—9B ±jqè÷בÛ*LÙÁ¼Î¡dSŠ`0®U,qJeb3õÉ_[L¢“_’ÎïKÐÿ“þŸÀ·"óƒwk¡8iL¥ûh«¿ë`HãLjäKÞè»r{e¤×-éÙúPùh;êž7&›‘ÁDô@yB¬˜¦%·”†F"↷¶2G†•?OÆÐàYÓÖÙõ@¬íz¢=¦Æ 6 ]Ö×]#j„BÞÑÚW96‚*îÀ …,~¾ŒÃE¦3Yå0Ý/Ú(Gƒ4‡Ip¾¡ç|ó„ר¢Ãš>è ëÏX+6véNa&zHév+8Ê€cæ{(x‹­BÎÏ)m¼ÓªpL91³×³©‘šk¾¹-+gw—KÇdö?v3'dßñ(±5‰Sêgè0P˜ä¨Ïtš8¸/fMi°Ò†n×± _ꨤ¹ÿ^¶žû)dKÿpßa ÍÛr#<6³oà²s©H¥9B ‚²Rw¥$®·i§ò´â …Ó“™"ºœ#;ÆÉ¢=`~™±…P%úos Óõ{p7„¡œ.ÔŸþSzÖ0™+‹ßÎè[‚9ÚË`"íÔÝ­F^eZÞO=s­¿//ëíŠÈ£‡p»Ë£ÐO’’2átC.ú £å#» , Sõ«“ ߣ0”Å…4ôVYÚhÇ‚¸B1—þ›÷üÇéÓEü7ÙŸçÜ$CüÝ?ŽçhYð‡€™*¯Oró|4¢e,%‘íG–j_àlG¿öÏÞ%³EÀv}Ù|Ú­ n b=¾#kCíèŠV¡tc· ƒ’^lj­¼!È©…w°@Êîø{s¾kŽÅBôþÑ‘¬{Z|ÔAúÁá [h ÇcÄÑîÄCú7¯‡º?x* gRσ¥Ú95cÙŒ„À-®/2>d´Ç$Ò“œ"VF@º¡î á\NÕ|~?ççI{!»YðPtQht5tefÅÄÔñâ[mJ,ê­ep±“ä 1oGæÔ 0f’ÍéÑÛÁ,¾¼öZBŸËPv¡Ø—LÕ‰HQ·[$ C™u¼½ÝóQ3#©ÑµÜ„]eÌNΦ6üÏÄ‹L’Åö$µ²†ôa&þç.­¡r:U³-Wªx×jý–‘,-è¤l‘¤ƒFÏQŒâ´`äXÉžéq}!’ºø|‡+Ä*½ @·óM]IÃÚu}bN#H°6¾sŒ—fYFù™XAÒ!½¢´x+M| 7¶|{#äSöóî)ù¬"øÓîµ…1À»c?ÛÍì~ µÂk3ÕÙü/IÅ úžGC>¸!§¸U¨†œé93Òœ«_ø Ææ“K7Óìºä¶ê°6wùÄl[=o‘õüp…ïw”pµðG¡î>xÕˆ¢F´ý¤§îú·¤ã;¢sx3du xhÛ¶¸ ’šËè±W¬ž[¾Oʹ§iãU4ù”£Çú!âÆøB£8B¿2(žÁ„yÂE÷šá3oW€,Ša2wQ¶ÝÞZjôšlöíÞDVΈ0y'6–zøeÐ.—êH`¨Ï-[ݽ2U„äc^›‘}¶¿NòûY ë‹TŸ=ñùDWG,IahE:—³(g…-žÇ6꜌󸃓ۑ+ET}È´  ƒE&óêÈN¥QqC"ÐëtÓ"éTPËL ¤ Yk°£át ùàü0 ÙÊ+’uöÅùíÀü^‘z&;·y±ÝÎBmŠ¢'q2àuÆ}É8¤´ æ–ùÏ7)¿Òd[¸ …¯ãÍC*»òø³+:´B°¼O‹KjÙ Dž:¯ééUHäiGûŽ÷¿€µ0›˜–¬ð3ß¼”è°y, ¤ìƒª ~feXáÏSjžÉd{¿ºÍã×:ûå«8Wq9“©A Ij7Ÿß£N‹‡Æ¶}ʘzžmRp"Y7TP+EZµA_D³!‹ê  Ùc¬û ð. ÉºhF¿@Ëœÿ2È1?Nœh¦$>o ï™=ý–°:‹_ŠÆQ¢·;É×ù ‘>ǺŠ!šX´@ã|\Jü#r›w” ×]º€†{ Å8z À÷ºTò9/7géxŽf´ÛÅ‚æŒîú¿b¦‡äº›uSd{gìûƒ»aýüô“hø12~í mb4d!HGsʼ¥œ!ûëTï0ILúBŽÂÕæ.óÎkCu%–ö¢óQYQqÏ Ìö~ºûœdÞapï³Òò—ð™OÃguø ŠÈ3øÙÆÑUž‰J@ÈàiJÞ™¯ý€áöy+Ыq9¯r;$îH*æLµ»`˲1ÅO²/óղЉ1}x/:-[†Ø9Ô–7R5GNA3gŒ@ßXžRÚ ôf4lSÈ·Y…¤{°ËøRkº^ ³ýú»“–»v=™ÝzìnË%ÀXXWáw.—nÿ¾eÑ%o$û292AgM¥Ñ£ð¼ÒŽ¿F.[›B¼´6‹Û¨Ê*ƒümw8`øžA)œÿaåJ@ ‹Ø Ò<Ïî€{iæ÷Ö¿^•ì¢øÍ3Ï3Ž€£>DÛ·FÓQ Nzè'±Sî@nÙŶÈj $ÞéâK›ÒŸe ñžTv_Yê̼¬UáÞ5P+Õ=ÌûYÐÀ W£nŽü+ùê‘XÍ™×ò‰9r;h!äØŸu±&È.;:² yô›sIÈ(òoÕ~…¸:f?'šµošߨ¨Ïh~øq=3Ç/‘îYÒólÚEõ¾ñ‘™k/*ãùFhÜìÜS!ú‚û¾:ô!”"äÑ{-3¶_å˜ n¶t½!¦Ef=Œ“Î%Ï%í5ãCÑde8 +nå²üÎ'¯Öàÿy’§/äÖi§›…èÕÏcúý TJDùXpÍëÀÛ¬[¾føvK¥þGIBÖ|§Tmç?Mí"?¨WLn"Ë *¿˜ óÎ7 ý,¨»wµ@…gÃÒGg=¥Ã>ü\øŠBÄhƦ†LsjH1*Rš@[©,YNLÔSH^—£Â¨É^‰‘Lyvj<Ñ º'{×-Ä* å,'4M‰ðÜ…Ã1'dЏž%Ù½­¶(’™Ä•œùôðãiÐÒĵt¾¡åÎS_OîXÇì¬ÐûiÜäÑ9T¸Ç°ú/èq͘B*Ƭ݌ˆNöŒ mŸwöäÁóŸdàVdrsÛYÃqÓ{{ï £RóÍÊÍd²cÔ”¹pÀÈ禵ˆËˆÎµÇ:ÂázèîºÝéøÂ†@«9,V\íB¡rQ³p ]+ø·ÒªpÄ€¥¨YFD8x¨x]÷øäðÌÈnŽ]î2ˆ—|_}\A|ÇÕm%XšÙü!sGÄLÏØÉLaKED§|<¶©íõßïPLÕ°ÒyW·xû~¡E1R¨P³`x³j¿k¾ÆÈCO‡ý0»¹Ò¬ÎÃÅÃq·ØÀg'z&XŒ·>U€=œŒ¸ Ü~èB¢#êNÂR-wd;e×yJ7*»ƒž(áÿìIàM´¢Ð¤6Ü–CkëF)>«Ó¿DÎí Ú¼>dnGRÿrÐ̃‹&{?Û;OÙÒ¦’jþ}2y,ùÀ\Mƒ¡]€G[s|ÌtæÚÞ{fO$e]øÞàÅØÖˆ0ã="ƯЈcpl±ógºîÛc‹²%_j¢óz“q“ñ¹À[fŸÄáOhì‘ Ei4 §}T7p“¸yÎÒ5Pú`Dɺ~°‹ÓhÜ&ãx‘j`¢ÒRi³cftT#xÌŽÖâ­ŽºÆBºäϹAv ó2¹ŒÂDŠÍ‹'<îÌâû6:Å@A~ÈПc”ô%;ÖÆ‘ÇHÝaŽ=h·ƒÂ„‘ÊúAØ¥tùäã—±cU‰[QU¹5¹öKðö•Ûî7y‘W4êa/«kÕ7¥þY®›Ë@ùiÕ·`$dZÐP§s³¸þQ ê<£AúàƒŽ6î:o3c”žóA©s΃¾ï¸?3:9Ã+–-L§…Âqšãÿ8,ˆP%Z \£&:dŠkÜVéë."¤3r³å ³°²w›ìÉ—âП%v7t“#â|¦ò‹8IþÂzò0<'n–›")†dÎ3SO\´fêå}~ùiÞÇ'¢Æ^ØW(¼¤a Pó¥>\_ˆê‹Ãz”¿~Z:4~‡%Î4}¾Æ“5‘>´£Ç³NXƒá¾p½)Ùß%RâæMâ=‹=xþ0Ïh ãTnŸ»] ŒhÇEáN(™m+Jo·¼Ír?åzÂRÂ˵½OÎSHÐÊŒ9¢Ðê,»~NçÒy»ìñošÛ1·¾kõ«ÉÂs¯Wæ¸ÚÎÜs¿×eñ*Ú% gΘÊM 2KA´°üٕׄW?šÞDçê^e*£5Áû«i|ˆÅã¬İéµ6 `dá/¶IP»¢bu¼ÃÚ”´HX%M´Ex) ʱ¥Ùú÷wk UÚÎÍËÂkÓÞ”üÌÞ{òÀaßÔ;0“/ðìãt,eãúçÑH€\ ÏN¯L ±ú¼ÑÞiàzÁ·ÿ2»&èA|Y žŸâ{˜– zbÔʘ;Yްúðw@\.N e«_6Õ[].tP”êq~Çy¨•îLí"ÕW&-™ãuÚ±EÕh~ëÔ_ù2íEX"—W£æ;[³jøøÏ\¸Iâ˯dÛ Í›þèMo)öt±¤˜HòŽ‚Ö AöÊu­õ„ˆ™¨»j^ ¹À„.z>¹mA}8û’c½”ŠÛ¼xÚQE¢²Y,;nj‹ _¤ä¬Uû¨«ÛÓ„²?òwû¬+íNüVçÀ!­¥²ê ÿ|å£:`¡ý=,f¼¹,ªÑI&J…YMã/#IKl!å•HW%rjŸƒ“|±Ú iÙ,Ø\R4š*é5NB6\eƒŸdçuú«E @»HÒ8' Ò~øvqÚ}™,Y›¿C5Qô>#!>“4ìЭXÉm8b‚¨XnûôÎ¥Œj(èˆGËN-Dðm_ÖPh™‰ñ ä>s$~xx¶“N÷Qÿ'*ñVGì<¾ª©Ñì¹–Eu!Éò$¥´>¯c§S5˜ñ¦Ù«ö‘ì—Èßw—½ÔîõS‰¡bÿ¦I¹ýjùV;ÂÍ)ztäLU¤aÍ"å"µ[:Ç ˆ\=N)BQ µG%@"u5²MáÕ©üD"‡ñ éµçŒôéù d8¿"ÕººfÔÁØ]h«[Ý*øùt51ºz'-ˆŒ·M·CKµà¹%° ÛÆ.>ƒë" ñþ¥DÖßÑ«YV T‰Cl®uÿø´Ñ+¿—ÎpEÔáR-ýyžñ9È 7»=ù•8þ•äXÜе :£ÄE,<¹Öò¢'ò£q±k¥)È­ Á¿áªM¿v±œ9`È/Ã{6ªÉD,™€joJ±µ‹îN¡aô«Ípúp;‹¬íoC\Ê›_îB¿÷­Ü›²l‚h~˜dLW¯’ÉgÞ=H”\y1YÖkóqÞa÷¤ÛW.PæømGlõÏ[O졇®ÁT55ù°·ù«“]úÒÛUÃvoÖ?Bm y°|Üö]d;]Çmˆçz½ :ÖC·ÕŒ6C`ÛSo Û±.Ì]³D ‘P[À íR-”b”-E5ü:÷Ž0:a?ªŠœ4„…þ5ù½,ÔÁí¦)ŒV7À ûuG´-#eÂìÄÌE‚FÙo%ÎQéaúyÉ/ñ|èèŪôîX/dû¬Q£HPÿèDUÒòÚ¨¦Éôí (ÿQ®þà–£YÀÜn……R$P-ªâ†8˜©Õb½ž4"*ÕøËK9ÿèŽG¿a€|HÆyd¸3ŸÔk¶§0Óó=›£=¤b²Ræ뜬=þ  QH9¨‚Vÿ ,Ë ,ÊE± Ĉgï•ïÂÅÆÌ/ßâ‘Ëãô¾XáúE'H jRêd&è\}{½Jš‘$(Kîþtš»ûÑÉqÆ®}hK=1šw†{Þ<·á}”ºI¬j2)ÊMoõÉM âñ8®5û).…¸ž‹¶ð¯g1mµÉ­ï¿5â7ôIÛý:)¥—Áîp”f<þG¡¹ËY]^7´bXp•L¹0tDîÜ€þ„Þ½ÌL Qä1÷¦/RøXMÒl­ð¬t¶®ÜO»ÜÈ]!ãjwJŠ.…"eç-Ù> vž *ôÒu+÷P d|“õÊ$70o3• ƒE(ìCu“¬™àyÊ*´h”tî-AŸqŽ!Õ ’\¨¼ÜìH”–=î7{ç¶9x®6Ÿ|¶ô‚`Z=D¤hÐ~GûÒP-'R ¼óåÂv¨ä4™ž“ë‰ÞoMiq¦(sD8¥1ƒ칀 £JDTÖf?‡¤&5¸nôuáð5Dd‰úì‘®»!?»ä°ÄÚ—ð4ý@á)ßå“Òïu°Uª¯#Š’Ïñþ>ƒ¼k¬âŽjMŸWÐëÄû™FóCíˆü+» ÙÅÚUAWíþp=…÷å¡LJ"¤_—Åv\\¡Óî ñT‹hŽ¢bÆêWäžšÈD|ÿ‡ÎeøyyZ§pSl»¼WÁö¹M ‚ĤÉ lž‡6ê…ØZj^ñíu¶è/÷Hí¤¦IŸ½q–Ÿ‰Ê oÓ ÃÀä†SG[c®ÿ­q˜vļŸ$¹äPkè·?Ê5‡’ Iz¸j h¸ý×y´61}‰® lØOÊÎ:]¥fëf­è•ÓšrÙÝžE2yÏ#”¬'ù +–ãŒyJB a·à¨,=Wtx84ý»òKN’’šw³L†NÛb6;oÆð"] å³ 4å²HK…PR¾V¤U*5L -o¬˜ï1àßÞUx`:‰Sf¼ð#Þ…Ç¢9AÄ“ØWᘭ×ÿ¼PË(~ÈöeÁËûBªjwüóÎæÒVä%¨h}¨×Yeè@XÆÝÏ Ž¹jbÆ€[÷¶ _쟕9‘2çÊþåñk¼ rø,Y*zÄì•7Ð}…³‚´Añô-B),nøÛ´%d·ƒ"дD!·Ý:“ŒØÒœ#«ël©Rp?«=’J·úÄŸKõÉòwê9ˆIqÕ°…Ìf™òÔÝJ¤¼­ººzCÃð6—½9æ¢l² vTÖ7A§‚ã4 Ôè¹æÆåa ³æY|MqÃ=²hìôXæ#ͬ»‚pQ!/«]aÏO 5içm®â~®•‡—ßàÒéŠöÙ·å£Ä(œ 8ó";¾Op8‚:sŽÂfÛŸ9è@”ă•YkØd÷tù”Ý|„Ç8ïvþ}ñc\Í]gu:ŒÜùÝ:©Á¡¥}Åß·ü6&Y¢ÕªBH èfÀß¼ž×Á”)p‰µ”Ûñú|òã=w¶yÑK$Ë­Þ®Ìîõ4öKV$Òì yèþâÁ:;׬›"¶,¹o§ !xŸhKþt†t½ãÂÜ 0rŒ­pÊMœi^‹f[á÷`ÝSÔå®yÌܳŽ3ïÌŸ0ÝÅÆZr-¦Vr¨|9Ƈ!â€r5ž\YÊ¿`+ÔçÒª”~¸µ3O”è1ÏEô ÆTärÐtþŠ/ÀÚ‰Ãøü5‹¬ z² ÄË@ž5Ùáó—ûωJwy¥ê/C²"ž-ÙŒ€X>£ðÙ%;»€m•˜_>@P¤|Œ(Q$K΄J+Ò]%{–}¿L9Æx1? ÊÇ-`¹Ô±hæF„§cTý ;Í÷wÉûFYjÙ'½ªGö»Ù#Y™„þ½b2õITƒBŽ5ò1ÛÕ²ŸÒ×®dœ»Éð°øcÚ°ç÷ç#o¤(™[Œ4~³ ÷ø™H†f‹Èó­©àT+SFͳ3íÅíÔþó×]¾‹´ê»€f²¥ÅŒQ(Ò ÌcÚÑ"<«Uƒ($ôÊŒÜ2ÝÌ¿ÝkãµZ†³. Æ#ô#1äìÆó¯¯1hö§mŸ^”yŸ%І¹x%ô¿ŒFšAè²hªŒSØý¯¦o¶Ï*Vƒ+ú7C/pÍݪíÜY$Æ•›FRÑÌ €Í­;ëùüú”/ÏM'­Y¾æÈ+Ù3iöMªMt‡-Jþ̣̜Ç(ËD)Ô…ÇCcøÇñR` ~HDz0””¨aÄ“”2ãö]’y¯‘×$:7¾ h[aXòF-ú ±É%­¥k~‹d &9‚rætMùwÕ§z9ˆ´Õxã:ýÀPa»f»Ãt¨8Ärvh;À´Iª°HIIâƒ+ÂËJš#áZ›6s‰^+¥ªzî·m¿ò‹G ÝêUŠl°XÅ–Úì/;µísÞõ*ˆý¡Ä]ØŒœ†‚6’ëøùE(Pc(¢X\IÅ8%ÚùÔyþl¥Å™5)_LeM‰øÄ„„Y¯¹­õxÀy·"–OÜZíºÃ„o?zRãɹ¶ñFÒ‡Y¥Lg°¼àAÿÌ}}À°‡nD…=—@É¿>T$Ùí‘ï?-8Mპ¦Î—tǪ¯ËÜD\ÏØ ßyµã|YjÝÉ#ß8’Шr9`(¹âù»R?Šúž™ƒÕpy׸w&š¼¾åÏøŒyJ, Wv×ˬŽéºŠmúêÈtÄ_<»t+ßWmÚMë’dlÔ¶|¿Ú¸ù4ÓC5JL1'¹³nìNPEºV1T¸Î ÷•ÉÁÅ©ª¶ÊzD Ö§‹o¿Ð9 ÑnKU‹ï UTËÝw,+§g>Óú'Rìm€²(ô¸{n…j°}”Ö†ÄGMT58T…ছzH/Z 5íh³Ï ÕV f9ÓOÎÉ`L„P'ÂÜV´¾@roàGQý`¨ôŸäO.JÙÅbƒõ¸2È4P&·á÷Zèθƒ´ï^-þvcûâ.aR(—¬HáZN7Z·Y·8?€Îo%‚½‚;¼ã‚µ[Qg×¹ŸÐ¬G’ƒ#—Ù*¾Ë8zk”pÉ(𲖴ú2ÐLDšu‘¹ß¬ºMˆÍV=a0ÿL>óÈ桎ßõlM¶©7)ÁÐí4¬•æsl¨?M¡|xø$·™f'þë±ßᯠ´1|ñ¬½3S†.æMìæ~"[’æùv ñ  ¹·.ÅA7ІŸ¸hC“}ümšÐÏßákHW¡§á.WtÖö°,§På—§ÿâŠGœm3á㞆€ó™ü7‡±DïÓ²;_gg¹$íªtªåÒ?SûHøòXÁB›ÕÚ•%Œ›+ä4N‰SùÜ;Þ¶6¢YE"dw:ÄC¾Íï×8#Ó Càv¶‘þt-N¤ÉÅæ]Ó¨ŠÁíž –Š_jß“}ËšGi OÊi4oÈ Š$—Zî†1æÕr«¢nœc¥³ ÜÞŽã¤{ÛŸ“!XÒ°õ=ÞƒbÓÿÔ':G3$zÍ©èÐã{¤àÁ´:†å/ø-©|e ȹÞ)¤m83wóØõRõµ—r5úÉì’Ž–þî?Õ܃>¹iz‘!nS^×î±Ó!qªæiÿÅßIObI<û+Æ¢g…MçÆÛö…’…CKŽ8Ç—ÎAkì‡4ý閭Hâ~x ‰u-‡óc?‰2ÝP‡2[*­šS‘Ý„‘ÛˆM¢~+-ÄC$ˆ?q”vŒçn•bÃãKxü“þìÊ–MÜÁÀcÕY¿´ SK«#UHï2bÁÿ|±™•· çsÎhùr*Á†²Øñ¯sÓi öBÒ¢ºCÇ@ZspÏ‹Ä ,?öà0•¦zÚ]ÁM¯¦‰øÔ Dº³™Ö®Ÿú4šÆÃ_7é÷À¸¢7_K¾´ò𣙚²iŠÝŸ9Ȭ:#l·˜OÙLy°lÒ/3‘¯ùÂÛY_cÍu´8œŠ5ðØ¥Ùê#uJ€Ñ.îj³|0rmEÛb¢·Ø¦×”H‚ãÄq˜L ‘„XSå¸*‚oÜ£”]û+Ï\{î›K5ßè¨Eª£øÒ50 ŸA£á(+Åb= XEœ™à ŠÒ’r ̧áxÅ(A½;†ôo.?l‘;÷ÿ£x~ÙpæÒßš°RíÉl~SD¼,@èýËêkhÅwçP9•rk|Ñz9oÒ(fGlŒÊ ^CMÐ÷=?¹‘–Ó ´’Üñ.ºÙgÎÁLÒx XËÛ7Œ’ºô€ÙÜ Ä< ›Žc}¹|ËåðOZå4r Åä.%,±—ó=‚7 £ß¹¡,¡¦%ÌŸôÌ– ¦Ï¾†äDÏ++ ÓMóòSÏûoo·õ·ÞY€Px~Ì?Ò1ÀŒ"NçC«f¤?Ž„d:Ti/´¬„rE™Âƒ0 îßÒ­ÊŠ•½ÊšGö ÆL¤)åÏú¦Ðç Wù¢p„÷©°çK´(™W<{ŽþfÍBêwr2ï!ý”é`o F_Íù§ª®±ÒöÐÕm=ZVÐ̰µú¸Õ÷ǯ…Z,ÚœIl®Är½àPja~;ׇMB->Ð矺 eó @&ЧQ±æK5}¬Œ PëFàA¼q÷¹-Pó|Ì<&Ø‚o„8±B`— åÔÑüÞ)D±Øþ‹B­Æç²¨‘˜dþC—–NøEpB(˜¬šë®Þ©¤¦ä7=3‹</5¾Xóú‹)Á¶OµBÄHt €ç¬‹šûBZêòÎünÁJdW/sô­ÇO®ÞYnbZ²ÎOgœý61qi~Mû`èKdi˜PºÞVÀv4K)a½âØ2 ©ã–QÇ—ÄÀ¾ÊÔEíú0ß&sµÍ4»•B·ðÞ”lÑ«`ñS Ñk›b= d½×gµêZËžÍ9 K¾Èü0שRøô ù‰:ûh§Q@Çë¦2î˱D€:ZAùfPl¢“ô™µœ.Y‘Ní0(‚ãl„HÃëGÂì¤ÌCfÌ…[Î=A7EJzXL¸‚BíôÊt¯¢Îz&¿ÍbµZཬ ›|úórpãËHí8ÙšÐ=©idŽßPŒõ%iÀêÓº˜»1­~# 7.R<·ÑµéÖŽ;ßöó&ë×’±£qs\¹ ü]‘>œ)ÌÛ ¿‹¯S ,“*æ5B‚\*–ìÍ÷êY¼>¸å¦§T<öª¬]좄†· Ã=Ÿ î¿(ŠÒGN]÷|æ9oÆßüKHºÄÿï&>C4CwXèP¸ß—ÅÇA¯g´!\Õ“Þ>0G­Ñó}N>‹¼Ú«»E5Ê”7ÚÕÂp|$AxEš+èîèY%%gÀ’M95÷“áUXñút8ôÞቷï¯ÆµTë¹Zþ‹õ‚¹ ØÉ ¡8\ ꈟ>›<•øÆùR¢='½ÖLùÚhÓK‹ëÀU£0À½4ò¸L—ã$Ì/USàê÷Cóµ39<’ø25_c,‚ x.¢²=ÂE,ò¤4`g• TäShèpï‘w¼l»dÅQÎp—íC@(P5,B°qDÄòZÔ^…ZžŽ€WïRúˆaíÙHøý,oJ¯cµÞìòkµ(t¡ŽŠËÄ5@Q(vUÝágG{ÕœjQPs渦 Em•Eµº­ü·NƒõåÉä¦nÀ¯ågæÝÛñMhY N¥ü“jXPí€^XåP¼¦à–y?þ4°LG6É夒\Ir¾óçLù ©fKÎ`2N™S:¼Yµ*,pè&L9t,Ìtߌ ³¼Î0:_>|§Z‰¶öVás^²;ÝÍ ©ªN->®F¬UmÚ>Dˆ_ÝÄá£ô`AvNž—°ù^3¼x/HË'fs‡Ùñ'ª”gŽØ…ùJ›úÜÿ¶=Õ­¡÷´ëÀh³ÖóðÛ>‰Ãrê;c×ë0†¿peÛ6æb ¼I&™^ŒB™ áõ&qh›²R¾û=›ÔBÃ>ƒÈ·Éñm”è¡â‘Î FMµ{£b_Äø>‰š9ŽƒwÍ3w÷˜†A½;|A—¢SO_¢  ËK1åÇÄ5FIØŠ€G2+ôUWÑðAÅ^òA<é>|Ï]þ警؞øuA¿j­cŽj­‡U}FöÚou3$ìÏ’9Ü …§ ?ŽÇ{“2T#†ImÇ1B±¶»üµKsýÐ×5á24UÁËI—“ÏF ,Q‹ÐŸR>ªØ/ÆéÐ|»ªòUÆA:Бû Þå]K”9ËF‚Êquس= ‹øO˜»WM°Op[ìò¬”ŒÈLµdÂaK‚*RÊ ;¾=2v?ÿØ[½/(~,}ˆ¡`܆׼ÓDnAÆ¥/ó£÷|ë;'® 2èÉŽ8Åç+‰;¨¯tT¨STØ)$Û ÔÇ-»z«e”|S8õâ²ÞW•¥õÂ[‘ºhíŽýåÙ›¿ËȃòŸ=ÚÀ.îÞÖ8Ý¿ßmMb`I¸ž¨Örå w0¦ˆè¡$ bù”;¹Ñ§1­Ëœnâ„âàÿpn¸ø¸÷´«¸ ´/lk'˜~OõôÕXöžpçþl0ÕËþ~æÁX”D•JøY´Ðw¦Þ·ï§Lž²ÐÜÍöfÃÛ~Èúw—hb˜5\Æš¼[0ÉeîP^ ²¿óI'sC¬› ·ì¹å}ŽsÁ)÷­½s}Ò Ûf½ƒ 5õiãälÝy‹fè˜Y0ɯz"±ì“6¨A°öÈÂä :}]]@̲[t(àFíä×PàDÝE”p(›<¦Bµ·åã†oT›èÛ¹S¯wyl~Š‘×S÷u’kLD…˜“%Eøå§GÊ>Ì•jùî—ÿB¬9%¯.­ö÷²C}v¢Ù¿¾ôL;xÕV{ê è IE†—røv`Õ¼´ÄUÓ†úÁOÄŽwátÅŒºƒƒ-5¶9®Wæ)wƈm"[ pY ¼48.“´wŽÖÞd’ñBl5öi%úµl—õ®5ÑÒH¦„¬ô.‰' *"~··îüµ£h\{f|ûŸ+EžŠ':ÓHášžVýÉì+h{œèÁ7Ï¡óIÞ£ˆ…dK„“-TRy¬tužÐàŸßœ$pi-zRß ²º¼“KƹôÏUÒ‡X¸×Ëù¥JçHM,0µ‡—A=Õ#OXÏÐÇ”TŸqW¼J^Ø^RDª'Ìã07á‰P78åàèîYõ7h;³Lit“¡säø»—æBH’dÞ¤b ”ÁbìCp#Õ B=5N+á]¸:’tZl.YÑêóøKÁ2˜Ž\ç0©¡ñä\ÞUâÜW9β¥.WôÎ+Å“ö¨µ6ÏsËÍ•Aa$Òh§„è—ùÀ•<ƒ¡í,ÈÕÁ·²ˆA©LµEö4;N['S¡¶OÛWÔbü1êëyaç¢B#±b¢"ÛMûqîP §šŠN‚cˆg üŠ…ÀrÅ}îûL’ãGTžèr Bˆ·,ײüP>ùÆiü#ËvŸi³Ñw¤óMÜ·XÖ…G–²šŠZ"÷!ØóÀŒÝ. ‚ƒò„†tǬ÷Š91rb¯B>¼öÙ%K_èL±P&a©%ðš~ }m{zÇÙ‹"Õ@Þ%2>´z B¥Ws^Qø ­øß›±Eë˜x’ŽÝz\œR>p ajõ°áHN;‹ù ×Á¨æÔU|‹y2ƒ08¾Y7cJ ~ìS;v­û<2{°ACÕ1Óâ|Ãb°Z›@é]©öÜØL@RÈà›=:V‹º*¶úÛZ sàøìT‡Èe%íÀ\Ì»š%"i±NæŠÏŠ@pÆ_ÙL…rœÐÇ€¨ð‡]E¯L±5VÛ ’<xás¶CÂæ®@ÛÆ úã#ŠÑXk{œ*· ~Ãä‡|1¶ ¶[xEÃ)þêª ò‡1N¢Ñ~€‰Éo›5hÈ“KËÙ½G”~X!` ­ý4ìóØT]0a¡ =t”ýMrጡþ™•ZÆ›èržy„aIµqÅ"²q0Cü¯ÞŽýûW22"Ä+$ÕÇ †€[åv…º % AÝ‚ eN›z†3k›(΃«P®ówŸ6¼ÿæ2$¥Xû2'v:BßÓœÑT¤´<ÞZ¶s›’Ö¬\°AÍÂpø.匰ÊdáE˜#·Wš$=O™»)årÐ “¾éuE»¡Ax8l¨¦óäBîzkó7q,9vtð¹O5Íéi¤Œ¢;Ýgág>p †?5]Ø<%®† SšŒ±pÑÊÚÓˆï)IÌMÙ¬S¼J2pö iXËÎGàœJÒoI´‡Qº o§C¡•–Ym… æì½\}ÆäíÇD A@.Yà/H›êãØiaÚ~8¶·Sk¶òä™Ý¦Ö‚¾Â¸aZpƒcÖêV½ˆÃö<ó–Öa¬ ¯o"š¸yçœóMy ˆDؘ»M;eü•x+;’g¨"²RV«Xƒå˜+u $ï¤]úIßœïÁ¿v Ÿ4_òˆ*CMy¥Íh4ȱ(5Xæ8lñí[ŸõØŸKXò±‘m=Ã;C†ïæžn˜×:Y²ª²në}½“;ô[訅ì¦×Wc/hö­º‰ùb ª^68[Û`:èkØpžö°Í¯éSB³MÌþ/lx«±ÙT$Vh¾pjµ£€«¿k}óH¿€a$äd4h&‰é ر1þûÏö0ox(LëyI“.èõ£ã]â¦æÖçv| ³X*Å åDPdÁŒ°*yÛ˪6ØýNßÖá)˜~÷’âðƒË6V3j&½¬<&™mh·¥ÙCNüËg¿gÔ{oAëBЦBZð.f+çR@öõÌ„yAwtùX ‹y q¡`lî5}ÂTÀ|1EiÖî¶‘O¤BÖšvÚjb¤Ì×`[·²hþ™½Tù8’n0ïç° H)~n@„áf‡øabAšš®0díA rÝΛm^œWܪóÒüYÒYöŸá ¥‹ÕyÒÊj¥«­Û\`ÚPæ¥~ÛI¨ ÍèCu†…¹EOÝqÂßUìLNêoÇp½µz~Ëó´HïIq6¶æ.èøª-–Õ£_78¬¤>ú¦dÿH3‘~26s¸‹ûϯ ¹äyYnAÂÑ/’¨¶¡:¤±›Ak£ûŒT:"­ Ý•]•Vá2j A”Í\òOH3©@—Ýþ7‰a®1êT(J<£@‰hD7ê% I~h=ŠÜ¿wªŽ^Âñ¸„…WU¸ åó8k™ImˆL‡±gŽ#x—™u/c õ"(©Žs?’7ð Š ~Îè´¿óX¬@™A5áV Ú™”#i!%z8¨W¡b§ÁKI•·òf1-¾¦*!j”`xÿ‡Z…ïv//âgÛêàIÎtñÆ-­C1åázñ5Ÿ—ľ_Ò4f„ß`\.[R†p’—ñÀûíŒsS±í²³{ê~?×£´“%ÚÚ³(ÜT•êúÏÅÓg#‚×§¥üaܱýŒá½±ÜqÝŠ3Dx6Ü'Ø€9Û7;úò„µEHÉX‘ÀËÝ¿ÃPc*õ ·w*7Lø§M¬Ù ,ùw©sùTgÖ®Xô}¾±öG8;­gÔ:úTJ|è R[ï§Î§àìÖöXôÁÊ÷ÀX',ní¦ªHg®Ñˆ‡Ù¼,È'Hr²úG(pºç…P¡0ˆR¬XÄé! .]cb^>x3TR9׺ ø¨Š£ƒüÎÕX F_¨’î (”£Éa{ß³¯„ÜýöøUÍsù´[g›6Îø„ÙýÏÿn¢Užå™îÿÓ+^öÝ.²(Äyš‚mîÕ‚Â2¸*÷¼\-’½ª]¯Á"C²ÂÎéÌ‚}ü>ÿº¦¬¯]>oÒÎ&¸°ŸÒÇÀ&ŽéM´e9Á€:@užwÀcIÕ¦ëüýÞ’u`±¹U‚?ŒAü“'ß<xdñ/©>§^¯¤:fdkÞ«°y‡<7‚Û;td.€iqˆ­Ä‚CÄ̆(ÿ{oˆ‚øúä Ë–»…5kàukaìa,’Q#‘·NøèÝ[ñ<àGþævZ=1òÛÆW¯|.¾æU~ðf´ß»)Ç…ÞâZýÛaÆðº²["ÀàÝØš©¢CM‘­´4…yL.…,’äáu?S8ÑORZ®1„¿SF¼”ãä•.âh'~耩AÔ(Kn?¨P«ZüãPúhŽÒÌLÂ5iG¢…Èc?”d‚(Ê*ûª¤º!§™Œæî‡ã;DøÕìÎ8 tm—®ÿ¹‘9»ÿÝó{XBUš¹²!¢ "c:ji_ýC¡äb@MМî{15D¦4“e ÝÒ—Z#—‘*.22ž¿©óÄ~«Ê!°ã[a1.D}óUYEõU¿°>Œñ]w4>ÁveÉ7£#~n&ÏçLðO¤éž»¨²S˜S,—ê´Ø~ãcâ£ä yrœÄñŠc—lÀñy@ªt«ù‚@û[,=oâ–¨!;§±›wÅêI…vw/ _·ŠEÚp°¨mGª½ e0Ò/å {QGº³è&œÂz¸0ß39¿ YQ4dÆQ¤UÍK"T¯)èb‹¨µæùz4•DÌÒÇI×&h1rQ¦à.ÐZŽª~Ñ×yðÃ嵑æ®I3ÿ–¥ì­Ñ½,A Vs[éßò"h7ìóâxà…ºü.…+=JDT­ÒeÒÇ·Øäʤśw oÎHï#?oqÅd¿õ,>Ç‘w[££.½5?@4æ¦Ù\mŠrVÔñ˜Ý:CÁ9älÀ¾ ñ´]–vi‘hûL¨(AVò NXuŒX×ÞCê“„}1˜2¢¨Õ¤¡Rz˜DÙÁíQ—´…¸œV“ö 5—nÍb RF©‘Çð¸HË(¨•T‘HùN”¤âU”Þ¢c·=Þ5™]ŒC½žž( ÄEW ]a%,€;Ø3~êC¾ ЈD yæžä]ŽÊÍvUåÜ—qŽ@¸ã:Ë /Q‡r|\ߦHçTZ”´l•ÍÕûA§ !I´‚5±)ûªŽ<¸(¶úÙ]B·ü^ÌUCé.v1¿8-Ÿ3Tdê=)ûÄFœ}ø©+æ+T‚’÷y¿Õ:å,W³—ÇÿBÉùÔc*EÝ ¤£0ØJï„~eo{ä’½MèÍ´úÉ…rP Â‚+jIDm¿{ÓÛxTl«_ @ü iv vˆîlI¬ -·iQ ÄMqL’€QR ˜ cÀõèÖ6r"ܤšNwøþe:X½á#Íd’È­*9,ÄP€èÌJ÷¤ó‰ÒÄnIÏ{)\ÓÄ®´nÅÖ·Á6ŒU£9)Gíçê¨Á"xo,IY¼XA.’L¬ºyù¬ý€Í³Ðm…¬0šV ûw[êcˆ£¨YšsGSTQ£Ü2‡!¼Ó Ó*yĤr½Á/£ÝŸ@+¹4É<·A©wñ.ŽvêcUÿì \¯±õ×·7L!þ8es5™Z6Æ Ÿ½Âc®ìkÏK¯gÂl®_ÐNmJ‡|r{l 6rt0’i1E}oh Tþ_ÍÙþî q2£A 5|iñò·¤¬L@G¼KšB-Á¾÷F;ú-”wªep¯ž:<©VõRÝädñÀ~ïzCõÞjßA54‹ÞÕD 0\å]‹ž·Ô'*+ºËó j>×1-X¼1.@ Ó˜"ö¿>&gxx}ò©Ë›£?Ôß,õgöÖ@ N0éºõ]\šßry¾Ä!ëP×BxªÚbãñ½dØrñ,[€½Vhæâ‡°³÷¦Áîz©FuØ,Ô…‘…×±¡»óBÆrŸàÐQf$½8e½£ØÜƒ)hòµý ‚Æ—‡2ì§-ÞeBå£*´è¦n â:Pì\”ž5û/ÎòµZªž©ïC¯Ë6İ©Z{Žz ®ÛíZQÅÅ/¹Ì¸?Z˜< d··WfP®8Ûf‡Iò¹4sæE;Ú8(·,„áÚ;IµZÙ¡µâŽî+úµ–6.m$3ÆZÄH†·[‡Y2gk•Œ*‰MˆnܾLz¼àø ÃÏ4ÇÝ¥Ô@@¼¶/Ǧ3´Á¸ S¬‹HùÀé…t¦ÀÉ.1íà©iPh‚AøWþvKºulbɾ_jŠ5ËæI©@^²T܈n"ŠŒ(Œ \±@ßø"‡-¬éûRÒètgÉb«[]+îåw}×9:³ÃwâÉ÷¥0wq?k‹k/mbŽöÒx`£‰•ÚÆÈóe±§uSBü›æC@œé¸¡œGë~kz–8÷¡_Ñ] bÀš€b)ì ¬¹‚Rþ®ã3÷óµð„›ájÉÖŠ³zÇ…û 2TŒ­MLFN¾õÁê;cÛ <ׯ}ò­4w »qƒ´åNý”µe…•(/q××Î;l@Ó£Üí÷aŽfTÅjÇÕ)ì,nÁpz»²e<­î““ÑŒ'ø"I÷÷ŠÕ"ù8òíSÜøŸTÁ#ã÷öi%˜+´:Šã:•&Yû\¼žçÄrr<ÏQ¥jæöødD® ¨GíON(øsJ¤»Nü§–ɸ~Ù»R£ -ôúèDµKPÅOw9¸ -@`@ì¬OgöJ±Pä¡¿¤Ì¾`L ÁÊÝLƒTò}éˆâÒBDÅ”míDçÛƒÙýòà{.÷•d6ÈÆ×¥bz·ÙöO€Ž=bvLQB#~ÃèKÄîÝpæ0>’Ñ<é×µG6–³WŒÏ!ÀJ ûµ<ŒýB€Ï÷µù¬…QÊ|ƒœã^‘#ßâ®<Ó ÊÕ %»G­²Gú]èðbÄÆ.èï-î)¤FQ°¡ÊÆL v½¤I9vá&B0ßU6¾Ê`E,²”ôÖò³Ô ü=Þÿ°ÚR5P#b©<›Èžb)j^©øÇ„?{ÈèZL›Qêòîf,.·áöhÂøÆ‘ÅcˆÀ+p¼²ãÖB“Zã¿Õ}G; ÐÂbŒc¯XpkUwíf8)ÊGµñ±Ÿùµ“ÒìÚW~U÷Ϋ±û®…Õ$+áPrf„ûýÈ—Ð<”PƒE•ï»›#£¢ ÚYßAs¸FxT&»Ú;tfÕiû)]TGŸ–41YŽ· x[Úø|*„|ãÓi‰¥ [­ -Ö’UÌè ÿÃ19~I"ÔUÖ#g&i§‡2"{BQMsY¡/š€É{õI¡`ðì9¤¬õ™„^éÒ$KºBŸ^Á&ÓU†±4g£˜¯/Ò$•ªieØœÎp¥eÚ9½úëý­­ÍuaeA*[eE D¹te)ˆ‹±dgÒOÙ%ø:Ú3vߨ¹A÷õ¤;$<#·oÏZlŒ©]½ ~2áy¶gû; £®*Bš?Ýú8KåñÂGK[­[ýøk2røÜäEŽü$²·¡v2#ùK…± ®Ö"U?!½ªèÙÑ·òË/Æ^õçr,DBEê2àE(.£1t’yR˜e‹l*ÃûK±V „$šÕ#ý°_¯ÞèÆŽßƒK¼ã‰øXdÒ«ƒÌe[ÒÆ]¬(Û ¶—.Cáú“?­füDL}ËP‘YR`U°©ÂE~‡)šºäîrÜÉ7߉w1ÍΪڑ2 2`¸¹²­søJ¹`&íx"ÄýˆƒþÞbmÑ(°*"m÷¨Wl}I í9ç /^Ä_~ÀxjŸõÉg‹)–L&îü€†ÿ¿3©;UKé¡ahÂ2TRf™E 3ŽÑžBUtdГçã„åͽˆãÏ÷¯Þ(‹œ}Á ÌuKZ„ ¥W€aÝY0BÚ §Hûb÷¢>@KG6?²Ju,nžCÇÌ'6\2ÏŽn“¢‡³<­Ãz –3ª„êàñ’Ü—_H—å-·Obg_4Ðëë¨@]NJ÷k÷Vgžß¢5òºãâî\xPÃV9BVVs—„Ñaæc7Ì’è³oGxôÊÆšêÞLÜöä.Ñf>òeµR‚ˆ9jI:ÝÉñ¿?ð!ÍøÊòº–F`sw–+d“ù=3œ ¯Gž:3ìiôÛ¢~w­Âi52õ¡.HK–Ìõ#à Ôû–cC´:Âd€ ]ËëØñ‡ .†‰r]˜Ø£SÊÑŸ}]uØÑÃÒBªî†ºa®Ú=9€ñ„Fˆڿ̌L¢‚˜Q³zÐ|ªìn“ù'×ʆ¦ð„çµùZ´\”¡ÌœÅ1µD4Ü$|)ÖzK¬ÓêÕâî–{ƒC0¾µÈ>@arÔ¦ìë±æ/îdwù(ÕZo•ÕI—RmÃN{dU2ëp=5OˆZ²`î€;úk.°Î‡Ê;ÞÈíiÇ„_ã$æÃG–J?ãÇ4¾r_ì?‘Nù/삾>èô~„šoÁ´ð«29K"æ Û}Îl$Ɉ-ì×µi¾t+–bÛÏ õ»¯Rþ j– §ˆ„tÑTd',ª5š—IÀ %|×äg„9fªgÉfpA©KÅ?0CŒ ÂL·•äf9íã’ë„Úi• ø97¯šmÔÉùñ…þ–RFµc) ¼rÀéiJÞ%1Jž4•'Ô\ÃÜwì ì .  „ü ϲã™]âcäÌ~xÖñt6±ní¾>=Þ>¬H‡œ¨˜ˆ8ˆ“\…BN¬:LM—üætßjç43°Ò0=zöûÆK@a(¤Ïó½c ²ìge7¸ë6 y›¿Í'¡jŸ˜¿!#_KÕ•E46õ¸ýk¿e·›]¼d¬`¦°Ø:ºc)Õoz{JêÇ<  *ŽÂu½Š$¸ ãš=–³+!_æ0ܾζw¤FÞ°˜nQйMÐÊëÛB)H³æ|ènÐl~Z’7¯ôæb©i"¹B”ªXqɱ˜pÊDI3{M þC‘$¹ h¿@ymeÍïË—÷›Ò ÒCKí“Ö£Ñï[h¤ ÞiüÒ HO©Òpï!}ÓYËÂÌë‰ò®!HÝ Ä=?‰Àbˆðÿ@O™ÙÑàZ·‡­@ñõã‘á¡ÞnvHŠ9¯„Td6w–uÕÊ$³òÃü•Béäã‰7딥As°Âu,ìÔTŒ´­&jU¸nž,4e0Uá"¡A¼-#Ÿ¸HîPýôd~æõ$6Wxu’s5^bȹS¹ ‹qM…$ôÓf‚Ð/½j®Bá¸ð cvž2”8–Ky´p¯è‘¯ÃTÑdJ×Ìõ¨&Õ—Ò¯å9t‰(CDä¾;ÿ‰à†¡;€ÙÊÍy‚€ŠU3™‚RŒ{bBðe,©´rQMðôˆß:VR°M~íÐlÙÁŒˆÖ¸Šëý5é%¨:'ÆÓÊ£Ò"ØsºT4bªVüìà øp…³ÓZö9Ó=`8Ý«î—ø,~nsàÇlT!²ýc¡~Ê õ\pMfêRšŸE¬OòŸ½k3˜v Ç5D'xzç„ÅhÚ>šÎdŽ1±Ê-ÎOî*ZÓ›áÍ :vÝ·â`+¾> œ}ÙåÝô_S ‘et”|Õ{&%ór>ÁF/…aoQ°Mzú×ð ê(/òÖº2¨Ø´oæéN<ŽãRµ‰ùƒDùhPLÿµBÕÉz’¬àJûTäžqí'¼E“‘ÞsµÖr÷ƺѫP­¾÷ü0RâCS4åÅj’^¢&ëÃ4˜¨5èCB sàV6§bÞÜ+K‰ œO¨0y„ä'JMžò—x –Ľlôò˜{C%ï†ÊD«_¦Š&2y« $r!ã\´_v¾ŠÜ¦Ê”/*ý†Ò¢Ï N’$µAÎZÎü¶µÎWƒ'ömYGŽk­d-ä X“Gý‚g@µ¼ €¿! ¿KªˆEJ=zš ¿™aðrÙ‰Å[ë8Mÿ€»S?‰M¨œÚnjÙeÌ#Â?ÁoÙÓs£l–¦µ=3‚Gj) iw¹2®=ßíˆïL®øîKÀoü8qO˪ÐÇûùad(â¤ÜÇ\ω< ÉÉø1¶l1ÿ7Ɖ\ˆR¸úR»äöáu˵HZ6¡KÒ`E`äÕšNz™¾¿¤âm#ÕìÙš,™^Ðù• WÞMNºg®°EZÖZX–Ô1Ó"2—óö)fŸO a¨éBÐ ~F ¾]e‘”Ì/÷¡‡¿£íL’ú1Ûm[P~!R@gß/'Íg¡ŠÔ&­£³V¹ñÜý3˜HÈúXc/M—öj¶l¨’,˜ÂS†œï3½‡™GÎ-…/F2E|¬½š@‡ŒóóiAÁ2â²Ô­&ÛÂÀlÉ×ÛþCòøŒÇJ´Ro*ß%ø2¶€·‚TMöÈO@®ê]ðz-Qâ¬ú©ý‚}j,f l®zba¶óo«€Ù¹—8®‚'@XF[e\ÝN«-h9_‰½tÏÝ0Àë)4lp}°´BÝn"¢ ÑC÷Æù&tdeÞ+ÕgÀ¥ÇüÒ•œFÏ#è#žcÎÝùhÑ?”m¤Ã Sôwæ>ò›O™hÉV·†®î,cY2INÑáY{7o‚¡ØðñW0>g}ràû¸Õ©rÖm²s‡Š2XRjˆgÅÉ*s0 ªÂdzÒñË—•Æ$Õ½{uÊ-©2…ìtRoÆÁj9K¿±Á3ÞE}+7B®VWp¤ß_/̓…‰y³âd©÷k~y–p9Xbh¶é¼ zŠÉn¨ jôaê÷»(|BŠp[Í3<£»>—©£YëY&‡Ë›Óƒ™µs‚ë§ßËêbs)2Û¬NŠ_h6 Ͷ;Ѩ §ˆt ‡RíÒRWPK_Ý ËÈ/’ØËÇ_L¥Rg‚‡ÿˆª#û°¢úSV°ØJ³\uIå»ùï–¦ˆáîÓ˜o©ÜõúÜgø6¡Ë\}Z3B1) ÅùŸ[RÒ):Oøà+á3Ål.×ÊØa¤ùé+Ü¿µñùÃ*ëÀ])Àj×2–Ÿ›Ð|%ó`9TÿŸg¶·4þôK:—Ð*ÁPº‰1Q3ȤœVîº!"!äBIT{“¤z5;g¸‚&ú ©ô˜£,Ηgìâß«ÊÿæJ1åŠ÷êîä së ö:žµ<¾¿‘Ñ"—å(HNÌ­³Æ8ªN|éÁÖ†¡¿%¶Ô~ÝKRÙY1bSÐy[u`ÊòtkbüšðšØÇûd)»¨»[rþxÎRXÆ€Ûü.¤¨š[±]E'w:¿ÿÐÁøž¦ t4 Œâ¯¢ÜH€6®`YHlAQÅX×$Eèu@PöÏ;®WB—9k"Ïx´,°5)–"‹ zDÂÑÍZÓ‡õ®{:š×|¼Þ~ÿþ.‡±W²Œ7³H™áýŽƒŽ8Ñ„iÓ¢ø@d­¿$#²oâáÙe¸z Ô‰EBªÞ¶I¦ Ñ•ßο“MTfHci;Lz·ÊfÆÒ”) ‘[•Š…¸¦wJ2==.Øba¤*ä’(|JÓH â‚å¥8E@\ò°tBH¯Q0q ð’QxÙ • i¾¼Ù‹ñcóSÞÕØ¡á½TpMÓ /€NPö㨉þÕºzlÐ{ÏKŽ`TI>÷i†k`•c„ !ð”¯cÛ­¡Réx1Bhì{¤ú¤IÓ¸IO¤‹õ&™ÈEKF,·"9 %çH͸|¶+Ÿ*‚O@E^hTŸ–·WgЬË7úzS™Žî”+м­·Í’Zÿ.Ù,Óö‡ÖëÛåâѯ•4=‚ÃZ.:ÄòR †ÐFQÙÃf¤‹¬! íM $3”ê¿läø‡3sGȪÚñlr"wµ\ øàÈá¦äQ諾A®„T’–ã,—g¡èx;#¬óO7êfru©…ŠÒêÎÿ˜»çs”Fµ8AÿêüÝW邞,÷)^°$4Y®|üFxÅVtR&Ç…-ÙÞXÖân ûû L{Á „Uå?¥㮠¤ž?"Cö´•ž6÷ÛÂýä.mÀ2jðö Ùçzd‘f"½"í5t0wHÊç èŒf ÃÚ¥‹Õ6Ž5O‚±F™w5ß=¥®AäIQ'W¬ÉˆË­;¤¢Ëê‡uã„À’Ãj@‰¼Ž)9;l7]ç‰ypÕŠöIÐô³P¡–¿qÈ@ñÀcäšX7öBÇ5 ƒó&·1vMÙ,+ëÏžün—#Ù£Ûmi@Ö’Ð'¦¿fÝ=óÙLB‡õ¿3µ‘ºÏ¹Âr7Ü@D ¶É«QŠ«Ñ´¥A·”i$nQw€µ˜ß mÙ(ˆm7æ%¦«¿%cßFîþðí/y’¨KMFæœÅTÀÂY®Y³À ûÒ˜cò3é(Ü´¾…ζ€è•+3½Æ6PŒ™þôEÒ0¿\,.¤Zêòr›uÖÿQ³¦Ã˜£%É…MÖêe†ïŒÅè—¾xß;®BäÓP ©–ãf)Óuè¯~ÓDû¥ZX`›¿låmç‹dû\çŽÉûbqìçÍ|¿â¼ˆÃ{Œ¥øz \rU9Ö„©£¾Â³âG欮\ʇY9pLÒÁÆG Í'Ÿº‹°’Üdåˆ1“Aƒz §gÌqÜ÷Þ³FÈÒŽ1žL«8Â;­ä°ÌKù”‹ËgâŒ÷bªz=#Ö[¼‚‡}ft«Ÿè©›?#%ýOˆÂß?Ö&l²žè"8Ö{×]ØaÛ?àE'C«÷•­ÍXß”¼ã.vy»Å¿a,ÜfÛöŒCì(ú2§8Ý™÷:ÿsóúÛB®¬‚õëeÙVˆº|…@¨N‘:’)r«úä’é4þûšùzÚÔ@’T>ÆA¿¦øá÷ Å¹ &LQ@Î_î7Í FÎÌTàõ{Þäû5€<¸˜Ç m½]¡({Ú3BÍó¯Æ@è•z±q5Í0¼}S¾‚ŸKÁ˜%wø¥‚à6NgêÕGeí#H!»¯!6òz0a™ÓThzts~âìißZµãĉ Û6&Éäý5î J` ¤³Ž™SR®œ–ÜO}ìCïdæ.ô…4KÞZÉÆPÛ‰MÛs¨É(]"LDBí:äZä!V(ç‡h©z½Ë7’ê,rÕ\¢:pï¹ ûÖð‡£é‚l[I‹}PúøàÄaÍ-_k‚gžj#iÌ» HÓzíß–ŠOÄ÷&Ö‹¢ÝÎ[Á‡rRlù³uún¹€Îq|öñâ–ÿz ï¶v(ÿ-1Ö,ñÔb½"[ÅÜF˜üÑþk)]`Œç¿=ú„¼Å íjV½,t[Ó©¬Và8é³ùQ$\‚ÑX&WÚv-ع³„H3 µ8ä:¨í8jCžåu¿ia SVáò‡. ™;^™Æ\Fµ¾¯ÛÍŠfÏ^ñÀß—„Έ€µVóYMêëÆ/ €àwx'N•>šßÕ‚ŸÌ^a1:#—gàr|õ´A©—Â:Û€w­·½$êÔ …0è`a! %@Èd˜4M™ÚŠÐ¯¸‡¥böƘ{!s;u§]ŠÖÙÀÓFøPÜ\A_ÇD¥º¶ñÛpþ“]]À–Þ;“ü„º.lìŸH r‡Èl܈»=`Q»¡ž¶ ¶ïU˜{ä¼VvåÁ¢P­Þ]ê·”4=ù;„»>Ó}GàÑÐ)Þ?Ü% c0uÁ¯ÜÅúÿ9ž`%jQÃߊ¸÷ãý ì .pjâäjnÁ‚èÏš4¿ÆœÔš¥”[¤¨ÍÍð1Š8. Ñ(u)VsûuúôYgÄl€X0»`b¿ü­ÝžOr’ã>UÕzõ~ò5RýÁíPÔ ;¸ò¯~û{ÇÇæƒ r~&)ž…¯l…¦Ê«\Ü‚‚”ïædô_õŒä⇮SÔ9I Ö‘rÖ8›õïéÈ Ç㯯ó»XA´Ê1ž® Í`­lûS‰‚ …ÈÃê•™_—.ɳÉ^Âç`ëÒÇ[2LgÝæÃ¦ß R˜Û¤f-};¿Ô’rF"zãö ]]íªà‰ökžƒÞô—T{³GYÿcc¿A" U8 ȉüÅ÷‹3TÜØId¾³½ lžÌºl+Ý­RŸU3}ÆvuñÜ¥W«âC4ÐŒ ,~/ \ ­×»q½éç69ºg¦,¨¯ÍÔÜà,Ù&ŒÈçZúö«ÛœÝrI7t·¼_iw×AŽªŒIÒãâNFÒ¨?£+ƒýc·*Ï""&Å:ÜØ29­%£nÛò)%Ž Ž 5A¬ kØÞã<‚î%Òä£/²Ÿ´"Ã#žÑqÉp“á®ãB)…V"̌ҟíHOŒ™./­6{àWÿÝŒrnaiÖ¬sݨ'ÑhW‚‰qîÏõ¾ƒ gŸH7aòKmµ–eÀìQêëãåNÄ ‚æ¸ywO°‡ñ䀂_Á÷áÛ¡¿‚e'¿®R‘„(üüÔ6F΃òu6ð¿óN-ÚeÇ^«ý Œ yö‚wÏ¡okdãÞ=\Q…óW«zô ÉÕ= Ø”Cqš‹_‡sÙ`†h§Äö½Š5¦Zo›bH}ô!ðh¦ ¢ x¿ÙM)ïÙ”³èM ®Y?„«&àL/iY‹º‰Úú³ñ»7¢g >Í,¡÷ÓŽtiU ¤snéÈ%"óÁW´Ue—6F|?–š8J&a3gý°àùî »†£2˜AD©é5ìØúݳÏCã÷­^»&ïëÃÎaFlæ±G}X ¾½ˆëcù"ô´„;]­íïΜ”=x…CqB}dû/‡âàâ/C~‡wh!?ß«enðp¤ó©ðó>u$‘›‘H¢½°rJËNFœ^Q_EàXç !¡ÂÜEp”!ÝÀ½Œ?LŒHÎQ¶ߤ4A~kÝu)Èi‡,¿ßÇÖ_ˆ¤G+NÜh=Ûâ†M7èÌtû”_h¯¦|’C9ò=¸!³•@Ÿ©•ûÃÿ•$’Ë·\wüõGh¡Ã`k±ÿ—]ìôëÈ¯Šš"‘·nŽB?r¸ý ð÷¥&}$†EÄ7rvE³ w*ÄOÓ¤2Ò¶¸d+å¡âßÐsiß&\}¨¿H2ûX•úXÆjÔ¹%%¤„M}ñ[*zL·n‹´Š¶=¸_zHÞ¯~ ‡Ëíc¥YâÅ$ÌTõ• £Ô'ž:Á&hâmç¡ÞSÍÜOI„ÞžpxD>}|ä:5éì)«-™3̉¶µ˜H‚E´átavÕ¯WGCzGIéˆL¹¡$%(à¹\ÙŽ×â“nä´iã¹0¥Õ«'Áµþ0 õÄ;Þ—6o*”‡!p;„ý,>pN;ÖÝAA€üíÝÙU˜d:›eÍ‹ÇAAÆØÚŽpÝ›ÂÅ)ƱêAß‹B¥0ºÍ»Ì¨ò+Tõׇ& ‰Éf7gž¨ c• ¶vXn[A…+±\¼_*þþm|kŽF€P~Cm‘â`ê­Ÿ]sÎK’ŒæËößÅtoVê ¶@`Z~nò1ôªU˜ª'GNlʃŽ#6Õw§äÃÎ4 ýôêªè‡AÓOÆ»‰¾î˜Á¡‘©57ŸFÃÙuâBø\Q~GªiQ´Ù³ßŸ"ÃW .Êý’<¦#BÁ6í>î,þŒÈœVñMq“½â{ùXtÃ$y‰³~¶SZ‹‰M›Û? 8 +èiZô¸X­U+õ¨Ù;è…+Ë;tíÓÄ74÷ëj˜b3èwiR ß³$ûGÍÇäYÛé'±4qtŠûsXÓEû°—&eØ×ÏõÈ÷*M·–E&^ .°ù핸wø wUßÍE©áAãŸzäÔ&±Ü#£ŸŽA^Ùv@ñ²Œ:¥Žžîýzb\¶°/7ÂWBðzëš8º:…, >ê÷Œ ?‡>¶ôi}îqÝüMê•P<gΑä£ÿ*[6 f7}aB~Urÿ£š›l“ȱ¨Œ Á÷ð>H·B‘Y IÄûâ(ÿßRûùµZ¤+§0K³‡O.5ËA¼£ß F‹O˜M4­šH‰7RÌÉÑð.ò¥‚¨}–½5hNÆ-¬rwO(a°ÿ6_-}ãĩè{: h0Sf2݆2é»ÜFÝ¥‡,ê0Æ1¥ðH!"xXžŠÝ³1ñw ˆ¸Y§ñÀJþ¢%¿J͘°dÑ:}‹æ²«ödSÌ›(‚TçÞûf5±{ú'÷¤÷˜$X2®YäEõ+·J`«   ÚèÕµ øh<)w¡—_®c¡”*ÕfF‰:¬'J|J #ŠÃ›™W:?Âx\©çSP{—š¡+fïm÷–êcšIšAĵœïµ®\&Ÿˆ{!ñ“;íS!ÛáH–gõ#˜üàF$§8ã$¨Lñë( Ž*»Æêœy*VBò.I”¥ï ŸÜ÷Je}¾I> ôÿ4{ /)©OCœMÉûý‡ Ç9iJOB¾rËOÇôÙÆ*Ã^6œÕ©Ã¥¤¢¢›21ÔÇD‹¼Ñvfç¨!ÎXE$WËr¥ä±µøe–‰Eúªò] 9–s€wÊÅì· ÅÂîZN£qÈd ¢hs?Ø_==܇kAU†S’¥øÊýÕ~ð³™nŽÈg›mðéb°‚Ô7›Þ² ÆwVQÙ ×½c g’7™ÙÃ÷iœÂ]]›‚ûÀAOT]òPŸø é&ƒ½02.U_þãù’jIˆzN+y¢RþW%„וU)hÖ.Ó/E{ø½šášgÝÑØÿ.¶¼DöÄ¿¢+Z “ÉröZ8áæùòr~”ðÕRû$µãJÆëh½šÌЧáÙÊÆ¤å&m¹ÝVêßl$Tç†ùöHß¹e- ³‚O!ÖVûÒvæ°†‚È—ý´~ð„"|w§FDbŒƒœ /¤hþäkùv°ó®¤rÖª “t¢Õ‚VMe£ é;¥G=b´ƒ)9К²ê$9š€úæ¶ÔÑnjպ¬/¬A\'3]o¾œíÐPÜ_ä¤[´F¹Ê<Õ;å¢êîÏ’4PŽfoŸêϸ}R©`ìa Cx¡à'½`ç1¬Kn+1Σ¸BÈrš±mÝ¢Ö§+$E9@Vr³¦Ž0ÉÄ!†’‘z#¯W¥Q£žÄq6ñMpxŠõ§Ž[„3,{þE :H66ù˜ñ }µ¬}¥à-®Q©G¹åbÈ™"ák4¢j Xýï¹7k’õ`–‰*~4¡Msâ)U6>0æG’í½Ï] ]ˆIѵ§è–OÚlž³ëXbr–ètÌ:}-»ÏÅ@Æðüµ[šN+½¶éûozÍdBY±VW²½™ðÏj]ž0rU·•û·I¿m¬xõÎ\×ýyÓ·àó¯L °UüÑC^irþZßîæþOÞ'çRMCªeöy¿Ò_†9_ü^ETƒE[Õ¸çÎGêñŸ0 —ù°@:Æ©žO½ž„HUFë)g™s ‚‡Mð,ÆÄ(¤ô0 Çÿ;Š f•î` n¾£x4éÛ·‚AæƒÂÙ+áÏÑEEM*~` ;–Fåø'–Zã‘oý¦Ìb²ŒMØÀ¼÷imÝ‚EÔù‹ƪ¸J‰%Hx>^JòN$(m<(blXš€,APQò¼Ûݨy¿‘xúß/b™4ª”-}¯¿ØQσò'ó•%ÞE|ŒZwÕkyÜ*¢»x½ŽZƒ,QkÿóåŹõDò ˆ>Ê)€ì.úT¹´„'0<2ž1 ?¼,¡›, ¤D'ï*ý¡ÕV…mÐ’Hˆ=¸±` *ôU"z$Ã#þ(ø^'PSî`¢[vÇáÕÆ$‹„Î=Ñ mÈX9m­íS!ÃÙg£á@ñ£³ßuÈE¾ÑÙÔ¸Ïl¼VPófb~-Û*¿®Dd(þoû@UÿønËJíMÛØ+ĺ-M8›éÍš¿­›bŒ#£Ü§Õ"v—øêOæm/à„àË´ùT‘½ø«ÊQ`{"#Oâ€ö††ÈÓ/<ÝÐÖ4!ÇÇ Wlý±Fxx  ^SXû;ˆmkƒóûkûRTÔäs¥›÷£ìÏœgDƒ• Üßçþ%( W¼ËRA¥T W¸E›tÈZ²ß¯Ëã— ØnâêÓ‹ý-–ÛXäÕD ·;SHSaÝXÁ>ñq|)Þ@ˆ6Nâ'ö95cÚçÏ£~ÆÒÀþv9 MÔf×BÂ÷ùïÓ /ÞMðWIïäJ¿WNI²çH€ÌŒƒ>À,±úì ”š{¯˜lñÌž¼UìþÆ1¡RŒ$gc€õð'Îà(”a[§ÙÛhÓ0ÄTÿ.©pqS¸ŒÛÞ@…ߺ•nG9( «î5‚$ÊnšçˆÝ1M NÎ:ÓÄÈEˆ;~0eòXmBã_×„Þ AMF'›ÔÔ‹*¹NÝ k޶ãÅa)Ó<ÝÔÔ€‚h•š§©›^ФÈ| ¹ëщæ2ÛVŸEQë?ŒCn—€«Ü•&q I¾¶¸1ï+>±„¦¾]s:àk‘ý2¡æÖ äç<|„<>7ØqÂï ŒOÈ^G&¢HÇ{êŠ#´-Òã,ÌÃRD1—X„í_#ލ.ˆe\ê™@\†Œ Àý¯ÝÔ -ºaÞ ”‡ï¡äÌ“Wµ=“Yî´"¢&Âeòä&GIc6#Ú…³+QcüA"§É@‚ŒUë¥=4d¦Ø% ‚ÄCUÇûõ 9s¼sZ·©ãžÌ“¤ºÿwÃ@oXeÎCB~ë« ß³ŒÆ)u.Öm$ý÷U)·9lûúÿšë«ZðÚÒ~÷*‰!‚ú_…ĵƒÝ…æ׎nþ L~x‚!ïÎ#EÃöX§‡ )éÆ+³Ø3©H¤Bž¨B‡ÕÔ5øPõ^%®b¸R„Ü4¥@ûN k®ÑWÓ.«•_ÛËðp©GlôyI•µ[îg' î(:z‚ü÷»w$Ð¥bŠç8ôQ¡5.RM Bo¹’ó‹<¾-_ñ@ýÄ—Ó.¬ „‰99ÕÁ¥Kd´ÀZœÿá7‘Èð—1Iàóq˜–]³#ñ Šö•‰AíùÔÃì¤uÀ“?a¾õŽÖâ‡þ¹kKPwQêϱ„Z÷ Fm}ÕÊFO’`•&‘I±Ø›Ã0 fŸP 0£A·Û.ùù;%{‡A,‰bsܱŸ/lh|`z©Qä­Õ)NÚ’“†nôÂBL‰Qï’þ!Q¨;7ÉVÆì³—œØ#wÝʬ¶ø´˜b8T‡Í&CÖ»ãso†ªP ?î I…ޕĆ÷†±“Ç#ÑŠëõE4‹nTÍ9©‹.ÅAP¯)*àØ§î*V î1QÎçæîùÄG’3¶±„fuq˜á9”áÁ“YŽ~Ïf‘ÿ!ê¦ì#v°R38SÛç(ý=ìì{O Uç…*eª ¶ÕBE{fY8¨ÔZ°†ûZ»ÐçY‹ÆYÝ&6(bö®-ù¡W6Ї¦õÑÿ‘Ô„ÊÀЙFíÀãoåÉÚÕ›[ÈR?Hƒ´^ŸŸ;2Ù+ë{H.ªdtož]§Î­{#»7.û„xK‹æaŸhá…YájØH‹}؈¢1Ý;Œð˜G´m[7D-1pé%;ôf5(‘¡vFÂë£ }^ò2Û §±Î'L(x#¸`Àou–ØÝîÊf@ÝüörÉeÑ™¨gËäꘕHQj.M¥.T G*³94ÇÊp\õ3àI¹ +‹kÙ¹Fïjs¤‘[Mdñ¤±æ40C§™#è@¼WØ8ô¼y‚w ›ç‹¸ˆÜ-á9€g±ˆÞ.k,Yý"¥€,ÞDtt÷'–ª†€¹Œ³,e5…nå,zd‰ÿˆv²-˜Îù2*Œ°(±V åev“lÕwÓ†­Ø{Vb×1IWZ4{ü›Í–öF)äÀÅÏ›aRMz{âkIˆì¼Ád)à a|¯ˆÎ)²›,JܤÁZœ(eB¥>u>ÀèˆkÁv÷¬) ¦läÍê´k"ßÉØêÃ!&I–¯Üq(ë2ýHyË{·¸ï·Ã³¼¥Í‚õ"u:uÛõ©Qù‹zÞ±ÛS$”~$KsgJ­²9pwY¨WÇ¡*°”}+‰ðP!;†WyÁ¤<>±Ù…Òª<—ßa§pŸÔ‡s˜–Ì‘Õfôíà´š§¥ñ;“I}É™­qÖËr{Ø!Xe?O*é$Ò‹xñ¡‘œ‰UÍ˲nçXÙ®‚|ökCˆÕåu[ä{ 3›¥âPx+ÓZIÃñK›]*Ú\G¨wúG {݈”o6ÕëÁÓ`ú/[9O‘édÖ–òM솰¡à{ot¼ÓìÄq|‚Ä G34 &÷àØð[(~ Ñ#T ÀñZg|ëMdD A3òqª·m5$„p÷ŽÐ“w÷'Ï»!g[~á§>'I©|t™ÏØ‹¥v‚&bçÄ_ŽÀÕ"È奇<ò°êùÛo[ã3éÚmÊöÛh(b“¦“)v½²H9t¬+ ƒÇHÀ•ïílózIPƒlVk€ö6¼7‰oòÞøNôŽõÚó%+³ŽYiرP¬W—í¶­˜ë Srß»ï~Ú¶n¡M(Vs÷4aÆÍªÖ ŠáË+·U—€n¦dŠ:T&±Ù{ŠçéHämØÝF:°û?—ËM ênŸâ|awë{ã¥9Ä£J°WT+ð´úúç0Æc])tÿkÉ$º/ÖÛ‘ìךŸÆ$ÌSLlwV¶qpÒ@ÅVÑ ‡Puàダ…È¡ïnÓÈÞ¡Y¸Z+ŽÏ³Iër,¬Âi9¹ûÅP3•mdM˜xF#rdN$FÚôàVšíað§35¼IFwå>ÝT»SHåÊÙWýADJMqd’\=œ°æSÌf‘Ýù´­y<—ݼ´/#礷—hÃî£Ï©¤z÷îþkË©¼r-)eùˆÂ CxÖÈîÊö†A'¢5¯dt²Îc¯g¾ÉÕaÞ(Yܲ:;½èMr5/›,ð87”ºý©ï…ø7~«±YÖa`eý•)¢8—Y¡²¤bÖõõë›ïˆBnP°‰Nø; °º¨„öi $ý3šCø—ì)Ö¼#[(«^¬¾]^èíxJ/‰‘OrfZ0©“AÊ•cl-lpÀW™RªW:­„ònC¶äQò6U+÷“ç Ž*}#WéÃ\D\à³æ$"iâ7/”ÇÿÑkKÞñÕF òQæV£“„øÄvͺ(ªÃ6Ž+É×ÿÖ +D@磖$¿ÐmW㛊M-eäø^‡‘PDµÕô˜í,Àg±o×ýÙi®GcU¢š@†5Z$´œ6R¢"äí²WÕ0²Èã·²a*†ÌÂHkî¢7pÉA4ÂÈʸ~ ¹lÊh|Ïs­C]Ïˆßæ2çAD⡜óT¼cƒ*ÎdÔ×;€–‚9åãB>îò­éLÄv‡Hõ’Îëáö‚ÄFî=m$X ¿{#jÄš½(_ ñbÁMò´ÿz¾!ê ´R¾úa‚Ýó/·r'[ƒÿ/¯–ø¦TòüÅ(¤-Ág>‘ঢJÁ¥aΩ‘Á|òaíæHK¼¾_—žö€ZÁ’ÑLÙе.ÑãHi¼”MÔØVõ~=åe §‹Å ú¬ÆïСf†A¯ÜAJÄuxñqÞOµv˜!žŸÎ¹ËÁ½ãºu¢Ü|ý_ÿþóR™¶¥9ê[02ÃÓ”Ÿ~7 ú­4ðÐmU©æTôq±SH¹¾éð›ün»L´HIò¬¼†þóØBÞ´+~(ût  ¸š]Ü ÚO@ÍSÜŠnµËWšul zü³/Þ¹Ž@êP%]9E¿ægÆ4E³/ º¢"»>ê;zËIÁ@r…bCîÕEû`*»ÔÁk.ñø<ó¤'ÂhaŒ‹n'Ub˜I徆¥uv˜ˆsu¸ò%ƒ2„늪[á4– Õ‹éE2ýàëÀþ¶‘_<_Çq% Q•—[¡ßÕ%îºÿìã=ƒ cþÿíÕ-©DÑ1²·Õ<ÞäØd’W¨ £“Hí9ÈnN5éQ£ì ÑÿI•§Rªw:9£}¹Ðø¨TêËçàÂÓ èþuyUÓ>êæþ%R‹emÞåÜXHñ{0bÔI˜  uX ¹›mŽLßÕg}k‰Ž5vNõ»r\4q$VÛôŒveœÜ“´ƒèÜ—Ÿ ï§S±#çÄÅ” ]#×ç6;ʼn§ Ë–wl@87ç; Ôw JðSpTmÔûI./ú—+ q¡hÓOä,x‡ªIjiD§…‚¥aûWø‹U,ûÚé'p´Ö ÒF(²ïwô+Žf(³]ß$€ß¾î†•-ÿût¿†{m²Ö&þÿø>4A†;rý@8¥Q ÜÅ鸈ýC†íƒpKªl†S̵r[›!šˆX!%3á9 ˆŠúe­eЙâÏßùc˜4!]p-ïKÏù ñ‡éµ%C7äiÄâÄR~C…ÓŠ‡$Ìü¿Œ¢›j-Šo²fJBβá ]Ȼà â‹j€âûpBð²ŸÇYI—þâp Ú.ŽÖ„ij*ŒGØè­HöwÈ·òúòœ¤i=È,ÅÍ:ÊÛ3 Ø­@ޏÈZŠâqÍ8œk­|´ÎtSfõS«í‘ÕYƒ(65_O.Í?¾>Oú²P_ƒËBé˜z7,ž@ØzfjOfåéÂÅ»± ©H¿ØÁN ùåy÷ÑÚ|§n–þ¹s39>“’ª»@ë]ïØ`ïBîb?›äDI-7Õ{®~‹ïþILû(ÔÎÍ£ñqÙµë¶8Å×A›ÔH"¤Û —Ýcèæ«5•Š× aœÁ§Ë†¡Ob. /XoP±C6xÀ7µ‹r$ªÌ ³Y Ix.ÁÅhMÜíô]#ˆ)8-{ª„½…Í·ÁiM¨tÿNÈZzÑ+ž:ÿåthËÅÉ%€£Â þ)ÅB†™ïè59~™ã4Õ;WW’«4쇟M}€õû°æ"´i]Å:3ÐøÝü= Þ fÔˆµ$ô3ûmÄeP›tžÀPJiêqºn7ÚhÁüZ€‘â¶«qç<ëËû¬êgÀ4>}bè0²ßËr€W$ØT:•ý˜Ì]cà¦úÿBcbÄËØ­0÷£UÓm/¼ëÖ…ØvìÎäX"È\²^ÆGc¦¥K#Ô±î5 þÑôßdë w×㎆ÙôÎH±y`EÓµ¢²ô[i.šÓàíx'h÷®h` ©¦þ•-a½´‹‹ÿcñŒl3 ›¯}Ç;Ïž6-?5 ¶ÿ=¥­(Ày-InïýEù}8_¦_úJk#ÍGX³lôµ™ï7GºÀ?º®é`ÝjÍjôôÃKÍãwoÌL#[»¬4÷ùê4í¡Âœ¨žu.ò£LÅò/lñ³ž*ÍÎUé†7™ÞÝúnZ†âGF˨?.¹/§7nÞÍŒÂ/5k/cçtŸŒvpÆnö0G ªÆÔN¹kR.³“œÚaX`{Õß_£ß Åné¤JòžŠÛ=[(Еۜˆ¯®9o BeÌÎÑK`õdäŠýø5Ÿ%^¥÷¯Ôö è2\0›ËnŠwÂ÷†Ù»Š#'›v—ŽÄçø7ŽA8 ì Õ­_г-.¼ŸDú4W-†#Å)ï`NY9ŸZ"$ù-¶Uµ¾W}Ùtg(k]ËH’Éû˜orHhÍ5YwOpv´*ò¸¹ùC*®õ­ hŽ;Xë@là ÷ofu,k×.t複6«úù(2e+³”Øïî*ÙH´’{ ÿ–0 ¼Áq܆+û©´â<î8Œ1)c Ôü®ï* –BY‘Xÿá–4œÝ²Õ<¯8éB€z«ÿä“GU­?üOÿÚO•–zFxÓøø]úk2Öi¹¤[âJÜ;Ç„ZÖ=¯¨ð´š¾`´Ô9÷ˆ“3®:P¤E„ƒ&ÌAXt”ë”FE&ÂaŸ•§¥jVðñ£êóÝL:ˆìiVÿ¬¿]±¬šÎPéì6ÇˆŽ­Ó¥•s;]PóœÓn’{I3¯wskr¶ÿF”2‰ @%àÉwrJpÏõZ8Ì<æ¯=­¾6XÞåŒþ–ÙiœòïR›&ÔÌÕ7.Cűð—Ö¶Q‚Ý”‡kAºâ(­¹@E]W÷]­Tù©áY–YÀsèn1@P/ëÐðI”À£ó«ö?¨ˆWä*¨o€V.'dC¾Ëö»¿›Ôh)IŸ5­‚Ð7d785áþs®¼£õñ/'惢íõ—ïcR³rÝy»k3@cù@Ó[¸ŽÃg›ÅùMÆÅx×[+š®¦ê ™„ÚŠ’]ÜŒ¦-úˆ]?åà ìѲT{€eòd?;:)לü7žæ?$iQfê—šŽ]F[Ù?}9DF¸ËÌp¹Žôel9Ù"á"¶?2í(ižØ{Xºf"äÅS†œ»YQ _gíTÆE‰óýi'ÂÂÜhøèÓxÄ—œ–!Ÿ38v²™|AL}(ký¾íÛ´nô³ˆŸ¿¯¢-½PŽ ï¥ÐV¹Éx¦Ýõ!zú åU!ëSù;—Ä(DN_Þ;¡ñO¥,‚‡?æ¼öŠD9‡DœÁ£ÂÞ˜òkÑ´ L*…Ë„P×|e¿'¸ÎDÂ8©\ÀwkGg™G/¯ò–Ù -\•ÿì‹i–®pÕQÐÑ£âQ×Å?Ô"‡ûeM‚s/fÈtò$K·ßUã™âÚ)²y‘‚ÈR ?LvöZ ì0Àw¾ÌE<#´¤°<ŽûÌöÿ׌°j|I so‡8­«o‚ËLåþ®N´[´Ü‹E¬ÉZ>ø¹9 ˆ/xÙ?jÜ4°”Kò;ͬ*Ä=«æúZÈ÷Kzw}á2 !«QÅ}Hé„ö‰Ö£¯×á_7Džß› ŸÑ$m ¥án‚š~ÃðþsÏMÞWÊw€0‰®hÉ‹«R›åˆwÙ%JfqHi‚ì­ßOü¶SC»8ÁwÎŒÇP}Çq^Þ"Ì缺jܾþ»˜õ§…&:QŒ g“²Å}oÕù˜.p(¥ô\ˆ’¼XÐHZ)@ŠG·°ŠêHnJ×Zލø\Vý·9¤>&ù›[E·^`%¦—ÌuÔBýÇÍæBÄz?gÚÓEx -œðÛFä_ÌxªÿêÀiá"¾í. ‹ÉAoµ¥Åz¸O›8šÆ}èŠj«;â$!)Ð*uê L,F¶½ÃŸn ías8á}PECb4ãI³õWòyYB†V5¯ØÜj›ñ‰vt]H©md ]¯0@ª•p䃄±UÞJJ&ùlRµÑ5“*õoÒ6‰žŒÍ¦ã÷dFd ÍQf­#ú#ûž.©Ë“Êecò‡y¨5êu/〳 èn±Ãy'ˆ7ípß=¼‚Nþ|×û²åÞÌŸ³¡3Ó²Q'Œîg+±À¯ ‰†œ¦ hau¯ÚWæÛ¸5¢5¸ÊÉÞ{AU­çÛ»B%c­M’€Uïß|ÝrCÏšî¼W·›:±^ó)6‹iëÌXj¬i Œòg‘ÚsÀr4 Ú¼Áš/ß½$ðÇî,õtY|Lð2Åë}—Öl­¡u PS"YÖ‘_…6’~Š¡žœ™ÊWaq*Z6ùœ{#cNê¥Ì.ƒ›@ Ÿtð×¹v`~(S¥ZH¶ ¾ÙK´Å¥õàÓ^è'}[ÃØ/Î-¹^U*J2Öé³2iÚ!.>ê>›› 8MGÝnWŽïÞÉ‘`¸Èwd°ˆÄ-#Râ0¾ÊP·BáwŒRšWôb‘.†ív1 5k G¯æÙ» l ¤Œ-ÇÓ;4 `ÂfàË êÊP½¹pQøÞÓI*ý¹Da€cÜøãeëž5¿ô‹=ö¬`±H¢7YC*·-]ꓪvµ¹¼ß!×ø¾WË_Y…bêZbµ¡ñ÷/“Žäö¾­ãÏœpX˜ ô*Æ-Úä¯ÎLZ}%A8ŽˆÀ¤™£Øá¯Uï“ñA ?Ó2‚º¾*ÎÙ%ÿƒe#,ÀÞ¬ÀŒˆÜ­(Y.úY»·y¿‹Ø{®ºÈÛ¤(êèíubï©á‰_vè‰F8A;Ó¤ =²Ž±ˆúíæ¼%ª–àkq0?öÀÊjâ_—€›~nx«“æ‚ZÕZî]yR98B^Ïo]Ë ä)6™å/ÈY£+íôƒ’|Ÿ"âYe×\Q:F@ä¡â‚¾njǽì;Ë@D@Öҵ2§Ùsü7€óô<á×z ÝeŒ—DRéx® WAÓÎsFq zË©DRV›¹ûx"<[Q…„Ûìòž$ÍwÁ§ 8š@—ÝB° Wuú~¾±‚Wø1n]ú»ˆi*ÇÊʽnÄ‚$L L8¬0‚†zEºC ZœBgÝS'!àü¥˜ '1©ZÍÜ3éI‹µ îV7/M cf2ÄØöï›áLìÎðÙª:©†è€ÅíB ß÷w–&R¬‹§}CPÀ÷i¬ÆrÝ’Üs¦| iÐÏuÑøNCl´M¥:ôK÷õSŽ NÏ·ØáS®héAòiÆ´í-3oî-,Ü\Çô~žÐ‡W!¸Ðšù=­œý@ö«e7gÀÑÁ×AdÚºÎ:=å)í÷¯§„u~H¿ç¬°–·–HeaÂÅ””5ÚT5 ‚õä¨F÷¬È²2¥Ëˆ©9\=)ÛŽñåä^Z{½…ŠÒ:Ø`­"4ËFŒmRäüÏTËÈç%ÖÇKdt|žêc9üä@×?ƒÍ8>£)Eó¿YþmOÑÒG}1ø¢É$*Î׉¹¸(D—‰¾t±úbDMþ²Ú”­ˆ¼r+©Kµæ½åM_ Á bˆ°)í_TŸÂ˜ñM1 –™>†À’–vVÂGmfp66×N=‰„&•iâ XKWIr/>uIgëY2n×; QÓ¸DDù§a|f8 ^I”~Jù˜ò†f³ÒykëÌYY3ðJq&vFÅ/°?˜@ƒaëìÆ\úA˜û*’©3ÿº .w_ºdèèY.m‡Cžr<äÅ£[C™  /×¢•/²À«e€Â‰þ[â„»ñ!F<ïCN 6£Õ[:?ÛŸp+›qW*ÀBN >ÊW†¸µ}(r¸ê[±héqñÛÑ“#-1ÆîŠþƒµ˜25j¹Çmʱ ³é60üjòrû¹‰& WiÀ[ ߸ë&FéQ¶;”ãéŒX2®¼­ß]§~Dhbsê?FV–¹®·;â&\jìp\ѬšH¾^¦ÌÍëa{¾RÿØäcú\˜ÃITRP.2ó*ªs¦Ð÷wFgTvP,?}Óßjžòœ”“ºû»¼'ª*å‚¿—ÙÎI£[OeÔ:½0ÐyHåO8yÉ©$»Ú(P»*±ªc°úEòàL vv²Ó †ßÙ¾jtdj8I-iVè>·Úü¾…ÀUdXOTÂkÏ< øœo3xrq,QF zQ y¶a^àJ£Õ¿’_©/ù•qt,1ÖS×À f¤ -;›ß·«ñ}r¢2t¨l ”!ÀÁhÇhu›'£¬Þž#çþ¬€–ç-C8€>Ä´v²y çÈS,ß©kž‡òâuàc‹–`§9ýÓ’XÐÎz\;ÜÈ›]*ÆŠäVq­_¿9âZÔ„/C͸O3´Ölª"pÕÈy„?ùRJÖêœ7ëð~ó¼s€°†ÃÇR‘(8 (úMñz ÞcOŒhÃ6"IÛ ÒÕ/Æ•)}FZ˜q$†DʼnÈ^ü… ωšÿ)¡8½Öoà¿nÜzIB‡µÕLþyà™äHEHѶd–G& QvŸt;&OR¿¥ßÙ@Õ ]" T ý>Íõ˜òÉÜP1CÚ%ˆ­=šNÚI–~®°«q‡õ4´í5ÄRÜ[Ñåà˜tC‘í–•x^ï;&[na}ìüz¸³œÅI,ûd˜YA/)zS¼ž8µ®ÏøÆóøíå-(¯Œ®¸^ï„Uù10¦lr†§èÛÛ¸‹Tœøa+Õ:Ë”8ÞºsHr…D"Òàë,ضBÿ®xßÝ%Ú½&-¯ ñ¥¿x³‹ˆùéþð|{‘O¨Ÿ’2EÏñ0GP 0Q¥câ ¶‹ðšNÜŠÑõ~lÌKÅ{0 çßÔ@û¦\§ÇUÖίÏÝâË= =uŒÆ„L„êÙ{1ä=L›El±ð¿ d‘»}6|U ÎfÃŽ´Ë·­¼l!Ì63xõ%#ÿ.@–˘„ Ù)= ‹•RI»G… …Že~ÄÝ÷ƒê¿Ò.nîöòÉPØÓ2/üuƒ cð°}±*„Ÿömt¶b$“éÜMy ëð~\¶þ»b—§%Áˆ6r‹Ca­;­€ÕRJQ0k&2MÊÒïFhs EˆñVÖßêÕŒ'žôEèÖ×Gv÷â OÉܳ «°‡0RTM·&×–«5ú5dÈ5 ŸRÈ­}Ñ n-¤q„Ø'e0üVOùÖ£1{›&„¹((9ý{ïÌnhŠWxG·â¹»Di+À}oÁÌÕ6‚ûFÞSh” wÐ3¦t©°ý›õÿÍùUÝI£›Ö{²&Ä"¾©Ï‰Õ‹“”\½Ö¼­¹ª÷!f•Õór®o³ûêbÍ ÎõD¾œ/6o2"Ýú–Ѻ©i·˜›¬Íé’tÅ+ûÛŸ9åÐ(°i¯~;ƒbÚX5ù5ÿ¬ÜIju¨–X{âgüéΊDàkìï” N¼Pzð¥Å>¸ ɽÞaó’Ø!P![Ü\Ì@ÝVÀ£†Ê[¢ÕÜ„TÕßÅnæiífTñÍãTÎC§â$•jšŸÉõ$´=죺3wsUüãKy–}†uH溩¯H¬ü²K?6ñï>)'u<R+þ)7ß1÷Õ,!å ÏòüúÓ‹ŠàQ}(ïA‰CøvrŽ=Oo™¤pšN ÿåD‹kå+$y¨¨ø±WžYOÔ<„Óà‚Ê^£ï@j JX¨íËc=JýÕfã5jUÔæ_èúø×ô{ Í Õk˜1ñ W1æø»ÒÝðOÄš½òìkOIñ’ù, [ï>h¼Ü7*¡a€„ "ü¹±Ÿì ´f£p,ÉžÇÔ§fº²$ÝTa >÷ ÎsA‘Êïñ<2Ôéòp¨ÿ¡Ã‘÷0ˆÎ|<*²”ôSFóŽn¥A/‹ãdÂw·_7õ ´\K5“ f‡uº¾>EA¨~(~@ÂAÛ‰6¿™åQHZô_{R⡃ÉFH/°¦¯çí²²H¹ ®îfSvì×Â`SøM¤l~ÝS(‚ß{&><Ú"s •<Ú4H ú™q•ãœqˆnë:ÔÍg«D uÛFɈE¹îËY~5¢vµfzï©–€RZ^†¸_Õó¥ZÓ³ Wãö6Jò$èîÅ­V|jòÉò#ÙþöEKž9þ.œ!:Gcæ®8Òž\H!^YéÓ—ƒûæÁ/Ø–«Ó¦ºÿó`êFùb¿8û A»§e¶l0M~›Þ¿kÀ!ŸÍ>"Æâá|LA±oO"ýr>g„ñ+ÐMÒH(œÒ‹]•À0¬ç#ûœrF'Ò¸<«»Òe'‚-ýõw|?¾?êùâ‚«l9?éă$°N„±ouÝòçÎ`ò£`8h!™§Àlc Tº ­?…úfýÛ¹}úCÛDãHƒÙR1˜¹ó *¾s@ á;;‘b4aŠH‹›#‹,²Sq“Oê=ÃÍö -æåÍü÷ÝÄêž²§r‰ÂYÍ›f$ô¬ØÇ,¤¼¾ŸmÑrã×h`Y#:€Ñ%n|î$K;ȃ®m3Ý]Ò,¯¨7qÏýßÔkuÀzA¹ð3H4?Øä'Ò>é¨ÝLjV| ÙQ­ºN»É.B`Œ¢[ʧ븮ֹmÁaö*sL®üÜl\:²»|û[nšÈ™”åÍ,Q¾BÜOƬ+7S1J"z?x¡(ƒ ²Òk¼ÔØ [å«´î2=޳R£äè3€?ýü­Òæ2ÉÑÃöƒ3Õ* J5ѼO4Ú­ÁÜÙ¡dúŽïŸÚ6/1HMnÁå–Ý(·ŽòƒúÛoÈ:qžãÜ`è:5  èx‹-µ~VÅ ]ÑtkVLÞí×ß!7·í( XÝ_ð#­­b–Ë$“c%¼ó™¥Â¶;ñ4Égƒçr™ný’B£˜¼v=Â×DÄ”oäUભQS“JÝ’±†(n_V¾]Ñ©V›œŠü^¦¼‰È0«_:h|tM·?ø¦Bn ›k¾„ÇŸY ÚãöáRó0&t&q–_ÿáT) y;Ó¹9C_LRî¦ïÆ=ðì‡'ôîßr":ô\Ÿ~qcŠ4Ú5~@à C]3;é£à C¼–ü+ÕÓÎ#³ˆ³pˆgܦ®Ã;ÔO?-)c6 6Æ1(Ì`¿¿_ÞÏívG!=’¬FîätE;·i=†»ƒsµWÖ•œe'ØöMŸF|C4-hVQq€Ÿ~¸eÈ—½m~8M" -.Œ‹hìi%lE×xx³/˜Êˆ‹“4[¡×õK…‰œ„a< Ý>ô’‹ ‡R¾Ê¤p“Õö:½'ôŠØ%'.ÚˆÉÔŸ¦T8›ßî:›î[ÝÉØrc7õìêvd\=¸œj¤’Á,t£ŒR|§nò ¯ý)“q½§ŒU%·Èp//醇Xy‰dˆ.u$¯/†jU¬ÙO£ã«‰/úôÂü±´4åÏó,Ãý. Lù)[ƒ¤…{Â!æ-[ v½bÅiD_Aâ”ÅR%xÑí·Ù²ë“^‚žÎoRÛþ¬ý‘Žè‹Zæ¤vo£ÎÝ_Ù탺Ùlˆ̇tv…%çÓßLO]ò;,ZóÇéó¢ûåú`¯ò:Õ¯€ØV¯=ø°¥öSщŶٳgÁÎ3@‘ÂLUWµÒnJµ.ü¸‚[§u Éö(ëòßh÷G+ÿnPgýL›ÇÚý\°}(NòyÇ;÷Cñ“œq×EŒt)3kûÛ{¶à•ÕmDOãoCG#±÷ÿý†=Û¢V¬Cb[™\ùÇèK6sV2¦´{æÈg%²›ª/¡Áª’àuÍò¼O•Õ¾ó¯,k‚%=j×iAìËÉGö+(e€†W8  k©ùaQ²úYš^  1îÉ%õÎný&ÈÝUOÆFÌ2Àí¤¹XìvìfRvy¨¸Pìøs1óv(•ÚZqwÜóŒù†z±–ù“ÀÆPa†¡ÿï@1áIpU.=p}÷MÁÁüyô%MZ†;åõ3aR½¾c ¢2y¹ÕÉËɼSÜúI5„·8¥®BO|Õ#óq] qºMJðeQ¬e¹q8г@½Ð¬[Lâ¼Ög™®ÚìðÙ@#­@Æ9õróÿÿi2J%MYŸõ”¿ŠA"i …´6äW·“3P‰•QÓ6/­Ož·ò…” m êZ—þÓ–¼È>Ä#ý=§© ä£×÷œË¶Íù·Ü„fÍj)Йm?ëÍ2:l˜‰e„£‘­•%ü+4ô8À«=tlñÔ’ òL¤À“?4qÉ_०W|ÚHœ’«çÜÉsê<ÚX&P:Ž‚aï9ëê¶ †o?ÜÐ)` ÈØ(¨½A”’ýœÚì"Äž¨â!0–nÂl_£¡ò_4b߬ÔCô³š §F¿d…„õÒçˆo[Ymz û/Ddm~w(c!̬;¡™"UÇÿ¤G<}äé·©/²%Î|—V°íÝ'˜EÅR$ÕÄ1ËÚFÆÝð6¹¾IgAy@:ÌyàH?>$ò¢‚͵ËoøÞ•ÛКÁ‰“CŸ4*í¯.ê…ƒ"¹ÂoµàP+<€+oÑ›R¥f먎û†<œõ*~þ³9~cˆ W‡jÅ_¹mÌè N]!ò¡k»…kí·@.±É8ÌÏ©ÓjÞ•?WÃØ'›;fºZ ’—°ʧ&œzëFÔî\”Í$šbF^¶»õz#ºH hÁ7òr??Ú¥—VÊWIÏ”:MB0Øù´sœÛ~òô }ˆ0>ذ5ÛËü^ªp8Ñß¼*Æù4ÚŠçú²ÄߤÊüQÉ#Õmº¢­òíÕs“cÑ4´~âÜ{¿œ¨ËQ¿x-DçÓº * ½þ[’¾³òµÆ! 9_'ŠRÀ8¨‘ŒÆ ‘o°ŸHs¡-}ò\qT L"L|;s]ÉÎe…ܶ;ä÷ºY¢½ûû,ióÞ¼G¿ú1Qý$¹ë<£GH’ÀT'ˆùl2=¸âã5 <$ñsú¯½”Iéy¢o>h›Ò«­‹× ÒU<ûV©UF‡"A­³ýb^Ø£ @ ü¿¦’y:N¶2sËŸúpP‡à Ð6s…ÏË‚ÈÉî!”@ìÚåSþ$áš!ƒ±í±¶Z+WÅÊ9±0Ü­ Ÿˆn}o¶-;í_nà÷+Iÿ®ÀZNú¹vçç|È•N´›J2L Ö{Oˆvœ2óýˆ@Qôœ¡÷šµ2ýöˆGwQ6-ì-""»Â–ò….’|x6ÍÚˆ¬™8Ã[׸úœÌÍU+Ào•ä ô6A¬×äP¡Úþ6؉Eá·ºšS„3Î{eÆÊ•Ù¿Ù$€@ï+‡Iü¼#;ǶËÓ<޳J‘<‡½ä¨·±c©cÔ-ÛÒ'¯|SµíýòìòÓf£B ·ÏX VN*N?¡6Ön}œMn2·‘ìØZ~‘Ç5E^ªP?]5ÜeŸZGåÖ§äÄÍ uvxëkø8fd…ûìs̳)>êu~“—¾CÏ€ÑEM1ùH=q™¢“0 F°ÑxÕŸÚz´U…çòâIÐ’«ºÝ Ì¡ÁÅô`ê’£aAƒ0¢åIæ"n&Ñê_Ó[1´ŠMšBwix„ý´Æ&ÏJµòë×±— 3ꩾK¢#´¦W" ¬0¦Ííå<<–Có¦ß5ÔPô QÛgÆV“”ÈúZzhÔV¿[Fœ‡¬Œmvƒ:Î#‹¯FÓù9ÉLSQßQ†#°±6ÜHìsú(±µJyLžWÏbŒ¨Pˆ¡/“:Š2j­+åÍâK\ÄÇÿe×£Lur…ÓBiWmÅ»çÀuÚså»ÂéIÀÆ™à¹Ð§S*Tçìš ŽÅ»‚‰JSE3¥›%ØaÖ¤ªyÓÔ7.ü~[UÚ…,d0ϦýâÁtŠø†½åã0©Ÿ¡¼ jðt ðÒÒÖdœ¦åƒjýcü º°  ŒétìËt3¤¿ê¸¢-¡U¸ÚC¡Ðíàæ¡EßU:Êþ·m€+†ï SüdX–ìãìÌ–h:v…;î@kXb°Š}1‘ûS¶¨ò[¦T|" ÌJÄ;Îtv3çÇ5Äß*ÊØçÈÖÀå½hÉ,˜?o;eó•©±y|¦{žC(Þ‹x.‚y+d @Æ'L)Fý sÚ±ùS½í<ºe ðt‘ºQ)Êm\ŠÀçDö>ÿ/­¢!±ÿnpLÛ’™X­g%©š§úÉð>"B·ÒKµWôêÛƒzOs‹ ‡þ?³ÌoùIÊ o¦ZðŽx!ƒ*ÜÓu­âÇçó<³½¤vTS¢‚%ÒÔãÓÈ A+säõs¶y¾Ið^r¸¦!žÔˆ—èP}˜xfÁ‡ˆןÊ œÜŠ것4^"1!ðCnRÌ‚ú‹RU$LľnN©”¾ CÞÇSHkþ…\{Ô?ÆozhÀ¸]r´8šË"5jd4!nÓ©ÞÉ×fÊ]mCŒ!ó6 ßfs&¤ÂÍâÔúÜ–Nw¨óÆ…ã/­#‡ªùus„. }ÈJþuúâ<£´7xÆú'†Pœ~äÌ»ëÍ)€ 4жä.²YqÓ9à ðÑÊTÙÊõ² ¹ç¢Ü» cߥö\´…Pgb’š÷ÔÎ:œÃ‘"Þa–Coνò ^Û¬ X}bEF’”áøòîdÔ­²IuìÍ0Æ| ý°öýÂçìØÀvµ‹Š?QZ3¯{ì:C I­Ò!R§¢˜vóþX–>£ô}Tˆœ=–”}ß­‹Ô(?–z£QËYéÛÿÂÔa÷û„yRyfßGj‹ÏE¶¥EÈÚ § ÖiîZSãÚç‚1èÅÞZ»¡È+ç¤Ï¬oA-›£úƒ:2,—ä&Y²•6ç·+—÷P\Ú‚¹iâiŒßÆL%ëê>$æ¶~DJüd1x†—ìŸp9±eÕÔ†#F_ö›m)KàÒ±3W_D”mÉeç=ƒ*ê} ¬wKbt\áÌþ¢äÛešÊzßGÿ¼$´ßIZ$§[€Š¡ó ŽÍ§ÃŒHYÒΈYÉþ²žÔ£n.s7(nÇþù2ŠIK"Ñ—ˆMž>¶JX¦Ï„œÛ¬5`‚ˆ«D\Ð];½>z3.ïÖ ÓFùvÖ«ážÆ ´²þú­¦ÿÁÚD…ïUðIˆü˪~IÞ{Ä aáôŸ]èAÝÝ¢à׆}I–tÏÁ&F¥zć3fk=[Ûil˜ÄíFL-äw&·8Ez8s“PKÃá[xÉ>ʾ ‰·éÁÿi èô­þ.#¡ iŽŒh³¸ô~M”´Ó's‹H[Ï=n%}ý‘j4xÇ$aÛQ VÉb×Jøv¹°t,ÁG6çdµ]§ƒ4÷¸2£`‚åsþƒxbÁy¸n×ìØ]Ñ㇇“mw@t2ù"ÆÉH¬è‹.¨Áã^ÊŽS¼ÔàéÐ ?rl›`YAŸjVCÔñï¢wyƒ¤™ •'<˜ãLäçA=:5ÒâŒà ¾`þ¬Hà´¡v¥’ƒºÑáI&ù±&6Á­„vm·ŸA„Õ ÒýG2έªk¹±Ê-º¬†G¶JøõçBùš°Éé¿¿×kÓó¡ã¥†\"'-ÅöêxtóT'<¹`Œƒx~¼Ôˆ@œþ¡°ñNG‡Üö #Ùkýºñ.2¨BõñÿÖéãÓ îþYòø›ÓëíSýÁ›J7‡.T[–Ãk!4ÆíÖ['¹·¿]ݧ•[üw$Þ_û¥æùé]Ôúo||BßqOuÚæ ð·æ|ÒF6œZ‘,Œùs?FÜô×R,p÷‹ŒZ/nC´•‹“h Öâ¤bSY‚f?;4N1ØûÁÎXÿGWb×Ãí„Û]0y,_È> uÅ‘¢øñ h»tpw•pü›;Eú––P`Ñ:°”ùÓm  Ÿ¡ýÈ}ů©|äÙçðî8×S×`™SCQßCþé‡AØh,šm·B2rèpÐTlm³³–ÝîUIzLõý`0ÍØL‰’ói¸ÆT:-ì0¿ëÐ|e»UŒ{Ô]¾ ©YC-¡Ñ¯ ‰â­÷K+°­UãKˆÚs¥ƒb–7‰býÝ]Íæ;«ÄÅ»\³>׎KvçÃ*wLƒ×ç;ÿ®ŒGZ¥Bî®Û¢ûMzjø¾Ãàœå4µ'S‚0H!öŽRÕÌïîÀÉÎ\}D Ïýø4pq»¿„pÀó;'.JWÿ¤N­ æ½–½%aùëhÄ‘òöMó8ØÙ¸Îè—®½éÖ¿%,‹g4½ÐÆ1Ð&üW£œMèëy܇:ˆ^G±›õT½tïj©.ô}YÞ†·:i#®Ø\°'›>v}³ëÝ:.Œ/îBNÿÏ_ÒwSYt@˜»)üå]Šœ´U‘U`wJòDÚ4'§d‡;•—Aª 1U.q¥û®+ŸŠ{mz_.f³7ìRLR’cíÊ»v>]Ï”ÑðãƒàÐTê§[rhÿÓ$LΕWr…̆!Å)jûç,2ÁìH2*O¨hC&ýÑÇíý¯¤À߀Q3<Š7¨œ”Ëàᾜòo/†µš‚+vènä._#ÃÅ;c„=_¢°‹AÓ>ÖËë ï+|ÍŸ'6êuÃz$µ$‹˜Þ‹íËï\àÜ(ìæ¿…ˆôß`j«cÆPÞ!TªŠPî”÷›ôÃ,õ+“ôšÊý1Ç`g¬ @ÔéâeÙ¶¢Ï}íå k@5[ÕõðsËž3Ê)W”ÄZàµ]]:Ñ–Æãÿ‰”t²Llq‘›”d,ëb›£É=¼`Œî »_^•o#S`ôWÁ¤©íJ^€AÜsŸÁLК–¨''<;˜3ñêV‰#Åh‰ÿ‘$¶*Áõ l$Q?mIg³/ Nóù¨–[D~œè Ëñ'îö[Gþ6õ?í(:Z”ö ùÊ™YTH/^óy ¾`¸ÙÏ´nKõ0ò;×F`å’Ñ#’Ÿ†ÆÙªdGýCNHe×X7‹™A÷†qPn‡N³VZ¸°ˆ=AÉ8ó“áHPwç¡T€²Ñ‹‰vŠG³úMŽú²Ö©¦ITâ¹0Å D§Á[/™®•ÔÛ(¤áe‡0ÜäFG³(e\ËDùoUê++]3͸90ßÇd֘¤rOŸàX,èDòŵS+ÐŽ3¢ 't¿}öÛäŠw•cgÆ ­È‹J§»9Å tx Ö–:÷…„ó9úžiœþQñ×ÎUêbNkÙ8(¯1†/ûeZîqVº‰ˆ@lC–6ct I],a6·4µ}É6ý¹«ÚrˆösãÍfge-S=©Ð~<$²¶¦ŽŠbÓ™u—ØÞR£Æ©F÷rA”æ‚ _5!=,ÁÌ™C×]œÍjÁ9L[(õÐõ ½ùÀïT~Á Ä ÀÇ>ÑÄ š®^÷ï•æçoË\N"’Ò>8 Â{ÖÆq 4xÔ[ÇúuùÝGÔ½îFVÝ3mR-¼Áˆu@%7Û2(·šmÍ õT·IØ‹Àn€°Ñ€“’ÇÕryk›ÕàZÏP*U7Å‹ö9–PãîáÔ‰?úCjb¿£Io•ð=O·È½â|Èd2*dšw“µÌnî¾ÚBº+É,Om»¥"ËåÅ«°±eã1§¾ôŸñbÿnôçˆGúŸ!ïS^'¥G“æð”PRàš~Zùi+ϘÄÝ3Èc^Ww„)ÉLÎݰÒÊ߉“¹[/ƒE=ÂìCž:¥ªA(vii°ì¡ßÆUÛ¼ˆü@О”AÃ#ÃG)Q§õ‰£¿ŒW¢¯«_+öŸ± lú{ÛgDg‰ûC7óýfC‡ClïÒ|3 4f]Ì9´@mkçü† ñµ`&©JÿbP¹çmh.tYœ'éöΜ^a"K*$'5ÎäWÊ-:EÉ6Êî•¢ìU¦:º×ÿ`x…9*¼ÛÑÈ–°ëHp©ú= fäIßÊŸ;w1ÀdÞåDtHÅÏ:$}BoÂCà¥Pø¥èÇ–¾E?Z· ªúæï–¬úñ4N´2Êe/k.ÿAÇñ¨E±lâ¸;Á*&NžÐ»Žp]òd²Qa¨{êqj€,­†0GÒŠìu,sÝzÜž¦ìFÏJ–¡ >ý~ 0C‘œÁïh ©sQ“ЩëfG*7$!Vf«‡®µçb~Æ éélÛÝ‹@µ5›ùÔÛ¡§[“nUÒ%ËH¾¢>Qm î=íôäÅP¹/X·D›¼ÆÊí¼` · ¼vñï;ØØOï¯atIÎdãп4ã½zÖ††ÿÎa=!ÅÖĬòÁú@„Ó¢¶#1Ï q—ˆ®Ìð |A¿O›yKÇÐ~HÝœøQ³G¢Öœ†ª¿Dûr ÛŠˆïšÐ‘ž{Öÿ¢Ùø5w±·cxrÅ–¡ñ>ÈìØ„4kŒe[ ŒÁØ\ü™B—OÛœï)lÄÂ1EKdÇÌj¥Ùø.uâïɧ¿Ì}|¨èiÀL­ƒ—ÂDƒp½{¯uw“Jv) ½å_.¹ž{t±¯ó€—èéZBJ"hb{tØED¹?E#{ÐóëO÷WîWSr.üð¢C«È\d6>^’‚B%K¸¼1Z*ÞØHF,yݲ‘=5V|åüÐX¨fa${ÔN{¾Wn„+°èÈ:n p9iiA ×Nk6ö6×È7¶Ás©óç¾@pYÕ´—QÍF1ú Qc:ŒpU„)ýx{£%¿\«Ö¥æäÅëäÀà+è’Šö|FÍw¾¾azg¾ªÎ”ìrœÞݾ$—¥{9Goí»›¸¯^–}‹] × Ü´µÌåÔWÏ'ÊìέK>19ëfxKÓ7SFÚF±D ¤=u3=¿q™Ù)ô 4oƒs>ÒÚÒ®476àg·º¿J„Ñ[ëJâQ¤Æ-Ëy²·Oɯª »ÍW”æ]ñ¶!óxÞIH8[ªKte]¹+ÂðlñâÛͯgÇE•0–šÈIUįø[«Y¸Cv¾Œ½qYqú Z¹ËænaCÐ::‡)!Mñͨ¹I 3P“Œj¹rÐlƒM ÁÕ‡þ/ì3íÇ£å[…!sóÉb ¡º=Á©Ö³”D‹ÐR‡s]@ ÕµËi5t¯¯í'ÑŒ´äÒÇS;ÎÍêY¶íÚ*œV=ù°ä\U édo¦n¨ÕjÓêø'.3š]Ù²+ñΘG’}-·ÇúÚ•ë¦6ûFªaÝÔO,Pêû ¶™a?éSíº r?²¿L$“{qÂѧE‰Ðz @½S$®"°Èlæ ^wŠ¡K¢H@ðÒ>¡è”~– .ÕòYþÂa&)‹+^Étô[”aMƒé%Ì(F†ÑÂ'Õ'äw©¹Xán.'{±;þA3¶xê‘ͱ|ÚdeNèñØ)˜s©æ® ¹-¹ðªâd%%º€gÁ:ð-Àš[‚õ‚ =”߀Ĉ^„Šk$XT-çë:>·=ER¼F|\íËGcŽ‘zàIÊ£ŸT­t¶$#áî‘êØ‘Ä¯ôhyšÆä‹æ7ŠÐÖZÿòÖÑ—bÐn!I+4Á¤¯¦‘ÔÆ0?&Xq¥·'ùî>È ;yû‚£ÊcçÓ¤®€£ÿœ~ŠmTãN›3¦é®ç©ãªp\ÿÝ„ðâT.„A¢x ëËÂM_~`–Ø£Ï ZáuùŸYГ@¬­×1ÛsŒ²ŸÛ0í† b4ÛÚëï`´• ï„Ötšðyæ*'kl8£2hQåuΫ'¥0»U¾®ã!ìe߉>‡’_àIä³ÄF–ß.íæ5i=¤û?š^} Aƒzem;7ÞW^Ò¢œp§Kè+©áƒršÈ’Y¹d„ ö÷úè­rZß=¢¤(ÙÓ'aÞc~'†hTÏ]|¦[’b76=‹ S)ù$Mè”Ò• % !ÉM_¤Mª¦M“E ž=gSÌF,ø»€T,n9ß(?}Cõv{ýö‹¥3*"+œ\‰jL Y¹5ÒÐ7@}8ýÅÅÓx(é1Ñ™³^  ' >b/eµ>¶Ã^ƒŽG r])Ö2XfCBÇ»×Gxçu¤-¥§ÂÞî¶"d8ÆNœ¿dD¢B5g¬Ç¸ÜK&8ÃÆË–§9&< Wç+•wK<Ñ¡’_òØfZTÞLꦃªS‹ßþ¼Å¬ˆ¦â487 C Ú#‰LÛYwbÍÞGNˆì <ê YX-ieéEÃ×…bSh#rסmøqŸtƒ-!KÄ‹ñ‰l8p‰á1ÖÑÔ1X åO3•pðÊ8…ñ<™Ak.ãŽõw§@ù Ý­˜"d’uJªtO Ÿ‰Ž3)+Výo±ÁÕ­’Ô€&æÙ¥ ·H éG .åß73'ŽçÚ¹¢æL'^:Wä\Yû'2ÿ¿Hìa*Ý68¹7ZË?¨¡÷㎭«öÖ" ò±`J È£(6¯,#w Tsª‰ÒŠZiÜ¢pAkçs{ÂõÌ„Z$ØT‘¥ À4`K… ïnk#AðŒB )¸!zÝ#9¯R_]Ú#îóP ü©ë3®©VÎ>Ìòµzxm YÔxý‰ýÐÙ®ÃBW_/^ˆ¯EäÃG†"®Üùû"%*ý±Ã6„EÐg„ƒ®§ç&«ß†æþÛ8…+m‚º;S’ºÐsëå* h`ð¨‡h?9ˆ„ó8oÞÅc5¶8TB«?!ˆmÏfjZÀ£'㎒¾ù‹ƒrÇ耹 Ðnú^MDˆbà‚OéØ{hxÖ"f&ýp¥ 2;ö!f85>@…ð0\ÇWâàO¼D»ÑƒÓÒLÝhöwsÁÐaœRÌ™ÿ=GÉ9C„C¶J›O: ©¤úü÷ö. é£YyN¢}µnå™SÃdŽy ÇÞ Â„Lôã?¡¯‰þ…2¹’0bÕÝçØ• Ë+PàË“òÃ~VáhoC““Žc‚B“ "4™`œ2ìG$ CvìF.®%0¤@ +5õŒäéhµ™UóM¡Q·SÔD9¤K}åb!ƒšB‡çzÀ»@­aŽç”oЪ¾ª#ºù7Òò}/±Þ­ZPþÝ…¯G„Gè$T†’O(⇇jQÕ`· Þ~Ͳ59‡û¼Jœû‚l‡ªØýÛЛýàkµ’ë¼¢‡o¶]$äíbûœß¬NYFïø^Û©ò«\+„Ô<ñÄüˆPJ@B7œ `ús…iCy)“+±…@»¨µ N¿”H_×Î4d·gW»¥ ÁQGéD{­s׃€><0‰0¬bcpdþ®š˜>âîZ¤çÉØãﹱͦZ–2cBO´–aÏ`fög§8ë/$Œ+ô+׬Xy/Yºó˜#»åò]¤zxÔá€.:¤Ûäáõ½N Cd¢F·%`—Àñ²ÛÚì! žx~ÏzÖ£löìà‡€î‹úÇ‚ ÅNm+`av ‚jÛ„/1lz×{/µ:ò¦eO¿D¬Ÿçwi»˜û÷ÎrÿDÑg+ÊbrÞ›Îþºt÷7Š›#Ü_Pë‚8¥;éËa#{TÌèÑ*k͉4Ú(ßÉ@Ùniçh9Ô)ÞûP¬ íøZúåjúW­3fm¨ì‘ªŸ”& Û’“` ÿOÿæKæA¦k´ô }$´>. =¿æR6—÷†nx`}ZÌä‹»‘Tìèâb*° ¨§E)bGîÿßÚXÞšÇ;3Lˆfïš{lÔãrà³èõáë#ØË‰¼¿›tßVF6®6¢ Ÿ¤”ø;È­]7!ñZ”°Ñ95ôWGUô÷`r—¾“â«è¾Šhf8"”õË ”#ŠãÝš+™šI93O'¬b°úB,<ÑØÌu j>+NšÄ›{)ó¼ÌUV']5*ß™.£ŒOÑCvhå7Яò]í‡Ôå‘–“?ߪ`.ÕMªP¦ ÁæØ­á¬a,o,\(w=ó qâi-,Še¬ªÔqâq‘þð4~—€.'ÝÞuÄMQw/•E0H,üà4q¶Õ}ZôT&–Ëg`Ù´ÀÀúŠÖÀ¾m4D@ QK½+Ì”*Šz<ƒ´bŠxzÕ\-¨Çhйñª=ãrR"Ý é8øí B…öu÷« Œ±¹!OÕítXŽ[gí§U‡3<:ŽTŽs4Aƒikt¡Ê¿éÔ¥ˆ×ú½Æ†G,í‘TH_‚½ŸÌH’ÖÙÓ:*~Zà'ëæk‡Èv“å+§;“‚?2Ôãc ‰¦ä¬þÊ„çý€iÆ )d@©¢fyA44ܨëe:,;ÄÍê‹j)U¯ 5Ìßÿ\ ¨A>F'Àñ¦ÆÞ`¢_Müº©K d}nÛ¯Íø(@›‚kÌ û¤m‰†‚ i„¬ƒq’bo&ÜFv.ÇÅ÷?Ûˆ„×&0¢Yµ¶OÿSy±ˆêá`Žƒ<ɺ9…|3Ä7Ÿ;5¤ ovÞV`€qWÊxóÅÙ…"i^š_yQ¶50N”&Ÿä[V"µE /_ÖocºáøVÍhj`}¦K6C­NXpk‘ûVìCNÐyŸtUhœ^PÔð.Ѻ`߀J€’šô:à÷(²»Dg¡Á[ÙRJ‘[¨¾¸½68ižlAóF3>+ó‹ÙçÚ¨ñ*:W_Âêîý5u‡ƒïna7³»R×Iîxpxž0Œhsµ•˜xh—Òø•^Êç¤a• :[,¯IÞb‚¿‹Bߎ >MM½áÈE½UöUQ™Vð¦8©ÅC!¬D¢¸o!G§go&Y>M=¿«ì¸Äs¼ÛpjªëÚ*S‰K­%3o‚ýY¬ CMØÍÊ­?èýÿ9×ãµÝ–¢TÊìë§3;Ã@¾ò¹pz•¥´ªHyÈe¼ÉOætè7Õ&¾!N!5pǺ6.RÍkFìç ˆÔ¯Ö[ÓþÔ7¬ rxiúvª}aúÆOýBó°Ú©JŸÛÍNûM¾‚h-¶®aýƒ-Tý+@^ÌOuõºßà«Nz휤Üýz8”EÁÄi°™ÇÎ0Keðjc‚š>¡ÜŽñ¤ë¥·ÐøÎ¬šZâð3u['8k P `3ƒú YÛŽôDu4xœaþU‘-Z_#àH-d{ÜYKN*w£:ÓJâßÊ]³yRe_å¤"WÂyå1äv³ŽU}ª\ÏDù\ïŠBTKœô|7“âµD©z<öì¯ÇK¤óÏq¬Üõñã‚%@iïñÝ$)`–ÇÞ‘8Zó¨”_ÃË‘ÅDÇ3³Ý[ØT,ªj¦ü{!Wñ…ºÕùìÐÊB´ß… {¥ÔCï_ÑÁøÛGÅÛ„ê=pDñ JãDºžÑ#3ˆ?£Vëdk‹ºXĪòV¢ôßF‰¶´óûIÙó˜`Ô»6î2¶Üˆj¹´^ 7 ø­Þ‡Ž…º Îêü ý‘w´Ã¬ uªOV¢$¤Õ?ïé‚ÏÅ«zY2 Ø*œÖ˜ƒôµÉü+2á¼¢–øï¦R·¼#úrõ‡ßŽàGÆa ™í£Ò|а‡¶n¶f)Î @ŒÖ±¬õWZwò›†"Qyk‡ªwÏ2“úÛÍ€·˜Dv c³´ÖM;ÓWIÌÍŒ¿°"_;Ðtj3>—G±µúÝÈI.Ö<ׯW=òª—,ù Xì=Ì_}ÏŸô8:ç.BñšÓûɉ’­¶ãg ÆÉ"ïþäÛÏ^çx‹ÎIîÕ[1sý÷¯ƒ! ø,÷é°ÆPœéÐ †Mº•’$k2FÙf€<_åAZI–‰\>b$îb|ŒöŠÉo?¼ƒPT¾hßJ@\m&ú¨-‹ƒà²Bc½„`Àõßì[ÐÊ Z!!Ή[σ?ê¡´#¤½ägº ñbÕaƒÚ¹W›¡Žk %n„žâ&òuQãvîŽä¢àEÑi½1«’)ëªu*Ï&xgZ7G¶«¨'¦Áü-hs‡AÿÃ7FŠejMÇät0Òï˜ÕTÏ+ãIˆ´NÅ&ÌêP™\²Ôº¯ÂèÜgw B\Úƒº…Ê‚Ý{þÍzZ€»º¡$>øª€H„hõRî”…Ã}ŽÜºLrΫe«È)°%rέðöÄg õIDZ!t¥ÓiŒR nÇBcE‹íRŸóJŒ~!Œ¬ÊÒޜ渣AýHfDŠ»p;änúG6±©m²Žcп¼ŠËáÌ L—Ôt¬9.ÜkÙbçÁN;û“jVÿ2Ô“D+~uxów¦«FD +3üÀNIg_l\Í-@þu̵¨ÈOê-õq\÷#-¥2õ¶¼?dà”ò*¥—:ûÝØ U¥L:ìô±7$DâM2ðuÈ (ù'c)y•»À(ƒ®`(c¸¯•¯¶‡1›Ë2ïýáOét‚òŽú0b€_ºÞ¥ñ´Éµ¡É_`›^À·Ý¯¼.4ÍjsFý“@<öŸ¾\<¢dãKõjš2A\sÐbJÇê³ó±vsËb¡¹8[¤,çÅÒM/ÅŠz0ý´Ö¨ŠI¬´ü°OÇýò¬²REñD„%ÍUtÅÿîÍþÓÃ8E•V«9 —PúùbžBÔvH´½ÛôýT)˜`æ8Oã¦Æ§ïØ¡Vdú}lš ‰ŽŽ|ÁúªQkXÃ6¤"ÀPš}%åxÔ™i¬@/„tÇóo`<›a%Qœ‚2:aÐÇhmÿq9IZ˜>d'qõi€‘ùhò!ß”ÿIp2׿“(†¯ÀZª¯*IõÑ“»N¡™•DrÇ$tÙ\YeïŽWÏøÏa{÷~}š8ysbÕÒ!¿ÍÜÁ[ Qxà¤åz¦då[¸š¥©˜½qiÙ†‚Û ˆ4>¯ªQ]$ßÐ㈵;*ÕÂc¥-–“¼¤ç7?9àÍ’à‰H¢ d†Ñò“ô7£-ƒ‹›Ìb’û²}~pTX\Ü@ v=5pÎ,¦ þÐAú¼¬^¡-1c%ƒõ΂ v2½Ð(1¥¨ô˜Û!ôúYU/Ñ-o|—žÌ½Îªœ÷rÇz²ðS2𑔎µjN…›'Dœet]Z sW² 0˜”O/xML´‚Dw ô?lí5˜ß¡‹îÐʃƒ:ÛZzáG*ìbC:K—Óø-ÀMóèA›Œ{Éœþ’Él„ÛO›îý6Õé0AÛÐ×û‰©Ý†¤IAû—ê¬]‚’‚™ggO¾Pç,r9‹Žøã`1&s±!g«¤g—ùG'Á]óÍÐOñ¤dÀzé“P¯ÛÀå~žöýÓ——ú| ºÖ.‡Ýú›ùÀ¦~s_rM GÍçësGØ|L¦l1âHÚh2ƒ$Èn_uÒsÅL»z«ü°hËõ#]±‹Їڔ¸ewÆ+)Vj>ª8Ü6òl€ŸšÈyÞå,‹ïqt83ГéfƘo²µ»â´´Âé· >¶öÒR¹OH\lØ Œ-C|ÝY2L ƒ¶·{Ëygaý@ˆõ©œJ,Àaåy–¶Z@0£½:n€™kÐÍwy’XkHRRô\m¸íp] VÓ<:}P<: 2+óóÐà¢Õ~íC犣™´‰J±©+}xCÚ‚%xWq¸ý¨MÞ_þŒ óRq¢>¡Áï¾·1bâ¼o.RMXRÅ7½‘d¸õïÔ›2Êc5KÞøkË­ÔöRAîÚ¢ú¶[$Jj:ÇŽš"ú ˆÉ$Ùâ-[Cz<¥?Î׬L‘³ä·ª­¯½q ¯x÷•‹fîŒ**ÌÞõàæè–î†Üý ½—µÈB8þØÆ\…ȳÖOøÇY ´T<¯úê¶JmRÚÌ×'T, TÎ3¶ë.³o傯y º>¬xèß:hx[ˆ¨ÑyÜ" [_„Ï!Ë8|\98Ÿch(P¶ª(Òÿñ- ß^o`GÐM2U·Re‹2:4ü¬Ë`øª%0P{÷¥ˆmŒGbá’&EÌB’CÉSÓ ¾¿åzIBê81Æ 5L<³@H§vðT‰#«®F»:ÊÜį¨@¿®^v9²™ÕÕèt·ŠÁ"óPà¸uû{!Œxw'¬kxþR~±ïÉß ÑyURßT¨nìý•ÁcÆQép©Ìyý*nŒgbÚùäÄþQצÑôAçY×°Iå¤Êí`â–Ø¾l®æ§„0 g{ Ö<´¿,#XQ¸×¶·WŸ¸÷Pß¼33î…&J¹P«é|ÌXJ`’;èß?ƒLù¬ÆÈÇ?‰º‡[ëSo&yZ-ê]U'€Ïø¤œ«ËúA¢'6Ñ‚"œ8–Ô À<„ «“ªŠ¿"%T7P9³·šÂîªK¢»JŒÕã(ñè¸?¯ Xí†/¤1ÉT,fuG.ž ”<)É(F]â4Cá–n>F/·J‡9lúÅë§žƒ¶ü'ƒ“> Ú¦µp¦“ň 0g,­‘úlETáðäDíÜa™|,7ì قо’»~ºÂíü?š‰é)+Ÿ§ÇLdºò5Aa; ,FãYõ€áN5ªÆîNÞ Ç_.nép-],UÂú$Àº´”ð™yˆâXXµ¼¢nÙ`Û§ OQNRØa1†jî}µx`§{¯{üP Ó”üÃÆjˆ‹¤4ÖñMôfi/¸úx+¨ºWh jrD~–ÓÍMi²0mð- ÖC,.|Ø"¹ ÜÛà÷ªÏ”‰A‹7‘jgîþ”0R¾îˆ1:†N²ƒ‚(¢ïÍ1/ î&(2£(yÖŒk<ï(œTΩW2û?06äéóÅ Ú½ÓŠpÍs‹‹(T”s÷k=³ÌA‹š›âX4å3QöiNµp\µH¦™Fñÿ2ň¡SFžÄŒËU;VÁYé´Æ‰=õ˜È3ùlÃÛü?:“™x߀Õk¬zƒÚ4ªr˜hTÛšãjb,8/îñ¨YT>âB92ÂOä’‚C:q¨‘ü€ÂrÖ&Ô9éV¹NëRaâ}÷ÕŽÌ@®UB3yòÑ+Иò7©ói@Uùå¿Û¿0ðô¯{EÚa~Ýnß\î––}°*}[\¹ô„bÕ{€eUÛù#è(˜Ì.°Qž-^BÍÙÒ˜®ÕR©[@8 R)ðUÿY¹›6¢ÔÒŸKÙÑቬ™wlD³ Ël«]é™;>ÏÔx~|±|Rwu0ZEŸkÉÊÞ,ïbÊ£l “^²Ùð;nö,Ômþæ @J8IcNüjñl,’†RhU>±•^J&®ÒeŠ· š†wLT¦Ïmhb±ŽŠ6·éŽjù‡g—#Ж +Û·,å¦È­¶) eœvo±Yˆ`=eGÿ >õ{jÂ2†cG¸n]§<ÎáÓgÍyk႔ⓣ-f[ {Ö%GÉ4UòcPW3æGÎÂðx‘ʇá|i=ÿ3pÛ”yf Þ–Øwˆv —œõ$kê¿qGŒbUFÛ;Ä”ïþøåð†9ß››0³-(é>²œù+ܽ/Åu!?¤°.ª“ÙÔ°³ÇœïÒ5’P3‘ºÈP3‚|YÞ—%g=ÊQKL†Æè¯ÅœCî…°³ÌPt÷–V#{î¦aì,„dûPÁJuÔêQg×R¸¬äQçûñsឃÅë¤æÆ3/†–ç4³ ‰”¥éL—5ÒhdÙÔ]§ÃP&üþª†M´DÃU¥‡BHTTh¹.7Jÿp“u¥H1êºX‘Í |‡^÷ö¤©­ÓV¥‰ùz„¬?¥Zqø®CŠñ‰ 3¿t½×nG å/:áØ÷nïÁAö\NרîI/1tþ.z¿–ø%ðæ‰›P–\÷Å€np5þ!ÙCÏÒƒñS)0TkZ_™%Hæ+; ÇCñNª©ºã,¶ÖEÀ 2sÎåå³ Êi ÞjL¾ÕnæÜ ʃ-«º£õ>ÄÇRÞ¹/»Cû¢Y9Ôo4­WȦìÄiAª µ]¿ðôÐj+Ñ.?³³¬Y/lÑOÊ ·ÉZ§Y±Ÿè…¥I„ù®äŽWu”˜Ø¯§ é$í½Bšæ¿+œY>ÄQÒÚÄ ex‚PIœÂÇÞ9MI¹âdqË•åBT8µ}p^´«ô"5n‰3yAè¨#õ“á:wÎÝÉ»Á`órÀ»äÓœúº0pëâcCBŒŽ¨~‘ÝÒâQ^ølhóˆÎ¬Ìt¡3ZbMÙÊÏ·|ëXa»-H"n_‡ÉÑ—µÑ†‹`ÈXÂå$ÈÙOsÛ…Š91ÐqòÜ–Ÿ%¨˜oá02Ø×2§m‰E}GxÄßÀ)N²¢¬*wÄIñþ AZQ)}fØòR÷ˆÃ©õ»ëˆ;ð‹Ö•,^Úzå3¿ü×&ÊäW!‡ç>95«Dƒiå³ãójv¥ã=ÌBÕX9>IS±ÿÑ“X_}i6žKf¨2?IŸSáØTZöa9§@ä¬~vTÃjãÞ3íÍEÒ:_«o¹ôØÃáØ¶þ‡§¾+äÖȉÁ#z–ò×îoE¢ù8…Ôæ†ü¬ñ•Z°¯g`„wV0†̱Ø{ºÍ ½›¦û‹ËÃ|=ÀŠð>àÿ­àöëv[>þ…也AhÎ8*ªòB2Ê ,Šïpú#æäÛ<‘ν@TíàV6†Ä'F êsN þúÖƒ}=ÓÅP3]× ¹†a¦Io’ù…¤ɧ¯ î¡Þ»©ñP‰:–êŸíEØÅ%ª©EƒQ Il”± òm#6?|dÉŠ)¹œ{1ºeóŸ)›½«†o Ù‹ó`raÕ0LÆ=’TÆlTiÍÚùM`ó€]~(PãáÁH€DkkÅ™W¯./|$ ¿ªØ¹0.Tª7ººyÎ+ݪxöÑàÂbgQŬi4“ ð½è4æ¹”^í§‘ß5œ|ðÚ¶y(G;1¾@LÙ©ŸÐ:hµß„¹,œÑ5¡yédàãè©IÉß' ß óSæç7†mnXm£¤=©öý?!nì‡M±T¥Žâ;ÂG¥ÈÂÐ\6´_ÚÍWPú,uì¶6©t°¢Ž7’j¹e>˜Ó½~BÙê“ñ劖”O܈=’~ƒ€C¡(ˆ×\¨[§žô]>ß°éÈ€û¡i«¾E®â2mè—ÅÇ[é7W~Ÿ±h…b™æúCd²Oª½P£MD@éD5qZ1ç/ñb9"ˆ[Ö*îËt‹´úF|G¹A»Y|é¦V>tÛ0W”ùΨÍZþ4 ºv»ÄRb§÷ø5DÃZ W8ÈeÂC«ÿf>ž¨È÷‹Ì–ùþâjEãV¨¶Ãzƒ½…²ÞŒ`tÉ;Ø^IЬ¢ !Ù!@ƒj)ãâÌ_÷°Kò‹…v,xà˜[ç88@íÊ„£Qk¿´ð;Š9£UHùS‰þ=ßia‘7ecíXw4݇`}»¶¢Z;5§{h†ÃpFÐ%vÒô“ºBÔï' 9ðúi8iI±tÙc? ·ëô÷LçaÔù³Öñ#>ÚW4Å"!bÔ"%‘<³ ”P9˜…âB3‰Å𬻠Á™]óg..ú^Tâ™GrÞ ÷"L@mcΑÏX4yà­Xˆv”Ëw‰9¦\r8»cúÒãJ_¯$‰Œ?N­Ð¶^ög0¤vUå%6š4 D>â3Ñðç” ¤L ÉWƒ)q|3‡ùÑ^(N`ÅDQIÈÝZõi}®øð°PáÐŽx˜R긑vÿ­èñ«¢¡x`϶èt9r‘Ù8Z," †#tËÀ¨›C…Gv(J,ÊX*fpæÈ»d˜Àbmµˆžc7Љx¹Fµ§ºüT®–Ñt+õPè9 12OŠZ¸z@9qÏ„ž¡£—˜×©à@ª(_Œ¯Uô”ÕÆ)Z3AÀuÔ[oqežÉ¬7¿6‘€ªM½> ÖÇ3XCþ¯… ŒÅ{“·ùætO‹º6„9e#ƒÀ\áu™Ä¶ fùdÏ–Ò´Ø(HrØ”£°a²[€t.ÝòH¤u+ªèmuoS#0øf݃Ө?SßzÿËQ\]œ•S¥ŠFHîáq[¢6‚IÒ&¶ôwó ß›­7²£°>øº³4‰Œ¢Ø§6u1 –6¢ ÛØÑáì j¤¶#g…õË,/ÏqG¥'¹ÞòߦÛª!œ!;­Cíò.@û½<•Éo™{µøÃÑDæ#âìOÞü¬ñ¥/:¾~Ûz2–Oðâxǡԫü•]ùlt†ŽËr´ŸÍ+ŠÂý!Äʧ Åãè³ ,G¥p0æ—¹BŒg ®phý<©ë‘ƒèò /f¤¢óå÷Á¨äÙ[Q‚-$XœLÛ¦¼Í=«äb§ÏCRˆJ ó’¼Ñ]Uý ÛyY†§¨¿pš @Hî'Ú;nà¾8 t ÐB_Ý·åÞ$¤ä·‚fVS9¿· •Žüè×Ί_-ég}°qœ}~8$¡3%{†5Md}ß3·nvA+÷Ç‚ŒBÀ~¡}FZnLàñû_ï–ÇLX`n6zÔ„ÙE3dB{ÍGü2ÙŠSVŸIõ¶ršëôÓÀš%„êN®À‡^×oðøâ÷¶ü¾M†kѨóTÛI…›Û±ÍTüÓáî–ž:tÅ'ÁþTÑŸÎÄDÉÞÕT%{ôŠ•*L<¼&†ÄƒœãWQ•©äQ]H.¿çºiý+¿ÈϘK”$‰ _Û={d²`…)J`g¼¢ a„bùf¨!@DQ–âR/‹ÈXe~•!Û ü@tbò ØK«yߺZO}—êÖ,¨~Èz)X}jï”YîÈ;@´Å?U”apS „……ø8¯©ˆí€;åãª5èâFbé‡gœ³Ò`óˆ©B)ÖËw­¯æÁž”üÌ.›¼ |‘H( ì“dèéÀcÐ2ªlO¥ŽÜï6úÜ8yÅzK‹ã„’ÖÑþÍ Ø‹ AXë—Vt~DáU X‰m—v´þA`)¹C0í+Ïÿd’Êz/º{b+þ©ëÜTCYÐ’=RVm· ª\G¯¶Úô€ ig*7ŒpöªÏKÜ÷¿ `ƒ¸uIΜf·¨ˆ‰DÉO’¤Ø­éB/=†" HšbôÆ6­ïpñ®³ ÀQ"ö¼9K¾ó= vŸ£“u†dâ¦0ÛÒ% t}þOé¯} ¸‰1Z†¸M$\¥â&ùø-0$Р’£n¯¢ií¢¡Ÿ›žßP­êÝ34 åÚ³¾‚»(CâIç&ŠO³9>®6T»´ÎE+>¡/Cý½í·¶ü…Þ÷ $…Oéö(„&GĔخ±°ÁaY²ßxî«è7Ñl€Ø)ç€Þ(MpÏR× E›n9(Mܤ!2à®å]Ê,ób¶è¯^oT±Ç¢Š¸9©ìë7æózÇ-H9®X O£¼ƒ ®^¦Lú%pH®W·›œà·:‡&]<š´#8KÍž1õO?(^)·/:u¬[  .(§yYì^;WCÄeôo 2ÐS‹ÙgEŽkHF0Õ¼ßα³hE-ÆeåM—ðc‚®°šÛûÈÙ-¶‘¼xm^nšçÃ^ˆ!{pÿCùÚÖŸÏÙ>$Ìã3ú=Æ~¼Ù 4Ý÷ ¤ ¶ît$4j6˜¬Áƒ%€©*õ³Ò¯o+°ç ï¼âívÌÁQi>Áï誻n4x7ù‚cN@~æ $´…:K[ôQW©aø®´í½JDG8Á#ùÞ´iÚÿiĪgÌÿTÇf> sô9×Μyq)¸ÍvZoî ,À°“KiK}Ñy±~lŠHÏH¦Q]ÉE—©™ñÌÆbž™þZ­ã8{œH#“¶yÛËï2‹%®vk5ãl@ü‰\sgÒ ,MÍo@XhÐÈlM¥ˆz‹Žý†¯»B/'ÈÛè¾`»züqñhRÁÓK3ûä5[I„º0—vÙÄ i$·F’@RX°•'«¶”­mÜÙ-{÷HmV°xÕà>vÕÿ}Nô€êEp{y%;'‚Bø›ƒ-¯”<+‡Ášõ.¾Iäü´ †Ý0/„8åeG&ÿ_8 Mïý¤…¸UÜÆÐ«–+QzÕ{œæ)b˜öèúö‘õ8>úÝGl³rqÌpKÉìƒÅèáG¢Õ »5+•ôf‘Nš/×Qæn2Y¢™ª7õÓà ³Â>ó£|³ÎQiƒ`Åp2Íp–\jžŸ%w q䢪i¤±ë,°ú~ñäØ/: tÊóg–h`ø¶+¹SíÆÎ2,ç|UˆâÜP.ú–¦Km Lhïh¿‚Gâ"ôÌ ´÷5wø¹0¡»KM¾ Çþ8mH×I£ ÊnôPI¼âîšAÅf¶VN­®ãzjµX[e)Éooªñom£¿@-s5Ä]iÐ3êÀóýYð±àê"äŒÒ‹âsá Ç:¯Q‡Î=nškRÜq‹ê5üWŒA»§›¹ñ[ÖÊu/|—JÖ{CßÕi|pþB©ë‰ X•·µk”°Oøo—Êù¤éE»RÆ*öyЉ„èTQ,H±ÐÛˆÌUÿ¶\Phmñýoµ/ …VÕH3Ø`4NÈ6¡ dXãÜ]qï,!tÀWÝû7v‘’[S[ çו‰i9¼º/`ðÚpJ‡9j¥ $<ööµ§-$hÛ}ótW0q¬V[ 󧳯ü.!lKQRTîD‹ÌÜCžO»‚†IŽÞÀŠF•6¡½*D*L´ÌÎ A¨VÜÁ•~‰Eáå©Öý9“цvO6Æ—lm®|c6¾+´eúÖ‰>ïR™eâŽàv¥£bGÛ£‹4±½ (¶s¢x(tëm¨ï .èÂÔ‡Š'ìŸM«M×ÚLOÓYŽÐá]@š$9g.8O½ùÓ0‚äÐÞJNh_klŸ©%–&<Gõ±ˆl_HÐFªŽšñW‡¹_Pæ-“‡àiÞ+β:õq*ð¢“é¨(ûEÃQSéRÛSwlÈX0‚m$M$æxîÏ|çÜAA¦oz |Œƒu«tø‚'†¯vC=IC$ûeùCGÿ—aÊ"Ö‹/ƪµÿ~7•“Âfã¢Õâ;Ù÷Ìñ—Æ|¬”YFßkfç¬L +stÔÌ(žÇ”•¡oÀvkaxøÐÇ3ÿ€ÛHÄ@/ÍU8:¤\òçgÛfL}¡@ÚL¿f¡†¡>h òCõu„ÊþÁàä,°Ù·’ô¹´ "mû=8 (QÊÁ×ÈR[ê)ÇàõŠä˜D° ýæ¥Yy‹–ºkct“Zê©:8V×bfqç­’¸¹›Xmú‡;[qi&èa`cpߦiUxÑ~ýÀËéJš¶+&bïes¾ÉëØž/î·×ÇœžŸ?؉ÃÁÿü1%)þËŠ ¿UVÏ–%ÈðÏ4‚E;ãF ¯k¨ª¤!‚°TäÛÓyg²éi<{ &aVxóUIGê],94QüåW …dC—Éꦵ˜ÜlU&*Ø™GD5¶#/ }ÿ²“RÕ†*8†ÞD1ÏG{æ2ò”ÃÅ;qð:'²fé]6;°ö‹J¹ø×&Ãί­\à²hüt¾¨g °:šÒ 5ãõg,x¹pt“ó=™ô³­6d5’–‚‚µ¦Î_‰ýb]h¢“¸ýQÕf“Iº‡î§¤½óŸÎ1Ç“¯Ít‘/h7iUw×´ìùšRèZ$töï#;„+˜v>ÂQ”þ¢µ}‹î˜>@Kbòo1gÓG̺Ö,×\yÛž™òrª»ozäúÂÈ„I?ƒý”uKŸCMÕ\!ÑËîêÎ÷Ãù†Î+“ç6êÔ{±J‘±øÕ‰£ e§ÝaGÚS9rÑP¡X+Þ«þ–ãÿ$Èúì% ÇAºÂ‡ŸÜ— >‚ª'bÉÄz*±ë©ÛT¶îÌ9ô:ìÓFyEáz¶)qÓš~Q ý”ã¯E£%¢“ XÔù€ÐB$Ý¡Wøh â°n4bÀ™”}Ñ=ÒÃ3ávhÃÙúÐï…Ušƒ ci™{£™‘äÒ™†Åw§Ÿ{ùHg÷R²e­ÜôsàÞanJ4 µÒ8£¾£, .2`í¹NøƒV&ñ#ëYCvÍëhÜåœTë¡“á €*»;(ʵ±¬]*÷%»±7ã—i3ñ5þ%Œá™ŽëXÌØ0œ” ÔlÕÙg¿¼vß‚?_dhÊÁAK^iĺ°åèGº*–]SÆæÈc¯BŸžf0(‚¨§¦3G‡¿ÉBAͤŠc<Èýg¨ä˜Äf7swéó.{^-ömÕù@‹Ðƒ»‘ ¤y[ò¦Wkk± ØÔÐ ò(ÿtÓÀèÜЊ´™†8øûñíqv:•ëõóDгjû¨ >µë€óNÓ0Q#Êo;Î'Ì9:…±÷ç¹ÒyôdAÄÀ9êœaê/ñÆs ɲ_1wäÕž}rbcÌh>ÿ¸tŒŒmÚ_ú#* ÅùÒjå!0Ø 2eä Ÿ,ÉjóÛª*·çP¹Ú.[Éÿ/¢2{šÂ»2Æ‚:¦€íµ^‚ ^ÁížûªdâÚ÷)WIi«Á"λy„¯Çh8¥èôÝÜ.“%…Ї Io6Âd,}ÓP­åŸ^M Œ†(­ ?˜}m¹"çíûü¿êîC·Ž5¬/³”FÒÂ÷Je©Wlyÿ¢XÛ¾œ ì’•› 2n§"Ͳlmñ`øaÓ¬'_š‹wŠ.±ÖTÐ{übó\XXÚ\Êîç)ÛkÍÔ¤À^W½!¼†·`((¿ý‘³)·èñÞ±°Ÿ‚½*=§`!çSrf(úW’á~×éàôdu©é}6ÇP‘””ç¯ÚÙÑ£éö××2/çÈ~ßåçþ›¹óP—GÓÅ"ê•¡Á'ÒÊ&Ô›‚ü¨d–¡043_ãÍÿ¾­‘Ô‘$¥õ;ßz‹¹v¡‡8xFˆÜ"³³wûŠã”èÖÜCs'/~}å¸=’î‰ ÈZ ƒzó.+'/-;~ÌÌòk“®NXL¯“'­VR“¶Èà-•’0}îWòÂn7bŽýŽ-ýÞö{ÜQT{úkäx¼6A$E9¾›Æÿ¸1A… ’‹`±EØ$¬œŒòs¡‡ÚhÌ6çÄnäÜá0Ð6Ê2'æPøÉã,ƒVX±‚Ö'áqš‹‚Ó#'-áΑ³ÔÜn%vb Q;0žbàÐëÿþŸËèÍü¸~1Œ©yk*jþ°öŒÒŒFT\µøOyÜ=ÝûÙ`^øk§ÇÔÂ…´² ¤žR¢4+-;E•Z®¦¯žn6™Ç ©³OGŒõBÄb&U<âOÕœ>¥bV «»ß¡˜Bµ7v²5˜“±°ðªâŒ@;3u_^‰¦‡çp¬‡…·ý³}1µîc³÷bÏÐB6Ù"¾"hKñS)2Ÿ„"o;ò‚E_®¤æÄ»¾Ž¿1¸ãû5—rÏ †?Þ j3EÄÍà¹?²^ô‹ý* æË«¹9×jm½éuMÞì.¥y0;»ùÐtKmóT_wœèRØ7²?;4-ؼWòfh…h,Å£‰ÓZßâ€z©=ªü­:ø›?Ö‡¯p±mÏ8³Ÿóâ¹42ˆ·ÈÚf1QÆö‰Ròk¸÷þ];5œ )oÜç­°å@¾Ïëê >Ôçsëº2…Bô mÀž'פ½G ÕÆwš¯£ªØ„D7fŒÂ ¼ þ«…œ‘nœ/Ų²$•CzyY,ßg!Ê|Èøì[ Ȫ'¤a\¿"&;IŽ•j7Ùñuu h(GJèÎkÆ¡›µ·ú™GN ìãZJ3Tkfìñ‰(9 Z›¢SÎDò]«»NçKƸÊQŸ’U¥°jˆû&}1‰Dƒˆ²Åþ%p¨¶é¯Ò})±‘œvY˜” ¥íÿÚ)(ö6 7gÖ"ýØG’#­Çê(ÜõÈ”'3ÃZYÐ*aÍT*4HEÏV"Gzˆf»" ÷êÿö9ƒr îç_°§´ÃÇ»\Ò²Ô:a÷Ý‘qÀÜžŒ†•Ÿmpg0!Èf`1‚¶¡”°\Ý_R½™ówµ¯¯s –œAa«ëÕó1ÈšH!œjûÐó0°áÿjˆuÎWBNÓ-ý ·#_‡§ØÀŵÛR]5^Ú‹æÉ~«‡S1U™ü³öºªB.]”Îm>a„?FsWè]«Ok©ÔFV¦£SÁ Gì8®zÑ8“FÓHMβ'çØÑ|ru2pš‘÷ÃÚ3?hb¦ˆY©uÚþ‰"ÓÖóˆ ýŽN…ýƒ×1gŽpC‚W´jì˜pxâñU \U ÂE¾¯?–ßG< ôFS/¬ðÛz¸õÞ!ì”i'hSPËX¿œþ;±Ã”L¢äzèèʃâÓÒ ;ºXm§­ÜJÏð’7öÈŽÖ&C4ó@ÃAÏ«lñ? Q Êx÷¡»©ZÊÕË¡]ê7ð2¤Ýl«®ô_ä‹ç|j¾6°Fû¯ýÙg)»[ϸ§|4×30Ó<þêüÁLz“{\%ÿU†ž¦²¥¾)½ç6ÒÕµ±mHï• —™ù|‰S‹¥ÝÚ°gSô‰w¢m‘òËÆìמõNƒ 1“‘É"üÛf^*X<Çcñ.ÊÜu¿Í_ê¯hÔwèS«Ósr6Ppë!d\ÊâaP"ôÌÆ7 K JïHMH¾n¶/T£ÕL½izvÛå†Ðµ*0Ïît.C4¹IJö!t-#4œýnú’Ø…¥•£ uÔâ•ÝpËîÈý *èGø§Ê% ÝY©QÈÝè³²•žÿß:΢û•Kæ›ÚoÇ-ÍâU$bK®}92Ç ˜ƒäý$ãMô³Ây›]­@íêc3}HÓr¹‰%œžâûêk-Ì]ãÈShL½ †NæBj¹`­­DòßÂYj™Šgör¬-M`ˆPP9IVf§œ½úÊ«¾ý}sûóÊ„8¬Š€Úý–ãÝ ÜÛWÖC×Â<´®+ÿ#„kµòÁ$¨´Õ´ÆÍ–¾0±ýZ©S'ÿûv¨rÈg Pýc³}["2Ê,ÂJd ¥sA~È7ù%K óxd5MQuƒ”a3QÞÚàJXø.1 Ô(ÆëíFyƒ¸¿tbïšÓ.n¦µ d*‰?Ä"*ï©ûÔáë|kÛ©f¥‡}_·¶üŸ®ÔùË"™ Î'ÃKd[O¸/¨eÙu€òþzF]~’Y‰úÏ(0æºb¦ ¨$÷Še Û69Ç?u#úÀ¡±Þ…X°,#¹Öò ´ ËÇŸ:3ÄíîÞ`å]±˜o·nÝ-y–î„÷ËöŸÌIšþkí ý1¾O˜ÏyÚ}Û9.bGÞŽtŽe`©rÙéMÄzÿM½eV\ð\«Ð©õ ¶]ð½ê’0Ô×I!“ãjÈ••p9¢óöL³,軵GË`”:ð# j!RÊí7´xŠÓŸ1Í·žõ¿gtãOˆTå"š*¥K´XXGH™A;­¯fL·/¾ìôb0¸¾?Ú·Ëñ?+þ޹ēêc뼦ùÄòña­KéÃÝBkò;mµi£s›‹T?Ù`™²[ï½R^Fpk „ÆŠrütÑG¥‡ÈÆtó»ÉjH¨ÆêR crÑÏ}U©4=Fê&ÑÿçzaéÍ:MÈÆ½H«ôBùcÙHž g0×aÅ!jø]ºÆÁ!: X¨Õ0Ö“x§%÷µïäJ‰×°e€¨]V…(FmorRó¦Øƒ½—qZ;Æ’…*·¾Î,Ò¦­¿éIn\¹·œ‘á¾=cÏÇe+Ó‹gÑûhýüÏöÚ<4̾Švc&O”X¼IP&ñázi+“dkxäpÑ8„‹AE§›P§Ódbúøqe…fµõJ޲yŒˆ©k~;RÁ‚í÷Øs… æ]4ç®äþ! ñù šˆ«féwžRhöcÙü–öÓÃù4ä›/ký@,aê,xËÖæúAnó˜ß'æ<æ’âv ß”ƒ’ EÞ>Rÿà%ïY·¿*ÑKl¯D$HK ÊÅz5eM¤a«ÄÝ~✑~Õ¢U1÷ 8¹© Ÿò·kõ§&Æ"±Óù;–k$tzû{„çÕ¼ÈAßÖÌFz$‰]ùõºwµýÂtCŒÎ.,¹†ÖSœpÁPØ¥hc¶Ãf^å£!–XÞ×<}qcIzÇæ†%D,ÓúމB ¯E¾p‰ÕŠ]å}%D†ØJ’Iö6L4±¿Åæ ¢;¬é‹9܆û­À^µ5Ã:X9 ú•Ћ©‰†³#Œ±1æDâĸˆn­74Pcæúb ˆ önÛ'Ò"Ðæ¢>04:9½Ÿ¼=W¥vP@œa¿ö,hÌŸ~†ÊgØ5*€!^þ¥¹¥ãìÃŒ u¶@1gÆL’‡HšE:8½:_›È-…AÍ‚„1k8eüdæÌ};á¿Î‰º’’’£ÜE{wá:u²~£·§¼ /e¯À@dwœfö f¢è'¢º¤”‰Qå»ÄÅYÌCÄI½æ÷ßòeõ-<cøeßý`TDáô›·k‘·xáY¤5iP [ZvŽ$ƒ†ÜL#8J{ÛäB» ~ð„(ÔËKó¦¢ÊT8^.Š[¿×‘ÔÔDW¸Oéksl–Ô¹SÈ;Ü+Cù»|>àÅE,€5¾¼(gÇ1ØEå*ëÎ8¯— ¥†|6Æsá>z®œ`¹nûB¿8#.su7"R®ÂÿK„gô\…ÝSoxR]SpUÎfcŒÝж€1<;•ï­%í!ik·?€Q`õ3røEÏzE|yý•ú4%£šôö)eHCWЃÔú`×¢¼òV¾sãZó,Ýú—{ƒJ 4¡NIÉï\‡«Œ*s” î `MHíý$÷†—K,ºëàK$×Û–„y ÅÖûTºð0ß#QjÑöñÛøÌ ¸Oû{Ï{ÿÞ¯ l"¤ƒ’œüI.ú÷c¦JíóXÕŸöÉ“W½h¯ ˜7CCü­óŸ±°i¼HHzµäur¥ö^ÀÐxŒžU»Ucñ¡Ðª6ä};òÚ¨é’C—ÿ°"fìî¾0Üa±u¯ñç”&²<:³8½Ü4—1Ö¨_D‡óöˆ¨€ž>ª€ áee˜¯ %ãŸ?I ?P+ö ‚`9O ]VñšÞìWØúöã­îÜãôøzy”³NÑ}öùž¼:¼Ê¿ Àm¼qéГ)Hð£ûñk00 ÎÌ~‡–¯^ã+ÍzÐi…•κa9é©ÊýÀh˼›C©£ó/<žLKî)ªôÝD:pZ([·8p¤Ì¼T´E}ä5£a!¯É˜®kdJSêµ£ÞG%ýv?!žÑfËÿÄ XÿCK£]\e{Bß§6ã”=¹`¥}Ñ·˜& B? ë]°'´äJe×!æê¸`w :Ü©àÑúmXžðÙ Èå‘€é¸+‡à=µ›òmÅ!×}ªd»WsŽ^ƒ1ˆ”à‰EÎÊMËEe)?ßX•SüDé Iœ éhé‹è¹é'Ÿ›{V…ÓŒSÙ:2'á $â‘ËVE ÌZ¿6JCоë£ÊÓ7º€.,N¡í¼X¨¥æëa˜âŒ´ îâãLâÃ|kt³Wòb™ºRWË}Ð6 “A]ü)/w¦åi}_üÜ!™C»‰}™ã|?gP‹*>©•_0Ru‹h5ün™ÔÏ ö‚cÚr;j|ŽF»K|˜Ö¢WFí—ª&LpÐMOtñ¶¾Á®MDÚ”4 ÆlÊFÝl„üÌë Š,H‰Qd‹ˆjqÒf=4Ä~DÇ­–úÍEJdF» ;ø“)ÊÜp©W¢,7hLÊ8ÌŠ» EúÝéˆa(‡º·FPÑéP 7*@Ö©!uæáÚà§%ü¹.N|² tÔó.–P¹SÌ$zUçz^M‡w£“–8>[íÐt×O½^æeþÌ©+L Òà³½5j¡ûµ% ü,±È®w`5w¯9ü _Vê*õŠ ì/Ý+Ç¢\8înlS te`X–˜ßb‡Ö޶®Î8"CØZõ _¾‚…ÒŒS¡€×jøU[}KÕ4Mz†(vpýž•°Åø–ÎiàW)ÀóxØW£u©â8‡Lj]Лë·aëOlai“žÿ¾ƒZztèBd]%¿èåVÜ9ÉøX¢ÊI¨õã%­Uÿ•nJÖ¾ýSé¿*"~‡mdصÁ¶”¤(²U óK ¼ uÉ& ýZÇIù c_Ð"e}ÓTÿæ26Ùr¶éõÔ@‹wR}Lß(¿‰ï^ÒÁ›“ïÑ|˜ípÕƒé°ã–\vd ÏÖ©˜Sÿû#ƒÚ®~×åsÉš&iO)†"L¼Í«Ï;­bbÃr Rš!eÚýl‚ˆÍ‚+ï{€©c¾9µÏ”"4>þ8³ŒÚe2ÅØûn.ÇàäæRÞã¥Êj„< ®FOö¼n#¬†$:fšq›æÚU{A¼Û‹§ótÚ#^E—ÒR(è¯ÔʽÍå —Ð?||†ÕTÀ¨—Ep×ꊠ ¾dR¯Ö6Ë‹ÉÔ›Dl6 9 3ºÍîsº«n©Ã$0Ñê\ àCB~¬–ÔÓš´jéÞÔ©³&6ç s½œ¬Ñv5 ¼~Tä>Ýãl.ŒÎ>ê™Ey[Þ^$‰‘ BO•Øß“·A¸¿]Mÿ×éÃÛù.Ú'°ƒÈO&øŸ¶ú#¯|‹MZvb¾jà“WÃñ¯dPÒP¨rØ]f"ŒujEÕº°æªhA/ò~ø¹ªI»á‹EÀ (“r,YÙoF*"áWmBS*\Ç Ò‹ýuC8Ä<¢ÌTà {„7°y?gÈ>1}t¨ no\ÁXJôc[ï*Òh`5Ç` éod øH0g[Ù_º}U—“»\K.nZe/M¿Äé燹…X/øô¨Ø+ž<1Iñ’{cýq"e<|VD-2”¦¯‘HµÏ«6¶þŒTþØè$XTK±•¨ˆ!P÷Öò.•Œöˇ*!&A;Ñ"MÁòc[šÛßÀü¸Þùóç 5mÒF‹ò¯lJ’pP®FÝáAj{©~cú¢ù­íȧÚúŠÒ¥¾É|bÚ1 +š 3Nª×¼M2Ñb &ú(âc°Q9NÊÊÙø¿ê>¸¹TGʦ^¹4$4 È«»ƒËQlêÿ]waG¦S4 0Ýnö<›Å±½îÐTðˆkúáð×mšwãKЧú°1UsùWóêà_UcÕX¼ŽÛ$~ÄâqÞã8~$êúi«Á³®!¹öíÄyS·Û#AÓø;ªã’Y‘PÄê|–Etêñ”G{@íP%ÿÈ‹1vHÌÕ¥ÏÃO·D*ªRS#cø[¨L:á·,ßr5¼Z™E9nŸpeé²1_Á… ç˜*ë1úXý¨¨š9,)¶Æö‰òûB1üÑzS‡!¦±ýÚ€ÀÍêà#%mázÙ G‰ß4žHËXY=–B­Ccu(—Uì§ÊdFvÛ½°™oÛPö`áId—Ö…¸YžÚxë™ú¦L˜`LzÇ‹ëk¼˜ÍšÆ­öZ¯kXû±Ü<‹³gàüÃÁì½æ×œ·™e)ÇÌ.èO2O »(¯ÙÑl‚uÔ%a+ßçm§ÁŒ‡È¢–ó^Y/”_¦ÍUÛþ$y‚pÎ ¤£è&­÷*ûíP%í—"¡WvmÓVÓ„M µ½E©&/Úè”zë+(â|IÖã…䈸Ûöv@âiýÏá86åèÒU‚ ¼(Tº$þ£¥(!v\  ÇжM1¤òŸv®”7¢§›‡ pEb¸f*oeéMöÌõfØÚã¿ÄŸ€iªÎ gçHjÄ‚…?%ï&͈<•XdXÉHñQ 3L3ì»Âúõ›©by0ú&aE¼^%7ý?›Øga»{ƒé¶:¨Fn¸ÜTÛ{uí]™"•N˜ÿ78e ’ÄwÖqÈÍ{¹·oaø¯ðýMÝí¹Ï¤Ž,&ä,E|k˜öfW/ÊrºŽu,4¼Uf&“gÛ誚«àC¿xøÞ“ÚºØîÉu.•ØË8»³Ë}J…úÆË.-žü*×’ÿ§},BÝ$-¡]w´’ýFÅ8àØ*INõÎUÄpr0%þhÉÌ!U®±ýf›s±»x¢b¼”ZÃõ¶ä1ZÌR¨)ÔÌ:¶éöÎa™œÍî…S0ã¯ú{Øiã1Í}Á dÓ(<4Þ„Z`òd':ÐS)$AÓoÿ]û¢Â·yÌC­Í—Šì¯6äù~ˆÆÀ…Wï:þ±,;n#ÿÊ@'3Z–·SÞ+¨9k`ǯÒùjŸ#ô_”!-Ü•ûç‹/×_³ï×[†Ï8«5—%· ÞìPùѪ"÷º×ìSÖÒdîˆ?Éú»Ïvˈ\@± ¦¼- Þö­l7gŠì·Ÿ'gǾW¤µ.Ú]Å*àu§«”_ÎÃ"ücͲl9N9´ ÇkIðkè¤àšDª[k+ûnÃ&€¬0h›@‹›)H4Ùòáð´ä] bÑ{åwºBŽˆMÊh…jÑöu7Éð|˜ô¹u*b·xk†kFgAñkßÑ+YA•/vžm\-YÓ‚—Òtj•yŽj@ùY9nQÂòè÷¸ ÖJ%Vï1bü•ÐÙïji=íïïˤы*™TÕ$„¿­§dÛÜ¢eÐEÞ%êpóš3›;pEîU‹[,x]á*vfÁ_ÕÊàŽðß-Õ¥Í&0ûxûtZa‹»Çƒ ¢î&ú>ÆŒ·D@[±‡ïñÓá„0?ü‚NA»M)´ºNòïqÖÛ£‘èîdÔ.gΑ9ŒaÎÙ½h=ÌuZ$÷@ÛøJAÿõ¨j%^MpÂ*V©äÔXaµ.}ñ¦ÜÒ܉lóÖK¡HÊhÑBµsæI^žçb…îö²rƒ [ÉM…ÐôÙ79øŽöƒ‚Äuj(›ÓôÜÎáË"¦3úBø<Eé|h)ÈPò/÷5~ ¾š!œÛwcL’yÄCRtÌ=£ÞE¢Tˆ¾ èÃÚQQ[÷+œ­?wÝ„p_&RI¾fEÕAÙWcèÏc¢UÃwôdcXÍ ØÐÄõÏ7í¿Fð±Ç’W;Á½ƒªÀ E­Â–S>V2”ŽÅ!]’ýŽFK­2Ê€•}6ŠÇzÍú#EWÒ‰\šb–½®‚Ùøóí'3fÏ'®IÚè‹ÊAdo ³´×žk~sŠÍžUÙÆ¸BkÐÀµ(Ï ð¥òùëÇÿ­$gL>Iéºï•Æ1•}yÝQkÌ܉¥Ÿª¿É5ßò›^•f ‚ƒ, 9lŒpª§€»Px%ÏÀµW¸YGó[$±xçWÙ ù~‚ú_O?]äMÕIl3©/»Pø)ûNûÌÍ‚ÜðrHiyzóY¨sˆÖöæóúQóußž»M¸…z3i~Êќϕ{í½šô¥·EêÁ#þ9¶5ö+þµlÁSsÑi ÈäªÕ ³¢âÒYönó_]ˆU?kù¨F!L"áu’-y*™qüu˜&JŠrxc`‡þ̓-ØÕþ_ßvÞ°¤„Ðwjò3Žô¯+0LáBà·>ólÒì«àRÂx¸—±b.ë<¶•]ˆå’îà1/ÀaѱNïºÛ¹X:ÎF <Ê"%êDúygˆvŽyM ¯|vnLÇŽjÁŠ\|»—ÂÕŸDû,6Í—thMõ&ì!Lº [Јhgpa/ô–Æ ¤øš|ÿz¨º5ü_ô •¯Á…vM”ÅФŒË¥Á‹=ñ°¶¯$Q»âËB·nXöæµØä¥DÖúßEÒ¦—€>šól¡¯šeóz‘qÑé««U©ô¼4Ë ÿÙ%pbOÁ´çW9m ×Ðö~cÐQPË-±KÈPÚá6+Üöûî1ÖâØãõ{ȆC>'_íÜ}œÔ0«É‘Ø×S‰Ã/È ƒêÇÛ7Ø–”Íב½tžÆÍ£™Vƒ ®ã‚áìü¯É¿ßU¦²Í–»‚½‰è7g«&ÑTOعD9É Óâýƒž‹j7T¬œj“AÞD·mýSò™xYþ뀷B=ôþѧ ¶Ê–¦sî}óCH'¨L¶$ªC˜ùl»:‡™áñ|Ô\Rê#Ìz2@¼µ#ì,0‘Œ¦…ž<Ðnµ“¹N¦bCÉhÊì €NŽ»†Šÿƒñúó›TÀ pÖÛØrqn‘éÃðj<°õ¼ä¦ãûXÛÌ+êôf¤‹øœ2N=Ý,8•TJr9‡:'!ùéÇÀ×­í¡ÅµÖµ£Ç Y ”8ÚcÄ›‘Fº>#·Á\«3¼Ï±Ç&}”èØA—¶ŠMìç7[÷=wî¸%ï>­Çâu±ínö9:gàÆÃRËÇ/ËßÏ‚Èʯ¦ÖöÂë‚L%¹ý‰Y ¿ZÕ˜^ÑT×tǵ¶ä—@×ù¦»ÇCtÒ©W2Ìþ%•¶1OÊ© 'R¤«ÙØPwœpPY‹ä‡¸Är¹èºTé*sgJJ"¹"NÓxn}²¥Žÿx”• XŸ³.œ*¥‚‘’),ôéÿ³i˜Æ>j.â;Ñà ¡3îø°ñL‹ØK•I™#¼2Ž^u󉟷¬ÓèÛˆ»Þ$}½;øÕ|Ýþ>BížGu¸/bQLèû2\ëlg„é s¯-[˜Þ¼ìƒðÿ±OX*²Cl'l}b&EådÛnƒÏÝ…ÏóZn[NYEtK1™«1b—Ú:¯iDMK‚ÌK»îfjÚî0›9s'?DöIškv`êð˜‰NÙ0†_%ƒN}G•År³‰Z¹ª‰³ýÕìGªfëC7\,ͤª]Ù±f„>n¶s®·¬b{¿K9ã/FAP€öäTy-b‘è‘w–@Îî!‰L#/õª.“ÚÏs…M `¾ '>n*ÙÖ’¬ µÙDBx¹\¦xÓCǯ(_$Éòå8™½B:G›°vƒ£bý>ÀnML—NÉ+äø%cï=ÉEåjH1%Z§N&x Žþ ›u9C¦åÜ©žàº-X%Á4×å(L©-ÝAXnr÷ €ïd­ø=ÔE"öå`X’p:Žy«úy£ÅèS¤Õ~ìêBéùvÒÖ+Ü¥dµÛK¾U…4©Ori´/ÐbBÊeö]­Ôíšhýì*‰Ïý™Ê%ÊQ©üñfæ-3g7ÔÑR«Jùâ •Òš¸!“ðŒ8‹ÑÝ^Jµ€3F²…jºfTx[–;µ›x1€yÚ–—ÿ…D)Œòd{¸i9ƒÔÖ8¨ÿ³*Hª»œ-ßׂu(«7ý1gr¶€ñ+¾ódtá…•6¥<0Þn,€iÑ4ÔÆ„êxÛÑovO~Ƭj¤€pêÕ®óÕRó½#%^+ÇIFAh÷ù4 v/aÇ¡Ò É´W= «O!°‰eîή?ÅÕÞ½ÚÈæÿ÷­böw'<~hxÐZòÊÿOvgV`†Oaf“¸Ç{y©;«C ³2ÛE¹ ÊÂàmì!©ŸíÎ*ã›JÎ9¡Ã8¿V3Q-·Þ²o±É–çïÀÙ;ëg- z½^¸W¶f7‹WÃàè0ŠM1»³åè-çd¹S(¦i%”¸ é4Z½SVoûJóF‚Kn0Ï<$­frÿ? &Äk¢ý»²91›†ýÍI˜tBš¢8ÂM™kmùq çˆÓu^6o–AÊ3OEô;™9šš1þ–f˜eŸ'™P—Ÿ ñ7ð#(.šÄ~ 0ùAoÞÍÝî°Ÿ°(Ä~|Ö“»M¦õíÚt±U&„Ô”¦¸ú×ë®ß:ÀPÙˆ°~çsn.¨ŽøiiŽBùýó$(]<™ö²tþ#EY;úò (ßsozΧéM±|I‰?,•Œ5&ª4…ÌoRìD]Ø5TyÙò© Ñ\zìÝ.¢5gÅê™f-ɯ~5¨`û1Y´Ým·_¥ØÎ×1}g‡qxîªÐœžµp¡|DÃܳé.3ŒR`KB{á ˜™ÿ[7W?ÐÀE!:Ì_v/ ´#ö\¼ú}éíhE1>ýÞƒFŒÄ Õ®E|+¾È|•碵5B6]íDrÆ í˜@ÏÔ\Þ©H•Üh¸%–:8wÔ.ÓJyÖ•“el&¬ñ€.ç ¡¼2vÈp³;6e< oøô­áª€ë»1A²ñiü1U9—±’Ÿ÷ß¡`Räw++ Ùü´’•ioØ2sc0 [ó>¬¯ìg&ézÃMɉ÷H@5FhøĢܾgiO—ï¶–¹àm9m/ÑÁÈ—”؈¤ˆ§€’] Ô44èX(‡ë¹kO‹Gc)\->':vAÏWÝ÷ëQÑÕ…ÙDþi­[œ4nÜ3½>'±´¿¶Âá?oÁAé£fîAÙ…×þLå*ØáQf,ã`>Ô‚†+ÚCøÍ¨ÙdrÂóXÆv¸_oº ä7ÃY¢×c ïI÷þ:B@f àA·f*íˆS”eI= ÒŽ°>V!2†6öä,%x±1¥ß » jÚáøóT ÌgXšç(SŽuà±ä¡ ´O_€•î 4£õia«ßû§š “OSL¡ñÞ§èѯü¿uËšîð¾ÆB©ÖO6`wVóJ6Ÿh¯ø ä÷A¶=µÁ“œÀm€J8 áÀ&§t%FåàLÓIF§!j/3ûœ¯|U7Ëÿ“+™Á÷!ª•3©'Œ.¹1èEÓ"½1Ì#É5‚ s6ùÝß뻿À^.!\<¶Ó¶yR±i—u.–HŠÌ¡¡}Úp!Q\ÿ¼èˆbTi~qT´h­êºÄøêY Þö¼¶ù\Æþ8 ¿Û¿ü0õff…³”™óhXµl@øK`b@y." 1öoxÌ®d±[å/E`ˆBûóÑ Vk…ó®–âèº$¥¯W}øÙav‹á)´,ù§.̼Xiªkr·ûRØsú+l8HÓ†£7éuá¡ZQ¤Ä>lª¸†2·AÊï '7Y’ õ¢=WÏ$=+¬Eè*OÀûã}¡óáÐ\f’ê¬áÄÿáR‡¯0ÙsUû¨rõо¹Š $TòØ´To"k('“]† ˜Sà Ú@-Ý0ï°âû?—°øÀSêM´@Óƒ #U݉ Qû ˆ-èÕ:U$`—A˜ø¿Ïàs­â‹ncmmn"pïÍ®3ñtAŽÛ7Èʦ†€^Íw2`Þó0LýúD-çc€V€Ÿ ë;nhaÌ;ÿ d©>9¶ü'î¿—lÖXc¨Üî{Kõö»}e½c;½ú&RYiM’×ß9Át‘~͔Ҧœ™É IÔ¥T‡ãþb"t³ÓñFí—ÉqüY]©z¦Yª¢¦.*WÏ&Ù82xæ×ȸјÌK†e¦¡C?{üç ’ûÏîXfÚt˜ÕóQBo¶ËÎ=:M äù oô§4Oœ q[WÀéõµ†*Õ[÷ÊÚõ»¢¿aÀÑpð,"<>UÀ>À¬hÚš´þ²VŰs´/ÚE÷99°ÏjnìvwªköÂtƒ'³8¯ÿ/;Ð×€¼7ÍÌ;‰Þ‹`FdŒdñ+–\þ&EÁ÷Þ{6Y1ã!T…6ЇÐôÍÅEá ‡ZÀk4±ZtH·ÿF¡+ù>ÄQNb-•ßR1"åÃF¤U‡—-yF¦Ž•ürÌnšå˜<ª‰¶ÁDÏî ôJ¯ÀdXSñ‚™£×F )ò¶†¤ÞÑ7‡•Jئ ñ„F°»©•VÁ¸d¯êuæEâæ'ed(º Ù=6EW*ÈçU,¦ú‘KeÍ Å[¤vìÉ|’úˆÜ µe>ôëÐÔg\ˆ_ç÷Šx]²{îPš)çڧ¿y_L¸´0<$¿›bBUn5©àï[€ƒ%¨ÿž^Tˆx’ÚˆPR Ôऀû%(&ÜŸ;þ»)Úñ‰Ï¯õy„÷W¼1KÕÕ’6 jÄŒfipÀYJ°µš¬¿µËŸú–ô*¿ÑK-)þóëÂÇ;é.MJÙo¶÷ØÑw`d¹ÓãAL¶\yˆ•ÏàÐW©S5‡¶¸¦ôê <*ŸäÞ‡8ŠÚ—iiþSÌdQhßÓ¬–@VCÖ>]ñ3Ó¿À?›—jî¨þ®TñìïÖ_1sj7“oJBíÎEgsS´'ƒ¹ø)p$V7pcŸ[.Ù"m¶K:–v[M–_â>ü†À嘷³?`TÒæý£†æßBíÈõ5\%ýªÁô¼[z8¨ÔQ„ûy«íæôC:²ß «+4yô¥ Ži`þ#ƲØÝü·3ĸjž;5€Ö¸4˜V:ÆTÔ8fúk«ó$ÇS©BGá°ÓR8´]ÿ_Q[S:'£fµ®®„Ï éûrŸ{ðNßÁµºdÇt˜ýw¼-÷òåFúžåÓ^eÚåÒS£­ÿ8Ç‘p¼ч|/*? NwIo°P#÷…¥Ö÷iûŸw JªD+-õûz%Þÿ+‹ÿÒꇯ™Ëpt°_bS½–e’Nü«_ ›/-;ÓÿiòoÏ®:w—Ïý¢ù¥¤Ž™³ƒâ MUØ‹öý4¾l #²a¯K/á~×KP—õFg@ e¶Øµ¿xè+™ÔˆOlï63{PåS½‘Œô«ÞÁ¿ÁË=4±gòüÉ>`%Víûýy°¾»˜lJ¤^³\í¸7o!`‚ÿb$âp‘Â>Íå &’°ŽßïZŠVŸ‘˜ X_8Ý8ðÜ R)8y挞準)ˆ¥"ÉÜVÝý/wC©â Wù1øÜ=C…@¿…¾,T´#µ®ÕÂX›FRc’Îç>ì‰ãe]a+õP°¶Aùo? W¤VÓÆÞÕ",à–%q’a¬–ºÁ ª)_•±ˆ«˜š£Šˆõz[ö–àGÙ,skˆ÷ËóV×ø÷ùÆNñåé.Pvb2·,õCbÈ,¥OcÒv¦*Ë_î±UÖ€J'%m8ÀpW¹E”vêãÞe¶„Ю»í>[ÖlŠˆâ¦æilrðPØ@†ÑŒKP:¾4_mšx«ê•Òåô|g—¤†…R©'Œ#zÆÏVKkI,Ý¡úZv¦RÂXÑ­°çÈv iy™sŠzÍÏÓì`/ëÉœÑP6RécÜêd—A+<"̃ù¶vöB—¿ìÉïÆ‡§sé¶ÿ« wÛ·öTþ+ô+ÞèX û&¦B) þœa^h(³Ü£Êã¤~inÍ¡6õéÿ>#]'¨G~ƘŽ>Å·Ä\(µ½Y¯*o¼ìhä@½$þ¦pÿnSñ"+§XhÿmnD¡äØ|ü¡‚íS{]”¿íûE37Ò2~ æéK-9ÜœúhnÆŽlˆ]Ò´áùèŠ{û³ 7©H<µµÎ ƒ+û·=)ÚÛãń˹€-Õñ ø+ã“Ü%XÆ»åsy†5IÇ“@’’2Á`úèš#ð0%+Ui€7X˜ÖâýNn])-Íì¹vtSѾ©žkªl\ä µÇ=¶îÀA#£µºÈ ™_· g DzpÜw–]“¹6¯ ú\ìŒQæpwÌiáÇS³²`náh„vqÑÏÊ[Ö8'§4¶`(Ù%/J•ꔫ=VnƒÃñxñ3k ×0 \£Sš ,OöêL–8»¢;<:krGXóOÝbxd)_•ücÐ…&áïÞ 6 éNJˆqî0Õð]!+ïL‚û¯‚ÂÚgQ7Ãý22N%ã¤Ø®¿qA{nd÷Nþ_HCºÉf»¿ÿ£]}\„çNm ajåÞÄ ž\ÐÆŒáõ0Þ%%.³T÷ÇnÐõî }˜/zÍÀ^æšíCËúÞø2|èçKÑ»ôAËAÞ»Ûè‡]*C`ÇFŒ8‡8ìAX ¼ ¡0†ocä µÛ›CƦçƒÕM)í]º_'~kŸQb¶uu0Ë’¡Ú½……€°¸ÝªXó-Ï íh•_‰Y’CüÏ í<®ÿiñª¢ú*#n;–ª3v´øàî”ÞbMÛ|³V Õ³¿6—fU|:Ê"ñŠ´Àä` ®1Ð'R6 ¢ëÓáî™à d#œ÷ì@I¨œ(Øý䨆ð]˜kÕj UE¹ïãí(þVµ¤#öu[TÌdQ,ŸG›$ådžÿ¯ÿž„ÙÊP’xˆr\HÅcP&•—ºŸ;Æ)åÕ{»p®qpÍ—õ3ì"¯&;S;ŠÜr skmÉ5ɱònè['s5Ùçüâ<`¶~2ŸHÅ[Ý·Òwܨ*ÔjJbËœ5—ìûw(= Ã"Í ¢]‘aÌ'9  §m5¿« Cö—I#¥…VÌÈÛî^NÓ°Ã6ïÞqRD.ÚÏÁŒbÀLZ t•&MˆH Òéä¶[O-ªÖÓÇkÅï®ô%ÂŒØÚf]7€Uÿ£€åâ3Ù+ã  ·QoN©"]Ž­"™Õ³¯Òó(òjùøxaÇÇ©LAÀHó–«àQÕ9Œõ3 Œù7Ò÷ËŸ¤Øúf©\ໟßÀ² ÀKð¨tâ@~‘Eˆ1Ò&†éû‚i Ãà6'~ƒÝ:|0ffù9Å•…rŒ¨lñU¥Æ ^n´'w9ÕP¬j2z½Çû?rÈý‚ôa£¶[å%ÔjQKyVŠêß”uU¾:?Þ?ûíÁáÒ(`+š0öƒwõ†FD¯0©êS;hkö2T‰íM²g.Gúq"R¿è—‹ÈÆl W&ïYõFŽ´ ½PØm±;uòò‡WÓ#ç·ï}ºv¿)¼²°šUGŽCý¶‡ Z3ð&“HUxž¤§ônb—êSF+ëž©a¶om] v”}A Eן_b=y2Ei&ŸjÔéೊ>2½ô鱕Zs2 …ïÉ­xˆ”biUc2ÑÙ&äÇnú1 æÑlPjVØ:¥´'ÎÔ1ß]ÕiÌêà½EòØÞ´Gþc쓬TÆzw7µwìW+ÞSc°°ëpØMÿ˜ý£Õj‚l­øb¥”§XÑDØÕUžä}µƒ†û‘ôI/pýWÖÁ sesÒ’¡³É<‰i¡&b3ÄG¹²œXnQÔ¸Y[ÙåœÝމDdhËϹÂ@vDÍ;®E±i,ónš⊓¥#jý1ƒÜã4ïTPÝî Bë gç6¾SÇ\d[¤r‚1šÞÚÑÈ"?¹€ž( -1oOÓà Wõó±­¢B1dGUº:9E}ÄÓ¼R~Îm/%BšT:6]Õï¦Fj£yôúF€©ÕŒZ7ø¾·9ªÉeŒ Ç+:Kbƒf‰ ÑÓðzp­¦ùˆŽÔEvº\¬'#Ðeñ0{À‚÷$îì©~÷pc™½æXÍtZ¸P]ùLi±¯"Y$†ìzh~1iT<¡¨<°Ô§a"* ÒÉÄü=™Fä%Oò©¨­ Í…žWOÛÔxÓ·™ä¸¶Ërüó£q7ËÔošâo©Ðþ Sÿ]øž–`¨hP좔±ÓûY RO‰:¦–\à\1-]»’53:%61£’Ç«Wâ÷ uiåw…á©N„M>KMùH‚-­!y™fãkDu iÈ©9(Šl¦  ‚ú%`[þ. .¨% XS ¦½ÛXòMIz°nÃZæ)‰¬w”=I‘’ pÒœîu8ïV-yæŽXæC­×mW½ø¢Ó©ouÂ?'0° aú¥ÇXäÝâˆúT=¦=–­ºÕÿ]rK‡¸úÀ»ãS^>J¦ëo šá¹x(Ч„z5♸wþËò³z·‘«÷ž7Øû é0;T&Êš¬"j`@74õ°«ÓÖY”‡ÝEEgJ@ŽÔ2è”P3íÌjÎMÿ4˜‚~r¸DV¿þ÷Ìb}èÉL'@iÌðD^º4”W¹llB ^®ð"Î ÓVŠ¦á„ ÈjBïÇnëÇ|Œ­R¦só‹Ì]ÕS$:œòõ=ä;‘D|7.D¶RhÔ¾¹Žú¡îãÚ$tÑdìAåµù‘ ¶´¹ð~4óQøLte~—7kBµ?]ð×'?ÝV.Õ,˜lã÷…³€\žg^ÅWR?Ë̸/E }±)\“õWK|m|{(I/ fµ#~U[eæÏ5FEYP/†>ÜS º›Õ¦™ÜP¡þŸØ2Q:9‰ÑÆó¬°QôôÊ“LÌ–@ P†¹ìw»Y\¶ èh—ÖJ8öò2±ÓëÜ&#þ8Hê·”âb´ýfäœ:K>”Ø y¥ªõ¯4¢„PP¥omô/iš†L‹‡Q²cT½x¼šÌÉ›Ôó½k‡}¼$®;>#¬+žMÁd*øXoë¶7¢´v/ªp­-vÞ‰QÅ5ÁÕ™ G’c@þÅv0 Œ¿iÏï»=_§~ÍQ»ò-{¯T%9¿‹ƒéD sqI!’OJOtŠýº0y$ÿ]Ðt”QG½ç±n¸¬ñl›*ö™ à¹XÝýÒDÀˆÃßÃùÙ¦Ïì”ÝÍv‘ÉD%RErÑ—J;zI›—D)ù‹O[ÄØÞÚ>‚Í €fVMàÑ‚6“I峂n6 oÛa¢wš„ÁÚˆïÞ½âv!=:þÛ^UPZ¤„äX.úd0¼Ç©Ðº°6v¦nIêòNš‡ xœµ&0{駨TXZ´äŸDó3÷Ÿø&a>]ãOH2ZAô1§Ñ•åè\šàñ?$jrœn³¤æ¨…lnJ£û×Z‡ þk´ QýoBÖXPõÆâä< ’M÷}t–ö!½ˆûð%%Štź8r¼£–ËÐíûû£Ûÿ£”å§#j¯©¼2H}zçC®E™NÇÄMá%÷§}e/¦‹‚¾þ+U}݉·v)x˜ó½|à-X›.yËZ ¤æ/eæ²–>õ«šýÌÔ’¤’1¹VÄê:V×»æœ[ä>÷þèW¾ÓU—Ì6Æ[9*je(´æné.h—G*ù­yh<Š[Ç"\°DŠ¢(;µ©á^|?ž ŸyèA€:­;§Vr›Õrį@ç˜õ)«ýp®Püß ÈêðÝà%—©ÉqgüþËÞÐÖ2§*ß¾›g€kW£Ý2¯\[T?´®e„)³¬[ÏÛz.ø7«8²ë-HHlv Ñ„‘ü8&C 1om#ÞF„†)õ>‡±Z/矞us¬}оROØGØJÔÄ÷ë3­%¡hN{)¹EŒƒn>÷Ûv 1>”|™Þý¡þçã¬ï´qVx`8>0ÿ7¤®qÎ×[înÂF†\@’¾rtœ÷È ÆJŸ•¨,ÃbÔè ÒP‘ÐÀïôg9yïDAAhü Σ“PFØ&!ý{‡Ð Ö‰ø¸/)¼4¤‘‘r ´Ìæ˜Â ªw‚hTè(^Lì¼kU`å{§KÔŠoÄk»„Ê7“øxÍ6ná$JõÆ¢T’–1 ʉ…ì—M¬Dðm-òÈmðâ‡x ÷«gZŒDÇ2æ?„Z'˜‡•öäy0Çy‡X¶üº7 J¢åïžâÕ7ÔG¦>µQf8Ü×Ô vEÁ ž£ÞM:ªeÒ¿ÖNaÄo/ž£“̨[÷@’ÃR˜ÅCoYæŽÑ3;´KÍ&ë×÷jÃw·#°ìÐä›VÌ«ÜUd·2Ã4ãð†2 õ]KL®ö=nKŸWש»Èu‰>Ìf­íZP VÙÒh¹ßÑ•úÌÔ„>* “ã8j>Þ gMTÚ´¤„-{¶”KÉÍ…z¾¡¢ö1Sœ©ô+mZZG.Âi !z»”àÿêVu¸â¤ï½’zà?^дeu_ÓõXF‹ ‹AÆeêòåå—ŸCõ{*êwâ.±zªõ&¼"@mѱe©¬-¢¥ˆô:›1[¹ÜÖ(T"·?‚$ïú¢V¼y5¤þeIN†R8æ{ ÏM–¬4ëÒ0<\¶+žêŒ±Qì±¶‹é9£aœ!‚X•à\ŒÕð&T¨%UÉÒ*÷ò[ßÑÞ4DÛÊ6ñ^+Á£gÚÔê½Ð”Š©Éà˜¯ñ\ôZ–MÃJä'z«@Ëê3·œçµ`Âû™'u¬çËö³WõÕFHi{8ªáµ?".¸Oy)LÍ„W½‰eF…l\‡}1 ëÒ­e,]›˜Ä4 ùDìÇ*Ò`à7,•gÙzIÔilRêàú(åÈ$òz«h£”åÖÆ­O¯¡ÈüOÊúИOý#¢¤Ñ7~õÏ™äõó++·û„!'mýå´ÅkªßSÖëû!ª‚B®h²eYA‡3©qèe¼A¬ß©ÇÜ„i¡=üõ£Á鼎òæÉSl¶óŒË<ðdX%¸èFFCõ ã÷ÜlmvPá=ÉB½ˆËüû£hÍóÜÛ»­[÷½ùf¿cá¦ùÔîAÚ Õä\K]Xiè “ÕŠâï[nƒƒM®Îð"'HEAÔVÿ9Î*Ø(Dîµ(è\SUºh~ӌȃSe‹ŸÎÇg†Of<Â’¹Ñçžè‹ªÄeÖ6¶ÄXœ4€èb ¾íŒS 4©yáú Ëœ„ þ\]B,-$ÏmµÉ< {J%Ôœz?Še¥Ï˜ùÀ ø©`¦ªÎPc†kx¿°íÇJÐ΢˘ZL«àËÞe9 ò)ãÊW ¸Xž8 6‡ïQ¤‰B•B×çãTÊ`K•÷ƒÏÀDߣsHFd½Õ~ñ‹Ú¡‰²p#LKDHÛ0øŸ¢—¬¡)¤Ä QyüŸâûûÈ'ò»ú{˜ œ¾Ï¼p†u+­Óäß9Œ\õê³òDŸM¡—ã/拳ÑXS¨…TlïJ_]+…vvÌïƒ9³BnšxE1Ÿ]+×§±%íϸ+šûøÕÎC1l^®ìq©Ž]È¥9°¨¶‹dÕ&»¸.µÈ½xrk6‰G‡¸S˜–õן=~ø†’6^oG£xî†á6¬ée®ÌÁ›}‰)Ѓ^jmž ævY¦Û;˜h›Xs8qÞ'`obë­15‚¬ëî’ÅѾFmät%GÎþømÏÞ‚§ á¤Úâˆjê¨W fѶQëÎß9'h SÉ«møÁüŠ«â+É`Gq8=¹‚™6ˆt_Xj)M‰° K_å46µ9±PÕs¸äú«X~¡|³é؈“e1T‚÷ºIvm‘ç7 N`ºT(|²õðÞÊ4 6Ôñ: mT½u%!Šø-Ûa²,_Ú‘Pñóm¹e,Žœ)ß\mæ/±¡vw;âYð¯à(Œ*;¡UN8YE«ÁyƒF=jxÓãRÝpnR›/müZWùlqõÚìf¬ƒ˜é¸ë¤-S/¤ág÷ÁndU_–²á à/ vLu»­òE•ŸÜ6÷9'Ž÷¢t©ÚeéZ«Ûj¨šŒ+5+×ñƒ©W>q¸¾hæ:O'‡\£‚ä•ÂŽ0¥²Õ{À˜`Sa½ÕÄ©yEé}êÆ")?y¢yu`BúFf ˆéˆ\º¾%þø¡6Þ7Ä:oŠ%6¤®>ÏG HUè„6œt×(»Ÿv;0JšqBB¡ád=Áµ¥3»$,EeË£à,—øþ ©V ÜíJ¯?ëc©À€#š ùþçË–VˆÚ@MñÚu%³½æÏ eŒ‰Ì¿Æ ýÉíúZGƒP?†¸1Û"í¬+øo¬‰\Ìþ)ÌӪˌZ~O¹È§b–@÷épllh·óúíÕõIxÌûcý5‰²®»ÛX@¢ÒÐ̉Õ×ÊkÄA¼¨lœ¸ùý·ã,êâ©£ˆn¥·çß»¯L/„Í_–y^µÐ¬v¸‡ÙêG±O2¾Qö‚ŽBñŠbxþ‰Þìð[Y¯;‹å¨ý‡L˜¨o~©,n¬OZ‹‚†›õc­]s¶äõÿªx¢â<\ BÁíâϨ>ýÍ%5X¯_(&´®Ú‘¡Ñ!2f¼ZD«2_ýt.„B¸7ž—Þù¦ )ƒÕ‡æ=­°­\ûĬ)W4DZ‰;_xƒ0_|ý@¸À—#«9¤Yr¬"Ì¥É^ÿÀ¼æA^­ j½xÄôýi%'½—Žãà"È£qÝZ@‹éGdzŽ05jŽ-KûÆ6¤,j‡—‡‘q›×.ú¢Õ…:°íG«H¯ íËM7vs¿µà²凢Î×Ožñÿ÷(Å^qÆ¡ÝÌ'ï<ÛÎ)ÊtE=O‰ ŽÔ¦÷|Ÿ6Î_´RV†_¨±ö¾z€Üs@OJÞÒ]ضzÓ^jü™²%6|ªìøyÜ|ΆpB(ʽî¨waQ”²Ï•eÔÀºŒ²§†µ‹µPÌWÿ}•Òȳ®‚@‡©‘­ÃPa–”F|«b'ïuåVÈ9†oD­Pq`â}Eº?sÃvGÛ )µG1©H0è~š|^zÁ·Üؘj,C· ÄOÏ&¡[V¢ÚÎ7Ï­W'Õ> _‡O¦u­‚¶;¨¡:’žè¤¾3",ÀôÜ2ø3®Jwâˆ*{Ð.p´TóïµïGaòõq6|¡ô+-eFcxÚž¼Ç½øæ¯µ6SBì}›Š£æÛšQ8M• Tq±Š]:üœ2™iQ ÿÕ¶‚‰ŸÐïÉ·#c%¤/ò†€äÜ@c’¼¬cïŒC# ö<²#mkÞ=Û8É©Éêñ¦U2¬5Zl<Å 0p1œSŒ¹>oXQ§ìQ‡â£»êf°äÝ]Z›5Ô?±qÚ5‰º¯¥^ Óß:ûf}ÞæÎ $ÎcãM³4gÙ 42¾ò#ñVkñÝ>dÕ*‡ÃHŠnyñù‘†M3ûOÁ]±õ–4ÿÏ/`‘-Ñî]8CC>úÿ˜ÍÏ«àË…–&aMÓë”/ü$@‘¢ èL1ÔîCù1œ¥üþrn丰'UZ-d†)&»œ}Ks:Nù2$iìfÿ‰à5·tØMNzXjRǪ¿ñ?5à)þEÊT°F-˜çòtQKrÁ6nð¿ŸG§R$×7°0üàÔó‚Øö±.dê»âÃ|‹–¼u¨c»ˆ07´¨5oz}HâU·H>YÎÃ(¦-ÑHë-ï+†í‘¼a«ïdTRþTˆX‘3jÜãQèѽΛZuBÂz3!<ñóaIÔ@X»º-ÿ;PÀ>S¯íŒqœu8³¦‚àŽMòχŒ=Ö‰#ÏÊ{cpš&´K(ßbß×V#htJlXgî€Î%â븡SGq«Xâ&vÜ ò¬ž³¨Ø‘Sf¾A©V8Q?½‘;nyiÓAî¥ç¤¶ÖŸ»2±Qg¶‡ÐŸb· ®aA­Ñ_À²àSçå¶´k}Ø p·ê .º7¡»Ó‹q3¢Í&4òä›þ§”ÜÎ*üø`„™CtÚÄ jg¿ÜÎ|˜-¾kµu—ž/žëìOD%kÖäì<ëÁ8¾P`ti7,JòA)9V# 1Ù¶åÙÕ•·‘Dé—Û­î}¦€`Yò\³‹Ћžño, PŸC§_8®°ÃÜÒyV$ÄX›€zcYFŸüÓEŸq*s¾ð5àŸ+Oüø2crcKèd‚Ó¹döV@¹KY”øìöÑcSÅþ´‚’|—h†Ý±KÊ TÔL52ôò¥tcÜ*.fј8«ü1ÉŽ"'¿›îDgråyr/R§[(3LÞ`ö¦WàQªpúfkß<ÞÄYPð§ ç:xŽèÈ8ƒ[ÜÊ“|º¼Ç“vDmgÓÂfq‹Ìbö“6J`!ÿñé9ž;~C~¢æp„;RÁ){éz·yËXÅ«U»½‹¿¨8Ðg†BL3Ô*$Fÿ,½t¨n"±Õ±àð– #ù¤àÑ(é·ž4\T3‘\_;nX͸L @•¬RÌ ŸºøJ‹£†ÒPäyã¨ÇÂŽÒÚ—C…0]ô‹¨çm<üé}ß…ÖêwÅߊ­*˜z_lÑM¹ä |®y'5’à™ ïÍ«cobüé¤%¹U´Ïn†NVÏ[ƒ~×…”[uMè,õù«,Ñ–7W[[ «µ“®€¹ z¢›¾D°6èJpmŠÿù0ÏÈÙ’+“Gôð;æcmé× øÿ‡×„nbš5—tÝú€C\9VÌó9a[fÄ'Ú#Ðdî7†’$W”^×ÅÚ©™2¨è°²¸W³­ø#pʯÄ*jášå¯×Ò±÷)«Ž (ï»<ö§Ýí=‘Íf^©Mƒí})hÙgyôç ‰rOØ96óóAî4§y¯;c“¤9Lrª'$ø5ö¢¸ÚQû‹c༟Çy¾ë÷½nÏCAÆx#s]ßÙ`GW;Žö*”‰úÌÆ;6düT^—˜5Òv*uX"nG„¹1ß (ÑÆ¾KHâØŽÅ”_E¼[#¥wKB°™Ôxï¿|â™ÙÄðÙL˜@ä«°«`£H¯°·G²ç)¼=¡‘|2ùNxq@\·ÙngLØTË€puj ¤§OÒ=¿l·qMé7ÆZZ{=…sQw¹k’4Œ% «l¶1X+N:¶“ñG§x¶Soµ°ùí–ÁÅÏMT¾åu@Z­(±w§xÁÀgŸXúGvC±v3@ŒQåáÍfª@¬ë^•*‚ú–VSäí—/ àuÿÐF 6LÞtßDˆt¥}ÀFŒI¥R@°«nÅ€uQƒä¸Ø¥j¯‚ê½gļâyn‹åŸ<–¦à#vÔáŸ÷$þ`ìôᥠ.Üê€LR`}{ê~µñ(s#öØk9k‡yp"·e Égc0½fëy ’¶€‰nÇÌó zÌb\+‹Â0&ùªnÌ €]0OäÜÝßv*VÖÚéš´±ù$…ÿ.Ÿ)üõʼnM%m#ëdVà0A0WÄdKäŽÊÂÄF°7ÿtMÃþh"‡…v„ש ícêú¨“yMƒ^ȳeç³Ù#Ö–MOf¸4jÉhÁJaL“˜a(t–Ç+Þ#ãÉ3Ì`9¯ï.}$*Éf ÁeŠå‹@|ïÂäÝö ˆ$k³°j ÂAiJ輇Hö*Nñªm—Q”B=­y "Qj8Ïì-z[t@Ž=)ëšÌ¡$Kó(†õ¾b{M„$µíiF»¿^x{….­^Ñt9ñòþe4b°Aéõ±^ðHrµÓŒ]Î3 zp‘Ø>‡±égONP3ùôµ‰T5¤Àc«;Ÿe®K´éêô¼[q ‹(/UìdlJÊ-¿oy…HÙî&(H|>­Úxø­^ØIsÍž{Lþãèd a.ß¿¶uÒ0ÂÊÎ }Ú`@VPHÜ9*ÅÞÔbãçªÛÓEݰ"o›§¾FròÌÇYšç¯\I˜oò*øF¹L¼žnhã‘ôì8ÊŽÝ*2LU°cà G0Ï“cÝú]˜^µ¦õÈÇJ¤j¨©å^ͱæÛzeý×€Z jÍ®•@œ¢Ôê)£~`¾lÃ<ô2æ0w?É^ò>Ë~dÒD,»à±s™ KÆNê'\WÂbBï 0I„%:ÄÆÜçgÔH&rˆ´ÅÀXC¢¯ª™0˜×‰îO¡Lã¶À3Ô¶ú¨Ì®ùf®Î“™ú92v#¸© A ;&7 7u¡LðJZÙ1¢$P·ªòED"×Ù ‘DÞfÊ^®Vrî•Â/Bâ\_²ŒŠTØ\”¹ÂÛ/]•Xð?¸|¥-=[®€õÕ6ˆÔKÉUûz9˜›¸ò¢Ë9B¼U© $.«–êw“ÜD“óÙ6rR»wJ¤¼ÚzÑcgøn*òà¥$—–p„TG"Ùã¡ Á2¦T>^¨xÒîoìø=¨sT©äœ2X®;™0c¹îô€ˆÛAs¯#G¨~2DðwíÕêͶ_· ¥ ÉfÑ)eyÁr[¥ƒå¡íÉô’ž¬vÂ\“jdi±Üë5 £Èub­1Bž“”’"ÿDˆf»©½„@1Âr NWFx›P²‡ûV‰#ç¨>ºÙ²…˜dÄi§ÊŸv0‹ûÇŸ+àJ'võ*ßÃm=Í H¿F/öúîW1ûD¥õ³â¬Adªå+T@øô¬ˆ™ê{ÿ<]›#1åE/¾¨ø»Ü`Ô’t3ST Ä.Ù—ŸGð|cxA©‘’IAøÐ-LÎ>˜=;ÂÈ̪Ñ@°`e¥l•ÃæÇ)¤hµŸ‡[ÔIo‰¾l†;xÐ&’[BüzŒ-iLUgÆl«€Æ$X®×ÍdÜ‘@µrÍ;~ÇæâöOÙûÚ¾›ªÍÔRÇYî$› “ˆþcÚ“00²Á=Òζ_"†®Æ²¼¸M‹ãâʘFj ;2ƒF´:ÆÍñ€ÞpwçתØöL†g^‹•áÛL8Út[D™ YŸþ²^ìR¡hdO‰Úó0¼Ï :£1 ãP¨4عc³&ì ¤ïý+=.ãX0þ-*3ÁÎÄãH¸ßÖ;ÊÓ>k®$xðF·¨ØŠÊ¸î¾Ô¡ô<*Á ÞûÂ:QjUsN©¹NYÉÃóE(d|õWÑüáÀÇ}òDXÓz í߯ü›áòS,z:þ%@$,N9}ÍÿÃÁ2vxã›÷)uŸZ£@>†õð ûäKh…g·MlxÓj Ç[Âó‚ß[KB—m\õð6àúþØ?¸k$Rž”½‡¹h]ixËÿ‹DqYø¸wƒŠš÷ýů!AŽÌ€ýÛx°ÅñPYDK{‹,¸ÀŠ$ÛŸ´Õ°Ló}6Œdl¥s‘Ñ,E ŒÄ®°]Ô˜‚aqÃŽ¬üª2r]Êù¶ íÛ0ôýzäòZ€²Þ Ax`ÁÜ|Zk°¥*ó¹?¤DG¨Šs¢Pƒ»ß‰övq‚~¿eÊùúXØ(é3ë»Z{;Ýÿ//{¯Û5P OÖì~Ur{Çð´§™’Y‰ŒŒ.#Ãì až4‹ªïçòi^8†x›tT'mYÄ&ûì’WM-ÒnZØÒþ0:/ñÅÇõ’Cžõ¨G¨3’/ßD45ßVÅ>í¶¯öPáÙ­ é:}:tG_ÑR³¬fö&ì—^ó Ø¤®ek1Xsa”eÇý%ͺgÏ3ÚyY PIAÆ»x&ìŠFG°’Ý!ÌH¿ § ~Íìý†Ú@y.l—“ÜÃÔx¶PÁ_š¶næ¹Ü7æÞå”êçæ>!éKdÅ_ù6µQ)¼ež7ï2{Wæ%³VMÁp\ úQàŽÿ\ÝAƒô’Vìñ˜|˜hÉš€1‹Þ#§2D§V¯(Ácø”¨½É9fn /$}€Ê¾¥^õå2½Å¨Î1s"µ“¡m낌|€õä7Ý‘•@ý虂¼þ6¸›(:’ÏÅ>-n*“‰9ÎqÀxî_©¾…)§º y–Î Š $¤›L˸‡#¯/†³ëÑê\áÌm6x<-Õ5¿pÂöb±qõ¨š;œº¡§IÓ:}à0ͤÜ \m3M<8QlRž“Ùã‰'¸+³0ƒ„+´åhÂ)þö³Ê°¾1ýãôz)ÎÙÓŽcÁ—Å ´œÑ“ ^gÓlÑJTòfÔ|{*±¿Œ sŽð> K_=y•´(ú)ƒvIXº âY:’b_†þeáå×vÛ(C­E¶žuRòÓl¾®ìø™ÛJˆ<Ø7ôÛð׈OÂ7Ÿ|]å4ÅøqŽVÐVç±»—¿ Ô²A¯Ñ‰PŒ`ú(k­®CD¦ƒÒ4ÇÝ$pjì¶RA7µ@mÏDÈ’æËa´¾uúk0/ØIYgÂÍ©BNþ;°Ñ_^~èä¹7JÙ¿mŽà-çngJòp,_Ÿ±Ñ™…LHÉ€b…1¿…š”@ž×¨@¾B¤ÂhyÆîÚóÏ:“œñ¶X@xΧ}¹7ƒ¹팧"¯Ö/[ö\òч„Q(„µn¼¢¤%óÍ¢fl1ÅLˆ•þް9&¶À“µ*\]Øà‹xT%euIÈ;—””s?ßvåZÁ§Wïß…ÊÞY¡ƒÏAÞæ¶¶ÌŒà2nÕÈ®•ΛU±ÛÉꂟÛdàžQÍÂ{Ñ4õ9)ÿôQÉŒeíóV¨bÔˆ½ƒøCÏîÍðÞìr@›_„„‡›o–6;£Å$4ìvºÍÃËfÃlV$?j¶¯aÇ'I¶ÌRûßÞ¥rk±©Àñß„ª©¨Ÿ¢tÊÕÙ’9­¾>׳«‚ä±È\ÐÅÁyç¬À]C‘Žºßzfì¨eŒmë–ŒN@µcJ4%[ôz,ã‡å}‘uT€/YÂê±BBTšdFÁECÕ¡O-Œ&dï+FÓ{*,G‘VœÇ£Ùº/Ê´â¹AÕ3ÆÑÄfÀ20ÊÎ:Emòó%è!@³rVš`BF Ã&$Õ·ÉÆÆÒ”£ÑûÁ²€ëE7çÖÃb²Ùõ»M+õ8À´¨Žn™y w%†3ëÒÆ}ÝÔ–o-¹œ÷Ò\¸ z­CK8”cl'à‚‚w4£A†„ø$~àûÈiúàzY Ÿa)Ú˜½çÅS¨¤p"L¡îÝÅ—EÁ€\Ó4rÿ"¼!,n‡•ÁþÄØ0úÝÄ æï”I8W0fxû¦¡®8× /BfhD À'œ˜º¢ÚÌ_ßb´QÚ*/h)ú`aíÿ]µÊ¡e>ôT7ÄAu}g¶Jô2%ôÊ*±Ú);a(>}0Q‚ 2O’7Ž»®Iùlø;¦ˆ|Žç]¶ÿ(üÀö(zòÃÌßN&½'/ƒOþenÀE¤Eš l"¾Â=ö[PúCZ60½ùl\ÇRL ˜$GQUàÖ![èÀX¸¾gäq8ïÈs’p{}$Ëyž7jx¥BÍBˆ|ðw´VTVèôb«õwuˆ¼µ½^AgV¤{I‡þLl')™³T“Ǿª&¿àþíK1¨½9FoY«¿PØMKżҖåEÖ,O Ýh6‹_-­†p–J5Ÿ£ñà}Ù†c(^4v@)tª6¢ÃjŠqªf!w§6­ÿ@­©§¢êµÕŠü—Pétøî!'ÑC²™à»7¨T~kx]΃mùeÛ÷Èï&59Æ'÷ý4•zŒ·)ãï`F§¹w£qvî"U–†ö–ª@¬š)Eœô#>Êî~I#ÖveÌÑÌS’gÔÕ‚h/ä>Áƒ|DQ“‚PÖèêBÏÆ“=J}ûÙW«U®ûcÏ‘þݽÿE!˜ü3ÕCQeêšôÒ§ Éé$túK*†’…ç¦B÷œØ†WÕ»mhOѦsrK= ”6v7~pUÀ.¬ÖÜ«8éÚŒ²F”{o©Få“%Þ\*¼špD"ˆ´€64„ÜAz7ð2ÃÚ½ÀëO ‡îÄE m’“y–¯]åÔ6sqù‚4@aŠmƒõPJÿgigwób S·­ ÿåú_ îsŠÅåL2–ËëÖe¹žÜE ­¶Ï¢’2¶ÛÏÓ=B*Çà4õOó${‰-¿/¥¶žÄ%šðmNÝ㢤¶÷’ˆ¯Hì_ *í&™£%><³Ì¡±ëú8Xm·³b˜Z³š½|éQdhcSyb¨xmüH?=+¥4Úsq~üÂSŒSù‰ÿ¹µ’£‹`‰d࣑|}wËÅì/ÀÐß–®WF_å³eVðÇ=˜?Ûƒ$å%o8¤ 3´“¨ â§Ãa§¬[¢ƒaïƒq˲:¿ñ„_7iÀ·†$rÐO&E£çÒs#?¼¹+ùH1Óp~dU*×p²™79¨äÂH´£º8YcRü5ñQb?„vÔo«mföÓånNw cÈ5zŠ:vβ–áYŽŒ»3@ÉT`¾`h_Z2þTþ4DàÄ4XO†4’Yücdi×€tjò—Öô8§Za” ÉîlyJ¤Á8Î×F—&ç–…©Äëbx™„ö¦:©Þõ…4o }I^$vòkP´–ÖØ9çAeÃ>>Ùá ®8á•,¥Žd»éQ-ˆúðJ¦´'y­¶§Ð¯9•£túõ¤H ´¿õ‘CýZBÂiAáÆO«ÉäðNFÏ\Bp†0 q¡ °tÞÄe%éÈRÊvyñ.YŸýjYɱ9FAuÿ7¶ÒÙL ,~¨‚ª+LÛÞš_˜<áŸýwO¥i2Aˆ•ÉM\AÚÀÞ$Íú`RÛ5NÎîî™}ðœñfíÉó²kÑ?“üÏ¿dJÈNy ‡Ç dÿ¿Iü°ú¡t]"•õåãIœR–qT©Íg’¾ù(¬Çï½m4òT=Ùl$…$ â•ÒQ[|¸æ6äíè–y~eU‡ c{‰´;ªÑäͤÇc>­äM“Tª2ö1"ˆ‚ØóŠ"ï¨9UÂçšîﱃÏ72¢2úÅqz°¤ýd.Ÿ*HbŠmmqÜê®<¶Ï‘7¢9K€H¾·ôªÌÆ_º4/ˆ† E«Eb× MÜßÌu븈â f;/\¿¨TÚa„}Wµè²‡¼ƒy(ºÆCˆ/Ð3Ìbw/Ít Ìôžsû^%Åö¬ýIô2ǛĪ_îµ`‡DC¼~ÄLh$æàå^o³î ¬/Ì޳EP ÈèxÀGjÌ=‰Î<¾</‰0ïÍÂ_O‹N@N4¼?‘¨ùdiŽ‘C×6 >*ëµ»d&®z¾ÂÔˆá?“ÓbÛ3ÉEvýpôj-‰Åá'!'AÇ­B†¾ó’rmýe²3y¸ÐÈ6}W¥¯ð·ÝWû2‚æE hלQ¹¸å ú–;Õã"$0+‚ )ñý}IP&<7,ñg}^;–¾MæžÂËî…T®hJ~).W^wò8dõe¸{Ë 1‘)©=v G仉 "ãßÐyò¹`ס;Œ¶CQ0F¹5:’Y,¡}®è:ˆ¾ê6›ä?ãh°)ð`ï «3+ŽCZ´èí—¤"Á*¶K¹¯}j³d¬ÇŒÉBCD?+] )‘ɦm€âÎÿ㬪iž¡ÈL¶ <öð¬a©…™m­]5ùW~‹&•8­™mBD„WIíE§†Ïˆý~¢bBÚÑ)ä†`IÓí{Hξü(¥Àl’¦Z}«¶"§Èó½,£B®8s J[òÊê²h´ÎfÈBô~2:k4ñXØ Â ÒŠÒÏ%æÿö©qŒœÚ@ÌûŽ#J^ ”œƒòY8ÌØOªªA<Ù~šáÍÅõ§‰Ì§?áVaà „èˆÿØm‹¶[ýÿ¦ ¸ûšáHROx½™dÛDPù’iw+¾"„—pÄüÛ¨…ƒTÍóŽþ-õdäï[û™Ù>^RèIÍÐ ù0w‡Tj85p ˆH‚ü㆓놓]wëPÙüëiéŒ~ªáÊU4˜$®© OI…ìKZkÔgdì_8?Nz>˜è<£Ê£#® -Ǿé»t'øö™ÄÇ‘ÙÙ¸: ­X¤¬mrg%j¯h+n¶\ºSìJ+”ð˽#äx,Emàõ=±z€DG\òÜ¥jŠs‰ C\"8jè¯É˜‹Ñ¹3œ^NÍz±é…¾L aõìAw>ϳž½Ûª@<¿ôK Íl˜ÓôƒÒ|e*"ÇKB53nl¾¿‚z‰ŒÛ­±1åÔ‡‹‹5 ïzÚÓIÅÞTÚÿä™w?Áóc¼lÓc_œ˜ôÈå”»?ÖØ{ZÊÛ-Ú]‰-l]…ül(¡‘ºséÏïÞ4seȱÿUûM‘{L§¢Vå^Lº<Þ D”Ñv! õ•/ªÚBKÊ~®™Ðõþyº¨ûX‰I/Þðú´0WŸGƒ„I›XøXîŒúýé?a|#Rù*q=±š(Ú9q©K·— ÁOR÷i•ÝúLbeS_³3v~—ìs4A7Uµ Œ”¶îfÄarúË—wü¤øû¤O9ÔÊ·xÞ&‰Àö G4ÓT ƒµ8éE7?Ô@X–1›è {kEÀ(çepñ#\H{/÷¤ßÏ œ[!|ÄŠWv¼d‹­(¬´f‚ÇÕ¯»µ[B3aÉøu¯”´u’%Ù”ó`ت÷¯pÁ6Š ÉŒjº­(Î@éýh™«¯:E-àm‚¦´G<8Ž”ž§¿YÙ¾YŽM«SRøså({¸L­@lD–QÙÌ @]b÷(Dm]w “P?‡Oaòìvý¥—¦e>… õ6ìá‚=ÛÓΡf¡‚²{Ø´ ~9u˜ýbxã­»ó©2 ÷šëƒò“wÑ5&¸ÅÀKÄJ™º–!ÔuîNLÏú“:ìæ¡.ÝåÃx,ÔÛ«#°HÃèFÂ4€%n±„èæŽ»X;Ây [ÒÈúÿ”ýh{1Á5Û¥= d?ãhVCG¬ÂŽ`[hO{­òqùp›Hè›h’Ò°ºR¾a…vŒ§hʆºáRÒ› g¾£•Ç·ç§|Hõ˜Mu岇{”©„ËXæ¤fv,AXw•Ýpù+ë#îRvî4¨1;ea{»‘)“i{Ä?1Jt9°jj€gzªAIYYÎÖà¬õûR_*áòÍ{…?Õ»aªH™ÉôP2 ~Þ;J Ú G`æ‡}ºa éöv´ç”`S ¬j‚ÈèÛ Vì ˜M*é’É«oóZ\QÀ»‘‰Ñ¨ÙÈI¯f«ÂʃѻŒÌ6qx”*jºÃÃ@Æí½±«É ¤ùŸÜbu´í z°Š¤è Ë®Ù”Ž§þÒGð&ãÙ*ZæFq}"»ìèšÀ3tÎÀêøphXÎ$¤ºZ´œH(;AŠ3ó"ëkÓ=Þ yW~ƒVzf*ºTÔU•æ×º’ê*×Û÷¼9¢IŸÔô\G’#¡rl–8<­6!þs ÷)_z“ºZ}Ûš½–¡Â¬˜4ðßœ•>äFP_µ讂ÜrÐ 7õÃ:…3}À@ºŒžËßækïjæWà­˜äã•[°ýë Þ¾S¯Î!“Òx«Øxtˆ=ÉNÛVŠ£FØ^ó®^¦CãyŒ‚§M²öïþ#2ûÑ©ÍöTá¥'–>Î÷‘ÊCÁè©@¡³Ü€ýqSå3R‘ã8X™¨§¥½ÚVÙTâ”ßg.Ù'2¬¸3’#Åhj¤ç²áÙ4åJÛ<í<Å3¡UG3©;ÔŽ—{ílˆF¦š’äÍF ýûå} w-ëVˆ©¶ö{¥B“c“炜´«›æ ‘ìoÉx$d+*/oHêŽáœ|jŠ"ïT„›6h$ˆŠ—IŽa+yœðpMÇÈï`IÚ ¹ðK~q"tq9Ìe% hQG€/”Oú!Ô%ˆ…O-BFÙ“`a /Bû'g ÌS3‰Æpü#ú{=ËDò|7á3’³Ï÷LÔô½|R!;P‰ÅÍ!îm‘x8ù ’VN‰fà yëÉ"üáÅèÒKŒêÙgÆ–/)Û¿óU&èv!yÔbl¨RýFSŸÙAüu³‰ZËŠ ©±T²lÖ0«Ò5z7 |þýáàƒŽs`âþºnøQÕA[ p †y;½g­¢ÕrBz94ð€4@Âhí_QÊuÍ„Î_spç~àVPpóÒo] øbîk&²fì~óÕÐö=‡tZá]ˆÃ)Rïö†OâÅ|1v¡a—A/ÿ-`†£* ™ë}òØòKV칇‘+àLöÍ”ÓK®`vTW‰½Í™öÑMkp¦M@Å·~„ÊyŒ†åUî°d‰›ükÝ8,Ü—h§ÆAž{¼‚…­{&™x¼ 4×¶Èf’ Ý°Í)À´yZX`o¬&Ùa>‡­êÀÉT\7»Ê«E£Ê×›vç€'¹“1y¨E+üQ4•NX™3ÓóÖ,B™Ï1‰î|‘cX.iÇÝ1e•^Šmþ# )|JÇÛ=­w“ÈÒ²‘‡ê§Îû%‰½ÕýÐq3ÿñ »=#œG±9JÍ@Â^7Â%Çé{¦è=X<ü.f±èK=È ÀlODiÞd nj=0¬tq¥;´M&ɲnT2@ij·]@ û…âw©8lì¹VýÍfìäE7+ÌöÒŠ´Ôr'»+ƒß#­³™’Eãâ ëœÝšòÓƒSЃ>ˆJŪþ+ŒÚ#P» ¹Ì!¬¾Uåc'¶.î6¾Ô\O-]{ŸÆ"wO¾ÿ/gÎ)0W_[{SÐ #`ÐÜVºŸý4ú7zQ,I4ˆyJ̭̌RaèøjŸ¯ë·Ûº…:Zò3j$Gå–©I"Q=ùä’ouÁSªîKj­Ññ²åÓJþZl¹NëÅ QŸH£u) §UxÁ§ž%ß_vˆþ§F2塃³½Dp°œŠÞÈõ_óó¶ùÙ(p«fÆçÜÚòÔdz&³bæb‚ž}¸@¾J\ã ³~ºE½WÓûœÓÍ"¬o”ho rÛhbªÑš¥âI¥5hu戎8|1?õfr&K Gsõç **zP”Ûûò[ìcå"Ó OšKà³qe«ÉMÓä6cLBþ×q¶Üjþa¸*‘Ž0ZÍ OøÂ)îÝv‹?Ž2›¹«þµøfkeŸ"i·ÿŸ²Bf2Cò»Æ@˜„;9+þôú섪IÕ/›H †rIò:œE‚“i?OÎÿÇ``Ìú²Å!‘å ÊW’iÊ+þGC*«+ñ`b?Àæ¼Ô—\z¬Òn P„6ËÈ50t¤cQñ©ðµ@ÅÓOoŠö:ŠLͳZ§“n9¯Ä2Tñpaš7|+ªØü§ÏÚTõ?þתJeF3YÔ°ÇGu¨ë†´{sUÿ£©ç§–¬¨A-wÑÛaÀ”ôXÜxòô9ϳvÃrEÀÞÒMÿ1Œ“Õªt·Vžz~ɳ̕侞àêß®k’{~€ñhŸíR„*.͇”çÏÛã¬Yø±¢úU1`ça¡ÿÃÕé q.£qójòÎÊÁûþõ‹t™` 8_ÃbÝì_ßCO0ÁE[OUDfÁ’jWóº¶öË?‘÷ ôZýȘ+B}Ÿ‹IiÏI´.7×äŸ(ËE³â“¥%±ªV{Í e4hQÐq#žQM¨+“ÕöF ó§ÓïMäÖÙo³R g¦.™yó AÒááš·à¸n9)röÃÇÞæ`zï0u{)9Ì<ÏðçñpAxQzYŠ€Su)Ô…¾'×ÚË: (ŸsÙMMgÇ|Λ'Ù¾r±ÖtbÐêmSÐÚßM»õ›Æ:uí›Ç¦G82Ì1ç¤O‹ÂYLûïUN,Iê¾?©y}ïÒ2¢÷бŸ»ã[Ø9"«5_‚è"jÓ… ñç †Ž5Mô/bPÚ–ÅwGÐÍiïõk ýÙ\&EjMLpÒf>ÂùÇ{ŠEíñ2eã~Ì1ÎÎnx世FæÙjô¤µÌîôb]‘[Ñ–Ñ1¬Zu‡Ä—¿O2œ6îo¤_?g” °ªe]@ãlÁFgÀ [̪õŸYϼ¹!/Î ð|Qe ©žôÔÔ E9}ÝHá¹ù'ÓJzºÙt|ò¶…ŠàF’A¤ hÚXœÔ‘Ãõ¿ª4ÏT¬«CÏ´È4Â~r¢ŒÄ%h³yÂ‰Í iæ‰ôòVªF«º®'ž† ]á݈­÷0šGÅ_®^pȨ<æ©éÿ. eƒŽÑ×|øØ” ©Öe‘C)zMÈ“ =Ö.]Ò5Ž·@teô>`œóˆˆ³ˆóŠœ¹*¾–wžÓA¤ë¾8ÈÀ.bÁl9|Ì ­Ç- þxƒqÏ`ÿ{¶w¯àbœÅ&Ú½ˆË, ’#Pø¼¥ýš¸ÞA¶ ðÛ7šÂË5Vù4Ÿ')Â`¡o»Qd"æÛ ØÇùZ»ÓºI3üE¼”}óœ¼P< K:†Kg*!—ÒZ–ÚÒ¥’øaëÙEX#Ùª #Ðù>Q Ùéñ)&<¯{çs‹ûÿßc#p¶º²“%%ÄßrÕó»€p¨{X’]èjé¯ã²¤àŒX¸žŠžeúexºMÅ¥©/ ʱ&˜0ê×…è†3ª^²ï-b1 ÉUÕñ›P4|‹dM{SJOMx蜻vrª™5–;»¢ñ"ÎÿQSQÝ‚Je¡%É{a?Jáæù•¶„H:¡ÖycŸ@‰úµ…h(¸¼gŽbRšÊtýçîç"¬Dß¶ãÝî_ÿ5å¥t‚gb'tÊ…€RsDÑÅæþ>Ÿkšé­ª­ŽBxdÚÖÙÁXø –%©G³Ü¡:æoa±ZÍ)$î<…jÑ ç9'â¯T¡;X¶¨çJ¤°šzx‹¾o sÖ`™rvS+è¤ lj«àü:ìJø$°O&xÁt#„3 }ߣ]ý6 ñ’™ñÄÌa­•àþRòˆÓ<B^N¥Dj§æÙvˆ)8‚¬=p@#F—ÎKÙ0Œ; ê)b¥Éï=ä¶æ¯ojÈÛÑNrDÆt˜¢úš& ‹EEÓ'|^„¶ÎTîñ^.Ý0ýÛ¯aÍ–S‹ò¯KPµÃó¿TEMÏWJvDd˜Àò(i~[éHÑuh]kñŽÛ‹Òâɪm˜èÍ®zÒ¤×?ºe'ÏCzœˆQo¨eýdUN´ï >Ù$6ïxÚFçs¬¢cWÏ0k)=ft£_²=÷o2¤ç7œ÷ÊŒÁMê | b#Œ|Èlã«÷¢ÊFG‘ƒÌm±8ãx¢Ü壕=b VCp£Çù½½ì6á}×Öù(/ZOKjÖ\ÙŽðé”Ð&š™.)m îjÍŠå&—ãö€€æT Z‚} ª ,žƒP\ óZY:úÒ¢^Ã+)9ƒ¾Åö{Þ`­VÀö-VˆpZu‹Ý{u®"g±k¿«0šÿ?ƒè»i!´År+£Ý¶ond̈õ~{À7/: Õl}¡,šÉè+$‚°›3Î&ʰ»y“dI?ðÃ,i¦‰HI _þÚ®b®ø]ŽeP>5–7_îòÆŠ=/6剀»vå_I`¿ìÔvÐÁ.'·ÐÜš*+Ã~ äCÀX,Âí‡Õ{l2ôíe^1 ®Ùemœ“ÝÐÂ?ߢ”Cå[X¼í9£Ý®ñæõQÂ5‡bo{´Ðç”úƒDMÏcHß¡­‡æc|>'RuMØ’™s.Yíd”;esædͦB286újCPý–?#ìjÅ|“jÔGëåÇ!™:l.=Èå¦ÓæÓ9ÊÐ¥ÇØÏæÀ{×D¨Ñ¨E|ÞL ÓA)ĺN‰¯øó§©ñjÇÎ'ZS©†ÍPx­ ÕIoK¶x zÕæ±Hõ­w/KIjȻݡ=¦Æ m%SëÜ5•è,D¶ã­´ ÀççáÏâDY7!±Ù>lo®, p<8§Vž³2áŽÝ#”pê´g™çodPCôz]îžË9sZäk¡xB‚ÎYݧ¶Ó·©f5Åò Nf œMŠãEôüÌõ ýÌ-hw5àb4•ã gwŠúRûSÔ ,4ê·+©˜~Rè € 7(Ê]þ»'Ï Öðèé›bü/ ù î}Ð’>®H#ŸZ°)øw*–5ÜHÚÞˆV5a=ÝB@%̵®Ø¼ tÄqÚ´€ã§t3cÐqYÑ…“s*ó™®ç‘XëÉxÝãj8Šžâãìž#‰ö»ŽK¨¬°°", á˦O«Lºô>°›Ëâ³+ƒAÐ ·Mzl·ù§Bo’sM–Ф©ç[ˆ‚ c -Iýõ&»®Jêÿ|~äêÒµÏH¯<_¸šåµA-mß»)ÊÑ?\x ¹z™oGcY|LÖ7J­šæ1Ny­£æÖ¯„„Ô§f"³VE‘öÔ7>u?4üvÕúö1ŠŠ-û¥ÙÇŸB-Ù:AÙûQlXÏf¬ndÈÿ¨îÐÆ6Úé/R“‚+CxUiÞ'Gò‹³äKlÍa“Ì(a´PRª&ÔJ¼1W©&Úa¿GVqºž„“·‰ºøîì}ÉüÐ ýsf:™*Þj£ÍuØ?ü9 CÇ›s"…Ý3þûG@ë»%Ñ©rÈ÷[­Ö#@VlÐzŒ¬OBEhð^Ò”ÔàœôÄ™ÜÂeý–€þ¼ Þ}†pZMf\{¤¢öíT/})hp « ïÁª!7rÂÓƒO’•è¬mO).`I€É°Mi‹ÉHdÒçñ=÷LjÔ_ùÌTLo+Iõ̲’'–vòæàþƒ>ݬÇ•m©"»F ĿǛO-î«Ï¿ªïóæ™BÝ ÜdL‘à¶]»ïQt ÐÀÊðë•Nˆ,«ùtóºelÛõ l/Û®sÓ0•·æ)[ft¯é¨Õ!Å3…sݬûE‹ºðQ ÎϦÎPQôŠ¿ž€;ßÛ´(sÉG³ÿµ[ª×aÒ]6ˆðm–¥JMæG›)7yá\.¤˜$:­cWu"Z¯åvcÉgÐÕmC‰}íaèâÆ¿å(<ÁPŒ$¢¾«ýöPÊãŒ%Ïê|h®Õå~¯ýHó6âlÍäA°Cx/‰ì$¦Ü«7Š ¿µúw¥ÑX­![„ÅÄülhF;’ þ;19Ú°=Yßw ”WòÌ·R‡;Óyµö¸QªÃõ|âìëV®oàšqÔäŒÄoå3Ë¿ cŸS­×ƒk., âÌ,´}êv1\&!ðÏ´B¹fg'6€… @Œ®ÒC’n²ºaâfðiE.¥„p «ä¦»˜'Q9>{BGù¸a ¼•gŒOA•…Çjr1¦æªÇ},N³‰ià§õÕr°q>«T0›0Àõ¶›)ÊòÁýZ>ÉèYƒ‰LÑÕ>…>ÿJ®@ ÆÕT1P(ìƒ`ÿ NþøÆ XÎS¶¿ù2¾«@4ØaGKšÓÒ âñôÅ}ëïÉ´¥†—ÁN@Ð×ÀäÜ:2u$ãò”šqnçxnáîúüq’Ê\= fBêñ­¯Ðò8qUК½gÕÊáX/w ”Qc‡¤Deåg¬µÛ¬a÷# 1Øéþ™/¥È/pRÊ{¹>Ì+^ïoZk`…^6ֻ솫ëvqxÛlÍý?°åç/p"ÂdÇX-•/x`kaNÞ›dç_v ÆÂuZm  h*¡ÌXñ¥»p¤–F°AØ­°-ž5B†~ÿS Ëgá<×zcZG´pJÉáÎMruÏÀ•ðEÃSÅ)¶qáG?Fk¬¥ºex|¹–T¤kÍ¥Õ+;½ÏòΕeì±YvéõáàÁÕ0ü¢®vâ2Ã{ù*TØ_þ!Ö¡9\¾þlsZT9¬Q臛$÷›/¦ñ&)]Ô2m| Y>eÞ©š–”´]SÀ¤ ‚8>j^„<‡ßÞJò?ÓqM×ð \¹€]Y9ã0 ‰_ºg‰kÜFlq¸©17RÙ|û·²“Iª»•Ðö_,ÊŒ¨²d@f0‰æÅÿoÝ)ó‡§&)îþOïΫå ­g/¹Üý“ª`P{ía„dÇñhØánùÖQe•6èF6:ƼöWûAj®Èô}4·=æÊZ'Žôˆ§B¿ÙÜ®HŽ I rb}DE€fÖݸÀDéÄ]Ò6p'=ë0ÕÜN1Ü<ùd¾¬JÓÌ]!ºjLoɆÊ(OÕWqò:ŽátM ¼\øóª8Ô{ĈNÍï§ñýè.:ÚÏ4~IÌk3#¾°“.j’ÚY¤…Íç&t±¦žÞ”ʈ;ßz.âyB¼°—°2o)«‚4=^7²†4´tÙsΦ£Q¤“þ0¢våê(iÈDùzv ‚<0xMYpF—Ê· „n-Úø'˜N³´9Ä”w—6Ðô‰m›%?u·.FΫ.odøk÷ab'y^mJ¿]ùu[ÐÿR¨uHG$òÃú?“}vº«Öh öAQê‘F9i1ömö¬ëJvŒGø_z‘’•W–/Ò";½‘%p,•p>Úƒ5Ú“ŸžR$tÎZ®ÝS+ éC’`0A{¹Ž{å|'Ž”a±R¿X {û.[Žjƒõ“X¢ 0óEél³È )«–5‘|ìÝê‰ÙíØ»ªËó§ÒK´5RʉøkÄúDNE\ÿGï×)wÒP§­zß"Mq˜{Ä#Ñfcʲ!2ký½ Q’x¶Fñ‚ŒÙæ7œ±¶GöÒ#(³þÍ-©Ôb ™ãöÿ~lFŸœn•¹>Ë»ÀiW}nø¤ƒR¼I(ÿ6°I µ_ .îEý­gl‹ú”k#gSP¼LJg?ÚîUƒˆ¢Ì«Úõþ}À*çÆ)x/A"úÃiéï³!äÒ· ²EN–³Ê?A¿rGRÔ›foï1Mó°þM]n‚¯“ÛmVðcŸ[‚LŒn³O:ÙøžBp&ŸÄÌâÊиIÇqÙ5S‡òi‚<:°ø²—’ßЪš~ûÆÄBùÜæ–Jd„QDT _•G¾ë“Þ6´öU²o‰jï¸?µÉw¯ÕGäsŒ ‡Oä5Ó¬êYšˆËõãæ]Ü'­xgbx!˜N•]ž|ž)ó„wÂ!+Î3µ¿Õ€ Ü\¼y Aäê©.&å30ó¬Â¢ú‚ä=·k=' ç'«ÜÎv{¹É…ës¶ÍË u¶ÈR·Š³)¨ޱ‰>åö!:Õ?6c} ø’4“yhèy„šPÇàA+Ääùº™ÆU‰{AÀl\ªp?F2ÚÚ-jÁ='áƒÖUÍ„[ÑŒ1¼7ø*“GoÛ®ä¹rʵ~kÈJóA Xy¹Âží:áâU3¼š…”¶¦³òmš`Ú h¸ßÁCˆ«–’ ;!ÓLÎâÔöÑŸÜ8¨J+ôÅ‚uqgÐ]ØÜqú¬{¢öËs|“A_ |$üáÏÉÞ©î¤è™G 4È%yƵÆÍ<cMPÈÕ·Õ«§»TÉÔ8ÄTÕSsU-ÑÆjóEÈôTÂܪW í«­},› î·C7„Ž¿Œ(vJ>íø»ù颳Øs»k¸¡ÈªÇPó ‘ÌþóX1IƧ‹ô¿QONÈå,ÖQbVÃf˜`²=nº!*Ŧµl£ÞsïfÌÙt6B$¨ôcÀ׸‚,,6ékÝh‡~”;gkFþA»~©¦ãp˜º¶ùzpï¨À†$äi,*0U0Y¤áÿÍfÈé Œ®ÐûMƒ¹¾…ÇC®vÅ¥†|¬« Ôâ.ºa4™Õoσì¼þÖ¾ÊQuWÓTÝ¿už˜œZvBP¤³aBßž7ÕM†ºCAÿ,ðQ0îü¸Ÿ¥AûvòÞ‚¼¥¶4wjÙQš ØÀ´]i e Mú| ²¶;®ÑAó<äÚ¿ŸoP!¿P°çqiBºçBØwÄ{‡ŠÈPžïɽkQ•ZÄeÌoÐcD­4ÒG!ž«6"p#{ 1HV ܈£f±ÅÂ=?wÄ#dw|°Þ¬!¼U…\ü$ˆÇBç ,J~’¢/¢+C[|¹zcb`h‘\À;º~÷ÙH}sNVÈãλñÇ@-€(;&õ´õþ!rGÈ•ú“¢T]+½©§@Ç“p•N#»¿€ xWÄyÕ=*)ËoWš ý¢Wf¶ûš¸px¯ãú‡CPÅ‹-Œò;IÒÞUp:ÇæöJ¬9Çߋゾê±Å+ zt¤M½¾š%‰c&ÝúÛ-äÅhăPrÃÁ ¹¸X-a·é»Ð¢·/OC<À÷6ÔÕׯL3©ü(;`Ì‚‡ÂDÛÚÄÒC>ãšÆ„bÔM¾òâ Lƒ ƒË—…Ú=´'ÓÝ€ãN×^`nr° ¥]ëò*°ÎGßž%EîG=¤Öò£â·ºtÆ${ôI2CiŽÇéIÅmêÐA$‡E¯a*ÄÃêÆˆKDð.êÉùvD‘†•ثв^ízÙ Yt¶Û2é_fÃÅ]‹ò–¿-¢Ò‚«ÉHš§fi›ç?ÍJ\즨6æ^¶$vÙÂ×ùbËÏÎØpGâ¿=Èðö¿/4ìy'#5ªôb3›/¼ßfÆWŒEþøÉoÉ-.¦ͬ×ÚeÛÿ×ý¹µè'Þ¯@ÁØs;£´8§WíÖº†žŸTûür@üáuâ7Á pÅ EvËØéèo4mî{3;W0þ¼¨Çïk1ÞhÎ=9‡þÿšUm×cÔ¾\Wìÿ”ó†é2VÄ¿Éhð‹þë^õðcO8­§é„ÀË™ g]veóeb‚‹lŠÑŠ•&n²˜L Í!¤¹Ž^¶x;ÛÎCwù‚õŒ]覙 wÆùjªüT”dhzßÙ ô_7à@›ÁF\.ƒ¼÷ß­L·W‡X7ö¾a(pK[°è ~²‚î­†ó€ ™^O´/2yýCÔ6ó5n¢¹=<ëE¡’,éCÓ) E& ¤Jº Ùî,C©å{«®1cR^ÃßöI»{8"„:5NdȳjQ¶ã/ãeŒ}ñL!/é`€{^}IN xâÌ LðgA*‹ i‡‹ïúч,™‡Éø“ ÚŸ¿Ä·ÝÇ%õÆ»¥0Œ¨ÌÍÑØ:¤¬4Þ˜²þ{ƒp58çöôÁo%§};Ñ”Ç7ËÞX$.R9¸|¸Þ ªŽÌÖo4íÂm™œÇctk Gí5ž¾!«1qÆ7f¤£fs?¶‘ §˜4‘XŽîÞ4‰×ynmzE™]°(¸Ybøá#& x|•ÊNQ¬š„UpH¹)IhÖë…«þñ,Ú)d!x˜'1–­P_Û¼_è¢ õNÞgöÉÌÞ@\SCÚÃjª¡”âG¹¾\V¡*¡8ÁHd ne@m„Çv?7jbL+­^èðú±x8%kûÙÍìñ>­V2ñ˜=!ˆúˆì& …n“õưýÍ¡ôIZ Q†ÖÜİ ±Œ«U¬7Óß’Æ \L­Èá6»‰p¤V…ÿkí$3IFÛ>JjõÔýÉìEÞ!˜¿3Úúð‹;‡ h~ÀÉy³QrlÍ”—\4M”8f›VÀö9òKò®wûÊÁb„ÏX¹TyÌàk.»¿ù&`ó]V³]>‰öjÊ> •Î¥ º”ˆrÇ)Ïdl/éa›}Xñ(“iЯjÎE ¨Èb%õ]Tˆi§Õ¶˜"‰L³‘IVk?¸q=déK2C+¼ŒFGvge´¾UÊôKZ>@°•ûF¡:–\ÑbaPiÉüÏt×°ïñN?yúù·T¥‹aKE“r÷³¢[ 2ðŸd-à†?oÍ1éÚÁ¶—ÆêS£ÉÿÙúŒ%sœÀÙç'ùT$£#@³ÃìÊü¬_¤Z;œÃ E¡¦#!ÃÀ΋ÂöK×§ƒ?õ*ú`>‡8"¸RGb3í|·¤ß¦,šÒÕ÷TÃFdÿñ..iÔmHQ> }ˆÜ ß³ôŒŽ<¥“´ýñª€ ³ËnÄóåp}öާvN¾`œOL!™ÖðÞ­/k°k@D ƒÎgéñö{¨Ÿ’…}@÷«e0¦–­ü€ÿ‡wb´\‡Ãi·üQ‹öÃBãx§T‰DºEá4ÐØÒÃCEs˜»þÊ«ÌHW-Š‘)Ԯ’,îÒk«ç%ýJq+Ñë~,Jj GŸJÖ’µŽ¡Uú±à§ô(1Ó`)i†`Sçæð8Vßôe#óÃi-ל¿÷Ë/¤º.-6B6¾õl±0r‰ÆçÞܘ®dh&‹ÂíF«¦¼[#e]ºŸ qå×Ä©O}¦Upî¡% 6çÕYT]NA$ÀW]õ'àñv–n_‹¥Ý[1À6±Cy¡Ý–°Ê[p˲Ð1Ù›ø^Öž‘؉RÉ/»BgÞÂaK±°d‚1m /Uüø­o-—±e¿ì”„Ù%s8;’F•ÏkƒQH{qñ2 h[)?—KQQq#J¦‘pŽ¡~Ïþwúôxo.g¡aœ>Uó`Ìþ~¡×S¤ªga9BŒÚ¡t†ù€[".ãÓ°!MHEÍ÷¦Y%.j•»ýçšC3.îhÍ©Ê5’ß¹ ÞMXb ½C¯&¾/)ú’YàêmNtÓ¤÷§©S^÷SèMÿÙØ cè7;k°ó[Ü%ˆ‘\€0˜ž ®µª¾Ü‘Ó‰®z}ÜÍÑ…j!Ëi¸-‡ØŸ¸> %wÕœËvY¡jšÉò!” «ͬ_¸z™1v±GÁg*)øAE¬:Ê,Õ¹§$ƒ¦øy ù궬 ]“Y½Á@>xAßtä¦}ÉìvD‰œ©° AdP¨lˆ­=ú˜•-í#óé2ÙˆlŒ0Ïü"Ó&G¹…S ­.h#>XâCĶršî8(Ø6l6!â{Ÿ±ü_œµÉimŽÚ4jzᙈrðx›*£®)\Yàÿ6fh*‘Í„ó[µÞèIöUŸÌ¸¾£ƒCeú3²B•%#ðè7¾t\—YZ÷…f%‰Ù!O*dÎ~ƒ~<{°SC`‰Hïì ”É6};*Àl¤MÔáðèuÂ\‚ þ›yÍERà¾7•'çøøuÑ[;ö@?gPsÏ6˜M%18ž>dò4íµ:ß ÏmÖ=‡*†ð´s»–_UÀÔÎ4 )ÃÆØQ¢k?.#–HùB3Þ‡¥¢ \©è.©cbUô OØÑ²¹þDh?Mj{¡ôíþi&&€È»·ø›ØÒ£_ee\CÁ†d+—öŸB€Îÿs[_€ÙUfñã)qõ~Å#9ªö䪬õ…]NzÓ‹œ38†1ƒ¿t| Ç~uë橆oGöeRÙ¯wycZ%1èÖÆ¤çÖh¶‘+Ý”²w‚›‰¿¾lâF]% Ð.^òlWÞ9¡µ´?4?yX ZŠd\gVÓâP^ïNŠ·æˆï³·üeùâùnмk±ò¤ *mP»vÐÔ÷òY“nO{'­õÕ“’X­ô~=j1§ª›à^QfišÄ`pÝ…64ÅA‚ÐóÖ‚Ÿ4Î_ÍF'²:Ý…Ù¦9*¸7þÃØRÍEyG´"Þ Ï c£$ÊËs–ìÈ®Ñʦ`M!Yº쨇æ˜÷µèÍt,:ýœþþËL‹Ç¤–fHÃÉK×i”E.gµÁ³ºlr`Bæ,5t8é¦ʪ»dµ?¨°¾\q1»#ð[øà]¿ù>šÆÏEòÊv$åoFö‚îë?êò—Å ñ“{é†GäÞ“âšÒJFNv¨VÐÖ¬SR)Yk‹, Ì9õyIvLùºF3 Ie„›lÃvúðu÷ÚLÓ»øéÒB¬ DŸÜg¥,P=NtbÒÇ…¥ÑËdåÈ[ó3/|Î07ÿÈŸ0¢¨;gPÉÓÎ_ã%W‡=A¢¼p ÒþîÕ¹˜7Ý(ê‹–NÍá¥÷íp]ߘŸ|yXžNDf?æR ž"1˽yKUoœ,€Œ,ª'P¦Ž!eŽ›·¤¾´ ¶‰ýü3Ox$Ó¥}1-®3d4Š—œDKz&?UeÜòÚ!µë=v>Oœe*­/á¤&e®4'ßTöè,S©Ó¾×}°Ì9€gÁ¸ ±lÖ‚‚ í{1@Z\y œÍcÇ›*üA#0mÖÊ92 [_&†L£[‚;v1¢×®oÀy6uRE»hà.¥¸nޖ䰼ЭuL·Q˜Ö‰dJÆxÇ„ãªùIõƒ8– füÒO†·j ÁJēћ^(DVOÇí¯¼s'ýù/1¨ ÍWÆ[·©UéO¸/ÃnúÐæúùp{ýÛ*Ï›œîè ÷¹¸fK3+Ýd}’cr{bèæn§ä´›»°x>Blþ-³Ž ñ­WhÄK¸ ¿‚bÎŽF¡…AÔ2Ÿðf,(ö–EŸŠA×1ª S…VDRâ6ŸJQ*5/n űl_ò4œa;¤V[åÍ ¤vͳûB̶(+áûH ¬Ó?ùê}Kî T«|ûëVôcà WLשR öÅþx'ãâË”ÛT”AõÃÂÎï{ݾLóÊ—ÔÅ a ~±ÙqŠ(:ÀSÌcz œ&8˘ÌüãäËeãÊt+! /Ä<ÿ*[¤çÜÝ~ÜO|ȇx«3Ç ºQ«"ºç2·wöž*L¦Zvn^Éúüôes¯|`r^Ý áV¢1h1)^±ª–†K=@áSÞ“þ=S‘SƒÙxÁÿøn8ã>qàÖx XˆÅ q>’lÉî@ÎbnоFZs…#㺶"ZŒ…Y¥2$ÔÄ—ãr§†dh( ÷žW¹Üì bgqׂ¿œB›ˆm²ß—ÑÄm ý—Z²<ƒ@S8‘|êpJÌalNÞìnðרj†7îÃäa‹Î¹ŠÜr{žÅÁoÜAÑâÞV"ó3]3!Ñ, .;Ïž9}w²Ü̫ϘËì]hÐ8·òÑb¸|f®ŒŠÏõE…zL™åd˜v Þé™òˆŒ\^äèàÉW@PŽí÷å92Δ‡mÀiLoG&à°-ñmæ²E°ã:fQލNwhGw9Uó·ð©'{¡ªØãûV%è&2{/ÍDNôU^¾]ÙFzy‚Sw‘xܲ„£~KÛV£eØkDq¬VxKújœBÆ]šéâü.~ÃáxÍ`~EXÒ°úÿV(,§C¦Æ·uPjú§Sü(áx¡‚ê}ðÊQ¥öEÈ—™Ð%@®² Imç5MÑ[%އÕAˆì”›ýÌÆ“´{wqLš ˜KB„¬~ó¼u;°^Š ÇGÏL!íÓ3 ¿ÜÙ¨è7¯G÷ó®ŒrÄŸ•\Àº¹Å· Ü*ð¦µ+µ`½#¥5|¦qœQcC"ŠM¤^AJ ׄM„hP_ÛgÊ^0ÂÀ'ËÒΨ¬`ðWàKdl_Z =c¯P› *èÐU%;ot.»#œ¹ŒêäSž ¹k_QÞãœüçùî&ü?þÂ¥%ŽrbÓÉï ž>Æ©u, û”`mós-4ópa„>Â`¤9yµ`¦ÿWþŽ ùÀáZ›".—É}ž‚À^¶„#?ÁDOZ]žu%â)Ä!:äËuX’kÕeò8ò˵ä?Z\´âw›à#VÙX½XóWD0‹È"ˆHíFÐlØÿèñ©×﨧–ÛK^’˜Ir­¯Û˜÷Ííuçq|‰kÛ¾ßܨ‹vçœ^ª-/Î~=¾={nº»€Fh¹é~Túëš-Ã8ôt#%˜b²<ƒûߨɶÉ}%)ïH?~××&P ˆ¶ÙÚ.¦¥á[ƒÜ†’⸉€LÃ2?Á~€kÑ7Œ¬Ñžˆs¢z“Ö =R<ÉòK†Uêü!õÎäBñ°t&ª_ÊQTØÕYûTØ@ÉZno²À³_{ŸÂrÀ5¤g}iE²µã¸Òéiéo<¶2•Å¥àR—þÒªÜzÇ„Îi¹bW˜]Êr\5Œý»òN.»9Ô¦â}¾§U_ ÒHpÌ!#û—$w¤eÖƒBex"Zbo~M$··ldÛÄÿój6efÛÜÚb,¿–¥\M[•s„ûŠ×*û­Îi>á,6–7¦Î-¥†H–èD…¯ÖÄ8ñZñ55›)Òè±ÀŠ@ëˆ0^À7k©Es‘L(wJX‚³!P7ˆŸ‰GnkÛ~aè´ç0~?ÂÙùNÜäOŠpúIxç …ÅÛ^ªP™ ¼ZˆœnëÁ6×t•Õ¹Ó[úS>`W¿òpš`Öm¯z&¦ú ¬‹ 8ïWÂäÕÏ(ž’’IÕ¿7‹Ö³H'glÀœyéf¶}J]áz¾O¥Ü©ZZ{M‰Æ˜ÍÍ&‰I1!”b²a?"©úpl±øh4[¯j) wJ»VÝ g@­Ù{ãhÓ[»èe;˜H¥Žù]§Ïc>€6ÆÑɨ+L³K6>ê‘EBÎÑŽ\àÃ0Ô 0ÓÃÖls­¾@oGXðs/Üp,ׯC*}Þu°êÈdåÝäåÒ¼â}£Ú–‰×RŠSìÜø0MÞä© øè·ÜÉéͯö軪i4îp ð>ïYžů8‘êj3œŽ‘Í>pù0T.ýo›‡·nÏzYµËpšN+ÒÒ/ŠšÇÁ쯥»G-¤@ë¡ÙÏÊgƒh¬¤W?«åÔ[|’#dA\ÞÙ@Ü«þK¼Õº±ö4/•˜Ìbtø7³¬µêîgoJÆŠK£î7Ws$ahØ<¯(DŒ(dô¢ÖÉŒåf,xbOÓ9° ’n•ÃùÁÕʼ/ g~©Ú×…×ø>Ý‚Ò^®ÖQ¼StªöîØ„Åá#ömÓõôB-‚öæ·) 5•‰O õÿœ©ÞTÏSåVêÝ”WE˜ûT·ËKCiÛ#*Úa¹ SŽÚæñ¦ÐxÄUøfJ­/Ìåè"ò5Û ðéIM`ï¼Ü3"ð—«T°°)ÞcZRM½Š%’O j‰aå Î>h ŒñU¿ÌùÁLã\›H…mø5uM³1–NSm¬¤Ÿ²<Æ +§¦ïÄõ_Ÿ’•áç‘£ÙÓ)„ ª¯—ö]Œ¾öxl ÆêîRXJØ£ƒ$…Ї(§XMävÿ²µ†?©6Ù¤âŽòöAЍ{’êv³¥ì0Ú4wP¤ÙhÅfC›âøãCß[nÃøŽ™»à5 —¨tNâïD©ÅæƒÕ:H4¼F›M­VM!Ö-D°{a”¶Þuzµ(ªÝç“Ⱥ?µ‹U;ïøoÂ.†sfàº×Ò¬©Âš®Ñ Tµç1ųþôgc‘ă_+I;”½§R;ðJ}zjë©yÊ„¥]WÄ} ÂlJ¡§ÅjU”³fúKˆ€[ú-Ü]ÆÁ¶ö?ëá6 ›d9oJ\7KK$@F‹ÊÔn.iËQ}Jd޽° ”î•;~àÙÒ=EV¯†õ=7†ípê/mú¤¨¤^4ÙòçŠø¶H¡H@÷™ê†Î"Ôq‡¥®©šªžÉ0jã‘h„ûkio¹EkQŸ_æ|2HL¡Ý©Ý>›,£öÕV3(™22È‘Eüí´‹ïÊVÈ(hK(¶ôòï¾¢lÊ~ñ»ú²3ãùz$`ö—Ù• â€fÁÂç¼BÝ+ú6N‹Ú‡S=ù§”\ÊãNÂn Ÿ;ì¬nN¡j^ZÛ‡¬mòpžúÓÿ#À/F‚uq”°á9ܸ©óe‡Çî*E½Šae6êûKà ïž#¬Ú5ª¼˜ÛûãÒV‚ê½&s Ðôòi0ZÂUw·Õàº^þ©]/üÊÆä5SoÚþ5 Ü+ä]LÒr*˰dÖ‰9$ 怴Ç?—•|,†Tvwƒ¼Ñ_]3éù¹X¬ÔeRÔD÷ÁG õž‡ø85œçòߤYýb7=Ó}A䑊bö¤5ò˜\ákFÔ(ú}Ð"¹ÆõÝûе‘Û™ŸÇvÜ—»£–ΞX²^p•mpðìÐm†N™l×]w‚»µ—cøî§ƒ/Ú Ì”ÞÕ#Û8UW£oêÚ~ZÃÍ_’"%Ÿcâ‘”>D¨Óå?†Ýy€Åæ©!PÉæ=(=pÜÔP½ÙŒ £°à tj„`Ü­#ó71eÉ5`>a1t’„.XG™9`+øOø +ä}’F‡æ¢„ÀñqøòÙ\²¶®•àœ`²çuta Êfc¸šDcVõiÃTáÊO¨£Å¸*=Uïƒ#¡§ÿÜUl ð ¥Öt(hÑyO—VÑr›8/ýPDãHaÆ>‰ßW€ù"KbÕ2b}7Íy0ngçT\áö‡Xò:ûÙ±õ–‘¢3šë4-+J¹«÷®ïÅDlŸ4Ž˜ ÈMU„¨ð^¨í¼MˆõÍp¶øhÐB’iE)À |J¨o¬nd$ÝE²ŸÛÈ*{s5o;®Ï<ÛØkŒZ§¬4ƒqʘ_3¿¿’åaõQz¦óø39 eCG Ç±[´"·á× Vq>ˆƒ§SÌ·WªAôP~™ãcUçŠûsJ¾×cQ+Îm^ JºÇÀ æ™£í¿‡¯/\"Z*_)|+eRb•öa4SÚ;÷ó“ý\Ìc"’NŽ!æÏ›H蘿$²ExàMá×n¿6¸§-þÓ‘§t $̤Wýˆ+aØKk–Ó+•eöÙ8àƒ^š$1šßªã©Í±ÚÈ—ÉôÑûÁ]/>ä@ñÜÖ_»§on&‚Ýðº¹ÎD—zXTE%Î$Mº±âSEïi/㇞rP ¶ ÉAÿíÛ©áŒÂ~†i)ð Á¦ŠîSœ,Ù¦õÊ£³”€e{¢‰Ë3pBZ·IŽ{IÜhðÚ » ¥ý×§Jš »ààöÚ‰öi"¸Ù÷ÔÀ÷÷¨€Ôs4¼{³‡’{þú§Åü,W •Q7˜§8:ŸÊܳ µ~Ä”<(À2 ‘H–·é„yÛ‚ø”l ÄÖƒmFÞëÛ…õ_Â+ráZ=šðsbx\ð^]!6ÎÇ<„„&Jvü7ëÉöóþÚB^eë¥åâ@á¶yULÄùÓMú ªù1÷C³4l«¦÷9§æ‡^¥Í½&²D§Mœèüòq¯û;ü:n5ÒŸM±Þü£Ý7|íòá.Œˆ SÝ›/ÌØ.ýOF ˆFƒ`W!±iÙ†*ƒâáîsá´Ç©åt5«R9UåqŽ×oÿM@q»‰Xm:A:K'Ä®ŠðÍ„§Êÿ4î’æÆ'ÆØÃ,fñ dÉcÕ^½ 1Xižš1Ò»†ŸX`5Á€¾`ØLM^‘‰¼L+F@u±O!:‰´HÁ9À'M‘m¥¸Hö—ˆ‹v¤†ß)­-µõÒÙ Âxnžë„¯’b0uMuÙTEåÁ?Ußp§TRÌM¸ Ïe8”øùÛ!„ÄÐèùzúÑ|éâ_ÎÅÅ^»SqK¶×¦È‰á‡á¼/0?*µ’µ¡\+ÇJ"´@ÆG?’®bŸ_„\®Ën¤ô$ŠÝ¦ŸcÒ­¶±9ÆÑ6Žkò©6Q+«œ§Ë?×ÚGR%ÞõyåÝÈDJÙ ?=ú¡À”T»Õ x_dR’6]´µ ÜÚR3:㔠®*ve‘ QÑ9<ÿãÁWÒÂfs}Ú6}‹|Å™µY¤˜[„Ü“Ð% —njû{Ûl×tç’3øÉV'°¤ZAàeêì˜{x̲T9-óà+G¸ßT‘Õ] PM•n›ÒÎ^PCnÑP/Ç4O–ßxíd¾¨ü$ƒh3÷…pÇåú\xUÜ ‰š@ è'¹èßg;”js™‘±ùð—,K9`§œ× HòÃXùËÚ`ü÷ß#§ì÷@‚Âò&†ˆ/¤xà<’…·Ïœe¬Rï•xx¥]Ë ;3•+ËsØx¨ÑkË<ôëçöK‡d À.ö|ïöWÖ$›îL.f¬þð§ïa§§K®|ÙüÊÓôì)|ðaX¿`É›—Ô°Ð<ÂdC°U·u\ruXîÉ^7PÙÒ”j{úk™”¼•xÙ¨ï!ÏÙУ7‰%nŸ¤;ë…•¿b-Øs8¾µ†þ}Ä÷ ±mk8sŠG õ+õNYWl ¢*ƒ£`ãu½ÜjæRpFöó¿Ú3Ç6Ä:¦¯%$û%®SÁ¹×ÊÈÏ.YX c‡gé­Àežvî‚Ý b¡¹Ø€Š„wS¶jÎLö#³•m\ÎI‘Æ82ß¡'gŒŽP“ì‡Lùu(øjHø±î”½‘j¼à¯» x¨™Ó‹À(ÃÓÒÑÈÉ# Çcw»Œ"¼rDz;gÆŸKn…ä>µ¶;D‰-I‘¤“z¦áÀH, 'Ó› Ùäv½ÝFåè–aMmð~í¦áÂÞ4!íàÚþ(½:¿b¢YÃïᤥŽ•aªB®¶ûŒû„àgïåKÛê+е(ºŒÉi߯ú)>¼ùø™œÁÞÑìøF*‘à ¼BK+úr€;ç‹£Œ­þa`"ó×tŠqEgìWÌòR­/ZˆÏ™ò,]VŸi70G_Ò¿JaµÆ)7tª|êx€„™R~.Qf|y"ê_\K‹©±5ݘ~±P^ä|Âïd4DäN-+¦…ÖÛ{¾UÑ¿5w—å-§Ê°Q…ù¬;„?~614ѨýVC)ÐÔ“œÑGèÈO!b%¼›ò1Ì#Ø/±;D7&º*‰¾è¢¿ªVÊ‘S®ìÓaNÀÞ)6ÑnTûtû&ê¥õÔdÞçKE¤8 Ãæ$»ÀÍHO¼@ÌÍÎ5¨ç:Ú&Þ¸žÂ‰´Hížþñoa~ñ¤E¾÷ÇýÈgû *-§OÇØÍ}Ô™GGGa{5W ¥šŽ´yJ$¬ô¦—W#Vn$¥óan2ƒ…£²S<±[3$m–•ïÒÆb®›áèRÒ‰ò`ß@Àe× 6­J<쯬òáÖN¦T¶BÓ—û‚A²Ö㫦ͪ‘rUšœvW€åqj%¯ sDªWMü±G|!AǺ£Ô=G>Nô\Ï$¼Œ4÷½¤ÿƒF¾ Ç– ó5ú8zÑŽ­BjH⥭)b¾‹.©Áëò‘k-šžÛïû0ýý^—¼!°ŽãÕ“®ÃÕ$w9¤œj‚æ£å´˜…JM³VE#q¡~{Ê'·‚+Qw‘Æ9ÎÈ}½¤¹Êce–î?JÓ.²þ«IѾ9JËr6YâÀU­”8ÀÌP•W7kcúà C¸îÜWï9Gðï^´Æ'v?:u‡WãwèÓS‡‰¦(%EZ@.ïH·£ï€²}fT.r†Â¢Ÿ—7»CœS{–`Õßı܄ºÎu²Ès8ÀEºÐ©÷šOl!-XWI!žsM3ÄÐÉ'åǬٚ2Eäo3„ahX4jê( ˜·Ñ7!¡­"Q T¹3*Ð6¿Ö‡@vÆ—€˜(®±\„¦!ÌúC1O™a¬®×ñU2r÷açËW˜Î, ÒGì¯`‹w1"m¨3ÖßÀìw™Ã#  ÍÁR8ÆÁÙ)`å”ÄÒ·Ÿƒ;Þ8xPXÛ›aÁÉ´)q…ÜôŠÖŒ &q§_ÅÚP⡳²ÞÒŽciŸP•kÍx4 Ø<|RÀïäC™l´3É]û›ìSfî‚xÖA±f.ïåt`’‰^Ý7>Ƥ_r¸ÕcTó'Ÿ œ$ÊžEšàG°þ̸ã ²µBŸ~I6[ß'"¾•KA±ïâ¹6ÞýD/‹.¿ÙÆׇi—ñ¾œT…”ËrÒÂUy2ˆBÈ}¢ôÓ¾ZEÜN vPô™Râ6•äsQ´¿€s‹Ub:p±&(œHÈ|ˆÎ…½`µž$N‡Q¿{fE7¤@ë1^µà!Pëƒo ¨MÊÃÝ\`ÛÁÛ'aÆêÒ9ôR”\ØS.µ—…œ¯ÅBa¡Ï¤Ä–d~îíO}š»½OƪwOŒy–LHª„ˆüÆ!¼Æb`ˆ8iàÊu? ™#ÈoÆ¢#ê¼ãš¤¸n½Þ,æò—Æ|ÌMÙ¡ÃKÚ%Þùwò9˜ÃæöåÏ×|H=v`00AVÕ ¬ãž"¿Ee\ÄÞ JÞÉWŠ ±ðï€2nô ‡EI‰Ñà ëFI—³9A• ã5i!ÿ˜·j¸Ò,»%\µ$ƒ ¤SÖ+Åì'"¥…ÅÊZnÊù´5NÒZç5”§LRók/tùÛAòg=ßÄš‹zXžöj«:°»ÖÕ–±6€—kLžˇUÖðP–” ­ãŠ–xîÁŒ=†®±ïëªxJyË=´e Ç|îûÿÊPÁDY½„-7aÈFzó¦,sl8§Aÿ~Fÿ9ù± É8KV1¤æë=A×m–Ö˜`ê½¾•2HS…½dÄy—ªUKÊŠ¡d¤Ê mÚ2·0éYnægÄeÜ9€Iˆ¶äÌ~SÏ\¾SŸ›r’½ªŒ]«†.¾Ñ³eÕ.!§j†?[g庽|žêY• WwÚÞ£ÑwÁ°µÁ†ú?{¨³Ô(+¦ÆaUì_Û+¸Ö Ô!CÓsm*É…´fàUƒýß\M°~ñ)o$¤±ÒûS=«"#†ÌWJ¤eœ‰é@Ì[NFÁPµNô!“ßà=ª3—ɘB ¦æeë(Þˆñüì,«îÓĺ˜^m˜ ã½— WηŠÉT ñ…fÉò$ΤA§EÜå…¯Š!ŵ‹>Ç…Ž¹ü[.æíw$IêÚ”Ù[%D©ÑûŽ#ÆÆ57Èq­#äÕ‰p}ŽÌ\1MÀŽ(ØzÁbÍ÷þ°{{phþØÐðsñb©oÕŸóýnFOXx/;2ÓéÜ‹86ðˆy•@’ÎW%M¢qªO>?ÖQ}·Fsÿã'Æ2-Ú¹‰ëž·7%SÚôOµŠ½ØE©žcX°ZÆä’™Ê›ñЮ‡q°*_. væžUsóìÍÀ|2Kz=ã`Ú+íÞ¦¥<†msÿ½¯oÓrªéƒGÀÔ†1ȦêxÜ;Ý&á%FNó–UTÎÁvQŽïðÒ2·Õ$3k"°F÷xÆGDciU—T¢lÕC9MàÃßAÇu¥—´g¹zuQtxKMà õD™‚P1¡³çÂ/+&ÉF…B¬hÊkÇQiÓÖÁ^<Ÿ*\qJ?ÈŸ¼éàQ˜?»©¡ žP*Ø•tM¯Ä™ã<Š•ž¿œg8pätD¼ .o%‰MMQb½b¼µkçÊÏw“¯4Oj&æPø€ˆºˆŽmáöseéŸ^y”}µŽŒ¨ø(œ3è+¶ ãÖ]fbèExí§Tù´yGJá¡ø»“çQ1,måá2Pé2uu”Xs#Ì&F³bÕÔ#,)žaŽÔi°¶ YÔ pû8 ïò»[*g¤-úü/Ö™ ÚE?`7äÛ9§ß—xY+ nãY…Þ¦~”Eð€\e3“R’­†ù84µsOX5µs!µb‹ ‡·ÊŠk2óçþÌ©±º]GE^<¼eV}Ó=mK*³˜lï”/}ý]tp¸‡¨|£µî·JÍöÖL¿œ=lÝ*0ÇZœ§¹:C§aûóŸ¿™òÝQ|}¬ã–sÀù­Æ¯ê'åPqw샭ÐN'\̰DªæÑ¼àp‰M²ð‚Ž @¢7éÀö.™“ QjY µs9ù¯÷'‹­žÝºÆù¶¿(öý°êá¿¿ªÊåá­šÐÛÎí÷CµÈÀƒ—n6!óP½¤Uù$¿V0àä*ü#7jŒ¥¶ÜÙ¹’ÚVCk8¡j'ðŽ^·MÌa(EŒPQxäBo¶aˆí+ù[…MWÔ;8UÞà ÝÎb¿'dæäÌ÷1&'ÂŒÕT)nY ‘|­¡:ÿ´•LÁ8Z õ-g˜¡Ô¸¥Ó¶ñâ¤OÀÿ›MIßKGѦ…Ú¥õK ‹âÇòŽ')ï øŽ·LãIo9…-ÒUÂãáÕâðó¦/Åk-]ÛßÄ8çõ“¬˜šTü§ÆB˜Õ^<@öÂüiÞÌ]Í‘ˆ‘°ƒƒ תEJuÌIQÍøFÜu7¨ç¹Toèö³ÂFe˜lÑO‚<ž[l"úã&~¡©ÕA«6 uãÁñÔfùé=Mˆð¿@µR:1K7®½ß]'ÁK’Læ;²Œ«·«YÞ]vl%NųzÏé0|Ûj„³sÛ徑œðíB÷®”°ý¨Ý’µ‘늤G"û¶9^=& $ñ/’½aèéód—®#†”ßNq«¥à>ïíß"ÿV®‰ò T,LÌfÛí1/…ßg:ÖGé¡/bõî䧺¡§æ©§€ùjÎØÄ|ŠA˰áFOy5óHÊ];2œº$ª1{Wúyž[ÿhSƒ½cè¨ÑcSúñlÿ7o¸<® $¸ãÎÒfyØýŸ ¸•†F*Ç`d·…oµÇ¿L}áùçù`{Ä瓌áð =ldz^ì(%ÊϯÌi€q4ÍqwSof4ÂÊœŽF|")!øp-㦡¥=޳;Âs¯3ë›ÁïKØOÛ ´»Ê Xk8?š% V×Ú-w­òK^Ð…/ËétF9)ûodŽ5!Ó3ã¡ãv‘É àø¶®ã‚Ÿ4äô{×3-{ʪ/ò|¢/d裆3-û«’)½¹ÞhDº`F²¸Í¨Ö¥øGÀQ!9.ï:çª*–œ[Åd­ûip)†yý€#ò˜:¦}ànY¸íú øo¹^ÑOò‹&`£çNÒ‹Ì©8GØA¢¬—ò¥÷^€èï5’€b¨ 7N•ÏB½¯ó±5¤OÌl. ‹=NBpÅàèX#ïb¦ŒSŽl.xnu‚`‚†$ý"…v!,”šj¼=¬|éçËÆ/¼®Øèg6©…`ìTM(É,Ë6,‰S‡œÂi4¢–xŒ€%ë–­ãƧýJql蛦lÑÕlPeL—qIyšÕžB¸§* +¡™z 4åh+4<õ¥«M‚G,#ð«Ð ÔB$¬hyʸõZCŠÀ*m2ªUÚ?;ç;´c[·Æ%ÄÉ(8©ê¤>"w|%hd&†BÆÖ0ܸ}ø’Ö󿯳ÉìNç;›!·…¼òËú–ê Þêðº%ng‡yÛ~ Aº†ñŽgûn³:X,t½¤pÖŒfpTt2zâŠ@_”±[¼û Æ}/¼8T)s×M}’*ì ì"tô˜|Ý4ñà×ó’U7À©a؃1ñ•w¹]¶ µMcNéwHQïêòžICÊCî¡ñjbŸÁ¦Ë-ŸŸý_¶Ý_—t2: ü•1SÀ&w˜BC[µ€­Ê"žf>èÓÃSŽ¢¾J…Qgª&äÂàY¹d:•b«ÁöÃÛ0D  S4ü·ZèÌó8?ô:Ђ‰ºµ /zïÂå ›‹çbj'‹TST§0šlcÛ¿Q^¹§k꣈­.ð½“@™^Ǹ½(·^^GVÍÓŒ{çîrèÚô™ö5ËÒZnô ÉÇ0Tñö£uâKåHgLl®X‚ö4¶7åJs)ṓBPIa…ŒŒÊH–Ñð ìd¨ÀFÓꣵâ&6U÷(¾8J…·0S²ÚîFÂ:Tubö:„b‰špqOß{‹V(p¿GW…ì}õPò4Ê%G¶³ëÞŒòþÂ8UŽ™ösãðþ¦BvY¶Á¤ ŽïF÷QÂf)Ê´´Q2èÍ <ÚYßm]¾m¿#ÍûÐ×¥,q>Ä9Y†·*Eí(n]‡"ÃŽ‚A¿àÈO-n½ŸÚ5~­ÃµášÅxáñëlP¯[w 3t s;?KJÞV‡™ÈÊGÒ“¢ÀU=¾úôëÂ0[D›Í¨‚s+·óK“þžáð´§4¸¼5Ú_4E'’âçí&Áe9‘ÆÌúw2<’D¹># ㈅rJ‡Ž…"#WYâs؞˗øËaj´…ˆñ'‡$_TM4û’Öà¾+j8a)½-À=žµÃÚu°GZ:Û¼AžYàÔÔ\® ,ZCȽ¨ª]ï"´f€­²–å±€ÿ‰§5ÐѠΙxœèzG,óõšTù€ÁáÁ³ìG':Ѩ±ÜzØê&0#îf×zŸÞåÄÂï>ŸTŸRCHã*þœñŸ( 8–&±ù³G™±¤ó=eù'´èu|VïºîV°Ð‹ÂYÍ~Á¥uKÏP´ªnÇo s'E:·L‘øp9ø-ž²¬´€U3¼yA‹’»f0U½03TlW{w+w5ê{cbA žÞorpÞAÏ^ææFV'l\´-ÝC)´Å9@×”^X “BôªE°[9€Aà&ýœŽ|æNíT¢ I]i =¹6ªjœlÊË9ˆ“Xèf»z”žÌg‘—sëå0‡éÞ­…I²¯yÆjW4`€‚U4{uåfhN}%øS°t‰ÿ½{7t© äZc•Ñà; í|æ—_Gè>£xÔ”<2ÏÄÝØííÕ@Ã:zV"¸oÇ5veúóú%…P¥ÒÕ]”l½ ^OÂD‘ ìã«n9+Cð1õôš}3úÀ©êl1ý…ºXÐT¹‘þælëÜh¦±&e¦v‡øåpP¢2¹ÃMS4ãлߙm¹Cc‡ O¯ ¼A>#l8ŸGTü  Žú86”ñ  mº¸tùB5k¹¢•íéCbîÆ)¸çÉiQv‚±¿:´Õ9‹™}†ã¨u¤ÁI訸áh·Wcš“ï9zJrÕZ}ê͘ãêÒµ.s nµý`­¤@‰¯Ë *Æû3뛾C¶3BW׿#Á¯–*Vån¨‡€[yS6­Øf(®‘LfÅŒohÆn½ƒ-î†Î¿Í}Gk¶J”j3“„Z¿fó‰ØyÑ‚4òÀEÐ×&•YÇÙçàõ ä&µLc¾ºß;P¸ˆœaí!‹&…ਫ:Ó—NE±w3Û&Ck¤bd½· åŠG®XäK±¤ ÃN£ã˜Û5ó˳_ï JŠ6|x¤£ 9Ëyr£ÅºO=ú KL_ç“0»²•=–-ÖUÜ…Í­À?¸: ”Ñ—ô'-2ëÅg¿IüwürÉ…†ÕÌà(±‰ÅÕ¦ ­ØšŒ‰¡ÂÞƒŽ‚HÈ@–ˆÛ*gœ\“ÐN^_ÿãtÁ¿½ºq¢6ºm*8i&zK95S–§‚uè|,XZÈ›‡VˆwÖš…WUÐ/pn¤¼’à¦?–ˆnêȿӪɈ.PZ~¸z*„Oe"sÝÔw6[øKÉy‘ #E×~D¤16€´í±]¿«RÄþrÅmpv¥Ì¥LwòWàcPF ÃvG¿~³ÖZBo¡¼^}8³¢Æc™~”™™V7Ô 8ºKë_Œ(Qjâ¸@Ý+á¥Ö÷…ÞF ±=¼B¥DæÖ(–y‰=UgãÝ1xÎÿ#+4ÚøÃ S‚Ï¿ÎüÑóAq÷ÜØˆÓÛÎ/Zä¡‘b‘½Ñ¬w%«ÈÅŠøœF˜ô™gÉn²ÿfFn²‚ ±©viß)¿R‹UÃ%¶‚Þog `—¶„Ù·à~ò«·îVú¡.ƒUBÞÒd{tq…¯Ûy¡€w)/ºW–zŠ@LC3X‘Úó\¨Ú†4×-hß´Õyh²ÊÿñC_$@a@ŒÃÚ1„*k<š7MJ1^)yh ?.Ʊ¥:Ýk ø´bÍÌòòšåÛÑøCϪ íxñMŠj—œ¤…#íx–-‰¿àCÃþO&]ëêþ÷ [Ks.–cD_ºPDEÎËujìÍÔ ¸H|…#û+öðÞpo+e"½îöƒ«FÙñ™ÆÂr±ÿuîtR1^•}Ó ùiàÃÔÓÃi'2ì0ýŽÌ¤.†âÐg窡Úá^¹k‰2™ê&ã ßÕÙÒʵªÎÓÖ}ðï/*²¸0ú°xyà¥r¶Æ»R·àgÛ•&ê‚øëu>VøÐ þVæ ]ŽÚ²–NHjNK¸R^)˜lµJ¡å‡â__Ý¿!e·^:Ý.™ñòÖ»‹mõmh7¯žg)¥X’}»vÔ œ'ÆxYRÂ;ÿ—{ëãŠö‹Èö€ÉgÈgU|?È %=Ñb¾uÀjgJÏWnf,ÏÁCÞ_êW a!R‰ÛJiôë—nåÿÈÇ~êŽúcºudºYTÎQåœNé¬ã>áBûßœòô¾4|ðJ5Üa* )Ï{±™‡©»øÈ³=¯êp=Þå"k„–ïm¯,UúJŒ>­ Ý]’¿¶¦[Ž.%|zß9‚òŸÃëvš*÷cuéÌb¾$=8á;´ú4hÏ×óœsºOÕø)|ú]†ª"Þ†Ñï5Y`ò‡ù $.óãa¾£:—i ¸ãË^õ3œO6k­çk7î@À¬æP¸è’fr¼žŸàᤷõ-‘©×“h ~Æ`C—£åñçð5{„4® ÒbšJʬàßÍ'˜gD™«Š•‘ðAdÄre~îÀOƒ"í–Uk"“Oâ‡ÍÞ£ã]¾*ÈÛaPI6šBÃCÜ„UõŸ*’oS²õûEáŸ~É@¼ÿ«ü–ÖŸ¨v-9w>þ¢Í?jääÄÏ—±RÉÙýŸÀ¥ÜÚ3éÀhå@kf8Lã:'Ä6NHÕSi·˜¨-쥦¾¯tcé†IØì<ç¿°Þ]dñÒãLgóÏÿÓŠÅÍnE ¬zì…œfå~î5LŬjÙ²Äp´FÀ_ÓQÚ9Q¼ÂAr%Xþ½ðSwsShòðJÝQ¼è㌴ž>Põy[X×mRžŒbBM%h™×9’ûcMoìâóÍ’àALAÛ«h©€õ,µ~‹Ï\,T•­rE÷²ô:‘¯gvõž&Ðê@>oÂמãÑ’­)ÑnWŠÀ¯Qì‹XÂbÎ"p¥>5ËS–ù¥:ãÅ'¡ïc–KdlTV¹.¸ñ»BÈ[ÿA¿‡*Ÿ<ÈÙYVJ»º0øsvjÜ÷Âcóæ„A¢"H:Ù4º§%Bûn^ØdZLáÍ-–:j!õŠ©ˆPy.ÐÛ# hÎDol³¤LQHáqÿ– }·ÔTXb­ö¾Nŵ”×c:k‹m³Ý,^‘”3hÞ'ž„Ù&æ¡÷ÃÃuãGÊ ›B æË÷Á‚wi‹¡±zè¾xÎŒ9Zdfÿ÷ÖÕå]=^!r—ÖE*ÎL®Ý‰·.Mà0¼J‰Y#ô©Ÿ iÖÑ¥¾œû勽šã#Q¼¿öN'#cQK£›¸U–<‚ï Ó#$˜•S3š^3>óß,Xrqs«ÔÅ"#À^—æ"÷.ΙËY-N°‹Xv%zyú?;`K¹Àß“½ÿ©ö>=ÂK—Q"¯/$ÜëÙíkz¬2ŒÚN¤'À ïO“*$ëÛK;w}˜§}%ˆF]lÅx§ dxŸ¯‹²¤Ýv£õ2dW£ž6Z‘Êkœ!J¬/8·>QÖ ÜÔ,œptó ̃Þ-ãäáïºßûÖ!aã Fîcñh˜)P8mæ3;Íâ ð*Ò¯ì%ÛøXƒ[\©ѹò¦êLL &rãLÎÕwÏ”ÿZ°Æ9¼[€¯@sï_xŒTê`øs·Ø•±ÒË+ðý÷‚ú§‹'ÕýØC&3ÿÔôäPå ¤î’íõ¼o'´º¥Ä”„OØžÆø©I} ‹Ä£¯œj4W(“‘©ó°ÄÁå9£³%à0Ÿ^Ÿy²sS<of³Íë[°HŽ6’uÂØµVJ‚„ÿîî`êòG¬H¿8̸ÐÝk®#4 °Ë×DÒuú×Cd˜’Ant¯.u͹DÝÕËtÍýih€N³`8uGÞúeög‚g­‚6²pøùUe|h%øY𢠖CººB4–3èNêJÂzè¬ÈéˆatßhçÐK›riÒÄmÂR“ýÈ2Bøe¤uJÕž‹Ç;ãVköæ†Ûõ„SU ªß¿ú«E>!?“Û_Ùœø\â^d†¿ÚG3½>I2›=Ãä'A2ÐxâjY¬FJÝQ-¬ÓÓ;ò)P©î²ÒêxïP‚fD{Æ'‡å @aÓ1.Kª¿Ç‹5CÚD¬œÁ¼£ZÍ\47óhDf ówLì¨pèm#…­ˆ‚¢úþ¬eþSpæ[¢µ úö™r\f,°V¦«±åƒn$.Ž*Ö}€·¶šÖÅÈhöD:â禡‚" Ûù±Hãf#ièDšqçjHÐ8énÂû{„NÕ90N…¡ k‘‡…Û7n2ü|L!†­ÈË-€&âÃhxѽ?GO)ýƒ(^ƒ÷Ëèч¶”ü‹9KE8I·QqœóM(â;Vƒy\lã«¶>ª˜¥ÒÁè|ƒŽ‰Ç&t¢/ůÀΫTèK§”áÁªÏÙÁ¥ú~*ÜNYo5u{"½DP@L GpPCž¥g<%ãLÿ¬ËºPÔi¥,´ß¼DLsÆ=Onþ€¨œ¥.Ö”X×£žÜH’™Ç»fXçÎŒx‚¢ŸVP©íšÜè9±Æ´CbJMÅ×Z hÃÑÓGk(­0Se¾”å{¶†3W»±P‚_æNå_Vx§£´®¥5¯NöðÔ<t&®ø}Û]°¤LaÁ© Ò#zEP>¬º¶¯¢ðÿšÐÙÞ¢$oçõ1Èö>Ef‹=Œïdóühµ² tG‰ˆ5_I‡HÍ4‘ÀK‚Åîæ97š*ðqº—S¹.Žha‹¬¼)Ížé€{Ù3Ÿ¯ô.FîÃTþ<LtE¥°[.×n»—&\se¦½-ÏxÈ'Èø~M¨•½"c+JøÍ.oç›ûZÕÀŠÙ QÛ” "Þ‘õßøBŒKb÷Çþz\ô¯Øó ¿ì–ÜH¹«OὬ=²¶_‘OÕ³)ã²îYæÞX¦~ó#I+͚ߤ7×IY“?"˜ÿ–œ·Þ¯ÊZ2j$§lªÂp  ãÅù¨Aÿkr+»‹ÁÌcŽêÁ R=|Zx÷›´_zªl7Šig–51UÖbßḨël?l!uGûï.GÚñG¿D@ÿÙötaR÷® µçÝÌ“²…ÒzÞ[úÇ&~kHÿ\,T@߃i «sæB‹ÓÛªÑWݪ­·ªTsMÛ ÷#ôú1¹«Ý²­ƒ«›Õíãô©m}/nRiÁ¼ ™â<-ɘ^v§™9cß„–,3åÚ•¯¾?G¦¿IùÓ£ÊWðÕ&r\rP˜òƆЭ7Iœúü~÷'ä]øÉl£ÊvG!›H/¨ m‚Z7 DwERï"ŒÎ±€qmŠ0¦K0宊i8«GþlÒ·ÉÜÄiÉ¡6X=gg'Õ;]&Ê$M»ƒ¨{, ƒjñÕÚÚós°éâ*äi Ù³ý¼÷!››Ûû[ ·V=ᛸKáìŠaA®’ø=JiM}HGp½5&5žÕ7Ø.ÜåS)PÄ#ñBØr1¤ š‡L C磉–ïÒ7¹Ðì„(’ÚšYÔ LþíGl£t°޳ú•=?WZQ§‰Êv¨OΧ…#ÿÀ…õN{´O&™góù‘H9š¤vdÏjŠ™!­2î섇'*§¨Ÿ´m`Ú–¿_Ý&`.™©iC?‚˜K{ü“P/‚¾C÷WASèO„Á +<sÝ0[÷øÁÎãÉ|n…(äLW8@<|§=žè­¢ÿCݱ+Ę*1õUª¾îð˜áKçÀ.}Ô_3¤@:Š2Ð^!® ´d÷µzbåcmìRŒa²L÷²­(þ6$nâ԰›¡ÿþ&c£&ͺ-èâ(ýÞ[t¿Ôï šu‚5²Ûyƒ(,¼ÆÑ…g•{‰Wt€˜zº ƒÝÕ€Æq×xj^&“æ2JkBçK;dwêM˜£ü*ë™ÔclmÂÉæ.^pzŸviÆ1ôòU ¢ïD÷ÿï]qž™ÓÊÁ¿ò`2 ÕPç‘ܦ“=T½£skz‚©ô⮄#nû#Q“MVYí8X7x¨•a,Ó¥=ÖÔÕE×$áûÑWÄÞüné§×³–êR6~óÿÒ£Qwa:}l#@ä¥w,²Yçµ$ÿÆä­Ç¬oU[zi5d°XgÒ3F»¾&ÌØÏ¬I <î (Ô¼]µ~iÃó-ëmp7ÙÆèa*µäР±Ûu‡¸_,ÊÖs2Nfߨó—²4é°Ögoj/ÖWPÜm-«êø² ¡¢šqbîœ"h1ÉÐ}f›º³úà£ù>cP:î{8ÐfÝü¢¥ð²å ‘AÈ;Vºñ w­uP½TsÝãMH™'2‰3¤µ ×nŒnß%(Ù¶Ò/ΖX,kµJ>Ó‹1+35Qè"ˆ¨c[;¬¶o6Vˆ$SëçC 0jC`ºgmI#,b ¼£è½[¨ä;‚ÐÆ“¯ÄgŽC#Êœï¶@d*5íý°ÔK†«!ÑÙˆ5œAá%2¤ JÓžfªfU«Æ}Èy@î€j<²á‡-Z¥IPÙßÌ[;âнÝHÄÅ"”Eãýû È•KH‰\öò̤3¼Ï×÷ðyÆÝ ?Šô2É.j Z£Ÿ‡ýÑ·M‚€{ ¾ -_YYÿpí¢¤Äm6ÿÖ‡ç(ß N,x _ûLDÎ’>£ã}K"wðÄYzuQì¥Eí †cˆë‰þ-XcÔn˜ý9‡èLÀVÊòÂçÕÿÐF[Û˜…„ÂkÏ{!´h­ V<Âv"‹ÝaÚ@V2'ëufŽ–´EUµ}‰ËSTó •ø±Þhæ#¸$h•À»ÓÉŠð+3F²øÕäîô ŸCxËÚ›·ýAó$g'ü†ïݪšï j¨–±OŠôiÒÒÔ<¢¯ar`ÐÑŒw°ÿt[”OfüŽFf£P³Øžbó ´ðï–wZI ž-,LçeÛ¼žÓÝfÐØõ^™À!»$>šN;†œÊÛ¬,Ä>¿Ùò FË'{Q2ÅŽú¬ Œ°éW¾—à\××^Œ®§ç8¼Õ.~PnæŸI¡ªkUbã@¹ÒÅ)’=[X0© <¤Ìå7 C²Ug1Šñô‘é‚[ö…¼‚Å‘óÐŽ­@çžÌÚêa!;q¡¢QVz*šÒ;¡{…áî¼›ÓRðî…g ½ã§âp ÂK[ß°M¤1Ì®«<æù³ ð%üwªqj~8,#€óê1ÀO)¢ækä/Ê•¥ T£jbѦôk¸O¿ ù4Sçû/,vHË÷DÝÓ,ì ’ù»F vz¬$¿‰Œ #|^pšˆSp"ä9ò/ÈB •ϹgÌÚ¸$S^6ˆ‘O¶[ÜÔ"ðЄo¶LØ=‰¹ÐäO…Ãàa•×7^ ³<)ÄÓ,n:£?&J`6Î$ä†q¦ÑªDo×›óUÍvió0¼Ý§†ËP:-|± ÌM(_]3B’+Ó,Q[©ÓuËà1È•.ºÔlÉŮԶ~ß½CM³á*wZ®+ ¡K<ñ‘.|_7çÞj&”GYqíµ:¦+³þjz¹gÑÊîy‰F±½ÓEó¥Dßœ ‡îuEÞXlŒkzJ=EÆ€z¿_”~û2†T;®iÝæ’î½w“UQ#E±ùü49•²:ÓžÀ“ËsZôSŠÂ¸þû?NxêC>å)$ž¼RE¡Œr€F©/3ƒ®ÀèÒ­ä ¤)’ø?î™kS°ÄµÕqG‚È.¤{ûH½@‘P SÊ`dÐXÆ{È=2ä¯3TêÃÎÆBN¢,CÎÜ¥@¹¹Ã&oºúy<ßÚZc˜GG‡¼¥ÿe® ÊMLyR嵿.š~î`ã~D?üoºQº Y>I£?Cq4éæÁÁ6¿ˆ?8N­N9æï<"FC óº =³2ú+œÇÎóuoA¼Äq5ê“úÜlsDC` ±¨!œvq*?4ʯç8¨¹•K¼°À6ƒ‚Éf±I<3·Ño€îìùnÓо·HL¦$ýÙðßK@`0oÜ¡–"˜WSnöª©/ÁzE›#:œ),Sdï~’7P·æF¤]"<@mË© h´{)ó iÌøJ;ê·ŸàÕ‘Þ³Ì ¥¯c×°ª b˜Bÿf*ñŸ¨aMõ®áŒó¾çƒÎ Ý£œí7Ù×™"uŽ^݆q©º*Å ôO/Ü&=|A‚,ËœGºC©öÀž&%%§z5ø,“¬5šQðú€LÙTÝg¸%Ë&ØéC‚a×A‰šŸÌêL³ï(9Ú°Žü'4í:”j++L‰‘DnR÷Á¹­ûÄ›$Īð Ñß"  jû´Þ­û´3 øšd¢1JZn=|ù!Ãarý!¡ñu "^öîQPÔL•=o7û}¹aEzùï”q VÈôQp¦q´F¯kÂçÛ½†k@\oþŸïY•¦e²èT»™Ü8_’E\9x€PC”Àú¦Ô"ýæ"µf&ŠUÛÉ^^EK—&ïh/Ï»_.Í+ ñÂs€`')¹£Ó8âÔÆÞdzöüŽmæPeìkebá ÅdÖªYIŠôçü§ñè2Ò$?ðØº°ROW¨­ç°ý³(”@K¯Ä<@±ÄH—º“ÆîUé™f”哛Š(c€…Úž§Š™«ó¦hÑQBÜæc†•8˜Y‹ƒøS‘³…N–§=¶ ´ÍšÐ¶|Z§KÄ6¹nv#qXc3h„+XÌ‘Ó{YÕœ9ë±t3‘¹"ŵ_ÊPˆ1JÕ’w›d¹Úesi!“èÆ õÝn~ñ¢ý:Ü lK‚å0O¡7ÕCݽdêGª›Ž0 ÛéÄÐë)&…>J@6#Ö¼;,+ÊTËaüÿû²ŒøÝ/¾‡AÞ¨ó°\¼žè°Ò=B: ¬\žä%#¦¹— &ŸÍ’þýaÕ×mn¿qѺ$ä©h+œâ£›q(Ò&#öˆv¹“d=AMÅ’œÕ•ÓÌ*-üMäiªË\K¨C;ðÒdãtðCŽ c®tôÿ¹‡a–˜ôqqštË0Ûyœ·<­²íL»©X½»QŽx%?¨ÊÜ-]‰o$áÛ;Šçªã¬#Â|X´Ç$TFŸÎxæÄü‡+nM—pIܹ*î?=—C0=UI˜£†iÔÉ:-•ÄÅôÍ8œ†¸Ûø,2½¥U‘p¾Œa“ôáݶH$JzíÓûY^&?•.ƒŽï€å27ž Y ²j¾Åü!BG ÐÞeùÀ­ÚÆ€$ºeã5‡ä ††Þ¡Û3Ôíšw<ÄO7ËÓŽßW|:c{~$ÞVè¶ 9‹çDÚF¨n²sþœ±Æ\E/âgYÿX©–ÙÁ¤!‹˜œõNäøãül0Q°Ž††nßb¦Ñ=‡ÌÃ÷.€?]!^Y ”V{O?©qx|0Qu¥È¯27€Jþ ×L¼-¢öš\!àvÖ¯lR‚6«j xŽè»«æŠò›VÃp”ÂãÔ}M ÅpOa8d,MOí·Þýßë¸'!$ЈªzÉæ}ñœ¶·F=¨®Nˆ€o”mæ ¡ÒQÚË»z¿-+{.ŠÓX9ÁÐ,”%“›Hêü°¼õ¿ù?9Z˜;LD{Ë*Û#}]V¶÷‰-˜ ß*b±”ûô#1 ñ,‘U•³Rܶœä~‹ò(6Ê'䆑eVÅ[OÄ•‚®ÆÑ3úŽj=¦_õõ|ïzlÀÍ+j‹ À‡“ÿ²a´n;–*°=½%ÎQÔìq©Tc-÷4!$;·P5FNZ$ɵû€OE½ùZä\×b£²##”Ìáò7&eéå>|òîÞqªsÁ¢ àgž¤óü¢ì[qe¶J2‹Ø2¹ÀîOÀx#êçl¯Cgšd|¸}jß϶lôñI¤3,s^ZÅ+9Ôw«~¾_^· Î(ãVkcÍ»z##^‹Ø ÛVó™-ö¿Ä‡8„”›;–ê—Ùœè0ÞºöëpT3ʬ Šî™õíNÈØÈÉ_z§§õë‘E»âpxÓvôxú*ë÷ž#ÃðB0 t‡-¨¨#ŸNÉ{Jpky¡ýÁûRtÿSâ9 ‚„ÑtÃW<€¶B¶©~øƒö¾“}A,Ÿv%À6ôØ“;[èòI­ÆúÎhÊOX›¦è€zºÓôâ$=|7ÆVR5Šœ^9ÿo ¬‘ÀV“O,û·¤J}š¼…þ®?KÖêq1ë’¸a#Ðøv —¬ ÕV[wþäûL^ê\5á—®>( ˆÂ B‹\ i7ü±®çÄ…˜2ð¾Zw¶éL-vÅÙ¹trÚvF/^FSÆüÚ›`îõº¢(Ë©”EôQ¶Ý‚;­qbvÕk¦~›2BnX@$r›*«G71c*%äÌ¥+œ=q¬þ”r ¯ÙXxüò­YÄì¦0r¢“PÙ/÷)«¨“y%~-ùGš'MŒ‹/«âî<úcº•锺üãA”5{'þÙÊo,cžën€˜ây¦S–kõš·ˆØ^á‹~õ¸Ç¨¿BÞÅWð,ÿ•±“{Ô¢Z„÷®™.K}UY£›†þ–¿ÄêY‡¤Nr$üftXHâ\—¿»9½\Óž¹»¹Ô\ìúlÎ4;ÚÿNk|=’-öŒ–7ë!L•…óAŽwa‘··¯þ¨åج!½[NÞ%a‡4G¡™ïG Ì{å•_¸VÓ„Qú€I¸ç',‘í‘ {@eMž8D’8Wô?¡©kiô,‹©„ä*†ƒO“y,ì(o…,›}Ÿ9 Â^0Hõ$oÄ )b)%p“nÛÀ-°Ù>ðCÚᦸ›«è>€ùn°ŸÖVä‚òК'AO’AÕP×·s’œsHÖ´Z@‚Ç-*4·ð¥(z¤š®¥>r¼†D” šÏv¹s®ŽÞ‚½Üx#ôž8†òÇL. ÃGé!£Rûô-~¸¯û7RÔu³2X4߬­z3èaEâøë×C¥àët:öÝæ‚^êA›5šrí =‚>ؼ 7¸xä¶ ³KZ±ãPœ3^wàƒçg…߃?PÈÐ#^.Þf…59ç‘,‹E9Ü‚UKw¬aiÄÎóšxcä%ÏÇÁ›¦_LLÄ2uœ²ƒÐ¿]“ü8 ‚?{®£¸Gg ZKÏMùÌ¡¥a×Ò´6¨ ¦×JÚM¶ï¾rt&iM©ÈùÐÑ&_1æ'Aœ”Cë{°²ª?vNÙ®óE.5›Cdí¹ öîˆXg¸™ Û¨'Æ©¥ÛÜ(ÿ*\ úu±'[ªw1òLk~›P_ š—F¬žš÷RÍ•÷:MéKÈó¤8Ù_o`ù³4v¾RcÒ?U†ØºÑ–›aæcüv ì&ˆf¶À/Ä5tKÀ(€=®3>zÙ°q,¾ã]XQEØJ^®€ï4£U¢ÊEcYpÊâѶ†ùüÌ'[k]À}÷½. —’«÷iTu„}ÍHV¦=h¬j ºÚvŸ#\tšàÕ݃´SCO–žej«ÆQ¬º½ˆF$ÉÞJÛ bs*ë%þõâ~¡ñÇT®x3Ü@ác©z┩ðÔ¥‹TFÌ;Odó)ôFü¿¦±¥IÊ|«,ŸJSãÃ[^ ´>Þ½U1‚—Æ„‡ÛÖµ˜]+ŠEç*%vøjõÃ@Wܤ>ŠvñòΜœ´p¨kæœÉÛøBén_Έñ4²¨Z‡žYž oÅ…ŸœÌ±©-w!¡Ëäy†škiZ …Ì*ËRæ¹ï1®rÐÚ­ü)g.êdls7l áæŒ7>©¼‡ó»þt pÊÞ´ý"ÿúöàHI ƒIuNá'x©\üï*¨;²îÕÁ坿‹ºÂ nh¶Ï8RµS±Ê»Ö7ÃÉ„’i·öò½¯Çw[ÙO¼™†³"ŽŠBO Î¢Z£åÚô*íÈñ®©Íé1ÿÛ n ¹o€×Ïà'’ 8Å{½6—äêΘ[¼áròÊ÷µGH!t+.L*§u”H§'­,œÛ÷MKû¬Ô©æC$ô•¾ÐÔ|úD¤—åÍ?rü·‚-ag-H9°­ƒÓÒñ€Q£&lKÖ1Œ­öC€ ¯6Ò”GñB³¬t;´ãœÍ /]¾AoCå¯Ð‚W¯%¸/×#”ºò×ÀÛ°óQVíéEìÚÓV—‰ƒà‹ÑxŸËrÓ2ïüQà•žo,|®œlíJ,ÅIÜýݺÏÅ¥ux‘*|‚z]¦) [·Œhq< 9<ÜEÆØ™ìRÇéùm"A£Ÿâò²ù£œuyT¥)ŠžQóOt7ÀĽ¬á¼T sÎjy&ä½/ë°S6¢64,]&aô±éáþmÛBàÄ0£d­&í¯ »`ãµö¥¹(Fj6ñ¼kjmÏ…s8VT/¦‘I$°=£”¿¯R%rŽâã×ÑdÇÔ?Ènk͉ª7žä¾AYóyôAZSOó§V)ª_†“ÿÆU!1fÄ%²J-—æÓ°ènîƒÛ›€ß’_­k: ÜÑó&I£¸n%¢Ìø%Sø ¥d À/º­fj)KR‚Ïÿ‹Ì#9TOÒ.büLœ–V>:e%IVÅJ ÔæñH¬á¢íƃÑà½üøsªðÌ›õ• òO“-T½ü%ÈèÊÊ2ÎÏs¡~KQúTJ_™4ôèjþ´—Žã¤J>Íª‘9rî¬Ê-?DÍ'öXäfÂm% ›{ %ô=páDZ¹¼œ›ü{StË2b‹]¶irøêM¿Å ƒ¸(H<ïûã{4É7d`ÜDoßsБ1CÊ"ÿR–Ѳ•Pþ‘ý§.8NÕ¦£> þèC•òÊëêmáŠa'šE_$‰„y€áQºyøãÄC³€íNüúrâ°¤¤Ž6hwá“ñ4ÕÙÑÕ]lekHæ=JU¬“ëêܺ&…ñ]ï8Æ-N¡W‘Ôé '(›6‘UKåK˲¤s'h<\G½Í-%>[|5éýr¾ý![ç„[¹ãͲû5,§>éÖ“¶92O“(@¶€õ99°ÐküÞ>8-;gÝï¦Î‹´ÕÉ£ñÊ0‘½‹`ÕBS³}ŠmfXlH=øgJÝWÓ‚åmÚ¦éß$å{S ÿdÀÖ?—çjL„¶!ún>2ì•Ý9â÷%—œ‡ÅÍ~ènššS®O2?\õ (Ð[uc“w g6§5P‘Æ‹âÊK _(«¨a9lÖ1Ùe]mKSÓ¸©«§4˜ñ±FÃÌ-˜tÊ*;S«{Z8éBœ¬…B—!ÓR/‹ý›"n½–áÓ®ì»#´á˜¼çf°MDz ¾×ð,—¼O†° +6C9„ŠK„8ÂHë}ûRÅÝ+ªoº!q ˜? ÈYß¶îG¥:–¹¨ãùÔ~˜Ï¼].‰0Ùë;(.©Ç –(Â.|8¾w²K¿"È~U¸'‡Øû}ÀAí‚¡¹OßÝgEàNIsŽo°Qqs2 k®if8A+I&¾×ø?8"oÔë,ô⛌;7­vG)«CÀù¹_ì >7°Ø?6X l¥å{ãY~8&i븳;n'çÝ!¼í*U¯än‰e¢¼Ámà­Û–Í*]¥H«À*%ðÜSWdwÈYýä}îñí`æSfþ¥€Id*,ê²iFæZµ4¦îcžÙ·ä„'£î"Úbr¦pÖצ)¤Žs­ªf×ÍJÙhP¼Ÿ Ê?.Ôñ§*8{ ˜øŠª>k|;xA<;šÊwÆÙ(â‘y× ðãL1wΟe› 1ñæu ^lg¦2¥RŽÄU{¹Ý§/9QϘ¿‚Óˆq¢F–6ߎœ¾lyC_½‹ÐÌtaÒëÅè5dYóŒ'ÆÞúXx·žK(ƒKO •êùͪ'Gf‡šq‹viŸKyI£~„§[H“þ Òš­óX$g •tgÜ¿xÙN|„ Œ~Z—.¤}¥Óg”ÒÓè¸p7,¼Ú%x½îhTίìå0 ྎ`` úÌ~¨“\mD. P_´î„ðl; Íà1aËúc¾:÷¢e€Î§8>–o>:fù÷÷#RÙÔË$‹¬Þ!¸‘Yx0iÌ{´¾ ŸÆTV>º€fíØ¶Ïä˜Si •Â!˜wÎÔ_¥mõFšqšPEâëÅ‚ùÔŽsë)ªåAÄÜ™¬ªÎY=k²%¿°B*Üý—ESð£Û‘”M­ŠÊö’$iOÏÊk—•¿“Üó$֛й²G÷Õ©÷ߟŒë}) õÓW¢ü6‚MRìòhönE­û•ãèæÈœc³£„Jf\¶R?"H ¢Î†¨×ÿ8ækhÏG¾)øa6áøö¾´ Ì˜íN²Þš4'©»™2«b÷+¬}lÅô£ä¡»•囼ûš|SB¸W;ÛŒì<‘Æ”s¨ž3KÖÄì÷Õˆím:°¿ gLð ­GšÐ “^@U=ýð¿q´£‹èÞ1è8¬ŒæÛaä¶È²&sþ¤óWŸÇÁ¢>\Ø‚e¼ý‡ÙÌÀg.˯…à\T¹Ä§q‚³g¡i ç‡ëq–kè±äwìo uÞ_ò¢F¹†8¤<¶ ›Š–øyë­f6ZT9dŽ.O?å$¶¬]ÔMúˆ ïúùôÃò«© qÝ<Éš–¶ ³ §È@€ï{ cÿDV}º÷·³Yë‰DnC£>Î[ Nä ™3Òp{Ée)›ÏÂ%œµû,“5d á¨õMy¡¿ 9Eö˜« ðýë˿Ѓóâ-EQ‚jw¢¼y»¯>ñOnÚà…$Í€m7UÙÔb]Ÿo‰º{#‹°ç÷âñçÖû¯ @½·å\PäƒuJ¦?LâÌ…d5Mjédp`.Á‰Ë˜—îÁ¤e&ë²Þ·%J^GåÜdFfsöE­g­Ì¹îýáx@)¨'¹Ù¸Lì·Ý‘ ½>wíQGä7g, JmkzQ¡‚î7M™»!àÓ±JkÕ¸Õ…@ö˜aÛÇ.Þ$ 7’¯}~–,Ä™ûéP÷a €œ4nI &|J´ žQ5™h¹Ä`ï¼³n¶ Ê¨ñ ³¾¶18XM¬=9¾\OOþ¸ïQ['²`¦íÈÇÐ.‡Ô2š¾nDKŸŠ†›ÓΚª5.Z!´”½ NMOf躟#ëô•öEÝU¸ðê3®jñ,+/rW9.œ #n·ëvÛ&€šüF©û:~ÁU“½ !ÈñêØ”Ñe›·H–î +¼ Cç½!šD¹`OlЩ ÓñŸ'êQÀ¥XY7íóc •×¹?1&›tÔ~ó Þž±ÆMÌ(Ð P_¹Íý'óRp©ñš']yò–øÇBp£GöWŠ;Hdç*•@ó±K®–ݦ,þù1cý õÓ†¨h¤3Q"èÒZY @ÝÊ™iøû£¹Æ-õ¡l&›R¤—ýìõMà_£€2 㕵քOh–D(ì’UP%‚<ËßfBýˬÞnãoiçz'-:GÁª (Äau_4Ù¸Áqíj!o»t/Òƒw£þ›UwjâXaª ¢6ÑÕÕkùœ«4Ìú.ëöI/¬¾G…û,+1/õ1C»§J·˜àÈyÅ\Û%óeþßå@øÖ^Šuõ½K“ûx¬£zT2M³.#ÉBŠöLPâLgcÃ*›ä.[¤Ã°Q›K-EízóÛªû"r#­Šbk‚–uº–SŸ77Uþ¥Ò:Pw .Ü’#ô²p L¿ðNG==9:á´…)”npå‘-¬FB3û4DW ˜?ióŠÏš*öÍì}_ yw©cP2å+9Í oÒ~¨ƒ¦Ÿbg`\e=qƒGîÜǤÒ{ÊœÒï;Ú¿%¬Ã0¬,e[$Ï™væ×1oä' ‰KGÿcMl –Ïm:ΈJ£ôrqTÏC¦5¹?•Oñ&ˆYHA„딂ªÇQ¢ªF/¡©lànüûNY­ÒÀ&·ØM%/ëFËb~$öþrj‹wWØ·Š}BW)–ó]п¹×b!‰gq:ƒ–‚"Ü€¨Zàhþ«ªõ¯ÕÚ–®suqPøàÒk™`€äYÍ¢{Yý*Å$sÑÿ¥$¾`0˜ÔR Sƒ¸×¯)‹ðIO¦Åª-í郄~}b—›Ä(SÚ4W¾9öm|/+fLÓÁ ÷p= h/m»ì2Ê œÙkB8LÅ•4,fÄ**RÀ~.V©ô~p=Ë›|Jvž%¿í½×q{Za¤ÈÚf¤t«†!Û‚GvÍ(^yÐŒ÷jìŠh¾ 5(±{Üœ¾šÀ©‰&6ÅYØe2»- ß7¹'%d‡\É] ÒW(”5kñEÌÕ˘ßà©ä7‚¤ª_"¬ ,Ì:* O#æðíâ·ùºél«ËX}]P_?j@Zá£Ýp#¶{Ædƒ“ü+œ vS±0ˆÒ±üùàÑÆ$`‹u¼“^½×;žoƒñîiá2!ï^Zõ®[msHË\¬²ÿòqß+ñvtûq_x[Ï©™¯£6ÍË`Ûh âKŠ}çcÖO†tluc‰XÏŒÁžÐ[vXáÎ ÂV[r~óúǺ\n]˜æ39PI®Ôìd gn8R둞,ZHí­1S®ÝºýKéotf\F £{ÜTÅÉ3VÈ_eºÌc³ÅìèŠX[R*wý>ˆ>PÖXÖÂÿú•²{÷pãAˆJ~z§Ç‡kÚtÝ<ŸË&L´©ÆÙƒÓuóÎ=ZÚ’Òô`“JÝØÑÏUŸˆ 73¢´œí¥^·¶‘øaC1óÕØ›8 Ù¾)eÄøo¥a•óûþ6p’€r’¸ù'ÅôO»¢åì’ô•$¹6™$y†áº=ˆâå¢~£s¸`øÿÿ$Ò´÷%SÖjIZ=+éã@{õÏ&0ž”úä|<§*É';0ñ¦¡QÂJÎ9Éõ2 à [Ϥ:8%‰„"pºº©ú"ëÚ5yr¥¾´†8oüž£år†Šæk2Ä‹™r1e©´ŠÜ °-ºïú÷£6™)@›E÷;é+"Ôþd3ð0ÃßN9û¢-½™$7‡¿öï°ûÐ[Ø«¢ºÊ~f·tÝuó«Rv-\ºµ_&VËÁk“o°–d Ê‚ _¨»ÜñA5OÕEg Ž=—JUý%ùþ@½OwE¿a¦µÜ_ ~9 Ü#Á‘Ó9ÜÐÜ•®oú¹B8gé¸Î|ÈäÅCõ49™B€N›åNè"Np0{øŸÀ=$k‚ níý5Òa…öø ß½pÒO0äo׸Ïoh¤H¹±Ï? :…‰¾†J³Ë’ŒÌ~Võ¤è-Ù°ˆ)xqGù‚ ¼O•åϘٮÕ Nû@—H!MVßÐ=SžÅƱ»²¶F_Höê;ð¶ºÅc—9˜r¡ñ*ÄD¾#—v]wÁÁÆ‚ëÉCÖ+QzÜ>‚;"+7÷M6Ü3âÃìŠmå(6àtçÍB´Oz<ªo!ðÉn³õÓQTVBL€þÅÈ:‚…÷©7éG Þêƒ]ouËiÓ½€¤Ý7ÀÝ)=3—¼ ¯¤5Žm²"e½FvÁ·XN¬.`e4ù2B—ºÍU6éöá,Ó:TV Iz¨¾i*(AÚñëã „‚ÛA³4PÚ‡òÁŽ+7—Vç\‚trÂÎwR=VmFË?û­ðBï6L Ãz[g,Av±U”z1úeŽÑeiÚux~’° Ûø:ŠÇ'H1*:D¨ «ûnå2“{¡ûKEÇ‚Y9åÈtÕÜœºìU=2zÇY”øž5AÄÙÜDjJ¥Ô¬…æÚ7‹ì湺mT:ù† ,@_C²ó áËë„âüÇè•”6þ}Ót¸>¾Ý\õŸíŸû÷ö¸<ÛN©QV²ýVì«ü¬— ³ù¾Âñᔕhd¤Ú!Ë9oeá«%èl |£yÈzmìmÈ /hX‹?( úù ѦÖû…ì³™z]Š)hÉ Ƚ¶ ¼±÷h¶¨6hÊ£+sØQ [´IÊÅ-ztýôOuf©ÛœBú…¿G­]7Š¥&èH¿ï²ÁHûîˆ(Ú1`ŠÊ·?!ßž’;Øì /®WåŸ%O6šU¢w"»ô®BLù:JÂ.(ý«f¨ö×±rlòÐS>­KH$×ÁîëÒ•¸0*<6ðjë]ºrtËq aøä¥†ÀŠkÖç†UŠ“{M!ÞGæg£^üIö€r Êq˜,êÛ<)S üš£ìqwK}f @{` qÚíòX¬B¾ª(ú޶YœÞ Äñê(1AG—¯SUR¢ì’¾Z £™ñ!nLxsS&DÇöüÐþƽH—?ÂõŸ€Ä H;lv¶=m·ÝR1?±2—zÒÆs&føoÀ3mØîPBUiU¼‰á½ ÃSCÒéOø‰ÐòFùY 5딚껷Áƒ@An… ©ŒŸùOLVHéÕqµ§üB «6ö¥~£ vÛÂä†u®»J½Ù "ŒHž) ed‰‚Øî­µa§¾à— –MÿÍOT˶¿ZHCM‚*†' è†ð lJß“ÁŸ¬GÑ^ÞiU±@T‘KW¼Òæ,ü¾ä7ôýaRü· ;¤ Q¦œ’‘ +Ï2YYšÚðEq¤”‡‘®5“6{KækC¹õw,Ü~JÖ*潉ý,Ê«äÞ§KùÛ»«ØØè˜‡|ky&WÒ"ƒ‹ç¤ó87}Ñ }éx·pHþ|›îÁŽÅlxÀ­X}[”ŠE]|¾ðhއ±Ñ6ÄUP#N—tÇà6Bq?5J\H—†È¥=õÏ ˆ6Q6ˆåj¬w¯pnuÛ9%g@œ~n¨æÈ÷†j½‡áEË´Ôõ!Ý0¼Ä¶áR<¨Ï?¯¤ïë‘KtÃ%ë±öé½pj«6iQ ã&AÇü³v%U?N“Î÷Ë\)¶oŸFzNQKµ=°/÷-ð¤“:MQ -NÐÀ u­¯AÔFž‹Ò70kõÖ}) á3ÂPÎ!e²Å2 É›…?„$„䯻hì6vé5•¶µ&s»1;ðás&Â[%¸`œÍ¬n}•|}bqK2?€\µç[¬~wÑdÿ2DôÝC”¸Öm_~å  é‚w^]¨Ò±ã´À‡`ù,/Äf2âg­¥Â9løqŠh\>¦Ø2hX=`ÃC}[˜“'žæRXM©¼].:0°4Nºá\p„] Ð¥çõ?ߊƽO°—¸;!ÌÏn?88UÖ3a2L–á\¯1BT`,ÿS¹¦C)û¸>]wIv¦6&?y–ƒ9 лîÜ¥ôÃ̃V]‹¯™*aé>NŒ÷\2Î`fá+¾§À@ŸŸóà€¤Ñ÷Ɉ%qox4é—KNZË›¹tŒãλúoˇûÁøÛ†ž&òå„Ïc@cŽ÷dΟ‰[Ù66Š»R÷´–á:á²'à À,.~éü =3þ“n¾TóX„1ÖDÓÐݘüŽ6²Þ‹±Ð¶qØÚB÷‰àÍ5€‡ÏãôØÕ¤Ø~ÕgØH±âdz3PŠˆ ®ü…¦‘¢€eýEYd^íÎÛ†·Úójávv’”ú7‹LbÜf3ê»^àëÈæwNò$ÔJV’"ä:_Æ"W‘ìÙ°âÓ==Ø yë/“ýaæFæÒ@Ú¶%Њ€ÁTÏdJ¬2R§¡ä÷ÃñGqCª;´<ª®¨¹+˜6ŽÉAsÛ#ò\©ƒáö™ØåÂ^Øo!Y´¾Sk[:gOoæ·ø¯û@¸@±­ö3¤ÁÏ2ß1G“}˜wŠ8_›”£ó²!é"Ë}Ø#ã)TèJK„"&¡—´¿ÝæOÁû ¤ ~•¯„D¢9Qj>ßÃÎTžÞ—ìdæ¾Ô·¨šÝK³µ#Á™[<[+MˆÚ(·‰¼•Ë”ëÃì‡ÙéÚpNš—o¬uf¨4ͬ,ñu…tôÝÝLÚÖÚrð„‚ãž ~01'sÇߣ\þö@£n†=ÍZߨŽW̓ñD'M¶±; «¡õ‡(ÑVÀÿtjsµ eI ¥é׋ß,i“èUïÈoÕ>[Ù”ðSd°LÉ…éºÓÅÓß¿"|Ö´yz~ˤiIÓ 1H€ÇVÝ×cɈ[˜ïÉÜïgÅBàܪ?e½ºå‘™[©a쉎jǪY+xÁÂT3Yó ›…¯É X„ùÞÞU3 º<” /aÕ†’£9ð—HäË/JoßÕ SÙ^dÌ«ÎX#&§ÞÁÎTtØSNÀ?®Le‰ÿå¾}¼¿úÄ´Zˆw¿Â´ûCnŒØÁ$‚qeA±ºI€)\ÛÔ™Â%ûø¤µ¹žBØ/¦€ËF;º ŠY¹=}¤F£uœá²±È÷»-³¥lr¶ãʲ=…«6EšÉnŠz°„?Kñë6éžðÏ©”_³„œüg[Ž@øÉ~½Í8ÈÑ«¯\=PôwëK× Ýˆ£•œïÜ2=ŒY»W¤¡_^5Xȯ“ÛEV—Î讃ÖL@.Mhu‹à’œ0inûÛô r;Áîÿ(ªpIPE‡‰ó±û„âÂãZòTÿ–ÔKЬո?ae˜zÏzîÎ;Ñ, ù‘ê¨m“šÂÞóíÚ˜SwFýàÄ3ÆzßgH%:µ£C›Å“ú—“4Ú«§j¶Ï/ð>ôÝIÉS ø™!7­!žß¢I¹Ž3X!,{=Ü‚Mk%"ÆŒÇþWë Fµ¹‡2{ï+ÆþÂ>ww˜Á®tF"o]²].Z”)–šTô€Û?ºåÂc}Äc 8ËLeâ£;¡mgð“ÀC)ôMÌêÄE±';c™?‚àj2ÝŠK§Óò4Ù/p Š>^–XM!×Û ¸†ç9hÒŸbècú)ûEš/ü Dÿ8dW™î{ÄÁåö jLëƒ êäœÔ÷ìÁ÷ero¡Þ$‚9óaÞÖÄÓëèE"‚ È¯¸C®>'µL‹’`lÞ&¬mñÒ‚]Ë9eÃ1åèý0º&†CsJJ©*ôèðGo'IÇɰ½Ü½ SU:™â´¬=nu¬|üX™b«˜uÒË^«ífŠe…YÆ °–¯Æ±,º„ÙNÖË*¦y2è:g•5¹ãÅLíkÉò‹U«^¥OËX>Z¼Ž×·ËcœÞs¸ÏU–XI+l;ËŸv“õÏúëóòË`½Ìr†6,"Ù_À|-º~ú,UÙϸÖëƒÆRõC,$ Ò'+Ïîƒ Ü<~˜6Ю܂ÿcˆO\ëUvd+‰%c¸D³Ä8koÿNOÖYŽñÖã4ó0„7 W€xd7.aÏÛíG®©Iü=è=|sü1£(笹âjù}ßÂTó#²sº<¹ÎªOufÁî `5èäeY®ûÑ•Iê'ư^JÚüqÜtÌÈÝÖ§áT ÇOxž3€³bâ¸}|fhðVI…*>øc2Ô¨âÅ|rdÝ ezÍy³a?+’13—Q˜äµ•ðÕš`ô4Q/H  ´Õ"óº@´Ô‘ØÀ³³OïAÉ, pZ½YU³¸¨ûªíÞ´^xxÍ=ƒ"ÎpMêÄ.îMÛ™çoåHèXź}f%¨ò ò—ýd" ²™ýõ{[Š‚¬!¸9ÍÖÂrÆ Õ.)ÅÔ PeH„g%hlOÇ ª)dÓÒbðæª†ï°éÉ8×ði¸3{}þÖß8jzŒ+àíàÍTÕyHÎmróüëÆ1H«õMûãüêìv bEÖ:c@-^ƒc“†¾\ÿ\ê¥ÐÝnlŽ«e•Ð?’LSú‰®»1Î¥ãÃ6wë}vóƒê=þÁÑ[Ë8ùšeâ¦Y5ŠLƒ¶®‡åÆ–„òÚ’ôv>¯: ÏÂÀ©iZWø¥7µ}ðYaÙ|ÔãξM\<óÖþzKĹQ›Y‹<Ÿ*R8¯à8!ƒ®÷5LJÆo¶2S²ÎL²Xþ+ãÆÅêiµõ9IöjDN.Ù¤—[ûr N‹mMWùŸÁšlÊç5Nýù›võ§ÿŸ’Ua)º>”zFã°$³Ã‘|¾1´ÕÃjÅH:û¬´´é¾é$‰¹c®´ÄµÛáÌŽßÒ(VY¡' Îìï9`)ë® •VŒâŠ!âÊåN§*é—=¢c·,äÌVM“Û¦£.,ªGlÉ€< Éÿ}'î¡ð©Ø(,K³=cñÂ7Ó¬’/ÚçZˆIh ¹™³ßd×w®»¹£Îâ}ºï¯ÚÀR31{8€ó÷]y(:±4l"ÑŒÆ0{ •w W,aÍZ´(NÕ’Í2 iG+Ûr¤Ì«®î-¢Y|wsÖ*H{lEËŸ¹%Ï@Ù³ ÆÕ¡rÙy¢…(E­†«rx ‰ÞHàØôx8;rò­Vú‡4blÔÕ)ד–Õm¯:‹å Øòà}Ð&â$”'Ûæÿ—?(øm¦ƒ°cÏEwJÞkW¬yY²PÀ[5ÏöZ9$?ž3?[þ+ Ðb[ð‰Æ,) > šÁää[³ +(¯n)oú;N!òüÜ>v›\v&0G¼x>›:\í2jû›oä >Þ`z ¬‹Çòu ƒ;Š_p’~r‡Ñ/uÊßjSäê·fû$Ó~Çd”ï¼°Nш|²Y—"$~ib¡óµZQ/øÚo×m‡ÑÇw'ÇŽó¥ƒ_\F%ü>,îWótŸ‡‰Ñã@W9p›vâ>kã.=^óú’â=ñبÍãù>ÿ‘biM ,ÏG¯KéœQ2ÂO@®¸µømèö¢ŒöÍ%m¸@šñ¢#t msKíhð'¯Ì]­U?rÈ}ÆUÇElñ|®œQ®”›£æBèC²üà ‘`:J-QŒ=„‘''åK_gö–µd´¡À﫽+5ónd]¡óëè¯á=YÑ.³¹2r­Ý/š¿hɸˆõ~*~ÒïNÀ§¡‘ÿ•¿–P>[†~&†CÕÄK¸Åxݡɢ@JÉž˜L>gh ´¾Æ:üÏû Ó_¯'Cõ£ø`ö–6e±µ±—N÷Åš~{Ymœå_w¦òe‘¥ëJÙ®OElê6·³œZ‡±ž‡iQö;Yà·ó‰KŸ7Él.i¡Ü”¾_CXÓ$ÄG¦ÁTÐY‰ca·éXòiNQ$¯bXÿNÑÈ´¾ ZCÔ]}PËÀäô£Á¬«auËEÆX'µ"v”„ô8 FQ£2.›sñZ ŒD7‡ÀÓKÑɶ=æšóŠ O[­ £o»¬á·ˆ;p2Ýœo9Læ{D7a–iÚ’gF*¼IC˜Ýq‰;ÐÀ1vã8¤=¡LÓmÎúj³mÜûš2©¹“¦û²G9õ,ÖŒ V’ziéðÂZb í)\‹.*Ÿc±©ÜRS³¶KâÊ%ØU®#½²í‰:õr=~>O/ 0y_*£"ÓÅÞPñMKÄÅ„´­ Tª¹2ÙviØ>v¯ÿ‡VèhÙëw÷'·„/—ÄFež\Ô8ë$÷÷€Sk\ÓLHßͧ>Á0³CŠô¼MÁL>C0]å­LÀžf1ëMVüÃMÓ¬[P/6Š—»ŸVyJ¢ŠÆ‡]?ð͆™M°'áJD†Lc'ôKþA‹‚ÝȰ)²âº¨ìö/)^QÍøIϼ`/7-Ñ‘ý0hRÁyp6Q-¦XŽuÎÀÿ´Ò §/\i a™ £ 'äÅ:ÄSÙª»‚…ÍJLuðpLì`éÚOwì¬ŽÔØ6>º9l!â‰D!E.H¡:'x%‡7U‰¿øýO¶mµ TZæ,jã?„é KDiÍå˜þbÆnzÊꌜW´tél'–°bÚdàˆ…õ§ –„äÙu¼äŒL÷­øN7%–1T^Ú«ÒØ1º„¥Yu²î!i‰^3øÓþ8il•.“%I¥»ßwµC',3ú,œºŠÔi]+…q$-èòž<ØP]7ý])æsó+gCh^rÓx“ãJ¢u`Qº“öàŸ«²À <»5}T–%hØýkïiøá–e6[ô/ÿ~úEÒS¹±ÍvBÍ„ŸwϾ,h›FÅöšÆâ L0¬‹þ2gSm§–Éç’­%2Bø9 cXî¹31–r޽B<¸8ÿw2Ç$V¯•8Po¡¢™eèÍå¿è"Ô혈ÿýñ*;á.–¯«=Ö'mÚBVÚ¡ô4Ó2Sô‚§â¾ÁåRÁKÖ«·XË aX'*ކÀ%²7 ÿia˜¤:2JâFø’96Vfçpû£’6~ Ȧ7¤YÞ¿ ði?0Œ5’ÂÚ&êú–C\9Æ ,QûŽMë N¡>úÝ÷¤s¢ö®I³©B„ˆÐ Ùµ. îüšô´h c=Nj `·±àÐe}ô15Ú9ò˜JòHxÏ4Å–@Ã÷qo<8A wÚs ¶1b)VÊrs+¯÷ ú¤ Ù¨´—ƒ‡¥ê½óyJ’jº´O\ÃÈ简óöàF>>lxµ¶@þz6]>ºjD<(Vtþ@òOȉ>t]þkõê©÷'$¯yFXW½u3¢Þ˜š¨»'PÒ«+ÂÖ«É,öéZj LГg@yÕŸµø~ÆHÔˆ;ó¨ÃWžátúðÕ]öØ‚»µÌ „—Œ»š”Êî':`Á\VZé f…)  ŒúÛôn­èfâvßS·^¿8ØÉ^¥¤°½TóÒF…<DÉ6BiW@ÆŽ¢:Ø£ÇXZ•IÉ HjZxIg‰^¨Ð©ŒtGÜ83Èö 4ég†;üíc~b1Q;n’ÇW‰¤WÖÒƒ Èà¼âŒý±övÕOnù‰ÒÊ-ûþuiL³”Qz‰Y9¯_æäçÍ¿$6ND2¼Õ#Ä;*[Ÿ<¿A•Þ¸`%§î1_R€%9 Q9ÜF³­7­ï¡ÉuV+@°ËØ€lÝLL«nUžZÅä¶@ôÆ2”ÆõÔÿ-"Yv>â9í§^­ŸwS_o 77ßcòSô=ëÛõ2ZJ‡v†ÛnûÚ–RôŦnB+22‚„¢Va²ˆ$i(ëŒËd ¾x‹ºvcPMyò÷b“–È¡WG7NŒ¾t1ÖÕðåüÝXŸÂÙ–VÀ\+ú–Ÿ–Õø´ÂÕiCK¤¹.‡&„×|'öŤðêY® r£/r{~j\óo@½šqÛÕšSæd›â[®£)™> ºšÏ‡~˜:ì™Â “»rFPšTïCæÁ~=hpcꜲˆ†1^[.묳J@bNî2ì“tjvƒ­ Èjºi††,Ÿk‡ô/+·J°ÕqOƒök©¼€ƒê§n/&ú]»œN(f¢FèAïFëT]x»cœ*¨üìÙŒÖ cßXÌÞk¦ÅbN#Ÿ«>³ Ê_jÀzþã`Ñ ·[ÙlÇÕè µ¹y›QÌqVa̧T¬°£[Z³Q—ØÕÎ(u£+’ÞxÂ5†ŠEÓ…O&ÂÄH9Ñ$†3õ²Äã…/@~ŽhÔˆüâ.ä}Ü ý4çUü¸ÓpåÄÆZðâ¨p?Ë¥ÆFØW›¼ÂKÆ!pTåwµjç­Å²¹}°ó;7•wÇà³`˜’9Ÿ{áV ŸùÎpw¦›ürY¡cÁh’qy}Q[ñb+7TÍN)m2¯5xëô’ä©×!ëݧ¾A£»zä´>ŸæzÊûMG¼S"ZÛhu@aI›\k³–._³mÕ%þÉ?•ÕT¸»ÚªdwY¿ùhg¸‚,Ôþ>´´¢#ÐÖûªjr†oýÅΩâÐ;»¯Y°ÉñzgŽørá ï Óò­q¸¢ÚVô²ç¾¡ö*-YgfEÂÉ£ï³:úÄo>’þé¯-øåŸ•¾FÔ5&\Ù°¨¡u=P#Íùs(ÒµYÍ} ¡r´ðÓ "y¤Z|&Hž?HkÓFËM.Ì0GÛ ¢87iÕFTHmT,B¥4Íä¿Ç·Œ•‹Æç‰-™‚›é šo:3ÖÁ²š½ùQzËIlbYû¨†ýHR:¦æ¤›gøùš eÿ?WǤäQ:N[ØA<Íó]s/Y¡¬\èa¨}4›±%ìGBô´‘(QYRÓI¨ÞŸù«Hì$•­Ÿ÷ÿ&,­Á€!I:`/º:¯‚î¶å&óÊ™ÑaÎÉ]2î BrK½\uäEñ÷A˜+þÍB°ûouýu¢‰yÛ• „Eþ¬v‚°@ê8îæF3ökökݪ}G¯zp;V ¬?ZóùL¤gY^+@ KQÝDñ­KˆÍSO@¡\ù¯â•îÄ*ÿsõ:è%1Å+vd8W p‹4‡«“?AQ{Ëçf…ãý”Xb²Ùóºò!Ú¸ªoü)yS6G¯&sıoê£Þªpì®f[N6XŸ1ªWÈÄPtóµ÷wóÒț˦Y& [)#©šR¨ *m^7ñBàâTóX¬ /Ü™:ùCFm!¥i›|cŠ ‹£¿õÜm™„k'B‘³O¬¥ÖÒdkpŸe¬IKg¦<~z€CHà’R¾¬š)êö-7']XUꡞ!ÞX§PJ¾GýJEÒ÷Ϫ¢º©ASÃSø8¿63mŠÙ`“ÌŒŠ'Ê¿-NšIÆ©(AøÆ¹+‹Š,òÚy{£BöãüœW¦Îü¤Ø µ8< „r0íqéã VñB Á¯®n>C†xá°'ì­‚éŸÈXrú{X=Ì—) ¿¸¶mÐêX7&ÉG”às_×8í 0X"j#Ê–™´Tˆn#|T'BõK êÌÞ¢ežg”LŸ·½×~¨ ºzAÒ2¯™q ËŸXì<¾‰.R*"É| «« [ždÞ Òy°Ä.w:¶ð¡WØE>[WôÓ%*qÔÝÁ¢è£ätäÔÛã2ŸBž9]7<æñ;^7³Á(ˆžõB1ÜjJÖMäÐjV.z±Žøs¨ŸðØ•^ °wÅd ­€–è÷ê³ÜéJ7rú¤ˆ‡OkABh.~ªˆô½‡HN8Åy-qï‡ÝSŒá£Ó¨ö(¨áëÑFÍ " ÿ_¾º&_·/H{OJÓÝ„i3Ñ‹ O’\bÙã`±ï¿ 83È\*ÕÊKçsQ§ls3CCk GŸQEqéŸ#ÂÚu uzb1ߪ^jZÈÈ`(õ µb|C‰1sq°ñ!¡5:‰Ù0ý,ƒœœ7•v:(XsÓ|ä#ì´•”‡BäÏ\[)¼T¤>¤1~,fœÙ’ŠÔ3žb:Uç;Õ÷à²qÖ|ª¨Ÿpš”fjHt”ÎC›¯‘-k²¸Öü.úBÒRº²¾Ð<›É ,õˆÁN.…|utªd_3eûÿ&—öÆ<!EÆÆã‹~ÈtiÅU†l„dC.ª=ñ’òÿC w™ø;jZtþ _TØüÒ¸†èšÏê´ ºM¯Êk¯ºáócme1¦dÿx$OJáèYIñ'fÔxé%}èÈdæ¡ìÛby ÓrŽiA*øá¶L*‡2Ó‰dF«·NÐý)Mv35_Ãk‘ö@®®Pç«Í#罡”9Íh~¡0f.«!Š؈ƅ½¯·ã“ÈKåÔžêïéИy!m<{ÓO©}¡å] Æ!·è'!é²4£qÀ1ÁPÒEý˜Ë*™S ¹žò¿m³ò¿P4ê]Ö†ý†$)fßâÕoI“¯ƒèmè·`Pû–´ ßuy<ö_,ÅØ«Ó¢’ÁP\õœ&̪ÂõÍF*Ä@ žÂú£Íø[z"ÃTÍ~ôàÀío*^‡î\Ù•‡Õä_êáñŽ`‘JcYí*ÈaNOƒ3áÚü¯®7T;Á[«€ Ø¢±AC™‹¾p¯‚æÙ+w^su4#½“kFû5܇U–åþÔö¨y³„RôËj»8û.ê0t¾øú*%,wè X€D£“p›ã($oŸSÇB †r¦MS¨«/f3h£‚ò+ØWûݸPºã—Øø2¡ì#ªX]¡ëÝÿ!,Ê &ƒhfšGÿ'¸bµ‚!ÌÔ" “rÖlˆ‚š›N¢Ã#èÞ ÌYL!çì†Ú ]tUcÌŽBN½ÕVžLã+,@xL'{žÙŽß®n¨(d•«Eküáò:¤Ü@—ª–¶žß˜`ô™I¬I=ukmt½ÞÆÀO醨}‡Ë/N³Û‘úõ|÷*…üÉÛ±•Қܹ I‚=CøilË‘ÓñG Ïšú"Ùªz$ç÷Kìå#í¬ã |Ïæ9ùT™á-`â{’YozÐáA—Æ9ONÌ¥#05>1 {4+šgôM·4Îä0ùmñ¤Cn·=Õéì(ÒôÕF ÊÍvE²›3F[}ÛWÂ÷—hóyØ-ö“ÕF§™ÉN Uy-Øf“üàÃ^L«mÖÃÖbÇkyoZ°d¡ð»(×j¼þyÖš*A(\„S^ˆ2¤§OìöÃé ñHO”µ"ÆÌBk¬y«ðœ[1!Mdñ—;ªxw½¦0ZˆôU=j£Â«J•°Tê ÊÿÊY¬ááRÒ•¹lT5ø•±¦µ«I@%<|™”9SG,ÇþÖO~êï˜CZ³kšéÑB”mº—`fhMå…gò8è“sÓ×ÏtÇF"÷5{ˆÞDìÕ_W7;Þ@ÛŽþ†MÊÖÆU"#ÅÖ'H𢗵öZõÛA# òBE–¦x* :Æ ÚɵNdj†þ4o8áFI–ò3Äb—.iÁû&û¿JÞ‚ë“§eh²!¾‚?Ò?5SÚ-S“ëß$Ÿ‹VíO@„™™ê¨ölÆ’ÅØË=4é ½ö!P£9[¥EÎúcÒâórš¸×tH œ %û鉢b’ÖÆIÐI5f:À…*‘Žä©(ì*þOÉh:ÜCð‰;¢¸˜L&¥)ñ—Æ®+<ù]¤z¹¶0Êzû\Qèµþ¤«pKˆž“j«†Efl!EæRË£]EGò9f×ÌëàJùCAÖ4¤8·„GSq»›>Ãiî*Üø[^‚:|¿iyÐuʯÆ^wvš¯4B>šC8ÌùЇàê3uåõcé0Áº@ëè€ cd wLlòm+f „4Z fuÝ0`\ÂcBCºÍ!ñ™ù˜~‹@$«oÚµ%Mé§®p'~™¦wÕ²T€TBÿfˆ“|e¤*Öàªöò˜/¥ÊDÜLæxõ>lQS3{Ñwá6V²%!‹ SyGàp8Q\!°6"7’ j([ç Ï&HÔF9o+!lßÂ5€ÚÝàG#?Ü×\1ýfÏÂÓd‡P—†7,Xš8›®Ž> ­fFQ&këhµ¥Ò¹uŽSé¦Ú­&½ç‹ß(4¬RÈd³…îœ1|ÁÒHuÅÓV’Ý|í:0uJ2%­Iëºbb_싹l¬„¢µsÖíeiÂñã^þÓäâTÆÅÂ&‰U•:XÕÙT°éL[ÐzB–1oðO`jâ Üãx#|¹Â m²¿•ë™v,ÿñú›—ò„0.p}¯\薟Рe€ˆ"¢6šŒa€šþ²síŠgúÿÆíe=U{¿,ÔÿOí7„¸¼ã:z«nI*àëªðñzãR€Û5ÒRütâmñ()9–zu=3~äã'Y'WÔIü¿ûä{ÑÈ+—°œÞ.˜åYÃJ[«¤`>›0}¤ÑãÚë®ö˜ëQe Ü÷ÉN ÿ|¸%ÈÛÒc%õžÛXÎõVôg j­l¯=^CUþâÉ©#M2¦k ’yµ Êﱕ³nÆ ågd ®GØ#ßWÖsHNa»oƒÞ;!â{Ÿ©§ÀžMm)åkI)ÌB}þnÞTP/Öaaÿ”Ü~ÑÅc<Ä7JGª•Í[iŒæÇ°*”N螣°å`2Ï»ª_ v›’< ±s¡(>\Gè,·§Ø¢PÅ•z'~¦®šs91ä8Šá©Q&Œ UÄ™IÀÉ:% Ïç²x®Õúu©”ÔÜòËÏløž€ÙtàtÎðÖ†o8$=Ÿ”ø¼¡#AnÎÁ²xá Aý®ý:\0l ’ƈݼ¨NÅ‘¤Ê,÷M1ݔܸn•Í Ze9Aõ.Ï“œ‰ÖT­•ð:·DÇÀ!iÓr9%“'°MíÀk`Ã0:ˆ¢dˆØê4Y÷]ò§û%±9½¹Ì¿S‹±bì/=íÎÃ1Áuä=ÊÑÓƒçMH'o3ðB#©`ÞR¥k§C”¦-@°ÈT+ÿƒ»i*Äá UÊÖJÇ˹¦~yå›s£xX€Š¼Ú6`,1n3ï’Ìs´âáQÈN÷Ù‰]'% Z‘3k¯c€¥%àO•À°G`>„E«>Ó&ª²˜w}± Æ fG“6»8''W¶žö}J¾§ôyéDîmòðJúµf•ß¶õÛ£Pm)»c~1¨K¹÷—fº¥¶ºŠÞÒ>ÎãÏm,y ®éõÔQïY¶úúÅß„±JíaôŠ'Jš-žûžþÏÙv_yëй]Î`@zñïGõ'À}®4\í‘×èpïì ЗǟÃiÇWy{üw­M©¸ 9ž^ƒÄ캭H!xIM•˜éM–ã tª®Iï' G”:}góEí.oɆ `nÆ çH+f"¸9¥õ7òy§È~„Ÿ+ïê‡r—αcZBì¥K`zUAˆÇ8<•œ|])Y¾ßÄǹ@ DŽ”hV¸EÕg×ÆÂ¶þÙ›‰‡:æð ‰8xJš½ÙïH·EPv[B…rÃíKX´æ0sª#r’Ý!G½4¡lb' · !2 ´"K ¹¯H§—éE â÷ESfùâÝôeÈõBëb!§!#‡Œß¤êÇÍÇÄZJ]üv²¤>-.Hýþ³ñd®ÞФI”DCá/%²Ó‘—_ª†¹ÐÁ.æÊxTÆn­]ÿÜ^Øúk%ªñ¡»ÓÜÖ®øLeå)®¢ïÁt1²Uï5gˆ.Oâ¬^¦Û@¬çAÕÑ,d$¬‚[”¦‡' ÝBo×è„:ŸP*hì¼ê€4œ’GIgñbf›‚Á]cHå®›]Øú9¢ ½ C‡ðÐ0ñšò2Ωrx %yP0µe¿/8Þ­4¿ÞÑÓ J2Çäõ¿)ºêËv,ïŠqbӧ犮9GMÌ ¬Ù¿odj\±@æ„NEbþDª%²sþâQ켌²OúçÈj|ô¨ÞÌo¼ [z:|LB´»Óèå!Ñkjž¨5á®Ë)ä¬+©m×;GÃÿ3ßXå:Yó—UyWºÖØï¾U+i¶Ìãör©È,£9ÑÏ,°Þª€ß¾ ž9Hÿ&¦¦7¶m,ËÞ tVbTŨ2ȈºüH”y<ƒÙ‚Þ\e\y5qsÊçK£ÜÙ:êT™ÅFñRJEör4âòsu«;e#¿€6íc\¬`*´×æ>ä;v¾bÀÙœÇÈsŒ'‹OXI¨D”ã D%“¹€ÞŒ‡¢šÝmíaìFÉÿI=ÁK†¢oOÀkœ!ü_S x+¡‡¾Å?§l=ï*f/“âÈ|ãÝxu>f·0|´ºC/ˆå]>2„W¯oñáÚ=¤øãhN¶:½ï»P"â;©w—xˆ¯åào¬ÔÌîâª-ÉBÎøGÛ¹‹kŸFŠÍC_cº’ñâÿ£óh?‡nLZòïëX¨ˆ-t?vû>&±ø€eøJÒWF¥6Éð‹ÃŽUËÒòVdCÇ7%xׯÚqpfšVÛÎl¯P8 ÷síÉL Æí yϺUôöΕ¿AÙœÕ-£jêžts–à7«a‡/®]Åðl{Øñ w?#Ï‚f¢no[èM_ÎíU7CµŽnÜ“¹ ^–@×ÅÖØÝ ¯3B8Ü-¹&¦h¢³M:ª·Ä¶HÉH–±q ][Û¢I¬ç;/ò¾²Ìí.|²alb¼‘á_iÛ GØßßÓ#˜ô0¯CÃÙðy"{ŠË¿1Kþ¹Ì¥°Húm‚YÌ.W‰âë_<ˆiV¹7ëÍ_éCøZ9C” 4cK¹cú*@&ÎÐP”aVH–p ®-ãënh~Ýù6ªHÜÑ0Ê*WÀâ5î|ºÌUõ0@]¨Ú4¬÷t9ƒÛXŸ¼< —59 ¾I»æ• ­ÊaiÚ»V}3|}!};tè¼5âê-¬cöò‹ ˆÉñƒ‘SƺN¨´è¶Q«Ã‚2 *1?¬ÇQ2=Š/F#˜3å»rÉ,žÌp0¸¤³jÛ°ÇRþ¹Ÿ¥WÂ)huÁ‹ö‹—„V»Yí…p6‰þÓ‡EÔ„RC w¤(FÓd{…Iû­‹³P=¬J¬¾ÉgƒNSx/Ÿ™É™C Ñ„À xzÈ\œí‰¥óG±¨™±ôù35¿Uk›`Ü_8«—<¾…<%ôÁþ?êçR~nò[ð_éþè2°H†^ì·üŽ}Vysr¡ÝFV¸Õ—ñÞÒª'ªñêÃÂîêfyñˆå1‡~äb¡ÇJ£98ÃËŸÓÉÛà]síÙU5Gaì`-yÏÿ‚þmÉG¯N<,éˆe ASÜ’àjz[&„”8^Û,ÕÆIMÚ à ¹l3CÝeÏóX·ÇV•Èn4hƒ¯ñ÷(z0¦Ëa·ä 5ÔZ dä˜ÙH›ÿŒkÅ0îþQ¥W†üë¦Ä\ž Àˆe'·†¸)„´Yó—9jIÎCà™‹îÕ¸ê÷¯&E‘’ÈAÑ_øÉä‹ÎîSI%•ýwÔÔ$t‘Œ~zDiØÅõ³Ÿ_ýDI’ÿ&4予GrôdáÜTâ‰$à™ò{œ`lr/baŸÚýi›êe/,Zg“|{‘0$æ¤Ø[O–Œz¹õj÷Ö‹±]g#±q××ËÇšãKÝEì\=Ø, ‘óÔ0ãùÙßÎÀø·ýûÒ¢]êmòeÒŸ ¯ ³~t¶`º¯®3+.CLÀð)ú\S'BË”<>µŸàDú¯vß™#â ¯ Ûô§³Ï¡^……ë‚ VGVϳ҆™Ty‚É‹›®Ì’ß±h1€ƒÜ¨TŽz_u|° héIÀƒÈÏX¸à‚õ/bÈ¿|wÁáêMà 8D ® ®…¤—½BQ¶if>í0_ñKa¸X`¢Áa•ä2Ê&È‘¥_²ÂÓ˜†}ž¡&ËV¼[+©JEòþQCõ§”£=døýÿè(wé?²ÜGS\}ëaœ€*©…´aù/Ì*?`²Ÿ¹y „cÂãHÃ%ñyçÁG¿Ž-$ŽÊã?"!M³é;Ä'‡{ŽAÇÀÃóŸ;¬AÌN˜PLäÝ®f_½Ã–ÅH®~hå=ð¡¸ËÐYpŠwFi©Ä÷ ïLûrîSü¶ÞßÇ"iH¶þs|?…³ö´ž`ƒ>¤ ºÖÕÅÞ4Nõ…vªÅÐZé†KÖìê<*èøº;&·™(e࿧Ɉ¤xø…=žè#*E8þâ9 WŸ£‹ÇHË’àQ'(TŸb1â-ã3ÞìX3¢ÃVÇ@d }ó»Y¢ vr:yI.Ô¦óî†T-¸n38T™žÓr^Œ÷ÓŽC¢ˆt„v.ßà.ßÐßs;ejµpê@ƒOÔ¶-fz_»`Œ0F˜b‘¨!WÁ:oˆªÇ÷8p ŠÏ©¡ùLt¼]¡Ü{ÖɈ³£Üvâw>³‰‘åï;g2’§ÿ Úôx˜UVØ$Åf`­Nl'péš>®Eo,2AØ Å–åÕ#½÷wDÊ×K9“ûÈzÓÚ' 5Ï 8[Îý aÍÌ?ì‡Ð}ý¨úŒkdMÉ%¼YÀ€8àªô`Ü®!­gÄøèfÙë½ ´±ó5cÔõ`U^4MUЪ4­u:4’ß­cš\¥y›¿÷c¤kFCöå; lìÔ$KÖ=2,¼¯ ëÌͦթ»îãÑ}Vmé=5=†ÿ7ÑŠs§Õ$£ñÂÖÏúˆ+ÌÛŽf(kSü†¸ƒ‘D’@kÈ_ÕÞmªØAeðÅü¤ÚõšU‹»%XLVÝ€,Ó“hþ» m½áêi^?óàß SMe^!£@·ñÇkZ§ ´¼ö’!’NôäÜK=~"woϤÎçžuûT•±YøFF3³Ë°ª`øPMC 1ñ_ô 7­N­1épš‘Œf!sg·¯çYrü!Úóïȹ™è gƒ¶¢‚ѽo_Emõ_cw½?ÛÓ3¼x`Ü[>¢%H› ÏæBXƒX%[KÕ “CËÑJ\†ÓÏû×ZÓêóÆ_J=,kÈ >l05ÿó±”ÿ–³€s`4Hg«œ$šÞ5þ’ƒ•Ov¼bË.HÓ8˜–u:“ A¥ p%]ðIC­­üT…%ÃHÄ ò™0Sãé_Ò“û—i@…e8̆“âƒhÓ»³óÏÅl¡<{Sþ>Òˆw¥“Å+Wmßä—ÀÑžcî¼?Œ½FÜ2Z©}n×¼§ ²ó=}5C³ý}yè\ÇŽ¥ö„ºñntG´ÈNôKw™OÝ?Ik]ò´:C:VÈJgêÇxœ1¸t*Ûö0|áî.Äï¹S†)t3‡§æ fTÿÐFœ©ôYãã ¥ªëE¿%imc³¤Y ‚‘ë?)þPl‘”@/¤ò0™è¿T¢ÁŽÄ‰pwÏÀ¤×•?ŽÝ瞣m`†>!¯¹5’f`x¼˜?s¢™)Ñz#=v'}åïÓÜs @\L±3æòР±g¬ëRÖe‡)SýLqÔƒ3³—ZzU]6» Wj+ Ôq E~›@;Ž'Þ àK€?N6Ù¯ŒZ’]ßv¡I¢¿¸I¬?Dµl0bØC·x¥gy_¶VvÏb¥EÆšÀÓ·ç8t~Ù³ WrUë¦"º·¢¾Ï‘âXìX<Žâ,E:\‚4™B¤.ñf™ß5ÁN¡\„JdQ¢zŠï3…)ËFþ›ÇÕVâPÖ›³®üŸ~àO·Îw-h(òa÷7+‚ q,ÒÞÄy£  œúîªTˆ8± •X[ü:A­¥–E‚üMì°¥›Ýø·ß ;ÎbLÄWíº ¼}¤«¸µ‡• Z@­Gž Je8ùtR]]¶ .ò– Uå%?ÁK åKÓÄ‘ž9ï‰+šGì2þZµ÷SíJDèŸÑùîÖ#€ú™º{ýa/:3K-¥‘3´CŠ2jde÷³aBä*®0y•;–Ö[·/E¿]pϲJö T«‰;ËïdC+ÿyF™6áÅQÉSo”u“x¦@•@Àc­iÆ:ºì¶~ýøUÀ·’–‘Õl€°Nšµ6<ˆo=î•æf&i]â7AjñÃjÐV{¬˜ézvâî¬H£î¿A*(;Þæ1!-©FîÞíÞlHÊûý,ùôYŒ&›rWB™‹­Ãl,³»Ù‘]‹Ë»tæÔ;²Z騷!ªêwAN?ÙóÜcÑбÝQÉî«aÔéàöï¤dE° ¨ø'hP9µ}U6YÛ2ñ‹m O†Ì*Á8Ɉ€/^dTº6¦Ïžv¡—Ôj¡!ï!¶J:²v3ö½•nýyÄÇ\¥©6Φå‚;^XÑ7s? 1 ýÔàwæažt¶!éªïFì·v—Gù‰K­k°?31!¿Cö¬m¿`ý«á˜0Ï©“z®-²~N¦œ|$.'A‡<€B”§(õC­@:‰@ñçïüsüE2) C,›‚ )fçTy‡â‰˜Eûs¿´ ìÕ†wnMÉä¸È7#=ߊ:&7ue/Í+ÕRMEü*ÙUéò°CÇþqÁt1ƒ¬±A' lï<Ç„né$­^t<;q‚ë8%emãÈÍ¿tãéìµ:<¹@klÔÇ ¦|=hü¥Û»6<Œ²(0š¾ÔÅɃ1;(:‰€ž/•3œA6òCdß®·¹µ-H5žjöhz´×§ŒÏ´Nõ£#¢VœÓA{×G¥¦k‡×éî‘ûÙ¢´0šxÒ“òø+ÎS~EŠt™Mu »NI£§†¨§líÐ}ç!]`Žç$|Õ°´­ñâkÈØÁ'+õüJ§jJôÛ;0ÍO±?‘ÈŽ¶î±H'ileáTçXa½ã¡ÓIlÌúÆIå py~È/î¡oñF)ËAÞ&æ¨RÒ3‘7ˆŠ±!åÿ /»)ºL™?+Z0µÁ_žxàš[w€üÅuÙzÜÍñæuBÈ –’šÂG‡÷nx/XR QHʼCÑa¸fÒ›—XF«So>®Mc}:DÑ1‘Þ÷E_ه¥dm+Ëci]a6~¿öû\¢>ËNðh”¿•ÉÐ…œ·}\ï?^?êþ,£Ð±B³aObÔøÏýቌ™°øAÊjEÔWÿÏHb€j³ÕT½gP ‹òÄ]%mÂw­ìF*áÉCÑYo‹x†û*ˤê4o*Bèw0 a»j]ª²ér.ûa÷í›Ae£ÁÍ)0eRô*³è9´Ž(=¨õ¨ùTˆ‘³)Ú2ùÜu Ñ ÞÙF7Y˜,³×ŽfÝ n11U‡AÁÔ>ðÎåÇÞ"|ò¤Ðå²w!€|ÛLK21ÓÚqDõ ¡lz=|—ßV®^H¥vŠxn“ß/FåµG(w7TGæŸc¨g12?òE ZK$P‹ï‚²øW—ÿñ<Зú <0‰.¯˜r{¾Nï·‹zˆ2‡‡~6×bA¢FQÚ3/Q_,{ÿ–´‡_Ñ@Muý ÖißÑ@zQú£²£ò€’ú/?‰cßü­Õœ…s‚˜q¹p£Öí¦éJÛÔÞA^­ý4ûº¢èæ¦ÍÅÇ,‡ve0ný`nFc‹{8ÜÝ÷ÑžûöEQóõ•‘²&ë;ýœx·Ò“ƒNCÒJ¹Òfn>-H ôST† J˜^`¢óö/è ±‘£ûž¦¹ÿ¡À[dõe„Iâc=^ô`DKBO?;¤'Û(‡{Î;N’tº ¬k. kØñ½ 5o¤h´3Чû#¶!áT `„L¡C{ýjLê%ó’œÄåÍ'×E9ZÝ-ØÀm´â‹á¯±úÚ¥ ±Ðèºh¦œ‘eǘXïÈÚ;å 7-Ésda$–#—¿ðÓœ°DÝbé¹Ö;&”óÞðäÄFßèÙ¬÷%'ïÄ<ÊzmFULc†éMj›à|G-JBz‹ÆÌ’e÷3€2;V5eÀ¬–›Œ|ù}(²¹¹‚×è”3¬!Ñ´•-dÅK÷i×Ñ„OUÎ3v”ì»)ðüÝö~êšÑ.Í d“TìûZÁfÂÏ«z½-Íž¾èa=ÿÜ6™“Œñ %4r«ÂÿÚ(ˆçì~cQ·u[Á¨šj>Ð ðɇ\ÈWÖdpÀ(¿Z0ŠLíÉ;ŸßÙp´'9kgwá 2xŽuþ»œº~úÎDÁ¯Ã7–Ü Ú‘EÛ¨ŽÆN: Yˆº‚ñvÄ}*»g„¶¼Äb6`ó± y"³ÂN%BåuzjoÍÁXè\‚"GÌ5¯ml¼\çË#¸ÎïœÍWr˜Ä=0”¶üËù—ïC ?¼ž’qÒsÈxtæéã1ÌhœÅ,úz>­¶P¼Ìkf `Ÿ¦XØVÖ·F½ §.0£å3 °@·f*ÆÕê’­çú"œé×`^k ¼ù¼r%WÒ´I3=<ýÆÀìõõŒˆ3þU@¢ÿÓüÌ´€?C ÏIÙ—Ò]E7ÞøOã‘4ÔŸ,ýëTæoí¥ ý·Z90ò¹tV¢G»j|§X­ƒ(<·.)Û›ØêðþÁ2TÐÿÈŒŸm->y úývhê ›÷2àŒíóñwÜh4Æ’IÚ;xë »'}” «RhDPU—˜îß+µc!<#Pìa2|MÙHÀb;í㢿õó15*W¯ÿ^á1Ãý”ï´—“]|ëí; ª¢Ž4š±¡Ì2§ÖûD7"Œ Âô‚ý/Ã9DÈûD»ö­O2ÿE]o«q;„nàY€®ÙP/‚@ÊÜÀÆ|aB‹ˆà-'Û˜Äu]J>úŸÝù¶ï¯b6NOÇÆuæ"Û™9˜´­èB rOX¥H( QédïBrºÊØ…„_Îÿ$ÛLHO^lÅŸöaJ9s2qnãûn¾WÍsmSœãºu9ô)d„tà¢î²6Mƒ/d—È;I ÖM L¹H§ƒœ†å=˜æpÐÀ©Òµ“¬eƒ/†ÅV×ÛˆãÈ,P%Êî#¸ØÏ¨ÐZ^Š=u’ˆGæQWô¹L46ÕȬNü§rÈÅ„,gïÈÍýŠâÙ;z³"¿Ö©uz…:K1ï!Â(¼JÙ`­Á ‚HPmê6Ã7ž&ÒCðB€¡ò4.‘IaƒïsŠJá Î[[î¹ä;c·+mÆ7ù€¶'»†ËÕ¯¶‚'GŠ´H€ïmfp |SUHBg”Œmš>iŠ¥ª}EÛêÝS©pRjøúP?æ"“»CÉ¢¡TĦ#öÇù¿¥å@’¿ä*N0b6£i÷"ŽGŒsä.9p¸TF ( Ù OÅbõ ú ‰¨‘9cÆïgÛ³ç½1I Øú)ȉFÕdiC(”mrw\â÷[”R ¹§mb­Él¿¸†6Ýxüœµ·ÎUBlò¥Õ94¯‰¿½€Jè”U9>ÛE:pÙï“D©MKÌTuÉ,äå^ÆkAw@ÿ«Š3CãhÀý¿CX‘# ¦ bþÔPf}±?˜|Rëy98áX:‰š±ìPg‚•°U:#¾±§ .É®ÚE+3ÕYô²Ð=º[¾¦3yçXÖ­K}ßÜÑÕ€ýA)Êr8'0ª¹ö»ä _ÎPrw<•÷á.ß]A0Œ4bü:+dâ`ÌÃ3Õ—…’$<áƒ_}teŪˆ¹< ‘ ÿ’e¾¨Ð.³¨‹ÅœßÓ‘m$€+B#ÛøowÑùó~ö¢Ž3«Ð“aÝcÛ{©-;Ûó`ßFÈ9nLxó¢v§®mœˆfJPQ1E ÏÓºhÏšbÅ;NÏñm°õ©ÍL%dØÁÀ æR7ÏŒ§1±–¥¯0Γ†ÊÅ®€šÍòŽ0öçäÞê·à¢xµ-0!K ö5D¤Í]n~6Ša–^uÝýlfnZÆP#ʲu¾‹<];Ü_Aødþ'—R'×\*Fh–˜êíca׿¤à-®Âqµ~€» ·›rÀùj ‘`†Ž±AÇ ÂBòÝ`*.flµ—ÞrØÄ\±Ñ œ!97ò-Ì”i„ °ž(ÇHW¹À]mjð½¬ÿGHŽè›™ \U€y_[ð‘kT9íh…¼Ë)¹í‚¸]ƒí鑆†½Ð!nl6Ûí@çÜôÕ²ÓLˆQaöz•ì јt¼}pnî/ÊwýßõÇ…GÝ+˜]a bô¼¼?k%øòÁ‰öizë™(ìȵQ‚ÿ 2ë“Búï,|š²½ç@[´‹¤Æî&4Rל¥ ©B‰¤sq°1@º9OÄú_|Ç5ùS#hSñšÅåD/•.?-‘JK›µ4wr§ÊFv±Šˆ³¨eF€þbvÈZi•ÄÛW ÞÔs¶Z÷&ùcuO™JÜœ¨ r8F ü±L$¯s¦‰&ZîÞ wîl(´i 4(Õ.ëÎG-öª£˜Èˆ4gjQyŠš æô4Ë'Z-²³Ò°Ã*¹Ãî„N,6”ö 4‚l\šæý¯µ'^ÌM UÏk! ¥QF‹•ÝÍ•T#*÷î€A¨„¬ `¢šrN¿]u£ä¾¼é W߈;ýÁgºÎ ÷:Ϩï×ê-O!ä<.H¦F3‰³g’òÙh[=³,?†$n^:³4¾Å ž t â„:FÔ`Ú ˜­ÓŸú# ýçÐeRUb„_A‚®Â‡Ô£îE<ë\†¾‡ne-v¬áãòŒßnµX˜­¯Æ¯h{¶ïþ+æE€ŽÊëͬÞBd-½’Êœî؆~)ÏÜ4Fè Ö|®z”n´Ã.¦g¶œ úÍõú?¼ž UÂñÄI!t©$q´Óê ŒááqÅ Ø ³¶kè«Ûª\~ýÚÈ®ðžVØÍÕˆp~C“ØKB)œqÌFúšífB\ëµ½å4 QêÏ 5rNdŽ×tÃ&•U6›‚9ŠKn³¿™þ÷„_©Ó_ô&È`ãj;g"yÛV¬.zÙ]‰Ñ€•;¨Æ„-·Ú]_Ǧå½ç=Õ7zYšõt€Å9aõ‹È„¤æ-û¿Ü ŽV]‹¨¾Æˆw’Ç+™äÊõD UsÚ"õó"p¶$Õª^[m,+—^w¨]0“9ˆßz€¤Ë\fþ.܉#DzÐgx|®W¥ÎÁÞœIÙxh.é_êøìlp­ô.‹ÎÛ‡sµ¢…*$ok:æý¢•G¾}Yý>º¸íBéªc•×J×låA> ä3û¯ŸuÛ÷\h;ÉþDZJåP†åõ?/¼T4¾14ÿ±ÂKÉ“s¥²â¿Éâ;z¸¬ Åž Æ8GïüEmµÝsQÞ„9â”Þä‡ÿ’Ûò+*Ü­ƒxŠVû¡Y£OvÉg8ò<5V5œŠE~\/ç8XRÙÁcmÃZ+Œ‰»ˆ tçéÙÞ*¾šQD»€º>ì&¤u#Š\ªú3ú6jZt=§-lÛ‘Ã.ͺô0½ŸÖÌo%Éàòá(.ß4×­3¿ƒin_Ø~ZôÑ‚¬Ú¡ÐK‡ü,{ú/qØü|Ík-½ÊËX=€è{÷‘–*ƒÅF×Åqç|a=Œ¾ˆ–>ZŽ}¨ËàÝ ‹œú:€´•/pr¢¾äÎ6§X¥ôb°BÌ" 8^]Ò°Íó™«0®v×òjöH†áÛ¢³|””TšÍ÷6çP'¤Èv.Í-šn¢îÊÁÁÜxÏ[4ÇH UUV0Bžb î\gL5-ñ] /›s Xf£Ü‚üh®U {s2ñÄ †úÈëz *ëü Yà¤ý^\™F÷é:.“¢Æx·o‡\ׯÜ<*ºy wC8ˆ¯ŒQÞÊߟ4ïîÓ~žˆzbýÅ+K©÷6”)ÐPû&ûž#ã#:_Ä®×°šzŠf¼Ç‘´ËD뙪ú†»6þ³ZøˆøÌ‚ê…Ô>&å~‡@ªié&>¬sõ‘3{EÆbû]É v‘eâ¶p^q]€e¤´é#ï”lnkœrH÷çA¾BŸéV§êÂÿ¡A £GÊ¢Nè‡å3xzOd;bÒ©_Õ-—`YŒšækŸMÂúÙM¡zýÙ‚@ct„ÞŒÂP”‚P’…µì³-ôvp‰õ󿄬qC¨ÚYÉE9ðÍõDÂÝ…Ýn'øÓ"ôÊ|Z"¼âãÐðDµ ù<«Ûíz²}ìbƒYª˜‚ïìÆ¹Pè¾²*ó!N¨ÂÓŽ…ÿ™àÔ%_”Q–lm®ýzåÐìZåÐ×ó|.Ø ‚¥(™ÙGŒš9,h~óSâ÷ÍûC±ö庰‚´Í­ÄÏŒªh8ÈD¬üãa_ÁX’±èujÆÇiêfovÜQl¡#繯ùÜk£ÅS¨ϰÏʰ¹É«wÏ¿=Jˆ xÅîr팑 ö Sñ5庀UÍù]ãDyIzËÇÓÃéè\io­Ë®O›ADZ€]c°`Y¥hòÇ“Ä" @¬FÔý›Ч[\û§~Ú, úÀD[‹#…zths£p{âZ×:¬ù*¹qðéÈdÑ0„niäºØ' ù3¦é­r²=Îfª›5èbÔK^WHO–]HûLl¢ŽÍ+ “ÃA”Ë¢$]}ÎAÅCœp¡¤p”ºœèÖV›.sò7„ª‘ñÁ1øŠ°‡œ¹f1-úMaÐAÎIÞAqL“ e\ЀiâÙÝ„c®E?dªÚƒ- >üˆò—Y[ÔÎÒºož['}~5ñ.ç‹uÅÛ>)›¥¡[áíðŪ·Ù’B`]¸ àįjô$ß´RVÆW‡JßÀ~Œÿ{·Y™Mþ<8!id ±G•9¿ó” Ƕ†æºÇ>‚B"^Pb¨)çw©0RxL¯Ìn£AGîrû[|íj‹ÒìlŸ7/Å¿Ÿ]]ÖÿnNU¶5Õô%2àh|ƒvB $Çd®fY‡œ¤pâw‚ÂRfi¾Qų+Í+l³GÒʬc·ì¨&øÖð‚'¹-?£\´ ôûCŒ= @<}DB\fò¤feÄ5sáAÞ—?€ô8Z¤f'`‚g\üô ”…=Ôµúœ7 ‹Ò´èGcäo/ûä2T80ÛDåe˜œÑ‹j 6!ï;LÕ‘G â­£8ä+µ‰ŒÎ—39ÒÐT‘ÕÂF)ÚËj¸Á̦«¨°œÎ0Û¤`…š.‡ò`§xáÀ;f>Wù€ê ¹ÿÍçêÀü:~Šh:QûX'–|eÐÞŒ?«æ^w:”`¢]/¬Õ-òYç±y*8P±#M˜ ·¦ûɶ)q6G(RgÉ9æ‚/¦3ÿÕ®ÎH8Å4OàZ‰EÐYŸ ƒòÓ)ü±·¼ùH³#$<‹*¶KúíÛ¦ÖÑáWlQw©ž“êä„~G±!æxãnµ³….\ ö!T6ØŽ,‹mñq_ ^{‰øŸûtU\OQ:`¼ßõ’)›kP‚nމEâ_n ’ô>H;32±ÅwÉ=QF-ÔBšáØñ7j¦ÜL¥äÐ>%šå<ÁºÇ š¼T0p/w„ÚÝB’’8ü½t¯d°ökHWO¹˜j’1Þ‘ŒÕ½ rܰ5¬eã¬*&$ƒÀõ ÁLJÎÇåÈSæ[ ¦À–¶Ø¯j5S[‘±Ådœ(VŸ×Š8¨ÿ¤Y èÀ܇*±.rßK[zîdÀüo*ÚÇŽ¨â¯‘ žÚe}…h’š˜ÆibþbŽwf‰E‚ß\¾/9ã!Ä–Þ?5 §{@nªíiXCRmU‘´þ–(qjŠ&³‰:eOÚwAñšnœ©ìN²¼³®hi ªE±hÀJ-¸…`°±0JÖörá×}•#øLúÝ¿»ŒFE+÷åÞžåÑ£˜¾ÿÇš18¬¦úZ3žÝ(¿‹†v‰˜­ÿsôtÉ]~)”ó…™Eô,YÍÔpfåžÜ€óqü²~ºßÓ V¦”(BAÙÕÔîÆÀ(y [¡â­Ü†HöëGØ¥Äòð~ÜgÎ&­nsÙ&+ªëo |£þ[ʤöõUŒÃO‰²,M$×ð;¿ýn§p2>ÚxÔÕ¡¬%ÚB+5rÜÈò¨€T" —\ó_ë¨t@y[ è.HSè ¦ÐjmÈÕÍÉÀIhŠbB‡gÁ|Ɔ–·ª/©Qß\Ô}f\륋|1Ž{ˆ$,míI-QN†(vÝxš&”Ôƒ¢Î@®d™jÒØ`Û=ÿò›_J) ¦ª‹@²ÕŸÍpQ‚Õ⛜àÖÇûß­Í‚)®â-K>êÊziWBS>[qúÍ|í‹- ·õØAìÂl =Nܦ[;9-¨("ÝŸYû¹Ô±ê…Ó0Xݵyºe‹Å!(ªg»f² ñ¶ <ÐE›Œq¬nué¹ãÈç™Û¦¡Z¾—ŠËδRúãW™\‰W]ó‹¯UkÓ[_…Y$ƒ@Wc8ñ$ µ¾a­$ÁÍ>¸”É h¹yR,ÃÓBÅ…aŸßßý=ì>v4ãòs‘ÕXOŠç¢¯ÞfÂØ± ¢öÈŸ» ²Å£è\p~!i‡á^rÞ7VE|„° C”Ìi[žÅO LS(CÀì O¸ÖÌ…·ÃPÝì‹òƒ>((¦Ä©0Ù†®+é„ùjxËõ–DHxòæ7lA]¼ƬlP Ùûk$SŸ´†»å½&Z/¿öŸ/ôÔ1Q³ ësä¨âyɃG‘U0*ÙçFýÿÂvÛ,)CŠ%’¢}?šYL†=ˆ_þ3$`û^Èk°î…ìÙ•1hÖÏp°€LK°âU4…Þ•®Ô‘“ûŠ´{ÝØ®°¤€Á‹öo‚óö>H6)ÑUg'~€dƲ°æ]UìË}¢¬Õ 欧æÑš-=/¿8‘öé;Qbpöñ'á2ÄðBú¤‹q-@a™•ƹ6¡§ŒXì"k« û´ùЉË@ëAÈÆ¹°pô$·wÑ¿sÔó!Eë ¶ÂôΓ90jᙾãSÎ×uT¾ûâ <Ãïåb©ÊéÖÅgá±r¯ÐCZ×Õ£[Èíšá‡û¡ðõŠd瓉ib«·QQêñþ’·Ï?^ôýRµ ¼ëªE7T®Ž"h(ƒ írâ]oñõäê›»9£""HÚ•Žï‹Q¡8øó†,¢M÷y@´žx~&fe—aÆN˜âÜŒŽQ~vÑ%Z Ýéb©pïA"I3jP†™î‰™N¼ú'§Â^zùÚÙBc¬'J¯jÀvºè.~yH²¶C÷X—ºŸ¥øÎ”f´tI>_Ÿ®eZÒB&–í¤ºŒà9ÓÇŠÉÏ$–—ËÿQ5ÛàìvTÞ`­þ’ì‰ÍÚ¯œå7tuQ7õî•Ð34‡ÖÎYµghJ4·v ‰¢[I3#¼Mš4ô]`¬/dFþ®U|¹êæAv¢>6K5£Ï8¬å8” .‘UZSKöjyiˆqƤœÑMž‰Ï»ª2gj®¦#ó›µ”ÑR´"n/ä¹yh‚•áTD%æÆ"-¡Ü»3'–¸9Jd…5ÃÙĬ!ÙJ¿¡1^˨œa=çNÿôv”QᢛÚâ Y$ÁßÉVFimˆDÛ×–_~sú6£ <Ÿ>aMÆ„ò5‚ïJᨚv¹b§¹1òÛ ^µØK‰*bI/VÍ/'W¹Z;J€8ä8d-P±úa4î\l;E ³Ï_Ê\3ΠE‹Öv‹ú•d^åœòn~”f&r6¡3ÕÚÙæ—f!RL¨ÝNpv½€îldÇ9çóws„¸“ˆq}Ü­ÉWs×0QùÕn|"ûFd,Íð}D›S%Q)lw#AΠ¾ÉPE¿ô{ß©/Ô Bô'±?óܱBî ý„&±ãÚ×>¤â°t¿Œ0¨»™h»yw‡._\r†òƉu|6¥<îLºû‹€2}íÎëžÌ -Â@g&y8¾ó.`p¥/k²Y ,ƒöTa²0rc_YTÕð-Ó¾^ýÝÞöÀ® ™çNví»‹Çõ]ŽýfÓÔ¬½Ðž¼¦ý9ÇfdX¨¸îm¾öog5ôýçH%D8EÌmü ’µ·jpîïl!–;æ¨:Áñ\!ùµ·ŒÔe.84+°ÊfVÃó‘v@£¥M\<ò±ÁHj„%z9Aõ[êëÌÙð¼o:â³AÏ#ÅFÆPÉìP ã@*ä{îÁûê( ³\¥©ü%™­mLAÓøÈܯ;­|xY†–Å)A¢®c}tž•Î5N$zshÓƒçWˆ¹oÛ_o®š«¨#†‘tª9þÔ^$ŒÖúnU޼ÒÚ­F«-ܽ€ß‡ƒ$cÈ¡EÑãÃè+iå÷—iëǪo¾ËOæ5²a p[ËÚ‚}騀}Ÿý-‚ž,_ýt¨±-9j}ïl$oça„µ;¬ÜSw±KµÆ£èuäÛè'`9œ¤7œu±¬j·Ó~´]÷p‡Þt"†›“¿–wr+.=ï3ûqpŸ3Ϻ#Á’€ ¶ÐˆëTÎg7O†scžýŒê+\éìàýiFú &—hçÑkþ¼ wÕƒÕvž÷gêÙþ½UÆÜï¡Y‡:‚Õ¹´ã%s3åc©h•g”[rŒQóø$bÙ;%¸xC¢á^HñÐ’r´äâ*£ ç@èàçLT,ÿE‘. ¬EǤ®ÈhûzCYIkó.Ôªö¦*úŸõñp¯1&ãz°øiùôàj¾Ñ¾IQg'ü;‰G]«OolmC¢Uc̳yM1…”¡4h-bÃ×ÒfŸ´ û¬Ôè°‘¼Æ’¼Gcî¦B”1ÎÝ.á I ò²<ùoɽOZ­$2@Â-M~ôJÔÊÐqü nþLÓеÜg~ñù‡3­od,¸-xsDM~ÉË‘¬5—tŠÜÄN‚]°¢d¹ ÐqÉko_­ûÇ’g´Ê·TÖuÃ<š††r|´.áêÑò†¥Ðçî& ¬ño†ìY<ïé @ž¬lP=×zÔŒíÝ£wUO Ì Ý. "Sxàü+$ªÙ†õ£vW.E ܧáš×¤[4^yÀ¶Þ66³m´GdgVª¬L@±XhƒZhyB~ú’¦ˆX€© ÿõñýÂØ€ÐÙ zí0Z(s9³šübµxïbÿ¬!oöœÕC ¸¸2‘YM„ñ’Q·IÞMüãm›•Ò­ö*çîàÕ-HP¦±?K¸Öë7 }¸‡~jUýÕ?p:hrÖbp §­øÆ×Á°ËhC¤@­UTJßõh¥! +d ËÉ7(ÇT¼Š6ç°k év‡¿Cþª|I ÷&V—ª¶RXùµIyŠì¢Å +j‚˜æÔ§÷Qk“yb¯ð-ʼn#uÅ)Ôó‚á³\>Êl%“Û‘?a0)sPå‹2­´9…D7û nãn“,.¿ƒÝp+‘BäéÄ>Ëöh®Ò‹¿Ý &³¯ÅòqÝäô}Æwį­’Áð§0øI_ÊË¿r¥gq`Œ¹—‡ŽUAiy¾ÇðpÅ+€ÇyZÏöµ LöQÝHï¢ÌjëN><œ‰ëÐà)×|OÒ‚ÂŽßDAf(‹è.ÏÞõ°ºgª@d5ýÚÏë(×¥¥~nL™Äãê–zT$ê¹o/ °¹ƒ«ËwÇȯ2&&iBO̹’S‘E›}Õ.bV¼fÛ‡b!ºrA—c¨»È^¾X IÆÒg—óœvÃå»AXPPŸÅû…㞈ê¢ËÍØx¸S³û͇}£d{AÓŽj@·T;l€Ø¼ –‹»W/ ]åX{µˆæ5n%„©„œ•­†¿VW ñùfðû(x&ò:m6³Ên³uhÒ+%„ž4ŠÌ²^Më› s«Q‹í€Áð/”!7JaJÿA~lPA\#5Ê}‡š]Ó¤À ¿ µ|¯9½«ÔÛÙ-.ØÓêPãx=òû Æ]lq—b±€YîÜ&ipÀ;/ÓŽV}^·­EAð»0˜áÊöÍËoA =s„”-5a0Ta&£>r@ém;DB#6B.„‘Xczî €Ž‹1)÷RÄ'­ü åjÔï<^ÙâáŽIÕ×Å)µ¹G– EÏÀí¶üýQ²â{  ‰!D[Ë>{³þR/°âVxÑŸýÀx!bT n·]|kª5üªK¢`eí³ÚNòmË:Q‚F#ÉÖÆc[÷°^ìe2Ÿ)ÉOJµù BÏ2Wgäø_Æ›™Ú¬ëC>ZÂ‚Æ 9ˆ6ËQ§¯ñ±ÍÓÖùŽFT÷†èp‚LƆìsÇâIÛ¡m•“xÁq´ç|q8¤úâ‰ðôß­Ì,ßeá÷!T¥Ýl/w‹}w³žëKætfGálk^S?>²¡ágF<˜ß4c8Ø«ô鬃FA ˜j'«ê/È›<€3»ÏÆú†ÏÃa2â€ü£=ŒVLønHÿt–“3›&`”†Ú]ù˜Rüç¬HßîÐ|¨}hþ+âëK°!%’! ¥¼ô‡vÞMI%l™k‹º¾%üJææ¶‰óŸõ›t´²Žq Í&žc2®êúüݬÒ*'ð ó¦Ë‹ôœK$‡ÇaóóYü„-¨=öÓ¤ÿ™i¨!]¨•CŠ™ åô6p³V„7×€™ÚÉçe)°´Z ?bÒÉ”#Ø2ðûhÇuõÕ{FJZ=%®saiê®Õº£R-†^ŽÀæãf†>Í+AƒIÏÐaʦïyãS3¶<İõ<3¯¸ºw_!$;j帿„ޏ›1‚ìѤÉz]šò¼ÅAÞ! /Î,eør}à;ôߊ’Rut<Ù:÷È7J¸{«Ö©„îe S9ùÂÞOKájÅ–~^j57`ˆS'=²E§CÏ3žш=.Þ`˵ÕÛô”è1õiæß|[ŒÄL:¥ÀèäsH×5‹•1ƒ£ü¤´ÐtðŒ-à1SºfðÀN´¹Üó׎¨Â2º±Wð½n`¾>„Å.Š–bÙ:/ž3ŠÛ>ùoÈ!f>+YÐË!yW#ªô©?÷Qó">uËè¡+²Éˆ×ŽÞC’Áy<[ÄÿrÉÛdÝ®©ˆ`’®3(¶i€é~#ÕD’”æAm ¦»[cšþ É#MD®<[::o2’þfáÔ‡³ì;X$ˆ~E3‘êÂÿÁjà wÅ5…b”»wÅ)Ñy‚®&3)»â·x)ÕfÀ»îøÞ”g€Ç AûÓ„~ÌŒµM,Q ޳{Ícò®©Ó‚†Ûă ób:’#"ô³ôÂÅ_ñsÈf¬¥¾¹ 8Ÿ46,|ÏZŒ4,â6f’žÍ̘‹wÖÞr2ûD mÁ#MWÇÎc-•ì4›óãH³4RçÁÂÊ£ï ã:¼¥¤…ºÄ…‚,º¶¯±”hú>Gß]B‚Ÿ aÒvqv +Ò2>Az­Ð¢eÒ;é¨j!Ú4¼æyU>xDOæ{ñ¾8lµ»Mÿ±£‡Â¦ yûV>Êsîeuï²Çøz¹;<õÎød&ïµOS¦xšùòAûEUþxfCÿv{…LûÅWè^ÅÑ<€ÿþ 0ék÷Vrº¾ƒK6ynÿEáªmO¶3¤"ñµuø¥tE9ðï¬ÐÊvOÐý¦¥ˆê‡Z{Îñ)S­÷Æ÷°®é)ˆ€£Ëº|OŽ‘PÆ÷J§Äï´Q/þ0Q"·–äÈÖÖ ÿ½hZ+]r<÷öp›J …8ÈTOw×S>an(ÏäÉÇø¾·n‡1ŸH( %sáL£ä©áºsš¢W)Wâãf¸U6TÁ>Õ­øXþÔu;] ÍÞÆ'\Œ  jzÓô[—Áùѧ.3›ÔåÇch^²¶9Nóøre^¨Ó@¡ #>j(°@­0Æ Mk8ÜÍ<ûkïì^?8”•Κúú&2Å–=$Š ˜‚Ö\PÃG#åX@ñÙ –„:óÃíö üp%&ý$cØ`¶«6ˆš>ÜìÅuîpKB‰ºwš]bjõÉüsüxÂÎ#¥g=ˆ»L¯ä ‘îˆeÁaYVÏqÀô(z ?ȘÍIµÜõp@ì‘éj² iâÜL;=‰3óBpA¡@6a5ÿ mÙKÒ+m¬–@+Qéïh¹Î=R~Úó7©yí ãˆðô8ÈÌbñÃ-4û°ÝÊ^ó§sìǯJ(Í€™)!¦8v´¦"ä)D}E‡WÊÙÄ-’F~ôý3[ˆÖž…Ãÿ³—«Ž 8½£ù6&b¿(!˜bxæÃïÔLß*mù•ÞÄ÷@@±Õ:Múß½ ®€ùMcÔj£";[¼™=¯Í),ÝBÐ_¿‰@ÖŠ(«¯ÔOÂ7ùþhK5fÙ(Xß tœHµÎoþ€fSª»‰¯Ê2ßœ {J“Dw“õpl\m©\vE}Àˆ ‹’òm™æ4“­ Õá_.‹î3”‘”©÷ìÄ⣲H5Y«¶’ e°gF©Yi¢­¶U€Íü¯UXK/µ-kQ¤üd™¿Ýæ1$‡1ÇŽboZO/ÑEä ÍKÑlô nI™‘9S˜ËÀC˜±·]¶‹ÓïÁãˇºÖƒUF¥s ™ê.}õ\r'W5à|œ]ÝL<76“ ‰ Ìãa|Ïë¾½1œ›/|q}q¯ß,Õ$xþ´"› C7^Ð].¥eé´nVènHiukZõº5gsöüPÄù/V GE=Ä¢SÜI‰G˜*œ6¤jÖ”ÿ9ùÖ ,›ä¦ÇsóNBÜZŽ¥ãáL)‘²˜àŒ>Z ­x˜Qï²Ê›c®ñš xËŸ‹†gëÝã¹¥ÆÝ”‘õéiHÅ2Éä³gõþôÿ9M ùÁ~sù»À 5»r¬"‚Ákm³ûŠÈÃ^Æ—c‡xÅûBlßÔÿm²h³¿3"©>*ƒ ´¦*°5#HÝ'•ÜZO±£n»Ú»ÛCð«Ó0¼…4¿Ž‚´W±aÛ½ %ÝðŒäòýòy0à}š½}šÆRõ{¼p}ò#j·Z£ž•uÈ(v°U¾s”ïèá:ùÏW1l[Ó$ê’#AÙ¥·“ý€ ý*‡>Xþ´Ë¡#kàsG†ìiÜSµO; a|ù‰Ô:§L Äv õ¿—yFvIˆÑ+Go@î_¡,ñ&a¦½fÎ8BÌF.·CQŽÈ¼þE1yÔ`â‘ó¯Ö5+’¥W.Â<ÆÝy̡ͶŽQ¶ ro´’Ùzª²°-?¡ÏàÞǺÝ÷9„…Pys{SØqð*€C« tߨew¶Þ`²—T†!öb8ç8³éö¢ƒï < Ç<ŽÃ7ÈÜ}{dNM㾇D¡ ãðgAžó<=¨¨BÆjLõW.½$Y^ɇZž©ª5ŠÚEÜÂ_ðCš“¹ÎÖs¶nï‚X#J€æIM`Ò0¯ÓH†“¨Ê±Ô°c”{J‡¼‡Þî>αàþCr¥„Êb7eðËa ¿vÉvédœÒ<íû”t…pØz1zÑ¥«S îš ž€Y¥G §º: x±n¤v,Â}Ⱦ–@ï[•vÅБ¯¼íнB"®C\¤Üª Eö”`»ÞzÓòEÊ\(édˆj »‘6~€tüwk”«T~^Ô·H;H ³–°zý¶Â²¯ ›/äãèkwZÓ3°ß¢³ºî"Ö¿ÈÒRÑ—xÄO½ ÿÂÒ_Ú¥:·ðÓ }¯i/E90L4èáUM@ÚL*KÀ؇,ß›®RÅ›\c“Éb¯$ÔÞ4Ì=“zLe«‘Dž“ÔÆ ntoAP݉B»3Rs'K7Jü“ä-…[Ť ÞÀ—ÿ¸èI2ª¨3Pk»«hb ÉL¸/pq¹Ò‰ÖH% ùš~ný/Ñ,7ûX%â­;Øf ¡ÆZ[#^v°hW\Äš”‰†69*{W²­î?,…‘m^üK•r48Vâ®°†(ò¹•Á ï×_óp·&¨ Ëæñ¡‹¿×Å}ª£Ý{œ íÓ)[‰Â}áú»-mU+×fˆ2<ò¡ÇZ¸’”ÕL˜këÚÝ¿oRSƬê>BôÞ†ÚR‰Œè ØšNÔ¾éaÉ€ÀeçúgÑep”ùöëM1:¤V˜Jõ^ºÆf$i[;'èÏ«¼<…áj–@ p”HòМøìwU¾KSq6Ò¤Ãø E9ƒêLó ˜‡Göó1-v*[æbÒÆ(yaãÿ Òó(ŽësöÀ5‹!}RÔ‡ØõozÕ8ŠæÉKˆ(¸ýúË+P@2…J`‘N¼ÂC¶ŽBÄ’ê•ÕÅšûY¾ îËøÎ­Ý°À½½ã3’ua(錒þ`À"†h‡¬V+ƒNJ†ŸgûW¾º;ÙûzÙyÜ"³ðêüÏIŽÎ|¼2úé9þvêSæ ú<~¨‚CpÇ‹rLvgJyà 9¼ñ@2ýæäé< þ o†?”cƸ–’v\4‰+Y./Š@!£;dç\‚‰\×~þÖ1C¯øÌþEQ®O¸g·,!̶JÐ P÷A#­1%ªó;9/ï4ð$ä"½ê1Íè ö‰¹GÊ. ëc9ZvÀùœ¬UÑã|š0Ë%}E&mÜpïå”èôI ;`øHw‘È~•]Üè4U ’Û•ê<"ã¡ñªvòZRØ59ÅgÕ¤ ÉŒiñ_öÿD_‚Å«K#  ¹km%¶ãýÁÞ(ÂËY=G>½2à|î"PŠvf¯áûGãʶ]ïžð:`gB—ÿk÷á=lÿÕ³GAþåßn|-‚îà0ó«Mðº}za9ÐN`¹ßÿ)ú¤) —þVŽÄ·ýW=©Þ=ŠìõÍ»»9 qžVïëId¼òF±£ýqíi³:ÛrÌw^oäâ–ªŽÏ~@Ô›öƒÏÇ£àKI"¬çw´OÍVa]ƒ”³h,A1芄£ &†Z•´8þµ­A•i@¿fÝpã)Íd,a¸N {Dï}øÛ–ŠÐS‚r0îä=-mÀ< à×p•vAÚòóÓJÓe¤í]gDŒã 2£·p/ÔÍŒé.q„lÜ1&|4‡µþÜö |=_¯y$.±6NHWïat“ýNk ,ܾ)6šEÏoÅíB,Ñù¿Ò0Œ¸úèîBAmmQÛ?%€R6U!Œ„ú´ÎQ…u¢PþÍèvx Ê`܈ð™ÍHÍâ2hö5ò»ä¯X¾å+|aŒY]NV-tÏ&3Šv.@°Þ]¿•n`SẳÀÕ|É,ìm¼Ù Ü>4ú¼:©Å8JäTÇ$n1ŒÜý ú– èkc\[ ÿþð·`G}ø%šB¡ÌÝÞÈ(‡ªUšµN%þ˳*»u"Yvüà ;n =B7çiö;Út<">§øÈæX±úõpMÇ“r&R‹Åuø¤"·(ß° *„/€Mñ3žŠ^ ~±í)`ïpÕÂ8ÇûHmÇ /Ãmç¦.û.ÍfZR'àÊ õ–îq¾"GÅ‚g!IÑtóõÒrb¸2in¸êÈ¡!š#¯YÕI7.DË'ªÄÐüñ¸T"óÈ׫n¿AB,AHÂÛ0Ç2!ÓÍ6bïÝ]y¹öðX_;Ò¥»ÒS’ãÁéR"†<¦ûuðyuBðÙÛ#a9l‹žíE# —©)a¦ ‡ê ¨ïm¤–3¼ Sc#{8f‚ùºÕ„yÈBIËóomÇX]á pY `ñÒ¶--A—ÿÕP+ §‰q¡˜ó¡†’d8wÿ¤5@ˆÎ-ò' !ÖWsŽáJ¡úŽ þ`¬ø®P­[Žæ'=&n<)¥#Ä<ÆÄÓÞÛ ®Bþ“Aõµ¥µˆîk£ô©N•ÉAâ¯)´ ÆVUê•ÛNåðªÄ¢(±h$²ŒjóÙiÝ—Hz«k»uHÛ±%Ú×™¹›¡ãr+w8 _6eBÉ!v¿Fá?6:‰Q ¨›šBe ¤oið㾄oð0µ5ш¢|XS÷O×BÚï Â9Ø¢ò*å×j¤Ñ24è.߸z8wì½Ò‚ õ K¡°¾½PE;:졯üž ?µÓwÂoêž"&ô0'Ü{‘×XզǾdÈù¼²•œó›Ûn=P^ñ}¯ðP¢G™iû×ê› šn.ŠJÇäJŒn\J±|GZ1:TÎ…’ˆwjÍ|íÀ&fßÊbæÛôlŒbåVLWFçCò·¢ëLQŠzÎþ¼˜žcûaÅÖÄ'0œç/SÅcyJeþZŸTÍHü5(]ƒŸû—A$‡þkW̯Ö}7»újWk˜„Ë×1Ð7(sOF%¼r1mÚm0íDœÁ¤½”\.#;½®d¦ŠãË¥ýX-¹þ`5Óš¥¡Bã<"|%IØÖXØ‚ªÀ]¦ƒ±%rXÒVÉeVÂ;¹¾¾àXq±'=²`Ó!wƒÖFŽE,ÀÞ8çrÕͼ…W{0‹jcŽ¡a2Ç«ˆÃ±;¤e`úTê‚°#k79Lj^–D:µ³mÇ`* #¢.Œ«b·Za@ýî?Ð7Z‰Ä¸x2AN”à”ãQ²QæÄjèÿ>oÊÀ€ à8µ¤¨3Ìr²}Í?=-µMcÕ"»à×Cû–nA€u0`«¤Ó›’·¨÷ä±7^¿\kt²,[.sߎv‘ršþÕdÏ,…DâëǃŒÙ¸Ìy“™€ÑÞ«Îïý9œ¶èËÝ|F‰O\G²*¤ž¢f™ÒºY©5˜Nܾs›:²º¯y7ƒp&È/c¼K›ö[áU£­A?1AE¡ä*¨†§„?Q|úæÂ:LÚ¨¼BÇ.¬ðÍÒ*œõù]eyA² Ë™ªZh,hì¯Ñcä»-¡Ë¶5£J9¼rÙŠbA “ƒÝ쩲½uнÜç½-Q—òüPjéOÿ#rH D®J`HL-Ƚ[´DAØ¡ùA%¶S'½<© 0¼yMò‡'6é ¡R«Ø[€)ŒPd–ú¹Ü[Ú ~ƒ¥8y¨?†½7a0žFÁF5ÿüF³÷989üÌ„²Ó‘á¢ß¢•`“eA÷˜+32j[âáYþâeÊ{ÑÑó^ÄI{åSzGtWE5Ú×ojhu«C¿ø?­g¹X¦m}áj&ºÅÑå ;)ª‹-ä.Á7þCúr… ¡úÁz¤sË’`½¿¬Öñêh:³Y¥Q§ïréàùš­s”!ýI›]ñ¬ø.ƯÔÛFUNÇIй>{­‘:7e1¥“PÈpK¾®áøÏ¾w€Û©Ô„ÌCqrÍ\¸þÅϵï\ö'kÙ(ˆ®‹¯JifÑS-YÎ5a‡òÞ`%ïMfÈŒ¦—>`t¹²0°„½>ZG >ºÑŠ#Ô¯ÍñÇ+sI"L@RÒéÞ…ú5¡M®q­(Ækk‚í»Zq0ª‚êE¶©b¬Q~qé‡fXÁÈuf™–†¼öRXF»óÜÞà ¦ ÔÆx+ÊðtDQüã[*Rs¶!ÞÕCjÔÆìáüä'ðW0µæ§´†ÄÝ÷r¤¡‚ÀVC~¹ñ|6Úˆ•8 *jxYóvBrsÁajO“àý¸Jy ]7"Œ8pœ/í;3>CÈÕÛÐð‡cRñc9 GÝ:0tv÷gœòÓ‹„æe¤°©´»H–“ÂÍ9Èöôû)´ôe@pøYóÖh}þ7úøÜbíôíN¯ÎÂ;ò™ÃÁ_úЀô¯Ä q0;)ÁHÜO¶V {ôãÕðßÚvgQÓÎÖl ”Û–³”¹qí¢›ncóyÔþ½ÎiíÍGÒj€½@göÝÉúV)cžD’C9U ødr3YÑŸ<7'ü$¿;εŽQýn0v½KVE‚Õ{Ë“­ï ×¾£‹Ð$Ë?Ë|¶•­£,Àã S×w{Ö7¾*D*JF\AB'!‹òqŒËg, Úß8åxåÂfVœ\o»&~yn2]æHYS¡´9¡¥Tdè-ð£Y8(a£~¤é)–ÔœÝÛ“ÎÃ÷c¯Z$›øþvwÔN¤Ã}äh&þ#9Ð\ª^" È&m¹+¢c fÚ³ˆ:bÍ}ºÒÂG'÷cW»ùNö†DQ¬ÀJ•wí)rÕzcÓìL>3pTgi$jÀ&cfßaäU–…‹ðœOºÉàd}Ô½eï__»(åÓµ{¤yõd«Â{$ûýóÄØ¿kÔeMHŠÌg‹Û«¤š¸9dÑg²øi>g¿+‡$|áK–M;¼„& Þ}r+H"×Ù4T”Jí…ÃH^h¾d5«Ós¦{ñËÖj»±ÝÏYi&[Ö£‡…ÖÍaŽ8Þh9çud‰ E0 ONl€öó’3RÊ•‡ømxw‰E±µLx=Jæf g6._éÿ íßѤ’!ucœQƒ·Ø²,á¿ ·Í×0l±Ñ×$Žì’Ùà°Z¡~¨phÞΆ „]"?Œú /Xh*-õÕÉ%z—èUªòåÕÉærq´³Bíã$~“ÉÌàÝs›DòV…Å("`R ˆå/FGäµ—ôÕÒŠIÔŠp«œž qºÓE[A»&ÅNßgû ±s ï)íÀª]”av«žæòÈ[nªÛº›“Þ³3ø OÁ¨n;aœžYï[t|ë¼ñb% ÒS¾z) X»>\p‹Ò¯£+ëðT1}~¾ÚT¦+û× hâµ%åÝ­t„ËfˆT8cY¡{¤ÙMävÌðd3êH#í¾€©´Úmƒk\â2ûm#?ŸOZ‘sر—#,¤Mé¯o‰8“¦È2K¾n êMX‹AãÏæš‹J,ß××An7*¿Ìç$j3ú­Ï˜édtï(Ï9FRsf##H*µ;±I¬PbT"ý_ã®>äă#k…tËçkèÓ‡ž”ÒNè åeôžm»œÀLD9Ž%[“ iÚŽW‘à…úrV4ßבZBLÑåã,µ<8WÆ­ †E ÏãçÀ©kk…Qxˆ=€Áé”sŒåXH÷Ét¹3ÉH µŸR •CN0)-ùβ²~æcdñ*k}„¢ÛƒÞ+pÛ­»9pEŽ—Vßәј£. 2ß–ZMe€ù˜z×u G *‚¿Ö¼K4ê÷?ÌVœÑyßLS—º}=…Ñ X Å^]ý…Íê^öÓƒQµW¦ŽØ4fÌÖ`.†–7Ú$küqÆn$þSúû‘ Ѳ[¿¿"ÚÜîépF(Æq\ó\)ÔžG"£¨Oi*¬é m’ ãt…Þ}˜…¶‹I Y-[QK‡~hõx®ÃŒÁF6HÍBg»F§‘»c¿»ÎÅÓpÓA+Ç’¡š…%\‘&.uêò^t§e r”‹œfþvî\ÿrìØª¼‘Û/ã4ªìõaª€æ™00XúK]Ö)4+®°_æŠÐœÝH@ÏÌ«^./%±†öVÒÒÁÌG ©Xý(bîÅæ¬ÿ›ÖnópF«’?œ¬’c/©è»‰ŸÅ¼>©ù«`¬è>ìë'Îʆ»”X³äbž\öÙáVe6¼ÿÖƒBdÿ«èšËL‡__VR>MÒµpã¤ÚtT‰ØíN2\µa2ã—]¦ð:0…äîáêe¨àêäFW^ydˆƒiIt {*+cQZ@fmjpÕ‹BLgæjE¢Öò"ˆqXÛ£Ò‰šû\&¿’®Qrs˜÷ÃlÂ@¨ÜlÜý®Æufª9ôß2 2-£ú—Kä‰2 +/¸€ó oÎob¨úÎp†Ø‘p³X®{ùmóòY˜£b7ˆ}œåÈ2iBàÕjo¶Ð‚ʲ¢ÙÂRÇKQpÁ@ð› ©snÚ÷ gÇ®A8Õù¦îýý …êúŒxš›qki-hèYmá±oާ÷6ðŸþˆÕŒieVÑðlÜÃEýõoW‘(ýìi…”bDh6CUš2F7Öˆ9¶8P÷ó®‹ 3n¿˜æºBDš|ü<p Ó6¿‰Q!ÅsÅp¾—»!»õpÚ¸Ô9‚—4 =?ÙZ.1Ø­%&øû¸‘O# yn´õq¹MÝÇš»Àæ×³à;£ä Jø$òä=Xõí`©®Ø›9d%R¯UFE\ ¸Ùô5SoöÑóÎæö’šªä 5þÉí®ú—Ò§<» ö5A«Ý’é[§êœù ¾/lrh\|ªLD?²Ò*¨ü½e`Pëxéýð·Íu¶¤0 ±§å¼Ê@6…À‘¨é)ʼ7ï¦ P塎wá8Q'†_%±³^êÛDWgb†)Þ½5N5òšìÝ|Y÷õA`˜/X wnWM¯íãü•·† ¹—7„ø˪Ì Ê—äo]ä‘nÊš;uÛk7.A•««5|P´8€%æS±Å!ûÕš¶õíŒ9} <ò¥Ñ[ÆŸ£&”ƒ`ìHŠ51 N¿|u–ìè ;ñ ƒ¾‡ìE•¼€ÆÛ“)%ûîrnÔ¤NáÃr††¤4ñbGe QíîŸÔÏ>c_ÿz:ð8ãߢÞ&‡ßÀ{Ø`TCÛë° *g¿^žè‡éJ åžÛüňÎRæ²D`¯áãã«t8"ý®(Š:™=eKw³¥U‘òðX vŠiz¿èµ!Ÿ<Ä:!CÎÆ}ÕŽ‹~«ˆ¬ KaÔ”E|@Õª÷$¿?t³þTe(Ü–¶±”­Èlb]õK;Â9xÌÓ|Þv‹\PF¶g <©àÉ„XÕ©6­ë—ÎP‘à‡; õ÷Ø@@ŠØzhß ô¹ðÊQ|.žÐ-°ò‘Õ±(ƒ¿aB×Ô‹@`ÌÐOÁ¼0+Ä Œê잊Ô/ÿ8yC:–iàÒæíW€í€z½S¥2üïÑÚv{Ò\iŠx›ð¾ÞÉWEƒœØäYMi Ö…WÕ‰|^ºã‚ê_T (о¢ïæÆ~4…ƒß뎮EiFnH0^¨Ãér¦¸X.ØS£4vêá¹=‚) s«´K[^ÅÆ³/ å­Ö¾5H0ú¯'Ÿˆ'̈BÈÁ…$Óå-Eý³$« ߪAjÍþœÏqHGºó"¨}ï‰]P}”')U°hÆÏ=#=Üýã ÒB±XÜçî@d[—xþ¿/åç6Ó`©”è¿innFcHAš¼ôåŠU¤påœ MvÇ7>݈ÝÝžÁ‹l—"‹³ïö]ySàËF1”Sr ÿ‡oƒdøÿ.f–B+ÉŽì—²‡Ð’*2E)4šaßP‰½!1íÐmw”¾w§ÐÎk7C¢Q·9¢{FÏ~ÆiÛ-ÉÆò@,ÍÉåçáü»÷m\*œöqÝ5Ü5ÃrÚbÐÅÄx!v·y„ú0U· §3)Ë29êV*|+€âBܸõÖ·ÿbêLHß%;Õ79 s|˜‡çôpÊSÙ™´I9êÞE´+ÚÿM$àWOÜJq$þOÄ:p\A"xÔ|g_SAY¥„F¤jçt' ÄBó@5%EºT¼!¶ÂßVŸ7RK,÷¤Ìd¼+ìMGPz¾ÓðøH(HNúy:fØÿ^¢àã¬Ãúd¦µ)ÓÒN~AÑKÌ„v 6-6ë›f6žáJ±wõœFá>ê]x6˳¯è¼Ãú`£ò‚'ácª_½²p‚Y®Iѳ‰Øç%î.bûu6¸à®Z™H˜]åY<.²Íä/l’öÏQÑ ê¼mCâ4:J s︂€”DyI3™¤šËÆË„Õéü‹KŸ—36©m¯'YŸ@{½ sA€jHš$ÃÄ=åÇÆˆµyÁ;YŒ¯|+ R‰òRv…SqŒ·”ÆÓ¹{‘`bƒ0†#Ÿ¸ÜDtšÆ‰R¡À,C">æÂ×ÈÑMf4WÛõ´çžå¿à*8£ÌIÆNz¡xG:„J€ªmÏÊ÷ª9]ªÚuGËþZÄÞ½É e t0Wkà–šc‹ÅjA{¶Ïóâœ/3 ÿyßè’C#z´êܶîµwŠvÆÛcª[kYv£«>¬mòÐìª+ËBÊT¦½N¢œÅ»¸§¸6«<-mqäþt á•qÄ!&HWS¼žƒ?kØD5:Óò4̆P¼þºìËXèt¹fà¤QÂÑû'î2‡ALÆ'R%ÒòBLJ ÜkÚË¿­r•Ò¦ºAI b¯£«„ÅÒOmªÖ':Æúyq“¬NJí Öùº•/þOø¾ ×ævExvÞäÊŽšáÈ¡ÉÞoVnš ͼ(8Õ.µ™¨ai’ Šï@{5£žé(Û7÷å§Ó74c?XÐÐV%Uíýd3ÁeT3m?eÖ¸<'äò^Áºusñ†á鿣[”<߆³¡QSþ³vc©\ñ|›ÖÉ !áö„žO‘zôYÆy]/p6—,–FåÀôkXByÂÊEºá´y{2š8“8…a,=Pà xœÿ¤V!þÚº}¡¾¸ŸB#Txä‹>ãþó¬Œ/ÃÅÀsç3´xBòùïmí íæõðÂMB1 †|ëÜëÄi±¢a“Îwjr*úØô­âXìýj…NÀh³j´bAúØw¯¶u'*Õ$ì“ܰ‡+Wn–Y– Eãz5¹,2±€Öi`ÌRÑh“cÑ¿k5³PAnc¹½ã|PwX±È6q×ÌÊSˆ¹)Þ-bP1„¼*â¢ø¿×­&õ$®Ñ¾1ÃwVpމ´’>‚PRÿïvá ¸{Ñð«ù¼L\ª<¦o%6k&Á+H †O0+æÐ<Q@™¡/°°kðâd¿{&v=QÄÀ£#§žƒrÖBÄÛ/4OÎí¥eLÉñx8a,¦§ôÂ~Fq!#Vu‚Â!ûàâäŽ!Ô xÚÿ¯cÀߎ¯àpJÉü'ôì#1é®@…™ÏiBþ‘3çA¶xªO+(ü"QAˈ§C-£3# ÷¡ïŽYù9ýÊU¹%gQÂô[±÷Õ•'¡ÃhWPo—âÍ«ih(½.Ê,¥›ATáýö?„˜• –^yn&ÍûoëÎÄürU®Z±»$¡ìú½bQâæO aÛ0 n…á­^Ù¬Ê xñÇk¸¼@ŠóÉ›Rà›ÁBV‹ \€°å `>)[t•Iø“p±V³|ÞÐv§Õ裛†3RNÁªQûÙP°™ †15¼öˆça»Áo·¾Œ÷¤wг…íg(¡Û\slæõËnÓTÄxÃJGøzœÝ¼Bè.6Ã5ÌTî:ý}Ï[tÙÔúËÁ7v¯×³ºlN­‰ïx_ÚN<èÏYûh&ÛñwB–Ä˪ÑsdA"‡÷O»ÿ¥ÂîPÆAö*QÍ&-É ô›0ŒÈßû—ŸŒ²bžCYVk÷ ‡¦ÔìZò2¼í[¤™u[™€y3pJÏéôAÊ–{æö£ö÷õYV*ç—2£;  bßñµ¤A(:ø=¬Ø•rPúW,Ð6‚ó¬w½{ì¤F)iÚ":[Vo¬; L*X€âäC,H‚·÷î‹Ü— vÌï‘0dp«ú¨·ÞDèƒa§?;B Òç—XéUµÖÊHƒ<0ï• »Ç-Íyƒ’Q¦þtB¢È‰‘–‘á‰Ù«` N•tÅ,&`":qÄñm9hÉŸ©Ë÷N\Éxæ¹Ä40y³ãPуݷÉkšåQCeÛE­Awšä¦ 'Õ2Uúç&í»×)‚”L-‹peúÑ,CK¶Ý“T¡×x—Ö·»õÆË_H-ÕÐqUQˆ>Tv“#Œ…FôÔÒtß±—òÐÉó¯ÅáÄȵ§“×ß9£ª´ˆ×¯wûH"º×úT6¶0ÉŽ”Ü6"øæüëøE0»¾œ}ªÝŠÏ;ãŽw[K¹ÏÐQzÑkS\ûä}…c湔ӛ߹¾:î>©·a2µ“ÊÞ¼aFŸ@J.­Ž(e«M!7û¨÷±z1иûù¤ÄU. “ ä;XÜ‚Óoð?Ý•Œ^ºŠ¨Èý07^,Q“' ,·Ö‡°Ÿg bkÙ‡ T¤ÝläyÛ³ž‘ê>¾0! G£Äc'°â»Cúm»šÊAU3ý’Àe2)_<À•‡ëß++ÞÑðMM}ÃHĄ믜ºÎÄ{-/\ªÌˆq3¬)£è¸t]õ¾Å)>2ŸT<6ÍÉ:rKઑ%‹ µ‘áñË(K¨!œðuœRï­•/³Qª°kâ¹+Íh°X‚G zÑ̘d³gÚ @ÁÃICk(1:ob{±K¨>œ8\p0åa TÁ›ÓOUé'Fm©_qܹüέ%T£š[ó€¿[-£wfB47î¦Éü¶…VvŠ‘b®Æ•ß!iŠÿˆ>%?ä?ÕsvMàxNîo4d¾n!c à/®G-á`.b“cåÏàâ¡ZÌÒ>µRÐæÖÕBÎïÊÇBYkFWH¹3%N‚»ƒ$²…|,:*äI#FÛç1ÈmŒrðJé²À4æy)Oa£¯¦;ðµu©1eP€ñÍd‡6„v4ŸS§ˆLÕj‚˜j”Õ1¶zæÁÎ× \?A†¨€H?%QÞ7=É D¶ËÃá˜.(o“•ßYh>©ˆQ:,/´ç)6$þŒ‘|Ò C«UÌÑðr\Nr–1:ƒ«+òÄõÜm6Ó³Õz5î߯\³êtŒ­„FÚ8’z"°N¡:² »2Ûsp*fÑ:UG:…܂Ĭ­±óVïô(éæA¿xw”ÜŽ)^ÊM™pØÁ®S³ÑeÕ£$ðwR”mÀÀSÖÛqϳÁ²÷1tšë±¡PE4œÑÇ›æYõØxÅ,ÞÏDCq”û0+‡¬ ”iˆ:"Ä{o‡ƒs5ŠÙŒzÈÙ9ºîþ«áJ½L '7ýÑ/,‘v'œÍV•ܽÀJ£ðÜ⬩KìšÆ0›û³‹í¼z¹Nà=ÁòmrFå'Ú J)úUg(Í–—Í0*éå cŽîèõð°¥.‚¯+{¶¢²Å`Ɇ€Ô’áǘI±0tñ£m*^8«(Ô¾ã{^JÙ“k|ZXÅ‘9od…áÖrz „MTè´<¾¬î”@'Ï#K*º¨MÔtk·%e/ñfé쓨Œ(ïÑ…¨òf!ù3rÔ¡¦æõÏÕ7õ)î…Hå€.¯ jÿðn’ÊÍãïxw”äöíÛçߣna Äf&êÿæв©ÉÙ*ÐûaÞÛÊ":þ4]ð9ÍTÒ«áeðfúö’‹K¨Þ-ö› §Vùöõ“|=öhþ™Í9†‹ì ¶1”èä{±Eâ+/h&¢cÒ†â-™€w EÄf„Ã6†š¬"³¥ ÍZŠ>e&²U_…¬xƒÌâC]uJqú¶î~[ûSÏp”Ý _!K- s{lï«óvÒdŒâ„þ¸ýw$T߯ ¦+¿gãÝø ‰6¤eŠü®IªÉžT÷/ý×$nµ:ÑQ­ôÁ]"ʲåZ™·vG£\¡'d&L\£×–óÞs´{ØG¥ÕM@Ö¹ÊFzex7K'ÄYœ­“^ÎþÎBj üžó_¾àØ5jX5iRdóî–h~±Ÿ€Ò˜ŒÛØuó4O’5ÅÞg1¬ ,âCèyi“XÜU¿íÎ lFð #±–*+Y¡_±è›B¯&\Þ]âìªéñbŽMI×÷Jm Tàr‰&ÐUd{á¨2ˆ»!Dô«=1¼Õ,"}ÍH©ÉxáÈþ–UË›ºo1È•E:k ûd%¾\ÎÀFúÖЫµèÙ¾?ÓåÒÙbZ|bžc@;>z¸žx MgêØë†kߌ™JÕ—q5×ÿèo3¡LiŒÿ‰Çùüô鵡vDjõ€&r™W¾ÓGÛ‰ÙuáÂ0º{6X¯‰h+v‹ÑE_ê°˜fÀ(2+øœŒÎ­ÏÌE¶ì¥9° Çóý¹éõÆë?Â~UØJgÓ§S·Z÷—Èîž‚Ïjð“Þ{¾ÖÄ[^ClÐsƒ”·MÌ¢í¨<²ÎpѧÃ{ѸMHß<å(ªë[_ódÿ#Ð\“¦û–{T½Z`Ÿ@]œŽ¥so’ÍÃ^Ø5<Í%+×Wýd1ð8>GzdÍR‚lx}ÙÑ]Ê{ÆME-€ §Ç ô¬kwîÛã>ÀzIy Š¾' %ß®J‰T¹,ég%Ögd„³ÈÈÎk¢ûލD© ‡I¯“×E=¡ÜáJ&ƒéXâDIoójífõ®þ¥ª>¼Q^ˆ.vËGÿ]^$Z±­wKÜ„,üp2áÇï7+Š8J7€ ÉŠ `é8êqÅ9@E2û(‘ÉÄT©Œµœ©7˜]}°ôlÇvº1$ÅÒ 5ÌñŒ­³ â w®!m…‡Ì+Ê#·“›§‡Ótœo†ß ȵ=03 ß¹dseÚA.²úÆç‘ØÙvã9{óLS­Ç€‹¾„Ý`—åagI|÷¾B^I.âÃUF Ú¹ácâzÍbà}rHl= >n»Ó¥W{Ëø)+L¢»,kŒ"]j[‹Û+a †"ëmÒ¾ÿTÛF’ýG\C`ü=ΧsþBy@3ágÝCÎMÞÕ¼^@~à >'Ðç‰ÄÞ8Þöˆóñ/Å=9¡¼`Aù›ßû†ù´Vö2©þX,Yâ?}/¢|´dÖ°û{@E«lŠ "048©&ž:SÕ{ ᜶«ï ¹ØÔ1EPeó×$0Ðv+¬S&!Õ|ÿÅDºqo™+çÝ| L 8¿í½"ón¨4ÝCê›ã3u¶’›ÊXPÞÍä|ýš˜Æ—‚*&åÜL~/šiHn¤yÈ—ã?+ð„,èETŒ /€6úo~a¾Ú<Ó·ÙR¡Ÿ—ܸEÂ,y“ ‚ìYÔ%âŠ.Ù?r¾eË0ïÐa¹“ºôƒï6Å?ºƒ®Ð[ÒžHÝO)ÕÑ*fæ US¶RžÓE6˜~B$úÛÊ÷›+¥C»Ÿ!*¹wœÜÈZW«_½4»ý0B#"ÖÀÇ~Ò»shJw‹u/ÄÂdyFìcüewÕ7 ŒGñV±o$Qí¹¸Î "´—¯%°SV¾"bª+ øêëïáp‘†ÒFÒfÀ"‘"™#‹zú‘ö|Ê E ·ì¨Šž/øŸ±Vúcbu‡Õª+ì[Ò,è¯Ape-DÔ©@Ü`‹ül…®Íùëi»ŽÛ&J˜—%:áÙ§Tüß„$fËìnŠ:ž¸À¿.¾lMÐ-ödÑ\±,ÿ=f«y+ilSÇôj»Î­¥w0Û“%Þt)ÎMvXó¼nžYH8i¶¾ƒaGøïR”½¬ŠM™õ*ð@òÙüß3j÷I ô¦€Ç¢¾â,hl¤o÷ß}ýøí™plNy¢i«{ûÄfž'«¡w€Cp“?8Of®¤P¿0܃÷É8¹–ÆÃCg…®ÃGÕJ h_/ÔéD§ˆÈw– 1—&/Ž6ÒþtÔ²ƒk“à1Ž'èÖšëËQÀø†•‘?a¢©†é^_ÒÃë„”7{ ß.²SÚºÏÁÊ¿›x,âÔ°LÛd[ñíc·±Ç ü< 5MÄÍWG¨?eݲàÞ9ýÑ·dG${{ÛYÁðw\_‰‡¢Ÿ´àõÏGùVN#™²ë×ope¢ï_¤Eýó;pyè ,àü1‹ùå̤¡Ñmuö=»Ý§„e¼=Iµ§ìÕK¤%ýmoæ^,üϱªd‹üéZ翪@pjçIwÛN«¡ ™ŒEs—êGÉ¥ŒK]ø]LˆO6f$ȵDÅܽ;Ÿé÷ÊÜt°·g5µŒÀAN&k*^_âÆ0î¬Sœð2•à¥nñL1h)Aq\s ´†˜ÓÜôÌ–+žK¢_»X~êÐ>É>;«.CƒUôy€z­õÿ{l<˜NBn¼œ9Ê;øi`@vØ?ä­5zx½$0Ç(€oÍy ÑjʘT{˜F´7þ•‚äócî̽»i[}aÛŽ…Ý“›‡`8PkbÉíUHö•°b—W>[oÖ{BãU/´Ü!¾ÝHÈé…¸C|©ÇMÁÍ“Md“°9|±ôvðÏ"W£Üsˆ¦©ât}ÃSìÛÄâž-–ààq¤9@,úúh³œeÍŠ-°Q]ØbžŸ}V»ïð_ q‚0M¥a$ (£çOiŠ'¥7Ü׿Wxm‘4Éq½bŒï)œþT0ºUz…UJŽå8Ÿì™-½ëÕ~bŠO—¨`(˜ë¦jÑ9¯x’pDÏó&e*bl>e É<î`4™Ñ‰®Ú½„Á8S¯wDÕg«ãY(ö‡E¦žî>°C/œx‚sæ‚ÊštKž­ûÝIÖã1R¨zÌ Å]HÓ ØØ—{h®‹~ wݽ'âxe6äñþR64Š<%·ÂÉT&5©õ­„ztt#$@Džå;ʯªŽ÷¼Æ‡£h£ ÒÁÿÆ1§ƒ+}©Ƙӭrt‰ô5yØé+µT'°ïkšB°81Ì\<ÿÐaÕsÈ€Ÿ¦[i³Ø¹óÉü†oޱI¢—ì(ŸÜA;e}9g\‡ÆÃoZtèõ›°LéA8h6Óš >9[rò‰›2BÝ’>’a‘Ðìî÷X_ §:²5ÐA¥†X€»úKÜ™oÔû¸Bò_¦òÖ¯z¸ÌÊ‚ýŽL…sFn½B,‰™Ë,PÊMs³EÇ-ý0V~EµP StLeßO"àï ´9ŸzLCC“ÆZ°Ç?Òó-^´ „Mð‰ù]R(.˜pý'„Qä!»]m>ªVÁVl\e­=¹Œjªç1¤Vi´S½Ÿ_¯ì–ÄîŒàø)ѪßΣïÕ!2¸€)àÜ2þ¥XzwIkDªÎ@Qÿå]¥USÉcä«íœµÆœ£hõœ¼MÈÎ7BU“Ä­)y³£dIÀ䞃¾Ÿ?L/˜Ün‘€0Õ&¿WÛ£4eR»ûc´¬ç›È­[릋û’Èô/Þ~% *CäÃŽ[êŽþ”s £ïõ¬I-ÖeðŠLŽZ?ô ?ÁHd)Gl³LØ"ð(êÒ+œ\Ñ88¿îêŸGpòUxœ…,–ÇÇž‚í:Íô!‹QÚ²5HÅœ¶ADNn˜D¨sÓÞ¬’êÜ…-ˆ¤zb`,)“h×Z„€¨(l¥ñtƒ_ì8¹ºÀ°õÇp€çc>ñ Ì´,0Û£­Wÿæõà„Wö¸’Ƴr¤Ûq讦·»Ö×±Æ'þ*½ |W ’†ív÷­ _±“ra3ÑÚÔ´N¥dX}þ} Q3t)Ú)ñ0²Ï[ qëu0 ËX;.\¿EfX%Wîƒég×YÊZš;khñC]ôŒ-ZTÔ¿l…Ùe^ñ´ »èe’6ˆñ—šZ¾.—=r2A%ü7“;qØàe ß%ÁË)õtk9ªÐ×èxÂäãó⇖oJ=âÎ è4ÌØ!ÎZQ–C:&|hö`©8õ<'b•†Nˆ7ÊPÕ6¯D‰‘†L‡^ªpÏ ‹j¯íGéISñ0P;—-.]¥Þ—üÓðÿ`’~<5 õË'üݯŽR¶˜(K¦œ8Kåë8oFw;õÁI[³FŒâ„vmÓ„™%º‘DÓ] 7¯cå'ÑwC´â*ðêçgþ/Ü 5=é¤9yÇÆ…>ú64 Ûò%š«D÷ Ü¹¨Ã]ðuŽÐDîæka¦ÒRVúöfô†Y)ÆFÊ/+·%Ý¼Ž¤¯r­Èážϳš`·¸±mÖ>×v¾íÆ+AeŒ6à¹.™õ—Ë/›SÍn/ íËO’ndiYùd‹Å8 D4ªNˤ–âç_‹H‘°'Ip`éä9G58þ›¿ã©£øíÎ6‘—Ü÷} ’lecI,8¤µž4|Æ\ -0|Ezá Žé¾­Þ¿ø-$7Ø?>)|\ÍUñð؇W¡Ÿà™0S_àH@H2'—ÓŠK!ðj`Ý ×ñ:6IҌߘÕ©K¢fËÌ”dÅJN÷„K5óH4…à9öDÈB+!CÊsݵr™§µ:£N‚ÑL&LíÆÝ䟠°¤A¹­?‡%w®¤JG;>œ”JúÅg^.xvÞHÐÝ$ó¾pR³È÷ˆ~óúKéÔ•É=Ú,$ƒÌ5ULð¥ ÕÝH˃M«?MÎ9Rbͧiî.Q ÕË”}'ï L.ðpMWY¹éI÷|qÈâÒ¬› ê¬Èt"ÈcÄwËYd•R»mš.8z3$uzÒ9Z7!ZrÃ&·kªÅE"X®§BÉóbìÍ«‹-±<cÖäPÞdÔ®¼Ÿãã¿D³ÎP” 1QI—)ȱt5ÈÆ=bÒ¨ `÷Oµ\ŸLthY-ôf`—íA;.J_({ÃÄiSÛŽ ª`^•ñø¼ $?RèO_+ô3_ÇAkuÖxqoØbI¤,ÈåBþ{6È©»`VÿäšóðU8&ìàNr–l&Wš7ImzªG"Í ØJ5õ` Ë"›øðëvÀ?õÅh³Ê‘„‚\‚|¹ TJ¢Ú´bë‚ Ò?–ÂPt¾®•¿è% qÄÖr\_š4Yìwå«Çê•qYxOßáfè@t3/^ɹ”{/^nÿƒ^mj“±Vþ‰1{fS¶­Âî£0ÁiJ$ú'' ûÚiù]k×Nnµu°wšÛ÷äÑÖ¤‰W¶Bøê¨ÊÍF®Ô„Ø>íh_}±Ë ™†iÑZ.î¼~Û1«b÷:Ê%×X’¢X#@.™ï„N3žµ$˜“2æs2ö“YåH6ŸÁ…÷îGO.à%´á ®¿(OW/Ëz*”1ˆE Ëêb€È™h‹ˆÄU¨ƒ[䜠À*êÊá+ôÌùkÙoþ·­ä…ìÔß$ªÚûºÎN~AX<ˆ‘ aˆQÃo3k~=+êý¹ßM«n¸"NŠ32‚DpµãxjB¿·<‹°ãvbˆÁU„ÑÅùÇ´÷V±w%0ÛåÔKN¢j[ÜÇÇç×ÐIMÍ_øÐd¯a;ÂÜZ-÷€ ÅN~Ò³HnÔDBãiˆY—ûf—¼DHvHƒ:‰3v",xLOÈ =rŒ§—®á$ZÜ ênåwÏ5„ýùçòqž›¸óƒH–5q›…ýÕ–S# ö¥¿›pô?V×K‡“¨žzvÿbh³ÝçÚBÑDB¬Å™Rë]Í/Œ'ó  ×\Z±qÀÜ»úÌ…—ûs²Jú ·æý¢U?Šêöãº~cŠéhüÒ¥ å³`8´ìTÌCÍ¿ËmÂEr ñW̧ˆ|"ýìRçöøNò%Ï_žnÃ@ºÄ",LDŽÉb¯Ïª“¥ƒÖaç,Ž+ÌêŒÿ…lé@ÓwÖçuËÑਅs^;”ä¥?Ñ“Cºß—Q !e`Çè• aá³ðÖj8&Ð øëZ9ën­ª´ѯ0^ÕSv£"QüB'ëŠË-¹e/Ø›Üâ“Å­‹ýõ¸¸¦:Þº, øŸ3žÀqVOåñaØ®M+1/A*H_À¨Ëg‹ÊÒ-)U…” `È¡… d*g­“A„, ° ðÓ.[Öa9»n×ßõ>¥žòtÞõïöFX]ñ]"ji»;+<1ï˜e_ýÿÙÐ’(ëýjµd9R™]• –8Ô¿íS}Ö§ýä§&/Dü‰?9jK/²"¼ïç—`à<ê?š‰=œI÷ÂàiI“Þ¶µïèŒ}ã`”ǃ÷ï¥ò^fû ܆çÔÍ^÷ª(~X•í%ê%ô‹‰ö!Õ{ÎÝß´mÞD¨¦ ìÏVwWtS- ¬ÈÞr¿¦»ðWŠ×Qßu*RѦ—VSô—wË Õr|n½î)ïWÆ4ø öÍ£¢¦Fäb(Hõ!dÞ)pdŒ®aÇÔÒ'Fèw$¼©öÒZÓ®-uÁ#+À`£&d’pTícçz¶Ù‹T_>¹m·Ð4?©Su@’o°Á/ë ;\¡‹\âü42KsÜŸÖÎf·NºÂ!ŒfW]Áø&£î¿uùY¸•1Š¢WC›×HL$û_–~¡u‚tÑXÆØ¡“º¯ûï3iÜxÛ_áÓgŒníÓ©E´IN¯CðHàv-!áLÝOò\6ŠÝðuÓDl!\P2yWŽQ\ö½ªiŒˆIm.ÔÎ[3²ù«Û_iš(ÚP’ÍG˯£V¸ ×5ÝÇS¬Ñ$"o¶üïÁêCÓ„AÁ˾Ê(0‹%}s ÿ¦~Oá~A7W}ðP[Pîg1j1 ŸgÐ@KÿŠjæÖ\sË_«ûpi³hô=|äWÎæ”öNb:8 TÔ#+bõÎñ¸rnªÚ&ª\éâlÐ3ŽÑR=ž$‚Ÿþ— +=ˆµ©Á¥fhµÅJ£«µk°ILäS46o8J»¤jë᳞Ãþõˆs 3rû#†µÔZ¤°·~ë,E3r©F¯I·$AÔÿtn 7ªe©ï°+U”ÜQ7">r•-¥ëDqd¾ý˘ v@]A ÞúØXiõ/Æ9ØL¸É,ô9¡Òv¾~TÙF7¥È\&7ÁÁÿPsU‡àòæè›º›a —RmíB‡$a1!ËbøifS%»…ÌV)WÑk`_wI©1z‹û{„™h‹A€_óXi=çñI·ÿð”*¿h¹ák¿O¶]j€-¯¯¢-ÀëálQÏ÷ÙÌ}ôí7ÒµjH°NĘ̀֙#âê&;oW^š­UÈÇ#]sÚ²¯ªñokR€¶Û’ £1G,^ʦH–Eè˜ ¿âKÒrs èh°yûá;]9^ªY JÉÜ?ØʬFRr©!¹R_“È'mÜÆ3`¤¬A;RfL›ªJL7²©eÇ ùËÛø`/ÄéÛ5ÂE”éäïKµØ2÷©£+OI!ËΧ=ß—äÙn†¸äßòÐFµQ¶¾-%·›üvûOŽYyÏÁ{´Í…Îü­±^zÛcTQÛ¤px›dè@< ªIngÚW¢ÀR$a/ãvbTF¯A{ƒÊÃÜ[,®~ß›Ÿ…Vô€1qØÇ¡¹hSLVæÈ>wi½›G,øóþÿèwL’; $ Ñ6zœ×ê’?<öý2>²Ãô˜<'¸öÑz/6ºÂżÎuK"hNÙ¯ŽJ –ôšðòÇ«fýVLg;œäíŽFæ: ==¨¥ ÎÐðc%á {|Ûܰýˆ&a• ùŒ¹YøA0FÙñ„磘݌d {Cˇãšr6Ù™–DQ=–P BÓ"´ú~ñ͹í¼la1ôJREù× ƒA/YÉ UÎÃ1«bsgš¦ŠûÇzÌS&59?7në"I¤ªjwXÙbý`yñ2•4 wLØŸu–FgN5ÒDÝK/²atMåû,„qàiwVºv³CLºÄô j>YªA‹N¦ Âó E uG_ƒÃ'm¤{͘FC­r_%±2íR5'Ä»Y¯|Ã^uaOKOnŽR•#Á×ì7üÍU‚á…J¨VnÂ>€3_}Eδ‘­^Š*¾Ñëð‚ÏWˆÇ9Ï÷ôªþ"˜"A6ÉÓ¦ØgÞri:Uý¢t° ÚWÅÙË”úŽ*dÐ`äÞRÌJxGïÀvwR™»§Öay2µû3I™}DxŒ!i—fhS™Ã¾ ŒÕ›Šßðßž⾂NR ·'ƒÕ>­ër_]y ÔXºd"!EÚA[—áèÇùª°›Å,ÌKºº~ÝîêM0¶ü±¤|8éü ž\`ù“mCé{–Õ"L°A¹Üs,úu8®m¦.aúë3l’‘‹ëÜ}Aÿ¢t`”&{cW]ÎòOóõä šÄv<ØŠÑÅkøI—“¯ÄøÄ~¤¼ýÓ8tèÉ‚V™åKŒ2­l’[w<ìŸÙtXk¶%¿éåÊÊ'ÂéÃå+¡-˜®i€#÷|¬ü_¾+܇¸ x*wCð¹:»ÐXŠAÀ¬ø€„çK)g´i窸"®ÿ¼kË|»—ÌÞäžê¤ÔÝj~Çž«d>{ gàóe«^…ì#µÑ&¸wdØÞz1W²PçjýH¾¥’ÚYø·¦¯ÊéMÕÛ’eZ½Ç¿Ûã‹ Œ›{G󊵈ÙsÞ:¶edbÒ<èå‚j‹Dë%£«í;D¯Ál*d¯íLãÔ_GNdv;s¡§ñ~Óû=t»89£€ëìÝ+´$×¾pãW'ê±W^žeaU«ü MíàjjêËþ` 0)éÿÒANá-,4g6m¾ÁypÚÍ÷ù^L”‡‘~¹ZBQ~SCR¡Àõ$Rþ†÷>n£€6Â!¨Ð¾\f#?s8³ã‰è:Öþý†?ÒÃ_·æŽÙ½ÿ8ºûUmÜ'xe•­Ø9dŠÎÿ1ÿ‡ßS3ŒËöSÙÉ_á}/p.&¥PlñHÿð,¥_œ#´îôœt»3“©«¦úðf——+ø¢¯\ÖÇOjCæÍ¯!LqLÐ*¤Ú‘,V.;‘6Kx/ÛÙÑ—jþß…<ãFW­èÍ‘J‹]É5û¦Lâ=d€‰Ë S‚…Êj³Ë¨è—jgí /­ÇŽ˜Í>ÇoÛÃ5ƒo´N (–£nCF¤»yehÔœXa¼Úà™ßa†B ¡ M èD G¢Nª¿¬ÈVÉrUÍy õ[რ~›Zü6úe»´5±æµ³Âôä½Í Lb„ibvvB¸sŽ;ÖÐ¡Û m¢¿×ËÍn\=flCÓ‡1µ ë”æî8&…Tú$f»G·» C'Á§;Daà¹H§OäÉê•3Ûj<}g°`ëUŠ¡Á@8¸¤Zžõ‰‘~êÿ©èË&Ûá ÒÚO’wQ$Æ, æM¶KQ´ø®Ë% ˆYÅ-H¸®Y±Ãã¹ÕÌÏÕ2ªÈ‹mï‚ Q?Hê"`07¾5™d„î,eò ]` ‚ëŒêŒ(ïâÄ"ճæ»oŶ'_æÔ|ws¬Þâ’ŽN nžLÕò³„ö†1†/¨tøƒßænƒ&±¾Æþm÷<]q+ñï¢þã^Ññ‚Ø¿ÆéÐlËýöOØÝ°Œå|èôKŒmñÓYÔ@Q% ŰN 5¹Uá®`ñš«lkûÕ°Õi#:«1 Ÿ›Uÿêe>;ø~þÄÚô%@t×¶Ñ©k4š¤Óê“`¬ÔÏ®b´¦Â-·¶7UÌE0wy¨î2WŸöò;%1ÊÀuêÒý¥›0 ÌÆ¿×‰?Ã;:~™ñ‰!ÅŠ{1‰]hYj=§ëÿ9oaÞ[2uùªŠ‡üßq6e¼$TÏ´Ý7pä„zìbÝïC›LÜòYáõô¼ ­Ýb°Xà»@^Øm‡_wësR©Ì~êÍà¨ÿuçg 1zQÇ (d2k1¸XtöŸŸÌÇö88ОWÄ;íŒ2Ép%­ón0¹´éÃwæòZp ³à›=®è/†´)úޏeBáþ—!z:ÓÉ yC3s¡‚ãan3²šà)ΚßÃÁßWTð>N™+¢Ažu|¡Ô %½®‹APTq\å4ÍNÔÖÛÌ'ì~·Cc¦ÝÞÅ)C’ ž8¡vDx4?à¿Vºöe€\‘KA0{šû;w²ùÃWmk”ò €=âð÷rëx£ïJ—ô¶‘SÏÇo‘©†"e,ëw¸§ÑŽŽqý3ÿ…•ß"Vh28Q¼û½<€Rˆaæ?,žæ™XÙH‡P;q©9ÐÁ®ìŧ.Ç|¶M@õ…€(ŽÛ15 ~‹aöÎ3£1MAíiŽ| æ6%LåøÅ î06Í–øÚ\'SÖQ®ÖÄTÁ³<帊óvoâÁ}O!ë„ÔÄ”¿Å…ï>‡“Z3ù°W®U˜p1ñŒ¨‚[r'ìi‚k¯Ç»»sùü7U$4™«ŒuË´Ê×tF°eÁ_mQ‘~ÐNöÿ, ޵˜m€XRÊŸSˆ£jëþ›Ãn Ì¿œŒn¨)cß?&ŸÓ7ι#Ê[¼ª¿‰£·›lÁ¦y?Á J¶k>o£‚‰~@†4]nðæŠg^AD틾z´»´7†Îc˚ɖm#`>7sЍÖovOÒ5³%ÿ —s¶”߯;ñméwÃs=KŽýÑ“°Ã[ß¹BZêhÈé°"4j'{Kwº‘%Í)Ùj©=›šxítqxÈ-Ô“a>ÓÃɲj³Éšdqôhzp²*Ã×}æ-šÑë9/X>¾MÍL» &uLU¦Ø÷§ÿ‰Q gúžÁÃÉÂæ†$ù°ÑHcªÓÁñÀÎö‡iŽ \ž¤»Ègu†~¥Ëè%oý+©‡S…Œ@=g­.7Å¢ul“±ª%SM5S®ÈÊ8û‰ÝÒñM·7èyŽ U[$Ðe4ÑK°r9Å#ã#`ÜlÏÑT¨—FΫ¤‰¡ÈÖÏò3Á¸â\”N /0AÄí6›Öú7.€<Äs#šÙå•ãS0lnq`=‹­#ª¤ þ¡]¡#.ÂÃÉ·Àø²Âwþ¨Ä‰2eYoüZ‡2÷ LÖþ08˜µ fMð¦˜çx‹®.Ú'`&!ŠÎké]uIpÁPú×K (ãy2?©ìðê¸×…ðy­0GÕ­!¶‡Ú·°lX|iŸR¸AhJÉy™¥”ÚvlÎîâ£8fŽ>ØhgöY¼Ÿ µ_ ^?b™8¼‡b¬!J‡Јn®é?ž¢ ðáNhFèGðê«63ª"Ó—NÏh¸¦ö\ë8¥6¢êVvŸñ™$Ì!‚ÀæÀôtüÆEüP#k7(èSŒKŒ«wʇÞÙc¯ëEÞî̃!$}†KQHƒ¡Æ+¯2—¸Ýnú"®jM¨îœlŸtʆh\EFÎf½õ‹Ä8»àß)Ü»E2´>›­ö0ŽçéÀù;}"º£i+ìõýkTÖ’¾ÄÆŠù‘ èõæíÔ»Bv‰ǼºTu׉ÉþsR‚ˆÑG¨w¹ÊöŠ+ø¡3 ö ?0ОµŸ¦Õ’þw: 5ÿ½ÑËFZWŠÖëV(À þ1M+½«ä‡‚+sØUTŸ(<²~óœxH²NMƒ[Ñv¹ÆbK•þñÓÉÖ„YÛ¯Ý(xùÓé¿gßu7-=WaJä—Qp¦ö1"‚ÌÓðBÙAÜw?é@ód÷æUùŽ÷¶(æiàò\§DÚËêúœÿ!˜¡Ã]H΢zä‘‘¹P‰‚1Pt^7ÅL[Âvc«C&éä›vfŸ-¿AE?Ò-1GÅ­£´UÖw¾Üg%Q7zAß# aÝ¢?YaýÛSm:ÉÚ ‚ê½|b]ºZ4F™‘ÏÜüš‚‘Š–ÛDlÁ>PAé Òhßž>Á?zX¿Ur·W•ö„€·çmÜïCÀ0Q¼N6è]<¿IVP/¹{Ï­¨Ñ7#§ÈE˜cYaBYõÞS{g8â;>±ZJoÉÅë¶,­ˆŒšÄq +‰ëj«r_Èz¹ž,Ä8ü':šiáxžóó¬WË`Eù>ÀZï£6©½„¤ÿ0ÐL+Pƒpd¶éÃìG×­ç?,†I£«àÐ ªr5´[”ƒß`°ñûé%{¤A½Ð¨ì\yÔ*GÜ‘·l=¦Ã÷eíX\ê/š5í àÝž«‹i8[‚¥ FÏW¥‘VÕÂ3á¬PÚ¾Ó†ðKˆÅ­¡®:¨;Ž@„ýQ`z‚øNFhÐðK)@&¼­ÛH÷ôUU¬3~DZ¯ú¹è±í/„$ DíÑŒ°‡†¹"‘ÄKé6qÊ–Ãiƒ C“ØSYþQ€ô¢·aµ©÷¥@Ìp»BÅ;¢Ùs©,& àѽÅ üQúÛs/3PWk eæZ![Yþ2?0m1ÑŒWvª\u@»Ï5 ˆL¶Ñ«»Îfz5ˆ]á•(|”IKlŽJÑЬD.ƒû/(žN}©$Þiž¹åÌN™E ge+÷Õ!F¿¡@˜³Ì<œºWö¬ú2W¯­ãÖ¨¥]5ÒÉ*@–:òSúBCPðã”0ó¬ò­š8‡ùÅÅšÜȃ”Ýj/Y”<ç†LÄc|óÕ;„w³3u%ë>J7Q° ìÇw|À”ÝÌɽ3íÀ1  3¶¢{îL.@QålŸÊÛÌ@ÜO‹$]û Ÿ=0á»m/x¨³¢SÏñÏóê¸ð£Ã ïôÃô¤ýQû©[@¹_C–¢ á;Yðlœ/ŠÃÆvôà©Õêºõw'ñóªnðUÌ—•¦VÏ)Tûnvù¿6é1âÞpö‚<À‹¢C5£¨ÈO:gG¯õ€Uaä¦kë°š>ïåÖ}Éày×!×ðR{À+S–±m|_¸Œa&Dñ2ýŠûLŠÖ(±hޤ² ádçáˆúI¡Íè,( ) »üM}úpÊs) çlÏžž=N*©™ÚÑþë¤ä‹Èü P-O§ ©æÓRëpe«VDuêë¿WöÔL”°½(ƒŠ ‡§ÑšÚ‡vZðÚà4bUô¯Ø{rx²!x4á¡ÔØŸ¯h&÷Äú¼ÿSŒÑ~4nmð}:ßmÅÔZ¥;°®èMGŒ˜Ñ™s©ß1æ­ì„g¥„Rwç›*º ^3ãëFv¾.Iߢ<YR`!wø}ð;dÔû3Šzùóè[B²%ÄMJè* Ê}Jõï¦s°¿gÞ0ñ?>bG`×7ú¼950ÿa¼­cÆOÔẢƒ¹¬ e„Ä0?,t– d]ã9%¬y›Dœ÷êòÎHc5IXÁÕïÚÁ¿+aÅM¦ú{›ìo«AóÖrrç‹ö‘R¢”ÙEW2gþ“\ýÁýÔ`åR²**[êS€¡7¤…3¾‡½ÎE¤™Æÿ) rž Ãs :¼¸ß=>o »ïè0¿Aþ䊢º²ÿéQ)¨N2‘„¸Øà=,Û#œ:""t²b­¤…qèøTuÀ#E…¸§êû:æRžÈÊ3t¥ë†îç{-)ƒØï÷µ¶×ÚXþé£qyãÈê­ðþwí²QÆ-|Ï”šòžØ(IÜýŸß»f‹“ø5Úã™äsè –Hã‹8¹RL°7ÒÁê†iI|¶2Æíè¬KÜ&ç©4Çw›>^A®ÒsxRÐßJn <¸QnáGƒ:e;ïK¹÷¹”{ÂཬӧÆ,øcØŸ¿¹¡C‚â/®ÇE7nq0epdw$Åĺé4ÓhäTš¾ƃ©º/ò;n(*Ê×Vb2„DâØ^-1!5””*½Ùuòïk4.ýY>¨ó™¿ø»Ýëuž/Bð^šR«|¿+d›¼µ‚Ôs;¦û-§3w´fÎ;#4çbÓIÎTµx˜´cgûÚxë!!KÁeÐWÿŸ?EMäC M?H}¢hå—ÔG¿|ŠdxaàÎîý}wýÂàAÕ¶iƒ™Ã˜,÷E5™ür4È­ô½8\JCŸ$ޏâB%›ô¢Ê,¹Â´ µß-Ôïr–¡Æ1›oÅѶ4›l]¹zȃ ˆA/T‡ç-]oX¨m“×À}çþE6¾¿°}eǵNÀ;ù_ç>êçæšƒ^‘¼ö¸­ÅH¨œLÇé§K}.Ô.´ª`"?ü¿Pýÿü‚Òc&çe0¼*™"›ïÒ©­пåé.™X&P¡R·(æÁÚu\Rmu˘ó€É¡¢Â§ÖQÕ›9ôÊ6*¢M- †ÍLƒY¦ÍÝ)º:àÁÆý1Hw óý aUˆFñÉþ&°‚"‰÷­~ ,\œ×’³—G}c Ò@€QúÔ1W¶¨Š/¨)Á ;(ú$Baó÷7ªD¹+ƒÉ€„d9çn¨“–°r½ì}íÎsÖzS8Ö=“r ’Ž1§Æ¾ýSž4kDH‘OóK+NÑ5>Îy­öã$ÌÁ¡£Pšnh ¯=ëg¶„]Oµ RI„“ý»GcgÂÉ\«^‹½eQY¿D¡³½ªWcãLLñÚ$sµ`hÕ$q—@)ðxXÚê'$ÕÌ‘ÊÇZ¶x¹Y3ñØÏï±· Yã+|ïºÒI,`@èѳµ”y4ÔöÍ:Rªœb®ãËæ‘eXôøÎ‹&øé„¥*'ߣ磧fõ@σVª1t•Òâãøn­rou‘xO9¹RÊÏ1ªzCÝi‚‚®pkŠaÖ!ôµ*΋R½xÃâŸ@@ŪpA(6[šv&ÃU Ú¶¢³i&¬PWaÉ\6§ÄG šˆÍëÙOÂËß“tš ð @“¨ªË*Mo cQleªÁq âM—9úNÑ$I—8=¹ëIF›?à1sJɆWSÕÒg.ÿX+Ó§¸&‘‡œ^ÐêN0žŠ!«Yµ»x—@_öµžª4VÞͺ1‹(¶îÙ$ñ,~mï Gæ>!Õ_"ƒ`pcÈFñ¨x¬ú  ¾~W†ÐÀfà-Ken‰OoDÐpWX~ z:†‰Vð»;!Vû‹IÔtl(ij€^zCëïp ´º·d¹òwP„Qôd®î({¬ÃÁæA&¦Ã±}ÑŽïÍ­gL\q4݃{7M~<O¶§CÓ˜ƒÖцu:fÕëíÈœƒ;§MˆQj"ë€@ó‰ªÛÚÀ¤…ëæ²£ âES4ù49æ­pŽÒø¿\§šy½]‹òÿ³šÆ­å½ÉðRU9%îÃÔ˜±>ºúuá©Ü|-%|°©#Þwý©MÊ穲ÐçÌ»m9\ý8fú–cY²-++ÕÁ^»™}­yÿ¯)>E¤Æ­7Áà²ý‚ÐÁgë³<ìœnšžK˽ ¥„†Ç¿{uPSÌ}m<Ø7^/¼÷†§ ·Õãæ±‹“0q›ôI›ð5¾ÿ­ HȈý>¤¡ãìФªÄ¶?‚ʸۊÚ[“/eû“1Ýópm䦓Ü\ÒQ‹•Y†õ ¿ ÇË"‡×³•øbyÞÏpäˆpê˜ Óg6:ë—. ¤kÊàÞ_Ñ9®bœõ;R(M«¸'t8,'ˆB §P[èeöÛ¦Ý:ñ!O*OòZÊF›£Hõj'¢|ì¾¹@3Îó®r69ÏOÐ{?ð8šb®àœ°'  ™2( úL££@÷6£-r'ÚíâÍ%ìÉy›ìÓŸÒJœVÕm"GH~^é Ö… Tî:ƽ;8@ ,D€éþ±Æiì¯XËF¿éš49ó‡òÔiÙéäaE½NžÖÆN‹äÒô¬³æû—"æc•ÞUq;ÔBǧèžÇáÒ'|Dñá-Õå~•ÜÀþtÔ‰²ó¼$Œ¶Vlí½Å­œ’ƒÚL¹ø¼ƒ„úÆ9ž>ß]_¥»÷÷Òtاõ‰ÿÇÑZ“ãé@€àr¦£¨\‚©LŒŠ¼?d…deޱ%8Çìt¡I&B…ú¸Þ£fmÊs©¬‘"ð¾\Õuž9ŸpÝ4 {ßF¿î'¾cv=(l5áó+ ,@Ì>,-¥AT˵ðÇI±ÐÄÈ÷vMsp&ääCÓëAƒ=#ˆzJ{«ÍÙ/‘æèµ™zïW#èwÏÁª°P‚NùáEÖàÀî¹CöUäiÛ— 7&'&2.?Y1’ŠŽiÌ;KöÄfœ¨.âM2djÁ"1X[´ú"SOG¿i NT¿’x-^_ºIªåž…4¿Frm ^¨¯sgUDÍl¥>€ÚÎjÅ¢›ˆï¯i¬E´Óûº½bG’é­ìû¤«¾cñcH-î§µz ŸÏJ\}¥äW&޳=«gÒy÷VKŽÆå¡{ª;ã=P=6€©§Ï¾»›¡¥Unhxœ ‰Â|/1|"Ö0H<ûî,li3®÷NYœ !¸dJœ•Edš\p3T’˜œþšºgD4O’=*J„Iüy*±ÍaZo;á Yt‡Wô¬¹¡¹TÔÝHIšÀ}w›æÔðÔö€ œÝ¥­¤¤¿;co ±_Ï7÷îºd<#*i;‰¦± 0Ë̘=X³@r’æ4!5OHÚ­…šw‹ÆJ°€XdÅäÛ=ï?æKC±>KZfE“dÉËÉÒD¢#*=ÝÐ"*¾:{A¤ÓŽëÒ,½MV”ë±^ÍDðÚ8n‚Χ—;£³d¹•SØðÁ+$ÖâÀ»Ö@ |l6|'uL…|†·+zKD×¾j5£ü±©˜Ø8tTdË :3z3(‡Ò!fRÔdîmtž •$×E@>Õ²xy[<…׿¢}¡±ý(½á<õÑ8ÓSg³ {BÔ7Dmu4´Õû´@©²òÝ“’IÜ.§À¨ =‚5Ë€/ýïRƒÁíqÚ³âû:‚U„Ç ¦mP JÞÔ±Y¤!Å…“¤Ô:“Ú©!åÀcôà4ï?|éÃU!‰’ž ›šÃpd«T™.‘_kvÀû«w½T ¾ôã öSÀ%é›1æ^é{f¯8Ù+Owêk®hÍïpODÙÀiÊ›f`.$çðõ†:”%¹aŰãÏo ÑûYåÉÙp9Ç ÇîŽ3¨&¨k­‹Éžð3*­xó\çG%ÐÁÔr—À Á°Sîžóß ¹ ɰMfþ’έ6K§pêŸË¬ýPÄ&&'xök9â“þi*W\àÖ}[ÖËå[ŠvR`YX…@ÒȼhÔ¶ hM8¥7‚X>Kf ~²¾k”lænžzbj¨YäžØk‡®Y+ëRƒŸzžbðc%qrÿ·ýËÊOžpßàVëRRŠ>xT/1õw…R}@‡ƒ;I»F§»© ?îÞÈAsnÚHUã# ‘°¶ býÄ©véçZÂü” å$›ÿFî]ø¨Â¹0ÄÛ@”ú}ýÀÜ®H-騼+v$ŒÿÖ¢•nPH37zHî‰t¹&M~’d$΂,`Šm…%_|ààX9ìí¢Q‹—F§»MÔ”åLõõ6:w€¾m\4×Pû #_æ2’wñV”øe—‡ŸKZ^T”:~-PØ¢ŸX6±[ÿ½dr+®Dzíÿ,ÄøF¶;÷3S`?i¶,Üh@¢(ý½Ì<Ê$ˆÆ\³Ý.º(VJÊÈEþ÷‡ÿ|q«½+%;L÷GqF… ;žA³<=ÝKMS¯×§J3¥ù $ÍiæóÍß1 ’΂–'Ì6v”³¬-írg¼Ò~Cž—I.=àÐÝLÍÛ©`ÈE¬çƒpÕ9ôÄû•aþ'· Î8žsX±7ÌŽ“r˜mëõÕDÄ€^$M¥«’üœ3e‡û5ÂÈý^Ë$lÛ«ë¢ÔjQÏí?'ÿô)QÜéþ¹ûo]E,L±qô¿Œ)CY é¿¨ƒ±÷²eœgßnÀ¦ë)Z¾–6÷ž8u¾aŸø8hŒöDj˜„¾ÙÃEžØ¯†êÃ#ôŸëªàhÍýÚ„üh—A‹fnêËÆ(3w}y®×K"KôáÔƒ$3=Њß_dW7?ÆÀÓ]>á¤Ð¿!6µúdñ±FUÅüÑH˜8¶"ÆÁåðïí?ÇÖøó¥â¢¾#t¡ÿ+Y³·†Æ¢Š$ÞÔ^ÒÁ¨šSŠà+‡4‹°€Äáó{ÁmhæñöKyTÕ­š@i8O¥3ßnø€Û¬2Á°œ^JK•ÿE úËš}TÃhã€oÆ?ÙáÈÈKVzgHÅ›)û"#h¨E7Þìvê†mÚ{û'ùFE?q¹Í'—8-bZ'åÐéd]INQÃÃJ ‘ xߣ8 ©e¾Á“=ªz,™Ï™²©ÕUÉ›J%yðá1õÜy[”‰Û2·ZÁ / 0@€½WP‚üfðΓ߹‡ê»ÃÐW­a|ûÜ)x¬W MPÐ*P åòQõ þuî¨x'.|‹Ò5+§ëJŒ…™|G*½’¡°ÁB˜Œß]Zñ^?»wâ3‚¢˜Ʀ“½Àbl󓘦ÇFA4ù"0;½tó"Õ ±4:¿s•¼‚JNÃíwqçW|;´ÄOAâûu¼QIF¢ß°£¶0 ŠíÇ«œ‘à¦Â˜ò’;˜ß< 7!ì¹ùsf.‰ØÎúIîÖ~¸¿s À,¨E:Nu5{êT ìËGkAuTB• P¥ôNÿâÖkªÖ¡¦ÂçÖ¹¥GƒWù3¼æ°7ÿ üfm­_vÕ§f¹2gøÙÎðC •­]Œå0‚i1õºÍ-6ê1ÈŸ3ás‹±®¬³úp¶ÝÍþ–[\fÐçc5ÞTq¡gh ˜èUb[¡W¤»>æC:öÁP|›C/tå_¼&<Àæ¸Ç‚Þä¤=(g?µVrO¤vÕj¼å¬{éȉԩóÑ%$¯y–®þU!Ò\yÒãù9e¦umÇš+É–E†Ï”чõh$Þ°œ1øøñ ƒbÌ]ñ«mÊe‹¹â]°—fMÜ6½y ‹%€Ìâ\¼ÖS_¨)£ò3)ŠXs6h—&Ï_¬Ö®wê®¶¤VB—×€Tv€ º“„wAÍ|-ö·•L¹P«\”ï^—¯{a2eȈõˆgî †@ªÔ ^0‹" KœXdóΰZ¡7†a$ðï}WÈ3£à7ôíÑÒhÝM_aR¤#gµhįžËù”?ôY$_öé,Ÿm°™e¨ßÇ ‡ö›µ»ó!øá¾Kn\¿:€éCî^aÛ5(ò¹pÏ [UD æ—\sªj‡/Öü càeä>ù×m=œoN2™6rêh‹àKßdbf•$k4|¹ÕàUP”½ÿÈ~„¨­O R¸ËÔtž‰kd¨¬ƒ½gYmeò‰ò•!:bì’I4&†Õ$«— ìŒdê«®Òm×ö# U ïáÃ÷§íG íÐÀ¼Ý{R¦«ˆOâÅ¥€6,!Ášü1iž^3NúW¼FØ'IYÙ½gè&² Êè8y#Ló)P·»ÆøjÝ$ާn–‚iòÿ nâ¡Î÷ƒj‚šÝüðß³†hD‡RjiiXm– !@Ú}n³¯J÷ÚÎ3+|ôþ7¨ü €šB£'Ǭ,u¼@g{›üY¿&%ÎûŸj1%5TN惋p='_LÝ„J7x¨©‡äµûÚé@r†cÆÍ4¿AGV)_4Ö¬R¾~Œ„Y'Q}Á›瘃ìUüÕü™˜ÍÚò¸¹•ÎÝÕ`–7Ûê®.Žb‚þÊ–lH2Ñð`øMFgÝÇìý©=îUr%­í\  W±“È6N•ÔÜB\¦“êm¨­®ú#7áݹ‹)‹“š¥‹'®ÂGÿéýGK!–µ8aB)òÓU ›ÒÕD@X/Ê?±Ï LÈ&QQMªZÒ~ëµ›ãsãdäα×–ïn{‰¤`÷™³×¸cÿÞi·¸ãÇÊÊ…ž‰ÐQrä³­—žñdø0ÅåVô¸¡¾/óòÄù¼´u<¢  Ðr©”oΗ(lPm–V«{㤠¼¢DaÐTy»Ñâ5JÈ­b\xQJ¦$õô´îÌÂaÈà‰}³©‚@S G+qÊþÈŸè;³ý¡ýt/K W)e[ùÒc–mñÍ'm7c;HyÊnK&ŒC*(žè‘Šö§ ιz<áA9VüXl 0¾ ÿlæÂw.2©ù¹´‚êÃë~ér]j¡Ì…çâ<A¬ ó¡º>ùMä”d,„68~oƒiv2âsG/"BÅ5þ´²f²#fÏA2¼ånë|p%1RNhÿ{°`W)´„‡Ó6ºÞ‹Â3”N§)Ù%>ÿid‰ž9Ý=áZe¥4‹|«ö °2$ÞŽíbR3¢„£«¹•#d>œWòS1öF’+´3üŽ®©ÑÀÉÅ_5Àb|¬ŒXMéåáMC »¯†fef2&ÐÁ‹Û©NX{\3 ¤±µ–®Šò™-Ž´þÞ÷MúH›ÃÃî*ã6¤®%7;æJÕØW§Ä¿¢ ïÖµmÆ)¥' 7©õü¢ Ô]· e¤U(b§žÿÜoa­¿5†‹¶ß w¿ïØ=âµ¾™‰ÌÖmˆˆaE`#œZæç)¾/ÿG -C[`ÄÌ Ý‹·zV°_p>€#ûÝÅWë’¿BD#d|6á"N-ÑÀz…O¹—å*ùæ¤s¬ç‘}‚“þæá‚R®ß©&x¸KL/½)ZdY¾ôt0NuÙ…P‚yµ pߌrމ&¬cæ$dˆúnwuªR¨¸UR*/Ú°$>é¯]+#kÑõrÁ0 "Iáå³RõOe{’0¬%Øá”þ®sÄP µy™8†?œ²vñçM'8#½V©c5EfÏc!Ჩ82Ömÿ»èu#ûÓŸ}ùv?cI’b"A"-&SÊjŽÏ§¡®iE(Ú£}Z§@Àr ´2À­Œ°œdfòØ;€ˆK|R°ç w–‹Ë„<‘ ºéôl‹©æØ'¡€ C×Ë‚UDÍÏ#ìO@A‚ÐÎÌßZwß‹0¬©!vtþæ^ÖE:ÓÖ9è ò?[”ßB¼OÓÏù‰$×rß ¢°{hk8;¢ Uóú€ú3ã2 ÖÌòµ@O~r#µvZõ—ç±?Ówló¢õ{NØ!b.¥~Ø¥"”ž­.£ºS?ýJ‘2uNÃ/šoõ›¥RŠH| ÓKX«?ùÁyÿœÄlfÚ$©l v(/GS¯ w éZTÂ[¿ø~Ë/™l‡úÊŽb^¢tÂû‹‘¤Åzç¦m¦49f{Š»Á?›Ûæ6|ê3D‹F¥Ì(£ U<³GƒqÉÙÿxSlÁ$ûQ¤ 5á xܵŵiµ£Rﶨ&ጉϸnt¯Z-ÿ¥lö{¦¯qx  ŒUÜ_>¾ø«ÅÄÈÑÐjÊ=·×ENX;¸®:¯ØÇј¤c¢© 7øž®G4— l¦QûMÀУl²t G¿][MÝí’{vÙÓG§0ÚœÀõãQ pœ˜3$ xˆfêµÏ;»bcO–”ƒbtœhƒœK’2'¦×då}ìæq¬½- ¤^ÇÐ*¸üý/¸µúPÃOHó©.ï>?¸:"0æÌ…u³ ÔÓ)¤E}WüÊ[GmÚD“ajœ±Ò”ÆVF MšÙ|Bê©™šÕæã4MŠ;ä8}¢Ôæ±ÎU8ÉøÊ®póD­Hº"'J\ΊGH[ËÄM:$Ãl[Y³æÚ…]7dü–¼d@+Ùц=u”N`w3õÒJ|횣†z§å$`Šb*†µ¦Ó±pàMÚîIä·äZ"6ŸkÔAùeâ‚:ÔÎæg,.<ð3ø«)KÔPI÷¿¿küñj zzh>±`§Á†üÜ*±zuëv1üSÃðt%}ûƒ'+ëM_Úù›„UwDÛ´£œ€þ1R²¥«ÜJK{¨F]±ÞüênÈE¯‡Êÿ![¢õL÷ïãœwc(a.[""„ gƳ»4åEªSebXÖ×4`E±áµ!³«B–ßC JÒðYt¬‹dƒ  ¶øéä ?rnr®Eˆ\Fš|=ía ÀIUI¯TØ«*>ÀXÝÔ$°Ós±^áVÄgËÔLE?¡RÝ·ØQ›%íOç¬ÃjÀ±TéÙæEcæY­ œž¸Å„‚³½¨»¡RE é Uåhž¯[‡wpOc|ÊÑí#GñHóIY©ELø‘n¿³ÙiŸÞ÷uóãa öÝTŠ5äâ‹kÖ(:+¤J®ê%K}¹ì»-¥á(’ÿAnI¢ØñÕ8{gÈÑ Úš¿±o·:T:ì¹ê#x‡Í>Ú¿?¬K^Ã>½ÑK¥'†¶U‡ò{bðz/Pö|&½Bågw]Ò jDÍÝ£%¯äBD€k’WÉf|ÀÀò;ÖWEŒ¥Ûž%ôçÿøOHáòÍú2ÈOæ6’õ;aøü#ø >á§¼;iÊ/na”Vä Æ&9ÛyêÝØ$qœIþL“j–ÀÄeÀIá n«F¯ áëõÒ­‹>)¹$<—àû¢ŠHU-†;ÚJß$ö)k/-œèÄ‹¥–Ã`Ç"ÕŒn]}BÙ‘#d_»uYp„ƒPëdhG„0@^xTȼƒµù³¿^ºø‹¾’Å`ˆüÍÔnÙ™»f÷&È>u{X!ïCÝÖH"T{f¼ÅÔ²;Ÿº_ÕÑÌ î‘.M™ê—œZ²¶Ã4›?Öt1Ð]¶&›<µ+Q*h¢wpsñÆ_·'raµªí{7Œzûð/$*Å|~±ŽÁF¿ !Xf0cü æš8fŽç\Æg\$²e;CÃO3À¯Íçj0­çOþgcÜDù0œêÇB…Æ[mc²PàVéCN……ãs؃ éä²op*öªÃ‡oO ÄÐ×çY`o*‡ƒøD®o&ˆøÿ5¥ömØíñ^=êøÿÒ×l¨AàÓ Âš’zj‰?³%zI¯æó$2Flqú‰®4·a4ŒNƤKÇ_~¤øúÊÞ[í³Hò4}§n¢ÑS…—,é§kM ·n¼ïÛ¸-«ÎؼRë¡èÃy&ñŽO ¤†ìµœÝ÷ ó ]DWÄE]'D¡ªR–ûd3µ*2¤œ¼!³£}%+>WÌÊW$`ãßINóǺ¢sç,¶ƒób­-A ‹C‚Y] hî'©#B €Uî@uxGE{à°0é%CÕÿ”fÍS%jŒú=¡¶”:¿™®pv·3é¯rBKí“wÀ/ɬ°ï!NTŸÊõ/Å#oqŽñs›f®¼þÞœxÝ/c'°ãýêÒBw_U7˜ì1:üWßT[8Á¤è7 OÇ>NiÀÏwo Õ:¶²ÊCòeܽùôQqÿ‹¯P"¬7«„jÃ(ýý¶&ùR(ì“1ÿ{ñä#|[4æNìiÔœ¤ßbS4(„‘E~ÿ"PkVK¼Ê«%N±®„²0À0¤à÷ ÈÖBµa»ú [ÂŽîèlî/~N`îGOÒ6CáÐ7U/»å|Ð&8´>‘éŸÁK­²åÈ¡ðÒs‹£ap÷2y¢e—5cã­ºÅæ&öçä^g›®È¹C¹C­ÎDGB­ý-ê‚Z'g0°¨-‚e¿WG×›õgQ¤scÛ ý&³:½Íøâ®¼h’ ÛBáº[kÁK ˆò²ÓÜ/—zÞG1#VÒk¡(!‰lƒÏiÅ“ZÀ¤¥c${ørÒbRF¿îþÁž¦|B•cÛÙs“ùq^§ºžÊ0µàL/¿o“IÔüƒu?`Ä[¹®Ï‹æOã›ñnÝ3^Tøåà˜‡ Ò -®ëçç 6û±ÏáÙ£0ïF|ýÈÖR½L¥IYGžI#i4ß2jŠ´Ïùþ¹˜_ñ§tÌk–á𓞘­\@‘¢qÛL¦æLÉc=²76Z¬õ5°Û)Y>`zÓA{ÌøTÿÊàÂÆwÔHÇ ²_dÆ‚/½mZÜeì¢ç;Ö ¦_‚.{Ò¾¶7ûœv‚7ÄÁòÀ¡P†^øoªäŽ,‘Å 2á=Õ%ãvc <çúˆiKä¶§–>Ñ^å!f‹ÍΪX‰fžx)ݵ´º«xVã@zÇÛèŸL€H›Ù¯UÐ`Œ¡¶ý° éI¹ÛŸîŽØK>Kp&†3B÷’=t1ðʹHÈ,Ò»›0£4GFŒW¥H÷L¾-«Ã(«ЀZ6ã-E7z›§­«åÿÐ9–Uk+eƒŸ“5”•`5è2”3€‚¥-ɾò\àjõu7ÄÂ. ·`6™B®Õå9­+‘dÎ÷#©AócÆuv´ŒÏF¦¡ Êw1ÖÕþèÐruGÈ…©r§4¢lùqÌ"Šø$öšËÄH=®wy #3]êÜl"ó”á]5û …]‡Ýö§ëèž:‰-o]&÷Ôø q³|!⊛ÌuƒFˤ½öä1Þµ ºü¥F}»ê}_*ÆÄ°ÍÚau“mòI¤ ùBd•ý@è‚=/NÈ+ÉÊ#%)í{oê¤îŒÌÿ[~æ '—ƒ~Øþ\e»´@ðÉÜÛ#ØKàΗA‚OMˆ”`K7¸‰v¯á?BfÓ¹Ÿ-Ѩê%mÃÂyq]zÇžkíMäË倳Ú!ñ])X Ùž¤å¥*ו7ÊÓ|ÊLDhÀÀìЋ!Ø1Éh®âñ–Åq©­tGaó}( ®/O_­âÎ$„q`OѾHÁ"Ðì˜ìœ8á«™p ÝT.†;9vSœ8L2$½xãî¶›ŽYÚˆ>L;0ÂI/öó‡:rÐçÁž§jíDì¾lÂí î%ƒ±o•ÐV|_lÌm3­rÆ}Á€£mÆ›ñ[r—)Û3¦i‰ -^Ú†awn€•è‰ õ`è\2#SÍ*ý ø+¯´”¡MZ‘V©Óù|Žy̪(iÿIÀíÝðäÍ©|αíÞ^púз“M!v1(³†L»‹™½Rùd¹ê|Ç´VB«Üeu^Ö\,ºŒ4Ͱ^ßlˆ2׋›ï¯„Q4Ôpõàćî¸ý¹µ¡Ö|*T ÙÂÌ@æ¼øÖùï’;Qs ‘.ýíR‡RºäBÄQrúëì2IÝæ_)EäëùCÕ?QmÇ[¿œM¤€7\ÿ'¢T¾¢xœâ¯¨;p¶èéíL^2SGk{=\ý„ óߤÉ7N‰¿e$.°VæwF?b2ÿ5߬šñË—ìýðªŸÜj8%òØwÉß3}–¢Y^Ó5S¼ƒÃ "ÌS¦+¸p,Ô>òÓ¬v=„·ì.!çð$+¨§ûÛÊÏÏð›RÐFO½J€¦]˜ñ‹•eNoTOk·£o’-®’p§ô Äúdy®ãN ƒb%ÎC¨ $üà+ÿÖ«+ÐB ²W×DK³Òª†ðT--¡ŽôDè~ÅLv)?ÎöÔ7ˆ(l<ŽA8PóãADW›6IÓì:¡ÜŠtENKT«#` ER§öqx#5öm½Ì*¡75¹f®#88ÈÃÒ=‚ý…[’N\QÚxXš?> rñ–Ô0^; ý†(¥³3Þº<áSx´“6Ìö$ ‡°Ë gE±ƒcºeKôPýÀ¨…Ë4OQ'ЈùÑ.íΡֳ¸Ã—˜S¾"ø§®V¼é’ŠQ›ìµa­ºxáælå¶PV6uoº0d°×¼—êgÑ©["(ë4é¡$l~ˆL‹i´-ÁÍ´„‘7ZBL1Âz”ðe>ѵÍY°¸¤äfyµxòÜìõõëd‚¹ð_Yj­tŒäø÷?ý,8”"?Ðþ$IêÝ ÓM†øX $eAêw òBñîdyÆa,;&¶Œ+ÊУÕà„Eñù!aNä›W,ãO߆|ºl°X¨eáÖU¢BªvûÑeWd}<¯¯”Ä%ït‡½EÜ–¹.U˜sôàÕËí‡RÆÖ¾–9¢Y49y†õ+nõ†Áü(Cò%.O¹Œ Í3MÙ¸šaq2žÈóÚèYSiŒì™¡Ì‹ ¹²&OÓQ\H~ àn C¦ÃÝ^ñqÌõõºØÅwë~ú쑟*[ZŽ_ö¶‘OÎM[„žŒ¹®'h %Š„çnA-¨?¢…å@È5¾“YuP³¸ bsbÅ@”Že ®¼Ü˜Œ¦œ»QZÕ"wPKâoU‡0BÇ»JÄÞLÝÈP#ÂŽe úAüî QþÕ‡™’Ìêß7+ëîž<Ž:FI6 š8~a§¿†°FV„$j¸A«™V^õ!s§ëò—‚RßQj{”w/êەΨ_u9 X‹­¦þÊ=5âÇZ#%ÏzL5ÛpGuÓð^”Þ˜ ƶŠ_»¾‚›bèëQy­÷F²Ã÷ÀåÜB,–S¤¾Z2;$¬·Ú£[U ëÚ>µê\üÿôW™½v8gÅÝ^¼>avDÖm@Û;ä ¢ø¨•%Æ®©´¡!£Ì. Õ?'U¢ ès •$‚IùAÝ0…ØùÄÚ€Ga ü|l\/èÞ™óáqiO‘‘Ò¼Eݵ¤ÿVc;[°@þ~Ì©›éøbÙŠO(⤖ò4ì¥|¬_ðDØÅTIð¢É`,ó7Ê>—Â&°…oêZçNÚÍ |½*8ŸF=ú Eñà™ÇÓÍÝÒ¢Îè©¶6ôG4?jM«ƒæÏQ©Ø‡‚ÔÓ¤ çHr ê§|ßEøÂËFÒÓ'Ðy“´’B-‚³f`¡AÇœax}qg÷Ȳyù%}wÁ¾u ‡‚{ÁÚ¯x››p"™ˆ'Š~Ϧ®Bb¼ Û~ˆš;dãa‹£—¼–*ß{ñR¾ƒóID·°9wUD?µ¶ßÛâ~~Jª·›c^¹Qþ¤á\ÃW gLŽ$ìam]À^5óã–ÖÂêu‚i¯á¸Qδö&ƒdÁåè–"1§u`&`6ó©ÿØæO• û‰$mt ì™»&…iÌgV:"ÝÞòæ¬ Ï¡¸{mšu¦ÞY22¿ÍíQUŸ6ôãBŽÖ%àh 9!Ìóc¼@Z{Š˜-h%FêY,yÍð—W‰DrgfQÓÊN°3ÒE~¶$)jk‘!úèû9bmÜ ¤xÝÎk3½ˆm#[~úô±á¹.µ9â ¯^NÇŠøÕQ×!ϴ댵·ÌD²Ãf¸óåZóúÔñ¶Œb‡/Z.Åî3JÑü <•cçœ}ãß§Þ—‘ŽÂÔ$ e¡Éðè>B¢Ç6Š´éÁµÓö’ÂF|l™L_ lgŸ³ŸØlId^†(ß„m]k™Voj{HÚwÙ#¤†æ¦…çØjÚ¼Ýë–¸GÃþ¤Â ìðE¯7œÉîÌP§ývë=¨ Þ±&¶%MœÚ^.2‰fÞôN:ܦYFÑÓèÔ‘ŒÍ`·'¨ÚÉ :OëqrcÏ*6»S&t•¿ÐUÈâ=}å£4NÖdáš´‰6«²ð²¾·1y_½l‰Š\ÆÚŠDð'¡-Õ,|&ßA˜ ic Š*}ŸÎi!ÄUfܸ¢H¹? ‚„Ÿ5©¼÷ÈÙS •upÞÆ¯Úø™½#޼mI\¨(N˃¸?Ëð‚©i«h]N1çD¡Ã}‹¿Y Z G¹»fýTJ‘¤ƒ­IÑg[‹Œ¡`é 2ô‹RœDmÍëÝ:²…‡\Þì'ràvŽú°ô¥È¹¼$‘߯8‹À0ºSö°uÜ›1cÀP;TŽ/7à énGd_y»g‡Ôcà·C¸N 26Ä$K༥\δ'¶Îøï'z>y3NͶ0—¹#Ë­fÂi¾ñö룙˜ÚHå¦QZg¸­‘dv—%”4¶•" ~töÐOýhäÛ.Ñ~©µ§ÝgeÇO'!gn_Ib^oj‘ÖÏW8]—éøº^‚'˜˜É²¡jƒ…^¡¬½PȰñò~)Ë)ðïð“ªj­Üqý±©›Wh4Š$ ò=3Ý%€ßAì9#©”ÀKY €Ù§$ÇS¨.þ™Ï=¤ä™5”Y1Âey¾r)cëÖ! PG*2G<ä9˜ØþívÙ>€BE¡.Þ>—X¾õ#O~î S•¼ù”¿¸(þp¢8]Ë Út`üNuªxÆ#õç講“`‚¸+BmøG}‹éVÛ0ºÒ¥¼?+UïÜC¡zÝ9æÔjzŠKE‘ùH¤®ÝŠò¼`Í݉»XÁRå8òñjœy[]ºí‹'>‰’Á]WÒÎé–¯X ƒÒ»‡a÷R0üaPúÉzI¤*ŒÅ70GÈ2.^Fˆí&”ËHbÓi£Ø±ÃLÃÿþŸùÇ”)ÞÌŒ¾‹D;%óB–üÛkú9Z:{G$·Æ$¹ C)?º×XÌ„a°µÓÕisœŒFÄ;)–FTwýÁð-—°Œ± ÝÄ4!1D†”öI+;µ¦žá3g\ì ÃÁ–ígKí×B˜G]à”Í€[¢¼ QÀçü£ò´ÅŸáC†=º|CPú8Ê…;ñvûÝ<ÌóQÇσ~÷:ŸÆM’ºçñdCqçC8&òÓÇ6Í`…$Úáœ9v»ót¿zØÃR B`ñÒ¸ªr%׌Q;\Ûow›ðÃ%—­ÈmAý|”¤‹îÈñÚt‡‡¢©nžªÙQþ*°7é?ç€Ù ì1˜P–¥Ê±œ/"<{¯ôšV¾ÛX^/¸­2šéÔ­B5`ªÌ|Hžó:AïÀ4¼7Κ"ü@˜Šö»Ý{—Ѽ«¿lŸ­Ý¾‹PèÆê͸¿f¿¦¦üã%ûÉá§úŸIªÞë*Å–£Œ2Âñ•¨0ÎßÈ«4;_5•LW{¡F“°| µñú[êI+#G d1í÷îcè&÷XŸJ"hçÀ'¦œCÄ`ñaÆvXG™eà£SõýýëèÓÿ±}½B†úÛ—mÃiM Q\ÐzÈ4ÖE£GC4æÏûͦýK°+V›çÎD~êê²fm’ ¦ö„¯ÉG6z>e¯;¡ðÀ»mLåï¸+©U+b‡îôáFÇw]Ã1¹Ð04‘XM,Ÿ/ò'D hŽ€ñµ¤Ð#¬Jwƒ+A–E@+—½‰fxÑuB8¤Ÿ’4Ö¾9- ûøóýÁŽraLG tòÄ ‡©âN–Õ<Æ sVÏ´f76P¯9àa1¾ò6ÈÇò¯!x·ÜFaWý€ñýƒXd>ÐRáf<ÎmÔ²¹7Ÿ@œïº †3ˆ`ÏÎ`XR Å_3^Å9Qgxtí<-/³RXdÚW6àÉ©À¿#rÆÙq‡VŠãü^Ðl8¨ÜHzïÉ^èa$Ô>_ °¡~þtÃc¡ˆ9û)îQÛÈHø†öHr"¦ŽsxSÜëòÓ?@#¶Ð-µ¯*N’æÊúV…ëº m0C¸€åš”@¨¹‡7½\ â)’K'®sÌóöópÌ\L‰SèµÀ”Ðy]ÅŸ–SJ›ÈïÈ`í]>øW£róv¾¡×`ßû‡¬j‚—Ï¥ŸƒNô´2¼öM‰¹Í|]©4½„0 / VðŒ¹û‚Ÿ|ˆŽ‚&ØÛ'¿%|ûÏÝ;Œ}{—5þojS„µðx;hã‰+ó‚Ь“,3]¨HÒ)ª¤dÄ÷ïßîÕF^óJÐNø#]“&:¥~¹˜5­ªÃ¨Z†xê±è®ß綉ö.ÉWCÖffˆÃøÈ1+α¯Ù’®œå·¾Î:4_{å¦éÇÉ‹ºœË…ûa‡ \Û \,óE(ã»d¯âIÀžEYODÊõrAãäÑF”%ÚÚ±z(RãµDlE/8\ùr¤c,§À‹3¥I¯œÌZ­îÜQ ±{æ"kĉ0®Äîßm¼¸>äóÆèïÚi2ª;›îÐSijŠŸÃms>r»³›í™ÐÛÖ<#5wì>A­º«¶[Œ“CîÅKè•÷˜|XØš ó]DõIU x²å(Œ´jIåLñOTîì(Q¤ÙzÀuï»{‚ðõA¨‡‰^Œ`ŒA›Ky ;‰[¹yó–Ò“;O>|þ²²ò’‡Y¤`¼z¿‚t¦ô(Y*<™i¬»º†‚n{p6ߨ[ZÏ{ß³ …ê¾v‰l!Àe¼ U£Ž!:Ó?Ø•t·?gU¢Ì«]ÌO›ê®wàÌÅžŒ4e]£Áºk¤áoà˜6^ ´!ËÉòŒì»~O!òVqèp”Å"åt¥Bþöª¨‘O„a<=¿ÆáØ—5?å©§sLúx>„”kŸç-1¤R™RíY€G ÃÌ¿XNF;?ÐÁ3•tojÝ3«û~¬¼NÈ1}@ÄÜ¿-Ñë'+wœ¦v¤g%d¯ó_¼©H jÚáb¶~ùýzD•´/ÈñjJYï~ïZj±…¥5Î0 (‡d× hžTëD±õ,Œš\[õ{´•:†–JLv‹6–žJiÚYYè*«Ïµ¥¼#ª™äĵ”D™S0ÅCŒ}Û ­…¶þµ;=7÷05 â:zòÿ"¾Ÿs²»»/ü=¤ýSÇT¥³e²¥EWº¾í2.—g%¬Ý} Z:bxÁõÈþÓ=÷y Ïž={ä=÷( ¯Tú}­‰¡7gAs©…˜|5DÆIx>w{}lºžAúo ‰w@ýüäõ ¼ÑL")fWÔÇà ›UbuA½jÉ—ˆOå8ß‘c…ÆL ª§¼‡Þ"øw^”öYõz«’(LnùšÔ€î=ÀÁhd³*WÛc\®Í>:‹¨^·ZK,†%ìÄ,wx4P)— Õœ0u¢óñ!Çš©Âš. y9¾¦éwÝ…pœìÉ*,ñ,¸‹›„DˆmÙ½¹ª˜ñ ªµŽн'‰¿æ’ZÅ×åÎû¨?1”¨7FÕÝHð»WÏúüNýç^@S€@þ/™Š ¾2jµA±–nJØüÙAårMz€Žü1VÄö”9á¨ÎFP/,^ÊÐ?æD¶/(ú¢‘‘Æî !®æŒ,1° ·þÄq¶ž Ý‹9bœƒ3ô¨ìâ¿0â*àJAÀ¯\ê.ˆLØh°D”.ˆ³¸§Ò‹š?ž™ð¼*ÀÞ Žfö±@qè“”{›Ë¦HdßùJ+sZÙZ†æ ÖHZñº˜Ðµ÷¸. Ô DÈTxŽ×˜ÆñÝ Ðç>KFÔ°…& ¹:Ó¦/ô¡hõ˜Ö­Œ¢9UyÉü)ÒÜZåÿ—©8j“à¯ÿ™«=w6Ðù³ƒ&oZš÷§iÑÍ×Ï5o6êVY?ì¾U§ ¤\°·ÙºPÔr#8WX½¨ò/ÀŸzA7¯·–Ô0J—9×3ª#‡ 餙Hzq[êµ²?èyúG7i  FïËIfŠÙÆÿZ͸<ÐÐ|,]öÀÇ7 "ØŒ6¢ŠœCxÅ™ ÃÍ6Ï—‚wÃ=̬ŽÖ#ÈïÆÑ ë‡÷»?gá߯<Ý?èá&•½y¯_|ÜríS›Â }@FÛCÄ TûÐû¦²ö$<°40WÊbr»09ôÍŒkUP6`íXê³{ OÎÛO”E‡ƒ~,GNÌÒ.¤x”¬æ2¬­=­Ü}(X´Fªr"Pf裺ý¦!ÞKº!üfÒ YE~í¶Gó # }j%‰ih}ÍI„^ásTî¨Nú³MÉ“²Ùmå –mŽ ukT5ª‡lîÏs¿g«;GKÆr6Ó'§6¤‹*eÔ­Ä» ^–$?Z}â!›„ B²§¼ËQlRìk ?v“×Û$âQ6íMÁ¥\¿,5§¹ä";A u&e4BC6¾E ҅ܬÎ3×,ÃßÃnâÉù•ÇKÅö7õDgw%i:qb{Çÿ}åqò;û4iEþ‡ AKñA#2f3Ƹ‡Ò)_“¤ö±Ëû~ùN˜Æþ>E‰¸KŸ}&²"è;>oäJdaiÎßa6ÏAÇåêøÍlŒ~D],:ŠYù†¯ˆ2ƒ8<ý¨9øÛÿpb]”Ú&ÜÄïà…©îŠ#ž©¶®C,bÙOJba»¼:ýª+sëAB’àN€|—E(ô§¯§Mw­O®Ÿ%<~Çn¢J /©b2ûƒ6e£˜¡UñÝ2é_ ;h4ÅÚ³§,Ú¿¸?0üá¨yeãNáÁtÒ-a°9E?•ÿý‡5Gêy¨ul‹9`½!-ü+ИJèø¯ÏÑ"ù¬Nìéà¦ÜiF^^úÈI;•Øöçíyoÿ¾ý4-^ªIê8t„xÊ/kzŒècrœ—y忞²Œ+U žTt¶é±¨&Äün &Á •ûòMJXÈ(öµœªËÄÛËõ‚N)që~Ч»°æÎìo˜×PþØ o"_7+\Dr"ahÙKKÙݸ»è]®¿Ú7Q˜ð²®/²Ç÷‚Å,ÙŒ®²pÒGŠF§±0ÿý<ÚÕ5føüäí)̤ÿX×aî ”¸+å 'õHc2ý÷í=ª³cÆ]ú­Ä'5ô©`YùN2f[ n|¦ZžŒ†Ú&!dÐ >·Çnµ»±èŠãfá³cÁÞvºW’¦Žu¡Õrdx8)ýz˜Pû¥çaÕG²?“¥) §úxàÏe*"ü³•ÙìM|l!1í<è[vÜ.¯Qò¨¨_|Ùù5Góš¦f Úêþ™Åà‚Œ"”¼ô±êœ*ûn%;›%ü2¬ÄŸ·PUråÞò¤ËJ ¶P4cL'Р3a!ë}š7iRãk‡x†c j õ ±øÐÒÆ J³vÒò^nŽåY݆e‰šg³|wc?™Æ!…ŽÌJíö­SÉ»HÑþÄ–¡,u µÂwi'Ä»62ìÀx;ÖAÔwiø¬ƒUý¯˜†ûIþùoKy7{ß)@ò¬²ÕsZŸvÞxYÄ7ÃáæjW5è—×áÕïñÙCj`Õ–bvÀ%ÆüŠô=-ϯ=5Øéökœ¤®"¾ #¨ƒq¼2}3ì*u«âí+V*¡ÑnA¾tcÖ¥Ó/L‚ x§þrÁ;Jhþ”~ëák\³"ª ËÑšéÀîs€ŸÁÕ°j5wî~Rî ÿ¾Èóõþ—1)>n¾‚;uŸ­ êÎ)ˆ!»t.¨­hÅ›æy‘âÖÓD4¹^_ÿð—Ôp·~è|e(q_N‘ §;N€tVt(okÝ»5‘³•>!ÉÝûeTlÖbp"NrmA1q ¨7ÝPNþ®; ‚KƒÔ`OךË;ó¼(SÚ©_D²ß£¯B #ÅɤÆGW±éÈ:©êƒ×5»ÒVÚ²˜ ö€À<àîúÊ~²ƒ §&—iˆ5yߘT’‚gÔŸ ãj 뉣ªŠAcÉþÿ? •ñÓ-´ö÷»g}¯Ê¹ŒÐèõìÏʰ7Œ—‘öx“ϸy™¥kn=%0ü½Ti.{[Ô-$ÞÃÏ£(Z§°„@»µWʶlM‰4.ˆËé&¦êÖ2Û¨±´ä¿é¢ð]î¾#ñE§ m:‡È[Û‘¢GY¢²0‰ªy™Ó *ÂmcŠ2‡L\ ScmÛ1[árïž;g3 5. êªßV?yzµ¨·ÁX0iéCØÑgÈÈùÁÓüè&~È­&kû#¾©“Ñj¨ ÍUám{F¾$ƒ_íÕœC¹rÅž@uÁçºL±ö~èú´æö–«™æý<ÿKT^û÷Dóú¾AAÏŽ*9÷Ÿ‘ÆÊª-² ÇÁ(«0YQ»Q¥J2†R™ý•Ñ‹`Eƒ ¨‹µö>5ÛŲáùYzK :L$À%èñTÉ(µïðÌ]¡RG*!Š4Jšî¬ä)XWÁôÖÚúïR• ½¥-g3¨zƒ¾ÛŒÏl‘î“Ñ/ÑLO}vp«(Þ±?¥7ŒÚ9ö(ñ½œÀµ¼Öª<|58ÖÛï·ÛážÎ6Kzz>"u-V‡ ¨ƒª§¼³L¾cóAݧÜ' j»ÿdlxÐ||š¯w…Šr3i$Q/¨?‘îÅö{%%ö¹æ£Lèb®ƒ·£âÕ¾ycÓ¼çY8t-ÿ…<í ž&·$ Þ „:ðÀ ©—ö4ëœÜYTI¨¬*˜ Û=6JÆz¤kï²æßÖVq-µ5¹z:ùo›eG«ô<¸¡Ô´{äΫ¶¼e–óƒ‰ÛiþhÈÁô†&K]ØçF¬Ã¿++-q¿á}|Æa<ÔRÏ…í÷Ká¨Q7~ûLŸuŸg<À:?ˆÓ™ÕÂÙ²·Ëw ’]‘òáÔLw÷ÌWØ—×b`$!Ã]¦Ây£‘x\*³ë¬3U¶aؤ€ãNqüZÜûjËîGT­ZFGÏ:<Üžñikz‰•z·c¯‚ŽŸËínS¯vh‘ø|èÁJ2þ‰C§NÆá¾o§›õBÜÐ@»Ïv}ë-TÚa!±î7Eê_ x ™‘þD§Y¾ Mÿ~GĬáÔøù-¢‘xFF­s—ƒ5ò÷Å9;ÍÃG<—c³òwHU ó£ÐµÃíI) ÜÌú.oVjÔœkµqÀ Bâ.ó:ô•\@Cá_àaŒ³®B ±Qcoóª‹[0±Á&©K4Izûø²’Çbqãܯ`³[ӞƫŒ;0ûÃÊ:²ÙoÊD ©ÏÙåèÝ÷{`&á%ÉõÞN‰' Çœmã«ê &àY“ ƒk¨KÕE¯Ôÿž¹ bÏù£ÒPŒóÉ[µò£É„P2*¬„:)Öb)âѼ×[+Ý•.-‚‰Ï[¾–±jÈ0˜L…!ö±éUîÒaÔN*ÛpijÛj_Tœ)'Ä‹Fq,É×éáá™= þJónæsn„D,Cí¢•‰ìÊ’Yk~$±O–²þ¶LY.½”‹óuœüa–î ea+l)ÚÜô—¾,Èé0 Ù=æ —K†ŽZææ&ª¨[@’,º×£ù–t.—Ì`šÆ yöøf<‡ «qÇüH©‰·QvÞ‚~òãßÞAQì t†ˆ˜Yײºô<,7Á®à3ˆ3òòLD¥=fU»\}Z3%¥¾ª·oM?€[kç¸5ÍHžÉ_»¿î·Ý—ú= F迌W‘dó~a*¬(Õ}Õ#¹ñÆœß:F¶,c„}ñ™×åk*aïÈj•x‰¤Š7ÅÅ :'Öò*µY×qùºƒ>ðfJ§5¦¨wŒ+ì¹âuéŸË‘°Ná91¶Oö˜Š”ŸõùÍ¥ž“2b‹èi|'™gu¶˜°BÞF¸*¤h¬\,"´ÝÎOz¼ ãî7> -@UÅ­´ø| \sá6}±äH»Øb J,ý©Ÿ¢Â>,KûºYÅÊOiÔŽ•9R ¤6JCµ†*;äá/-v Ì»›'ÔdQ gM%ªø´‚ Z -dáÆ4)Aâ|wÐiü:›EP`Ûìñ#^>L‘X Jpš²×ŒúqŠÖ'ÈÂqÊ÷G.b#Ù èâ“G£‹¯ŠèMm¹Ñ™™ÂåôÁζ4í]®x$®} ‘ÏÁ=ÞÉÖI’Pqyuæ>dÌ”çŒÖ‹î¿i—¥ñÝ{7iCCs_vª|m˜ôjPÿ'Gº –(ø@Þ»‚c³ßJú(Ó7øR}šùNfZµW†òI ’){é†Cô9¤9Ò11_ˆl¸ÐTO9bäßž0 h}‡^t?Z–’Ôb‚Aze]i G?¬k\þÓGËÓ{ {Î>_“„fÿyk˜KHÙ%Û$}?FìµÙ¼Üœ…Ñ©¦Ï´j,ä9ê¼µ–X‡¦ý- NKUõn ð>í]ý6E?‚«ÔÆm^»_»3:¯#ŒÒ¥)¦IAfRÿÖrÃsU›í]GÌí. t‚VšÃÈŸ?.©™·# MAò‹j|Ì}™Y¦ò¶³ª;ìYúÇz=Þ£ÊHзzâ¨ÔiæB[>´ÝÇÂKçHSPò„pöÚÖÁÛ»_%ÆwC©Õ.DY„qÉs<ŒÐÄ0ÑgU~2iXeŠóÈSwé ¦« KòÞš8_*Mn±•É€–ThN3KÛh#x³Îb6gå¯Ëuj6dÌhŠràÍ?ÊjIÇ׊Sk%m&´‹ÄcHҸfp•Ÿ) Œ€Ô îø0ƒ\þ—t]Ö2æ9×/dêxÏÛŠé.O†Üž– ãµ³Ôÿî‚åk"JKë¼;Ø€Hôíåô’t¡%½`¬7`ìêÈòõÞ¼ˆ817Û¡Í£8‡Sža oåŘӮÞá“Ø-5¯¢&õÒ&nÌÛ¦fƒv*V8A6Q7gvø+6ÀUav¼mm< s—,Ãw‹Ë¦CMÜ‹O¯<ú%|¤œ½cÆjÅ&Šu $š›¶ØŽ;þ¿ï+kÜ2ˆºcÐöÖ `º­Ð„>Ì~ )?¯¾«TÀ›«²2y œ(¼r(Ķ–Ýäû7 (môyr?d2+¨»¶7Öéƒ[lXùÌCáç»+v(x]õ 9 ÀÒÓºÁ­{°Üfkß‚EDïb¸8M$ýH„-¾ËÆç¡‚ÆÜ>–4í¼$°ü¦?äð¨Û”Ç~Q™I±¸D¯:öÏzâE1 &>'ö%UÍ0$Á÷$ØxÌ ˆýƒú^äi: ê”χ'ÀËÑe>ÆiŒ⨪¡í‘1†7û­êÚV@¥!¸5•Bêµ4¨ÌÀ”V%¼Œ¡aârP‚Ð%Phéô:‚í©9v)†é5Ó:è6XC™7¶DµÛöa èù# ’ú™ ̇FÒ[[{ßÔwù½0¬eÐû½Jßß’‰7ÝÃî˜**ÌE:°Î$ÒZ†)‡#*‹Isêq‹Ch*‡Â‹³™ýŒ¬Ù 4¼aÞ€b"ŸTè·%¹:+©”èŸ gYÛGúI“ ÆÓ—DèCãÉ©Øj² u¹ui¾LTrlrx™ÆI´XŽ9PìX2ïçrȲˆÜDûšQ'—Xg—·¨—&HÇ?™ˆ>ÇÕýKz•¦öù’³z¢Må„â¾Ýûb=]›=p}§æ`õ—‡Š<ÊN«ÿ ÷=i±¬ÂÇœœ´M…Ïâ—æ=3Œhj…ú¨m3º›~Ò_i®šb¤=’^›¿8ãH®w—¨WN6ó9†ÿ}"×Z°#¹ÄY”¯m-paŒžã̆¿õ¶‚&Ô§’·ÑÈ=瀧Ž5FØæg@WA*¼tŸoÀ9®yì(òÒÞXôwµI¦}t«;¿Ž¼ õ«Ñ"ÊÄF±|sp´ÙÁ>tµZ 5j79W©©DdŸ¯vÒb:†ƒuŽ §×¨Þ;fR[3(CÕË ¨›5sèyŒ;~m¼{KvëcæmÕ‹+WŠá',È+ÛLçví~^ DO!½±HxV®Év ߤ„·Æ{è¿ÜfΦysÛuƒ…Š›•‡Óå_'$«`à!ƒc-w¡Â]”³Q¾}`ƒ'—(²¸:ÛíWŒqJ•0xë@ NôƉ–¬à—Öx»(IÓÌÅõÑž`R˜8L).Ý·Åq‰•Q rͯ<\غ;íYK‡C,“A-*₪î±Ë œ¯éô;…+˜í͹ÓD¸a<@ÑÇ`Ì;èƒ×¤‚èl¬½UÄUž¡)ê|ín¿<«yo­ÑŒ‡äú• {úç+焹è—uKíÿµ~AíYzüe¦TÉûkîµrÒä™e:”‘Vü Ÿ%†€4~Ê ¶€±'Â;Ë—á’G.vÐ{¾µD\:,äô‚ÉZè‹xôž0‡€¸”xèò‹ÀmxäçÜ•0P QÝÏÃp{CùÝš™£þÎZ¢Pp{VÀ’jS¹8½›£Žj”•ö#ã­rI¸('q÷iï¡÷MåvlI‹ß²DÃ>d~Ë}(»š'èÜcîð µÀ $jL¦¿£”µ†|#[Zêh95¸mI¬¤g…PÔ01 (e>ÙÛ¼ç©1 àHLŠE<Íþ >5’„Qµúä‹ùÝH6NÎ…r3Oþù§` ý¦§‘,W#kùÿ•õc˜Ú#jsa°½r &ª•Ÿ|l׸ Q›Áä!HÞý…Sé“ê9ª™r.¬% ÷¶vÈ"3#ÈWD%'qU:Ðüx!]Ma0ÏpÎ}›ÀcÊ7Cl:3›F!qjÎr³Æ€÷*–"–ÐùõМfÉvà±38‘ë•°™ŽÏhA¿E?”L€‹¥À9TÎV7ʦÊA`tn=ŸRäBJ\ ™ô9c“^Í?Úž¸ð~ßœaŽHâuÛíÞ¬_Xl¿ÅØ:™ÐY«Ð*Rtû §ŽQ±ÊáXó _rz9Ë˳ ðŠ­9ùà/MÂKs5B?Ôá/˜å°¬ÉuêY bîÔ” 6•¾ú*üpxЭÅêÒ§YâWüªÑ¨+êÆ–O6bM_—ê®[N®+ˆå ‚ÌÅõ¨–;þ‘·ð™q­Ýö†34²µ,XSÜ=8B»Îj48ëýdAßsG[;8À«™ &LmƒË4u áÏ•Ìê4¢Öó´–¡B”Kb`>Ö?x €æçÿÎÀõ¦Ð…R Yg[‰€µ¼ÝÓ`=UËñI4øå9ÈG¶|\ŽŠê$»7Ïí(p›Hx¾sVIrÖê¢ÌþÖ-E—-âì_)}ÀªìÂD6•ˆch[Åß㋟ÇÐhuX¸-å×ø‚A¯ÔP}á9A‘X´$ô#¬} =–òåVSxãbET¥£Ék<9#߸ý,Þç†Ò˜°³;±*»`J aèåç™Ý¡a8_OÍ#ì=‹mÙ§ïvëå®E•yóÇ|¢Ë‘§¼£Ïµ…«Ï}S»õcÎZÌ­Dñ-)ŒøK|Gê0lØS1kGAXгL¾©&‰Óè,b*…2% %4ÚÒ{ÙYs‹OF®óã嵪µØß¹SnF-«H“¿ Ïìû!J¦ŠF}f?­2T-¥I?ÛgC3°5DjŠƒš~u‰uf³ƒõ#²:`gž[î|ªõX¥$­ «åZmPôPJ)þà1žó¼VBµEö•¤{’GcÔŽÆP#âq• gV—È7‡Í¢£ã^9É!…e§~rLQ—œ¬«þ3TÝ8eˆU[aNþÕ¾ñ»ÿŸd´Þ&/kySp4„¡J¶ã Ò¤¼ FÕÙºqæºÉñ–Èè+q™aDUöåT9’Ö“E_ᡲ¡ŠÐjmv;Ÿ1p ÿ´¹yœ? °sz)ð/Q`µ3Ï>Aµ«'¿V Çžv'_X)±ÌØPóÌfß9‰MK‚7bRlθVr«·qÈh¼Ó‹ðjŽPpÅeØ+:“¾×–U†8Ûm-ÿ÷¹‹44ORìá+Å2ŒìŒ†y&œ1ú[Xíü»k©g¹%k»Ù3VRÂdõÁ:²Ö¡rTdu5ÏÅ©ÓшÒ]¦l.p’©Ê¬XÔù²¿ßQv8ѹJ»¤v.çÛž0šå­%+f>j\”“çÅ©a²7Éhˆ»ÉÅèùÕ Ó¨o2S”ø¢” `œ-‰§õ¬˜ViÍó‡Ôƒmàþ®ƒÓ{rÜ›Ux¾… ±GZ׺!0MªIæŽÏWfïÏ!ÓC›È^ÕgûWû´©YÙ2Æý‘*BfOäHv"îfÀnNFâmSI¨µ÷ùq©€#7b[ƒ+lªÐJ²2ʺr½’˜`ˆð¼`NàÒ¯Ö,0ì\þÖ¿}(zÅ­y«MgÀ6£ü–ûrKONfR!Ïçÿ$ÆÂ³zs0 Íѳr||)Ë"Šv•2{—©ûÍ :š¨¥3ÍÎKà}ÔñÝyJ > ¹]Äy¼ù³Ëääêï3žâP9k|ëf¥HC š48(Clí„){š·ªjß³`.ü^¶ßïß«í€ Ø`_Z8v¬Ò¢-Wò©Ÿ\B±Ñ6…5-˜B:•ßÑØˆê÷ƒ¥Cì]Ì·)¿ò–3Ó{`^9ýø+J°¡|.óùf>Ø÷ÜïϺ¤£kLèo+ò7½†`2÷¤”¦[µëÞ(˜éðžÔŽú±ân³3¾º­]¡ßbš(åntöÜ0µ¹"âØ,žNÀï]⎞ƒ/ä!µ`HP8ê­,¢|€ÝIi¹7È<¬±CÅ_Î^o((Å×ãZæ/,{÷¿–Š'ÑÌ{a‚ØÜf[ª^eÝ´‡kGkx½µð„Ñ;ôê:_`L)Þ ”žÒ—í˜tÀ{‹§“¯—Â9ÞÚ%zÒ0€óĤ¹·PU»H€ 桬¬¬¥$&¿ñNþ=ø Ç4Tª“&“Q©D,Ü ìQÃi$ ê1}Ü  Â2ñ(÷…,=IMàâ›a”3ö»=Éni;éXsr85ÆÀÄá«Ê6›3²úëe“%z™(¨­?D‹AVyäD#߉Òöȶ¿H`¹aùjÂMÇ}l£Ù¸h—cÏ vļÂ&IB‚SM2œÀ!i¢/ÐuÈ«1½˜—Š·)ËÙ¡™i£”‘¤Ö£)†ÜöîõRJ×Ë ±õbº÷,—]d&hTP¡œòxÁ0JwBñŽQ¥Ù5çHP ÄF½´—;ä…“H™zø{´ÓèX ¹ÃÓ[pf¥ð)áþÉ›ÂõÙz …¢Ô:Y3à±âÇ1‘£zv´ºÛN5~¸»p,ô;¸þ#ž¤uƒfÑØÜȸÀiß©rðœœ2¢Â/ï¡ÓTu,½ü2¢Õa½æCÚplÛ¸àÎ+xªÉÕ&>iÆpR"A¬ÚG,*m(ØÊBË…â,9gL¨Þ:Ûzù3ä©8³/"Z½`-S–*6˜Ð$í÷Š %n¯ºÓþØo®/XÁÔÄ#{KU‡÷öÓ"]¯í±ë@m”²_~à"òÊJ8¹â|çûqaàÊõ¿ž›UûëCŸXë“TPi>}—t­¹ž`—,O›¬Ú §ƒ vf9¹Ê´<çÒ°kAuˆ?j äL(ˆ ¿ýiW{MeZJ]¥pTÑûø<ü±óMYmÌWGY¼£­úœYÎys¯ó‚FF“ ÙÁ9Uê¬qÈùÏ›PË8ð^Ëæõ@¡,Š~ú¼µ¾XîÞp‚D&±"ÿxʼ_EBÓa: í+^|ã+\ÙÀ°]ixËwk$´úY&H-*¼í§ø¼ç‘$Bñ\}A)›Zk1+ RH[ÇÐØ«¥n/ûŽÉBšÁFa‡ÄÁôõ ”k†JàÆ³{¤$‰<¤Ä5o þš}ÛÄé4úÏ«÷ßù=£±…t—g"ä}N×ç¼\Ü‹߉Oî>{f†íÏHÖ*áÇåt˃Oüþl˜[û}T Oò/¢JùÓ£ßô‘A)w?B7Üë£O#Àe¶ž­©®·ü½ù#\Ëzb˜ÂÕÓ7©uX>šÏ 3Nöª+Ó5(3T»´PJŽ‹$_F…r»¤ø‹¿-Û6òþ˪KŒ5ZÀ®ä©ÆÒþç_v°ÌÌ ,ªüç;a>׬h/)Ÿ´î|¿MVÚð© ¼@Ñ„‡ºzjÝÍ>GOBÍÿ™+ ¡ÖÐrRòƒsÅQ>1Î,ÅÛǬtßÿJ…–A.aäè ÅȬ¶ "ÕŒ¬ž´Ð—„Y í;n’/âŒkؘµJhÈ÷Ô(@‰„‘3çø¬@0+2âv’›$¨.8ÖG†ÙS,»…ûVްǤ×dbe³7͉2|U܆€x„ãÖ×2OýŠòƒNgƒõ|á/úíÈÞÏÇ!¶‰=+cuJÔ‹ ²¨C*¬œ'ø–-ØtOÅÞDÓÎÉ1véü¹;yÏ+ã»ÜâÏÌá1„(3-FX³"tǤ]”„yj¯¹q”Q&>ÔÓÄÄ·ÒuH„lg°.õ ôOÂ8$-Ïÿ!­¬„ŠA¥<+ZÔãLQÝï¼;ƒ-B9åï_*4Ïõä°Ï\â‚ yÞ|€Äþð7Ñ^•„X3­(+Íz'™ÔR7·B•Ê)üi8xú°ËsÛD-ˆðXxTrÕioc=ð­µW%å,û$脽bNœ h¸Ú:aH5¸þá ãƒ×0ÖÉc[ÄŠã¿JÖ Ê´}JZ˜­Ö—ÃÈ.í±¸ TÜîìš$þ;¿º÷Ds¶èw¦õMEp•Ö*…Ûþ&¾÷ú>º„ËÝfŸm9mÌ®`µz¼Å<¾9¼@Ëñ¦êYµÁìòéâ¹öÈÚùPt‰òMO»'’ÃÓN/ˆœiKvé-úbÒ¤06½+†5§Saª‚ oó~IM¤n&Ã4 ¾ú'S:ç¥PÓN¶0¨mVýzÛe±4¨¯Lkòh{ÐP¤|Tì1µ ôÛ¼  ãOY³—Eo›¾%0†† æ÷3—­„´Ût}Ý!M¤à0œœÎ2°õÉ}Ø llZ+]‰Bƒ°l¯A\ëiÔ$xRFàNªCdë‹á¶[wž‚C¯b¾Ð”àWí9"ª%S£‰&!ÀÓ\>„– þcv¹`®ICž_÷»Žb!>i=ÿ8¸ªÊ øTæõ< ·?5½5²)$Óƒ˜þyœý×áš?¦Wá^ê­Ryï¡AW‡ròm à9ÌÍñ?€ˆ ˜öä ãû㦊ÿ@3•¼Ÿ¸Ã•MùŽ ŠõdçΆÊXp’Eê9»U8ý n†ltÞ…½rZRÿºîn$÷uú [–j¾bÑ æ †„6©}üÕ*í÷ì² æ;–‘sE!ê©6n¿úyeÍqŽeüvïP¸•Vš7wyW¯¢JŒ»¤ý$¤¡Iþo ^Lcb ÆýŠŠh˜¯3×?Ó¸T©Àih©Ø7uΉƒ1ýwç}Mª«é¾úHU?øtIýIз qFš”š=sßO´CÐÔ°+7, ¦«TícvöPz¼’µƒ‘»â¢‡ô~Ê$᢬bi…¡0È»òk=Ò[ƒ‡\, Dyî{w›Gû» „HÂøQ¬ø,—ù°mz“¹^Û³ˆ<˜q‰)7ÎM¯÷½@ˆ¿-›¹-Ù³ä3ù IW²{5À‘Îî‚Ô 6QB.,Sƒ7þЦ@LÍÈ|Ä—¼ª“iÈk,eI„d“/A™TIÞKoN0Ô“ ‘“ÑA +ît~.yÖpD>˜å¢pˆk[n~d°sé2ç¬k80ÛR¬ÐÞ´˜áâàsͪÁ #¾áÙŽÒ?y+5ðÝoµè_F§Þ½sÉ÷ÊIýÿÎåøÎ¡’ ì¨jx Ík2·¦\ª©súå]V¯ÔTgt¦B%"ïY8jkgÈ,ƒ¦p¼t¥ÆéŽÉÉñ·¸}½Î½Úmtñ@ŒMÄÞÚ€)åJk"ZH:³7á ¢†uŸéßëáé¢n>xZ‹« 8( ¾ƒsºI½á D‹©µvî*YÐþcs(ê;i¸ïþÎ %‘ܽ7M󪡛\GðŒ¼ëQZÉë3;)À#6CØ[Ø8ÔÂ%‡’ÏHîøWÔŽžGc.käÌÌWö±®Û 9-xì3‰–‘ãcÐm°ƒ ß8"yÅL˜djÍ1î¿S·èçi÷ý*ù‚%l ƒË ªoKWjtuhÊòÙýt’ù-œ {æëºR '"c‘ÜöÌþ<惪N­Är~h×XeVO”bj†‰-òò$ À°žÿL´¼ýe½Oà”|]—d¸Ê<“§À*u%¤¹¤ˆvm7øeê—¾ËßãÛ¿EíØtjƃÓc߇ú­áŒWJ3ÆÑ}?°lh‹#¬6™ð&öhU}‰ñ(<–„ËWÂHw¬’ü+à,×¼wbx ƒò—1¶uÝ<€MªÉ':›y#ô¸˜Ü÷3¹9 ¢ÈCâ¨v-¿Fòi"7,¢J8’ °¦äªB+»£dÖ ‚|•éØåtVþZ߆‹w!'“‡àñ½oC*rF}r|¬ÇGv!Dÿ駉4'œ9’ÊVÏ=Ƨs~µ©²PzÅ;&y>Âé$×ï0L‰ËÂ-äÿMŽÂM545`±­Þá—îcyœ.0©¼ Èç Jl’·E”œÓ‚\gûE~q+•$3 Í0{ý͇M6VóóÕoðà}N\HÉ%K¨î¶™;¯±éÌuDAâ9( îåÂú' $æJجcÝ«œV‘é%¨Ý9ñ%+U÷O;jÁõ§Åð…EçbÁJé2¬à1‰•&¾A¦)H°Ü÷bÚ%õ‹ÉÞ/#û@¡v3ÊüŠÝÜ(ÈŠ°ßŒó ¹e„ÕÅŠôÛkâ!&ç¿ÇîK‹×?vúïf{•>gX6m¥šÀçÙ: ÂÍFfGÊrn¹qœ0 >!†?Ö¶L÷O`·”››ŽÉv ƒg-F Sç·_ˆüqåc`„ l|MÿÇ:xes¿T ·2ÏF÷ë&ܹ›ótÞ$E OÙÖ‘‚íýç­Î0; „ìÈ,4e“ßç}Peóت㹭6HµÜ£='†™²«Ž€v?7XPˆáõî+‚)—±Y…]ç˱ªˆÔôíÿ^NÈFfŠ<à ò vºû>ïÛ\§vogÙ¸õ¡ñ¶ÂLuUmzнˆ‡¢cYd®ó§j)•æ×cÜ­kq=o_Ã_ÆDÛè皪wÅ›±.Ij( ‚ŸWZßcF5ülw¯&j1*Ck™×j0SiE×"»aØ£'’†NÄšz1íü'Z"žKt@±Ãì*Ì‘®7GDð/€²i|kD”å3Aß`l±bÈðVt”eÀ›c°Oï~PD73D¸1£¬ñÅ…¹ƒÞÿÅš„¤c:KùšáòÏsž*æ]‰¹Wzéûi\†œ ƒëQ&SŒ(°8œGq2þÞO"Tsü1É]À&{£…[k!h²cïíyò¸á¸"+sÄÍ9U†üÃq•*ÏeøæŒ~òª?^Ÿ½Ù~¹¾2»Ô0îB§Ng+é̘ðL¥8tX 2Ѐūņ¼¬YÖJÚIèR³|ÂsÒ«-0; .îØ”^‘ÃëPiüŠ'uµÇƒ”ÿÖ$(ÖNu׸÷N|—V“–¿ÅÍÿ›(‚k‹í÷ЄȀüÊŸûŽÐ]ìÿJ¦»ßMfŒSØzë͹ìÆ:èH¢¤õ3Qád÷žjN¦æ» ðu¼>ÆSAcþ× BƒçF‰ûCz’)7< šÛb‡eÈ880š66roLUJ[™ÐÃ@ƒ”HÉÅÂt#á:¿P™ÏO‹í–±ÚM¿ìgÏ uFJÏ›·õO«Á)WlôŒÖÑë›°Îl㸡ù~]E@ÐZYm3àüý&\ˆ!B_rˆ6A0-¿5j”Óü›Út5ö¤ù˜qÁ<‹tÔ×,E‘õy¼[‡’Ùûø=ÄÑÝØš¹Á;€gõ!8èØ²z‰Ÿ€½0¡€KDâÈZ–$ì<‘J_X\Àº ~,=€³æ4ŽÊÔÅå$Lžw+ÙB±cž#¥”™ä)'”ƒ@ˆÂ‹èÁógg,È`ã3îÖQ6ëà+0ÂcDˆÓCíÇ2Íø{ g ‚c—×ÔÔ³ì\°]x„}ië*N﯋ï(éî²T‚±¡³°°–rˆúöyã YOöÜÖ2J"`T[3Ó¯à¦ä,ùIq=Ö%1üz9¼ßB{d°H H1òfœ`€0-KªÁ×^î‰ËVÿÚiÇ[ÊPãîÉúÀN¶j‰ØB›Ë4”÷±ª6ÍÍÒèÎ^·âйL„wͤ’ÖDüŽÃa*ãX4]`ž¿ÊÞàã «¥€D‚MbQ=5‚²J£¶ÙK9—\‡£"ZBÒåªxCtS‹Q7tV„º9›¦Vÿ#,æÂÙ7•Í °ûþ­ÈH“»\j×À³}Áê­×ªe®½«½—iµÉ3ÏL–ØÌ拈`û⸊P×Òëž&?9Sï>Éèq^šîˆ C ½é=ÿî2'ñoÄoE®¿q¸„bÞ¡\˜Ý)]ÜþšÃëáíz›\-Ý„®Ú¡T™ág;.ßÚ«È¿^ÄS_üM,Ï5‹DÃvè@# ]vD®¦a‚‰~±ñ—ýKGª:þx&NÜ8i–éˆPXÚœæ.5þ~¨]ÂÙäóc½öðêãy°Ê˜±et¦¥uï»ÎÝ:Y_†›å)¾ÑUŸFò¨k²ÿ(SM9u˜.÷P¾£h4¢caT[æàÓ+ÙbòŸ¦Ñ«3÷¼:bÒ¼ j†±ðÐÙviõhh(ÞÞŒQx^ z„ž¥p5ê‹ñGòÁ_þߺSË%KEÞÝJ«íÔE DJÏO1¶ntCô~m]^D]á—+ªŸJF·¡ó¤újž#+˜G{Yô=]añƒmYˆ³[ d èö¯Ú›È›äKâÜ`¹,Z,6„Å@÷ãSŽœDÄ]&â°© »QÆŽ “k ”ßfËÏÌ—Úüøä¨Ä¹› 4µ‰úí9w g6%l¾'ªýÞ£¢Mv‹ý˜ÎA<ü>mõ-;s—!ºÉº”êü’ŒäzrOvI˜¿šfÚF7kEª Ðcž:ûÞìË0ˆÓic™TxíMïsCäžGy…­L7ùÍJ4EGCl{‚{›|VÃ' huì«~Ém@ZZ¨ýÓ>ÖÎH*Ë€ÒŽ&§¦Òp3½÷þQ¯óŠƒ;އ€îL§ þñj»ö-‚œ÷hK*º$Þv†°ú ¦¥À@ÚËᤞVœ{Èzò¥‰%3ðžjs´Lžî`¯+7úq=I¾Ltoí>¦£é‘y.6mÚ“ÊÒïð:µU¶½òêümÜqn~A»è”s-ªö‘Ð4ä~Ɖê"]¸E™!U§sa5ٞʬÒRÝ\17s \õ·hÏmDGµkœdodT—5Sg‰Ü£†¥@åz;‰š<Áü€…Jr²±pXñ´¨kÌ–Y蛲·ÿ½¢a+quH`²M¾IhPíH¢z«CÕ=y„Cº°à@On6ÜéóÁg{ù]žPBL*‹_þ]hµ†£)ƒÓ2¸ -Nù^)ìAÑsÂ’%x•)%ù¢¥ÚÚøUüÈד7ˆš‹r,H&ë¾¼¶éØ*#û=­³‘F5Ÿ²:ÂðZÐSiIo÷›ÝùùlJ¦"ž“²õSNXí—±Äm;A»·æÅ·@.l›×$Žü3«a›¹D« ƒñcònÖ›´PÌW]F±”?`RžÏà8šÙ*^焺tØÄ‰Kã`ƒ¨¤Vc§úgIç?j_:KÛ€+¬qÕÄkù‹¤ ò­0™±*/¦)‹wKŠæõkûeÉsjKl¶/)“Ç}# +Ø4ú੘7$ÁæxoC†Lá\_öÚa扣DIrs8{©<àbwÐÓ"j…lD Œ‘lBxð‚ 㨪½^SÔÜf‰+„¬ŽR´„AJZöUJ^Ð3\¬Zt“`%Æ^8ÞSÏø£•Yºæ_ÜDô_Ôƒ[T@}4ˆˆ«ß»;ùßw~¬ÅÎq8NcR[\^þÑ'=rÕŒ³—{r}gNü‘¯39¿¨cÈN˜—ÞÈ톨rlð–ȹcócßÔ"#ì 6­:¥uîVYû–´Š€p-“L°ØZäV,§UREƒEêßx‡¤y%ÿhÑmÝë\O~>£ºv[9ß™)³Ähý(å«:k«Ç»P)¸<ˆKbvPã÷ûs ý’ÐÖ•[|]fŠ,YºÕ5Ý*RM§Â³ 5„@»§ÊÇ6oQ›Ïma–¼LKßüƒõ§ûêEêˆ?»#ÑîšO½&‰³±T†8¯ÀAfbµ¸{wn×G‘“ÇÏñ-µÃ6:#TˆP/5'(ÙœQ`Ô\o1>Ö5èæî<6ËÞ©R*:U,ÝI-<Ôu0לFÎeQ¤hÿ`SIýeÂ{\SwLÿÎÉJF¯ij`Sìvoî8Œ&ÃÅ|-4‰×`Ûü”´C*°C»Ô}²aGJÆt=ùåOë–AK£e(‹òÑk½uÆ„BÝ”|ú¾Z3»ÚG=ÏVKÖHØÛž`M5ÁMœÇ=S8êž.L4£ ÑØ‡Ï ì:*zUÊã"5ãzR¾[¡Õ¦ÔEˆC¢!8`ÞX™ÒÌ$ZÖ×;!Õ¿º]ŸpH¤\è ßE|ìr,è« Z-”#+2íàý»ÙÞ£pWR’þΓ ŽÔäÝÄÔ£÷Þt$Óo"á|ÝHvµ<UßÈž†’ÓËÕÆ:"„§ ƃã÷%ÊHfÕr€î'Äê„\ÑqñÅ4½m\uÿ¯•÷›-<Ñ;,•†û”ãW@NùÛzÀ¦Ù÷µ^{\ç8²é¤EÚø]‚Õ£l•=²s5Zc}>›ð«ªø4Q“Õæ|c?ŒSôfbï¿ ÿ ŸnæY\Ô\qFguXQ£úA=¦eÝ& Y)Ñ<ÇW’µå¶j£*«Ø*ÈeýýµÎOíÿÏFŽ9ÉØ˜=Ç͘7_.ì"v/#åÊk Ó_½‚­É—ŒMÖòÕ¹àoîð^äzû‹ÓIÃ?γ”(‘¿ >ÔšïË[Tç½G„éG·£gu®ñ=èj¦6pÛQÕ;å·Â H”ˆ¼„¶¼ri[EýîÞ 5³Óhßד~½ØX‰oFÊ&‰ŸÎ}@²–µܷämƒ Ú¯ÀÄ.„ÿIôóU¿àk³NôoÛb¾Ù›%O’$9DŒ—Êá¿Ú~†vçŸÿö¬6•ÃïtJI/ì?‡ù],„ų¶½Ä[yUò™×xð½]±y3ß}eâ¬AvÜ¿Ô e ÇË…#û×ZCo÷ˆ…jv¥ÇRøøòFEZ3Ô§dM2ìñ|®ÿaÇø³ù„úL ¥“îÀ'ž˜áª;õTü#´¬S·ò—Ü'1¬o^(p|U®w"cì1™Ÿ1Hw]‡>Ô»ýÚþíÓê5î1Tr7CÇí|tnœw‘ð´Ã±môß;QÝ(åKa9ÒÖ¼ÙgŸŠ?dN,´•·iª«£2¢› Ý€‰9;¥Ø)EÕ®á¤ðžè¦± œ[-º6¨Tîàþ[ßÕõ™”™¶ù‹ðæ½ÐÅ$Nö¢páë@EsJy˜†ÄñŸu^´¬\¯&ïdm)ØùL¢* ’‰âÿVð¦Ø|/ÝüoºB@ŒB»Ù){g!ª4ƒ6Iü½„öjdqûPщkïšúÌxh6®CIÁ>Ã)IË}é¦2©›Lƒö%éé2v3róౘn»[q 7¼aC‚EO${އtö™¿£ýÞ˜œz‹11ÎXT•’T]Uìoé{òÞ·=JÏÖÅœ3vùÈ/µ*hã'éý§Â_&‚$Tü}FuòʤœCÕdxO IôS$·háñÀqŠd7&ù*\9`Fnú„iÒïdÌ÷¡­]¤Kb˜Šý³²ÍC¿¼p:ŸñCXƒkÂ㈖>/qãÎ÷1æNÛ=ð®.^ÔÝ;õ·Ço+ qqÏ jœdÂWÝA‹ç_‘Ê;BnÆNE¬ШIT·‹Ætí÷î7ÛHkŽ.Cå-®.Ÿp±D:7©ÆÊ[sc¯‘Ò˜hušæ‡þÆs}H·¤/íð‰VL}Œ‘ËÐõZ£1äÔ¥¦Ò!ö¦ã!RnadhJä{ÉóääS‹öyÀüah˜ÇøÍ:©¶/9L¸ò~f° â_B¤\Ew"—0Éš®"9^¬›Ýó=Œýmwð­(¶éÊóKËadMΖ̗ò3kó°TT• Ú$ú²gÀ‘xDš)ñàY„“†2hþñ4)É HQÿ‚ZÏÝûìŒVlÁ˜†Ô{¹^PR܈ê3D;éáÐOä¾õÐø©f#™‹äÙ¦½AÉܧ˜Wíæ¿9µMQgѸG+¯;f,ì6ÈWšk‘;¸+Ÿ¦¹mÓ¦žë+=8?'ÅDZîn."÷`š… dNOqî0œì§—=ÉÜ=²h…mô†6Îåd<&òÞÙ #ÖÃl3Óøk‘lºæ€¯ƒMQûÒŠT&|>Ñ<øøC)G±cáÝü …Ìg©ø]ÏïPg8¥ÃY;V6ц"9c»Ó/÷,$&þ“,²í$¡ÈšpIØä£B8ð4š‹ñ_ŒÞ cþ®!àê…|î_V”ä&‘€ÿà4âdéòkŒê‚Ü×ýÊÀrIE­ÀËCÚõ”È’€ËÌ(ˆµà@K’EŒœº'%Àü™öÎg¹ƒNkô‰Ul*@!GGfÝ)!?PÆqvi rtܘèt‘ÀâÌÖÝt°õ£DæÊÇ´.íJ{|§¦ˆuÿ`^?5ó•OY¿¥…ĩѷK·uþPõq]ÍÅÖ»ˆô_Y̶áÌØ¶ô“+€üV¤±vxe=° =zq_ƒœ¨¦êÚp¬FÎ=êÅ0}»ýÇLÅ«X€ê€&‚a»C§6t!k@µVuÒ™B·ÖlJkÛDô¶”›µ&ä†>HÖˆnŒH宓£ùsjt à¿·U¯siÐPîô‚c¾+‹f¥‹6Šd™ØÈÕˆà3¡š©6”B…!Ë" \ÔN¡bÎŽãOn]f^Ûp£W à¼@™­ïvžÃvº¼¯ž§Âg‡ÌÕ¡’–¯õœó ô®Áê ¼1| «’¿&ЍGË ríÍ_“¾5•/ǶIzX'ÇwØšW}û|¸”ÒÊxû Åw-d§Œ€¥fiÖ¹O¤áÙ­·Íé;³•q@&½K»Ÿ_‰ßÅûœ·p]Ì3szÓîèZþ‹NíH‚ÿê dÍüà3pþEÚ/ÌWK#Æù­Ö–$Õ=°Ê \œ)?ô³AÔÿ„Áû ú¨·èÚŸ^ ¬³60&@ °3-ïßñ.£H]•šS`Þ~R˜y]G…X,ŒŽ¹Ï£“ïsÎÞg€÷”Tø‹î`óÅ/É ,?ÉäYc§B*füÉÀj Ï€’™áu(Ð/å˜Ñý­,K÷ÄÕpÝŽ$¨=°ÇPš5_uã|f5è°óÐÃÇ!ö•Ú¨:ìèÚMùÐˆÞÆ£¿¬Ôûì‰lóik•H›úÒ& £}#ú‰-×€ ˜e§œPw»µ~ê>’kv›!ºïÚ²þüG6iã»A}¨ï$àfƒä3ÙÝ179:Ä[Ýd³9Œm jÀA‡¸jòØÜ÷Ô›í[Ý㥫;8Æâø‚£PC ôþÒeÌ|Ÿ­0’ü¾ž#Ža÷g‡p*0òfÀ¨”¡Aí:•Ay"ÿ·TE¬šƒ´6ß[ca’'­‘Ýæ.Óõh^#µ›\À#¸WE*4¦¹ »¬ܦc„rÛáäçRiᲜ•`ñD3üó>k-|Mr€ÙÂKÎ&18+,Êe wÂ.ED³²hG²H‹fÀh›˜£÷Δš$9ßRS9¦þ摶'vÌðÀ.ä `uψ)߈^‰ý}Ãx^¢}DSVI¼d²h`ˆþÌ$pbË®Ùgñ]gÝò[«¡ô³¾£ësù´¦òÛ]õÐY…áÝ‚}ã†;ÃTY¡¨l™c-zdWÔü%©Âv%YCÏÇÌxÌ웲ÍÛ:ÉP¸ˆÅÏñ2Ö=J弈,Þ#mFœA-ïmL•a®ó¨éºû×Öêt︢Q1m+ƒ§õ£ç/óáÆ_)A]T%o„Þ^¡ôllÐ f`RI©ægÙ!·hkpƒ¡ø‘å É+úÐÐh¯ sGÚÕÄàÚª‰nQ±”NF|iñûÄ’òR¤|wÏPïI°×z@ȹÔåPr*SgrìÂü˹$kêˆï7a™` Jª”y÷á@|œÙè£ùõ`“Ùp*bº\â¤ÌbõªÔ.÷NÑ˜áæœWƒ¨äÁP¯NÔÿö›m{ëÓÜ_Êo±É6þcÁàößzÒlkÑ÷¥Ì¦ÊóÓÝߥ=b_¼.èCãzŽÏ;†¸Ù«Ë6Áx¡_­ž˜wƒ@k³Ÿ^®Bå] öØÌæÀë\ó¢d£;™_îþ¹ _t|1ËóÎËiG(Ê樓™¯J9n>ª,1èïï.<ïGÕUƒ¯Q½¼/2¾7ÀÔ‚çô¾ÿ¥§Ò²‘Š-¼$ʈ›nØóï<ú¿ŠÝ„6Yý׎öêóWýš“UýKвECC @Äê‚ù4Ii´²³Ç¾ 4YäæìzëRϼ¼Ì!8ýß-À‹›JN‚Ë!`#ãZ_´E­|‹6úW¹Æ1R|«{öYÇ!’uéYêÏók7Té¼5+ó; Æjö\ü…”šáe V%5žÍ‘ÍÒÌÂÉN£ü¶HÕ»Óå*€³Ío~€ËFÚ¯õ>/ö•Â…£z¶}ÕùÜÀVNÈ’O¿oö4Vê…’à.K1>>7n¦xÙ¾«íªo?[åê6‚Ö:)Œ¿²+ÙýŒ(È•#{–¶Žø’`¤ q{þþ걜S–œÌ!›YX­w“ÁVÌmÂïÏ?ê`pb“¡z¦[¡ ­¥Ì™ðÒ:hï¡àym ïîÖ9Íbü†8Bìr¾G‚óMº†Á6fÇΑÊo¼ èlOCe-yÑ=ù8S>? {e}´L…=ˆY4›m Ç<øèÕÒ^¨Ÿæ¸ƒ>\<)Á|OlQåGªÑÌn±½7KÌ Ò¯¦g~‹Ë®kZª¸TÞÈç :I‰¹ËtSeIýH#9Ľüù]¹{r¥…©Âˆ’0Ó™²5 ‘ø÷íÑà´ëÀFdì ‚Òx1š‰óª5¬˜Ë-3ÚigeåKgïvCÉ ÅêûR.ú~þK†^ ç›D<¨@L*®àz·Ã+$Ê,Œwj7S]çtÆ£Jz7G|Å©ÍI/ös|>/vÕɤ¯A‡ˆ™“zá¼Xplm¦‹:UXÅ´„!}¼p5Où{7=¶}dL¤ÿ”cñ@êUiÁŽÐŒõý¸ÅþŸvÇj’Cvç¬"ñ_'Ëmfû«{YZ’~ÙêxÚŠˆ[ YÓ† ¥š­ˆj‹ÿû !Énל²ßI(ÑguUNe¿c[Ï`8·Xî&ÝÀí·œçr ¶é÷zèÚÐVÉè&Âd)í•RŽ¡¼õ?IïotædžÞ}™Ú…/%=ïá¿ê~¸| å@ß'J3&dkã\à¼KÅ¡Ç!¬û·¿C‹²8OÁîzWˆ?äóèkîž‘ñâþÿƒ5«²ùHš qÄ·$œ Ç9ýRìYÕܬ#h×<ž Bâþ$©€Þu!!º3Uñ Ž—ÇôÒV5s· –¿oÈ>–ç˜ó™§;Ÿõ²ûÌ¢K`Vô§Llñ3âõ©Û`oïêèám³МyÉs€ó÷E ™ ;s`Ü:Eêæ5°¯¸–îst×Q2lÁI8€ez k6ÔÇ+GFzÓ* îä|Ú_öVôØJD²yKlþW¢bôq'b§7Œ³|«Â[­Xmêœ[ï® ^b•Õ …—ßy®ÜE 2¿DID대o Ë¥F^q}½ ûpžæ;veYñ^|hø{SÀT×Ü–"/¢¨cW•Ñ}×´òðW8‹Kå×hýtvÏ ûx0å)µ 'lÂPÌ`8 }Õˆ'ÆBþ2D휉™P/Ž+sêvl*Äæµìµ–‡¿+ïdü•÷g‡8FŠ¿)ŠøüÙÃÛPÚ·¬³C‰4¢Â%êdˆ-`n= ¹líÛûQžŠ3¹ÔWR‰_pôa¹LËûI¶ t(ßFJ±âÆù\¨çLk—BKωމ&¡¯gåÖñçä1¼À´~êÔØR!]DÚQ %½É¬äUê¹ÛkÕùP¾³A÷[”¼1”Ç*)Îß°±ý‰Ö?Ú’q¶™³¹€¨AäGFDÅ+|G¶É5½pÃIÑóI  (Ø7/Éå½3 Å*ÂÃ< ²(*é0X³öü™ÃäyqÚÉú èúüÆ®‰zM ¦BŒ¨Ð‡oÝv=µ´ºa“R@“ÒŠAD„˘õui: \\´}£ÇúØGA KQ¬{ˆdGû¿iLu‡¤túù×½ú‰t,„žä‘!rqÞ˜»™wjH[Û®*%ï ìs H_þŠxT¬¾ºu›µt?3F3Ð xÍTŒwöÝEžQ×¶-ª=ý¼ˆb÷æü{?’Îù{Bîþ×Ì_ÄÓžÑ?âɨ(#˜—Gé RGuT דš€¨ý‹kóì&8!%éâDMsúUä9{-¥nã×Ý™ùõËž OÑ;¸^ eNK Fÿ<9Z§…©©x´zléU"±J´!Ú}ü\ù„rÍÙþwí|í²}8g÷Kè@ZÕ+Çõø—Çíí^ÆàSî'sóñ\¶3ÑèùhZ«n`c ¼ùcxw¡¤ÇÉ¡à’sè#øM¹fÚZ»ƒ†3(u›k”õ®BÞªv¿¸dz ®&±«ÂZ4ôHž²ÓþÓ˜ÁžW{{æ§àÔŸem±6â½ß—.œ@¶K±ÓäÁAüCSñD¯æoîÇn¿vèZm Â¶í­ã¯Ä8†Ñ&4¿=ÅÓò•ꢥ2y4¿:âÃ:€å²t¬£Î„°ÇßšCØIžP) B,Üiye:WÔNœ¿ UÈxNO2ü)×}ÅúdEÑxB)%Ê¥PŠÿMýBÆSö¾i(ÍÛ²YóöÊö²çD]0›ÒÓ/D °è<c–†¨ÚÍ„h“£-²kÓ’Ï$´ƒÏâñÔ„‘i80s!6©cvÀk%Ž÷'Æü÷é$7ýÑ}öÈéõöopÂ$ÐåQH&޶Üxy{¼SÁ0&KÈ^ÚJyé?ã·‰X4Ê|?nüw†[ý±YRé v‹ø€jù åÀüsy§pî‹ã±€i,ûrtP¦@Ú\ŸLÃtg7½ÅrŠm$×÷íé¿1 "‰nÇ~'ʺ0TDz-7Æt«ÁÚk•1¾¨dÖŠa¥ àUÜ7ûËÍe~甩½¨³=uDÌJ¿CÈûž‰Aì9x…õ¿9=?.ŒY¼Cêä,údÌ»í3ÙKøò›©ŸÅ³ÅŒÛ–§[ѯ4X„åù!ôœÌñE¤‘šB­cæãÖ”[ºJ‘›•Çò)ÛDé“`ˆ³¡©Ÿwšîq[œ v1&ˆí jŒqq}⻸¨ˆabv2^Ïð¶,ô#q9ÉfbZÁ·à˜˜ÄµÚ4“kÌÈÚ#ÈïÍ_^뽯c±€¿¤M×%Ô7¦»þ/¨Æg”sOÍo¨·. xNÇ™Ö?¼{©"o¼µÇg®†ê§uÃ6ƒ÷­»ßj" ÞžœHÙêÚ«?„Ç /|T;¾fZ}¤ml îö2”.žôœÞåýÕË?(g7ñ&ÎSÃ2n³µš¾;,¿‡aô†‹ÿì8 [Q"UÂc •w`í|‡¯×Bòê ÊVÚbã…} ”½#îþHûr¢©ƒ±f&gh')–ñn´Jo—Ûv§RUVö5]œï) gžùM—פm±Àx~™Øx&åNp[èž,4P’¢­xºH¹²ùrÇ™“Ûn„JJÀK:À@–ß·ÒX®›Bäæº X—µÕ(ÕÄö ÄŸq®@µàwÜ>7_Yò¿jkEwL¬Ù-ýiÏ}D)¿ŽøÕûвuÿ%‡)¯ã´õjZçª9$#T;iG”¨:ª,»˜ú–‡L¥R*¬º@íjb8Iëè:I·6™%»n©a\­FŠÂ0Áü+©'M/Žá4å¬7ÊøEPʲe 5 ¤ë§L'U«[ìkqiû\z´œñèUyç‡fD>!`ÉšoâaR:<ðÓÚÕ&óUdÈ–²X˜™óå¬oúåÙ±h'ǘÁóä«d-š0_ Æ­™ǃ%ÐC ¸¹P5=L6×ýZ aj?0€á/;°dPâ) ã°`‹1Q?=ð‘2¨UæÑ}—–í¿C?ýæ-”ÍÖ¡þ?W€aHT# “Ð%nhüŸÚî|ÁÇ„qâÔç¿îâE¶ÿ¥ç½Îƒª'/ ÆdË/Ü ¤¨“<,Þ:b§gû»©K”/ÝnÂÈÖD~½Ä_©ï2Teu¬~RúŸ<>±Ìöz«±—ØU#ž¯ªASÌïÎŒ¯%À_Œ4#qr'ñ8¾_B¯qÉf||®wk’DìOjpkG0gì­­ŸÏ¢ÇÖi8`ã6$Û8hZXÊãÓÀf¤¹þÆ Ð¦< ^Væ ^AýéZ$½Ù½¿êרÇ=g/„Èql³¯LŸ[29w|†?és+Fme-dÖ³©?¢hE6"ÙiÄ[óOq—ž˜šÒúÛÏ¥óW2q(_ð¶zÝPÌö ¶èxià/É{`±Ý´bAe¤td½€É¶€5£b0Ru[ñ$c÷9ØŽºØÒøÇ¿N Õ¿rf·‚¬o!ÓäãÙ¢§Ýt‹ ½­²&Í^”;Ö·ÞÀU”(Q¶vR1ý7î¬sp€¶~‰O±‹f6ÁÊF¶P¸&\‘×㊪>žΣe?§ÈkÎEmÔ¨tÍù6 ³$_–“·Œ|ƒ’%‘‚7dzc¢¯ õ0Rñè!Ù’lCÔçÔzy] íVdMÍd¿GÁä^ m!1¾ï³£&Œx@° 5rc!ú1Õp²s1L9Õý¹_K8ˆ²*ÊROŠßóò›Yk¨d…—Tž`Ù”˜¤&¦i6kª¸„ç=]æ‹sƯùòí+c`O¸Õj~|D)0l*é´‚#¾GXÒB¿«ŸÅ;p¡f@€ò'à»×8·{x ˜Ï¿/o)|âÊÕæV)Ϻ©ü´ÂDª]Kês›/>оåAȸÞÊJý½­÷K©Þl*K|pUW±"#Q¨¹’=ÍþÕ ó“¤óPü`ù<¯ Ùt¥WÄ#hD{èÿ E¯7‹i„Í<ãPInI!/èÏ¸Ž¾!¶1OE¼¥9;Ôª¦AhÉ‘áB1ê?éf¦nÓ³{ÊÒ²æBãB÷œ{Ÿé’`2ŽW©eK°ýÙ?3§S+8D’ka„°¡rÿ¨"æ~Sñ?t Š8dìS/ÇË÷rGÜ—ƒ#HÅOÉ“ÿ5Á¬†F»ˆó(*潟Ƙ¶xb{Ðï@1Ÿbeå¿*…õ>Ÿº5x3dH+ù/²ß²îðW§P:ùÞÆ·„“`|ÇÓôHó•8qBªK[žÒË`^¢y Û BI×§“‡ºÅ±þà4/Œå#>ÝúÊç• y@pÙâ#?„yס¬„Ë·óeÓÏ@8‡Ü“jx º>XÒjýGHµžrA2Uoy"ª¡¤vѸxŠŸqV×g‚zfˆ5ÍüÍ¢.«Ã6TjšÿŽ \§–<%h‚m²«ç¤Õsɶ絫 ¨bRçÕþ f“µ«Ë§¬x×Å/ç<þN6c[íD-{M¥e Líc9yÒhŤô«ò¥:›ñ…ÆÏÔ$„ÕÂù:(3¢5J9ûR¼Ú¸ËNœ „㙿MšÔ1ãå\w ÃàRowŽ@l9’CKþ´ø…qÂÁh³—^]9¸üï@•+¬É2q·á¹´ª0ªÜ.õUl„â”=š¤²J<þ—‡ÐFU/ÿúÇÁÎOu`ÉÒ[Œ˜´÷¸ŒÆ3j ­Žï@ãS!D"ç̶ôßcÅɧþ¢eÇ£\øëAᯓxU½å’Ú£:3)ª)sû)Zi ÊœF•Êë¿õûr¦Ö {øØÃ<ÌóŒz;rúãáÚ! Y0¥~HÑ$›´~€ÛÛ]«îZ|Õ‰×EË˱=q¾«!¥{NÄ ®Z0Ø6?P6Ñ4@†=•ùß×ÇXdn¡ÿE>Êê…Ú˜¢¤ù)Ÿà‘$|z´Þ°¬øîP ›nF ÏúÕÙr,Ée‚*ê‹! ©Ö“ä‡Q™î·}wJÂŽ) XÏ0|B–+"þ#gè]†:¼ÒËe$€à €©08ášov¾޹´[×H=çµj8/öI,³?^œC{«¥¾ÄkñlmëšоöaÌ.–az^®ÒH#'œÁ«+»ÃWWPKôÝ©\JfŽÀÁzÔ¹ò#´Kù'5ä9(Tù´÷^1#ôÓ‡mŠMߎ¦ôº‹{¹É\\´).w›À.àÿl6ÎZM(<þZnI&–½îé7þ&Èõéã5ö‹ê¡Å{µ(ûéðð¯/‹hžÖåÈÌÕWj(±Ö-¦]Øã´ÇáSÛs¼Òâ iõ³² =”Û£Ï*öwwæ\nk}l§l¹Ü¸"™,](±+¶Ö7uì6­.'6õ‡(²S0kÁÓžln%¼¾Ûƒù¶ZMå;*MÖ]½ð[0’ÕÑ´J²\|+nKɨåÅVÆŸQÁìd–ð“?Wëg„NŒOò¸g‡Ùžày U'¡ôIÂü­ÃÞ†Z‰W=ñ{‚©:´J²DsMãò…õY ¢¾5ÃqLmŒàÐÆ…{®Ö$%b¤ÂEÌÉÃ’È­ZÑâQŸO¹50Wμ¾üarðAÖ_©té1Ãe¡ô‘¶¾£û&rÎ~âŬ_øŠ -Õ|û߆m,ÊS¡º¯Pb?Ø+Åó~sýŽz·+‚¹!ËçTÔ—ìt‚$«3\áÈWÊrBÙBk óæÖÏJ#Hˆþyb]]ýso¨žëЉ…r˜¹2…æúî¶žd= ÿq,ötŠa}ÜàC­óÛú1TÊ»·Z·Ë´ÐSeˆŒ¡'ô>«žw'ÜQÔŽû[¾wˆ»Wè¬í]aÙ\sQ£àþÖ‘L"Sã9›ârWË¡cïbÿ r!ÑK ? í¤½N‘+·WÞû‚Ä©èJ fg©q«¿Ð¬Ù4U(§pí¸è&–ðj\ÓÝöMGù•Ï}:eh®RÆ“lûäR´i$Íy´z]Ö˜Ôú5{¥E'%$â0a™ììnÖsh›±ì¨8ïí}‚Zè’>µ¹_/ÏìZÌâã1Ž®/œ= Œ‰B§ý"ibÄÈÞD YZ¤ªH¹.B€Æ(\ôáR4ùÓWÀ”N$Lqç³Q¾·´L Ñ…Ÿ_ü×™ÙßÎÍÿäÇHGkѧ]•hëSCDKŒ[%#${ºÔT•²¼±kÀ\ò—˜¤² ¥z“3~%gð»ÿ­ãé<¶S’¿ÎÓŸx‚ò‰¦¾Ÿ~³)2ËÏšvUã@É¢Ø=Dþ`…µ&k·~r¼ÃQ5ÎŒr|"Ý\*à¶-T‚6ÇÙè:þ… ‡©aÀÃy IMÞÌ€‰ªÛ Ø¹Š¾´Q4()ê*JNwÊC¢©á­EKü Â܇kH¡ZÆh¾RÑéˆ÷¾ì’е;ȹnO]—›®†r(}¾ÝÁl3´îÀ~ï #é°-µŒ¦=zù)¿G¹G^ù¾Q”,ÃÚóƒÙ½^_£} HmªŸ³NÓy­2´}fR*ãŠå˜Í¾äîÊçèr¶¢`eÚÑ£uþ¥ÏžŒ™òüñRjŠÒ0ÄÁã´SnIY3Môu°]Hñ±À—ßeãt÷ht·' *Ó¹‘.`ƒ ¸ŸüÕ‚F¬nx¼=‡ˆÍ2BEýöÆNd˜ÎeS‡”Œwâà3É¿žxrèB‚š‚ù°wd¼ª{U–åU\Ä{2 SKËÛì·GwŽÛ[ퟠóòÂ¥×h8œ%‘Ó—{à¿-K}R }ÛgYLÏŒúd`[³‚=–$þè”Eñ­Ñ#v¹hwü'ºbpì¦'v§òLµ’2*ù°ž–A»„ãšôêD}íXæQBÓY°¢=à|  J€¨â·!’k®%ó ÞJ«îbËuþ‘ËÑpß—‘P\{@ÏúõŠw’ÌÑÈfw_×§@k=©£¼xü™@ÏK3¼Ðù™êFw“3××/¿&`±ÿ¦›û™^Öly8$ ZB·¥ÖÿcÛ¨+¤¤|TBo­$B Øi’e‹=)J½ÞÖÁŸq– VI½r˜¹ïVÂX$¥¾~w“Ê ˆÏÙõÑKùŒ&ÌGµ²W¯üÉýx A¼¼z¼q0Ù€Á«¯wCnƒïvžü±TՃ쨞äb€ÅMó×-4EØ@.H"v±RÓ稘ǭðåÚVy^ïùo¹H-&{%èŠ&#ÐÙ¢e]ºü„Ú‚P&ÅÆS™Úž¢º ºpÎ Nù3úד§> 뉕â&\üÿœSii­XèY÷+]0ÎXÎJÖ£[æîu쌮ŠïS™›Ö3y yìès3¾ÆÜ\ÚÑ@J7aÉiÄj×õ%ÆD õER*nœ[¹–PT/½zÀ©­Éµ«þ€EU,›û¼ ‘ ³º[—¿è°!èZ¡˜hõìLðíÞ…˜Ú‘ðÕx8Ö7+èÀ§,ðo¦e¹°GÉCòŠ,Ï˸p]r˜˜EüaKJßݹÁæÍ¦ÌQÏŽöšŒ1Ò›“ xN=Ð~rYW`€^î©₞^.,–Êg4U´6¾@H¹UNæW ðŸŽlÖï–ÆP)_-öYé—HVé†w·w wšî¼bì#iñLu”aœ` ’çôN+I²O²ƒv)R/êEÒËwXJ g¥õ`kø Øl¶òš4Xwèx³žèÖoM,t*ÚÔɶ>Á½ l¡ŠÉe:󒹟¡•i~f˜rà`µiˆÊµ3+‘ãÊ *Ýøßz*ÒLQþ7IP™áJ¨ñÍʦ*gUB3ÆO}bW Sd=Ó:úEˆûºÓ1§X=›J$¯$2TCÔ!bLÊÆ½C"“Zd©Þœ½¬R hUŠh‚eÉõy&»Ú3ÿŒšQ0‡žG> þ4Á Ÿ§$TÖ&+åÞÚ_^˜Hh)4J†~M¼Îÿ|[ÐUUÉ:‡Á©kK!Ð2ÿ¹L`?ˆßUò±Ø±a#‚å ’È~=Û¦ÂL–KÝã@‹®jë«çôZß&?ÚÏ”Q×C~M„éÙÈÌ]JF,tô­±@A\Ë9SÊ>\êx×ÍTŸ°8˜±@|ï@’¢‘QÙå<œé&§v°ŠÜÜb£ÔJšÏFøœ¨ºŠ4 «?s-°þ4XÍ€[(ÜdŽt0w×ðz¦˜å’$aä ‡õClGmÉ ¨¤¦©f½oÞŒ'%Q—Ä™+ïõ2NiF”rV둜J ÄR;‡aå½nõ=²&DsN´ƒ@~±-·.  5˽ÊNÈm«•‹,x7~}såoÙÅüÞ ;ÀIŽ~i¥”®Î¼ ŒÉÿ?laÍËf0y¸r$ðLP3¶Û0Âëè7¯ ¢ˆÂRpÍžñ‡le»ýb“ÑÝíOq•6™3[á—d:1ÌþN¹ø-ñDa?2äQ–ŠË-+kŠ¢þX¢•:$s_…"îUø ˆ¾L¯èL!ωÈ_Õ{1 U82uk7h˜pvo±ƒäÑ`ÖQRNSˆ¥=´M©Œ8{î¶\Ä´zCš:Çäш '*~1zWiç•Yïm²*hú±¼âfâ(ª\mØ:hë<Ãê‚äIÄo™¢¿øèŸ9[xRÖ’O«›Ü}tÌÍ‚^@Â((Aïë˾aÛ8ÚËÝÉ¿ö~o§_BŸ h†Å®Wãþ›ý3##¬×w">Å`Úz^f¥È•‘&ÒªÒ[œk†=W¿X±skøß*ï\´î«=.ŽnØ.ší)jÅålÛëÍt• <+ù8%Í3Üi¾ÃˆìWÝÐc°@ujI…üáƒë†"ÓH»OâÎuÌs]£H™‹DŽ˜Ñ³ÒW ïÍúùÚ£¥^íµ£^¼vÊÌàܺ(–;Ó““´N„ ™¢:*SÛiŠÈÛ,>ãr¨å5 3ÆFÑ"\w„óêAî4nQvtBpùÓ„‘÷’²& %úy. Ž>Mç‹ÕØŠÜÁŠk²üXfŽœXÓ“òº)’áñÑr6o~Oú¤²7"%« Sâ­Ao ‹?bŠ.®*Lf’ŒR£?½K¹$Ø~à¶ÝÛÏJ>R7’†žç±‰ ªÇð)²Õ_ÊPxÏÿÇç’ËŒ‡ mÆk#R c: '=ñhcHÉ<…?ÆÐè!ˆªeÕÈÀå9¼©Xb@º!ÞÈçVÄóQ>HKë¸ê½¥<UêŒyȨ]Ã;“óý@Ô.ôë¢ÜÛIÄ­†v51…U¢6I ©Lí,à²T•^xsrÏüšä•²IïcÂÖ™’µ‹ÇéQíÀךïÍ¡â­s™BLXÞ™±6ÕPJ¶ jjÒ†…¬©Öñ1•Ð67%fͬ pƒž#÷3”­3Þi]N£¡à4F çAGÈÆ½=US;‚ÔöPcDV\¾Æ› åõÆNŸÄK úâl§ÊÖjÊIkÓ’ø~u÷ý%±½»wƒl½é攵;׺;·FfЮSù~Ï-pK~æïrUt5YÀ-û†4 ½ô1Íÿ dFÒÓîáHÄJdiñUµ®NrÑ–w·ëè/˜#?a¸ZÉö!R¿×ª:LM%£á~N·þHÚ gÙBš¨¢¸ƒ%—¬õ'?÷ðU¢ô7¨²9›2 § Bn$w:=Òÿ^&j œ-Pr×wÕå¨SdñÜqO35%Í) ‰í¡º¤ìj<¤Ùô]ž‚ñº–`c‘t£9föð`f%}i‹ßÍ;€\Äc¿jé¢?áàÝÁ1Ü%$´…¥v£ÉþMÓ^z³?«ƒ?I¯+%1/}3”/‘Ê0™Ðû*5ôS"+A^Ò?Ä’”åMb¦ß©“ó®«Çª’±IÚÆeÞn ?¦‰¬jP`è‚”æGÀjšØwÄ÷{X„–2=•‘„¢Š§¯‚ˆ)@¨ zpˆÿ¤XåÅ|°¯¯»°»£øSNÅŠêpÐz£„.ú¬M‚èš‚oõ…&\U58®ÅÄ–1®fôj† ÷øP‚2ÜK«ìù&d+ç%¸nHöðÉ÷^èœ0÷ŠnwL CÞîe¶h†$Õ ÿ+•‹É(ãFfA%ÊÐ wMóݯk „_sÎQ¹Ï—†ˆº·RH¡ÃRCQ{þ)xÕ ò;“p´* ÷<« ,k‹`–ÍbþSz'ZŠÊ)&‰]ƒSg?º,…úbžê"“a`¹rô«Ž½´ýL$~89Þ"J½ D‚à¥5PÈŽ…M¼É±>ºõ‰¼¦³÷ƒúò?ÀïlCÓî篃ag-ɱÀpaà™Xän5ܼ[v2o.6ÎsƒZ‰@´ÅP¹'‘ôz.>²Üî×awôìÎ÷Ø0|; àÁ¤a—sÑQËJíD{²‘Õ„<5áË–}ÒÏŠ*i°m¼Þ•4õº/#•nG¢»…ÚG7ý×lÁhÑ—$\ÔP5*X¤XNëø5)aò™#Vó¿Û°¹Ätrܹ'ØðŠ.ždT?®‰«^8.NÓâLyj£¢÷’LæšI<ÂÈó5´Ù–¢èÒ~#ÜWðÙ' :÷8c |þ‘˜©%\zÿz¬€£ÙT k£í|ô¨|½öŸá_âO•À¿ÃœòˆdîùF‡ÙÕn—öÉ<«Ú}{t.ÑY”ÍõÇ^Œð­ò>“€Î,CŒBü`fÂ9Cöñ†Ò=XªÙ¬Þ–ÿ•œh×]kÊåɼ)%1® \qP,®BgP¸~YU –ô¡—Q,'r.#÷XÚ˜p°gq‹¥‡ûÛNÑ@U•—¤sþw@Û*ÝÝà”ucÔ?+h¹ñ#ÛYôÁ÷ÿ¨êj¦ ßCœÅîÐÿºàxôÿ²¨ªf_,{A´gÚœˆ˜T©ƒœ‘ëü*ª.®¹¨JÛu;Å èôŒëþs~@i/Øp‚Ï&•§úEþšU6×°_B¹$'Êy$&z$– ‘¼SÇfRØ)— ²W×A#ÈÁ"‚¤Pï‡ôÜ{‹^Ú‚œ™ “ì|ðw½ÑÞ²€ Hð·Àúþž5n‡Åƒ…2œÆMT¯yØ}N· -ƒ\Ãhíç´ ï%ñoË!SA€iŽÂ ϯ}æ±8rÚ4"°¿*%/ÂYu¢41 IJ‹K²tÆšž)ð¡Î‹M‚±»üÿPMÌšÞ‚B×^¸Àþ( ÉçWŽB ÙCb°p¯öxœÒÇ}®ešŽ_'ÐFPGT¨×Lëb ƒýÀSEÒî¼3#çÊ÷lÑÚeξݫü†ò†‚·µ`æ0Ï÷¯Z èÕ! óågv©bJÐ |‹bù˜NÉICã‹úÏûVªmƒËß%Q ¾±¡5~Cu‰Wú'‰ÐtGLK#k£9K˜ýEFöÕVTÿ/uÈ/E-F4Ê<㢇×ÿÛ,4–òÊçÊää”n8¿VöÌnAS¿ÿWCMuÛ¯‘²’b”oQÂQ"Àý3n®+HÉ©F †«ÖÑéÅŒŸÑDò•<Èú3¯2YI îS¶TQñ 0»ÄÅYƒ¢V ž ™ ‡Ä4q9ñó{Ê~Mïýô!R9Œá#g£`_”=û‡TM'©(+³:€ð‰?)òU¨c`RrÖ¨dF…2¾@]ZI#Ä1¤zEu¶;ö¬5-¢à¦iáRÕ“¥ˆôlH(Ëä§UНY“5:¬öµaR™{´Q74ÅÖROíus,t1 ›@þº\Õ›`ËúkDEé̓³ÉóÈEñ™”·ËCZ„gÖcÔn ’1}›oÓ·Þ|bC˜‘S¦„gMN¯Æºzûñ¿–ØIŒcòò0iÞu¤€ÞóN¼MÉ8v3âN+ H p— ˜ {º>¿d Y½’ €r5ä ó B'ó;âL]:âDX3™´wš‰"R¶›gæ‡ÑQ•\•‘?<Ÿ¢¹¯›v~ÇûZÉxLÑ·f2×È«³s„Í©“Ä!“ðdÀ¬Ò]àYäÕ¦®;©/-_«ªÄ5¡9†u?¥ë\œlƒVÜ›QᓊQ‡ØmÚ«#óÛ™W(Wq¤}{E|K Toóµº]›Uʰdd'Od8+ÏŠôwM£}«™‰R9 }“´ÍœˆJvè«êªÿoT*ùMXÄswžQš cÈýå"Ükk¡±¾ePé—Ôzn÷mÌ·Y»AÒ™X“|sYÅ´â='H>4Î2d6¸ZDꋜ:V“-³qÍennJ¿å›RñÑýCEÎGËhx™ æm•#¯0ùסµ½Þ%nm3^šiwL³Ñ«·‚fg<2iR  Œåær¥bólb«Eï¿Ãø&QX½ë^Bß¾7Ó-î…×ú\ý¿;÷i[Y¨„âÍ×»o‚°€gZ4( +lbRÆo±L¹Å}I»T_Ê…Þi=•> ýxvìX1‹¡\:ãûÒuÖoG2…”›¢×ðgñtÀ.+gÚwä2™s ~Ñ(Nî£Õœ?iíÞÐPq.¿š4›ßŠÐtL>{VÂw•­ÐpOçµ°µR;È&¥m7`²t÷ž›¸UÞP˜iäR~EÙµ —Áè¨eŒ°/¯žÜjÿäç\݈΃ŽK`10í¬¾ì‚§»_§Çä’çU3¶ŽàxtŸGõ euÆZã'2µeóŽ•R½ØúȽl´Œnv}Ïkšc~f–’ìe3°*°Ùæ,ÉÏ›lJÑ’!hÄúëB©Äs )”R€cÃ;­Æ“ÇûK†È“W¿J—T?6Àp;úaªÕ6{ŠK+ ´àô÷wf‹˜aÈ®ç ´­<⌕ÍeÑa‹ø}üô‡°![s …Ú¢•=ÒOšè~ì­?E‡/îEMŸŠÀŠ£ƒ´ŽË.3f:ÖµfêS#XÁnþLe ¿5ßRxH>ÈR„-ÌŽxöÈÎLêBÒöËw¸š‘ïÎ6Þ@åkföãÊyõí!5öèD¾3"‚·»mQrꙉ^Ž7—h ®O(7U8v¸$è FºdV‘+‰ÇªëÉ9"¯¯¿Çc×ê±мMÜ®…5{$øù æÁÜû[Wù[ÂDŸÔU‹Ø#¯1ÍêTןg|mÏT†nÐ’èCJÛÓúbTs½TÏÐÖm9Ÿ±ªüCÔçKˆDÜwÜÄ´ç}¬ñoˆx’2ªÝ'o1ú CÏá´S›?KúÖÖ¤.ȃ´fžÉš5 ´˜#e­³#ðÜíÈØr}.jHmüRb"}¦öÉ=*#ìõ:ïA›.Pö w¨6Êë“sp¼©®ÂJK𑙜'¾àT‚¬\:;‹º *g–Ø,…¾÷ŽõPÉ6í0V® s‡‰¦IÅYh2†rðË7ºê}àí(~ÆôC§L1ôÀÉm¥oú83K‹{^-ñ–=«Ê¼×–èE€26·pÊ\vêóQ¹ “XQÔH—³ºE ¤I²àÿË¢ýhÊ[ôjiM´þÆIô´èÁ»9O«ÂEbêíiZv–% ªÕéâç—6Ðf4}kfû‰ËYýŸ>ÈÿµÂ¦µ,La8pÒyìH(!WQ—‹P^»†b.8®bs¥%t~ ö¤ã¸ÿ– / /DZ]BåÚMí]ô§UÏLâ0?Wì’‘až@D_0¿ìïíh  òž-,˜PÛIæœ #åð\Ó½yXT=®®Zµ; {ù?zBB 4"¢íâ­ÙÒs]¡‘(›f+…§ÈÞ4 R?óQË •4ŸL@$ýϵ^K_Êxy …’!h0)ßT~ªÞÅ®UϵG2‡%çw‹Šgò\-§–2ÉR÷ØîÍOÅÒ'ØåÍây¸¢S÷Æ”‡ˆ•O ¢¹ÌÚ‡D¦¨Qƒ/%ëÙØ«¯ý›èù[îôÌ¡ò=ÿñRiSˆLÐ6_ËØ/V7¶Ä¶úN4® (_˜’5‹dÙ„·W“4G»0Âk=‘¥uì0¦ÈögüT[@ŸÊV y EWK°:´ùv@-NÌÓ:]ëÒ›ÃBì\ Ŷ0Ù «o=‹ž±åq2ž;I"æZªéÿ†Z•ôÉF¥ÉoÅ;‹*.šÕÛЯ¯Mi áø¦'̸•Î~Yû¦”†_æò ŠXPŸÇ¦I ŒÖ÷,Ѻ=,ù ×9ð+ŽŒäMÓÑ(¾i×ãªÄY'3$;Àr¸(Š›¼«¦2ºú[LØ3Lbü3£>ÑÜÿžãƒ´ƒý> ¹b‰?>³²®6ÏÔÑçɨ%"Ôž–]™u¨PíÙ‰ÁôvœÇÁ7µ{âœR— [¬'— &·œ^Ñ©KÏ®CP5"Í£Ám;´ä¤…‚vöËÉ”Kº|pܺj †p³Šþ'£€ ðûœf-©)Æ› ø™¦w)ÀÕ|Þ.8xÌt„…Ñg¤¶=ª £,•@‡¿ö€3ÉuQ«-ÙtJ¦Íõ’" -•rZ Q»BŽŒ~(Ãqøh<ë‘ Š´å9)¬%îHÊ &!@6»VÚþ¦~0zç½RŠ„Äê’€Î4p(Œ„tãMÏ0“OÖv'% û¡×ší0ð€÷<7O&¦v&À“ÑÜ4v Í+w1zÖ#.gÊñOã‹Ç,W6`„E8®G£šDËîŸÀ þW®þÓ᪉%4!ªé÷Y̓wÑíål·­{ö‹É9®ˆ«å¥ðÎç¯í¿Sw›ß±øp™#»oñ‚탯$í#‚›{q?öðIÛ繇}¨Í­ 4å‰\÷€ÊÈì_‹Æ$ð©5„¬C¯Íh@Lc Länøe™©1€=–à ×°Žñe»z jî•2êÞ&<3:ÿ1ܼĿ1CP}sãi›Øà¼"¯ëÁS.Íä¯F‚rË´ŒÀ‘ QøÈÀ²0J rx-)@{S(õ25^E]nŠì›ÝÞB§ó*5,¸pxáÁyp*d—Ìô+ýá›ðÖž÷‚-mgm4Õª“×%ºïXósÊíÃÕe÷Ø®®8ÙônŠ#¢õ'³¥7ê4$OÈæ6â€i'’˜¤¨¤ $A°#^,o–ü‰Ð,j²y0•›íØø|”Ïr'R¦ËhÔKÞ—þ®uÔ†«p® ž§kã Ê£—ûίX€CÔãÚÍ5i¸ÄÚãã^ñÉŽÎXR©¼ò:}–ÃÑ€}½Ôõ캫îDjGÒ"Æ)v @ QX£.±­8×`†4°™ðñPLip²7€Ô¶RÌôB6¿.oÆ/v!|ºµl"xt6‘í°uüÎ_êzÕf‹-ßÜÌbFùõ–& ܽdºéA?“ Ã|öUFHÄÁ<\)FÚn Ì"ïP`~ñ@7–“ZBZ$%ñS¶ˆ~Ð §ªXfÉ© ?É´ušâ˜f ¼©#O£‚?ðX¿DÝšîðh.(듃ÜqöL”}ÑP±)~„ð ­'t›N’*nàTîe#ú.ÅMûíãÃVÛ|“*0fÛ&5õkh"ò³Òç“\$Uø¡û…ì$»iy]ìËýäüÊáKÚ܆·Rƒ£ºZHwıä?£/T Å´,»­ºŠêÍFΞ9ehMEAý›ÔŸ©á@Äi¸°®g¾.éPUÀKp©îÒBäD;¶~ÃG_Õ´~×Z¨Çõˆ¢_QÖîõu¹U>÷¸íÓ# ×?ùlœXܽơÐNptüè`ü¼¨—ºšuÁëZüW¡õZ)›ñýœ’L¬^}äH|§ÔŒ 9¹(Ièªz:8.µ•0ŽŸ¶bÑH4ú ðd°š^á~DÛ·©+Ú¾k3'¨ÒÒuœ›¿×‘I`Ú²’׿;ímïÿÊi—9,´úøÑ¨~°Ò%W"âý¨à)ÍÉ‹ü| [qz†¤©ì1%Þo…ýb¥IHµ¤QÓ]ú¢ë¹õDXÛÂW~8R¼ù ذD§ûåD¿¹v£}¶¨zd-EžxñØþ£H£øÔ{äèd±mBL“Ò—VôJ}Íòcùɱ’¥ fµ1Ã. ðéaG—4&`*Nץ˻֡Z›–ÞSa´_ qYX‘6Î2Éš \?8fŠ «ÒÇGÔ?¾ù"KÒ…Ozœ·d2ÜÞp¦àì¶0&D ú zEiè××ãˆË¨ZS·%—ÌN}¤j3êýÞ` o>7‰@1‹ø³ŒümLü•6×uÐ^ j—`hVßS­$kG÷åMÈ+Èá—ú ÅëâãËfó‘Wz8E¸ _asª±MâÿšÊg;Š)—N‡Â)&÷«LÌqö›¤×ã!¿ª)Ø„V µ€Aí£&Ûq ˜øP‚°^}ÿO?¾6ªeB[2"AÚ2£Øú½Ò‘ Èc@Jüöè êË™Œ†Z⨞U$O¦c=‚É´?ú51m=Ô-¾4ðK¶²ªÝÍ0ßpϱ¼O+M GöxWÿ)>U%…];i†I´¡½q„ü¨‰Vw‹"*—ç¥ÑKµ(ì¿™ÂØâËÔ?ÛØM{t…½â{Dk>1gSu°Š¬'A XÕÆç®ÁöM}Zä¶N/ˆ£ ˆ9(§²%è ¯C¤@×8ây­cÝ?¬HRËeÞ™£r/_"6Ï£e¢Ä7ŠÛà£ú^=Za3D繇zLçª[ÏAl}@s¼"€“ƒ®}ã‚[ cxAIÀƒ·œ«Xˆpœµ¿T¢ìy@i¦MAh GºX*ع·Ûí¹P¹f£à¡BɽN žL_¬fÀåR§ÝˆÑeÑC`WOóç•~ ¯m,Òxü?¢ x0õ®îîýlXx®ÿš8¡(€ûp6k-½sø”†´¨œ^™OCÚoõ¶2†nW3íDŽU _"1ø¦Š| {óu³Å»ŒßúT+e;š¼Ï0H9ƒ7@¯Œ`×”F“XÂû²h-·dÝLýœXä°—s¨»òÅØœH‹*¿é„`8YºÑùîÀÂî.ŽÅŽ%¯rò•Ç6¦ã´ùaÉ4£‚6=z‰á÷·1‹A«akÛ<%¶ FyãÓuHž6ª¢Câ£Ý ˜$ŦG ¶ L£,…‹4ú׿Éß ¼ÎÚÁ’ãeYoFó§DR§CZâÜC¥›Kìf¡¨úŽê*JÎkŒy&í”ÒÉý$@|éCw+`€ÚðÓ»KDâØõ2ÀµxìA]LöÊ0ÖãŽ0SëÌIlúLt>|ÿ”45üÃXKÌ8£Ìuvå©LœÓÁdä‚·{îÕÂÖ|†(}S)½·Œø§¬°] ¯PFÕ/ÀfƒcŒ`üQ]+‡¦?¹€v˵µd\%N?@w2AÀc=ï•Xzqîš“k=Œ‹„{¿f¢é{=Á Ýk…µ ÌßžšØ¦×pÕ‹µv#ZØH\¯‰n—ï¶õ抌èOñås2a´ô,R8ÑÏÞ MÉåqc¡Ö¬ÔÓÎ`™mñî%ÝÙ•€`Èd˜b’WÎC“À}V­(‰syÒ»+Nt?ÚÓr°¾qKéx`Oì+§Ø¿VNOÅ¢u¨'‹™½64@"¼Åô7| Œ~x¢» g[Z"“ý_ê™/rÔ[ŸAO¢vƒöŸ³Gû¦XJÛ)Ì<¼Õ¦†ä&§ƒ05,û Û`^ `þóaCÖ3/ØeÁ|«Á"è ”8ªòa& ³ïoX NAÒµtþ'tIçø=e}xT¥äš~.z D.1¨ECÖŽæxI®iá’5MñcXd9%ÆÉ§Hm@šúôK~rÿ©ªá©žúR ¦-m™ÙH’°iu l‡ä®«÷WÊݪÍÈ6­:ð€ód…Û>Ò<]"ºô•ÀÁ=Iòa]©—OÕöùîº=jšÊdLaí-÷=© BÎf š’Ù„ týݳm ‡Ã=I!-SÎ6Ôc“ó¯k`²Õ/+Ä*Nßþ>EkCžàΆ+Û£t…B§Ò´jP}  ±{Ô´]î9Åñ7ÒÓ×gëÁÄ­BÛŒ‚= VМÌÌâF•w‰º¯|æjy豘¢…;Z|R±0ÀsßÖèD¨j‘wœ¯NêE?Kåݹä‘PþÕcÏ4bÀdI¶€2Áës¹‡n©^f±–ÿ¬Ѩݑ´²-ózàj?Ãè!VV™kÆi»G¯Z0~žìˆxý>v®·Ÿöl—KíŠcëÛPÓЬûñ5ÊÑœ2¼دÎ%¡¿À㻸À­#êõóTyÌjÖ(°ªXz:U^æowÿj&'ˆ0írPºô5É-ÆSÈI­ÃGÕƒc\YQìØdŒšÿñ‹¸UÂçu†Œ¹˜Ö·ð³Åp!äèL.Có€áTUíZ?ÆKa+ëÇ5á픤z_’‡ã/m¬§öIµ»óisu¨iÁ$þZ½@¦© 1 ¯i&éß7‡a±¼"ÜÿÕÞnPojfGÃ2‘ Ëò Ýíuòu £ñ4&·Kõˆú±;<©Fš\TRÐF1.¥”™T ]¤­/õyŒ?ó¥ÿbf(òóæ,a™×ú¢ÿ&ìâî㿸nþŽ|£„Vmý@“ ñú~c²oÐ/`2h‹Ïù±>ðˆÔŸ4RÕþŸ„}$]Dñ¶ÆD*"T³)\­ƒ¢8zÇ`X`TP1|™œgÊ™µ´Jyc„ô½F±!=—˜*Dñ÷L†R'=±ÃÊÑàWyìžÄüÀÅ·üoáÇrc9þWÕ"%°Ÿü㙾¨ÿ¨^ÖälP½e2¹ÛwØB;©j]0CJO„¨¯Gú4$n<¸ÃxðÙèç‘ÀÀ‡ºª`2–E°¶›4¿v)ñ·öê;D­OkÁ _ýö û÷c\þü„h¼²à~2V›M+­õÙ­$‚¨ÉJ1àÙw‘†¡ÊïÞlÛYÔø§2Pwž6ÄÔn¦µg>‡k”ø “î‘DS*¤Dêà¯{yXõ{ƒÃ+-G•/s Þbù;V]ŽWjQžÖ¤j½ñ\Ù&‘§ß¡’±‰ËyMý‚M¥ì9•÷-dŠU Ê;éuÿYµGÜ·÷æ+BWÚ@Tœq?ÿ­öîó\£³«Àã¹óv kçx|–¨ó¤8c|öR—Ó‚ÄŸÁÅ~êú½¹Ï4v¡w¹mfPœ=aºìrNºå¶ò$ÓÃÃÚ½ÏDË52¦æ9§b( Ÿ-žÝq£wk–ü× ×¶`Ü2) ¦váƒXI@µ!KÎ}lí/áqÉ ðŠ[T¥âá#åiiBhÚP:”Þ‡½³lÙÖ®Iˆœ:µCųâ`8×½q»†?ª‹±ªM¢§qlœªcCÊ]Œ¡‰é°Î‰ö+ÞôàÜW—R$>ž®èÒ0tâ" †òÈm¸#xŸ}qKV°í´/+ùR4ãÁ_ øQuM½¾ñ;ú‹4QDe&…®30ËÃåZ{ö¸S%0؃ª 6¤wŠÝš`0j”ɽTß=+µÉ[úK°…:‰ÿŒ»Ä»ñ„t1OñÙ…ÞôÿÒnŠ]nºi¥’†˜3¬: ¤×ó"œ¿52 åKXÞ\kŠ3•RÏÔŸR”vv±V{̳ù" æ…þXO¶MãlB„L;^µžÕ²¥boGÑùè‰B´ oxŽþùI73º&΀t¹1PTf>:`.L˘‚øBYÅ´—KÚdçÆ‹D[ÚÓ4HKD•¾<Ù‰Ú¨ VÂB,îÔmS2u!k·…îABmœ!2y6÷ŠìÚX’t«1RM¿[ÁJm­MCÇ×ÀÈ*jJº±Tñ¯€Sô¨WRZ\ég4c‡—]Iª¦6 ˆàœ å•LõÅåaUXQ’}_/%í›G©g` Ä›»ÛpÃêßM嬎1]e'‡9N¸ÿûŸïG†ýËŽj§ž«&ª™/×!(»…×dæ€cIM¼Å-t1Ntn 4%^мÒޣE‚ö&Î2I \]ººà3uâÒçšÉÖœ.ï~B`9唨xhÙcÚÉÛNÒIj–%çÛ·•A*³×¿œ”îªZ^–âWiá¿´l¨ù=x!3;öÇèr¹pï³mK)™ýc$ã mµüð˜3ú¢à ÷R“ƈ‹K,Ÿ³ûBjÉ · < ( ûø.J–†';ûŒI£!–4§Rž÷–' ¾âäËä6Ó&E êI‘¬‚³¸Nd™¶oøK7æˆë±[˜#IºHÙ€ÛÒ’jЬ¹€ :,'¼1“@¨)ö •äÄ@à‘W“1~Î犥yø7âôm3Z’U†œQyßÿ½s짯,’ØÊ{áwQ1%Ì¢š‰¯‰)H]îÖóü”ó™sÄq}ͬp«»IheÁÑ?C=šöCÌà 8ÇX2ñYcXë– AJ=i6YñxˆhM YëÜ߉J¦ùʯ0 Fý¹&Æúsp `%ôû~òÙkjå‹„g:†èy­êáÊ!KWÕw?Ò%J6Ì·µê¤ziÐûó¬¶T§m® 3]ö>D¥æ¼gðSBêG8äè¶ ÒÌ‚¤n€?P•)mE{T¯{3:ÜGù½{î…s”Ö†l45ΤºÛîÆjBÀ¯¥´gÖà¢Ù—=bd¶R¬@§Ÿõ § I#ª[}ø1)¬r[­}Ñ×Ç•UÇ3T]0F_øx~O%?ßTgÿ?P­ôÔ·Õ‹JÏSŒ3°oà~½Óf@2ã PV £(¥MP6„Q Òô7W”¼¨°¥;íáô§c êŽ íØÓA@bÞ«Í6´Á½Óø"EÈ,¡V…²e“P’S¡zÖ·CÓx?fÖtš£ý3è¨~÷Ö΀±<Õåb@°YVª9ͪßàÎ.§zÒöqÆÝØŒ²#¡c]DSavA˜xò8ºB)©Z¡çÝ<'S ûc0mÓ¿3‘—\S.·Ê¼‹Áº8E%Q¾Þv?×ÏÈO÷b»w‘®âCÛg²b›c^»¼Ô¢)KâhN­1BZ^bI³ÿeŠ'eMBùIh·VOq8¤ /²W}ùÝïøO5K“nkPŸš1–I “w«y´ÀÓÄÇÅ÷å¬Ä;N?•góÅICÍèc{øÔ#1‰Àô€³`hës=ãÙ‚]!0§“ä€ÚýâØ-¿›åÒôéÍ×k%TÒÝž[‹7.ƒÞÅ%íjLðå5þ…_Ù›§DwOé|±Ûa‰@:qëõ£U=±ç!7T#…Têr¾¼DXQ•ýý'"·‡b„qE¾JkÛ`)¤ŽÔ½EMø¥Xâøœ‡=êÈ»‡„¸–ØîŽOÏê—­l›ö,µ“t tSmɧ?ôk ®ß3zÇ>€‘Àr"DsÙ™gÖ"Ù^Ð$‘> à9# ú´E¾ ¨×g c"˜„â´oäŠ!2¬7§~Yø\\w6©,ê&o£(ºöà›…‹bE ¾[¸WŒüÉ Ï;U”PÕ*%ñl›IƒR2æöEØ´;ŸÅâäXs³ÒS~ä—?‰¡ô½™J+"ì~"ß,›(›M@»0lÕ NïT—ã‘ËÚãSä¥ H ö»ÈS!j¬–4Ù(Èu¶½’ÐüaÀйèM zOc<é%±sCŠ®ãß’ÞS5Š(]O4^…´¹Q XÉ×nt+hbx¡`4°&G]{$±zUÏA÷Zåãya…Àø?ÿìq?§IGÐ"çþ´&6/M—å=©Lmà±»Ý/¹©…zR%;…m^ËÈ…*3Åø—š*sjÞq,ð¼f'‰ PV@ùy þ /øðß›(vÖ{×doiûºM^Õ2hÙ&º—Æh¿ë³ŠîdÆ7Ë»@Ïk¥(Õ®“Ò¢Cɳ›nó¶j%’v7Y…§Ã¸{vJQÐNµkžZò8?^<¥×<"sÿ#þ¡s˜øòwýòøí©ãâŸ%x-•6% Ñ#odv”º1J:ã3Iðä}Õîè`pQÓµD˦2ÝŒ8gM›7\°îŠš…û:…,¬ò(vðYKy9˸IÞdžò…“ÕæÄhMޱªq Nm"Ñ?®v¨ŠÂ?¿¾¤aÚ —as,ÅÕ’¬Í4ÊèeÉ:žÊ8Ìá¶Ö3`¾”+Ó@ åÕ—75ÓÖàÉ|%·D‘÷—h•´BP¾Y¾uþQIQ)Øpƒ¦Lî}ºOÌê›]|²8 s3ËÕ¸¬WFÈn2Ó¦sm™ã[Qú¹Gu@ ÖPÜŒ5ÂqÎ#zÜÂ7¦ùöÙ{pÐDÀûœßM-  ŸS®4ü÷‚F™Jn§¶òÊЩE«ç¼D=a¡9'6÷–öyÊ,ªèêÞNEþ6O‡nA«> _¯ÐuffwNúÔ…R€{Ž ¡iü¥Bz¤Äñˆˆ¡-ÓÝñ)¯-"H]Ù¾VEMÔÆ[•Åsz/]%\JÚ ?{Ú6›ÑøWné¬<–!ŽÛV*#LÂØÁÅÄtë—#(†B¬é4}CZ¿öaßy\@äì;ûùœ¿[ëÑèê–»¤rw¢ð(ÒiZåǺ $a`V*×È9V«úª†®²¤z´‰bœ$i ¸²è³ž€7¾Ü×[hD‰5†…¯¸[ï ̯†O"0åd!ñ_tôòæO¿š.Ä´‰<ëØiàDAÐàOœÊøoÀZ´ÎåÎY­.óµªÀ{é¶~*ÈA~ÜØ¢—VøWì·%Ö´ƒÃG”gÙÓüˆŽ†¤òZr j$E_…ûHD±mb{ÇuW)Ft9¬£…Ü(ƒ__Æ‚}~¡¥mØ ÿüÒ¨ÒwÅX¡jaßÁó´™÷òÖ„:¬òæÑö‹v‡0K±8\h8¯=NöêÁíÑn°\Ún†‡m›ü@¥â1GÒb)§¿Ö¼6V¾³†aÙ1Ñß”§å¹7€‘Õ~^-í¦¥÷@̯¹Pçy38B¢ý»&ë‘ò‰%5à ¼þpQಬ)²¦BHɰ8 ãªØ¥ZQ¨-ó=VÎ2pÂXE 6‡ "JcKû0À‘½¤ÞRÈüÄc”4³“3—UYÏÂÁø­AV'~ëÜ-Žp1íÚÎ,XxO¾@-¥þæ0€X2²:›%©7Šš+)\][Rþ;Û²mÚ)o½$­õóM¼'=œ4ùWœ}CæöèòL¡s~bÅ/ÃJ†Š‹hÕu'\4áBµ¨¤é¿x!Cô~—…mr¬ìšè±Wž­N $åÕõŸ”¬Ù5ïÀµöÄ-B úI  ò N˜«¥œÁâ£ËOGKËåǯ°h@Nþ˜‘o)[ÂHî1ªý{íçùð-Ï&F#àËMéà}ì*ƒ´¼¢ªR0v®¹ˆ1ê5&(A\Üȹg)€1”2ÕIø>D#ê·Ã†w•vNìŽÉ™(Ø 3Öú‘M«Ì0{y¹ÌkèQÅ’Ó¡¾Þ`Únù“VÛK09Ér ­[Ž*ZÜEW"!m¦¨Ç<];ÂÏÎ)âôîÄÚ¬ÒÎ ¯¦£Ú˜|ðr›êØ #8/tE"P©ó Ãê‘’ý *þÝD}ÇâlŠøÿŠæzqoBºYÒ;Ò ­ŠRf1HÎ='@®ˆÖN^r#Ò"Ð^&øŸçº›töð&jLF樻ú~§®E“¬Ò*³¥õ·ÝÄ]íáÆØC”×ÒÙÃdñÀo"í䞀àßÿ·UF13)Sf«cÄY¥à¿¯d¢Ñª¾X~ª8”àæ:ºh&"Ä]á®05Þ€ÛÃë%Uvç4ž´–ò$½î÷ŒTÈ7$ãGB¸‹gÙ]"Î7R–ê×e•z¸©* ÅP’B"zGQሞ­y‘Μ·íü"—ý|ˆz§gþ±3G=O‘·~þŒMêtÔSÍ>êX$æwËU“ Œe$¡àPMŒ¹‚Ja¸šõ¸ãwù¹_Jrü&qÝ­ûâK +‡´ˆêÖêR•™²ØÍHî¿™ˆþΤtßð;Í$÷¬ú ãc+8üš#É“ÄX/ŽðÙ‡…—â”†ß ³ðBÞë1rÁÅÃOåöÔìP)3<Þ1YÈ/÷ä&¥¦Éöu;4TÃo€øW\"ǶÓô÷«}[Ÿ€Sú©#ê½» ,¿¿ŽÇe }ZÞæäSΕ’$jؾ¿íî÷ªpîÐýe¡}Œ“©PžòïÐUãûšëx^giãXYß©¹1‡ü{cY !ÄÄ5ùr«2©Ö¢ùý².N»7˜hp‡ÚD±ßF¦\5S°Œ¤.ɲòåËS*§ÎÅrz¿ú] y›ä½ ÌL#¶úú«ÎZW3\K@E§™¥q©“å>ÅÒ¾MëN”$ú¿2' nýì¥êéÜÖÑ“`#L@ØU°‹A¦òüþÚò==2±‡FEAw噊hßœy ÷7,˜ ÂU1¿oÄeÛÝÛR-ï›Ùl H^ÓÇÊí^gwW4áAR1V?XÚo&Ø¡¬WjØ vˆ™åÞôœ³Ÿ11Uèz'ª¨ó‰Òë3°CvdËö­ñ ß3ˆaeÉøéeá£È÷ ‰o”d"Âcü[Õ®¬èÝŜ儢6ˆOE hAyñ¥ù¸+½Êáüó&F6 1'°j=J*È0J£z5œ8{•Y¢dYîîy[ÄN?ez4a‘øŽ¨Š¯­~–C™&Óº%~ÜÜ3£yÁ˜HõÀ\ñÊÎu¼‚F­<@'Ý%dNr7£-ÐõÁMj 0;-sÆú¶adb™ ó•‡Ö¹Ô3œ–ªFo… f=tGœDr†×bÁmaÈön=zEI# "„i„ÊÖ m&bï ´=é";cy–Â’ÆL5G<à(ÑÕ5 3Þy?!½zw>Ä …Û'ˆ¹êSuvÒÆñ?›«ÏO¿Ò&do,bÞ …îåúyáX‚S€d9û.\:Šk¤³““¶çµMdø3­Š?ñŠ;¤"?`¶rûe‰)+2˜溎UGAF^1•Ö\Ϲ@97êöÔXc˜€ßY0ÒÿÖ‹ìþÓ´¡0`…œ*àÄÇV˜¨JʲäÒmÂù‘—ñ¯8Tm­f8dëþ‚YŠé„,€¶ãÉ´WõI°Îg¡¶í¶LyO^¬ìvz NÊ®ºÑþ:€à«¯Ž²±›ÀAÿ:04C¼ï¬Ïš`^Uêstó­N€¾«eEñ÷…ŠVh7”fö2I>¶§Vo·H9Æ"⫆1nç×€ÒèV®r%Ü+#®ÿIwökªÚHøŠ÷‡¾_ô°­Å;Ï*4ƒ3Œ!>Î_Ÿ=†_öË0£{‘‘kÂdò/òúbÈ/ìAQ‰Hx(¨6ž1wÎzNךÔÊÀÞ—³]±®hI‰!„p€¬ÎT“^zbeÇån{OñÛ/\ß‚Z Ø$\|ƒ*=ºqzWЃ×ì'TØbRƒâ¥AÏÒa™èyQ1j¶É¯ODuVíN‡Oü}W€ÜéüÍžz"`Ÿf¡Šó}lý\«Oô˜·ý£dæÅæ=£›(°|ñ03ö‚õ‘ÅUêayÛ’Du¥‡ˆaŸd %ƒ¥ù\ˆXÆþßUäÒóD´S×dáo¾ž òb+[*#¯T€7À£LãÈ–Ë2»e¢0ÇCç~™îê…ØCd² ‹Î2 Ý,D)}4„(;LU.Ìíýå»Eñ¶ø·htb:¡m»nŒu–³Ä_yqÈ·Zw›¿ï4Ì5|8„® M**)Çañ*LIjÑ‘Gób]=+±¯h9|@ƒ„®fÄ¢kK¬^f7ûd .´kjúXju~Û<ßÈ‚š:Bj“Éð!Àâ¹JÝ#]uïuq"`ÙW/îxi »|ª`H° ääÐð®I xc3~|ÿdTJu,R ÿ춸ޙ5«?Ÿ Y ‰åòê–¸®Rn£¸‘±V5PY‰˜¿pÛŸW5¿¿Ï@Þ–=úŠxè~VÄùY›ã(Û2¨;!ð†ÁÛ#£ƒŒMXËS(àÑÏ,à˜xVÔñìÃTõ«‘[“™ð¹‚«©œåЦß–úrBo: pc.Š}»™ÉW™«çÅF‘èw‡ø°Mš·ýÿiüj»±ç0߸6ÝY=‰/(Ì+ż‘ÞVëÐÌ£îzá9gmgÞ%ìµ"¾CMO´Ðûh:|éIX7DôR°—ÿ±øp©û.^̃ÐûÙ¦2GøáoáÙ•¡mÇ—ÀÓ5b„4û÷«ƒf&0ç¶ ÁØÿBn™hµ6ÍQús[eÌR7 ƸC0Cooe%ræâÕH¼¦[Ϲl²fW'n?õjøŒÂÅ‘báÄ¡^w*È¡i•Úry—æ„ñ ¤’]ë·Ë=:ë±uð¨ìâÑm0«GÀg(TÛƒ7|-¹Ü.‰„Wý‰Ÿ‘>Æ $·}!ëìv¼h”Èû`àahÙS÷ZÄôõ!&ªø83(ððø¡Od‰uN[”%Qà}1X'Òõö©RZÏO+íí¡ë0Ü€…ImúÉWÖø |ÑÇ%ã &Ý––S~]»ëv:ïu¶j¹š³¶uc};ìË)j÷¯½ሧwÆš"ï½”œNB4ERÕ'¡¡Dæõ2‰èKªÔ,¸$z¨átwÞ›¸â†¤TˆOÝý\Í#oFçpq_[I)',Áë$ú›o®B¦djÞâ\w/Ó©Ô{óµ£]ò ¶’¨†0³¤h$ú“$]5-uÔ{óÊ4h Šˆ»Y¯ »/ç¾VzÊ\g ÃÎÂÛŘø²6>: ¥4[¦)% #Ú80¿ÁŠe!`±ÄåÏclzÅbÔï1 X_0½«*‰«uÒ Ü¢<€¸Šâ—o›ø Á 0SaÅôMÖœÓHªËžJ@¾“õAïŒô/§êhº<¸ÞÇÊ‚öļê•þßh´û}'6TÌ—6‡CÎ[^4\w×n?)j O7 ýAþÿÃxýøf­Lü²yƒÙP^AÜìhpt¶ö6ú‡$ëKuwä\Lãaé?£Êm:¯ÞÙµGžç‘¯ÙnŒƒýZ0@ƒXe‡aŽSµÑ²&E8%W•åOW€¦Ba«Ãxï³X‚?Eîß^H=šÍ:—+ßú¨f|BD븛~6üe•6ïIz8ÓRêÂðÚ:èÐ7&åH ƒ9MÇî^A†>Ùiµx¬MŽŸõ5ÿ2i© ¿7ŠDËï[Ú?Z'‘Rw »y%7æ…Xk5H¢Óp«Ô@¢Ÿ6ÎïôO)šºÖôК‡±ÞÎÙìø¥ÿ”íÛB:Hl{ ñSÔ¨³œjû{—Úg ¯&ù€°û$Îúûð~NÞýäÞܤËÉu•†ÝqêjJ§‘»³Òeâ8)à=kªàA Ù´s¬N_|*®1/zÚÄÍö×Ü?I@ãEõzŒz:±|IµRŠOã§Éc´; yÝX7k?P÷AýÇ”úº‹A†!ĹèŒêä®9àŒvë„ù®ðü¨ò –Y‹ $ZÚôüNŠU("~ÆBSqXÞðh„$¹…ÛÂÊd¿^|I(·Z:ñiLÔÞ®°y¢õ,^«ÍÙ¥pª~Ê2G²ó;j»zeÖ¬‚á<éf) ð´ÊÚÛf¼2Aí1?ê¥[­gÎZÈ@§D« “r–ãö{ûi_À/òºÄf[ùÜ(.“’Ü'FuCFʼ7]ݲ®ÕeÓÖAl$ý°…2žšE oÂ2¥çf5bÀ¤µb(anä6À®ƒt¼Öom/áúØ‘µ$†Ÿ{ ÑÑá3Ýg‰‡­äašía;Ãð.Þ–š}ÀQç—¡{o;kWÁ0Ñ™ r0'ÿ*d,BÖžÜè™´o,ßä¤6éí‰ÕêfÀWêU€–Œ™8b²ÄÕ¾>j‹ížÆÚóR®Ð`;XÛnBPÐÌSw1 ‚½Æ¥áÜh™à!,Dq ©|¬8Nƒ®¢ÅûêCÒ²†¥À)"L”§“{±Äœ„~9<>¨å9ˆáV€P×Ñ<Ф¯¡mа„2?×/•ÊŒ»!¡ZÈ ¶ÜëMæ![õ€žîA M !œ_Œn_Õýޏk â;)™qp,ýÇ6"›å»«´h"˜5}uû(è¢üAªÄgH×µi›~³g¶x8Á¯üA”únçÄü7žˆâxøÃZ¿á_öˆ¡ÓÅ:Ø1žÓ¬ÙÎqv$ƒÝr%¶›Q$ÂСKS"øÖŠõqe»/eŒÝô#$]„®n~fR²cXè›.~¿ñLð-ÓHuæ$ÙG1‘æÜ<úx~Ç7»ãܳ¢z±ƒà†¦4ʤÒ>{ªùQ¿éÃ!XۥȜ=kÚkblxoEádõCaƒLH*íQwÖÔI²à§¢$BQ^Q ¡œ…—Õ"[ÊEþfõÅ%’È©ƒ½S‰ê»v€ìÁl¹Ûé®àd¡ÀGCj‡cƒŠÁ¤UP’;Ó{—0¥ ^KvÝ¡+øN„ÙûG\›ûì· $ß6ü‡{³ŸˆLá×I¨ ýó7ÔŸ– l }¥±ËÂý«—±%ÿÒαá1§‡O¬EØñ ?¿)XÙ-ˆ÷5Eü e †O=œŽß,äÏV¿9zñƒQšç¥€x¼„Àn÷Çy ÁôW •TUicj þ §ÉAÙ‡ª/\²›Ñ#íKN&¹‹®Oëµe|•Éi ÎY¿-/B ÇXÑH¾N; ÿƒP¾}X2ØÂpY6á0eKï饦GZ‡òB9î©b𨛷N1A\S·ôÞíéFô]=ªÞMÅ®]†¦ùó„² s¨(òRqª|›aàÖˆLXOXSÌ¥XÎß ?¡è"ÿ9­ DÚëì.ߤˆë¯¥k\$•*aˆT0ð: ?TÓf>‚zmlŽ~”²’£„gibUŒá…ÝOx¯_,‹2óg§ SoâR¢€-d· † êå_mBë6¹âºôJV)D²´›ÔÎ 6ð0^©ÇÂéÿÅÀ£c’\Mp.fÃ;2úÁ ¼Úåg,Rt‘­r@½ÏëíùÄÿ¨0óOÒˆžŒæL%îôPÇoŒÚèÉl­Q{ZšCšcOÊѪÓ'‰²ëEò ¯9Öæ¶Aõ]œYÁNŠ{‹íÞ§0,ÏέŸ¡¼Ìhr’»!`sø,pƒGÛÕûVU„lÏGï\ßš2Aç|g Ìëw¾ovÅ®–§yðóJ†¹]¿@“Tj/"ê¾”â|ÝJÜ©²rö–[øƒžŠ“¯žpKŽ«qƒí¶3 –šÛzü¿ œôsðù{2Ãã¬Ëï;(I‰07¤Ê|¢Þ9‘ÎwÚã<¼—R:Rå|ò©Òßl þî¥k%’ëp¶·|––GÒ»ÁƒË½T‡ÌmbwØ_J&dM¶ËC>7£ßê?Æ©uÂEYPJF¨=ñKKnÝWà¸%r·¢ŽÚF_¶av|\ÕËF²¥tѧB¯6/ÔÀ*¯J“æÙkwÖgIÙ@·‡¾ËŽ pËÀýîÝÑÙ= ¢Vl%·K5Ç8K&Ìã€ßTXmÈÜ' fþU{yhwª±þoùÛxHYöÑÐ 5j}Ðó?¶Ld#mŸ¥˜ÁÕ}#–ŽfB(l^ýA9|Nàd+XÿUN§ª¼©> lËXÁÛ»'ûúÅØ4î0êÜ$OÓ^6gäç—îz+ j¦i§.F 3ÎCl'#âW¿pg”Uü”N¬F8yøÎ_I“ÿZ,(/‡Û‚€5ï CUt^J³tS}2b`0ٌʈµa`ØC³šl,ºOœØf.Läë˜B¸_€Â´+ÆŽæNoYæÀ ˆ™t˜®©ª;ãਵß" ¦oà1Kž¸+>¨÷ˆX¬Š/ç5n•œsq"ÒcX¥ØgU»Æ¡’V'bòT…rã” xhü9BÞ@ä¶zÉ4ѾÛËBxRå÷-u¡ñ†?«Êg Vá1.`tRëm ~¦™…® ÔÌ¢"ºôÒ¹¾À×Kû'f=ÌK£ûçþw¼?×EÓGúÌ^5ýßݥŵªüÈ p¢íMd€©$õ²ö½,êá,†€ G|à mTþ6=ºÉ ¸`³n] =H—FénîoÏÞ®kÿ_Ûà{rÓPž“Ì®¬M ѡƩðúñJúASpÆ%d§ŠV8=·GdáT®q£fæDÐ&'b”n[„wgnì`†~z›:¥Ú6²œž€¼ê”œª$%ºç1ùn‡}ŽÚ“+Ÿà`û6ÁÁƒécÑ›Õú+YÑЋo†“¡^_±­y¡¿Å‡¥ÍЃMí®T©ÄE@bE¹Ëˆ^1 hà]dÔžÍA¸dIrÕ¬6-s㜑òm‡ÿŒ"P›«‰§“ ¥Ù€ÝÔ^³%æg'õ2“zŒ€NØÂN0 $t8|jô|k~?x]—ðaT-«²aÐ¥~mkr©È¦­î¨pØôK¸ý&,A*åÈ9ñçÏËDо¢(|$9¡.¾ÝÓwv>/ŠE@Ýñ^ù±*3ôÜÎΟñ`z+SŽßÏÃïòK‰Ñß…žw«uõ ز9õŒ@-¹Jè’0ÃÇp¼…€r+ :äGö³´Eü”ÜÓý±GÑñžSS²÷9ÑÛ{]¦3²spúÖp®F!(’¯·aúöÈ­ €ÔÑ|ýA='ÚéøyìÓ$ucEt°²#yt-è{žy^Ç7É¢!¼ugÂÙwìÉ"«³âÈGÑ[Î.ÈãuªW ŧà ÁÕ‰äͨé×Iù1…~Ñ ýâñÊÉÝàÞ§N§5GgxJHfkù¤­&»Â¿ quŠŸh¨ï^'W&»‡â/' ¡0)+ÄŒa¯%[H}WÎ ÈCIr‡±«EÂä2÷IHІÎÎ íõÀ<ç-ïœsç°"(R+®Y 7ؽî¡–—¸‰”–Ò%;‹ëÄÆ*Oöf0TW5r©=k¼ ê¥ælI ‡ð÷X‰r4ëÞ\§¹ü%’$¾dÏ â8òhÑ{Ê`®”ÛÕöÆö£Ý¡Y!åîò¯í¼»ëó·¼9ï貫˜Ó#´vö®Ì´„Q‹Eròð]G1BÅà†Úƒ&øfNåÂøì‡TKMÌ\•8•Q”q´'rQ¯Ì¿¬/¦¿Þz"ÇrcùÔ§V"Ž{C)Î&‚+α»œZ ü´Ã‰†|Œa*K-qkøÏì5_/d|³µúúK'™XÒ²î’Oš…ó¯Ô…vw;eøÛzrjþ—†¶‡؛²›×‡ú©0{Œ%…ª–’&åÒ7ÙåMÈý[\è-q¤x^*]ÿû°á¢ÁGć›þÿòN¥>^ÛY*y–¯O¶6Å2ð›•k±(ñm…ÖVR¢OtiYÑIµ>Wn·~¸K9¢¢ÿ'É—Dýá~Ò†q5Áå¨0 ðêy,»Ö7£²ôº¢Z' ] mHËSv¹x&Ÿ¼$4D£Ÿ&ûä¿­|¡(Ì$)ú&zè)Ò¦ºàUlLÁ*½Ì\Ym/pØÌ˜SjB%üèFð”™ÒÛ‘ió`Váø#€P;_ÉtsÔìeNÙŸšÉW›W–_®mnϬ]}wàò®Ž¹‚zcµ[”¡ÿ¹¼ß7+EœìX¡+Jêê? ÿØ£³‹µlF± Þ?xmŒàp{\/ˆ’¬16þü[L¸\>*ñÝá°2ñæ+~kIJ58LÌŒ™“ R94"üxRtZƒ%.Ø›çFòTp:‘Â_Øz£[í¹vhÏ›»‡;v~-î¥"’šÃKf0‡y¿ÒÇóHgA hd:XéE®6Ó¬8À=‹*òœÆëûÁ­C‹ ¬Ö?á|Rýo°ÏÏ´*©A]o9b—²6·µžÄ.ÊÀ8õ&¿˜KÜÆá‡Òkçÿßù‡m–UÁ¿øŒ a’‡jàbÞPo¼j¸˜Å¶ìo‰U‡wÄ8¾ØËÌ#Ê‘*Ê1ËÂE± —žnOFý!{žQˆÀи2}Â+?§®=‰ nÝ–å ³Í yIAàD¤¦ª]šé5ã=Ý:¢åu`ΤR!q¼Ù`™‘çj¬å¿K ¯G<‹º; £JMĺ}¬ c #¸IÖ|·¹e®³ $“UÒ§G\Ä–8üŸŒ«Ò)íYûml0f^]ºçËÙÂSÊ ð!>« ´64¢ïdd…u?\@ýžíò±ÆgˆLY7­}ÔæÑ`WßM{ÑD³äò©Œž Cõ)÷˜rÝ]Þñn`.¨æ4Sâ¸×‚ím¼ŠO0s¼ksð z*-òÅ (o¦ Y6^¡( i8‰šæ8›LÐÔ_ö§Qu®.;V`VјO•^¢÷u£©¸&1|rœC4Eë-™ ,1ñpŽ|h ÷_7Þ•;|ƒ’ ¸ja{MA ýí¸+¼qô'„|Ñ,Í{¼Gë ÷Ô­zžm í>z_‰.D;eû’„¿ðŽ4ÍjdD :¡ŽçÁ++KˆB (ÌyÔ–¡˜ÁP¯™G«‡Ú*æ •‚\ÏH^ƒúqæ{\çqŒ³S˜Ä s@VæÃ2tM$úe| ~é8‡ªºD.˜Q¤s¹˜®ÁƒÕ¬xÕÂàµPrê9??ïÄ4Æ€P'µ±Kê!I"ëŠk¹¿½,q?ay÷Xº@€F9vÍÇÄFÇÂvI¼"Ôò™`™\œ¤O«¤âƺRv…º³Kà&RW¹êÒ_Ø_øIlÜ”™mjÒ㜩ÝUüÃsŒémÂåC˜GC…Žšˆv¦±%'}ø2äÑHúJšÒ×BHÙ%P¦&a_NÏWu³oÇÑ3¶÷E žà"i¶j}Ejþ- ÍvIo1ŸÆnaW´-Ńdn×àÓ¶Ý·YÃ; Æ¥,Uw\£Õ8ãÀ: ÛüÖ™Õ ì¡7h•‚Dö§·iz±Q]¥€™ó©Iþq§Döºæ‡D3/ Ÿ]*ÉboòðÍ<Ñ.õ5`Cm³ ¦Ô‚(öãÁ&Q¥RmXœ©I¨â´ïKC‹H}S1G§ù¨ÜZ/mfžˆçÜ’Òš‘…ˆ‰Š47h¬Ì[ÓtÚÝæÐßÀ­ž¤ññÒ¿T÷“LY•­rG%-€h%9^Xº±G>êËtS ÔÈ£gIA.î³_ÓgWWu¹¤âP1»'ûŽ—Š- ßËåÚåEŠa=AÙL 㩇ã]÷Ç(?*ŹŠY^®„V_S/£w‡GçùRhAßÎ&«5Râ~ŽB‘ß( ôÙ];»ávD_1à‘¤gMmjB·üVBø™Š¾Å† OóAXN¬’ˆž¦òïÈ?N…1Lü Ž(jÝ…Ôn l¯!<{æ ’ZaœŒOR-R5^¿;2–8‡oxèîæÈá ³‹C¶¤ˆ¬5ºù§|f® -?Ƙü™œ&Î¥NŠ0lü>¢‰p&ë{QW  ®'p@È¢ßÅ[£Ð³–aâ}¢þ¢]d@ív4Øûuù¤Ì‰))DäÚ ÷­e? ­_ô7ÛUVú×ì/ƒ¨‘ff‘+lÈö4eÊ?Ëëöf¬bŠIÛ\aæ1§Š…”ô‘ÖQˆ­Cõ¨1jïO4¼QÛZ2Y÷?V=µ‹jI +ô™µ1`1Äj‡·… éƒA,Dzl㙵ª£ˆÄ&~Uà½ÙTÍiú^’Ú»=ñ‘} P>Ϫ¼Íì\© êØ±ñÑ•ºŽ)°/Z«óeØ~M yz m=k6¾v»¯¶8c‚»P°“Òõ<Ø´¦<¾ÀïÓøht#¤¾{ASæb —€ð»ÌÎ£Š¼| ïÙʪl_kL›]²dÅJ‰è? p£íÞ%öøê(F‘ '§Ðã!Ëyú<˜s™2/äü‡]ô†*Œ³+RqIç5Z?à±4y`G’a‰œ”èFþßße”UWâAÔJ=ÑdP˜-Ôþ_æc% ÀbW’]w|ò³ÂØ\&˜O®($5¡‡"Œ­ÌúÁ’T+Ž˜ýB ¶V¶ß¸Ù+è åÛg? aƺÊn˜äœR +‘»#¸¿öe-(á‘g0á¼êéÿ‹£«£P¡?f‹WAq'#æøÕ–ÀŒr¯Þ\0uŒ±õEBÙ(Û…P@å•ô7cíqm¬ÏjÑ"—ž×‘M½x çD¾ç&ÌrÊBF%X‘ôuï¶zò ±§ãîcý÷e‹6½ÇËòê̫ݖ¯Ÿ!ħ.4{ºj8',€Pªlö)Š}] Á‹,x3K®À³Ç“*_^‡§U;0µÍ–X÷bÍ¡w¸ˆŽû ‹5i°Ëz§Flüé(ÀùUVsIÀ´N¯î˜CŽŸ‚[8¸¿H6¹ ©öøŠõÆéDóÇ‚°Å¬m=f¢8RºyÙ4^ߣhªQ¦¤eŽGT;AÁÌKðUeA2?¬:­«÷Õ"šº°Qä0Vz{þEÇð^×9rþ“K‡­xg0Aù¢UQö™&;ÙD]|h‡b ÐDäõ‚×zÒ?2gN’%! ¥H¿lËßç° ¾~c[6©¨–ڒΉú±NíèN¹˜(Q)Ò rÊŠ@Äò…Á÷‘ R.£äWÒŽ–ù|J¼ ^è¸g£H"4Þ‚áÚ3ãn¢ÏvóÚ Ï‘P® @å?ÜZ(ÇV¹Gφß5B×ç'€TÆ5¹;¨U½¥·Nf¬]ô/yŽU„î„Ò”ÅhlÈ;<ÎÕ=Dgõ<åѯ¡í+é2"œœ9AL€Ñ Âî0wÓlé·¹O‘¯ùá>»¶E ë²}Ê.nRü§û×ÞËåñ¹ï Û^ÔÉ!d“­"¯åªü²Èæ]î«îÒ+ˆúQ£Õ=”ÝñÓÁ(™’À9ítòŠýí“GófœUƒNášCi¬õU^pe¸5 ˜²q þÐ¥eƒÛo©ÎÖŠ’ì,a»@ éV±ÏHš¡˜Àt4ÌZýAÊË ¿BÌ¢ÇÓÍ`´Äüj}¡È3ÂU æ[Y?vNž B ¾HH’ú\ǦÆ&5¡©ˆ ´˜YöMMô£Ý,¤ö¶÷® ¥¡é¬h+׆­5ìì÷T¥·¾ Êeœµß¼V±Ýy¤L×-Â5Ë…|ApvBá/É6­«¶½P °~5¢ä4G¯d*Pf†ZZX³ÕÛ\·¢m}ªŽ»mþî"²“ç¼r)b”FÄ´,¬&N’µÀ×t‚Ê̾—N±i’ȘÎ^*Õ;AB¾_™€78Fín$¼0½¨s²È°½N gÓ²(7Ñ’Oa‡}± öܹ”„]<5ÂÔÿ‘X a댷¸ö4Ö4(²~+ëòäT ¥1¨Ô]𪓞®X&QÑsX^ÉîÉ•?z€)ò¨R7§‡^ ´ÎY‹n¨.ȰúÆ¡àŠ–z3ÚtåFžPyÏíVZië) œb.zÄ` H”>d€ *Û‹vÙ˜Õ³HrGB­|íÌý4’yR ý Æ¿V™U>'’m4JºUXS¶¤ægŸßIÀ§óبÎ,L*y9—…/êÌF–šñhù!êRS~c¢ÕA µ¹êýÌò`ÝCá“éŠ E”¿ ¾(>bÑÛ-r/8˜ü4X™ mZêcÖðôrœˆn×#€s´5®CJÒ¯|A«Udú™2} «ÍÉm‚  ü éÔÁÃ\Ñ¡0ó..΂¯º¡ðâGKÅÉäJ†ÔŠ»Mxh“šúUŸ”1Koþ¢ê[¡E èãÏØÜ6îsWvƒn=ë¤r§ô‘“–iy(YßmgÌy2ø`Āţȋ=^=Rëöþ2ò7²ôm%€.· ®¬²ßŒª5^Å™úßêÎl5Ãw(n½ê¦q›‡v ªÎòˆ¡Ë›ïiu4ìC gÓˆ&$¿Óˆ¡ž¹í3€ùëè÷Nåîýì²3¡GQ¡íï]àOµÙ€WLà58Ž!Ýá\r½$ÔóOÊ@~ sJc‡ÿûoâ&‡}åÒMMýÔOvŽ+ˆ;LjŒ´± _ýâ{8Õ{± žÎQ²Ó}3ÍÊÐálD£Ú!Jm¸¦Ê™5çëа—$ö½á"ÁÜr©©hsañ$¾ü–ÜÁ§î‰”ŠlŠn$Ñ1õGÓ>o^2FÏÚ…) &Šêž¯¶²\ÄÝÙøyÈy X™b±Ì®à Ía2-Dí¤ ²N.PôJ¦åwyTµm}²SñÏÞt³ Å@Ý?sŸfšsÃ{QÁ㼉±ÃvfìŽ#Ð鮨y,Ífà Ež×T\0 ¶¡G´]`ÔAŠŸW–ÕJØGgs Ô‰ ä%Ð"cDù?É5˜©É62Jm:T'S/Q<áï°Ì8ø˜kU—-€ü ¡`=„ÌÊÜ_%üÃæU?¢NžÌOæ„“„Í6,ð:&y¯ù:)¸C˜hoà–â|—ùQ/n4… ÈÙ½ds#­»t©½ñN¥Î ÜŒó¹Ï©¦žô„ÀÂUâz׳â8aû © s€Nñn6ã^ÝØ-c‰€Â3‚×™Å`ÆËþqq(;Àî®Ùú”~œ-o•)äg–ÒòϺ\>EË®í­{²u¾:Já;ÿ2‡ü"L˜ß]»•wÞ/ðå[—M²Ü“¥* ^å#ǵ …lÒÔ.[Šúšíòbƒï\_ƒ@z*tC‚ (\Œ¯Ê¹Ü(àŒÙ%-0ÓežØ$á™L2­Â&IjÔ6¯}º[ÔX…~-YP꜆î 5 \pRþ8UæÄût ØXŠí©úÖÉ¢„›MrEŸÅgâËó+yÕ±oÅäú„3±ÔT{ÓŒDú*O²ÜXy‚Nå3…–\Tü\ˆ({RkJ÷Yvõ²³±é¯7§öËtþÍwhpÛ|—”Ýä$9¯oô øÇƒÍ²v´Êݬ†æÊZŸ£À`C´Mš“³Ýë&ÖI6e)¿Î™ò¨Á†-¾º÷Pn/kW‘qwð×­ÔE"ÍÆËå¡£ƒÊeqgL‘" ñ,½òš#Òéa€=•»¬Cðço¥Ë¸õ_¢;þ´Æt½¸V¿%ãjÞ(‚I…Z‡Å0ºËË–â,mã È8Ï¥•(ÿç<Æ75„9=œnìNTÄ%=|ÀŒ± ³ P8–,’ åÞO`>Œu AaêãS7¾I³TÚ<üG=»<]?3z[-Ý°å ¼Ï µx°þ³ ‘=×QµKãÁˆp0‚³GY…««V©u·@nNm¡‰~Å–îRRE#Z‘°¶òåûe˜@WmQîM¯?šøbgþ.¦çߟÂýßZD‘‡ËPš$O.$5³¶N­ÃY¯[Q~¯ï[]ç ÒÃ=ZPy®úÆbM²5¨¬š¸ %mÅŠkÎ}ýV†\||V‰®ÛC­t³…ö×¶&¥ýÄפXD×`°fÙSê¶´1%»pĕƇ\ÙÃïÖÆÿDûä`J" N¼àCÚ²Jôp.ôƒ uƒ‘F•mÁ²!›zÃîu2? ÷ÁøU¾Pá¡—Çp#Dø†N};ñ_s}A’>Ź=c©U t#U{(Ág¦¨ô­•™ˆÁÉ/c(o«!|å´Â.L‰G¼kQWü¡n%”EÉz»ß¡Ä¼Ì#Q@ˆÇhðÑáã h _®.dFñí$†‰£f%–ú—þm‚Žñg?ï§­¯ÓÎq¨Ø‰_Ó›·@C8fcÕîÚÝŒPã‹ÖKh&4±•[Ù§“è?i³% l‰µY}'/n cP‘?D5 L™ ƒ¢.)¶]f6ŽÖ©ICjwÉN÷Šøp…wÊ[âüb§nÐb½åcTˆ‰i6ÀÖ½¸­ÔÓ¨à™áC…YETÃ|ä5êÝ7ÿ«É~Ô7jÆ45‰U 4CJcæ¿Y*m¼œøQÜlÊ5°ëtº•«ÙV@~t„=¼ëf°[ŽjíNä_àMÐ5´%œÄѼÔ˜+CxL¿T‚Ýâ»|J]Ý+Á_ê/žP“‘àûÕ†ÉûY¢&!ÓjRMSÜæP8×·˜ Ȉ½ÕØ¥lÞ ÿº´ªÞ°²Òé’/îÕI®Óð‡B[ÀS¬ÀSP|}ÇLŠd‚Ч\âryZQ,HÄ©S%üÒÿ­ðKïдP(ÞáßiucÁ‡›TS¿öxu¨`míÝx}£ì€&Z±•Z©/À`—{Áèþ…p€¶JuŽèdÉ'·â2¶UŒ-5$ÌÞ—¤7ºÜsTþuÌÁl=ÆgÜ #òØÑ…à~*Á¡ØþpB%!F0a€Ý/ñôà.tc § ðy`<:<•â'Ä"Éj …Çè¸èDˆÙ9•WýK6†ÓîiZ÷·_×&R×­ƒb·´*'ÐÈùª™²!m± Ô­šYâM¹ÑÀ÷ÅåÖ QÇ1Í–n³.ÇÁ¦Ùô•Tfú °‡Ø=ì+f}å¢77ë•“Y õhÒƒ°ePPʸ ØnÜSû1ö?UµJ!£]ÍöÊ4y*iyjGœÑ=(HÏã4aÐ8GkÒßç©$™‰ÎV7P¬°°ÂPßýy%5&*ŠáÝ«H.úÂÇ\ƒs5·.3ÍËËhÐ4ŽyT|-#6T u‰51hF-ÓÕ ‚ÕK®šì{Å/ç×ó#ƒq7‚(Ø¢=ûÇ©3‘¶»›éÅŽªpôñÜY@ gŽü.ŸÅï4^ºÈÃÇÃü¼HÌF¥W-õùÏì8¤?ejk‘x?-©k¦ÃèùP0™0O &Õ?‹DZ|€;~$Þ§Œ(jó½OÇT;">åßX§Á;Ý‘‰„ *®èIG™5[î¢Ü´AüA‰~ÚÂJÚ{ƒC#¸Nq«¿qN [e¸]T¯ÁgWæÀÔcñ!ôñDOÍœ‘ƒ¥ %•L5:žð»Ö9° ,°Á“p„›ß­åÔŠUƒ4á;ù9»Ú¯Nd¢ºÄqë*­GÁÄAIÓ*efIïy÷<(¿åcOAÙŒGG¿®ÜJ!Àé¦<¶$_¿óäÖø7Þ&ißPÈkïÙhÔy*¬æ7 „3M|ïCáÍiá–B…LÆê§Ù'Ú¬’Ü1ˆ‹õñýº6ŒÆžûVq_|i1EæYar%<ãPAkìwTüòŠa`ŸK<¶k-¶±щè I1ô€¹>Ä%éCr¸ RML…HySá’Ë5 7Œ[¹p?bRÂ.ôGsM±ùÉCU9h²ˆoÀ02à…ˆ…V“Uþ)ëÆÁN-­žé÷ÿ¥²„óDŽí_èw|{ѵ±L•¥jÞšBˆ?÷\Õ¨ªÞ[e-•Z®q–lmÅO­Q‰£DU_¥”¾r>5J¡H_µÓí9¸¹Þ¹¯ÎdD ƒ7AKîÃpx?Ø0ñåÙ™aX.EôŠí<0Ì™¦Ý±$C¯¢zÚ6a°…:xX%Ë?í Z³æFw¶´@9Sò·Wà 7âŠ"Á½‡ ò‰Ï\ñô%‡¨AðƒmÛF‘Bš)&Ĭ'½q›—U©O£)8p_÷œÁÿ8¹ñô$8õµÀVÕúëîU^›Îov»ozä ¤Ýæ‰Ý)éñ'ÂDSœ²0ßá$i7¦V»îXÒŸìOtLqgQª´fFò%—¡÷Ã;Áüå䋼{±dª»6zðƒŒ(ËÄ­õ³Ö%èËãüÙ×A­þtÛr† p¸<å0í’1læµZWì2GÉ»Âr΄¿gõ­ž¥À…â ¿|vÚf®É“yîP¡}º{6ß1ÀȺWË:…*oFtº„<45*I—ë½W2ƒÚ˜ñ5 ”DŽÒšÖ©Eò7»ó…h†EÔ¶‡âÖ"òJü3ÖôKumR†¥‹èÙˆ/¡,ÝÁÁý4 }ºâU_æZãSËÒ`Õ…C;üÈdT¯ˆ  F.ÛwãO’ÀÌGKnÚɃðj=ù•zá¬y•Øù×)8,>°ùÿw„zE†,uÑY°hë'ã©7cš±ž–ƒÕƒ¢_¶@ÙêÖbâVP<_1Lô5]Ì-œç~~"á&§]Åðçç=HÌ[%Ø_¥à†ø•·«šWíÂ'pË8'YMFåRF&@‚ÿ€^ÓŽd Pó„ZY„TSÕÒô–á;U’ÕXƵÞ(887á /Úg‰4i;ï9­û¾É€w²ÿ"Gò‚Ù…È72Úp'ñ¨ÄÖhüÀ÷+ÇæSY03TËo¯/tö$2winËLžÝh¿‰ñ8W†È¤:Ûù~œÝ¢æ'Jíø»èEÏz½vNŽàÔ—c"sbˆáò‰Ñh¨®´Ä:W)°ÚOZ;iÁa†ù˜—2°êÂÊdÁF~”DØAêaª[ÅGHÔpÕ|å¹ò·pK”¿YÆtÞü«–¤Ñfî‰ü?¥U'uP ÐH+´WLeºÚ¸‡Ùâ-üÂ3b4”Ïi`‹Õc#V¤HïÝ‘*F·mI ºpke$|n 3Oc’t‹Óˆ»¤½Â÷eE}e$íY椹í©Ôù¨.ÙPƒLyaígbÁ,RË;ïEµ ŠÓ.kÁ§ ™½,AGì·ÝÉTÕ€|¶J¹póã»"Â'{1éee‹èÖ ÕŽ÷HU:‘̆²äpÓÅ2eºþaíJ¯sìg¨{ÕÝ.Gn]8V®2ˆº¸ÔæDò)ñ UbXn œ†0 „Ñ”lÒ­ýlؘ±â'¯t.˜û>óËŸ4·zr)P.rE±17x53D1lWZ.ü}U+¾1H.Ö„DÌ-9:£,ëV Ÿj¿\½)Â;6m”qÁ¬ykª/ú› °iÓé±÷PøµÊQÏXDÂ,€£¦ mÚ±_‘WØSû6©0·ËüþèwE8Ùç1tµ¡«føÅ°Dz¼‚üäƒÿ6‰~ó˜ØÌžI^Û.o˜@( 1€fçtõn>……ës&HGC4ýžhÚÙ³g _dýR Âè6=êƒV2„Z…ÎÂR»¶bü]'E¯ævQ$žÕçÈ1q´õÜuêûLsÍõwÛ ~(qž»Þë/‡Qa¾}ùLÿ °F"Gk`D¨`‹ä&¯ÒÒÍœñ„;•Á¿×®”ˆ½>ßc.HÉ—[ m2ð ô_z,[މ•"à®p5•kV`CšÚôÐ7~­VÌL™+<\× ŒЖȆo^®Ý"£Aü|ÚÔ>b E¸ñÚüÍrÌÖ¨w!mÁOýn¼—æ´ˆ¦Œ¢ï-c;ÄßU¯åÒÂ*áÅW§‚–<ê˜c:ü»%ä½¶DIe@9 §Ã‡uÌæ¨ÁÕd·ÆO~…õÞLmß¿ ­PÓ‘XtyÜs€þ<ÞÊTnÕn_ýÖB“ë(V¼ç„(_¸v)è™bæ­ëAQ ôLy9›ø†#x(æDyL8Àغ¦‚NI°Jž7àÿN™sûX+9¥Vª¶Ô ma)3èX¤†‘e’‡ö²"C…' SűÈAíK¹†r£u÷VÐVz3¯tû#Ψ‰?*ÀÝÿ/Ý•RZ o>’¡|ƒûø>ùªæÔ™|ìÙ^Û¤L‰9}L–Ám)s—7ÈíÌë¡ûQ 6Töì-`oý‚-ÄF”ïŒ̳}ô?=þ‹¢õG߀³öË…† ÝÇ ¨nRÅilb‰Æ:T5˜z¶ °Á4ê "6ó‡+û}¾™Ux•¶v3Údödz9¯”=2`õ0 €ø>ÓƒŸ#—[ì{²Øv£äVÅØ‚›^ÇòƆ?ˆ @@4ÇûÔ†x÷ # GÒŠlL“ºWùÜÊ\Å÷Iv¬Úm°´DæÛ.ÅZMQòCÌÀHÏ#ƒD¿´T³Ê4wHòxä)QÝÖÚÜæ®ãÊÞº^`æ¤l¥¤H£yû±aˆ®” ¡/èj—?6 (îWøŒóŒ KV†5rJ¬HÕ)@ì/Ñ‘ÄKÄЬ·á]ßU¸®aÒw"h½ˆÖÕAûL…}ž%ñßá˜ú噟†˜™@ƉäSÁ´%Å¢×Rµ; côžé&2eÑ„fEqë„›ŒtD;‚'aÚD ŠfhþZ˜šÅ_W µó"ùÞ˜¨f9ù!á´4&ø ^å’Z»Ng(ü®{ÕÞã:–ú¨¦AòIV 𚨴SŸn"ûͨ¬êjÅç½ÙÏ.O1PáÚ줚Ę7ÃXˆ€ÙÈUÒff÷áHãáÙ§‰&—æ2ºÀi<†¿P­nO_ÎÃ%-狹p¼óŠÛö/íñ/F‚ý9Ït]¶qÛù’Ÿ>ö¤P4RðË`£>Sãë”–°¯Ð`•ÅõSÆn""M ¼²ÀŒ|K=©€{u&Ü"°Q@ž»÷Ÿ=¸»‡Aë>š÷ð;ÛÌ­9¾vF®$ÝÞr«[¸erœ¼Ð HV Qp¸ó¶làÚ·Œ ÃhÝ&Ý k¤7;€³^yHï>áôS¥×RFSëjfRì<„7r2RÒ?çôÏÊF ¥ëI]ðŸÁêŠ •ó81AÝN;µ‰Í®ÍwŒÏ/<ÈÉÔÿ¬‰§Týð´‘=¾ÊtüXž#‰HM™ªµùm+Lâ.3šðÅÍî®Ýœl—;î„àΞXŽsËÜL˜è¦”ÕÅø'(Ä®ÄsôÇ/~wK,ózb3Òåº4$sýœ„Ð'=Q‘‚u~¦3³èƒãžPÀ¸…"Öó[íšöVÞbûhñXý&Ï>©µ%Ó€|XÜ9u69%M£u9© |üGø5…Nî É€ÂÕ’ë±þt/‡óVˆ)*£V·L¸I[±‚ö†ÙŒwº[`”@¥ßø Ç\1ì\,ŠL,Ec$ôÚxŸñÔå~ñNš^)§dùV5ýYùœà¼ž¸pZ“ãSµ¢š˜Û¦ÒŒ®ºFy‹a±6Uíº°Ä<9}#dO¤ùj\¤xe*²ïõ7ðJâHÎô|Wy‘‰Ñ›zW¨j¤7v}Æ@mêÐ Ëœý&W¨X"ƒàøkTÿí«¯y4¼£^û@G2*ýñE‘ZH â.•픹R$¿þÆ(‰]³¢#uM”ØVì‹+w§-ùoâ1X=çA¼¸Es2MPÝÆ °b€¦&kÞprG8ϺމlÝddõ“A(Δ­ùà½'ÿŸ²œ©Os¨QWãKÄÏ€\'5¤CíïŒ~—YÓ÷ÕŽãù`:òwót‡Wjc}¿cõ”’+$ÉB ×rò1Ðo©­ÀbiÐÝÉa)׿H S„”M-±:¸& ?æz›ïÆ×L¥–Lj³ ÛªFýg<&òDF§ºÅ³öÎàª\ý~²PÂÿ¹¬ÃLÃêÉŠpÿKèŠÅ Æ´–ú®§=­[¾KÇ9û7c@¡ѳ¿/G †“'L*SÏÂAYô{LÞN¸Q› LÞHˆêÞȃƨ[ä{ówçJýÕ}>æ:³Inî(B©cõï^Þh)ÿ}“ØŸEB²»•ƒ%Ô–ØçF‹2çý¸ºrã§®ˆä5{¨‚F 6Ï. ‰rûÙ ¹ëù±Ø2¼Âc@ÔU°D\i…'¹e¼´uyÄ«+mG"}±è‚†ï ÌÏ£s''‚°ú1¶Õ“³XƩ˭2ÍVÇVõñ¥¸;;ºÿ)¯Ÿ²•JŤIuß&ØäB^(aG» C½vÉ‹êœ&U„[¶ä\Ï–'Ƭy/Yeœƒ¨7§øBNOÓöËâÇxq̲^|†Ó 9% üe“ðFrz9 DÐ6@ „%G8;¤«“úPc2×o——û åíž°Ž‘â”©¥ÚÅ$gžÛó»]‚ìèXVõ0Ýn°B`䮦•ê<ÎN®ËgÂáׇ”Í‚Á·ö';!AøK5J_]lð·t°EµÈ‰z¹`ûßÍÎ)î¬4!€÷¯àº„„è-Iu5O$ðO¾¹ªDÁóâ–6¼ýMS¢Ï™à«l-»jqâUœÑzÌéSµ0¬tˆ†Þ&[M>¤ÿ)¸,ö !;Ƽ,^€ÎÖ– 7ùl«™çÄ P¥ðØT]"!œìŽ=+yö¸ÿb6âá)„Jâ¿äðÊw"èÀOÿݦph—ׇÒq(ö•%Gí^E…˽¯3ƒ5ÛrÙ<¶¢ï’9hJÀ”–¯ÜlŠ ã·æ¦ânk}ÙV",²C-)áÏšy&?'°çEb$7ÌÊó¹ËCªX¨¼XÔ.Û½ ³‡/ê4¶;§ßH[–Dz}ú̼€ÅU²÷}43³¤ê)QCŽ/õ‡)ê "CkróSyÌÇ»/\ ÉB¹Üöi4v£ž¿{cgnHDájÏŸ4Ïßö*ŸßÞ ;1æ‹Yvdå]étâþ>²ZšÚ 2>,¯YëÅ1%‰ÞJíEÇl~Ž¢.[HœÐñL@»:© |+p “Žo7ÅæõŽ;9Àñ ÷e^óÇCP‰9·–›ä˜GDk4È:¸Y«+›IïQð”¸Â(ˆÙüÓŠr¡íœiˆQÒß›ÃXª´~÷,¯-à·¦ˆ®õ¢-Ó@ÆÞë_¯ÆçÂvqm6¯Üºi„ ›ÅK-,HDÅ„{+”190{ãÉeYçl«ù$&«6Ã9™—ç^ÜãÀ/ÊÆGšlL;˜ºÊLïhX·4«‡c«¸€­à?µ- ©¤¿4¿ïÏôl»˜¿8Ç­´·ðé¢zèˆÚEJfy*À׿ÿãG½tß¿wÉg áo+ˆC#òøn˜ËfAáÓËÈR:I~a\&lQ³GyÞ§.ˆw.tqûÕÆÏ a£ÍÂÓ*á:±Vº1M)òù{–Lð¨i‡æ>ôAcÒ¿UºŸ'7œ0¡wáÂ.¦Ä\Ðï†ÑGÁ厛‹e³¼;œêÀéPqƒì<¡PrÎÉs€ä·1Ädùðwþþ¨Npóë?ªœ°ÃjñýŸZp¾”>…œ¿:ZW7La0Ú°,ߘs¿=ÛßÖ oG±'2|ÃÐC_®]ÄóŠv¡A•ȽçR¥÷^XR½,iG¬ddS§Lu×bPð‡†EØY‘½*={Ù¥žòþ-Kž¥Ÿñ_87möÎç°˜€wˆØ^õ€•ù,:M «EÈæ?v°àåÖV_¦<à¯K³#Wˆ$vEΪ2¨/óUÿÌð§ç/±76–VÒnc÷3ò9àåëÍÔ¬é±Ö÷¦ÅéwbÓ솠' a¦¹òBó=‘<ÉÁËáX‡ÂI=5í‹*ÞЯÒ¥ÓДrþÂèÒìþG­b!ƒ“Éí‚ £7¸™­atùUèhYy8ú ˜í¤8]n ³9t}ß-òiBÖ/k®lØOLÖvK™–§»®‹¹ ?4^3p9$âßÜ;’ÑÝñe'€ød Ô\«†Ð{³“ ûž ªß?}Ò_(7›ÏÙK§¥ö+þpMî»ÂCˉÌ!§WþÓ¾;”®Û‘oTäWÞÍ£JàhµYŠÀ_¥¥ýßÖƒø8)}¢Ú0Br¹46•Ž8À^€Ú-zÆ®L†¨!ò®¡ˆ×…œëí½³‚‘ÛªÂwGè;#-ºm‚ùu£µqÐJ$SÉg„¼Æä©øå½LÏÜÈô%]̰=82´wmH›´ýŽ^õ›?Âúyçh®8‡ï ú¨¥€h­š‚6îÉi Âøýa¬P€q)¦¶—.‘xƤê2CÍ׈y,¸Óä$uo™Ùé@ºE»&l!¥xÍN±›wy.Ë;iñO‚Ć-‡Ãá-ø˜b7Ãðc+Ëc³Âµa§H.úRÒ};Œv›é÷6 ÀÙ(oAʸ~4UžN…gK'×áè³VL}Ò¡¦QŸäBÁSñ‡j·eXÀÖ3¥¶áT‹¥qB³C½C±¤¨ˆp¦Ô—Ìng@øÙ,Ý#?(ý­ð&°ÝeÏÔ#Ï¡>Q¼<$¬õNAñ ×ô罓ÖÀ3êŸèSGRÿìëQÎ{tï0ºxÄ–Æ{¥úy÷R]DEg·ºc»•ãš=æÒRŒÑ{N°-‰Ê/M‹aØÈ¶,’ E5Œ9ˆåqذEM»ÏÕã½C­ECã5ô‡<ˆ`¡H4ŠÃ¥ =ôÐ ðCŠÎÞ›TèÓá;³M¶6_í¹ÏásôLȽñýw‘ÅeM ‚qE?`:hî!ã6|¦ÛêüGq%çp°Œš¿Ð!Bü1EÏͲXp–·²;ôy¸AÏiùi£±™Äý·—/z¾î)µÏ>¯žÞ`%2®Â§Ø¤·z ÓiÐxŸbwmdÅöûw·Z"‹™¿Í´ü 28¡¥—Ñ!Ç’Lü\²X#dBøÕãÂ=pTË;mUxÁÈëp±?²mæìDt›qî×>Œ4Da=¢‚Œ‘ÇÀƒ¦E!æHR>.iâý 7)ƒd`Ü~r…°Ç±¡ú ÈÁ¥âÀ†HŽ—)ôcÏë`0 zwõõçÚ½‘‹‰ a Ýì¡súÊu”I—™WÊö—ùëh*¡å#\20ôߨŠç~¡ª0œ4ªæ‡ñ<’'ÅøÞO0)²¯ßÎ$Ù*ù À9LN"¡Š&hzÊ:D–B¨5äц†JÞç·˜lÆ{[в¼~‘¯ì¤žàJÇMAŠÔ©@ãÔk·FÇ·œ»H²ÕyߪËp€¹›ÍB„Ú¾Oõ¸hj*·@]˜%jßñ²ƒ\൶ȸ]ÜšlN=’ê7@‘¬E«ÔÎ’Âv>Vòw`® ýºêI*ØÓì‚ Í¿m½’A‹;ô2—ƒä²ŒFeù>€z;ûëçM|øÖ8€X4!¼;tKŽšàO…u9Çc†YC-¹õ؃ ½c78]Іþ'7äÛlT0þSFß®×5ö\³òö,VM}Ë‚iéÝå9¤÷N½àn÷“¬ Rqºý(´æLÎàÝLd‚ŸaVÁr!&ƒÑŠTº¡¢…HúÑÔˆé`/Pê¬Ýð‘t5ü©›ÅÆépšR/4¶´5= ¼JqC_]òɪQ>ÊæBáŸØ['ÜfaJ-ž{L…`9™Œ6#žkøÿó|OEyœåoècš2EÓüùäØÙõ(œ<7N£Â¥ ͵‰cѿ욳PÛ'.¬Ã‘oĈ*24%¿ñ{Sиñm ¹&‡+úWwÆ-}Y°Ò‡/þkY@°}Ó`ÜÞdbÔk pnŽç0³ªÙorYˆoMáƒÏêÔØ¾–ÜéƒC<òWžZLúóÇI¨ Ìzà”ûNɪï6{ê0r·Ð#ó¶7b<`8Iý~{ÖA즴-y%, D)ÉED°_³þ-=*L É›¬æF¼zqŒŠç/iÚ ±”û¨ëTƒ3]Æ~>ð‚IÈ 'ÊÒ¤ _Hžµ(É5¿r„+PñÙ™¿yäÜ#ã ðù~7¨?_ã0"pÕÊ×^ñm蕜¾ÿ.ÌUd _m5 ’™WMPc¨mÞ†   ¤™Ú{ó [ =ù (!™<¶›(ñ Š|HÌë¸`+ªnèÀ ·…»¼œ7N¼ÚL O§ÄÄt¾;¤øpØ3‹â°g½Å4ƒ_TV”Üb.£Fèåh@ïœ3°Ë(µ9·Í ÔÉgãÊ!ÈxŽ„·ë_Ú;hÍfgJ5P w/ˆÐë,…½„`—>|¸¥NÞ)™kg©lm‰íDöÔ± Ÿ[S³ ^}W ÌϰÆã©[\à¾bz*Èø՜Ôt;Q(c?z%mö •*tѦy’Å’À˜~&ÃÂma‹Ïb=Ò¿CLpòLCTx&|d¤iBàźd+Ý‚Méã*RÞLô¼YÂn!=Nš÷¡@üÙ‹¸²Kr`=f—q! EY\˜rÁî‘ßù­À–ÀCW¡§@`ötêhÉ€l?õÍ9 ÜÿšG”_…Š!øIUçCÑñ  à]‚|‡¿Ä|…H–œð¿Êö ÚP+ï¸É¬Çà O1eªS`23ÀÆÌegDE ¾!‚‘Ñ@ð÷)&—f£…­aKó^ºuÃý ó …‚ˆ×çÃ^ç‘Ì76vZ~ý@Á®‡hG­lüˆ!n.çâ>‡h lPí›ú®ìÖþBQ\+¨Ï°îÛE€g©¬¿Õöò z,‚¾…8Åý.°Kr{°’á.’'|!½Ðks©|è#ªÉeÖ7•Áò$­Ø\Yv{ Í‹„º,0‚á7”ÞE{^Ù_åN^ÖrØÎØ·à@ž­Å'–Óó«ÈJ)ÿTngîÄŸ×!kÊ7 gJÈÓñp8™Þöû‡\ƒà§³k9—ß. a¼¾¿|Ôt(IçÁØ“É/×Qµà—žÝð–þUsöÄÕ}6¥ ¨<Ò„ZÈ©S ‹!ˆð¾JUÞ~V®ZwȺœ°ÆÙ%´œý¿¬l±' ¯èéhUôçÞxa›¿Ú ôTŒ°‚‡¿fÐå'æÃ˜VPÖåBOF#Àis+ˆÔÃ¥ÏÑï¼ÝHKg¥ÿp‰Èˆ _§G•þÆÀ²è$ oõq”Ó{—îÔ‹)Ð'~p ñ¤I-§*8Ùà»&§ËÆ;£åÇ ÝfôŽaKaU y"“~‹ÃÞ:p õP„øXÝš|Ô¼‡õì$äƒP±hÃþXX±¹³¿”"k’µQ"Ã×§óþ0¥ p3‰êa,Œšq Fx¡»ÚÂÖ_ù ™¤]3Xöâ9ýˆ'9E7_g3ýçmÈQ«ðKYr¨O½¦ ‘»6½1Ûµ=3 +=+¥€p˜DÒÝÂUÃÆànö°àÊÅš( v›á°êaÃŒú׿ ”a5Ί>FÂA‹–ûY-õ{o`b›Í™>|Y¬Ý" ê¹&ìÖÎn |wÚ@Ð2ZªÆÌCÌKzÎ4¸’_ &A8g^¥/ïàRÝÕóTÖMHˆÆc™BMx:Ò_sX®Ú†˜õåÇãÅÿ¶Ì§;=ã'Ð_ ñÇ¿•Ë)ÏŒxÍŽu jøî>NQ…ñú‹iSñÍÝrÕÉ‘I›á=Âöb£½ Rhè*~Þú¹i­ç'§"Ç‚‰h˜L¡Ù­¶&$›@´E,nLA”‹läTFÂ?kÄ2\o»¿k$h.czË ¯¯h;j9ñïŠ9/+ÙƒïJ·Ó¶±_.ÕŒ?°h‡|ö)û­Œ†~ñÍÒöŤ×(DiÖoÎFAEüô ¯È<1/¡Þ/1¹~eÉ{ÁØ(hºçÛe-d9ã²uµ§òŠ‘Ÿ÷¼™$mŒ“/¬C×#å"¤h8œ"ÏöÓÙ6nº†o“ÈBÇ_ƒÞ™b…q¾ËøL´X@mK¦[øAžŸåX{§‡Ù_aÝ1Ÿ6HCÿ¨¡HFŒò}GþWu“é pµ”H)y·Ž¦ ®[üÛà(ÇÆØÉº~p)n޼Rü«:mrµ´ŽKâªØMè'‘b&;¬ÑFt(îmâDn“àùö]7o`öáát°®#H+¡Â íHÄœÅdÒÍ m«(%ÐÄåà hI…Ž×­×÷<†Þb€å3˜žä ÷R/kÛT9‚åÏ„wŠPRm¬ò–M+Ú}ÏR‘µŸé7M£Q+´QÅi± [kºbW_ø ¯mÜÝ„ÿÙã4Ý w¨J¼,zضx1;ËS[ä³âJ¸ Ï®¥`Ov³R²ßßtQKýlæi%5•ƒÖ~súJM»ƒ¢ nQ|ÿ~ö’½8 Œ@fñïÆÝÚ“L5Á¯L-Iþ¸–¨Û\k ižÆ ÿÄ#@Oݦ™&G‹ÃafþÀþ4/w èj‰ÌÍbŸ­%-ãº3â}viž Ë¾gÂB'k×I8‡ü»¦«\FCu|5ù‹~Á¿ÚÊ<ÚF\ ]™¿Y¬@Q€)x~^BÙœªE0¡Ê=䥖ZÆba™Ä‡¯YA‘U2Ÿâåø<_£°ç«%@&Ï>h5zµ»ÅO ™è;:éìµ8ø&s°¡AøUÑRnoÙŸõ ’ÁÛõ…zËìN€;Sw4·.yN+ÕÖ”ôׂDr¦O˜T€ÌÎà,+`8g­I÷|Y>Ý—¶÷m'8½Œ—Ðoa‰K×ÌÍ`øuà¢Ìˆ¸­÷ìì:Xðéø0î†h >xã­/ŽRÖ³)ßȃYAÌ6BÊîiÉ^x7Þßôѹ޽vLÑ¢Ô‹èZ­OŒŒú³÷1+,ÖÒ+€qdb·¼ ”˜¥ K› 2Ï “hjÅV\< ë©il¾såle·ü›160÷03RÊ!éBm‘åÓ™[pô“¼. ;Qi+¸t]>æH_¿õÖ™é ™Éæ»,”¹2Ý¿ 6cPezB$ö‡L-€uj0uw©{ç²õ¬_Ò2´Jêvt¸éaºÂfø»ê`uÛEILNSŸ(4P¬æ ×5î7â¿ÏÙjóö#)Öý©xX¾ +vHrd ‡ÄV÷ÿ½¼n1häæÏ¾ÈmS9‰ÖÌu =DñOÍNº¢Æóo¨LŠY„^ "y³&h¾aïn Üž.œ®à TÊö"È×&±Y^{DÞ¤ÉR„š©ã"K‡ F#\N+•‚èá[Y2æE+ám×<&ÌlÚµc‘>¼:wâמÁ#:MRÍ“°tA #T7 bÔ@/W]蘽áZ;(-†'.è ìnÈ×·^;")?²)E™Ý]u¦Wâ—5‘ã—4â8ÚoÓSv _Ì“ú ëõ‡x‹OÞ3¶Çk_x½ã·´²ôM áCÿx<î3Ä_£Íd&—¨‡r "î9E„ññý=¨"æCU¦PÙ^»„¬øö]Oˆ!Ùk\ˆH ¸›ã¼´¥øæK&‘;«P¬rš/^/¤ÛðpŒ}ÄßJøúú’q™kƳ1¹áî‚M¸¾C¸¼„†iûtø¬EŸü¾|!¸Ë°8 <E˜âEó«H›ªSÇiâ`² ò°—̹ÚUùÊÇ‹\ÁQö‰RÕ.­¥Ÿ|Š€–êëÕÍBÆe²—Cqi#ÂÆ ù¨¦¿ÝmIqbÀì®äz2Þ2:×­˜ä£‚JML‡J)¡læ©MP²v<¬Ô»ãêA§$]ÈÈù=Å}¿Ë¢ŒãâBô‰ÏÒ•ãU0›Ûh×ÒP¼>¿bß„b|VÈÚçâû±ä˜%$—å‚ ¸¹Ðo‚[Äa$Ñ>Ü8¬f¬¼jŸ1M3(Aßs³¾êoÒàšYÅ´Ux ëc\·=‘Ø· _§]z@™8Ó9¶Ü¤Ý‚Ì¿üC›ÜæI]lS/_S¯Ø$Žœ› ¾$Çê(Kðû-Pð¶ÂV%ÿ´5†Öì”B.}e&Skfñã,>´&à ñ5˜¶P€0b7Œù ip»`âÚ!UÕó™]ÛNuÖ,ÿÛνѳV›%KÕ^#6p»ÍÐ%vÊø UCšðC_蘮$¼Iêü^ …±ðRÅÀ.éœ+¡ÛÒ¤T®ƒÅÝ.¦j+èLT9:ã­Ѓ±Vš=&‘ɹ’ØŠâÞçð7ñ„kÃ:œ§‰ lQ/í@Ã¥” ùwÕO´4ÐQ+Q—ÞKéj•ÑxaOøqÊ.eá‰$ ÈtáXú +Q«˜Ê»ÌÇžØt`ÃL#]¤Í:H„²Qéܬ3Ž˜¯)’êxNŒ¨Yù]ú™¹©ÿŒÓ¥kÿ†&ƒ]YËÅ=epΘœ“€Ì¯˜Ëû¸gbOg !j‚frl£¢Lê.„"ÌŒ®ÐÒÂQýÁ|˃ؽ™kò=Ùò/RØòitÇñ+·Ký%Ñ{Ž’bÜB?°ž#½{gf™‡ôÐÝ,ú^å½kx‘»9D0G„&/‚…¦6 ^-7^gþ³þÐñj.™ÌäÅ®=ý©ËVÈ”ßOù@¹‚ÅŠãô8g;%î»T\(ÉL&f€^,êl‚b‰œ›ùüaÔ`g8ðù8U|„:ЦåŸÖâñðÆ%ÞÄKÅ8Íp>Ô¦»gÙÕL­ð±žö[ª“;~‡ä•Î[|±S#{UbI|û°eúð+:¯( r\a@J£ªsI[vÒ†©ø}üd<í<¿fr'ZŽšñù{ìü½?QÃß~Áa¬µ[é{n„NdïÔaü‘i|Å/NQØo¶™ÿ È0¹Þ¥ •TÚ¬ÄtM›Sz^؉–«eÁÊ·6Ù–n‡‹Û¯^Ӭˡ%³ &µÑ’6¤üˆiJ:|yÐaò0›C{e¨ë¨Á§,áÿuµó6‰',ŽC•AAbµ%ú)@#q>›q™ÒS—¨ã0&'¤„Mò'ŠÑ@Ï.`:ѸÖm%í7$™Á3*æÜÌ @XCäû Ãq3Á›!7xª+m‹–JÙ~½¹®»^á^u¼<=zàjk¡´­5ç@‡ïN§Aåõ…^2VŸDôô¸Îð¼ÛzçÑ[‡ÇÖ¥×s-¯­–¹ÞP@s'O™¼–žWŒf Ixš‡Aô²Ü›©Ú·aÞ»:6¯šÒnØ/›À?Mj723-ƒáÎ ’Lê¾eÔiþ+á%Ð3Ñ _ ‹ƒjíÛ¤¯î#"sÍ>´^Mr÷µ¦…Ï€ÒŸäKE2Ç¥Øñ‚µ 5=éÖ IÕ3â‰]}èa;:ߟ²)IAPù[f°&6 êùZì.›Ž<º5“ó —§¬œ¸]Eÿ’ÆvõTHŠénEÓÛÈiN:Œ”;.Ô•âjJn>ö?0TC÷Ôܯ,õ'gBùþoG‘úéZaý—\É ¥Îp£™ñÅ¿‰¤³>¥þ42¼òŸ-˜?hÔ…Òú¨åè¯9c‘špÊÜ¢=ê2V¡Æ-ÅTÝöc ¬>ÈoøaµR§ ” pzƱée—L î‹Øî—†™æ-r ½Tªp[DÉÕànâH³[ЯØ8v (‘RKi¡ZŸäu˳ 1Ô5çhß@XššO˜Qƒ2¡­ù îAOU\¡ÿW!—Òœä] þKJ3Ž:Ûr¢+Ûy-p€Š¿šbQ¸§h)P—€0À7”˜ *oŸXÄ<¡)¶õ^ù,B×[Ó‘ÜCL¾Ëih'‰-úvú| ¬)\‰PæBnº5|øv$ìýÉõŽØí»& žñ³µz ~fHÝCûáèíÛI“é§çëS[@mÑÒÕÈQœ`»prjññ ‰÷õ(Éô¢Ç=ž$%6=D¡_#ô,ã[jÄÇ,!d¿>Ïù¢/s©Ñy×{¤dÓ°ï°lšE¬íÝñDã*9¬ŒýÓã&ò”E~ˆO§šÓ¥­ *™×h§,#Áİ%¾‘íT$±z7Ù"dN(Û„I_æã(ëÝRr…||ïþX¨â‹dƒŒW‘"«ßBÞwÙÏd)Ï"_-îD"„ZÙ ›ÜDq 8°ÁEþh†‰¾$,“à0ѧŽÞl& Þ~ȨuüDcÒx&5¥Mê•\~AÉ$;²fy-^™òíJ2×Ò@û ÿOQÞ¸ |´cG3ºïµ|ëžWúæ.H:Ç’ê¸ðƱÖiôÎkË~F¦Ÿ/xq®Ë¢y¥$EÏ’«ð¤4°ÌúèЇ§>Ôcs¡ædðyÒïçeCúŠc.²²g„'wtü9-O¬¼I'­óiЮÓQŠ·.µ›{°Ý‚-H÷”6ˆ-ÏVcÄ/Œè›hÄ=+…¯€WÖy*v€ÉûÓ]–÷G†®Þ¿1YŽ©kйdúÊžÞáâùÍ©Ý\i¤v©¦ ®Ð$F¹Í¦Ò‹ð2Oãûø8¨¶uQE;#Äü'€ªˆ£1ÆùQù"‘ Á—ÜÚ=‡<óO…²ƒjüÆMŽj°m@aÖä£x¥#|kqQpœ¢0-·DV’«á†cbIž_ Qìµþô¹…ô.“@W¾ç²?.ÃM#0D¯dø™¿#VÕ~9¸ &V0BÐLJ÷‹@ /sŽxŠþ âÔNkI@Š!¢!rò¾Hk拎rA7ÂÑ‹­/'Žò[†õã{f\¤«“Ø÷ý‡Ž9­°–¢Bèk¶Poã™ »L¤Tp‰rƒ[a-Zm¨:ãš4믆KZyCæ$ ’ŸÙ¿‘f‚?¾’oPÃ4*ö²Dµ|Êàý™íÌ·ýë;®Û©ðtU:¤ÝÆ—T_?´”ŒÖÑô#±ÕµSsæ‚b2;Ž9G{!¢?¯dÄQP™4¹ƒµæ`ÅþzKZ¢R¢­+¬gX„ˆÂ&¹ò+Ú¶eSÂÇ¿¡ -~¨øÎVˆMì²®'é%J5ÏíóîéÞ.,™ìx<üðÖ©, %.uû–ºý—*þngÔp›ŒŠ¨¬LÍœ¥¦Œ«%Ч/Qd2½ÿ½ý„ކ/ÊbÕM=+%½7­å¤ÔR]«_±‹P$|‰ã´Ú«Ÿ°a¯‚P’<¶úx½3`$Sdßh2]ê6¼õ¤&èkbÀ—ºØÌíРAñZ)NQ¬Üà'x9dB€Åâ›x¾9Á¤!ðû•È„gàø9sî*;N¶êLª]†;Ã7jfm?/{˜ Ñåà"e1 »Ä‘ ×ýÍâH‘KÛÒÌpÓÌõŒû %-o V×wÍCx§ÂLÞ6“ O ’Bm¿E³8’& á7Uôì¼;x§žYCÜj“¿˜ë,”Ç4JÒ«£§éy”„z"W98@ä»ÚCÝJÍú˜ê¯ÜG]á….^?oÊÅ2´“æb¦28º&“wPR3`n’Mù`HÈÝfŒ4µ–Œ½€ØwR  Xß-¯í‡†\2zd”ê[Ãõ‹Îjjê>.DÛ¢³Øáêþ†¨ÈÞÑÉ\FmàŽn;¼qgRï¥P;ÅùG£nv©!pDÎäÁ(¯}4- kóºþ~‡N»˜3ï*o4i³êð\ÏÜe‰³.ìŠÓöú˜G{W©}Ñþê=Ed*8íŽÆ kA)f¼BòÞ#ñBêmhÌþü›®í7KAó  Q*@­Œoí0hU š¨ž¬Tž‹Þ_´û=!¢õ÷…ÅÈ’W-‚È1?\AÓT±6WC[„­a>U(´uËÞhï¸W<Çe˜²ÀÀ»Àn-’N·^Cõ)ÿc=xEóÅmì‚õ»3ŠÕÅmšqʋƃ+Dú‘'@ç_;P&ª<ʤi9§œÝxŠj¶òïL-ÿÍ0Z«pø­j¥;¿ U8[8~Ò›îòS"_ê›kæx{øÌr’Æö á>¬Ä‚ŠÈ Nþ§N^è –\Ëû*Ø ,åŠmTæë¶±L2q‚àE:PZÐ]„@…v (ž´sÔtx¬;g>pY¥ÉŠQÃDfÓuѶ®'ZRè;_¼Ú°ælÿ•ÖpP›ýÔ,ô"^ÄHËä+(1Ï;ëÂÚqÂÚÈ<ÃlØÛ¿,|q2!Ác]3ÞzÊÉBDl›é©B‹ç9õøx\f¼­¶,6Mùd\}ljyv7 ^ä3kôvÁ °ÿ`ÃtB Þrr´ÌêUQ ²%ð o ¬Y¶UÏd^©æ( úwºCv"õGíý8«Þ/Þ‰á³ãù¹€^ÐÕç}³møð+âØÿ½@ÿéIÑÏPŠE8iµ¾'­+)Õ:ÒЫTSf gú+ØŽ˜0¤ò}‹ÍÙl—ìÙ•ÊX?Q ?‚oÎ$ô ŸóÖzyñ_BœR¹Å™]§tÓMY\ò—1vt*8ZKñÙñÃË×ôJ_ª]duGVF¹•=jÃK‡T·Í‹T \ötœ­jd pºËà>;è H 긦p„¤Á³Ž‘ZMÓ:V¯Ø¦X»4;ZÌ´æ%©¥ù¥À[È"È5íމX÷s&º}ûÕš¡8’"}õîu[Ý{q•¼3vp¹îâÍù𾇞ÅDõœlÛˆ¦éO¡¼¥¨ëÎe“ž<:Œ¦üÅ—’îÙ^5cV׬!§Îɸ„u=1ó ϧު­ÚÆåÑw:nÁ‚0Ê ;-dñOÓ±—Ã$üâ'Íë‹"£ÿE¤±÷¦±ÆécåïF?¯Žc=–û"iƒjcÛ·ÈŽ‡PœN=3%ŠðÒ“Eƒ=¿a¡ˆàz9Ôj¬ÞúƒL‘6ÕpÛ5YªÏ*šÐ³¥ä2) ì”ûnìyMUk`Eè0ñlöÞR‚&^žy¬w:›w9Œœ°v3ótÔòK€˜!£Ý‰Šÿžo¸~aõ›[Yä |¶lè›á ¯yÛÈVÛ1ë ùܪ¬[£Ÿ¬UŒ‰úU /sþ÷\§§,ßÉœ4#ͪ›Zùl}ò!K©¾(3ªÍa±‹c„Hˆwa3ûu%ò Rï!·@ôS™Tº©uCŒŠ{øXÓ–?7× Ú’*Ž^ŽÕ°´TÂÛ®4‡e…ª[EƒIyK¬/Ùrw‚Í«Çt~bc‚‹—ŒH›ò̆ ”'š=`tB¦.ÓÔmn\÷ÐÏÓÍŽEêù|Îhs »°æ3J•ŠðH¹E¹Yš oNwQQýõüÑŧ‚Ÿ_× =±…ª­Îìá ê•ßKÊ‚UE‹W|ܬF²«P.Àü¨h®°õmŒS¦ „ªš~îîÖèuƒ\Q¹™}G ˜÷–l(ß;©€N'-UË‘CNÚöO††ãÜ=ÚE;À:ƒ7I¢v|°Q°Wc’µ< ÌÁšÿ:›kbG UÂ.—;ZfÊy1Ñêy—ïŸòžK«´jdÍ‘§ó•œÈ"“$ƒå±'æ\MLo?jã!À^Ø?Ñpý› ÕM:©.’c2Î §—˜ŽBT¢´!/s‚Xú«¯gV«~ÎÀ;¢ÖëÀ®#W(ú¡µ²h¦ºÈ@ð`"#Ý|p0ýîàl,9—l–oºn3ÜEð×Fy›´ªûƒG¤…—£^æ#NÄmDÈ®í1±v¼\²±^Ì$´™F† ‘ON¶ÿ|û¤ªÔ@›¯Õ ¤”Ón©b ÙTï1‰kÒ§¯ÔÉö4·tiüB@@¹ñÁ5ÇÊ=îx$U¼RÞs‚Í,÷Ro ¶¼nzÉäRðZbRW-ÁŠäüé©{Îà%žÒcÎãƒÏ©X ¸\Ì®ÄzZv0ƒ€y”a¬™ÜÁLþv~ ¢1’’ÜñýVë¡ k.öG÷r · VÄ?ñ/.Ûµ c1²ï+нÚÜZ€ª‚ 3n4V¿_RæÖ®óƒÞC†9TæzóÓu3ê¥ þ ,Ã,SH,¯Œ•Oq7¯9¶Š½wG|™eõïÁazkeë¦è{·ÿÁÅšãÎýÿ‹‰ûK»ÑF¬Çáö%§)Ñw$åFã-SJú^ î`NéíÿqBðŽ(¼Í/ßÃk‘Q_¤§WE“›ÔðÄÚ¥Ç|÷¡A†—;’¾èj/gv)òÁ!è)”vñäÒ½›7ÀŽÀf%é\›Ð$GÉÃËNpwþ8ÿyh½g/•É"4nFãÁ‰j¸qÃïÆb«ÎEüwñv¿Ý=2 zß]F;qV©¾ 9‰Fç›;æëVz^54ýEwÿÏïyL(ƒLû€Iõ f4B7ÿLÉŒŠ·û|ôÓ”PÀ}Ž„ÇÆŒjfR&kkD1ß²1I²a6¹ü´ºµT臑ÀÂz/ˆ’ 'åÊbji/Z畟æðਢq ¥Ï8sä΃÷ÛÞ²¦ìÏ^i![šQ>- З6:¾í årã€e™òèEü!²Ý·xkuÃvÐY«»ðÖÅGµ?ºüYbÎ/íŽp3ú;\Ñå¡f.·r+iLjCßÑ †€­_dˆsDë“C Ö7n‰ák7 ²D¾èŽy ~Ï”6 Òv„6@Oe Oïù k\â~žÙ)2s(¼xå)û<DÏ»3FŸ.Ð,áRÈ€ 8(zb¨Œ6À;E‘5qÅÙY¿Ýý…¨Ë2lÇâÎ0 š`ç|mêÀr®l ÜŽÿ6ý%îþ´ù€¤œÙÓÂÝQBvRm•º &8v†KVµzk õ4®Ê£ñ¥HÖ¥f%- TJGðQµOÙ) 3Úù“j¹‰:=ò—  Jz•àõ©›–=§WrY—¢½†4ê„ ªŠ£ ]OE¯Ǻzô¥öR]Û0&yÀì.Î0mõ,yoÜ#ˆT?–?BÖߨ}Ù%‘&܇IJûŠo,^Í£{¦«k›;}¾EÇUýŠ)Hë(p‚©Ägàí$z@^”A‚NBCðÄÅ÷¦gK—õHMýžÙï”_Tƒ'K\@3aN‹üQpZçà›Dc¾[élínÅáÄ+\ÖhÚ·œÇ‚slMç¡ÿ“)«]$dåbá¦AWðí^é³¼óø,—¦ßÞ 3ù“­ÈJC²j|"oöYQ¾ì4QO­m FàÿK°þù–ÔQÄöbt™¯@­ØbÿЧЧÒÊ*ü]*x5H‰3šƒ~*¥f¶QT\[¸á)ë¿B‚K'ü‡ÎàÖÒ p“ M„àÀ¹â z˜Ï ª­‰ãÃrÂ2Üæÿ\feŠñxðSu]CÏϲ…X”þjÄÓ"®w¨mª'Q½“FÑzßGè GS‰;îÕvêïCBE¦mÝZ;/ÀÃñ¤ÝcNþ»g¼šm££»6 „~Sg¸ö€“0ž¾ÞOáv¿,LN¹Oš÷Uëí„>—É´Á tni\áéá$‰Æ3Ï^Ý™iuü«Cø¤8‰ÿyî¾/Lkªp[l#æo,g6©ìöòŽêö|r†R8ËiIv‚·ºðËñX¾Iä2…´:”¢±¢ã(Q˜° 8–PhlÂl®ØC¸3ÙMüÝ!eù=9½Ÿw<ª†‚iØx^È­½ÿ„W©F] ëôO¿6ç¢ü‘óÔÕVfMŒŸ½mÊ1±kˆ$ÉX™qF›Žƒ„JZ ÛÐíµ6®¾,ò‡ÉµÛÍ•€²~Ü9Çc?ù¸©¸ S±Í1­‡!ž£"HSü©ßvk÷›ù%øÎX¹]ØÒ¹‰ÙÖÂh¿£Gv|[n€[×}ë®Þ“Âúä/·Î]Í,+Ðø’Œà Áèÿ«’Ž\„B,´tº ™ßÿç¤Ä}GþµÈ<ÝŸÄß²à†œ^s¦vûÀ¥®Ñ€èxÞŠbTBMD—øN×:¯Õß5óaýÊÌMY°Wq½ª¤Ab Çý{ÙÎC׃~’ZõŽ-&Õù )B;%„Y1ÿ]äÉ2[Ö>JÎìù¤G)lÜÚ¯EAÆÛô¾°[+>ÑÆõúaH€K0èïl;O³¦ qzµ#pãíβúìÄ+èÛdz ’ðt¿ò< ÁÊñžj­'¡N‡óØñAîèÞ–Î`—ªs8ÑvìòZ¢eˆ¤´ýãku]ÏC¬à Ñ3Hxj!N€õœï%ÕF$›´± É¶qžï.bÛ/:d¸2î“êˆëP9FÉÈ0*©ãßB3zØÃ™¢˜&ñž‘ñ7›ò²NJµpŽZÔ3 #Ç ‡×ß×]Û°©ùå ¡¿j«' tMµêTx!Ø¥ k’*åËÈÚ³õÅ*oÙ†–¿!¢•±Ûä©Re›Óq}=[‡Ô‘Xi"kï/Ú\)j¼/õÿ–5`ìãP ^z;]Üݨe­ÛÂ52K¬ÛÁ­…‹Eˆ]ù('Y¤ê¨¿si©¸…2xÃ¥PÆ‘\­X†Ðœ½âwêuñnˆl˼ ;ÿG›&`o¼ŸA£Âªú:Wä"9‘•^ ;ð2Î,þõè\ÅCxñH3ìó["eؾHXø =C'ëµh5´ÅNrÕKH„Û¥‹ÿqø3e™¬X7åRŒ¿FLåôMjŽCRÔ¯¬.lեïq:„€XÕwâ"®<ÊÑO¿Ù73Š.&œ9,¦ñæPÑ¥âôÊvàf·én¥ŽÏè3noÙ&ìŸ4T,ïÓƒG çRÕA¥;5V±6íëê‹Ù\ØûöèÔYF0*ä„ʉ“ò*–=Ø«ÕÔ¿Š,¬ÓÜëæÄV×{[¬ÊûUÑYJª@2À}Y(Ák§Àcnî†;ŒÔ¨î T¨“ÂAohÕhíÛ[ ¹Ì—X£{”µ*ûwÏ+ØËU)ÞoX YéRH´ÖæåÕÉ…x¢ÍŠèœOÉY»œN/îõWX/¾úÊí¯xáµ…TÞX]ÄšA‚ê©Ý­sˆ+Dhˆh å-ſ˃ؾ !g0ÒÎ™Ž¸T-dZ넇$Éa ?ísËÀßp?Á-#NÝSpdZÍ> êE'ÛË.Tmp%MŽ?·B8ÏEúÈ’Åz®<wAËåí¥"L±Æ . œ¤ƒÿ¡))¼ÙT[›ÄCƒExÀè2½X¨ÌöÏoÊI\lX.ö2x ŸsÖRNIâêkŠ •6ö½<%™ml¾ŽbûûöÖ9iÃGY}± ¹ek³%°_o´­zÉÀÚEM+D•zXÍ–:×`]XHÇÌ/ÆA†~t(·=#–zZ;˂ğv þÄHå§Ó ‚=Qþ<Ð\ôÂÓÀ¨d¯‰”ýk›ñtaI¹{ÔŽc´:åÜèU}@¢ãö§Ð?áiõêÅõ6(?Ûa ý]‹öÎS3ûefš w‡§…uG•OÑÀn gc©õbÝ#' ƒÉ”"6©…²©ß‚X3õ~}ó›)e)pØX{Òù}˜N¢oÐF»¡Crû_;GݽDT?ßÝù;ä_„â¿â;`Äþ×öy,mÃH\@£ÛŽ”é·è;èï ­I‚uoˆºi–Ò6ò²ª\Bt³-§€váCýºò4ÖAæ1q\LÀÖÏ“K¡ÐWÒ´1ZûÌw Ò}°HDSùp!ü¸(Á”û&±t*ΧêV@*Ì3°I³åyÌ=h°vÿðýö[ô´šÈ_X¸C´í?Ân—Û¥»ŸÚ-&~ƒb×)1'—ãð$ˆm›fìü_üEdNt}e´XþÓ@i&ãoÀ¡û¯’¼TC]@S>Æâ$E¬Ó¿Ë= †À vò²êBA*‹¶=ý º4ÙõûýsûèªZ/Öá‚g-ßßÕ“‡ã²vž X' :L tþNêTkù´¹ÊˆI»¹×nâô|èkø´ÇddˆìˆElW4k<ÊbvVtivóm,Ý·|±÷Ójc×±“gOÐæ5¬wÝO%êW7„™•t ²C+zý +Æ| U Á„€B óJ®ü}¾Ÿ´w(†s Y´i uDâŸ`ÐmP““t}ƒ(jj?þ|Ú-Š&hÓ_)xVœMì±|Ïfþ±éž.ÛGŠßX›ɬ ‡ïžäKÎçàŽß;èoßÙ1®ôªç#è ­¿@%f¾2;Oãéj¿ØûÀ9"E}_º‹Ý]Ôžœ«¶ jú¾ˆÉÆœMÍ£«ëJŒ£+åº`òñöä|ü}lº”[Ìù™”wÙûØ+jµÀÃ¥hBU&Ûñ2ähKâ¢ÎŽQmê ñ³ï¨N.y:Ð;–ä˜4`/eaÍìçÚòvÁâ>„<í!2†œÇpN»_£Pú­ø9¤§‡¶–x ÞÈÜ»ˆÈl' 46^ñäОÌÁ#íš­£¤Û¼IÂÁÈêQKÖ_  ËÔÚN–ÝF]L Õ†ÊÃ8µ‚'\’Wϰüã[l "Åt)Zíg¹f̆ÐåÄ÷ùÎVêÎàw¢åûv\îvϸŽÌ¦ã—DŤ?}ƒÈá_ÌÓ$¤,‘ºÅÊÓh¿ŠŽ+å’p®Ôn:˜ÖËäqó¼›äç„}yåË^tmRûÇ>ÿ XsǼ4_åé5ìÇRq–7vNˆ9NÿûÖ~ߟuî;…Þ e鎈–*¨²^ÝfË1ù—­ø]>Ó\‘ºÙ™tå-vK:Ó×ßÃÁ Çý:lô=äÙpSy[EÔª%šèzýz>—¾5MDBÅ]w+b,ðXžùI^Ì?[JýWk"s3ž¨­ÆÓ·¶øpMÓF„îodúa¸À=%t^ÁÓ6<§ÅäÈ=&u31s9°b1LrhÖiðz"ÂÎ;z›z;üCHÎ)ܨ[x¦5½u‡Ô,Q6ÿí¶ø–, Ôú¤XÌ”:EW(]÷髼ڶ­ÙºÖC1:{—ɇD*.Q÷sÂÈ*®Ž°eÝïó4è}š™j©E.¥hÌøK®ÓX wºÃ~wÈÔlbf‡õ„/^íá¢/À?Àúa¢gnj¦€–Ôl¾å0Ž*½Ý³Ü$z}«dö@lëœe ˆ3ñ殓±é.æÐ¸º ïúTµÈ8¿&þðxýJ´‹CFœ¾£ã­Ü<‘¬¦\ǽ ó-D't7=Öó™rM,[œ#7Xîkf=Ù‡˜º"J"NÀöéð®Áê"Aþs&Þ o®6RÓ@ýÅ×}_.E5‹!3K+ÌdÇ\noËK•O@š—“ùCp'ØŸ9L(›w¤¶Ð\±}ŽC®3lqâè:l ôÕ´!S0 Äû_vˆàÁÎS î€rùËO&ªXÚÔ -ù22'D}¡’Ve˼@)Ö]æÚ3°&=Á{ ¿¶àDÏm€Àþƒœ¨W7â‘uf…±¼U ãÏbW²aïS…nwÀ:` Álýƒ7`–'Ûú["Ø„QÝã â*|}V¿Y”¥à­ºÀ•%ÝJ«—>öËÖ ÂsñÜO›it-6 HÒ­àV†EP²t>/ì ÖϲèçÕF5å&#š*eŽ_Z½h36ªMº<é=K¬Žæ54ULÒa8ú[LjƳÉj†¸ÇiÎ-Úéÿ=l{ot­™`ì§T˜çȧ뾲UAf}8—Š n󎳿 ï0u«*‚ùôû¾ÐÙ³âů;hs)½®báÀ™F¦Êì8!™ìÙM8I‘ Êòvò^ÏBu˜x}>îUVk±·z”Š†Í¡'”ǵÌl2ÀÝ5N7J÷¥·Ë.ãE¯=jfilVigwUä­Æîx ºPÐí2‰êo^º›ÄýQ3¼ Gßøa©È$Ýûªó;WÒ‰9\ p“¢ *%â%„Ò$Þ|N.¶}àãYkˆ×‡g$ÉøÑK=ê5_h0•Œ½[îÜ,¯ÄÝì4 ¦ßmÖˆõ^Ä8û*ç ±y`^å)˲£ÖSWp¶ÏÿIöü•Ûo R+ÒÑp]'LÒŠŒíBy³ëè©!h54²Q äé×#ÊÝŠT#]ÖŠhKv-µö­yØŸéGe"VjpS™­´–ØPÿ=â/oÙâþsxp+ÉD»;-ãL†“ ùS}ºzïcI¡P¥v¨…±ùTtÙJw¶7q¶?©íßû¤#I¦ mh ¤ð„m?¨ëÄ“=ì m Í¼&.¬R«ã¹¸'ŒýU5/^öËvwM4RšLÇÅ6ÿyYEiC’FÉ>_i½°ZD8l°êéîCÙ?¬§ Dº`ó¥0à[Õb9ÜduÍ>ZÒƒP'ÞɶDš&lÈk•Û…j¾vs]Ïx¥†<ÚñüQyš>³ >œû£cð’ ñcZ]Ñ?¨þ¤–Ð]hÕNÎ~S3:ê°ÐÑ#?9éé¾Ûv·±³ž9«Q+Ñ=º­,gE7‡ˆ•Ž)8¢NùŽxþá«Z#‘Í)#h|d;ªKÉÄ\˜hç˜"Wp̵>±%s¿Ë}, …ôêN{!gœ¡fà´ä/”ƒ_לPxïÄPÊ«lÿûõ*_–É_qÐ>áí”b8N¬ÎŠÜ<ƆPøñ 6¢i³C¾mD¥uO”•2ÄÚVÐ׸—n M˜uðb>˺e“álóF`Œ.£zœ‡’m!®+3ÁÉÜ·^œEúä Š‹.±ÝG¦ [."c $¦°¢g7ó™·˜c¨OËãF®!Ô”i70¬÷cLL‰Ö9;™B×y0¼h9kWt|ö×»ø~·Éýý°0é­ej1|,<1¹‰‚žYì˜n# ö³Ëñsð²øÑ3½#}8K®©+cý{†ÛvCÛÖÌð Õ{Fd$VrtgƒY}·òdîË訌hðpê=qØ„úžQºê#b̪?*/ÆUþÖ1¶¦)a³ŸjÔ±m˜ê~†NÄœ¦/ûL1p O,a¤ÝlC·.®»&½ú-1ôƒZòu™ †)Î7ÚIéÙ§¹á”b6=ýâéy"\Û„Ä40±{ª9„䓜çæq­åÌ5º`"ÒLZt ë Þ7—Ó–_MZoÛ[³•s•Æ«Ÿ'“¨;sòMåñ¡§ÓØa­¶nÍ4ÖÕwQ\öZŸT>fâtÔñþq«.óß×õ‚…i¼³ÃŽr'eÚòºùG[­{„A O¢ðÌ:Âô›¶›¡Á›·FˆMÏ›Ryò>0ß_wŽÉ¨Âû£ õ›Mš€zÃÕ³3{’ÎÉî¦HiŽœÊLEG²AkÊ!–†\Wh1uàý‹l–Aúò¤à[ùnE,µòê9p¨òP³÷~1Ž2ƒs ncR!‹Ú]¯c¦µ' °>à ȲUØEÿ¸Š‹ŒâÝH:MŒ0³)É {þÎþœ;±Å¿´ß|é Rá‚=ÌžR‚¶Ëˆ5›ø˜> œ!h‡&PØ *ukló8«è(曚ÝNJm6îâ"ÞØì¼Ÿ÷„UqB'„ gz'ñÜÛ¹•ßâ§¶]ØSiKþ¤$€;‘•‹Ëú|‰ÏщîL7Óaäá×TE‹ÆÆ¥Vï¯:B7rÈ.Ë)ËY`:VÖWÖ¯0›¢Òí©MîâÏå wÂd}˪¼²8çÄÆTQä¯y-øhµp‹©3ÝŸ;ìªt¦åG &Yî¡»ööãáûŠø$ï$ÉéQu/ÆÃgù Àå°K\ãWL`e‰C`$Þâ«Q?™ž}mž”ÖðÚ̶V&¨6d†áÆã0NoºŒ"{iQ0"Œ†X$”:µÑ™Q&„±ÒOˆ¢Á^,xñÎ$?öŸ¡¤‰Ý‹Í&°¥4f˜ͺ½†Ê£L—õFú}ù…ùÅÞê‹ÎtV.ËÿŒïËkòÌmXÊèóx—é³AÅõ¬á˜ã¶Ä;Gö­²îÛ¡][4‰@N­TéZ&šÊRH>ˆç¿æ³RÐß’LÞ Šs¶©®öUR|Õl Ž|cÚ‡9wÙú„hØtÉ*Ÿ?µ³ézö÷½v†W ¶tMkµŒeZˆX ~…PåPÄ«råoȯ§Õ}0šáøZ 9†c¡Ë8û^flrf^Á7KrÃyËÁ]®×NÛV =u.Ö Ï…Ã嬨¥Mv* ¥!Ý&„102nb›~ÑY*w;j "½k—“kåw,ž[ÌÒ³(1#*–27Ÿ×LùrÁ6æµ}«£EgFN]Ðm»5¦J­pøAñqáÚ $‡ÕÔ~9sós¯÷'ð*ÏX”†ÌiJtÔû?–Óõ¡x#q“ÍÄrëîÂT^:¦dS$˜zÅöæú±ª5¹;ÃSˆ¦2(‘že1iÎ6¾ðub:Hsºúuè* 6 íï5¯‚^…Ԩˀã>“Û?¥ÑÇM›v Wwý¸ó› üô1ï{¼ðÞ•Ú%—ʼnëx’.‘ê’jÑht|0(ßþ–@JùqƒjÈ ©R[z%I„ŒøŒé¸&, 2zmÌ—Áõt%|š7™ È¬®j'°—hñ"]g)ä\êz£¦f:8Ðû—S«…ÓK m„¯ îëYWiÔ»+‰´Ì™óåâFŒ8'r(`éJKW€¸®·‰“§íoúeÕë;Ï5œ%Î>2©ÿ_˜ª^óI´†˶p•e_ÔÚY’,둧굸à.fn9\÷㤖ÛõF»¨íBgE5ØÝKv¿)iÜJ7}{­Xàí¢aU‡æ‘½Ç íâÃüúŸQJa|:íõHþ—¿»z³f2¶Òq£DL›wöü G¡‚®È,½Op!®×ú"BiIŽÖXWùþ-æ!¸0ÖèÌÝ^ûã˜áËÝhpÖ5( ØdVÁ\ïóª‘Ì2w€p« Í-‡Ðc;AÕõ›àu\5Ç ‡ð]D>‡ƒ+ß n‚”ß•)`€˜*±©S1wùˆ [µRîæëttå3X,*L»‘.ÀÐ\×ÑžM —´m¡"Cwn®šæ±P çú®OÆñæ{[S)±Ç·3»}hòâØ±üæÅÍ«:~²€Pï^ ‡…5X>–ªóÖ‰)«Ò Ø;ÚÍçÛJÂD"ö’ W­Ÿø…äÃñ”`‘µÏäÉl@âE®tãx³ÉýÕ†>ó{ÚrºsÒÃí.Íöݬ?oþ® ÛÇ,Ôom 2š±*|׫˟ìuÛÇ¡ÆÃrµ¦ìÙÍŸrÃÖ©·,ñ¦âkjöæ§¼$éFOµr›ÐOÈÈfvâ ‹Œã òéý³ôp:•ŽË÷P;.!ÙêÍ`7ÛLÀÝE|[…’Ñ€óúë‹ûÌý'¼C­ÀaÆO¢sÔcî§ýÉt©Lÿ¨J˼ Éf© ÁŠ6{±ZÔ¬e÷fçc1¦.‡ƒ…Ž­­ >ÀN …âä À:ohÅÜ8À§fc¦(ýÛsEOª .o ƹbhèIEÁIˆ’Óaw˜A_0ëPì¼åb§×¼„èÄöpqWù“ø‰é5¥»4÷ÌŒ yƒ—ò¶¡²X‰‘Y?ôpʼnï€W%zjMMA`”¡;úäx?}’"y-9Óí€qóñIþL)DlØëà9©öÍÈMÛ»ÿ‹¡ïIœm½ÿoÁã„ÌóÆó†&£Pw¦<\W]¼Ò‘K™m~Y¦ÍlEöFtª5¨ 1ó73wÍ:<™§ÑVbG˜dÇsDZ3†%ƒ—h`*ʤ³ª›G{Ó^QËõðï—šQþTƒhžÃY˜ªÐ =]Z®£|¢Œ(«ÈÜ‘h×,ÿ…þCwâ¶µòªìàjͼ*Î O¨ŒÒŒò)…2@ZW÷»~¾Õw?Ø  ø„lÐJKùlñM­rWŽ"Úéä%9@3è‡w$¡5³íðÈݨ÷Á]š:Ó ä+Ÿ„…_“æ(êŸÕÚˆ‚º3x™þ+0^œÉé pk‹âL6D½p;5œxY/b0ï>$U,eÚ”¥˜5gÎ`¿°©ûU\J-S‹MãCÒZ •„FÆ…X=RîË÷ˆ¢j%G»Ó]™%'^X—Š™“ïΑ$À§°Ý¨Ê3%ð€¿' \nð(Ê骳n*Œ+Ÿ¯t†‹~¬Yíçé—¹úÏ“pÑæÛ®H4f·Ô ŸvÍ¿2þ4=$áwÜX"…·£ÅáiYÒ5Ý5=xØe>н:”èŒ:€k€Ïω70ÇÃk'Sq:sç]ÐEÚ%Ìv“ÜV*G•—˜,õ–痡ðחJ‰I9ÿAÎGE xMãÅ·›aõÑê=ƒåKV°ÁkÜ;ݳÓÇF驪/½Á,kçbú®‰¬Ñì4½7+juóê§v#Q ïs ê²úï `Ä?9á%ÚÚMéôʤd@|P2–`€¨Z°í+ã]*uôÄfFÿ%؉մ™N=IÅšFå›Eºœ ”a>DbCÛ598O½¥~,øþŸÄÀÅþ°Á“22%û&°¥ôgÌR¬ë[ 82©-I>Ë?U)à4II´$ÎÀž Û-‡j|pˆˆz¥Ðh“‘é3ôô»'­k÷ÕÔ­/¸žüò49q~F¬`_†×~ö队ñú®·'Q,‹úU anÍ2!b˜Ê F§[š½~Ô·”uK‚Î@g`gô_í½tÊÜÃ]‡²)èýòpŸºm•¶^%¹7ÄvVý¥r~ŒMæÙjÂI¶ŒÆ[Å ËO±´¼ºâL#m-ÉTæáë5³,Û´ÞÝQÐGŠU…Xÿp{G¨öë$ÔÉ ¦. 5 º]àñˆéMÿ×köÍk©MoÓÿd°©é:WSîk½sšIB BCó–lGÞÔìøÊ‹¨£8"º½¬?rz#¨awY²NÁô {õÆ@À ˜:´Âä¬j¯4‘© GØh¿ m¦¦BÖÙføÃbÏÜ“^Ï™»Û®·¦Êf‹¡ÙyÌ·©{¿Å“Œ^mª/¯mÃÞ½‡è(w?n½)mäÈ]r6åw"Ç5ïŒ0Iaõ®ìæ¼Ëï7§Ÿ×騄ªGÙ|Á‘º‡d¶åû ÈõFî…#L¹'*±Q†áF ,ÿ×b=ÄEƒÑ»`ø¡ºÌŸ]K2ýÍy`„^-±kªEªw¸iÑõãj*pjÍPêðœ¡2/wq‰‚O&A&S“ĉ\uJØ QÁ& l›‚IÜxý³…Cà Žáäñ–{Dæ‰;Ï&½ ‰¹ôÍŽÎÉKÁã´ÉA[ y¨ Uæ±¹ÎÒ²‘ þô[lJ· ¢¬ŒæÈã:k¸mþáÖA³‰7bRõ°Œ„é4¸~ѳ=àÎ^¯¾ 2Y+T‚g9T²AˆÏF²pb1‰cÏF‘¼DzvÞ%{iV‡gükW„Z+Çê³L#ÅùöµˆÏ7¥?—ghŸª+ 1º%ÞY—б ¦Çy¤“ÌÄiü¬ÂX_x]Έ:‚°Ê—qºC­—¤Œð,»˜Ë}îòú´‘Š ¦Mªhäm8–€uÖ,[[†SHk,¥¥íêcTƒGˆ‰ãU U¸hÒyÜ@ÀÍ%@~ÄjŸu~©”­S¦+@¥Ô(´¥_¿æ÷ãÖfNûÕÅ]_ v‘cÍT¤m×É|¿ôžä°Äðc¢ÇE“3¸ÿj=¡WAÂx¾nŽ!ªR|(#·8çþ—jˆä}ìóªË–8Ý»´_Üôì¯ÛÂ!›tÝÑöÄ]b×aÌ5ùpÌjløúÔÚ†§¼é÷ÄN£SûpÁù'ú×¶Téѽ®é"ÚfCB‡‚¢ù£‹Uº”{½Qy#¼,à Óƒÿ‘©¤´ìònznÑVä@ÉG¾Yp„bUÿ÷¾à¤´é‚Š‚YÕŠýIçëá·©vÜUëšu;^¬IÛ\¨4Å×oTñ16ÿ ™’µf¥(À൵;ž›ÕÙ&•þц Uk¡L$ž7£o²?çŠ7ÌÔ”šõ\•åÚ'-™•Ú–°€‡åZטàC@eêÀ"­«;Þª^„®¿Í ]o£ÿÞ\àÓß Û’èÅë­çHŸÜXµ³u›©Çß¿£¡â÷<'ÕN=»7¸û„8Ùgrú¶æ,‰À¶jp~ÅùbwÒo|™ÀÌùóî‹Ö,õ¦/P£]™(0¬à£VûSq nàåg‰æVJ.!•0\GS!ßö2Çr,f|ὄ_Ýé€.î¬fßšÀò&9ê'Çóóƒ\Ñù€eílù1v¼³"Tßu% Ýù$„Ìc‹¸á_pÇã'K°<<à2Ì‘S˜jû.l"ÇÜ´äúªäò"Î-%ŠõÚrФøx>Ë-+{í@—^uSÓ$2!ec1‰CWÚ}ü¡N…g¬7”ôÕ¬€ŽßúH: {gE]Å$^d«Šeíu¯mš¶ŠÉæŒ}‘'¥VøWçÂݪտÚñIͪâ¢X»H¸øi¶×½swÀL=Ù(ÌCæÃ¤dL`‰>¤ðTà«¡a©™úÚ¿Ñ™¾¤”Eà=-Îæ#<¼nF®†Ò;‰÷AΜvœ!þ âFe5B\ÎÎs|À¶ðüi4tKþ…Â[«ÈD¹Æà° ,E@Oó~-[9ÚDfæ% BE‡ò“çh?ÜmÆ™x€ôÓý(~¯í!ü÷êLŸôrˆ¬Ï3®×w/unV®ý’áÅ+`åO'·œä)±×A/PžNüÍaíöcûz‘õ€Õ é‹sæp¯ËÂŒ"9Œ¢Ñeû'{-‘¡yÆ®ÃI#x-$y&¶“ H9J¹^0òèÃø ³ÛÊù8¹!ÏžÆB?Áž&3Š4]¥øÀ¹ëÍ,õÿi%íWI ®¡§ûU›Qœ÷ŽæJM&­†f›Y—ïGi)@Tk2›#coœT`Ðnü¶¿®ì7`6tdPKÌf‹ßÈpÈE:Ö€dì-\»õK÷%h[‘µ3ŸY·&åüe+è¤Î¬Ê}1Uì›Dÿ&L~æ³!G4ל ÿ|A¾°îáŸlä¸7ì ÿƃ}(/Æv†GA Zÿ¨îfåJGŠ®üª]¶*‚&’ïÿ<]Ò5cÒþÂ1–a ´fö™¹–oPWE7cå`ñîâoO*åÓÿ/muþÚ/¡áúµ7ÄFy4¥¤Æ…㪉]ŸÇ=ÉÓa{ÉÇÈzS°}0g)_š20­ý”õÁ!mSI\ÒßdÕ7N~½µJkÉ2ÍÅiáMøW×±êÕù© ˜N°¯\@Ÿ 4IäN#+ÄšÞòrΧ¿±¯g„e»x&[ìî7âýÝ5xkè +±¹¦ZéGm. çÁqZÙVwΗr«‹Ó×ÈÑÇcyÛ"D ÃmJoo¹°võ8i+üÁùݽ µG2ƒ¶óhÝMcÍÕT6—#þ&<Í”²Á¢Fê Úóç5$‰ù(âK—œ\êÞíÌ‚ù˜Û>ìfPÚ0m7S…šzâoF“D©¤® Yõ%{¡”±yOîe5t [—ñÑ6SuýY,iLh ®ÿ:;¡u‡Zy~hN~>spTö·k`?]ÛüGà¾lØyþíÇ­†Œ¿Yž#ÉLj°ýaôë=+—{G{@rç7¤dO’( š‹õ[­¢§h·ô,Dè´¯ Àfoyx91»œÕkÝ• ÆK 2Ö\sÞe£è ÿUy.Ç_ˆp7¶ã>« G {LÔÖN)U‘‚Öîe®êW‚õ›¼‹JfîBý=¦<ÛͶK¿5B©bvÙ0ž,á°æÑ»º©Ø( |~Þ§ v«2Æ@³´‚ÐÌ$ÿh}VøáH©öŽp¬‚QÀll¨}tzÁÈÆ&¤?ÙÛIùÓ‚Zoé…Ç‘ïHÒ=Á±ñåO›À ÷À<€ÏÉÇéÊGÍs]Ÿú¢xñÕ¶„&[Uðª‚æï/!të§N²£÷»1õ€êü¦KºÏ:ñ‚Ìß@x‘ ðñÿW£3—S×J5SÓ_òW/èøIW/ƒ­Ã‘E™2Þ/uJs(wgÃ8|øæPköhP”EÜüU¦+på¼Ûù—^X¤O.™Œn{I e-µŽy@·ä ­ùåÁ¡¸xgSLƒÖ’~+&ÅNòåÌ[ =N•&šw^½^\ÛÃßqe§Îê Q6:òÅr}g,?æmyìÞÀX ¢ \ÚÓèþkZáï"õ‡®R˜¼–Êôly—ËÍQêË÷ã)Mn¥P›¬q¦æ&tÐ#=ÏÀqYýZäÚ-µïO4Z¼;¯H¦r±ñ B|Æ Ü!Ù³çü1ÃI-ËU›þ¬·(ý>u„€!3iÕaæ¥à&ð#V°*_“h´ÕÿéÓT¾ˆ+aÜ5VõÓ¶ {÷Å'‡Á~ˆE[دWÆì¯fœ8±,.‘$8Ûª¢Ë óx.wî–-U€"ÁHÐ$b DÀzq¨âô†_ÏEÊ£TåV±¾-BiGmÌ9\馯šúĽõ  ðº¥_Ö#¸t¶á˜üÎ7"órÆà’6PÅæßÜù¶bʶƒâfˆÅ÷(«>U×zpJ%ÿ2à zgÖ^fIgM%då¥/³PjûßÝYž¶Ûé#PšÒAc»0êêØOyqGÜÍÉLò}žÕ&wu¤4Ž0ÊäOqGr —æ×ÑÔ•à9µ¤"F“r!o›?Xàj³Çõ+]_….ñùlÌÉ®$2ü5AËr`}M²ÛC©UÇ8YÖÝA~ê4„6pz´CãžVÇWQ…¸<^ÁD ¢y[•¶„Ô;u¹ 3HIHŠ˜ ƒr'-øxq£^ÔÆ¡s½®O+«\¡’êÁ‘Dõž#ôüÏ@êtKvNC§‡q–îKhͳ”&”…„­kùœâqè?$ÞŸ Z$Nä\gO¾êwr®—ÓBLÂ^¢ª»1íH-„·ŒðŒÄ’¸¸b‹<£—ª˜ݧ k¾{q»gvgîðÈ#nÝ‚îjñV¸Êx÷Ù4ž¸p¦ñ↫||ïç³bå_ÈnòÇÐGÚž`Y“5ÝÛsMbOú/ç ¨0Ávmú`úW}WÊ"÷méz2 ‡¾hÍQsøÏZý4 ±¤#¢ó‚‰èömGÿ‰. r€-a.]±êàÕ¯î€&™üŠçWõœš³bK_ ˜L}uá“ x¢=г•õ¤Y¾ž„»Ø`¼l Á ¤IûæxªŸ/€æÑ(Hf5_…3l¥E$cfyߎŒxô®s@$ŠºBá×Ê3™I½ÝGbÔ…õ1^‹®¶×ð^h| ¡¡‹Ã †!5Ext¬Œá[;LHµA~ü'žá¥Xçº1wk°5A…Ú††wá¶nêm3–µx…QÿÚ­/xY Ú;޶!®ßb7Zröb˜ áBÈÄ`1o»‚éí"¯ZÙææ´i ¾š‰+w‹¤j·ßU„úWî·‘ ¡¯xÇ8qZq/áðüý5à „.‡ñ‹ÚÒÜ‚ZxšJ4’þò¡« ß÷/èXôïÝž‚:M¯:¸’[.ÙVÛiGŸQï ×?Š–S%ŽéܪlŒ¨c¤Åìt=kˆÊÅ÷‘5ßJñ%ÿŒ\‘™%›#¬…¸ûÔÿë‡3±ŸN/؈^Ÿäè É‹pÒ8[Øi$RÁ¤,ëöëŽD¥ÕrH·—pZ<š‘2@r"S Y ‘üvæì€ÁNÚbœ$RÊÿÁplq2Ô¾v§¯µîX`IÏiöuN•ƒ>¢ßÂòžt•zÃ7Æo+õ åÙ0zjÍWo-¬ÙR+0ãÜHA…ðˆRíÛx8¦ÌÀ6¡@ËŽ r©owÌ1"l™§CæçºG„"ÞWø¾™¦efçyáC1ׯ4N¡×š–¡cø@ÑE=Æ\eO­•§$Øg1H.¸Ú“)q1A¾jéƒþzÝj¯Ô? `žøo÷ïàˆy…}da8ΨR;ý6 !üÊÖ<û¥ì¥ ¶ùcÍÌÑí©åìöÁn¬¾öc¢k¬HžMfÓ¿«æu£ ]'üPÂÿKÉçU ®˜| wX¯~rA®Ò€Îd÷¹yb­³­[•(Rl¢/9- St1BÙ'´²3ASÅ@³1±@Å臖J—H÷z_¬ÃÌ»P>Æxœ_Þ9rŒ¤úX=Èci€‡ Ýî[gࣈä錧"J#TL é·Ôùg|ù‹5‰žð¯c©9ö‰É4ASŒ‰¤ú;páKKd^üzÉ-—v°®ÓÒI¥‡9‰‡HM¥T­®Ž–- ;>‘,ÏBFvÓ4ÖGë[¡êÕŽ…žSø[~æµ±æ VŒzÊšmVJ[v¢—r”ãsÔŽpç¼wÔ“xŸ¢aÞ+ié %?ÊY8•¹¿¼çAZe[À.¾´„3”'¢½•/Fv§.Büz3m€è$ýq›šÕ.¥¼´Çš?¿áêå¬ṳ̈’Æ“¬Ví™3ùŽ*ií?Oà4¡kÀ©]š]d©•@+²1cWÖedþ£¹Ì¨ìj1åÉrL1æéa–D\:}ålÀÁ‡æ‘ú{a3ºMÈ;RE=E9 ¢ÓßpwŸx°4„­1]+“¢¾K¹kÅGÅÈÓ{á–½”ôí}\ŠÇÕÒ¹o³|Ä+qîiTé•÷¨g²Ýùfí8/]]"@ÕnÈ‘8Wvˆ´UF>öWö°lÔL·ÍÄÕwC_l09wŒ<ä!þh⠨α›Ú­I dþªƒéƒ ^ÉÆT<ס) fø{èÎjÑÉ9×s·¾¢äž§L[Ù¡]`¬p{BöL0ЬFd#XXUcÄäÀƒ;D‰«VÙU UИE¸þÚH|µp(Áš¾Ì'pXpeüŽ¢â™á?›+foÈ*ˆÞúÎ|åû¼h¯»k,>¦ÒöƒêLáÔ0òûKïÍNZ‡QߟŠò£<|´†Y·† ™Ø6°q`ˆ´áéÔ’›ª‘\7ÿ"0ý†a£’#q>oÊ (<ºùŒ½˜€ä¤[úw&·”ß.Ÿ°Á ‘ñ9€¼•rÞZ\¦ž*aqå‚=gaN™ÝüÊTä16f¦‹¡wÓÈsøÂÙïy^äôÒµŽ´±`â•“>Z«%‡ãÆîÏ[\iklrjù0oJpHzWöë.v~‚”Æ­Gñ(ýé±ûlOè±ê´ˆ ÛDùêñ8`.ýËËŸqÿŽ[œ0D ¨|³ù{ìOÀ2wfòRyY3sã3Auû(óòŸìnÒxP †˜›:.í‚+SY^JâI¸~+¬xqÏó˜<ýp1ßz°z—˜½ozíîaªÄÀ8¡Yæ9˜dki°µ½îŒï ÕÅeà‘  Tx!çÃ(Â\Ü´Ãú@´MŒlWwoIe §'3 (‰¿®o»~‹)=0ïé|·i‰£äjÐ'›ì÷’³]–ÿ«pJ·S}ub|Xß¾BÇ{R6Þ?&ÁZÓ`ih齡öÒ&ÈÛH(÷`%)‹fgWJPÃ^@PÙ—¨ü«ÞRPvHù¹  ®Ø4Ús&ëâŒ9`äà9È®­‰ ‘/à#Eašœhå1òûÐò<¼S¦$Æ»<¹»RWo¹¶£06¿¶òl"o­m C!:Hüý1ßQØuŽ¥;{Ål[ó#3+Žèz+IŠÊ1>Fã×óüu^½~‘Ôbî¡Ò,§§ß"žG6mJ´JV:,âDwµ¡5Ô+éÑÃGÙ($Ùކ žwæþ‘¶w.±ƒàÔ™'Ât¡æ¥)š{v+¼ð¤ƒ!?*â’¸N­¡»Ðj_,ýØ?¢ä­ÀR †®s@]ßNG*:öfBëMH¾IÇ"n„+æ]Ê{¸¾ v§"Ò ©\‹E¬*ÇÍu-ÃM–íi›`–Ó­ã¸*öù!$gÕ¸üxê•É­šÎœàð aÉÀ´êÇï…ÿŤ&ü~šÌÙe ­!»w…ŸÕ'_ìÞS®¥4Ò¨/“ÏO£ Ú<{¼Øá÷¾•I§þœÚÆGù^¥²“#³?™ÿt`IÛ¯{*T™°‰~ª|å‚_ð»Únzé­8 ]‡L૘}g½^ù¬Å²×Ù‰+-ÄŠc”Ý‚é‚gˆMìú#“$‰Îg.þívm•°t¡ú4"R·'5.¥ 4hñÞ©¬9˜ŒÈ¯€ýuN†Pîª-–æPÔ¨Àª7¶ñÇiÍQCª"KºË}+l2Ð ˜ f”åc´«¨ðß+÷\ 4?QùÇu8mQy©K_Š`‘^,ô•çË Ø¥EákCY7—˜©.Ì ù¸Xk¡ŠÞÐT¿íêJŠGî:0ÏgäA?ê7qÒSQùÜ}¼üe'™x5vl]ÏÚÓeüfY¾ÀöÆR 9ÕÀŒP…¢ uÆŠsó±‰Êž•q¦»8©5ðÈîÈÔ¯–yt2UÜ4µßÊãˆÅþ â•êUp¾ˆY1Ɖf:ÛO¯Ë*²×JÒtãwâõÞ!yLg·ÚÃÅ6ï äB;°*§µé’Ù˜̧@“¶FºA&¸&'“\¥/ªÆD?¾SϽTt瑆‘ôËV™l%û*k)^V‰Sy™’ ?M vq×€u† ÒÍ{OŠÚöæy^Là%’zj_Îã×u(ªÈø¦¦k z>Å  –A¶O=^|g ‘vnéûžÐˆS¥98\d#åò)´ýøý~ŒEÛ°@XäPƒ2¨cƒ™^åO¹˜O0è½2¢"·ÊÑè7tnCšÒ$ÿW¥)m†õÄ+ %ºPÍ):£µµ#ãÂxܵ‚Õ#ù^‚ŽÝ1„ËQèáU\x>IéZI¸ÝoÎós%¬}æhý¥+i‚€m}µ|± Mi‡j8»Â³3°‹›¥yk¥QþÔwÓ˜jCÃêë-œ|˜çÜ-e^Ÿäb~ݘŠëÑËïìÄw»öåž+®íh|ûºŽÝ5SºjWãy«Ê!ˆC˜Vúvãȹó •+ûã¿*Ä~ĦÖàó—Á{°îZfç XÁÂÕ¨à‹èIg³…“1g>NªïåFðC[«ä"×Õ>oM¼éSˆå8qo [>WÉz˜Ž~c0Yæ|³èä`;É0¡FçZoWZ„šk#Ø éÚnÂD©é6 —ZE ×A'UŸ•û÷(Ò¬¾†`'þ”íŠ#rnÇÁ†óà©ôw9ð‘ÀÝG:GKnIó!ç ßËv«p±ª½ŠúßÇø? –Efo5b‹™S‰NÝÇ'­¡ÜIßG¾ÖWµ2Äy¶à:$hÀ“~#â‚b$ˆÞ›¾ÿÀN¾x+JÙ´Þ ÝÓFÔx¾ôytõ˜/¾–óñcÑYl𒯶œ˜m…ˆÆ­Ð$9«p´ÀW?7¿ÛÏÕ}Ú¬‘AÚIkq‹r'}z˜¨ÍV“Ô̰ÜÏÙ¿ ÕäBÇÒ Áññwúÿ×,°êTÏaM[xÒ\OE¯O é&Gjû[Ào•äÑšI­ÂZrsJÑw=–G1 +™å6ó‚ýaþ¬pÀÇL”¢h¬ÓŠš;e­Öðôò’Ÿ¯=QXÈ"[@!”UqG­ûàJ€ÖTÆŸµNhúÚVp®æ œõ=š_&îÔÉ ´@ÏÀÄœZ\ûcú‡ËI\Gá]?¥­â_M’06´Ì¦EÀg‘ðÃfðWú¢hù×¢7%ã{¿*ð/RùÈeÖ8í?O†fð]– £‚Í5ª+AUp΋ÚÀeÅ|. ¡¤g‹¶UT:ÐkjƒeîÖÑû=ô낸ÿ(s>÷Y-)²»áÁÑNt¼>GJ1A¸Xh­À½::†Ð¿‚£ç «ËVäIZRYÏÊ>ƒÒ®©Ð%›oüKPwi&&u§%£]ÙÑ©:…ˆgÖóÒ­ðn§`žÀüñèÀÕ?å€z4ųÒ´#çt5ÐJo;’q±s¢AÈ@ôöÌ¬ÏØÈšJ°­)Mƒõ$Úl»‹õáÆ²é ïSwõ »âÃÚ(úÕë6¨½°ƒÿý |{ÕÉJKËÞ¥H˜1›q»¶%AV\¾B¥Ê0'¥¨ý±`ÄÎèñlÌê<€Ka0 võèiT·"Ï»¤»¾nrÚ€Á®·j¨Í',â˜E’=¼m÷HvÐzüC*õy1Ä'Õª|»£ó£{q¸Öš¾çÚ/v_ü“Ñ¢* É]i@ÏGž£9Æ W³§´8I«òü›8—| ¿í(j¯ÕÂJr3=ÓxsfÝ 1ƒ8¨Û=X4)]¦êµ©c…+Ðü”cí}Ï KyŽl»¤st—2u’Út»V¢‡+µ2ûïÛæ ùV§ˆûõ•ÌÚðzÕÝ­9 1LS¯ºh ÕX’º®4áWˆmëQ’ð¯ño]ÿu¡>!Ci:·œÚ˜]ROuá³ï?x.ÏS»Èôi©,ùJõÈ _èy=ÉÑð¥¦÷Æ=ƒþ#8‰ìÞlÂI…L2=JªÞ¢öƒèÔŽ™‹{Áé®ï)Ø)íðü%Ìb5Y{¬ÍHÛëG^îPéTofKÝ®C™“¾’?èíºJ0¥Ë²Z»W¬`k˜’‚kkõ:·“Їg„‘TwЄÂÁL ³†ršý©2Uð#ÁhêÞ|àHà%õUænükvèÝáMŒR_ªì4ÛºÖÍ¢l"×.pEƒò°Ÿ¤8Šp;žòS¼SûRÇ™ñƒ‡Òr6'±à å©Ü1ìäü¸´“Ÿ—þF%©éV¸ã1¢;Ù¬(ný5”»óvµrìÿüs»Â´m^\šÔ¤Æ“?%záæû’wE&ŸƒRE¢à†•Â.jþvr[HNÚ¾ƒü¬HsísÙšmÞ;·wugWN÷%ÈKÕ5DÞb-z/v&‚('‚+vz”E°çE¶˜ÉÖˆѵ@ >Þ²:ÙÀ€‡(õ‘º1œ÷²:Fé)‰Ÿ"« g þ¿’1ÂD¨”šíѼÏHsãM é7%'ëiú*Æbk½)ÿuãÖí¸åßÅùÀi C°íå µÅÒž!B´qøŸ_[Y-º~çm½tÉK5ÆGAÛj~iÏi)hÖQ€>ŽœiqiòloïƒBrĶ¢ÐÇ ¼‚XÉ–ÉB;ž«Õoçôcó† …ôñíQ9ˆT£˜R9PU=¨Î£ö&Ó a0 h5¸ÓÔ©Tc8, §³êÀ‘—a¼Š²L£ÿw(ÅQnø:Ýþç$ ÊÄ•X[, f‹Û:Ã! Ö½z›G|ÇD­Z÷£»Z~7ü.Œ½rkÜÔ?Ù*2iQVô 0Y¥¹ï`°±‚CqXWs?=;^Ø'ÈÓ™ñÛN Éguðà¢WÝK`á!#j ûÉ ¡7c~1zKÛ‹Ôl4ß‘-Æ8%¹ F­âí0át[x÷¿Åö Ã;ä¡ã`B˲&Q·vêRþÐBiù`Ý·'}µ>¤ONÏ¡ýœSŸs‚-¶·Qià_ ò$tÜ‘ÿè¢<Â,¼aÚþêlIéz²ñÀvUÿÒ5¤Ç*Όκ—Öy’^;à™R[!H <‘ZÓ0âå'›Êc½'8 aò˜6,•Á¦ÞÝ¡EX%>×uil{­s‡El˜ñ #À`u4ê*2Ûä¤ã\•2¼Õ*º•Žÿ0 îsÛÝÏ Rì„ CmÙQ…ú8é¹ R¢\)uxÓ⛋ín'T®E@¿×Ë©ÅêWT3mhPh{ŽŒ LŒ‰$]q€ô؀͌}y–úœgà}òöXj•ä<Ùp/SZÙUÇqve3X‘D+Ú³9¾T~qŽÐL¦^“\¡§x»°Ä1DÞ* ®ÿ‰C4/†Õ|6‘T£&´j‰£~y¼¤X‘ÖQ°½–úÂ%ÒY"¨ê!4ºŒù`Dr„½œí|híòÒùÌ`â'NèÆŽ‹ìMacÚ+ Ôчâ„]XM?ͱçKw ãëlñƒ§_Á"rÎ$p-2„ówÛÖê(ŠÑh?—ʃ¦nûud×ËN;¤µ|Ø7‘¨ÃR³Ûár V×·dÈ2(´­ú¸¹úûyšF ¡¡ÿ¨:pùÅÉß-ÚíœÚvx‘ÂM);Ò“ æ‰Íîû£‰w…ö×ûîKPü™?¾Â… `&ö;¨k©rl5tpV^[,´®87 ²êò­G¨ˆ–!YãrŽ›55?}ž{Œ}siÅSo¾TÚ3Ždåz,xÝJfìEÙDê ý·xkˆ4•riŸÐ4lg«¯ÆËIX„958M.‹ôTÝm|¨]ž›}nɲ–!gOÅçæÓµpÏG?ö:8ÒeƺÈDŠ ²Àð@Ä:‡Q>˜‡‡“–Få›w—ªÿ’‰§QŠù‡ xôìÔÔ.gpúEKˆ}g÷(óã/– >PÓ¹AÏÕ†õ/gÿ~0ç0CÜöÓãÈAtaÈ&‚hW·Ϲ0mªì©¿E2ÈéxÎ{#ôm’2\᫨¹¤ï{=úÉ}s`¡CÕ¿y¾ò€©Ó(^Ît!|T·‚Ï3P0ºÈGæ[¼Fì€`о¥­ŠVnÚN@m`œê×F¸Uy)✄}¶æúáØêZ\Í24á¼2VJ—€Ÿ{ã$Rºñ²ýkéRQ=s&2©¥ã¤-ŸùôB¢W°Ø ?´I™é¶9³:vEÉs`°U©$RÞêSÂ;ÛG>]„"«C—ˆNuf/P¡úU¤Y2Ï‘ÂQM—=Z[©â$Á˜ÿb5vøºéôÅ5C›M¯D·Ç÷ESÞü/yÃíx¼*tùnß‘¼±P .‡ÖèÒ? ãÇ•Ý+:…íduËÌièÂöƒeg–•ÛV•-1;Ól!ókãÖ9Ê#±>þ¤cpßîb5áÒ«[7¦÷ûؾ±Uê¸åü•]ÓñÌîâa•xΛRÈò'!KȾ\Rÿß¼ê46*‡õê¼¹Ž#ž®N\½ÌhUƒ6*ß–5íÓFÆ™`€dJ¡gK¸ásY ‡ªŽÌB•~Hö¿BBI?÷˜ðín=K;š>’=@D7Haquîe8g‰¡R‹|Š@1ÏU @¥í€ºeî–¿ã-ûèwÔØ M9",‹„(.Õr¥à V䳜5™ª’À‰ +ñ’ÖšP„Ã¥æýs;6¢6ðÖ Ìí{^b˜†WZ&ÖºjùŸóÑãoòèKyI6ÚÅÔº¾ïxößZ§ã–×…è¨ ±ÊG(´Íµú8@KÁ¬¼¾ô—ø†5b˜·3¬8K‰c>ê ÄÐ=7`K#3v' ·6*®•]‹òSh>ëWw…z¡65=¥KêÅ««W£V>ë4Ýp´ü+LO&L@WZ³¤ÄHÖö9ŒûS&”'ô¦v ‹ŠT{g#Ò¢Œ™í{íGswÑšÀÏk[ÍkY¾í_÷ni”›%XQÚãá!îktÌà&+e­‚À¯-]îé|Î[R®µ®¯¦oÑÈC|”~êßCÊ‚GEs["Xºÿ %ÔÆJm$‡»!œÞÛõS /ÖWÉ 5{¿§\§îh¬¯ s• ±Ìë̹qxˆöa:©X4†Ñ#ÇwA• Oç€òèsuþ†!ÜÐ‰Ú ÷º#ÿU£C?ç‚¿¦Ô^YÄr›ûRá[™Ég8¾ï‰¼/âò˜¸®‡S!¨#ä„“´Ö'@'ð]°ib±†f@ÒÏÉh*-y]ñÙ,76su–<(·k€ýÝÊjêø<ã„u9ÏPê7z8æ§±÷ƒÜÇm‹íêÙ„-ɵôÄÌ@:þG€á/gg9¼¸ÛŸáÿãµÉn`÷#”Š¿6²ÇØÔĈœ:Y|ÑûšGᆠVSt]7¦(îaY„%Z±Ø{[ŸOT£gN4ä!aJ-RGjãTÓ-”‡ëÕJ;èÑ@(ßÕ„%-G—õëy½ÉY #¤àìßÄOÕÆ%É8YÉb|hûã$<¤™®Ç_^ùùR\ˆÑ&/êðÛCyÀ爡8ç“CÓÒvN?— <öu¯Mi??½—×ý߬ iˆùÛ+ I#¤bR¸ ð¨äÌÄ›¶)IÓ¸#íT…ƒØ4.à¤êVìb»G–VšŒ¨ÔpÆå.uëH‹ôUöET¶ˆD‘1ëŸKÁ®®”Uó‡õ}»°t‚}ˆ ;S³ä{ýÌÙR6¯5µ¾3bFËPz„“¯×n—¦Ås²<û©*õÏ ŠÆ"¶Ü€LsžŒ+ÀÔ<ìB} ’æ=I Ýq…î|3B¤ŠNöC¼»çPKÆ+Ù°÷ÉX=¬œcLã;[ø2Õ7?6Ëí«3'oÃÆÎ`·ÞX)æ~qQÕ¤s³û‚94/(Â^p[RÏÂ&°º”ï²BQ…¼0ï™þ•ôÅéK¸iÜvc'rîS—JÅj6Ê%×êOʆ‘Ÿ¬l0@X»'W:߇LeOÙëÆótQQ‚Ê$ð`ßD vDûúlÌV½”RÀÂÐÜK¡ ’²~"q†³I ¦ú?xsÉ`òŒjÛ´”Ø$â˜ãÃòå÷åܹøá ro=%Êíyôd­‰{[`Õ(¿¦á÷¤Ä]±‰Gôù0[2Íê©M {ܹZÛé“àI¨C÷m߃COXfå%øà(î3l§îdî‰=ùâ*…ì„ØÜœÅŒo8YÑPa6ÅS•Bb;àK+@ã ¹à«äâÓ®z×køXÏ qÞ‘C•õùjÓJâ¿zJt¢6ˆÆy–ñˆÀC"Nе¢ðïJÎZ¨1§ß ÜLï{Üe …S·TÃÑN&q»åâè¼²šXÄ4GøLSÙ·Á—L,?Âùço³uCãGé²ímĶ»—5ê"íPvÑp»%ZÜá$L¨ÄdׂÖ|«”â,éÌŒ×Ü—•ßw+놖õ³Â7¦¾’ ì¬7Ïꇞƒ?m+ûézÅwÌ¡¸9 Ü—ü*_ÅÝ#Ò«E¹aЮ¸¢vTªÔ‚ë¸r ¨ ´S‰TÉääl©@ü²­¨°+ÜPEøý$éD¨Î_ÉomŽðêò„›äB®\w2G²ì»Qáƒüǧ| Íöú©/%D¥s|8‡ äŠ%°c »KRø Ú —Ô” Å€8ˆâ™™¸­î*ëJöí­ô¸KCÍl}‘õp8ÖŸ†¾1õ79¿¥U&:®µ8at ÏüYówrŸ6¦dNžW?D{Qu‹ÇKŠ>—µÀÝ/éªé_ÅóT€Ù‘Ò­>ïüaÜ\Ñf òQAñ ‰Sè[œßMJí•VÝ`Pi#ݱ>Ä«ý4àS·ˆ¡é›ÉÂV.Æ/6?nð¬†nºèBe@rhë›+‹ûÔlëêFÐÛåã-¨Ó0 ÿs!e>©=¼{ëø·t`´ -W¤çË<)ŒÛÕ×" ™ÉÞŒð–]–JVÆ÷%‡Y¯I68çðÂz™V+}6Ú›#á´¸á·Nõu÷ GõO•ë[Xi#¿×/U ®%HªÔ½qCÎdûáö×ü RpfPIšÓÏ>4v>çŽKa•éltÝ6Õ~oÉוz¬¨…²èLúÊš8.Ï3a½(É™G¿£¼ {lVÆ*-Ð&x £nޤ¢Ë8¾ífÁW¿OÇ j$W`ø¥Ò~fGô×lYVÖ_–ІÅ'0ÌÔ­É}9rßDFïT¶Ú*.æà¤žÏëT4z‡ìe\Üé2"tM=¯â/\Ÿè%2;Å1¦GMÓ¾Õµë>9„U]å6¯l®Û Ó Áj:Çø 2póë°”šÓöo0ž±þöò¡¼¢7Ö}$• b‚º¼ß(ÅL“>^1‹Q’žR©Š„ï^ ·aÿI±vQ>[M,kˆ×ÎXj+êü<²”Yç¿Î)æÒб"5ùíÿ¬ïäûÑ'¨*F-q7d¨\ÊÉòsºèØqìƒ:ózˆQ!B·¸‡ú2óƒa£hBµq§´¤ë=ßÙ²’!wS5`¢õ ã|Øß…舤….Wá~Ì+Q¨ìžÍƒ SöyÐóë3¾~qÔÐò¨È±½¼WR2¬Žmü‰xù'B ØèÇêo2?lAVßóÿ'’4WzÇprqŽÛsf8I8«O ¨$Ñ8‰ëŸ2ìC35cKyJ21í³­÷Ò©ÑdŠ;½Tàj¬è0*|3Ýukáq3¼†¦zŽSÍ40S›Ž"eà9·¨îKÕë|s£c¯÷‰;-aîÇa›ú©+æX é¥s Vö•1¥÷ ª¹);¶÷¸&xB—rNS {µÛZÓ—(‚ƒ£‚žå‰~ÿÎÊY`¡ÛP3×êëUÛ¾(‘ayìS!wKE†Az¦‘ÑÞ]Ñ 3N3!üÕ5ªzYÔ_ûÄ&÷ؤ}áß–æêì5îæŸCFî]þ£®%½·æðhXo žË2yÞHGT—w+^pŸ= €v;ïG[Ó\QP¸¡Dpòìi­S¢ÎYLû®^y‡”;õÅEZQóÊ‘@P”;TÎw«g †ÖŠqïne¢kC¯¿Œvù 9ãuEWÄ ©õ_‚qüT«`G¼4]ÿ<“‡IÛ_ðêèR‘ôÛÒ´ Û€§Aˆ×}ãsÍ@ü&ë GlÇa_&¢¢Ä$‰ †‹"“¶é±¾Uz/è¿Õ·2Æ«ÆX®–Qâxí‚ ÷*¥Iô ±çH¥Þ‹#¸Óê2H¢®ÑOZL¹sÂbñƒ+¦²´71EÁƒ!†Ð€µ£ÿ†7¬¦¢ßûöw|¤™Á|ܵ‹+SF3oÍ;çÆ+îRѹڗ5¶•?' ³L|D3»qk|Ø+¨†ç´r×ÌuIxdiù[eíþ[#¤é<™îbÆÌž)Q|€ "Ô3¨Ò œšÑø”è›Xšh³pHÄX$JwúCÌI *_÷T9||laÊ> %œI -Zb39Ã~°_­œºšR¬ÈÐj)ð Úá-ϵãääs¥_²Ójxú`åyf‘’à!.Î?Fväæ/¶5Žý"þ7U[¯„P+>’QuÁ¯KÍmq©îxØ*šé{dÆ„œ_àÙ+v¹ ¤š#H´‘ª0-½â»SÍÖWCêÆ°Ðh~­†©÷YrlV»Ø_ @¬ü;v\Ê”Nÿ/¢ËO)·Ÿ¬ë¬l‰jCm¡£`hœeYá¹Åü)ïaáO×°ßþÄ™ ŽÖóÈ6=®ÿ’&b+ßk¢ÔÂd;¯«&¾R>å+ƒÀ¯qþXK©–ìH˜æÅd/°ÄÆ™œ]»¡PåÛšÎÿèáÊÉÑÒ^é+ØLòót;vJ=÷×J°*öÓ4_‘0!c1ô-c±»NKÃ…Ìv‡¥¤m4&ÑQv¡“‚´Ö\¢‰ÜW¥°Ã.ïz ×C³¬•æãµ‰$Æ»‡Ð‚‡pGÍ‹è=÷ôúŽjõõŽÒˆØJª ŸøAG5¥ï`¥íîôÜxåê7²ôUˆ¡¥r¿ xõÁ‚t³sˆÍÛi‰hâ{Œ¾ÛûºûÑz¦hÈ“¼Í1 ô­î,غï0Z7|¥w.`^è÷yã+&»qFÛ1í;t6X÷KªBŽÍþª‹¦†ÅËzDn˜¸Ôl¹XZÅêËìéû·GÀ‡RÙš†ê]Ç ^Ÿ__•1ZùªJždÿýí6ó¡IF˜æ‡èh~ ÷‹ƒFˆ8 Ð[ši9O@OÎzÐÝ7?¤É@;.”¤¢æ]RÈÍÆq§Ï9³Vsê'í~Ëp2LT„j”’â„ËÖ û^&eµABŠPl…_¼ó ªÝ:§d_éàc©| m¡¸&k7‡õ÷ÿÄ΃|‡8Ý—h±4 :q…¡Á¢yPDÞŠ~xïKâ¾®Òd{¼HÉRëd’¿÷p*é~À£Ö´òÚº¨}o‚4Ø™X—Š€Í²=ì¹Ü˜ ¹]£,‘ºÞi%/Õ«–Wã^=Áê–$8òf&GÔÑÁ&LÅkue]ÑÊò -Ê™¨>ÍÈà¿>©w‰4Mü–c½³sÆ¥“¾›=ÿÐf#_*‰¯•/^ ÈKW·`Ñ ·— 6.ÊXb]rcõŬîbh >„Ôz®:E…²'_xoÙ?bžËlœß†W¹nCÛ¾_/ù=Å/´ûq9‰éüà=­¦ÞbéMT¦}_ºÎnú²¶Ë‡_ZìÔÈEý$r‚âùLðãÍ>ƒ74 Læí£>¥Ât«@-•]Óz5B_}ðU²{Õî|GæÖƒ.l0I£6±ûY…p |«ŸXƧ^ÒµÜô:xª-»íª Õƒ£¾1R7BíÙÔxÝqY$È’Ç…JNo¸T‡Å†±ðµ0y©hE3ïï<¯º$ßð½V y-ÙI³`ÒØúðys­Ö¿s¿’„š–7Wõ{ ò{;Uà$ËSúU‹^ÊϤd¥Yú)ñ²fká“E\q{¼¥›1vb‰^] Ȩߣë¦?S‹-ÁAî- †ß¢í%fàpûH5ŽÐòÕí&ðC÷?ü•J?¼Þ`Gf1̆Y³}H2?ÞP·?‚®£Kø <îûY FZûÓ¶c”Ä>~|þdQ WFP˜Ô¼óžŸZvc ¤G#ªÛ9,tÐQ~F(Øwö=Ý ç‹lÓ«äa ó)œri‡-á=$"†ýgqþÆcû1Aí:é$?@.Ð ’(h·Á=°I^‚o«fU4ÂRäX;IJjàV` U!—væÐ[¶Æ°ß BËA(Þ—ÿQíêr2ßïÏ󹢪JÑÃÿ÷ÞÑDQ!¥Ç¯'oy_GfS1‹È=.y¸áÈA*†Ê¢S j%ÞdÔþýírpà#‰&.( ìݧ§ùƒÚ°¨p±^”öˆ“Y>Ͻ P¸o|¯bÕÖ\;±eš¯V摻Ȭ¬\›)Wh]O«­ÁìAJŲ–a B㙘ªjÅÜF´D æ"*Þƒ —ÖFßJx(Sͱ+y%U«÷¿•–oQ¿sSzÖ‹aJ؇×äyÜÈôlgÉŒ®Te?]ª¢añ@M©t|U6oxÁ׆ }µËL_@Zª¹Â6²*òÊäùö°:A½Ê „yæDj&–Ÿ*ü<½¿Î^X^à¾ù”:PcÌ~¥Lo×@”Þ"z„ððŽÖÑôÞüEµ€¡Í×áÄïwˆ ˜ÓïSmts·œñ·MQÈÐà‹Öµóˆ8#<±->§Æ¤b|–£˜«y¹OÖÖeQ£ežÛ«aèm#\Iê­h·æ÷Ä'(\ô"„½UíHø­Ý7¡ àöÄýá$Ì)ª õ½ª`³àË»HM2NÖ2Ú¾Wï­*bq6¥-ò°îEj½dšËx襓¿gY@"œEÓÁãݪ1>RáÍF™‰#߉¡…™œ§X«ºÂíõùÞ%)Ð €± {‘Íàˆ£°e۞䛘%êw»s§ÿ¢xêºTuè€Æ€{‰ $òÂeÈy Tš3AI.T·Ü™«ßÐö‚P¿Íz{ÞMn­NøÞ€Ü Ê¿eÂôœVi˜ÖöQDÔ¢t²!9FOQב(jóŸm?rFÆPTÞœè½ÁF«œût0ǺdEGȵ»Æ%‡hÍÓÜXØÿ‹?šoù6¶ÂI£×9yQŒa¨]„R=[º_idpÉ"L¬ ž7Ñåƒ3Ť#šËSò:'S(2NxåL$t›°8ñ®Jf67¡ðíã2ÎÏH¹3à[‹i±+¹2¢¹¨öqt°ã¦}pÒ™¥ÚR)O©›CFUе[Õqç»1k®k(*PáØkÁ7/«Änà‚òJ.bJX#†>ÕÑÄN–ÇÏ'öÙ¤HEIÇx[OÁÆ¢ŸbvØ ÿ}ƒò@§¾ýžªns*-gØ•”j{ŠÚ&X¼J–ñ¥õ‰¡Å”¯_KDGi1›Ò/ÄÚk¾™ v·ê¼¥?Ê‚Ï9öxàcãíuÚUö}ëjóÏè§1q×gut~¥s·MÔq¥­Ò7Å6eé'…ƨ­o¹MON„“q-¬Üßx®&rÎáZs†>0_ßÓpú¸H–&M‹µ«- öÎãå)òT;X¯ZhHwsd"øõ¶™…ý³|rj@Œ=/ŠÁÌ„xø>vY\nôuv+R€m÷0qœ0µ² ÉB’B ÓÖ»cW`xµ'c8F©Ç¾¹ÏµJ&ò=yf .ìæ¸M“1Ñê–aΔ½‘+e’FýÍl‘XŒ,„<–KÃÁb÷([œ¦r”Й¹Ò+¬4ò(¶îG)à…)('E¼R·jR ›1ü¹úÕ1“¹£ŠbÍ„ñ£e &õÁƒvðŸô_?Kyé|>¦„v¡Ý™E§VW[‡Ô’fˆ‚©7+ÇYaÖŒÊ>õp3´æTÌÿgqùÕKr£ž©úŽ<þZÛÀ ÃºŽ´ %.Ùܹ×a‚ŸAÖçÚNN,‰Jº$µ»f÷ÍQÛ5‰x¼ý7¹$NǵçÈ+œ»T¥FŽIç€ßæRBƉú>0¦ß†A/N·39ãùà Ãïuß^Š!}BœÓqå%ÙrÏk÷O´¾ÈK²"ðofTâõßa0Å)¢ˆ1ÏÛU+cÜÿrGÍ]¤KÏs—Þ¿'}ÝÀÔû4ýTézËè¶Å–¬ìÕ—DžÓšðü˜7†Ö°Ÿ:_ ¡*­ïöSMA¯±zQ¢X'ÉP–‚0<3¢ÔçæLåÉ&rJÊ8»ëÊN<î*›½¹a:Ÿ¡$FAÚƒ~„—ÑXÀa{ðÉ=ñ ËQ)EübMJŠ{µï¸6Va9­_HÒÛà•eCå_Nå±LO;p¶Mn¢".7—$øcìtás±©y0LÏËæyÍrQZ*>g˜Y~<½…‘…Ä *ˆO/³\CûåÃ$äL'8\.»Ž^/8(Oˆÿ!ˆÎhmÖwMÛ÷üʧc’æ±â„Fêç@ò¸“ ƒ’ã¦Ho¦G|}rÆh5+ˆÈ%yw•œK`”[dQu@Õ‘¬:€KMªoçéJ;M²E7ÒŸ×&Q¤H‰ÐÆ—ë,ùäIzZk -‚W„‚ø‚NÆšK «‚ýJæœ_õÖW,ü kH!ï<,æê0ÀãaL è,çm\õˆ"k-¨¨mô2EbBÐéVçÓ;ŸÄ(ÿ9‹F…y‘H0ŒèMãç÷˜™95uŒÙŠuU7Õ°+C@×°J¯îÊÙ¯&†Î×v›œTg8<Þä=1hIýÜ ….ù •ÜXÊÀWóÞ%þ>Owyzá3y¿Ô,þ”ìØàØJ-Xi–Û÷ì#ƒ^í;cWxÍýh®Û8­³×_y ÖÁï®õkeˆŸ ¿•ý2Îá‰ó.0>ö-CÍÞIHø§FÆG·׉gààuœi€5NkúÑÈpTÞñ¼!)¨ Õ%ª¤&Sð:<×)ñÏlÜðÙ] øæe¢ Χ¦§LÔêrŸä£ñ¸‡Eñ›îNNÔ„å™–xçF¸/‹õ~ß««×Û_MQfîÔ<÷Âþ’E¥¶¡Ÿ¼G&nQâ™Þ¿N,Ëlδ!OÀ¾éº¯¶—iEćJÅ°Âø6åÅrù+ò×Rš%qÎKóáT Ù¥í,zŠ2òÑ=àŠÿTÅ)´Ã‚µ’]T´'u.Üúã¾9¶F& þ‹» b¥D+±¢J~>%PO!/dí+æ·uEŒóâ„á¸Ô¶Ë`b‘ŠÎå( ½Ðì"“h¬²X&#§EK·!:òé^ƒq÷eIz°…{»kÒœ“¦¢»¥ÝÏ&Žíâ4Êü˜D ÝÚ¤¥VTL6­ËkÅãƒrü®T´ï]ƒ½‹W^è¸Ø-#i¯–¾æÍãKFŽÝ#C“ÕR®‘ OKÊ=;6öU³ç×ÃCß„7f=rHujÈêçÐß8Yº±™„ìE1æ¸T6>H꨷ù‘ž_ïdä ö €e±¼yîÚãð{ÙcÆÅêHãçV*è÷96 mâÎT ·d±ÒV+©p·kÔä, ;_4#q )Xh´f¶¡†Ðt_èÔŸ{)Txmf ª÷Ct#SîMK,‚Y⣦ÕMt™_#}©¯|¾ëßJN°J &>Jë JHÍ?Àûw×/ØI5—à¬\i¶¼od‘šá‡º–ZÎÒÏ>i¼‹£“¤ó áÄý Ê ¡à")Õ@ên¿eToƒBïÞz^¼¿Œ®íx¹Õ(Q?¿ö¸k:“Iþ9Ÿþèv.­}»Ñ= š7)øÐs~§»^ÄGá. ùØS¯ ÃÐ)•âúå}M~V-‹½’5¸¤–Ïz-ï!¡`ëö ª¤sÑc Ò5~°–Q·ô“%Ò4ýˆÜï‰ëÛêBià ¢>¸AÐí/-朄ÎO–QXå=Fq y¿¥]i÷†ëY’¶’©øÖõâ® g(¥\~M}7†êWU㬄hdú¬ñfBäìØÝðê1ØUãÕz…—ù7×`¼7ÒHño¦ÞC¾cQ®Ç¤Ñô ©Ñ›N)[äÝcä`‰‹&³¶ˆMý»â+zÑT@æ…H œË¤ÝnÅÛŽ5’Eú•@uaHvw*Q·¿©à°x£Ž"«3ÑÙ~i—3ŸwÉÅb×? &d£^©%Ì<ò<dï.ÿ|Íe¾º¯G¥¹Å`öµÌÓäë乃ÂìéÑ/é¦P¬y¨^ îÈìá‹<a9ï©¢HŸ <çŠ8J”%&½Ž¦ãõZ„¯ë òEíJÛæDpG„?²NË?Å„ìd°˜Üˆ3,±A½3Á²®&Fü(‰I}Dá6aáÀÞ ^^cäâô,ë[¸Êôu€G}×|+Wmך=?7g>@8çx÷б®5²&jõüÖfÈwøv³ô¦!oØA¶0ä1ÏV tF«Ü)+dÍž,—ù5 d ›1ɺ׻ê i #Ö9¿­žíxf· b"}:Z©ÃÚ»ÈXÂÏf-O`ÆtG¢ ÷ßöj`¬€‡RwUo\ÖþÛR5—‰ö¿<Û[°ï*déÌg˜ï×»•M†­ü_ †°û¸” lŠpG6íe{†}€‰‚l Cn„IþïQL¼3µ@ÛUÚ-°¼BV £¨4È0ÝQðà2ßðúLt­ä¾ 7Ò&¹J„<±F=úW6óžÒ‘XuȬ¹‡ž•¸…Þàúªx8=-À{t?WجB3‘rüO•tÓzÁ Ö‚ê5B{”@žIvÿ: fMÕÿ“øk?mÒËß)îMïÿ)ðÅéQ‘î *NÄè54å„_çY#_Š]Çúë”ÄW œ—¼¯ÐÁÚ7ÙFÐ 4ȨçFŒa‹¹ 13κyói|ËK½<å!%J%éठp雞ðŽ@¦™°A,GuÕ‡q¾’V7…-ÅÎ[ƒÊVÏðÑ[&Yê‡qSõsÜ@ÉÙ½;¬l>s|÷ÖÒVÿ—¤, u#‘ÏéN/ÞüK«/ÝQò>d¶ß‚t]Õ656ä/‰¸X- ØÕ«1 8rÆàèùÄq8w…}ºš;8Žb˜2›ÞÞÆ?:·‡sÉ?!÷#›xdlºÜõÖ·Ç¡hü™ÓJ«‹jwóýy´a5–…»¬ûaÍ[Q½ÀCOœDZÙL/–ÿØ!ÊKÔfN»[D2mÔ &ñ°ŒßL!ºj¨úÉÁ>j‰ÿê€FE}³®NhQ\*|'OªÝ!\$u[ ìÄ V‹„ë®»þÎí”7f;!K·°P!ÈadXÖk*Ë<¤Äçù²~Èy–÷-jÏüi•Gp¬œõØó¹"d’¨ÑP¯˜Ô ¹€˜^Âã@d^?ŠwŒ‡dï ë­m@º~mã.ô-!8Ý¢ÍevÙ6QÐóÂìª~ý¹äé&ÐZþòobäJ4–õ(èœ=êð¢`"d|`ÈiOžø»GIPrYÀ™ç"›)ù¿1ŽR±›ÒE¼ã£ãÓ™‰_ÓPþØÖœG!Þ:·=©ñ _¹j©ý·€ö' +uÄתV~àÉ~k·ïœV>â|ùDTe4¡ï8CÑÃíÎù'¥›Å·z-å4£åˆ@ ç!)Á½îÃêô‚†aÊß‹n%õjïJ9G%«]¿Àõce:ªSþ \[ –ãø)T/û-²z!2´¨­uîñíù3t“Q5â¬eàè"<$à‘–¥jÐ$ú¿‹>)sœZmÞGæè÷ÛrÜ÷¨‘¸ãë}b ¸Öx=Y–äïhÊÆj×xZ„öäŒ=ÜäÛÒÁ§Y’ݱÈé,ž³öM|_7EYwá-inögR©é4Õr´ ®w¥-$àªÇûu-ØÁ`÷”Ž.@uNWR/ø›Ë¿ÕÌiçíáþv­øk‹îÂör8|Ê"ÛŸ-òö´Ê¾Ô‚ó$2Ïï㺸2¿ µÒ“0×½Y‰Ýü²ÏÁ—ú°ÛÅPòF&ÔÒDV€8!A0jp2î5Ž”º‡!?q•œR‹¾ÅÛD/åŠcõ¬´ñ‘fÏ5qžÐ»RôUÿŠ~j† Þg¨ÚbX„f#>pQ¬c™ò`åIdabIæãFª-ná•ù|¼Y™#Ï_×áŒO?¼ðÄó˜²eë·ÙÔ=ƒÃŒ‰Ðã !Ù*­b‰¨£èÌÜ»?äkÝ£0áçS±@ô»Š™á-Ôì¹lŸ0Èм¨$òÇ]¿Éž’Ê÷˜îú½'(ä:1Q…©Tº¦Ä{¾þ÷·møíâM3Êúœç­p×/„fÆ/ kS:¬¶æe•_«iɹ_ï"&÷âO};P:ù‚-õ2ˆ;cԌɔ­.õDœ„|92ÕK“oàwʸžV¥à)Iܘ-¾^s"¯œÂ$¢6Ê(»E&Š˜OH8œ‘}ØWy1ƒ'úXKºçŒ.ìp/åçzäýJ‚Í䘭CëHB‹Œ•m‚ÊGZS™åôØez¢‹©:Î :4óÇü%(} 6<’¦[܇5.Zï^0m·×¦SnY¿Î‚*LŽº jÜ æ¦_—k±Ñ_©ïH(mMVJÊë@û¯W|zz˜ ·Âª(=R¦0¯$¼‰. §è€ ó•eºmº °À“„àdŸëNÛ×û†¹ühFZ“´šfEÎ×á@ëhXí}Ž4Þ¤ûÁØûóŒ}ß󑹯‹Ïd²Ÿ"Ž9§1G,”Þ¤þ úãö ‘n¼µ,m°¡sà ý­—S$Käsm˯ð2ž¡•§û\ú¨æõ®âÁÄooŠÿYöU/)E±fFVW77aú=e\zZ\U»wdc ikñ¥Ÿ\] ö“#)X‹î(ˆá©ó¬;o ˜*È.¢F[&{‡iîB”{÷,k›Î•¡XPÙU9UÕ›8Üc/pør*U%ð„U€3‹=©SN¾.×ߘP?CuÌ2ºŸÆñœmWg¾´©ð}ÏrŒßu;ñ¥EÆË÷´iïÙ¸³«+|x)Ãw*¸i†³Z ô…¿¿+È”Ü;Êišwáß ÏÑLªi)Z{îK¢,$ñàŒ®5ÞÆ^|g)G¦Wï¹ÆÐ>ʸ*Ñaš±-1™;í°1’¹Ü*¿¿"È´É•¹Û+ÄJöñ6P'K"xCð‘L¿|Áœ­4žYk“03EEgcÒàÙîV¢F¼W)íMÉ‹ó¾ŸÏæ&Œú´$à_Bó‰[ó5ðÒ/³Œ?sêW„ˆ¥›Ï$¹~Í ÆJêØønêiz:h|18a~l?}—¿ û1wíT¨kÉÜ=Ó<3GàÜÀ eÍ:¬ŠG .6¥—3?üC_ï85ûò´äÆ]M ¨ý6<&?2S.X)S7!Hîvn5蕲ð”up,õú~Tœú¨¸ ÿs;|R®O«ô©_éÝÞ® ”ë®k5% ŒÈS`òï…³ÙÞ5ÞR ~H&=ÌQ"«R¼× ‡;ñ ಒÚÂH ’KŠ{¡ÔX2Œd^ôÔÝAßP|¶WáhÃØUený¯Oìý#v©Ël€Rjk_hÜ÷~³À²eã¯L±Ì‘ã³»GFgÔ.ðP³µ É™wÏ_€N•Sœ9$-J˜­˜îœÃaTÀ€ó‘S×gnI^ã)ß?zšŒâJXñ½š'BQhפüÇ^þøÙW…åÇD¡ŽD òÝÆÛ^p!Þú[eO符¼&Ì<ô`é¡”ª6{Ší2“&4L³Œ˜]°R¡–¯Ãße·Š³‰«žÂƒnRaî”u¸„h8hß"LlÇÌÆÇ»t”Â<˜f¯È.­ŸDK´CR÷¬ßj¾ºÝ•bÒ‘‘Nú3†vÇÄ–ÂqNè6d!“üÑ\þ2ü•Š51 ’¤,¯YvÛ¬¥©)¶=¦ï ù+íË]´¢ênGfM»éÞp3?â©·4\úJ¬ Uy¨o·…K¬Ë8/›Ú{ÅiŒ¶¯ùQuK_þ+}<2"¤P3Éžæv’­LÓVn-~ú3m_w--éÚA…ltÁß•fœ}úµÃ•£:¹È^…þèE Íû–eû/Ñ.¯ËæÎñ[Š&':]Zë¿y¬Ñ܈ÞIÁe×Ã-n^êwoƒ ^‡Ã( Ü ‰Ö:\Žñ¸2:œ5Ì‚UWz¼Æ4âb»º÷Rï`[èƒN‰ÕE€€œÓ ^ûw_š0òªäe˜e@f9]+~DiK먽˜*œ¾håÅ’ô*sÑÆƒÃÐUµËYéõ‡Zs‰)Ý6¬r%Ïvx7/ЏPZ™T¢Þ­_ üÆY½ KÂ9U)ªµû˜t,±þlUüÇ®þApÐCV“°é¬tò¦åð*²"üNE·¡Xd¯—=î|$[ƒ°Šý+ ᥢԬƒ\åLþŇ%"Zdc–üõ•×®oœ3ÖØ‹ƒ¢¶Ûx‚ÑŒ.z/îeðƧô „O)»xç¹ÂËÂ&Þè¸ÁâÂîáÚ/ÙåôþtOuZ=§SÃç ˜¼)rŸ›ÇiýÍ ÖŒZ*3¼"ªM²:Û´lÔšp0—í –•IàKYiM”‡t—ÝfF3ãh‘Êî’ž¿ªžÚvûóIû^Y£/ÓARDÔ¥¶kfäJFñŠB¾ÛÆÛëܪ(æ¶äÈuÒmïÿz³œÞÙß,·V³’p${ð¸ëûЗ{ÿ2,Ï£è¢Æhª’âí{¿ä~ؽբlðd9¥Í #„Ô Ù>GŒIsrh:?ò&(ËÍD¼+“>Òš?A>ýÐø¤#ÜAPçK=M«ÛYLm1úòèi¨¦´n3l˜ža›„–ôäò¼¢ìds R[…% 2(‚‘IH ꮿŠk7YD²N€6ô³"J‚FÌTÞFGÐnW³I{hêâp/÷>+¬þ¹É&—‚Ð`£‚Md„½ç)³®Ö¯£®Æ‰=Ýí>MBŠÙOÂIÄ´AfG"ìèŠTVÛPÿ#4&´wXð’\— RÒ?å%Éø(‚F¶l±cSe,ܪ‘pt ·˜òZsê7JŸQd6¶’$L¦è/Ó½jëëmV ¶d@g2,}oÑ(¸‘‹ß”‹Ì¹¨…¡ªÙj£[ü÷A¹]Çñ’ôoçË ×ÕYúØÌ? ž;If·tÙ·H[MSt";Ç#âp~^Uðï%d{ûÄ‚€=§q4¿×Ùò£`¯ï/!ÜoîÃòæ^-²Ͼ^Á¯Û R°NÀTÔê¼4%5\,Ç»ìákæÉŬ¡UŒ¾¬Á¨Ñ§ªìøqË*¤FöÏüWÛœSw‘WbÀÁå¨qÕ[r÷ w“»iŸe»Úiv…ëdyU€ ƒúÉÆöË7縮ZáMfµÄu Ü4Œ÷øÊjMö¡‹_ø/Zå"þÕ2eå.‰)ñËß7³0º 5Õ\†›tHð1 =í} pqŽ2‡E~Á0yþc“:µ0xª,„ûöçÀyç í<ùªÛ"¸æµÅ{¯ÄŽx ×ÔŽ@/3q¦ZRÇ»øD}²ç“ òAiâvÌ‹açZW:Ûì2mß@{ÇçV¹6Ɇ[‹|ž›<ÔÖEjü%ÒDÖ[µÉÂÇnU¬u~¦¶^ m™¼s3Ì3DÆ›ýš…t’nG˜¿czËè!–çü?§ks‰yWcyjÝçpi:0«B‹Âô(–ÄÊ€°4M»ñ¤ÇsV©üúóYþèöã%Clâ\Ü¢Å0¥™µô;XR'’6*Œõ ¿¶b Ç˜™<2 à5t”é çÙiViÄ E¦x·ÅÏ4ã°• Ó–¸hhö~z‰¦ÿgiwjõ³ÂX3Õ+ë¶"‰,h÷v ôfnTmÎH§ì8S7jSÔXJ‹3†øÊüáYu¬wÕ üΛK­›³²“¾7³¥ªÉ»ñKˆÔQÌŸGÀý7÷Îr´Ì8o¢° †71N)9Ù²ú¿Sñ´œçFÜéWþµ$LÅ Ùp䔀ûÍNó8Z,tOE5 ¡d&ˆs²ÑNÙ'{Íæ1uynÃ?ʇõFb1˜…pt¶*ðá”6w]„™ü±/Ñ âµ:ˆÝmÆ”ÅÕÑO¢yà[:ÈŒµA×®w wù^Æ·ö=˘·E1N¼e’ûŠMkÛ[(í²²òhJ2ÜU.R‰ê—Dk'e…ß¿âFœ''$£p«óU oˆgÇV|d$#cæËD %^ôçòD46- ¤YZ}€ýHþ7J„IJ¤:±jÈó3_h)ƹÖLa¸ÒO›Ó´J ¹³!Á¡ä~E¨[dáM„=굋¶QŹóÏAZw- gÚ"ûû¼Ë®øcåÒ6爗ÄÉ_¿Î3 ö¿!`Äiµ§jlJ„OCúÒ¾È!­5ûãQ² ò²ÅAô–‹‹T æ7åÁjÑÍg€Ç+ùóÎÄ<]~é;Xe¼ÄŠL¯á-Õ2IùÚ©ŠÿTª2è_ùÇ:0³Y6<ÑaaU;óa›n›ñ£Áj)·\ž•‚ö+or–€3å1óCétkt<|8i™š„Lm®ÙÍdz¡»_»ã"ç@QEï9ø.ô–bR2®ÌˆŽ ÅKl¥NcFÚ>Ò1üBhË4x-Þª !…à(p?3ó©=Ý8F²‰/<œ×К --5ìxw¡êyû£-ľ=ò»M¡n©\G—»fL•V[zà¶;¾àuæoÿ%œsm +êó*"_©™=Ô›µsŒûWGd,©8}‡ëDG® *ë²àÎðòˆÈ·Aï±oŠ`ˆÃ›ÍÇ]e—@?¨wÓ$:­H*’‡ËÈ!@awœ8åFÉJ´®^áŠDë$?ÔÒê! ©8{ôÁ‘–‘ ùØéô)â`™Gxw2A,~ÍçÄšŸ?¾?k‡3b:5"›gõ½m=á_6‘–X­nk¾³›ù~lû'^pÕqFŠòŸßë`'¤Yèöyób]þ@¹p^0Fc›W@ùȲS ¨¹ò½N/ßE“ þ¬ŸÅÙ­× L¡z!˜«ŒcC’p] _ÂP¼ê¢&¹)Œ’7 æâài[ØúرüÕoBÇ5½ïU¦_nÖ ¨OR$JÃ*ý0CŽé¦XWäì¹:¨©{QÐs ™“´H'hJáõfZdÒýˆ lªÛîþ†VK¨·D6 ¡ê,Ù|,îšìr¨Ê õrðŸÒ÷C¦à¡¶'ì–åIüôÁp…“Vo–^Z̵óÜ{$»¹(HÆbÄWƒ2»—…âLOð_Ájÿ±Ÿ¢¾çBíØ Z.ä R­T_®ô°ø3SÙ“l° j ðäB\ÂtèË3žäÿ€Öp²1Ø»ôg#!ž¶:Çt»ÿùý'¦v€³c?åt l“X?êêdg5ÈI[âð²Æ$vÿhW©Û㎆ŸiˆÉðþÔ§õ_¿„€`†X(sGuÐÛQÀD&6VŽÔßç›Ão]d¤/Ü›È+ÒºZŒ(æPt.ºvúý(;—ÜÐi&œPN Þxý¢ë³ÒE¸ ¥”O2>R€ØŒ”ô—ØÇídŽk ™+w¿\ñ8ëÄËÿþL±'1ž _>‡a`r¥®<*‰éãÿŒ#ýe!L–ÿ¿trËy5ð\9ëï—0+HcÐoßÎåc@9E€]ƒŽ Ù>K šöXEEÇÖ«ñÌÿ$ ‹rãÒšNÄØº ÇZlÙ+˱*0ä­fB×…Œ¨åÙ£¼z $R m~×n8i cëƒ3Cö=Øîå?Ïu J~<#å2¢S­šZ:N@¤sâª'/Ï袌'˜¼ñá é;6ж8#pþt°Z¯o†ï¨ƒÊŠ’NԸ̻îJOÁ,ž-i¼ðKLc)¥¯íp ›†Ï™ ’åâœã„Ã-GÉæÆÄýíI˜Þ CT+Ù<%@#8„€sð¢'? EX‰Íì”Çmv)ºOkU­ý©+~©•ô³öʰۦD4ìצ5ÑÛÞªZ±÷k~±[rDPB&œã9|A ’âÊQoÕ¢ÍçI¤‘g.Rì/Õ—Ôè*D<àìL§Sìx&€ÇmTªlß áf‹S'ÃÅÎÍgæ œï‡Ó4iÍ! T†I)Ô>Ál„ .è¿¢Ö§¸Ëj‚Ę(d[S$ïЦ£D“Ö:܈úy%¹$}2Ð$4"×eqÐ$ãâC¡}êÃKt›õ¼®01î]¨_«ÉГýO÷]ãÆ1vš‚¸Ý›¼­êß…øº Ü]q‘Ñ•iðJFh%Ñ»Î]›§0¸|ààEö줻b]b°¼¬7“îÿ…Ëûç±Ö’«ò.vé;ͧD Ì©¢I¸a@ biÝ:Qù, Tˆ\òÎ »Ï÷;ÎJªKGRýqê †g š\œçó›MiÓÈ…Þ÷ñÆŽàÍ"HÓî5ðaŸplˆ.ìem˜ùÚ!À—Ìž wQr|š|G™K\´–ßM¿³.­ªÓ8d&ºó¯Ï^ùµgÕä+M®>¬Bñ›¯!›=±—péªK#¦.)¶ßMˆ‘ÔIûWÝAQX ¦êy¸!Œ¿“5毌z%—ˆ¶çÙqýBÆÆ8L|<êó™âN+óú2eTv^ôˆ²—…I^˜ÐdÔ“2\d{®w¾èŒç›Žâíßí[”I9ñyg”ÎDB™ „v„, ”ªÉóyÜ0­ÅfHêÊòÍ©jÒ oáÄßKé¸"WW&ú´61E?æ€zŸæŠhù§\C6Ÿ$<³CÊçàχ P <>¶$ì RJ¬öÞ9À;÷´lÒ_ïÉCÇà˜Q3.Evq—lë0xE3£9¼­Œþ.Ù“IÁ?x³Ã­¸–šÁšÄXÏYGÄmz¥é¤·ñ;6&˜®\çZ‰LÁOÇ`?ã8×XÝħ±²GF£ÿ‚¡¦5Œ(×tºêTØÞ5þq†`öºGνà09|–9˵M‰*£9TD*¿ç¸¥ÍˆÂ‚žL†¹ª¥ßo¤²ý3B¼?SããåK÷ªªèlk£fdÞuÙÈ.GÎÜ8†Çve© ™ Zǧ«¨çÊ€»KeÈ=¥Å§±ì;?p^ÛWp–œy#‰»,Ô er‹R`(W éÌWå?®k—ÃPîź D-ð[£ÖÂýØkˆv GC±ˆNFØñ÷5½âMµ&Ê Š©¡8S \ÎoÂñ‘—@Ó;¼jpø/ê TeÒ€9JÈÀK2éÇ¥^`±‘ÐÚÇ5žêJ ÛH楰­Èíädw­W0´vÓ|#*-i꣤oòz–¥ïëÑ畯¨ªƒ³fç£ÿƒ ô» ˆYb~¤Ø¶>heÏÝ;'~ð‘/ÕT§Ÿ»/!/ÿ£ÛQÙl†%›²TüqØåä˯Ê—wPñÇ{°…¯ƒVî1{ÄŸE¸Çä¦÷ŒOì6É`¬tžY$ywÚÊ“¢T6ÛJT«õYý¾¿4ð–»7†íök×¼•Àh ®ÒdÌÛX{ƒÐü&V~ó¶žÃ‰± _dˆ˜Ó Ǫw¢ý¶ÓQkK2xM†‘Îd»—þ]µ r‘ž'œ¹=ÔþTn‘Ó"Ù÷qL„\·¸„,½û¹P>\Þv"Œ—Æ’DLwÚ²þœðU’õI¯o|hËT³{ù]Ô{bnµÖr%'JnU50=CPïJôäÇ õµº¸¿("ÿQÈ@EصíWÝ-3íÅAœgþ÷f¹ý{îPXCtëü1ZZó©n6.£3Ò%æžjW…¨Æ~¿’ðÆØµÎ—7|*ïOtUØEÅbî@³n˜¼—‡Ø˜]ã1y²=háRH‹º„F/J«çi†„ñFàC”`+Ž}-LDõë\U(ïÌvèêNÄï5N§!¡’šÇø|ì²Ît2¾?÷·hòA¶…ü`zÈ TÔŒ&‰o ƒ'ŠCL/ôNõãÀWaÍ%àÜxÊÉ\{ti®²õ?D±'ô‹eY×€ ´hÔ0ÊíFñ$]ªDg‡3aý;dôvSΗLÎÊ=Zç^}}FÈž¢1=%ØÕ®ü ÷ùëiHuiP¿sèûΜ—š¢³~­tï‡giON Œ0 ë@Š6ê)6Œê”ŠÎb„Ö:ƒžj0ΆnU®f ¤îîˆ3À‚xð«Ls”Ëqç.µ°= hÚv„\Íl‘bªÄíx·:à&Èü©‹ÏçÈ*¥ßM_ñ<ìåhÑZ†:ØTˆÇaê6!üiŽÿQÇãݱ‡Â¡•#iWˆJ¸ó䓈 ±"BûFhÉGÑK´ÏO¸‚“Pü½âGì  ”ëö•í±Œ{ÕÒåì˜Rc¯³Ý«Y$,+?Žú€™Ø^”7ÞH‰¸ÅØóו©~®j·Z+O€Ö ã.ìø _°‹Ê1Gjñ#}¶_…mÊ݆MÈågðB—kRÝ7BWÓ^T:.~3þ€ž—ØhŽÕÃÀpNÆÓò#Šl×öâb¼÷aï|3g sð©6µçÉÎD‘£Q ‹vÒ–ð+6; ÞëA•ŽX‘<âtØÆ‰ qhAëã—»i£q•Õm÷$žÙH¼Azž?³–jTÝúŸ¼&|aǪRns¦Äù4V¤0 ½gƒ¤_‹ïÌ >ù*ØëÜ€ð› Å­%®)£´ îÝOe„úyä?oðg“ëòæ®É¶ÆÁu~1G›õÄØÃ¢òOä7}cM+=zíúêøûV· †}=ë`ä6È*œ’nñ«#ÆÂ_h¾½bP`^ _ Œ#6¶Õ§¬–c³ Ðª®ê ŠX.dN'Ú˜N¥fkû˜„e§Ü©ÑÔwªLII3îêµ\øYŽCäÂåÑn­Là.ˆäŪêþ‘M•e1CUr2Ù°•ºÅšCÃ%¯žÕ/æÛ§¬oRÔÎ|Õãç°3ïšñ}•XðµtØ÷»ºËÊN»cR1Ètá&‰ ÁÒxì9OïWÛÞñ?”V¬ßSèþ嘩n03ƒ ŸChô’ ™ö2—f¶íÃ)À²÷Ö$r¦ºæƒP›F®ò63<íOd+ò½ô/§AMOá‘Õn†)ƒåÌìRiŽ»x3”2ƒº¿ô•üõ„_ïˆ0²¢j¬Ï~Ö{éÓÉB1æNGµbÌ_Àíxõ UÓ®Ù)cqÎòuAž…ûÊ™Äêet³¬ö˜åGŒhq.P…ùÜÕµ:5QB­„O”ÝW‹P~%$ö|…64X‘ ©>?OÚ,¶FÌ;³ýdÙ0»(dCŽ&&OƳ”Ò.neUÒ0BÉòëU³N\œªb0€@Þ˜9«fçíD5ÅZ«ö複z{cYÚeƒWåí]SfÇÆ¬÷æ=Éø9ïN­¼Zl˜µ¹1ï–²p|tȱ\ÞBÅ_YÂHÿ¾j{kl;!±L|ž ÿ+vYbSàcœÎ xSüûÏ%èÊ,žZ—ŠCò<ìç*»«eú4Z.`âÒÙ{-NÙÉÎ:–à€—SÕA9½-k˜Ñ»ØF}™l‚^Ñó®VV‚ãep¥¬©g@`Ðì톭kXýþe6p]{¯cÐëÀ&⑘]>NÑÈl޽/U·]!w}ð€ÁqóMæç¹½DŸµ1þC”êï†_â{§j³øŽDò*nZëKà¨Ñn¿™3…©D¥õa}ªê]GÁ’4zBÀÂqU½® ZˆÕÛ3mš)j8ÜÓ8µ?/SXÄÍ VæÁ6oμ]“ñ%+âRU?Û¡ ¤ô„×Õɶ,¼R#¡»ÙüUÄn{z}ÞŸçów{uÑÙI§èkÅ;$ ÎkFœª0ÅnFâ-|õ¥8P}¥ŽÄ.Pâ£púAÐáÚSðF:»û/»Îìð›+þÙºë¹5A]ië¼DÎÈ5rÒ Zò×îší tÙÔ\©o¿—™ûrÏh|šäùDˆT—_R»³Ò‹ØBªiÆCöÈúKæ”!µïcUHœ÷F¯­é96¾©6šíh—…¶2ißMµ缊ü æ^³õ›u¤ÁÃÍ.Õ± >±WAA0B‚ê&NÒ“¿ß嘗$7ŽôÐ0±ÕþÿA¿aLêÅg}­LÓ_-G¿ŽßQ<H~YqÇÚ1\²iœ  1vlµ+‘’§ïð;Ñ,¶2aì±ãFIO¿·cXrtÈ_}bñçÔTZ!'¾`ž-{¬ß//÷gmÝé Q‹ ‰ì°‰á½=¶Ö8W ÌYéD· P^8§6²m4utál@æ#Ó§ñëÒ2Z\¥áÆbŸ.},6%¸¡@EÃ!DmŒ«~ÿA—Ú¥<Ùc3p›<ýª´þyDýé^†>§L¶m’Š‚ÚÛõ„·Rb·É`#’ŠÐyà¦{µ×'Œ¥¢=Ͷ´zbÊñtzí®ØPcûf˜Â¥8¢)Ö}×®^9¥“ÇzÚìœô¨îÌ<ðZtÊÕ^L~˜ÝNÑÔ$?B˜²'•²Lå«È¹2¤Lù†[M|•qN®AÛ^™Ÿ*‰kó³–i¦w™¥ÿöô²âG¦ò·ìPÈóªØ ÿµQ¬o›£Yd<ÿc‹¢ÛT½$-õ¾ùNÛÎ×¶ºº"º…iÝEXÞy´ ‹ÅÔ“¦ãŠyŽ´»HdG®C¢×”È]Pf<ÙHÆ{šA_Øš0õ ›ø‘B/½Wƒ•sõ¾ô.Ÿcý÷ë)žVÁ¾ó°Î3Ä=Ù$Ú@%ÈÒ›s·iO*«¤.=Šs±eÖgÌÍ¡WYsô˜‘Ú:cÄô•¿½Œ}²l2Oþ­šHwÐú¤‹ç¬ï÷÷ì‰äQŸI8éqL¢xd7tø”_¸ „Ö O^³@º€¸*$ÕðVsE0D{Jˆ/È01tšNÊÙݸ‚¹;Ñ`ü°ãÀcP¨è¸DC†K4[àÒ¾µn‹°âMã7»¨°·a/|£¢Q@€ÓÖI¤âà1×Á’«fõËV\ìêÖox¦ãAC æµ(”_)Û¦À“KöÍL¸v¡(’þºZ§á|æ°jwLÿIú1^p`K*kÿü¾pQ@Œ-Àr{TÇœ6ki”ϲ°}çD.Ré­‹`fÿH®Ê´ÁÓ -ìxn$¹jßÐðLOáªBA©ÕzA^”ùùÙÏm7:ðåêþ"eØûyôŽžJFRŽp,´h„ùAÞ»rUÁ‰oŽ×›j Cl¶“ ÛKPM…(Í—òƒ±ÊK­Ü©Ä/¢T"çor§NoKJ#æS •0ú¸^]~p¿àèiç<ÑfRÇW«1YéÍlP f›úÙÌ´M…{€º”yÐ]žUÿ ¥—Šy°yR:“êqQ°Øyj px¥œ¬3˜§ÚöºH~ÞY â%»ÜçÞÚP‚8Ä4¶^Â9绪Vʽ•{êÿ¬± ˜\;ÞMØ›€_÷T?ï^ð¬ý⺛aØ6*H¼C,È$&ö?&øÏAÿ´.×üa³)sÜWùÊ©Œ˜;Ri­2F³8Çýÿoì‰Tn1Q$[`P éå;£ùÒ¯‚i·a…ÉâÄÀÝ-Fç·>=9áô¬Zw>ôÅsôÓp•ÿz”y‹O¼8¾Ð€OJ³Ãç)T»s$kâŠYÎó%‹µÏO­P„âi³8:Ìþv½Aû‹Šý±Jÿ€'%ÁÏk'ž]Û5¾và£÷vÇq,:ºhº1èÅý‚æ“OR™‚ü£Î-³BýSº?(kTªoAO ùÛ'ŒïÖÃÛ¨¥q §UÿVßתYÁ^ã‰xyƒ/Ê‹7aIŽu•zs-]l•ÝÛ¿Ÿ­ÄvY/ÕµÊÔšÅz|û07Õ=ÔæGä v_/db\1Co€gåÁ#Å|˜uÈ£:p{Òòň7˜¡ PÍòXjà-Ã_òu3êÏ@ʶn2 «dVÒ2ð™9ŽDuïB‹GÚ@ÊW¾7"Š®¯¢ÛÈ9btGm¦,—Žž4#_R-%„¼¢ƒE¦Õ³œ¢)áy:Óˆèä1!NÕ«Q¦äÕ¨Ã[.î&¼AX^åî4ã± Œñý^&•“åUø¦• ý ›H&[€E%„Xš´^9Oð§“òjM_j}2 ®B¤/hò r#ºHÓh”—Þ“å?þÿ4\RᣠΧ¬Îÿ%Ç稄@ƒq4>í=Flì6ÇõQX(XþZM*,‡/–㋪ÿ¦ Á¬Ç®@T¡=ijÖNß)kkŒa$~,w]¢agƒ‹ì<–çíe-­TMƒÚ¾,6–v†Ñï¨ ÔÕšTrŠ~Û;3ðdõúšR'Ü é%Ó'ÿÄœ¤ç#¡0\—Éã?–™\.[}žÀèÜÎ=ÓI—Ã$^#•·²õ™ í-ñ"´_õ“†ìeXXkG•3AYŠ´,§Û<_)ol<Úµ~øìøËï8¥ïÈÃGÖN¹f h—qø'×)‘9çLœÙ¢CKÓ:Ó&”ˆÿÕ<\¯nk!Íë÷gæûºÞ‚JJ $ò.Šsžõíàije4–•Ì5igq¹¸æÏ@„Î^DŽÿŒeÚâHBî®p½+ŠAðEŽV ¸®  êYÒg=¦}PÑG²k€ NöÇÀìRâš'žç®!žÔSÛ§3ÏQzYG,mþyùñÃcþ¶î×Yn*=Ú±Y€Sjí1™“Uœ 5î(a¥ýsö~Tþ5èIâÕÒ{U‚o× ç ä zßo =´0 [¥›HAl³œ¶<…$ÖWÎL9w™ »ö6¥šé4HãüF`kãñwÞ¿‰B][˜ñÒ~ÑaÒµ¤ªnµHH…3àÓ7q>œF´ŽfeÁ”/¸°X©P8X¨¬aãä£zxð]Êßò4ºì‘çÿ¸qª{µÜŠkl¢_(uY"#ÂÀø‚Á @ÀçD¥<‘dOˆ'Ð/ºUSQ¤˜qÆIiîDdeéÆaî€OÉ*èy“g,O滉¿+#…khº\ûá¨.bâD~O.‹Þ%ñöËÔHcS³Ð•ôfcƒÙÿ02{}ÂQ[¾C#÷0Ži‚î¿å`nçÍâ–ìu>LþJÂIBw#È’Ø ˆ.x±ù;“Ä~nŽÞâ‚Ù4¢(/“ž û~êG¿¯BÄJ¯XèÐfüžÛ°;SED9jí˲&léÃø$…2+:Ú5XŽÊã/ágYÕÅ [¬÷™ÊËÀe?zž&´ËüMãøoL¯¸t£{Ç&Em™ ÇIðÖ€þeatÖæ ŸÝ4ìû0väûÒ7­‹ÅA³"¿ \Wqº-d¾ñ‚c=†n8GŸJô°fŽº„gûl_wjͲЬT®›Ä"½lc9’åÞ½óDÄz+ßøPZme÷E»¦p:”ÉŒ½IÕ?ŠôÒö<´™³"¿NŽ&(ÐA¼É§cxéâ­=4Ü}¡¦ùø×á鬈w8êÜ4§ÿ¦£±ß#ýÏìñï&°¥"Ÿ(oíÒC¿îRâ{ Ý“ý í Uf¡}¡Œø^ù:®XÌÉÖO&PoiÝ$Ŭ3A³fÿÅKp¶Â'6õÙàŸH3ZÂÏ9#2Žwþ1x!”¦‹U”ó*²§ª"Áþ.âk~1ç4ÿP)½`ˆC9ÿh^ÃÅ+µ"×ÚßÓ¸îw+#¯[Áé£è ˜)2 ¡ ÌE¦Y±Ïµ8qd ÚDcËÖygÁ­Ñ0=WcÚoy¾ÇŠôw®xb¸—¼råLÆýN¬H¾äÿÙ®¾«2Õz&±õ¹\ÐDn3ô'tÜ…Í7áàsŸÂ[=$*½6^­¼‡JðI*möH¿cEQ½^déYBõ©z*nš‹^xÙ^Å•e¢v¯õö×"ú¥õKhH$dK„VqŠ&oï“Ò)ºóû˜MÓA°è 3`¾±‰Ò#ÕÚ+wå]ht\ú«Sjc²Š(gß̓ü¸£Òpùl6§þ+›žÖ¨Ð¸“Ÿ-„í½ƒâhÜ/îP Ù¿°ò@ÎøQµT vn‹ï,¤20!½}úxè² Ôò¯qpñ3dB&qðYž› gÞ˜AW” =PŸ§$Ñõ’@ØJ#ÆêŠ Ê¹!òÎx·€/5“9^P¢Ü½Îr "VùÀôªp£<Òèyj#…fòMrü1È÷¸8äA‚Á“àI‚³/Á|(Œž…øg*ûÖô”Ö…) ¤>5Õڊx[]4šŒsd¼Ùd=8y¾Óo!'½ÊÅoëÞç-ëÆ"&»" ˜f¶)júe-‰¶@Ym'ëËOQ,Ë™H¶\”‹ª{ÐZÿfæJÌŸ´ú“tÇ${uŒš_xH«‡ªÌòÜ\^†æ^ÇŠ”•uÊîø.c¹*ÿΠ慩4sã6Ú/çVR±JQr•ê]< 4']ûz:e|Ê”ÿåã?Ÿ%Zn‚~žƒ($Ðÿ2oƒæÛ|øÔëP~Ãe»¡J.2…Ž3pJÞ"a½¨F¹;8÷œŸG¸Ôçà.Sˆ±êgEŒZ3ÿ‡užÚÔb@´2»dË…z  #ÏrˆèÔY%sÔW’¸„‡õ»ÁÔädØ(- E‰éÞb<\wĘñõÖUÄÀcœï¾eí_ܧk°ÖFÝŒm<¯!\˜:-S[×Ü ýêk©|‰<üRðí½ÕÐ-@zsú&¦Cjè~£L6 ²Ö[ý”â¦ÁÀ?X>v’OñCı«á¥ÌÇe&mt”®6ø§î{7˜V^53O¿´òV™AT¥ÚmCÙ´+…ÏÆaAñQ¤öŸ¶èoаç^`­>Sº£5ÓÝR?|ÌVZ¤oªF³15™FÔ)ÌoÊký´ü=®÷ÂVôp£qŸÛèé‘|‘ÓqC?ˆrÂï¨;gÛž5“Õc®cш¿H?ÕFÎú“ŒS±çn¥ýá4~fÌ—©þ`a”Ë‚Ðö_aš…rdï—œ÷øzú“?ÌAo—a‘òà¾Wÿ`™ma`ŽE@ÙGb6"WÉlVŠZf©z×^1uzñP9†iÈ FÊšž²“ä´¹=ÁãltÎyq]&ò‚X43¿K¼ÿóÒ%n 1j¥M¹®Ì}ŸÉH¤ÍSï1%|Š<íb͹ xèÊǗ̆÷W²LàògqÑŒ)Dùt`â>ÿŒF`ª¬:ÅÈhD¢Hœå<š±lxÃÜ}ppO¯F;§cˆ)pµïíÍ$(] ÌÏ«ãÑÊ ôCWˆðš$l¨s$$Šöð êù*+Š Í5ïÄa½v}QÕB™‚BË• dL}¡^ ªô´Þ¶Zíd­Ì«ó/ Ò⤮¸••”ŠÇËvH¸•;ÀÏ9ü>¸>OYO[SÄ §@ßÑÛ%î8o”ÛÈ3í/¯Ôžp…YÎþ5 ŒCgJ·­ ÀÚ…u XNüÇ*´×:wì ~ q!.VLnP“ZåÁeˆ¥¸Zuxû­iÄÄÄd7»qmDó“T©¢û9uä(bj–úü~)GŒ†fRêZøZ&™DHH-½uaƒLT©9™ô¹ã'ø:)2àEæ¨dsÿy>^Ää½@¹‘±‚ä}êü+LÀ)SçDŒà§¼ˆ»´°ÄóôÞŸ6·_Ï;`¶[å…6†Ji+å×Èݽç,Pdê©‹±6›ëH ä&Q¢Ç#I´2¸*ÂòEQúZÑíêbÛ‡ÎÏ ßýlœ5HŒ†—Œÿ)&78—íx{,+§º±dÇWQhWVîz¼·Jö—º; ›]ŸþüQ­Ñc)ð´–‰‡ö¨tËj0,Qü^>›bŠ«O`¿(ãè]ÈÖš“Ùm¹UüºžÌ-AÃÝ©jæ¢h¥&Ÿm&Â.ÆÑ\½Ô¦¡ÔÈëkï›,ÿ0 )mºÀ¯çúUIæõa¥tîñe¨Q4ðÒ†üï'âÚê3Ê üÒñú­_SO­Å}Ÿ±` ?ôö]d oi˜šQ¬wJtcz¯Æ!_}Zƃ׬_€ò[j½Bõ˜p­$}PŸ¥L~¨Ñ(¢³ž¼ý†«oòæ(TkWLÿ¶ƒŒ„5ÂÝʈíIÝFÑóªwQ2è!]Lèï¾uVKõ³ŒRîÓ¼Œ¥¨~KDæ·|ÔuS²L"שŕz’kû "åÎLuíû-YzóãË2 {By eˆ&éw:­Óµ‚ÐÅRÖ7 ýÙúZLî‘8Ÿª©Õ/f>lõâê°I²Ó¿ol3³îí‰âÚ~»ô˜ß|Í\0[“:“¿×.ßb¥¨z÷¢µ§ àDÉ3ƒŸRà¨ÏzÃn®¥†ý¹OÔ§Êè,ê57}ÃI¸Ò›Ç$ërÂ:­}@˜Ž5~ÒDT¯J98½»'1ý–ot˜ûã l:ð_¶Í<¼h¿‡{øžÇ©ý¤T,LmTæ<§Ž/F¥î2)ô$Juݪº£ Z¡4ÛŸ%Ý-Þ!᪌sÒ˜¿ê•`ÍÒZ2,4–qÅfcª¿ö³þs;+0³½jcÂ+Î&IÑ7BÙÖùW>æÆ‚¶E3·Ã$u|¦¹¡@ð%gÅ\‚É>ª  ]É€§pïìÄõA’WíŒO†ÓÀôaÛ‹2œ³MÙȾ.*z\2ªORp¦E]<¹+åïäî•úÓ^û–ý”˹ÿÝ,Û—7\7å9 I}Áhb\uMQ×·A ë HgõšLzµTañ~n?㦰s$ÐÆ¾ÀJo[³™f í¤ZPr˜«yscÀ2dæ$øjEµêzj³Xw—:õ;RIøgϵ )â&Bk†ã€«†p[ò͇a‚&&4 î#Cïñ` Mê!MÖ|Ï> â4Ãg·^ña(ÉÎ0d™K°ʧTÅØÞ®x exí³/~@ôVGnéÏ<ø—£¦X¡\ÚÕüóü,¼t5©ÛI&j>wì…\Å7ÒïÛÙr‹èö¤4¾ÌÄQê÷‰‰­h¸/¢Ì:ÊêèDC*Ô$™¯Ç!œjå,L°X 7¿ ,¿— a ìÀѧ)·´×[ Ï!«Ø} J–OyûnOèSmfb—#™(µE5¼è=.èä&WFêüŠ.4\¡EQP÷ * €±þ¾K _Ìõ5/›ÅþAÛÊÆŸ~» -füŸµ™÷Aõ„ÞÄþáe«á6ha,#kQ£f䩘Ò_ ÛFñ)®` (ñË{öxmÄ^6Yû"ïÜbn¼¸ÉjNK·ê×½·½b”¸éª…–~åèJßSéGÞÔ49/äNȵÜäëÉÂÕB]ÔcBVª Þ±´º•%1)^6*üØM«%·Ç`¿Ý',בˆ"Õ16IꚈÍå„C‹ܫEº˜ óv¤“«å!ðMœZçØcçç8l/|m±n™1¡¤ÈèÎϦ}úGp½ ÓÕ}XÏiÎçö7-íÆñà®ÁΜ.˜o=¹Ò7¦“' Ðséý\‘”:)Q*¤mv†…šTüR Ôî×ÅwLå”Lî ol`Ù{øtøØöÛG€ûK÷:6ËóLk d>Ūˆü¦®¥D|œ 'áX…åöôù¸bƒ?i)¼ÿ_dõõ’¤8öÎ98úQzLž2û:–éÀ®Äeu«cã\‹ï.?YFêS¶Íê]‡·Üx{Ñ.j؉­Æq0¾S4'çŽg%{"ïù¯Ƭæó µ« I(hݶ¥®J`El‚æý Í…Õ°Íÿ´d9^P£°ÉÇÀ´×Å‹ç#ïÿƒâ¥#Æ £YQþ‘¬˜8¿å©…v󯡩¸ŠÐH´dGóëÂåÔÀu•Ѽ‡´ž0ªãå4eÞۑ꡵n²ÝLt×cy|À<•®«‹žJDÁú<(…¯œÎ?Å `¡q'3Íá‚àÉ·¼}I°š,ÈBvšÀå;Õ\]Û†ØL¤j¨i.}Ô`ÇV)µÿ›|®L)ï M¤ô7:¯ëŸjéµn«¯K_µæa=°p¹ëƒ•Щsìœy¹ª«Œ¤†‹ªz®]¹é<ÿð ÞZ(Æö’ø¥‘õÓÚ+×j-0m:"ši/ÉÌ*”Ît`kn‘O›ß˜_²®i9ÓÁ›´šXÄN ïXò¿5©¬Sh÷ µ#{)ßóÛÕŧ³Ë ‰)Cr„øLï:Ë9@¹å ƒ ýu¦ãU·Ðñ_“>lÖÅЃs{ÿ¤è?0BbþäÁóF´³ÒvCO‹“zÞ±ê®Ú[|h¶F¸´gÑ0~ƒ U”\¢ ,€õf_lPc”Þb’·õBÒ’qæÉ‹ìçÞߦä&¢Æ(ræt<µµ#‚´cö¬ý]¸òD’?nÞÑ \ñǽˆ_†ïã„j5" Î ã$ìÞWꘟ ¸¦Q/²§±Ô¼Î}iMs…ˆV´\;ËUÒ\³¨Ä3ý­,µ¢lyÎ’‰n½u]A?%˱†H¸7BÎñOu2ùU[ þϲ’K—8†¯ý  äÙ.ˆ7™Lí?¸VÜÈ¡”êr±¢RBç£V˜yÎìÿžC”&Z;jiÎc…>¾Ê1òµ¹¹ÌôrÔ5?ò‚Sz9µ3ØÝX3ûö½xݬMBpê°Î™nÊÆXpÂèòˆ?íZ­˜Ü- Ú¯ jüCŠÂ‰¢4ËÈÒ -VʸÆA4uÜ­>Z zi¥¸ìë‚È8ƒyÀÜm,mUAµ¡;é ‡‡ÿ&¿pºøÈ°eøŠ®jÚ —Šbý.žµù¯&Rø 1ß 1÷ޝ#êsgë %` ó{p÷°,ñ˜*¹àFäžõ’,¦Ï^ægl x¾¶öB¯dJUÝÐ¥Êãdé‚¢~zm Ñ÷c ›îRËŠæÜLŸØÎƒ'bsÞ óè¶rÍ‹@õ»+jsa‚Näiyî™XÔ½ñ¹1n;ÒBð7hÂŒ—XdÀ§-RæKŒM7À&MÛïÿ—e(ÅUêQ™„o£×w)<áÓSý”ô’;)C~¥o Æ=9¶0©° “Ð!ñO¹Ì‚'aÊAÏMç[ù€Ú×3tAÓ¹½OGT?Ï8‰r„˜·¾FŠ–ZFïúž¯í+|A=3uÎÉÕØÔ„÷§n·÷1‚9Ì•ÎÄPo·pAЭ . lIÏöéeT:3£?q:°­¸L‘:}æûs !c±¯IzçÎÎQÊ Gá%ï}ºãôïÅÐeaxÍ'7›­{5˺÷¹ª·$T²äÑþ°_еM‡vÕQújÕÜ5`ß¿F™Í¸N& @¬‚C¾Ø†Ð€‰nŸ6<Þ!ï¡À#“^ D½s¤&qίÓÍ{1=QeÒÓd&Àm¥ÞÌR.a “ iÒB9%*q×£åk¡#ÉÒ!,ÉÝ{ü_8üÚbçÆJ$æˆíä7†ivˆ°…B(¹è‚¹ö¨_Uß ¾@ßx'qÔ_ø¦AÌ-þz[l©¯A¶6Ö±ÊÄÙ“'}……|ºgg†ëŒ%vF8”â¡\JÞ>i£Ì–ÏÆY¸KìË äÇ 1?ì9_¢“èÅEê|š•Ö€/”½sΤ‹©²øE ÚA"óÂ÷iú;²4$ƒewžbù<÷r!û—ƒ3¤u¥MÁ¨IݦçK'ÇÏ©)&ñmń̃êÊ‹„üÜ‹ˆUTtûCU®§›Ï6ç„Ñ©*i«p‰V‚Æ`¿GµèçÑ—Ô#,Sö ó‹©onÑjzZ÷ÃÚidB§—[¶«_ßésËíܡø-Ã÷õņ_y©MƒHnè¦?kïù y±iA;ÒC<ÌŸ½rà}$QEnn£4þ¾ˆþã´<¢#©¸û[qIúHØLEplàÏSV®Î ±™Ò^žy„È7õ$³uR£y/S¼Ö®ì÷¢ÇM²é#žÁg}ù@¤:} ªc"M»c2…{ñÁ5&ñ(ž,-x(‡úWÖUºòD¹Ç̵’²rRý­XS½#ø{˜Iç% Š'þ mæíø×:¬i²£ ¿}Î%õö¯rrns&€ÉR²PÙÁñë4V´>D¯dï ¤Õ‘Š0 É‘³ýöF£ƒ€Ç˜¢¯òe§¤p"F·Ê34È‘ƒ iýFùt`äšLÌNì ðsLѹÀ¹O Iœ6v†‡vÙ £ö%Òœ¯óÐp”ÃÖ Ä_¿ía‚p‹Ež´“à#ŠK j3?vhx "°2p ^‚òßr‡ ŽœBÐE|wŽ„­4Ó¥7ÏšPíiî`¬:^ È•³šPi„¥rh½ a±±t nãÞâUÎ7ºKrþT´û~þUëbN<ÏÑ#k÷ÛXu‰º¯OW7¾™d*öfò/™;Ôî9¡ð¿ 7ëË[UÅÉÂÐï¬ö<ê,Å$--!"•—ÿ5/hO0? Õö{ð|Å¢¸ÿgn–MÚËH¯8Ð?}QHÞÍçáµ÷e¼àÓâ+ƒ÷wn¡à#aÆ–K…ÉyÜG’ñøsšü‰zØ× 쥡ül¹d‚­—z”‰ôqk&äÄ~”Ï¢AÜ£¶øê…ñÊfñ§…Û8ó ¥™xÐl\T‚6^el’ƒxœGù8ÑÏ(]†dwy<"¨CÚúhBM± :…B·Ò• gÝÜEíÆ+]#Á²ö5̃IŸd_ †Ã‡·ñHÊ$‰`…R½1PínZüÈRú÷ŒnŽíIú ÝOgMÊ ¶‰TǶ~çÄ4Á F¸ –QlÝhm P݆˜kg›þ°Õ騵‹ žfÿÇÞv>ØèÈï…KónYHÚ²³CAJ(ñŽP“3Vç§aXBÒ†Þè-Ãǃƒ3ˆßwQñ§!0.¡Š(zÞ€ey§ Á£,h•0sãT‚¦¤ªp•¯–'%¹^I¼¢µ³Dß#\°K;bZ›ZtíŠ),W:dÇ£º_|ãÝúMÝ_â„dõÆ2$=È%» ’`¦ú¾*ÒêØÀ®QÈPÔÜ€YãŠvK)V$¸-Qæ”Á¶$²ÜHÑN> %Ôô¡è1~Eµö.±xT°ú¸EýŸÎ$Œ–ÒZY¶—Øíw·!˜®wZ› Vœ÷Svµ=—‡ÿçÆbüì8MÌŤkB$€¯-1ÐId-ºÀSR½‡ƒNÃ+óV.lt—·z Øv6YÑðªáÞ ×TJ¼§”WrŽÚó’z=›šú;;>س³¬éd¶÷NË :yVz2fÚ%v6ãvZEÃÝC¶±iŸÃEBúïæ)ò/•>-»œm6Ô_œDž½¥Rf ":/?ž=.ƈuæôè­ŠÃJþCkUŠÛg»{µÞüT¾OÅnŽh1…Øy|JmvJ,Òý<H. t»ïu#Ø}^³P~hlørqžU¶ueZ­]a_œ|‹)49§Ï ´né+Z^ÁéNçìÂAwþÜH+'€º‚[“ ÅÂÈ.å«Nb‰ßµ|ÿôÐÆ»FnªwúŸ]L‚ sLБõÏš%@˜'æ@6ÌÜ{g¹ôñköRµÆÅ«¢ ëGÞ&ÕMÊWNp"¯&mxˆÜb5B>%‚T*Z×&²Lµ¢oðòe ˆbq R\Ûqm*jÜÎÏlw±`’þïú!üú¤@Z¦uJ©C=¦# L‰Ì¹ú4ã¤aqf3b^ê»”'Ù®ÄJö´JóI`Ä&h×+=Þc†&™Òµ,"x AŸˆQÈ_ˆ­ÑmŒAËù±F›Úƒ!iŸ€AÐùx$+º€õ!ÁBDÆ»ç§ðË·žn\uúžówZ><0»n‚ên ·†ø­ḛ́]h“+‘ýþ€Ìúú˜ë´µ9ò_f2êRê¬êõÚÑ[!ª2„­×mtþ€šéÚ$éèkq[…¼q~€vÝ8å3ÝÜ ¦‘¸ç‚’´¥ÚµÝÁeš¡C[®y;¥ô—¼®Ò;»&—^¤ ÀðÄ0‚=.dåÔË.’qmàd‘"-oäû~T)ÊÂyü J[’S€Éº[ãüšS¥€Ø.þ稤n{'×exùDM€ :óvB `>ŠšØü5^­ÍéY ýýö­Ò,UC€èž7µ/Û¼ƒ?q ,”JrÀÌ”„\£!aF:?LÒ›éyd|ÿ0£Z* ¼,ÓM§ÿÌzjX«Q.þ!ðzö—¾nD¾9kÅOÿMLtÂ3`ÌWSh-Júé0&(½ØÌv±?DrD[2Ò„m¥ÝÊò®Î£`‰þDtÞsÓ-§—åø×oòW‰~KJZW5’vg¿÷<‘ü:Véu¢ =0½ÔÔ³úãx£ºÛ"äŽáÿj#•&¡Í ›ûËKž*™ö@"Û»]Ü œã~•¸.ëÆA¢»—Sèi Õ­} 'Än$$·6Fx#~H õ7'éJ–³1°’ØkTÔk:y…?ï¸ÁRE“‚OL {‰Ðfµ=Y0´•ð+Ü"‹ê"ú£? óú¢nfrgÓÝõx†Ó–W;Å%·Z%Kö^K¶6Qi@|ê„pü^kâK R©òÑŸ°y¹’ƒåc.Ù½ûZ¡'X6“k­µ–cTç¨ý#¨aypZ´’j$lÆWŒÕ É &Íܘ•ouÃE¹%2BaÊ)°Ù8þ8«'+®îÌf­öêáé¸×läÞb†Û(þMæBÎ…çØË$Yæ4ÍÎ?•Ô¥‚ñ÷yX0à0(GxZš¿)0å†ñrК’Ç*<=J©ìU¼jˆ6,û…L‰QY‘»¤£Ç2Š»ôæGn*Éf§g9ÖŸWd¨ÇŸWz'NÃ;ÛÉ?<¨áý¯H'$†,"oIÃTqñµ`dh!g wÓú›ŸÜ1¸Ÿ(~e[óÉýΞïš<ðñ*ÛÙé%<]^'#çÏ•ÝÒäG«îø4ü¸ìôe/Ï¡uêàžªnó‹7ZÝR|}þ·‡úªgÙ;“õW <¹-=iÄߊ۞ÑWìfY*£S. Åö:«At»à܈èéžÊ©äu‹_V¾þ3ËlYÏá|PcåZ„cëG^¬gÂ]ƒð)g¨ˆ]Â@¨6’á§`$ç¶VJò†ÎUÿ¡Õ åÓ{ „rºã\f®e Kn9s`(phtìÝF…ôS`›F½÷Ò²nú؇_ªÊ%Fhj¥tE‚H- þúàÑNBuõn]Q=úʈ[©7­€ƒèãùè‡íÁbZ©ji BÊ&°K*7U¬Êd›Ö MAÝ×Åq»gB‚Öl]ÛŒë!N±bZÆÅW7’‰³¡e´xÚôÀGz¤^Mp§…·µý¤Š ‹EÅȽò‘#C ©ìýŠo²Å-“£4¨ÑçjtŒgQšqE‡ô\(\Y§gÏ!rå<ºÆ×7$ü Îfá2|óÞ{ž˜EÂcJøyŸ¦ª¢è(t=Ýs€s·#ÒµÔ]ñÂÒŠ2I®co&įxÊ' [O ¾ÖìïEoÿÌнœ˜7’µìLêÉдgDà4×k]‡¤Ô&N5 œ|ÙFJÖL’‹ d¡¯ «íôáré¸pa¨m\oãTäÑJml€s':MLø.3û^œUå$î!8ÐHòP+Ƚ™àc+¢€'aFæ Øq xvÙ‘¤”ø0ŠÞÃ-ñ>y¥›Ú²47ÉžZ(m#DÞÊÞ* ªH>žçæ ð # Œ®Jû¹»Œ •”ªDtòÆA 18€ –ï`ŽÖènVœÔù”^i;9WI@·Ï÷i¨¬?á]ér«‘«~öàÖÒ-E½Îæ/s‘u=IÇB –ô‹ŒƒkU®lúQo LÊögLï§&Aè+íÉcØÓÛ†¶ΟA&ým×ëÁí˜YM´1I³î3¿¥8ï‚\’ÞF±*£¼Ñ,°©Ü‘ìŃ@,¾ö X¥íW[ËVê¤5‚ä‹íOlÆ…%´ýóñ#ÛO3¿ñl›á™…’Í ç"­b‘;?? FÝç©¡Œ²C‡CéhK§ˆò½o“<ŒUßI/)QC_'»?Pm: ê wð'—«‡;l E¦6ŒñϦ²ÞÞÿ6ÍíŠ{ÝÂsð~Æo†;MÑ’‘ü;R!T8QÓäé(oÒ§NæW¿ùþ\Þ3ÔŠ'8Á €ýî߈*&‡¤hÁ¯g~Ž÷ ¯Ï\ëÖÐ4´BV•©jâÖá *GàS½DÇ9p&ߘ ;¦öu¦Ƀª-÷} ­Ä;–G\ÜOvÀÏíyÿTŸûØÅU)$½Ý¸šý6Â\4OÊD€Až 0jÛúÍ‹4!õ — a¤]÷ØW#5˜s's¯$ÝØB#ì\Ðð2¿Y™o¿bDêø Ì¶ô“@ƒ`”jùn¬rK  |\Fì ˜i#’Ñ ,+Oå|¹þ]&*ûÛ;c¹±Ö^.€’¶Ai«í¯Ìñg\ì<îw¬Ã+-=Y[Ù“úÿ·Ô„~"9¹æ •x¬¶Oð¼¼Æ+÷2¿8°˜>쯤“peón™ÕfÍcA‡:¤Qê²ü\ƒú «œó=œ!0/Ž}ܼR œ m1žbŠ¥&_˜<¬ÿg‰ŠÊ>Ï|èÜ+ÙÊ_©Ö|œ0Ç¡ÞA; ôAZãÅ¢ó®1m\†LºZž¼*x:8Öô…ª2ãq‰b50 ¹…µAó?`uÿ˜ŒCÏQjÂsÈ{ªœë ©ýC67Âã§ã’Cd1N(ñÔ§uX¬i*ÝÜ3dõ¨Ö'xf.ö?GËÝ9€!5lŒ ZÒ—Æéà·L5ÍÏ)n ³SY¨ÍÌ šÌ\Ÿ¥Né9u)’Já"^–áû$ÞdÏì;ÙIЄºÃ»úpÇšZy¶[©½*Èk-YM$ia^q‘Æý%½²Ð}zð¨¡9×3/*1B|`Bš°ñnñÓÚ‹ùp^‚¼šo|‡TJï¦ñˆô3IâJ_åú CÂ?n<Ôߎmêë ¦™íL±)fB°&ãð&]®Íä¨2õTÞNYq^ƒ¦ÿ0ċ欖$–¸4 áox{¾°ŽŸê‡ÍWÖ³(/‹!ÂŽ…lØû±šp ?\²&±X¢+Qëp’–åÿyf¾= eêYRŽ5fzÙŸ‚wáÄXÙÛ›£gdDf²4fòÎ<¹Y:Dý§ ¤rdë•_¸²̾gÀ#½£18Ävje2R.BòéžiWk™røg´y)£Q“Æ“hal¿´¦cèå"K‚éÉÞ{:Ï(Íù,°ëá¬ôüÞ…õ7‡æ/^O’Ÿ“ ¿qòI «øéW:ã Þh’Úoì`mEõ»€ã­Û¢vòn6ôM;‡ } •¹~¬¡BO#÷¨7ç}»ùc«: u€”¬vùUGÓ Ì(ˆÓëäŒ*—hFF95'ÉÜø9Q}Û“œ™!a¹ûô·rPâ']€6ófÓŠÚÕâ¡ ¯¦DМ:8¸ìΘPZúë:õN\ |_û©1Ò¿c¦F LMû®2ç;Ç&0.A’üd”Ñ÷´jÜó ës<ºÏÙÌÊTŒ+jxÄbÕ9†>zóèITÏVFÊ0 —üÐBÁó*ØYÒX [”0Ýÿ)M¶ôùöÓñ‹oäpùÄŽÇ~U­zìm­á²Ú«ëáëªú‰˜ q¶tTs‹NÃW·þtñ³Í©L[º„÷6îDÿžše?”¬cÿùnK¿„²Ã°$ªQ)«CZWŸ £3Hu`0sÃS•º¾ç»;~m*æqv7 6®oH£†®›$Õ#ï)=/$3/Œ3› òf“Þ}…ï‡s»MV(g{ƒz'ê„]–¿ý>Û|yiš~0Ùþ‹­þÜÈd‘ÁæÅ€8 ù]r¢©‰Ñ¨ì`Æ“?ÜþØçGÊ&Q7EÒnÆÙ”dе)f0ÍùiâUŽ«^y‰~':7>xþÒ¯·›˜5½K6êòœO#(þÊñšèw”js¥­Q’.‚Í׳ËW N£Hþ'ÒÈcn`¶„¨ýu!H|N´ÄHY¥Ï!èR”:3 ®Wã€IQF XZ”E!úËøt•SÜ®‹ÿ&‚tsƆb0ã• ½j|R–•ÞQy¼Mv?¶1¤"d‡Ã…>P-XtvÖPS j‡6wEþ£BI¹,HÌdȳ˜Ï—Ç$®GDškžŠûØÖÉeŸ^š*§VŒKí`~Ýp¼„©X+©m¦y›üAL¸‹n¦íju&à/M Àã¦OW£þ+Æ#ö½&V+ Í‹L£dfK|¦ŸÅzmÄP+ÿ8NE÷fÌÏX&• ÓÀLÝ|ά¡߄Ư6µÌäž!ÝÏÀZþ, Nšz'v]p0”ÂÉl?K±€ ñÆY¡D= Ðc+C>Hü?8Žya8°óµ üO7]´×e$°´¬ï®ÞPxEå¦ýÏSbS­›"ž  V£. 5aûóýS™5Pš3íÜAá©Ñaš;!ýòó–6Z¦†Í|ê^)E¬‚C¬sÇb4¡\\œ‹WÚeHc  C „mÏøÈi¸•6!©|¦ÐÙr ÂP¯DYctê>Sô¹·< ޅB†“*ÊŠ‘ð`Ü‚Xk $‚ ”å·yšÝ`cý@ý¤o1ØànmhªÀ`òfê¬î\¤a¿nÀÔÔ€Å8ØŠæ±þZÛµ›¢ÖÌÆgèUîö5«ˆ£aLì=  –ZÐÊ”‰÷ä‘[ûe;qh‡«úIèšiÍpt,HQZrñ›™-í’Pþ!.w oýí\jœn$_åj05&Ö×ïkØ*Uryf}©Rª|€¤ÌýšÍhS+BH‹h›Þ·+"9[3/+€äølûÇb¸ì \¥¡vת’êDæyõ¾6u V7îÏQø2íIž>n¿_J¹MQ†\y¯l$úÀS·hžV¢-ñK=†çé1¹‹ÕîßÕšÎæÝ¥Žy¦æA;?Ï8Ú5¹ÆàÖ#ŒŠƒ\G§ICÏ“À|mª¶P@¥›>H‹$›ê@•²~ì }ñ´åÎXÞ^24ŸOÇÇ‘öùŒPwÝ.èh´ÒQÉÔî7¿ºJ[õbTðªºN€°V?YA9/|ýƒ‚7PZDð#!00¹“` ?`ä‰@5~ÎFdÏ ±IÕU¢W2ŸÒG æ óº´IAhó•®Wíí+‰SÄQ\(Méβš¼’:€C+Ù I ø9"dÕsc³ªã\°a Mm¤v¬ìS>£ÍËBê®H”­qÇ7C·£6ߥQ=Ç8G-K!*ã['í[ɾnó<¿“ÓB(»ü¼¤4 ò¸AÞo„hb[þµ’£gŽ´ÛÑp¾´ÿÜãˆz€º0g샇Jø'K :°ŽštΦ`¾ü j!#ÂV@ROÉ9‰oTŠø/Ó)‰j$fKYè‘Ãø‚ñ(1û³|ZQ>joÏ£/ìÅ¿QJcŒ0—)I­b§zŸ8Ï,Æs_€¾ò ¢N{[HÓžM¿`*a–$CÖ·KoÊhõ£™³¼ªª™ƒy¶ƒYS­ƒeŒ#½Ñ"!¤‘o®Æøš–àcÙ2é{Gr¾Xê>foIÉm9Ö-Cç…Šb2v Û] ÂoR9ôªﻆÐcÓY–á“Zî[Ãצ€… ÚÓ| g„$Û1ïç& ³Z2{¢ŒIy8Ô}%{ÞŒç–  Š/بˆíäf¡ê×+Ò{5†r¦â­0Ý8í«ÔƒýÑTjÜ,JÜÀ)Ðj4;é»!ˆzJßÂÁTØåÚmní5ä¦[àüçw8>‹&a–Zû¸{(1»1äm`GÜÿèå·þGné!Kz"GVβ=“>àòG‘>^éïFý¼Ý;qcàeˆöõÄÜèü ³L¦˜s¥¹EýÙ½¶Ý“y2#m¿J:± ª‘‹0ðǹÑ!H¬"¼”ô¯‹žs³5ïžž eÊUe²•«ÀŠãfÕoû÷xeÖGaˆ˜9bR¥¦Î–ʵAE³Ð/FÄÔ´#U€×‡DCÏgþ¦ûìW²itÆWA3êÍÏYL„‡¤ÌÓµˆƒ`ÎU"|Ò¶Zí}b<á­êóõ# ®y‡ì[ø:ÆìÞÈ‘ê…RXäŸËJx{2šFœ$ØËúY:`p2LY©$.®‡ ± Üy#§p›œíjé \™x¡WgP±S`èK yÔÓN¼ >Ê®è×ÄäÖÊ‚†³ƒp†[.ÿ‹ˆî}5èp/mjdý•<5×ãn ÃÆt‰ùþÂ…06“ùÕ=´äržB¢!¢2ÝÂES2¢õÓÄ}}óÑvòq‘žä»'cûødÞ&åàM™'È’«F2XD†39<ÛêOLŸÌñùa$  Œ ɰ¬ ±|GbX]+OöÉB”-’’„¦Üí„@Ø1õœ„‚¼ÿÂLJOmƒ“šn芗yl•¼Q¥/|}’hal«+ÚЊSLt /ﵜ=à 2½pÖÆnsäˆcÉSÒ8ã¦~¿ù$¿MãkŤ#½ác!þŠ[1cátFWg†‰U¹…±›'hç³ã?É${uÆ >“6kHßD³ìÇë¨6~Ü_Î:5vœÌ¾Žå)x™Û~ hbS¼CMSÚøCmœ×ÁÖ?µt±Hm.˜‘ûñ)s²½^¡À˜t…Ô‹§%$Ä*f£N€C‹2¦Pgn[‘;/i¼Ð«WaÚð=š»ËƒÕ¾Gª¦zË8¶ñ‘”˜`ðµ$¸är‡ÈjŽáã0§¦*äž'´  œƒ9ðÐ1…\ÍÜ*ÔõÈÉË2&µ£€µêFy’—(y'~ê¼4?»yw‡_F—©‰¾U)~¯ÚU!"g޲= ,Ý`J†9“SüÐ|EÜìgV‚‚GÜ)°)?¥(åb.´ÿŸ(˜¢OVì`PüÚE•Í×9ð(ß¼—6«íÊí¸R0ã¹PPó‚è»ÆX¬¿fž¶0˃1LrØáìšž ]­ &BÞ¯šØ”J0 TÈ J–ŠD4/@ýž)U³GÚÛ…SÌ5 )_²åØA¯“œ¯Oe˜C|ñ,dHžxƒšftæÆ$i¯Ù[‚Ï‚À['Ý‘1£» [ö¹§vµ|ƒøVJÃÓNÇÑÔ”dÀôÀCá‘ö©„îZR-à$à •µ>ªÎmTÍšúRd'â·rçͶžó·Íx¬d~iAçïŽ^Ô³ý^$|‚k抉XÎÍ,©7HèãÈ]×(ð‹ß9ɘ#çêi€ÕµŽÆðwÉ †P3[wS9§xF’½˜áI6ÔAX¿M}Ûvž ˆ%a+Ë/ÑqË )Lt{³ˆÐØuª âXT³Û[|Q/¾Þ`ƒ æ2ìZ‚›- )l—!&7€¶ ¢‘ }e•¼M*Ð|Å…³ÛFK6’7û‰™¡§_§iÐ)A>*”[›d%«IOÿ‘‡ù“.ºõ˜q°{G)ÒøÆM®{ò}ÆÁ-æ"óØFÿ¡$kl«sC»@Çöç]v ã®Rƒ7¤­¢vi%ømê÷c\m{?;éDZ5–£´€®-¸ƒahìí¤uÝ`ËIu—™‡¸È¾¥§ƒ®U#½Õ½‘êûGA<(Wë%?))7õ–WôNj>ÒgP?©)UÂf2V$W;cwùnÅÜAãȤg$µGÿ& ó…Öm‡€û8TH̯á2ÅI&´o3®ŠV"Ù䩆4ÒEO¼žïŠ<©]EÀ¡&i?ጺ¿­?Èå,Z“Nx 9xò³Ì}â$v2‘ïÆ°˜•‡ø›£v–sH|ĉ ˜Ï¡i/ý·3wß»)*ra]¸v_¡F톱—v›ž¸GB8MlügoQ)—yï8ÅsUKWþZýw¬O®K0Š·,kmò{NJÿ‘Òœ i=ù$WŠGŽJÞS7ec…m9Ë%žº~MOW‘{î­GÜ• +ØÁì »jkï÷¦HÙRà ÙSdçÎäµIÅ7©¹±Ì£¿A8TÖ.ÙZNòöNñT¬¼bÌQR‘â©l B<˜œÙx•)ÿ’m×ïçëÀ½.M;G·ìÓÄAê{cæ'V Ãë;: lARÒEû‹9È EŒÆ%í'š~¾ÓæÐôHþ ã·g²`ó„ªu’ø†¯}×8@¶¯ üãè9Ïu+ƒ#=–uبSéÐA¤!:í±$bm|̦^‰sùãÙ,ÍöeÊÞï£\ œ¿)žUIï=Ýü ª èFõ–anÜ´¨«`ØÌÏ2ùÜcî¡À¡Žvuþ+ÊgÌŠÍc ~‰ZZrÿ‰žäaúˆ,OuåK›ïl§iN˜äxrè+“Yð”Q#ºÇؘ—¢#Óþ0,°Õ~÷f³ZÑ~²Ó¢S—–—oŒÔì@õàl'ÏWZ¯¡ýWp|ÂÞÃwŸÕHDÖP©¿~q>þ-¡$%S"ãÒ`©·/xÔh†1{Îa í¤ü)¨:عqqFcQ¼‡ •-(ad#ÆuLV;ÜìóØoƒâ^“!‚*Ø6q@‹ÚæˆÇiÉ臾²ÿTGÇTiÛqÌOäOnÈ ‰åM%/˜v7)þÖW &ù|ÔuëQònJC IW©ñ3¸½2ÇÎÂ;çøädÊdË»NgªÜ€6–¿•r#êµ s¹Æû Œe¦SSµ)¡oÀUÅóz:hjtþo&ÈX¹É4D‡v¨€Œª@­Ä“ÑW¤&>؞ܔ|:s© ³ËIu¸ñj‘!†¯{UìR [yîd»èòéÄñD{q¢gm- ñæºù…‘>Éæâ¹3gbùaTp°«žWÅoXTÿ§­ Kû<ìCÛ`y—òî~(SéOêdpä%QÃ@&‚5#åwªÒ¶ˆ´å‡RS2áZk£ª-ÁW¯…UÞö7Ù£g`Ó† ÿRÐ}³¸gåz¨«P}ñožSÃ&'„3\©ÌÇÏ·¾`VRYÆÉ š®Éa¤¡R]{÷=ê²# ¨fj}ØÇRxn;3@„~æ=¥tL •ÍH¡ë~º]ïy7ÏNG'àZ÷Ùwåe}S¨æŽ;0òaUïm¢*—ÏŠµ”Ñë-•3sÔú&;¼<½m“'ø G9BQ#"mDYF¼Ô.õþÆ­B’J·¬ñs’CPnÁgÄÊ›®¯ñ6ä{¯óÎæj2_ž;µYB„X²þ£"´ôŸMeÄy79jHË×|v¹ ,kWô6ç‹¡;ý™Žæä›K×î£ 8ì¤bÝ@ìžÜ4pý7ZÓ¿ Töê}IGÖÛýà+Qx@¹†0R'£yð¼ö#Án²_çýí¦Å½©«eUmY´ÓˆqùHl|ûBë ;¯Ã.!ëôÿàÝ¿~‚®:»÷7?õÀ«ÑàIÐSÓEê²µÓÄ.ÞšÙ’¸ Ð~í"çnU‘Ø÷ý'P rš·CémƒêKóì¶Á¯®ßïQ¨—ÿ*B8h`s§Ž¬9“—„.ËÒÔ|ßÀ×΂kFÁkü¸Ek/cÞÓ‹œt9XtzÿÑí¨—w`5³^ܺ˜Ð%uÛùî-ì´çD(’Œ úb¨óQz4§­°nß Is‡F’wó Ç]°r…ó—’òZåÑ%2è†æð»g#mQ…÷z ÕAä…¡@ }°Ä#¯SÙýï²Ê&òË‘íz¹¯/”¿{;„)ÁúÇÿy*Ýô1NÂæ€ë¹b|RxoÆ#>~›€[|0¬!!rW2¯òc- _4ây–ÀÈèŸÙh„Älµåìø^ÃWÚÆÞy(öV·L¡>_R1UCn¼èH$ó¤Êpýx^ã»MÆog|&«…9@ìT@ÿ[¸­¬@%¡\Ëš 9Á[þÂ`P£€4Rá‹æõŠÖ*»£[±uzºFZ–Yò[£íÄS@ÛžgÄÀï~&ÄgŸêsÏî9}Îa ?8–Pþ¡P›:Ý ¿l3+«E‡K‹eݧ(Ê Zç#§åsl|Jm{•mEô~éÎàÑ@"ËTräàïãFqYÐíWìs/}«tÂüÄÝ‚#0˜3TûÚÁ…ÉÚs£¢Ê4¿$ɉ¯5h© «Ã–©Á4{P´[ ò®ü€Ý>3°3¬ñ5…áF*ç'0ÈØQ^ ZÓ0‰q‡nP6]ÅÛJ²¾€Ãô[~•aF‹ýË{ÍáV埪ëª+¾Ëu4ê¬T4L®ÂÖGÏ&¨£Ü6@ êü]I5rr'„z>[¹@¦I7áñ¨E&ö­rƒ£“×ÕêÛW³äd2´©Z.ËËçIɤôÁÝïÔº ·Pà¥qVôWýŽ»ˆdýÊ«ŽNÏæ%Rmó¨y]b±^ÉI1m˜/ + +ö– ™}Ç”[ÿ3vç&âQÂÑxó;í àS㜎å>à$¦]¥ˆ81Ù¨It+\íu¬ž =æ™ÈÌÑx|‚èê´…!3Í!¬W#¦cÏé&‹µ ní‹Át€ ‹aʼTG›‹«fü%ÿ¨mn`çÅ][„‘<ã‰æhoMæV äÓUgºxtò#öŠ&RòŒILXÅtJj,@Km‘ÇwÍ9ÄZwNû„*樢âLóK/ºtÈêB û6à BÆŽŒ†ç½n‚½q—•ÊÎö­ƒ¯8?(ZâSÖ^¥8¶²XÅ7‹Kתʬ@o˜Î £IßmÀº¢ZêWµSÈó@'Z'ÑžV«’ ^Ç¥…)uX@6v‹`EˆOóxØûg—l¡´|΀Ïúµëwž4„½`?J%:Gkš_|ÙßyV­Mk#þ·”Zî„¡Z!cn³1ú˜ìÎŽMÿÎìú˜gÂL ?92€¬Õ¶¨zŽ?øåp¢ Vk±,롚í}Ï쨗±¿"sÕÑ\KiÄdäí§Í1Ií²5gJ6ùä*¸ÚZ¦Â³!J–Nëmy½q«ZgÁÇ9´`:Ó1öÉ‹j´|þ|+š°&¾¹¹r/u(äôº04Þ/qÒ” r–æмe³pë·Òq¹C‰œ‰ëù8àK'–¬“ðÿq5÷‚fkÿBr† yÁèGdæ!)3eÆ=Û®„;©3kšÎ4ŠÿFVIÏ”è,6FÎ&Öàkôï0ÖÎŽDϬþõ¿P–!ò-`Êʬ6,7|Ï 2׉þrÕ€<ïæÚ¿æ{ïèÿ“x—öé'¡9. ·Á{8Ú®Êø(l©ÿÉ]â hêœnøÇ#Õ+®ßJ#u’]e3=TŽ}R0 ¿w?2ë;?&×€õçÞæÔA¢mz¿ƒ£å‰§îì |@ AxKÎLݱ¾ZU´«t¹ˆ¡Ë(E…T]œ?â­Sï~A;Ę~8ÿ%pBNÄ8½W¬SÙÿ¯[n'ÞY˜;γ‰å—|Ðb)ÌÝ‚‡V£§%—Ê!ƒJF~íÛôM?É´^¬¼t¿’T‰B9ˆî§h/Ì–ëSŒI—MT~ɵƓUš‘&싟­¼“„n厇N:^€C xu£›Ÿ &Ã×âÝ;ÜTˆ4ê¢4TøŒÌ*nysõá›!yÚª[T•#{òù–‰èŸx´±6g&Ë@ 0€Ô›|yÄ”â<÷Rh°Ä1'ì>ú„E¼áÙFH}Ëøä:çTDÿntï«HÀcò†›yllw3š6̧»¨*¹Ó¹\þ,þ.¬´cû©Æ³=JÉ{*ñ\3ÜóöÊv {ÑýU«×£’Ï”õ U2€æò}ƒ¹·ÂÑ뼓óÑ̬Ò}[×K]sÎrI‚6uðq¢jÓÆb¸j%,Íy¼ªÒ“%Hòã9•šJª&ZÇÀ”½òt1ž¡àžAø„ª,ÿk"èÓèª ìßSžåíN¹ ÛíeèšÓí©%ê¶Þ-R.I:ÏlÕ"’ÂÇWµ›¥Õ†¥(%ì¥ 'Ffq䦜áú ±«»¯Ú$±c]·Y×r1GÊQ](±ë»iéXIOÒ»JÇðÉ­˜M-Á»Va|9/:À>´ê¨ï«Â;¶íx7m2_éóœ\¼Ä*§´µ ÀÑxœ¶išˆ­Ñ'棋­1ñÁ»1l %ò¤ã’0VD}åj­Å`éÇÓ•aú"}â3Ï=,"ݤ+Õ§ÞÝ•A‹\$^lñq~FøRìÓ­Gv¨Îõ©ñ¹JªGò[òz¬ð/øÀC}󵡉¾:Á¹J˜wØŸ‡G°naîzTÁõ ÞQ^U€HqRÀáÈú\ÀÐÄ6…€˜™ “À²•d£è!ÏvŒ—N¨Ržƒ`±FBœ®wYi3‘å8®8øê(eìŠp1™Áø÷}…~yÊ?ÿ#—›öÀ ’#p­Bq¤ÇÔœá+ž%Î\«È[ ç.\(x²qFn€n ÓMà„¦Œ¹Ja@?eÜ’IŽŒÔ™=©­%Jl#û5¨¨‹³¿éã±·š$R¥öf©Y'†ÎÚý‰ò0’„AøÊ}Þ#ÏÚ@œ¥¯ÆV’Ôà÷ºvš€æ#ÌÅý>»çf E´:qž]>ƒdxO ½ÿÙ‰LD$Š–KCA{-à4dglÂñ«†3&#AF½ž­Šús[K¥<ÖQ´+þ­ŸiG„wçò1Jºý2M¯Ño+hT‹K”B¢Î/EúÍ¥ŸNgoŒ¢˜›í}}Ë]äHÉ©J_ƒ_Hñ>ñºéÚv¬Fyqˆé©ŒÀf¹P:u#?@À¡ºäWc”±è\’Ð~)˜¡ãC˜‹¡#súå,£aûßD:!Ç…­Nw ÷| ‚Ì—4cJ$QA85¢n¯®S d°ýZþŸ…~õlýR”!Êéíù·qÞ‚„ H•²¯u4ÚB#Y¥¤Ü6k±Ñ›–Í¿˜í#‰qŒQó+IíÔGV”é[ Ž™mk­ï»Ž7oÄnXø=ÒdРޥ ËH±B묊š%ð®>óÕÅaœôYs+·dË:…/ãv‰{r×"ÅÇÁ´“Û\arîþbq±ÑHŽQç9”·P"!-% ù ý¥ÒëÕs¹`0šu—VÎh€/úÊåÓceÁÌIÕq­`…4ŠK#åLˆLÙ À“ââ’b‰m®ôîú2\ÐY©`Ö(ãK žHu3ÈqŒÐ9ÙŸ«¼š© ‚rðƒÿ&ßàåü‘C.…fì= ä©O+úúãÅqÿ"’¾Ù3Áó#m] G‚>˜Q¥Ê•r„ÖãKÊ­¦?­:>BÐ0ÿR#lRë6ÂÙ­„yܾ=1z£~zûêr5Ï] #,%ü%ÌÄŠwþ ^pI2öJ ¥0Ò}00Ú&SSÇ‚üéèÔYoâ˜çBÅð\&ËÔì¢]ÜÁåú¢oÞÕµ$Ë.¡çÅuLŽª Þo€Wl `çF¦Ù@~<ê16YF ºl0qËÞ¯ÛDs©)Ê )ï—óÎÑ… é…SpZbn¾¹ù⬺øy˜˜ºævJB]»<†fíP>°~b`-ë0ˆ²æ€ $%Ž“ü& ¡ìHºÚä6›¸,zGÊu€ê¢ˆG’ïæ€M]ÆDyGº‡Ôä3¥ÐËyz¢¦>ø-~Ep´åʆƒ¿w Æp {[¯’gçº"¢^Å®wè¥c³rŽ¨Ë—©QýeŽ9ˆ¦Õ½[:‡/ ±Ðqa//¡‚7RáÁ¿;¨yR¿RÝd@6íÙ÷,Ù„â5ÎôÇ~ïSª?Ïa»˜z¤ß ‰Föæu‘u9šÚœè0#Œûž›Âí tï]nüiR[Ez^W·z«ÅÕô®TÀ§áq¢ûãÆJõïä.# ¦æ»Qp9ŠŸ†Y*ïx.‘JÍ?qݤ¹Aï%Ü'æ”M°Þxî;8 5¥‘jë]ÎÒýIx;ÉÊÊ \çwÓòˆcòç§zq%$$ѨD¬6-ì¨Ö%}•R;—NwH›¿µ^… •B’¿RÕŽ¶ ™¯Û… Òm’©À30ì.ê4lºé“fW¡ô—·’Lyõ1#„Ïô1­3¸N ªÜˆŒ˜pÌü‰S”‘•ÿ>ÿ§*è“uù‡Š«-—Œëæ´²£ Ñe¿*@ò¶É`¯Ÿ‡\§ºz’ u°÷ØóC‰Ó§ÍåCé#¹ÉÇäLzòáþ&sìÖ­ë¯(έ}¢?ç‚ R dž®ø§K=EuÌ+3ø‰„Í/b¬"«¸ÉÉwh·±L{WEºTY`u7[+kç¿ øJ¶¤ö"í-L‡!ªlòü¯'ØË à†~µzlõ…Ó;1òβ1ó>,ý‡ Ÿ¨FÙâ¼÷Mšñ‚±„>–e+ØL¸M_ꊸ›Ÿ¦¤±ÇRM‘WV¾9ù­Õ†`qvÀæ»þ)ú”K8C©8Ã7Ò®%•J)3Š)?)+*»ÄÝ=‡Då%rÈÞ&ÛŽ¿áhìÓÅaF¸à u}ÿ tG(­X¶¬º¥ø ÑZ‘zî’¶ ÎŒÔ[@5—Íí¦†^t~©¹”†ÃSÚ§zAàj)jWÂn½`âÅÔK"þ´ä¤šë´GÓÙŽ,ly©{7˜[—\£X„j³‡ï6“2 .>ò¬Õ‡},.µùE˜D!ÆuRÚû™áX2s¥Ã£6:‰Ì"²‹5’Ð1p"7Z¬¢•s{Á‚©³­è/LIQÌ2îå¼ÐÄf}‹V ôÔÿ™ÂYŸIå“2瀩.Eüê·ãOœÄžºico8ëúcŸ¹Ä̘ÑÏP†Â{`/êBÓ¶uüg!ˆ¹W£º›^+ª?NJôzrW±!ûT M?£!®™*¥.íZáŠDtf¢"4¸ñÄ`CkMr»V('ÍqpÆëã-`ц•uIíïÎõ/«}‹ò8åÓDÃå—”ÁIŒ´7Çùõ+º‰<]‰|Þ¼´QwîkìÞznìYÞP¼£alr¯ÒÙ‰³YÈWùî–+ˆàjxSž8LÖ«‹Vß(°•&ÊíA̤ ·&|r§„àÙ'¤$¬RÁ½H½8s–ª’Ó•çÿ~Î'e±¥¹EI-ïxNJ>ƒ|¥ ÍçC—xä¬Â'U,ë’ã0J•ßKß[ñŨ»@?xÌÁ&ZÏÆÞÕµžÇ´ÅÆ,=Úu¥²®tuŽ™«E/þ››œdîŠ7T‘ÇæhЏNA‹ÁQïXvvéªÞg>n’çXk¶œ|¡%§È(ôdgËT@3àæ5 äˆQ8Ÿa$Ò×_̵æ~¢ràïr¦˜®”,ß\ÛXŸé[áßi>š…òR3®N5Ƙ%Tå5» [æé€ á:‰Â ‘ñÉŒ^$2 3¨@.ÎÃ캦±Žù/¤ðÍkß;u¨ÌUvëŸe9õÐG[Ÿ4Û²Ø@°PÐwš²}¬ºÄ‚ÇfÄŸTM0#ú7Ð)‚Ÿ†#øÔõϸÑ県IÕ¸íKÔòF˜óniì­Ÿrʃ趃£Ÿ"™HŒã7›¹¬™F¶ð\de‰e"8òËO '*¡êíi†CÍ9ÃìÆ,ŒÆ/‡`ÿ{³Í®’‡Ûer(Ÿ_w‡Œ¹dB°tOwƒ" ]ùùÁ„­—c6ñ^çN åó÷þ9Qtß(E7œæ )*Gm;øÂTýn^IU ºAíÉ´JzÀÓ£ìŒ\¥¬aȨM°ò+Ó.æ= º|Tý>K äTÝ¢‹š øÀ¯¿GÍ«çÿ›ËÞ® ØPñ"õ(† å"viÝú ©ƒoÞ#‘ʼnËÚ唫³ršÅàŒ¢¼ý&ö€MpPd·O »¡°6aÖF‹/’ç¨ÀÖ’'Ö:ÉCÒ\ÕØk­\¡£+ÈE¹MàâKƒŽxŠFÄ–˜—Î+Qx"HÞ{ÔÊRޱ巘rÑ­\öÃwÚî1™eš(ŒåçÔ­+¿þ'k†_fjE®Ó]‡[;wùÅÇCVü‡%ÀD#Ã-’/ªP…|D)T vo)8µ¸6¯•±õ_´ÿ/ ®+OqíNóêÜ@óÿiC‹c¨Ø¤û±±sÓ…6¶àȘ®Ïô„‰¶—ŽÎrVÎ&áÃHZhì*ÊÝÇÐÚPÔèŽÉƒ9ËI±Wçý8ÄÔ{8„%ÆÚ”u-|¹ù2íŽu ÕM$uƒÕm” ¦4ª)œVS¨8A¤O-§ýDïjËó-ô-–…Wø÷ù3ÑëÅ„Ži´-6X ÊòZ磕¾²ÌÐv1ñFYqþË Ò×Åïj“¿ÇöW*¨­±›º0“Íu[e4ÞÊÊp|æZ‚!?åO»ŒGD/ÀBü­5äù»°Î®q¿®:š(MB=†Þ3‘4½â¾COãŒmX$ô“{í,»rH=’*»¥Ä\4ÛÕ€cò"åÐ÷mS£{ö=ÚØ0Ç‹úɚÞ¢^·Ù§:•kG½AÇ$P_ÄR¯ ‹öÛ.˜µ2©x®ò0‡F¨âŸ Îâx†,üNàä #t`ÀtZün0-A áiÓ#7AùrE0oú×í…jðÈv*Óixˆ—ŽÀtÛ×-·&p­ûú^¢¼¯f^@"¡`”õùj/ÀGÔ>.w²CfhŒ^|˜‚!åˆ?ÊÀ=eËÄéÖ”OîkoïÇóž7ÖÇ*vÅÈpÖr ]“èûžbh¼“fqíJ}—ÉfkJ\úKk <-š€3W«Έᣠë˜ve2B‚äl¯Îä2 Iwo­ä-ä:v|ßß³:ð>@—xw•ŸáûÄZêòß±NfÂY¡ìVQ‡éãxY©©ä,å±0„ƒñö{Yi÷·“ØYÆùõ*îýÄy m«+¹Y†4ÿR .#{0¡u‡?h Nrù°ne¦þ:._@ä÷®·r1ÁOCp¯D?ëOî¬#¼ú‹ýQýØà±®¤—)¶¡=Þ÷’ü™‹ùžõ׳zœásN)mD§ÕhÅÝî­ŽŸx˜í†|…_ ø†±L`@MÿM8ÆvŒše+ØŠè,`=x)<1òY‹D‹_Aæ«§=}]ÞôÇjÒ-”m2R˜|<öè\naÑù[[®ÄN)oõ»Î0~ááݸ@×aÍ’²¥9P!p?%0¶)¨Òø¦Cï!é¶RÒsµFpù&LíPOt1¾\Ì…6:|:–SÌ!túщa‚‹¯òØ< ÑUÍ@,Ü‚©ýÂâCز°Ü¶ÅÀ3È/ç*ã/í3Y©ÏrnFÉàE°Œ¦qÆX±Z¦«šc3ú +§&}œ®õˆx ‰3HD‡+^ûvÄù‘§!ùz%7:¡ßgÐ|Z;º>‡ß) ¶îwVÛ0%0ïyí šzÌJÆÔ[‡MVJÌ•3}tûºûjðfT3 D´„Æl¢S]²^Ú}T žP 4²QET¥H_ÏÈéV©+X¿Çö|è×áù‡iäâ¼ünºÕxR…«n—yj îÀ™°£‡}ÎÙB©á‰mŸ¾•û£ý憌,’±}¡1Ì¿¸|TŒ¸:R܃¥Rß¡”Õ†}Z.Â2bn…[˜<6÷‚«-˜jø{cf]Θ9G-ú7G»>ƒöW-8ÿm2ëл·»É ‚*.úV‡‚¿¨›Öƒ¬®"· kž HºúKïA“¸&Ø£Ø\mgƒ’q›g)æFUCàÔ!ÂðÔF!½¢Èq/S^t­AâeªØË\öʼ¤2nõ>É-oਯ…ì»™N¼ˆžÍ‚ïY«Û¯“íôD)Í.æú¢…ðì^È–Æ®ÙúÉ$(Š·Ñ#6ì‰àD¬=×gôíŠÁºU "ëÙ9&7¬æ†ž•cs³/dr¯;LÄÑ9M !ÞˆÊ1 êJ’Õ*ŽÌ!è!ÿ&¾òÜvE˜õ4{RRâH,/øñ mzi¸ö×Ù ¡e4Mðí,k½oí/#PhÂgȈ{ŽÉuƒÉÐú²1çw"Ê€m˜:Kï³ÉT­‹zfPÂ2ÆÙ/›êìŸÖÞ£J†œæ¤”¶K1¨ ¾Æc ã¡_ááI|­ªÅÝ=ja0:b'¤šq ¨Ì(C®Úö“ ˆÐØÜ ubõ¨EæC>eJIPîƒ9üx–¿Ö·{?š€ŽÇ2·0Œ4×  âŽü.:S&j4€X"-JÈ´S„Mú¯MXTK¶\άîŸ$ýÚ§%zñìF¦º¤{p–‡o|ÊGÅ/^cÕi_â¨0]S弘µ³ïòlüñÑæ¨íÛ”•c4 °?¢oψ]8Ž«ßü3‰{&Ü­/j»‡¿WÑÇŸ,.L9ëM{æsí7g~SlôEäI÷¾Æìâ̵B|TsôÈ1L#"13!o­idv¡~FIµT:^Ë@L İa2ÓÆW™E%ÝAl©­VØ’‘ÆáÇÑõÒ{l|'½¹žaoޏq¹Õ#w9 {¿°„}HØTnTL[[qÃÅV·bùKéRû÷1ˆؘÈ;ªåÌ"ò­rÔ‹þ¹:ö—´Ü ìëE®¦Í/X3{øý!_ñü¨ÛÁ¶>Ù¶-o«"^uºKl7sjÓa#qÝJèvÈ’÷ÏŸ?»Gô̧_uN÷* Gý­x£ýê)A/J ´ooØYöyžWfŠt©“ÖwŒüµ×¿PT\«§Ý 8ÔˆÛAxO¸HDZÑÕöÑfû_HO§š˜„Év2ØÎÂYk+J`±éújDLðE¶{Wx ŠV¼lòä—ïžú;0iXD‚xÈéЧßo­ueψ¯“íO¤sŽÙD¬œÆ¥’zZ;6*ËU:²ýÜ ¤ OaIšb=¹ ªõ©¶élï^—¨.Y_'ÜDAÜÒóýËkÉ’  )¶” «“+½kØfÖ 88!‰‡/ &WÕ[â¦ô[aí¯yk˜—)õÛ—Lý S]£¥b×=¿êÍf(Õþ‡Bã¯"B¥úêB ½é—u¦/ªe-°1#"Åš8 ‹€OŠíHz—sɛ՞ƒV9æüq¤³ßòÔ‘>"‡$Z¤DÒ3Óίã²ù{Ssÿ¦na–¦ëÔ<=€ð‹Öõ.•l4V0!ö<«£ˆ•á¤F[W¯NÜ5‚žήÀÜ!å8©iåÌtA®ßA½ÖÝ…ã8Äå CºÝo,~þ±‰·S­#n+oÏ>s­ßi@lÛÈ|ÙodÙ³4§v¹Ðaï“°Äk×K÷ׄخÓXÆZ°¿ÒÉ„¢¶ û<ÔqAõK.4úÒßYIµŒŠD=,sC¾R?ƒgQ$F{2”¿ƒB.Þ¬=¸›ÕÙfó'ØÕÆÔªýô2'a~gÝüU¸ZÎ×3”SÚö~½‚[wEl~kcZþÔ,´¥ŠBZÇuœLœÃ¬:ý@¸„R¡ZŽÓ1¤¿îëÿ–£‡\oìÀ­pàŠÚbó9á.^¥PAP¡»¬Æ`Ü•'iw-‹†ÛhRÈùívR6ó9(_¾,'´Éäú߀w²~Å"5,ô2KV³4«q¡cmnñi‚Åî‡Ë+yëÔ”¥R Ê&-s‘p´RÁâÛÕœ’‡HÿëÁ$“ÿ´Û÷ö€ŸÏ•!ÚíÕ-“gë o<#%¦×BuÕd¾Ïò{B{šæ˜«$ï¼à›´j6—¯Ï„K–Jï==ò„a"åöÏ å£𔇥j~™l…möªF“ó- c…Ê R‚½oz¡Vþu¹ p,?ú Ò@}ñ¨S©§-.ñƒ7õúùˆ—³#œ™°fACî?[ Ü …„ë PÇtÎ/– e'Ž/Þ²>Îoš‰Œëg¤HÞ„î\Î×pôøØa<A±ŸÓhiõ«….‰NØC-ZÞ-6€‰ª*;üë§V£J¥¦EÒ—[ìX7 8Îðéx¦cGÛO·l§ñ§W b8ÊOóÒûôÀPè î×ßHeŒ„üÍlÉ;r͉-·ÇØ|À裠Ž.Ï0qE9ÿ/#ŨXÙ˜I´NèôáD­é_„«ÉëÊÌ[çÀEêÿTäöV§ÿ5YNz¯¯^UŸä+@°A{‰h AÔ8ÇóãÂ~³í÷ƒ{Ë#jN“¿ó ®-¬«Æ¾~ù7¼]²…NC±•`m•¤™{2ˆA ˜ Z±¹g•[7½ ¬\«ÚûµLÅìû µl/L‹ mlų %«ŒXÿRô¬G"ˆIøÉ$~%zê¨KU£-ï-DfµœüüÀª1eßI6PÆ¡4R{|B¸B+20ÜÑLnæ¾²{qfiH4H5r?•ì‡ì¶7Œ´‘|Ú6m™°ûþÂ… í³ÑtÇß/£6˜›¯4k ŒUAïqѦƴT„ töûåÖ¥;1¿cKcα~ ÓŒÇúM÷³…Ë*»š¦©ô XZh£Mÿ¢GÂë[TTAGêa:’þç¶› 3µù…Ö, +UíäQ—í3’,,@}ì_Ì|WU> qñ>;èÈE Ö(¤QÇŽÖ7-šËëPtû¹ð©±ô8òc®ÓOófÞÎk_¬ÆÆÇ¼Û©Ô•ì-¡4ð²cÓv«o°Å!½•’hõCŸµÊÎ¥jÉöƒ<|¶Îcøc>žÝP›€7õ–_ò$…·5‹ ü¦Þ´Á`öC’ð]ò»¼o£j3n ”‘ÈÃ'Îs†4€ˆí.ØŒu_Óõ_ã웸n(-~Ç„œþ&[±û‚OÿZ…´¶«yï =(TìØ1¹c$Ë‘‚ïjþÕž¥SÌØQìQ¤zl«;À½|M ™ Åù¢U‡C,ø;j¾Ý+ËÝ>N)ËØ4Qðßs=ÚÑ‹Î7àb=Úzj¯’×ëµì¦¹Ð…5osØ_&ž ûŠ2ýØ%ÌðÌ4К.¨#»‰ê«ZÕÔ{' GÓÎBZUC£?ó"%>ÒéÚ½f«Gu¦û²Á Æ/™0÷‘GÏw²(Ù¥£yY‰»ê<¾¶ÞhæJ£ú»âœëœ­IS®i`_Ðýñrñù~Â[?¾¡¿Gý[à; B«C5‰‘ ’Gf¡éλ·L˜EoqJHV.s®’±†ÃÝ:³k¯ŽIK«˜N™)R¸Z|æiQÜÉ{1›žèÿ#9{9¾î> Äs+J#;céÀñ`?UYG¸ýow72ñFUYó5 ¾¡òÝ·-½Å^¥ˆñû80Ùzâ'þÒ‰‡>D08~Äøò»G3þã뺖#s·B®.¢ÃÒ]¨_[”ÕJL+C‹)‰63eüÄ/q%nsÅÿ÷»ä3 ti£Ëü‚\8Ả¯ vÓ¬,•ÝRL À* T\ëì44_ÎÊË£dL•«Ã±§uNÂ+E”,1â‰CEjªüŒ>‡ ˜Wœ §înp 6czG±…6'Xù‰SoÂå=/!þ§lNa[~8M)¦f£Æ¤¸x‘Ž3¡;¢ó$„€Û×Öô}’"³m§ tQ/Ü¥íÐá5ÃÕò}Œ2Žô“ü›iékMAWˉ£Aco±ÏVÇ]ÏË‹Q`ÐLêw 89Ôë7ƒŠ‚[Þ|‰&…0Nsôú¢BáÝ'–t„yX|]ÇÄØÃ%Òˆ™…‚”åUîËa²ë:¥fÁÒvÉit­’&mwÀêú}ÆÂ„ë1¾fIWÝ/l9æòúý¼,—+î´LÜÌQÏ´M¡Ô 8¡?ö°Ô¿ÒÃyÝm“²Ì&‰‘*ùeO™ÜƒÂ21fŸËæÓÍquáÈR*•%Í:¥b°F1B.>ùHÚñ6›|òím˜?ÓkæÔŸÅMw)‰Ù Ž)ž·f %:Wia²=…çï&¤¤|Þõ.æº š®ÓÚ“Fì¢`gÈL¢3ð" îHÊríØêŒÛò·„2}¼wѱ¥+úC÷æ)Þßeù¢é›´ Æ%aÂÀLa‹‘Œ]+"»¡é1 Ve^`¶®E½àPÿÀÖ0º‚£Ì¾„À†#8Z4Tgk¦BKb~íþ¹ìbhD¸S’,‘ãÚŒc%ããW—²—1o~\Ù½_{.o›)ÍÏsÆ}‡Ì”º“UAŒÝÔñÔ¤Ú‰ÒUƬ¢ðµ¶Ù¥bßÈjôŠ8¬Ò¬]á›Ô&ù%öjÁ~p©æ¸àgm7¶oˆßJqõ <²Hp—QGf6ÄÖ®>Ê5A?¦à$-{)êô´ {ãR$’0-Î-¹ÇK“ÈɺëéY0ï„þ!¨ˆ/Žr ևĘ=#K0"SDëI†#°žI[W\Gx¯iSF<NSßém¸a¹‹æè!†ÑCëæº§‘©‘Pž*6Q8MÛ>=b8h桾ÐÊ@?ðárïaL*Ыß!¥iðã”™[e¦B‹bºŠŠþÉÅæŒ™¼–1Àáøp•lIÄ€I†ìÀ]u ÂÌ'6[Ù@J}¡ºÔOhãaÃ\×¥»üçèמT¹Qì¼’ÞÛ©çYaeBbþ´<îÆxÇr&ËœvÉÍPh€Põ£M$ü¶.Ej/Cµ­ÄTy®îÌ Ïúœ9…óܺ·_ÿ“ÕÇsY>ŠüT¤2µf7&«nM1Ž\Å0Móñðb=Œ›8PíÞø¸†UX©™ Ù>üK¥ÃË[ÔvDŠ&m ûfeàTKØ?ÁÛÈUsu›á,fºH¾×uù/øDƒ”ZqË:e‹{`Þª`†´øKå;!ÿ ¬TšWФ¶öÔ?kæ  Ë1‰ˆ;x**1½¦~ M¬R?âÒÓ ªÕ…4±gb_è"ÅO±Í¨ÿžgø_zJ‰Þ!…å!Uš±n¯“É]/¼Šú¢2û鶸íu®õ³Íþ9î ÿ+€r±N âã.H:Cêì 0?Ýhbµ­¿š^•kïdPp§¦ž8¸dLN·Îªâ%ÒRrÓˆÿ¾ÝòòM˜É<ã¯L‹{ËÎŒ¯¾ÙË{‚#±Óò•}Ò0Ûg~¯<,ÆàÁB°™Õ€é0¤¦bHDË¥uÐ̆ÊLs®*|Sî¤ãx'†ý§ £w~‹€(‹’:mpèH˜MâüìË!¤g_ùN`1j[?a^èæJf7&pk0Ù•H¹Ì’ãÈcÝu MÆ´ÍF‘œP; Àìqá‰f·ÃŠWÓ²F!0ÎuFø_ºXž‰™Ïû°Œw®#É@9a°ÂÊÝdµ1¡(@ÝœËÅÏ'6üz¥Ó·Ã¿Uéþ"RæùðòoàÛƒÇê#¨ås}àl˜8ã±Íô]¡1Tâe™ubÛ«÷Tèiµ9 ä˜]%“¸®eŸKÓ¤£\Ìa ,„-Ç\»è™"•TÊ~Ø E•JÍ“qR÷æ÷ššm»%Ëže°úÍ-ˆÉ=ïØtä]eæ!Ÿ=™A5UÜÑjT;ð¦g•pM:ˆ:g‚ „øwRUá©ÿå`§§s”M›¥V I&,x¦>Òº_ *ßð“häýh6æ…¬Ëû×¼bÖ}¸å5ážÃúB Ë$α&¦©Ð¬UµX²¨ÉʺÚ'q?»¦×ò+YÌÜ›PÀÌóx›hB&\‚Fú5­(#ð_]оÚ夦ØÖÔt…° Ý"6·cEêÓþ¹³—©…‹Q-äÉ@²á(±ð8°µ±Œå˜Ð’4@QˆáVM(š£|{‚\§J»ÞðÌ µ1['˜ÆF8)mY¡I$¾¯Ww„XТ£]Ö÷ü€ö&¼äçÊ`·Ÿ§Ý¬èrW·k)`[WçTˆu 8³ûÛŠ¥³ðKƒ—]K†6%X> üÅÈð]wÿTÎÖ9¾x9°h@=jÖœÞ$MšÖžº‡6¯á Ö†0ñaéjoþ?Äk ÛrÀ×é»W›Öƒ\”¤ÈPyFŠ’˜”\’ Š=F ÷•ˆ|‡oKéV€)¿n¿omFìÆƒ–4³‰ú@g!rò“tSyö76‹¶TS¿×,Nß_î«H´H„ÞÆÊÁ'EŒÙ$â¯qÙå6UްÂ{pLâð л WîÜÅn»Æ“ó¡V–¯8ÿdCÊudÅ‘óoŠÿÁ6Ò~óɉ l›Zæ¨SõôU%-ª™“V‚Å÷è¥â."h#Š3ºH€l¡ãÝ9¨š;ïØôDØ’AÚ/ÁÚ¬“ưQÊ¢‹8IUÂÊ÷<èåÑÎ}›q—È/‘ŸÆ}øsw \ˆÓGí¾sÑ}Ó¯¾1/®~eè/µÞœ³‹<œ®Åár)U‡KÀ·Ut0¹›æÝ8†.G—-Xc)£²A®o¶Ô-šs'ƒà…[¸säÜ&|¶c.b ákz7Ÿ %,#Â{ÔÊÂ+ðì¡øØ—Xvòé‘D´|Fñ¤RD_Ni­Àüýj¹q¹¨@Ð4®àkó¤P•¢µ.%5xöbk™¨]ÂLôk‡5¦Ðí÷·èHãä΀Hû-”¡»`¢:K®IŒ1'yý»ŠÙªz=ÖÄ;[ñlÇܼœñ·~j2¹> ¤"!»‚t`z_£H :ñ¬iÆû×ò¼29ýIüsŒ £MǺf'±Ä°ô{(˜×Û|ÄõÖ¨Ö'Eyälƒå#E¼:óJ0ìÒ±âõÉÐÌ¢‹:Q­•€ _¼úѽ>t*–#6|ÏŽÅLd€“F—"òßñ€B#W7—¶IÈ áE×& Ÿ SZ.Ÿ©ŠFÕ…"‰ñíYÇT+Ã]‹6ö”°vĉ _ÅÅéÝ4y㱎 — bz‹JlízVû5ì³@Ë2X‘ÃØ·G»`Ç»…WAcú²0RÁçüúU´Â~щ*ÚJùÓX¬ˆTéŸ=ÿ„Óeô®žyÇSQ>7£Ž. [óu ¦Eo¿ã—g1 üÉö™¨‰ÍAoõ¹Èÿ>{‰yýèHIU=%?HËïÏÑןpöÚ_d[8Çñp{îÐè¬&K|+£etáÄ÷?)¦ç ˜7C2Ë@³|áC¶íýKqÛ~^tÖ¹š|N&ŲG|@Öaìæ¡¤ÑþÌÂëêÄ0¹Òä˺ý³,bعm~‡ñ|GTíäóë‰/ažÆ5/ñŠnâô?_Søëø›ãá¬.(éôâgÅ^ gã 5Mߦ8h˜õ(+”YŸë *©uF3çdPÌg˜”Ï„ÿ¦G÷R§áP–ÀyýivŸ* PÞøø«¹çx– d­Ï!VBAüþ0ÂïcÇF+rÞ<&.€KOÕ<À ¾S#5¿á¸Œw¦RQt[Ö[ñqAÝÂßìóœ7Þöm“êb¾Vÿ}Þ-•¢Ÿî©Ã6wœp0æìTq>}‡-¾l'kcšÅ<À#.Jì–?¼z:Ÿ]Í­MïUÏCQ7Uu÷w[Œ¥0y ‘U>V¨ÆO)ÒLÑ—Á_¤xñz=YI*ÞO¹‘|*Óœt´mp¼€_·5 •ÁD“µƒuÚŠÚïÎ4!´²Kóˆ3í|ãì€ÏÏ­ R€9ºôÎ3ïi¸ÙôœìŸv54` ÁÝŸåU…ÂZGwvX™,ïµý¶ûR|+Šh¼ÀÓ‡¦J 9⦒DG”á…÷üÕð3êu¾›\G ÛXV¬»«›!8 ¸˜Oã ×õÿ…  ÉÄH©IÕ÷{÷ùº«;L&;x¢:ÙäVd{¦E'jŸ[.GÑÚ8%â€UÇTrø>do›¿ö‘Ê×,X>1%:® %%‚ǔ։@Üs(¡ ÎÞJ‡‰œ™zÔlØ-¸Úsf =\sǃiÏ‘ lÈa‡´(îê†óß6JÄZK€Z!& 8ø‰T·9H€x§ùävkº@‰Qõ…=Cªë;'Ë:ƯYè#Ž4 ŸÙÊÒ-8'`y>Wòš]µÒF·ÿl‘寘ò6ÕáGá_²æ$ûæ s¢ºXÛÉ@á¾3Fà'ÿ#ðÔkq¼«.VSZ0ñÊ=Š.ÛTÅ`oOÇZ>A31‰ž 0‘ âÒVpëVï¶“vI'd;ÁK¾*BÀ®±º¤;÷ù»„”ß«íõ=ºò™•`[d=|€–ƒ§Ì±gsÓÒ÷3ÃÜÝ$èy  뫼ټµhÝÇ%[I¼Í}c}svÊ|ç%±ûsÁl>Î3jܵÉÖ°$XSÁø–¶°ÓŸeò_4d\LU1é=ç !&ï­+½D{¡%¯&ÇëÜoà\е(®˜]&ýÂzbxÙHd…;aåkXxñ Ƙú…Œz´PîÉ) gŒ BDu6ôd«K4"2~Ùä¥çɪìâL4 ‡—R²÷ŽY •1:ˆ–y>Lœ“Ž €2W¸{¥=ư22ÃU2Éxv 9”aÊB˜œvA¾Ä™(º;e¯Qüì ½¯UÇ,§6¿®¼MüDIzn…ÔA¥ˆÉŒ&Dà[&"yÈPÜ ‡ä¦Â,B´’”^5‡ÊR/ÅgØ­ûžß¸HçïÁÓï5ôØI£*äøÝhÌ%h‰¦êg$ËdÝ?âˆ/º@riR—8÷¥ MoA£ò|¹ã2óc¡DAñç]ÊM°ŠûGÔÏpPMf£ˆUVñ BOJ)ß6œA‡Sl?®j 7êÛ¿ ‰¦eF@·ÕJÃ%ÏLa„€Qµvm$>éúÖl"‘L$¼ûûù) G°º24£ÕÂÕ­‡ sÓ#R¾ÒŠðå1¸›¬:æøÅd€—º§u BÅ%2¨xsz®‚ª™•!¹ ¹/¥z„•dòiÁ9Êa‚+Åǹp¤<¶r‹À.9}&,•ôc1ÜäS‘QÙ÷r• ]¸œ(º¡Ò~§·&*1ÉÃ\ÿ‡ÉWÛžÈÎ=#WZ8Q¿¦*B£Å„ LÓú¬•Nî€Ë2:» §ó¶žñtÎZ éñó)èœ.§\š x¬OÓ|_ôZªXuŸ^ÉDþ;ÛMû µœ½;_± ñƒ£=_åîìµüŸÿì&}af‘¯…óɽi‰»ÙŠó†“¨vÌ;–D2úÚ)U×`¾¿Äã­°é%ê—ðÊš<¾Àê]eŸ‰YJÃÉ®BRïÞk€È9‹ÂkìÒ)ê{øÄbR$·2¦ùjTŒ É8Ci ¡‡&×ô›uí…ÒU×#9|ç^ÒuDK:$ßj1>êšµâvLvÀy0tI»Î²“e4’ëZrüàÿÓ+âÐÝö×Àýk²bôH É\üôò9–)),£§ÕošQîÂ}Þ<$ýì ÷… Âã\Ñ,A í……șζ«¡øüôTg$?GMµLù[uT¨XÄ?¦fº—xˆ Ñf–^çÌçpVxӎж:"èmÇä6œ?‹\üCÝ¢T"¿@ï ÃÙuâ£hªÜœæ\.bãóÝÇ‚¤Îé%sÞï…ØÇeèX@•îìh‘°Àà7k¹~´™ZP ²c7A#ŠãGƒ<úléÞq]ˤÁˆÃy˜•Ô+Kž¿T«Ç6ŒBÉ¢BŠpãÇ¢?( ºmoä¼³ì«{5·îLTHér3QEç"Û&"64…ðò j¬6K|t3kÜì顪ì.. ‚•Ÿ¹b ñR^sZ™= á/ù/8üÖïÏ%ÛQà{„‰rìåðй\~0 ‚^?·ÜNã(.6ð-˜nÒ¤zG“à‘l^ˋχƒ$‘tà²Ë‚‚ÝÝGµýüWØÛ‘so1Õ¤‘y-îqqÀ>Ó>RÅm°à1X´0Ï€ øé¡Xÿ#å¹¥üü=ß³Ð~¹Ž±éb6Ö‹ó9ZsP§L\kUÜ^œÃ÷Ü,ÅF’m­`“ö"RÀXû# Ø€o÷øoŠg6Ëv–\çÄ-rõ5`e>Õgµ1ãŒÛäq:FÓÚ´,ܯ–Ôy ¶nOž”ìa¨5°’þÁ쨻)e̳zmÜ#x€é‹eÞOöuHE›.ʇԴôÊûÏzïö¾ºôt³“Š•<a¶Aݪ݆µy(ƒï‘[°H`œ^áJf‚;~H'LO%ø¥7ó°^ ɦ Á÷ÊM†Æsop‘D€|¼_ÒGA[qô¿a}·˜:èĪÿ:¸ÍàØëS;XûÒwBHNFGèöVƒ‚œK„Lì¬+ ;ŸQO©~R‰Å]Pƒñàf@³¨?IÆ4í;{jÍÇ­¦`–—’—¸_’¤ŒÇW¬Òßѕҋ¶Çĺ[§ò`u½]{£­ñö‡7#n?&\yÙ¬YÏZk}ržkx”d¯.uãÑy2) ]€2ðKjr ´ó‚â[F…=ãÄŠk %F‚ãÚ ¿—h»ù´/Y¼%yRN:Ìx43ª §œJ»Ó Í±-°-Uç|þ[t ÐÀ9˜òÁèŸ~¡í¸m.jé¡$ŒbPd§“£½š};8Èdš\÷­¨K¼•i½6䀘ñŸKSÙˆºxW7œì 'Ê÷ÿ†ý¦dTÿÿþª„P¸‡&¦›"?ìÈÀå-&]5+_è4ã7‘0hýÚ™èÁ8ø¾—ë†Æ<å74*AÙ–ñý¡_ˆRäšÌ+æ~:°¹‹•ÆlÁ˜ñÖqAv°©Zoׂs-v=hñrïÚn’AB´Î"h”“ i2r˜BÑ@{͆6¬Ù×G%ª¾¸]¶‚u¨8Ú69ú°]€þì¯ÓË'˜Iú•Î!fŽÛË æCçK^Ћ ¯-¶ÄªY}ÔÄ¡~sÉ sB`t‘f§òŠ„ÿ˜ n[é µïé¾v^ÆY¥œŽƒ¢Mð{ºÞ=Za?æ÷ƒ%?$Œ&/o+š8†,Q@\¤W˜éYVÞWyº9ßÒMŠ;!ãâÜ,^môðt’ªq5—7˜%Xé!‘öi *ïÿãW¥ú9™ûzÉ9e¬H}1–²Å1p˜™f¨XõÄxi8øÑ2ÏS‡9L7 8#Êü{B˜Z~"b4°˜¥5d¦tÚ ¤³›# ? iñÒ[@ö-9=Árajà|â·ÞÝõ‹ÜõÕ òpá+¾Bþª®’×n€Ò„’JŠUWŸ_#³Ë–Ð…ŒîñH¤uFò°í®±¸A †²Ã1HÎjêg‰|³2ÀÎrhNôäð_¡}‡£P?ìÄhPØÓZõ8êU- ϯXŸx/UuD)³â7¦ºLŽv´UK®ä³ÿ¬ÿÈ8ˆ{ÈãcHã¼|NeM]7Ћ„–'ô¶‚½¥z™ŽâŒb-% …„ðF8%Í®NÁ‹ÿKÑé~uªJ•ûÖÄÐU#ñ¥[£QwL°+Q•ñEܤz(Q¡U´5Ä&uŠ˜Ñ›ñ*@¬V…wj+´œÓÓÂÃ8ËMX .IµgÛ«óÑ í›S;¥I]/®7ÔE<#Ò þÕÍa¦æOÛœ”¨KðQo ¬5`l׿Žtêƒè0yßL`Ÿ†¹wa¹æjzÇÄágØ_Üö„ÿ×™øGäO¥†Ö,Ôàð°ìLTJ~Ts£æ[55Lay)ïß.xÎ!éš- ¸¯m´uZÿŒÒÆš÷~lߪ·¸€©L4ßÑr¬5{á!]ƒ.Z®B”©,æÐñ «& Ïe&Ì(—±‚cæûˆïš«%:6#¡©"±b A/*”Ä@ØeCÐõo ¤É¡ñCÖ©÷¨?a äéû‚ã d?æ':§Ñ{ÑH |· âËt±±ëãUm!nñ¯˜ŠVˆnGù©B)ÿÊôÂQ½Ã€¡+u²ÖÑ/lvÇBÅ$¸±ÈCçF×—×Ò³'ójØÂ­’àÜûÅlSVâÛ—f Ý^Š%¹Å q—+ôý75Y쳘ʇqEÓ1+Š2ò‰ˆ1ü\ÉM"çÚ§Z ¯Övgtø"`ÿíS?r[±jÂô]Bn¬}ƒ°:·ö‚´òme7÷îÞžu!¶BJ0Ø]—ÇŒU”멊-ÜÂÚ¼J½0çõ%b¥äø„º«â³L°ÆX——@ÔÉÑü?ÎÖ‡÷7ÜÚÑí­&¹EËÁ´ûgòhíú)Q°|¤°2WqÓí$ýQ@y㤢WV`ž>¾?x±v¶C/ì ˆXÕ~. [Q Qø°cƒA'SüÚBœ7±“YÍøVóÔžZÊÒ9¾hô| 6i6°`Øý«4ÇÐ4)tO…*ñu£¼[ž]ñ5¶ƒUÆà%;ïžÅHp€™òzƒG÷½d±Ò„97 ¹œÇ*x*·„½ŸáÃûùïÔ™²@šÛ~…‡jMÍR°Û¨*æ×I›Ö³Ûh)(¡ÓÇðrwýÅòÞ&?:Ôg¦°Ê߬ÝEÁW}‹y0‘W(E…®Àõòo˜œ_ (ŒuL$µ¡×T°*ÃOÞߖȘɷ^!VKy ‡²ÕÓzΗ¦È:¦{óiÀÂ4Ö·ÞÒMhMtzç­$­ë‘µ¤C¯ÇX ¬ËÑ?–Õ“Å”®¡áœÄñŸ²9zfaT8¹µéÜ´ùÀu@lû#ÖØ ïa™@ö!OQ|¨Â…é™ì#Jh‘iˆ&ú‡¶ú‘LF Ì\jM{ÿ þÜæ.á,÷=YæÃ:uQÖbpy{×) `NS KMim»[¸âH‘;[Ã"u¬¯@i/Í`çò!™b,ÎÑÌh顎öŸ¼Ž®å€] T©eR=÷Ô‹«ÿQj]Ø‚šW´è§¼”Aœ•|âcÔì”·ƒ‰LÜSXÞs^Üm{öƒêßë£M­ÊOÛ½H僊c1@S* ûøÆ #kc¡¸ë¼jð‘ãÕû†3ËX.@ÙÕøo<Ðù‚¸\qéþ].°÷þ_ì‡æýÏ+ ò+S¼Ò%½U<Èý,Ð ™â),»óÓÇ>úÛƒºô¼·Þ•+û¥ìÞ ·æðµA ·qôößJÐ zkŒÀâËÁÝ\ULC+/qQAŠzD°F”D˜ðà÷–ª3œUhÏÑÜVÎÂ!AÈ=t¶aÎqŸÙ›¤“£Öð"Ý×äèñqð¬Ç753 ¦{jܲAr72Ë ·X­Qµ”¾¹ ¶¿DêU{¨Q~–ž5óKº.BU×/PcÓ»íúe^8jr·^žv/gâ‹s³ TA\ {:.z¶ÿksÃÄZS¨Ô^È9x©ãn¯nwxÌôÎTYð—E:üÆSï¬Tmw³…ZŠEN Q‚±@LjÅž06íêr h/–þo¡þâÜé5@ÓBM…Í­QÀR€æÝý|Ñz þ¡¾}RÄÿ]|{,Vª°-X€À4¢ù…¢è7x$ûЍÉ‚¬-øÖ®ù6’¶`›ôxjÎ6ÿlºß†g¾S/99ÒB+Þ¸ˆ1Á)Ùd½ÜÙé|ãºîz2`Oäý‡¯Á@ú;¸²e­hùaŽ^ÔQiµ…4ÜIxSl²ÂÚÛúYFU"‰†æ¤0Lz°r¿µ†þãÐ#Sn/!Ù“ÜîÁ“_t+›Ié ….HïýYߤ¶M=c²§¿³-¨ãí ²Êôh_Wy‰²õ±Lr…ܤ$œs¶ nÎÐ’è’÷G4M§ÄihèHGKükFf3vI(ž…øe/ST¿˜$éIÒ£×#öÙëp‡vNG0¸y‡@š)°3YùÈDŒV Í3ê‰Ñ¨!×sØL{$æDµÚ·vÕ¡çœSªeYÝ|‹wo%Z·ý–l«çq¶ÒŸ°<ø%ŠIƒ€ËW]y—xéÓø–Ñ»•ÓF„àŠyUjË||²Æü%š§ïæD~fTG+N‘'×ð–ÔÜ£®½H¸/ÁüxÄ5‘Õ=*¦æ~9È_zäÖ ÀfH‡de=éÃ÷4Óò¨06 ÷–GëÖ7tp|¼¨ûPiÊÆûã„ÑÎ9à4·hÙ¾÷¶ö[ÕŸ³/«`?jþˆù QÝs¢î–))Ò˜¸hÏR F°bKymár Æ“Ãr~m>Œçõšdù?ÈÈC÷Åço8é3üL0C‰„í\Õ;‘hdƒ Ô$KõåòœØ ‹ˆè_v¸´E&ZHðá`.{=@Ûü-òe÷Îı©»NÚóq,Ìc¥*¸‚0=S©›—+jøº|‰à yH€1 ×x’[=+7¹I呯túê ¡XÀñ§:ûŸ}lœe–õzú‚»‘Þçq£§_PˆÙT'2^)ä¼ÒðW4œ›b{O£*¨ÚT“iŸg=™mIw„KéûBЙÄ\Ñçâ²’èHÁ¶;§BÌÀ ²×º„ðáO‘ÓêÆ­$ÞÜA‡ýÑé Sâ ÎÕèï±å.òg öõ¯qÌ:ËB“¥8ÛTA¤C¤øy€‚­Ø(vÌwdNGýózîÖ)üGŸÍnœŒ_ ”6X‰^ôCÕÈà/ï\P‘S›A¼„ÇW¨¤¤\ñ“ plgDe/²/q†•¤Œz ³õ»ËETÕÒ(»Ê´ó@=@«^: ûÜž ˆü@ð}>Jq„E¤@a»È—¾ó†ÚNr1‘ ÿܶ,® #™ÂäÌÕë¶#!Rv2 ›:u»iN«dmXËDÔ °DþçK…9åªSõ°§D#Þ!J BƒáM¾|©ÌYL&@_¡†ÒS% ºq¼§(Œk0ÒÒàúÉ'm $!Næ˜w P9¾K[Œâf– F»¿{ýŽÆ[1i©º“ÃÜÕuÍ;Vºöü4Ì —&e6½äM»™¥sâ\ÂzÞ´ê›I86õ±©»¿>1íëzIjájùzQ†[UÊdK¹ÌgT¿Y)è> ¶AÏž¯Š•\èÅ/:~±Èç­žYþÉJ¨¿¥ ŸÚ'ÏºÏ óboðÁÊ j²’yË^ávÑÞðe;БÒmÁDñ5x޵:•€‡«e[ùÖ_K¡,ca8(hGlš²&¦]'f`Hßìq®LMòG‹IàiŒã9{{ö¿‘ç…uÌsÞHÅ1쉪O ŠTCP£iè o-»W¦.$§”ŒãEy‘7ênI²Ã5m;Jf—ÅÍÒ-zrsØšÏþ]*/óô ÚÅo¾ )›ö¿×§éT‚•9ÚqW]ÊÖ¦/”->)Öœžr¬©ÛÝëyøÖì)Ë{ê_X£n­¨3bçã±<ò¤àüærÉÛÚÜ Ê_#W \’ö¾îPaƒº¤kõÄxÑ5S_Î/ò0lÃ&iç ¥OüÛÓŸ›|U/Œ©`­>¼Jéd ðö|¾*¦lÎùyÉÊ g™<áSƒµx£ªßçý~Ç¥2fÑ8ò†j¡³—oÄC\; ŸG‰Ø¹^e •Ü>Sm‹ª-ÆÅ†/“0ý’6æ+˜K~s·Ø;T*àÔ'hF½ôë ŠñªÕi4ÜË:-)šÏÉ›˜ÄˆÝ(¾+¨ç8>¼Õo¥ó¶ÿ¤Œ–äöa ¬Y •@’Faõ.$kÂUŠÈKüò^*ÿpjufkåk÷Yé Æò=èðflâ ô½~]•­E«1I[B*·«WùázAÙįŒû8Šq`t¸œ«vœ—Üœå~ÞüKÓª—«2Ï&n¶>a÷e‰8]ùMâWV…xµÝÜÀ^>Z<Ô.v4´½†B´p‚ãš^ßôŸ¡ËÑÃÈR6ÜvÇ“ñK~,©÷Okf{I}þ"Ñ«=LCéü`ý§'Hj;Iï£[‹¤ñ9m‰ÐM 'ãŸ-¸ˆ›Üfþ½Åt›‘q¢ÈR‹^êÍtƒÜlÝÛŒ€ðs×çuyZê‘S.1®E>‚ÈäÅ‰ß VVT~Tb|9Ä X’ãB>1Kö *¦ÃQÝg`ÂösG‰I´òå’¾ö)@÷çʤºdÐ~oÚï–å ¥žEXzY¾åÊÆXÌQ‹Ž”ª…¢òï…Lbgz.§Rõq–sç!rÎEµÆÚ£k/0ÆB6 Y%Í»ÏÖ€ t¢!=2lúVdp˜ãŽxw[ŒËâǾqbb2Ü{ýó¾Æsæ3¢£-[1:*äåº&ÊFålgQ&ö/4© ÇWÝÀ²‘bële]9Š5ùô‡TÝ{ϱ…¡Mõ_Ûoל¥í#‡Æ#Þ—Öw(—o.w1±@1zAÙï@«{hkÙépaßóí3­ÓïnŒŽ]i#ÿ­Rw¸›D‚u²lîJŠŒ½orBÜ™däƒ[ø'puÈd~óW‹y ï¯©×À»Ùø{¤4Þ-Sæ@ NœÚ#Éô¶üâ‡sˆaäD[3 _ƒïÙ‚S·n‚Òf0ðÿÁÐëE'Ї/p'ô1‚iAÓRÆVO}޹îîªð]­Åöq“¦¯Å¿"üô…r—a·Z÷»"Q!ÊÆOÉØñïFu]â¼É' Ðiv`æqÖ'^@ &Ø7b›ñEã×ê±Pë›^ÛGBàœš¬“³—<#ðê O²“Ò…ïzô:ôz_â%{¶qÌZ‚ü¯áDßN?loU9r›ðzá¼´’")úÅÛoâ»Cµ¹…†/ЬGðµŽÏÆüt ,"æ! J®6™Í–)Ñ+É0àÅÇÖÆú5‡Cçõ¥NB|z2 »›vù¼ûçljïŒ[ÆÄPŸòQ› š—©ô™†®SU$Φ³qþâ9:W]œðB Ž=¦ÌZCS"H覞xYñ­œŠ=è› ‚?bâ‘ò€É(ŽWN)0aHÈ_0àtƒD£‘ >ŒÉ8i½Ä4ïš"¨9RíR/á6²Æl £[P3ufÑLŒ2×d…¾Z‘: Üoÿƒ|åYµÐâ€væîHO±Ç$"þ0$"±Ë õ½]]V^…~ñJ°:ÖßÛó\Ú& ÃX‰àœx9­@(£ø•>â[}&ñ®ÌAV8©¾›á[TÖD™j¡C#}P¾­ô,S)*‘R³-@•4\*ŸU’!37ëd5Ѥ_}J~:|I´N~)"|…êÕˆK ÎzSæ ¶ãqgÓEÉÇ äÎÀ{¼µ0œÚ.è§![@ÀÆÈ ¢Kº×þžö0>Þfî˜Üÿ!———; Å`˜`9@bŒŒ®ýÆîýž¯ýÅ#àÒ GXÊW—4éAðµ¦.SIî÷v’ÀîA‘6ÁaC<‘ûô Ñа¨áBºn[h«Í’¾‡˜=ð†7½ÂÄÞÝb£÷š]ÿtòe¼= ÑdF¼M=Eo×»YXý# i½ânY0^4£ákcÞ£€¡7C °X` eæ?oàÓÂñz˜Ø²Îb@¿ËõžLUúÒ©ñ7ïg2‰ƒ¶¯4«©ÉÕ˜ž®Æ´è]¼®ì[ø+l<¢~i°´ëëL)¤L’iC:î¶Ô8£¾KMæ×ÐÓ£±§rÒ Ìþ~uB?NÜŒ‰ÚŸ„UåU'ö¦3Y.¿²¬“Bo¼ë1½5[xÇ”ÝešÆÒ­Óûˆ Ó}ñ«15Y6÷ ˆs ¼M që¥$Ù¬ôlÆ&«rþ9„ˆ@¹û†:}€nlNîá*jÔ3  ÔIävYSë =îÿ–)ã9œò½ô…¬E¦bïɦ¿ªÈb¾Y7Ò¦· Á*H.Øo·òTHµ-žÛ¸2¬#@'²óYìT$œÇÉÍ!çSE¾žÙ¢zäÁ6£) Ú×.§¬]3Ðh0&”Qr. —ÜZ†Yúý—ͳW.%CÔ}á^€ +X,ºÑ / >±urÔnVL;BZZ!7fÌy'ûQÔŒù [’0.7¯=W8Pø³²êPKpwdaÄ{ŽÔwk~z>!§t&(~„h­îæ» ´0ȸ+¸ ë(\G䈈–›f‚É–Éô='z #*‰(‘¿wdCÓˆ—ÓЉd¤í$Á'yA ÎÎdx]3­õ(׬LÓW_Ô–Ûž&ÿ9‡·Ç¶µuÃp‰ÂöCˆ NŒõrél oèðoNÊ…r f2Ör¥DÝ‹çwRïòœu'@¸øàƒÕ ZDž´„3B58I€æ{¹¹5üæ>ïoOlûF^Ô³‰°×¢˜Ç,䣰U×÷3b@lÓCš2†ÎÀóõ(šUî3ä>émç‡uU ˆ(ˆñªKmµ}KIS~í2 œŒØJWÙçnÞ i•ÕCänè”þ¼iEQú3q{µ¯B‡°SÿXÁ&ÉS‡ ‘\>‘ [éýsº†!Œß.¢W•‹µ ›Å=8ÅóZûRËw(AîӢPÌ0ßõ‡ÄÎ1ÿÚœX Ño#£ ¿i¯+‹ b^‘>Ðç†rÄ^@;•i8$nNm¸J‰ùÔñ¼Z¡4VùŒ‚Û»ÃJ—V/JÎv &40Ë"„Õ÷²’aQ¹«±ESn‹ÁNÙ¤ƒ÷÷uïs„CþÔ,o2$« Žd^U‘SUì·`"x«qpÝ-#3 ƒÍ'Lef ŠÐú>w\,õÏ ¸hªôR÷ XZ,qËLØœE$;C·î)¤ íþm äªÏ]¤ßXSÿže¹¨Ä3°´21!Š7¾æ©¬˜Áíž}vj!b/ËdéüÀó"ÒI££[Þ·êIÖb„ÌÛ«ë•0–¶Æ{L² YC ³î€‹€RjO¯¤ßŸY8ݱ*ÙV#æ£2Á_²°ÏÂ¾Ñ RÌÒÚð™É T}—(ϧ(Ö߃³%úƒ bR‚ó¥fz´™eÄ+ù‡·ŒÆyñ³>ô Àx«ÍJð,ºœ‚úké±*Õ…­ uZOC… Ž˜—m9…}tÃ>6ø{CAÅÙ”S —œ "Ú7¤—}òFíxB`O-¬¬7#·%ІçÜVKο¸ÊB£™$¦ºw'r࢑ ÕšgAðäÞrQº YQÙ÷‘(ÝCNó¾¡Ef >(°/Û ãË4Áþ¾ð€»œ›ÿ£¾ ›Œ×¹¬¬¨Ƹb¯T 9Eö#¥·BäIÆ:ÎÖY|Æ…Y¬•¡ÒyÿGë^ÍëŽvÜÈSñ„q;¯Î4¢& tiäxouõ±‰ “ùsSk@9ü“ffŸÌα Î6Xä–-cý~GuC\>E 'õìò­Œt-‘&s‘ÛvŸÉ——m{L’Âüšƒ6 ¾?¤¤M;‹š%Zdä£vÃ`˜kn¸’lN:×`ùEl6ŠulÀÃh‡ºí½ËË¥5wŽºЉ 9øŠ\üìI‹·îÞ)Ú»·t´!],™ÄÆ­ÀQîT:sD¸—d.ývúx’0åjB p6Y6ýŒ Ã/ÝÏ} º„ÉyG&”‰N‚~­£ˆºX j~nxk£~«Íž  åJ3»%Ú/ð5-GºVîy Ò8˜ãTí ÇLº$áLµØÓìÕú_ÕLÔù ¯äºràhHA81Ë?Xm†r÷wãÁŒKذÿ_m1sõ«S7PTV†ÜT1ÛE]ÂmFIŽšbãÎÖmØÖJµžÈ@ôzÀÐ^1ö àW ÷ÎäoÚ­‰G»Œ‹lÌT‹=â’ˆKê£FŒ8÷“]´Ú÷éÍÈÖh§;üöšµuK³Gin€Û$'Ö¼('‹G…ƒ>+5ÙŸj7¦éD™F w¹EB¡îã¶Üµ»Ù¬'½QÆkÜ¢žé€yÒGG£ë…üßÕÌÆÐ%ùùº¦ 2rtÞ2*O=RN ÀŠ@‡U7½×p×Í@뢻4/ÅDMôÚÛE/¡pþá_3Ω¢¸œ4¨ëï,¨÷ÏÕUû!jçuµ ¢>®30ðÉ;¬1W.-‡ºÝõ@dw5 •W'ìÈ"%zØaMT¥TOâIe¤y›r$ó>>JT¼O 5N¹vh%…þîá¥ÄwYªkètKþ÷ú iÆÑ0Äï5¸&› EØÖ¾AÇüHê^o­° í{„,ÖÇÕèÎ$fòf3èù€Ú£7ƒ±$¿£pµêÕ¨$ˆký“!D‡r *þÒübšÔpÊ”¸³ÇyÓg9DÏ¥|¢¦=‚vp°M,É|i·ÃÊ5:úJâY¬:ʲüåØÀ½fòúô2Z|¬GßÏð~þà¶æÄ É45ù÷ƒNÓÞ2ç¬|å ß”ÑYF©Õ¢¿gÌÏÿD†Ctëg$ÿgã•ö kcŽ‚‚9覊¸êapi¬ÚI‘³m[`ò2'‰NDo,-u2sô8RáÀI[ubj—Xw§#me(³…H`Óf—ÅNªFýÈöXbJ–äšÁ1gÝYÐ=ï"]?w‡ÎŽ*ÃnV`QªØ:©Ø¦!3]@ê|fÉ Rî‚¶½$Ïž?gdC(ìÁÕüSøõM<0µ@¤O°v±2ïÒnM0¬K¥B$v±”VqGãБÞ-5"ô=o5•äÀô¤#5^ÈÛxÂ$cã6tˆÇ¡ú3G…%MŠQTSóÌ ¬Ý}üžŸÝÀ³ïÜýë+ê{vØ¿‡@bW1¥´?X&öŽÙ,‘ H`–Õý¥çË éŸ…~…¢w ÒeQªEYôøîOo”eÈ:jgŠÚr¶ ”uS"mŠÌÿú»¤¶bÑ”ÂÄðÈÈŠ,ÑÓ‘x9mê|þ¾º` ù3g¼zòÀÇbÚ3^1æêZÄSÖŒl ìœÞ…@vfÀðoÌøc0“K’ôaæŸZ7ÎðãJ”s&:#>®b-úçá`]Äo_"ˆøɶãü*œ©ÄoÙýÙTF>eÌ݆<ä” c/Ú…(Ùwn•üµH|FߢOÉârWNµäU,W–>’㘠0¿ ä‹×ßÔËT}O¢Uˆõ/Y Y/<¼ÛÖ†ÓÙµ€Jþ®æÎŠ™§é•ïbß@ ²ÃKÿÛÿ?±&q·àÞçÑ?ÐÆCöÝ*Ëœ¼8 æ r±¸Q BÃ41j¿˜žÚDöhj¿Gçh‹¿ ¨É]uY\H¸§Hm.%z¨PÛK{:Ûÿ[Ìî Ü¥aÈ=EZ@=¢Ä z&£‘à¿dîófûÛÀuý $»d§AY†ºà°d¤£5– Ý(ÓÓó0øøŽÊU[ˆ‘Fp‰_¯‘‘ ÂgÍË™·µEVä|ô¦½à øgìñj 4½ïCPÞu”Á\H ¡8Þnª Í £ØÛ/ÿðA‰@÷d/aÆØµ;ê>“-ƒïd·&{xý\|¼’w•Ü@šœâi:HþÔ—2"ê}×b»ÏhI¾¨Ä%…æÐºtO–T„®S´ kÖTXnŠîÃì¯p¬6ÊO§õL+‹dŽ÷& ÍïW6 èÎDk¬ñÈrgßs·à¡A.ýàqÜ1©[£LþU\´gÑe‡¦¡¾,ä5ù‡Ñ=‘Î-Õ¾ˆ‹Úl²˜lO ©‘}êd0ÅcÐÏ»A´Á3†6Å*GbãìBµuIæUYÜ í8ð´ ½Ú'}¶ù®`]ëÄ2ÊÓ Ž‚h0=…б"f—¿÷$Èšs¨‡Œ ÐÖþw–Â*$“ý•NøP‚Cª'q¡‚¾®Ý¿å=YŒ™n #pÏÖô%=¼9É»çª.,³*§”ÙÁÈ“Ûñ>eÕ»x¹(6üV÷P¥üéǘ(+ •Hl¯Õ”£µ¾=%0~r7‰ú‚øO;z%[r,^ƒ×¡‹©‡ô“!† C¨¶¼'ÖñL¯g°È”´¨ÃNo4D3î½³Sj­cÝcDI>µ½×ËraámLÂÑlWö\AÑÕxáþ²Yn‘Îs=󶨃¨€±·üz¢ÃúMáÄ MÛ”X!qÓ¬h1MÖz:‚êD!20«QnÚýhwÖÕ¶÷3òŸÆ|÷XÐ^1Õcªy½ÒS]ðÐ÷Ý/„*2…¬<†»†$ZOIÚŸ`-kOŠ#›ss àÚΗ¨q)Ë$>€eŒ0yo*B¬'Û—v”0Å‹*®[ÿ½¨ÿ„e/ÆÕ/îÿ¾°yÏ>aóz²°³ßdW:OO§î‘l17°ú¾¶%¹‰‹v«ÄݯB³Ïœ ì“Ç‘#­þEÄ*Îi%Žî¦ã=ãEqòfŠ= ßfUO^°6Ž~¯¼LÄ—[™¡ñ~t嬯ð®®* &I>*ãx3!]É ç0;0"¢½“+LÖÇš{“|l=Mþw`†‹¯T™}.aæÀ°åeè÷ûg!ÜŽzÓl¿t?˜ééñH_,÷¶Üø»¬Õ€!#«YÃs5‚u`ºfù¼Lýw hœ{PÉhêÝŽº×£ÐsX¨áŸTئµYsTˆ–/CvŸY4fyt‰T1]¡4–ÑðÂﴫ²G@ôdo™é£bÓÉ ¶Ør¹ëÜ2y‹ÖåôÇ©PÊ3é40ެé{ê¥ÖA %³Rê8 ± ž@‰R3|¸KI·ž´ªÙÿ’JÊj *“w¬Üz1aÓ·ÝôP3¯µ´.£ ”î†!Ÿa‘ r4GÿžîÃ”Šƒ¼žaó3“”N½…ðÔsºGL'bb5ˆ ú=_Kì—O*ÐC+ä‚ ú—©Þ÷Á$¶¼žo2#»¾ A´$lòPðü O :wŸsN^‰d_)_Þyc¼½¼Š®vHz«u4çHÛ·¢(q‹y*ž]f{eFtAHÙÂ0Ú«+®ŽàÁ93f§ ”ô.¿¾”ÔŒm¦ceƒµÞ÷@¾¥õ\·ÁwÂÊLX40i öø½÷s,|-x í¼ÒYh<—?? Cnº®t|+ #ZÉU{´ˆ²×áV2lѺ…ƒ­\¯ë/ï‡R«fظ³?ðÎ}+,:*27W vO'5¨I"‡éÌ Ë}³uè_”¡;URk€¿Å‡w?æÂùÍ&¸š> S¶èõ täkÊ\"À]KâÙ×ÃõgùÂD1¿¢õeLU˜kQ³jÔæ­º»• }M”½îÉ“¢`hîVÿÀ«½/¹z¸Ž€ÃÑ—•p¿AhÍ¡ŒÑ ð¾^q|;ýökꆪфxxlå ¾éä8[Ò-%6 '½Šá —9’ûþ@êy¡ƒ:Yã“] )E_‘A(¿žo…ÉC“>HuÜp·^´¢¾{ÈZ^p½m‚)ѣӱŲ§ì÷Ú«®Ûnì#«‰ÓwÝå¿2·î¶KOacë  DQ—<3£¹“/:_ >éÀ·"í¤ '=wºAÇtü‹' ôÓ LfÞ-7ð9ܳ#“\·j$Œ§eªUbýÔy ‹˜>÷û²OBU«Óéú‚ÌøåeIævUBv¥ëîô-,P,$¹FDÌ—i3%Sî, æ ê»¬UsU,~U±Ô2Œ›=JJÖäÚô“ãk?›¤—Ä }Ù©ÃÚ}MÌ …#­÷Z4˜ Øÿô=.L¨‰ñìÁè^ˆHgÿNÔN¿t²”»ó†)Èh1lF…Ÿ§Vœ(Ôusô#Œ&ƒ[ûsx¢¹®º;o”›(>»2ŽèzR|P§÷àÆÓe¤Ú>…écÚx!7z!ch&Çêê‚>#mÁ# NSÙ©¶­|Žá±FIÑôp‘2A!_h)Ö™°sC¢’*à@ó'¬ B˜*› þÏloíLr‘›ÆÔùM4Jºî×^æ–»ò9²qä™Rê 6{½”¹fõ² ü®¡QêRH~R·CëvOØ®'Ì&—ÖgUtÀ„> r„!°„JßTÉcê—4+ЋåfQ}#”!éïÎþ}{E€TºýUÁ´œÜ<-ާè:¦øc2cäFæ4ƒa±ìA<%Qñ—²öE}>­¹eÕäËp®‘“P ÷•ß ]Òê2¼pªm‰ßÄM͹÷ äÝ9Ì¿±J7Pà^TB>!sÙ¾yö=+ß'ŒŒT‡ÍSÊsÊ47ô°\@íGðê‡$Xk1l •ä=´ØA>|@•Šƒ5tšG¶­o7cRJ¤+ˆv8ª{’W Ó\°Š[µ ¯d‹ÇFÓ³¾Êb‹{9%P1¿öRǨ“¯«}‘L0*õ¹wDø¢K"´LÞyh¬YõePÖ„ê. ?££jäa‘?:pßµ!aìi5-Ÿ •â"W ¾™‚–ë0%)oZ¬Ü²³uµP†B9Ðó^,ÂËY{9Î4$c}Øö.Ì>÷„Fs%Ù£j, ›Ö@ãvÒÉ* aìZˆÝ¬è¯½~_dPä§Æ}±åבL@³¢JNýNÙ9Pʨ5B`éÇc fd Еɯ6ù¨Í9ÀXi>‰¼’ó4 ©/‰NËÙ:U¤pA¾b) :sÈ:Oÿ¼žP¢%µÔyÅBÐ+›¼ƒ÷ ÏpQè¿Y±WXC~dÓÓ8 ÙœJšÿ²Ó‡l)‘Îèè}A…öåŒCΗBó_ËȰª ”ýÍà‹qu¶[Œ 4x3Ðb»È'›ÜyÞ°ð¯"§w÷Øî£¡#ÓÊ)e\RÝñzÕˆ‡¡»¥¦ –~\ÿJKxÌ|È}A¢¦Óñí)œb’Òã2ì[¥‹ßRÑb#Hýé„I1nFŠj7eç‚â2Ü[AÝýxkdÆÔ‹¯¿ìFmg6ÙÔ ÀÈeæDæ)y'çw£~‘.ÈûkôÄ—[ãíEÙoÌeîÚÉ!YŠ4Bq GýÍævøá'+r;Î$Gb‰àíPȾ±Ê!ލÿ+“ðàrFâÎ]°xx´J¯MÛ®–ÏÍ–çÊL¦ïýk¬†.ÿ'drºŠMÀ¦Ðé…*1»ZªØÊÐȨ ƒyÌæÆøJî´´U“Ý1|®{Âù _ÛêóÃÍMc—+&Z0|O˜ŸÌ¾·þ…ú‚CO¦gÛG¬C¼‘³ €9’ÕàMöll¥ª!(æEm†Î^Y— ¦¨#ž?¶]žÑƒw4ßT} Û¦7`§Ç/¹Eà#3CØâl…*Œ¶ùzˆ™ÒßJŠYõØ3ÕF#eÑùNg̼ô²¢írqOCÿ Ò½"·`ÁˆZìÁûnXqìоø;%þäÎÃ#=4•륉V3cÚ¤¬k‘%›§¥r±–0¢Ë½vÓd ‰´ â“Ö‹¡ºÕ™¤1þCuINû”ѦE™`6R’†@96Q~ —™·úÎR³#á•‹dr¨é7ƒºTû¶í²tÈU`Ó‰Ã$ÄnÐy« ˆ»ãû¨8àÀ£u¼l ’Ø"Ï *+‰‚‰+ŒóŠØJ¾ 1²†¯ƒ…»Š“gSñQtš†q5&Úv& `CáPXü4Ú-2©öl2ÚWü6DÖWò0‡ßnÔÂ"Ÿ€As|I´ÐÍ oélô ¼QT[8¬.àÏOû$Á­ÒÂ$ï\1剔Á´çTwÇ8³ÝÌáR³¨Ô»ÅæT¥¤6D±Ñ8ú£=¾ÁÚª1¦£ìþRóÃϧ¯ª°¡ÿ)q¦Šeñµê€!_ãó`ï&ìû0Hü€ÍbéJ[›AV—2Ô>7-‘ïÆÕ4ÜI×’èõçPM‘<}¢º¨Á¥ µ»®à`ãa»*žl$ãä™ßó>#ûÇ®t˧´[L€D?s Ýör‡,G g1³; CÍ<àYôÊ¿óYR¸>ò¦+­tD}yØf>¢%Þš¢EU4:öYEÉ£ž@UPÙå|™ÉsõY ŃqòY°t©(¨|}8?Ö2¢t¬t(_ Òbaïc ráÒ?Ú“P`öiä‘1FÆdxa {ãe­PÓ–;|pX9:Ôþçsذˆ¨XP®¥ÏÒWùÈã^>þF?ëáÙ¼Í8KÅ"+â íóå€#¶ôw»^Œa;zô Óì²i j¶m}ÏFؽÖòþ0L·qipéDçÍ"ŸÄfïMp‹ÆžTR(Î&Bí‘Ò¶÷Fpï`Õÿ‰r„‰rõ-haËÌG3eö?W©¦\w€Ñå¿à«¨¿1|¬'4HwÁ •ÏÝbA·6lŸ%—¤ŽÈÞö?á{Ù/PO eMeìÇ"¦ßŒkpCWM-ú{a•}Ü 6ÛÃVG»Nk8ØBæ)P£ ðÌ¥mÂpØÅ$¸­Óø…s(2lZ*Ï©–êQïJïYÜöZ{|& ÿÂQ:­0P0t:äK…¹àÂ>Vɉ.ÛEZÀ‰xÙ P0|@ž·À-ƒóœº= S³?8x˜ñD½"®˜G¼òÒ/¢÷ñl* UŸ÷eËË®xQUñˆiŒ–¢ÝûȺ÷8¹½Qˆ ®q…È»2—|´,Ó^6÷ê3á'ŒF¬‘*|à ÿ_E+ïBê‚sØ­6è#+/{É6ëx60ãõAÀ° œh)õQ„Ä Í„(qKy:, ê•‘\$Š®(÷äL ß|5ì]#ã˜o%t&ÔMIÙ¾¢F%2a7á:jxÖj†Õû7µm0L@éy¥eCX2W€ S²'MâïËÇèõg»X–²r£Ì¿Ð}7¼˜eh°“lGdÜ"}¥$\Þ—³Þ«Ë,®°¤žsG˜ši¼±“LAy€â;w’?³=è¢Jývöëc\d¨ø|ä3ÝT‚ÐçUIxr=*X=)îdÁÂÛÅ,¾‘$¦FÉ0[Zdνí ×;¡¼F@:5hæÍÿgx¬_“¡òÁuóÛF´™=¦•&0]©š°rX54ˆG"'b[ðÎdÕ‚£‡‘PÕ«†åÉ=+CüÌR;²5¯L Ç,z%'Æ$f&;‘^ë“̺¼3ŸcØ-F`™¨Ý|í%´#ö(Óg£¢ßýªÌn1\K1NI|\ÈZvS]Ed²6Ex£3ç™Ð8NÒ®lOä=É›™‹Ý[ƒeßDzm'¾hòŽÝ~µ84˜º¢hj¹ˆöW$,~¥o+4ŠˆŠHÆ2ò#DÂ5–Ž'gg€ÿZ*T¯©‘šo+XâÍ2‹eu»‘žÒµõa©ùqÒ#ÈÔ²z”+öNïÈ‹êͳfOÛvËžmâOmüËĽ˜3hnkH0â…°”~Ë϶<榅ªµ&ˆÑÃNƈ‹Ë°·hg?yp2“däÎa !›ìOßsH_Cbz÷´ŠEP‘2å1`6d–ùc§T!œÙ–ÖE<ÝæË60fq)Õ”‘×îi°V©µŠ­ð]-þ®Ÿ\LuXÿ€÷ªá¸ÀkÑëòŽÛmNqª"ÁíÝ@TÙªÝ"=’㛜 ¾_J´ày:TI?ü3À¦ˆ¦{IþåG)Þ©ù×Íì-é’ú±:S ÁSâa¾ü™$Š{K…õäzšÛúGXå9”"À[5ð-’µq5ë*ùH¶9Ž,:µnÝ8´Š˜ÀcÇoòX6ð®,SåJårô¡< _khÕyÃC{YCS1…¦W ¼X@lÚÝ׳¹8 zßÛcnÂÑâÅh;ÏMÚxkåPfÉIr]ëç†ÑÜ``Â^u#ÜóKáäìÿ¤Ä¡ýCÀä=P` ÖúFíl#cÓD:«ŒüÞæS].í±9Ž#¾Æ8Ñ"}ÖRýaAa=Ì`°6ºZxÜUô3q  ÁÆ?æ˜äü²…1@îH¬Ð¶¸sÏ}m‰•bE} Ï4f¢ùÈTáD=lÓóÕg´ËÿÞ9þ¼!ýRbZ‰IgìŠÚˆô^®ä9K}A}u¯ó*Ë(}Î\…ìîÝh]zZ¢fñaf¼ðØÊêP°áÊNÃ`Íóæ³(t…-û`ÓxíæÈÈìë„e µ©ÝK²ì£n¢î«Å,Üæ"umŠÑèe)/ V†‰µpgŠi£\æì€ÑºBP:/=4‘†—sÏCHÖ˜äÔÀfðú|LìiëPè:D|IÅm¢„ )÷Pnºÿ9r2ýŒƒ_, z;:ÖàôgY½Œ“ÿ‹Ô4‡20#‘‚SNF ÐóàË› VqŸp}ÇÇVž™é!ÃG¥LÜ–•M*éÁó6ºóñép÷þR;W¿‚íÃ™ÓÆšýáz+¶®¾Sùƒ”s‹Z)Ìyb ¿A>{H:Ÿn@*–Ý8ò%ZôW €ì •pÈp9áz5K[™"6}¥½ 1ÖT'z÷âFopƒ"h|ˆëmi¢¾3ÌDý»àrK¿’Önw‰}(‡M¿íU ¹Îb™þ¸E™fÇLëÁûF S´T`ÛŽúrGKîO%úDH28³MfcÀãN† ÌÀ½–`_æüN-xN+4ÝÃ䧘ô+äzÙL õä±h6`#Ùª#h˜,>¨Öù%v5G;‚Tþ¡Z†Õ p*0Õƒ½¤"’3ÜvÚ€ÿ+vã‡u\ÔÆ}Gäk™Xó_4o5ÌfõÈ YÆšÈOg—»™U©·ìUÌ(ý=’M•³Â˘ՆÕÖ¯Û„‰çœÄè÷´£xLGóCÖîæA,åpÕØ}Ámjý7^¸›ˆ•!âˆÙ^o ^FI yõ”©®£;§v|+/ý°Êt€Å(A{>&}%)ë?Î5G”æ ò˜ÏÞwdÖR¥\BQB¼¯¶`½ð˜mIdôÐCBÆýü¡Ômy ·]g·Þ/_Š÷MƒÁy#þï–m-ó&!O,ÞŸTóGCAävpèœrŠÞÒRÀŸ Ê0¥)ÔÌWfU4<:qƒD\Ý ' ReACÆøâñ†É:õ M/3¼!W|Oå5|òÒûÔŽ„ðéêâe9èµî¯céÜò{Wƒ£–w0°¸½¡1ÞgÞöéza}©÷®R5çéõ<³è:9H=/JÑeZ‚¥ÁCù Ö(ÑÊð[â`ÔjÁ ìÈ(!ò LÖ@¹&£/gçr\ÃÙáKïU?VwB–ˆ¥åv¡çÕünÊ6Ë‹¯Ë"²š©bm†Â`-ÅÝ€ce.;ÿ/ @ç k=¾Å[½D….á‘/wo9©{ÐSTš] I!äÃ>UÎS'~]ˆmO«"<3ÃÏŸ—Pê}Œ–ÜŸ¬°×J>2‡èrúÌ~Ɉ³ËôÇh7ï¯Ã€ŒÑpv—ekzYGÿŽWÅ ;áˆØ*E)“-©é11–«¶Qu¹ ³q•Š¿_GAº-«ò)lê4:°lW¶Y¢þ.Ž2“()$AÂ"™½ïO /ëiŠÁcxNâÙf-D²«¯12„kcêØ}p¥/C R;Ë…æåŽi& ³5ÈÇBMx+Ö¤­OaÌqZ賌=ŸÃZyPCƒK·ÐÞ«l8ZË6;1»réI°|}ØÀÄ—Çaéîå#AKËÇDï$'_9@m¿Ê½ÚWü]zhfÆÛoa)—ªÈ)F6! øT¢x`{ÐGX鿆15(7¡6È8;$&æwã¢ð+Ü¡&\q3ôÒSdö4ç]Íu<› kŽEgº'|N=ÿÏvtC.Æ‹ ˜Ø ?Ã’…9²n\C\LðoHé¡n.…jò|;¬Ö>Æb+Q€¥~ m’¥þˆ×rþ&æ}XÞ2«Ì cš_Púp¢µ gA+P(#yZoõ(o&pn/ãÅ¿yŸÈΈúQØñµ=~ÚÒ5>PÌéu@ BÉfšvñª[ððÈ4ÙŸL›ÚT€²œ„廈à 6ÔŠƒÕFN5Ñ}Š Ú‹a”oRtÍMA0›ðO©b(r?ìÑÏíå{ˆþî×~6¼º¿þØ‹Møné蘨½ÅÓzY¥úEÞù‡œ¤'V\Øázd0 wî:âòF7€ÞôCö$ð+¬&ÌwŽV¨ª¿ê•è]®ÐËÂ%UÌ­ç9ÈOá‚®À0ƒŒLN qL®kÏrÖb~µlA e?@ îqÉ·%šè £¥”i^>+ÆfU+ñá½Û¤xçV¡Ýk‡GÀëØçÀ™FÈwê_¸_ö]O,3·#Õ¢¹1/ÇßðüÓÇH«¯W«R2:8àÄÓãâ'Ñ«”–]e†-ýiΫx<¼r-‘gêû¾:Aaàêg,äIå;°ðþq¦6‘ÛCEPsá |ž"øþ:¢Üôbx¡GxnKðôh;ŦsšÌr*EÑÛÚ+Š“=$B•û*÷AâõExþëYhÚm‹ Tu„¯ðLØB]ÞdM6j¡ÚÃgólf=:€âYK‚›~fÆ!AtË|n?˜5Ç„BñªÀ”|ù5žC¹¢JÂÛúƒê(ðõûjþñrÝu f‚…¾Tyv¡ŒhP£/<¡¼k±fkxód×_«Ô´oÌÄ(Ǻ²‹nb{d·zqÆB£ƒEƒ–B̰ t—›SÏÁâÓ†«ãÂôâv¶y⟯w0ÍP •Â.qüÄ &.Hx Ö9¬@Õ ˆƒÆ‰ÌèѳÐKq/ÚáÖ‘#:&uNþ³0;¨%º_eã’au†ý±FM”o Î Ø=Õ+¿ÁýóŒy– À€Iƒ[;úR±úô3Õ*Ð3×þò‘Ïo®Þe@; ºÇÑú+k1PÂÄì§e±#™“sQ!ËЫÉÁØ9q>ê`å{tl×§ê‚,^ÐKÒÔõÃo};¡×KÊò8¥•ƒÆlµ‰QÕ§ßgÄ“ÿžz'™/ö(&Íž£/Œbªƒ®$üd+Ôc`wjÑR½_-WSÿa—D˜ú⦗ŠsÅóqŸ™óÔ¡mY„VçêdDaŽl}î 3¾Ëßi‘Ñ‘}å¦U½ðÀfC&1¬¦ý$úøþsKYCƒ«ªuóKs.¥Å¢í(RKZäÇ| )š@CQà™á§I¥{×—Ù¸ºêi%o\Æ¿Ìlª;¡¬ ýn0„Ê~"L¦[ë¹N!.`'fº; –±oÒ¾·ëë‚48o½Š‡æ}¡@^‹i3ÏßÌÓ”PQ¶^ç‚™2 CäšÐÚ ÌB¬„ˆíWu»«'"@ÐûÆïvÆ%l;CéÜÊ‹ó‘`dã¤j²>O0;·Í: b7ÔÆ~vã!sHz– ñ¬4××ðï&ÿf,ßQСÎâ5»ÿê·7 jañ)|(›´°ou¤ásgLšNª×ÒÙJµƒvE·3ýù¿'×<NPñÀù¬øÏ¢ü*ì‡ûr%3 4Yñja÷~Í(§ÍrÁs_]áùYuÙ² f¢4t-Ç@¹GêGTÈjTÙ_ÆW³¡ †å¾"Œ‰ñë_Ûp dfÌ9!Åcµ$°nÇá@`ITúJ’ßá_–n7ÄÇK‰ÞT²~¯ÆV09¤ÓZx«aèÿ4ùÁ²2ǬœöaÉ£ÚpÅjt¾?rT0›‹yÅ›‡µ°lå5B¯×ª:®KøUcàÖϼ'éBxµû5ÂRINb÷˜{Y»ëƨÁtåï¡'üݘcØÿ€‘dž‹øâ‚ÔäZúKÚ.e^nØ2º‚ã‚¥$ñ!²“|3Ì1*S]Dë:ñKHÆ¿"µd.úHh:Hwú­/$î6b°ÉAFã hàbÍ <Ó¾$£èØÖÿÎ #?WÄÄ$Óá+$è5I­Ôs&PÝ冡‹K›9 ¸šûæ¤}8ëÕZýëàµRdä‰1ÅÒdj9þ©3bÑh33›öxºPÛ4R #¶00Qeë‰Et74±:S› IÇ«’üé5Ѧ܆~3ÙD‰¤wÞî ÜM1¼[¯œ€Ûnx û—[nÐ^ÀeéŸ!æ±D‘¼õpo¨© –õº4¯…§ ·ÝÞ*á:Ùú'! 6¾_Ê Sß?'ƒ—™ªA¶-u¢/jÄŸ/4rD¦Èa¡Ö;¿ÜmãÁCÞW†EòÙø÷ðPÜüÅJù¿¦®ú|Ìñ\É¡9»„úÔ#«kV-0b^¨ì”hEÂ0ŸsÓ “Ï»ÞÓâ{qýÒ6bAeëQíÑœH%²5~'•íÜbbš¦þâ¶d=ÕÐk}ªØåb r}™hÀì¦ Ë*‚çá‰ÕX<´¥éúÒ>ü%ŸÐ7:øbX:³5S« û¿»ˆÓú÷{Œ²b“kd‘õÂWé·Åzd¢¸ÜGN= ‚ð„¾ðZS)#¡hb ¨Þ8âÝŽ"z¿š±öž×<½ÁMÝNÝT=k§¯xìuvËÇ…Dl‰±^ðœÝ–vÙ#wq–l‡O²/¦òó§­ây5X¡ ¹ÂSjøEüÅa*N–FÎä´ª¹7“°gmžÏä$5] õ=Öï†ZZ}Mø-Ý)Tyt}Þö¸©¼ùIµâž Ë fÜ–„¼Kõº†ØVeÓf„U›ßÖ&×”¼çkßÞ[¯2¾˜Âí DÀW´Wâñ÷­òU`,}ÿ7]F&ê°ÄµÌØÀ‹5+͵Z{Nú\6x3´~M‹LiÍÑN…wj6 í÷n3ziÁÚµÒÊ ‚™‹PCvèuâE™Æ-ÿ’DŽ=¯‹¢íƒ§ÿFCénÿž´¨•Y7U“øŠ¦c.@R°é—k4Í2¯¡Ñ<ÅÉ×lš u1Õ0‰}¹+‰8$†ršo6ÇÿeAÆ36œosÛ¼‚ k("÷èô˜ñ©ÔÛ4__Ͼ1öAD”ÅݨK{wÀ¼Ê1TpüBb§+ì®z]k­½Þõu!¿•ÛœW(iE€:ùŽú-=­Uò,Ïÿ…3a›Q+H ™Ò¦?µ0až®j£vò«‹<ÐRT–ëHg˜‘{ÕV“½´FSFß3²Žã70¦¼}¼g$o0¥¼Bϰ!¯ A¯'MÑ9ÒSiØ R(ÒQzÓ t”‹&ŒB2œ+Ù—8Xƒ­q£2u»>–⣑ÿAeh7#®FÏœ0|¡3¦íȶ}˜­J?Á0à“ÆÔ4{§à0ï óT•Kýj*ŠáÏÀ"d}·Ô®8í£ÓwK¤ÉsÚr*3á2 jâ\©¸|›É…%×D«êÒMàZÃ’»ðB%Ê«F2V^ˆ™°ØÔ¬ès°@Ð’g±©ÇhBÛ:2»9Œ!¶'dá&œPŸ|s"’QÛ¸¡müæ×dÚ”‘ X?œ'röO܉HΗøå$•K at¨V“ÙÁÑçbðVvÓè}뎃•]D¾8•q.K~ŸBØZ—ËV[L6ÉðL%ý3áÙçWrfäÈfËâ‚o'Åû@øçnäB /”%V|º°{€€oAÞ|6¶XO 1kŸ¢Ÿ–$£ÃÄMs¡7a»öL\/+z›Äƒ‘(Bº7||j‘WúÙÈÖ¸ƒÆý{èß$L`fcXDÙä)„U­†[Ÿž†œ„Ä úªÜ+úæ G^ú[Ü™¯ùn¯’{"–%Û%iéÞ¹ó È´g!ŽþPæ†Æµ&Ô©×i@·©H¢!¶orÍ— âÉ*}~ë–ñ»jåöÕï;ûþf4[3`evt'ý‰>ßßv^|äsK(7ÛGIšÝ~µ‰¨ÀRÜ'ÙL7w°à•«³)ä™Z9<öG O¾dÊ–v4¦L¡¨C q?$ÜãˆÕ:)2¢~§Åò61¿Óf›îû…v•ÇMpLî´½Ó&›ûÈ©ñWã/y»:…Ï*SÄðUNv2ñ^ª!î&„Îþ®<¢?\‰³Ög«s®uÃ}øD± R„ šï"lUéY0$¾2"ÂÍNìP!î÷?÷‰¦~k颓ç‚6‹â1&úÈ:ýŒžkH cÌ{‘nNdÏ_Á…ŸØÔúÙö-˜Ý`ƒm“u]uŸè©,dE Å`"/\pŒ–ÉŸÊÉ8$•myûî|ƒžÍ8´©QÊõ ?ÞÄ‹ë`»Ðnmûý¬d A‘»‚qp8Ä M“Ã!Þø¢-zº1cúÁq¦qÜmñ]`Ip%­<^÷Û^‡ »‡}fÞ¨Zw¥·ˆýê7Ï*QÐþXõ|bƒæ‘âÓ‚«’üÔgHûÂ}æëôîWË*ת6– Å”ÓÖ S'"á¬à8˜YÆï{ôÙ>‘ÕÌv´°ÿoß\ÜæœDW!ÔЖ«³Ò+X¯„5Tèb—«†‹´0¹±ÎWW Tšë¼¥±.~kª6}&Dscø —Hš’דËñãí‘ H½Qìú7æÿ6ÐŒKéâ ©dEÛ†¾8lbOa [-0¼ƒÈ·lñçǾOªú¡™•lýÉêWº…P¤H'³í[Víð``ó@Ïþ ý%Iaª.ÞÆÕæñ‹‡¤” û2ê tBϳÈêá ÌêÖ; ¡Ó ñpVÕL7Þƒ©èølWÿ2!=š÷RPŸ~ñ/æù&|_ÏPC1®Sg”z°ÖŒ©‡cŽªød¢4”pk± Ž»䣽óQ Ô(x‰‚ü>lT?9´’(}ÿyFFÙ~ž˜çö¯HæjCS¼›A;=ùž<ñŠ(?gyç :ÇeîÙÔæšm](î(GÈi$½ªYîAþsÝÓ ÿdoÈŽR"3þ'¢Â.Rî#³ížâå=êBøYßuN\!T°`l&l4LñwÕ;¸N4èÒšß¼&ºÇ³¼AEÇüA4Ÿo.áêjÊcq§A.XêI4 uqQ˜ÂˆgMÏÃoŒØXbå„ ºÚ„Ë4êÁÑU“ö‘*¹1{ß¡š˜â%Ö'½„‘^?%·#i’ },\ óø(1ÅCDf¶ÑËkEN)ÐH™™ŒÑÕç$<&ÞálÐÅXLÑ ä%²ðC¼fF\xµ ™Hk+Ã8í$v†ïìT¶üšZw;Ëe”S9{_0Æý‹îp·!©¦bhÈè¸Öïí!ÒÏ›Há'iÚ¹Z4üÍP´ €ó¿‘qï¤{ÔD3æ³Z:à¶í›â¿ÈžU )b‡¥¾v20JíÝ©ZLe+j·ÜpÀ‹#~ÿªq®áãywlÖý\ 'ƶ«Ïl©ò¢l©OÍý”|DZ^õ rr›s ³ÏtI£@|Dï™Aa|c…w´¬o]‘[5÷ÛL|ÔÂn¿¡5>=ë³8§pЦQMñJ:ó @!èòÞW!Q%=Ù÷‚H êàuÿù¶ÝÿÏVx%GðPOÿjÖÁ…\ ÿ=jn‘û‘ZÊòs‡‘Óʨ HýÅA®CÞ¶XA:W³¥²º ÝqìÀíO¼a,3õG³nd m®“‘¯îyÈ:¨'9Á¨‡z†@;ðVøÛóÜš:gœx¦/)e;W¾½aúé†ü5¶ñƒWä˪BÁõ·6+ ›¥9ÔŒŸÌ—_Ro‘Êj믎“E[oS[T gâ8½IÚ4üIC @øþø 3L­Ä¥ÉÉž„‚SÊvð¼IüµÙiº$˜CcmÒƒ×Ñ𳩻Ks3Žy$¤ø4UáŠc,VûÛ“ÇeׄÓûßxøÏÌe'ªækÿýÀëÍÅTü"¾´µõ;¥´(Ò…nw´c‚‰ÄCJ1³có^ *F|ñôÏKc¸H«C'3fÀÅ×2‚ùðæl ¤î~[•;ìÐ3ð€ ùMüiøžêI™%Ä“•Ô2\5ÀobCÙçh¸[à §ž•iõÈ‘Dn˜ ™n}ˆßNšà:Á*³×³>8Õ 6öé[ÑŒ˜]¡ü„©ìÚWX7—å6é€Éõöä˜Bÿ-WïÂöJùÆò5¨&eð’¦g¸Jtiš¥­pV>‰C‚ya¶6÷¼uÔöÛú5¤ 7‰ÓL!Tµýº]Òêj麳ÔSŵ²¬·Šõ¢"U¶ ÿ%û@)ÿèòܳX6:gî%iõm¹¶/K©éyLÑu„ô/’jrS2® Ç †Ì…t |Sê ö­„·!øÇôW— ×BŒ°QÎ4ygÃ,ŽdçC,&¾Yò2|ÄØüP˜@Øü¿ç ðÀU½Äno¥‘)ÒÍŽûðõÏÓˆ ]^r„Kîø;U&HÏÞØU Å|>zßÜY͈•$ ¢Káƒ\ìMž_üQ®5{äY_×ϳ(~rÄq—l[¼µ›¡`É^÷G‰}``3FiÌÏÐ‰Š‹Y`ñºQ§œü·Oоµ\ãËÓ´;å™lá[Êðe"Ü'K0ðîðö-cj8ívÚçtòOê•ÃåH#šO`ÏïÈn*¢5+1ù‘îèzýYåXlH\#Ê=G((K‚~VA{ùå~F,×ÉPûIë8P—/;["ç ɰ_óRÚ„¨ãˆ¾ë­vÃÈ ò-ýðf¥T¯UQƒ,Y/ˆ9a@Ž?IŽq!Þó´í•>sRo³F·€uñz¥H*Y…ÃÝFãÅe9„BËÔ_¾Aj:—Cݳ¥f V–g× 9¸X„\7Àb׊&YêXÉrϸeÀ·¡å{¾Ô|è$Òã2ÿDÕ–ÆÑoÔ‡¾í YÜÒ+xBE¼ÏfšÁ]3£üÕ@©¹bÝëÖ_4wÊ®Öøf&לÔ\oiílBÐ=|U;à~ ¾ñ*1(Ï{DßtÛt°Ñ#Ç}ì÷àWϙ>›+RÓ ]Ìmû¾òMéIŽ ?»ŽQÌIƒC4×1U–umd(cS ®ÆølMBš5`›Ó¯¶ Ãr5î­zx×Fâ~©àùÑ„]Ò'm… Ë0³:,zc ü>Wº R^’1qtÇczÈDÛ°á°TTyÅѶ–É^éõ·w×=ÉkžÔ7d =“r™¯zñuËÙ”@Ö½7”ýk¾›E—áúhø`­$9®Ý;…L6]8ëÇù/`±v ãÁMK³íÈmÐÎËW+ 4Váä` ½‡øŸä”èáÒÇ‹ì¾ô×tL/êû¡86ØÊ„ôt žº×:ËŠä©p’¾[½:¦Üœc-Ÿª;/¼)tS.W¶€|Å šn@?¯ó¢ Fp½0{,¼‡'5…Ó³¨vs ¶Å}ÝÔÿc«£Ø»Ý¤—°Ä½š5ôVœl35U×SÀÕEùsÉÊ[XVURԼ尴t‚_c´Kf”¿¾Êx<§ZÈyßã¡J!YÒÜÔ<2!øÉH7а,Ècù%Ò¬§I':iÏSœÕÜåt÷Ú€]³Ð9ÃÞ*°¡XË]çó¦P#³”jöšœÃqŽ`ˆMÍßWœÔ‹éã×̓xo{7l37É_€*Ï"”Íõ YÌ'ÃA·L<À{Õ|ÌÝȨüvŒ¶4ØŒ’¼Jä…%©átn²Æ¬âªX(¥|óJ8” ‹ßl}Y.N°óáØM±Ôƒ$×®¢d‹ÿ’ÉÓÅÐ㧸¸ó‰ù¡`ñBé Â_üÕVEO &8nü §J|ÿf=ü¬\¬þ´›`Æitëà¨êcJÂS°5"á™"Á¬¿¤þ@Ô×>§áZJ8M´7‘\™¬É唽WØF®þªÕÞpªG, óó ¢›«àYØÃæ¾’ÝÇöŒÀžT¯1¨£ÐFÁ:Ÿ`Ÿ–Gë„1ok ×SÚñ °Ô‡Y@MëžáYm¸Fn}‡×ç‡2,˜ÐGöè‹Õ"©«#Ì@H$½ƒºÉdÍ53§YUýMm6wš¶7'=Õ½øÌ\ß3NïÌ}Q(òA½Õ܈cÓœ‹ÀìTÏ1<ˆÙ¢˜À£IδÐFK˜è¸Ô2« -©`áÁm‚+(,P`±Q#ƒ¾•aŽ,ÿç W}ÎÌ|çjÊE$¢Àõ-UÆ?ƒêd,‘d.«&¡pÒ)ÔŠí”p ô; asþL|±ñŠG± ywÚ§óDϪ”•¿€òE9§^Ìxö-9CcXþXÜþ[âkRË)Ŷ®Ã«»,ŠgSþøAý…F‡ ;ž`Ò‘ú¡j‘6­fyàÄúÁxEᇩèïÀhæÃêKìQ"ˆ/“Û"g…ƒr¤°1¼-™Ê[ eSE9sù†²î×äX›ÄÑɽ8îÖå'kÁ¸´]ˆ´¶³³‰c$Ôeʰa’Í`Û:ÇÀxæoÃ3,MNÖ>Ò`ÿ9áÁöQ葘6μ Ì“/C̱R¥"‡´ñå9=”{ ËæBšsxü:GB8XžA¬”ehÛ°Xcl3餉ò't˜(}Á&ûÎs¿-\RœïºÇQ×@nüöËXç7ƒ² ±-ñ´Q½kÉ ¨d3ÊÞèïþqÇíÑ÷ÞâÊXg¯>umtŒ¸n ã4b*BÛ·vÇy“))vg3ç“g?/IÅ(oL`">ÆÃÃÆÓ²Jgôt= ©ÙT¼\(s»f:e±ÖúÜM…c„ŸN +´†CðþñyQ0ÇSøæ9”©¦¢Î§:ò¸°?âsÉ2òƒ¡:à0 nv‹çVwú».] s)îÒ„Xf'Quüø%²ü(· .O¡Û\f4H¢þ`íehîþ¤^€ ~gƒšGÅ ;q§x#Ë{BÛ4®Ÿn3CÀTPyä`AŸCñ›Z€ek§šéäÝy°«¬&yyˆk¢Ø”Nƨ9ñlYŠ‘TviHÄÖ&$ò¹õ›)9ˆ<7¹š¶/ÑP†òf| ëwß݆qvpò¥l,ž,› š‘íæ2@JÑ\í,u‘Ü( 3Î*y^–U<ý¡ÑF»ÐƒteÕV„{þöÈUò›nYñ¤¢‹xŽÄ¶#Ê«‡·V泚utK°`”Cq‹”×ö%æI`XJòÒ*8i‘ͺ\«‘”Ž!î¸àá\Í@ÿŸmW ó Ë“Bz|f÷äQ:óc—c8·ÒS^üu+_/ä¹”`¼N˜2é˜¸Üæ:L¯ -ºÏäß(t´°›y> !ïê@_¡Ô•D­e^’ÑϹ—Äè~jð™Ãkµ+­ †Ýë 3.æœmâÆ fŒÁ  "cÖVºÒ‰±Àzu³þ÷ƒ&p0àÜ%4F•gŠ{©þA¡`ø(Ìä7è‰ù£5ûÌ‘/˜•ãšÔ/ûÁ ñ¸âŒ"6HʹÄml*‡öA«œé´IK¸KݦÊþ¹Ö BÔWÏ S¨ÙÜ÷<ÏËgšõúÇD¯QHðä|åÂD2u$ÂÉ#túÚÕ ­=èúE¢…ÒrÃÐ?Àæ¯Ñ[n¶:}ÁœïòÊüûÝç5–eï˜-9dsÆ[ Y7Z?@F 3}W¿}4PFCfË>‚lHúþbµ‚zæ±c‚ÚÝEó×áaþ²Œ´pü¹°š– ŸkÿXÚ5}t7Z :à| s´ª(jj2ß…\‘ÇO›uFyýÀë60.:¥µ ‰`mù"ñ³™ŠÜRå@W)Лj—N÷Ì2б £™Ÿb®U˜U³!£OŸÍ «ö=u—…¹&Ï”ñ yÐ Þ¶5ÊÛçz’´$ý]Æûôa3F—ïd˜xŸÀÂWÃÿ=ÍJ­Ä$R>\ËTîíQDšÝp pã÷Õ¬¥@|ì=ûÚµ'½ ‹Ñ8³$øÙ9#¡Q@MPÏA½roÑõò—ÞŽC’ûF”P]ñ¬úó ¸\·ý!«o?í'¼þI9^&X…ÏŠ‚ü ºšØáþ ¿–:-e]6=ƒ¦"îÞ+&‡~§¹!"ó…lee~@Åê{ï ´õ¨½sÐ MT+¼’9>Œ/ÖÉÚOø*¶hëŠïœÉç]’m ÷²­1rDyF„hE  Ø-Ñϸé|Á*<¿8@½™ämHqÿÌX¸©#IÙ-Ûh¼6[qþ8?–°ó/UšÖ>ºzk- ›èã´F¶‚ Ô¡¸ô£šC#×ÖrÐ"vËs7á¾ngIXj “Ï‚Câ¤S0s5AÆæ È;ÃvÄbÅÁHd¬þް]sÁR Ôv­á5L}%m*}WÑÒµºÁŽÆä¨n„ªôpåàÿÝÙü­§­ûôKÛHý†Ì÷$óFº‰BÍÜF~‚]Öm>DNŸÏ>$4¤DBéokHñ2q¾….<‚ðTò£ã­¼þE…ÎŽïó˜:=Pf`¶ÜÕþ#”rx~gÒ¤ ¹˜ÝƒÉû)zÁ×6¸¬ÖY>¡y6’¤¨ÒGÿ^]Ò2SÏ@Ð^ÇJù‘Î}1à´2õQµöÝþ± ›;¸…ä¢Û@>:³T8q\’`€¦af^^¿J0r ~×xº84èŠ%t½ERNÓ}Ô¥dààžEØÝãƒT¶s%«ÕûÐ+°þ0~¥še¬aŒiפ?•ŸŠ“Àd „Lœ\ ÛüQ4×¢k‰ýñ‘’‡ñ¸9 ßÊÈÉaá4ôàØZÿšMS#¯N¦«™ç:àÆý4ü;ÍZÒ:òÌ þ‘l£–HK?<‹d¼UÂ6Ù¦ê¶ ïìÂ[ÜÞ‘u™Ñ3\®rè˜f®ûS »ž{ïÜ1¥r©š÷ó)î´í™è:êqÂÖôÊ=’ˆæÏhx–&Qšú±ÌF@mÀXáN)éÉ®%ÔpêšÂ ÏþÇ➃zd=‘ª1éí¸ã¿ø0Âbͦƒ¾e.nx¹Œ¯ˆZŠ $4 x­(„-Cÿð´/íÌ 7¯¬ÈíA¤‰îÄ¿÷^™¤ß„Lo—ó‹ëØ^b-åEϳq5D̤ˆس";1’V© îòÎs·‰Ë—e¤é½í°òZÖ¾AXþM SÛR4!Ö© 2ZñÓÐŒoù@ðÄÚÛÎ;El¶Æ˜¥ ŸˆvCƒJqŒ9DBXì@j ´$޲Ì0]!£b)rƒ$›öI–®x 0c‚s%|ÄÎ;Ûqx§¦Àƒp¿^y)ghj6ù™¥ ²/çŸ*¡èŒ~§^é2ÿ"chÓž×QAOLx¿§Û6„¤)38 ƒbÛȸmÆÕ©ühR°¡ïn;ë[ex€VØËsŸvQ“‹;¨p³À{)}*OÂé¦Î¥®`¥Ü±Œ\ \¢=ˆ^Eñӭпr»+  ()¬#’Ò {,5¼öÙ"ØÁ$\ÚÉz€â ¾””>™uß nVøG =©”ô´7,ÀÊV8QªJèîülûÏÒU–«=òk¶uo~&€&ƒÞ0^=¬©’¥¼-bÃT<Ø3Œh_~;¹ ÎÜ$©›Þ=ÓAÙUû¹ÁðâÖpG`2°þçŠlÝ}_¿Þ!u"gø ´‹˜ƒ”sRð:iüëè¼Ó¢;ý,M é»l“×Ä0œֹ€6%`µ&FCRË.« ùìÇÜeèhëÚŠÆœ%>:*§p0}c‰‚Bëu²?øJÕŠ4þSci ;”qZÓ“_à­ODCQ%Úí¬«§ œà¨GG{W‰¥†øÔíÆz­áN=†kn9AÝnæ›¶¾}ŽŒ:æsþ¨©UÒ')‰‡Î>W;HŸŽtŒ6n¤xʯ|m«sÐË›/Œ@îDáÇý|'7í ÄXÒ÷Úp VÅbgWr©Ê ð‚.}ËbJ†]ƒÙÃ7JʃËs Wú5ð̲`ЇwZj¯ÔÞ‚›ÃÈ›xGD#Á} (²tóÔIÌåe‘+–6ߥ¤´{qøéÑ=sá„W©)ˆ».ϱj¦«ÛŒ–£ë””š†üç߈È0Ð ºª¦pôtç ç~oô9:¨®‡yÚ{«—›¤{ ½¯$òçQpBÒʇÄH¦Ò¸Ô7¦Àþ«ÂëüS‹Ï,É"VÓ,Ê_ÀMŸÕ1ù~œìÊᩎ‘ÑÌFø4º<.ÕürWd#¬Nï@›ð["õq•¹ºl±»‹¼ hD«*Â<Üeæ°ñxöU¸q6;}Ýý”+õ»Žº‰ `ga^†¢¼þ1Ç1äø}ˆMÀÁÌ6_§Â ã¶ËœîÓ)‘6OF~á¤a¶‰ºûá؃Ì{Ù¾eð‚.!"¹y×=ÈÖ>A8~»Ó;iö—±í©ºÙtØ6OSÇ —i°u‚Á!¢7®þ´2ÊÅQP¼7úO»=4Û." j<ÈS]ö­ù½çAÀ\µ5fäë^_Ý Býßmƒ­@û'Rló63 ðæwï$ìã·=ô‹LL½†qÏÇßQËyÑß|yöa?š§ëuòb˜›ç¼gÚaö¿õƇã&r•Dïúvÿa¹¤d~XZbwbÒÃm”ÇûŸ#ás°£x§Vx×eíü4¦ ¹`X›Xÿ¾ÄK¸¥á.™Á?ÿÛ™mSÏ÷†ï\çMº‡­/9Ô¿üÄã´¥†Lþô/Г‹âü¤=lEÙ¦²Ù˜§0V<·¸z…Ƴ¡ß[–fhz /ã!¸Ê^TïvRÌ`ká8X`Å]¨B%4ŸËðM­Q8uЙ–åƒA¶Hkß^t ×â@ È,˨ -ô˜Y£0øëËUæ"‚J6ìÒUщÙé‘Â[{ð¥æíJ5ŒÃÖÈDÅN°ÓáŸí m,àÀÂl8Ðu¾m9V‰áºYÙ‘=xnÓ—[µa…1‘{Q‚ÖÂ8›¶£kd`¨”ÈWÊ}{ö®¾[ø÷s&ïéæ2Î`¾7kw‹Þƒm…ý÷ÔÄ”úèËqø*_ºß/6X›¤_ì̪ @ñÉÝÑí媟0¹ù>•ÍŒ/„¿Ycù®Ÿ š–;ÐA«¡·LäôôUEÅ™,æ•wz}‘¦/î9·â ND¦¥³bw.ñ½’eEó}ð»Nç…T–£Üˆ4Dûåγ¾¦hÙ]jÑh(I×¥‡ã'4ÁOÌÓt*µvK@åÚ üAp?våJ×*°?¢Þá÷‰ä+bÕ±¢?xæô?€ì|h"?7Áz7”}ƒ ˜ü›kAë;¤øaÐNJg¯¤;· bËíÜa¹CÁyÄã­¦ÞIuê¹)BÚÈPïaÞí³ 6ãøf–s”d£ÝŽYÁq4ëu‚KG{øsêÉórtoÑѪM!Ât/Õ}ˆ¸:Wå>ŒjK߇zGA&ă‚«m"3í¼ Íµð2Îî~º' Tå]xÂðß³dÒ¿µ©ÍÇXd½fÞªt%¤º\¢€;\b½±…èn²ý1(ˆ/ÑT€¬ZqÜ¥ôU.¡Q5CÃ,†Á @Ÿöct€V,û?b0î>Ãéëá˜x~­(þ5è™¶ÿ% Ñ(œMx€~Â…t<\…ŠÃæííÚ?~7dIüE Ñ–TæÃod¼y5 ç«Nð¬Ãa@7€V+ô‹½ã/EÐðÁã*Ô`|Õ:È!âvÌB”#pyü°Ô¤O/‘Fz¨Ã‹Mù9§ÌÝõ×4¤nM&V±Z ÑÆ·f3d2øá0žâ-´Ýâí0tèê jú8$ãݲӔG3då€O‘û]qùç,ú-f’Rs›lRgly+PLÊàÿ‰%UñÖö-DBÄ|¼º8±ÓÏÁ1PPØüßwxe&¹*ÐÐQu"j\¯…±[²;C?ã¬Ú`3d:bÝ^ '*ïÅ$†ƒ¶™š.מ"ÆÊxÚvÕÍK äv•އE¯X‘.qÂØ²vRèù‡t¿KÔH¬)ïÄq<{]òŒÅª(X¨>‘o ­nˆ…cîl {°aäWÎÈü4†ƒ…ÈUeý¥¨¬žó¤ZÓÌ9•Ue³„¢¢¬ŽFü€sY}Ž_¿ü Úã†Àùð <âÄnC@Ê+ÊêA/(k¶ßXÛA£,¾h˜ø6ÿ< n–Õ6Þ®…±¬}Šïb6¾$ 5ûe6´~ðèÞqÇ .µµí­&1öŸl°ëûèSIýµ¥G3¹¢4KÞSa ??ÂÈÈà.IÇ’Ç÷i™a!gO@Cþ¼Ã›÷BòÀ]ÿ¸fd«tr…5+V/Znvq©^õŒ5 þ«a±ÂíÞ®YhjØêçiGƒQ§Ü °;\Å ×]ž‘cú8ã3Ч ,ërÇ4›¤0 ›œOÞ&b Q «'¡wŒžY)»(JðFÎ[ßy-Z˜‡@×/h7ë`„’œru¶a¸Ê5߬2Ûš³ÉY©m v°»·c½òžm—€ ;vm{k[ Ñ8¨·Ã>$l×Ü]ÎÍ‘䀘UN†•¡$è7=0˜xƒÔΫÃH}ÐÃg€4§BêÀú­cW—$NC#c¨‘k¶>µ2Ü»­ÏRL'dÕw¼Mlæ=(fQ4¶N£Û7d²€7v áû/;ßøeýA(“^‹ô~:°N@ÿGðyÎ_ÁÞkËw¶ä B<€ßPšß…º4beÛü&¼ÂWÅïQC•—÷Y Í”µºnhqÿ ¦úÒ+9ð2ÁWÆý«¯q„[?\Ί½íd‰0#E Ùêg àd[†³pÝãÊZž¬R5Bûæh2ÙB0¸¾1›X·µÏ¦}jed †CéÄ@0ñòÙ./"ÊÆç†“ÓÀ=ç¬M›4—{“Ã(ÑéšM¥ã„°•Y=Ó=´ÈX—1-A¡hWBÍU¥ÒG¤©ÓÊ"Æ$ ÕgÜ‹&E‚´ÁÈ»}ÓÀ à5­Î§š€(úIYTó1ûw½hÍÝ)[ÕܪE+wÆ×zyu§ MˆÓ¬’QhGŠ%)ó˜ÊfAª$‘š‹0·Âì’äÞ£ é2÷-’¿’øk¿ È\Î35€½ŸÞŠ·°èô€ˆÞŶ«f²Û ›K¸Ý¾Q}¤”¸P5#€%%v—ˆŽ‘B€êépP‰´Mß]0ìzðþA´³RXô“RëœîÇÿ¤28éÁ·í‚ø¸Þࢂr.yûÚÓÚ”ouˆvÔ*¤dô´Õ¦ûíá«K„3MM3.ÄðÕdEâÆ â³& <™ªv yå÷<ûå&koh,x ©´€«ãL^Û¬!@›£Âv7þ¶vx&©Qóp¡KSüŠA³7õ³ãº²¨yðCX5ÄÍZ»œœRí–]ûªü«†«ñfëQ¤DlÒé<^Ñ ú•œìý û+^ÜkíÃàŒz¥Èþ VP0=ÉÈÓøï`>Ù4yÄ÷zqXjSmØ‚t¥I'ˆù3Góµè]Á%GÄ`1½"†=Ý]X#|—ºÝ/óÜW²‚­ce·S·l·Å A>ôºN ª7Ê{Ÿº¯bÈøþQ:í¬†_`”wöΫ†)÷m3Mâ‘âú¹žòlÖ0`ÄÏŽO'ªjƒM©¹«Sæ˜OwÚÝýߣÉÂ`3¿µù?ÆèÁãÙ ë#pC®äQó·$0Û:RöÙ Äu LŒ¬ø¥ y :f¡óí¢À¬<]ÿ;ªQ<õ†Qw3ˆåA®lï\g+6Üýj%îêâ·ÏÆD‰F³ fj[5îýP;.qÖ½÷ìC!o<6u}’ÜfØ D%wóè£ÔêèXöKš•H^ïÚÁÁ¸ÛGaß–îS$J 3÷ßHÑ(pN}k<›°©&˜ÄÊ#Úà,)áænS±NŸŒ—!cŸòM°u±CSdÀ2âÄ ‹òì<¡Ø{§Qixzö†3Íx;JU *ãê†J(€"…÷ò8Œú*8S\ ãX>£9„ô=ì¿A§I6âóRúnÑÜØã´´Tœ²%ÚíÄZŽ«ª“P¥Ââ_ŸíîgBµ+´ã"™,Œ‹e^[ÿd.°Z Sa|Þl8è_dLä(v8üUðàïúJaß5ˆ—9æ6Ùº;ÚoY5‚qä¿«t³Ê¦R|ÊbNLÐéóW¦‰–!T!Šr“k\âýýçvñyTçÉ®þ C$we0í¦,jÒ²ð™lzO_¡MZ§ñ N¯·asApÚc/ÜW âÜ#‚{C$¢Hlduj€zGŒûù b[°±ïr¤@½ü_Üt“Ý)^…S† ÂÑÿd`ý'¢ #*ο­k4”[{RVC׃ƥĂ8«r±°Ô9¹zÎé1î5\ÅþhÕæÆÈ—Žs“pd/Ï0‘1®]Jr£Åúø›°R ¿îÚ ƒå´‹§ ¼¤qaãÕÏSˆAÇÜ$I÷»Õ}„~¦4PFWÉÀ3ƒRÍUµ~sé¤/¡§ÐKY-y08Ñ?ß0ûyåÎ]k(?AÖYî [¯F%|ïS¤^Kø©ÓªAôøYZÐ! 5ëÑc ¼ú·òü³#í.¦žÜ EG;«Þb9=Áùˆ@}Á ÉÑÓ÷Ù9’Á´â™MÏóW^å1Òõ#tEC,a ÝTwkéÎBŸ&6,£íûÙXŠñ‹Bk–¨¸Ûá—¤¼¼·Ba­Øõ(xy=fnIe·|Øz¦7´e7™ŒÌŽʸ¯Ó]”; ¨ÆÙF«´èÚÀõníå2Sô;â"×ëíSq'Uþ!#ƒ"èØà?ü"Îj AÆã=q”dÇ>D螉¥?q˜\f,3¡âGÀ- ïÅþB˜8‹“ª ñ3t:2Þ¼ÃÌì|ù ±N®.„dG߬H é=Ï„ @ ½KšsT"©?+t•)"x.V¸)[Å,p߯yH„9 c™Þ¸b;§‚WÓ¿wŒ1*[{®sò†«1±d9M{„o–¢æëß¹½i¢tSù;êÓÜàäzb¨Š÷†Ùy´UMø"B̈6 ÚUVÖÄw´¬7ÄþâpÀLˆ€‘×ršýiJ6 â`âÖƒ˜ ‹«¼ …Û|¼(4ÛF›âSÙ–Ä&¶KJL51„ì¸3 Ή›¶S (Thg¾Rú2Ö»ÿ ¼ÎZZtÚ~iî:8fÖjd¯?yc¾„°ŠÚw+T'vÌÏÚv /=wßjºjóS”{æIF¡ä|‹{£³di·6+ Œ‰M|Oðnü{p^Nä@èÕ ÷Yyïálü:ÊjÍ¥E/'›¦Cï9~5=AQô‹ƺ(]Xréâ"I•7îŶ!!·o¹ê7Ê/[Vbä~…—¤/CùJØ0Ž‘èC£¦wÄùR:Å™ÿ&±¼¨ã~çp©wçD8>ÓÙhf¿@—û¬Ÿã| 5¼Â\ÃO@@q‡Ó¹ÜG²›/“¤ ëîyâçüè—ÝÅ/yç2Å?Í-*† /A1Nì¬x)÷8š‰ÉÞÊ´,7gÀð©µ!íKùÊËB9‰r]Z+©eÃaô^º9tî" ­þ¾_â¹åkm5½A³ÜüHÅ\µŒíYâ’s5[ýʸ¶ÿг&&5oá1¬<—K5ÅŽÿŠÐÎ.ŸB—6Hxïv Ýž79¶pD¦lšÔ Åèj31Ì@Q™„B—ˆóÍÆL*?&=ÿ_ïº+÷giPAAž;-Áp×# ¦—ÐfÁ¿d2ñz µ–KÚKBä<ÎøWÈU®¾ÛH¾W”îǰWµÉ·ø¯ß¡ú§rnƒxV©c£S¿Ôž©Ÿš)Í Ý/—:'hñ“#wÛáe#7ÕPörmA}/ÄLç O$ ¨®—Ì ¶œçÚx @Ìó:æð†¦ð°èõ&íSg®!Kª>AÂD×3&€8ýHÜ:î”=»•OE•Ètv˜þ!xb™l',î@›=@_J?Ìwt˜1e,ÕYöëÄçß¼Šë‰ †„0¥:ð`ÄÈÄ*N`|«64·Ü™§¦J7 Н®àœÑóæ‡ýövª.Tѹ‘ ï ;î[÷ OŒ\8˜°ëôIÿ*UŽzÃ}*…#fc~ÉŒÄbÐÀè„z‡Ü€£³­ovüJ™a×¥bG jgÒÒ¢k¬Ä(¼¸ª›·Ö›æÈ?j9DÇZ`ºÁ.Ãi?+êa*\‘q öD{¸hXQÞõÉ.C “³ðW/~Ò"¤ Ñ”Gò+b°|´n­NÚaÒHä}ª)-Õ“6ÓÙðοû_à¨t€÷øUñÅu¡¦òºÜÀiq£N Ÿ^d%è½!œnÇdHükÖÑñ‹4ÅLôäeºÏÓÿqp²òA}¿ ¥"­éAC,DXž>ÐÔ†q½J±ÇèÌnS䱨ü+’ÔÛ¸嶘z€…«{¾Û ¸¾é³ñz£·Úý+{º7Ù[áTFf]6±F\ƒØlSù÷½d³žw"-W–)L¼÷柨áÔ`ÊÓ¢šÅÎ/wP¼¼çZ9ûÖî$zô´Æï|wehoùž"puÒ?€QÆn„²<ÊË•ÇÂã*³f.Æyåųž5æ‡%SÃËrìüŠÑ]ÉPæ0½Í™‰÷+¤ÜHÐ.¯Zž×ˆ'7B€¸ Sð"Ö"ê"œÐS€ÛŠ˜ê¯‚f`{ÒùêzHYn$H‹’¨Ä ËkÁ¼ÝÞ0;ç„ uZf™$f¿_|¼Pä§Ö-aÁHhý¤â“}À!f˜<æS –eÓZq²úJGN~³§¦§^}-¿öØÃÒ îô oÓ1<%3ëáIKye¤5CÞæï6‰ZrR³Ôv‘W3k'ØL[¹”Á7RÊ}º­¢UB*„ù®‹ÁiXH²¾;‡*檄í¼Ù­>ý½‹–L›ñ ªÄ†¹ü+óO—¢}‡Cß_ ßO¡bäÝú õL \ÅÅ5WÓã•î ·*[Õ¶~¹\dÖ¼L²ýbB°ÆOÏâÃÏ*!ÌÌW˜ÝIÞ‹g þIå“.ö/'˜¯u÷×ö^0Qœ7Te`p>…øˆÕ ,}ë;¯ž+1\à/H¸´“U”b›ŠDa߃C¼¸¢ÁxK<ùÌc8…°´¨ÔÀÑÛÕ—Sž=h=—ÊN†ãPKÂ)¶8\*’%›–ÿá  [Ôæ¡h·Üõ­à`íêp-÷»r2"º9à·÷àa/k}]>¥_üø¨LÏ7Ú¿¶þ¦Ú6ad ˜ùÝ߀[L) šF¿ ½‰oÅW”Z šÕ±ãvlòþ;¿y»?¯L¸ëÞû×7}é»4ÀÁøÂx4~akËîó×$&˜=6nϳåß1xo–‹ÖÈ“‚t8¨ü?–H8¦—ò¿z˜žðæ8M¿§×«;s&hØ…ÔÍï’ñøN˜' K¨­oIàÂlŠ˜1 9 Ó˸ý,ƒ,kú"a5 VˆôÇGë[³€ÆßŠÙÖz®Dôo¤«cšÛ=£ x Y‹«M¸A·Ý#ײŀpxü©úþôFLqN'¾«dÿ®!*‡«GúŒ‘Ú÷É ²Ú°òG<„f/ʆ¦ Èïßù²šin.ûCM<ÆÃ©NÍ-0ÍkNK6IÉðÜ·ÿ»ÙÄ!« æóÜx¯Æé¦¹h¨!EU «´OHFì%vj,²gÉøö÷ÿÔ±’Å«pÔÅ*5ë`ù¡iöK˜3u*§ÛšZ#)ÿµâÑ0=õ¯l;£ºvÑ5€9õRKì$ÃÍ }Y.å..À PéTJ5öÛj(,2EXÿ´v7<Ö-Î!x—ö"{ªzFÅÿ'gæÓ¥C˜üÒmþÂy†ºE\µ‡Ê.‡j@+`$—T × ÛO(YΉ‡<Ñ—ä‚Uœ\¡5}aJkk)gë«å2žýçàèû’”æ‚.ÀªÆ:öq„mrÙ÷Çü´¬Æ›qkÑ1«šÇúÅÀ2~û Ô˵Ü{ÊTPùP‚–¢ùjÓÏÞѪ†­8‘е9XŽ 'ÜÊp>ül¬¥«Þ¦(øyi2GI?qÎvÆP‹Ë™&4ͬ¸)FØn‚«Úè*fŸ¿©5ËpJC @>)ò‘}‘FV鵓¾ÇD/~i^›¯5^¸”áÆš9B›Ô77W’«ýÓvÅ)CÎ4êçe)³§ím_Á«‘ôIiýÙvßšo‘A9tô÷‡¸ wÑBEíkßî´©Âå#/4§ÃˆÖIð¾Ùuñ³b3,)õ~ë¬å]M¹¤¦;†ÂŸ°ÑóÔÜ~cZ&ì©êÕ8nƒÉId¬‰T®‹]çϿߟŸcv:4¸•uI u5{Œ+  À\±lä ¾¦lQðê=äC=îÒ5œ ž”¼a` *âXAV*& ¢*}˜Ü4å.ü%¡´c>îã–ò‘_·’Cz¬Ó×î/NÁðð"EŸ^¶wKà²zÕ„ßñ–ž§àüÁKW‰,4è>àMÄ­åߟ~NýÓ†Xr÷5]^Ð9·XÑò•+ð܉]Tk•ïÍ › ž¥ÐM‡¿Riõ_ ¨vpe¬o*åÅï·âulB}«Kà›Ð‚ G¶ôj/&ûÿ[³[Ž‘$^ÁmQ0ÞIO^aDÅ ÂH)·íYLwwà¡ýá±ÙìÅ´÷eh ú‡ßaÞ6ˆSNÿÉ`ã¤Ê-1Ÿd‚Ê2‚Ý^‹:)ëM°Íc Úˆ­ZIRªâíºª÷ÅžF#Â3J4š ÊimŸ$¶‹q $w—u‡WS;(ŠU5·`Á~X‡”ZŒ*̆±&yÊa¶§½Qh»=é_úWÕl’7‚ñK,KzÅ5^–²A|™Uì5>y|¶¹¢Yûõe\«~VPÏ%[ÿ‰)ö¸ÅÁ7›œGÆ ÈooËçû5¿ŠÈìØó‘4³ –!ù™ea©IýÖŠ¨Zý(ÌmÛ<Ðó^ìaº=‡bµD˜¹ t.e•:KúÎt%†Õ)(1TÙ\œ£ö×8_n»ÛךB)àd±˜ZÉíð¹°¬›pÌ’žÊ ?·Ã£`0:?ðŒj_Á‘’t—s‘ ¼¼¼ƒIYˆ±÷æZÓcxˆ¨×ävd|pP£¯w™a‡oÒZh²ž"˜ãòX#`=¤]/ì#VQªŠ_7f=щM‹—è22£Å +P q«Í ¾ –RSeŒΣm¥þ­Ó¨ÞMqTâUöƒ^A®»Q—v7íÅyÀÀ§ê&¯øýfŸûw !™UR"·ø!Oaª®,B^ˆ)è²—"îÏ0"s¸‰„Çõ³y‡4å¡olS*8«bÎ,,ÜkÊE…ÊÇ`\te­Òª½Õû\êR{›^½DF€ÎIèXÚnÁ%{e¡K´Ë`g•J4£½”òba•íÖMgèp`“50Ü>¥±øöÉÐèóèܲ€¹‰ ÌI2šù$¼¸ÐÒfãDêæ ØŸ¿Ãˆ„Ïa…Û^z”,.\‡dJÁÏÓ°ƒô5ÁÜ@ %e¦È᪩Sw“•ó¦&Mvq éñ5V/c§q€áŸ4Mø'œFß„¢a»‡ˆ€â³À{„4`¢Ú¹o•:9ÙØ¤ ÖgÆŽÄ­ ¥ŠmÚ™‰AsIÞûNƒ¡m4aS‰â$Áa‹W„Äôb{sf²g‡Ÿƽ€Œ-c\+—F×r8aUu1tXúR_ æÆÉ ,WJ£–ã¤[¯¼Ý€}Ùór‰ Ÿ@ØtŸ!ÑVAbŠõ0FÃ|W1Æ!jU‰åQ¹KbÂNå4ócò ÓŠnYÓ6Ÿœcw¾)1Rd/Ò'gÅ&Ð*•Ÿ %(¿¦š5e µUÉ¿cF“Ý.ØLóT s¶ï )øXVcÓû¨±˜Ehä¨{"/kFeϑ٧oGH£ëSºà@9Äw³^Õ϶c(FŒìeÌ·§LÉ¥ ‚šnøR'†(h1Q ìÁ†²ff+«VVX?ƒs"ª£ªë‹9Í@0 ˜ ZiNYùY¦Âê,_o¬ìê¸åÔíÏÓ(ñšd»˜BϦ9@ÃsS8R°ß‡VA×Ú„%¹(JÑ™q‰†ÓoC°]UŽØ®i ™“9Â^¶Š¡&pn–P±ÇäžA¢M §Té§V¨X{“î¬]CÏѹëqbôÖY¶ ¾þ伄sîo摟,üÙô²éM¯)óÕúw&V_Z–É€1^þ»ÇªÏIßèÕT‘õñÎ èXu*¨{Ð} h~'0p׫DA±z]k ã9ch²Ú«OïáÅ@™G¢&gËçV¹GÚמÕàpëAdV7fýAo¨“>fÕ(Šßró¯ºtpüò͘+¿Ñ’ú÷·‹ÄØ[kà^ßÜ‹ÇRoäÓów5¾ Æ^ŒP–cRmKn¨Ì¢ß/ä<|5×¶TXÅ.{á(;‹.Ô%Bc,”ë{¾™§¤Æm¥©l³_#uRŰ›™èŠßÊ@[Ç­©êÄžø±G‡°>q£2kð ô¢/<,’Â"ïvr®)tøD+^ôB¸û0þÝ_OüG’¹áhvMç½)ù5gnYÙà…R«í\šÚ&•.;»°ÆÚ³Êpél¸¸ý5rRi2(¼1’î))ÃÜMœOC–Y#Q…b Ëð#KèÇŒ5ëå¶óßküÇœû>e‹iË›6KMn¬«¶ŠþR˜t¯Kxü¹gó~õÝQ[v°ƒñG“šžîw¿šT}VGåB…b³4©;‡ZÇaÓ¼ë æ6iÍ÷ú®eÓo‹üf4Xb~ K“ÅÃÎè m7gê©È²‹Ü›}LÚBD..™P ËÆƒ³†ÆK%ýÈV„ô;ä)‚f=©µíþhS²OÉŽØ  võ˜O*/SÍBÀ4 BĆ ÷¦bi¾þ¡8A¯Ì¶=M­ÙóÂȪ4O³àRûø6£Ð¼×;Dë+Uø»Tî… Ø«¢ äm[7JA±•Ë`ßÚdÄåGÄ%GƸÁú}™ `¶‹ÅsäÆžÒÄVRB˜ŒK+ʪEß29-ƒ!&µ•!.Žëdþ—8ͦ2ñ1ÒŽ#/Nò‡Aúµ/„àðâ]: ›:c;TkB}aвà V•Ñ“=±:ÝÞÑMt¯$Ö26st,ãù) ÞH»±Ï|¦#¼˜x^3Ðáú:¼•u?Py¼:G*“é«ÝÅèy¡Uù¦¡Ž¦Û´Abu1ÙkóÑ@HeSIK)~ÐD453™ã  ;GÓÙ›Ù»¹h¬„ŸЗOB–ÐÎÁSºÞî¨g™ê eû¢ÔQ£á-ýœ„K!I°|ØÙp„v1H—2äKƒ«ÐTÜû¨JÈçwpÇgZÍøöëƒèû‡ú2ºèXÏ8¯m &ÿÈÁ«£ÄkÈlO_Äu>9ûL’ÐÇöƒlÅPr“ ]–fÇ9O§qžþ›˜ÛùCçIĽËf†°ÿdt¦¼Þ–úï ¸Ü’™C¶ò]Ì;NÍà"3ÍÉÑžÅ÷JJkˆ‘G ¼O ÃÊRau~L»Q<š¬™û(5z-ËKïãŸvOrs)¤ ñˆyÈý4ªÖÞ@q‡#`¼…‚Ò!?3 àZ²ÛWn_¹Ó¶3žá ‚ÏyßÖ­Ý?|}õCO_8¦sF“~wDȧ¼ÈYöôÜÿá ±Ôä˜èðôK(^&‹Õ%as@8W]/TghÖÑ»ˆ¢õú̵üÐßÕ»³:S±T´E+“1e³ Óö2S½í ]†>Ré_¬ÿ%Ü4ŸÛ³ou¼ä0G=øÜrˆ®ôo»Dâz7¬45H±{µ¡¢}Kšúº‚Û‡ëÏKhƒâÞä‰x³PÿÀ+«‡HèÇ„.ÒÛ`(å¶ÑÁî’Ù)éÐÿEü”îÐR\ÐOºp0pnаÇ&¼¨˜ñÐüñ½¨´è–šAÕu¹«Í`æ{ÄÞU ²9^&¿(=&vÙ C ’>­Kµ›drP̱×§L]<2ô—:j®óÙ¦$¬Ã† $¤ãž@kÇ« ;BP†S°9%3¥+£/Ël‰ê,ׄ@êgÈ3Í£» &wh:SÔòkÔ²é&¸ðZôÀíT²*cÇOÄÈ3J,Q?*:KTb ãû?e)'íî–{L&2 –Z„ªÌï掌|׉÷Ô±7E·ŠŸû…b_[ä¦ÿ+t4¯ÈdM¼|ýM °[0mg;ÛMßïÎ maæ{Ò?§y¼°þO¦]ÌË*‡ì‹zžìkn‡4YQÁl·_7ü›PW_éd(ï¸Üç #ÚÈ6(2%<š‡<˜5ƒ–éf—ÊÈqõ9Åôêõ'z6’NÍÝ@e&>!ÕÊIæ›U†ÛU:íÀß|òs:•]ÿܦVì{Uì¥ÞÖ^@ü>øÅuíEaÿ’Æ@0þŠ%Æ$eøU¡ÄºGÒ—Ë-Üÿd Œbµ®b)‘ëN.·~Hö™Í1ÕyN«wÅ{¥Ò‡Ìq"ûËX3 &Go–¡½Ë˜Væ£Pöl·Cßn°.N }¸’àG¼7º³-¼lD „5ÛcuÙÿuó0û‹¸ÙÛ½Åhzù³Ñ̓+Û½·¶Ú6vKšáR4ÿuq¿¬1±³ðËq˜¶áo‚oç²ëìô •ÉÌö`}®¿7ã[y1o“WÌWÁÓUGîîWqýŽTóÖ<àŒŠšü4É8$ ßK'n‰9gµ.§:Dz*ýÌ& ñníÁ‘?Iš©Ê¢úðqÜ8ËÇÒ`º‹ á7¦ 9RQ;0…ÐÈêÌFñ„d­ú¥;^WÜj“g{»;xŸÚ­€’;"ãÃL½æp1Â$Q¾Dõ£Úb*}m‘¯\k€](åЙ"æ¯$’Ý·‰þÖ¸À IÉ£™Wº—aìÿ¢!„—]þ_ "t¼J,rŒ\ƒ‰±´ ŠCÑùˆ±ˆ»[ßůòÙÍõ8’ ä»ôÖ/Ý*U÷³ÓczÒW;ÝQ/ÎãGφ¶OîᢧcŸéO†>iŸ•Ý`½€"ìXìåûììY.¯‡¥t 䨧Ó[@Ýk°z“Îó³ÁÂ˾½é4›‰-Òî˜Àg·”òðâZô,‹F˜·Q!-±{ðyÄb¦þ߀çqp’;ùèi™éR™5i$~à F R ñ’1,ÕiS/eñ/‰Ž1öü™j348ƒGÄ™/PÜÕúîYõ¥ ´|?ì²O ~è<ýg1¬—U]‰ÈOŽä1Sƒ™Çm]"fFKDî§”WŽÙÕ*ZF9ÊEmé;é7å3‘×sÈ)Û‘„ 7ÍûÜÞ׬ü,'[ÕJÐ_yÎÏ ,WÕgJ]Óä… xþ¹;»yˆuí“]ÈZ€ù¯FøÁ³âãÏ´ê@–œ+ãÛûs;½T_ÊŽ®6)D´1¬Â€gF¹|q;êiÌ©ñBî”zΉú„ÀYw1*îÙéj¦‚ßUmH›šo&MnäÒåÿ±1ãA1úD ûQ'箂Рý³l IÆÑ^ œgx‘Hó$ð î%¯é·]Ÿ¶u)BÊ:ÁµÄæpɼÁþú]ÌÒßÞÂרÚ3jÜ·v62~Õ§ùxòQßù\¶L1SßGXÉõíE‚+»´Áï_*óQ¼G¹yX „ºÉÛ Éξ ·©hœý‚&£¸k®7Nü G"6ÇU¢àeýHŽl¥Ñ_Ÿé«nØíÇœ\7½ÛÀÜ ŠÑ¾~FºÁÑ‚<°î=!Dl½~qDTÕëÍŸ¾“î) áDPpQ<›å9ƒ=åùô¹RB‚~ÎåŸÊºQœ.ÒàºV™¡JæÝ¸¶Ê$%ð>ꆗ+ÓóÎ)#%ßf<¡àô¸®»)ð›6”âó¡ßŽ/ÁNÄœfŠ%›044o+¼o^ˆ9»tÑ㿌Ƚ˜N˯RÍ©€ «ã>å"¼þî./F9Iœ ]­ T£¤©ÎÆV»A36-ŒþÅG¨Ž”î˜ÎQ,ÈhR¹±™ÃO ­_:ÌHeÁ~¿ê®øÛáþÈ’¤¶)Òjg¤æÙ·Žê5Zí·@àâ·™/y”6 ~ƒu>Õ"‹õÙuáÓ§vö?ÿ&‘žw®$ܸô >̯Õ_„°;B¢W!ೋ#Rplvµ!ÿ³MÍgèÇdvË>ÞwØ%kºNµâB¤& `}ð“{-›üdjd)…ª”èÈ÷Íå¹¶s€;îÂ@²v"…âP{”¸‚× àUÂö´GËbý–4±jKíVð³š;:¸¾©vÕDXRyáõí@[XF¾¦ê¨(¿t¨'¿\Ê4úÖÓ«‰â·²ÊÂêû£@hŽø@|ù¶ø‚µšÏbɽËÇ^.™´òj Qû*­¹µšÞt]HKÞ«%ãŒQ÷ôôÐÿ“& 5ÜÞúCâË[€Ž u/‘f’±,Ûõ(ÿ:ãôໞr$º1t` …ão/BáoæÍF!,‹c6Dè1€†ØCñHvÃãZ–\ebªõk™n:x5Áâ»Uˆhl%·SÕ!õ{°”³u‰Ô38€ítGãfÑ»ô°2Íàâýfë3Ò{k±£zeOͨ} g²Á[ÅÅF~4‘C÷ú:×GêúêvØû‘t—¸ eK³L¶ë”jfŠ¢v´¬$„kFþl_0MJ¤ÜDPöbMÂ੃PFÃŽLç¶¡H ‡MÐ×/¤)‰þ\îúº? ,+ÓÖÊZ¡€Y¬ªd9— J±'$—‰šb–ŒD­8¨løù®Ø¦18@Jó雲Ê×`4Šªô*G“Ó‘,¨Dé 詯ˆ«îÆ‚Ç@ÑtÇÖÏÆ• zœô(îƒ Uq@õi­k5H :0´“fXýµQn?5‚gâèØþ×4šNž^3/Ö%çõèUy®u‰˜™­»Aº3¸¤Êf!CÍR'¶}î«+ÎÞEØñ3aLpõ¸ÊœOk©w Ò-EFz]æ›b¹ÅnÕFº×„0€{eõîô†‰pÃùÙɯs@…'OÌ«<³v®¬×Ëㆠlé<"OÞ+âËXÃ×;׫^Cª2¥Wõ—ñ¼‘Þ¢—äÌ ŒgÆî¥z3!µ°Q¿uæä{ó;h£>—§Z>ïOq>/1UM ЗԇiDU¿± ª9Â;nuEwôÝ-Q}‹±q3_´Ù‘¸¼D{±DªùÈ`TSoiÀÈHžÐ‰‡ƒA]ç$Ü<+O ¡3òu·¡Ó%ÕËd‡DßÄ[Â\G]Jì+6$¡…wúæW¶ÿþ$â~Dä:¸("•’ ¥&^Ôœã®í' 輟@%œI-¯NÿF{(H=?ec*¹Sõ…šÏï{ó»õ`H¸6ø×¾Ö ÆÏk•õÈ}V"?ÕcÅÅžßÜàx•[è ûÞ@XO,/ GB3$ì¯g:ÛG(ÍX$FhKm?ÜÝå™}¢¾Ù ¯ˆÂÙ1œ‰Ÿð~ؘ’Èý öÖPÕ¨ÒéÛ Ë7¯‰æÝÎ0Ú/x•)#ô¡XpbÐ}³—Õçèr]Ê^dKë¿.Iª‹”tðŸ¹Íç~ðŠÓÀ¥ü¨},‘õ7w(¶C‹š¹K¤J2IQçsþü‘[ÿZ¥T€®Öû~å6ƒ0Í´«¯OÖ&¢‰ž>oäÜK‡Q­e7)ð1AÆ^gE]êQÒìúýÂ%ïÎ,&kS„ž*Ð_“³Ï£x#öÏî/Ö—°#›Ê5¤uœTõh]pRÑJ)´½§Nh¬¤™Od‡l™ Ú`o7?øTŠ÷x ÷÷ÿ‹¡©¦h¶ÝëjY+«Ñûó;EK¢E?éâ±q¢5ìx7:üÌ7ºy$¥Z¢P°ê§üÉ$4E£ k5NSø¢XÚ+¿ÔH{I› E?î¾5@T<. Í1öÜQ…÷W”È¢Ùlˆß·qcÚêød*T-þñºå2÷˜©’áñÔΘT§lÓ_H C=™˜ú9šÑ ȧâÖoÎÝ3š9P7|½GV°Fâ6Èdµmh³ñiV¸[,á¼òüc …ûŒPtrÉ·fu?õdÈ-MË*˜bzÚ#u+ÙéÃÉnxטqK¸”â4ýCëˆ×І}fH¹a27~œ$©sˆ·~˜Z2rÒeƒ âÁÎl÷.áë„Y\bÅî@z'[À¯”B«\/¬Í·×EÃÛª‡d Á¾„݉8…srL°ÝQ€l½»<¤åz(jQ ü%¾"¢òˆà¨>ÜYI|Ùʪz)qãt6i ¬HËZ9”$ÿÀ¾2p>)¨$š†üœÐµ-Àc¹ݬz/æzÝu^ÓÅ‘|@K‡…¦roÓq¥§²ðºµYtÃiºÜ‹Œ£—™ÖÛ™;f‚´ =ºo%«hãkÄ]à‘Vž2½N퇜nÂÂÜ;ªHQëú0èýÿrú(NPha&âšJ-äcÛbcêUê_EI±lÝ}õ3€~6†vn­º¥*”V ´u2Ú=Œç·%1S†@¤L¥ÔÑ~¨»þwz—#M,ø´TÿH!s:¥Å»9 o·w^[·³á 7Âzrê?ý²Êâby«¶z7– ጥæÂDW4 ¢¬Óž«Á¡ç÷¿ÆÒkЯ9éLŽLN(EÒÓRÖ½¹ãéwz‘’EAË“;,ó)RyÈÕïíV&¤$.æFÔÏûŽaH›úa+ý•»©vb&ò¥çCÛJaÍn”oC×ÿ’ÖÕÞô­’å6Ë\¥"âPÌ×G ´ÖƆæñ yÜÒ:¯Ø>’8ËJ°Ç ]¾ï;Õ/ß‘äóK|`‰vLóÄAýÖR~0ÝLý\Ꞣú7Ø­4dØ¥æ §P,uünÖ;J=ʱš Q/šÛ%…´›²Éb}tÎðä÷YŽ2J=²)±º?‡phNžB‡voÑYZ͘Ðf€eú“!˜ô)”ÁX«£¾LÅy*ôó#=¿6™‚7onîÂåCIhäræ£já¬5-ùãC|W´D¨áÖ™õ¡·é}ÞÝí6‡Æ«pÔÂüMßÙ“ÂY#MKDDÕ»R9NÍ‘:Ù“'5~ÏÉÓè§°ØêLa-³œ¶Ãƒ Š0Ógš°Y-0 – jaàÈ ·OÁ½SÂ¥võ6Ž2üyüØ2Þtz{F°têiƒkUt2“©k¢Ò¼8U&PïÈœ ÙyíÔçî`~WØ¡~ô$(Ù¦ŽñÍ Ø=l©®FN“x•¿Ö\RûOcÕið@ Ð84:åR,Âb}ÃØÍH…Âû€zاX²SäXÀ€ðMˆ¶Öw‹™Y5=¸&ãhí®÷œ‹£äGs„˜[RûÐRJ‡QEÑrJ|д8û¼eÿä>OÕê–Nõ%ܹ’¹\¼Ö{ˆ$î·î0TPMÈÎù^ÞæwøìM#»vôä¤ñsºSÇׂ !¾Èo/‘‹[€ht°¬ ¬ÓéÉüqX#dÃáÛJî„…ú t5Ë-Ö‚ŒÂ¸èžÛ4‡½{¯QöG?ƒ¡ÇñˆÈ^‰i‘xlf‚Z…ýe&ÁÂí®­H…pÛ¡k©NýJ\¼/”£°¥˜¦,¹$]€)üWsÅ+þ…5jÓ51Ξv)æÎ,,Qô£Ï)Ôjÿ1Ž0î˜øÀ¥^í:#…5ÀsÁ´Í[–¦×<#[þÉ)¡üª?8:öBþRý·|=ª[$Ñ,˘èkËÀŸ-˜Ó› AOPS(;k=N†cž§\H€oëEHMö’ãÖTeÀ±‘¾&ØÃ ÏØñÉ¡ŸzƒŸ‚<¾ØjòÝT“xü—€±_ªÖXçÝû¨kþ˜.Ô`ë|ïEçssŒå{m7„¶5p™0ç…Jð_…ˆ±Ê &)Ý•ìÓbÃäÿáaË ¥v°‡?­fPãhh﹦Ù‹{:N7‹Y,SÜIŠ—‘çØðC@D^É—~¬"8c&AÂ[ã¯Ó÷îùÒÓ Ó2=P°©ãÞ`iE›Æà¼Œ±ÏŸ¤ÓÜ´ÙYwUÔ¥ß.Ï\§ ¿ëG>eãìaE0ø„T“u·ñ<ξ>§züÀá¿kðuÖL«eSðv÷µŸ÷Ó³AЄOÜ|­µVÏìÈ™_þðêŸk·7°—ÿÔ1Á}j0c“ ІæQTÀÀõäAfá6+jÅm´¢Ëº¿0þ¬Um`0F–}O[6~Ÿs¡qyæÁaÔ>e6ÉëÏ9N'ëvÉhž Ë÷ÅSuËÞ#¥W§e«w9ª´P ¸wô¿Ú«Âð¯G§ÔÂw¸JT•´O.'²Ç±Eñæ»éƒõòðs –޳÷ÏÞ1Þˆ7*]¨€IWP×úÂ×kGU'î9a0_Eó¾]sÊn˜º²‘(âJeŸ”\gÝÀiûI;÷³ R`œm ¡=ñjÒ3•U3H6, vúäÒ#úüÚty§¿LaÝzÏC|þѶìàfäs]\Z"UZ†4]3g.ë°£ã6ÀI`·–ÓL~†ú–qôM§%Õ„#û‰:Šª¶Œ©Íëßm/F9õë(p+í…Y/Û”„î »‰\ôÞ'˜ eÊÄ~òÀ•¬ì˜ÐT\ÿ×íþè‹ÓðvSÅ'“2µµ±”Nÿعúá ä€ð˨ùID‘øî2dˆ‡{›Ûç|%û9)D*}ac¸íÈïe$°Lƒ”«8FBY¼€¤!ï¢tF캽m¦¾‘9Kn³k©h£½A×_ +¼ Á‰ÒbS/‘=;òö¡žQÑSKæ?[°6Ö%aÙ%ˆ«¾Ú^f1ÅÛÅ;Ó(Ï“(1Á1[Í\…Š|%ð¨-j¸}äšw0á;š·ÂSµÞUW$GhÏ-#+MC„ç3ãà¹*øaò7Â’+@¾ÍˆÒŒç“ªŸè=¼Ó›|™Ç«Ò!¸8µÇ§©$ýp«ž/ CIn;ƒ:V¦u7ŸNY°DÄ´½í˜SaBk•\Š2N”ÚùÂ, ÷¸3}å‹„GU¬,ZpŒ"”¯ôuÇ\¥KJ¼‘¼Éþ”n~”Typ&âÜ‚†=K­k~ÈùóQü µš/ ©ûxC†›‹©—¡Kt¤qHžâФ‚xÉI«:OVeü$|ßÖ@Ïÿ(Ïé&Œ‹ L=£aéTD8×—În|¿.Oë2²ÙôTóä¹h{ú=󡦕ë:_réß›ÜDóiPøÍjìÃèK±Œ’œ¿ÑÖ<È40VU:³H““ä(âÔ¯Ë7 ª_©|ÁûGÓ’ÂŽ%YÈ-@–ªÉhWh)hÀ´a‹ ø­É>Ò¿«âÌ— VtÒA½§ÜñÂêo’^°¸#Úº ævbC©ÞhbWj¾@^r5žùdÏ—Ú~Ø }T1íä1gÞ£Wô×ÿ->N¯‘nöš¢O6­„€7d k71. Ë´2Ör#3 Eײuç¾7"HxŠ£tNvø¯>ŠjoI3 ö¼ØpyÈûªf×XØüjT¶Uñ®4ªM‘Þ=\Ò^ü".ç/fS1úÞ®iÎóÿ!üpc<7épæ¤ä(îvÑ´ZŽÀd<Á0ðVGˆhò™‘t¿†‚~|ŸV?­”˱ 8\S€Hä†ôËZóDãÈŒ‰Rv¸ ÷¤ãñ8U&L¶Èã¯e»ÑäÁn ŠN’ïùIKõ'Í·šw%?ygÎ÷³ âÕûq~ØÎ–‰Ñ*‹~´ø»^,°v¯Æê!®Õ÷ÊwM¬šžzŽ\Ð2¿²¤~üíå°®“3…ÞÊ5€š¦¸¾l1ÎÙWç§)ç²7׉ü ýÝâÏ»þõf‰‹gt9t-½¹'Þ˜+‚óçƒDìÒx>3½jhá šu=Uz¦‘÷“Ñ´ÝOŵ|þµzDBÂ*Ú“ T†ì‚AWÝoÔ˜ëR®6)õYñÇœ{ †µZ©ÁðC½ƒX&Tq¡HXê殈 LïØšeòÄõ«öý¯yEÇ9M*—5§§E±ÊF~¢$ò"¸f\à1e5UÞ©S¯TV¬d'p±H£¶àˆÚŽØ„*ì°ÔÚw'¸2À7>J«äWy4o4÷å3†‘¤ÕY^>“̹éÛÛø~òý¹ÁiHžwÒ4•»‚pŽœ°•m°òЬ[¥—;g[¯Oyl`h™‰óÅl)ÃÓÆ“ èNÉH(×~Dªì@¡_¾¡JŽ-­‹ç uW‡;7ÏÄjËbPR–y#ZmÜrûµ•ŽŒî+´ÖN?C¸ì·•[B±%QÙÖ»Bö<'4üýS²3X”Ùµ”•Ýj7¨§þ)`pøÕEýó±c·KÝOëÇÓe;Z‚VV‹¡ld´’ï2:I7M}îmGô‘m—%)‚y?RòñáX–lÇ!ÀŒ"adÃ)’¥K‹üµvõ:²FÕe€¥Û»Áñ}ª®èz ]0vÐd3(ÄÕ\Otçø„ªØOÉ#YÿZD¼É´ªÕ\·&U)—é/ŸÇ§W~ÄßK½O÷ÛŠïùzÁŒ(¯®ŠÉý$(óCj.=—ÕbZ.¤N‰À¡>»S[îï•öÊåbþ4c™æiñÉáËÓ.êK‡é¼Ë&Q‡Ô·üàV"­Á…Ki‘›ÈXV&N¾Yeæ ,PŒ¡¥ôîú‡sy>‡gŸnè㎲aå°Åª]#Çpþz½óKDVío_%$ΰõ÷‚=«6=žŠ†Q}GýË~³"0«1ˆ®+J#”`Q·ÂB Jâ&ßû¦òÒ1¾qí%6Æñ Ú‡ëËžÀùçP8¹?}øóÚsyÐÿP^KÒmÌÔðÒ#%ê+š6³×s^ôµµ]ólÇ„1šV Ÿ´Ëc§’Ыºšéß»|y¾§ÈéÊS™÷ñHÙm³k&µ,TÔ†A`4ý8ì_»f"²DƒºÌonÔŠ(<£C}Ñ/U$R¨triÐý„ا¬­ÓÜßiK”ð²_yÎ+(ãÕ‘tüóªüëÃF H˜ ³Zâ!„·%ò–Ÿ 76´C÷0ZY…ç½t˜9¬·Ø2V/‹ƒÅ¢ik0&¤µC}ñ"‹­b*ÁîÎÙL«ñ¦tÝb@²ÈwÝ3~ú_{ßU7.e2Ò²nNþ6¶L ß,œ‚5þÁ.t6ôq>Wó`–e™â.ùqV<‚(ÔørfÍûC[ƒñÈAì^<ôÂ8 V p²Rk7awBÓµZd¹ÇÔáÊкv¥ŠP,j1,(GÕñ6Ï™h¶X˜ä3¢p³¬®ÆŠhŸnR\Q…leÏæöˆÇú+?ðÅfÚÓ%sïòâæÌ–‡l±?d=ñ·fÓð»†xèÉŽc‹oὋx* x”ÜåAXd™¾‘!«Ð›œÑùÙv=.mÀ¦–Àg¬W5Bâ›ô"&|ø™mi{Uœ¸•¡Ö“ ê¶¿¢3Œ 竉jgDKÀÂ`â‡ð¾?²°«²èW´…¢ÚãÐt_3ö&¼¢u:µ“Ëm˜ÀwäÂÒÓ73}ÞÊ ]³¨’ÄæÜ €AI¾`EŒˆi&\’!øZä¾@ž®]íÓsüóxEM‹¨¨BTZ[%ˆø Gv!˜BýRˆûú…Ž •åæh-noßöý`k¨PQž €¢Z˪‹=àû#9U[ >j=£ˆ:"µTA/S’”~É‘,~piš²u$U17ºx2…áÀŒnZØ›¾çJ%»52„¼*òï³P®6:Šã¶ošÄæ+ƒ ÉûËhÃSxä¬ü×™¥)p§ W}4›]û´ÑûÃH1 •º Ón8°¾§éj¶úE@Ä‚T¬–±DüȨfx†vƒÐʨÃ`ÄÕ{ßäQg/~ë݉†.º·-µ_ ߺ€¥ñH©t–>Ds³.ìâÆîïš}Ê´à+Œo…»„Óû×4+¹°•¢þá ž3ºƒFÁ ^"Àî§©Ë­f¼åkÔÎã þË1+¾§Úº'›ÃsÝÖFÉ{¤7ÚTʦJ=½³ØÜ¹‚JžcÙ_îb;à4]£hbô¤”BÔ |œkɼ±„Ë“îvJfñ><ÆÞU#Ïà“êtegÍaP9 qãJÄù“SЕCQš2Dk£˜R‘ôQeC~g®OàsÂåfÚ²æv¨7#oêw\¥î3—ˆÌÉÍÖÜ*G¡ x¤;h@‚Hiu´®Ìòûƒúñ"ý•“¤lÅ<¦5PHat†c™W,ôvYÏrQç °ˆ§—Ξ’³Mœaá,¤¸v …6üõ÷]9I…@ö9÷Žx)ó¦: £¾†7¸³ÔæsŒïLŸm˜x¿q"ôŠC®®½G¤q¥ïqƒ&íæQïþ’ðTGtN舚랿XÅù_òwNcíküµ×9á(?õºƒnÎ$ë=µ4!;³ ¹ìµ3ã}B¦%"^™FÆÀ0–pSŽ•÷ZX‘~¯iœo.¶ê~Œ3õ/5«<ˆ³0ÌOI™ß¥8Èå>ay;CQÔóïêEõŽ©rEUÈýDeQWE缬*@¹X„u5zN—ñ`¡3Í3âáV …¢Ü•¾¿.e¼±¾Nž¤*ä#m`’Le Г¿÷Æ¢÷ ¼X” v‚•XÒÑžÁOY±Í»ü–âfÕ^§IWÿÂ#_ÍănM½ý/ùÅä£Õ= q›fú ÷¦¿öü>¾±›áy¾ÃTýì`aÕ Ž¡ŽºŠR§b‚WŒ%^UŽX¨¦Ùs°jzu °”„;ÊÉýö» ì!¶àµ˜Ð§’JOþ!n Ÿ›ã±ÐX¿3WÊÓö¬´ÌÞ~=…ÙoÀ7µ¹”Ÿ KøPZgº?¡!R94ò¡xä~¡@Ë¡§ÐÒìçL£C–L§Üc _cÌ÷éj.‡\›Ô¦Ù1–iAf;°”¶ TvÒæõ‘Ç_-knØ…6Û«€óÁ‡/éùªæÈ,4QFg‹Ü9V—)u¿RôbƉ²Ù΄íôô‚½d|Ù@²¡dNÊ*BͤŠ\z<žÌõ¯Ö¹UòÌygwÍ0Ìñ%èt¢´L9Ÿ£GîtÎk6Õ*«½4¾ŠGá¥y¦É—F7øVOLÀoYÒ‘Æ|!ë‚UÄßQ¢é†û;û°ë©¥niã©|¥‡vŸ”$­»žÅé§B_K–5\ÞÁ0,»Å‘®‰1[³§³ÿœ(üWìruS•Ëᣎ‚ ‡à[ïÖõ³%®<ŽÍâ }ÝÅx¼r…v.I†Ý!“~(]þ¿9q‡²‚8¶«<Þ*ëÊô‹´ØX±Yÿƒq¥ ð¾€}(öÌ!å“~,¯˜•xS¿b‹ú§ˆ™BÓÕ¡P“üíš)·‰/±{ø@ìB¬ :Ô9{ìt¹2kÔccr,oÜ|x&Í>ï}»9mDÐ5OJ¯Œqkí€Ô ÎÕü‡zêZM‘·!ø¢8ùÑÀXÝ»­¿æ)Ž7c­‹¼Ñ[pþ–Ï# ùµR£'3Jòú…/göÁs¾º?{.ö¡ÓI}«¹É|¤ "µ”4±ŠxFºó¿,"öápKÚ¹&à­^žÉ¡Ç.ú.¢þo2À šÞ±Î‰¼Srç6‚ýHCµšYþѱ»joSÈ CBx€0Ãxofå2#ÊYÛòƒPX(~qÍãÃrM%ÌFÖ€?xǾ|¤>׆5ÃLlņLñÿ(¼žQiÿ,U¦Ž`¸ÁúR¨ý\²sñ`¹8CõÇé:%ÔYÐBó® _D¨\)ÞŒ\ ÷cá§É¢¹nVêáŸËP-T*K4Q©=”“ãý’ùŽ€žªj’"®x¯WòèÒ7úl3pŽ5» ¤i¦*ÏWÕ‰",z\ÅÐrÃh° v²¢kŽŸeè;›ß:¾M]Ô(•ª¢Âqái•˜šáÆvÎÍ^BR=3Aœô=íð$¦£\–jŽ/¢(%|}Ça"®T+ÈI¢7ßžÊd«¾J{ÂåÐE*VTS+=øÍ¬ß‡ÇÔÑñDž.–%Èë7Ñ¡}£Š¶ /ýÄTl›Ùš àÛáÒÚNØå,Ägp¡òÚ{¡D’¶” .ˆR-æ(‡’¨µL UüV“W~æý¶±(€Ë_š¡Pc#ìË)¶¼fù––›ÄÌG£.rRxýIQßxk YPÇ…Fÿ¬”¥Ã =ÀæÆ'\#ƒ‘5¡ÙÉÓbÖ ‘ :å‘»V_úTðÙš)1¹7]fÓqå¹σ)òã: Ü,<š}ÂvÿEV‚?Ü£Ø÷û†ðµtrbgHŒÇç&Óà[žˆ%•,2_Þ—!øˆ!‹Ø¤ƒ‚­yhŒy¶Æd'Þ›êö Èä÷>sÁs´\é4|ŸOVpÚDNÎØ €€i@ÌÉñæ‘5 ƒw¡è,‚mZ*mKš´Í1áuÕ)“^$ uL©’lõ Íj#æýsQ9cpj"בL©ë^bÄ×:WÌÎ{kÍŠãhO§7Üìþ8[ÔµÑh„‹0S]’ o4€½úý&¼ÎÒnŽQüµ…GŽ¥8å‡sj'I¥ÚE §™œ^®8bÅÏÔ½Ç^0õµdåüPe¬³]eAs¥ŒÊî}Ó¬öþÞ X/8|+·ë…¢Q_Mª+Ì› ›‡á& ¸sy•çK‰=é²O0Úð*Ú¾ÔȺm[)2_™ 1–¶(âäãªmãªîwì™E<犜ÊÓïÃ×þLÍÉž‚-ýµz+ŸÊÂÆ­ÞèÖ>Ù‡§¿†;Áù¯È¹¤ƒ…?XpFx«FCè´ŒX¥£å&‹;Ià=U.øhRuDÃñA›øë34ó#‹¶$ihÄ8–°qMë5Mß®Yh5$Á`©°’+&_[ÍuÇ\ri§‰—)‹b«²QV¶ÓÝ4!ê@NiñK5k—(Y©]Æ´ïRnŠaVm<Ž‹µÊ]«’} óþŸmPB¸\gÊ ªð3„˜}óƒYظKøFþû­˜XF¶ ™Wc`ýEB ‡fæ–ŽäÅ4¥Éax;RQ´|: 3û*FÝ›ÒMÕåÊ; «™LÀ¸T‹i¬T£Ä$3I”=Î&àƒŸ®¸ÅBwø—M×Å! wÝ´b ÿ^[ ñÑÅ4=´j$4¸}ö ` ¡îVŽv‚dÍ ÑëR5X¸¢M«”ùSèݰª hj²BMoÕGoé΂TüqÐF3ÕœØÕÁ³ç-‰gß*n~¹ðáÞñ™¦æ!í*¹. £•†’”Š„g©yd­þ›@µå¤L«Cš'nð=ù›”ûOÕÅBzý*‡ñXQUrzHç@$*šƒôlU»xù•/ÆÂ9µ h.49„œH¯Gª5·Ä¿ñyB&”BRZMô!V (e‹5å¼Õ!Ðkž8,?®,º‡¯ ´ûŒwAÙ=и=µ”3䆗5ÃÊ4q6Ok ºî²é~-Ë)pJù¶môדZúOŸyÖ(¥ÂQè%MŽ#T/'ug¹á°¨Ûùè/ÉdÇÙšÒó^Sný‘Ÿ>¼ã¯ëH,÷‘þ³Íƒ¬m4o‘hµ Ÿî©$ŠìÉ+Z X)¢¼ñº\@¶Ý7¤$¸ÑOÙPZk'à’å…{8ß;ê;G€Ì{èË ú EV‡ø —P`vbég›K$ É|‘)™Ûk¹ù©Í$‰D$H,•”«¾í¬î„uÜ)>]aÊ@„?“ÒþëäYÍì¥Á3#Ûd‘Bü5è‰ö¥7p“¡€e>@âáÈP<£öû²…­ƒU÷½Ñâ~Jú{=Ð^Î@æ±#u™ÿÒœ¦)ºV”±yo|½RÏ ˆœå÷“ê}æs–ý6þ²O^òûF'ä½bÔ@­ÐCtÎa:ÍïV#•<-D«¥‡‚  úËÎR?”ã$3ëƒ'y0.æ•7À?e·J¯±''¿YhJ\{–¾„Écþð|\ž°á+ü#qT™Ét<µ~`Øo©;¡K§î±hQ{t„ÿ×µ¸ç…1¹ÊÝ£zºº}X$÷§lž ½:ˆAó<ŠÜÙyƒ!¡œ¿þ?°.{ò±»*»EßÎC:}qqâöfï0  %ŽŠ ¯Œáˆfö»²ÓQÝ4™O1½ÐË¡ÀuïCÝå똔3 G/T6Agå¼çc0ýݺ÷r²eM;4à!ò…ª!låazÛŠšåYõ6èh5ìûºÄïZ „}ÕüX…¸<ôõGjC)…‚| ½ ÒÛp£a˜X–›;AÝöñ®Ó¬ HB|3Z¼cuÕ´¡²˜2ª¸Q•µ@¤ê˜?‡|Y–í·&𑇹î:U©á2¼8#.L9‡ã“¦)8l°tTÛΦ­|e3!öŠNW%†mòŒÎѪ µiS3¿Ì^弩Lü¼pã1±8¾÷P$Ýg+ñõA9Nõ÷~§cž±ÿ͉I2ðd_Iâ·ÛÆ«ãðHÿ}‘%!-‘·¨¼öWÆv߉—iq6L­Â*•îŒY‚oî8†J­;ÕªXÜ;[ĵ•DE6Ov¹é?uÏOÁúz’rH¢¸ Ík£ˆ÷2øôÛw!­Ãìð)P8uöÂäJ‘¾vÚ±Ìðk_ZB¢˜Øð±éîPNÄ3~aÃ2šÅ…@Å^dt«"LÿR½ƒ_·’þ´QèŠB7ÀâZÅÀsvÌHÿü ^ÇåŽë}"*®–J0Û‘ç4?ºo¬*çð ÑÉ þž¾‘‘7Èç_Y·¨."yd]=O׉Ó€8-ªºDf;£¯QVƒŒŽº§ÏÈC—€HÅ´íœXÙJ R޹§˜«ìÕ Ÿ}ÖᯈiÀÖç-q›;š"?ª‡…„Ú¬ŠÕŸˆŠ¶M¡º`ÿy]Óþ«”ˆNÛ<[ú«—$ .p„ç^9¬Æü¬m#9z­ÎZM[/Îå ¶”;‰çØm¨%J¼Íƒ’5•†bÐ@ö«Šq¨#Ó€‹ÐÂÁžÖ!g£G¦dÑ@=D‰®^©SQ"î>À>ï7×FK|àX6;²)DNçC³£>À7…ðª`œ4´" ¡€FñÇ^o2ÄN»;Ïów>œ6¸’²6T‡ÉvÔïÆ0犫Ñkpƒ‚VäþZlÕ£õ7¦zÏÎÖ"5´+á,±=†ŽÏSÉ<ìLCŽH§WMøZ\âðJ· ý mu6›ïÎÏ0ê¿"0 Ìk „¸ƒ6‡ ‡c~t´ò<†Y¶•®×æ’x×ç'УPbC{Of yhçËípùø_™ôH<„-¤ˆ©›«öïºAßZ‡¼è Í.béêU•Úéß ‚A^¤(ÓˆφOFa¦ ̦ms¬…v5ö¹5¹HïÇ÷ª´J¨•Ü«·ˆJ‹¢—(l…ưû‘Ä kÏI(/‘äÉ" ¥ki(7tcln|É~»äD¥fkŠÛæ (rWu•m+Ÿ¾nÃäUž©ˆå$l££9FP{Ô’ŠÈÝdÝšÿcîx¢}AÞ$ý^Ó˜Žï?“xd¦C;²ÏCŸÛOÍúo0ýQjJ@d¿xÕÐ :BD“ó‘xÞß»ÈÞ?±¨”ºÍÁÔúÉŸ|г‡…#‘mÙ£;-®÷Ð@úug_/‹€Ù˜Ê»}Ú}Œ^¬6L“¥ý gâÿIŸS”ŒTBe»1{h.± 2¹êQìc°¹.º_·6ÚÕûõ, ÁÁ¤!~Ê~”2]ꑬeËøz3e¨iïÛBmZ2&]*ä§BYK~¾>ɤ?€‡‡ºïX+Ý3 LsdXA¹3¹¡NpåÐ üb À8í5š°p`í@Šÿ}P ‹IÿÅŸq ÷ÛÅ“ÖÐ+áZBçÝî›~‘ÅÉØerô_e×Ñ·k_d«!õ7Hr¬)å4Y¯Š¦ÛJŒèÕ¶.Öbéƒá4oK ­D%•õ©¾èÞ½Ú)âeÓ ¤2Ž›Â|Ï¢Ú]ì"Ô½§ú|÷quYŸ~CÙ]ªsÓ2%iîæÑ~• — ¾âr£F+Ô¡þÁÒSC´ö($€k£›°4téÖ«BσXÝ;FƒA„`<÷2{5Õ:’†âÂ;Z-¯Hí`p±¾}>[•cÐËV¦ëkHÆRÆ‹%¶6ÒeßéÚ]ä3Ç¿,È“(ºè/¡:\ð©¡C¦ËD U"í@K1T^ÒݺKÛšÕX"#Ðp-^ÓžNÊWÎ[Ë“ù’©·Šp“ñ#A ì •ÎíñwFIf-&c}j>#IÐk|œÜ™ŠLêÜ3ud\_ÎåÓÍYKÀN„µ†M¯Û1|V¬¹kJªÁH:Íf~þg.Lyiň•PëÂ2z"›'| nÓ|u0€@­Š£¸ñ_V‚8m×/è|®£¨õËKdL!ñ XèÔ¼4¹YÄRÌN!=¥;ó¦ò ð-í¯6Ä­qŠž¢ÔŸìÔ2L^?Q’ X„±1µ@}dçkÏå†åþˆ=­¼½s‹ñhø2ÃûZíoè5„g²gƒJ) ópä>è—fÅI–Æ]™a>Ó_©“_Ò4ÆÓ=Xð`ÄZ0 ~gºMvÿðCá±è–ç[Å*ËGø8(0aknWY„ôyw6ˆý f÷†ï]šØŒgkáR&Åä99D·Ø¾Ö‹ÓÁÎ\¦j¸»úUt%ñ’#Pv6ÏpG '·d«™oè55X/i#’4á/áÝdª¹Ä-ƒ> k´ø¹°RÎ#¸EV}óæl͵¦¿&_3VÊ@ˆ?ÊSš®eÎ8êmÞ ÄžãP x»>®R‘6–‘Í`Ý&'ÞÝhä^|عmãêZÎR€šÿU¤Ò‘3UÓîÜSv¨^D®˜$= öìi1]1u©,íß0æe·HÔÙdq“±3<Ïx|ÚÒ7—Tí@Ÿ¾P¦·ƒMߢžŸPú¨)wkoáT6æÿŸàžÇ&© î‚wAiƒEƒ¡½R¨è®Ïð+ß"TøÎBŸþ߀=Ĭ h*͹ J:Øòë†YÈeâýª›$pÄè¥*dž [.Þqú¾†K[@WÑŠ+?“&ƒÚ-ÐYfî¼J>S1YJÉZCwÍÔº+¸‡o¦šöï.ÁƒÈö‹JeÄ~IÿXS++ ð¢žÐ'øh¬Ÿ³+Ö”A ‘?¼û43–N½”Vr0@©Q0ó¿](pÇê¯9Þú¦þ¬aIJ« AÆ«˜æF*ƒK#Ó®ìŠù|’pšBYÿkÝߌ[nhÂñ…î$J)¾§$˜ZË  ¤…8„kÓsGD—€£SÝ$$Ô R5p £í£ÿ©¸X€¡$ržXÑkµ?â[€zH‘SMþµ>©&Z·ÒhÓ–ûeÜ|ôž›y¤Å;Íw|íÔ#û1iÀH³æ—XýN6 0˜ 5­Çžô—Ü—Gš¤UÙFÃn0òÙû—" F/¬±µ¢£UžBˆúÔ2÷(%›Lj,â+k‚ö­ÔÓ°Ï“íŽëQ„Ã~‰te”|ìøýj4ûïá˜d=Dœ×®:J²Õ!Ç€4T·äãÂXŸ9@/„Ó¼J8TÊ[ISqgT¢qË…þŠ£M¯k”Ô~ Öß÷ ð¿]@hÈýÖ¶µ#”Æ—™g)ì©X.†5Ûí´}½Ü{¦ÍG§jÕ¢’M³tH%ªÉÖ·HTY±+L¿ëG(ÛW£m¤F:Џ{–#C3íªž"#±•1ý£·Ä³æ"kâññ1T‹é¤Ì{&+X E}-òÙ´>13ÏÒµ¾]&:¶Y%[{ (“™Š$U~¾d3Ûê«€¦ý”zÑ,açáJÊ)zë¯:’wA8/¶}M÷À—‡›¤NäêàžÛ­`c¸ìdoKÁ¸÷ñ¡C{å2¡Ø_×Ç»º¡¾r¤¼ÇOd åôè« ³«aö¦ŽÀ~mLä²x@>…B§~¥2°÷e#É=ó¹ ‡I§'ðCm½;;ñvóŸk’2…H÷Hq)zÙ'ú4:$›4î¥qs±L4L )½úˆko:LuÚ2ÉÝA0£%SA[Ò¼×åiËädÈË—âð ¶ö¢ÁtgQD܆í¢;¨Ùá˜x&¹îåA€žl $!ò(Á¥DsZáEÝÀÁ[ ë¹Ú~!Ó ‹ÀT jèØ‡]1ß LÑ:`‰›ÙžÝèmX¬ó’hüö13‚°jÓQïãà+†ßuÄN{óyÊþ;É÷ Pp!ðg…à‘f.‘ñ¤¨®Þe–ب²£¯Ù´ŸD€óÚB$>7 ÆKϤöªG­þ\„b,>m”fG¼ÊÅñú««Uÿ’‚¯íÖ -¨ÆÓÛÙÃ妹(Û¹ÛTÛÇ2§•€`†VŒFߨ¯×”øYáŸâ$¬áUþéÃ\qD¿Y7y1ç¨,2jéÂA,Ðñ-dÈÙü/«±Ã4g'9ÕaÕ" uD¸¿¥Ç –߀æ%º7àn”A£ •$±]–{wº¨Èj±¾äeQÙQíHº%Á‰îD!ñ*T ‹'/_ÈÔ?=ÊÚµçbæ¬ck]÷šÁ'•#0ølà ±÷ØåØóu;=Ý»ð–\êEj6‡$5»$ãYŠú¹Hý»Ì¹ ßË`¢CVq“=à ´…ØêÀÄ2@ÿ+i¹A΍ÆÇõäÅšnpZk°;)) ¬2™†Ñ0qŠüÐayX–z€òªð+­ œìÃÏ !œŽWûh4¯ÖÑóZEï¦ÜBbP̵#®÷kÁ”­KfvÑ¢wâú$˜p3b¥lœ5‹¡‡@ÆÊ¤…†=˜ãËæ-Od%¡þHþ-–êR_–#ó@f Ú¿¾äÿeXè6q±æá&¨D¡Ø¦0ªò°ò*Éç­MÐ3xEî àä[ö1^Y¢Š–Ö‹Qƒ6ª£Zp<ü´=,0¢¹HduÇB‘^>fz²¸Öf`ˆBV,LÊ…Gp´Û'r£þý,VB`›«5 [-"}¤erd>ªÛÀ k†­x–á²ßôÏέ/MÍRÝšX'xÖÈÛÁ~âAÞ ´@Ù|S®×0EˆÄ ßpÍ©ïÄs›´µ?íº†Ü°žj\GsÛÞlù|{ã«a@ã2Ï* w¨I¹P—®ïí¨{zz{‹  *ŽUð+ä(øŸx!yXðcÛEjGõåQ~0÷-†,£ŽE³PÊŽ®&òacËÏJ¯ Ç)Æf›$} å zë³+P‘¥9yÌ1lLF>Úæ)`öcææÖϽeà?Ó7Û`¤ª`Cv±"P_Ã' o²é~ ¿¡!Å9½• Eyñ Þæ*ì×ql·ê¨0õU5mèfŽ–Ìr;w:>ˆ› l¦2þ»QFÕ“O/ýŠæÅ] =`íöº]\L øÃv6G[R§¡¨%¦Ó§<ßR»/yßÂÍf>ŸDG©ua˜Ð\o†Å‘¿L :õ=Y¦rA Ù¿éfc§¯O ƒ›Šbž”ï²-ë°ÿÒÉ€òÌb)dWCOe“1Á²Çô¾¨ú¬Žò~ÍÂ&›ÃJf WqS‡ÂQˆ»1×›oŠÁQç>A¤;2~9z…ì¶,ÃŒDaußzï!nSöÉìð5Ý­qÞ#í]jÊV½G£ðÔµJ Ò|kn¾GŠñµ ^Fs¾*y^®2»DPQá”WJÐngÐ_'c£±ÔÈø—bGŸr*òÁQ'~¥øÃ›âöeºïêö* {Ì’WÜ)–g Ÿë-êgA–ÿ¼‹d’Æ4«U‚?Ñ›[6â!­g’(§ú ƒÄX†Zöy®y‰Ædc÷ ÓuжpÞ– ¦8Îgòˆp~3 Šš­™ƒKØ3áÁ.¤hxŸÁ”+éÇ=á> Ì1‘A[bÞÂ÷Ä?<Îl‰Ši¨Îô­[–ðràôsVÍc޳šh·»O©79q £<ȵk´Ö½Q–æÆœ#Ü" cÚï³Ðù}ffÌrÖž´¶J¤ëc#Ñ¥æãó^I¥kTÆ'?©7£P ¬å¯ãÖ'åâcV´Šh¹jºQ€”>jbEÚŒôö€7w—–ò+4ÊÅ^:ü—ÏX^=és ãõ€g‰Ñ·m }uå8ÎÕÀc'öìBB‘ØS!'O ëºÔr6;‹ò7Ù¦·°Õß{šiÒ¦=¼h_£©L²Ö j‹‚yù¥óìS>æ/Ñ€‘a’\Bs =´^ÚqšW%° Éf€Úí§^-‹(,à¡þñÎŽ’p—ž ̱õ/à); +þ£ßO€@DYïߘI°i`ƒàa’;z S1™›‹§‹¶Àdñ:ÑnC¹Í+é{f“IK|«ÅÐ÷òI¼îÜK…i7à(Ê$®¥YڱЀvEÃ>›Ñêx^o_q£‰L°ïP·ùõì$2^ÜU(­®”×”mŽßZd,Šƒ>ÐPùõƾáÎÜHYä;- ‘iÞQM¦—ùŒº®Ááç!Óœ0ËcRìþ¾û¸…µÇ)$0yr‰QW'ˆe"蔡 ÊÊfWРm[§£ËÕxsràzô-ÂÐ(÷rßaxž|帹¼âM›YN:Í)3«º¤˜ÿÍÄ쨱*²05û)—–ÌŸr@„N?[|>b ±þ4fjåÏšäÐó ;ÃäÉ茸á4ª%2‰°°LbÅUz× ré}K›9­xÍ•I•—*mµ[Ë•¼ýóB‚ÐξúÊ#Ÿ»q/7˹%WÃØj;(ƒè$Ô`Û‘ñXmêh;O½xSJƒ«Ì‰eËßPjÇ'ëÃQ÷¹^Œmwtýç)2âÒ/œý>ÂÆí¬Ÿ+ôîÏó°RKÏçišAè[:kË™ø³7ƒ°u …«-"Øjz¦¤ Wü·@}®ÞBû’aò8/‹Ý˜Yß ™†’NèÎÄÏÊF²{´ÅĨ:…cih'¨>6Äg64&´Ôd2t}¿ÖªZ좦j—F‰Q`n¢û8sqÅæÈ"†U÷Šg–â‡×©¡¹°,Úû~ʧDìÒ3‘e6­kžý¦S6,\NÀ©‚˶9'}lòÛ~B ·Sõ“ͬòÃëÇ,¸¥°À‹ü€ Ÿ„ì‘l×.h3éÔSô1 ‹˜eØþxPüÐb0õ°+ùbCŒ3#vˆŒÝühƒSömž`lLZ| )hšh}’ ‰RÈo§-Tvü,H çÊŸ,}Šd±V&x’§$N*x®·?í›îÂ69>¡㟬­Š¢*üaÐòx8"TâZ]ûƒ*Ž”‰…Ä=£~-ûA`¡ó–Y³¯4îZyã;þ–Õ¯w†B M(¾¹†üp1¯CÓÉ ~ÄܾÄÍ™÷›žêRÌã¿:ûh×`ëœ HVz ¢ñèøçdQuÅÝFú1{èÐ\é <ÇèC,#Ù¼®¡{â¢pŽ-~õ˜ñoH=~ÏP¤žç+È®Žî¼"GäOúáÃNK(…¢ŒÐÿÞŠðóîÝ=AϲÆpTuö^*’fôót§ÓЬ˜urz´–¬a>Æ!Ù…{:-%"MÆÈ®á6Äã&uiQØ1¨À½"UÌé`7üµoäAܬ¶J/å[ÙªÚõÿZò¤¢gT¶¾ß¯—dóNÏ{ûX‚¶8@zƒ®§•–¼B@á2˜Wazb¥Óbò‹¹kE/)û TW!ßP·}°‘ÅCàFHÔ¥ÿ$Ħ'™ ™œßÇåˆ%f7•(Á"=ƒºÅ…ÜL®Š‹œH *ÜÙPfâÓ9Èêä öVFÙÙU¿çû㮽 qffÆ'ÅbÍ¿, €‰´BÖ,sóf]’€¾^ô ™·o½ §:Ó‰:L tþ5Åí?¿›Ad´“6vçô•VÿtgÇëô‡ïË–¸vˆTY¬&Ëוz^å0“Ÿõ4Y…Q~=à|¢W”4‚Ò?åÊUùaæmí…̵í¶8N(7Ï"’…]ã#HМŸûÍm¹í¿aÉ…^K^ÀÈÍ¥#)§2­ÚðÉ 7(2='œC*¦+‰~J-Û-ü¤³‘þ•åªQŒÎF­U\O&²¿ô ë£Z)l~:Ã9&U£Œ¤åx`aú_E.V ”öñÿÃGü–UGãzCKS¢1I}wž² ÌS“lÓ•¬àyÛöÈš¤û\áTÓÀ_r¾Ä^™UNô;ÿn¡Ähg$?¿ë[@bBÂAüf£HHëpÈnôœœÏK…#Ó2ƒþÛó}|)`5J³ûÆÖ&× œ@Dp\ñ{ ­ÉT^ɹôn¬]¼Š”û",ݤºBÕ¤Šç%ŸÍNÇ_¯vÚ . !NÇÈ®<LHß²'‘jìYñ;S­²)?ñÒ4ÔÏF²ïQ”á¯B;3… äGMB8[3ûÁT`í¥[3Èôö°ø¬TÇ‹(Oæœ7 µ\Ú«†n„Çø2£/ ý~Ki¶ú¢:Ÿï<¶Ã,dya+ʬ˜¾^ƒ0–?¹¤M‹:>ÿ'ãn Êéʾ)À—:¥ð*‘`a ¥†Í[e(¼–Ìæh\IÑ3‹tVØ[n¨ Þ/ÔЬH°ðÀðF| ÜÅ‚«ÑIÞîx iÒ£š¤HÛθ£Lɇ gì(ÇL äÙ?Œœøf~î1DƒºŠjºà3t雿××·;akXÕ4Ëi¨/äî· 5(H™“K û€E†– ]9"ÂÏKŒS.*ƒìÈöR²Z¤×ÁƒÅ…»f©9Ò`Wï]k†ÍÕ›!C²þ¼g Ç„±À‹d/Òxê6DúuþÖ9Ù+f.œQ;;qþ̦g}3]F+gg‰º•^G½Uó”0B»“&{è×q¾Ðe„ú¸†ŽšA5+^½÷K¶·9ÛcÚ]¯ é>6ˆ$}b‚B’²Hç‰wÿtΜØeLT)§9!ÔÃ0NŒ¯Ê;;œ*Óè]ˆOêW¢·ôˆÒŽjýQT=x ö~ Í«^P+¨9Û ¨ ®iJ*ˆ6,âIH¨´à)è¡Ö0~iOJÒÂËsqÞnÍô³š÷>­Cù†[á›°ð2ù×(Ûçqûò¯—Ôý•ÇÅ0ñ”»ÇÁ/Ÿö½Ä)@’&¾D¾FF¶®})WÈeƒÌñzø(ùžëÎ1›)öÜeÒCº0VîçýšÛßÍ™3ùN¸º3_.ÓÀ´_à і䋬>¤,‡àSK#=”+”2 µu®ì¨ªÅòdG< ]wª‹9þç\¸ ÒŠ|AoH°ó„ÉÕ õcrŒÚ=ÛQhFæézõÊÌ¢‚´*6(çÌ8E÷‚ªù>J )Stí;|ì˜ÛÑ’íJ£¶ën³SBî[r†Ç§;*à q\³h$+bù˜²ûhè¸j| dÃä*º•šy¸ ?†Ïš;-ƒ*ö¶´ØÍ»Œ¶oêsëú#d'ýé¾)'$$àwEy²(Ð_·L˜äó!É[~'÷5,5þÖ¤„L<^Nõ§JÇxç! ½º§i~Ô¨P>‚$'}˜ÿÀ Í%-p¸c¬à¨Ò%šú¸Éûj£D!pÜ]ÏÑoJgåæ‘ÄÿÓh4X‘â ˜D¸˜J¿í‰_có‚iØÿì­”1[wCþÇ£æá‰u“UìWî‹÷Y¥\±L]ýaIK<þZ¤‹3 Ê>™½×…½ÂîH²…¶ôë‹ÇÌq_2Å®a¡ñˆH¿®,„Úʡʦ ƒa§¤PöhÃ¥5¿ƒ•Ê‘UC¸žå­Ïö+AßîBd`å}Ò•ô 8« fQôea´à%Ž‹¦1}®U c†ºj¯šÃ‚ð|ü0ÕŸÏ9OßÁnOûˆZÛ÷ˆÿÑŠœØð‹ýÖEg Ldb…X"‰’&:aFÜÊwZ AoÖŽî– Ešµhè¥ÙVò›„gÆG¾æà| ’:ÖÏÉþø¬¸—wœQýOYÍPú•펛µ¡Øç -€A6Ù­MY£­+èxÀ½djkêÜû¦Àzýa©aÔI«ýÐtÍÛ 3â¿S,ÓÝ»E ÌÕ„®i*F‚µt\ƒêjS l>~ñZ…M±n2@"èv ã~t“Ì>KFöÎ 8À\”¥TY‹Í€0Ï^߆þÖèŠM°¾}Z—Ã[Àç`™Ek-gÁe˯©¾ó"LöwÖ¬ÚѤ­mÅH¶«â6åãatUX]‹ã8(Nž’Î2;•_fÌ£À5ì(ç·ÕbÁÕÄ›ju:êŒ á®9¾yC»üTTZ–Ç«ê°dü,q;ñ²¹°Úzæ¡ó}ZY_t3­:_…JUÿk½lÆø[ ”¡Þ317XBî-9a¨?SÂJ`AÔ—í¹úë{EÑ_Ò0Pˆkw Q‚L`½¥BTt7mža_8ï$>›»§mIV÷ Ýфϱ¥>ÂVI ÊÆAøíÎ1 ¸—)B= tÏ1ÏE q°È†Ôí9•똰†"íFÕ¥&¼ß¸é¸W]7Ϭӟ@ã`/Ý£^¯1È5.ÔY¦Ú¿¬_™ö‡¡®`=<Ï’ƒ› Ç.;ýl­õ݇m8Á¾#ˆ–w€^:´BÏÙ¸¶~(jðÏŸõJÖ€÷dÒ{yë?‰<™­Ÿ†Ïä€õ°ÄV*­Ë8ý‘éX*³ÌÆüíÓæ‰ÓüÒ7^œ]ªÿñw¶F€º¢dì%‡¸ªK‡#†p°dÜwc{²'R-70І«’! Y*qÜ+›÷p<ãhï¤pà“`ú| ¢qt˜Ý:pÏÁc£Žž6 š^CPC7³¯s½AJ¹CB °Pƒ?¨`Tù/­M‡&¹ÌA%RÙfAM´<;Kð"Ô€±m—ÚIˆ°[L›²˜…ñ¢`A´Z;M?¡1â„o½¿ôTÿX7B¯(_Y¾Jý\©í¹” rˆ£Oßøßó¼QqÖ’ÀpḠ¿z5rU1„D9øÃ'}ÓÊÔøŒÏÄáÇU?EÇ9×ÅΧË3¿•è.ÚµdþžŠohއñŽæTƒºµ×{ún“EÈÓÊ' ù&õ[p±Åg^]{¢á¥;‹ÄPECü¹è>4Eù¸Ç¿@ÜTÃÁÃZŽFíÈojÆñ’ëè± âÑ(Åú,Ð2Z ™o”.¨êxÈáÙÉ Š)i<êðÛÐuøùñØi…%&Ö½¡2ä• †›yeåíkp³WózZÿ48f•{µ6¡žµ0ô®÷IÆwîh×ÃD~üR'2.ù5Å\õfÈçÿîŒÄŒRôså2:(0µ¨ù§g”q{Éçù´Ègž:°kÏ e6tVý”¬.oÕGPFU]¿„@¯&nkk¬†¶ÐQ|”bk­vx²§¡rðÄ) õ»Oq÷F0õJ| ÷¬#±/Ôà6Ož0!ôdåUþùzÜw¨hP±ÒK]X¢úwƒÝCa¯¤]h}*-£=à†¤U/µ‹6;¶R°Lï+‹ðæ†ÖQ3àkÍ\Yî't=¶$ˆVìêX¤uRÅ۩˱y·ßI ´´zCÇp“ÀÞ/†½B,ªƒÖƒz¸¾AmRÇþÕ4i'¹ÆÜs¶.ŸðÉ¥F?åÇ/¸•}]Ž´ýo¹ûþ©nâšUm£¨Àšg]èl¢úƒl±\#Q¶ÌX-}­,µàø¼ ¡í•èÅd[Ix7¾¢¹âÙù á‹ÖÍMµ µ9Ó»i/Í+N,Ó9žÄ¢¸BãÝÕ6· ô¸­Å1eõÌ~‹”×b˜`T!ˆŠˆ/¢šúôÛ±{€ÕC×y*ü3fÓ_š‚ÚOKb‚€:sÉB¡¦¯o^€þóž§$¿WA¶ÏJ ä$o?Xð¸þl!dH«3¤+’¡ÌÝôù™JÁ¶¦`ùÒÂãŒWR}Öð°ƒøÌsÞks`–x²ù¶²Ø³­ûL ‘v[‰8¦UÅõ³€/Óæ·<,ï•‘B…üZù7Wø‘°Ö¥)&B¨íHaI þ…6ã­ öužSÄøöa•:Dœ£åÿü.†Ò5û”¨kBìàámlÛé1†IÚT¿\oÀó­¦ëô¬£Zî7G:"¾Lž¡‰™ËÐÈ?‰€é;G;§Èès wŸrª¬ˆÅb‡œTÙè-Pc®EÚÙήiàÜÎ|. çˆ#€;Ýõ Æ38^'^7õÿ}ãÕ6a2n¼í2|î"…ÉK•×°,–ž¸áR˜·øþ_èÅ*R—ÐV¨W2’ö9Ërî ¤¡¡;^•†q åEu2 …¦+(Gß§¤tõÔDËñ;m‹¤g,YB‚yï8ïªÄËÚËAŽæ‰¶yªÙ6x\JŽJè ó8-Þ™<ÈžÌ_'ôÂ×DHô»b„?“Aè¶£ S¸5ÕÈ€µpM'9†¢°´Âþ KŠôµƒ‹ œp34º£{^å]iå°2eý<éûØcí)~¶ž— ÿWi§#}ì{Éâò²e:WGw•&û£DÜß2öTï6•léøIåÁ¥ t ¦M×(ß fy—á”—Ë©R×;–›l-åVð/¼B•ÏwO¥óé'¢aNÙ”·ˆ°ï|')çØùlˆÍåW”zŒ»SñßÒ‡·Zp;tÿ:jGÏ]ß¿ú3|. 5X@;O\±øåGmȱþcˆ¶rÁ‹?&µ–‡½¦ï¾RSÑþ1ÌÃDÃe§E"֠σ¾oíǘkŠjSrõVóû'zP*TÿM¾’3nõT>¢1­,[l½ßº 7nÔ«©¼Mø8^•Vûe+¢Š‘Ô3«Ï·ÕvÖÿ¨Ó–X(¾D Ç(=~|~eýÒÊ7oT}í]@‡¯Ü%¤2ÔGkzC$’)gˆ2ÎÝYÝÑLtݳ 3+[¢w³dk ò=ìLj¦ÐJýÞE‹#^ŽÑ…Q(`Þ¢]Ð\]ì…wðCã:E'ê7Ãìu)Ñ'ÙažÿʯxÚWëÉA”m„2é¶lÚ‹:W™9è >­Š ìÂ$yLÒ‰ÞEŽ5ªÅÕ öW¿'0JöR䃗ó(oË­nôyï=ˆt'ÿ´8iÂ×£^”{alŽi \þñÐeË–3í#ÿmèB9ëtCѺ˜o´h ÉG®sÎx×Ü>ÁÔ…R±ìà ì"£È­­ÖM׉ŠC¢o¼ÕµòºùUÄÚw¾³¥1w£Ï‰7Çí,r Žäax ÐÝ—¿Œšæ·©(லÇ0QM~+žª1ˆÏ)=êàä÷–=º¥VS«´½xï¼ æß*ç$K!ØÕt!oŠ \õó˹_¿ Ïû¶åŠ?™@ÓæwðŠÒÒÊè–ƒ·•E¬ÉîäzÓ¯èÉüU( ÕÄÌi_nP£¹6¬ì½k&Sn0øíÇꯄÎ^Ø–åO>u&„yiÿBóWïÓ/h1äÒdwxzzbœ#­¯y›Á‡.?{€ŒY(Aռ̖A7ßLz>Èq›æ,95ÔBp£¹ ¼Ê©o9Ë9bøl•¹¸#ö/G €Ææ§é—æ“ÌÝÇ äÀµ.×Û÷¹À&9ÓV\›|â}L”ÃB-¿>%°Q›Ïm|åcþ‰Í‹…æÑ¥+àXšIäZÔ¤ÑIf†€35ñ;<á%±vMЬfx÷†§FÐfưª3Že<šwÔZBŽL‘ÑicÉÈãÈç’M.… „ôH/S{Mí õêɓ׿ ÓÑØk·nãè„$©ñ;'§?üÚJäß§ÒlT>òýØÅ”vå¶½¤ ûZNúDnÁ¨~p¤‰ª3ÇÖžÚÕlþ/´Øüéo킎¼Ñû08T]q¡]¸X-áCP6þßäßúk RH¦-’š1uÞXâ5—5Я†|­Õ¶‰£‘¶ú(Ââ'¾ˆ`¸Ð¥õàB¡ô¸Ù[æOèñ|..3iK‚´N¶²¶VÀQ×öapªK+Cð£fˆÝ³ü(éOÖÈÀíÆsÖž`v+ nʇd;u_šcÙ‹ËôØõwÙÈÏÓ"l)ÝÓ,žóèâ6Âû3J¸Š¢EÓ È°|[t]2‹*Z& Ì2]Ÿ—,âýôæl¯k¬…1ø€ ŸJæáf%îœz¯Õ¡Ž«PóhڎÑ2ÖÍ88Ç8ÂΪÞŽUø©Zh;× «Å2L7seÕ”¼È‰`"MŠÙûLaˆYOØR‰ÏÜÜh Yuíό֭ÜÕƒe“-c`ù6»ë“;öl·„·Ò2 ‡ˆ:3Al³Ðâ$=ãwˆ2Ú?oЂ¨¤ 1Õ…æánIwxñ&ù&Uùcf'·ÊÙ’AQïZ@Ú@ƒ¾‡"ÜB Ô˜j1påÂ=aÒOûλμñ9e N¢5¬Åë×äRÍÅÔÞ¿°+‹³êÉP´Ô{B…ÏV÷‘%κów$âˆ!¿¿ Žl>ƈ´^4QPìU¿k"žIê–WE…õ4www=0˜k;6î+­­Hj† ÍkBwÛž(ÔÙFT¯Ä÷ꓟÉú˜2EÞ2&É+U›rx#íš(+EtEÒ¶p€—CþÌvÀm?&–vÉÙbÒ¸¾oW…Xýn‡,¶--ç)OÈê“sµM%£•yŸ ÚoG[TS±!irÜi¦¥(­þ ²ràÆwn{ùX¦ÎåˆQ_„‚kÔtJ QQâ!Ê[qáÞпԆ$á¡f qµwkÊ*zoJ3¼)[ß7w5‰æXá!Ù@i84ÌòéKE|°¸²¯Vqv™½zcLƒ›Aÿ"[cèꌕS•È 6·™5^鞀VÙg¡òBËÁ Û¾ï ÒôG>ìE^ âŸq9 _&Šå}aB¿÷Þ‚ñ*To%øa«+‹­7D¥I­ÌÓ…Äâ—ÓkkP”éyà[çÁ۸ؘõ?àU¿Be½ÁÙôgJ%bÿÁ¨®¢ÊèyiRlÕ›?~!ð¤%6²¡é¦¦$ ”þ5/eé‡ÀÈ.Û -Aæ¨B,›pšuù^äÅ&Ï%2CðFârwv KçAUKÑ" (^gïÝS©2Ãk‹àgÅgékaÔÿáö³ºVmL·Å l¢ÂWÛ”“b{1•¢ñIéðÞ¸àîr¢Á…V÷zþ7ïž8c‹œ˜Çª,Ý´ôƒæ‚h2›4¼àýTRÉ‹riÁµqºÏEôÛÅçðÔˆöòÛ¡~v÷ïÛ¡ž<èéÒîæÐeÚjcŒjøøßzŸuÐEz²'Á$žç̽ÐÈõÛ0 B¡Íí [ðôÕñ§Üß\Ws8°Êoq¯òÏ„& jq+ŒÎü5´ukçËÝH ;‘¹ÅÖ&Ó b!aṄ@6{šýßK¨g(þwÂÙ­¤ÍHŽO 7yœ9;«Gq–ëJ¥5À9ä#P‹B 2VÕXŒ¿ïä'^ü«ûaÎË|dªXº ®æh-¹gƒ9xî±7+-b¨Cú“Ámý¡Õ|!2i‹àåpÏn!¢Ýk±„„÷}ÿÙ; A#Yï ì\B¦ù ^¬·_z¡XÕPtÞ ²SÖmôS“XcHûâÚÝ_Ž€vˆòƧ¼›YC@óiŽWMÿo½®MßóUÍÙ%[c2.àLGiPЉ>-9ɬÙ x.>ƒ¨^ )‚•hUéø‚Ô[ü=Ô1­§y3Y/É1\Çp[%Ø Ž§Áõ«ÁŽ‚-Ùoâ¦òÕö¥Mjó€žcéjá|­”*à‘ëžá8¤ê5ê zµÕþRMK…? ØnáI&„æ (®€;•kv–¶äCƒXÎômÍÑÐZÔç`ð;ó£§Ùó]DOóÍê”–÷’•x©77# n»±ód+%“<'¯±Ñ–»XÍBFàq Ô d5–Ôy^n¤ãʆ9“*  àöý%›Fr¨Œh\Ýê½%ÆÌÉã8>þý¤Lþd,ðúŽ1ýóQ|ƒ¬ÜSö¥Ò/=‰{ÀM·&]'‘åóq-ŽÙÀ"Ž3]}õ8j£Ââ}ÀüI稂Ë1Ê“É1ˆ5ã¤?ãÿ)}ÝÅ>CvärŒº/8wIY›<ô×þ$ὂÁ Ý —Ëþ%cCpdj0ÐâSM×¾Nï=sŒ¡¦YÌ5÷EÖä­Öt(]É…à>j€8&ögEÔžè#i-šû&ÜDÃAùŽÓ >½7ÁëâÑ2ØJU—æªnaþ‹”\ï“…Ù-'Fb˜›»:˜"Ä ¼ø¿³öaIW"/@®lì ix¢Ùà|Khg(ø[㾚n ÌiŽè $űÜköU{eÉÝ^ó•\õŸ(g™2âáè¿äv·Âú´Þ¦ñ‰£Â&—¥ä€’ÄDÆB‚Ý_±€°øº°ëð7Šì•ÙŒ˜eš$LêÏ7Îù O;A‰ìNŸ‰‡”ÀÄcOð‚~o94_øù6½u–©ãWmÿ@TÎho‹ݨh³grŸ¾øƒ/ò­ÁJ=´’d~ض±*IÄWozžt-æ’«&ûrUÂÔsáÆ¦Áw“ „Á<]Þ4§¨Öàvè#Ð g¾9de…$e ÷j[k½Õ-ÇLåGØrÌY‰,KœI0u‹L$´ëL i§ÛT«ýÖ{nA@¹!Ýè¬í´ø`î¥@_rù4ÿP½š©ùqx9ˆ*ƒI™ ¦h°E½°oÚˆz(ñYém•æqcçÏo<(f”h̳Òòrj ’Èà×Y?[Óu¯YJÆ“³ã+ãhgVB>k—£ë€a¿Ë”²™–t?ÛÅŽïÿ‰ò çYï­ÈúP—õȸÓ=´ ¥r‡DÞ&’À¿Ðuìá¤5tRÛÂ€ŠŒa9-˜h÷0; ŒNwu‘òÉèFŠƒ)œîcÄÉÑ'1aÛêæP@ƒûTR³! ]׋ù'¹dʽÁùɉã3º«þL¹-…¨ö™ÙJâð…ÛXæN{ëMûOõ¢dm"UöØIÁº¯ä-0û¤<Õì$éŽ)áK«Éùìïu=py$á¾þ1F½n³q_÷ñ%˜è`}p³^ûbR“ÆŠkß¼~Ÿáà”bºNþ˜1æ@nŸ9†—Åñ8­Æë. w1•õEÐ[K":´Úþ¯#–DjÀTÒ »_ý&žÊÌô_<u§M•™!ô.9‹f€!áf¢d~d ß}œåбfVtOú| ¼R­’!PdPa>ÔQQåÆåÝ »)Lù”Wña˜­?Ï7Ð!{àÜ$ûŽ ¯ñbMäå ‡‚?e‰™"´^ÉeR«+•d"+K[ÝB×/² óÒ!ü´Ð´ûº²‡: M(téQ)71`]rêÏÙªOë]Êaöš°GcšG<èÝ]Ô‹ˆ"×l‘]v«þ. DÙ¾kjßêš@Ùy ÃY‚ðõzxo†ä!Ü —§ÿµùBÒ˜èÂÍ6Õ»Ö5%m„²¾¢Þò-˜Ø3ãÎþí¾ŸóÉôÍOn#òSóó) ŠT¹+¿MéJ«eÆM‰÷8»;"PÛEcuÅ9›­8ЀõˆgdK€ŠJæE¥œ® „Š/ ÒÀ€U76Ç4yÁˆÂ=Åá çV¨iŠÔãÒD¦AW¿YqìËSä×½¿]výSIm\`G½õU7˜¹$\²RöD{G¥}=¶Ü7q÷5a¤ù´"˜mÃXL&&Ѐ¤Ý°8¿Äjy%î‡ÚçX´éÙ S_ gLì; 1zœ,v„Îa/z$ÔÉ?cè0lã±óšÂ¤ŒWfëŒ|Úœ¹¤{D÷KÌs…ÎFEŠéZ:&NNÇòëG÷<5¼m/Äz¢j³Õ¤z¬JI´GœÉ˜¾¹0¸“dÇlÞ Óæ)x!#æJ­ö(¯DJÚÿ«õÖ¡YêŠö$£öu‰F™T'M“^Ø bo(àÁpRöêÓ»F‹rž€µ‡D&Þ²* ëŒÞù4qŸº‡@ÎÈ(nÕ‡wFÝ1ø¶–ºAM:§’Ï=è šúá®Xµá´Ð7.ðÅ#X’ùÛaZSž5_£©Ù€y>DKV)Œ²_èÂêL0Nnà¼l£»¦@pÚ$W>J`¤}Óíá%š&ýàŸoBWÜÛY¡£së€ç&”æ/É`¾¦6½4rã7>*@S‡QåEÍ„ºkmSˆh5“çý$ŒÈ“š$÷…¿?-•ë EªêÙöõµAÅA:µûûããF¨wôM· ÷ã~ÍÛˆñ‰Fv¡;ƒQ^ÃVHªf;¬Õ@Öò—ôG¯iÍÚ%¦Ô+šeô¥¹§@W±¶A9‡µ¢—%Õ®/œSñcGHP úðâòaŸ³XÚ\Ї ŠÅ«ªä'a³Vؾy)'‹ÅM€ÞÑÞEMýtu?Y±¯B<ÔçËí®÷võ&—÷/3ý“õÁ;”Óÿ¸¾Øö”a:Á#ï¶!U¶ÕÐÜ˾ôP¨füZbpÅXDXX$—!ªª—*‘ï3ºt4“Ëw£zóÿŠ£Õ®rn¯Už ŠÒ½Á¤@†4†N¸”¶ƒÍÁ±Å°l!¯\Œ†ktYÃRðPëC®|(úÑÏ%—k'‚ÅKF¿¢w‹H‘\ÔèêL«œEçÀEøiÞºG5‹É÷pH‚¼]÷ìŠ^OeøùæƒFQduïSC_äM@ §8¬MmÑQÊ»¶Ðï>AM—QҠľÓù:raZÖqˆ=*W6ÙØ@¨¼{×åÊ7møß-qE¦Õá$œ*º²¹–«R êÏÙx¡Í@èP¡ªé6=ü!)i/ö]¸}:&îÝjÞUª¤b îïM¨xŠ d«¤™GeÝXå Ÿêû ¿Átù›ŠrÁüÞo/YC¯½èW˜NÉ ˆÜ©¨/P®ôÙ4ž2Ü£®”ŽÉü’ÁÒ§_’퇕Zo^”:±!OZËv2ö»¼!϶{gÀ^™âx£aÃŒïëÊ»\×6 ‚WoÝ “€ðd—i8~·ìƒó¹¦6%ÞNïû-}ŸU¦Á)™Ô 35'O?‹„²Šã~1/·@Ua)x׸ÿ°ð½ K¾ÅˆÓÇ-?ï Nz£(\Ò´2©Wvo@i²å¥,ÖG ÕØ5µž I&þ~jöfK«+EŽË4fÚßk=—ö‡k2Yƒo¬ý{Øâ÷B:A¡)§úf 3hÿ;!w[ÇxA8óû¸Ì¦6Ò ¥§Á‚WÓSÝËâ_azÿzAÈò¢¨½Û»« ±… „5¯«¶É´’¬Dl¦3€hƒÕÂßTËáìèç`£ÛíQ§¯hMŸ:ßùÌ–§.ðÍ$¥A‚)/þqQ`ªò…„ZüùY­£=é'Ÿ>!ànWÐ ˆÿˆÍkªYhÃõ‘ê©ÊóMËi‚®&%Õç[\¨$Y<ÚCó+QÒ§ÚCQAÆ4Îeè­ÐF›äÓ=ÃÀ®D À*ÍÒÙœ$hòµfñ ÉÓ©Š`—+çÒC•=$µj…<Ží9ÿª`ÆÈq!^Ê.ü­áªUÇ oÏd3 ßÂJ­>PpDè­[­³#˜šhDqªÕÆ?"_-p…⽪Ã6îß3&º]ˆŸ„&&xJ*hùX³Ü—Êc&—¦Ñ‡ºCÒß+ëo3}j”H6øËaݪ± >Àڜ JeÑš{XZ£C+ZA¥TÇP|4nR¸LÉ[YòdØ?ýЩ»¥‚Š%~´PýoÜSžAa‹ÀCF )0‘æÁ×BhÆ4j&ý™]ˆ^”À yÍÈšñˆ¬4HÈñKÇ¥ãÎ},Lè š ƒÃL‰ ÓF¥½æ+QHz_RÊpÆeKÿ¸ÉK[³BïN¯L“_¨unT“cê<&Jä°_ˆ&(½?qÚðs“­øØq:ÎÜkÈ { ’ïûoOǹKW°`»»÷¡\þD{ … E]VQ¹µyEwVx°æŸÚநëoÈ™øìY˜à6¹ýI ˆ˜ÉlvN[б{hÊï0Vþÿ‚}ÇŠ£‚–Ò&ñ,ž†<µ³ z Jž{ĹÁÜLlF½ð°³² âV Ý]ŸšÙØlYá`©É3$^„ÙöÿqìfG›KTÌ{Ù±n%/iÖÁ™–Ϲ?÷9ÅÕöÃï»ßܨ֓‰ùÔ4ˆ.>ÔΖ¢&¶\mŒìPu›Ý#“H‹¨Kó5ãì†ùÌ`nžTB›¡|òt `RªÈ,;·,ÙÇ É’*6Ý®ËÂ@~Wæ'ÄDÐEú€öéÎÃzÆä9`õ ©žè‘ìI~áa[ ùdÃç†ÂUYn™©¢ŸÆK¨™«7 ¤žÞÐÎZôsŒ¯ÏàÏ”—ùÉdU2Âë6ëÍuÜ„bÀçÏ=4ëÌܩ䫮íkkõ&ûQ,àÄ5ûœô:‡ž?ê饉²úØJ#LMJ²¸OÅÆ ,Ã<Æš§]^Miÿ@ÑØZ ò/„ô>4(ýïx^ñÈ“ɎP³<èß2ùÿ«Ef–‘AN/Ÿg:‚EÑžbúc泓> öÒw<.’Î>V±Îëh$1eQ9®ìÞüä£(WÁ´Y+"…+#TÑ1Ôy_üÒtyÊ0Iz$ññŽ€} †]Fûf¬d‹°Ò‡ýÇ ÎÛÉ!K4är²»vÊR¡’x“{4}´aá.c4ÃÜuG ö§iB¦Ö`e«°j­ -”G(veM"^s‚¥ÎÔ£9°ÿŠÀzÖx«l ‡¬4à6؇‘%D¶€W!&ý¸JXêÿÝZÅ“‚‚žÛ‚Ýáõ´h7À+gº7§wÖ©M´à=–Êû ¦sZé.äÕ…¥4¹P~›…’¥x ”٠ˆÈg?ý‹VaÈ™«í5`BÆ)+™Ö®|¸ª€#JJÄT³{\hZj?¢5?v€ný/ZB='ìR%AaÀ1§çþãÎ`¤Ï' ÝäPÓ4™"õéØÈî¾V–ßéÝ}›¥Ó/39‰e[&yæÿ¯´}º§ªiáúΚPÕ¯ô£/A'¸…ù=gg[A÷¾ƒÖ>½{24êXèB‡Š2Ûg|>í Ñ~Fæ.)ùiÊXÊt,PT„4:yŒWë{uz9– ­U݉ pˆÄÃV»¥RÍVjy$õ8iJ›ŠñLçÆÎÿ@õâ‘Ìq£sÒ•‡Þv¾²¯—³Êsð)0HI¶­>,é>ƒöá2’ä•=¢mår"çîldž ‡ÍÆp“1–•¥¼Å7Û²Ùê.!i£qZ²–a³ê­ˆÖ\z¨ñ¥ÅzzmÛÈa».Ÿcœ³†{ýF­kÙÓÿ¾ç³ÿM•Á.´Q~wY#He ‰Úªò㌯hµ%9·¨†­]¶÷1é*F†sQËë3Îë²<ïëÇnÉY-NRxÁ…€3'4Õõ{,ʘºÓMÆ(Ø ›†JP·¼ÍùW$ü¥PÑRØ3葱¬†öÑt(w½·D=ŒŒlÈ{£©Â´ '1‹äÁ`8~¸ˆFn3X›1K°×Â5lÇf¤gp05 6ô3{8qïA"Må:UtûXc˜G`³9±Óžû¡OÔ0E.´›ÈN_wø¼rà¯w ÒòýïÍÖóI«îN-¢.éIjqäÁ¤ÞЀ>[-½dx{Ç$Ón׮ݴL(ˆŠžK‘[Nÿ Ÿ:¶GS%¼;¹Ö}l4¿¼fÍëóª´ ÙðÁ¼h3Ícq8Ä\×M@3ÊÙ1}XhâXU=–â¬dª€ùPAvÉ—ÚgQ\ 9WÃìò/³Æ )âiÌ×°ë¾y°œú=\¾wuËõ°GcD¿Ô3ih n×löøWÝúXÊ$·õòá-Œ[ÃqGžq¼6¹õZ¢5?M¦Ã‚*/œYºSV½¥1zoPޝÎ\yúK& ú2!’¶E1畾=gÔêQ¼2±¡ÎLÃèÕƒ ’±<ÿªà Žùþ¿êí>â>ÃZÎ]ᱚäeBy—±<Š˜•`6â\™·ô ¾_Xì{I8r";”xZ·Þ`§6¢‰Õ¾XÉPš` u¹iܯyKßZ;Wzá¥k ͽàGÆþPdÌ.ª¾ž‹¼\˜ ?9R‚;ìèÆvºB°~èŒ ¥C¾-›gð8¾=iX红Ì*YÏß"¾[ å`Žö¼ž»×v‘´F œI¯Ð8f]¬ë3‚ô¾DP¶z†ÌR¾c6ã%ãæa@ņÒ-þ(ãüXJéx´ÓÔ^ymÁ¨r©šþOû=㿪rùB3ûø˜¹ñµ`—ù9¾lìƒXïBï"`ž â±e~r!Ø6™ÜŸŸÏê'M¤Ž ÈÃì´e©hG—Ú–ŽÇýª¦íãô Ï’¶«Üη¥´º<,BTÝ‹éËвx˜®a6§™1«¶EH÷¶öQ¥¨QÜd®›æ%Ûße ãÌ \X=ežyŸ4pðÍéAó?TO4‡žÐW|_’{Z‰B@jÙp¢ë±!­±ÒG„ÏÌäèœ×E˜—$5ѽVvíÐ'Pÿkšxó|Vã€y3Ú–ãocH¶ǨTPpÓ¦ØÐ®;ÐûÚg$W“i›§‹&L£'þ€<6ÎÿðîTÒOëÂT)훌X}Væe$Äg‚],/ס#,ÍŒ=®/õîoßy¸mc‘bÍ›º©|Cm€h¢ŽÄ3ŸÖTj èÈ`‘+ÑŸfÅn?N>Ý_ÖeùWsý×W¨8ÌP¢iKG€>.´ô1$á?B_@£ª ~T#¤Q D‹ûìü‰E‡ãØ)æ,Œ‰…Ê›]\Œº°RMÿ Ü’¹$Edœùu~†èú(ñ¡KœàdBœ¹®Èï^&÷æ™;•…‰ÃظfÄB°ô4¢X}±âLöZð6ånf7açõ)»C„ ÈྠXóÀ€˜-C¨@TÝ ïw|KZƾgï±Z¦…A‘‡ú+ƒfr–dàÌ~†;X²®¾ìíišZ²Z`þ’Üõü–Qia€a]V?[…€íöˆgP/¨ˆÇ[Cüup~»XHÙ­ü‰ï{iŠ».zŒ%ìfúðœ×äTe¾(C±×öÖº”±þZTjl,ÕÕÀÔ´ºŒû`Õêœä’um܈ ¤!ÃêG­j¾[žÿw ö¢NJXìGc.¤Z\€hÛïû<2t¦ŠËéæÝ–+Žbøý§q°Ù8.füëÜ&¥mÕ¯^l‡ï#κ¯š¾Ô›jƵs3Se¶À¢Îtˆè‘þŸÄ\®¿Å}ˆ  ºÙî%ó°»!môŒ…ðèµëáý¿ó£aœsÍx‹£`š1à b)„3ü|%ûxK'¾þ4IJ+Oál‡ZPñɰÕA<|DCø‡¬aPì,€Y. =0€UWŒ¤'ÆèÜÄrÜñÒ@Íçx3Š4.†oAÉO»M¯YuÙûù Š-éV±Œ8eÛ]'’u¯¢Íÿ8(c? žç¢25ÌcE3ê«§ÓuŒÑ%ÂÒ{Ó¬^Õ/âáìæ·¤+*Ý+6oÂØg\omšòÝÏä#þ÷NÅ,èäåiãö¶¥Ùüaç$pˆÃZšB`ø+AÐ̦ú¢«Ãùïö‰Wé»ûHk‹yâui*h-à2Fþ`jÈ4îãfÍhl[#<¬€$êo%7˜S¦O¸/¦N*6UÉ-©ðÎGîÆ35¿¶íí‚,í?o^ë}GÊ÷Y™`¡Z ÙKU2Á…8Ñ Éc‘‡›^Õ$tJÜÓîeÏÞ_“ùTÓr)Pœ•fój$7—çö ЮRÞ(AÀ´ÃNuü2‘Gæ¡”‘'€sÆÖCœ-”ï¡i}+¨d õ{¯¬)ÞF1ŒC-t꾸YY+­žÉt!ó†©gEªTÅ•SdO4P½1sHTšmë-ì:jèÝ…p’LiéÏûôÆ¢=|Ÿ^˜’ÅÁYùÏP¸=ã‹oÌ)ÍÛÊ7>2ÒM|¤d i8h%ìxI‰Âs>‹¬íТôÖ‰Vº .ÔJoä˜GÄíiP#•«®L;34o Èåö=úp7«½|/‡¤7 Júéu ñ%ÜIîÃÄ `'vbž*Ë”I‡¾û[‡fF¸8Õm½bycݾ˜·¨kVxûÃnÔÞÚG 7B)öb…%ñí'AÒy´§¤Ó3¡6çöЫò‘KYîôû@ÏCøm’o¥yoï„Ôù ÐÑ Í.k»¤Ôüëâ]·Ñkâ*wlŽy¿îþ-ˆaÂ@¯… ˜ƣƈ„úõZì6•ÆnBç}À—}=Åèâ“:£õÔsñˆÔÉc1¸ã”ò=Þ%l>bTÅ~c®¼HΔc2’=3Æ|Τ`<£¦Ä­,Øx¸Sy>DõÓˉµ€Û3ršºÓ,ÒZµ™qhdmK)Õ¼”ÛŠs÷åm.m]vçàÇ‹fS-5kc8••ƒo>†ŒÈÜw±&;OaÞë³VÌdyîËêk¹…§JæÚÔrãß"‹@j2¤Ï¨šQÞinô Ë'–Þ%¦ZúÈ<²–ìÜÖw¥¥^@óñKÊžø²7ŽäÅoaÿÐ?¤À~ÒK½nsRÉìƒ-{–WË8â\ñèïeùËR¼DÜãÛÞûÒ¿Aø;øÕT`®Õìæ°¼‹‹¬DvQ®×dQåñÛP…²®ÖK*q]ZÒ]8ùÄ·ÄwhΘ«&˜ÒTÈ—&›ã]%$€¶‘KkÉÚÕÎÀšaŽO­vÆG…¾Š_\ Ù!ûúÚ‚ÞÀ>U­kÃÜ PrË“|9<ìÀ‹]ŸàÛ%Ú_‘‰Ù·ï…qÔM5³lu!óˆHûÙ-Léªhy*L[®níŸðþÈ B7ú†ñ}¶ï7\,åcê!ß$ïf¦ISàÉ–}Ó¯åjGÉÅ( 6{{dT(<©”-)^åF;H™UNø¸Í(yã®4yÑLÖ’ñÇ ‚sE,‡ÑKX‚žÞ4HÊØ®Žª×l´/¡"®³¢)ËÏXz¶ ÎÑè#íºÇlÐ2‘ßÑk‰‚¯Å’Lì Ò²o"¶dé`Lé&e7äâ#«N½n»õælÐ×!vç(÷’!ðÚ2£Ìq—šÝÉÅên ÛTA›MOP¼´È%¨ ^êPè¨ÐÐbÿ2ãgo”n³æ¸…ö~£çFnMÁªXnù•Ç‘ºï 9GÏ \¡mbÕ9øëÏß×?Èëƒî_°3ÝuWz¼É õ^\{™¿ßØ3Z A‹šw¤ùãÝxÏS¸ÚQŠ%÷U&íÈ‘¤ÝgãGÜüÄÿÒ‚÷Î’¯IãÚVCY½»™úìÊqªom_Õ5d(qj×ë«­u ì–‹´ ⛤Ïf,VH U¿µÝ]ÔÏÎN5)ˆ @«·Ô¾Ué&®£@¥c¶:VŠ ÓXyü½yí>o Q6†Èäµ6SláÈÁ×:’Ô ÐšfÑ¡›~ÝðÌ‹gšqsLBÛЫQíù|Jý¶gÊg–|'¸«Íé¨î‰+*ÙFD±ãV`¸ˆó$ÍSÕÑÐבJ£ËÀÈÌ.’­`JAQirôóÇÕm³Xj¼‚Иb5܇æ(à0¸ž-íxcO(OÚW¢Î«ÅyÊÀPuC„XÿhF î£Rzp½'ÛÁ;º!4Â9‘ÉLÄ&L½“¢ÁLjéƒ&¾ä£Ží¡Or^Ü+ç\3·3û·•±ÀŠ?/(™‹¨Å:ÞŠL)°x7È‹Cˆ/25zY´˜ÑQëC@žÇ‹â™l´ýb™R{^ÜX7THQŠ §cã"nUr×Rªéà œûJcžû¸uÈÂ%Ì™Œ,[?,uñì b‡–¯úïn䤷‚‹·"rÜ’;ÁùšÌÿM|Ñ:OWˆX>#£œ³S¨ºª€Ä~‚±:FëáÇ Yñ‘,€êŒì!ëh³Ð®VEÙOKnˆr4£kyûÒúÍ=ÁuæŸåÐ U§ŸW Éð膈>uuùkî¨eðÓU•QÄÚo•¦ç’E Ö$MlJ—ljà°=mà“ñˆŠDtóVࠬܞ$#ñ"±ÏîFtoƪÑ3ÞmXßD·Bb¦ÝÛäÃB¹šTÓ{Ï—-M3Rf÷|5î‘D6†V¥rK¾àÖ¿$TùU/ †ˆ«'REžX€´ˆŸ¨V\$@Y[ì¥G¿§<¨`~Aô3H£DÕ˜Uý³’„D÷¼8›}ÐÊßrsÉ‹ÛðƒCh0ûë°¶$ºÐ®èÕžî8ya¨&Šð‹‘=›æžçöK(Þùóú4 ØÙ¡0`D¶ß¬{Œ~{Ré{‘èü\×d«ÏñQvZ‹´šõï´äOÊÛ$/‰²@´/ñXã%×1áï9ce5^ªû RÇÐȲ6XúËœê¶}Õ|h…mŸÊ3Ð<6Ÿn%2ƒ"s({š]t“Ýl¥m.Ù J>Qpøh ªšwsª tímbŽZ"º€Z„!§]¦µ–¹ŽÇü£±ý—ÌkÑ7×»B%(F¥Ýp†ˆç‚'ðŽb©†“ž,‹çpì±*I;±¨ì•Â×w•}ƒ‘ŽÛâÅj0݈.th 9‘:.Pt3îX¢ùéGô›XÚÉØ©Ää«üÿsÐ:r]N=?Mf攽‰ÍJ;·Ñ©'¢Mљʕ1æƒîLˆßEbù9«-Þà¡Å» e)ÅrAú2ª\>ÑS7C>:7²í£8ì›Òù#‰,E!ߥœ>þ/l4q²|QÀOôºŠ/¤ÕZ ´P˜Ù`_î”ô<ªÔíé–Ýy7Ù7üoÙÚµ’#àõ¥º¯Lzfßû§!1Î%ý¤ŸÒ¥ÁÖà ·vq¸o5‡ín½Ìs§j¿ycV´Þsüd…ŒE§ž¸Mœ ÜtTzS7¢WÐÛü1áŽùl,"¢}ò `Fi«í{¹UdŽ-”ø»R~îK@ýúamà%¢Ï ü²þæQdÃÞe­n#áz‡‚UEÇ¢· %‚"Û³Ú8í¨œ—wð »•PbÇæ¤\M‡øÞx€SÜ~uèq¯4:DRI ß.p@˜=bßzÒ÷=%Pø°tÃÆCpŸZš±ì}˜ÇÀ8Ô¢å2§Onx ôàÄ7U{ûcën‹ê¼“3ð¥.©†5öÚ¤x&`×bÐäc>u©6L¯7/ŽAlDQÎýá¶Ô§ŒÄ(83^ÏmiŒ¸ýØ,8³uùã#:„9ÁœB²:R¤0ÊBmï#2‰3'ï[žV7¿h¡)n½´ ]8½^|¹ue»ö•\' /r¨a Ò~t *^ê•¢wü‚aš¬£ÆŠ¿Â uküµèŒ°«Nš‘ý%´ñP;Y7”7À@›¼™í)à>;„´¿‰Q¤[)“­s¤çXBLDÖ. Ãæ•{²¡F•­l([ÝgZÎ:‡ßSÕ‚IsMÄ{“´!Îô ÂÓ&UQlØÀÑë‚»ïN;Þ6 ¥Œ/™Ýû¤§]»;Îí exzŸ]0Ø6˜Pì¶{[Pã¼iE½˜MhYDÊ,E蹌EK¬ÍŽP¾ °oË%É´'W­w½ƒX¿È”¥™0Ïù•;Šhæ€äG‡’ñ·& ½s÷Ý2ö°)ºŸ²oÝ4˜~4-ùcê$6VÉ!™ óB4Ë[l‰«ë»ö&SbqËâÝlþ<ĺÿ*¤Ê¢¬Eì]MlöÑÇÐõ#‡8X/ij‚ºÙ'1É v[zGô/¬’µY,Ècõ]2”K@ñC‰úGe®ÌÎÅLq #º?Ï@cR2õêÑèÅ(mrlgoüô½ 6>zûìaN…+IS›ÌÛ³~ŽêQœ×íã³Ï°YCÓèuGUlå[ŸOôt#µ§×ºõPZÕp—k„…_öÑ8VGe™XD§Ð±Úƒ$ÝQz„ÕÏÒÒ ¦í졳ŸtMá¼tÜù¤~áUñˆbg"@r¤úFBƒxï–¶Ùέ6~äŽsˆã‚«©ö?ï:ÓmÆFîû'lÛŽQÆDÉT#°æû0Qß´a êœCâóë·ÐÒãž' JÚÂø8JˆIæ¦d Õ5žV€¯°Ãl(Ã0øÑU|†UJ~q¶SÛ‹4èãÃR hGÉŒ  £íiÅÀ¤N« ¿Yç ©WÅnkE=e•')“ ‚C}<éÉ‹àÇAêé®YØ=[\}Z­Êf¡ðÍpAa$[¦ËÓ$—Ú†ßÙRÒ˜’Ð#À§Å•RÞƒº\-ÿ ÆíΚ«œ†ˆwz}iº\‡ïdÚF“zõFžU?ÝØâÕ˜{öê1¡ 'oöh6äÉžY4âK~U5DTõ Ǫ?þçqÑÄrÔ-÷ ½[&…¶bi[ª‡&i\›fç ‡ö0º9ž­<&ÚÉÔ;:xÞ9Àå‚}åë›· ¦Ð',É‘½º:Cbqá’›À®]¼i:`ŽQǘS@Ÿ[6T+hä_bUl£WÕ„$y®l*.£71]Öµ›Sû¿¦hŽœi6tAJP×Ïçe>ú@ó©Wçc²ÏS|¤‰.jE²s¡Š`QüLûZ4Pv£1{ýÝ22üÍ9Œ;lоX¶š‚5]±âSu G(ÆBeÎSI‚ïxرi°šñÙ¿æEa“¨€µÒänW’Š.‘÷H< *¶RgV.L8iQ¶Iq,Cî§Œmin"]ÏDÊ=¶$­úe!*ÒÙë£>d@U ûú@¶ÞðYñеAw´11ÖÀO$ïkBG –XFìµÎ¢ÛËHLíqÇ0½´³CC‡m­ŒŠtˆ3 ùÇï(H;ŒNôE9A>AêÒÐ%)Y+,^5XÖË. ½Ýí¯•³ MÒWqéQ´ñÏ3Ñò`y6ŒCîÃÈù…Ð.âÆ8a— µÁ³j$;}À × ékH€‚éÝ3Z]"”ûÿÜ bÏ„ÊOœr•au'ßå ¦¾åëàðn;e±œ-‡1˜¶‰}í;FÖ($Úê–õl0¤Ý¥eŠæiö\ºg1ޱtæ`übæäÞZ@nÂÆ«–›¦Í^3§Ð”í± sá·Ùð3Œ—0¸¦º‡ |ùÆC°:eOÃF$\P +C>f¹€µ#z ¯˜&­F‚v¿p’°ØÍ‚LˆnX¶åò-¢rî‘ùªêÉ(õtܼ¡B×Öà·œ[~ðK»§¶)3®ZISx³6ŒcÕ7@¸ª«ÎHó´j_çÒ1.™ÆŽžruòrˆGzqLùÔŒƒK(z[×&;ñŒoÄÎIÓå¬4QX‰†8 Yo…~ ÚMI`¾­Œ+èîG‰N$öð˜ÄêLE}Ã:ULt­ÜލÏÇ‹ÆuM`yh%¼_¡ÝåŸy N CTHK É.•N)-Ù“^õ |ïŽ`ï\ lëlÜæüËDqË!›/¥ Á8¨9£dÞØ'Xå=›e0<£áéª)=|–º@ñ%ð›>ÖvZí–%o^êÇu©CÚ¤•ƒÞ„}qõ_*?ÈéËh ù,\eW2aˋIJ¡ì«k’¬F˜YÒSóÈ*-Ї8 ÷7ZÊ *ÂGêcÒ^OÉÕ÷:ú«Fhsgµã7ÞÁ_íäcå¼/®Gð_*z/_ͨ0cÛ¡…Ö«¾ù}5Lµð«oÜ£Yôø÷æAAÞ¼+c¾_÷TÆžê@Yô0}î¢.”6µ\ŒNß·­ôÇËh² t¦ê¡k“ò)kÙs^+Z$Þ” ù¼ ?Ú%æ@k4˜Fºà´"‰úS[Â++Öú'å¡ð}{-u{°± jZ×>H€³«ÖÆö»L¥Æ m’ðº¶Î#`%+è‡z%dôìk†‰ÿú­ yJŰ¿ÆEûSsÉr]P@Ë·WNÂKqÞ}pA}ÅV¯»µŠ²óþ${~Qû»ôF5",1ºùÊ µïâZ}_Óí]_£ •ú>f àRhËR$¹é„BX£ÉmÃ)ò¶LÜ¥Gh]n¿#ë&®BÎâ!Ú$£éð Â4Ú¼z]5Y3¬)þ|XY ‡WO¾úæë÷z`×X'u¯nqÌjùÓOìlìxľ‡X>ŽÁÒkÕw߃¼D]ÁEV³?ðK ïc¯_äZŒ¶˜Œ}ôIa†QrwÂÊÛÈX9?ÕcœÅ÷ RÕ¬™üGiFFfH…bínÌ ´Ì“lŸÙÆd‚aã|ƒ—ú,ù/6¨Ñƒ¹O@qî§Ã|JÁcÈÃXßêñvõ…5W¨åHNãÒÁ„±Åà¿\J Ž31Þ¸_†®Ö#î>‘éx5”Ú´bs?ÃÞæ­-J•RîÉDõîoµ(¤ÛoýFû¢ qð1ð»aô…3^.hÞm\Yë!Z'p«€ßòê ÖÒ;ÐÇP%_g LÜë¡aüÁÜê&ÿCµsŽõQò`x½<˜·Âÿ®G΃~@&¸± r½m¾¦^Í_ùy¯ørÚqf±ö ãë÷·Õˆ£ÎaK®x”ÓqìÖÑíYw("û³QÈQ²¥|¥µ­Å(|{•ˆ«Ÿ6 'Q©¹ï ÷zcs3·¹qéC"GâV4©Û~]ÓªrC¿)¥Ñ_ÎB]ƒ¿&t}íA7ZÕÚúñ¯6òüc˜|| õãHÛCÞ¶:BÜ=Ig}?þIz‹oà«íŸvÛ°ª=‹B€Hà¯yaŽúÂm6õž¸ácßlÔ© š”Eå)›S[üÕÒ÷”O4 ˆ/«†p烸 |Yi²ÜY_Õ¹ã™-Wy÷}i€ ©}"„3á0Qiàî²Ï½{)0ãïÕ!QòêœÌ#Ê£«’ØD…'ZÙÂV³Kzm¼¥tÍLЃSmÔú®qÈó ký¨Y0#>Œmë"P5¨šÌPiÔ9Ç—ÛÛÖýeô#ø'!€¯¾drO¿_³¡¼0•½tÃåËÔlzî1Àíì6í`º§vêð,M›âpÕñ=r ›wkÕ†»9ÈŠêN%TÞºÎkC$¾ÊÌ srèQû×¢•Ý÷–x9Z;‚%Ìp9ÏÝ/Òf¸åÝ·¦ÇŸÁ×c§ãÚš.âw5ýSÎÖ>({Þï8$í)üNd }MœdXË«ç#ýL”òø(Y†µ¦ VÛÕ6(ŸƒÄØM¾Áb(ôLnÏÔš”ÒJ=פ‰—û’‘sTa[›ìí˜"ƒÓò¼[öqãyÆ&[ò?ã@‚èÛJ³Ê¶ÞÞ/Ȱw½À% §`bé%-¸y¹0üÄ1øù¼8ñèÚÊjsŽ{‡ ìð~—u¯7P°‚¯€h1]1àÏL°8øƒ~ ¹å¨í·Ñ†~õè‚òR¼—?ã¾c‚€^¥A¤‹a¼5/½EåwHm°a•mM ¤Ë«B?wVÏщ?úón¦ëR&!ú$é«Ä|Õ†ÌÚ úÜ<(%g§ñâä isƒü¬áEðòOðøM‚‚ÏÉŠz˜öLf÷Ñ”-.Ï_‚0A)7k_ðV|øëÀŒc/ Šï}‡q'|Ö:9/G›·Ó„=n·ù,¾y¸Õ׈¨70‹™ì.»^ð£ÖŒ­TeÌ1ßÙ%-Ïþ+bâ0‹³î8#ž‘˜f=põcR ÀÓÇÖãfúÛˆ*_Рܹ¬7 ã?n˜aÑÁ!s»·÷ÝÍ~~¡Q(Çìµ#[,äù»Ú¤5d­^)’–ŠéÁ´Y=‡ÏŒ,½=fOÂÙ âÖ ªFÒ–O@Ñ‚ŽìíÁÖ³NïoŸR®Q,×)“+6ùÉ»)g =ꢈ*c\‘škKᢠè^!Ï»&Ü|¤z”²Àw5Ìç¸ÎÃæßiNhëRý„nïÈVþs ›-hz‹ž§±ÌµHF¶mô4Ž D~ŸË4ÂBà0“Ú_\ð†Ê@7]½“ŸG¹‰¤€ðYÙ9PTªþ fmRÕ¶ã7ãb€mÒröå:äÄ€OFÿûÄꑺg!v}ld]ˆûrÓE¸ž[Ý}ݼ>q@“½Íÿ—c«^.‰—âØ•Å߃“o¸ˆüÌ\ù½ž$ŸŽëÒ:ˆ%ÇeZõŸ–\úÜbtZw}ºœ€ŽÒ˜,Üù¿ÓÊgÙºd™ÄksÔføÜK@~™p·Rœ hÚÉuQM >¡ºíˆsýá£ÜKIk}KïÆÌ•òËÒòÞЬTkúþµÔÕÛy~ å´)Aáîm߃Nq¾ÛõD_ =µÌCì^µï4å æÛ};¡wô( ‘¼©éЦÃLa·:‚Ž¿p¿|LÙX¢ã”*¹ yì<“S§žUö•l/•€KÐW¸:yU!ü ¾ÎÖ6yqWY=ß§¿.©÷c¾ΟÒ‘¬òYäˆÚ¹c`º¦¸‹à“ ÈL#æ²×ªä¦8ÎjÛ›“„ßþªÿËŽz­éÁÕÕÁôÇMî=æÃ—ϪÎ@@Ü]y\.)¶ýÉÅTÎËj–¨T&2Ž þ: ™Ð¥Šº¿éÁrWÀù ãŸB£ÒÏq¦ðjrÒž-;–ÁÙ9í¦tÙÑÇ×1¡Vý å쯥®.Ò}øÂÆC€–ò-Xó^ÜÅðe÷7êùi(|‚=ŽÝÐÀtw.ûwNì½”?o—1Ë™·[e:‰'Iþãù«70Ÿ¿5k+íÁÔÊ¿@§ú¦Š“Ñ@jÈ8¡Ò_‘–ÂÑ/òOΙù’ë9¯ˆ¸›S°]`'Ñåþò´PoÆëÍ™Oz^ž#9l«'C-_J[,khϬÿ-½“êØ÷£Ö ­D y6Râä%•këŒUä¹G«Åù»ªéˆÀ»*jêËsÞëPÚÆG*oN¿U{n3Õ\Dõ^#QI?QŠàr¶§~9…÷áþâq¨Eîâ osÀºÖÖkÖÀ‘Èñú˜ÍÛr’Á/‚¸GÎŒ)³ìäo^Ý?Ç«¥»úië°_=‹Ö}«<ßèèj ƒ»ðr5‰Ýg¬fÓ:¤Æ ç_¤ýžûn¯¼Toü„âØ­Yˆÿè à^Pà–ÔÒ;Éiجݞ€æšP«Æõ{‘†â9[ÌÌþk½U/ aCç—]ü9ð‰„¹Ô ;`hjÑT²yóº·„ùÃ|Å`æ&_ĵNbË¢jóeÆÂgB›î>ÓØãe-³ÿ鹦RÏØ}—œáqÄKW´¯ÙÇ™°±4‹ð_9­AˆÒ(Ë1C-&äõ{ ®9g+äB†&”tÌ¢è|œìƒA_Ö´Qþ¨s~„Ì÷ÌÊI»0oM ÚŸl|Rº6ÈÜz‚»“'0$Š›O‘ŽÜ¥ÏzRt(‹ÓÇbJe8³$§x/‡ÒðÍ+òû¼ŠR$~tü@¡vl· Å£~Noç*›T»pžƒ¹âp‹JXûa%m·ú)ÀûI•ñ"2ö'‚ž±ô‚®®ÿO@1ÿ´|=ÏP¡ =Ò[1Öþú¾ +Ë”jW™Çü Â[…6 »“­MÃ"Êvð÷šŸê{ʨF…±¶ö§®Z^ñ‚;¥t‡±Æf ÇÃ:Ôp¿zw<ù~__n4Ž/ÖsX.|‹óeø‘£žà<€oѨÔ]‡žÁô—9ìÙÏV ²Í,: )£@o¹ã#æªJùÔöjB¹Jtz@ZÍðqTú.-4¾$³fŽÎEõzë_ZÏ—¬ÈÓ Þ\á¦yÔ&—rÔúF+e9s§’MEFÐÌ_@ü< '®|÷…-ÍyN4ó(8.ä¹…]I³Û«æj%·úª}˜$ "9oϱ׮¡lªfdA*-ú×-}¨btQLå=ú–µ›¡¢í4ã…6`–Â+Üæ·T~˜%÷ZHïmxq1Í÷°¼Å驟l™ÏTq‚Yüµ>‡”AÌuàëPQ­t†V\|kˆðBºX÷Ü99=­|¡œHÜß1|ЫqÛ4[Ϲù™‹­gˆ}=‰*yÁÜ?ŠÎ=tÀ#lÅçVKUy ïY÷1Ñ\‚Ìc[±[wÔ–N ¾ì—h=í žÆByÕô·¼ ›VÃwÀFœð› én$uFiÄÁdŽºñ\æ¡=¨ ^±¼ ín÷NCS6 à"U,mÞ öaÚW M”‚G–2úM#ŸØ„#@L. ˇ‡šèÉl{ÄLõ$²o—IJF#.\dmËs%¹7Ìso«ÿUc$ª:ë9ãVè”e7Œ¨e kö'Çi7—Ðó ðᕾÀ½X©u 2·¸Ë‹RS„æMiΊS¬lç`<$ŠÕÚÈ}ƒ«xP¸€m4Õør%à.B¨èaÛÛë=ÿVý”¹ë6½Ö`‚çXß»ˆVT6dFDïþ3¥ÿº ®Â6C6ÿa©§Òœá÷Ž•Dù%Fîrbö Er)¹wWm¸ïÙ};Y¾äŒ.eØõAˆSœ4àpöØ~ÕŒ‘Õâ½R> qJUmø—Ó4·Ó¢Bz|ýa漕•9Ϥæ<4ð©4Z÷p„ÆËa’ÂR” l!/U1øÜþáWžI•GÄò!ÈÑÂE)v7 oÈø$}‚je3jë‡Þç$&7…dÒM¾ò$ܤN?ôKå5ŸsÃ1b1y@ 2]9É?ò€[mh¹Ûª†r^sØÏ²Û« Ààx{°¨uKÃÆÑvüpOå’ûçÉ5ŒÇW¬È\[]ÎÄ’ï—Ú:€5’ý¸ãŽ%g"«˜<ßÅv;jäÓ9öŽù v„t—7‰½™© xkM”ݶÒ_RfæûK–MÍ’àâ»Uó#àMäi#83zC“ ·ÿg„-géÓZ˜³¡êž#ðÖ†gãÆ×©y%-A%-Þ|±(#od¼õÄñé3ÚÐkón–ÓàáhÒ©™§õl%Æ–±T±I ¯Ýt?û™U0&8ÄŽ¶¼uGß eIÅS¥ÎkQ2‚uÏ}{`,e§–fi@nàúwòçõ£û`ÒrdØ×‰Î¦Au~`m˜ŠÜ}µžýÎ)ì,Êk”n,•<žèŒaº«ÊâI(ÿð2'w:9<D.Dݦ›ue5–”]÷ƒq=bMk»®#‰žÎêxûÝQæ-ÝêÃ)ÿÆPÚ giYr n6¾ÈIÿQ¥†ÜÊ&Ç™‘.$$¾r,Ô6+eWÇ"+±}øß.NvሴÍ}Žh¡sñþúnë×ò S­÷h… o!ö½ŸÁ¾âP?³=УÍÿçcõYáéS¹=œ‚à^ Š$¬¶2^“~}‘˜ ´¥C&~ØÍ̾` (gã ÿ£Á@œׇéo8ßG”`ŽHtõ¿ !Š ¯öÓeÊwÁÓWàj«é>Œ5¦7Oãƒ¯ÆØºFþMlðʯîV͈¼ ä"-B½Ý˜´@j«v}]ë†èe,¨zà Ñ;ņ4d÷½@ ¥hÜù¡ñ—1ÓS¤“üfýUz%Ãs)»úxÿ凊ÇGÙžõzvKðâõã£D§AÏ£“Zo1ÄåíI¹ºËøVQÛ‰·ßÍK?ºÝñôºEE817oŢtØËq¸ð"mÌÅïâ…­öI¦©qûïLüO:ÔpŸBnbƒ ÂéÀ‹‹Yjóùj†ªÚ0j@†‹â¨Ñn»X“×$Á g]Øtàà|ýµûÇítÞQ’=~Ú*7Ö}öˆ›b9ÅùöÅ1æíîÞ……‡@« 3•Gó˜Ú&›J`£÷ìJ¦“Œí$“ü®_ŠûžOMÏt‰zfÌÔ?oäù!_Fhñ …¢>€±´ƒpeMRn,âƒadÞqN*ä­â…õUðÅè~ºñ ˜Ã²dèÊlç–ij§«hZ~ðäwõd]‚ž:nLW©³“Ç2½{[Ufzá†(ÈÍÉÀLž\Ø.vcÊKÏ3– ÏÙH1˜P¯Ž‹¹ Ó“èA’sÑ­-þì¼JF*ù–HêJ7Ç#D‰­_%êvÛ©v¶å;Ïÿ¥KUö%&!vï~þ«¢¼„óˆèÞöS½>¥OŸ#’iÕÎ~[¸K„ Užz9¦Ô^,Üù¨`•FÅ?U¶]›Áºº$Ð3¨ÖLø“û,J‰gj`yšôt­˜1ª‘&ûoU¾Òâ«»`x½ ‹¾A¦3[n­FÜêÂäVT¿›XßÍ©v_ùL Û;ïÃcØ)µ5ž©vöÊü1R‹n8è,œè¥ED1]¬“kу^`‹v2m.¹}ÝÇ•MRiêýu„n‚êDþA2|®<å³Jù¨–%ä=ŠÀ¥ý]ƒ SvïíÎLHÐ}8™Z7X>v:Al“Ž»{%>ûiÒ˜8%îÐ9ˆµò¸B–Ȥ)žšâöâ&]\Ð J…kpbjÌÉ ðå†Õ-YU6Äš ŽvÜÛÛÊGã>8ÑSÙf‹ÿCn’o¡ÔªŸ”¹ÌÃ5kLGëyÀìk"„ƒšˆH úgçw€ŽÕ38ZøCQzd0d@lë„·åô˜$ôØÒ ÌKj3Е²ïœkÖôl\£…†UôttÌF+ïNùµÿpNFªžsQ‡GE €›S@rvU~³˜Möi€k¢ÈÆ¿‹Q€ßYø<ÎücÍzx’²UÁi¨‰7ê^¤„ÝÅm§.'Gß{€‡ }ÁZx¾o–ùHú<ŒÐæçÖîþ'Ÿ€42%qÛšZ•ÝËñͧ$sÇuÌá+XmIBó‡éáõÔ#úôÁÄADe£˜8ˆƒ,÷RJÔ¨nöè5Ý$€€—‹Ò£Ó©ƒFHÅ úçF!…ùî$¥äÉMžøê~|ªgI»(½ÔäžPÖ„bT«à]¬qŒùhMvd•=ÌZX¡,ºšY¬pyA{O,+o/Þñ¡C*%»8|`kNª¤êcƒTx—†ÑpïÃ:1i­a¾s>fd’ñÝÿ"2ŒTë‘6¤—Ç+ý8β #ÇÅMfWZÝŸÁ.8ÇnS7Gª›w„â~ƒ:Lµy„´ã%û%´ÚÕnì@OÙú 2ðò.3œÑG/¸Ÿõã«o=™e8R'ÙC…T8¢f$zʉ¸‹þI¿³P…ÎpFQF#ü`â ºŽeÆËæ„Ç×0Dʱ$~m^Å×[¶ÿ}’Dï&áw¤>h1õ7Ú=R›ðéüQýnˆ*cèb³?ö@IQ†¨7°Æ˜¡°E?TD±4þo=¯`ÈìI-‡ê2ÓÑùrñk¹oîQR³+ï¯x§kZxÇEåËVx;ÃÖÿ”+'³…,ìN’¾ÞjøšÙ‹nv¨`‘ÄŸ¾ J §2² gýGSº_Îx7ò?wb“øè.RÞ8¡f€€³¶ö*¶Éê¤uâÎK¤ìxÕ—Úl]ä.ªz ú»!$LIö¼½H›€ŽqYh×tÕ8›ÿEvî˜BïÔ¨@i|Û¯·ÑU¡~L@„UßÍœ;ëâà¶²•…$f°‘:Ûj1ìN²ˆ2ëËqNUg.¢–×÷¾®äŒd¾)é.õØ|¤™á´~7´º@Ò™¿M*¿dÿ“§áê%x5³ÂH§¼ú_cnTAü • Ú‹˜è9‹«’½—Å*à¹Ã\e榿¨Ë“JvÑ[ž¶&tc—åJ5æÊ­Y½u®†ÖôsÑbYÎ5'²ŒTžU5ïþÄSi»Þ“ÇÑ)éHE`ßÔЈÆíCüY‡„¾iËYåí¿ÅÚ3H–þBã(‚}c9™`ÿHÜ,¦é·‚`#Q8´Š‚Èæë?=É`ß‚í'tï-˜4‚?û}Ng…Ò™aP©RK¨Ð±4HÒ£¤ìx'¬¹µ3_ ñiUc²í\u˜Z•L÷ú ÕÒâqËägK覂:·Û Ýòº‹#…D')Ì Æú¶£j uø:È%^§1unÓ‹»qt\Þ!˜ÙŽš™ÌEò&¬7"Pˆ£pð^øšbîBÿ¤¹pÓ<3QˆL^<ïÇIi/ñ9ë|‚ÅõkrЍT(Aûtî[Ò¸Ê uK͛ŠÂÅëJ:V˜:ðLÒ‰ˆ§˜y£³ÅTGú„ùÆÖÝ|õíÿ7´W'3º¨ô–ùDFÅ! ªÞ=%°j áõ•8ÉS99ìU®Á°…èF"P¦ïz=8ãûƒ·Ú¨ü<,ÈØÄsã+E1‘§ç¼ 4Ç~€*"1@ Ð)¿L¬ÊP¡yôëó–›aJ¹ÿ 1¦–57˃Q;MVªJá÷¸H'“*S´ÝkµõAAŒG¾¼Ï…1‹[\æÖèvp—ShaÆÓÿíHiwg~ïTÑf#Ï?eòá KZ¢¡2¬‘÷.GIø@5í¾{yí,(Z›Ým!ê‘Ù ¯ÿC ³À4.Åe0ÿ׌žTÀ¯“þ.Qz_ã'öú%#Å.å ‘ØG‡´ð¸Ôøm-Â:5PæüÙæØ¯†?;ŸóèDŸýÌ3`òw"{ß©.žÔhÕ{JcFWœ™¬L†@}¶ÐL:A”Ò½ïnÅ÷±ã‹o룞à(>Ƴ8”úsèG™då[уp)zbï/ͼàð‡ÖÁrT§çü¦ûn_Ôj°L@WƒC\ƒw)8ýòÐDõÑìo” wÿ=GÛb÷—V?×DË*a´ú¿E¯bAÏ%áÀ;E;ü`çT!eK1ô8ÈaµÔ´aJÅG×PkxƒÌ#ú7½-(Ióõr\¥÷Ã%%(°½ß OG£žŽ‰*'çã[¸vÊE­{¦ª m¸¦ÿ^kÝÙ°]W^ά¢ÉY­¯µ´>9NGÚå§<›NéZÂ]®%ä“xqMoÀ®Õœ[†€ûÍÛFä,LVžãpz‰K¦ì¤ÆK/"©X/$E¶¨ˆ°6®à cš”Âk ˜gãð2.E¢ƒpXsšç IqmFQî •:B²KüLòÐÊEÖªM䤂_/ØÄ÷ñ2Ìž%¹ká±hPsöKQ;7÷⚺øÞ£Ü•Æøä3!žpØìüDƒó“Hb¨QÉmóS1§¯:(¬ lM¨°„ÈRF ¦jó@êrîeC^µ9õW¸&Oðô[Í=Aù¯U®Í;Ÿ¯ÍTn| ìláê Š¹jXÔeßrqàê»8òm;Á'å}óÁ:-OvZ0T!ÛúBéÈÃÎVO¿°Ëˆ§×¦‰K¬åºÖrƒmö¿‡,NŸáx;^»!ºEƒ¤Žj)mI?y6aÿa³³}Jѿٲ´R¬R{ÖÙ0¿®]u¡˜¿|â­J‡ÿ3—š~Œ {Ûë‰Ñiäô/ù„ŽÓ©'.}cV1KB—â2T±÷LeóßÕ0Úï Ã{›€³ö‰ˆê;¢Q@£(x«›Þ¢ƒ.ó3i¿FÙÇâwDØ[èÑü}€lï_ñ¸4s,ß[ÎÏsõ•,ߢIXÇC‘òaõ@† óhEɲ3&ÚA{Ya=]Z_û[1ûÆn\üäÎ?a[눋 ™úÖC”RîW´Þb‡Yg]œǚ¶b2»6 Úãw™¶ârU8þý0zvqfj"äK˜R݆Œw‡6q6™m"$¡LÕó­ÞH¨Í3{d¡õà/x ¢öåñÔÝûèBèÞb{ï>8å†.×z»³_ºRIÞE(óž ñÿ¼#ªÃˆÙ> ¨È…ÿ¥±Síq bÜ/ů9öx"ßÏtÐÔÕ0ÇþVöÀà*¢kÆÉ¡(â6ÐÜ–Tsçˆ6/· Ó¾¹øRؘ2½W`\›¦øCŒª`fJ÷0Ú~4V?ëXs×Pú¿ÄÀÑ…±¯’5÷WJž4~ÁE ÐàÕJ­:‰Xd@ça ¢´.†Ž”_žo"wà›~˜õ!ô^zz[Ø(š¡Ö…i£±ÿBS´A¶H_¨èÀ`u@N$nšàúG÷é)å‡}»ð€Êsþ†¶À>í€Â %Ó L6˱µ€[Y"'1šóm±åDâM20톳Ÿ %SE^Ôj:¦EÖ!–Lꃓ-õ¨y‰™Ö›MãªÆ3/ãàHNJ=P©iïΰâ|‘ʶ1obÖU53ÞJ ÈÕM›ŠÊ_ &»N´Ãvû«uNCtÏFG+´L>OYñc÷Êó¢4´ûò1ž‹¾¾\FýcÓ+HŽŽÊZ‹˜ó‡æÿnÐVÎ$FÃ~Ûˆ_àÛǤQÆ«6¬–C.‘±Rq.Zèÿ–æ>Ãñ³!„;XaeÔ‰æ¸ðj !†Lmï‘TÜ µ®Í;ƒÆ~™L’Çú8qs˜;Ž&VOÿFc—¿æÍê˜Jð£¼Ãm›ç0' ©z7íåkÚ¡VË¿òcÿ*xÿ=ƒÔ%ct*‘KцÕèshõâüL»§Ó±¡öæÞƒÐb¥¨%+AöÿÚ¬gÉk½ZÆV³M¸ \rÌÆ¤ECvìøA’åÃ!ÁJh¦~ ù–Ó(W©_§&ÞÆ‹Gõ;½¼ƒè”áý6#Q•$Û_˜ëëZ‚>7‚Ð8K™ïªÔ0f…qòÆ›´³9ÖÒtW¦ÇpóÒC6ü‡¼H=‡:1—t.×J•šÂ—v(yÆï "Š»;’øyqÿ/˜úaq* ù±Ì6I÷x9¸ =<¦¨BPp6¡d64™€tTúÇÁ‰>FX§e'Øf¤¶ÜšR±µÞ7üdD½Â½åuc[Šã s­]—4Å,´µçÌÞû=à¸tÔF×lÜ}‚/µ$ÛzfC?µÑm Ä“ Ë®îq2Ôn盉–¢—¨æÄ£~ÇàNïT[DƒFf #[/nõ¡Nü£¬Ì rNíß(È ÊçJ×À.žõ -GTL ¨øn{;™· X‡SGKC0 d7kÛjÍP>SœCœ 鲑«a¹Æ¿=å¼"Õ7|DïHG÷ë«5Ë]MBmz¸ßÙ†`ÅeFÕ{Ù§ß‘FíËbdì r·ƒŒ,”Ítg3ëÀ)¦ÊþÌ hJ;P]º|?쓳’7fä.,¬UY)LÎýúœF±6÷b[Б7HeZ™ÇˆÅ”>þ†ÜI,--†Ð B‰–±õ÷ Ì÷X6‰[›»Ë„Îo V]'é|⦔}›{P:ǰ-þRÆ‘·Á…1Ø'PŒÎµ;_—w†!ßá«–_[Ü%7ß±$oÖŒì=˜óë$Å(¼íˆ£¾Xì²~ ;r¤N;o° 4ÕÞHËúzì& Wù=-ãØƒR;z—…Í$ÄØ9•©/1g–Œ+0¢RŽa©ÖŸ’!Ž©’æí6dº2ñHaQÅüFUã³{)¹n”>qÉú{ƒÀÎûÆO}:Œ¬¡xÄb» ¨e§ž4–ƒƒD©m«&Brº£†À!ºýìûÿ¯ös8ÿ¾â0»IZ5b¸Èä‚@Ô>¨@äÑV®µˆ[0]¦)žU‘ƺ{¿@hѶ8ÑÒ|Ô6sŒ %¯.ç|9á†?þÊÝI‰»x-!T“$è37V HxáFoüÜPX(B…g͹QJÁïö) ’3Õè €öæSfÞ…0S¢Ü&ù§ª’‚ú¡ÆYÀ‰ØAuŸ[ªÙZM…S¯mÞ©’‚Z‚–@&kåCŠ´_Ö8ò4­w ‡Ÿ‡Æ*Dj8Ø^›" P‰À§'šþ7ߺ²«iO kkÇp¤V«¢©%=:÷€!< ÍdI4)â¦Ùq†¨rŒùwsȦñ‡\OfF½‚Ø V 8s“OÖY‚ ÏçkRrÔ,MT+"–5بš á×£TõvøHPVc´› ~PkÎêÑF~”Ú·í²_“îsá›&ŸJ¥QG|n"Q!–”çæ€þ… ß(µL)Bb¿Íík9N³Ž²DËÙût ÷8;Ÿþ\òX@,JxNe8PÈC2'scwÙÆ5õð¶oÐ/É'H‡ ƒWqÂÛi™zå_“"Ya‡HN «#’ ²³æ\„·L½a* >€„¾ò~~ÉOR¯x‹h›Waaçç„ôq亙ùÌú‚ü×a˜ŸOŽYÂdA&˜]å«EInV'7ÿÀ¹ùûsw(5ùÃÁ³užtk[< ;¹xý«š–¨¬A(Ÿ9ÓvTr“ŒLòbÙ˜ Ú§NÍÊšúA Ýc°bÜES°k&ènïå¤Á˜ÞßNQ£D\¨ßâów¾ù¿ïx ±£/G\¥pP3þGCïhITZnegÎLZøkÛÙ÷éºJÌr–¿\%7y› M=¥%JHô‰Üy¦ÏÆ À ewøí´—s6A]úG—Fys7숷ï±Í €—\P>Ò¸û¾¢©xeY_ï°u~Ù 2Ã>ÝÉ®¶)n*ó ÖB*ú?º³Çi6¬B÷‹ówÅyÞ6Pxo¾i´â´,AÜÙßÌ »¬ãÐc¨:Æ>’;š G(†KwregLêfH௹¢l¿~· $ׇÐKˆ\Éž­½TîÿŸ‹¡7,4 ûS¿AF¬o½çž!$fœGN9áŸÂ_ÿ4² 1Å~Nç;XšÆð5–Ò‰&ÉÎ!•EíÑkAÜÓRÂõb—C4JÂÓQ/‚^»Æ\ ÚUÝlré Ÿ_:«û@;U÷ƒI›ï}‹é°¿µÊHăd•ЩñàÈi© Åaî=  3¹(À¶…hÜH±ôÛ‡WË6Ѿ ³†Y—%Ñ4äRñ,³qCâÍlÞÏiqR:Æœ<’{&Œ..Ùy(ß $êçݰFs„S!(Öéà±Á.k¨›ã ’mw‡Yo%| rgá=µé¿ωÌ9—¬uOØïfw›~8¨£0 r¦N:ûÂÆOÚ>ð`4û½%n] F|û}Þ²;IwÛßIÜ÷³W*•ü7¢À℉oôJý¢ùÏ)^2=ú&–õ}F½’-çJÛ'޼1°F™>@3{”r¤EPX‡`\ÛÒøXȺÖT*l2ÝÉ"ŸOã1„ã†AH˜#ÿT]GSÈBêŠA•Ò*,‘²òPMø1! väDÙ 2Šx=ÖDãÊ2Œ$5Á€ ¬:¨²Âç8j‚ªœÆŽ,Ü(ÝûÀ ·&¦ áòɬ¨RîûÖ:!oHnpiå)¸ÚöÙÞRb¨rÆ/·ëØufJ²N‰ >pmªã!Ji§`)¾®UžMiHë4L6×ñ¥gŒ+—…9¥¼JM»ð™&p*‹àê8ÜØ_Ê©i-tîcÛüŠØß{üuæ=r¬^j®=Z«Õq¼ûg™è|SÆ%ƒvÅ”{âìr#ÚÂRj&«›Iø™…+`Éçqë9ÏÓ<û£š{x—D]†¨,P„çõWß©Næ\Õã%é`ó%‘LÕxÆ›·,!1ó†!û•9}k4CÐ{(s!ù"ËÖ7 Ï f`²“£H¸ßB5$\ž"’…Æú/­º)®|ªº1® 'å`ÞäHˆ,љǴý¿&ùHW<Þ$Gd ÊÓHLƒ8ƒ¶|a|íðÅñ#ÔÂvó¦íq[~o®ÛÉ:þ¹ŒMs0_KÕ2dÏæåJ•Ó¥ÅåžP 7W®¤Ò¡TOúòœ#Æ÷zWäuÀ÷rËþ#½†c³þ&‰sFÜÙ„¤SbU¦O¾iÈJO#·3Üì 6«m‘ebÁºå6Õ\PqAæá¥ìù§aâƒJ0îÄ‚½DÖØ´«¾ ภ´é­š "*†œ†õÎ(a¥Û”ö»v•ã°ñÙª]ªã6âRmTgzF&†ìH,òëÑv½–ã¯xàîÄ­•öçp %§áÙáËš|ýï±,¡™ ꙢüßNmÚ^Øq+\æ²÷Ù&sw a I(HøØåKuŠWƒ ÂlP£øQ<ß ¡ÛN% _ŸEZñmDµ«2)¦+ÌTb‰È׺éy]± ìÛ[X¾C¶¨¡r¶ÂlêqØÜø^Š¡õŽ‚‹>Ÿ< Í[¨”AXœÜNz_õ¸Š×í9*ˆ‡¬ä’¬Wg×zå*ϤJµrÊ:ÖÈOºÐDLh Ÿ$çµä‚ 4WŠ=ªr«6«ÝûgaU ej',Πê Þ½/d /uF€?Ôd-bk‚®ÊxU~v˜ÍÃö:á Sã%áœmq 15ïœþ9Øs ÛÂ'ü©œmT‚PBù«Àø%fè} ­óbÖR~10†æjµÐ v­Ôî°;©.$ xšTuÍÞ8Ô%ÿ”ë»ã•gaãi;k¿Õ¨˜0Tެ ÐÃ/­_4l¸êý•;Q[BØ«°ƒÓ!&ÿ ·µ§1ÖÝÓßêtèœp}»¶¶B¶Ä„hðmS·HŠˆ( h ¦zuÝÓà¶›MôR­Üd<´¡JŽÇ¡§È‡aör”í¥BéþØ4‚…Pa4wŠ”…ÂçCDÊHZ4¹… ~êõM¦­nÛÆeˆ&Á´ÚRôRT=x&a7Õ’ßû@öÅhZ$º9ƒ(ÚhHÑÙ¹PdžÖ‚½‹¯Ù´Pîîãšçö|Ûÿ:1\þ¹ºÜ|â©Cmó{ á rl øiÃ}ËòG¼áÀÏMr³&ŠrÇ’H˜…DC79%¤ íu¤Ké´,½+›@vØH+c³»X÷º£–œ&Ëðþ+÷Ý}.¥G»k|ø[:¹ˆ Y$ÂáOç,œì“{õ¹| /û™Ä/ŸÑ;ÁwA/+:»ƒOw¸²ªÝ„4AÒy¬ü‡Ð[V­ÿÕ8È” #açzÊ'3|å)Q?ƒF s“æ‡"­ÇWëËÙ€ âÖ åÚEðk¹RÑa±n)«µ×'#çR~^ý"a‘œ¢’âLòš×K?³ÆBç†tHÌ W÷JÜwæ5e(õC­Ú5ô\ ³`Õ'ñÀ§º"’†–ö›Éš³âoÑêMö]ÀA jŒ®o^Óö‘b#«õl*fÔýiÌ™:¤k­½º­ñXäïû‹Ãóõ@ßF×"Іãz—¶9]¦F',­ˆqz9àEÁЃԲŽ:.:FHi½e£ –ÖÁ¼ëÑ«ÚÌ$“z^¸ºfä)-™‰nÀÎéS3ø(9äÙ>ó2–}Ç[—ù.)75„ê]e7wI|@ÎU¤G©bÆD䈠ϣú¸/õI߆hÅ„ygnC¯M«CkÆq§ö-e¶Q Ô‰¹hgЃ“²@e”_"¤ ŠàÝd!;ôäþ˜ó=X%[¹õÎý.×/¹…Ì[tÕ-~o@IÚÕüð˜îMgB„C#´ü!iüj£Í‰Ö-ªà’Ã.\™aÞ˃›*Éèi÷;ä"SF–ŽÈÆëªí(  }Ô›… ½© ½:²¤ 6Oã«êô޲`]Kçë0 ¾­½ç1PbˆG‰MïX]Ÿ;³, Ò³Åÿ´Ç ÑwÈËwý³&©–Q¿/וƒós•NªOáa;p RJrR$|ëxp9O˜ô߉íùÇ଀SŸ-ã)j+RQ•¢“}zó¡æN{²>"¾Q¨¶°,ð¶ˆ.uvê”`(T`®¦ZoE<ÿ€2QVö†_;eöØ=“ WîyiÞ=x4[é`“æª}q¨Hìv©ì| `óM½NÔ4Ô fy¡¢¶äKÕM Wè©ÐH§?Oísôa޶•sçp°qÖ—1C~§4 ©Dr‚`ùŠ„}V8TrC”¥>öÕÝS1$þ|̰¿g?\]Ãè¦m§…ZÛv?Ï`t£ÏéáÕ.¿q¥\aÙÖäBQ÷yKÕ rtW´È4ÁU…`fÙAyu?à½yƒeÉh¡äµöÌšt^ì¿q¼{³$µQ~ÊN™ ¸ôÓ¶MÓ”ÙNÅZ«zi­ð,|UA´[~‰Õ;1¤ ¬Þý#Ì¥ÄÌ!< É²›FuËⳫ4MFÍ7éÓ›Â& m«˜Ý¤c‰‰v? 4m  t¾ñúdé0Æ“ƒ¬Œ?g¨+Š —PÍ?•¼ó&Ú¼M-ªaæÏÚ¯» Žœ„(µƒêß2Ôq©Z’ëð\A7Ï ­dCâË>?øj_ŠU;%6K€è«4º]2svˆìr†û6= z‘=×ÁŽšìrSâ¼Ð`±( VàwüÝÅ_/îñs‹yúþá…€€oz õ¬v²ýû«áBÖ‹… Ö#jõŠ´†¦Ý„fÂÆš8ÊtÎñš¼9œã;ºß+ÁÐÞÐ<µP·/dAš!¿›ÿÅ#Z+DáBOÍõžX„àíûj= ;¯†¦ÉÅ‚š˜"9« Þn÷wvn(à|­Ñ@(Yk‰ESªßWÔÊï߉‹ÃŽòE/¶;l+f´·}éc& º¾V þ)”ȳ¶Hx³Âƒ‘ƒíKÐ"×=|™zEçÔ ¯%%¹HèÛÙ¤ƒÊU5²¬«ƒç5\£ÑìýÃÒû”LJ°¶‰í^J¥•øðãÀ(˜y­ŒK­³IÒª°ž©4š]¿‡uPI¸Þ®x=êÄTÂ’ó"’‚öžýܯ€ªsÁÕ.&š+Cóü™¿R•ÐÖMfC/ÖUŽÆzõë]¯‘á~‚Dû§´[]º5õ)Dô£v ,IZiT[ºkÈèW2Òzâçû“ 6‰D…w±7ƒ2š;ØÍpùÛÍ–‚lb:úE¤wmöår&Ù ûÉ!‘øv‘ϸ™ëÔ(#ÇTÕ‘\Ÿ5-ÍhûŠýzÎÄBç[€gW<ŽÁܹ&{Áÿ²ùº< ¬ô— døŒEWiC?oÑ«DÅ}ÑF:ðöšÿÐß>;îà‚‚ô“5ÂÇ—ÓújÖésžF¯½¡ÑÀì»è!Hg\–ëÕ3¢@ Õ°¬’: 7¾'‰æ>ã‘øë¯;b? ˆª‘eÇŸE ì¡ÞÙxH3z=® –ÚÿÏÈ*ø±ŒL¨â½À:9þúµ®¯ŽtÅ$r&Úý:óéQs<+"«±½6Á´þ5‚ `Ñ^KÙ*—·Lfh9 FO{>$ÚRõ«®5Ƨ>Æ’=¡±—Ü ß6ŒÓ¨r¸E”Ÿ}›ùJ&¦[ÈÑ 5sùuÐÊ5hPÿŸòüÎ#fŠÅeß®ØâäÁ<És0ãu©ô{.K[¾ðY¬?"&ìät±“u¾Èì6btÊaµ*îIþ…’h/²ii˜çt7Í{ŠVÁ=Õg¡"@zM’]jÂT›§VÒº06A5PmS3­µ3NŸž)zÉBQÞyqë'94øŒfxLÄö:ÈAyøšÜ*–=ì93r"%³sÔÌcê2(òûušw9ŸÓ¶ý“¬Q²©ëÑ;ÈzÍB•&·Ý‰óz–ò›`ƒDùè ‡P!#¯qWVæ/×)žŒ¯AQ¡W:èD`ñË µ*Mle¹›–Ò:ë*þIÖ·Ö=&üX1¾…™5‰|ˆfsétЃ{=;«§ÜG’oe±Vs9alÍù¤/åÝ÷]f  Ì”©¨Ô»)CUïï¤Åew©àj³ßWnúU¤!ûƒ @¤TûêϲU %sú<54›D|§?&|Û_‚Þ°©n5¼úaû쿵 ¹ÛŠqaqßyÐké‚Îé}§Ö ®sÞx$„'Û‹ó¢³&xß*²†Z­2bŒ»‹j—[Þnly|ל)ṵ̂T+ Y,ºTgú@NtTœJÎ~½¥¬C“ÊÏZÃX f-ÜœãiI9ZÀúš&¾c5+¸i*Q­ÆPsÖNØœ—a$51?ù¶S:²”ˆ±Òª„À/pp^£7²ôÍ¿þ°s5ä×UÁƒ Ü„Evõ„׺eȦngN§¡ÌÆ{0Ò`ôöB ýQ§îZJE¤F¿sPÚaG?Ù}E,»‘ñ°xyÛ pÌL½ÝøGéÓˆ}îË—á€Ý¦æb¾oì“˺”-H”/Ø$Q¢w¶Ù®sù¾Á;±@n2`Ô;; [-;´²iU U]õÐÇxq´Œðò„ãS Úh\y=%ðû‹Ð·´Xß­1dÂÜWolë¢Gž¹æTyœt¡0ê¡ã²^›‡ #QBÛ¦]uYù[}­›ä2+® "©Cý·n–Fô7-6ˆƒ´œŒ÷Y,0ZûµXPñqÓÊFa»ý…0Ö]Á]5¤ý~Â)q¡ª»yƒùR[~{Pœ|ùmZľõŠ/“šã{ qدús³=eŒà«l$ðj)ÉO×±‡ß°Ëóe) ¢ÅøMg_Œ×üÈ݃fF…òrâ@Oc×nþÀæ^Ð è– 1 £ÖU†qšý €Ü-‰:å°…8cøW™Kp&ñNâÝu4P„õôÊœ6ÕÙó]/²ù /3ÎÄP±š…!Ùa: IK3d”§á‡´Iì´Ñ§rœ/(“B%ùÆ¡•Ï¡ý¬yXmM‡V½Æî³ÄTd§ýÅTÑWê!ÚØ<ómJÿ(è8emÞ~oP‰Æ Ú`»êp>Z_zZŒ•UßßPpÐ í/[ˆ7\Ä={e<-Xë¨pÓŸö…IÄÎ[ã—w¸Ã¤‡¦_ÓŸžéÆ<ìaºÁƇüôË­)KàG·ª ¥üݳ@×ËzÎ|©3ÊB¢ûâªΕ_àís4Ô 2nÉ+?›¯×`èÝp…OX[Â:Ã3÷dck‚üð¶AEÑQÂ8Þ>öž/¿Á›O‰£Öy-Ûƒ‚z¤~” i1ü¨Ü=²ï—åâ§¼÷MÞ'#pÚÔêZRLNYÈ]°ÂO1ôuÕ­ú{€N4@åÓdG¢4¥%m?h8ÚëVІ€ÖöF¸H£¹Â)d+C€§ v'·{±ôF°Ô¤(Gï=lâ!=H²§X#¦0~ïY*j÷gÕJ”Ó§rd;”‘EiÔÇí N‰f¹yªOUg ìœê”×ùÖPz!Ù˜…±¤³ØÉúÃ^w³7‰7fÂùÐ'jQ6|7\ò&’E²ž1=€¡9€ì oJ«; ;Ý'ó»òß«†xU‘ŽèÙöY§Øò‰ÐJ@ /nÅ„c+d-¾DÁ_-ÁtÀ•^S®ëõMÄxBе º'âYßX~.8K@óN;”0ÔDnÔèQ!PÂF¤Šàp-Åt~Ž4¬Ý/8ÃØxµãc·3…‡6V×RìhJr;RÉÅSïmk¨+G#a« h!6Ã!û õ‹—Ž€êqnˆï8É!@ÕÐNcÉ⇺V›C¿’°‹Ž„ A„šœ»‚ Ãkdà÷9ÖÆ=-ƒ.ïà7”ÕÈ3t#9Ià;¹§¯Ã8²GXծᦑ­DļæbßS¬ ñÎ ®¹îã'!iæcéI%ò˜ˆ ÚT¨zH¥øª4K†Œ^€ÇTµs[ÎI—-a4´Ñ§oŽ­5.,ÍùµS}½ˆmîñÄÔPyÛýÕpGT̸U•ÅdSÎAÂ"ô B§ù1¾XÄ/ÝJBÐaç„\àã3’ò†~щ_4A ãÅ€O¡4hËà®- *ù'IîÀÙ=ãÀê€-†L¬ñ-nBcï¸ôŽk¦’b¿zúå-àTš1á!–GMÙ¨¼ïÐJy¤‘¾™è„'#®lQ$­‘wx=ÿåHœS¤w‘?ÀhÜxu~ Ò†LŒ&Xuy?^‚ýÜ7ÁPÌ2'ïlÒX¤Ò ¸á5¦M£T-‡ë ©¤Ê4U YI„z~ ›-5´!j`8×£#vUCÚ1X4Ü«ØñÑ¢mË¿h©>Â-eAÛ»ø”Öm 0¦àè"ã]è³r¨E¶ÕÔ-ï¶™¿O9$%QåÁ:²h¶4‚ޏߓÆÃEý2K89°8õpÒPN"Ž Â@`d//â¿TŽ_ p#‰6$ #Äü÷rÄÓs’¼ýªg °mÈýÜ'´iÑÃS~á;÷@»¸×Y°¢ü„͵13¦žl'IÀz Ù¹M`ת À&üºÁûWq¸î‰ùkeÜlŸ÷–<\ÀÕïiî IºÍDž£ÀÏj¡üÜä¯ývTdâ'xš¹puú6ìíÀ@Ï^‘q÷'urN`tÉÿ Ö#*Š\¥×¦ôÄ.ÏÁm­ǰÊ=¼! ˆš…V„úŸ”®¹gqËzî 4%«‚FÕ4ÝCàHg |¯ú‘Gò37p¼ÅôcK/XFÿf™_í)¥—& Ê0Ðå".vk(wÛb­ì“hÀ饲Œ¡hûsêàËÒUà+ù…ç0ÔÊ'^Ðî˜ÓiYè ²¬¸÷,?—²{7-Ñþó- ûÔ ¨Øüi¥·³šz_šåÿ3o}ÌTs+¾PÆÖÇ\û² ­´:ÄPðPê/s§"é„«]½ßÚãÆþ_MN¨îÂ=@¼-Ó†™˜EHñóü™‹Û¡ÑcBèûÐ63û8ùéÒŒ»ÙQCò3/–/×L)XƒÃ+Ç×à8¥ƒ…‘ÞWžröƒw¬Öê¢ØLv^â1 Æ'¤1e«åu›€Fw+´CZ(âlVÂè&/!&+9µá_ÈûŸèÁýœ–²~RVFF„:õâ]&áÞŒ®ƒæKè v,Ó€ª%[ª¸í9€¬€‚¬ƒfj¾Ð?!íÑXžn‹&%®çé'À‡-”èªM®ÕX„ñ¶N梎Ð0Av[“á?ÂÁIÀ2/oÞ–…6âA'‹Š5ñ;•™ÙúG>Å+I_™ïèbJvªYÊŠ¨€oå׿ù¡»Ø÷‹Ðqš›‡sØt©—·,p_IᆕR;‚¿{ÙùËP«1¶¦e”¤%sûK8‹OÜ€²M7é†|¶ÄÜϡعÊ.Þ·káÑá^éuÞt¹™ñò޽ã_–×m¡¦äîÔ×ÞtÊËá îÞ,Í7¸â=¬¥¢Q78˜ŸD6¡ƒúÞ°¨¢¾Jޏú°È°rBŠÁ ±}•keiy§Šžè v0ŠšÎru-lö š2B<šCy½å†Åª‘xC϶~åéœÇd<èí©Ëûê)øÙ’AúE'±—ÁKsÂYbG|¹ÛD•@³ž„5·qn¡Äël³Å?mÔÆï™öªÿë<¢öJ£ëšB°h·ïB ©B†ëÉ ÏåÛÒ׃#!ö” ï†<²Ü ´,âѵ’Úñ0øš;5_÷u’ Œá±Mˆè;×õy/ýÕñ~] ·^zïhàsÒ=qqlCtˆøýÃy;’­8›øŸ‡ûÇ{&Øì~ì2¾S!Çþ„Tʨ¼©\{¯&æ suTÞìpŠwBn GPR¥eá%©…½€hhG¹ØIÕ§H§qgwU<-ðÁ¾|»ÏE‚È] •JÛÖ,ý—Žx5²“ÊígSg‹Ë󵿷f)ŸTܹ…M.P¦[NáÌöhì*Ãb(vÞ¯M3óY@£‘¥0›KL¶P”²ÖH1„,› gŽ2¬H}÷u´qÞ¼À‘öÚÛ)^3¨I bH’ ÛZFAÈ¥ƒˆvªv—ût¶ŒÝÓëÑKc§tý›;w™Qãx¢ø£Èœ^«°¤ - QäƒÀŠî¶vò<¹F¢© K¨é¢Èâ}`Î… {4wäº@9HÛ÷À6#JÓ$6‡2VÔ†o(û¦E/žç®ÍÝÚš Åï/Q˜5ÌØ.UŠ_dGã¯WÐê,âÁ8,,Ο⌠‘ˆ_§# £ÅÄZ cå"( ã0²©AÛÙnΟ8ÛFÝâ¢÷г¼Ð°+~*`y¬¦ºÓ:ßvµÇÈ/á0nšNýv¥<9­¨ÇþUÄåÏéwÜÿñ¿®GŠ: Eg¶Ü%´9Šã{ (0ŠXŽovž.床ñ å–Q1€‰ac`GÔüÏS²šÚ€‹Ü\t5AW)³¿+Ïú”yEÈYÚÆˆÞöê³Ýã³#˃!%E&†91z¤¡Õ§hÛޱë–í}pκ׬hðŸjmÛb“MtœÛ:êm°k„ó­``>äÀ.αL5Ï 5¿›+s tþ&}–Œ&fË@„çŠ ˜-JŽlÿ|±¦,*hsšÐEµ÷º˜‡É¼M –ts¤Ø¶Ö¡œ R@Î/58ÔºXÑ“€å¥¼n «ê¶ëO¸à“_Òðx&ðǦBj˜ì<¸A‰òq¼)Sâ£MDß §‡ùX§Ü{JYÒÁ€m Š Á9NkUÅùžÂÏÕÓ¤ü²B¶]åĆӋ³6~dñߥ¥8ô™ÃÎÍ2QÑâ!$0C‚$ØFþ[Tºs;ú6R2±˜âE£ÑêÉþ=ow|SFsg¤€¯æ«Ñ %ƒ‚= hÈ;¬—Y¶·£‹Yï1ÀW°@™A‚i€NÇ´a-÷aéÜ£à´{„>“ú­o$œÿ»„ˆä'Ö¿š)ꇑ=øúò³I=¸—]Ú#•1п£Gb:½NÁGŽ <êbt-|½I§òçK>‡[NB1 è_m%MgEü!g{VI@­WJ[»JÇ((:éHæm£ože‡6К ΪM T!ž”‘KV9-¡{>:5bï Œ¦?ÉïØ\i¦=ì*É÷MÞ§æT²Ê§wê‘FR¢J÷ Fî‰ðÙÒíubvjÕp/Õ£ò¸X×ïØ-¦…“ÓÒyR‹T Døy¨)õêœ=œfÕÝRй˜«îö /ÐÜŒÖ8éÛã*]rU—žç¤ob¢Ñ=õ\?0Œ• B<¦p}c^.ñŒ·>ï\¬&ºçó§€|ú3±F‘eŸhK‚ÕT÷ãÿ<µ¡Ñ{vNmÝP>@öUd¬rú=vO7`LÔ¨¾Å?×ZžXþbHF‚ŒóÎCŽWï ë¹€ÃnX@¹x`>m+š7ûMÕàCj¾‘í@êК»cb‘{&SYìþD ´L\´zÿ`·‚Ïžmcg/‡°|ô¿ò"³÷%÷ºæsuÍY¿qögiÁÁŠàCÔè"ŒËöЩ”%pX¸Ì’#j|³ÿöcýÐæ5Y2Î8“æGI=vÿÜfž[š¤âJðWÙ`c÷và……|Ê\K¦›ÍEÜUnŽM&V&ç@)Ê!NœÓÿXô[}ïïMkÛhÒÖbJ}–l‰ Yýµ¦ÕÔ¶´ ¨2 G©H5)Ûé )Û ¤ëâ¨ñ@QÄóµ„ä$Ì,v©å¬/4?–âiˆ \NÙ ¤Øþuj‚3 ïÉâXþÓÒ‹l4ÞO!/oPÚ7=¸M¦îû´},dã•–‡‹U²ÈÑd…ǰ•½^¼iƒÇýÍã,•‰õ¦iøìQ!~«F61c}„*ÉÓ¨Nðæ®‹Âઋ1IÈnzÝ r›”X,‘V5¡¥‡?O>¦ÃšX¦hÀÜ,G.ýàÂg5˜90ï#Z ÚR;¦à$ë¤íÙƒŒ+ôéÀlØ ŒÃƼXrë'zóm,» H¼ ¸ë¨A Gèø³o ³Tb‘dD|„‘èÅV|âà¸B†Ú]G«íeê›YÍ:†ê@ÇšÖž%=~4·]ïNó¯ÈdâMFO­Õî…)8&h}Ø wÕgàP`.ÔØ¾M΄ž¥*÷¼CxÚá|UøQ 4jŠf܉ýàç hQRî$äl @Øé‰¾ï6îH¶²î7ÝשMnëzU۸鿵û«ü¿>^n–õ„¿Í}þO7‰±ñ™b¹"¨ëÞ,&læ®Î½pe1NaÆA]˜äâBkóþZ)„i+Ua˜<˜Qr ñdµŠIc:ešÙqqb<†`°æžŸoýSEíO“¢°55TÁŒõ º°3Èú—̄ΰ¹‚s´þ5ƒdõèᾄÏ#n »/ f8RÛÿïZ–¶¤>®S´œm… IÚªÂÈ{HÊýã¡ê¿Ái âõåè:(V a°ôʆtÔ¤â€EtȘŒ:æ«m¶±ŠrW@éû´,B •çLÇÐ0C å 1PÉ~âþ‘ýnëY·ÁµTÃ…Î?™Û—Hõ@™÷Òq¨¹6¸]6€[›÷´¶…z‚/×>M¸ˆ„ 2}×r¦¶¾°¡ÄÛ1ž¨`òS2f>Ž¡Øäág@¼ FcU†®Ì´e͇Þ8 k‹xþò1ŸL0÷‰¹htåÁÂDpCm}ÇL-ç¶ 4‚µ“Kþ B÷²jJ±c¡BÊÒ/%˜+µ+’¢W¥ -ˆ7øßK+´@N<¬¡N—þúœåŒ;…ܲ?Äè–ëUb»Gt“3ezë! êz-b cS[Ñmöh«­Užmî˜m`°•xx:M †VUšP"¾á> Xç™q‡ñ¢ÙßcÕ‚; m–Ž›* …^˜‡]°t¦¨ú=ØPÿ¤Öi“«9†éSS\™ÉDãmE!š†Öé+Oôª<úJW^œe¸­Qi qC2»£bÔWÌŠ}n¦d¥¼”†”1‰³Âcg+e…{;$Õi|bp•6ðH1û™LXˆU7ÄÀó~•«W™V»%9àáuQ~ g¬¸Ô8Šè0H†§mF߯õéåý÷É>Ê0^FŠög6lrߎ„¹©ÞDé¬|Œç0I*VÜ[V/f=È™÷2¸E¹´¸d¹ÿYØÔÁ‘G\w²Rig›þ”ò@ŸõJ„UÀÕšõ@¢Ê]È@LÚçQƒxã+f@Yc û 3rÞ#|à¬`ÿ»ÆÍŸ1ì¤g»õ-~ÙšÇÓç®yÃÛ•.ÕÄm×°•Pr´ë§–ùÚ2®¾Ü´\еꈕfñ`î˜í^ê!Ž4(eNtîa‰m€Û~H¬ŒtÌ{|¦_ý¢âòG|ft´¡½óÒ8B|æß¼ïyùôLÂíªõÎöX^q½MÕå×ÃÇRÖ¤"u׎q ÆZkÛäqM)~»0Ø¥Ù-Xä™(ŽõÊ“ô‡A‰Ã†—ÛBÝ™Mómqm9ÈyÈ_6 Wâ—§À+‘×Ç' AÕ×F”³Xâdtª÷Ã…¶¹„ºne»Jƒ+ñ¢F*C/¥wP§ëÒj¯^ æÉu·B6 À¸%5bŠj¡'dM8‰5"éèm¯4Œ³/­I‚v6”xì q>RR—Û6Ë\¡¨·òiØ”ÕÂÉïÌ:“PáÑ.8Ftþ©~yŽ/¯"ø8tÐ*s«²ÕÿÄS`cÏ…öíÛþ{¢Ý¢ó«aÑê1Xÿ!ÀpþšúÖëÌÑý< ù¯füéuźÎCÿ>Ëþ~!i4Ø<œWp*lßm‰T¦–|Íf£».Ãýù :éÝ®¯Ö&§xÜá"&"7²—“ j»%ÛfDLÄð´O¹ˆ–\³F‰|/L‡¨JÜ€49£$ÝaN«åKÄíYíÖøzíØK´²C.Á±÷%iÈs$–†«©©|Àç…>¦Ÿ“oÊ5A{Äì®Bôûκ£Ü §×@º3 ö/¿@^¨!]ÒìË™}¢ÀC¿(‹¢¯Ì‡W7—F;Ù«Ë‚§  p;ن슮 5ºˆ+"[gíNhî1J“㘸¶¦Þ°œ¦ú­ü³Ü a±£Gqð4$R±Ã­Ã­ø¹Ú¸vˆï±”v@ÏaŠijÎÿ(BÊN7ºàû Í引ÓhÜÍbí?€ ñ_äð2*E’È&0§¡ªl‘j£w"òŸCÜwk0ž7 A;(•ø*Ç|×—ËÚS…  9ª|*Ï:€æ]ø•ú›ƒQMcDØ5”N˜Ì—7ÕW å:¯Z&¸€µ¤”;ÚK4¯/ë:©_+ã@F©M²ÈÃ>ðÏ“µ¸ðŠ–ÀA’òs&_ÎÄ56rã·g.ÂFϲmâ†HÚ|(jJ œÇ¥Åžó³(pÚß=ÿW2&ËzoÊ3"‹‰Ò·A* FC=UŽCuƒžÖÅçaG¬2î ˆAR°Í[/Í™;¡;e‰ B‡ØBô!±=7ÓH—¸àXÃ-樂;Œ§ n˜*vÝ¢†S¥£¾Âv†—Ó},ð6=…~–è¨ß¤Õz4qïգ߲žsw§ªýäÑ@+‡KÑ1‡©‰Ë&؈Œ O9’üª¸'è»þ.Ÿ¾ñ¢HHˆÝº7ÆÇš^PÚµ õŠ´‘²óWóSP²Z|Ñ’Í&ÆG‹3täw*†ð­`»§½×ºÍÑc€¯ÜÀ´­§]Éz´«]¡Ó°7î[(eÖd¤ˆÔ)´÷UolrM²o/4ë e ØÊ<˜d¨ÁÉûC‡`ˆ©¶¢Ý¤ý€âpÁ%„.Ê¿’z€ }žO)‹,–¶ãa ‰÷+äöÁ+»"C&D ]aönŽ[ñ}dÍ1ÞÚRÒ„ìÕÛ­¢œ@éýÂH6J3B攋\¦{ ëP ªMWS3ã¾a§Ë‰­¨Ùa×NÝ€w!m«%Ñrô?QPö@ölCíP]vÓ±MØKJR©19fqŸØÖpw³å#¯– Ô Ô?Ÿœ‰ mõIàÉˤúœx«!¶¡‡ªrÛÌš)¯0:* ËÅÁhí  "òtÌo_æ`M ðZM!ቓ²ÇÈÊM|pžYQ®ZÏp&èÑVAiש6„0È6ƒ¶<0³–©-K´oRÇNÕž‹ÀÂÍv°“Ûw¤—÷·žq”åŸ:9,@•—•ƈiƒ›¯½eRZËĤpÿ¾ñ‹hït•1olÉÖg’ÜíúR¢Ý¤Ñ^©Q‘®)…u‘=¿K¬Bñ ’ˆŠèÌ[E£ðJ˜ù×Ò‰,xñÛÞövs›ôÄmL“€yÀì—)`c¢½ò›ô¥ÆÞ&R‰¦”‡TvEowÎ]'èõÛ‘•׺œl9„1‘‹€`¶#+´ÉŽà+)šÈtéÕ‘õ W¶åÿ'A(O·Úõ/ÿäáèNäÆeœ4—M'‰¹Æ‡¡9)ÄvÅ7¿~bVíkÙãñö¬]'b. ÂÞbݲV°ëwŠyŠòõ8í1G˜uÔ²Ò$¸ù‰áR€uóTZ„ág79ÛÁ䃊ëÖ£±%ÇJùØfù‘JÈŒonöm) 'Â9³Ä,%!ÍeD eqÄ4 YPIè"SžÇ({öñy™@æ»u»0«ŠV:þ )ºÐ°:Üׄ/c®_• ƒÁœùPJ‹ùj`Á¢+êÇŸÒ>cšÁpº9’ð3g#æ¢ØTM2XndžA(°îÀ+íWcƒ¥×%%oá:‹Ô†iúчӌÅUSI¾þÔ±—G–ÄVYg ÖüC¡bðo«ÖFøOOL Ð’£Æ˜Ê i!*[ßIóSÿèÑó ²Â¾eqxeG:–py•Àdp~ä^[f«´øš$XW—ì¼ùã³J̧Á-æd\ý_3_Y޲ÏÁòê¢òç•ièÔÔÅ¿+©ËÚ?e–ß= lÉç ”à!@9 —Z@y`j}î2`7¶öý Üªµ}Lϵ»©£1c@ÄJRÔ†[k†Á.Rvfꞯa¤ù8í×.OFúLšò{–ø~|áß×U'‡‹þ1¼éA#N¹sU.BGY™7oà!MÓà ]™©ôÏœ2¢}-ôb«káàÉÈú|ûNõ8ð±ÛjëcX¨Ñ:¤k©åÊ+"fðÝs¤/›\¦¿¿qD­(—Â&ˆ‰SÃ)p‘Ld‹+x«O_‚Ó#=_IªÚö-“¸3tµ×ßî±'‰-ç^#£#[î¹a2“! xÃ<{…ÄôìÂò±ˆtZ§yêb\Ïw5@{ol‘E6‡½Ò]׳öç°ýƒg³ûó%iHˆVÃ4öM¾EÜ?]¹R6Ï®ÈÄ«X$¾c"yŒRÓþýµÌSm³I=-ñøÂ‚Žx"Hµ±ëZHÊ žŽgž‚$ç}î‚bVÏìf& 4ñ*öE;Äõ•¬ ™VlE†>q&(OS@ð8÷Úº¹<µpoWkX,¾Û‰ … jøH¥ç4Ö "Økr0\“Ýd͸¦É“Ń è>É®Oãƒë¡ŽŠ,Ùveï˜qÁuÕÛO  t9RK@E€øÁÿ€z\„%œšP;?öDP¿Í*tì§xvHlÐyJ¢§1} ¦‹3–RÎþÆ8" .CrW„A ôÊž‚¢x¬z_ƒ²ÿÙ%3ˆµú§-t R( ‰—©–—†ýD7âYߢÃr$ˆKã$ùö µ%Ï ùÛ} _©©7¼»N%•o%wZT¶#ŽõÆq5„Æ0§7r:û©Ë8rÙšU¾ƒ«ò†—(çM!€336p·ÄùH“—?4ÅO²uUïÓHÄ"ó\øntå<ÌzÒ4ò>«ŸûBû$N£˜JÀaBõ‹¶/µ’ ¼$‚ݤ½yô[‚†´ÃþMò{Ý4æ;A”hжÙ³~Co½ Žé²ûßã{kÛȦ¾•‚Ê*B*Æ×Ö³ÒLz1ö8ÔêÁ¥SŠZƒùóÖÜf nÄSUöÕ# DÉ÷zïÔveàÒYê¦õQÊÆÓ.kÇ9×E:Ã¥Söj²§¨C°2¯œúøg›“Pÿ!+qÔ Ýüž(£(ÝϤR|Ùìs£sºÜ7Ó«HWqÈKÚƒ¯YÙ†Ž«pÀr_»‡aœjà­l4ïT†„ÖDí™}½Û±;?d¶S±Ì‘ÌQ#6Q&^Ëœùýƒ²}lš,¤fyc²/£ÒÆrü|Xð9 òuç.iîÁŸSp´NÜëÜÉ'– ‚Çã?l‹ˆû˜÷Ó­cÛQæQ¾T­rYö:6îcojióìïÖl¼Ïw_1¾Ãq]¤ ê67}â›Wß×ëGæÂ©üT1 @ wO¶û•‹H[³Ð†|TB°nøHÐì,ûWms2¬¤®1*p¯jJöx¾O«†~kè Ÿ|Ú¾Ò4’h¼3}ÌŒ~¶.¤"ǘ©Uµ¼Ÿ~Ѻ<©3#ïᲸÎô7¡…á€]Íìè|Í”v‹× ÚË3Lªíßewëî€&ÍÎÔÊê”=¤ra5 Ç®õ9úµ¸^Sê†À âžÁ&ÌÛÇ·ø“L5\ê¦#²4Ë‚;¯hµ¦†•†y¸ £»Û\W¨ÅˆA7¬±èš—î0ûסÁïØªZþHŒx·»`r-…¿ýá ¡ìi¹Bô]V¬Ú­àÕ{ÁCeèSž¶4\Þ¿# ÍK?ìIÛvª¾ú’$¹S•¸&M›€=ÑSŸÔ¶ñâ£놦À}äìd…¦½~*Åxb«w0òf»Mýû™“dŒJ¸¾jɦÑ×@eŒˆpkÞµ çýO^ò„¬ˆ{¼žÕüÚß'å#þÔd¾\ÌuèS© Ô@…¨Ì'ÌGµÜEA›Q‘£ë.¥EH!ç/1¹2Y_Ï-Y;VS]O¯k•¨N¯1)"çÝLÐÛ´½j¦L53Ú™S$tÿ¼§7¼AØ(PlÇ®³ÞÎ1Ësל‚Kªæ!QaÔ>f°¨–E…¯oÿyTÌ9Ïb>.y峇†å Ç‹–qþ¶‡†Iš/ä]5kãs÷È$óu*6LEŽbjÉÞÞÔͪ°¥b~ ôòa½øª”Ð[º]WƒZøÚ˜×Ð8Û]PêÆÝURÒßP3 lûVÔ}8`¯Á÷óøoŸŸ´£½ÊŽFgmñ7zœÙòECI ¨¨Ô¨iÖ–vi7«X0è+M’O¯É»Û‰ãã+ÐzÞ¬|Ë<±%H`êØƦƒ£>ó°ÝƒìN@#ºáîgcÖép…]Mˆß€b°-r¸º®ÝUä©xQàõ‹­$ïÕ««8¢"MaYô޶ßký<=©ì·N€ƒc»d¯vþ44fcTš(ô3[L\ÞÕãF/T“O]'9Ôºy£áù|!p¾ ,/Q/à Ô-)±§ªí% Ÿ¤€¯Dàd„¹¿ÝŒû#ÅçM ˜¼±­1b(`0ñÇRÄ‹ç¶HÅùê+Wñ;±Gã ƒ‚žV§_…> £iL¾?`9‡gÌê7å½Ú‚]÷µ{hžž¬g­û¥øô,=7ŽÃA_a5°žpÁ4ÎÒç=!{íçŠk•ˆNÜ·ÝP[bìÛŒ½ |Íœ[\’Y& bÒáH¬s®5c¾¦£´'ãG©v\¢ºR#Ï™ÏÞ®ß@5ÝQrñŒR“³nÁû€ôÌ:&‡‹Òsi²}j]0<Θ/#(3¢ ³…0Šì< ¦¥eicT@Á¡µwu70î%U0M¥JÊZçÞ*—EÌŪ§u‰ì´Hq’ʦZè!ÔÈkF#vè\Ž„Ñ(c#»gåª;¶›u6Kûâ)±ßY銟šŸÊÊå>yÈɔ蘗ßÁ‰!܉#!ì°)9ÅTWÔB ùù!ñ–ÎØ·¦öß{Ñ,‡ïhd¡ê)=r)šÄú˜™ª,ż·îÊ?*/—ƒ/YÖMh\•f]³¬) :[zäž ½X­ M˜ÿ÷ž¿{œé‡MáÇ(Än4ØÇ©¦½zþ¬é«#Û‹»Ùöîp>CWÜËóÔźóÁ€~ÉA» K Ò¤\!‘:|vz…[!uæå|^~š\,‘+•†ÛÍCÇGZöÅ~ 6M¤qPa‹ Ë ûd%'áäã逇)è*0äëÓXóDåŠ%Ù³ƒß‘í;íÍÐÃõÄ‚>œNªšÎ$ù³tÇãYW,ë»?¿‚)déP T£n!˜NºìÈy²Xe`i_f{3—ÝÕ½ï]µjµsø[´7ÆÄ¢ÖϬT*„ tÌžu×nkÄáÙPÙÂrš“tPÏgÛÆÒ‚©ÑØÆ]|ýÀ:ðöIãÍÊ$T p^N[ÐË Â…SI/§’e¹u¦õ{ù@6Ót@Î’g¥â.”$ lÕJ/« tº*0DŽú-8®±¥»Ù¡bžãïÃ(í§Í~G¾¿ç‡ Æ\ÒóÇQ "*2ÞóMqÈ¢HWþ®Àd9×Èœþ™îŸ9šHC|O`pc=^Ñz=R€\Ç/)áÿî¦!d&³ãª5ä'•ÊßýOgˆüÞ$ÿðe™°7“ˆê‚~øtZ–7ù¾Oÿú¥‘A1áñO±nEXI®z„Ô6ßêñÒaþ0×å±Y"ÊVl¼Ë¿¯&Èd? ‡9ÔJd#údšÄ¡´š~ˆªÓ7fЍS¤ñ¬»ßœ5й*$èú%ÁH=T¦Ï‚*¡óð%‘ï)RVG"ÄÄ‹¢ˆpZƒnÖ-qæ‡þ‹€§êgn7Áþœ—¯« ’A÷CÁRçz{­0ÿEa3iw¹#Y݇Ӥ‚©^é*CƒÄÕÇo†Þò›û Ù%æHkÙPÿ}ŽÆioKXhPÌ5¼T©à2½2¢;¼ u¤ÿ)@…ŒC$àì¾/Í–&oJ}ºÞ,7‹ž˜Ï/ºæ5ÿ  –’ ˆHA|“‚¾àj^°¥tï,N{R+.¼™,‚åAÍbuIÔÀé÷qFÕŠ“šúÎý½0¤V{ÓÌÁ(~½r\Á6Éœ‹XÊZ{>² c€Ò¨—ú¬ð+»7« €ê:}äÌ£ÈK¶Æ Éù™Üo´ss>ON2aò1Èü­ï*bß«êô×iä;…òZå$$Ì7*1*µEwªF¢Ä•<)=p9^^S€Êz,ËДC¯åí+gÚi&p§¸Õ-8&ß&ÓÆfHô¡xú¢Œné(ð–%ÇûK7§WpÏ&—­dXþNv® Äë ^Ò¤ç$̘€á‹g:j4û¨k Ä"Àè•ÝÁÿ5]£BD™Ý^Íb3NÞКŽ²¬"œoÌÞ>4ÒµpnUë3páBâùаm"‰qˆ&Çóµž9Ì·©MTÈ‚5¢ ÐóùÅü;" œ¦ìK‹íýùaŸïùŒ&(^[Ø¢¨m7›(ïrÔV"„„]6ŽZXyˆ#'ô €„Fà¡O£òX»N»ª_«ÙB#b2°ûrÌ&Ϲ¯ô$]ê(übVI\8M®/šìE-;Ÿ"+¿g^ꔽNèΧª_Ä:&’·0ßM‘ÙööZ'Y~ÝA¤¼œ÷rÏ©"±™ˆ¤~|I@o%,akâ,Âo$dèg3w¼n=Iÿãöëweµ³h—Ùûêhäà¥Ö³ñÎbhçåâ7h׌FGöøÒäŒXoGoí;‚gø¬p„Ï(ª;R¶-ÓÖÿ,÷Cšã>A…oP»ì|_‰ï¤<4PüØY‡lúœî:95GxÞÇQ0 ÃÒA8Üöس£v±R­¦>{õé¹SC‰¤òƒóM’æ^ÁrŸzŽb¡™&]£gú90Qís‰—/Þû°cÄŽ¨z\x–OÖª© kÎjÊÔ 7ðÙDÚÚÚ; Zýî°k ÷x6šŒüä;¥p©ë³“fˆ(Sj[É«x3CZvÆ¿}‹®ô›ÊíS/£…Œ ¶û‡@œƒ ñ²:à 2Jêÿ0hÄï}5Z~Q23«Ž MYôèkóJÍ·fvø=m3É{ÉåÛ”¹É¢°1°–S󦿹“ Ü69lÆ2mtj§Í¯#àºÎžb|í(¦IÓ£^&QsŽ&Ñ‘˜ü‹V‰$‹¶°o£·ÓFô²$Õ«aŸáÒ~Ðè{âpÂÍÝœþºhö5Ø"y•šLέ$ÄÑ Y )Õ«RA$ à v©†·ò‰£ÚK”$Î`ë­ínºìN'I]L6`©¯€_w çð›þŒóÙ<Ë17’u½ñÂÇYèª)^‰Ä™Òh€„£º%÷=g䨃ºhðôýlåÚDð>ãûí!cbåˆyRK¶ž06Y™‘)¤ÔyTË!˜¤KöwnYVÓG‹éŸ–/Œ” ª[!=B“_Q8ÔÚ!¡’çp›]Ÿ†¾@e’ºWÊ0ŠQ³×2¥ ɨ¯, ÆšÌO¥¹H‡YÛÎÆD[™±‚"@/X(VŠT p•Ñë\ûë¬1Röä*¿ySkŸßÑK‹–Ø $ªÍZe<²Eó¥½mDK,Ïá3ŽÕ›@’Ëpç1ìÂElû• i 5/ðìŠñ}d9¦Ò0ÿp’ßzæ\WÒ‹Œ¶?{Ìžë'F%Ÿ¶b›úztNEÓÏWÈ‘+lžAÛ',è*7Jú—ÂÕ\Ð=4"%s?—å*—Z´â —~¥–†A©>ë ¦3‚5"x©reWÑ×-ŽÑ"ÿ’·¡TÒëЪ¢zek¥®fAç±dãzA7êЪoé>M^õTü¬£›²ˆ A ª!‡Ïé6ÿÞtSl?]¸Yì¥ññjrñ—g,`.5„¿á4(¨ÛltçMÿa«˜4Ž!ÿJ;óù”Œ÷ºqLȱũN¼ü¯«©#ÉÙQæû‰–vŠ>ƒ*ÅC¦¹¨t0|BPÑÞéó‘-ßì!Ôþ[éŸæÔÒ¿Ÿæ¬´ûNš+|–lú#m³~2tÒ?Zlý"'w11)È"Ÿ­e"ù XÓüø½EƤS¹0kÁ°õnÿêÚËšl‹3ÑŠ:$­ªµ2°-h`)‡oý+P¦Ê1 Ç>ŠYè^—UÖ™ÊLÓOóÛ•¤ ‚z/Âêªî»ÎûhÍÊn#ñ]°í†»ãÃí;ÉÝb(‹èKkM(Ù…!F"?Ž¥DŽ7: H9bà­\k\)w9ènG¿!äÙÌ×I»ó+ «Äï0ɤ­ÌÅp ÎÔ…!Ù>XêªÛ€•]Ú•$®Ý6ŸfµÖ¿ÆzM9•¹úžw@>Rå‡B‚SIíDŒ^I¾WqþÆôè¡`Hg€Ã{Dg¬ÿŸ›]„šð¾—ýå5‚EåШ¥wÑ–u5Öêægý}0ݪúQo6¹2ëïg½œ±íx:ß'¼ÿf>$¢ ß2¤qN ·¹þÒNiß²=< V€ÃÓž{’^öpQÔ'»¨y¶8á `zö ˆê_»”úåÇóú¬¥S>/%VýìäBªÑ4áß?™õÔ§mÒ&ÃsçšQ•’5&›1º[vk‘Ou{ 5çŸö4§¡ñSè:ëB΃­GÛid{Êu.T¤>æ!‹; ïD4ôvêF¶tæßƒI\"Î4²Äõ¾ã©I¯Ôý¢šäÚcGHˆ/F ßxœ"ÚÅwwºƒÌ…Œiº„A5|z50 ðÚþòßàû&“Q†çq˜:êÄ(¤øÿZ0‡©s-¯Ì rÌÞcÐè{^d^sÕc^Á,›L6] q¥¢*¶ºˆz­s-¸ñ¼Àõò,/X!B ©Q «üá”o0më&xÞd'ÛIA™+²÷(ìä( ¯-ª[¤KB×~nÇâ¾EzLý³‘Ëd×P/t„D¼œ…ã“ T¬õ0a6¾Á~w"L«ž?µâíLñ¶G>1—s:¢Ê°È«ÿ²›±Ï2=+n+U"ÄwanŒºõF\L(6^&™†ÐVKèÂ$à£3Ù›t° [>Ž0'N¨Wïõhœ Û&vDüoxw»ŸÆ É «58]mªO¢c5Â݃÷/¿Üm‚~÷»ö_XgRNàoÐFÀΆµE;nò ¡]ÁŽÚ¸RÞZg¨…¥©R)elå¦2±{›§ÄIHŠƒuYùYbJyË»ëôo‹±&\fFH iï…‰ÿgýi4Mµ;9h!du´ tECïéÄ´ÇõÕÞªsgÿ”àšäY®ó–{¦iT)]a‚b#a_|”L»aˆŠ_ön&s¤R‰Z~wÌåóI$‰zl(º;ÆIî3Mµ 𥮤ïðÉ8Rï¤û'“Qý=‹¼É“†9—¨a⛜Aioóù¶öÏ›?4p¥·ÅF²;7£…[È»™nHïÊ·òÝðHÖhò0³q¹TmSô¶%ì•L-¤~>³¿Cî‘3ÜLL.»¬4’höX±ÍŸÏ˵E*#n‡:€èwm´ ¤k]b%ȑ޳1óú'Ú#ôƒôõ^-÷ö–—©<ÜoFg§?- +£<Ñ@ä~œÁQqðò”MäkÕ‘˜"ª2¶Äk|šÓm‹_:¢‰'NrpÞ z‚G-›bÙŸÓÔÔi~õè¦Ìy¡¥7ëŸ^7…?e«Ôç“ðÿDfyóˆ•u‰¦€ 94Û¨m»†ó$Ž—˜:LJ]Œââ›1gðFðk“« $±u ¯óG%'ìå1>…7ól㢵ê›y/\–´’¦N—ζ 'Üc™lQX0§¸Ú§G§áã2¶bŠ[Å1Â+õ]àgHÃåjze’ë÷á-Lšä`3ÞkéÍš âúj³ÊCÔ”å›W„ìÅöúFi…©æS¾ÚÏêèË)ÓÂØ)O¿Žü£4læÜÛÇzþ¨€±y Øœ‚à`’å£"'àX·sÛ°»” $I\”@—µy½¯ú7u…‡#YvÊûÝÝàÃ\vü–Ùvb6.7·Èâv``aJžŒÈ”h8¿{OËeªUÅõÂüHøã§ÓŘekGb}‹Yœ/·Ç¢š%Zãß’Èׄ`̧¬«µ0¹á€ˆ $|ÜsÄsH,høy­”¦±áŸ®õä²Éþ§*ÞlætÊvgåjKæ‡}S'­KŠÙ—Ó§iô÷ŽÑAÅ;É(aj©¿c‰ÍRðü„~‡ižx…Åœ³>;JSPðÒ+«ó 3†-@÷!mÿpªF¹ì´ñù›ur­2zoí-2[!ô 1î 5–ËmÖOP)tîq‚£sʦ•ò¡ª9ÄDÅ}Ï:™Ÿ­‚!ºÃ Î? 0nÕxüäXGÇR1˜¦kEºÒuæyˆ¦t€z(ؤòªðí¡DÃ>íñò‰(âY¿Dr¶œb31›üÞ˜ZÑËénNºg¥Ú o oê™âf¯‚au‡Á¨UÄ‹£™&–·2„ÿƒ/ÒÏ;gÂT IrâøA…Á<,Ûò0¨<5ñZŽÆDTs[Ý }­›ûW¥5ØñK‘rñ%’ç\æÙ5šBUüÁÇÀ¿köl;‰x.œõ™nsèp¨šÎ„´íbÂ(.…5(6²Â‘Ä0=u!SCÄb+ÄZžkG˜‡=‹•¨1y¶ç@‹lD; g]güõç"?D–®¸K‚‰w„=é­Ýýª$í{AIën ¢šGy_ϼßB‰³X!?ô½c³*Ž8ò𠡝”ƒ„*–#8íÓp»Ñn¢!\ I¶ )޳"°û)OÛ(å‘u‘ÇYê(WžœÊµ§dŸf™† ‡uó7µ«Œ[mW¬ýZ£ ½zóŒÏ“­Aáè“Ï{yÁ$—Æ5X+‘‘ýˆhm¿Q"KDÔUOV¶Ð—d;ÎäQ#ªPÚV%›·¯‚ø@6cLÑ`â@‰ç õÒßiV)<5ÀÕÿäsþQ=ö5jŒÜ-*Ê1ÂEˆfdýj .AwLÝ3jŽ”'%“™‹aG[Ê÷ Oàh^¥qt$dz¶¹–ÄNð§ÉÌo>1ƒ½Íw3ýôwŽ™BåÔPVÒ¼åKê̺f;´4_oÞ@urp[?_æLúÞ]ÕÓ#jr%Ô.íR2èí¥Ìušã)ˆî<ºžyý¡NãD' õ¡f§í“X$j'c¬Qdž®^K¼þuQŒeb·0.Kò~{>Ä ZÎ{_Y}W‡êNPùD ÛÓ­‘ÏÌÑZß.äGˆÊV-P(¡÷åtAª­ƒÀy¶€³9…Šuì»ýûyéDÞùîï5wÚ5Oн[´(î2© €Œ“ûß=ˆŽR\ÝTñĘ‘#') ÆÒ¥¾ho™søîÆûEaâįJ^©@9˜@ÿy5é§O¬ÅýëõŸ·ot‰^Á¡…ÓÖGáVìNØÜõ€æ'ÉÙzôIâ™7Sµ9møñy*â„È7±"ý>á~VrÕ²"ˆ½’®|0‰c?ùÓ‚<[ÖÖq‡î®ˆ8ú±ˆÃ}dguÏäÞºê×Y–yÜ–¥9~^beڎ‹™Ø x‹;‹¢ª G¶¢¶^»´N Rž?NQùxkq cTr:õ÷Ô¸½'„æ&ç(Õ°ŠIJüBòR¡ÓT}¢´;ViôÊ,!}‘ TœáåšGVu®ÕC¢¥F/Œ#‹’X¼Ü©" Ü÷8ÔÓçf£‚å˜u±Ë¿ˆ$ħ]çlùã Õ¼wÝ>q@ ŸÛeRžsMj ž[2æc™Îò(,\Ÿb×sºLì‹ ‘µ³ç»¾–òÓÒM¦+€硯®/mݪÂSÆ<M±'å;4Bcœߺm&¦ïËóÑÀ¼÷s[!Rhñ#:Èài*©}Ù+É}‘§¡•h³œ¤-^`Ø5ç Z™ WSï¸Àv)Úóó­B{8èµgO­~ Mëf]ûAä¥p&€³V5ßÌ¡`Šb» "oQë Éíb4$\Qà´a?˜ž-—wRL‘ƒÜOçYñÓKÊ¡L²ÑUÙ\zêÄdŒ Ñk †ysši÷1­3ª<8ìÇ ^áL­½i„å‡?5*^„U…éWŠZççKQÎYo Ès¸\‡‰Ms–KÎÉöKÌ{vyÅ՞ͣ&FÃ!`0"F™iì¯. ÈŸp瀧@ØŽÊžqk’ Içߊ5{#%8ïù Œ:¹âA¹-ÖHzbœi(täÊpýØÃ…gD†"ŸT{eunº,žCÀ4ýdEclhMgsö2mú÷e?š·<•ùé-µªî(® (Äo•…F¥cÅ ÍÆÄ[õïnŰ`+¦óžBËvU‡Ñ…(À©û9“®s´ÆX‘?„ ¹H·e|•ßê8 i ŠO ÂI¥ãä;Ñ ºã¡«ë¢pc°¬´APŒw’‡Î^t‡§ƒTSˆÐâE½ÍëWi{êh$Ê I_OÙ‘üYÄiêÒ¾ãiñEÛ×­Rš&º¿sÑÏ7x˜‹¡´//§—]À4õÒ_,Ktí¡¶ÙÛ`û|<”±!à¹Ts¤È¶1:½öTA¨üø¬Ëùq_b™ ºà¡^<^kR]4+¹À÷ Ö÷°÷QÜÏÃ87?fûW‚ñ¬8Ø;«,ûzO@o {W[€&ö ]±I™NŒ†«Ý é ¸'×Gbî"ÊíôâY«š5—k‹Ì¢bó•è2ÒKï Åÿvr5Ë6c® ŸˆIcœ|5­UK³cÕ¾QÓÑlmÜðu/Œ˜|v–%§Òèd‚àÉÂ.k™^NU|(~¹^ðg€©Å#á=·åð+N=M°ôˆºK·¿!3ªðÌdG²2û1€9RÖËg”tUvM1ìâž"²=‡N ré…`ÒÓƉ¬k¤PH“*ýó-Â:G¿X€%{vüÐ2ôX1óqýùY.‹·íÒu1o§}$©¡Á$Ë»o‘¹nã >òÌBêW :™··½î8­ y&µÌ½@-‚ Œ½+œE>\Õkce™?]¨E‡·dŠ%‡B6‡ ¬‘§™tâ]×ôxTè«­Œ!¿¨!åÝQZóy]SØms%ä 8•€èxŽL YòÆôyF˜Â»gÇ-_¢hdôk†D–·7xÜâ_ «M›·tÜ‘UZ$wq'4çvBep÷;´òã)Þ¸ò < ¯ƒc®°/W‹D·Lé‡7íb¦V§ª—nÁ¯÷kîulÁ@— ¨®.¯:ΦlôÛ‘R¹ZP"5pØXâÆ\·Jï‘Ð]5ÄxPÈÝ÷#u#§ "Ÿú-çoÑÞXš·T ¸ñù ܵ±ê“, uk:|œô³&!Œ¢púÄ: ý´…Mlc™œ<;Ü”xøz—ѰoAb#mÁhsnÜw’¶¨Úýó%ˆ¹‰LŒ´í˜“~ÔaÜ¥dxEL*´LçÄ“‰,2•´–¤Ù£yb¢UwXp¾t¾]Á:c‡XZ“&hpGUj1ò…0eP”×ïÏpß‘™“–ð ¹Âx(Ú˜ùµË¾m]m 7K :¬1ê”då±ÈBÍ:ú±¨~â¶gî äG’x5àw¹‚Í#ÜöGo ŠMËg&/ÖÐO¤%c>{6æjYr‡|Jr¤lÁ§×Ãû€zaœfaŠmE?[ƒm~.÷Õ‚ø—“Št‰ïVÖ&3¨Ô1ðÎ?¸°êÝpÌQܵO;V†Ï–â:)/ZÉS•$i€™:™K¿cØ×ň ÌÑṲ̀NþÒBßÍäQ2*a e|SÓ–ŒÐÊîoG0Ú×lµ`F3Çp34ýG3ÅÛ2 ’°ñ°V€èÐél·hrÆDãð%ÜÄbþrÂ7/ šW’¤% 2û}l»>ØT3‚Æ™ö=ÒÐΛßËkŠ^«SX vÏ_‹e¬C’ f#IWKpßÝ#f¤Z«Ô¯Ž'â~®\fÐu"Õ©'6˜×(ÃnЕօ†q&Ü h’9 {%f,eW¡o/z] )å,#µZLþ¡s^˲ˆŒ¶G#¶l mX˜mˆˆÿ8 q¹+5àÖ“r4W‚r–›<Ü-¶úÛ‚M]÷Û+_V÷Ú1za:‚ ¾àE«WžîœóY^­¢šh›\qH«LF\HÆ»m½¯mÅfKw¹Z&™É…£ie4ÆO†ê“ÓápMc5íÕ?5!í,Ä¡#Èbh®¥Q”ÿÚôˆÿPþîYÈ €ýÏx÷Ï•°Á’£ë„7âB…º‹)Ðél¶ìqsMÒA’ò]Ÿí:Þ½¿B}=¦[¸÷ô³+Âäi}{NÇ·ÁÇ’ÕÄ«otŒ…Hr>A­œ#¥­;zÉ÷îÙЬ Z<°oר àDÀùéÆgöûíûdšª¨8 ©„K®(âp¼c>®8îU„çIïÆیÖfª ¦j6ü‘ýÈIH{“â#á÷5_§Zïñb­å€¸k!öüL4ç¦h(jµqJ%ŒÈ S#_ˆ»ˆiŸj ç#÷^FÕùÒ 3DÏÆ?ÁÝšKñžão ¦f8Òvެ¹¦%dÛüÜ¢–£ÏKx¢ÕGÒz¨™Ü†Íi×øjè˜aöõµ#-þ(`êñvì¹_³ˆ0^GéZ·JåźõØ [X¨T_ ·Î5ïcá| w[ùPPï<ž‘†=„â… è\bFƒT+ïÕÉ ô‹‘Ô¼¦Ñ•”ts³a†fjú‚–~úsÑÝÙ‚ÀB¼?™úð{ïWL°³æ¦eëÙ/~…5ø¥u6â¸$—ÈÞ(—Ê0¶ ßEz^¶ëÆSŸdõÇzêlFùµøæ\À߯*Â-o0¹$0ȱ¬ÉÁ÷²#é>]@] 2ck#VŸ`@Ÿö@ÐlÂÓÜ^À'7S/ò*Þ¬¤6y’Óð¼¨[8é2Š–2¸´çâ¬$%‹ø›ÇÚH¡k®©Iå•_ç:s½Gj;5“¼mÊÎýÓÈÈ.ØÀl(ÝõìƒsÛ• ÷÷&’N°Y}®O݉+Ò~’?±)Ý…Í«*?•Žûw9;t-Ö8¦éÄ6· Õþ3îïÓþÜÇa…0ñÓT`5+hêtJP€¿yþÖè¹Õ³¾Âò£1ú•G‘DRˆGCÿaãˆÕ¨fˉ{ü¼'¢pÉd£}P5%nñÞÆp¢¥qgÇ´Ô»À·©ø]O>moËk.!ê1Éšª©˜Ž?”ÑñU}AUýiŸÇi‰Êñ®}±EÃUˆ‡ ½hìÛK.U‡¢-ÑPká˹š=”{<üþ¶¿˜ÒºÍ91<€#Øb¢#°>8â›d/TMåV§­tæªÊÌíD“Tÿ)¾ö”bUdÔPn6ØT~/Ÿ§5¹& 1:¢°|€Ö¥%þ‰aš=ŠìÍðÛ=?FÜÂW¦•2³ì½=ÎÓЫt¸¼ëð|”¸ßÙO•>W+KA+JQ³çñ-8`¢-á¿xaÐJî¼;ËXáñ®K-€ý¦ÙrùT“—[©Š”D¨Ç×ñð9b®agLض­ –ñ¤©~nÂÿd¿¹¹Kóv#MÅ!€¡†1zòxÔ­ z©gn'üU f®úÉ·b™yjË.¸¬V§,ÚG›Ð>ÞH]g¶®ªÖr:ó†Ç’6rOØÞ ä†ÏA “"zF›Ç|‘ȇäõ£WÇŸž£Ç탛>—:¿)µwª¾ýg3ÏÙQp«è§™m~ð=™«rGH¥¼0Hx…°’<¨;qü¥¢[A‰Ú‹S€\CRôDSêqˆ6{¾0yë¼óŒ(ƒM°X—UKphX祱DœÌŸ—â0Ω¢åÊr+Å¥ºÁ|¶ÓB{½Õ.9À×êU$ m1ÁôþA+¥¯¦Æ¨íFÐQ‡F¿èr1yèÊ–ì8˜¾V¨˜_‹ѲÓÊ%P „{L­²èÝ5ã87J‡: ëŠãka¦¥DOŽOi‘Э¾ŸˆŽcRþ^66Žþ4[:m“â‘«$™{`Þ!Ÿn…ÖÎ ztx©“ȹðÑe0®ëê:³Øš”‚…ðîx9€"VïÞrs€ØŠü°ÊxÍkÇW]œÓ–UÝúÖ,ÚA®]™ÿ…Æû厢{Ðÿ?pE$ÛA75uõZLD^´ßêz tÍžB9í–ûrŸà 0ŸªßYœ¹òÞ7$W¦å)-­Ð¦X ât/~À÷Íp]fò«šTˆÓv½ÁQ©µò¾cô 0þ'wÇE­à3Ó´9o)Ã0§Q¾^Y¹ÓÉÎÛß#,í¸œ°5|ê–iG"ɬLæt“ågÒKÚ´<çNrç`Ò÷5¢îßݯFöåqYóß*5ÙÝÀÙÛ)’õj^s`,Ú‚/ D÷I[ÓeYGB„¦,Ò„& ýêÔ©ïZ‡È³${Ââ<k;&Q[¨(³Ù³ÎØÂõ*¼˜Ô£|DÄö÷BðÒ·FáPd°6ØÞÓ™Z`ïm w@àƒh?_OW©Ó•íÔ«4îv¸ÂÏÕ»ˆ;¾ô0Ôg6„7ódn…ùDšxY½wŸu¡zÎ’úf´Iø’îÈžÉJÓ5D„ÊH¤$ø…‚YQ:ê½Õc¥msb»¢ušKæìd.« š¹«s^’f~zíY‘‹û_t`d(›‡(9åî8<Ù&>hæA‹Š³#ô±–„ÖsÈ×( “ÊšFy—p{ôÐM©û…@.멃 V©Û€Ð³s¿>ÜUKœãÝF‰ÿM~Ý·p_ሺÔqŸbÆNE¤ O«>ô/!5ñ-̨*F¬°ñip/ ›³ý¸<Š™ ?Õ|Sî•Ö˜ˆ¼(‹˜ìB[ Æý%êQ:w';v"Y‹°ºP st!”õ j V™î/ìOóˆÍã7OÙø>…­Ã1€ lÙj&t,[d äåÙ.·`iNwûv(²ÒÀ4š|$Õ ¿ÕnA;n¬Ὄ¬Š«)Îy²zÏ©yŒþ“-‰Ä9TX¸ñþ•H,øõǵ¨(¡ Ø}0ü›U¼pU)‰ÈŽåöJvÐ^º‹Å›BÇ*/÷ˆˇÃMEEP.Þ}Lõ­yèA홋`VÏ:èì¯}«¼+U¢øKßÙŒP™þ³ê(í/ËBƸ¹Ïù!hW< MIŽFsöCRúTúNkÍãþ1uUüÖÚ#2YŸ×÷}ôtÚ¿9Àñ<'W«A63†5B+ræt°s£Îñ¬ƒæu”ºš0†(_µþЪí;Ò^–‹˜˜ÃþÙ–@hT¦!ƒ'”9»º PØ^s(ÏoœÎИ˜Vjõb• œf*ÍixÚöš´V2YÇ$&Nƒe†ñ[×Aê:µŽ±c ŽŠç™D0¼xŽl†ËLÓtô;Šñp­XxÖ¹WÌwrÎégL›1²X±ëOI1Å”V„ï2öåþ71žú§€<]Ô x7]OÄè[&ßÛ"Ÿ™•¶kw‘N±Óv„Ù¥½1f>G¯È“Þ"—B×Bí/g_?mÈ‹u¹M,ˆ‚;5î)_‡…8C™¤?ûÒb8Ðkg¥³S×»&X-æá–o†uòꊹá³òÝûÞz¬¹=ž‘›âlšÉšyõò›¯Ï'žÆƒÓúW¶‡5âs[g4d8¦—¿‹u-Ee[ZÕâ&4¾rÂÆÆ¶PöšD1w6ÿ}  §ö1V…÷„]•d6ùa¦­ÒSïš™™BSÿ±…ý¦¥®ÅiîÖçTó @©¶qe†v9Ñ+v…†?¬ÕË¿ÀÈ$Ñ…¾:,¦¼Ávàá(«__Ã¥4ç³.A@<.­¶ÀÛÕy¬£ðÔñuE¥ŠD¿&þ‚Õ¢f·iõ #Ç{ñT† ëöŸ¯Æ…{¼¿î®rÅ *Ô™·™ðå{¦Ëñ³•ãx&8.¥ñ·_öœZ׺ä±ßK‚¬‡!iª“u1ˆ³g¿«ã¨¯Ïë¨8GÂï½LZ¤>DC÷üsN0QSHüózÿÜÔÏ$ØH7 Ôÿ'’Úl©‡æ­h^èó<”äø-{FkVY-{¦«ÚJV6>.>ZÊM|S´ctÜLdÒbèpÕÖʸ,ÔÄnq õ’ÝøVX  Nr`>絈産û6µó™Å Ž#žÀÔ·•ãT¦üé(–$ó7ˆ¾öí»÷@‚Y~ÈmØwk-c¿ÍY¤ ÈŽÁˆ$uÚíÂ~§Ýíq;µ²±*ÖRĹÕ?u1£KÞƒš[Ln(wÔ¿lûŒ8V &|ÜjÇÃhYºmŸp«ÿ ÒÏ ÕpNOOný-æÊõCÄS'Z)™V-‹œm×MÄ£ã©ÖÐ%& -$J–1iQøPm[zñ«â:³DاŽÚŒ©!v¶i欫Îõ2S%&6‡ˆE`Úâïí'ÁÇÌe1LÝ»`êì<Í÷iF¼Ÿ‹'JÄ”Ü?oÌ3ŒQÒÕ3 Qã0RRH d×@©i‡'|l^NÿùÎ@?¹døä)7çã†ûãj#ú»0­Œ{ÈÑŸî—*¹Ö[ðöEÊfn=»RöVÕ€$t¡£r´ÜÚšzÙÏPÙ¶Ú¶©´ÒÖÙ{ú†k<ÌûÔgÄî0b+Aïÿ(þ®OºÀ¥»_–`rëzê-e_ë¯XzϾІÜgÃw œ4³}qè-³Å®•GF¦úm[î ùÝmެ¹»Þ?(61Œ˜Së#îÊr«®]c’z$¢çàV³¤íà¡%|H@v‚dÖè-cVÍ®‹?É|WMª<žÂºèšóç\[”¸¬x{²–¦TŽª×ÒtÝü(àhïødç(?ñ%$¾†Í´&¨îÀ})ä<òÉῤ¹ê¹Ð BDi3Æzå¸÷,.Á¢7ñ;È'§ Î|Pv‡Úw%ÙCWˇ±Az;Rómí±;HÍ5¤uÞ.:’‘>‚ Nºú)7üí•¢^aÔ÷Ëÿ:±t¤r5‡lŒ"D7ÁF¸|¹fµ]mzùÍã:ÕŠ]­%v¡1‹êÜïC6fÜ)æC›¸ø_Åñ™}äŠC¢eúçÈ>\ø›ÿ°Z%]߇]w ÈQ¡E°‚ŽEÜl¸ÍQ·€ÂzIAë:”ÃKm `Ä$*€ >ƒo¶b9,«ûÖ¶åXJx SÊÙkO!Pxâž–S@‘ç”-¦ÃÑåóG¿×|PpM "¢œgäÓA£±ŠH 8¹7ý”¶"";»z°’ïµêÔ¿"ïÕ\§õ4¦á0ý“Åî &®šà»Ðõ&5™Y¶™#IU›¨CÛä>ît¦±â`yÑvÌÈeÈ@]±XÅ'L›Ší,a$~È c%äÊZãÿWäȰ_^ñ#ß×Åx (o Œ<Œ¸EçdD7âÈ—p'抭3¼ëÞU=è3üXŠ ¿\§ƒâGÌîó¸æòŸ×—àg—&ân74.Îúº£{ÍÈj&ÑÂÌ_OÙ¥Ïæøt´¨…¹ÉrŴϢ³cР€ª›¶#o£?óês·ü“¸„‚ãäñw‰®&/ࣣ[î—u`¯p%ƒGÏoñQFGZü°RÄIºI%–Oõ¦a¸™rÞb8¼M,(Ÿ,räR6ÕLêV•ÎvspΡӉ ÐpAA]©Ü{‰]›FâHÕ1qw >Š•+›Kó4—¤2Fª¾wþÎæ]ý†ÓÚÿ7Yåvësû%¨î–”eªÛ·µu„â  Džße ¢ˆ«‘öÂ~@Í~œé^\w°âõï[WAOÞª¼¥ÃöÖÛJ—‚ÂvjøM+)¬§ºj# Dùï¶@º‘h–-±Î¶ `¦8ÇuÈnÅ(€‹EœØsÞøºt©wtýp@×Ðò×Íß2êSÒh\M¶ýæ2Œªä‘ãGÖÔ/„÷=–@‚cr­éh@ã=æ?|·ÑxÑ;óJº…îýÁà8ÞÑJÃ0TGäšÞZÙý©à§<Sõ:šN^”[Ð5o¬eT¨§†#o6NªÆÚ»YBŸE—ß½7Ð@gÙ—J#À~u~K•”~)€ÄáÚPò¯©þÈù1n#Bà<©.,?ʺXdG¼§½Ð8Ò¦Ÿ Ì™XÝ[PÝY$Ôï{–­®à~m¸&³­sþŽùºJAòÍ/| ì\ý¡- ‘„ç ¨È Ï¤Öµ;6!Pð–-²Ò„h}ÙÖŠeÆC¨ŸÀKÊLý^4—Ù="ÂÞ•>é;n.†_æÏïô6­3,Üž÷~À_hæó¿¥ÎU‘ZojKÍDmûa•~¸öÄZš’'ËØbdÁ ‰#$»e ÚÿÓø.òaÚâÁOƒ`µÊî­ÛÙ{6 ,Q¹Š±Ì 46‡U~qI 鹬åÁb›‰ ^Þ¨S¥îžM0«S2µÓh¶i}RÛ©,¦•§ø˜ÅåtÓð¥:#¾zCºr\î ÐäF+¨-M‰ˆŸâ¸%ñ’Ze–®[í"rÓÃN5Ë·¨0Ý^‘ÕÑhÔƒ;“y†", @ñÿDC"S*Òúе¼ò¥Ö@-Ò#‚k딆ŸÏmç%âê#²³æ žŽ~E•N‘°óÅð©6â„Þiíß_{gƒÍ; OÍÎPž%6’Kû•ÌÁæÄg/ÍÀŽòêîY?<-dªÃ!Z¾÷Ê×7"çtþ)æh£Á«°©^?RLþ†Þzݺþ¶Z 8¼Å¡0ÃQ×Ps½Ž¡úH¬ðu¦'¹;ÚÑë¼>`íWáÀd¹: þðΘ¶üÉl¼:e‡GñžK‚&ã7Ç÷—KäþâP¯sfuR¦•¿uc¡›•³â·Ê©â/Vû6s‰S<—ÊÑFUGJÂÛI €BF·Úu:*+zÖhHÇ_§o¿üjºþ©§ÔœÅåf4 Ö‚ÈÅo0ÅŠ- ¯@Pð4_Þä1‚é¢6×u]WVõ–útk£+ÒyÛÞ7 2N"ì×|*@7'$q"ʤv ès"[\î±%ÊÁL9‹ró©j¯XeœšNê~ùtMÅ÷§ÈG§}sD[YXÖ±_*iæU’·5ÎòÏðÓ’D=«Ú/x&[Al3Ïu@ôæ0¶}Õy ÁÀ±Ò›«óZÙ˜±üFfûl½RJbúÙ”ëÙ—åañ£t¦•@Yp€ù$ Î ¹þPù £ž¶Õ ú m_ šþžKZ´žšñK€ŒÆ\ùîÅ÷üg`ÔhPoÚ£Öïü_ØíŠäQ÷¡©V¥éH_–éÇÄW" bΤH{,È;8I€XñŽJ?ë"µõV‡O„šß/_¿ÜŠE69.¯Uƒ=u9³ŒõÇOõfF3c~I‚€Üã–½§M¶Ã-xÇhªÊ?BOD+BSy©°rf`†X¬U •ã•ô˜µ½$«…ó¤O´GàxÏÇïý=8y÷ªŽ2¬œ]²Ïª6] ZšÐö¨ãçÌ1#9è«g0Tƒœn°ÍMûSCï † ɾ¼`IõLÅBñ>"…Lõïö=VR,Jqî@ÜëhATtÞ³x\‘( öLÎëë ¸ühƒõ¨Äk˜L0‰W­Ra¶³šN¼_rFÝ„þ{¢ÖCQ±ñìóàPSj¸ªœ,þG|b÷¤Ò¯X¿¬‰)ŠØL€V·`Ïäü!ð-µ>ÒƒK÷˜]‘¡ðýñ^Ü„Óä7Pô »ïç›ä9´ª§ÀŸçŒaØö#©~¤÷ Âͪ—!÷µx™?ºgØÞˆ.‡!& i7n7m¥û©Ñ•4û…œ‰5°ÿ ÇgBŸêÖŠø²×jGñ®ýXØ)€–ûYîàWàû6 ö”l¥SúI8ã²oÐ û’±\ ð"á!IÁÚXUHnšŽ— ÒÀ¾¶ãÈéãaQ‡¸ðÇ‘Þ h_ú–¸I©^à‚ù˜q­)zǬÝ8"5ª]%ìér­(î@ù'…רç¾WA³Î!'’Џ¦’qŒ·a(³Â­Ÿ&ݯÃàŸ2x¤%,Û|ÿÌ%‘B%õ_¨O&;„Eù»ÝµÝßÃñÄ-•  a›g›ÌLÎ{7mίeªº9»?ûÁ_?Duçyh¿û‘\17M¶Ü¿AJbB‹¾@Š~Ë«c$ŸX¥'Dûô^÷ÐW ä±V½…@÷ôŸ‚†Ñ?´à¹G…÷”!|™ßNÎpؼ|q_5Á|›ßeµíy4³X(#ê¦Ú´µ„Gœ¢^éR›ûd!Q‚]²˜Ý"*t´_ž¢(-ˆ‡Ç¶Àwš ã³¹·ŒºJNNSÀ™“D@Äbu\rÒ1¸´0µ¡¾xå_àÔÐëö ~‡Ãæ«~ÍÄ4ݨfŒ³FgzUê÷îú‡´ï)ŠT‘¡t•ˆdÿ”ÝBÑ3·¥ŽK!ÝÄ«PØðwͺÈào—¡+ÊãÍ)î¦ÑBš®ª»xys^eÊá­*õY`MåËj±»B»¤s¤âÚ‹Ï­cW-ôuf¨¶ž2œUhQìÅ”ŸgålRˆ“qìô$ß-:I&ñoC^&¸mºQC6tBb¼ª¨¶ò«¨;@YØ”¤Ço½D¯Û~‘np¬7Á5üØ‚Q‚½ëá]}\ñ03AÄzCãÛ¢×Ãöd¶çiøGBøBýW/ºTdØC.ÓøÀ‘2q;f5|Îwݽ²ign*"»çzÃ{l7siJXït§•éŒaƒîÊTux;R‡I™=¸†{o“"ÁŽ‹•s€\üË‘Z.Ù)ï×ø¥èì£WÒF‚ý*x¼¸'èþÅ£WE‡m›~azäÙøžkdóÄÿ¬=s 6œ-NKÆ…‘Ñ% $%dÄ'?{*jˆ ³õßÐç†nßtNð¿äZ¹Hàkã¦ï5Êsöüա·)ƒ”Ò'„m>m›3VuNÉ»ˆŠuå?ª*ñ7¦»*m«Ýc>3ø†=ÑŠ0£…y„5ž‰KzâÛhÆŽÐwỎ¢ `¶û|¡ÿJ}ÌG· DÄÈ*œûäðuĘ„·@41š+âÅ*c Ù†AmÚ ¾èžÝXµÉvi³Î²Üh̳‘?®¤¶™R>˨«ïlÔ… l¡%ÊX^2W€­D’ï!ÔÒ8+píeU—vÏgŒ8KRÌeØ€PŸ·6²–E Ô°û(™# TNÎÎÔÄ!½S“3í™Ð@f´Ñ‡Yׯk»]ä:.æå Þå_”&†R½… Ð!ÏûûÚkåæãßÈëp•áÒ·®ñ=VÄê\Óšeìî´ó ‘1ØWh÷¸^ó*®#ÚF¹qŽÊ»5Ä4UY!oׯjY™oýVÞû& ÒºP‘ýc†?têìÅNÑÈÅ›G‚±2®êÛŠ”v µÁjÊÌ4¾‘NpúÔkÐq© ×Ì졾F­ƒ1°µàEw,4¦?zÌpØø¤V¡”g[tVY³ ŸÀ|¤¨%#CÑËÝÊ·$ݘ?XB…Ÿ¡Úþµ¤§~:¢xOTYâÈ–ŽÅ¨3ësoËd*tm’GþGýQ[Jrn€‹ü@ q"Ýy{,Zƒ„4£æžŽTÉŠ!2‹…ûþ6¯(;}jB²¸låB©YGuNñƒ ¥*Lˆ³Êñ¤¹þ_|ºÔ[<d„ˆ“W»â“ÿ€³Õ>3ÈãÆ  ù é|ÏÜŽ‚ŽpÁu°úÕò0/CïE2D“™÷ŒÛNA¾¢-#A\9ø½_Á&ûõãåÜa/¼–­Í ’D*q'ØâkÉ >:a*Óv'Û=ý¨ïîÈ5ù£n’VÕZQ¢p¥oQS•#VK5×=m¹Òõ„¬î[–fð„²}GM{Ïì9½"{;g±¨ GßB÷àfq>)”lªùÓù«O…RôäácH”iN1,hxŸšÇ±~6ú]“…ÊÔ’DWÞ•©ól ¥q†æ»¥¶¥U"±H\°g±HðŽd’ÕN´Q5¯1h}¨ý½ÐDƒ*_«Y¨…=àŒ›ÉPÔ€q}Í|FÎ[®´dÙ¯ÖÝ iQÚSÊ>óH×% ÖUf÷ܯ…bEŒO~IทywmtÂ×µAF˜„¦•Æ?.ƒ&ù0‚œБ-=BD.üpáh m»(ñijvo ¥ˆèÅA-7u¨´À«Ó@PôJ–SîÚj.xÓáÀ(eÞ¢]€8¨•²Å,\ÜB#h"ßÚÁÕÍwèyYëW2Ää2'°ñþçg{>({©;ˆ€7µ#Tˆ¥¨•L¹QQ=@ת¨¹Ò²e0|ÀkG‰¹5J²ÜFž± êÎÿð7Pý>g€^»§²tfñ-ñ"lõÞ¡/¦#K¿¸K}¦fåb]ÙV›±,í†}ä´S»wk¹ÿܶn‘ìʲ·x{<WÌ™.À ¬ë·­F²À—Ïèi)O±Ç J,ŒÑÞ&õš_ßòüX1Z¡B¡¬ eîYohú_k,?¯$Ьº\£Xµy}ÔdF¼n¿(BÖ™T· õ€qÏÕaöim’ µ-=·CjáJ*ç¯o€‹ Ðâ,\ú€R1~½2Þ$^£i™;¡ÝÜM`gÄøFàK`;7Ä`üF}óJy`ËÅÞN*l LÌmí»˜*ñ AÏp‘îOC]`Ê(!iD[ª´ÊÖ/l yy[Z’SL¿iŠÝQòk'»8³èòõ3ž\1UÝ]Ô“—Ö(MýRJqø©§ÑtÁ¸ÙÛye›â[äJ—||–nÈ·eö˜'ÔAOÑÏ Wµ_F˜½ûÁdÚøÃx¹"æ+îº Œ³eªÈŠ<$xÑcô`)úgªOµ!{ɨ¸:7„ºñú족2o1– YÆ §Ç17+±ÓŠŽñ¿»T¬-¬¢=«%G=7ÿ¹UÕax{ß—jÖKNƒ<C'ÇAcßìd‰wH¬4³Ò_…Þãv¬‰×@à®Â˜Ûn0±ƒLlÚ¯tÓÂ=œ¨ï dBùž9Év#*K¯4!ÿÔ÷0{ØãPÒÎቾ‹ÐHs}-)ùjÝ,Š´”ù$#¸ …6#-nÂc¢ø~êYÊ<öÎÿýwÒl#5C3•{RÞ¼+C-nÜõKZ+è!f¬EÃdj^u˜·¸×Áá§–u;ào·§?êB9§5,d#Þ'Ù9=\⢶ױ•˜Wäêeôwå²Ö––ÿ‡ÍiïHÞÙ&´£ðMT•…)‘(ùBRv‘±ornNtf¤:t2ÜcgîL466©¡ÑÝH¨ïz"ˆ,¿$+A‡S?6ö‚f–Øî—ƋΠXÑnØÕ õx½ãGX1Á°–¥¢À\² >ب›œ±^ì úÞ°B"稞p¿øŒa8I™qò±ÚiÅDfݧRÁƒöZÝÙÅgú4@F÷›Â€PŒÂ„k¸–þ³5—šÌ€Ù˜u ¯†t¹_ÖÇâO߆¡} »•íޗʳ,Ù ¾æ¨K¿7R ÆÙ¨˜©`ªRk\è­øÍ®ŸÝQ n0.{–àe! ˇö›^éV ÛC¬ŸõI¸%á õ!ƒ–Z¹Žq×âšÃô¸5Èt5Քķª]K½q˜,ÿjòy\ÿœXpñÙ¤–;øCCO¢M\ÜIÉ„ïúô¤èPÆÝÒE­óåQdõ]lLC÷ÂË5®bnNXÕ‰_½B6R¹Z·Dx™ HùÍ »µ¢á­ ,®•rÎT†Âé;F¯Zì”é`¬w ¿·öÎ'á@#J«bÃÑÍ0iT¹¼À0þðxMDTC0©Ó:$Ô®n|KæùÔò;×VóÙ]ŠEDŠ÷Üÿ¡bÙÍÚ ÅY˜»·êoE®/—=»è„}ipþš¢ÿZ®«qǾ…Rf¸—£˜Sç0b°‚¾Ôƒó5D ܰn"ia\¿:ñDœ­ŸÃ¸ñK¼M§ÕC&s Fù”xäÛ/“ͨ§ÙEL‹¹áºß0Mòãâ6¤!ÈE.åÜÜ:ħU‰X¶Z‰gm!¯¾4=tox±Wô &“ÀvHVÃØ®­×HLjݨk4¸Ô<~ÆŽó þ¾ã ¾/l›©Å©²Ÿ°€'Ê–É‚Æ?/õ¤.[7'@9ÌW¤ïôH;ô¸‹äÏÌVX¹ˆ`“̽ˆy Žuu]r%„ýð|ZÒ".÷i4º!PnˆDz ÅËÆ_|0¯ûßþïœÉu4Eýõí€^?wm ñ:îO+.*ØÁxãe9±áÒ1Š?I[McF;=×ýC˜±2䢆¢íô%¯ŠL ‹gõWÂÖ'AŠÉ¬iøæÍà,í[z@ú¾‚Ú<|5ÑG ‰ÃU…\ò•-²ÓÏÜú>…fmóeFÑœ ‡˜wÀ¯µÝ›í¬.¡¾Õy rdm“+6€z8x»ÅšÔ0«aÜg»¼vqÑv\g‡>\{CÆ¿ÍIÌ«H‡‡º€¢K| X&«Eè&bÚ,h¹Š5ä$jÓíþWµØ¬‡§ÙrÒpMšx,°ôx¨zÌ´T¤V”H™¯Ÿ<: ¡+ð(žGßÕª¹¦ÎEëX€J¼ˆ Á­;$<µ„úÎ)¡8£ÒWDÊŽNhGÛG/û)°‡2C¡™ßV·¹tç•0ãò±œ|Ü?ß4W¤»©GE»ËÅ®—ø£;ïkãéz0x£uJºž76æFð9#]Ù3/íd‡ùÇœ_Ð0ËR–ÕJÔì,®aàóó6‘¥´g&Jã'§1#=é¦Åï´' }V‘Ù/|[¨º²‚0P¡æ›ó£ä¶ÉÔÊàõ(~€ˆbyÓŸ¥ÖÃ÷ô-}B—…_såV±Â(iõu«˜Gajž÷ JÄ»ä’ÂóÌ.ÔxÅz¢VùÌs­Éåô®ŒQµY»5ˆ Þuõ[¾L’Ù LŽú\ˆÅí{6ÞàB/~O>mÍJ…L"x ½Ï¶®Rn ´¿~ûW$AÂ,ä×äQ4âáâbrøËPi;$ ¦èç²D\‘áÑ¿ÎGy'¥<ô¹ŒÈ=:èÊXg˜jmÇ•ì©æÛ·!-TÉ]ã*^â½kYýÍ-VP¢=qaû<0ot*•pgâ¿|º\÷­¶C¼vQ}>ïÇ…Œ*èBºd*æc_â“©º¼öG­iy‘Gù´= ¥óñ²;i5j&*ü5LÌÌpCýõ`Ì BµœÑòЮnÉê ôbIT'!-ÜÇU¶cDÅJþ…Õêïþ( 6Ñ/MŒVñòò"ö.ͽH EH9|-ôýÃÁ‚_H þƒ,ø8º'½$¯MÉG‡q­ÐòÃ?h œl=Nt~j¤E`q"‡{Jz-h:“¨ Ê"ÑL¸¾ÈÏ‚ÛY¡ÐC‰Á1÷µÍ%zëYÛjÒ@,¶¹6?h*%濊C5Ê~”7SÉFâYJ€”ŽdZ?ö>ûSßòåÍÒõŒ6¶6ÉoÆ›CÕŽ•0õϪNbZ½’ïhOY–b)†Â©Ô¦«âD*£yÜ Mè6ð €õ¶Ëâ;:;«dçÏø·K3á&C;ÈRàòËÈ|7Å%Z/MgÐ4r³Ë]¯õ„ªÆã!HFµpH[f X–ûIi"G„%â\!&Ù:¸â&nV>ª$Yu_ù‡,>8€¿@}qYàóíB(.¹,ØÓô£ŠU¡ ¯Ñª‘K’#°f™ÓôÌ¡¨ƒhKÆ«3î`åOÙ…‘ú¾²éÏCæŸk½µ.™p´w[ÍWÚúP;imJµTÎÍ&ÙdK ªH?ßhB–F~üºŠh‘ kÖ&!ÍVä¨rúò›«IùU]¸#á§vp/žöãN2Éä@ŠÓHjÖ4ƒîoöN%Ã×ö²U¬Ý ]œ‰Î&§ÍÛ´¨‰Ô0`¤Í˜»„)¯· b á. 7<æ«*ï_Ul®dÄRMj&È¿¡:Ì„jß2PÇ)â*è,ÿE[å„¢µ"ùp1û'â¾a—ò(˜©.¸œY@ÊkMNÆp,mc7ðl·f_e]'ßîáξôTübðU¯ÙeªôθrýAcù4ˆÖ”𥰃¬¿J,ªboî8ŸÃœ˜›ª4Yô7/¡©;9’ ÇÍ…Û=ã »7æGãuL©bINЫbj5M˜U¨TÛl¿ŒÑ;ÆÿB©Ñâ¬É@sÂ`‰_o^Ø0j°öȸ?,þOÓîñ˘9y⥠a¨çíp‘ÃL«Ýh2ëÃͪ1 3^]'ùQð®“84Q{˜û±9D. ÔNó°ñ"6äl~ÇÎVƒñfÕý:ÂŒD&ü«òhÔ Öl×/ÄÎH#s V/*±!û^ž6þ3Ô¸‡Ç¼”’SÐ\dÍ„a4[ ×éι­ý+g]Ä:½rÈüÙrsý¥³Ã±9þŸàoÃŒJ08Îþƒ'ÿ´³ 5äÙki¥ÉKgK‡ýß*OǵóXÎJSÁÙ8uR[˜h#žIXtât ™?;ÞX/ï€æÊ'ÖÃ'F8ã¤{uE&õeFÂ…ílwMÒ#úÊFÓK4Jß µÙ81o‚·ón¸õg™;«a.ÇZ€<Ühpü»˜áXx©.Š{Æ ­ÓÈJQx¯Ån‰®<{ò&þÓÃ$-Ø€Ñ}¥oGçÿ/EKÊ¢1$Y{Hü¾ €±s¯(§Á6,‘ŒÛRŽˆŠ~=©Ì*Ù{%B:©Õ†ßÿ¹cœÄifH AÐ"Ç•¢¬J î>ûoè””´ÉØ¥'£Ÿ<+DU|¿ ý¤£H 7Éß ­óÖD dÚÙíQ½u°å_“È{ðð`N¶¹2¡3_<‡¼éÍ’øƒØõØTâ<Äqm/‰Š¥éoìÜ-††uÜÁ® ÅYà¨uÈÑúìÔy˜ Å.‹Ô3LGˆ§wÖqoRoU¨*íEŒPåìZ?Q\[“ª "8Ëgì×…ãonÿÐøÏ§¬Îm æ¹"mœ^â®ö äD§¨g¨süàb¿ÌwY/=@ÿ­¾ƒ?ÕFê1.Ë¢ª9™³¢›òI.¤ §s -i*ìWì`©›Û¾AÄEÍ 7Fô^ºæy7õ¬“”ÁQ”>)•SA:U®ðiœ1<m ’•ÕN§|fóÖ;¹fõT·ŽÙª/ÿr”i}i_c®1ÈxüìÉ{•NÑÀPÁÌ}Ïc“‹JÀªEbqhŸfÏNQ#è–2"µÐÆÎ»ÄÏ/×H~»²™ÓYhDm—¨!U£¯ ‚#I¨—®ŠŒQõ´EF ! ¥yr¼ÔX#«¸võ’¬Í,?ÿ¸ºbNp8fÎö^Ëôp! >ø›=uÈÇ?Ò‰Ó¥aIȹCVü’”Ô{8VDuý‡]W· J:1ýúß,þ4¤kA˜&Fy>¡¼áç‡'üõl±°+µKÈÏÆ"5 F‚Ò†BøøÃiåáå³¾ÄSÍ®Ëá–î3xŒÒ2Îܸh@\¼çen† Ç>³öÞ<âtðâß#ø&ü "È˶°·^ƒ[Þo]âÿŸV‡„b9Ø_ó41NuFbƒÜôkWzKFQvõÁÊ`ÄÏtwJ̯òÁ •l˜Æ wål–ío¯Áõ\Çq„) ‰yTÙ¢`2B¤q7áï0mnió…üRù˜°,º3)öû?Ó¼=¸î´¿¹}éA‡-ê-wəԦuì7Pͺ<•ž»³È3úNúÈ»°sÁÀ¹“ÄU¾ÓcT;j̲¢Š ¡c$ºÇX£Ý'U6ÎZœ›x ¥‚ƒâ©ôÞ¶uýˆó&|°6N0ºo²ÝSª†ÍJøâôÚSšÆÐÊJ¥½9™Ï\Í ¢o…»ìÔÑÒàû‚{lÃ\bW¾•ñÄp´]åÈ ·2,*45þý”S.ˆ0Œû ðÑft´¯Lø®ú¿8ÑJeõ®#°ßB41 óœ>ÿðÉþ ¦Ò²b~'&GUŸhù«úÀVÛü+ F ÖÀÏÓí¡ï…làC<¡ÃbSé9‡ÖÔú^ øº:OSµ‰a'÷K| “7·Ù3Si8X?D²p_Ï©?pŒ¸Ûí¢ïc­ÈÖOäY~}Zu•J=ŒLÝ®| ùïFüÊpÉ7ÓYuãzГí$ò/óÑÀ"0 ÂMÈœÃlºl©]¯}öÕI#þþ ðt€Tõ ½[C«»±I õ`: ‘}Pˆ›%Ýezyj®yj p¿„sfJË™ ¿ˆh^c_Ãϔϒr æƒãä–éù¢h_2²pÈÂ犙j7Ú]Cåõ,£äÙÀ„»ìÚ?Ùîx`¦fœ@ÖÌr†>*%‡~vëžVÒ)žñJb· ®“#ßQŒž¢Û9_vP»~ye4Ô;°^kœsoK‰tËæ”X0™¯o¹ ·åD¯SÇ9Ì¡zºÏ/·}UK¶veàÎ_YÖdÑnrâMÖ—¥ øØ:uŒjdŠ•öŸi]¯Øß3ß‘¥t¾\4ã&J¨],'7I@=ZJ¼¯ñuÜä$¤¶¹ßý¬øÿÕÂõl‹p¬*ÉC±RO} ?ÿ¸w§oœW9ÿL¾´ÊFô× |hqÑ6¯ØÖrsy€t( $ŽFRñzðk#¡m„.‘J÷=Q¼!”X2YI5±•Ÿ¦aöP21Àxè p¡‡N\Kÿ»Ü„GÄÙpò±M¬/cTLË^·÷)ï -’aÁ›/+\0Îi–Yœ Î'&7„I{v†ðXP¯±þcXÊ#^bGÂËíÒo?4Savvu©©‹ÖtIÝ.Öé_Á*CÓ·å·F°»lçš_¨Êñ/r'pææéDöðÙh/ç·ÜK J9~‚Ï)#.±NçÑÌ·5£Ü ZS‹I“]@Ê3¿×iP 9³î1çL‹Ÿ^h`Džß®Iö0pÊ}ξº€ßÖ°ÚoÉuO²„”“Ä)÷·WõÚ^µ!/aVw&Ý7?HôNå¹ ÊÑAÀ:ÿÎÌÞ;úUÚ½AaÙ҇ϧüzä"*·Öçÿ,Ï´ \.2»Ýs¯ ¯ÄPBFŒŠ¦ã¯`R·¿zNèLÚTÿóÔ¤žO @0õ5ˆZ™7„!Ìú+º‹z$¶ÿHïÌP¡A×.Ä0Rÿä°+¡ä•/wé`ýpš¯ì̧Ø6Ì­ÑÛÕ§MZôH¹QÈn&nx4ÖµUŒð”‹rŸÏ”ÔÊ3¥ò€˜=äÙ»Ðñ!Òï E€Äd~ 0¾ ú |{È$›’èP²X ôÙ¯’?;’l´Ó0ÚùÌ”e oVÖ¨AF'o‡¶]W%^rERhë€uc,ŒÊsÿðzu:ó µk8¯E~Ûä6&N0f‰&x÷ëÃ( 4Éõÿ³õ™©ß2üû Aþwç<—Ò[ÓY »­-;JáDéùþ]:¨ÎÂFæŽ(IÐ ÙV÷p>!Ô Äò'WjÂÊSŽh1½â¼éq½ÈÛ¿•À›{x=Ò5¤¿Å|(¨FzX¦+Á*ÈîžHî:3Ls³HšöÛÛê>×<.A¢Ô0…E4>—zš×+ý)Öb”òÁh-IÁÁcÃ_ ½VÉ`J_~¼øß»ŸÎuJ¥ÖÖ<Õƒ¤Å(r0âý[FàD¥ÀOÐ]£i\u«VfM£™9 T(·E4D9L³²›gÐÜ…úU„,ÿ¼¼†OVPrââu'tË‹sX!©gþa$îe9²ê6ë/qÿÕöKI(2”û©Ëpð°CñÕG¦2\gmf]ïNËMb˜Y×k©Àù½Ý`ct)üaù(Ðä­°´ ±.UôàBÂFHZÈqtáG»,bvöøðd8åöýk6Ý*9÷±ÜH»¶ÿs^®˜™Ã£hÖB-<=›: ²×hé£Ås»”€¬Æ©¸ú}eÿ+b‹}T­.­aïµnIOáã)œ[êDáÕ?§b½S›=•òµdIQå$;üüNIÄÞ£œ“”ÇÐo†/ú;$ éÄz§‹Ûê=­Ç½ï [œEù^Ò;Õ¹]aÜÀ BØWCÖs¾½]3z”O¢ç“ 4BkáR í=²¹lÈ;ÎÆoâ±È.$’\g«)ÞJ‡X–ò m!.Ôö«æéïÞ–¢5;Ü~õÒô±Ó‰Ë™uŽ:gÕžy@æÅ±ÁM BÂÎï¨Ëq8Õ¦}2I§ìÔðÎJ7.ª¡…„ZA¹›/ŽðS2a½YŠÙñ)A-‰Áe¸"Ú§Uã%NÖp÷åcyxÀÐâoÚ*gpMòÌ'ÁrÓï"wÅí²v8³z~ÆÌˉA¿lÅ“SPnx´±-v:lÙ냉¨¶!þJ–ؕΗ¶«YQ)8‡n£Nð<ðÍ'Ós2g¾éR²P§þ›Œ²’òóŠ¿·f…nÄ~êâ“‹èƒÀ4;爪ǹr;Ä>p¡·Zh‰{jß{sIPûC~3cK©/„B_¹ÙÄb­Mêe¼Jº–ä'O؉FTË5É7¥ Ôˆ½Q~ØÆ´Ó‹mý"ÖºܾUàCZ‡1eø¾ 5{æâÈ8ÇÇqüÕ³‚³zœqvdßgR£â"b`gSG¡&çn½É gö³ NXfÈ.z¹7HÉ©9áPá‘f¶2„nà²W#¾¿Ì¤ä}: ×LW {LÕ×}‡:–ÌïÖ÷O0ÉtÐä%ÏŸ’+çÖ 0b £t)ºo(·²ƒU;(AÕ3féš\wå|Ä13«,¥È¨;jü¦žéu5yê‘nGíx‘5ú…1)¼]«Š™}û?_NU}a·;&i!tÿ½¾žšñ…žçë’«õ¡FûÚWܵëꜢNŠ @ =òh½òÙØCð´j-0ø7x»‰Ñ[©}£FÙçs¦Íàé üLW»eç/E°…r…ÏùV,¶Þüì‘6à»9>ŸŸ¼• ⳪ðùµ8Rìžù8~À²cb¨ —ÌÝgKDˆÝf(9„|6>‰< ŠB$E‚‰bï…¹š¸~]BX\v‚“ŽÔk" lb–d5ýHÇ!ÁJa3ÅåIÕ9±å‹S˜Ÿ´Í6Ù„Þtû“>Û%ÅŠŽÁ‹×öDüEñWñ>ÛÅ¢I­1sùEˆâ®œý$ÑÙæèee°ü U1¸SåLʰշ³!ãšæì:‡³§Ñ 4Öªä"”žúÅnEviï| vç,/…?ófŠÉ1ƑбáþåÎ9Ûÿ­¼´Ø™Uê0 =*¹º6³¯»n¯Ãº(ÂVxŠ)»ê~÷…þ…}Š·L›hUû]cÔH€ã}aÎ¥^GÊ/tZÀ×âKˆ¤Ô*å­6 ÿ€n ›¢d{ ¶+ÄöÖ[ŒÛ^#W’rÅTåó¹Y<¥=+ö†Xˆ÷lz„¿_§+ê“-n1n.æ~ß¡5›ñÿ&!žmeJgt5g ÜR;b~pCs»µzWŸ‘y}ß-žî©‘²êqH4h²·¡xZÿMóS†ÏÄçº.h9"ûN^iî '…¤F|ù–„E‹Dß-²ÃÀŠÖnÀ´.}Ù«g{=Šueò³îN ¶ØT]`¬Âî¬O¿vÜ¢‰EIÝG7Ë¢å+.Qöþ Q7ɬ‡îü]VPÆäËÑX»(vN1ÓæLáœ\… ð„a%.¹š¾~×çÀvõ€P.$]éÁÝ ë/ù‰Vm7 2hZYXÐ\ËË»ù#6²"8¼Ù\ZAé?"á·Sn1X Çd_úòÒYû÷Ñ‘æÇXœ³ªÔJÀ ¸êÓÁôz’&)CätaóW\ü ýg™Ñ~Ê­¶8NÔ¦Ñ LâÌhá~å²Ä+uO@ß"Šo:j³J\ͪ?  ¥²!ÑïÐí”ò¢A£›x~¦q'§‚)™R¼'"ˆºU)îD}cÉÈßg´ÇaLÓ)ú• LSָʼ*öAto]?ÊB¹º•®SõuèÂ![c vëÑ]òƶÃãL›ä =Ê‚ß H‘YtT”³DAÛ©!LD %_à78”Ño‡*ñø<éÏ=wÄgwýèÕ. ­…NÏ^ ‹Êóòˆbä}Cû—ìêü¦_÷ ×Iút âYãâ€ÐÕmZòxÓŽ ç[\:‰Y’ °V¦\Ktœ „¶ré?IêTOýø¯=U¥¢Ÿà4Р÷°ä¢$ 6kWŽæKÐØ-¿î2s býJ’µË¥ºeŸ˜*jµŽ›¸óøX£öOI¾;›Pֵïä>wLJÒ]0=ÚÏ/s D¿üÅU?Ë~“—S¾?Ák•#òÈIdÀwƒöàL7oØ™GáYFÏëN©š+0&ØÍ‚‹ë9„Y¹Ë;‡‹h „¬e'‘#˜„¹lS¶³·¯¾Dø£ÑIʇTçfy}X œÐKpniP °ª{«õ9C•)í¶ÌÑQàI.ÿ.jÙã:¥òéH•j¡¼r*7E (íÑ{™„?ˆ‡G»‚X”†Ø/y ¼¾OÙ#clzÍôè2‚¹Qá7ªýŒŠfÂØi+í÷ÇRK!Öš‚Õ‘’°ÓŠ´[VxÏá¾ ¹û4ñºhÉJPp¡³v¡‰=Ù$±¯H3@—øDÔ³úºVH÷?x…oŸc ÈÚÉÈáö¶iQÌ×#áÚF‘EþgE%¨3×ÕZ§ó¼ç!ÊIp¡P5´Þàä¼¶‹iX0;/Üyå={°J¾ò!†éÏäг™-3U1¹ ¬•·ËSuz=ÿ)ÿk¡b-÷»/r\Ní4K¸‹þäó\ŒÜߢ•QÃhJ¿F³ul¢úõ`ѽ’¹ÄÙž\BJLÚœCa]ë$øÂ9ÿð”}=_¨¥ÿ¯vÈðot9U¿ýžBù¬°ð¼2ˆíN £R ð×í‡&aÆÕ1»b×ÐCÅl>áÄ3/›‡üo!öYßE´±E2ʉex‰ý¹ßµçsÖÄá­Ca^Úù¦5.¾`ž©[Ö6Ü1©ÝŒoþ ™ÍÛª÷ë”— ¨¸)ïÉGžë™ ¬&pÖ‰~êšEÁa~KÊ(Iz;m÷N±jùˆËd­Ä-€‡br3H¶L·Öt„ý’ Pv=Bîá¸/æ+¦˜•Ô£ ày›+£>#̉|òê@©‹®Ù§F ¤l>¡Ñ©ŸnabÉüÀ¨tÎ)²ºzb¹Ãýž…v¹}gáêŒ=¼d(‘„‹o—“±¶,0§Tâ§ØBz¯k+ºýˆ«½I{(1<בßêó(D·ë~w§˜ž[ðü²×€¹–”(27œžº&ì¤2¶þ#6\û}bV3éݤÀ½ ˜Íž€¬” ý ñFC¹üš.•{?®Ó^ä‚có2,Ó§ºš¼êKLó|ÔI"¯Œ~{AÒxÒ¤§·ÁÓ°šZ-â¬mŽn,úH7‡Ö °™ÛnXßÊVžÜ#EÌ„5VO$ 2²uuy<„ëz©Ò»M õl'¢T¶ù¨!?åvÌknÚ:—¥F¹ˆ´ªÜ¿Ë€d²š~³cr(²ÊjÊÒ Ïz¦K´¶ôúK‘s¶§¼Ýí‡ø,…ëë„R”2ï/áJ¬¶¹ýØN(‡„WmPI[/Öï8Do E¾L)òö(È@-ŽyäWCøøŒa&$¨Ë þ+¥T­M,UÜ9ÖsÍn¥jæ,ƒ“:~÷ÃóPΤ«xfˆ!Åù£sCÇêMŽIlׯfþ¦¹× b½iWvT·®CÚsñÎ M êu;¼ä2ßNømU‚¾<„]²i áY–ü ñ êažÚ<æ)ž·ˆe#‚‘óRH ORÄmdÑó‰ñß‚ßÓÏâ+‰_zuãù&†nn?Ï~]›ò¬Ž¥ðâêÈŒ©nÏó÷Èá•Ù4Ä5àázoJ 3’\žG~jTEOGðZQ)¬Òt'ä‹$qÒu>$Hh¼à“-+>¥9Ô©”Ai*Íò ¦¤&8·>ÔúT·EÖòáË  >žŒ-Õ®Iͬ¤è£É>¨3ž3H)Ø>• ˆ2tFK íL««‚ øª4n/J2ô,þ¦|ü ÿØO‡2BJÖª]7Œ¢è9Î)ëzÁÕ÷á?Î Ÿ*³9^åûNdQv‹Y®èHªÇå iÇDíEO!-ƒE²ôf~º€ydbäòìÔ¯}ááŒtÞ8ËÑcÞ…8‰<Ül&œg”¦˜; ¤13ëA‰Ù'^H]v†°„{޼´£Í÷ª1®¾²ïœ’*¾°–|“ÏÒŽêÎÕUóÌ¿Ú=V!œ|2ÔtÓˆö4€çBî¤Øb[‡ÜåF0OC•_º¤ñR&tn ¤…‡ ¿a¤éÙÝ_ù£Ç{Ë‹­…å>&®Ä†XE%53 àÇXW·¦„þ'‘G›ž%‘mä•s|e©ÔW$äßêà•2i¾Xým`ÔC¨}¥%åçêajKaÐ\‘Êú‹mœÞ“¯ëóP*Š¡Ç8z§â]@,÷hYÄ;¸œsLQÀ Ãüü¶ê™†D¿l ý g§~ßá|®L’OKΉ¼@„„ýwÐzÊA$€ßÚ,ÚM>ÇK±¨B[‹ðx=”k6ê«“þ¡ F+¯Ñ¾µkXÔJõJÎOHóJŒµ¤¤ ]‰ÄÈÒ]wd;£©Pé¦R'ì3TëG8¶Wâ-Z7ÐÒÿü{ˆÔÊ_Ê_ 7#ö&gç§Ÿsýý8ÞÕ ˆ1ÆÈé É—$h~‡$ZX¶ïVÅŽ+#./jxLHÿ½=ß^°kT£°C˜ÓÔŸSmê_p(³žY:OMu™æ¶6+àj«45¡ÉJp¼áº¯d¶¨Æµ²N÷·W%átYêRÏíý%;¥òü–‡Ax„z«ª¸¥9ŸÆv—¯=qíÅ,<Èÿ²5” Wô]pÁ§ƒk²Ë±`ÑSÒrñl&Èzké¡sñ­S v"Çbm¦¶ó»ý‡ÎpÝJ%šÚë• ÏK‹²EeÃQ :Ö=eœñaçY¬ØÓ"L£¾+àýàùÖ¾Oî4¤þïëàN®º²ýtÄònØü&\ødÒè¬ #ç),‘4\uŠ ?G›;0ÏùF`ò8:-‡´º£Ð¹åö—é SýxÛú¸.`H¦TϹó1è[Åñ~”#äàê<Œ’Hép·xÙfåhž$Ë>½ßpÜ®Ýq5VVÿåFX»tÖþН³ìX¾É±o•ÕEÿŽùŽXÁdXlÛ&@+ LB¡Ú«=,wr‰vuz‹ÏÜÕ›m3ünïG7³ÆlŠCN‡/½'¯›½çù6¢Ô=+à|~´ $É2?wäc-“!äõ!æƒ_&L¤c§i†ûTélA>@‹ œ' °ú¼\2[­B¬™m4˜>¤Öî1|¡yüR¯ÎÐI²ä_ž¶øÑV­Dþ–2‘Í>~Kæöù²(EGÉ{gÞTú6ø”vVä¤h&Ïé]¤º¢ï_׿°j0ªtóÔ~¼t1³3Ü´MC°s?aušc¢Ñl²Žþtån^7²@É9À#<¢ ceZ«‰æ!Ÿ£‚ ì*Ä‹y~>:Œd‘¼tS5øh›F7[íù-º4WË–¥\îé‰þŽYÅ¢Ãw–öY£KFPÅËlÄ}~|Ô»¢HiOrÂ'íal…Iƒ?{f²ÕXù¡X=œ¢*ÇÐ0;Ú¼á¼ó€a}ÒЕþØÁÈMêV˜ž^š-’,ž”ÞÙwx­æUìÛPa±vL¨l[F¾†ØHq›Qr% "ju²öåüxlc@îÎÖäGcÂE’ˆ¶ „çtIê­(ѱ¶pð‡þ|y—ºµºK]¤€€3;Ã^H¶mH®§áŽGÂ7ïe;íì°æ¾›NíQg–@\{<ì8u‚†§Öïz©qÜ[ |ŒÈ»ÊãÚwîXˆú×ν0¢ ‚xCÆ|< ¾;r}ë8pÙÄ'憫@ŠÕÀ(ÂQ‹é}Õ§0t„Ô¤TCÐI@ÄÒHÃúãñðúY£{6{Ad©ÎìÓªz`k7½!X-€EÕ%ZÔdI~y$_pô[8ÓÍ¿΅´È… ‡^•«3©¥F J>9ñEX@JgGªn;óFF3IÀ?ƾWa:ãØñ„›Çusç «>½T¿ h0?SÀÔ)-íU¤ø%ZÒɘz“=t¯è_j¸‰—§Lê„îUÐL>=ÃÄ#w†cªŒÃ9£Ât½­Bþ=èÇ5ævŸ˜MÍsè&Ä6 ÿ9g +n²Ž$zë_Ü"En.bîSø}'ÔTÛb÷óÙMW‰"G`RÀ ŸÉŠv/eXh$^p|“ÿ¹4Íò+|Õâ0BÓŒ[:誟?Á A2Kv±JlêÖ<™àÎ5z?iw­àÅ:ÒÅDk騀åEÃú™ê›k#,öìÔ¶bó3HqüD]:kº¾Ìvõb}ç«ü벂·Ñot«câ ‘ãé\¸¹hc(KÅD%òí#€"‘wtŠS–ìÈ|œP8Š£8ðduHÎ9â{sf„Vw`jot‡@ïK•ñ…“ôåAåFÅ»QþRhp>ú+Õ„u1 érô ñáÒ„:®Ç¢jß„kÑ[å_?ˆ¦4a¸­Í¬tHÚ&:e é°Í±;·£ –?l`?4(ô”ŒY²ª*¢”;Cv×êù76ðpU©JQ‰Ñg]Dìæ÷6¹íbB³î/Ê’¬)Üù‚O]°½¬Œc“=I(ÐcYŠ˜Òì/¹*¦t™g¢Q‘Õ)°z¢UUäX'PVšb,e6ÊÙå®bc¤iDȺ­F9×í!y!k¸†¥B'‘Mì¼ò,ÈLK»1ܕċþ&Å‹õ6yK¨ùN ‚ḛíÄ´\‰”À¬ë »ÜE’¦Ñˆy“©ý¢ñ²ãSEïPù¹ÿbÓVPº³Ðyx:ÙÙ×4ù6mWž«ÊÙïM%>£“ jÒ‘>gô´2B›`nóð`X 4ƒhtî&¹–mžO@æT]%4N¸ÐN¢Dœj)ö³èÅj?ýŒ—68ÒiRÝ.%9<õëÐ)Ã(x7Jœã0C>ÐG ¡Oìá“v$6ù”5HìÞfDXg¸ët R$ˆ]„å#mg§“±JIœ¶Dnúq˧’Ïèa]•%w~L0Þˆ°Ýc¿ƒ§íÜ/àr1Ÿ}ÐÝt°'­ õDšZéEh'Ñ}Ö?‚YàÐK7îàvý11Ò6’Ur©”„ŠÇÔÉ÷¯ðH/·Sé±jŠ&ü÷#u#—¥½Ô‘²¸ z¶ï 4óK¬ìX:ŠÀCb(Ò:*ýXÉ^ÐH;¨Ž– Hd¼åÊ“wß ®Ó Ér[ÊõV7†È(ÚémDè]\=6–D $6gl€ŽLÙÆtã§NÖÙÿ}&YŸV!ûÿ%ßxÿ«¶MПÕdy=éøÊrä{‹T¦PÕÎ h5V^M«;.E7ªß\¤u`c+‚¥)ØdÆ[å}Âa À¹„2^ñþâý¤ˆ®!†Ñ¦h̤.r†%bï[\¿ýÓgàêÕHܸ/T03g:ø­ë_œ'‰•ñöL'ä)ßÙ†åÈú¼ 'FîÁY¾3N&²^FgaqÈ£#LX>«Æ`Æ‚ÍwmdM·×_&òã²jè=eñü<ÊšmHnlYd¨S¿Q¢;W‰Ì.ÊsMÆ-§Ê"ßÀ À¤ñ”H£ jzì ~vWËÛfü‰9F×øÿK}o°D©]`ò5.øÔBáTþ[ëØóYgë¼׎Ęü ‰3¦bLœì`ñfA$ƒbn5Î=±§·ª‘›ÒX¨Y²áÉ©—W•JÔ }Ý"·[8i…Òü@Ùz­V  ή½nÆÙC)Ýï¡õ¼xD!´í»Å®’eUd·e3–6&û5³ äë·ùË“Då[m‘­—]¤‘S_H ê`Jv”®xþ¦èÕH¸íZr4;7kUúN`é´ìÐÔ>MéàβRVà]cZ·Î&IÚe6…}Ý&ƒ„üFjÝjÒì.`?ó€¦=7Êf~Ð3£ÿUþwž[­ÃÖ+•ÿq˜=rÐ;<ÁL,ÏÁeåQÃËd¾|¦iÜ «áæµj¹NdÉ$Ó6ð93dUû¥ß0:b£dÁh ¢ê)k¥¼ä®ùÐÇ2b7Øw4ÎÕ§Ê N„õX@ï†â0œ‡i R3Ÿv„mYm%HE?#~r±ºà+ÇŠÆæÂþ#K*µnfÚ7hÝkºÏÞ;Ù)‰û+I{ßÅ©·ÒÑá´ª¹™ðª_®#'ÕºMm“ô—À‰  ®ª\†C R1\‡è ¬Ÿ§û¹D–-Š5÷]òFÌêä/l+áYVý‹¯Ã_&¶æ tVÅT)2†Ca(žëÞ/¬|иîÈþ }VOŸ¯«Æ¦¨³/úÁÖœïéí¦¦ÏÓþ3Ôâ·ÈÐ :#?üa¡µT<6óº(`¨-uT>Yÿ…>¼Ÿ{'üÜÖöQž¾Ü{Z«KdÃ61p¨e~. äUÆQ.æÀO}EÃè$MbÚ²´QáÁÛÈyÒ*{4æÃ/÷ ¤Ž 8jdùøû*JÓ3"4]È×ä/,áSªón.›—9aÒ-çrb K`Î4Í×` @€!b “)Î%Ž4³j(ɾ¬#‘…bLÔýØkѺöž~·XÙ^‡¤*I¦«J^z>;#î>-mìMެ;Å™”‹õ}öÒ§Õ7âP8¡ÁFºOÁnA®IØ¿uò¤’ñq‹PëãG ³-¸óöBÞkÓíÄ®Ù|Þu–…߯úØ´©ø¤uüø„ì=å†G/âoÏääçqÔÖŸ®I<߸¤×þÊGý÷ª„¡vHÀ=‘6ØñO“ŸÍ*2têÎs†cN0È–³Bò¨äLÓ¼Z–/å¨3ae½ ÷š£ßÛM)€à§ ]Y¬€ƒÈÏFr‡$ÃDgkÆ@Ò<#)Ts­O൤ȇ旧U çÞQªÊ™£ú¤î­DmhÃùÆÌ>‹AŸ;ñ ¬.«×ä­i ¡7 E‡]'&äT#¿;¦EÆË/Ê© wŽŸé‚ߊ7Œ½êá)îIÄj,’D¤¾†ÍX­óÏL(º#²í"/i6èýí¯«»úñ“Ö=¤_s«ˆè~ƒhuөǯ)bí|¯®™\þPjÂD­ÿ$¸qVþ]Îtø¿Gµ´â-ÝÊÙ˜·Í³;b–”ñjX¡¸ñ›÷NÝ2Pf“v€Ïëgï:ÔÔƒ¢±ÕSK"·÷Ù%¢Qˆ{L¡ÐòÍc¾†7IÖLNry$02a¿ =r¾Öü´xË^– ÒY»ÿvÍ0ü†åª³ žN\‰·9Uâmvcj¬äXÉ˵5ææ–º±ÂNk&$±CD ¨˜ìŠàúɹCŒ'¹!Ä^ßdéxGô¨<èÿmø[pç{b¯¡ï)ž5×tÛ£tììYEý6J8€aÐ`Æ®Z¦Ó#hÊ¥EŽ´TŸ’§i®dæ7QƒÔ lJXèèBò‡ÂF+ýüV’Wj+&"›Þ×LñrI¥}²Ž}˜Ñð]çq Cp+ŸŒóûÃU{¢®aãØ¹@œÐ>*vFO%t™uä EIL‰Ãö ¼¥u†ùUа¿³ZþɈKïsh¡oíéÒZêÇ»¶hØVˆÂ_ ¶[a5]‰«ƒF—HÍ ÐY[êêq—®`씂) ëÌÀÁ¡Ét†,#Ó¹ p&ÁðÕþž'Œiþ½‚æ4½L.gÅý\øém¼å5N·?¬Çå@öÍ ¦ó€Úßtßc®ZÇ}ºòz\¢HoÖ ¼¹ö«ð !ƒ_¯œšA‚ý—¼ic•ñá½in }š6³½ ¼lY¶#Óusåï/…ê{þéüN“⺀D‘Ïj—Ìt)Ò%ƒ€‘ÂUG9—jsô&°‘! vöÉÍ7¥™žêýµF–^¬÷ý .HXSäÇd s…Í &•’pV®ÕI½¿ §„,û–ŠDÈóª¢KÇ…£`Cñ~0wôAVb­„Šê}ôÙhKjÛ)´ƒÿ‡jîúÆb¯š}NôhOF‰™yn¼ß} ú´mË£x/&q;ŽÇöÃDF ˆ¿`2 פ–~\u(ˆô˜>­YX¡•11lÌÄÊÎà&eûÙªƒ¤ÿÞ‚™&m1«ã`RW79im«‚,¯êÆH¬]äYìi•û£¨ÓÁ»Ñ'Ö>Õ‡¾1jBÐÅ–:´×ÊØI"¾ÙFæ¬6‚×%[än9¢³øGúWº8]¹È:ˆ×\9\J©HfÃAÐ<Œkƒ-W_î#ôn3&5ÃLôÞÍã>kÀó¬º95'Z þúVô˜r[8±í\p¼fÂ7O[w!›=­íl\D„HÂbðâîK”OJDÞŠ¡À‰Ì}ö܃êÅ  ")Œ?‹¼õïž§l+ò*vHÛ·ŸZŸnŒ*•2¼O¼zõ˜± ¨CÇÜùÅ»H9t¶0·¬Ý·×éIEXª’O7£ùó¼üýÜœ?´µ›û~G­w€ý Ž æÌmŠËSéþ>ò½E$ÕÂŽºô§%–šíÂLŠé§X÷k¬ŸäÌ{ÃßTÎþèqg5¯vÄ67¨´Þ¸MÓA¹3lG»_¬Í0³Ã€Rd-µ)/é•w¢÷±G9g¨U±Î X´rÞŒ§“™¯®6O?“7L? ’¿àÝá¯.iŽêÂÞ#hƒÎ)ô‘Z%ÎþõH, çÎkU[OvLé gÀC1£Jr^ e)8­ZÍGÙcüÚÓâ~Þ·an?ú½ìr‘¸‹"ô¢aÐ⊉9ªDMâCŠʼúªõ-¹¬«Õ0ƒ++Þg5€ ¶‘û¹©M…¥Ø²|Ëy}éý´øæqM#Ôð‘ùtÄn÷ \èiŒK«:ƒIƒÃØ€ÇÑшt$®äIV"ö9‹IÓô'æ5ñÝÊÐ 3ýq)ºlO¤K›,ã=èòŒÑñHb˜7(‰Á8¥ß‡ÅþÅÅCôÖ$oÐLÔË`—P¯-¹ãƒ®…798• ¾@ÐŽ¨ø’z}ìNtОº-Ë ÂP,ú·½ZvŸÈ»];òW̆yN,¶Y¶óJ°b;«Ásdc,”aýÓŸÊÌóvw›£ö&Ýñ>ÞqS`#Ìç¸×¨žýI0Þ?mâoÈ_„/4&ã»R’ ŠIüûJw\Ïf1[Ñ­óœåuÜŸ¥Ö„)ÅÐû  êa7‡ÏôûZà ?J/FOª"êÀ¿ˆƒ/A{‡ŸM¨ÆT‚¶°—x›Ž™ÓgÙÖ0¡ððY¬Ç` ïÂ'唊irµX3èN«.öa%Í0"Ã{W¼HîóÉÂ4ÐäÝwC_m·–t䨂›f@‰gAlÿ•”þG }¬Ç$Öjc¡ìHШ>MÅ).$`Jþ>é‹™g4‰Ý:ò«„–‚m²·¥–êájÂðnÃs³ó¡çÚ«`²æ™¡MÉ>M0Ò8n"³1ã.=Á¨õŠO’Âø·W—¾üDT¶ ˆ3ïÅ; P„È”-øp ó‚§Å,ÎmƒÛ ¯c61ºPè?Ä;á*¿U¨Fžr3è¼CÜRœ\K¼ žç…›=mq:†Í\½»Áß'45Nþˆgô8§ < )Ÿd`ôÜ-žj® ƒþĵ(ÊqnÙˆÕÒ䫃€ZêïÁšn@¡Æ{œ<)Ûϋٓ;´*«`\%Ë’,W~i?FšB¤°ýô§J†–NjT^È:åÛQ½Œ ªga fѯï$[\ÎIi%ÄhàL”øÛC&;þK!//FÎÏš+è KøF±v‹cIÎ £dذž’Iáµþ¼øšQ‡!î[›~Ü‹Jª:tͪ'ÂÆ›.¶ƒf?BDìÇ×W‚’÷7PŇº÷„y¡lDîìj~Ù»ãÀ!D òÑîWY¢©C“ ѵYª½mˆ˜‘Då0¤G1_ð6±[¥¿Þ/ŒçÚT"%÷(7ŠYÛÃr²v°IèsÆ¿3©f—âˆÌRÈÒHñpunFN10Í^–}kÎõ ü€óRž£ÆHÿxµ÷-j9G™ßñÌ2å+ªé”¬sgìÙ–˜À¯9. ·[û0Nyݘ@SܶCy†l\IûÞ%ÔÑ; ¹Gü¸›É¦ „'úH“±§½V+RßڽϪÇj"èž:ægz_x^>Û;TÁ¿ÝOj÷QxÑà¡V<9:Ç¢”¹ê¸õ£cq¢U¬6ß;W³œ9éâûDÎï‹ýC {ç+%»½ý­ßU‹öŸAʼnö<º^(3Y¼/‹§ó yq9¼1Êß,‚Å8f1J¦÷)Yþîû4á_ ^íòYr6öÉé§rü«q®šK8àÆ Ù2Ù«¥¶ª5î”>Ê ý±ª¦] 4îÁ»{jò@ÀwJé«)œºBÈÏÃ)¨$pãÜüï¶qgSyh‰Æg&£ŠœËÂnE_¬kÛš¯¶·ƒ0„]wõÄO ŠI¼ò{ó”,Ò`³ùìpñÚë»aÀŒ~ÂY¹»(ZÓì¬ÙÈÉ•Vö‰œbøDüØ|¡ò•îŠhø~ ‡¼- ¶U­ì†‡ “]ºÝˈ¿¼¦æÜY"¡r#l½îé“ )5kDÍ£4Òüžõ\çr ŒÕÔ¾‹9<}äÆ&úèj0$8¡ˆH­ZôÍtW´1E,ð†°¬‡á¦†UËÅWž/Ú=”½­LýÂèˆÆ÷Å^Îhý.£"°„½A[1¿ÐÍFœÈ 1‘.¨<=_cF…̘Àà-.ðI$ÈË‚Kìl•øL[e p¥Óå5«’õ”Xxó•¦ÛþØ|§5 MFsÔ?Æ«F¸š75ŒãêF8K…bÇÊ žÒf]ûÞ‰S(i7ë8 ñïÞ6cs0TF#«ùó ’œjûã¨}ЇÖÔÖæS$q´­¼€?¼¬-næ[âdËFv·Qö¬ î$…ϋθøÇÌ Tnó¹ô?×Àž>Fù†:² ³Øiw·=XÄ6 ›Ê®9»RY^«lCÛŸW¿ôÊ8v!¾hDΖ—úÆr¤fÕ‹{‘<—#„w£+º W#þáFù¤Dr7|è·aÚäñbš(Xß+˜,à!’ô)uV/ (­à«ßˆªnK‰D¡Ð½Š¬Ø[ñ1'¶ÅÃGð¹Ñ¥váa„ôkQzìÞsDýn#Âéò%háQa1Èó·uΪf´#Ç ×V7´+N‹O¾RøÌQ6Vú“•=îC]j¹ (´¯[’XîÁ´?änë ^Û}7ôx n)áàⱈ:ºîÞÉŸl8ÙÑ`ÊЫ0À)Ϻˆigº˜Kw†°oõ3íµt YMëŽv¥>Õ#Ã:)Ê™æD(i“Òw(E³pãÚ³¼Þ±JÒIûš­òúò½u¨#þö±_@@ë$‹ER;º>¡rvú¾MÎÂb Ô2h§_ê9 £YV|Av•ï4òDO7Îc”вÅ<08øÒù?ù–YÂDõÜû+.ðý«äí¥rä É;ë¦zéö§%}ŒñBùŒ|û:Ëg~S ²cÛ8S+Sûõu^k ¢ÎeŒ-u:0ØËÂL ñ „gG~êœR›A7¢µ…V.rÔ«k„.廈åJ%êîIF¿Êšß²šœÚ^–®¸q¯iiº€v¯P¡DCVÁªk$ßž!™uVè~Ø}¼ãèÓß<"­?—ÉnÖ ›µò£Ý›«qsFyÎÙ¯“Û7ò‘ƒ“VïfH6Æ3QBMíÚù%©z÷åÓ\ÞQ9Yع©å&}¯Þ%ghT81õÌ6Å/ʯy`(hjVšˆ8Qf·y%ÉE¶tdÀ9xH¸] ºþgEá‚Vurfà)Þ­µ*_kÃÝÊÄ—E)(Ì3Q¡4ª¡Õsw˜úÛD†ò&Uu )N¤G`ßÉf›Ù"@ €Ö/,à ìºS ¸ŸñNø×áÈôRÞ€åÙbá—ñ©æØÖ¾ QµWl"ÏUìoóŬ~tMZªWc–U•xÝ0JyyÛÞÉËì¤ ´ˆô)T;Å7¥Q|êa1A}ñX¢æïܺ$C‡«óMähWÞžÐײÐûƒu†…_Ñ$gYßX9Ô-->¥®Ž¢ eˆ˜aÚŠQÀ–¹nüÝU Õ‡ïÓP6xÓùU4r^x&C¾õplëkO(±áv1ô´‹Î¸C[Ë”´«slayÑ™e‘f’ü²‘yqšK;ŸPK_&ÉöÇ‚·ƒë&“ ìÒÝUûYllO-O®©âÊû²KöÐqÍ#P¿úýÙñ¡!‚ o¤ ¤ïW뿉µU{…„œ­v Šo™¢ÕAÝÛ, ‚it#·_" ZFyœzÛ(.£éǤæ]v1#›±Àõ`- ždZ6³ÒP«93¦Vóc¶*zå75Õ!«»¯É—™M·Jjí‡I}•$ùY8jüE@ìI× ñ*¿»$”û™;S=‘…!¢|ú N^_픑ÀaÏ„9}øµW^À>°+`l–D2·hH…‹„]¦ Ý"à¯[Ë|¸š$Ѧ8Fˆ¾ìÿ€åX*r'ÕDˆ$ÙÂB][§ùhFì¦`—…&X+]Ÿ96¢ÑÚòÿ¯Ê/ßUŠŠHÜÈ©ÆlÞ^KÌ4¶íi·õÕ,<øµÆÎAPHG}èA (tYiñXÔ zrRºÿZ‘"ÂóÖ/µ§Sã(-$Àsаb×,ìâMdÌ=·‘_™çz©ë΄i+B«z#ó±lMÕøúm×tEWìhFç\æx¥§™±EæmSÑÿʉ5âÒ=¾e1³á.b“«Xu›áਇ8GŒU'ºçNVf¹zÅUö 6KMΫøÁT`,x¯³Ë’½ýÀ÷Måê2ì6±¤ÚŽmJêìnnQoˆ´Dô`ŒYŽžƒp :¼ `Zø,yî'•¤œˆéö÷‹i/£™ãn‰P¢´s_*ëp¬Rm‚5&ÈOPä]lŸ±X·&¤!æHµ\Èñ‡Q+5/t ï`Û-7} :Sžxì*‰ìEnl3+ 'ÖcñøaãžÆ`«j[˜'oCÖ³B:õ_c¡@Ž[Ô]ëVÿ¨!ÅÚ¨÷2üÆjÎÏËFûeÜÛëRίUó¸¾éÃ^’‚xä$gWé_ëJq¸õ…‘eókõû’ÒvÊ8•YŠVvä9r•8ø7˜9Šf"lÂÙ&Úx,«/¨1£m)“tÉm¢X¨›YÓGyò¬m¿^9po–L.˜©‹£µ¼6tŠ5±ÛJTaúŸ~TÏÓG$‚ùòßtl(Ë83÷E6`Eüü¨A¤ÛSÙ…Âù€'ÞTþ=‡êd{?¢¨¡`R®¥8:ÓlqIŽdÑU éóG§`§é„D¼nç%„iÕ;·ÉíŽØ?AúaPT¼&ìÀcEÑÉebªHw‘¾niçò> œð–ž‹åhiU¾ÝXÿžfVp‚¼ùÄöf‹Z§à¿ß¶—ÇEñã™áz¬é7ú Õ8½Œ«a–Á}´r·!¸¹ÒÀ¬FÆ=” ]ÿ2ÊA@¼Ô}›8*’øÑ5ZMÈ“‰DÛ\Wè`í‹é^ 7Ï>ê{Yx½^¤ Þ ÌCý˦»Iûúm=TÑzɲƒT¬Š.?S\…¶¹0Ì-u-Ú@[…¹‡à’¾ Ьñ¨¿“·šY›™Ð)Ó€¥­®†éÅP*ôÃÌ”žà…/Ý«5Œ<‹2ôÊ9rp‰¼®KDÇuZî2M¡'©Õ LnuƒOšŒb“o¡tšØ®fADÞ<5f/²á¼ÒMË%lT1/ü‰V2×´¯§/îÖ‚v“Š ¤n,|vw Á¹Uqþüg:]§1Ö¼ÅK^CÖtŒJ/WlgW\ñÅ—äufñà›r·„åqÎýŠ€¼Ë.çÝZ˜ªy‹DÒvïfV_b¾s¾·è±«\pBUÜ?2Ô‹%‚Ç2go¹`qí4Âö #d0µe¸‚„  1ZË?÷ÍíÄ–À"Ä~~ôõ—‡L*Õ9o«È¿®¡ pA”èwm·…r}çßñŠH¶°ð÷CAMVþ_o“'ÜÉŽ‚JE†r%c÷A+­ÆT…ý®åœøà•W¾tÞrç–•ô7]‚¹ïLïDÛ×Ë'»…â0c6 ÞkEÀ°Š|õrAš‘ò€÷7hp ŠôÇCþÎ(ç2šþAÙLOÜûU¡ÿTTS—µëP ¢û'Ù0•ôŸâ”R;{Æ}5ÓYý#õ£[$€O0Á3–QRáÚbŠ€ß`~úÁLÍìËËm:%#¸”×@ªJ³oP<£'Õ¡^ÿ½“:èU¹O²WBÖ²]„ ˆjÔ²c k%ÊÞ²LŠûùæ9n°vÖû€bûµF“”:=’º>Ðqš¤7ò˜\+cÕ0|W« w8í§Ô·38¥\¾ûo©HŸ=o‡ŒÈS(…†ëbUê0÷þA~•äü©Â7 R³`«, àôíÅ#@ÿ…W{–¯à úx­Ã´è‘üŠ»¾”<<®h)+$â×'—U Û k!íˆJwŒÖ%[¹£š-€ˆäÖ‘N—LÔn™ ¶“XÝÙÕ6Ï8˜úSœ{DHš1jâ)ÁÅj©ßà!Ôæ× 5¥>ž ~Gö“¢3 ¿e‘kå<ÁÙÕÄŽýáŠÑ'pÍÙ{ï1Øm‘1•Ü_är‚8²„ä®ñ#Ìíª2Í»ÎòáèÄ  yç ê´zƒLƒ=äYÑ-.ýù´¡õéb+k ¡ÖQÓÊ>'µ*"Wþb¡²¿tWÌz±Ÿ ôÝ%€:”äάzƒH—ì€×“©-g ñþÛì‚…ò @ú»ª#ìËÿÓ‹õË„¬CPmplȆBN3\F¢Ç«« pÛé¼ä §M]ˆ®(…Y£ ljF³fÌb½5Úr©^žc.5wHµÏ‹ò0 ‹YZrtracklayer/demo/0000755000175100017510000000000012607264731015051 5ustar00biocbuildbiocbuildrtracklayer/demo/00Index0000644000175100017510000000010512607264731016177 0ustar00biocbuildbiocbuildtargets Visualizing microRNA target sites in the UCSC Genome Browser rtracklayer/demo/targets.R0000644000175100017510000000251412607264731016647 0ustar00biocbuildbiocbuild################################################### ### chunk number 1: rtl-init ################################################### library(rtracklayer) data(targets) ################################################### ### chunk number 2: rtl-miRNA-track ################################################### targetTrack <- with(targets, RangedData(IRanges(start, end), target, strand, space = chrom)) ################################################### ### chunk number 3: rtl-export eval=FALSE ################################################### ## export(targetTrack, "targets.wig") ################################################### ### chunk number 4: rtl-ucsc-start ################################################### session <- browserSession() ################################################### ### chunk number 5: rtl-ucsc-lay ################################################### session$targets <- targetTrack ################################################### ### chunk number 6: rtl-ucsc-view eval=FALSE ################################################### top <- targetTrack$target == targets$target[1] range <- ranges(targetTrack[top,]) * -10 view <- browserView(session, range, hide = c("refGene", "mgcFullMrna", "intronEst"), dense = "knownGene", squish = "cons44way") rtracklayer/inst/0000755000175100017510000000000012612032142015063 5ustar00biocbuildbiocbuildrtracklayer/inst/CITATION0000644000175100017510000000145012607264731016237 0ustar00biocbuildbiocbuildcitEntry(entry="article", title = paste("rtracklayer: an R package for interfacing with genome browsers" ), author = personList( as.person("Michael Lawrence"), as.person("Robert Gentleman"), as.person("Vincent Carey")), year = 2009, journal = "Bioinformatics", volume = "25", pages = "1841-1842", doi = "10.1093/bioinformatics/btp328", url = "http://bioinformatics.oxfordjournals.org/content/25/14/1841.abstract", textVersion = paste("M. Lawrence, R. Gentleman, V. Carey:", "\"rtracklayer: an {R} package for interfacing with", "genome browsers\".", "Bioinformatics 25:1841-1842.")) rtracklayer/inst/doc/0000755000175100017510000000000012612032142015630 5ustar00biocbuildbiocbuildrtracklayer/inst/doc/rtracklayer.R0000644000175100017510000002755512612032142020314 0ustar00biocbuildbiocbuild### R code from vignette source 'rtracklayer.Rnw' ################################################### ### code chunk number 1: initialize ################################################### options(width=70) ################################################### ### code chunk number 2: rtl-init ################################################### library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") ################################################### ### code chunk number 3: rtl-miRNA-track ################################################### library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) ################################################### ### code chunk number 4: rtl-miRNA-track-seqinfo ################################################### genome(targetTrack) head(seqlengths(targetTrack)) ################################################### ### code chunk number 5: feature-data-accessors ################################################### head(seqnames(targetTrack)) head(start(targetTrack)) ################################################### ### code chunk number 6: sol-1 ################################################### head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) ################################################### ### code chunk number 7: subset-features ################################################### ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] ################################################### ### code chunk number 8: sol-2 ################################################### negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] ################################################### ### code chunk number 9: export (eval = FALSE) ################################################### ## export(targetTrack, "targets.bed") ################################################### ### code chunk number 10: import (eval = FALSE) ################################################### ## restoredTrack <- import("targets.bed") ################################################### ### code chunk number 11: sol-3 ################################################### export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") ################################################### ### code chunk number 12: browserSession (eval = FALSE) ################################################### ## session <- browserSession("UCSC") ################################################### ### code chunk number 13: genomeBrowsers ################################################### genomeBrowsers() ################################################### ### code chunk number 14: layTrack (eval = FALSE) ################################################### ## track(session, "targets") <- targetTrack ################################################### ### code chunk number 15: sol-4 (eval = FALSE) ################################################### ## session$target100 <- targetTrack[1:100] ################################################### ### code chunk number 16: take-subset ################################################### subTargetTrack <- targetTrack[1] # get first feature ################################################### ### code chunk number 17: view-subset (eval = FALSE) ################################################### ## view <- browserView(session, subTargetTrack * -10, pack = "targets") ################################################### ### code chunk number 18: view-subset-multi (eval = FALSE) ################################################### ## view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") ################################################### ### code chunk number 19: sol-6 (eval = FALSE) ################################################### ## viewOut <- browserView(session, range(view) * -2) ## viewFull <- browserView(session, full = "targets") ################################################### ### code chunk number 20: browseGenome (eval = FALSE) ################################################### ## browseGenome(targetTrack, range = subTargetTrack * -10) ################################################### ### code chunk number 21: browseGenome-simple (eval = FALSE) ################################################### ## browseGenome(subTargetTrack) ################################################### ### code chunk number 22: get-track-names (eval = FALSE) ################################################### ## loaded_tracks <- trackNames(session) ################################################### ### code chunk number 23: get-track-data (eval = FALSE) ################################################### ## subTargetTrack <- track(session, "targets") ################################################### ### code chunk number 24: get-track-segment (eval = FALSE) ################################################### ## chr1Targets <- track(session, "targets", chr1Targets) ################################################### ### code chunk number 25: sol-7 (eval = FALSE) ################################################### ## region <- range(subTargetTrack) + 500 ## targetSNP <- track(session, "snp130", region) ## as.data.frame(targetSNP) ## targetGene <- track(session, "knownGene", region) ## as.data.frame(targetGene) ################################################### ### code chunk number 26: genomeSegment-view (eval = FALSE) ################################################### ## segment <- range(view) ################################################### ### code chunk number 27: tracks-view (eval = FALSE) ################################################### ## visible_tracks <- trackNames(view) ## trackNames(view) <- visible_tracks ################################################### ### code chunk number 28: track-modes-view (eval = FALSE) ################################################### ## modes <- ucscTrackModes(view) ################################################### ### code chunk number 29: set-track-modes (eval = FALSE) ################################################### ## modes["targets"] ## modes["targets"] <- "full" ## ucscTrackModes(view) <- modes ################################################### ### code chunk number 30: browserViews (eval = FALSE) ################################################### ## views <- browserViews(session) ## length(views) ################################################### ### code chunk number 31: sol-8 (eval = FALSE) ################################################### ## viewTarget <- track(session, "targets", range(view)) ## trackNames(view) <- c("snp130", "knownGene", "targets") ## ucscTrackModes(view)["knownGene"] <- "hide" ################################################### ### code chunk number 32: load-snp ################################################### library(rtracklayer) data(cpneTrack) ################################################### ### code chunk number 33: datavals-accessor ################################################### head(score(cpneTrack)) ################################################### ### code chunk number 34: trackData ################################################### plot(start(cpneTrack), score(cpneTrack)) ################################################### ### code chunk number 35: layTrack-snp (eval = FALSE) ################################################### ## session <- browserSession() ## session$cpne <- cpneTrack ################################################### ### code chunk number 36: browserView-snp (eval = FALSE) ################################################### ## view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") ################################################### ### code chunk number 37: layTrack-snp2 (eval = FALSE) ################################################### ## track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, ## yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack ## view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") ################################################### ### code chunk number 38: search-nrsf ################################################### library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits ################################################### ### code chunk number 39: track-nrsf ################################################### nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") ################################################### ### code chunk number 40: browserView-nrsf (eval = FALSE) ################################################### ## session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) ################################################### ### code chunk number 41: rmsk.e2f3 (eval = FALSE) ################################################### ## library (rtracklayer) ## mySession = browserSession("UCSC") ## genome(mySession) <- "hg19" ## e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) ## tbl.rmsk <- getTable( ## ucscTableQuery(mySession, track="rmsk", ## range=e2f3.tss.grange, table="rmsk")) ################################################### ### code chunk number 42: uwDgfEncodeExample (eval = FALSE) ################################################### ## track.name <- "wgEncodeUwDgf" ## table.name <- "wgEncodeUwDgfK562Hotspots" ## e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) ## mySession <- browserSession () ## tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, ## range=e2f3.grange, table=table.name)) ## tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, ## table=table.name)) ################################################### ### code chunk number 43: trackAndTableNameDiscovery (eval = FALSE) ################################################### ## mySession <- browserSession () ## genome(mySession) <- "hg19" ## # 177 tracks in October 2012 ## track.names <- trackNames(ucscTableQuery(mySession)) ## # chose a few tracks at random from this set, and discover how ## # many tables they hold ## tracks <- track.names [c (99, 81, 150, 96, 90)] ## sapply(tracks, function(track) { ## length(tableNames(ucscTableQuery(mySession, track=track))) ## }) ################################################### ### code chunk number 44: session-info ################################################### sessionInfo() rtracklayer/inst/doc/rtracklayer.Rnw0000644000175100017510000006707512612032142020662 0ustar00biocbuildbiocbuild\documentclass{article} %\VignetteIndexEntry{rtracklayer} \usepackage[usenames,dvipsnames]{color} \usepackage[colorlinks=true, linkcolor=Blue, urlcolor=Blue, citecolor=Blue]{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\IRanges}{\Rpackage{IRanges}} \title{The \textbf{rtracklayer} package} \author{Michael Lawrence} \begin{document} \maketitle <>= options(width=70) @ \tableofcontents \section{Introduction} The \textbf{rtracklayer} package is an interface (or \emph{layer}) between \textbf{R} and genome browsers. Its main purpose is the visualization of genomic annotation \emph{tracks}, whether generated through experimental data analysis performed in R or loaded from an external data source. The features of \textbf{rtracklayer} may be divided into two categories: 1) the import/export of track data and 2) the control and querying of external genome browser sessions and views. There are two basic track data structures in Bioconductor: \Rclass{GRanges}, defined by the \Rpackage{GenomicRanges} package, and \Rclass{RangedData}, a more general data structure from the \Rpackage{IRanges} package. For most purposes, \Rclass{GRanges} is preferred in the context of \Rpackage{rtracklayer}; however, \Rclass{RangedData} has some particular use cases. \textbf{rtracklayer} supports the import and export of tracks from and to files in various formats, see Section~\ref{sec:import-export}. All positions in a \Rclass{GRanges} or \Rclass{RangedData} should be 1-based, as in R itself. The \textbf{rtracklayer} package currently interfaces with the \textbf{UCSC} web-based genome browser. Other packages may provide drivers for other genome browsers through a plugin system. With \textbf{rtracklayer}, the user may start a genome browser session, create and manipulate genomic views, and import/export tracks and sequences to and from a browser. Please note that not all features are necessarily supported by every browser interface. The rest of this vignette will consist of a number of case studies. First, we consider an experiment investigating microRNA regulation of gene expression, where the microRNA target sites are the primary genomic features of interest. \section{Gene expression and microRNA target sites} This section will demonstrate the features of \textbf{rtracklayer} on a microarray dataset from a larger experiment investigating the regulation of human stem cell differentiation by microRNAs. The transcriptome of the cells was measured before and after differentiation by HG-U133plus2 Affymetrix GeneChip arrays. We begin our demonstration by constructing an annotation dataset from the experimental data, and then illustrate the use of the genome browser interface to display interesting genomic regions in the UCSC browser. \subsection{Creating a target site track} For the analysis of the stem cell microarray data, we are interested in the genomic regions corresponding to differentially expressed genes that are known to be targeted by a microRNA. We will represent this information as an annotation track, so that we may view it in the UCSC genome browser. \subsubsection{Constructing the \Rclass{GRanges}} In preparation for creating the microRNA target track, we first used \textbf{limma} to detect the differentially expressed genes in the microarray experiment. The locations of the microRNA target sites were obtained from MiRBase. The code below stores information about the target sites on differentially expressed genes in the \textit{data.frame} called \texttt{targets}, which can also be obtained by entering \texttt{data(targets)} when \textbf{rtracklayer} is loaded. % <>= library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") @ % The following code creates the track from the \texttt{targets} dataset: % <>= library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) @ % The \Rfunction{GRangesForUCSCGenome} function constructs a \Rclass{GRanges} object for the named genome. The strand information, the name of the microRNA and the Ensembl ID of the targeted transcript are stored in the \Rclass{GRanges}. The chromosome for each site is passed as the \texttt{chrom} argument. The chromosome names and lengths for the genome are taken from the UCSC database and stored in the \Rclass{GRanges} along with the genome identifier. We can retrieve them as follows: <>= genome(targetTrack) head(seqlengths(targetTrack)) @ % While this extra information is not strictly needed to upload data to UCSC, calling \Rfunction{GRangesForUCSCGenome} is an easy way to formally associate interval data to a UCSC genome build. This ensures, for example, that the data will always be uploaded to the correct genome, regardless of browser state. It also immediately validates whether the intervals fall within the bounds of the genome. For cases where one is not interacting with the UCSC genome browser, and in particular when network access is unavailable, the \Rfunction{GRangesForBSGenome} function behaves the same, except it finds an installed \Rpackage{BSGenome} package and loads it to retrieve the chromosome information. \subsubsection{Accessing track information} The track information is now stored in the R session as a \Rclass{GRanges} object. It holds the chromosme, start, end and strand for each feature, along with any number of data columns. The primary feature attributes are the \texttt{start}, \texttt{end}, \texttt{seqnames} and \texttt{strand}. There are accessors for each of these, named accordingly. For example, the following code retrieves the chromosome names and then start positions for each feature in the track. % <>= head(seqnames(targetTrack)) head(start(targetTrack)) @ % \paragraph{Exercises} \begin{enumerate} \item Get the strand of each feature in the track \item Calculate the length of each feature \item Reconstruct (partially) the \texttt{targets} \Rclass{data.frame} \end{enumerate} <>= head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) @ \subsubsection{Subsetting a \textit{GRanges}} It is often helpful to extract subsets from \Rclass{GRanges} instances, especially when uploading to a genome browser. The data can be subset though a matrix-style syntax by feature and column. The conventional \texttt{[} method is employed for subsetting, where the first parameter, \textit{i}, indexes the features and \textit{j} indexes the data columns. Both \textit{i} and \textit{j} may contain numeric, logical and character indices, which behave as expected. % <>= ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] @ % \paragraph{Exercises} \begin{enumerate} \item Subset the track for all features on the negative strand of chromosome 2. \end{enumerate} <>= negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] @ \subsubsection{Exporting and importing tracks} \label{sec:import-export} Import and export of \Rclass{GRanges} and \Rclass{RangedData} instances is supported in the following formats: Browser Extended Display (BED), versions 1, 2 and 3 of the General Feature Format (GFF), and Wiggle (WIG). Support for additional formats may be provided by other packages through a plugin system. To save the microRNA target track created above in a format understood by other tools, we could export it as BED. This is done with the \texttt{export} function, which accepts a filename or any R connection object as its target. If a target is not given, the serialized string is returned. The desired format is derived, by default, from the extension of the filename. Use the \texttt{format} parameter to explicitly specify a format. <>= export(targetTrack, "targets.bed") @ To read the data back in a future session, we could use the \texttt{import} function. The source of the data may be given as a connection, a filename or a character vector containing the data. Like the \texttt{export} function, the format is determined from the filename, by default. <>= restoredTrack <- import("targets.bed") @ % The \Robject{restoredTrack} object is of class \Rclass{GRanges}. % \paragraph{Exercises} \begin{enumerate} \item Output the track to a file in the ``gff'' format. \item Read the track back into R. \item Export the track as a character vector. \end{enumerate} <>= export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") @ \subsection{Viewing the targets in a genome browser} For the next step in our example, we will load the track into a genome browser for visualization with other genomic annotations. The \textbf{rtracklayer} package is capable of interfacing with any genome browser for which a driver exists. In this case, we will interact with the web-based \textbf{UCSC} browser, but the same code should work for any browser. \subsubsection{Starting a session} The first step towards interfacing with a browser is to start a browser session, represented in R as a \textit{BrowserSession} object. A \textit{BrowserSession} is primarily a container of tracks and genomic views. The following code creates a \textit{BrowserSession} for the \textbf{UCSC} browser: <>= session <- browserSession("UCSC") @ Note that the name of any other supported browser could have been given here instead of ``UCSC''. To see the names of supported browsers, enter: <>= genomeBrowsers() @ \subsubsection{Laying the track} Before a track can be viewed on the genome, it must be loaded into the session using the \texttt{track<-} function, as demonstrated below: <>= track(session, "targets") <- targetTrack @ The \textit{name} argument should be a character vector that will help identify the track within \texttt{session}. Note that the invocation of \texttt{track<-} above does not specify an upload format. Thus, the default, ``auto'', is used. Since the track does not contain any data values, the track is uploaded as BED. To make this explicit, we could pass ``bed'' as the \textit{format} parameter. \paragraph{Exercises} \begin{enumerate} \item Lay a track with the first 100 features of \texttt{targetTrack} \end{enumerate} Here we use the short-cut \texttt{\$} syntax for storing the track. <>= session$target100 <- targetTrack[1:100] @ \subsubsection{Viewing the track} For \textbf{UCSC}, a view roughly corresponds to one tab or window in the web browser. The target sites are distributed throughout the genome, so we will only be able to view a few features at a time. In this case, we will view only the first feature in the track. A convenient way to focus a view on a particular set of features is to subset the track and pass the range of the subtrack to the constructor of the view. Below we take a track subset that contains only the first feature. <>= subTargetTrack <- targetTrack[1] # get first feature @ Now we call the \texttt{browserView} function to construct the view and pass the subtrack, zoomed out by a factor of 10, as the segment to view. By passing the name of the targets track in the \textit{pack} parameter, we instruct the browser to use the ``pack'' mode for viewing the track. This results in the name of the microRNA appearing next to the target site glyph. <>= view <- browserView(session, subTargetTrack * -10, pack = "targets") @ If multiple ranges are provided, multiple views are launched: <>= view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") @ \paragraph{Exercises} \begin{enumerate} \item Create a new view with the same region as \texttt{view}, except zoomed out 2X. \item Create a view with the ``targets'' track displayed in ``full'' mode, instead of ``packed''. \end{enumerate} <>= viewOut <- browserView(session, range(view) * -2) viewFull <- browserView(session, full = "targets") @ \subsubsection{A shortcut} There is also a shortcut to the above steps. The \texttt{browseGenome} function creates a session for a specified browser, loads one or more tracks into the session and creates a view of a given genome segment. In the following code, we create a new \textbf{UCSC} session, load the track and view the first two features, all in one call: <>= browseGenome(targetTrack, range = subTargetTrack * -10) @ It is even simpler to view the subtrack in \textbf{UCSC} by relying on parameter defaults: <>= browseGenome(subTargetTrack) @ \subsubsection{Downloading Tracks from your Web Browser} @ It is possible to query the browser to obtain the names of the loaded tracks and to download the tracks into R. To list the tracks loaded in the browser, enter the following: % <>= loaded_tracks <- trackNames(session) @ % One may download any of the tracks, such as the ``targets'' track that was loaded previously in this example. % <>= subTargetTrack <- track(session, "targets") @ % The returned object is a \Rclass{GRanges}, even if the data was originally uploaded as a \Rclass{RangedData} or other object. By default, the segment of the track downloaded is the current default genome segment associated with the session. One may download track data for any genome segment, such as those on a particular chromosome. Note that this does not distinguish by strand; we are only indicating a position on the genome. % <>= chr1Targets <- track(session, "targets", chr1Targets) @ \paragraph{Exercises} \begin{enumerate} \item Get the SNP under the first target, displayed in \texttt{view}. \item Get the UCSC gene for the same target. \end{enumerate} <>= region <- range(subTargetTrack) + 500 targetSNP <- track(session, "snp130", region) as.data.frame(targetSNP) targetGene <- track(session, "knownGene", region) as.data.frame(targetGene) @ \subsubsection{Accessing view state} The \texttt{view} variable is an instance of \textit{BrowserView}, which provides an interface for getting and setting view attributes. Note that for the UCSC browser, changing the view state opens a new view, as a new page must be opened in the web browser. To programmatically query the segment displayed by a view, use the \texttt{range} method for a \textit{BrowserView}. % <>= segment <- range(view) @ % Similarly, one may get and set the names of the visible tracks in the view. <>= visible_tracks <- trackNames(view) trackNames(view) <- visible_tracks @ The visibility mode (hide, dense, pack, squish, full) of the tracks may be retrieved with the \texttt{ucscTrackModes} method. % <>= modes <- ucscTrackModes(view) @ % The returned value, \texttt{modes}, is of class \textit{UCSCTrackModes}. The modes may be accessed using the \texttt{[} function. Here, we set the mode of our ``targets'' track to ``full'' visibility. <>= modes["targets"] modes["targets"] <- "full" ucscTrackModes(view) <- modes @ Existing browser views for a session may be retrieved by calling the \texttt{browserViews} method on the \textit{browserSession} instance. % <>= views <- browserViews(session) length(views) @ % \paragraph{Exercises} \begin{enumerate} \item Retrieve target currently visible in the view. \item Limit the view to display only the SNP, UCSC gene and target track. \item Hide the UCSC gene track. \end{enumerate} <>= viewTarget <- track(session, "targets", range(view)) trackNames(view) <- c("snp130", "knownGene", "targets") ucscTrackModes(view)["knownGene"] <- "hide" @ \section{CPNE1 expression and HapMap SNPs} Included with the \textbf{rtracklayer} package is a track object (created by the \textbf{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. We load the track presently. <>= library(rtracklayer) data(cpneTrack) @ \subsection{Loading and manipulating the track} The data values for a track are stored in the columns on the \textit{RangedData} instance. Often, a track contains a single column of numeric values, conventionally known as the \textit{score}. The \texttt{score} function retrieves the column named or \textit{score} or, if one does not exist, the first column in the \textit{RangedData}, as long as it is numeric. Otherwise, \texttt{NULL} is returned. <>= head(score(cpneTrack)) @ % Sometimes, it may be convenient to extract the track information as a % \textit{data.frame}. The \textit{trackData} function does this by % combining the \textit{featureData} matrix with the \textit{dataVals}. % It also adds a column named \textit{featMid}, which gives the % mid-points (the mean of the start and end positions) of each feature % in the track. Here is an example of using \textit{trackData} to plot % the test value for each SNP vs. its position. One use of extracting the data values is to plot the data. <>= plot(start(cpneTrack), score(cpneTrack)) @ \subsection{Browsing the SNPs} We now aim to view some of the SNPs in the UCSC browser. Unlike the microRNA target site example above, this track has quantitative information, which requires special consideration for visualization. \subsubsection{Laying a WIG track} To view the SNP locations as a track in a genome browser, we first need to upload the track to a fresh session. In the code below, we use the \texttt{[[<-} alias of \texttt{track<-}. <>= session <- browserSession() session$cpne <- cpneTrack @ % Note that because \texttt{cpneTrack} contains data values and its features do not overlap, it is uploaded to the browser in the WIG format. One limitation of the WIG format is that it is not possible to encode strand information. Thus, each strand needs to have its own track, and \textbf{rtracklayer} does this automatically, unless only one strand is represented in the track (as in this case). One could pass ``bed'' to the \textit{format} parameter of \texttt{track<-} to prevent the split, but tracks uploaded as BED are much more limited compared to WIG tracks in terms of visualization options. To form the labels for the WIG subtracks, `` p'' is concatenated onto the plus track and `` m'' onto the minus track. Features with missing track information are placed in a track named with the `` na'' postfix. It is important to note that the subtracks must be identified individually when, for example, downloading the track or changing track visibility. \subsubsection{Plotting the SNP track} To plot the data values for the SNP's in a track, we need to create a \textit{browserView}. We will view the region spanning the first 5 SNPs in the track, which will be displayed in the ``full'' mode. % <>= view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") @ % The UCSC browser will plot the data values as bars. There are several options available for tweaking the plot, as described in the help for the \textit{GraphTrackLine} class. These need to be specified laying the track, so we will lay a new track named ``cpne2''. First, we will turn the \textit{autoScale} option off, so that the bars will be scaled globally, rather than locally to the current view. Then we could turn on the \textit{yLineOnOff} option to add horizontal line that could represent some sort of cut-off. The position of the line is specified by \textit{yLineMark}. We set it arbitrarily to the 25\% quantile. % <>= track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") @ % \section{Binding sites for NRSF} \label{sec:binding} Another common type of genomic feature is transcription factor binding sites. Here we will use the \textbf{Biostrings} package to search for matches to the binding motif for NRSF, convert the result to a track, and display a portion of it in the \textbf{UCSC} browser. \subsection{Creating the binding site track} We will use the \textbf{Biostrings} package to search human chromosome 1 for NRSF binding sites. The binding sequence motif is assumed to be \textit{TCAGCACCATGGACAG}, though in reality it is more variable. To perform the search, we run \textit{matchPattern} on the positive strand of chromosome 1. % <>= library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits @ % We then convert the hits, stored as a \textit{Views} object (a particular type of \textit{IRanges} object), to a \textit{RangedData} instance. % <>= nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") @ % \Rfunction{GenomicData} is a convenience function that constructs a \Rclass{GRanges} object. \subsection{Browsing the binding sites} Now that the NRSF binding sites are stored as a track, we can upload them to the UCSC browser and view them. Below, load the track and we view the region around the first hit in a single call to \texttt{browseGenome}. % <>= session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) @ % We observe significant conservation across mammal species in the region of the motif. \section{Downloading tracks from UCSC} \Rclass{rtracklayer} can be used to download annotation tracks from the UCSC table browser, thus providing a convenient programmatic alternative to the web interface available at \url{http://genome.ucsc.edu/cgi-bin/hgTables}. \textbf{Note} that not all tables are output in parseable form, and that \textbf{UCSC will truncate responses} if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. \subsection{Example 1: the RepeatMasker Track} This simple example identifies repeat-masked regions in and around the transcription start site (TSS) of the human E2F3 gene, in hg19: <>= library (rtracklayer) mySession = browserSession("UCSC") genome(mySession) <- "hg19" e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) tbl.rmsk <- getTable( ucscTableQuery(mySession, track="rmsk", range=e2f3.tss.grange, table="rmsk")) @ There are several important points to understand about this example: \begin{enumerate} \item The \Rcode{ucscTableQuery} used above is a proxy for, and provides communication with, the remote UCSC table browser (see \url{http://genome.ucsc.edu/cgi-bin/hgTables}). \item You must know the name of the track and table (or sub-track) that you want. The way to do this is explained in detail below, in section 5.3. \item If the track contains multiple tables (which is the case for many ENCODE tracks, for instance), then you must also specify that table name. \item When the track contains a single table only, you may omit the \Rcode{table} parameter, or reuse the track name (as we did above). \item If you omit the range parameter, the full track table is returned, covering the entire genome. \item The amount of time required to download a track is roughly a function of the number of features in the track, which is in turn a function of the density of those features, and the length of the genomic range you request. To download the entire RepeatMasker track, for all of h19, would take a very long time, and is a task poorly suited to rtracklayer. By contrast, one full-genome DNaseI track takes less than a minute (see below). \end{enumerate} \subsection{Example 2: DNaseI hypersensitivity regions in the K562 Cell Line} The ENCODE project (\url{http://encodeproject.org/ENCODE}) provides many hundreds of annotation tracks to the UCSC table browser. One of these describes DNaseI hypersensitivity for K562 cells (an immortalized erythroleukemia line) measured at the University of Washington using 'Digital Genome Footprinting' (see \url{http://www.ncbi.nlm.nih.gov/pubmed?term=19305407}). Obtain DNaseI hypersensitive regions near the E2F3 TSS, and for all of hg19: <>= track.name <- "wgEncodeUwDgf" table.name <- "wgEncodeUwDgfK562Hotspots" e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) mySession <- browserSession () tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, range=e2f3.grange, table=table.name)) tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, table=table.name)) @ \subsection{Discovering Which Tracks and Tables are Available from UCSC} As the examples above demonstrate, you must know the exact UCSC-style name for the track and table you wish to download. You may browse these interactively at \url{http://genome.ucsc.edu/cgi-bin/hgTables?org=Human&db=hg19} or programmatically, as we demonstrate here. <>= mySession <- browserSession () genome(mySession) <- "hg19" # 177 tracks in October 2012 track.names <- trackNames(ucscTableQuery(mySession)) # chose a few tracks at random from this set, and discover how # many tables they hold tracks <- track.names [c (99, 81, 150, 96, 90)] sapply(tracks, function(track) { length(tableNames(ucscTableQuery(mySession, track=track))) }) @ \section{Conclusion} These case studies have demonstrated a few of the most important features of \textbf{rtracklayer}. Please see the package documentation for more details. The following is the session info that generated this vignette: <>= sessionInfo() @ \end{document} rtracklayer/inst/doc/rtracklayer.pdf0000644000175100017510000114052712612032142020660 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 140 0 obj << /Length 1535 /Filter /FlateDecode >> stream xÚÍYßSâH~÷¯ÈcRud3¿’ɽ)«ž·®g)»û°u¢R XåüﯻgI@ŘLzfz¾éþº{8·Nàœ+þ:_N„tXäs¦¤Ó¹q8“>×Ú ™òEÌNßùív<æÞ¥Þ¿¿A<.Š îK˜ 0rËð'éy‚¹÷ÐzÀ'Op÷{RxšØyJËÆ¡¯E˜ÏóHƒ˜Ûóx³(á&·ަ‘´žh³NŸ¼óöÄÔ_µê|mÖáfSÂ,…%´pÓÿ ýHg }Sø™H\$”îc›»Chz+pu?‡æM–LÌùfÍ“¥ÓªÖ,`š­Ñúˉ.@'K §@æb÷áãiy0n›OðŒqÁÑ-¬.@kó‡Ý Jܦ¨à;µ‚YjžQbÆu_UUóÀõ½–ŒãŸ j:kÿHn:YË…ʼ·Ö8+ÈQ ‹(æP2‚Q¦t~€ÈSî8*¸4çU:¨¼—±ÜÿOÑ><èr»([Bù˜e 7ü¾˜×In‰k‹) `±ûÄn‘=ìõ2¾ š–léîEâ7ècøj87íñ¨€ïÁ"ë°R¯c¬IX®ÑæºQšY3,{ô²Ñ鸻6µ9åËX}ŒÍ5žlܨ ¸-&€(y¼ ci1>6t¡p<©qïdÔ_áp`ž# m.Q<{ml‰a°JtXÄŠÛ òw›Îê¹Ï„ U<Šû ¿-Ez=m¸…ž.:ü}†Ö™Nª{Œ¿¯Õm‰ÙjÈŠäzo³ ÓYDÈ»§Ó•Œ&„Ú_pÝ2þF͹/¬—ˆómâeÁ­ÉS¢èÓÔØO£í"/FŒŸt°Y1Jd «ØŠ&±ÖŸÓÜÞ±œÿ­ÞQz‘QEF¶ ŒøPãy73Ó;€¦,h_ç„=ÂZxœô+äÖñ®¢™aâA^{CµÒЈ½ óŽŸÈ$©ã—§%¥)]ó|d*+\Œˆr):D±Ø¹\Ø‘ð•|öÙ{:[Ð=…„,­ê2ùÉL«.õŠ_«RÚ·Däk¥Ë…·0…w¸Äšù˜™¢y³âû/¥¿›u^C§¼\®³9Df¼ÜؾÖÅZûLUÂ8$UñíãS~i”Õ”;ÍÉY3µÏÐÎÀWX°±³ˆbYtè5±ýúâr©V$ßÿ…ÃÎù%Áȶ»¢K f}ž”ätÊܳÓF¶öùDÐn‹[­ùSËKŠYuuʼnJ.›åMa°w{«Œ¿ _KÃ×GþåâHw~µIO7cÑ¡T|…@ž,ÕÄA ¢ã]®>eƒ«Ïʱvó×ýŠ\íMè:ærïijå™WDnÁÑÝü]5c0¼JàuÅügàœZÅÆ¾“[hÑw”ñ¯*à6Ùl½¤œ9k^ýÔ45YϹ%aîÐHýÀÌ ½ª½¤¹ …$¯;x•*z]‘%ÃG«¶õ"ö'`'—œë*µ÷iåñIF¹zÖ½gû&óA®,àU]ªóÁÔ)6v#Ut£zظ… Íá"™"gæÍñò˜•ÃË0ô«9)áÿóüeNPìÖÜåo£Îæ–p!7íô4#ÁsrárIRJ¹ÂÂàfzD-ϸÚf…=~ÝÙ>û­“ô[UOê\*é>̯ºÄdÀá³§B7äùx·p27–íóâôG»ÖÁ„dµ5A¨ _„‹Úˆê¼xx¢ý0+¾{ ‘Ó«5×û,Œ}Ÿ•¥öE0ÿÔZpÜ9øby…Ú endstream endobj 154 0 obj << /Length 3101 /Filter /FlateDecode >> stream xÚZY“Û6~÷¯Ð#UeÑÀ3ûäÌ®½Þ­ÊnMÆ•‡d8¥QYÇ„”<žüúíq?x„£4Ý_t²Ø-’ÅûW‰üþx÷êÍ;W-L»4·‹»íÂ8y¹È³"¶.[Üm¿Ff¹2Æfч¥‰NKg¢ 4Úórå’hs]co¦¹ÿÝýëÍ»rQÅUnsÜ/Y¬¬‰Ë¤äa²Ìt@Teȉ¬ªK[¯—ÎFŸЩñÔgì6íô¬Šmâ?"ýzi‹èÓ2Ë£z×,Wii£=ŒwܬOýÐ )/Ä\jK‹eÅoI–@ÿ,Gfá™Æ¦qQ=”˜|¦-¦üYÛ*WRØÕàþ&º_®àl\tA&ž–¶Œšæ4#ž´Œ³*Ón§G»Ê‹îg¢ _b×`ç|$©ÃkTIlm¹€‰Ëßó{"JåßÅËUž'ч‹È-É¢cÍ£ÊùŠ áytîß÷ô¸”_œºŸQQð€kòBÂ?èqW¬R8p–ÝÏ[üM=û8·æ©úDC¸¢–MßÈ™,EV©\ÚefQ5 hò8}¨ Ê‹ù5KÌ¥ éæ@bOt-¿DUÂ,‰8k6ãEDâHìµeÕÅ … yÜ݃ª0iSØÄ·m€Êgž¼¯;ÙwÍQã²·S èäÑZÔnr•¡š#ùþÄ¿?îYw`#;>Ùu-ëÏí3g3ÛÂãþ{ ¼]fpøi'f5ƒr®ŠMáz”#$ ÿ-1)>G î ê±+«±¿™<#Ûi 13ìÁIUÈA@ qͼگóZØ8·ÅË®¸7úôS ŒÉz/ͲAøH8}ów2Œz)l\93“¼jÏ^MÐE©ÌZl6ô;Õ•¡"¨[66v®z xá¦WLAŒWߪeU¾,VÂépìùÃ;™¼ sÞ@vƒš{3㋲¸2ž’f<ô~…(àj4ô® ž°#'„Œ6ËÂT–Þ¥å¬#5EôŸaº–ÍIK©<:’ä99 ZŠIÍl4qëÁ¼ã™íY:OÞõPÃçÝ+Òp´K¥›ËƦ¹$U4ð‡ñõºS‡s(ÂgC›#úöÊD¿ô¯9ó|iáHþ½: Rÿö`A™©)p¸OŠzdÅõ˜+p†óÁóbwÛèüU‹88üB­ÒÄ6¯¾ÿ«FÖÆÂ}Í?êך ‹•"e—f)qE‚QÙVÑÖƒ¿Kü8:~‡–©÷Äv{dCDKC£åðí»Eb 8AÉÝÀ¿ú¯Ž!<¶Qýxê8˜™³Pòò¶äÒùž«[®™ÄÀûñ¹¸Ä¸Êr3‘)L*Ô#µW›S§¤6\|`ZR5ÛkÉ£„áŽÇfëNŽoèż!Ï–èí¹äiƒ\ÛÛ¾ZO™èÖ/Ë—x' ?ÿ|ÑùGãÜãAœHg™ì-nù¬È~Qa|áÙ÷œ47(‡=+±8Ôc_g_õ¬I5œ´ôÐ|¼ £ø½R¶Ÿ˜¶×/Ú€ßÛ\tÖkƒ"6f=µ,%ñ¢ÂmûÚ_'X†£ƒ`kœ?㺉͑D=jSÁù’ˆÃôêSjÅ]êàEý£VÛ‰[¢ùÞ.Pa«TJæ£íOy)<¡€Þ¸Ÿão׬^JüGd—ˆÆìö^`h}nûO3>I;i€¬²ë•4‘©¯x–C¦$FÍZéôN‰ >#?b"…/„+©'og'¡&ž^ö \f‚¬‹w(R€——‘*R ¤Necžv‘T?Âp ûÄæ£7I%àœ>Õ^ê#*Õ°êé½0²!µ˜Zû¹sþçPd˜> stream xÚ½YÛŽÛ6}ÏW›¤•"’ºm$ͦ-š Ø}è&²-{ݬí…å`³}è·—CJ´.–¼Iú@‹¢†Ã9g†Ã‹ýÑrä^?òñ|1yôì"¥^ñh4YŒ˜^%£(Œ=.ÂÑd>ºrnÆÌÙŽ];³l/ë+zßÈŸbì†~èlúIß®eÉõëšäf;¾|û¼ɨi™ï©%p ’¢æ¼Ð wc9P¾«ôl§ÈV4h>×r ¥y­eÞÀ¬ËY‘˧7vÓÈw&Úœ“ß$\—1/ i¦Íõ0B„ÎT6DN®ÁÊOwÔ,í£‘·;H‚4²P­k›Õ#›*ÕÛOÊlÕ¤˜É«zE¦€Œ¦9}xï3Av¹Wj6fd+•{-ž–õ[ÍœtŽ"bÞ~™oÌh~â¬6ú #¥ü³‹ÐŠ0ð"Á¤Õyží3à“Mã;Ùì>¬¦¡é3+MÍçZ6ö-aKÛb#¬RÊ%G³WÑÖED^pÓñ\â`¹#§¯fcžÈh”ÈRgF7º®,)¶ú>×/Û©2¸—âŒh™å÷º.yãš( JtÙÈeQê1Ò>0ð½úÖk¯aMØ1óX" l…WZ¦Çl^Cé„’Ò¿ße³±`ÎG¸#£—û±à¨1ŽL1 Lÿ•žñB²¹f‰f›¦€P Ã&IÒ‘Ë™'Ò@ëøINW®û“º)`ø÷+gH&4‹Ö!·¼3sí/Q7vf±V{ŒÞá‡E™¾4÷³~Mq¯nð\ Û…e7Ìöz׋†ÑJìYuuuƒ/ƒö¡gÎ Õ?¨òÅŒ±µåÝVôQÃsÆÀˆÝ4¯U g¥ô Ñj =l" Ÿ+»þmñÌE +Odùr ”¯ÕUTðë¶ßÀNã­ý¡‡úl;?ÆÓÉfæÊ‘u©õ¨¼·zÀÌn¬½ã› Ùs—ÞÊ2)¥°¤tC ´Ì EÏAÕô£~ðJ(CäüäS€nA&=_—Qf+:9¿  ÏÍ$´…bù!’Å<Ó¤¡mÔ˜¯WÍUeŠˆ½¹KDÎKÝC0c…zûN?:4Ù)àù'¾ÝÕÃÇW 9å¼'dÖä¢ û“®hàߨb<³üT´óÁû3ÍÀ<¶†Ø ŸÉKYÞÊòü‹V£k˜?°;ø²\| ÍŸà!r‹¨1“€Ã“s¨€Í,z&ãÒû?G½irô-JމÔx¿o&œ¡ö¿‚o&PIïY]aøöÐÓËß×a}kùÔCÂ(PÏ­öØîâîÕÉ^è÷›¦j Ÿš½²,OÛÚáã!lß¾Cý Rñï–¿Ÿ[2ÈDŽdƒ¯°6œfÙùª1ü-ð]Y[žÓCbP¬w]ÞX9mv°.wqeK‚“aä—Kì„ùäÈqë¼Z¯zP?–"uµ8XpÊ•«8šÚ÷OéÝ]ëÄ¡ãêˆ1Ý.ì_¼÷=.0úÌŠÙÜßBCaV¬äi+°vY§[v5AvÛØÍuÃYà¥ApxÀÅ“:%Ó²UçR\(1GÝ`-õçú”(wyVÝqëòH×éÏ™IÊAÌM½W—p-÷,¾ôUô{–ÔK¢êˆ:ªÞENïÛŽÿ<Œ¼8¢Ô ý“7W;+9ep]uiQ,÷•“ĬÜ—›ã‡fÕyU_ в²rüª4öàÆ`WN'Õ<µÎšÜþs¡ÙùŸtquIâÅA|8e6šv¨.Ù¬%±´LY=®ˆ¢¸ô«¾ u6LÝ!=CuVq™ÄeÍTbªÂâïf·™â]T Ä^¬'8þÔ‹À†NPš ¹eQ€÷]º1UŽËh”-^ñ1­ÀeaÌS*™“  ØÈ0l ûmì¬:ž5¸‰ÕµGŒ— @+4ÃÑäDôJþpô&^R´ñ~1Í÷ô:]î§a/úp‡#§ùÝ„MA¿X¢F€qô­›)¬˜ŒþgäX…# qj%¡ŸÂ†éi~çV÷°"ï|•ÆK4²8G–<*£-$èê"qèù¢¶·°V‡6ñ–ÕA-,î ¹T°@ ë€ôÓÒ!::c«å¿»µÝj”z‚6d\næ’Ø`³;¼š<ú³TŠ endstream endobj 165 0 obj << /Length 1502 /Filter /FlateDecode >> stream xÚÕY[oÛ6~ï¯0†=ÈhÄò.ilY´Àöйh‡m[q¼ÆÖf9m÷ïwHJ”E[u:Ém^Î9<çãÇ«èd9¡“Ë'ÿ˜=yv‘ÑIA Íõdv=aBLç­2Â…šÌ“ß5e‰€$!˜Ø4LŠ$þ1{ ÆRÆH¡PA‚N¸Sxj Wô êÔYîÔ¿›¦Š‹dZ%¤-¤%¤ ’©{…õ› ¾q*ßB6uÙ%Yò;UÅ:0"_ã(cògÇ}óªöºp½±J#aΰδÍ!½„ø²+”¾ù´°ÎbŽhÕüÀm±Å‘è9§4³ReàýˆvX»Ñ}v‘fôìÆ*:æ÷æ[A„ÊAÜŠý¿øœbTÍ}g× tg4æ;äQ½1P@Emªàݼ%4sðÎZV¡é‚-d?lºîHFD®¼N}pËä¯Êyd1.Ö[׫'yåŠv°ÖÕÂŽhÊUNŠ"ëì²²x¬E2M¥Ô~R!dG’ÒÑ*E²2y×­±´ÐX8Μ€u£rùM¹îÌÕ×@W½^áôÝÖ¯~þÞ‰”›ÅÐØs3~Ƨj=åYr¹Û]_üòZ¹þ´îõ‡År»ô$­Nzg§‚VëŒñêo+cµÊmgÁãRo+Ä*W–]{iÀaJ¨Óx ²––ÄÐ@t#=Î í ±®›zÝ5^A¤"Ýã@U‚rÊ)/ò¤ñ«eåÊ+$5d eÓ`Ȧ¦Ä–½xûÓ—D³Âû>\ÉÁò‚ЬÈâ¾¼³álŒ£;äªà-Ƈz‡€iV] žÍ&ëìB6ˆÆÅDNt!(Ý­fª Å:Z*L"ÛÔÅÊwƳ Ù¡ÜÜ1Nv†:…×çnÁ²……[å•ÅÝ[÷3QáòSo‘6X¹ê:B'‡TÁšz"S¯ÕcOykWÅ¥›¡v»u!A™³—÷`‚âjÑÑ•Ý'˜4oíR$’7Ó\&8÷çnrÚ¼ØÎX£X½7fª^Ÿ†Zn)iÜ¿>ãímmĸÚ|?iÁ–Sðþdy|ÿþôJ¸ö&ŠÔ¤ÈeS g œ™ÊØ^KþŒìâÎÃTfL ä)Ø¡2‹ÔŸn‹át¡DJÖ'FüD“JV°/Øfݰ‹rÞwoÉéÑóõâÂâ}HB,‚‡°"p鯕ûa¨¨{@¢ØÒ÷°•9†„?d~[Å[ÅQ[ŸÛ±¥-Œ‘GVe~"~Ü­ÊÑzÁ•®W`UY48b‹}ßý s¨r³—/ñϬZÑÓ‘¡ã°?èµdŒÎ2³…»›ŠØYçìFÇëP| lJŸÆm/>G‘¹Uû’»FÕxdh³ìúÁí—\Fì—Ù‰„Î#㔟h£ˆØßc‘<~ÿÁám‡·'bùëC˜üËc*4QRDêoðNXvÞ_-+œ‡·Á s]Ý¢³›ed–| ø_2Ú¾ÉùwWAí³—ù¯ÊÆd ÌVi~°£6Y?>>”°ê‘y½ò U®Ñ "´ìÐÝíû©ÒæyÏ6ƒçí×щà„Â2"É3á<—=‰ç³'ÿ)èd× endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 805 /Length 1976 /Filter /FlateDecode >> stream xÚµY]o·}ß_1í Åï"(àØqÜÄ0lß›ö~XË[[ˆ¼k¬Ö‰óï{fE¹RlIÛTlPÜ%ÏÌ’C®"IŽŒ$OÖQ¢àHIR*‘2¤œ%…¿ˆ‡´FI;MZ‘NºÐš þñÜxž ZêDV÷ÖE2†l2d,9ƒ‡F0‘\Â€Š¼ñ…Õäãá}Bá)(LÅ‘“”³ÏU;é-0zFÿBG'å¬zG·ßî«vVÕ0dòeÒ}£¶ºA—~qá‘þãÃVÓ)½ŸÔÕ–Qr MfãæKÕ²¹o'ãÛŴ㘽(¯¦°l+:øRN¦\ÝèŒîŸö„ñôáÅÕê'(’Îht<é.¹õ«WÅèÒè´¼©Š:wU•SYÉ-‹ÑY5Ã*€ÉÜoãý£Õõ¤|Ý<Ò'nã‘네/ @´èKœ÷ôíêºÔ§>âa9š—6—.—>—!—1—i^j™K•ËŒ§3žÎx:ã錧3žÎx:㙌g2žÉx&㙌g2žÉx&ã™9Þe±âÂÞÞb„½°ë눇ÏÅèuÓ^Wmï*y9úmôntøIõv*F‹úìK˜¤• ¨“^¨„f´9•Ù-‹`þ‘\bw‡C‘ ôFz‡4lñ`½®Oˆ•ðÐÁì.¼Lãy†µ.AbldÎIpÊm4ª’©Ia¥^Kå¥Tm§|L>N†¬ÂÚ0Þ=ððÈÐ:0Œ6©|Ìîù(#øhc,6Õ€ã¶Â?ÝC,Ã1ÁòÁMŠˆ#ªÅwQmåÝkeb!òSŠÄçv‰X6ÃbgsË„ "–a¼àÔÄ(|PùìÁ?Þ‰ˆ£ªŽ@çC7xAÂ|vËÆ³¤f Ïyo1çÒ±»§c•HÞ÷a£è8ÞªÜ@>n÷|ŒRñµ¦|ä)Ç~høøÝïžFF!û›3ÖÉ‘QQÄ´y÷4»_qtBê`bïLyÐò"…­»§Ùé _pA¡"ÒçEÔÌÍ ©õv.»ŸÝÈc0«9©€øXˆu4Bú!«ŸÙËê§=O#Žìä|gˆœ Éò@>z÷á«MD–å@ ©h„VH}”³Ãw¦Ö^˜Äa_jd<Ú¤m!c÷¾Ê"»Â ƒH.ñ}º@Ülç²yâÖñ…½B¦±ìIƒÝo”ÇíÞ% ɃCbe †ç+xäèvk:ãö¡ŽòÈòqÁðsHÂ:·ËŽ, 6²Žó`¾£b³‡8AîyÞHŽÝþ[‡pvó.´².ßüþÇÿ©ö‘*œ€ê‡éôr}[Ó·õ0_¥8¬±ÃƒÓÿJÛã¦îzºÇü Àš|ua*6W4Ðq¹ÂelÈþ$/¸2?û{tÚ6ãó þ¢ÑéÑ1.ªÇîûÃü÷÷!Î>»qúGïCœÚåývX¤u㜞w5ÕOO‡U¹õœ{X&g†ë¿Úv‹þ/56hÌ‘:¨±¶ZH;YÁ; 'Œu¡µM+1³LK„ Àòÿ.šÒóh ÿ(š–­ŽÃ„úÛè5sctÌ_ô¼zɈ'åõ¿2Ú»gF{ó£F{»Ýè¿97ù endstream endobj 170 0 obj << /Length 2386 /Filter /FlateDecode >> stream xÚµYÛÆùÝ¿B@^(`5Ἄ"@mÄF‹>9Û¢\Š+)‘D•Ôz½ÿ¾ß5áDmœ‡>Hä\ß|÷Åt±Y¤‹oRy¾»óý‡rQ©*7ùâþq¡­UE^.ò¬PÆf‹ûõâsr^ê¤[®Œ-’šÿ|ÿ̽çÁ¦…÷cwhq˜'0zÚÁß~kµ\9­“û- prà3tdÀ=üµøv+Y–{4ö¼½Þ?/M «¦H^îÊÀeË_ïÿ,Yi­ªLè~‚“'<ÞÕ¹]ãÖ<°C^·-¿78ÔôH\ƒæ0çˆóB¿¨"~›º_{Êá éùùÐÓ%€ç3®¶=CΞÂktò7¹§FHƒ …dxÍzà†—92¿,³œÏï§•µ&y&î ™@Ïž…çÖZºëˆ\=3ž:‚7ð–G„ºß D<àå¶; ÀQŽx€eÒ=!ëÖ‚ r×.¶zåc– uکʹ)‰–¥Cᬬq$¨z  ™0†Ëݱå•ì8vg™`R &OÕ³CT7 ¢Æ1Æ0 ¶ƒƒ bç.€‰DájŽDFTºJNuïÑBMD5Þ×=¯±@eã‘… Â{Æ;I{祺ibÕti°^x}¢»4ˆ°ó–V# ûÖÛsQ¨ÿ¡H#ocL¦2]€B aÛ'Ëà7ÂfDâÙ êü‡eý(k‡ñšØ§U¹²Y¸•‘«Y13­Ñª,<7óÑå!Ir*7ÞKlG¢iíÀ‹±‚áP¼¿*rB=YÓžH(°…AŸy÷/©vBÃZàÕÇq9ɳ“»f³˜F*Q–žFbPàNwƒ/™V¹ g;Pg íw²ßMÁ+é]|áÀŒOÒ+¯Õð<uÇVJ.ÇýN°ú‚7µ‘õË;a°%3@´»mVˆÞÉêQDJ¢#âÀÇr™c´ lTÿàg–€²+“¿6(xdÀ%àÓ3/,YÎÐê£WA¹»#±]±½k©l©ùæ{oú{‚>â3Lz¯¢)ðMé×> AǤ]ô‚&ÅàÑÀXxÿ4a¢ã;j¹ žS­¬TÚMm4Ž£y^ñÀUVÁä:°žÌ%¿I\D!¬2S»ØS­R[L ÙÖí×L¼›ºQG^Ü+ 9ÐnðFç\.qÒ{A™lE“ñt½{ ëãIQ4zoƒÈ¶8­õq’Ó¹€b^'ŠäÀg£ßI$Às5Ei‡C!ôé€ëâkú8î™dí´'Ê5ð¶§^7ÜŽ|£ú•É©Õ:k^x)m™N^h–&¼¾â™‡'™ À‰;ú²(Úµ‡×…S¦2^‚3ÀçkÕ1¹Òi8p73W¹³~ƒ÷ÿëkH:Sy®¿Ò êüßÜ|D™Wq]6˜Eá0e@¥J}I~¹Ä­VnøCJŒÄ¥ U3']„Ëm ½7vÈØÉI <TÞ§ª³ºáB°¶Á+x•1[˜ãVN:Êc½Ûì_0Õ/AM!í²r•ñù¼Ï©¦ó¹äL^JxRÔcŸ¥aÀ›¬‘àR’¸XgÛ¦q9v 0œ4¸"dʱà<V9Ç~†&Nœ¹»(ëŽI?Cj‹2()a”|9²ÈË\{. ¾Œ,:‘ X\EÐG›Y¾õpÃà•¶¢ä5Ñ©!#ÉR‰Š·í!l‹ÍÙGœ»ô¼¡¼’Žhÿ¸6 ÙZ0þ ~øe+É9" :ŠÎôºrÂ͘‡ãRÎç¥Ï¿ÂŠåG/?z‹_èT9§§²úÇì Ì“·”¸U‰–§ ã—ÿ/!p/×2c “·ühtOI‹NRH\RWLæõõVM?®^!à‹<÷Sb6ZÂz;öÊÿ\y6Ÿ–ÏnOyZIR¦®wý{nêOÝóó¼ÄjöÇF0 XÿÅÿ, úU¤íDú9üJY+‚˜ {#r‹—üÖêö6#Û*™3óÛ¬üJAÂ}ó6ÂßßÉ|FÂç3î•Ô]ÔõG, ¨Ún(nÉ4C ë"æ¥Ëlêæ´šX|†¸Sqñx¾.@†àJëiÖ†@‰£™´Éš[ K÷<Á‡½rn+)UfÑ}OÉ%×ò¡I…¹ÏÕ=h¤o@À† ·¢Lû*Rv©Om#ñMòš'é|ámb&§!©µ^¼9Ä ¥™ôÉZ¥«P¤Þ²¹a¦n±yåþ dϵ’®_fãûŒêAå–)9áíâÑJñø“0îtò|¾¨!}%•ÅÄ@£³PIAUqv±igÌ•lŸT“Øî³EŽ)xvgéçàhëÝù‰º{žõux©C3â5¯`!%?÷Ĥ–ÒÂ#—W3üÕeN,ú³…!¼ú3ÓDZ‰ZÁ¶2 ƒ3ª¶¹ÐBîyLǸ#a*Uè|f/º¸AHvä ö»ø÷ãl9iÃú6¡ât6Vp*î;㸩r^šË4;DêÂËÞKtO›-Ïîø4ö+¦<õé^Bâ3“E/q/¶þ ˆ)ÜH5'½_;-œ%O‡/Mçs*+1‹Ï  ´õËœ“êpÏŽ*^Í\¯PcçíóLkNU:hÃÁ«ÞVÒz¾Uú®`¥:œBEðBˆ¬GÒ$¹ÆÞ¿‚á‚;1ûÇìœÔΕ£>‘;wnt­ðŽºžAcvlÜë ½ï»9CÉ UV£Î_×{*uÕX§ô‚Q£¯_}Í}ÏeB¶ 0gpÐèÏ‚;üí‰BUFO s¼]Ü˦Ý\`tåT NÍÖ€Ÿ` dŒUjë±:y×1¤kLË "xþ · •¦z®î¾ðNª*_§w,ýµØaÌMió×¾¯Nå/L)ÞìñV)W݆:îõž„Þ)•r³æDàì?ëÀš×CúZÓ»ï$7Få©2øÙL‹ó‘²™–¾Žjõµ|C!iz‡ê?b¬¿½Rü¶ǯcô¥a”ïàðQìC MÓQÚÿj$¿tl?Ü‚:©$þBÅá«ÐçrsŸn¿ Ð0õ¾Åm&œ¤‘"n¾ÛóÇÔßJmsHž¡Ñ©²,§lràÇû7ÿ¡–öu endstream endobj 178 0 obj << /Length 2291 /Filter /FlateDecode >> stream xÚ½Yݓ۶÷_¡i^¤é‰&¾øÑI2S×>3tÆQš'”DéTKäU”rvÿúì@PâíN’Š °v»¿Ý…ÒÉv’N^?Kåýbñìùm®&eRf:›,6eL’gÅ$sy¢›,Ö“wÓogs§Íô~¦¦-<< x*xŽðlá©á9Ñ‘~ Í97OP.¤ÇVð¼‡ç¬~ŠÆxÖðüœºT†>w9˜¢˜‰oàënþš…ß¿Ì~Y|š˜+•”n(íW0þ7û}‚DwÔõ¤€¢Š–d æJ&"¥zbë!Ý­l¤ù¯(ÇÒ×ýÎJ¿”*Àó[› èD»¤È ÖÉ+ û€W;äªîpN0áç·El¾:Q…¥B—¥ªd0aònnËrúÃ[Ò‚p¬ÆèøX1½ ®f:Ɉfƒ.pd‚jû¾¿®p .{dõUÛD«×Ünp|Kä»_gº˜JölÖÜÓnx•RÝáP{h;zÉŒ¨pîõ+RôŸÀcg`x¶˜¾ú÷°TJ†Š;œv óÜ8!÷£6ªÿÑÿíIÔeØ:f¬­*S(æè ®¦3Ô(9—ɳ~Ch£š„?8‚žÊ¡^Xêxõ2OòTÁ&´øk ~;s¨Ìm°è+ެC sdóë¥Ážò¢ðd²lp§§ë—(û©ºÞÁeIf¢ pUƒ.Qw,ìNlšHp¾ÁQ='`Ý“6Üìád®Už¤åTÈf÷{oPãÃN|NÍ:ãMŽ– ²ûÛlžÁa¾8† G¤Öìžq¹^ó*`'°q¿'P€ÉyPpäNéABMox”}7ìp…¶aUàB`Gó'96 ¿Ø.a4øš2duÃ(ôY꽆D`Ÿ=ŠÛû‘ êæq¥[yÿ  íŸýívï—³~îOð¼yÝ ž0=Ðýµ…ÃІ`×G%¯wb3A? Ɉä|˜¬c€8øsÀ%” n|¤#þUVöçɤý´V4ŠA÷!Òû™sÓjÁ·Çc‹¢m’ ÷Û b÷1Šøõ°l¢lRZ;lAÇ‚Z²D_1ÛðSc§ gŽíʲ"~ûýßy9Å/Ä{?ãèå šÂ0ŽZÀ®Š5Ö^n'.ˆ+WüŠUÏ4g²ŒZ`•À½ås¦ß5Ï["Ù}’g,ùP÷š]^ÖÙ‹öÐÑS…A¤BhiÏ{±Mý(˜j7ÝÉ»ê˜ò ½z)V ý‹;Mº‡)h®½-Ê–ÞHïzF6Až™F¨¨ó4ɵõ¸Ø3§ú8t¥Æ&.×~jœt¼xÆ ëÒ¤.Ñe64£‡;¡¤ Ž|² Y¸—¬Šzùõsª,ÆùÚgHx I Št€ð‘Bd ¾1Ba>æçE9;ý Ò´JöÜõ‰~l–ŽÃÅôÍF&IÔ‰F AÌ‚¼ Ø5¶ØÉ¨ÛxN§'É~¢#ƒÛ1Ð0cÿ“DÃ>SññßÂZÑNäH!jØ¡H‚Fa£‚!§“-ŽÑ›„-Ú¬¼öPÞ‹°‡~!º¸Öܦ†ýpS)gcÕ¢ØZ‘Û“yÁv=ˆu]tŽ6µ”š…"OjÈ^ö>栱ԙ˦?v=ÕéQ¿p*Ñ©‹MÜûÃAí1¿p‰±Á™îÉ"ªƒ?ŠÝÂi+yB‘%Î^$ µ÷@:ñÕ¬·Ç½Ä.àY/o> þ"›ä4¿Èï)=Ï5Ï8ü_ÈM_s<^›q¼ ‰×#ž¯Ô`9ª*B@* 6ÛjÍ!•lÜóß%mê $ðašB²§9…mYª#'é"”C„ $«Ö[·°rîúùOX\–¤ÎÅêá³X—ù'8y‰=pQ*h( [ÕɨîwÈäÐó½&qÊ!J0qp)VI[_Uqš Mm¹Ÿ-øŒ\Æ&çWðe$fàçÐ9X‹#‰€pµ#f ­ôÄÉ#F óTù¤œÞXO©,Jc3/<@‰5ùôŸ»÷¾lTOÇYåÐfó/³6Ï?gAþtP63›8wvÛÄFŠ4‰ œø”°cj¯“YæËúyco~<â#Õâ>£KS¤,׸sy3îHÐ~?tJ/€éQGO›¨_.àÕÆ¹JT¼ÊkŒÉ"Þƒl¸kE¥a×Ù¹Mò²ü²úÝ”‰ê3ÂÑ»§I¦ò?åVé_è*'9õó\,IRO÷JüêÏ ÊfXc!²§€RÊØ-PCIœç`'Ô9‡{f/LFÊò¶®Ö×¾7¬š¨P|íÐzqÞ>½·ÝÛ_KÅ—CCÉÕdÕ ’ž)Ï÷ ’ Ÿ¼®Ä|L9aÒû´ÌG)¼“PJÛé¿ñlê‡Ý¹ë5&mòr2c*Ë¡ì w8Ž8…žmÝ R˜ÁºJsàÑß¾|ê.ívVX MC=Á'!í_ð™¾àÆË> stream xÚ­YK“Û6¾ûW¨²{ ª,† À¶¶¶Êã÷Q)b%'ŽDI³‰.‘šñì¯O¿"gârå ‘@£Ñøúk0[ìÙâ_¯2yÞ¬_}ÿ®P ›Ú2/ëÝBiVe½(‹*Íu±Xo“|©’”þà§–+¥L|€÷¡9ð¸;Áß~¹Òuž4øÐI5mÿwü–¿­ÿûý»:˜)[¬TêZñëö€Î¥I~Í”Ò~ý€U<NÕ~æ2¾w˼Jñ¯AÑmÏMw4Ô’<޳ƒ¿fÃõ¬(Lòx'C¸[ÃÕ·21ÞS·§&a§šaD'·Á¨„Œ@£‰QP“×h2„Jm!Æ>ó*aZ’n¯W³…±Œ•UÒëOð(²¤é¹Ø°­‹ÐضL‹¬†©hŠZT‘'«'Kþ@Êï¹m«ŒT¸‘ºÛåª0Éÿ°çf Y«“73:˜"5ºüóu¸#iZúgËÇÆ½ÝÃï)0Ìb•׬mb«o`Còš7“Lë6>/“n‡OÞ3¹îÇ'™šÓ–_ö-nkwÄ6\õ€zà`=ÚÆ¨ÑÓ¡u×Ý‹Žì-4õžÛ6àdP·uÒ )^Ñ3¸Ùgl[›êü7|%éÈ"_³:K å·Y‡6ÓZNÅÊ…£óT—^·ŸAê-‚ÉÛ™ñ‹4S^’ަz<¸„¿q§*e«Ôf9á‹Õwþ8j.¸®ŒLOG ›ÿ¯+~@ñ|¡ážEx<¾ƒ-MÄßJ4«çÀÐ+û¾d×UîMÙ qYšqÎæ(rUO\ ÁΡA U¾ Ę¢ŸClöÀо`œMwg9Ò Åð¯e©[òZ­=±ØÍó€Ç«Ð’¾´ƒm‚åx¦OóœOóêò¬N~UÚüL†} &Í Dl_/!òt쀤xËõƒ3Ô;sñá… 2õ¸¸ÏÎ"nj™y èÐÿ5·µ9žõH\]•æ„®¸£ŸÄyŽR¾yÁñúÑÁFGª²ç=é#El•üÆsÎ{åôˆÂ(y§tŽäB~l–±U%ad­sÃn ˜ ùé9À .s×â)Ч¹š /Tfɦ9që-í™ôx}ÚÇ¥¸á–ºw“Ã@u{²G–ÇÝÌ™= ,yÄ.Ž„@…sm*ÜwÍÖy#ÖÑjÆÅHø'°8Í…~šË‡€)ŠFmtª*ÞByE'³)¨Ú´Ž0ûrrÑ[TCfBó¥ߢæGjéýLÑùð‡þÞô,4×:Ít-ÇAEçan âëý xûzôìAzŸÉ¹Ë ]<ö^ãüsÖufÝ7XÇ: xQ4V!û:5ÇQ.«!šæNŒÌþrd %„Y]%=ÎÒ]†±Æ»%|Ô 1ô84|h<æ6ÅÔй#ùZ#“àþÝ15¡2­ìž#–ï¶Z¼»§`ë«"K)n>9ͦÐBÇM¦_Ôi­3Ïó.1ux ¿F»Ž+ê¬C¬þ†Ø°,Íþl“嘖mH\ ­ÉTi…§M™o8¦F¥Yi½70Èua´ÅI·?y=+{‚…1««Ê†ŠLßs|k7á¦eù=)Ř‹5 ÇÇFÈ}YX:pþL±“ÌZ)ï"Î0ðAÍmEÁ›*Éù8~ËÂä±ÿÅå>[™ôƒóŒÍ8I4§ñ±öèÓ¼n™Ñ\ˆk`=´¼äSúÏí#™mÃPA-Ë¢H´Ô…©8cfQñ¥Ð3q«Ð>_×ÈÜ‚¦…À.ey+m5Ãß`Ö©Iè4ÙrJ({Qùä.¤mÐ¥ë•ÏPƒëmO_¸gR“;Ï‹ Ûú«ÉÁ·çÉêúÖé/ñ…×ÀÅlÓÙ#°¯nezQ7±JŒëÆÈ¹ÇÌ-h52±™cåAÌêàÞÜA’˜.Z3 ‰˜¢oµ@ÖL>|DþZšÔTcbS­gya®ÓZ½˜QÔ­ÓL¶¦Î3]×ôK ûF]§×Ÿ¼sšäÒ;÷‹nHrc)-üìL‚—mÀœ3ºÑ–XÔM [¯tðY̳õxTW¼fë«¢¬˜í¹€‚g—ƒÓµØ06¸‡`àqï+ÙûJ¿€Æü=Pà§÷oäjtü~ÒòÇFÇÿå#%ÝØøuABÒŽÕÍyߎ‚#Qeé=G ˜éàr•1U¥¥ìd•Û´®kÖµŠd~X¿ú%’ƒ¨ endstream endobj 195 0 obj << /Length 2028 /Filter /FlateDecode >> stream xÚÅXYÛ6~ϯ0ú$‘"RwzMÒéC ¤î$A¡µåµ%;›í¯ï\¤(KÛ8i›>È–ÈápføÍÅpv= gOï…òÿhqïÁw™šA‘êt¶XÏTYšÏÒ$ t”Ì«ÙKï빟èÈ{;WÞž žú^}~½‚מ†f•× %Žý–SÛ (Ÿ±ðjþzñýƒïr×pqPÄñÌW0¤ÅnÏÖs?Š´·ŸëŒ´ØEK”`G¼ béëk¶”m?‹Ämƒ<Ì ¬prÅ õìDP»Aų´ŠL?b®½]y‹/‘ÉÆp~È*ÀáO)ù?‚ãx1 ”÷R`ðžž×Ÿ $‰kÁpæë$ȳœm÷-P¾#;,Q½®êpuÏ3„é@åÉÐø*,˜½ôã¢ðÓù–ÇB%ÿ¡íªA…sZ8w³6üͯ–*Vî¼âÒëmS3·²¼„ŽÄ:Œ‚DYØ!DF¤Ã Ï•!dWïðpÅáÈ#|Àj³¤ÒXs"Ùé]ÿzf_ë8Ði:´œ¾ÄrJ“å”ïX ¾k©<÷^©(&ˆ>Œ š=|’˽AàÓ„Jœ¹ëÜ#a‡-aÖgÄ}q'ÔÂwoM³ª$8¨”v"nU »fúÏ” â,Ó¨ HR6 ²?8ⱄkxÁ¬}iªÜ™X–ôO ª8÷¾ÝsFÓFºE¹–|‚#P€Ã¨@¤˜ç‚l,áK1)×ñk‰–èù࿎6áÐ`Gflaâ­»‚ÿÔ“h ?¯èÈxh•.˜ûqŠ(“¨/‚Ôâø®È÷Tþk™Û÷Ü\ýÓ$HÀ ÂŒbµ‰óè(7j×"?Æ.y#G–@Ì8;^Dt³ \ Ÿ(‰¼uÓâ‹¶T²Gµ”ý^…*®(ù«vºéÌÉ ì’œpÙ”«Ž ›Z\ xòõ­øãÜ'8ÂãÆäÐ ñFv”$(C%Êš$D„¢»xýÒõoÞüuÍ‹¡Ãp³v¦svoÉØi¤¢Ó£¨Ÿ$Éõ¾r°¤aá=“VpxÇÃlȃـ¸{M鄦—âÉ(˜4!èðþ<=ŒT$æ„ÂñÇ.«U Ua€õ=þÆŒ’ …¤/”CsÓiÇJ™ÓIŒOUý{‹‡šS ƒ‘²²½‘Ô¤xGœ¡†ÝѰ7h§†Öì§Ö Yd)9,Ù¶æÁyE’y£4±tªð 'Kžsm[Ø|HÕ"µˆ®í·ùwkäéòÖX@bÈ38–ÍÛáJÛ°wÔ<@AÅ;Ž D..Ùàðq‡qÚê4Ê•1ŸêѪÈÈwA:H'}ˆÁoY Š|ë¸#N4¢ØRz¹7†Õ8ÔBãT@Ø Šœý¼´Åy÷ŸãëãàpiÉ:Èê‰dõ'$ _7µxÊU®!Mîha8I |ÓñغµZPep‹“¨Ð2Í/¸®ºâG-ïd Ò¾·h@°F¡6µ¾¸€´éïÊ4c¡¶y&Œ¼?PªÏoû9¥B÷„(V"òIC.¥~³\d·šÑ$rQÊAŠM/Ï®)¥ß³‹Ç‰&0®Nd#IžYT{L²óØILñ;ä±IŹËóEÀ綘ÌíÄ·)xçÃVùæ¹  ¶²ˆšv¯^¶~ù•m‡‡5b„¥ãs¸Ãi|×ÍÎbymM|½ÜA-ÐMK.ÿ¿‰—{X7ê‹§¨žË÷Þi€/è‰/ŠÛ? 1–´)ð—ƒ>V¶©-.p¼¬"D'þ3Òûà0é$tÆñÿD£¤£q°VE©Ó%]Ûþ[™(·Hvmyä* W‘¹º«î;˜ò˜º^j;Žò„6§íÝöw1Ôƒ–}2 .È?ÈÌïÉå—$¥u¦Ó¤ç$ã4i‹¯ZügÓPãÿŽCK¬’ÔØ§KÉ0ƒ‹ •qa+LLo/æ ݈YõÆ)¼T9·qžŸ•!°î¼æW·À€ÏUÉF¡‹%Ò C^,laxËÓ'ƒ¯(ÿ«$†ø¼ÕBeŤÖP€÷%ˆèk°Õ*p˱êP¿fJ›¥ÔMÁUÐ ÈIT¦_„H@4~$¸’‰ú„"iØGJ ÷50,íL»¤ã› Ù¥O;>Û+Ë…7®—¼ØâêKü·{Àûò$›´‰`ÆQ‡/[i”bKÝì%ƒÄâ5g aÙ™ „Œülkûį£Í\ú©ÎØvÖ k¼(H3޹¶û8 L6cis–Ÿ%9ë « 1ƒ«¨FJ¥²–bóî™ærïRµ¨tâÐéŸú;`fÕ ³wÓUL\. ®ð´*¡ŠX¨ù> %³™ýd†6Ln |﬑éòà ¼ä‘$#²Ø[sxojŽªÒn+cÒØÅ”Áýe¬SƒnÝëºÐ¬'/aÝý»,”²ÐR˜´Òå-îÌŸ>óÜÿPûdu×5yZQšÌÀ÷‚¢(Øù`Á·‹{’Mƒ endstream endobj 202 0 obj << /Length 1709 /Filter /FlateDecode >> stream xÚµXYÛF ~ϯ0ú$ñDsh$E€f‘E»ºN_6A!ÛòøØXvÜý÷%‡œÑaywsôÁÖh4âÉŃŠ¼}óõÕøÙ‹7‰ä"·ÊÆóÔZ¤6Ø$J'ƒñlp½ÊèßþöÓüWe5ü4þ=Hyñ&kJPBfÉ`$aJ±)Z/ nG&Ï£· «< GZ«èãeIã›ë÷48Âäv†«öç«>ÆÒìQø9!Ú=.pnQâð9-DNí;ø[C•F÷C•EhÐŒ^ÄÇ[TñÅ›4nØ¢T"Œ’ ´3ã+KÂ7O´¼i¹ŠE–)¿¸còH+t¬ÛÀ¨oæÃÕ Ü]‘΋rëTq7sî,úp77Wt3 œí9Õeî‘C'.jcÐô¸m³n”Ž¾ÖŽ‚{URÇ©ˆ»;€ÑF.ß*š*è²m¼V‹eŒð»¼ö®X°ì zíȆÚë|çrFêB¾¹km‚±Èg“>KhU>8\ò¤¹1¼Úr*3íLÅ¡‡¼²Ø¸n ïûi±æœºÇ¥&ú‚nvÏÞ«%‰r;/PHÉaêVÍjZFÈkfžÑó ͸qAbFY6G]ûˆDÇJX›ø„Û»Ý|xîif(Fš°q'U6%Çòr‡9KåCqÌ èa‹$©ùydÁ͉[Za¥j×–—ÃQ¢¨”lè†Ç[Š7|ü+ G4<‡EB•Mb¸´É×MË~^o(€Åj…[®Ö¾0SÌd†j3„Z£†mêp`.| ,¶ŒsUúZß®‹[ŸHŠNæ¼±¢ïM¨ðo²öhÝèïsESÄ¡§è‘Ržúá°-„ùZ$ýÓ`ËÂq¿Œ>Ït¼Ó·êšï½_«Ç=Ö凗?OzWãï³û±¨ânx/éø”oÖ+'Üyï9VFœ¯Ì—lÅ2ÔSGÙ)·Ä(®¨àäÇF=S}á²¶BÓ–Ì÷ó#Û·&4¤1QÑFáþgv9§¤ý³"°/¤ªØÞâ×ÀœÀ§•'ªnŸ“cªDžn<²3*¾Ž{œô§”¡ëwZj¡E2^è9oÊ Dfr¡ó¼76g»vîûtÿ1’óá¨sKžB3{¦QçxBýèÚ—Éç=nÈ% ¦bC¬¬±j4‘F*ßÝ➎á:uì[ÕBÚå úfN8¾ÑBìRK•ªhC—HL£~§g"MM]©FV›@›Úý%kâo|ÜS³ ±ªvÄÓ)½‹)ŠØZCÝS8…Øäri‘ÈÌëw{n@•6`gª#Šú¾ÇU+0+12zçJ7Ó„N5ö`©³Ó&¾[vê…ãÌ7í§ç$¼]¬‚ÑqôQjÓ9ÊV¿Ð£@™®ÓýÌ;ì°\ «L0”å ñ Š3Šõ@Ì+~Ø`Nèû2T e’Þ>cÓ“X·nC>W±ê¾³8ð|þ©Ånö'ÊíRÎΙ½kH.×ÅÿƒRº:=!×C¯ÞÀÝ}•Y…/ u(¥zÚ~˜nèsªhµ®8(è=Wø*»-= Š7¡2áâ½?î½ØP„hmýbU¬×íC&ʸ˜¬*KDœ†ýÄŸFÉV÷ÜA¹êëçãXÄJ>©Ÿßm{«f‹7m*dW»³¶þƇZejIÊD.ëô}‹è/•ÚŠ8Ëì8k@º1÷mp†x®!îÙcÇ}¤Ã\7΋Ð\Ì”ªU€“N—í¾P¥?úuÒ>ôuò¯¾ÈîùÎè"fê‹þ¾qÆvá£ÌYŸº®OO>kÔ ÆOùˆø¾ºYõŸ˜šß<üÎ;Î<¥Ü­;²ÝÖùÏOWxÖ»~Uãùcß*Ãg¥Î'Iži´Æ›­{Í~çzú²÷ãé•?X6´éVTÙýp+ÈtH3«…¶š¶Î[K^ŸýW‚gk endstream endobj 214 0 obj << /Length 1556 /Filter /FlateDecode >> stream xÚ­ÉŽÛ6ôž¯ð‘b…¤(’ºhÓIÒ"=4=hlÍŒ5ì$ó÷}ei¬´Iу%.oße½¸^èÅóGZÞ?­=yVT ãòÂy»X]-LQäÁÇ…/Cn‹r±Ú,þPE¶4Æ–êifÔÛ×𸀟ɖE(UóÖw<šýížïjXï7¼~kÜß½¢'¾CboûìÏÕ¯OžÅE•WÞzC/–ÖäQGà—=À­wð8nд֨ÏÈì¿ÞÓ²aj¥‘ !7ˆ1”õÐÕ묰êãŽÄ*ŒºÇmÓ‹RúÜëï~Ù >f¥Wõuƒ¬­BIz^ÖüBaº4IØ^fËÒ©¿ÔçÀgt©qK6D„>EÅKD¾ÿõL@[¹$ãóçÙ‚‰5<ÚÍîʼ,Ì<›Weù5í@8tt¥'ÆÆýŠ[ãÁ5mØEeè•ioy_ó Ããx‰` Q"*í¿E7Z¿{ý6ÓK€ REuÃdÛž^nõˆ-óÔÊkÔãh¬ß‹5|Ucø¹Š0Ú#ÆÖEêz>FE‘k)b‘_h‹ pñž×kD¾i;±Jž-]åÔEÍ‚2Ì;¸eˆêM-äk¡]S¾€›ÀÜHlKÆß#À†‚!cÂþù„² ™ÓnËéfh±&LVŨk àƒJ.DI<äg?fŸ¸mÉäp=ñ¸÷cÀ%ýr'¾~üpMž*ƒgaýûúÂ0Ä5RØËU½^“-IþAdfÚÎi‹F)¹$)”¯«ù#’»M:P¦E¡ÌæŠÉÚ}rŸ+Õ*é'÷í¯K­5óëÉïÝØ°pÊŽîø3 Ò$Ã.ÑuÍZÂ"†Ð„݉åÍÔ·žµ}XMPbƒÒ]97µÌïYtI dÙÖÄÊž\ëD-bmBГ+É/ÈÂ=RÌ¹Š„qåYüáÌ ÿ ÆYffºL¢Ëû>j^Jžt¶ù(UÙë©FìÄ8D«!Þ­ã-‚v©RóÍØhPMØÂG3H‚5Úp/àüœI í}‹š|ƨ¨ Åp·0 £DOòW ”àÙœ;Æ4‚‘½Ž)P¹^è1t•ÇÂO©RºFœ"T~˜¾Ðqԯש¹QÀ>]“JÉV ø)Uáž5w/ØN]„$È¢·T–a×v3Æ1!æÎøo·Î²°æh;õ 5:ð¯on!0œ®TËŠÖnh"¼3šdk|K÷65.!3Òá?hãĨ½ MÆÉl\~=_¡þDm§ùJáþ ù I†PA1‘㮕ö‰â¦CnÖòçì¶AçUðSJ"¥î°]§&^¨7ƒ1ð†¦jig²20Ý—IFüy¿—ô;F—›ª éø¼Ã(ÌS ÐùŽiJÖçZæMúAHšØyž|·¹‰ [CŸ[•‰§/$ä‰!©ëñÚË¿µ ž£0AÖ¥ìý œ!|£ªŽ{—øág…f|ä.¼ºÕWøY§=#,ÅãèÒM' ;ÂòÂŰϨ0#iȲÁÆ nR 6å³j ú”r•¬Q ÕxN5F8í™ÓYܧ!o#oÒì³ä±?MÍ4öã§ô—ñl7ÔkšÒ¤{šL3°8ÍvœnéóV†ÖVÆa¾#ú½£ëôÕVtåáa4ÉþS>fÿoRÿé<𜇙) ë ‡B|gôåbõèo\B%’ endstream endobj 218 0 obj << /Length 1458 /Filter /FlateDecode >> stream xÚWYoã6~ϯŠ>Ð@Ĉ¤N (Ðì…‹lÛx±»}Pl&bI^KÎ6ýõƒÔa9]´É™áßÌÐQpDÁ»³È}+ø*PÆÈ,ÍSh©U¬ª³¯g25iLj¤£ØhZøoؼ¸ªTðº9ûþ¼ÚÐë GŠ/—goM(%‹$ÑÁòn¸>e¬U°\Ÿ…‘ %ô"TJÇâr‹fa”øD Ÿ‡ú~š,ÝÆ"‘ˆ›kØþŽÿ\þzñ6 Y¤:Å"°%—&wº?-òX€X\Ä¢&Í:Í´.`£bº£3"ŸðNøXb3¢m*ËTsÇßȼq{7×l‰¢X=çùøêV¯˜çȽ3-ú+a¡Sñ-Üâõ ;Ñž’sLv®ÂûV°?®Øäq—¸uo;ŒV!ZäÂmËÈ¿Ê þï¶Ãny»Á2ì‰n?‡ƒ‚%7hSËê:T^®å‘Eñ´l™þ ô¡¬ñ´sq$‹hñä¼BF•w ê«JÏÝàæù)o¿mË mÜ€£Å½¡KñUY´Ä‚Î|ÊÈá—[ZÑ%—5Jì{ Ù’¿CzÏ´‡D{`-¼ú{$#‰‰šBQ'2´ƒ9&ZS¶•P÷8ïK„ú³Óƒf!Øs-Jü2€_%®Þ1í#ßþrˆhs„h3¦aü±å €x­(}2ZVR¶ÌWò²sá.)|æñ?°Ý[ªºÊÝ6ë#8‹“ªREl_"ãQÛñuXKébšS9xH7åó¦zG==1Øo6 Š’¿î)²Ö¯[Ÿì0޵¸ª’+# WµßÑ‚ëÊnûæsΜÞ_¤Ô &6S~³h”`ç2+° “·Ÿ??Á'œÃAÇRå™gî1Ku VA+›ß¥e‘Ó°ö£ÒCì½x©Ie©«‰LM®`–P2É\eü¼Ík]Óo}e1¢ð˜ï$òÖ™„§~LX·wó¢¸J"þR§ô];”øÑaçÖvfÛôTA!‡ïdéb8\é^7¾[Gƒ«ìxá°Dz`3çYÌ•Œ³Ä'ᘯ é»9 ̺e[Ö¾ibáD šL’ξKYsÉ"ýÐq+AkÌ’,rï­?ávÜ0I}Ãù=šJ{<|s€§ðX™ä^î°§˜ / c•rïF2‡›±Ð$|Gm?ÿ‘tåŒô|X÷úêApã¸}³F–ñ\ƒ~‘©øPŠ}=VÓ ÙÔ,M/Aû ¬öƒAëÑ]´tÞ"Iòãýc3Ķwüh©Ïݺ@Yæó­HêéG¤Û¾SÔëášÚ Òé§7^ê€ØuL0-Ý{ž²ç£k¼Š|4!Э¢O(žQ9qË…s÷–y8Çõ ;<£”!Çæs^å‘Ìã¾`P²ÛãœÖâ‘àÈ#–€ŸYµ%0´“^xÝOaëñÏgiyp–7C…ÚRGù|HÖÛ~ á›.â9¿}†EZðÂòÁ<ÖYÔ$MÊ]?2-Õ…ÎÜss"Q3韓vXN§2XàÚtÙ¾(=2aUR#¤žN¥–$‰ø0´gâi.>ëSµ´£Ë@ŸŽ´ø¢Lìú,&ãÞíúÙÈ|ÆÁ8“Y&uŸÈ êçƒÒÈ~E£û÷ô$·?‹à²ôôN ™FÊ‹þ—á\À[ÔŒO;Jž{œ÷ $ úÐ-uN_7T«95‰ƒï+§*§uXŒ øá§ÿåÁ¦0Þ¡Á!‚™M2qù6_»½½e¢òÝ¢ÿ€›iËb³Öêõ®šjçù=ûDíÔí;AˆŽ‡fQåÎ8WÇÈ:úá@¿&ÍžÞbhÕè½Mï¦þ—{ ÒTæ0ÐC ÌsV¬Ô„éÍòì r¼í endstream endobj 211 0 obj << /Type /XObject /Subtype /Image /Width 1800 /Height 1800 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 220 0 R] /Length 126113 /Filter /FlateDecode >> stream xÚìÝ|ÕÞÆñÿ¦Zé½÷&‚ŠHS¢tAìJS±€ ¨H‘"" "*ö‚ˆ¢(*`A±a§HSz‘Òvî93»›Ý͆ H0;óû~^³3'\óò˜9ÏÎN3 p6¤NºgLN¥™Î­Ç‡Ù€9™Ìû«"²<ûèe"3ÉÌÉdØ_>‘õÙGo µ—0'“9`7™‘"›²ß.2œpÀœLæ€ý•Y“}´—È#dæd2쯩ÈÜì£5Ež'0'“9`wˆtÊ6¸AĵlÀœLæ€ý­‰ü)xðf‘FDæd2 ½ŠH— ±_cD¦ ˜“Ép‚·Eä¡€‘=åEj¦“ ˜“Épw‘È©~ÛˆD,#0'“9à *«=ÂËÿð¬e>[\­>@,`N&sÀ)~×EsÅS«7¬ïîjY†ºIÌÉd8g°ƒø‹šHÀœL怣¼^ÕׂWo%0'“9à0ŸŒh\2"¡J‡Y´ ˜“ÉÀœLææd20'“9€9™ÌÌÉd`N&ss2™˜“ÉÀœLææd20'“9€9™ÌÌÉd`N&ss2™˜“ÉÀœLææd20'“9€9™ÌÌÉd`N&s`NfN&s`N™s2Ș“AæÀœ 2æd90'ƒÌ€9dÌÉ s`N™s2Ș“AæÀœ 2æd90'ƒÌ€9dÌÉ sÀgû·~²~?9€9™ÌIôçØ¢E^4ûi€9™ÌgÙukŒø›–J"`N&sÀAÖ•ÖýQ²^­$³ /âÓQ0'“9à&ªî«|y±H³ #Ô—ª;IÌÉd8į…DbŠI€æ)äæd2!­†H”J0`N&sÀfˆ¸<å犊ò-®#0'“9àé%½»€lÓëÛjZkÅ3ÈÌÉdØßÇžŒùÌ;²Â<_F“ ˜“ɰ¿ážü%kh‡U„|2 æd2ìï"«—ø-3‡.$0'“9`{UÌÎë8ØØü™tÀœLæ€Ý%˜•÷Uàà>sðaÒs2™vgÞX4ÙjôÒs2™v­¯kð¨yŸÑÒ¤æd2ìÎ<7ôÖ Áó3Ñnâs2™NØ4¸È<>E‚9™Ì»+¤¯{àØ‰ f–"0'“9`w•uãP{~?=~{ßþ£fo4 wOëšÂ¤æd2ìn¬Yy“­ä½ÍhŹwz–î'0'“9`w)’£õ¤æd2l¯JN5ØŒlÀœLæ€ýmÉj>—˿ג ˜“Ép€ÖAûž2B2`N&sÀ ù©hâa¢s2™p—ßž`tLÖ'£÷ ˜“ɰ¿”|9œ&“ðá€9™ÌÛ[jµ^ÿ 4Ÿ6!£ ÌÉdØÞ³óÆnÌo~&ê*rÏ¥ôR5Âs2™¶w¹®¼:AwÔþÒ¬Ä?HÌÉdØ]#Ýx˃G›éÑwIÌÉdØ]]ÝxGƒGïÑ£óHÌÉdØ]{Ux™Á£æÝ·§“˜“ɰ»kuãí ½L¾L:`N&sÀîêÆû0hðX¼]M:`N&sÀîèÆ4ø yá Òs2™¶— */ù`Àж‚º ˜“ɰ?ó‰€_û”&æµõÈÌÉdØß#fé=5°§•9ÅÇ¢`N&sÀ~³51ÄsK™ŒùçY7mO4`N&sÀ :[½—ЂeKç]WÒû ¦¯IÌÉd8ÁúÈP]êE0`N&sÀÆë£A5Xêors2™Îàï_ƒ±_ ˜“ÉpŠƒÌëæËðîÆŽÍ 0'“9às’‚>­õ¡€9™ÌçØG>oÆÅ˜/w²Kæd2œã}­DÙKF/Øm¤}tC´Z»‚"s2™N1E_õï}«š«õáÄæd2œá«‘ üo¶Ò]á[æd2¡¥H•#'š‰TL%0'“9à+ÕÎßG†ñs¤¨ˆÈ"W™§ÿ9JdÑ€9™Ì,Òþh-—ïª Wkµ'xƒH¢s2™PF¤AЄ·‹Ä#0'“9`{‡BÝh»rJ‚È„æd2lïo÷ÅOq™#¬ëè%©ªÈû„æd2loU|+=ës­#…ùE^$0'“9`{ýÌÚ+”u0pŸg—PV˜“ɰ»Ts÷/ú¨ßÐ^Ϲ£¿˜“ɰ»få­ ›aÝr› éÁœLæ€íÅ™Ot‡L$0'“9`wG¬@Žšæu¹‰ÌÉdØÜWVæÿ9`ôspñ€9™Ì››î97´úF¿Á]ç›cɰ¹!ºð"]"IÏù>]RÚêÆyÄæd2lny$pоR¢ñÌ éFæ–y{o0³’xÀœLæ€Íýl6Þž7ó[7•IŠ2_£Í¯ûˆÌÉdØ\†Ùx£Œ-ý²¼$ššŸ–’˜“ɰ½$]yùÔÂ÷Öµ51âóÌH½Ð˜pÀœLæ€í=h–ßDs9uË7SÔkwsl)á€9™Ìû‹5KoÍ¡—û7?/¹æ%ã×¹ç›#%‰ÌÉd8À3fë¹b|GËYG ?'0'“9àíB=^î"0'“9à UCÔàeÄæd2œó›¬Ø?Äæd2œaD¨E;“ ˜“Ép„w]"3ž*ì ,Â7IÌÉd8ÀÎDUz/›‹ßÝuåè Æ‰ÞfÖÈ 0'“9`ú‘»]FÒ/Q;‡’ ˜“ɰ½új_Žm6/­N8`N&sÀöQWÊ48L÷`mÂs2™¶×B5^‡àÁou"0'“9`{ ªñ™KÛV.š·ä›4½è.¥‹ðé€9™Ì›;¤ ¯¿a콯žu¹D¡ÞËÕðú™¼©Äæd2ln“Ó&ô»rðÒõF7}KÒs2™ŽØLleö_ÙóÛÔÒ“JÂb½?x>é€9™ÌÛKðìºY¯¦¼×A?„Iï>H8`N&sÀöZX58èaœØúW¦y§ˆ5ôá€9™ÌÛ{Äì¼+/êYT½FUò¡{k=Ô‰lÀœLæ€ý™÷“‘ÈBY§É4úø]ýÑèdæd2 fög.EëfÜM4`N&sÀþ2’=åWê‘í)›v‹ð¬?M6`N&sÀþVg햾澉·uÐ;ƒ#Ò…lÀœLæ€ýÍ“T&0'“9`è΋ ¬À æÅôdæd2ìo„ª¼î_Çø×ःú áö¢`N&sÀþnqµ úH´Àtõ%‰lÀœLæ€ýu‰Èvl0"Z¤<Ù€9™Ìûkîí¾nzí³f¾RlF6`N&sÀþª[­—ì6öÖtùï^A6`N&sÀþ¬¶4R›}6Ú›lÀœLæ€ý™ŸƒFß|Œ°ˆ›pÀœLæ€Ýý`•ÞÅžD“¦ÙØ-Ò³L‚9™Ì»»Æ°yº92ÖÓƒR—xÀœLæ€Í™£okõÞäc™¯Q,«'˜“ɰ7óð`§ Cƒ5={„ÜRÌÉdØZjˆlštŸw±/ 9™Ì;;æk?—g'°H¯_^ô]KOB`N&sÀÖ\¡ŸF﵄ÀœLæ€óm쪾|d›Ú„¿ln¬¯’9p†=X³aípóàËË^GM> ó†^z‹,3áÝ?Þ½/¿Z*¯þ©±Íó½ÏôãÓ¸É8#_eµž+&Ò[ƒM­—¶äz0OجOŠéxÔZnlnžù7û¾»D¯¯!sàŒ<òSÑšV1'ЃyÂ},Ð{_‹Íæ¡Âñ~ßÖWPÜOæÀ¤¶Ÿ¨ˆ€ô}6z%ñ€Ì.óœ%j¹CoŸÛü¾ý²ZoCæÀ™p'«ígî~‡Ûg¾çY*L< óˆ j‹üÑ·ö¾>BèÿíúïSýw}>÷$.!s8ÍWVß-öì ^²Ë0–µVbøTô`^‘_mž)¾µ-jmð†6F¤à)þ«^—ÿ£qÃQîñKg"YDß¶p¢ÿØO%õã3ô`ž‘®o¤1&M-â9v1ÙûÍŒ«ôç¤{éAàLÔ‰l¡¶¡Þ{|C¯˜O¥/F6 ófõÅ7ïÛ8V/ܩ߿ÞiÝgmÛegñ!iô g¼¾Œ¾Š¾sý¸ïõúžçš[o5’ èÁ<ÄÝÃÿ4¶6™sÌ»ã_?sá”nf1&Ÿ¥#ô çýèÝ}íÌM«`Íú%Íófô#yß%ЃyɱNY5Xy‡‘Ñ,ðB§%géÇЃpýd‰©3³žt-­Ô—²éDz0OI{0Áû<˜Ýjuo}ÿG¤½x¶~ =çùÆ¥šïccϵÅ<-X žÞ'\J2 óšÝOt®[¦IÏw3͵ým}5XõYûô h¨ÚŠ"o º›Lµ#z0¯û¤“~ûšÔëÕ³xv7=Êhêƒ%> ЃyßáÍGÏî¿„mª#%ЃÎC‰öƆhAõÏ“Dz HàÃèÍ;oK!‘èOÉô =Ø^ïÓçóE¹$¦ô ï?­Ïu©Í­Õ@Òƒ€ÝÖàSÅçÛ#<ïýµŠjÃÄzl®§øw x?é'Ò”x@Òƒ€Íé;T”4B8bÉ›>_Ø+ÑûÛÚóÚ‘|@Òƒ€ÍUót^¥Åå³)óñ€¤›{P²Î”WëïÖ#¿÷DÒ=Hv÷BVÆŒúK ¤{/)”§Hô =ØÝsYƒæŸ|Ø8ürIßú0Ò=Hv÷jÀCx#ý×Ê’èAz°»Ù9ßPFVèAz°¹çOÒƒí‰ô =ØÜGVåÅúžÅß ‘çìQ‰9D> éAÀÞþò&ŸZI°Æxþ èAz°»ñ¾§^>xô5ÍÍÏG»x††èAz°¹ÃñÁ§Ç”}Ú³;(7èAz°»é敃Wót_ý©;Ëê×BêŸûIô =Ø»•ù˜¥™«Ÿ0ú±Å[ŒÌÄ’©/O“èAz°½=ÖŽ`áÇFúBë±ñߣ¾®&Ѓô `{³î«æ½Š°ÔïÆPõò%ဤÛ[|¢Œkà?ÆÏú½oèAz°½¯ýA¨ºl2Œ½æÇ£Ëô =ØÞk'pØÄöµjµÿ«ú«‰9ö=ဤÛKO©¨ZïÒo=ÏX!Œäþ¢ éAÀº‰ ¬¥‹/±ZçY_¿‡þLÔu¾Hk¢=H°PíúEž*“ÿÉ‚"Óˆô =8@JRÐ £Ñ·îî-Rô¢=H¨Á^ºû’n{v΀š…ô~¡ëc¢z™M4 éAÀþÜWY;½ëµ´iúÆ¢ÍÕ?2Èô =Øß8Õyíëé[ŠÎ;ª×7V7k±êA¢=Hö÷G´H猃u÷Å^xiÛ•¢õâù»ˆô =8@O‘jG #ãÁÄ€Sex=èAzp‚¿#DÞ6—>(î߃ ÛÉô =ØßÓ"•Üzá5ó!ôùËÖmÒHŸ)#É«ô =Ø^/‘‘úuKÄÕë[³ÓWPE³’t@Òƒ€Ý/ò¢zù4Fí~ä®÷‹n!Ѓô `såEÔ~ß±Ò"¥7dN‰¹„x@Òƒ€ÍUùÐзIXç7úHKµGø>ù€¤{k-²ÐH-,2Öt°È—‰´"Ѓô `oDn6–‹ä¸©vC‘ÙëD"¸˜ô =ØÛ‹"¥Ò‡ˆô´VÓ¶óû1c³Kd“þÈô=H¶v(FdÞ¥"Oªå¿¦µpéEËשk7‰ÜI@ éAÀÞnV;„ÕD–{n‹ó»ŸÌ8ÃxP¤ù€¤{û;Q$VdåšbV&™·Ù–ˆIÆt‘+Èô =ØÜ\³÷n×;ƒåî_Ÿj¬.jâ£õ)4=H6w»¹ÿ'7=Õ06_¥H_Y U™@: éAÀî2ï2÷ÿb®ýø]Íô‰2q/û/4Ç>#Ѓô `Ó=X}:ÞT-É Ѓô `ú!„^µXå·V-·#Ѓô à³t6Øáò'þâJm¥†."Ѓô àmÌ=Á»3³FŽv×#QûÉô =Ø_A‘ªöÚ¯÷|PGŸ.c>’  éAÀ措Òû©¾x¢ãüõ{þ^÷h3½3Ø­…Èó„zlo³jÀÌ£]NuÝ™ÙMdဤÛ; zïa¼S?«;|c‹Ì'Ѓô `ñ"?¨÷šÛj$ˆj8þg=ZAd9Ù€¤ûk*2Å»|ø¸gáw×_dzìïAõ«ï'Ò„h@Òƒ€ü!òJÐØž"“‰ô =8A‘’ÛF2;‹?B2 éAÀ 6ÆŠÔýÛo ãfy‚`@Òƒ€3ÌWµwÞßêÎj½»›\@Òƒ€3o¯¯Œ¯5è­c†ñó¸üj¥ŸŠ‚¤gx»IÖƒ—"Ï+n¾v§AÒƒ€#¬k*ٟÇ¢ éAÀžŽ1›/_µê½-XqÒar=HŽ0Îl¾vôò2×"^'Ѓô à‹\ª÷¢xW2‹0q=É€¤Ø§Ÿ±ä¿û÷€Y„­‰ô =8À]z7 ]má ²=H¶·I_/‘|0`ì°yÝDOÂ=H¶7UWÞ Á™z°`*逤»»PW^ðÃvw™ÕI: éAÀîŠéÆÛ=Hñ~~«û\;õma=Ž^jï"Ѓô àëóî êÔ7O!Ѓô à “Z0²ý£Ô˵äza{¼H§9ôÉ—L×7­–× èAzp‚!"¥«×c›}3š‰´%Ѓô àiI"sƒ?qqÊ(èAzp€å"ü¼”~ÀÖ:Hè3ZDßgm)逤»{Ç<;´¼ÿ&ÖÆ‰L¹B¤é€¤Ûk¥{p‚ßÀ†R"eS>ÉÇÓ—@Òƒ€ím.ªzp\Ö±À÷ ‹Ä®1Ró‰¬#Ѓô `{KÍ“bÞ4ï2šñq'ý¦Ej±ŽÈÂ=H¶·ÞºLlR¾HW„^J|S_*òဤÛÛ*âò¿£Zþ…æp3‘—ô =Ø^ª+èÖ¢®[RÕpI‘U„zloIdV–¾ýbÝŠìן–Fì!Ѓô `sÇ›î ÞþukõrqÚ="-Hô =ØÜæd«ÿ:>x_¿ŠæY2-Q_¯Ë'2‰x@Òƒ€½IòìVÿG­ê¡›°q£yæL±Èô =Øþ—^?kPÕ_§ãz}UœZ½?¥†}‚x@Òƒ€½-sÏoáCêµÁïzdc´HÔïú˜aG7zì-#IDõ^‘ wýÀÁÛÖ«±WÄ™I> éAÀÞÞVuw¡HÕˆwš–¹èªöqž#†ƒÈô =ØÛej'Pí >¨—ߪìwõDâ•út€¤[KiÞFäs%uvKßõÔžb]ò=Hö-2¢³È ïúžeóybI‘F/ª†$Ѓô `kÇÕžßœEî n-Rv’H=H¶–ªzð±É"‡[ˆTh/2š€@Òƒ€½ÅŠÜú‹ˆkCÀ¨þ\4†‡M€¤Û+)RÓ¨.ÒÏðD¤H5‘âäzìm€HÄáçÔ—÷üõ…ôQ"Ó‰ô =ØÜZUy2ŠúÑ7æ.eÞj­J*ñ€¤»«¨ö¿þ¥€H¾—¼C÷˜Æ­%Ѓô `{kTååÛµ$J½´ýÌ< ¸Ä¼¿šë9²=H ï¯ÿÑ…uù%·8¨º¹7˜ïu’=HNYK÷^ëO:úÝ\TZÿD0 éAÀRššÕW°RÑO –{›T@Òƒ€s ðߌ[D" éAÀQv^ì{ÎDüÐtò=HN“ñ|ç†å*6ïÿQ€¤IèAz@ÒƒzЃô €¤»Ú6»çUj·¿uY Y€¤§ù®ïBúü÷!Ѓô à$©ƒn)Sb9‘€¤çØÝR·_»ž[¾ä‰ÞIj1òQB=HNq¼‰ª¾ÏOêÖ¢b½ËîX>±ZC, éAÀ!z«ÞëÖÐ÷©hñ±UE¢?!Ѓô à+T÷Uò?<(•Š‹ÔÎ Ѓô àîÆ" æñÁqÏøÆcm£Ôb¢Kd>Ñ€¤øÊóúÕžõí×GЍÿkB4 éAÀÆêtug¼WPEüM6 éAÀþÌk&& ­×c/ èAz°¿²ªòúy–¬ymî+«ÏéœD6 éAÀöÜÑ"ñæG ™¯u3÷%æ²ÎW/à ô =Ø_”H7ýú^=¿+'J«F’ èAz°¿H‘Ônáx—î¿Â Ú6*âéBzô =Ø_ªj¼†ûZ}†h¿õÅó™«®Ó×ÊhÂ=H¶·U5^=ã!õµö§¯?~Ïøy§Æï5ÔúÅ„zlo»Þõ›!R½y¤õyhÁ^ëŒKôÂ2Ò=Hv—¦Ÿ<gþŸOÄæKn1 zl¯lVÿ•¿üº«ÛäËZ™t@Òƒ€ÝÝä)=W¹ëßJSë'––7×U^I: éAÀî–ù?q©èCÆúË­ÅN"ùOèAz°¹Œ*ÏÔ‡ %VýÓQ}ùx@Òƒ€Í½à’`µõ™£®R"èAz°·G¬ê«?²„¯KF›{„E^#Ѓô `kK¼åWqáªIÃ{÷*n­å{RíŠ|F@ éAÀÎvGg}ZèêæNZH/&žž¬_7‘èAz°³¾ªìÌ›‰F ,jÝõ¤™$zlìo}vhaÝ|õ®Šõ– >oæc¸úz= ¤;›£Ê®q>³ú^?üêÈ~m» ½m¢lkôS_W’èAz°³ªìÞ¨,ÒF¤ÀzßN¢jŸ­ñ"• ô =ØZA‘ˆŒÖ"÷&ˆTúÝ;ªï«VKýs/¤;sGˆä3ÆŠ\ü’ÚLzÑm ·ó(ü•„@Òƒ€VeWÌøJ$꧇õÙ1MgoL72þlnÕ`=HöÞŒI0ܵEÚ¹_I´n/šä»‚â!=HöVXÄuÂ|âĘ”UWÞh´L ù€¤{»TõÝó†q‰Õ|‘IÉ~=¸ˆx@Òƒ€Í-Ò—H›áWõæmºÓ\I: éAÀîèÛ‹V |èR3óãÑë3Hô =ØÞÏ-¶o¬Ð…®YDzàXA]{}öî—«ùõ Ïß=HŽàndž ó¨ZÌX5ªi©óCÑÞzáÏ`¾+¿Ì46ÞQÊó1é~’=HYUäÒ¸Àód\ "cˆô =8À‘˜MÚû×`¹'«/Dz`¤Hgõòçe V FÕ[ncD¾!Ѓô `ˆÌ±–2~œ=ù“ãÖrk®›=HPQä#kiûC»·í7òÕÃjùF‘»Éô =Ø_¢ÈOúõýfÞ{lÇöøU?ðZ²=HöWJdaüÝÎÿD™¨Û‹Œ Ѓô `E^2¾0¯¬9têÜ ×”Ð‹É"SÉô =ØßÕ"ןOU_û­÷»ÖFß%Ѓô `¯ª¿2"±Og e ן'Ѓô `‡Í#‚ËýÇ2‹«¡ÅdzðdþúÆÔ[z´;¿E»î7Oyý×Lz7ctN zPUJ%Ѓÿ§×Ýß®Pà] µ»›ÂÉ¡x‘èßýGFˆ¨ÿ{ƒl@žÌ÷7—”JÞü==„wQ}~¨ïsÑß´QëûŠ Ѓ9J{¥•œDëWÒèA Lüdm¶í–¥ª}Ãû*y¶â""%Èô`vM(åm¼˜¦WÝ|ï´…Kß}î±1·ôlã/ýànz ËÔkÞc;©eƒ˜€§/%Ѓ¡½/ÞÚH*÷{üËßKýjfÿ*ÖwƇé6DÂažió½ÿ'<‘uº7‹Ô m“èÁlÜ/Xû‚õ¦ìÈéüõhó”z1,O™¡á0óDÚÆ[—{Þà–½] —›#ЃAvw37”»~:ùûùî²úÏußCyÝR‘šúu°þ”ç™ï<£;ÍR¼ÒM> éËš½ — f.o¦þhQzÈë~‰>dï©-öª¬K—ˆèħÉô` ‘úïœâD÷;ªQèA ¯Ë,¡ï“YO¤EJÖè "½¯)ÍÝÕ@ªùÚiÜ2&óµšô çÝ"R7CíÿE®ÏÛ#òê߉"OèÁ¹úÇéAà?ð]„ª»kDze ¹»‹”=nŒ2O¡èÁÓæ7¥á8Eb zùÙÐÆå’ ˆÈ<ÃøZ$úò=xš~lAaegióäÐCª_¨â»Œ0ñînÕŽß’èÁürôøÝQÞ™ÓƒpžµqúÑK[Œ¿Ü!1é½Ú"ïèÁ”ßbðƒŠ"ô n>Ô„FÖõ¿«š)/òé€ÌTÜ<´»Ÿ¹ýЃ@¸ù4Ä ó#̯ŸèÁœzP*ÞZ-ó™$¡°”âòÛl³ö·ô=3Ì›Œn$Ѓ9ö TùËoý×֞ǵ˜ÈFAæh¾.ÂÚ{Ü‹ŠXuÔê—\þÖQ?e¯µ|¸‡ÿ‰mùŸ§a£¹!öÿ@绲ÖÖõé€ÌÑ3z#©ÛÖÚX ÍËåãéÃÌŸcõàþÚA§x:[ÏI£áDz?Ó9ä8>%ѳm-&Ѓ9{*«‡úìÊåŸå(Y=˜ÖÆóc Wð\¬!ÓéAàŒ Ð×Kèæ+|ÓûØüÑm%u+^ª7­GIôàI<é)¡ ïçúšgþ ÈŽGõÊ,s¥Ã[ú°þî…uÍﬣ3e6Þª2·U[ñ¸~áÉK Oê s{¹óX®ÿ cú²^¹ÑÚë<^B-'¼êý^æÃúHez8SæE=<6Ñׂ wî3ž× o“èÁ“2÷ÌÈýŸó´þ9³<+KôÊ~ߢ¾§³?ø¤aì}¦KÉ(‰(Ñq¾> {ºý™t@žÜL½¥LÌõs•ú)í¼çÂܬV:ú×ÝL F*žê¿kׇ'Q™„½íw~Lb¹xóµ´y™Í„zПœŠ\ùÉq"|+åÔO9‘­'Nñ_µ2öÿüªð›g9|IÀðↇËyAxé€Ì#=¨vÓÄw§æjå`À·ÝªÛòŸâ¿jÌÿû ”à7޲¥tð60Ü81%Ú|Sx”x@摼ÐÿþNú¤™ï¾½ý4vãþlQñ$T¡Öâ7N²«°÷ùóYº¦-MÖƒ¿èÁ¼Òƒwé{ÖxWæ«•Ißž­F.<+?ˆódà0'jé[Çø=†×|ÞR”µ2‰|@Úy*rå'ÿêÉàÁ‘r©~ßMÑ3î§Ó§Ÿ<ãÝ#ŒðK«Ê±O›=˜gè§,%¾ìY§VFf}Ϻ÷èÙyÜ=g9ïm¿ñ ?Ù©óKAî&z0ùͼ¼·uo‹Ôzjùî Ï·þém]L§íQï^`Ôþãð«Á‡õÝ·‘èÁû¦w¹×€;rõ‡-ò]÷W¶ù¥ž§ÆòÉxù,ýzŽrØúL´¿ÈÕÖÀ±ß>ýôOõX%ãk‘"Dzð$vßVBd w­šz[Ùå·Üüy_TËñÕü+ÎÖ¡á(?›PÕa"#üF3ͽÂ_·¨:“Œ@æèYóX‚ŠD=•›?1}Aù-yãßgígЃp”æ&4zœÚ|op‡Ú•[öœµU Ñ£3¾I""Ѓ9šbuP`æöëÓWÞV!¸<°á,þzŽòž¹½2×wÅ rñj£¸~½ã5‘ÚDz0'+­ÛOäó=riîÅæv¹:—°{LJ3néѾe½šM.î|ãËÎòAIzŽòƒ¹¯šøæ²y]}ŸëEúèÁdV×ÛIãü¯f?¤Ÿ (MÝa9=G9`öÞ­úx`â g>ñÄ„¬«û$‹¼JD sð¾ÞL†¥.Ö£ŸÐƒ@ØÈ:û,ó¥r¯:ž–"èÁ ѬNÏ6ÜU ¢°ñÕye¢ü>-ç9û‹‚^öÔ^LÓ›:'ø¬G6 Oæ µ™<™}X?¾=„i9ݵ7™l@žÌ³ú„˜ƒÁ£‡J©á'èA |Ü¡6Úúmƒ:0¾Žˆ+ƒp@žÄýJ›CƒGÛé£ ;Â:szsÚjg âük°ì—óÔׄzðd&ê­¥ÊRÿ›¨­2oC1<¼3§á0©­vÓ¾²ûƒÝõý·&Ѓ's¢®¹¹T¿oùß™†á>¼fZSs Ôz#ϨÍö»D½ñ&VoÖ¤IÓ²æ¥ôÅÔ?œ/ zðävU÷¾utå/í].üS˜gNÂaVêÃêŸBó=é7{.xžp@žÜÎöÙÏ0«ö]¸gNÂa~³¶Ý†~wÍÿÅ|Æv¨;'ô`÷ür-˜0òxØgNÂa›oó€±íæµõßèÁÿ+㞥|'Z·ž~ЙӃpóíìçþ#i—롈£dzð”v ·-iÎôgß^—fÌéA8Yz‰/úÖ3—Z'ºö“ èA'¢á4ͬOt:ý`í N)àýŒ'òÊ?Hô =Ø]Qï͵+_{ßýn1}7÷”=xšf]xáXz'æd Ô_ißb»zð´Ü.Ò„‰õÜ¥óêExÏû ï‰QF¤X%õza < )ÕÃþ&õô œ&R¤•>=ôŠ;®‰­WV?‡·s ‘êÇúª¥¡$z0Gξó¦ƒ*K祼*ŸÈ‰æÎ`TÖG£e ‹\d7ˆ¸¾$"Ѓ¡ú¡e—Òƒ@8© RÓXÑ(û¶<Ø0R‹´t“èÁPŽ6ÏááŸÐƒ@8.qÄp¿ÕØÚ‚#ªÓÁ¼c𭪿r‰|MF C¹+t ÆÎóÌéA8͵á^iò6ã*󶘗OŒRßm)r a¬ÞL* Ñ3Q$fÄÈ‘#®©¯’·…{æô §¡ˆkQTÀZÏdž5Œ©"-ˆô`ú™e2V7X)b=ebm‘NáþkzŽó»+Ôg;…‹Øc|&r ¡¿ÚN:Z‹=DF[K‡›‰ ¢03ÒW~%;^ç}–ègÅE†›D¢¸© èÁê©íd©µø¤È…žÑm‰"+èA ¼ÌóÖ`Oµ’:1ÖZ)ÿ¨HÜ‘"Ñ™Dz0»"j3ùÇZüB¤ˆwø^‘ªá½ÍЃpœ=Ym\ÿ¼ßÚej‡ðÕÏDÊèÁâD=WRÌϰzï(ŸÑƒ@8)íØ`²U†D®›*r !ÂïàyQ‘•žEw¢ÈÍô F6{>õ”µæ‚*È6-E&èÁ ˆÄxï2¡6”ǽã EšÒƒ@éiµß$£‰HbýŽ#þÔƒÅ=¨É»žŒ@†PÎïÃÐkDúzÇ»ˆ” 0â¹r°o+óü˜˜šã¨Á==£v ‰ô`(¬klM‰TôŽ7‰¦0’íè`Ô°LÃð]SèZKD C¹GmµÓ­å×Ôò·ÖbF1‘¢ô >RB\CŸ¼ÑðÝ_f8 iÞ@ÚZªÞë2oO¨½¡FÓƒ@øØî»L÷E3"½»„äó,uà"zЃ¡¹õ«%±Ó½r¾Zœ¨Ïšù±‚è;PЃ@Ø8êíÁÑ[fõ.îý8ÔåYèz”„@æà+ë£Çôò½Ôhð=]âõBx?µ“„Óxo¬ê.£ xö èÁœ-rùz0½–߆Ó6¼3§á4æ[Ú!ïµ±™x@žÄª:Þ4¾*àÛpJ„ù“—èA8MÉÑÕ¤zð¤Ü_ëÿºµø]yÏvÓ8Üß?Òƒp˜ô¿+&Ælý桊Yë×èÁS–öB†eê_ýfØß˜ž„ÃÌ Ø,>è©¥â}«¯’èAÇ¡á0—ûJ¯v¡ £ƒ"UÓô =ØZ#_ïÝþ×°Xÿ¼;Fäy=˜ƒcGŽI¥°W!«øb¦üøÚuÅ}«£oéA@ s Ï‹±åÓXèA8LM]yùC-Ze…H¾T=šþød$=„½6ºòÆw y9áú(® =˜ƒ*â»§(=„±!ºñŠ$ø]IïºB?wPÞ:Od5  íjµ‘”²ã-—èA8ÌWºñ^©¾ifhÕ…ç]4c˳Ÿ¨!²Œ„@†ö‡~*ËJzw¿éÆ[+â}Ô„T˜œb\l=¢¾Èw$z0ÓÔVÒÒ†×уp˜Cºñš,7Úz}\ý³‡„@æd²ÚDú§0çÛ¬óý†œ™Õ‡ÃDj‘èÁœ½UD¤ÊÜ}ô ÖÊxZ¯¦uWĽ÷z/¦©#rù€ÌÉ;ï¼3¯¨ÞVÊ^Ô¥g/ô NnõîþM×k)ÓKy×k‰DþL> s’ó£ZèA œlöm»qÅKå÷»z"Zäâ=H67;Û6œô€nÃ(‘ÂÛ‰ô =Ø\%s»LðnÁFÿ^ÂZŠü€t@æl\ŽèA Œ¬÷ÜD-K¢ç”ÑègHô`0}Ì>{gNÂa¦ˆ4¿:Ô';ñŸèÁlôÆaóô f°HßB¡z° Ù€¤ûë&R@Äôä¥""uÈô =Ø_góPà‹î§ªzFÔ´>&­N6 éAÀþnÔÏYZ¬—ö½9cä¨Ù¦Æ=|. zâ~µU÷°Ów¼8ôâšÉ¥›÷Õ@6 éAÀþ¨­ú[õºéáf×O ³÷àÿEad\öm8澪êkßA"­Éô =ØÛ·z«-&áÝ‚#{m2©×Òê;Qûô =Øš;^mµjÿoÆ+×]R£Zë«ìQcMô¦üW9‘7ô`¶ŒOü?èA œè³dò‹¬U‹önX±É5k­û‹ÊŒ.êò=˜­9_°“4ÏUÛ~<Ïÿ*‘®7‹ÜE@ éAÀÖþö_ål‡8\eEÆèAz°µµU'æx¸¤{‹P{}±Ö`réà¬ÕÚC@ éAÀÖ ˆt‰ôï¾ø;˜¯æG›'!Ѓô `gDÌ,Õ„MöÜXMßV†„@Òƒ€=â° +Êzé­¾¼OD éAÀÆù(:fùs÷Ô÷­õL¿@¤~&¤ëUƒ]Í•Å<«¿¨ÃO‰ô =ØØ#Öã&ô—ëöªõ]¼µøat¹ƒˆ@Òƒ€õ±J¯¨þÕ¶_«hßîá†1G¤ôÑ·ÝA¶Ò$Ç«è{Æ7"…‰ô “ЃpœŠ!°Öý¦‹ c§záBЃô `c-TÕ(ëß‚E—Fmõ:Ð0þq #Ѓô `_—èûˆž˜à_„¥]¨^¦ÆZµBD O"óçù“ÇÞv݇j1ÂÑõªñj|Sʼp>Â{ƒÑªùÌë&Œé"M‰ô`N2^ïRØÚf樵^­fÛà0=ǹS`|¨ódN†Ú-CD sðM]ßæ¢{°‡Hñ7èA ÜŒ³¶âëêù Ú6JöÜ]-ÝøL¬'Õô`ÏGIpŠŒvÓƒ@x™k]G¯J»/õ]ÔÜëÌ‹ cÓN4ié&"Ѓ!½â= ^Ë¿õ…·ô N–û}šð­9t‹µvÓµj§ð =Òó Ö%§n1ï2£{ð‡nz$"Ì?C¡á8ǽ£¿°ˆH· c{9¿fäœuЃ90K¯ß½èéAÃøTŸaÖ’ÂK+oç‰Tû5“üO•¹$|@†ÞÔ[È ë¸¯UúÆ„ßу@X¹2Ä©¢ž›Œ6C¦|K}M}|³‡Šˆ|±>¿îÁº\Jzìk™H sAß,1jjr”K"¢ëü+ò‡ñª¹CÈ­¶AÒƒ€}}/’/Ýz rÔ0:˜`"$Ѓô `[ÇDVª×ñÁ5è:l«õB¡tR=H¶ÕUäZõr¾·þ"c¼ç¾od–Я[ ô`6¼¿8z'/ŠDýjæ3'¤™µï7Ó*ÂÍÆåö÷Î=˜kÜ‹«…¼ÿ„Ѓ@8ÉT¿ô5½`î zî³µ„gß0ãFk¿ ³³¶z{KÕfÛѼ­h²5°Sm1Ÿèz7ë¯ß“èÁ& =ØÃ]¾ScöêÕÎS‹óµz¤£þ²‡ˆ@f·;ÖÚl*5ʆÂKf_o>c}ùR½0V 7U¯úùjÕIô`èM¥äkGm—9=róÞ*¿\Œ~‰žkŽzï Ѓ!è·Œå÷Û0ó°ìÁ´›vg°½à̵8¶QkÞ6ó)ù̵‚ EŸN¶ÄŽ™‡_þt¯uânÇÿd“Á¿Ø “üŸ2ÓlAšÑÇ\@< C‰Q[ÛŽ™‡[þreÖãã®çzgœý¸ÁUAg¼E˜¦_ l&Ѓ¡ä9ß–™‡Yα0ɺHwÙjp&ôyoÆÍ¡Îÿv-#Ѓ!ÕéLþçÆè‰ªñÌ-™FúïèG#ç²Ùà $ë|Õ¢GèÁÐ:‰4¤ÿksÔ4UêMïçÓOPEÈ»wœÙï½,ˆ µ?øá€ í9‘ˆ]ôàëËh‘ú;ü~*/R€c„8}ú¹®÷ÅO8 C;^Xä.zð?ån*Rq_ÀÐï…xXΈ·öZ >>øá€ í ‘¨éÁÿÒ{j’ þOð´ÚOÿ…-§­ªÕz• š—NÄ*^Üûð¥F„z0ãEâÙïÒ‰0êÁþ"]‚Ç2ëYwÄNÏßÖµƒ¾C„ ]gz‹7V sà~2VäÂWЃÿ‘TõÎÝs™Ä}îù1K¤[NÛÝÖ‡ ¡ŽÞ@: CZ¼xñ(½ÑDÔ¹ôÊ^èÁs㑸ãêõÉFÑælÁjm“Z:ΦƒÓ}[[Ú¯øâË—Œð[-I< Cž»ôûH¤’a¼QÔ/ú kŒLUŠÙtpš¾ðkÁjmÊÇúoÑQÄzÌ›{ä"Í^Þ“úgÓÁizTN"…|@ÒƒyÑ2‘uuàI×|‘nÿðÊD½Ò9žópÚÜ-²oÈÓïô,qåèÁÆåˆ<7¾Ñ'÷Eú®sμ#‚;€àL<\‚QÝõ¹à]¬•çHô “„OÓSTþŸü†>5ïº]–ÿŠ8­Á¶A%XðÇï~6ßL½k­!#Ѓô`žÔQÍP±;†Öè=Â[ù¯ˆÓ©ÁjY 8¶O>ïb‘odèáÇo ˆö.?HL s¶söÀšæ ]¥ºO±ÅåÛáÓƒoXsÔùúF¾÷èÙɦƒS5S¬ßøO‚z°Ð¾-¼ËŸèÁœ|Þ5àÁ®6xEøôàD‘è‹Uìq£¾Ó«k®Tk}Ô?+Øtpª*© w»a¬ª|åD~ßî`r:1 íŸ[³ß”÷†Côà¹r«šªN\oÆ^¬qÛúIæ[‘ûÜæ§\À)Isé m2Fœìv2Cˆ ô`h›„Úd¤Ï‘Db ãÅr~é×ZnœP/ËØtpŠ~W¿/wŸè’Sê“G£÷èÁR›ZJ™3Þúdõ;OÝXÙZo‘Fž/«´FÊÌ #­)«ÃÂ ÃøZ-mcÓÁ)Z¢~_^˜S ž×X})ÀyW C›h¤±"Ó;àþôBsh =xnìTa?n.í[õòÜ×= $•ɦƒS¤O“±>‹É² ¿"&Ѓ¡ìÕg[Ë´€×ý˜KÜOžEEjf,,R-§j©~Ð’Ùv£Ëˆ¸²• Kä b=Ê<½‰Ì ®GЃçÆõ!>¨Æf±åàTmðö]¾%sút”‡õoUµfÛ—¦’E˜ôàejó¸(ÛqƒÌÖj¸ =xnœˆ‰Û0ôM„H 6œ³ãàO­Ùj÷))Ý{ã˜FŒµ˜­oâwáØ2ÈwG»Bc’GXô`Uõ_ëìï¨áêôà92V¥]Úÿcè? è³Øp΂ßî­kµB·'lý­â™{Ÿ4Š[ Õ§NïpW5¹‹_‡\ç~ Æ?ò¤—‰$zPP?bÏ^Ÿ^Fž+ú† YoG^ЛR¶›o÷Í~wˆ¨°ØÎÕYž¿å»F}ßߨw½è5È(~!r[JotÉ!Ͼ÷ÎS}õäêš@(aЃ‰9ôúO˜@ž+'Jè­§Ú´ãjy߸2z…“d΂5ÖGƒñåKX·Šè{ÜÆYϧqŸýõKïè€]ÁîúòT>iÏõ½ÁžúýÖsžÓ>\H­N&–¼ßƒ5D¢BÜ[;S½®Lž3©=oà<û/]¹Öëß{UïW×™õ§ZLûhˆ>›²Ñ!ûþm/¶~s^5®Ñ·P3þSÃÿIOé¯\ˆ“ËÆ«;ý“µ¾±¦HÄRrÉó=¨Ï“ù5û°>û¬=xÝëKȧÙhþ½¯Tó%.ðÍý;®PÉv̰í_w˜ç ¼†~äÒ¥†1AÌ·Ø_Vý†_Š\µAí„_ðv šH¹’Éë=¸H_p”}x‚žCžK'nñœßç*?†Á³àH)‘¢ëü?äÐ×™Û÷pÍ#ž7QçëOD#›[§kÄW·Û™__â·"Wõ©z$pèõfl*Éäõ<^X$îçàÑÕ;é=ôà9vàíGnŸöîq6˜³b¬HìçCרbØn׿ïóZùÐ<—Õs¢L®Ú©öÀߣvy_›×{ÐП›”û%plOC58#¼3ÿÏ{pÇËÓï~`þª ~ýÿÿä¹7x¬˜È»þ…%œìYRTýs;¿¹é‘JÙ*ow¤Èd“×{ТGMñ»¶Êý¦>–py˜Sÿo{0ufcÏ{óäk~eø/¼$R$ÛA³DÊØöÍy‘€kת?¹wßMÞ•*úúÂçùµÈM½C¾Ëj%ò(Ùäù̼_ÏØ…o~}³ÚuqX9Á|z×p¿èø?íÁ¥•ý¦£¨[³ œ{}D®Ï6¸?ÊÆ'‹|ồ¨D›÷,â½¾áþhn´Û.ùNCÍþÃÉ&¯÷àÈ‘#øNS,ì»ê8¹¸?zðt¸ï3÷«u¹¡ks:ªµmàœ«)òZöÑóEì{.nßœ&mÑ_y}®ª(òQöÑÉ"W‘M^ïA9ôàé¸AŸ§7Êê¾c¯éÛz%ÿÁFp®%‰|›}´¿È¶ý+ï¯rë¹µ õ$¦²üVä*ÿ‡ÙGéE6ô ÓzðQXƒ­¾ÕÌG"DªçÑûíº×N¸þ²ŽƒÆ¯¶Ýé<jÏhkÈMq˜}'šŸ …Þ~=ŸŽ®d*ÎU­Efjãs³èAz0¿F‰´:ê?ò’š’oÌ‹¥L*å;›pìöÃßÒ¨“lÅE˜‰s×ÀôhâÁvô`^³òTЃ§®›HÙÝC÷‰DåÁ³F?(ç?KÕ^ªœìÝì6fâܵX¤d¶C°ªwÁÏôßøã›3&/üÐ.çÙåéóEmê¿êÁß\Ùçß´ê"׿¹„¦DêcG—Ü3cÖØŽqú4Ã{luûIç/jÝE"ý›¯ÕtµÚ}£uËíÊL ¹ìŸX‘§‚¯©sfÿº­Ãô szð‘P?÷%‘¢y휾 Wìžã–G'V«#íô  3wÖõƒÆê¿¡škÎ[÷Ú¥ÞƒþOàìýÜv‹Ú!Ü8ô…z'2ÿLþ])wÅûý·k¼†Dõà¡nayD½QÌc¿ÈoE¨=¿û\ìÐÏ@\`§7ç²ßOæP1›•} óE.z]¤¡q$ô£˜r×ÎD‘¦çüYB¤Ö™¼Þf>&²îe=.(f>‰f=˜ë2Ö>û¦w¹×€;܃§¹âÒþw.9í»|þðÈM—w8FíW­ÎþÍ–"Ïê×-³†vkÛïŽ×æÚß{÷è& —¬{Õª“ÿ±£%U îó9ÖP¤àÞ³ñÿÂéþ%ÿœ1¤ë¥ýG½òϧ­3°Ãå7MÊ~kªºÖ.‘\±ùøœf÷ÉjY0’ÙY¤pàßlN8l[]"_¬Ð€ÖnÀ‹ÌI+žÕ·ºwÝRÉ嚌mn¡™_õs™ùöÜU¹`lLJ#³má;ŸveÛ>·/>g´çñÜ}›zÓ2лVMý÷èò›3{ÐýJ߉n=ÿaú²&ﳿ·ÈÆñNcï‰ë•;—Ö’uêKÂÝ'ûðA‘ø Û«oM:+7 \ršÉ7}·qˆë»)ø›ûnó] PaŽÿ)ƒ³žSUumÈññò"Eý¿•q»úÃSüÿȾG·Gz/@¸Èïį=¼7*s5{?ÏÿÊÏ©nü¬þ˧dÛôüíÎ^ýdŒÍº›iéS|Àž{q-ïÿ$ñZ›Þî\ßÇ®àO›m;ß—Q±q9½·OÀ9¾qæìq\ßáù¶¬ÿ\«K©ÿ†g~"Ûš²Y? tÀS+/ðÞq(ºóÎîÁg èü{P$ê)'öি‘œò‘¤µÕýÿ‡…žÉö®¹wG›€‹›GŸý†iL~?ÏñOfªw>÷>¦æ§;Sî¸øôþ’ÛZüù1¸®zV©½—ð7íòÇ|§¦ê¸Ç}í¹ñõ'¯ðû[[…þøðJÏ[ã´Ûf¨ö»òø¯üõúBµcñ"² ~¡~ïÙúQ_&$ÖèŸSøßüÑ$à myœ6Ý| dBçûf?~W€ŒJ¼ò0+&ø×¯ŽÕ®€óšw¨&ÿÎ3ûÿéð%? µoØEÀU¦7çòÍ4ótN±BìÁð¿5ìôà*ýSWÃÛ§=yßdÁU§Ø ¯è#Ú‘Œ~|ö}]͉gDð¼ÜIäÎÒæ/ù°Gç>0ÀüÄ¿Ó?gù¯¼³¸ùÛ\±M¿+êÇ™‹9 ÿBuN¶BRÕä¶äßý¿ðÍiþ%¿*¡ÿP½á*òþúÒåHÐþ›äë6nöã£[êó ¼ïˆ§˜)'4êÚ÷â²æb¹޾®÷kÎÚ¬ÿn+ÌÈÆ~gÎ|aÆUø´I¥­_ùš3&ÝRI/Ô0÷K˜ÓG‰AæNZóì]xTÇ>'Bww—âww/îV ¥H¡¸S¬¸;ÅÝ¡www ѽoÎÜ•k!ÙdåîfþïƒìÎÚ½cÿ9gŽÐQyÙ€Zs8®Ž!l>ðÐ|V‘t”Ÿ¹Dgú îj·¬’™> ˆ]ó?‚žXš"¦ÏÕœ²hKÇ,O»<™H/úÛì9#ªãrtš  Vw2¾Ó ²$¾ç&« {Ÿ|í/q¿Šà›'œyH ï1?½]R(˜šì‚tÆÑ;4Ì&{ÏI Æu¢o*mÙZ{ªŽä»ß{¼¾aAEÚYÎ'žF6k¢ õ‰Z™wñ8él›4˜L[§-d§ÝÙSò–ô| ¸ÚºWÑ›2£W{¸Yïø*O.ý"øg»é.¿!†÷ލ"om!¿pÓp-©i7y •”z:#|ôúŒäY¥ëÝpƒ¡“Q_w#Lè´EoHŒá{'܉S)þÌ)¾´q’Œ©øYÞR Ø\D•²Á¾d8dÄîªLtÇÿ¡-+Í Ž Eõ%ÇvÖr=0Ô¯$ÀZÂQú}õx±àKµy~hÍ@¬‹ ˆû…WlºÊI"†hš?ÔiMËRKts§ÁnûYÇ8Á£p¶•½W¯¹»¡1þU}zvÌ!yë2|qŒZ×€÷5MÝû<÷:9•‰ò/¤Òf2ºZžàœ/ŽA»7/J° UT1FS‰±è!á6ò7 (nßv “yð)QM’¬XjAÜ"] —Üp¨Ô…l—䃋÷{j rØKC›¹c q$Ó¼ã¾îœ3bÄÜÝßÐL.וßÛàwyëLBb ¹‚·™ÈM.‰ûM¾JG”Š&oDÞßMÿlN—ÆW‘íu‰<8ŠÄ7ÄøÂ#”ÀK*þ›nÓf¦µ‚W^9Ç«DVÁÂ|Qß5zà†0† U±PmS4’–Åõ¦ÇêƒüIµój7yr5Y~ç2öiS#‰½N‡Êòµ»G)Èàmì1ÕÈg†rމÈ##Úaݵ áNvƒgÄTÝÐ4[þׯSVßãë]]\·#3Ç5/Í@S— æÆ\‚Ñ=¨¹9?¹¢I‚èN^¨cIÙDÅ<¸—ö’TöÀâ¼p4qñ Ùƒ=Ž‹¤*¢iNÇ.I_J~Çðt;YïÅ £Š¼èºÐÉ-r^Ôâ‰ú>3ÞðD4qDóñ¨¹<ù“EùÍ5æ*ØÑç>èdâM¶pÝ/zGcÌ'D™¦ï¾+ªå´(Ò.¾ðµ‹•Ê¿qû·ü¼gFý¥¢ÓV„²©Œ<Ÿ¼8DZ=y@uÌPtßÒE»ÅIå!xy¹-#½ßÞ–K˜YZÑ7,g¬µîë%!:®ŽjLvá œ£â;‘ 2‰t义V&>%x¤Òôúcî1ôçÞîòó„!ÕâðË]øùž£HZC𨨦ú$lYÈqÃÉö¶BôÑä…‰“± oy9–ú±NlGãÁÓY’ÜïEÊÇúÁÕDö¸~'zFcò¯“à-i’™ù®¹BóI_Qdùžy©T«IþÛ¬øn"Ï—·náÅøâ¦³i7y…Ë-çÿ:‰ßÒ Ï ¹—ž2W9-Ñ2XÐWFÅ<ˆNë»åÍgIs‰DŃÍÊHÛNB²pø!V‘µ&Š‘18ï-õZÎ'¥ƒ«d+>h¶û‰ù`|¨‹vöí«ÓC7¢"*¾›ÌŠi­\B7o’(…¥äulàT+笠â‘~-Î¥ð“þ ʸ&¹•·§ª%Á"o3xí<'ôÈ3ð´ö.õ vxM"igUw匼€1£X•¹çŠüqÍñ3ÙÉ>+B[ ІvT”¶&Ÿ¹Ê9&´i†IÇ“©6 \vÿŒeºîB+òk'C©îRÍ»4(@e]üU#ùwÞ!ZbìgUðLþ®è)HâZÞááᲑi¥~€ÏÈ+«%¢é½¼ùž5%& '[ß.YkÅØ£WŸ’Ù{GØ]–캸yÄã"tf¯VRº{›í~ RÓ”#¢NèRk9)Êw#jÈ[Û NçLGti7¨Ä]µt_–-A¦HÞ"{ûErSeûŽ7@%S´çdzM¹¿6ÏT1²…A™Ê.Îë¸0F;³¹ðþÎùoâPS;!³á>\RfHáÍ{ŽêïÇ —øŽôN[Yÿ'ÿaׄz)Uæ+£”zÉ1pFI?þì!¨‹<9ŒÚßiDß?Ÿ8îËÃ[û{^O+ÿÎW¤9VÛÅäM-¶I•ô…øMCH[¢ŽO“}¼+@ÓDɃ®1”cIi&áÑ^x§Iå.‡³ˆÖËÉdÎ+1Ò¥£3¹¹nÇ]ÀûQ»‰ þ_OmZÐËœ¹ÝhŠeŸmº§‘‹~ÒíæJ ?ŽÍGØ“5N¸(»IÄŠoò4@y ¢ŸåÆ¿M×LnB¬¹W[M"k›p­ÿx†P/ êŸQýcªã^\ÚÿÆY"ó˜ׇòutStçÑüÿÈ]Œó‘݃÷‚°¦ü£Éf¸Êåä{ä©É¨|Žñ3{É4”¾L(í <8Zf:æ¸{¹E£’ù¢ÎŸ·Í7îÁè"tºûÿÀ‚}9q/_Sð^Ïz|áUÎŽ²•ÈÉeŸßG¶AËùGª˜ýˆh¢ÔNÔ#ßÄăK 7w Y,.ë¹Jí ‹OÝ¿¶s0†èh‰/&r‰Þ›E3ÇLæøúuÉôv¦­ÂÊäIÊâ 1Ž~¤´q6!‡ÄÑoQìñûD;V> \§hz¿I®ÿS ú ÛmnÅ1™KúÒ„¼ o "[NDh-<5c#ÙÒ × 1‹B=&€ÅÒÊÜmî$(q"^ßAvVgg9™{Mˆä5BsìBƒHOË5ÖäÛcÎG2_ÑŃ#AʃíåË땇SÍÝ{þÐ’âäÉO57í«n®qñhZ¯“„iäk…™z®ãòpy$^ýÎô9µüó˜˜öÅzEÅ<˜SÙ.úÓw$& ÐJÑ¡ 5yÆso*ˆ·¡5sDo»…é3m0ËíÞ§©‘t!uÚ‘TºÌQR¯å—EwýAtGI³W)–pdŽâéâwr ¯bZ³ øeyzÙØ_§­á×êr¹hQJ£˜§u$Ñ–LtÄx÷k¢?9’†H:ÂqŸtvQ>ð š{ÜŒ\¼Ç9ãÇ*,¶Ð|ÝÂ{ údNÎ Hcã#–ÇX°%ŸR$½dýFŠš÷Ee?ãlë o}‚2ˆcò`U‰G3‘ï|)÷×éi# 6Ò4gù W ABFªÚB±Ê¯%%Ç’X$Ùã§ˆßÆÿb1…/ðUL éø<ˆ‰u<ÿÆ òÄăcô^ƒbB#Ýòã¶-kÔŽ1Nhç_^¢}µŽáµQ” UáÏ ¡Ÿ9¬ÝFïc k÷k40ò¡Ø™Qš,˜(„ùD–Ñ💾IÀ%oÒˆ0r·/~ÄE»¥ÒõTþ !F‰4HÉú†ö&¢Ùd“¿€¦ÒNMh›‰Nò†Ã…ê84CÃèxã6x¤3vJ€,3]g¡2Xx.SðÚÔ–κ‘JXÞ]–_íM¯´>!kyë¹;†¿Ë|ÏÉe…s ÙDù’…hjD•.bP†SêF&½V²MCÞ‹:>Ð`Õ–ÅV¾&SqG,?û’Ì"QÁo ‹Ëø'@Yñûø 3žÁàbbäAÌ>‘Fü²æ&&üG1ÁJLò¿*ú–l"zKá 'ϵæãéÜFÁ9#fRrjuˆßc²`QC3DO„¡_„ŽÐu4/•'ÒôU˜ò°”ô„} Ù 4Âe ¥Ú7*¦’›tV&úÕx<ö«ÀyÒ®áîê¼âŠ(žUvÈ©x¢½˜ô¥ ݸà'Ãå‘+h¡5Y<ÐS§Ü…§+¹•œ©Ì¬‚°ÞÀ|'ÑL3:>_ô¬˜X,²Ihn5ÇG63'yOïùá—ÿ­(UŸ%‹Ä1iÐ1ÒmÂy?‘ëZnù$·Ù†#½·­ôùW¥¹cº‰-67™}„õdâ‰ÿ9 “‰é®ôgÓË¿ ”¼ßritŨ1ƒA%É ÷7ŒAq¶ïêK&òà^ÅJ¹‹c¯%=GQ®¦·ù´}kT>òðÇx›‰®q÷­Af¸_²Û¥Óé„[âV>½Œ¸®`«‚¤ãu++rv2]:•øã´bšî͆ë’â8ùýÇ%éIé]êå¥Ë¿×*ãa=yõ@Ž©T#û°|?h¦;VŒ#އšäÂh(s:^3^ :5ñ6îÕ¯³ÞRôÙ àš%&ë#"ëgZÂ>U";U¼²,|/"¤AÿÞ[þm%H©c†ÓÍŠ'~x°´ µ\½'P Ãê ŸcaÂa\;QÞÂ¥†|¢¢ôIu­yÄ›ò¸ˆ©ä++ˆ>ºÓ¼$™~®áš#ËHÎx'<,—QFÍùE1édÛ)œ¥'ò9@õjyð[]2êÄ0v‡L4¹ÄK¬NGðžœ' _Uøb;r¡h™6ƒ’‘Ô ºÖ'{ê;ƒ‘7ö%ò¥Ô8©ý meIO^¹zZ šÑ¢GÂkŒ7)‘ŒcȬ–”öA†å¼ûç“ßÑB”V§_Ï¡Aá`ÊAP2NúÇ”Y-†ßöÑ繡E@t‡~%ˆNM»iõã£mÑ…:ë>µVq;7Z¤|$Ì‹䈌ÇWEûÃp6á×úL”¦Kt?Œ³Bâ²ÖjŽ›YíˆÞY‡©Dû $²æ¿‚ÆÔºðQJ¥ÇÏå*B3Ýz€‚±Î‡)²ÀÃ䋦‘=G4»þÄóð¬JËhPÂ"ˆí˜Ãø´S9ÿØ÷’Ú¯§¦çS´ÚyñjSãè {Tç×ì© 6ž¢ÂØ'Eg 1òʲ›P×I±°Õ^Ÿ&¥ @nÝü¾çJTpÇË›ð#ÂŒzG…ëÆ“šhùj¯”Vw“ŠhI·«Q‡|T˜¶Ð}á…FU»£~Nv“ÒŸY‚€Í¸ ¹>eÇЫ†Üun|§U]yËÔr€ ^DŽÎ—P•9Ü"ól¤íº³,K\Ð~sØxHçx|‘+|?”k -‚:`”ÇYÎ1±± žWÀ@ä9ƒI'¥äùÆ_ÐÏÍ ½¿ëCú*eìQ—É`C£€Dü‚*çœ_‰ú#|_ûXÎLå<Ƚ6deÕøx®ÛùL4•÷ÐL˜ *ó]àVeaDôÏbµÌp¿)n É%1‹ ‹8`ïý‚”¥2£›À-Ì–P`EYº_1j24ÍS,FþehRC9¸^ /¹¢¿I!ô7©„c ÍÁ‚Áÿx±·.$fÖkn˜ÀüWy \¨/¹“´Y"°ó4ûÞl8¼‚\›´ÑLÈh,¦.MÐGW}Ú“ÅDº±ˆ3QÛ ÊæYêˆ G) ‰^Çp1‡K?K¼?ÂH×ü¨Â62ïK¨¢‚>¥#bÙB˜(²ÄϾ ’ˆQst£"LéyEç3ú³ÝBÉY·C¢_èŠË402Ã~Ù!Äs~;ÅÀár¼ã"É;JÐ ùËuŠºëð¾ª&_99.ÙûD49Ï6Y–þs„awÙüÐ\ðÌYD$M6—›2uÓûM¸]G ©­Ñïx|¿˜K” ƒÅ ^Ò›èöGóC¼%ËKI² ß7 Qé’õûn7K¥rÝMJÄÑ51N1 ß 2c¿”#«ãµTô¦0îoô^¤û¹¿œDØ;.™mß8ÉRÕ á‹O Z6`ÃHêsæzHfU™nÁNQ7rÚ%1Òs`¨ÝOD“yðš>©Q²ÂU ëkiÆ%ÉÐ^²mf89×SpKy@¾Ñÿ€6H¯úEãŽ_ßæ’’àpúÎ|HPFñŽ{Sy- ¿^]Ülñ>çoR nRYf&½}D°ÃRVoŠF±µ€ n“]Þ¿“Y:-t8Z42™¨ZÜ&ý” O„Ñ'ÌeEƒ%0äá»,›¨d4~éÏ4;?·Ã •E|Ç"ɺ-§rçLû¢NŠÚ`%c®œ†f¹Þ}è|!HOZmË?.IuÉ èŒñ9­ŠÐšs\`ÚbzðY倖Åê~†qÑk„7õ4ˆ^Ë—jÇ0Åô¸-.-3O¢1MZ(N ¡“NPÙ1™ÌÃâ–,I¯r$knGÓÔ#J¹Ÿ`š^‡wNMóc¸oG­‚Ï’…ÄÕPäû§Î½Kš×—mþG\Év‹ÆڹǰÚknGX„‡$ê'>XÉLjyOÔE‰]ÊC%ýÉ|í¸/KèMvÓ¯~ÑM* 7ÍÛâÚS_cð0î§Þ†B'ÑuQ)_«ëÉàÑxØÉߥ¬¢:êÐŽÂÈ o“³÷-ɵ×+®1õ%óê ‡wš’nô½¹£ï*üã*££Þ“d“ð8m‘^{¡GW@Éí臀Ø`¦Rj¨ÉHÞ©‰ãz#–Ïl&Cí1HïRº« R,CŸ3yZ¹Á/NI€U”Ñ‘××Ì×^ÆÊWÏ„|2yõq5 L',9F¼C-£¹tãs&wKBÇá2VZëc§Î£@˜î¥%»Dõ<ˆÓùé¾uóf,ÛvÁA2<˜Îƒ¿ñ…¿jÏúwÿÊ¡ºÄ#ãôÉIhÂðn¾`Çže½©øÕP?wð!²[¬A'cAC¤Ì‡z¿ï]øñçÐ|V’ºÛZKñ¹½¥°•jת3nR†‡d.Ä,*®Õg.ÿ¯=Á˜=*„&`LÓgùžó›â;éá‹Ô4>¾[qºÌ}ã‘ös3† ¹Õ(O3OÑŒX€‡2åi 5©L%‰ü£ÈˆþR müö[¦Ó.+ç049h?· â®"ü£ÌtÅÃx‚zƒÇ÷ü‰N:÷Øv%¾Ñ½îìmûVüš…\¿wd䢩qÿý¢]»—´á=¤þžÂÐY››Ao¯*HêòÑ”8†pÒ³…ŤyZWÙ»d‹–%x›——ŽOà.áT~ò¦kÿ¤.jYo[´Kì &óàaCÔÍL²jŽÄé³[„týMqê^ŸÞ43ºp5±h"iäJ/ú×¥™ Ç6–X£Û/g‹é&eØ‹‰a.duy«»‚|¤ÑÃ]„¯&7:ÏgÑ̯Ãýó™”風cê¥3èK}Qsž›ê³§ÊùÅ é¼vLW3JïH3 À¬g?kÄ1ƒÅá3'ÒŠJ!v wô-h‘·ð†Ýe½#†J‘ž%uŽMÀj,9#$«ierQ&ƒ½ï~AÑ Õ,,™0T?bYùBfÖªSí‹_óë ³ÆŠƒ êÖæA oŠü'­±2œ0iXz¥ØESö¦s}UwZ~­IÖ¢¥M¥ G°8Âg*ߤ |jóˆù†Ãi§jg8.T”ôV]Ã-¬2ñ¶²qÿHµ>ž×6%™œóm$Cþ'=^Þð+Ù–EYªË"È=Þ—OH"[1åkøm༔ÂŒf<ûùÜÐø~³ã¶HBÆf§s½+‰`zÙE .4½<š¶÷.*§?jÉ‚ÆÝ06ÐйÚå> ¸ÈÓøí~ÂÚhQ‹Ó^(}ÀÒýÁxPý<¸•ìÃdúDï[#_–Òçà^|Ñ)ö”~†E¾µËϹ³—m¹ìG‡«ñÀ,s©†ÓE>æÁ.Jû ÉÀôiÝ#O‰íäXdatX;cqÔÿ”ê,Y‘GÔ* »I9fÔ¦kõ¿5óg)Ýp&¥lÌù$ìŒW [–Ížûç®{¤Ó×qù=\}Ò6OH†—ˆƒýjÊK3óù¥Ñu‹§$4ï < %å½ÇÉF’¼Ös–ì±¼J‡·dÈÜ¿šò-ÔØ˜ckŒ‡ƒ.æ=Ý Q40‰«wš:'ãþ™°}½jäÍZ¦ÉÜ׉dú¼®CÅ\9Ê·ëOf–ÔœðÑŸjj^7^þžÏ‹—·4X/2ÃkÂZ‡ã=£«£˜Ñnz:¾øcÁþ&«êTÕ¤.KÒjÒ@€èÿ†Ö.œ¹D½ñ÷-ߪãÁ]&9×iwÙá 4•[* Ð46wpS‘K)mëzC¤vÂÔ ¬)PöìZ"òaÁ†“˜±­®î{Û(¾Ñþ7²}Ú¿Œ¿a£RÎGú6öÔæfa o€ ÏP{ìî#ây ŒÙñ›RªîŠ¥’zP÷ïÂyÐQkÞÚ"sTv$ Ù&¥·Œ%D¯,ð¿—Fd‹if¾‚IÒªéÕñ ”Ž»¼¡=XŸ#ý•T¿mÉÌj¢rCÙ:™ãË?bñiMy¢Àt¹4»MͤÓ11Ž$9Ið8ƒE$Ï¢H[ŒÐ)²Èøhªš¥<ùz«x úv*ƒq¿‹1­šÅp…h[%m˜ˆg©Iß‚*Eö†1;‹atd;ü‹å`D+½Ì'GPç¹´ƒŽ>þxgg'4ûÄlFò[{ó N†›?RO'¨*ÿ··/¯XÒÑxëÈݸC<5çU]&›Õ&IÛ!H€D„°¶â¯«Nª|ž ¤˜~פ¾1ûqŒæøÜ¯´Vê[ùBîȃfe‹Ælýv‘çî§èK«=2¼±ø4'ò–8Êü[A"Ÿ˜&‚!GÕ5”¾q 6C<"4Æ…á)F…º.òa¹Ž–)τũFm¤…~²¼ ¦>PÄ5S}s¬ñ;¡ª L1Ðñy0†ÚØ)Ì{ªÒJŸÆÄ€'©L5€ý‡J—Ty}MóÇù É‹q´¿kh¼ÂÏV º/·Á5TÈ£ó%Тc Ñ¡ÂB;_òêÄhšÚÿzÒ7ÞVðè¸íW¸÷…ÔS½E9½Kï§´;WßE\|°6c#Û!¬Š)sùßïëñ07ã[Ž‹Ì'òˆžª’ZºñBäóÓ®¾SY¨ÏOæu÷í|ôçRQ‡:P­=óq{œw&òà.cØš¹â’YÍÜóÈ"ŒÒyB‚›®r›öí­ó·Þ&,çâ¹!y©sXa}Î*í*T¦ŠÞ4+Ÿü £IêÕ¶ÂúC´ìЧ$mÃȬü`õ+9B¹# j»|zYM9 !U©ÏXã–à/cHob²·Þ&~‡Žõzç1<˜ã~×C ]Ù_ëQoòŠ~íVžÜ®7F8eKå®i›n ážÕåõD‡„ ýE¿â]iÓÚ©˜`ùõö|†ÏÑ!vÙç&òà9"G+4'8oÞëÚJv$ÿåzñC»3)-¥ÏöãÃ*ÒõK¨sâ>Ì0ïÕjëÍÏNü‰¹7%É–°òY~AÚ‰ÓAD#üÏúcT ÕcQË: _×Úx\7†Cµª/­s4 d½í¸Ö"vC2®nêfÈŽIÿÓE4ø6™³­½>Na\^àlíDÁÄrë§³ÆíGRÌ<å# À]9÷[íUÆM<ï¨7›dn1ã¿ièó“S›êcº\;½°Ó>7‘1·•<5×{Q0›y0·©Ü“îErQgBåƒ:ò ³ B­¦9¿ŸW´™{ˆCèßõXDä’ÿ˜a.ë;Ë`ª‹œBí-dOÈn¹ëh]]Œ•k‰nz{b‰½VûýyôGÝÒÉÆG¢ö6y8šÒÏͧÁ98ïãj¹}ŸLÅ›¾©ôA|mÇÁ—ù´‚x¦ÎG½•Æ>íç)Ìb®`¥ŠÒ Sªxõf·}njÜD&ùÙÅrE Ä6>Í„“?ŸÅZ$ò·~™ùn×… ûðéÆqMËGâ{¤”ˆ7g]MMâe 90Ù|½âó¶êÊwl5cBöÎûã÷ÙÛ?qÜ— [UiØ{®Ugÿ…òÂz/ÿšþ3è'?ðiÈÅ)åpÜHØQ¶Ï>Ó(Õþ±<6y‰ë^Þå3¢nݰïz<·ÂA:ÎëLË×–×͸œ£¸W ¯7Ì F|¹qøäÃ0ǾG•çUû¸ûjéžejŒÚcÿ•—Lγ]_Ãu7 ±¥®/ìÑùú3Ù ®äb…/ ¸Zªr'Űý3l1N/{·ë”3|#°(Z ä‰1ØÚøü3&ó†*¬“þx_¾}bï¦Í{OÞu4ð¦×áõÈ),ú|?'@’›Ö¸Ö²D3§zŸ œ…~ÖÓSš£}m3R¯çVJ¥·ô-·~g[Eð³0f>©¨ „‡–žŽdÄÀx0QÁôúƒ«‰J¸ÎPógu2Ízk\êa… ©‡ÍW5UŠÜŠ1‘“DE«­ˆlÆ&c>êÏBk\ÂÖI Œþ“Ð6œÚƒ(.òþTÌó ™j•Kí¢›«&+_m.dS,Á4ÝúùÌÌŠ>Jµìx´çÞ¡ÿ ë#ƃŒcÃz>hÄÙŸ÷òÜh•+’%Á&X Zk‘ß+¯!‚^=Ù¬±g̓ԑäTÛÄaN¡±¬2Œwéú5¬ä»øœü–Übõ™l`–ÉaÐZ1¤"ÀD6kìÏ(å9;˹0ð†â¸².b`<Èx0.8?$Ý:rýzÞZWCJ·@Ë]A¦i¾w¸hê7=žÝ»þÏ­ma… TR^YȘ0Kz0=m7CâãÁèK&è×éyé}O$øþð¼Uyv+‡°ç°LýãOn«¤CL²ÞVØàŽØâ>[ä¶Ç.Þ ZÜ_ñŒU›``<øCDm®À/–yäY³²‡&f´6N¤Th6{É'Z Abˆ½ï 0Á¤/y"LnC#Ù2·9*8Ëyäײþa`<øœÏoX-ȃȾlm &3M¬<øT±Dj°€…ò[> a o}ÊÆ$áç(­T”¿ÏÔcÚЇUÞ³unó™£Ëh‹Íd`<ø#¬r)üj]ñ11ó`Tr€Í²ÖM–ʸ;Ëúkcsó’ýs«)ßp΃|EÝ[ü“è­Xû¼ËcsœIcázÖ; ŒcƽSY!ò™™Zí”B÷êaÔ—… m€I—õQ!3ñ@i„)_ð:-€çjãóˆ_È7tLØEÝ›R+o`PáFÿ¼fF¼1C‰“µ%JbÒϬwƸýÐDÇASS2B¼Ò€ff:ËxÐJÀºìÒ£ÀÿÈÖµÃb¿ø­>u#ì³lÏÎ…°0 4I÷làv\ÔÒ—|Ǿ\ÑÅÊÆœ`mž°-#~8ç)> p&òʺ(WôÖ= Œc%½VÁ:2šGÛŽa…¼2Œ­…2D;{#jy“ ¬Q;ÆM¸aú®4éÓœô3Å€Èòù£â{9QD5O’Ìg{F|‘Ut$ØåwšH¹ÅµÜVòÔ‡Ù­ƤâŠé åD<ÈÀ,½–¨w°¨¼2P Ð?N|¹±W>îÍv Ó1Gç/êºiÙ’]7èá©Çî ¶îbÄÀxPè2‘å;'áAÌ9bÚ‰QñÄŽÄǃÜXrÛÙûg³‘çYúGß.i].G®Ê6~5ñƒ‘É”{ôˆ§6X‹ÜnÞíz¥f~*òt8Û5LFt€J¸‚üód.PiØý°à´¨ý÷a=ÄÀxPUÈYÂÉxð4y\‰ñ µ mƒ që}hº Û×5µ¶ê÷"“ÃCè± kü¾o0¹Ýf‚¨—%4kÙ¶a*þà6M°òn&sè®à¾Ý{ë±b`<¨ ´B}”ó`(H·ÀÏ­rb<¨H„chÇxd*’ɃúŠŒQqØó€¢òÖ;dŽ×Eßp&4(úä72x©‚Ù¾a"†”N%ZJ)*Öîš`ú{|RŒõãAe¸$çä<ˆÙ-=-ñ{'2ÐZ¤™˜ Xÿ81ò Ç),Ø¿ Qó¥Î¨+oýF®ûM|¾®>Ñ\$QÞÏ’Œfû†‰hL$¾ÌÒáó{&¦3N§²»éšc=ÄÀxP^DòVâÁ–*Wö¹ -i4_¬:ÄË_4âÁÇÎx‹ÞÐćîZ>M6¨ÛKD¹T!šâú‡eöHÿb®2&¢Œ>•ÚŽ[*J2ê‡ÿÕe=ÄÀxPYœBå<øÝ £…~r]•µ_'”/¥ŒÅÀšÓÞæIØÍƒÞT½û:€âòÖ{®ñ¡®ÙdŸ\βÃ4ä$s>ã êE¢~ÀùÈ*N™Q¿XyIƃ1#¶Éyð y\ÊR¿ù´Í_³-<«ÏM*6ó,‚SDŸ—'#]OÉ©9À`ykSó~3p©ˆ$rö Qݺ¢øç'nù[S¿þe=ÄÀxPãðø@+ãA<°f±ž„ñ‰ðK0Óí~J¹nZÏ·ý¤PŠãˆBÓ‹õ´I¸€ÙÎù'‚¢´ˆs¢ê“„².b`<¨Œ¸D¦Iyð ž2ügÁŸ½D«Ýf=ü1ìÍO&¾øß¼!#ÖX¹ü_€R×Ðë. Ç|qA€ƒòÖ© mÞ·ŸW6.˜·Öìö0çaåç4QbéÚö)¹A*LÎÎ[ÆŒa†IZžÀ¼Â]7¡½ðwGF0L6rå79Ÿê¬ø³§ˆ˜´B¢âWÈŸ/˩ȟšÙ¸s_ôp7¤[nÁ³¥›?!¤ÏÅM¡y¨yF<%‚Ñc.¤¹Ø²“ ¾< %c GCdäÔ¿,Ú¹{iOš9¨¹ŠÃDÕσ6Ÿp”ñ iê Q˜2S‰ß¯LÃÚ…©ÇLnW€,V½ŠKcZ—/R«Ó¢7 ûšõ€l·ŒÏ÷ùx^²aïF§T(ÿ¸‡ðÌ35ω¼| ð®$F,v´•^ ìa ×7+£?+Í×\k7f'O[1´Sð Gš€ @½ä¡Ê®p|ún.jÕdÔ|µÇ»ƒúl;ã寄5ëly=g\?ÊZ³«ÜÓdQ 0v¦@ro¢Ðæ|B{Ë`}µÀl¶Õ8VaÆ„—ÆçÁuYQš‚àààp[_ÄÓ>]»v5s¹lÇæÁ|´°@ÀnCCøo|ðÄ_vy;SÓ5%{Õ•Æ(xÚ¶ ïš LŠÁ¶íÿ!ž9h ù;3 ÓhÒÈÊÙ©Óë Ò÷q80[PqÑÁ|Tu²xTkµP1¢MùOGœ#ŽÍƒIé±À]aÓJJ„5íó~v¦jºhÛ«éÍŠ\ø.£êNNºnǽ&”·…6h»ƒþa/€ÜŒ8 Cü%ÇØÓ©ØJÝux•Ö<ãAuÃ}ÃN‹ÛF"…°Ó o¨”¹­3a6˜"o= IÕ}Bæ¼føâ2èGïÝoM ÇE7È:ŸÅˆÃ±î 0SÚ¸VѦÏx0d‹"ƃ¶òÅ’¶¨ öú‡¸<½_‹6Cæ=²ý•´P´/ïÈ®î|(òÅŒ‰E¨ûà»,™Ã9‡Â!¥úgÑA¶ 9²SDgÍÔZœ$ŽÍƒÎd Èò|í"cYm Ç@Å¢O‹*ªüÂ×KSCU¡ñ(wr8íaãê`ø  Ž¼µ3@gƃ¦â.ZØŽ0´3¸ù^ÖIvÁbÜ÷NùS¶‰øãoEûr{õn0:¬v–&†ªøãÂ'û’Gã÷¾:¾zá¶³JÉBþ·uÁºïìðžÈ„)o Pñ É˜†Õ&"oâ;6zøÊß‘¡LeÐ\þ`„O<"ÝwOÚ–<¾5¬…=è)å™ÇM”R­T~ŒJÒü®MÄãùe|1Þ›Ú»áq?D¯®Í‡[:ÿ4-ÄÞn«À|yë6€üŒMÇ$ºÈª†ôg”/¬p:,nz ö„,D=€¼z¦Þ“R”1xy"VëÐ.H]²J>šŒ×u®þí_ÔxâW Jq¾·ìLøE1uú ÅSCƃ±`ÇŽÿPy)}…ºM› ÁxP½ÀJÐUÔ•–ßó2S-p)/·aœ/¢ ᎖y‰VõAÍ×|í~ú³P&rJ™÷<14 úF&Ò¡üœ­ÃchˆCIÃu/av§ö'hV²«Ã±\©ïötkãÊÉ[É-öQé«™!F0T/*Ð)h‰(ÊŸ€Jù=¤çD›©ÅÉ®èÀøüV6[çz‹˜`{ªîñ\ä¿_ßq·<ÈeŸ™‘‚<ý%‘J4µÈ½70&À=Dz„+˜E^É~ÞðÊS\SmíéÞ.¸¼•6†&Ø­ðæ·ÃêÊ]¾õNƃŒ¿éÜ Öìã)ø–ó‚7¡‚¨aœ/¬Õ]¡ÍCþÉûaª/?áà¦Ë.{hƒ¯½U˜÷ÉÝK‘ÌL”ã8+ }cžç&"¦²½B:©œ°`gÆ­°£{Ó¦Wà•¿’ÊÊZss fr×Ê/lvÁŒšÿ‘]79çŠ;ȳïsèÆ,S±„=yÁg ÇóòŒÓâG„ž4·M×Qc{—AŸÍ(u{\žƒ¿|xf€tþ0 ·ÔIž%ÂQ|ïÐL@©QÅ8éú”ñù½\d#Ø!yÓj93¿^ ¤Ì¶±m0dé[—’Ö†â¦{DLJÅxñ %°)«`:V¶†%íy1¹oÆ—Æ×ò´Ì"'Ò‘¡~<÷BõŸøÆøx(>*Ÿ-šÊ[#HŸ :¡Âªü£ö›:1('‚ø×ý‡æuˆú'·~õg™®4-¼¤ª¡ >BŒuêÌ…MÿL;w݉ÇXÖåÁð.t"zf/’ކ¯»/¶ÂFÌ ”Ð`V‘;Çmz)LLèãèJs¦£mèY¡óMòp9yp)±õÉRÅRYωÄð”t‡Bò˜ü*w >WAD]ç¾uÿïÁ­[öŸy]áí_4JE)<j2”ãÝ”’î†ìÌEƽaŒ{Aå~»F¬‘*å*“iÁxP¶›vw«nÝ¿24ÚVè‚eŒS>™<_f-~üƒçÑYþOékù°£ˆÄ>tín­OXx‰èDî_8®'yÜ8±uÉÂve­êr¥ÆÉ^Ùà¦âû‰n‡CZmáíè—‡¡xöÇŸh LÞ:À™ñ 'Ó)œ3f<w Ïzá©ûë‚dó¹kÕûÍH®¡½´½F'3†HøŒS@sèfÑJ®L&Á.ÝK'º>)§t:$5ŽÈ)óìn!ó)Qðø7ÇÀcˆLÊ'?üD€,òÖ#ä{lPsVÕŸT*;Ï>aEœàù\Ò¶Ž°Ò5kÞ/M‡é)jФg ÅA$T4hš4T Õ ž,ð©Í§l¢ë‘¨\„>‹šºò¥½’ˆ­^o2ª[e "×'vîÙB†yÑ ¯ìÜtâR’˜†Š!+lã>§fìŽ $»È‹vO¨ájE,­PS[LÉOË‚à“Œ ϾòùG31~H,(!9ÝðÛ©Me¡’Õ©žØ,ñuÉ© u’ˆiPzáO=h_“îs>¦â{™FÝgòí;hJ%¾wÚnòÓ¬AdàåüØ–ÈŒ…x†ûgI*ÚXËÎõ%ãÁ8á ‘É®ÊZ§Z9~QWŒÞÉPy|€n3ÌÆø!± ’„]ƒ9nŠ>Ývz€I‰°O†¡=øˆþÙ÷Éî„Lx—ÐCDNôžg8&ÛI:¦©|K*m{í-pMc©ø:àé°)Š0búÉRê½ô;(U !"™¼õ€[´ï—¬>-´s"äîÏÉûW§6DT38>êÉüÝfÒúäL/t'öIt{Z¨sñ Ž »òš‡“l×½´ &YÇ݊࢟Ì- |b:õâá9™SLH:º>¹ ¥¦’°ßÉ|‰$ýРÖTƃFÔQ‚&æúŒã„5¥ä­˜âÚšq˜r-–삚‹d¥w`üH°U?ì‚B\…¦ó<ض†mT@rçæÇ÷Hª3†Wñe©4þ¼1ÅåoUßÇZ€¼Ò¶¯Åñú{žBÓç»…ð&$Ú_gÒ¶\"’ÞøÎxPˆ\¤› £§anƃq€Z Í·¬x¿]œ>?ñÒ`¦°uäÿ3Œ èjDqÜ5B„^™à<Í£GiÇœ®bì‰$ƒ„Ư=‘ÓuUî"?Uîû]‡*ƒ†§Ë½Üʼn£ÈDpç¨`«” *æÁdÊyö´^Šñ—Œ° ¸¼õ ™lï­x¿÷€Fj\I«K8á”û#§MàÍ"q šøÚøíö3nñþ+\lUkG8Ó?=]efH2.qO'ñYz³ U}q­!Ý%Mãùá5fS¼D^qDž|¹ ü £Ð«Ø&i¶Õ̃d}¤UjOcïiy­ÇƒÇ’ËOÏxXµÚevÍAþ‚FNà@L9Ù×^ìíÕ§ŸG2>‹/ZêÒ"%¿Æ2KëD9¸2¿KÔÝöâÁ;åõýöÁËp;¸ƒq|‚<ÐI¦¾xŸ¹ä-s¦iަÓ:ú aëQ ö^ÎÝŠñƒdžu“mK9¬î¦Ž «±zZD?>ݤàz]Á†k#Ûò⺓@ß­äé‡ b—©’/YÙ9þGLœ÷93ÀŒ!ï„Ð €’Oþ.NÎÆVsAÅ<ˆ' ]åÍ]±Ø9ãÁ8 j.Ri{6ᤇֽã(7‘o Í ôb6õ…¤¢¹<æçÜÉÒ”h¹F­Ê­OB—§Wf]©nÌ:j:Ró}„ydjþÍEÌ l}“ÃYÙ;¢SI’÷_%bÏKÂ… Doë­JñaQ§Ð›ÝŠypOJ[O¡ñ/ãÁ8NPò[9ÄÉ›ÎzØ !ÏgþÈß9uþÜÉù9ßG=ãq¨°±œI?‘Ñtœle£CèζèÂ^#‚c0ºÄÀÎsùj®ÉŠW2†X²þqtÈ"”gVŸO†Zìû³ «ü³OzgôvÖ¸T\cÃP1czQßãâÆ“hEüÆx0ŽØCvòªB-çjÒo­~ÏQ=DÕê™fÍÄ ¿¶_ÚJvðÀ톧·K“×»°MÏTБOOKÊÑšõàq žO$š?Ù¾{ˆßuSšfX=Ps~Ñ9Ô¡¸‡ QÁÓžT¶œgߓƪuxÿÀć tô·‘ÒŽØâ®o•5ìƒ.]Õ“)ýBt*?iÇÙãkºa1(!~é)ÑZ² ³A…¡Û ¶ë™ºŒ«Hø¯¸®¤Ú&Ö?Ž<ñŸn|:ÀÀçµøMoÈ›BšŠÈŸø¥Rvøúc—/ß0¼¿“–µóC«ò`t첚˟k¹ð›S° ¸ËbÝ÷«5ó¤LS¤ùV­…O9IÔҗ߈˜—BĈô\rñAjd€Ô!ƒéú Eʶ“´+èA‰Ñ‡Žc§ƒPÌÓ˰4&Ñ!Þ*yÓ ¦Æo“*¨dI)ôÙÎçŒUyÓNäsY¹êº$;ÈV­±sªðOAtÎãÎûéÃ{ÎòD¶È>‹u[}1” °fbeI!žJ^µ¾ÖŒÚ ¢—¤1n¢îî0• à?ykC€)|u*e}p% “°È0dR}ð¤=ßÖó>h4³sΑÙ K¡ÅœÂå ÉõÃgÁOrNµ—«zŒ:»Ì†Ò¬í¬ç0EÆ_øœ×ÎAx‹Œ—:·œÉ›{ ¼•Ò¼kSbCaFÆdEµ[-"ÖËó.¾2áäåU}'ã}¸tý†Y‚ï•q­¶Ü‰:ÿƒ‰™ñLxz¯Vå<ø¦ÙÛéŸåÐÔµGƃñ› ¹°ÀõÀãËpwVïñÜ—@™•ðé-ysg€áäOY€Ñ²×.’µýž…Ih#ªÅ¼§SJz=i»ã'Žxˆï$ùM6ÎDt¦=£I•‘÷#MqLÅ«n\–;PȃDöZÈx01" ³{¶2dFœåà›ÀÊu™?«üMþLÈ&Ë\ÔGVi!6tŽ‘g«âúNÿ$¸¤jqrI_A•Á“F†ÝFõîÇíx„¢Ž ªU s©o™õk7fµ›ÀeUóàd¾ Å<0•ñ`"F¡‰ô³DHÊ‘°PÊ#år¬/Àò÷¾³´n Ç=pSËæmGø‹_¶^¶ñnLÿÌUÃåMâÝY2ó>`Îo_ш¯,’g˜Êõe5óà>!“÷x}Š.T´8ißûãÁxà&Ù­z‰›ö;+%­0SòË÷’-›:ö sO¬„$:"‹Â4ëé2.ð{ä¤!ð<ÆqZšQfˆí/NÛmw6â߇5ÕñªÇö™7¸¹W8оE“}F;WrŠtôzŸÌúíáOOº®~?"ó`4Ÿ¢‡„ηŸ»Ñ\õöIÈx0hYêfO&CÊm>÷5ò‚Ú 飗DÌÏzWðRh3–3øˆò¬÷#qãgÔÂzÚþâF¡¶rÁ¨éeŒƒšÚ÷ ‘Éük:°×xšM¨§{Ö™¾åÀê1%QÏÍžsN©˜÷Òr­Ò}n-¶µë>g<±Ò`’\¾?A_Û ý;qÓ¢œáî&{µßjƒÐu‰ ôfca2p§•”¢ã–â:®aóK;H8º’ÐÙóm1×;"?%ÓÂ]rÚuŽ|ïw;›Ã.Î=ôkàrE4ø¾M|STÅ<Ø )òKõãb¹`<è`Øà%ßf&T¥¸ïPQ }Ø …þÉ,”K.ªÚ!;Úà“Z‘l,L?eùÎ…üÛ©tzÿœ†þͽ¦pym}eÑùò‰“œ¾ÏPþ‡šJ®|”‚Dv˜ûøIr€ä_1í_„ä+D)¾7âÀŒÁ]~›sÖs£«˜QúÞ-o>KšK0Ld˜L(HÞº0ÁÕfc!/cŠQí7‘<¼-)ïâ‘9?<ņÂt`ðTíc8ƒÊº‚wyËlë+ÛB”iènra'bY¿N²\ë'ȧZÛßÐ4&“ûЍen y_ï´Öç êïx £Šy·…P­o¤9 ãÁD†þŠÉC™øÅ0-ðo|áìè£X;Æó¢àå‡ÍŒUd!ÿ>6ñAÅ  €ô¶¾²æå߀*±X¿]òÈ#=‰Îkw#sŠÌîU’¶Ö©¿Ißø½«`è’Nu4PÅy V7ƃ‰ mLQ´ RÒ~qÔ$:§bm÷®O릥=/~Ãù|”ËMÑlâ…ºíÓ³Õ²#çwÍ®Bƒï\Üm/φu—¬uÙ úÖM”7ç𱻑iPFÚöÆGžJž/.è]³û¯+PBlùݱ¦¨ŠyÐì=Jídîú2dú yôAŽÛ”N¨¥4z-ÇÛ«N?gƒñF=CAúô%«KÅkؘd$—/ì6©åúkrebþÐ-tß“7WÐØÛ‰L°AÖÚ ©¸å=Š‚Ù6ñþÚ_æ ¼XÕ±ÖƒŠy0§²]giNƃ‰ –:D„ŽÏ®Û§=jb]m~ÐB¼JÅ—f¾¶é…ȨÐì p-æ½R> ,H¦½ ÌyrÍ_e­;¥†¸ðòä–{ã×>TY0/ãAKJ‘ Uqþ&Í5&2ìð Uš"¦ú‹^Ù l‘r ÇŠƒ¤n-Ù­ß”­¬<ºE09¯æ¢ Lè=æ› /l@…æŒGbþP´@qys@:{˜•òHP¢­µñ¤a¼HlEZê°\Å<¸ bdÉ >§VK>&ƃVÆ.“6¾Hbbü v³±(z±¬W­+íÃÌëåì$aÂ\wìL䲸ȴ¨käVêØÛĄ̀®@ô®Â$qüºˆß‚É~ 9Òq¹Šyð£'z[7~«Š&û®¾Äx0èAšOæóÉ<-!Ú+¼bÝj4áû»hO1ºMEþ÷;a³ ‹×ù 7Œ¼¾DÚ85µc@eykUžžH.­+uÕI1¨ñ €ê8dÛ)tÑ=‘ÛúÚwŸ3Œž{ÊNeÖk”#bÂÜuÊLÜp`Ý_ÅÑY#ýUÖ¯VÒåA£`ÍÊ}DÚS<µÙ•ÅÇ_OÕ …D&{éF”Äwö62»]-žU"/‹ŒS’m~aé|ED]–ݨCZV«Ú²ÿÁ(n@ãAëàµ!ºÆ'ÀÇpÝÎûœñ`|Nkõž„¤±.d#½÷ÏÌ à.Œ‹ú›|AþֱǀIÄ XÄþÁÞÿ—l³ÿØêÒ¶’­å¬\Iúq>Äq$‹VxÛ¡xž`±¬±™ø8ð„>Îóëhƒ§Sà÷ÈÿäV¦î:¼¯ªÉ…È—ì½ÏÆ osc(öZþÎ4ÌÕåeŠ“Ì@¢•ü9¤I™u{mæ}W’¯ËúÕâø æbZ‘¼O*Â;é+üÞ‰§AX‰/·Hk³`´2ÅæÌg)‰¸˧0Ô5¸.<ÇDšýv84}²…KÚ®9‹Åëuî±ë’‹B^ˆyÇq樺yÓ.É fAÏ¡vßçŒã‡/uùÊÖA<背¦HDO=øÐm>N°õ´ê ôëWKƒp`¥&†\juz—ÆPB§¦h—Æ—ŸR4æ8ð# æüèå#~£ç½~ŽÒ văWɾìdû?œe&f÷e<oÜ])Ç Ý^¦“Zü×0d0 qâHŠV®pzF4’G¬{,ŽCxXÜU©*}H,€Þ™õ‘Mñií›ô{PY¿»CT?3øhRv?wWŸô?'ÈÜ` ãA+ ¬;žDó)DŽ—Î;ïsƃVÆu ™Iüùàóù}Vi9`=*„CÜÃYÿX_0í§mÔϤú?€¬ÔŒŠèe6êYaÁðùÞÅš ZáUhS Éj—[ŒLÀt€â¥øŽ%õ‡!n™‰L«Xw†ÁìÐáMˆŠ¡ÎͲÉuþo^ÿ﬋Ô΃r‹öj€ÒŒ-?Àȃs©ùëÈ2`÷exZzýøåIñZ&Ûó߬{¬€ì’MÔ ‘¶9}:•õMñpb¹É’å(?)† ÜòIeD˜j%@)ƃÇš€"KêÆ‹)Þ3¾'Fbõƃ qG €¿^û4ÅÂKPè÷Y ¦õÓåëKþ™u€òG³æz7™´C>†Õ¦ E•Æç,†Ó–¸TÛHnu.ǰ€2 Ð'5ªx4b² î¹´©Ún$o[Aã[D.e_ êÓ1´,ˆé­¢åèjelOÂxÁÌpI ÐG׋z¼¥iЂu¥± *ÇE” !ɧ‘ÿ° r'€¬lƒvY¾‰›‚3t”¼- èùÈØò¸oÝÖ³âοGŒ˜»ëãAó=ÛßóQYo kÓ×±f<ÈGDPßP'7B‡¿ÌèÛ¤J³~KøHB?€d¬{,éõÉŸhg þÃE­ð1i®0õ‘MðÅ`ƒ´q-¡·¯â&/j ~StçTÓ°Z“7‘&éÓ]Õt§½5ìÕqFÅ<ˆŽL|.Ñ`oCÃôù> ËìtäÖkÎÿÌŽcº =5[÷òvç6¶B/€NòÖö}Ä-N8T«„|ç¿v  ¤˜¬FûöÕéŽ04+îÓü_8î_ŒÂ­Ê7ji‚µ¹ŒLCj-;|ñÊ1|¹Ñ^DÄŒn±Î±0¾‘|£Ç´éî¹Ý‰FNþLT†d°¼ð…˜"ËãN+%ä­gA¯þ8.ÚE·¡vŽT_‰Ø]÷îaƃ6À¡fJ›aãÖ9–Ç2ÒÑIgDp³ÑE·ü|,;¸mŸ(ÄÎgm†sD{#m|åbÌÝ¥ÇßHz§…-á(BÖpy!ýüc'€Œ-‰37C`ö1´6"å¹µM§Æ†k¬s¬€‰˜K-C¿íÓ½tG.ü¡G“o¬ol§f¤Wp¶è QªkDcp„F“þ.Ò +Ñ'+È¿µ4Àƃ ŒUˆS4ŽÞk±%ê7>XçX;ýåyÎ!Í-ëb€ÛÿÄM']æËÞx¦„Íñ\÷´!½s­äT‚ß:0d`<¨B¼Òк?š&ú?§Ša<€Ö7ÖÁû¾nbt­<'„u‹M‘ ¥(ÌÙ#åïÜÍ ^%š·-È?žÇUX"ë|€jŒªEº&Çìj¥F,Ú0gJÍ× µ=lW§ÖL›¶ö¿H;‚7‹ëçò”»íºy|㮫_ؤ´9N¹IP±?ÀuIššPX¸~/ÇSL‰·ZÈxÁ<¾¯w¼YË4™ùˆõf\ñ'‘|o”•]j}ÅÕjßoî§ {lyš#ƒY±B+]N¥›-ˆ¦§YªüÎ{e…‹'ïmަ€ž-ãT€†Œ,̓¡ù¦cù3¬?ㆷIúh×ç4°`…ÿEUS¶© ·« ©»é36’ æÄ*ꯔµeÿþ-hy¥$kbVkë*†8Uàκt—¿­“,?)ãA³óà±´"¥¦ãwÖ£qfkŸÃq×Ç·©X¤F‡ùÏ9mÒ²QåWͧ1ö*Y¯^ Œ2€”'ØH2˜Š ÷“b? # Ý=wĈ¿wêuפ–9:a½ŠÍŒ,˃ó$vz(úœuiœÔh²Þ5ÃAÛ¡ÄÖTåþŠ|ãÝTÖ Ýa·iŒ øÎUíêN:=¯ä“ÖÃG²m“6®𰻌_ŒíŒ×ð¾Z.…j7,“ŒŸ½™×]œð,†mà™0b-Öy. òè5GIcLqeL‰äI²vú7”MF5áÛÒš´®[õE&&5h '\"nfhew]Àxоxð²NØl+ijâ¨|O Ö§qÂÝÜÔ²ØrØ„ ’âÊ*OÑ™ Àï2ÇݙڣnÕ6¿îúÎOj—iŒ nÔ2š0Ò.a¹ÔTƒ¨E©#“b®IçåÝšˆTÈèî2X’µ%ðHp„QÛ¡°‡ujœðµ“À ì>Tí>2ÿ8íÑ®Êe(ûÖùù¿{LcÌi':‹ŒùeXVW•à‹ÎËK—è§‚Iy%ú“Ot¤í ïH†Ú_/0´+Äì`N"׎ûhÞËÅz5n¸XÇ]·û´}¤zòÈÐñf!xNhiiŒ#[Pò›|æÅûÚ᎛ö ›ŒjÀK¬]àÞ~÷WŽ Þß}G³=1e`1SzƒÓú)”Ó«Øaœ+ãA»âAtí’äî»â¥TŒ!FpãÈÎMzŒÙf¤ ༠¸š¢§ÏÕŒf&«a§iŒ!óNý³gÈŠÞ²¹h{„'CÑè±hd ˜âåò©ÎÏŠó®¼~}yNyœ %í1Q!ãA{âÁdÌ&=Z™@æ^Ö«ˆÑy1ÌY·OE."cígiŒ×’Ë®þQаÀ 2K-j{t"#3J8“4-Mù†ðb÷õaöØŒí‰Ñ,ú¯L¤óHÏzÕÑŠ¦DõÛ%¾kó{}ÝÇ—åŵW»XÅFØÖ8OXo8ùû}aïzõzÍGÇó±ddL‹QÝ_ÀÈ‚…ÚgG0´'ìà!kmàÆzÕQ‰žc^6i[b›¥1þÀKš§1@æH6Ä6«ŠDsKÒhtI9ÒÌã´eˆªnÚ·Dã>ùµW?`ƃöă?d·.$3˜%•q@`E ijŽÐ|`wiŒ³ “¶Ýs8̆ضøà°ïbJ¡Y3Å©“„_˜þ]ßìº$ãA{âÁÒŠ¾‚ÛÈô`ÝêÒ:ü,mÜ&Ëë6Æ5ŵ.@/6ĶÅ2€LË4âó=ÍÔ<4ÿ`âãA{âÁ²dÞÊ[בÉËzÕÑŽlKGd­%ìê6–·.(ƆضèPš¯‡<úØí›‡~ ¤OJØa]ƃ‰‰[¸Ë5¿¤•õªc.N'þ -zWÇá:§Ñ(/€º7„^=vñ%=’ÙÓ³æ¯ïUzc‹<ž »¯c›öÒæ™“W²ƒl‡x0™^ØÒnHÊ·TK„Kñ ÝðàL2E÷ÉZ³2QÇÄxÀ4ÆÚ¾†Ìê)ÿ£iŒ!ˆ¼øaa1¾¾»S c÷´jLÓÒ`¼õ>€‹#FNÜ‹$µ¶¨ýZùŠ‚%B?çáS3dP/^ÅÂ(ÒÍãiìÈzÕ1œŒlžÑ¢óÿ‡Y1ËzÔ÷‰^ ˆôêSC†t‘·^ðs¼!ûÚ×M˜=¯¶^d>QSdFš\ñ ƒzyÃ8êÄMÁ¸1žd½jm„LjP×Pˆ1c°0^fi`?Y(•Ô©ª§g:z`Xêo£ªºTÂ0€íÒÆˆôKlZ|ÎI†è7#å «Õy¯Š/ëÉòãáK^å÷_Y:›`®*s^2d°!rsévXÿ2ÿ,ôo,- åX¦F«â-© Ì]2»¯Ÿ=·Èï|tŠÙú ½"9®>¯,.*%yÍõUõWs€üQr]×ÍÑ2mw :úzaÃŒÉ?©÷‚Ñ;´¶´±)Äpr{¼¬a‚9µ¾ÏxÁv<Èuæ'bžþÓçjÂûJdxÃúÔš¸„¥ô<}¡Ož·ÄgÞ-ñC/~@ƒèõAÜÔðN×B÷x¸š:ì2áó1H “û´lÒõ÷#„ïø:^ý%r›‰›®ù(úʪÔ§g±¸m-ò4~o#µ&3d°F4”îˆiÍR…çÉá‹v\dcÇ{”>ÊÃ8ߥ#Ï3Yâ„¶hÌ4˜ kãHœeÒà5%Ó=™«¦.kM4ˆµë …S»“ ÀÇÑÄ·ÆDí•NƒIîê­CDí nÛ„Mû“Pƒì­ï¨Í¡ôôãwnø tv¤¢§ŒíŒ¹è_Å»_Ñ ¿¢×¿çã¿, •Ù*¾_ѼxêäyªþuÍÁ†‹¬56D! ¶Ô6%>Ô_à_IGÿ>,LqM/¯ŸVQ—}È.¹|rÅšM6/¾{È"CS¬PÙ…¾ZX7§—&U¡^û] ÒûËp¤1ÅÀE!/GX<ÿO¿­Áêß2ØŒ9î•:À¼„g ã#Ø¢jÜ2Ç=¾éiþ†Çiô®JÊ)>ýæKösÆí=˜Ù«ÞÏ­uÙ>Àë×!Ü·—{»{ºÔý Ç­q¡Ïby&ïTÏúÊñg>¸•WÓ¡ñ>OIÁ3掬ÇGØs´e½ ©Ü-¶+@U]æ›î.Bq$wÎ4›æ_x3=?é§:éN¤ R.JƒË2ØŽ9îül˜H¤ùf3Ô™xɧÌP¦Rjñ6ƒ÷©>?“mCgô*Ž*iÛnV…pS±òä1D—1íq1}SŽ;éÎ;Ép·œ1¦4'>©Íq-uìRQ§ív¦ëRPXÐÎÑ–õt€: ƒ _MW¹-©ÄùFV:a²—+—ƒR†ËcA“'ËÆôì3~݇“ =Î +AØò£Ã ãA{äADðGóüOÒâqÓ š½2t'†ah€6Íx©kvì6bÔˆŸðqáç3zDV¨.k̤˜=~º`ñ>…zµûÏmØ=¯k:Ckwî³®ZN2n$@¾(<œ"˜È×~¨gbUqËâÙ|Ý]w…ˆI¶¾*3W  ÐCÞz ¹ŠfïT”œ=ÒïñÏ¢tD:}(ˆàÜéÍ }òÆÈ…ô­DE,$Ñu{Œd<È`c4‚QùèúÕðü` "¶'0æifWÔíÓÎå‡G"tð¹™²Ö!„°ÂÍòý0[S¨ß´ù£yoà2Y%kˆAܯºÇy¸|³héÔå_sOèƒMŠF:[P»Ï•=ÓêôÛš›¾Wp½g» Š>: ­;àˆÙœº •·ÞVUü9‚©”}Ím´¼kq·zeйÜu»Ê…ã !¾÷Xn‘@¶^ú]㉨ë0[Œ9v‘& yDt›¹Á#êÅÅ›_ãö•û û5E¬£×ÖAo.¹7ùê¿EîÐ,U'ñð¬Ñ]úX·•‘Zß“.x+ôü@H2= #ú6a”¶ÔcÕó´د)µCøIí쟈:yμÒɹ/Ü|ÂòãÁÄ̓·\d'[—É;DÜôlr9zv²Ó¶ØÅçs &w&åhî}M òß Ç¼žòÖï 2%xžŠètuOô§=£OÿÞ¢l±Ú]V}ิ©ö €TU©rõˆèÜQ¼+‘ê3s¿Óç²+U&±*Ô•¶aÑÌg¶¹œFb:h`ûè|¢»Ë[”RË8ÌÄ#Šd–=¿kFU4Цû.ë4â EO·Ç÷'šãû<4 ‘²þ•|]esÞë£+Ôáßþ ãAƃVE€¬RÓqI„ áç¡IŒ›Fý±}å<>ÅÊ >÷Ò¥(W¦2½Û9ºøÈ[£È³Ú ßÞ˜t½a J Æ ým#i…O€^¼‘ë Q 9î+zÍ´"»ÚUj|LÊý°R%]öžÌYám.[U=‡qŒÎuÿ¹üúõ•ê!1Kb›ë„*äe¯jÊ„J›aN>úŠûÍ‘—ÒÙ¢g¸ýåuñ9“Y žãEˆpì}Yü}}ÍÉï~œkêÝe<ÈxÐzˆðSØ.CR¬2>½‘™Ÿœ¾¼ƒ" ˆ%~–nß­?ž_ÍÎÇ¿]rˆÁ›¤;=3¿\Nø—Ÿ"Ý´ÔðŒÚE‹”—Ú ÖÅÑìÒÒGd7rm˜ŠªëÍò’ÓÆÑy¸C%]¶ £¼u¸BJ/k ³ƒU3䞸Q MÏf1Å‘u2^ÚöÐ],ÆØç1ìFèÑ:Ÿ0O1þ\9°çÿ‚ƒ×¤©É9Œu‰lµÊŸìZbcÐD€¦æº8~“q+V·Aiš:Þÿ ãAƃVQ&’È­B]„ü¨/ZÜÆ^üÎqo7¶Às¿º? Y|Œ"åaËÇ’”ÿtˆÁÛAîN.¬.À#¹„y€FÎãhD6åò™ë|îI„}&úÿ“h2jUÒeã‰V+o݉>>6@Ò=zô`Ptô4#üÞIÚˆ:ŸEyW´è®§„M+IÃ,YҢܥy>,jÌ÷“ààn™Éc”ù‚_.á&“c Mź¹\·2dÒÂuPè祖ûŽÏõG·’7åûòÌÑ nº&¹MȰ¿‚Á/¼Wúí!Ö† |”:>B¸;E]iŽB[ÁỳÝ@ᚢ¼G;L–ò!×Â’ƒÙtÆ”˜¶ 5K}s¯RFe—ƒ ´îø&'¢0ý[þò2i]c˜ØwˆLâêñÓû´{±–Û-èWGÝQ\T±xÁ.v­&[>ˆÏ‡N^uÙ^p¤ž îqKQ ­]~hr0¦·z©•IÊR;oèÛh&“ê¶7âÈxKçblwD·¡žn Ñþµ ξ@éQœK4lZžVvO³æø~S(šî–øÛaä¤2Ù¤\ÕBªð›jVc9‡|•;â„4í’Š¬ç"xrnDZû èÿ}¼œò]iBÈtõ‘ðŸ*zRÑF8RƒÃœÌN=ÔvSAË„•¦ hDRCIa!X_\d:'!;a!~¢IöÌÄèw|õˆ‡Ú‰Ÿ„¶ét­aŠV0¶ËÁL¾©¢¦Ë®¿‰¹¿íkô‹eú; }ÉN¹™Õí¾‡ÌElhW£¦z@ÉAð&†¾ÔÓÈ·¼Š:w£÷ÔC2ÿø€=i¾BàSWŒmIºfÛÄâv’–,7s4µj‚qmÂO­©•ŠÆk.!Žy¬ËEõm÷[q›m£ jåYÉ«SeŠS޶yÄ©Áy°Œ_«µoRÑ7ø‰úYt¥’^ÐWè!¾œDšUüÂYÉØY“Ì‹CÚ®„qó±Aì@Bºêþh›Xƒ]þ'å µ-êo'eÓ¬ü”ŸÜØzµuÁ;(TKi Óß[ÅáÒ¢0lé7ÇóI U»±ŽßÁà þ¢vK¦±QÍÛQÈIÚƒTpÞäì`2;ŠeÄ<¯³Rè9h¦|¥ÜçR”t”tŠLMßNÒkÍU¹Ž¦cï¡+Ÿ¨ðC[]Uß±´Í”‡×¡©z!E{€Q§a^ ïý7²ðñè¡–Œl± !²Z:Jäw§›Ð‰:‘¶o_;ÃÜâ Ú4 »´ËA¹Mƒ Ø’GVþä`˜ßFsžÔ›æ"s̼…ïÚC±Ö¢ÞG׋ƈ|»³sTyÇá"±n4#ÄI…¹½ ÿ>aX}eKwì;ÀûñÖEçlºßÛ6W;F…ËÞ^Q1^{ÚCÙ˜a‡ªâ{ëT6\{É7‡U{vÏâ#ÆÎ,ï¡'M+µ¾Ú±•p!ÿÁv&êIg´ýøö3a¯4„œSÎÏK9ýê‰/Ô®ï”Ô÷/[u­!-˜¢m{ Mv9h—ƒÐ„m¢Þ?œ\ŸøÎÌGÁ*‰ž+SÛ×Ìiæ”àqçã«À±ÆðÙî‡UÚqEÂ’äF©½÷kK]Â1·…w&lT~/G“³wÉc5½¢fI’¿àÈøU,Ý¡M»Þé¦Ýª½eÒÇ?pD3NB!ùG9^ˆ?ôJm£5Kì\¶,\õ¨Æïhe<rdtÛÎ]^aZOFªØ˜¯ÿW7+Œü‚¯Á WE405Çü7%­åkK߇´YK ÚI5k\³Y×:óº ïX*k—ƒv9hØúâ¯ÍÝk ûl¼08½ Sº¥ÍJô²"î#·aYóJÚľյ!·ß.¦·j\ Çµ ú‡âù)U¸!'÷¾¾ÓãeýÔ„×WafÏh,Â`n»ú–r b{8é°ý¼U˜l”nÓ6Á¤‰d¢(ìŸòý8OwðÉb®¥ \G–º;4™Ü=꿺ëô ${HAøc•™ø9ÓiJ(Õƒ=åðO˜zÏ[¬ô….j[mس‘FsdmûÔ.írШY22S{ð’ƒü[$…§Ô_ÈÝPY§‰ÅM é­»â¹3!Çc½ß*Øi–©®h>æ¡„„¼rg“,œX¿L³|îEÈÆÿÂGŽa9ïÙª¶¨þÔðE<®ÂÂí~›¨ì6&BëÔ’[.Ñmu°!ý±ÍÚ=w#ÄϦ”ïhvméQ(›iô» !¹aq5Ã.Uü¯î:×`Q~{a]~cžÛýQùuèBîÐËNø‡b®&¼(!™^Ý\2¦G¯‰¿…Ú´gªi”ÄÏ›f—ƒv9hÔ‚­¥g»jxRvìÁ&£=*'Ú%K±Ð«ö‚p0vÔŠN&ŠÛêÎ[…ýèHÙr'-_9½=u®tN_ár>MìÃy””ò3GGšûÒ_R¢Hó.ê»tJrÇFà]x…o¢)”LôžEc†ÎXcsòr»üä –‡¸¡…ÒÚMHö¤õèÞ3Osõ¦5 FØ¥v8E§àžµC²’wUDYè¤6²ðl ºuª™N!A1˜z›@‚~ð_x'¼ß!ͱG^ÈU?1zrtÛÊ%ëw^ò$îó¶ tF#)?!©§½òB(z&\û¾8î žuY½Õ›˜Ä~à=ôf¿T®ªHŠÞñW tJ÷Mâíg£ÌõZRj2¼«`g ¶ç_h¡ÕÄ:QùAtoæíõæªÈÆç·wÞÃ<|óµ£sjÐͨxR3Acjc@žÉw[` M\Ù¹¶¢Vm.;϶º…]~Hrp!µõ –2ù kßabš:*ƒVç øaº5+­¦þ·‹ß"Œ?øé;ox¥µ…ð{ìð¹øW'MIE…óݾ–/\)QÁØ®á7 ¸ÅJ’î$·} Áps+eJxÆMnüôÛûèÎÝ–Ü"25çRQò$½rÈNPù‚8åäqbò~Om¸òÞ=G¥ÇÉ" Â+¾°BGÊ ¼ãèúòêõ ùg*þé õ'Ž]!ÉEÓ ¿j£¤ö+ÝE­VÞŒ|{oc˜]ÑŸô%Oª›‡]~¬rP®FîžQÍì•D…³ >£]¸ Oȇ?l yg¼Ï5ÃâsË«ã‹áu>u¿”ò1ÊÌ’cáÄÞ»è…â*êô¡´l8šºöĶÏùí«t -¿+Þ9ÝLuãqIÌïWZÀA¸ ÿŽ?:Ò@ìGÚÖ*Ƈ2D_“!a-*'ˆ®7²*XíwSÅwXŠfæô~]FÎÆ„‘ÈÊX]tî@Œ·¿],á—ç×Eaר(4 SÎ4Øz¤_é ŸŒ- ;àj 9ÿ¦ƒZ·¯ªçŠü‡F)Ý«µëÜfæ:L²!w]~HrðãCtöÓš„Ió„…À¬Ïªóu¶† OWÂ…Z|à aEUªØ1žj®T[Ši„·óÑ$J¯?]9Õµï1'Ø‘’žB±•ÇeY¬ö9tEúÏ.õDO{?»ü8å @ÑæžÔ«ã[¬fIIš“FÁr nñ­îèY8*R!ÿùYZ¶6Êüð"!7Žé'¯*†ýø\JFK)dÔ„õR”]7™ÚuB-†Ïæe¥¦1g£o¥u P#Û¼4HÕ‚~“´ W£aëLs£†ßW—ˆ–kZ´31äøJ@Ëm`\Fº !¼O·-™øóÆ+ ¿°-H~Ö™K˜x39­"Š*° o®fTí+MOÛD@c¶t Âûgl³Ê€bøqrò+ Ò+˜¹Ð.?N9è%BN»ÁÖzz ã鸗¤ýA aÒ­B®Íùöä¦+ö$лcÅz°Î4àÞO¸8»Z]òµˆÚß'êp7*ÿúà?ðY,mªoÕ YdógmW¯ùO²Å ?Gwù’m’…NZ4:çÝIN¤ÿ4] %@—ƒžx•bNeQåš@Ôä³>û:!CäßB5F ŠSÞþ%p/–WáG»ºvnsOÌÁ0ù$°.ÉÂûwbÉ‚­ÄAE4õ¼tâ¶]~Œr0Bœ„…ʃÄÜ"IÂÒÒ‘+—¤ñÔ°¨|©Vì ¬07Wrí1£­ù,»™æ-:–\í¡øÂš–߬5©-´¿ÎuÇÂJO>U4çL.ØÈÈœdzdÌÑ_Ô­ßy܉ØbH´~£¶„u]ÔÛ’fŸ‚¡¾F›´UA|fâ°ññL"¤n8fRN9~¹ùÐpÌþJ«fˆ5ÁÓ"gŠ%¿þIÞ)tÒÈÖY üYr .Š3‡W|–FZŸáŸ,ðëy‹+w„½aBÅØ¼­[ƒéëvü:¶ís¥*çh(¼}ú=ÜLwr;—ð]ô&Ä“ã}¼ŠîÄÖ|ŸEHƒÞ†Þ êäh­g:&W+q¨y4A }£ j6=$$»¡Šµ_›W:ÉïªäM¼*ªö!žIê­ä…¦ÓG¢#cã.÷ÄlvÍÐL•‘-(æÇ ™áç(²“¿Àƒf²­>K`vˆ]}¼ÅŸrÙ ·ÕǨ¸p¦GŒÍ`—ƒ©]~ID>òI¢t¦8ÉbRU¶Ãñ¤h_pàÂÖ±T”Å2- :Lçwù| sË\) ÑQ:‡']C=¥ýÏ„*]^0l¥´5ÑýÝ+Í¡›”ü7R·e}”š¾ñI7°‡Itѳ½I¢RȰ¨±§ zú¼ˆ¶T\ªoË©B‹ÝêÚð®cQX“ö²-/2MmÂÝ–¸¯|sΕ1åÍj|oœÛàes‹êy-¾9©I߃ ©¦;8YMKa|90Ù\st\§ómà¬S?sr Þ;,_Z±»Iàv»¤ÂLÿæáìô»1>Á°Îô ØHJaÝ®–ú£‡ Éd·?9xÚ,%ò­“ò›9‹E‹^Tâ¯~Ý£¢ŸHp21hÛ¾°PGGŠ˜±B"®ùˆ3uL$$ ;ðƒQdë®'z•`ê/´N†ÛUJU¹s¿ãˆfìµíßЛ{GäÅ}pb"î‚„²œÜ 0x¾ù æû þŽÊ4g•às#ßA*ÁN©BHP× ó&09™?þ…É#=uyfO‘--ñvmÉ´ñ™h“—yÕî3SÓ!oƒ/ëeŸ°:iw†QÑ~n™8ÌíéúÊØúOWíÑ K9É@îFHÕw>zõiƒùŠòYahæ<‘’7¿ý=_SO›»sš͘¡p£÷Ñè}5M¡å†ÅÄæÛ®V¯]¦~93.?Ûã_¡8¹‰?õ%$]$(yùÉm{¢û$ªë†Ì[=g@®¸ëŠEê÷÷›¤1kIf›]Ag•2ÄY½Q¥l—èÞ~&V³S- 27U}å³ÙU/ìõ{bnRŽ&Úc?Â`†}Hóý.ÌkoŪ™Žé]•òwü³‡?Wàü–0¥¦”ä»;„€¬Ìñ®é¾l…Aˆ#!§b¿æùªI¶ã}Ê"üa4Õ+ݨ²)AÊÌIÊ5·€À6àRƒµ**„Öñje³ Ë"¬»`HEj©ú1zŸKNñ!9Â7pÅ0H”hÕ÷y#D ‡>=|.F3Ccƒ[(]¨ƒL¤¶"‡ºm2zù„ô·ËÁE¾ñjƒÞØ…sËͨP/t+NPœMåPÐ8LNt§~Òù­jÇ[ÙdT¾!Õ™ÿ.ÝÿbºÄuö·=h üÎc2`ñ–ÄoæÇLRî’Ò:Â]_¦ªÏ>VAÏ9v}˜˜[<0°Ž¿ÍLÈÊj— dl4"x süêJ&W™sLÍc8óm Lœòñ…Põâ£Îr«ž‚…-v€ÐÍNý­ 0ó1&S HøèD·XàžU¥œ©˜öt˜uéIèí]ŽäwB:)GÞyøTX†ÿ9 %¡?æ!„À†RðÝn™\2ž¿R?{·Èß¡¡ÅUÊ®#*<él4ªE DÞUg¶ÓØåàG!7âóVî Î/]ÚɌĮèjÝ:-aƒ!>%ñ¡š¨’ô‰ÕÍø•Ñ^s\Š34&¤=RTÁÙ`Á ÷ËB'Za1åO#?&º« sËi=ñŠÝ›˜ê’“ ÓóÎfƒ¹˜xGÄÍÖœ_¥Ð¶ØOÌCȯz·MF¶Ì_ƒ®Y2¿¿Oîò•”¡ÕSó§¡!ÎTƒEÚbü ¢n’üM‘v]É I׉ÖÐ$,Õ†<¿¨‚emF±—«ßÉÔ6áŸÓÈ<˜“`EˆÇ—qœA ï ÆS‚]=…·è®¹¾;!i㙦çZýÑ9¶K¸ŽG›Ek®“–¯è–“zYr¯‰¢‡30 wEÿŠAI)1î¸R[tl ÅØÜ;ˆÆ!† 1ñÊaœƒ4¥k·šÑ7P‘ÝØOãÄI_p=…9}†ÂOq%.—VüobpÅFãþ6¡§ê-³%×c¾4,Ȱ×`Cý«°ly=•Íø~Ñš´æ`"Ž`3ްo°œš^ûqŸûñŽÓw­­õú£ód¾“iÛuÀXŸñ¯Žà¿–$Ü̯}zù–µÄº¥Õ8¹u& Í–_ŽMnET‹ï7{ÞYM5ëñé’ŸL©q.aüÎ¥@‡·\c´*—Þø‚ùKÝm4¦›a²”çyÑg9Ø’“ß.S½lOH/t®Í ]šæLHv*‚µ'$©o!çv¹·ói w$d” LW§d9Še€hÑ¢Iç lÐs¸m oéÀ¯–äyP[#fdL$Ë 1:‡‰xø ”³-uÍø˜âЩæ¨ÎG8r\¸€ÚéHÖÅ^ï ÌñÛR³Ž!¤RüžTßrŒÐŽ)øº RD2F£xCîÚР²¡ð—H86 P­öÓÌoÄÅ'¥ñŸË¡ž¸ñS/²ÊT¬ÿ`˜³Ÿ>hª6J®Y¨òŒÄÔ¥¶U2=2.“ÚÏÔõìrð?/û: óé[¸“F§kâ&eÑ‚gIæî#O¡A½ÃV ‚-]Y9˜ÿü»Ej»0Öâ1·²tê>LJRÿøÚÇÉlrp-AÑ~VPo/§È÷»)ºŽq¹@lºÚÕmÕtm½¶Vq bØMÖ ŒâÞè:pXœº¦<Þ§Ÿ~_¸ jÛ鯙'!MÙßÝ¥Â=¯ŒJu€œtˆŸŽÓÕ0Ø€‘)ø¶HTS±(¹úî½~zÝHRíÚ(‰¬2s ñ× B3Bã¿E¤ò\»ïÁB£yê«QÜRûïø=§”ÛuÙ±S/¬ƒD»íTêïU’_*ƒF;~AÁì¶"γö¤)4C·¿zp^cDääú×vŸÌ.S½œB7ÚåÒ¯ÛÔ—›'O0òÔÉSÞ¶-½á3@ì-£Ûˆ}µ¶ "oL´$^8üôp3݃*Î{ž´ç/żláGîä4;J Qóë—æxÄmܦRÑкi :€‰"28Ð²Ô ú³3UMùN¢”¿´§0}k¡>t‘Á%·„°¿ C¯SXÝâWˆ–Òô×yÜ_ÁÄ;‚oÛ–%Ù™»KéÏ¿uaï]< w}œ†yÉ­Çf ï2pÆN ·"Å5ÆC¯ÀˆêkÒ¶c¹O¥ÕéæçÔõf½üÉá¯ô±¿$.±!­A5u~Ý%Ÿ$²mkš\Ȱ|bPªò\Fg½^6<¥ •»°—¾åŽwFvب5âäŽwüP‘6k!â¨îð%ª>ÅJòdNu4ºÜÊýp'ÖÛ¾mÀg°w„ÏìL#ðSSn4U} °1 ¬"RSQYF¹e°ŒÀ|[I·|ýÄü â°'ÇšJauòï5UtÒ3ÛtdoÿT'»9SÉ~{lLe—ƒ©^†ƒý—îµÊCÒC3æÏUJØË‰ßÍ_×Ô|Z mËíϽžHÇåœÄàq6«ÑŸÑþ*{ÛNfnL‰¯‡K_{ÌjtÐí ˆø|»«(ûL®ÕŸÃH«à ÕhÑÍ·Ê{±÷ÑVÈ Ÿå9j˜GCè“eà ³QRÎØ`ãTž¦Áïß½Á”²ü;kP è|ôh5³.ìO¯öš¬m6P& ÏΛ/…ÞÞ?‚2™y=”ô%“O ¶æQÒ¸ÒF6ß5¼®Öê+„½hò+rWœßmI,Í­.=ñ(DYtd¾û¿’Ì¡c—ƒv9¨‘y}x?ûFæ1¨È:†öÉÐåÐEu!æQ|BQÎ9R?J°þ³uñä¦2Ã)ìÇŽOA ¥Ë¬“¡. +•ÝŠ6ìÍUP)ÔBðN ¢íß M?÷ärŒ®5*V¤Â>s4BXޱIåW›5ì$c™ Æ™èá½Û'->ˆÉoRºOY£Ê²¤Z•ñiX;%`8ÞLC3ªû4É|Œ^èËX@ t"¸ÁWÓ*K±ãx Awl2}bÉ@Fî¶ ÎÚËŽ<¤¼h>ÍNüJLk¤qÆOÓZÚAŸ²ŠJ] EÈܭ΋;€³'— {¡ï¹ÿí!Z„¦³1}¦¨ŽôœfÆžl—ƒ©^v dÎO§NŸ BÄÑsóYŽKM'$ÕlŸ­û{J-ðœ—ÖVÆ^LeŠÆiÒKZ×D‡ó |jÄomq‘š»nÑBΨÔ‘Ë—Ždk®W |Æ¥{Ž Ç*t ‹i’ËA,$TP{ Ì9§±^Õ²´¯]´[³SV6WO#'fSj·8WhÝ¥qf¨ýòNž›¨Ar~™s‹'aµÔ·ÿ‚Gb%»Ý”&Óçcç kL‘suý“ ª¢i™ åà-’<ù*´úFåcÈbÅ• Æ¥œcÏ Ý·ï±=ƒf†ä·×1b×x$L¡´°­_l†Œ—œÈ/³‰¯ñ#èi1û?ù4âº.Ù¦§]¦z9æ#lioW·£yƒN5|Ì„L¶**„øëâ$Å iQÛ!{®KÎþG¤CXÁÓ‡‡¹ÝeTßnósÉ3¿0,ŸŒói°)¢ž:¦ï^³â…Ψi’)±u‘9þ­#Ÿ¯ñ&¼)«#5&µÍk>É\Pï·HëÎaž".ü¹zÏ¥JÅñâvàâ" ì!v9øÑÊA¬h$V¥ ûçÌfVý ¢½U8‹ð^I˜‹¿$¾_Ñ‹•I\Qthô±¨®Öý ©z=Rš›ŒmúNÛ.ì€ý¢Ê|z–¼R7%sµØÂ„ÄQÝÚ¹dr”­G25?•ËiŸB~ކŠ9éÍhÌŽÕ• oÞ_ÞaéSÀºŽNb#/drá}Ê.&yžOÓ*Ä\2Ýc£Lƒ ÉÄp“„v‹âM¹*UÉ­Þ1ËjØjÏbQ S±!sWÏ\ O <“0[ðÔ¦õ‡î$¥«–å…µÿÏ"p=ˆ¬ZëÉ„t0z-63„>“Ú‚¥°–Jý…NTD»Q#Õrté¸ÁÓ–¥#£=u ™û£»Q¶ŠÅT/¶î¢«)3í @…(ÙKbÂx¾jÔ—-¾ûW”Ô…”H'"/ÔæÄÌ&aZ°KÎot™™‹Ôt‘‡<=]EŠeKB&¦¶yÿr»AL9ÇJš3D]T¥nBj ?PÖ,Öa¼ØŽž.fÐOß+ 2ãÛR³a¦9–_YÝ™&£8î+Ðð´$Òóê½ÖJP"ݤðRl}š O),çÍd]ð·¿ìØ0£¶’+‘¹˜§îÍÔ0«Î¢Rýôƒ,1Ьxrî\ˆÒ‹f¦VîèV†-Ùsr.<V¿#sàÿÁ»T+ï("Ε””=^1tZd—ƒ« ÙRS­N¢5\¢¿Râ¨c`âA2WÑÌsý|Ó½è7×ÖěՉ„Y„h*Z1‹£éØm̃²—®ß­}͵Aû,]^R96M¬XŸŸb}4¥Úècå<}D Åé,“hg5:M‰´w™]Ü–ÍB75“Ym:YÆŠµÎÅö#—u µe°]K}3ÿÁ¨`ö&Yû®Õ¨TŽ’ ¿=a˜ÓðgIù¥KlOÀ¢&§å,’Ή+k²R×f_š&Ш,޼Sü ì× ¤ÅÒ[!vúVxæc”yÎ4X³AzhéYn‚ðº»Ú˜ÃŠž"PôN €“‚Œ÷»9j …Õ™8¨¥DÏhV¹Qƒ˜ßSýô„'eÌ{4[|sa“<&†ªÉ&&Û/ƒßÍíi€ÃÑrõ+|"]ò CÜr•ÈF¥§Ó¬ø b Ž}­n޲ËÁTRŠŒ|ÀL‘ê¸LS)žIP–B‡ÓNö&ƨµÉJFiΤh8·)zy ´Y+>©«>¯(ÅRl,Â#\œµXíø")}Â…û#ì$SªäMŸ.oå‰×©ðMó¯ø¤%!™Å „%(@e [‚Ríï3ˆìÄòh˜ûäw2Ÿ«ƒÉÁ5X[û3&¼/×ù©ˆ‡,«1£}9~ ³c´M«œ& ÑM&£ôÛKªˆøÙþ1ccãt„Ý&êL éTPâIý`|~ÿøÖÕK ,¯[2GÉFc.b *H´4gßåIÕDÞc â샥Û§–\yãô¿XÞ §â¬ÉºR5·ý38®¯¶tP è娄¼kRÛÍ i—ž‰`²¾o…s뜼l[v¦”ò†WAVQE;+:€5s… ºÊš5O3—=w¿‚ÙÙo”ý&Ï{ñYVÑóäH`®QòÆRŸ¯p¿¨'—Þ=‚¿À… ´7Ö&ìrðãƒB´†¾Ô=CUvù„ÁS~IT•æÂèƒ8×HyBýÓ/2€DÓ (.ƒ­”¼¸ÎóMÝNq-%yL5…Üîé$©‹–¢*WŽš âC-ð¢ÃÚò­8Â8äiûDãFÇ¥Ì÷‹‘ß<®Êv¬ä(Ã+þ²¸ú|K/yãÓÖ“{K]Ov¢úÿ|9nˆ¦É> Ö‡g/$Ÿ~yß¾+ÉÒ£öü$+öÌ Lä‰ý‚K+ÀwÉþùje3_ ÚÜþG¾üÓ-_tî£õ“%Þ}‰,«“WA†îšLÎ…3k[pηÁ’ùYFÇ´4qPK…¦ þu áªR‚¸p½ŠÌ¡;Oÿ±pùî[«Þ†MÅ>,¦ìîQ=þ©‰z{L×Õk^Å‚ªWÁžDÏb{u à3@dLVõ'x˜:ïÁB†(G¬ýk—ƒ«„½¥”µá÷Ó[ý ûf•”ÈQ ®2sVÿ¹Á*uÓÔgU*uÅm i(w*|Ã9²³Ü†"¶EòœÇÒLòÇýƒ¸–t׺ÉpJ•9;Æ_šq¾ýwwì/-”4“¢‚à§A*v ÆV !ƒa;ß"ÇÁÞRM²´í¿ƒRÚ(­ÇZF‚S »R3»èK|ûHßœÔx¦eà–s×î…[ט¬lpƒë郫U䃉øQùF8ÖºK~´B¥Î#KV†6 â‘k–Ò"yœJŠ¿­Ouç⯈; {çÙñ©Z ïPMnoê2tÚy[Ïi»üä uW²‘{±˜Ã jeœÃî¿ÇHRõåÒ1úŒ¦\<;‚•”(¡L•ŸÊ¹óíDÞjÊRH¸°LƒDwÎ6Tb8*ë±й]á-tqBfP Ue‰vWGý©›)]RYYZ±q©šdmGÛ”êÆücBmi‘þ%Ž…ªŽÀ 6Dß^ñêü¶ÕûþIî×¾ˆKÏoöÁæ¶á3´ÊÄ'0{p™¿§y—¿ÃÝ6ã%öê%öŠwƒ,t†Ýöec#$ï¦Ìü|˺]`F© êK‰5Ý” »Ý“+jñI±ûnJaä’˜5¼ËÀ;ßRÀ31LœÛË£®,ˆ"ñµ‚ÈYí º>Ī/m¤…Ö_öÉܾÿSâyñYLO „«jbPwE‹Ç`¡½¾u© 73—à ª‡sG& W°P¥ü™-‡Çtª'E@ÓpNøûH¬®Ð¾œM?!oÂr}'=|ƒ`í±ÍU%í3ßô76Ôv9øÉÁSj¾$_¤þ´4„ŸÚ* œk$´õs5T%ôZ[R—‰†ÕY¨óq+ñ—ï¦]/µVEä¨ Ü¥½¹ûÌZ½hdEææIÃ;ÏbPt¹ ž¹7FxBÞ‹:«Bn/)³&3Ë­A[·Ôð|Ÿ{¿ßôùÒúÖq/:îŠîx‡šõŸÀ@ñ¸Yª„»¼zo‚ޝnr˜éz"j¿[ézˆ…~¾•÷û—èÚÎýÌvÝN´LrëA¶˜£ÅA›Ìô¶lg ¯‰ÓÎäÓP.ƒ#)k‚ 8hdÖvš3ÑÔ8×Ï mdҧósuòÌÒx§@9f2²…cvxÉëŠÛì!‘€C¦cbPœºAü¼íä®Å­ÑˆueËæðnxåŠÇÌCã3¹¢þ‘ŽËh0)‘õ«*a¹Uéä°žö1×0]FO6^i%²†×ßePi­¤¸ø^MF)Úº‘’s¼ õb]CÒwazx¢FS%H¬µËÁWnD/¢o·íWCoì¢n§%ÔÏ ®¾ÓQ/¾âlh^eÖ ÿžgÃxÂÜâîü1oâÂÍ(&ÛYü=ÐõB;gtc²®îP*‘¢@«ýRƒð6ñ–Òýé%7hGÆáXYcæ½’W=tVÜ#½}!ݾí«÷úE_媣¶ºl››âÍÆÞ}ÃiöíŸëæq7g*ÙoÏ"­«TÛÌjPÈ?SñæË“«^èX áÅ?9g[¸ÓK“NiܪÁW^ÍXS¤‰ÍzE sh‚N#AÁúŸÞ†ûž¡¼ Ó)ó|(Z_3aa™)ÞòSºÖÚƒ»¨ï1þö`}Bš Ï*BÏŸ„' # áKT‹uîN¹Æ#™9V&Bc\6‹fPÃP³ŸìOÿ]û‹ŠÍJ¥càµhX—{è°o˜0—ã$ú¢KÓš :N¸JsŒåFÚª)È$È*kÚJÐ\F~ß›*¤kŒžDÌ¿”*Æ2îD<ƨ€¦Šk,p\¯ fJnÃòÊv9øAÉÁ#07GJnûˆÉ°ú¶b²æê9°íB ðaH}¹öàoȤqÖR-0Ì"f•©©ˆëpœÕC:’‰“Fì„[Ô!RËÌkŒó‘ ´mÙ,é‚kŽê®©%TÞh%ú›ÔÛý'zÿ¬p¼«‚yÒ£÷ûAÏ©+¸ÍµÉ]i.²p"~p4t¢O—÷iU³EïÅ`£]h&»K÷ûÉñ®œzw]-Ñ~wk°ÙaßEû‚idKôþõ¶êr~iiËÞÒ]æE3Œ“”Ú}.ˆñ`♯ç¿>>¸‚Š ˆb5ì½Ë5Y_ÕMÂö–VkQ‹‰˜¯v~!l¥îË %Ú—vòáK„Ÿ¯®XˆðN34?0;è“ÔrªCt¥,]cËPÝÏ´é~ªòj"q̨ô:T1K$"5çæOJ·µr ̳ÅÀ¹)(Ÿo?ÞºhâœM×cÄKj(œð§£HVƒñÆ{܈FW±ËÁG> Ðwwàt!ÞÃh=uûÛ‘™¾Õ†}SçÛŠ6#ö Ô _\Ecàu4^A°ÐD.«‡SkÊ’§Ú€¿Q2¡TkÊd-г8¨À\›öȉ.â·(¶=óñð÷þ=w "!}ïý„W&Ój76©JÇ \e÷ŠMeûŸ¬#ñΘ«¶Q™án³mÿ®QºÞÔ»”C“ëiЊk볃ÕRÁÀg™ØV–µÔm"!yµŒ— ãò•⣆ ûYß!i1Â=F9¼hÄ͇Va‚´âÝ ò€ÕJÈÜ|ÈÄî•i@ßcÌõX.XŪßÏ;Ç’s —Ђý½@å<>AºlF£ÑB/9£ñ?"ïð8Acj#h ¥s#‰GS4Î[gð ,›^ˆ‘Id6vÛÍIO‰n´s9iÚe&<õãb2§ÁÖû̱X”tMÁ‘±%¡by_Å©q >ç:³œÏ|-X:·ËÁGv太Õ&Üð£STWpãg  WiLUNMÛÅꜴ'‘E®Z r›Õ¡ºßre¼D Ä´ÒâŸOZg“¯j¡„ ÷-ÔÅšWŒx–ß‹ñÉ—Y$­5âëÜâ·3ðýZƒ°!8~+žuM€8/œ_¡g°›Ãyd;hÿœwøÆ£‡Ö~C-‹^Û¾ªuuVpQ­Cmº­¦ß=nÜÃø¨:ŒØ2æ¶éØ :ÙiŽ^¦S©†ÖYê}ŽrÜ)ز »c`)†Iùƒ¡‹šà¼uÊëƒÔ&ñÏü….¤ÄMIe†Cl.š7ÓËH«©±>ù·5!£‘:ÚVíß(Ùõó“ð98_ê–os€¾¿è³Ž¡˜Ï,Š+g%2Rw‡iš‡Ô À ÌèÔ}œ Çn Ub+ãù[.Þ¡U¯IG`ºEv“Nmg`áæ©Óñg54x¦â0Ýx–b¹ wyÀÊÃ;íM”*U/J¨ÿv9ø1ÈÁëNb^×ÖйtJwîZ˜`ñ÷Ÿ*[O®KNk9¶µX†ÓubÊZ»N~Õ¦ëd¬Mâœÿ_6Õ¡î¸\2wùuÿ1‘˜"x=¦=Ý3)îóL±·°yÐÕ8N¶K§8Ä–}• Ú+°`½øšJÃÖ°ËFr`&gºò"K²hù)åX¯SM"°Ë÷ó&v£‰[ÎÒüˆž—ÉæuKÛi ×…ÇìÃIŽi 2µ>Ðú£`¬Í³MÏ.R1“F+Œ=t^ä·0’ã×’ #$“‹þe¬Y1KÙ#§pÜÔ¦íñç“aô<§Odqv›8&ñÃ- 'Î1eP^c(æýÑLÝ}V¡¯µI9ŠXï*Ñ Êñ ÊÕ²Ã<63лrkiÙjÊ·*< Œ¦¦ ä ¢wUfzðW=¨pUDð‹¦DÙ£6(õ+îçüLDpN‹Ú”«—44æý@Ÿxkx{Ó&Ô0½å?ßËhÃÌ]»ü€äàw \é¼ (­|ô}"ñç쨄fݱSËà"ñúäg\¯Ó)þõU•i—¸*.o…·ŒÞ${õÕå¢õ^S¢˜¦LZ"ª“ËÍ"¤ Ýv–ܽoÓŠC3®£k l .ïÓ©õkŽ€WÞ¯v½pÊ—ôP²å]ä¶µcÞ¨áËiS  yV\96’nÉkÙ1b¾»=)!¹üÖþ¯)Êä!‚ð‡Mx祟kœ¹¬õ É6]C ‹·.§›Ñ ¨ªHï-ëõl“6ÔÍ¿K´Àßh8á:¦Oui“?1LE4j³èj<#SßED—Áie&¦Ÿgºç5ÝÀò5¹W¢Îù./iì¾?;´] WÖëæAt剃›ôRj°ÀdBJ ¿²tQÇO;Ô¢ˆP¼fFÑ÷úZ:q3®w‘^ø~Õ¶|œVœ—NbuÈ;“q˜ƒwoØx\gk?Ç.;ýH+³8†¤Í\Ð{춪¼m—ƒ,ªfÉe ˤ48Ù“øç|¢Q݆¾XMü'½hŠä’‘ÑÆb ‚Þƒ6‚ë E_ç‡ç%²AQå›lˆ1µŒa[| X¼ƒ­Í¥%Ù^ôƒ6Wj—–kÒ¨dd¿Z?æSO½ 8ç` $íæaøò–#CXÃÑ›–§i„èUº»FQxpdrËÿ¥ÍÞ4²"Ù–3#èýœ3•@¹9ŸÖ€éMÓj²þ`¹ºÍ–s/e¥±mú¶¦H'0Œ5 œ91É\åu€å×G)Tð¬ÕA¤ÿs*§^ú#”4&ÑÔ.ÏÞ¬#z-5‚Üßue!•Y'µ~˜Ô*r©¬¸ºÒ=gÙ¦ŠÏÔWÐ…Ê ›‹a¼SZÛï­=ꮲ\ÿ…;]ΔãÏlü'üï¦ð˜fòÔ˜±ÿòÅãhTS–Ù‡Ðb. n†o¨]˜O$DT’]ô´º4Ï‹Ò »NÒMÇ¥ÖïÏ.‹ÛÄWÁˆÐk>v9øß—ƒá&=É‹58;£Š"ñ­£Ž ZûP—(ØMª¿ Ù¶dâÏññÁ¬ê|fÝ¢ÊK¹ÑÜòsó¨þƸ`ì{%&“`\&<0I"رXŸ9 ‡Vvâ<€ F,ÉŸŸÝ¼öÀõ÷ú1‚á*Jžè›’JûE¼˜„ßÑ8Þ‡ŒU#©éŠŸ¼!"0áy”â9òÖWL|C# .Ìd± --ø›¼kÊ#jk_G–1ãüÉ”X †i‹µë=кš©#VœJkµ€©ÈÚLut Óï° Òè²(óp£¬Êê‡S|yÜÏ¡pÒÜË)‰C¢?ZŸ&5Š)€]x¹Ž®–êX. ô K½ÆÚÅø&ícõᔉo¼ûÞxZÕlE¨Æb-džïCl]iTÆÚª©ƒG³Oð/ªqM®Áݪ„GPxÖÇ’’à ÄŠÃúr™Ãߪ‘²÷ÝÕýtþGõç¯ im—ƒ¼†ÅÈ Ýèë «9ÿ»wÅÔkNÇ#L8Nœhù‡ ö÷f¨2¯r´\Ä&¼xåYLž $£­f þ¼õg¸v>E9Ö~ÂÈQcíRûߋ՟—s#$˨ù¼Ä ²<¥¯FÆØSàè`\;'rqfkftñý}Ìz,Ò'3í®C¡•0ÜÇáK%Ùcó0–MË”†½TòåŠ?0Sƒ — <0”q[AeN™YGÃÂæa>-JìŽï²{y„}¶åÔón£ Âp˜ '¿Å¾ñH¬_]Þª"¬DG)ÕÑEˆ¦9(®#™dœùæmBñ#nÕ+âÑ“W÷8AtäÙ%Ì|'û(£|»×®ôƒKk´‰bâÓ„‹Üô•ÿ- §äCis!qÍý¡ýÑ •²kª<»´$­–ó[w9DM9J›ç¨rSne•²RvÖˆ‘s·G°°É^iLð°è¸ 5؉–MÂòayXdP9Z°®vTq’^ÕeÇ`¦!Öä×7æ{\[3Z‹]~trð q ¶&½¦ú̱ROЀÛïÜäd¹“¶|Ó†%¨|1/s¦I 8ÿ?¶/U>Ô1BÈUÓ©Î<ìG öR¦4n$}pÓN¢ªé˶Ny+ž {¶ü ã;fŒ±³,à 8Ÿß|_3=–­ û”[®®?R¤ûî$ß:¿±f0ºôáöyÆÙ¥¹àŸ—ù4ºçÎñaö_M¥h4òÙ(fQta&Èn"ÃLœƒ)’GWnñff%¡Á?,=µ5e£èõ·0\.dJLf?ËSàvjQ¡L£o¾Á ŽQ"¡¥¥OlfÓ;ÌwÆË°ÏlÚzOˆ¾vx×kœ„žýkàrð„[’á”q>‹ <¢nH“(üÖÀÛzLbH!øJ•5þª·… ü4rY1·®tCöŒò]«ßÒÂj U}¨WlFüÍ$ñÀïÎrÐ…*8¹d¯6IFáö…ýc3Ê»ÐöÊ ðÿÉshˆY¡º:‰xÜœÝÑJ¿6 Á¬é5°âçÍEryçF:§Ð~°1ír𣓃gtLCòvɬðÛ×eäUo•׿ç;ØEp‘úí©¡^:^ÔšwÕPå.W±u+!{ìÚKûæ‚$ µÈÓíÜÍfvƒ|UDHÎXu_3è¢Wþb™éó}v½Ÿo ý½¿_³ÅçDôÀŠ$ß[,•#ÚÞÄäAßÔkÙ”÷~××FŽT:ò'ºäòͧŽt—„­7ƒrp lÛϘÿ±]\G5%ØŒRAñ¬L†:Aè³b¸_vþLñðÃ鯯Ÿæ¼&„L§ Ð9ÈÆAašYòSÀ ¶¹îúb·j$ãìCHo~ÔT`¾¦µÞE{dͯÏþx‘I„õUzãá5HôeÊ È,´´²öüýÌõ#µYð¯ºìÒ-±Qž°÷,¤_}¢¿¥µ˜¹Œ¦W¨-õpÄ<²¢  _1PL‹õŒØ·\¸‰7ѬƩQ÷x×1Qhg¢ƒü5j 9µŽ”;K‡70„>·]ýk»üpäàcÃ…dÅܤЂeËtU»4\†ç¬¥s/m…f KP XpœQ´\N‡…-MÄ Cç_\D$ÚØzU&ÙsçØåYvºÚaÙíF«ö ‚â'“(4ÿd‹›ÞÌó˜Q‡_ ïÆ­çatz=™‡KÛé·÷ò-ïÀ»,fëܫшM™Î¦±aœ'¡M*mã\¨d©*y˜¾aºŠywèÀ{ãÄG€+‹[úÚÎA6ƒ–/Á¬ú'Îc–¥„©‡4è%Õ3¡RzyC·UØótÒ o-õ<%ˆVÿëIÓjÁþ ˆØªŠp;"a¾*žµR3uÓµ|`mC(ɨgâÁ‰gà=Îi¦}ÞÇ1ûVSÞ£úë|t@NV¯MÐe¼©Äyd°ª‚±±ÃOõ—Â×…×Ð¥|Mzκ%:É )³Dq¤ˆ«ývýTB>Å·S9¨ÁÞóf¢l%ü|}&†‰}$·A˜w¨R1Ú!5rt±ü‡J0·ÑjÝè‹ÌÈHǵèyŤ-£ÊFí`ýÎËT»üXä Å—œ 1‡¶ªXºa÷ßè"?JgIÎó›öf šò›éT ™ƒëÇ/®2õÿ£×e‚å!ÅÕ'-tfÀHX]ºZ›­4ÕùÊw­”ôØÎ¨™®h*Ÿú7… pææùMòÏâ¿êCc1¦;ÂcXæ¨a«ÏòÐ@n#"µ‘\uʲă×£ïã[†I|%÷°@\H-1pj‹Ì¸\ú†mã<2šÖžpT”Ü’2á%ë÷‚-#pݘD-CTz ©‚¥ƒÔÆ(‰é¨8TÄ¿d£‘'[2Q8OÞÊâ¿«)¤.Àˆí2«—–¦P!&nƒåwÛJsr°†¨|_76Jýa¨ïJG×@‡笿DC…YŽ\Da_0ÿ²U4̽£•Ov9øñÈAŒ²´"§ÊµÓœÛܤ ê ºú·(|>UÖÒH˜}yân€X©KÈ£.Ûå+ø­Õ¥@ßrU¸d´MŠº}õïÆŸ'.Ùþìk2ºЏHËÙA¶,뮥ØU) m 5….†ÈKŒ½÷á g`2¿®íˆ} ªcæ¶®“ŽÆ¥rцëÜsø….ÓD7M¸6Œ-’›\ÐOVs4&¡5fLhz;* î3GH ±^ùH²?X&Áa¼E—ŸM*?€ ÔˆÖfÞþÖÆG&»ul¸PSÒ"Òwèèz²_¿ß]¹ÈƒÃ-ÎÌu×-Ü¢%‹+Çvß#åãïûGTÊ»‹=E¬Y{Y÷;…W5•°>ûu²¶6GðtÃ}›ô"þ…«ˆÒí„ÌGE{ZKx¾ª²_=e»‘+Œ.ùSá{‚2ç¢óÁðRÖmˆ+m¡ã›» ãW£ºÞ?ö¦û5ø(òÂ-,ÏÎ’r.P%ž)uóeµë/B]½7k7Òév9øñÉÁßa­þš]${–Æ0t™™[®±Ï÷÷Ñ1þ!Ü• aWÈ=zQ,ÎÑ0XGÑ„4}&“/1EA0zŒÑ27ç0~;†æe]6.”Ãà⤅hlBëðm>ÂÄ/‹nÓö÷®›._í´‡a¦¶òŠcªÈWu-¹­«JJ±Ñ ã9!ü®Þ6xBgÍ0Rx'­~€¬Y_%Edb+À‹à^6[Þeß+µv½ew,"ö–Q¨m¬£TAÊ‚qb„±¯K<ŸéD£m÷50‚EJQFƒÝ¥8oüDuNá7„dZÁçô¸ö½æ+27Èy n2„k!*ä‰Ï4NÓØ‹ùæð’+5Ì<ùàÉ(…r½`ÃöµsÑ *Ëܘq¶ øž=¶Ü‹~s}ù§8¶•^ñúŸ¦µe¤eEeq2z6?&D[ÏÌË|hÎF²ì†J s»ÛˆÀA¥ašÚ®«FHZ¹PÛnIÞž"#8¢´7ž:}ÆÑWîâa.B'D/Uu9R —:H€„Ö8t¥ öƒ<Ðu3Ÿ]ù'ì)·m4{ìrð’ƒ–Bº4?LãËZ›ñøŠÊfÝ=]¸Â&;kIIï¦GÜw/.‹ð?ªlælÝ·oêc̓°š5¼GŒÜ¢æ2!Ååå?ÈëÝú±—ÄK=RVµÝ1Øð‚%º¤,%Uë{Ùk½‰è+hwvyØ2Ù,Žx Ÿ*ú9_èï¤ÔâIn–aÔ¦QÛÅGPF™W?Á˜^,mH]ÀŠ ?À¨žæ§Ú,Û¼m-Z4+³Ã\r]$¾ì|B‚L4C{Pl"¬*cá3õ¢)¦>!iÙ¾\À†Ëê õ¡uý¾‰zPi$¸lr÷\Ô!!ó«8‰®>$¯þI{û—4È\²y—æ%©äoú’Vˆ¯¹â… ³–±¬»×&M¬ÔJÆç=VP_ÔU^²ëá¾Jt/ç¢OdìΑ<©ÕÛþÐ×!/„SÐÕ¯…Óe5%ºÀ§=2óÞãÆ Œr&Ü`U'ű˺lÇQëTÜö“aŸÐ°'­Ö&¦°úÆ_œQÐJ£lcÚ“$~ЮèSÌ0‡å±çºfÃuõ²-¿*L-ÃìîõSÕºûI¤i ΔArb8Œ RÂ\&U±6‰(Ö'3UžLè‚Erîa’Sôz˜X…ÁœZÚ–Öë(ÑüÏñzèy•K‹)\ná ó‡YOŽlT2F÷¬Bt1·wèÙtj_“®¸€ãGiùÝG¿CÝ ¦I,©­i_1K‘r¾ù«fiŠø¥sÕ2,)yµ[©ÚÖEl§××WYc,òAŽrD kŸÉx¤»ÔþZÊ«Àrry¥©ü;øÜ Œ¬nv‚á>e—ƒ£¤DC¦Or¥›k›èoŽS¡”©,uÊ1á ÃÈh ë*©йô ‹Å9÷ÀÒ¨¾ªMFêäì¶5Kz:x>“c³O›Í‡-èãÉ̼'’îë´Ú9¸ÆtÙÝü´”þ¥jÝõÑzÖnÐ-È”¥Tݲ´Oî'lðiØÓTgšÎ¾)̵¸è¿²R&Êt9«SõrMû&J&.b¼=¥¤…%ó ý ÿ¨2\òa¼.ƒéõ?𓫃íu“ˆñKi”Ì9ÕŠl¿/0IÊÀ6hûÑyg¼ÅÎNJ(yƒMWÖ±ZÒäq¨É`SÏûÀòÈxÛ@ªs]ŠìEžm±ü…EjdÙ¯r~ÀÓ†¬FЏOS°ZM°jܨ£ïW:p‚Hýñª‹¦}|Ig_ýÚ AÙ{üÉEÁ¿Ãä¥úöøv.’½ÈNÝXZØñK&_Þþ‰dÁ®‡®æU³á¼/CLŸ^—Ü5 Õk k$m€/<ÉQ.ŸÆ©½x*Ŋ✎(k]„úEñ`GeB¾¯,Ó˜þÁ2$%Ë!†Â¨)À´…‹.W”H,üÖÝf3Ç.? 9h-ߘ<¤`¶C“«Æak l^ëïR£Ñ;®sxôËøo¾·÷ƒ—"S÷AuÙ²B›A-U¡M-¯ _ñ½o¦¢äNûÅp¢)é2óÓ•uÒAÿ—:mÀ Êg4hqû²(Qô8Œõ;^Jò7¤~°z-K_¥JcºiY‡±ø¬ lÎ)é(-\&1öªâÍœéû,7ØüáDâ_„ õÍ: ‚e ú á5|œ±Ò{̶#`Ä`š–@î]ûŒÓ½œ܃g~ÇÓ„2/Ü"ÆóÞò¾½âo!%`Ôº¡ÕÙmIH×ô.NnÂ*øâÅtÙêܾœ5§œ<«¤ú¾¿² ©°æX‘Ë%P‹ Å5rvNZødX|ˆÖú›XQ7ó¢EÞ¾¯f°fFõ³ä1W\oE¤C–å í©GÛ×úïëÕxÞ ÔX2R+‚M;ä£É`Vx´ô©bŸÀGÖòÝ.,-J/z_wªhS2÷…Ú¾àdJën™ 6´X¥· œ±Ñ˜o)»qÜÕ#(ÈURìöc ¦B”]~Œrð²t0e©[» "(²UÉO…ˆc’¾Ð°7Nt£DwÀt¡ºm+BÆ ÂyX &mˆl›.5ÛK¤hRMs”£¦Mæ xã€Ú.uŒ§¼Î;E]Ô¤ êÀʯ&2I©;6^·Ka; ÔÈÉ„6j…o'ý[ÞIeŸÆ2Ǥ4Üõ•Ð=ÛGbz|Þš)áÎT˜o§± _™¾·Ñwä(c.€ü%Fz*ýFy¯‹YªPÐ}ž‚ v—v K0¶EmV°‹âþ ¯ÖÜzìK £œþfLMùX}Íå™¶ºØ…Ç“+QÉz>‡fcm¼¶^Ã|¯µQ™‹îÏQJ(â¶(‰ãt.7³Þ²GæLz¶Ç†ûåÏVÚåÀ\åIPݔКu¥`ú::ߘÃgçÁݳ‰?vMÊ«„Iôl‹ &WòŒ%Œ¤7&+R[paUÙ›šmØÒf¸¼x;ÎiH¤8L™•Ù¶žøC¡ûÂÁ´(âµ¼×Ñ”{EÆD3õÇX©i`Y˜ÑØ*+`—îàâÛ £Y $G]BØÇƒáhq ¦×zó KO±³«nKAù'‚]~ŒrÍÁFâ$óáÅjÜà0–Êîš"|¨ ËÇÈH¬žÂM<5èeŽ7ð–§Åü`Sƒ ÷¢#o,©c©!ÄIâY õL]ܳÂÂsž™ô®z…Æ-?]TLjH#(ý> Ó,éݸ§}–ÕúrMW4gß5p—’œ0_žÌì Ÿ&é¢j±§×Do°cWÔþý^>ø÷“ܹ¥²ŠÄ;{¾ŒìÅë'è ¨O‡W„éø£ä&i.´÷Ê$ôwvVägŒz&3–Ïcmèúî¶+WJ˜ùwE-»E –s›õ‚'þöºUœu‡aòì¥ñYÑ7~yß¾+á`!ŽÀ:«¶ª?(7ÄæŸQ{ä}ÀDÌ,¹m/B—×ðÅhé-P†mÑÏМé4;j0C!8à‚áÀlÁ5:¯eîoš²_ÆŠ@Vg-:Å2©3[“ðjðµkL¥‘²=ÇéJ=i6‚Ì –ˆ«T“¾,°vëÞ/ª4Ô^ÔÊÜ 7Ê¢D òlÊ…H76·:šõY§Ïá!¦¡ ÄЀ@ººi`XÐ Ú_¾Õ÷&j­±öÈ“Ê=˜?NlGjCÈHji‚0­)ŸÖU”H]툛qày¨Tæ.‘‚]~Œrð!,Ùl¸l½«ËDKÑÒó–¹ ž¼.RXÖ©XÒÃ…xœˆm¿å'‰¥¡„öšV†yP_2?ŒÏR&LN0V]‡‘Ò|ÌÀ]]4K>ßÅzÛlÍ)îŠûÓE«¡ç¿© !êÿ=[!GJK™KÕ¢=¦ÒjÐ £ ÊB½ò¹¤¤;Ö?’ø/xBfá@ŽŸªcÍ’ðOG»T-D¤qú‚Éå•tŸ,—Gl‚!Çä~ì’Ù+œw.×}lÕÇñá hßÞO™sFŽmÓ7Úc§VÚnÖZKâq lŒM–ÄèÑØ—JmÇý¸Uìû;h—¨=¸K³O~õ3Geb³VDóB¢[%•fcqZ¤Á³]•|ùª}±.ÂJ=óf¶XÙY«Ñk¿¹@,%Š\z…xJÒêÌeçG[]u"OJyqvr4)´bI!„ïAHEútQ£8Û zÑ„zH -UoQ‹ ¾ŒF£²¶0<ÓôȪc9¡4̯­ŒÛÎ!vmJ·†ùUÎ÷ŸŒúмjãõ·@”÷“ `luDÓÜ„ ÆYÙ#çݱj1ë;tQôÝ:åí¿O¸ßY‘Ü•lK›a—ƒŽ\*úó«Ç\Z1¡{·¡X÷üÞ*~1÷žp4®‚Ñ4“z#!…šu iZ=%²ÅÙúò•ß±"fÚx¥ðm†È\1ÍÆ¯½ÿôøhš¬8w Çrí›% ½SUŽm ‘·£8b†¹5õ&j)ŽL\uY´ãPFxÙ ¶{Õº¯Þ<ÈAÙ'úµj 7I´M8„HTRVÖ6ÿ‹wzŽ‹f…ÐI%(¸·ÍÎqÞôÑ >ÓM®)sž>M{v¨(I`Æ;è¬~æF:ªý_È͸ÉÑZ Á·•¶œ¶Wá). ¬Â3ÜMÕ¦p†]ª)õã~beYJµ®ÂÂÛ Ä²M¦{¶]ZWäÍ=]ß{eùÔIqÓ¶¤¸]z›‰f˜#Énvvä¥gÜ0´´‹¾äÑ\Þ,¨¦íôŸä’a:Zy3Öiž„wkJû’‹¥ùˆÏÉŠ¢X篙à ë©ÚÓ :7û_N†Î¸®-¿X^Ý+æ½÷;<©W«ÃS{÷,ïñ–•Åt’/¥xw¯ ˜ÜWô( ïüá0|—‰0e®âcYî§B%íJµÐ<Ø7“9 ØJGWÉI#>-v9ø‘ÊÁ®Ìxr¼ôfQ#Ѭ©}eµÌÉbªr½s‘yÆQJÇ‚T „G_xFõ+†} #ÆØR[µNÿ8iÃ쉉Q]4bÎùö £=BÁñ¸O—l¸æqy?=Lr¤ªÈyººÇ¨ºvöšSY´+2;hº=©<ÊÄYzzæ .¤ûb\>±ç¹‹—)@äø‡¬[ëß<~3h õ–‚>Î_r ¿ØáØnxadüŽi›®”r¦Áª™ùêЯ»ž ?Uï§<ÃÎy ~(Z |—Ð~¢§l;o÷àž[t嫨îª'™‡ZâžìkfRâ1Q o7ý ¥m¼´$bPÅ-Bs¤DE_INñ….Îà˜éXAñAÒùíW}ê-Ë™nbÛyÖ¶?æ¡”m€a¨¨HL¿91†GûæO•k"ÁNƒ`•îvÑW‘ò¨›•–£ÖÌ,ñ)š†­@D¡tqàœ1O°R¼¢ÚžJ4Póh0nB•:üVl#mQ“þŽÐÝ”þìCm©ÙŽ\í–¿á°è&µ`ܨÕH-pú2a ô¹p¢8IIøGôòHN›_^à‡ò¹ƒØ§H}|‡2ºÝµ±÷ªèŒ/O– w›(2 n‘ÑÍlvËøÙt#X£·yôPÞ J°fÓ¼öFë‘fsæR0®ø5ö>éýýÈN¹Ä^¦ž:Sœ—píy›…8 Ï·yƨÁcç³f á êb9®3<±Á€&÷džf½q‰ˆŠÓμJº³ýSà]!û¸¤W3¬ðo YYª\YAí_»2½}0$/ühw+° jåÎ襽I¬ÑHÚ¿$­+¿ ÞÍ:2cÌšX fÂ'Ûƒ¥væÒ®–ZËÊ3¼ìè°„Û?í%!à(;H’y¿ã™ e©"ë™íÃnkb3(´<\¹XºHŠ‚p2ÑÅ¿ 3¡JÒoõ•™ÊúºWÒM>ŽÀ)üÁNÔ‘ÅR0l`Ϸȃçñ­›·ÚâsäÊÏu|Ô×oWÖÌI M®ÒÃùÕ}9}÷Fu fb ›^[Ö uºEéÑ*ÿ§ä`7¹È<¸óaî‚ÍHÎõ =*¿CÁç³=Ôx¸ÏÄE^ zWÕºUø“²¹k7)‰–¦…Ño ÚP ‚¿nÕd¬ú*ÌhöU6ca& Ö•S!ß{/ü¡‘¡phÕ"jí1vùô#?ïQŸn½ìçó\VœmMð=•9c² BÉSèÃPåTIö¹õ ñäÿ$$®¬ S„а`lUÁØÌ† tRˆ’ã*úÑw ­Ë‚¦_“¸?›"s ~¤¨BÙŒ¥´5·ÿ£#~ïS§þ¸×ÝÒ(Xä«–àQ¡Eµ¦½¾½óOWHç¹5·qátáùëOsjèÎC.åmÍPbÐ ªõ*ÂŒ!…áPɦ4¶LÊÈá˹,…¤ÒëÄav ms’î€A>Â[b^l®l°™nÆ ÁHû´¨®‡Å4Þ¶¬ƒ®o‘Jb[¿_õU-E_öøÀøHi;/ýãІ©Ua³åØÂ¨åU仌oÅfƒÌbê'Ô±™¥7Hì“&·¢Ü\VzMkÝ¿Œ/ôüÒÃÀ |˜ÜsÞ¸#mEQʼJÇ7ñ^›TÿçÍé­+vœ‰O•ƒÿ#rp­T^%AØ6þ.mWï¬|罤Œà{-“ Öx ¹Bë÷Ð&ÓÊ+ ãÔÕ>2ó¼V4nD56ú¸ŸÊM6XìÖå"é­snûV]ñ÷V DO¢0¨=Já{°(óâtWaK>(gƒlÉI[Þ¼To-à ÀkÉ$Èrú2 µ°^3/3:oRápátÑñù1R“œþéô _®¦oWQ]—jµÌbÃØÖž‹°Kù dh£ >‹¶žçSû¯OB!Ë_YM¼äuÝg]—UljŸt|œW‘GJ–åŽ&lל#ñT%Ë(«@%ãæ¹/5Óµè+ZÒ±ºóñ,”8R±²¨Bä£ÒF3¦×¸9jÏÜxxç¢v!Ò›ƒY¨Ý…o¸5r}Pï–,™PÍKñŽ4ÙjõÁW¤²™ð5uwl·ÇŒLµÆƒÌAôþ>ÆóÀ?§¯?6‹2¶+º€¡/ÖŸþ”.Ð]fEúî€^GÏÉE:õ sño+z`•1[1ýwF̕×Þ$ç„yfú—û±ÁXL†Ë5põÞýkF ýPó™é ˜¨h¶õïŸ2sN,3óÁ*g•p¥på§œò‚U>HŽYåªg3Ueü!ÿíòM>ÐdLpó!;!Á,µNÉŒ€çZ-VìLkÚJ’.gå1½;DÈœVh«{{÷毿©äòÿ(#bÙ€ÂÛÁI{;Uí6šÔVNX«»5X¿¹vi–Ñïë®rF3¾dÓäκ>˜ÔËjË»Ô=òÎçœå$™ZÊc†“koßePÑ,¨ئ¦ÊÁGërþZi»ÎÈ^jHcûïËÁÝ‚ÜÈ€õ*ÿ6¡’Š`ê!DªÏé­+É]ü›¿)áEëóeY‰ú¤å2ôٯ݅„7£è¬ƒâÃjH7Ï¢¹Häj@äEf7¸jµ«Œ‡K¬{ &Æl6 Ûç\U•)ÛýNpÔdã‚¢:s¿aŽ „žT)à¥]Þý™¥°{r4Ø"2O$8á†*Zµ*òåÚ±BV*£¤°“š,«± U¹X¬ÂغHƒ^Ð5Mû”¶VŠNIîëñÿ• rlSÀs<èþI+P×5·´×Ý>c?I3· ÄõMmI®“ ¸ÐX]r~<ùT,]“ á|8wI[é±ÔÖ1ÌKQ7\ļl·½×Ô ¼¶/¿k8>t„êÐG ¥G C˜[k§´J®%{G-š›4C¨þÖ{â’ÆRrà´ÙŸ7Ãk$i4:¤O˜iµbݸ3³"<£¹Nš³-Ùeô"Ì9Ìbù"¸ñ<ºìuþõo-,Ƹyª|›ßK5ûå®üëä )„„ËBŒû[שwB4¶G äùù‹YüϨßù&‚/hå'4Wɰ ®þ0ûv$ÞŠôn*éØö uþÝ+´| MIjÜì6iääµ.žc?{³Fö+¤‡c霋¨åT™ý•3"Ýþy±;Z™¸çÑGŠ;ÖGý³]y¥Ò ŽÉÛgË IÜ^D 啊‹æµy½¢rfÏ™S2 g¹ž [‹Í$‰•5ðV jSº—‡J-I+ É;ó³ý“µÙ{Z¦v dëú[ä‡àY½q eóÒËÐ;‹j#âkç¯r¯·§.E‚Þ6Â1›X/=„&œ¿e”26GACú*U¾ëˆÓ&Ê…ü×ÉÁ/£}L9Ò„êÒÖRo Iš4ÔÁèæaºÌ…`61ÏøáJŒ¶­d’N˜‰Xä5h†Ó¯C`À`ÙüáRÀý£u€“ºTŠ™Zšo0%èŸÎÈŸ›î xŽÅÈP4·G ·'șؽô$`‘‰,mX Ð×TÊAú0‹ # ¾Ÿœüï²ÉoLtƒêò½/ ÞG'3OsrÞæ’ä‘$lÕÁË«Gfco5]%½¹‰Z>dÜC‰ðÏè¥éGÈ™Üc©Ñ~zbÝÕÈ™²ä5ƒÍÝ=þû_·þ#äW¦wX‚˜!âånE¨c’—{ÍÓ6YO|±ÈÚúº1rx—â8¦ZÝ(ö¡o«LÊ!¾:º“Ûx9Hp™þô‰CëŽ×ñíÍìE¸<èhb3g}6÷Ÿ0¤5°sa|¯ÄBvªRP—ÍK†×.'j]ôÞ`¼ÉFÖQ© ñl,J×OYüþdiM•¡éµ§'’¸‡ÏñŒÔ-,Q7¤3¤Ji/FÉPJ÷“´CŸÃß¾ÉïAÚ,+Üüu—´×–ÝÓÍ|é3N©«®ZTSƺ¬‡Råà;޾:'Gà©›ƽE3«¶0È>2•þ×l”öí„ÉF¶Z=µ/¥Ú®’Kmý9°³TaC(!Ù…½‘ÛPµÛ£:3VUd‹ÃŒùL+c¶LÐeø¬C7å6IŠeQ1Vòui«Pbb4«HõAáƒ= 88;.\wíÉ}úf€|NO±JÀhÍ‘Ì5 ¶^æ×ä ¬£ßœ£Û+S"Ï_oãFôe2èOúç žTõLÌñþ»…¨¸àŸPÙˆþFûn££JÔ%‹¬¯gù»c¿1ªO¯zŽŸSCæ¿ šÿ>ÙO†\–U'óUˆ³ùp)¸nÏ"¬Ž¨­tË. òMŸu;}yxcÞúž_é¾Õè–t5²3lî Ô]¡ûÎŽÁê¡ßàxBBUNZiÐ=jÕ÷=.é¾úM•g¶@ã-öaÐàne3(Í„þ‚¦vˆ„ØÂûc]¯à¥’76éçpM¬ÆÉX"ÞúzÚ¯2šû6 #6@ idB‰G/E—9u<ȉ7Ê«t…>3ü¦OVÁ¬rÄq²Y]S¬ô¾J™×“°×=D®ˆF¢Wv.g"¿>²)y€ “à·kÍÚsîôÖQ…dúð@–%&óbiišÿX~/Û†Mi³ÿ-Ó›¾ŠN¥–íyúÖÞé‹6]p÷a™Kd›#G@7ÑMç7!2ÔÎÌ>%€%gV‘<["¡Ó«0qk å²Ò¢(ÙÔà×AO‘—ÎÒ¤_ý‘*ßi Zw<ç¯RòÙ¿LÕÕÔ4Ÿkö:ì² Þú÷ îÈP©*kÏü­Ä¥ÐHȆZà&¤\ô¹M£š8žzBýëœô4^ÐÕ\ts\%ð c÷0ˆÖS)B6Y”Ü9e´s µœ(­´m,óYѪ›£ýd–T{r;ÜY¢aøNî0àöøq*t sô.Þ+“@FxhÕêff5f&1ÅÝ eVæÙ|ÐSµÞ­ïwÝË÷¬ ÄOÊP)»–5Y&¤èö8GYg”G}•ªž'Ü8³‰Y)È)nnjjû"‰I™]†æÎéKêyuÆ`ã: àhöQR7÷‰®öÕ}Tµ‘ …K³Þ8‰¥'Ôž"\lËènÍ:úù™Ûw<"\ÎDz'5j^êK5zt½dÆ:Ôä¤ÙÓ›ˆQ…^Ö@öj`1ƒhÆ4¤#JÒƒ¶$F.^ôõ2UÙ2—,xïÓä´?ºàª¨Ž…]Þ¼’• lãoГ¾']¾ô­ú|¾ú¬8‡vÐyè‘*ße`…"EE}Î9˾—œEíU»[rÅ‹j޹¸ÃÑ!f¥òaðR?DÆÝÿÊqqRÖ6H^ä?Á*»WzèRr…*X©±µ‹†»ò¶ôª3G‚µv'$'z;?7±‹ig` þ¯dËÀ ë>µp'IVzR¬¬›z ƒ‡Ü0 É¥þu2ôðI‡Ë€¾ê Ô01~†rš?°O]ÈPPuš¢rW,V惾 /‹Žgu"l=}~Ï7R-Lkç *a ä‹]RÒ7Ú>”Öª»a¬af2’üÌâE—飺ãMÌ £› tÐ|QÌ™·]P‚‘²¿"*+U×Ò–›x–0”XÏ{9Í ÏBWN‹Ÿ¶Í ÚdÄŠ2·HTK¨g»ˆÔPòÒ+þËUXÀåL(îMKù¿ÉÅòö°€ÎTCu­ê”ö¨âÄ‘¯žÊfÒY£¼…¥Ré¢å‹³¨HAɵ‡\ѱâÜ Pæ4Ü[{ ¤¹úoèŽê¥»ƒ_ãQßL\ðú^RXYêCb:€|IžW*•$0—ùiOñ:Tm“–ËŽ—Ì£ïã3è³…¹£Q¤ÊA'rTr©ð—A)”ø¯’ƒÔZòLk¶‹šîïŸUƒ™ù´.Ê›ÌKB®ÿYÁÅè?Éù´®aà 'Õð‚åà‹²¿b@úñwÑü.FÑ]–¤9û€U6v…èNÈÄ~9桼Áûp!Çudh`‹Rfˆ{ÂÚÅ¥`ÁW¸³U-‡â[j„pÃçêèœõd2—`žjïÝü2§CHx°¬Ý%zÚ¬Õb ᑺ­)ãceòçlÀY¿ÐLJ‰©†Û毮¶9»a¡Æ¦Üö8"cXîy¡”Ь޼™3 BtPÖ²Ÿüæ$±£Ôæ;oýç9bi«Hø¦¯¢jYF¨„#/ ”!+bÖò‡¨Zò¸±§¤Â¡lV)jÕÇŽú8·¿Â/fî8ï5¸Ñ ‚™6.K8Rj©6œ·Ê©G’obóŸ+YÚGæ½Û(pU',r·Áýô)žp“!lÕ™ûy ‘Ò% ßèÉ^¢]qõ™;FO’·UùQ©rðmF =zy©¦”Ê¿B&„;@`,°Qƒ1F—@e¤šØêi5¢€¾0ó-ÇÔ³q$éæbY&PwXv†|"G{ $Î+ó•–i\¿Þ'L¯ûw-&™s8ú1/ÂmÒÈð ‡*N¿N$ LS¯´yë,(¢v·l˜d¨+Ù-⯲kºq3o"e·‚ÔH ¯é#ŠÀ½¼ó~ùŒ~¾pø:Xf»ìÆèœË1UNɿо,’íøçìS«ðÕù™°½ÒüCÖ÷Åø¿e‘‰­D™¯ýꩨ7BËÚRúhލÎà„E(¥Œö“+Ò[nO±íÑß Ž0M¾‹Ë3O˜™#êJ™A“JÂZ¬ï Ž[_±Ú á‡k¡·; ®iTÕ’TÏJÖ5(]™MøùuªTi |/Ð¥ÎVÒçV|¢Ò7×ÞPå¶t¹9/¾ñóVŒV|9éÆž¢ÄRUT] y³µöÀŸ+ûåP´`Œ+ƒ0 ÅNÛ}QðpÄØˆß‡P:¢Õ™³FÔ'ø³!0ÉÐfj9ø¥§@ÞlélXÆÿk~PO }JWå(âÞ 'ÊW­&ïg5J²v:ßÐoYälÅk“Xÿq®±TÓ³Œ4뾆Yò–Kh¤ÊÁ·àVÒdD%ÁªF¼y9x¥X“a}û"XŸb%¤5L£é•‚òÂ<쩀ר(+8CÉ!«×Û8>”J5üSˆP|IAú÷ÈsµÔ’©cmVDÂa÷ˆš™’û0^ð‘’ão¯Ïź˜î0úãh'­ß1Õ€2*qÔv‘çüG]’öAúë¦*˜ çéY•¢€¿È y~¦éìJõ$¨˜XY®I–ëá#)ÑÞ‹Œnð„|N^Š*²^„à›Pé|_÷u¾`ý寳$F®L3ßÕÉá%Ua=À:"XšëjøÃºØ²÷wXpò#5mÔî`À*ã0ßl4Ç¥z¨ &6cE“T>LìÃô¡iÃ÷§(•™|ÁAka3ß“W5W3è:”Ê"?é…ÌÆ$Êáß?ƒq„ªVµ7®(ïÖœN÷Z "Á#e/:Kâ¼óM“È ßàLêæä“J*Іõcm÷D/¿þôÏ´‰ì¶Nf¢7|ž#hZšÃɽ)]ê6¸"‰(¹PÃ\ÍãÌå½ßG¢Ÿ¦”áçà:Ž{ŸªTÐŒW93Ë?ÑjÑ…e2 G•Ex&Ê)Þ-ì>İ£'´ÀuµO8¤mº¥+ï}5Mp(ÓQMA˜ÕÔpÕ†,‹D…ÿí݆£Þñ–ý™a__öºbŒN•ƒnp*ê4 (ñ(E’|tÉÉÈûÖñAÞv-,J¼AkQ•H‡©°Áà9dç1ú‡’²©F9//yd>R'0Á&N , |¦Mµh üéó‚ð:˜tÔ¬¢üRºßêÃûBÖ…=Ñ%ïÕRS!?:ÉܤÇZ¨ü;íkL>å¼ù›ío3“„ê8IÍô‡Z¿IþЋÔQ}”LAÍ}ùs=‘k±RTëù5çÜ løOì‹]ù1ý­.*6+zùû*qžøÚGbªºÿ_³€ÓvÊ)^§ÌîØ!Ií(äNxmɤ“Çs䬪J:û)í^2;ù4¥ƒ›„\¤&šu¤4M/}% ‡s ÝkrÂõ&­ÌÑzÆs"N>V©Z1[““©Ñl£{ÛœÀ Ó|ñ´¦:`×B m½%™cÍ·“ÄðD— Àp¿ÕQ‹aÞ³Ùë¤c.O*ôàÅ“¾êšj °ãÚj¶Çè¥g4cGYo‚g¿œ´_²~lÊ;ÊÃçNÊôZÓ6)Qjg‘ò‰5ÛLë=–€a°.ªAÆÿ·Ñ{eÕyÞ±3¿~"yZzê'i¦R+*U¾Õheâ›ÀBš›ÿ=8²•ÓIØì¤²tà ͲX8<&DZóò (9÷5)E‹NœÆÖ†Á/Tž6tÌm¦$ø’$æ3Òê—pwYwòÞcZO­ß‰—¿v*”«ò%„bñÔ{‘¼ê,ˆhn*Z°°é£hÊ– ú]“Ý¥ŒbÆiK´CýÍ.Æc­[œN÷å=Vo;pÚOyîŠKmtcÞ)¿HÆßÄÁt7|«™æ¡f›øVl»Õc1U&ù¸Ì ?)¯¾º @y4ãéÜKšuÐà0«I.3‡^mm¾!‚.;—œ¥B§‘éÙÑvGuG™ÛCà¦|678uSJëü·rPÌZA˜ó‘¹³ž#OF±¬Ù–q³ÉÇÙÔ±#äŸú–%ÃÀíññff˜}’éñEîò–H½\McQÇ&™Æ½ÿôÒc¦òuxM¤¤¼.`^yyš.dio‰Ã~Øy ±òÓþßç4=Ö&:r7÷GwO(4ë˜éV§¿“C¬µëoã©Ã†&VÕÕI•ƒo3`óëÊØÇ Èüäß#a}P$_L¦XA&ê©`Õaà|þMpŒv›çÙÎSFàóÍG «5è4íù‹¡ P™]!ÔpëˆßŠ3h¤ÉþÅ*Õ&¤Ùe,ÿ£Îç~nÆLüL¼¦…ÖæaÌ£‘ô%6›iaæ!wÐHó”6:/Ç16dï>ºaÉÈÂõð$ÇàÛŽ'û9õÙ»ªÄFUºQǽ¯EË ýŽßz»»¦·°‰%ݦåqmmÓÞ 7SÝP§3—¤ ?À™dQG-cŒÃäu~áÞ¸Cgø¹áÛX·¢1OCtŠû]\tM‰ÐÅ&0Eóé‘û§iÚ½ž¥ò}TAb1‹ †©É¤ÖÂÉ5yï&šñ1‚.ÂW¤àÃ"&M+¨SÍd(Ø!VÎÄd!g+›|_ô3,±däIxÞ;¼8bÚÅvL F—ÃKxò¬Ë[¡ƒH²æv»µ%?'1]5ærø6Àã¤5á8_x¹³[]@dU.Û[R¨ÍÀ¾g07Êå£Ùü‡ÚÇõwìÖ¨bâÒø.À±T9øŽ¬È¬"ôîõ¿F~ï,4_r‡IûR´ž²k–-•NŽj[þ^ªÚ±·³ØDxFÓ«J½¶Ê!m ùÉD„ä½Xü«¹ÊZôœŽµ¤ÝÀÎpRÖøš"/-oS”OKÓ›ä? ȪI&ÓPÕP´†½¢mû&9ULãI¥¿]€ULñ ?cÚ{GS}MS Òs„¬"¡|+›ä{}Éý^9{1Ìfp›Õ‰ p!º½¨1ÃÔl»ðnBÞ”uƒ]aÚ$ù‘©ðzL&0•‘PXëû”¡ÙÄp†>ÖŽ-ôåc]Ÿ n•ïˆÆm+Zä”W5JVøœ”‡©%é=ºrá/JÐçŸL&Ç[Q­ÒBÍyiï ú’Lává-†8êFÔ©mßøC›£  Ø95ÐÇq¹‹êP¹oÖ¥o¶mÝwú)ýD˜?'ªsØ#æêá‹ ëAI y6”˜FEnÙkà :RUãH…»üv¡˜ž rúsýƒ•½Ö$s$ªÇ2ß*ŽD“è-%Œl3{ mÂìù&¿ae޵ef¡4M;’*ßi .¹•.òŠåë>ý·ÈA,_îùüjl¥Ñè`ö>[lÊ®zLiwcw]ba™ šÌ=˜Âé¨šÆ ÍÑã­h­¶2mûiÌ‚„ô/÷©Ý¦5OVe¿ëðoÃt=7µ<-ø°¢¯¹OªkE:ÏŽÀ›n¹¹*h›f4ò× ÂX»ÚT…SÅÅÓ'§Oe/dHF;ÌŠ‰e7þú³ÑßïQö£dÍÙ{êÜ/Za€¤áKµ20wòpèUBîŸüýÀõ}CKg´yEÂ[$#eáF_^HÃ^ðì ŸŸÐ¶¥é|ˆÑí†Iþ1VZACÁ—éL©ï—ä`¬üªÐÑ;Žty“8ÚQEÈsߣó¬*R‚,:Ë}Cø+½iWÁ(·üäZÛw²nÀÞÃQŠ«Æh½æ…ï({·^Œ#êT*]ý!Q]´}ÆíÄWcäðCƒP‡1BcØ^Ò]P´Ä¬ß¢—éYùŠNøNn°99FïÓp4âɉ¡¬2SŽø(~ˆæ½rÕâŽ_×bŸuw¹:V+ 5±}OÓ‡ø í¢çRRõ^õ¤Ûû…ŠÖÆ´¶ŠÊk¶÷[¥ |\ \ÃÿJª|·Á¼mžm¸ ¢¿84û3®ŠùwÈAÀɈ‡éýyx9òD,Á$çFäÜ@¦+¦4{Ï1pΊyŸ);°B—_oÙFO ¢Ü…pà‡àò0û?ÀJjaR… Œ›Ä(5(’I`»º\¿5C„´½>¤Â=º=&YL#{•Àæ>þËŒIÃ53¢$‚ÿ†—ÈŸ½&Ö`Ø¡E^¢VØ€0·ëÆp¼Ö¥s'`ÅÆÑ$vFQοB;HÍ®‚îZ‡€yó-ÄðªÊŽÇ Äë»îÄ¥}LÃNËs·«KœIÖÊžúuæÄE[¥pÇ,Ã}¶ª€ìeÆý=Ū :A¨}7®ªYÔ’(ë<’B»c³‰ßj¸•˜q ½–ô(çaúüõ•IÛMÙrXÉ¿ÔÕC`•¿Òð"ñú¹ÊZMý©J9U8uçà²vWöþ,ùvôÍᥙJ(¨ãs;ë̤vꣻuÕͱíåÛ|Ü@…ÄČѿ4í³³j }æux#¯+­U¸.¿‘+íýM®­ˆÕÉŒ†Cðìc˜d‹,˜;£â›ô¡Ï½¸ßÖi®µ±è,S¡m ×6ÆRí’©l¾IÂÀ·¨ ]“ñ‰pð±OÅPÆ BÎy¸J¯b`ݨ‚÷+hÈ™Â,-ÓY÷[¨”×H•ƒo?›¥ÏÜeùݾ¹þr`f'#ªÊ¯Ð6]j ‚ð(º‹DèIps_$»Þ‘6”wPÃ-ü±1SÕ ª½!˨òþæÐ À"*A ÕÌÄ&+Ÿ‘—T"—T¥†š„¾ß@zå ÑŒ¹Kö=ºsmÙCvŸDMwèt[aÕíàw1[Ê«…®âºE3±b«Ë(žÚ½Ao@Ò_hoPÃÂ=º!\è6=ÃSÕ™ð%¼¨âÈ[¯õûgYï¯Ûj=acߺ¼ç¦,dêóao“ œ¾vëO–K›SŒ6½Çn:¥ÌH*MyÖ3í´eÜÑßpŽ‹ŽYþûÊÉØM=ĘìiH•¹mÞO¿ø²rVƒù–”¼­òÌ|Ì=Þe¸ª0ÃSjæÅ*8ue·Zô8‘O«KŽRO{zº…«µ®©.4j÷—øÂQ·\§šÈ–%:DPš´ˆ¢™MGÈ"/ÌêJ_´4¼e¼Š„>tx§œ,È.õ…´Ï“=î(;«iŸwr´ÊsÌêP=t蜓d ,ð,ì†kf¯ …¬”¼zQ€ªgí5¹“~ŒÅò+ þrÎnT¡ºü *¾ª„ÙÛEÜ·P“ ΂—bXæTpsí¬敽[€W¯ÅUÔ—€’cåbÑ%%TþöZ"‰??HCœBRå໎¹­QwÕ·×£tŠÒÿ©¤TÆè¥v/1¨Èml:^sÆîs§'°ï›Å¾Ý"_¥/.°2‹È¦²k¥¡G 5–CŒÅ`žfÇ….­ýc¥YÛ»?èbWUCe^Êj“›g?¬®¥5“‰òêVíÐömÚ*DZ¸|qr€íßÐúòê*µÀÑ_ •™?ÐØ ¥ SM´JÔú\øaB:)#æ5@Ç)âÍËIþœøA(?ˆb¦›+3Ç™¬ \–8èåþ» éM%ÉAûØ®Õ ¨þé©õžª;–œu!ž$^ý¶Š{ª׋Ås›ÜŸßþˆ¬ Øàè([´Ñò¬Iµ•ŒTx›¢3/¥ך!Sóã4×ÖbJ;Iþ{PÛÝ™.§¨/ Œ¹ïG ¨ø«ª6‰H«ÕÒdۂ؃ûÿJRå` Œ¥ér<ýà_$aW²ÙQGˆ¬‰á¼”ÿ_tŸDŸÆ TXíðômØw°¶êH¡=7Jt¨¢ ¾ì°ôIœŒ« p+ñÊ÷y%\ì ÿæòžÿ<#såË#’å 9tX ÕmRŽsªH焹KÃy2Àоm>¨CP›A¸žnèžš^ÃìUܵú’^­·TèErÌ‚%¿Õã2µ¸"×+ î}×(·¿¶x:âë‚ì)ÇøIn®+wIþßœQ5’ª6ÊŸŠ¦Ì"ò «O¯§sTTÂŒó¤³0Eâ%œA€6bSÕÇ}÷ñ%ð9efÏ’…Q_›G­è˜@¯·Bÿ]ìÖ^uòg/C)¦ˆD5…æKþé~ ‚w£f œõ@"¥2+32 D›zѧ“fqyL­æè8²f ªÅôÑÉšn!ô+?}&<1€õæ&Ío@UóòT”±Ýp匮Z øce?uT+Úæ*I•ƒ)2b¾«î«—ƒ$iC¡ƒ¼»ûÇy¿"D “Þ’2;€{áÎD9è—~ãÿ°²ÄH„^›—ÀÂ*§× é¼¢JD+°T•ók³y|¦` à BÎÌJ…W 2²æÞ‰¤û—nÅžQ‰«ÁN`j‚ñÑøoñÚ©Yå–¦‘MI6™y›\€íïµ7s oyZuèF*ã³,âAwKùѳæMéfâÅò,òõ‹qôÝr?¥SU =Rç–<ï/òr ŠE'êà[aÿi10AŠ¥ Â`{ ’¹Æç[©¼iõú” T&hØ”A”‘ý²‘§¹ñº€…ïA¹ƒP)ƒð|°„ä(”˜r{#©#LSÛðŽ‰»±Su³d]þʆ%#‹Ôû ñMU<³ôùŠªRxÍl„QªÒ4:$VjWÀºŒ…_uЀ‰Ù­ Ä¡DJ"›ÞHþϯ¶6ò5‰œµeNÊ›ôAm9ÜñŒ¶ýB+A289v%‰§oAS÷i>º1¥ñ3“¸ ôGn.b¾R6˜¥í5Ù”cÙå¸ÿ!ð¦ß$pQ]b™zr*Ê/¤Ú¯Þô?+ÝgçòÒéØÝJé‘å¸S8¬C%F̵ñÚ˜~mÖqÐy—½.6qŽAÈMNÒKßST*Þ†¹nöõc»ÃN¾q§ÊAýˆ;ôË}ÊZÒ±á•ÿOåà‹I¥é¹”û‘Æ€QAÏËvpÔ*p~ºó7?TÅ/J˜S¡o,Ýù—„x«¬‚3×Pê¡×ã%ï‰WݽRɳ ÊænM-Íúý:©1çë,žþ¼Äá|ú­þ Õ ARnËã hþLo›f†ä’|4Pe'F3ÿI§5Ã[•/^ï“¥ýáí=ºÃÿó¨8„¥ÙBzö'!¶9[ÝÏÄcœa¡!b+?‰ÁvO~™³åÍ…2Ó/>Ú’µÊã•lõú^Vý{žd˜öì¬?%Lb‘‡§é4dyYWrËÁ©u)¹3’Fâ‚®V”…ú¿¥” aUhâwNÜeÈŒ½ì*PõH›Ì¹U£­ˆíõ¥qª ÑþU›n)E³¾`?yš4–×Õ„¹­]Hµ<)¡:]Ždè(*ˆ¸Ž¸Ÿ‡‘î%ù†¤®ûÅ4ŠÉ}ÆIF9¯ØyNëøô^BäÚ»ùFoŸZÑ Tk¼$ȵÖôü5¨±gÞŒïÐׄl`¤[ðê#¹ÒUi²©êvd&P" B:qJ| ScHh´º&QRVèEF6Ò‰FÍ›‹‡¯Æ¾m§ÊA·¹ÀÝ“Ûÿ¯ä`Ò¼tºë³®ÎÉ!o xJy6Ò&áDM†¸mcz4ë4j78­¹Š ðHIÄYå™©Û 5½%ä_üj¯äåcÍ-hŠ5øÁ|BnSÉ©MLE_J/”ÀÀ–™ìºúøÜ†À:ÚN†áÛ÷ÔiäÝEAß³ÊÞ%³Ï«g5µó’=—ä‚î )™=¯lPõ{r/ȘêlģŞ½6]ØÜŵWK£v¿yöU ¯†›¡Jå0€Å›i]¢Õa2[”Â{`ƒº›l䪷½Ì‡åuEŽ2…w>>‘Js­Éœ5 éÌ5[—2—jmh½—¾ªX˜(í´~µ#g?k»·,«^޼¤3_͉F3£ë7†Æ&újðYf9wUsûUri8ži‚åäóùØhòýL¥ ÿÇ_);b;H•®ëÏü&ò›,mLÝ}MR¼;v±–Nyè·`Å7ý$ÙÚØìÎ…!ŠaMâFK/’ŸgåÖàkv‘³P˜Ùuu*ÀœüÎ' 4OJ¾Wäié-Þ=˜që)3Råà$[¾h*87œ ~‘3TUk[ªnù¬î¤"’w"Å0ô.nq`YZÊò\¯˜¶‚ƒ'I_*ؘ¼áÆÈÑÙÂãæoÊPRo]I@ ÓéiH¡%‰Ñ7žPmÐ&ßyÂЭZ-×AŸ ”¥úé}¿¤Ï·«">®=CÛ½’-”˜Í-Ø-Z‡Ä»¿Ì€ H¯mTàÀjÕ§F]LºšWØÍÛÆ¢Rþc„ͱ‡o‘˜Ò¤ÿw[ÛªÌ~{ œ¾“Ggµ›Àwô›Ó:Gø2úZ~_0`Î2FPy4xUº¤i¥þ<|ØÍ· w|&5¤ãýEöb›œ/Ò9xôÐ5OÌ¥~ÊN:“#Zq›(Rd $X¢ï÷Âqfdùª\ó|M÷E>yù¿—4¸ÓoI©rðD>/ êÈe&äÑY^hßuš¶|ñøº°¬ÅKg Î]µ7ÛÙxžíV° á%Ǿ(ŸÉi3/ã`[µE’7Ö;Ê.$wäŸÇCó_rƒîŽ©³–I#ï«p“IYUŒÄïÔ¬lÉ=Á˜ÝA<z„“û}•9 › ΘÙÒ>¯Ñ¿MÍü.Ÿ¬Û»jÞŠ?¿“4Í-¹½Â‹WôT$SÞÏdÎ!º‚RŽáúòг¶®ŠéÅdEDþ5NŠiœ­fëèažHo=¢*ß9¬Ø}:\BK‘›ô_ȣĊ¡ôÙ+óO¯USðÑãCjJG;¥7?'òfgÚÑBN×It^€ß_SYäÏeæ:hÒr½˜V'-þáò­Y2£i@Dõ·lî@SHßÔAvHt­"øºÑÜã,Ò¥¨¾Æ ’"ËÁWÞ4b΋*Õ[Ëå¦@&"Y9næÂ¬Ö9­ö–”Þ—*ÿ'ä ¯Ñ¿ãUÞ”ë`ïZ—ZŸuöýºö¯”–¡µØhÍKf|À¦¯’G Uݺ[Ç$O)+r5`ɘ€CÕ]‹¹€œyCâÕÆ}UébÑÎ$äAü&ÕÝMs‡ÕìßO.jœ’?põ—Ãö^oIlŽÓÈÃ%Mó¤Âòw^ûJ勱öXä.à§Íï‡?ótçJM2í<“ÿ'”¿×MXp põ”Š©BM– ÁåøÓ.–ùa3SFÜ£Z‰ÕЛcŒtÐtJ;d1Å>…­O¹À¥Ó&Ì^yó/sïûáí[ôš@-é5\¼˜zÞ?b±®$º˜¡Š#Œ®P–Hˆü†°×5j­H}N*9%Åà$i¤Ã_?À%ìÉãU“Mpýî;ÀŸ£¸IÂh݃E*y³¨¢Àèógó’79Ì"‰òÈý‰©}–3áM¡BÍÖ;©¦Ïù»dFRÙq–<Ïãx>ÆIé{GI•?Êâ:ˆ×õ‰:Ïß$AÒÂuTcCMy ¾ŠýG› íñ#eK#*!rÊ„Ï'Är/µÆ/X¿J•ƒÿ rð+ Ž˜m¥`N™²;DYU6Ýl"TZü•o{Ž*Ø]ãxé­¯¸ÀÛBÔ£mž{!LUB[Ùêg§.œÏ$?'†2­’殆>l;¢•¬.úú€žeÖ¥¹ÏŸRäzkgN–²ßƽýe6••-¼¿©2âÅ–4t' ­uW¿{âÔ#ò„êN™ÊÑ9¼· f ÊNèlrcU”pÕÄFÓqŠn­XjÍ ìf–Ò’PñbýX^8Y¨þuÏ4A¨sUM\ÆPö©Nå P"ú±F–L¾¼§*cÛ‚vÐúQu88ÊìùüÊß®mÑz4>!D—%%fÊoÑzj•¡TK®Î ÆW·ëü#é>>C–¹®±Ó]-»)¶(h?!›õV$¸¬º­„Çññ¸AÒ¶!W>­þôÙÕ¼?U¾—rªõƒÕ%&‰š–¾”X+Ân. 8qãŒXÑ­A´QuùúXÕǨÕXxøe6Nºj¹f»”²äб¼ÓÏÏ„ìÞi€1óÈY&‚ó^dÐKa49Óù]ÓÝ'à Åx“ð òf߆—üøu{”mßïLgÞö}ƒ:¿«O~Cú”bLËU_¾ÇéTëD¨>«*)N äg5.Blö%”-©¨xAðø&~ìÒWœXýÌJŽü ¸3¸zpšC˜f,zús-¿RR ë›j2ʾšœhBïaõ¯˜¬œåëÕƒãe¨Èµ9°º:¦ˆ=žSWšÃ(ë…wS? M_KwB6GSÄ}yÑùˆ*oe=›© b’³7ÖÜoB{¶q(ÖÕ/q‘’^(=rŠ >µ¦ õ¶¨­ÈÈ/c1gçí7AÈÃÿD9ÓOãª7WŽ¡§¤ù³ æOJˆ®ýÚO †#³ÜÈ#üé?Ì㜼þQ=EgÍ/E‡wâB/xçÒ)ÓVN¤æ¨4mõr›8[Àšæi1¬‡ªµwÌ`µâ–6cÒêf6!’°®4LJìŽla'HÕÉ©rð½—ƒcÙVÉJ}ÏÇê€#¯Ã·±X¸ûœýë'W–T²$i¸™â™ççÝß¶â\AœÇÐêYsgú4Ó[IYÔ9†r $¸!=(ï²ù9ŒkfúelI• ÷Šˆ¸ÈUN²›ëà_C::oVñˆ0– ¡ùÁØA’Ùò5\À.êΔfÑ]§ºiñHw_Ç'"žeþ·+¥ØŸ2›U/ýu£Út®Æuof똎½Œ‰P=ãWÑ=9(iÿÒi§ýˆcRŠVïâkz”mÝ¥!朋ªâÓݾ̨ªdï8r\ïjªpªMÝì!kI?Й²ïÆf™ûb§;tþ£[`›‡(µìÄ“QNìÄ\q J?Bžã2x*—,ª¼¨8KS+oh†´2dŽÅŸ3ýi&¼Ôu•­—ÊÜ'8p“DVœX&]z@•:ÒÏ÷e'Ê0Ó q5µÄR·Ïøí²(2b8sü÷VN‹„­w”;§Íó†sòRe©üèiP$¡þÁu%¸Í~ß4ÑLÛy@ÕGÄß‚UTžîÓ_Ž\:ØWÔ ¨&Üþ ±²­Î]©Â fšÓ˪÷QVÅ{¬ˆF°¹Ï· ëÛõs"½\sÉú{V‡±=OŽ»òí=ºþrÎ"v8CqŠýXNÙhݨÒ|'Ö—½+y“™óª* [ä«T×ò{€urºŒë^ÞXy2º_ e/íý—£eÆ«•"$®{ñÙ]ÉAYÖQ%&4n‹JY.ý*ÅÄ LæÙLß8ÕM¿rY¹w™}ÀHkAc¸-ÍøyT1T/ÂlÑSTI BÍ ð[<¯ÝO3©bx~Ùo)~NÙ ]“ùŽ'©ÈË#pï½À{ š Õ ›ë<=ú#î•Ιóܲö±s|œ kiÿ#”Bÿ¦àÜ*üLž,׳ûè%wèó«Ö­¶q溲MG©6›K¨¿äR*P &Œ*´Af<5âlô!Ûo3xµ¢—gvíèôÀìP|™GC~y_>{`Cæ8´™k™¨šÀ u[+¦y ܧЯÞG‘fQQ.üžS« `bª|¿åà $…4÷Éë>’í§DW 0r ” jÞçœjáxwh=íÜgáàˆÄ6‹’s©g¢Ó4ðIB yÁFB®ƒL«8Ñ'ý“Ⱦš ÓÌaê)¿1ñ,jvkžEærnU¥m<:º~õŸ×Ô±´ì-A­<,¹«+®2“Ñ_àGÌFã‡7çvc~ãÓyÕ8\¢¼óf°­Çfý}²Ë$ vt]ž€GÙlsÆl·zð† Û™ª‘ÁQß_ÀäØ_Xî? ¶®‰ÓÈ«s‡oPÁÿ„Ú%ë.Þ¼ýa¸·ÍÃ?zYÊQ*ä²=eWs|óN\·eVc\0?·šjÜ‚ržàí<¤›Ùõ¯Èj¡£boÀ<ª;ç;ø³=¯b;˜á^Æ/cmº?rH‰…¿ßGï>Í¥pRÜ­OH3Þör%ENªAg¡³uu¨UÛ~"¨Ê« à·è]ën¸o«AÖ^†¢èP4J*&!Y`·$Ýo¤´‹(ÑÇÒ÷RpLÛ¨"u”ÊÀ)é :Áz s‡9ì¢7¡ŒÅ#¤âT[º{ßߡϛ»©IÌb”Åøs60l¦š“ÚÜ^h#`ÞÎѱ‡EcIáT9øžÉÁ­HÉ#“©|æVCv^™V¥£CBs•²ÚóX\$Çqæ¤Ûö:–•öȬ*¿q¢ÿaéñ×uzWaz¼«¤dtR„£O–ìԬǘŒ(íwÜØ±Žzü\ªÀ¨ô³ÄöªY/çߊïÇÈÞ IOMSñT,`@ÅzØ ãà@  VjŒI}¥OLÃ3lºo)-MµñAU÷¹tñ  dÄ 0Ot Xö9¼úŸ„€8D¼~Gìk—§9‹º±®«­Çüpwt°Îõx¡£û{EÖe¹øç3%~ìUkGʦJ ÕÆ^\ÝÆ‘¯ß‚$ôæÆe( xA³ç<õzåÈ^ã~ç‚ÎÂùÊÄ1{½Ë#rj&дXZƒF,>å)!× `zxè'Ó”g;xôuÐ|;:*s”‘j*±^ fo7›Ã™sÔ5EBÍ<¿¥›äwÇy-6^¹}€I¶œrÝ)žÌQãÁ¼¬_êgn1ý•V»%T“e.]ÝQ)rê²À:VÈþ’F=!S@«já'µèVÏç\Z‹åë&%–ÝÀŒÒ\™ÂvÆd,²¶jÌ ÏÀ4Ï—6•Rz.Æ4hãÇójZ°”–T9øËÁÅ [É€abú,^†<Ï©Ö[¢ˆÑé¼!,œ DÍ%×ÝwÆ` ¿,–zJ’IsñÔvÕ‹Öh?cŠ¢[&%icy Å­$ÙO!2ÁxäÈGÜr©°A[ìp‹—V=@zó÷×'.@£²W+F}Ô¬û—;XÑ™.fá@o”ù5U4lGÈž³úˆ†Àöö<ÅÉ“u!°ŽöFæÀËZûé/ï­bøa·ä äfœrHÂ\í0s8£fq®oÄ–$Ô[>­V&ªÏ7äŸcÁ1‘Ãõe õŠÑMƒ§®ƒðÇL d†'œhzCÊ4Ö°Ìù³§mKáo)ˆ V¢«ä ÎQv•Å“î8Jwðbª£uŒiQ¥–0;á’TG §0«&-Õ *ëû³½ÿˆê-¢Ù˜˜«ûæÒá+;tPžè1Çâni„›ÉÊsä¨R¥K¤J‰±•äêq¼£©z ZC…èÌù«M~ENÑ+.ËÅÁ‹o-)è'ð·7?w|Áºye:´;†PÌg„V§¼±¤£­ò†]ôwfšçˆ\c`e$Bvd4Ý Q¬–Ý¥iR몽ßrr!yù‚ˆº0Mï*š<Ïr™AÓ€6æOÕÍx‹ ­ƒûœãÏp&qi 2Ç—KâŸS9‹ýÆ$ÐS°5¡Ëéy:ßêThgP+ª™fËf@`žBéq›¥ÝÍ«Ð[~[I‰­$vÞÊö5;*§,‚s÷˜,=Óß¡ðªµÇ£ôÆàÔŒdꆅ{ï±Á£’9bÖІ©*³ÒÈž¤"X‚ëSóu¦‹êI^eиÕDGàþv¾AFfÞöuŠê@AH¯Ôp½NßÞÿ $ÏœTÁÍÀþºÑHJÓ6Ð…O·Ké¡û<Gp¯çP¤Ýˆ-f¤’X]¢ë:’90j®5ãÊÒü?áãÏ[CiYT0þ=¡Ñ&dÌŽeOÐòŽ^3£tÐÌG“«(Ü/áè†å¤ ŒùTÉ*ªY¼ÄzPœ†hý¢%q…ÄYè…ÎSj½‹=*xÛ]ƈ_³¡Ž­Ác<¬b )\ð;r6d† Ùµ*G])£ˆê_1eÜä@©ÂÊ÷ÔÏe©U6§ ø”Ëã$ÞgãÄÈ¢ &ÙÜJ”¢¶tÄÐå<*ßk9ˆ.7?®H3Ë"v¬qÏ9KŠMSUÃP­IüGÊÇ©„@Íu´o»u:˜J ⻕.à¥gýM*½„›%¼í° }ë ¬iôxÅw˜Æ7שÒXp•6¬_·‰ýK´¢î-‘o_ý3C!¼2­1Ânø5£Þ<0IŸ#èûE"¢L†ÀZí8½ܨ£ìÁ-‰˜R;èÓ3‡±o 1Ô’Þ•þÒõ-¶Ñ>~Êà •·àolzæbe·Ìæ Y4›³{‘E w­3wÞ¥GÆ^zå+r^‚"x~?»)·ª ßK)BÍα‘lTI^Ñɨ0s=sÖÅú3=Áéx탥PŽyuÿ*²Že¾³ì8É †à,5>ÚfŒ ÅÆé¾mBbJ;ФVP—‘ÇŘa¯È÷eÀPújÓBº?=+‘ÄCùnžy«€¥-˜ëÚ‹ÉHz MQÇÃ¨Îø`õ—?Üië@ñK?4˜{fB¢N¹ûÊÄaóçQòG'>žòGuÍgÄ-;!‹\›Û’Û'9š²x÷¢šÃøì“ƒ˜ŠÀôgW0¨¥_CŠ#=æ ‰iêö ²Wч“øÊGØ©­»¬µãF³@ƒë¨s‡0\\)Ù4U¾¯rPâµÃlÐÉ–Í:å®èŽÄ?ûKôÑV .à©ÝwHÞá…e 7¥0ÿæ¥Â]åw¶˜Éé>›&<4×r•*™½@O‡*÷Þ£í¦" 6+™ÖuµCˆ2”³{sé‰'ȸ¨Jà×U|Ïö9W ¨ j¾¯ ¦š¯W ¾˜Áçcì9†Ò0Sùb›K*¶ó’‡iMP å„sγ¹Uó˜"tâ)â ùe<üm_çŒ#™#œ–+¤mf…i±0ßQl¢©ü(›$ DàûضlLÊÐé?hRÈÆ }ôš;ësžäQ K»@¾ˆ«V¼ÜkEMrÿSÜšöÌdY@~ÕÀc$¬ Ëçœø}óqÍåŸs»§ 3Àr‹\19.r…þ *ß]ÌGà@ 2ºÉ}‘\ [&ôï÷(5µ" ùKüoí»ÈeùûëÎZž·¯ñ] ×Õ s02Ó%bÁ±L yùø¤Õ°ÿ ,ùC‚)y8IõaÚS¶²µŠ2Âñ¹ö#á­Ù/ÖlÉ‹NüC£i‹NDpÆ%,ô rQRGt•ø}ÍÚw§Bù_ü sQÖÔà`¥2`´š5˦†è²T9ø^ËA^ ¥+*ršŒVõ=<„Ízè‰8Ê›ËlKÏr¯pðXK ¹RûýƒÞFƒµíõŽ u¶·ÒVhV+·(ãÞº’Ð -Äþñç‚.r#ßFØL=ŸMÌ$’¬®'±Ûx†»ÿwT+|æ)¼Ý°¸® #ȺD?ÐÐ-]P³1–—WöÅù‘¢aJË\'>Šß$•!¶œ¨&<©~Ã3˜¡Îq{œ:5ƒÔÊ"U¾¯rñºŒT)¬¤àÉ^¡/Á¦5–ÞרΉßV˜÷…‡¦âù3¸ÇWÝpŠ™¶twc“`$b:9ÿì×f{.¬#[EGj¬ß̦0iÝÆ9+ø‡<#?ð›©æsÑ„‘Ù̘K$x“ ›HïvŒóü¡r0©oìÕ¤¡"h¸¿KúÆmëME‹uákEÁŸFrá°JMfù¬.Ó™‚ܰO·¬Êëݹ.ðînØ7”2ØïM—¹‰ô¬–S¼š¾h3ÌxddGvfÅÇ@ê¡UŽéþ‰(#Å#)B§³5møó¦U­ŸŸ© Õúœ‘’¥“–)Fö€âY¨aoG”#®x1ˆ€/wѰ«ú“ÄôP-Fh*Ÿ†™èU‘úQ&¦2Çå”Ýäå­ ö )Ç4‹Õ<ÅtÆê½,Kײí±Q\X]µ¥[ôÅ k‚Ü͈U-úÞßôèªS…ïù·ŸA5Bz {Vœ;1‰©Ì\bæ‹’Þ‘¬mÖ\õe¯“¤|wgdÝÑí<•Né$}8û>Í"Žõ°¯Óº/äè¡v•ùH ¨î¾T9ø^ËAL6ÔÞA(ȉ‡ùÊ×L¿ )E‹’ëñËœ’’öJ>V}³00KÖ|¹ÊVSˆ¼ïrɳg»ñ±¶!h¹¶Ws%\¤˜Ö_>ȃs†•?µ¹§zJ^ îàËv\õ]£” ékŽ‘»P&Eˆ*hÂõº= †ÃÚ~Á2ƒŒ„ÙnO_ò0r Ñ}â}éNŽDPR Ö1»å¨ãxJö}`qM㘢˜Úo²¸Òà9þ Iˆ:ϳ¿ð@ û*õS„N'r—1,i¢òš%ôÿý&»¸29½]\fÊèx½E—cÁ¹¸‹;¶a•8 TªY“4íÛ”S–»Rv ï¥R®R39öŽ’º¨Ý¡KE#­—܉KàXÙLjݸ±úì–4®‰=€’‹ >o„u¼œ¤jŸº§©UàU¼qdô~«Ècv™„…Ê#{ÔS"Ÿ*×ñfFÒ›„80ÏM¥åcUï.~a•_L~$+«ãVq<<·”ã'Ègâ—‰è/hž­ó1:å;‡¨6®ìÈ|âìé †|…•kBe8@ÝsPkn×»˜*ßc9˜(܉„\¤äõ ~µÃ†Xzž á âD¬8ÍQyß$Jü§$ºóš‘]î§¼•®hS‘¸¨Ó{þZKê`†£$ñöáßÞy2LѨÃ#\3£âNÕÒ½ _ÉîÄ~à@‚І[òF 5®wu=žÒ^íËEÎÐBeU²f9½Û5ªìF}…¯6€þ?â}µ`Ä·'@ qµ\8³†±­Odzç*}$ú ùhÑ¿ Ýö™LnÈjBÈQü{$‰UÎÁ¼Ž„ hƒ%x¾ëX n]y€Ê·Oy©Q‘Þ”A{îûN®<â ñ\SM°†Êäƒ$ea¢èuj¶µ r壖ÿµÈË™’&s›ËT Uf)ç2D !fMè…Òy¸áô‡XÔ “qŠï§Ùña¼xŽÞ­¯ƒRdšé,X¾G™ŒÈ”Äö’#{³ÿQÁH˳ã{k­Ñóxì)"~K˜üó^dÖ°ºÂÚ–Ì0òÊS£E‹nÃüÜ) š ÛD=ä9€l 6ØÌìø9ýåhiX‡«!KâI8i‚lfê¾”EîÜ«Òçr©!bòaÔQœ•VÊOŽx3d0ÓÆ2HçmÁ…õ-Õ»™Bv¥ÊÁ÷Wb¥ì«KÍ¿lÀà~ädègd±IŸ[B ý¨ñȺò?R ƒJËncºì]Ÿt3ß-ùÇ+rgºçó^Ržt½†ã¤wÕOïrgf\°Âøí`é6Í¿q¾¹„A3ÌI—V³×µ¬•À% j{rwcå°ƒ.)A§Ñ’àîά3ºmPÛ‡D¥¥nèŽÇCzØ‘ÑNù)^øg¦àöRÜëèZ +{ &¶‰Gß¿é©ì›¹iÌÝe^Q©t°®;@°Ïþ0ypEgÊ]gñ¹Ê:¦fŒhêZð\êdˆO¥U”f«Å&7¦ðÞÆôs| E(ÿ¿L-žÌè^sûÏríz[9(I.¦˜«çð¦™\Dóé ±æÖ{„A\Ù¡ò Jq¾ÝϘp…NŒU¢…»¸w>=zcŽ1Öu˜<¡ÄX4‰üHuáÀ3©r𽕃<ׯàôS†tLgÞjdÀÞh™`UmI­1ö‰›€² Ù£´S±/9±@,7÷Ï §6öͬò&c0‰“÷º—ò¶AÞr Y#¤”ÑÁ“]¹ÚF†¡÷ÚMâè†ñððK_ãòº’UçÎ8wÆ1Z#œ¡mž€ ¤j|Çjv>ÊÝ·PIYN·}‘©÷5,ð¥¶îÕáˆTÏÎcáA`•¯0zÄÚî æ°^ŠjuVúcÿ <òR4Ú„f÷%n+Ðÿgwu™ªºö æÃ'k꽦Â1$Ár"…f(Ì»%¥¯©nMn´ ‹©ÕÝÆjH‹À5eJª¾ g¶Ž,ø·Hm›š8k«Å Ôø¬Ý©!U®: ]oÿ1›yÒ! •øSrlO)ÚÁS¢i5×Cø Ñ¡f ÞXfÔ@:Ä3:Òx¬5ªhf 4掆bï›kŒÎYuõ:^·È]Bâs1N´õy-z[0Qú(’˜*ßW98Pé³ä|øŽ/¥"Øæ#Ór~˜^QÂìf7Rë/´èÝ!Å¥* YÝÑ+g¹ñ¬u>Ê4í¦Z­ ˜¢ „qĨëLDê/š+¯àÙÿbK{œ^NêðœIêá^ÇåpŒHlÎ:ˆ°=’à™Ø8=¨êÚ‡I'Ê•ÔnpIt×ÕeæÉq¬ÈƒäžÃ¶ñ“¿Ýf¦ '·FKÞÎàONð¸Zí—䪋¬‡-ãÔôþÅ÷Rwe iòŽl•ó:ßc¡RýЉÑF^|1¢h—ñ ‘ŠÇøÌÕR]OÌïÄí¿­w¹èÜå®=ÿ’,S€ž“G6ÖI‰iž%™P|JU¨ÁúG ”†ûKñd»ðÑæEf­ýK{d½d¹LY+ªes{5©Öº_W“¢ ^}Ì})–¼ç¶P!t9¼„KÖ0ð1º€øôŽÆ¾ô5Âx‡Xû¶FßRiZœ*ß;9¸ƒZz¯÷„:'kV‡ü¸¬.6“o”%ÒjÉ~C.9ŽTRžº@õ6 óزäÌðâ/¯$ö<1¼[Úâf±„gh˜ ኬ2Vô 燜/–êÕ¾2z]­iÜ"|ÿŸD3¤œdËæqŸ«¨Èª¿ú±‰œOu«»‘Þ0psçìwhº¤“úÓWTƒý!„¥—ó°ö@›”¡Ô]lªÏ9ÓU…s0d>ÆaNù©ÔzÇã¨UJ@ë>Gš”d"‰C.#ßü©»JYê³ÓŽa* € ?EjÖ°Ú…ná°ÌF³]@JöάZsœÖJ‚x¸¶éûn¨Œ+Bå®ÍA[^§@ã >vO}#€¢Q ò±”+'Ú,w«'!1T) ìÖ¶ußi'%îÛF¨«L½îü¿“ã¦\'È8![Ý1ßvŒvm­phÝ*8¬è-ö´úç‡K©ˆ—EGÕšRåàÿÿr¼,?çÃ}Ü%>=¡X4zq¶)PÂð¶æœN”’â;$x¿jÓoð‡¡»w»C°3m[µ±Ø<ƒg‰ûK:yiÿ¶‘)æ¶YR$£aP D$ä®¶íaöÁÓÔ1“¢øëga—K~œÞ8#¢—‹xU朑´ÔßÙa!Ù4š¯½-ø©²T­¨«,µ’<™Å•„4úmz“ ê,ò—vÇ6h’tÑJ"ƒQòé/ÉΜ ý•„b`t ‘*ô ´Lbiþê§ó,³…!„—Y[Š~ÝãË¥·Yïrg6Æ’ :0‹Áñµ™’ÒRj÷4Ò{@„ ¥MF€ÁÐU“¼¹7Þçõß[Wìü;ù>ô‚…,÷Þ8êcqz+!Gœ«£ØŽˆì½ŸM_AÖúj•f‡cžÓ-¢ ‚f›ø&¾G2Ü=&>àý|%2vX3À•\CœLNž.CÝÉó('˜fBæÝ¨ZqÞ72U¾‡rt¦ìžš—É»GÌîžÒëeªm‰™ª”fd˵ÕFx›mήä9€ù$‹Â'\v†yðr#ìîÐxœðÕ«Eä÷…½ß’“r²QN³ •–Yµ¢jÇøäu´Ð<‰E§X #‹ñ=¼ýC"²3ɘC™ÐìVõÖAçK=hU½Çñõ5Ü1gvIéÈtX¿¶!LÉ©?ýnÉjJ‰Á1Á¾Ü‘ç*º@é$›à- Ui„ŽÓ- ñ¹*v œ,Üá¯NqàS€‚sjHÉß©máIeBQ›ðnãDüÒ†>FŸ*ÏC‰ f 3u5œdMåŸü`&ž>ì§é:¸ŠC!tŠ}HƒMuTxéê‡4Ji–êºplr‡jûD¸HÃÊbؤ—c4kî+¥ïhá¿ä÷•EÅ–ìöi:ç׉J4õ£T9ø¾ÊÁ›Þ¼wTõ¬ÌÀ”Áq#켋°é±pQzw®˜›¦nÈ2"%e’—kQí Qp§Gýs¸!ò°08pžK²{8TÓsÉÎ {«“2äfb¡®¶\éD`á¶Î¼[cms—µÐν$ñ#ë—ç85B¦ß5_ŸÚ†PÚE›Tg ¬Œ ÉZ½+¯ÐÞVB´|Ú¦~»1±@ö”!Ô—TÛÊ颽z&W¡×ð;VÊùEüùÈ+U¼\5• ’Ýèñ°•e¶ÎÓÚ‚CÜô _uJÛèúŽ;¦Hßüð*ùÕ*-ó9©×¸D|‹.$£„ðš¨B•›*“¢}µR¡;8-ï eºÏÊÐ8"X‹V…Ó(ÎýDo?¬zᘆ>¡“à¸'d¿@{oØü”ç².Hº¿Õó¤ëÆ*£©˜*ß/9ˆAù¡k:—廽E´²CLñÀU³šþÞ`ö߃j¥¡r'ÑÔO›ËIvcAWQT˪œJú+—™•¡fø–ÏãD 3þp’<ýÌË×6®]¿Sî›Q.Õ™€ž0ûÒS}P¡aür?@N˜#Ú‘•+–Þj\Ùñ‚;Îý’†î6Æ žñ5g8¥>Çë®%ä‚.ÝqqÊêWTÌ_¾ÚÆð2êZC\\²W›úš°aÍUyÑkˆ” < ލ&hJ"9&‘–y´Rk-Î~Ûý*8Íè‘fð³–Ú×5WyGÍÂfÀ)³–OäÙ{Lµ¶žäx—ÜþžPzš^нO¹Ì'"mk=¹Ó©VªT÷!Ï—Á9âB¶³”ÓµFد Pp«·tðrãV}^ÕæØI¬^RÜK“ÛÂeˆH$ñutOËnA™bv ”ën›‘M¹T9øÞÊÁX yxãæ±‰‚\¥ªX^nå ™ó”¿á&‡Á`é.¨·[?Üz-näHý-q$þô…Ù +^u‘дéLcrz ó“½H†¼»!Nd›{‰Œ¶¹‘f_ç¾è™oâ­ßlýi3Vs#› ëç<¶Ñgz¿jÅ‹kÜkîM³•-…uÅ~ËãÞ+´èÉšÁèõq•¾‡NéÄ`¡Ä”!TjÜpì¤ éÞÚ#S]3_—/HßÇA‰xŠš¦õ”›g8Âc¹¢SË!FY2ÖÎ7wŽâ~ºòg-ÅÌ0[^ãJ°´ØKÈi¤íü>ªšIÅ]‚"™ÚbŸ^‰n$žè A¹äíÀïPõÈšˆ ¢·†® 2&)S`©R&{ÞJM§ž:§-)Ÿqù•CU:rþ·Ëh—*—Ëãó¹Úg©D²ÆàéUÕp o×õPŠs¶§ÖvæéœÜÁíTHï´md:†E›¦ÊÁ÷V’­ºð^çZ¡s[—*ßfñˆTYîC(þîö½äCŽP1zo¼n§h¹“ï°ØeNîSÎ!v‡i¼ˆct*vLA$¢Ú’°¦w˜¶û)¶!LÓvé”dÄTìmÀʈ;—Ž«¤÷ ú~°üÄéÕº }9_×$ÊýN$‘¬ =¯Ï•Cû øÒ®%skgÕŸç»/EèŒ)vÉ…CºÍcuzH¤‹‹°xÁîM?e¥^ÏÄPf³ÒeÅ,œ0{ϼÉÅWu—ˆà]îÕ*ðT·»÷”(|³ J¹ÇÁ+¦#3ä‹Ã’ ÒmÀ'Èãh‚؉óù%» 'ázn*.Ïb¾>E‰ô}:ƒÕÍÕo"ñó$’°PŽ›Xå>á{å‹ðp­$8Ž!0@7¯­1¯k¬l·qÁ]®?Ǣ߮Ù9j®þ¶xEfÓ…-¿}Úé“*ß[9¸Êà4ó v¡1å‰Lžhÿ*Î63ë°‰ò­[Èq*q>rQ¡sBB'f§ãÍÑ÷®m|uÜ.Óg[7I2¯xtS:=ȉ ÖGRæÃ/Bêƒï甡Ìr®ØeµÁíG ÒˆNHQ¦yýÅ¥…ù1Ðù f=ë|aA~ÖR¶2T¬Úâg>wùÑ<åÍlîÍs0Óߤ®†šŸ|°>$…λ`¾Êþ¸Â­¢‹‹à£¦ûÎ=*„€Ö8ëªãcÒ¬Q.~ Ÿ‰\=¼ƒ³ç0Õ‹’­©ÇšXu) K€s«à;\«ž‰e Wãg7Nî\„Yøz×è=š€ú¸ü`/gšæPÕ&Ý´v «ú•ðßÐ Â-Ì‚(%·Ríéò”CäÙ›P2OY§–m3(?L{)DêD*ßC9¸îrϪáɃÀ|Y5ùÔÌâºT«š²eÇ•ÙTGÇèÛs’N7çǾҶ/hY<]³œÓ Ië&ry\¶%Iðç>èXÄ6åáIñÓÝÞ,¯øJS/­S(ê=‰’/iSs³,J{X9Ë™Äv~ñ°kNWö Õh -¸Ð ü˜F ¼1•­"+æá›Þù™¤Ÿ§RK¤.ºåŸ6e‹'ØBgé¿,a M'WûÅòènuéEIv·u#»µcÇ~ƒ£ìÒ—ºXe3™k?tºÏ•“лP$ªÌVÕÖü< x'Aaé^pÓä[Ë?²þs‚™ÂaÌ‘ð':'ÛIR9.¿©{Ú´:ȸMþïÆ@B†'8}ìÈèòP(ÀA‰à…F`Äú[E Âmž¨ëx>O•ƒï©¼H¥ÐÝäÕìäÕiq_D/ê•Qá–¸GÅÝ9kÔlÌËào÷ô·2ÉÚK€–úLƒ˜@~RáÞ|G¿$n…ý(_ \·qfw‰Š(,¸É´À…‡Æ9ä‡ÍwâÎïÿ}﹘ŒÎÌA(ðÒÙÒÞcÕ~Á>b›¯5&hmŒ'Fþ^O¶» /zw:e tÿn£ø¿aíâ ‡&¡¯À-§£©«ø’+ËÃå ¶÷Å×i…Ñ¢O¿¶²…%ÏÆŒ½}‘M‡ÝÞéa/ùÃ?dâ[‰qÜÎ5?DßLg·Õ—Hû#ãÝßjò ÄaK¡\,†IQÍ G!ÖÁWÞ >¿gl#u’{ £ù—«Ozo-û¾&Ïaž!qáúwÏòë,ZnóêûÍIª|Oå`cAð?¿¸»š­Í•(ò´è‰?ʆEÎ]ÞîñGÄœÿf¯ø6ìBö÷F–)¨¶D¿œó©È‘iß{šPIÊ lY`,Õh<†®šCÔv—åQ;:±W@mÁ¹ æli‘k—~#}†OdWKÝbFý÷'•{Š~É5 û»÷¤ÿJ>xÞ^óf™vB%s+UŽróØïü"Ü]ýÙ*³9q|ŸÕÐN•ý­ió\õÊ…ç() (¶oìØäwUcrî“_G# E£ôBÚ³ ­‘(°ÝÔd2Íâ¸×„sò{—‘Îí,|1wT²Ñ ‘ęݯ±ÅØzÄébßHgêñ,çËX›U$“ɸ'm~÷ÍêTS³ ïB­|+‹R‹ ­¦D,=t—Ôìãbth¶ž‚žàã²ÅÒÿa/ØQÒòb!Y©YvýûÊì±JújÄ@!ë zëÌqk«°Å¶Õã/WJ)ÿú?,oèi6º¤¼'©y“þRÏ©1Ïþÿd~eñþïV¶VeD¯QO­vjfÅ”¡’›VM”¸ ‡¥L›KEÜUÆçÞ6‚8|ÇäA-Ë@öN,òæÖ¥F²¤[¤]T nú|¸‚ƲO»‹… ",Õ‡Lô-¡h”×Á„—ÅýÞLΉ­p,DüzËžÄ%k5ÔêÖî/7*Æ’k²|⎀yå\âˆ`Ë “þžn”ñ‹Úd¹&šÒÎþmüyl×DHz* WijmYŸ!W’æŠõI­¯ò5*߀šÉè:uDÙæFõç¢Ö•Íœv| t¿RÙÎΡ”î6ظo×ã6##ÄÜË™Y®Ÿ0Ïw¿ð×Yô³±€¿ú@Ýð<¿Rê”EüÛDS„>iÓR®¢¹ò[§z3g®í ƒ:ÕÁ/¹Y£ÆœC,«´Wïj¬^Ö®a* Y'Á(aíþçWÂOÝ3uxY_tÕ‡ŒbkFwpw¹[ä{F O]£¬`‘úÖ”ÉtlÞ1¹(ýB\ÆË¶m„t;½Òeíœz¥ØB~”ÉݯեP¬T"=Í?ªÑN¯ZÆpD:.‰–%Þ¶Uë§.½ÿ?xê?‹'Ëš ‘ÎÄ˶„ì»òÈ}¤YÇåüÌZ]Y“韙u‹+¢°«–\nƒÜ‹FΘÏJ0ËÔ¬§«ïµýE¤!§ÏÚ_œl>éÉ¿3Wìs«¢Œçª‚{ÙœµÏ„+»º³*J·×íªžnË¡w—ŠUÑKÿ‹÷P6Iááào/áwŽ»ü°‹pn1[åx¤SÕ¬ÔϳY¡ƒÁªƒü&5õ§0Û.ÿ®Zå2È ¹­WGm•Ci˜RmŽŒNâCn2ÚæŸ+ÅÖî³ö`µO·ó‰jÐÉ|…5Üó¼ ¦ªææÞìÐ99U>W.%Åȯחu(Kr”TÜ®¼²ëfzȆ{“u2¹»ÊëfÊÀT:ÈÃw¶k´Ó7y O8ÿðûÁ‚œ~õj›Ê/[¾²}[Ëõ+rƒð#Ÿg#sRçñmžð¿˜õù°ùçq«JCD´C‚Üã›jž~'VÇÞç~Ï?zd‹!ùì9TÒÇg÷+®æ—ÈÜz‘ÒN2¡×êá5ºmæc{%Ý­á÷-+í† uuW»T³†þˆþ»Õéy+ºgßæKq \ÜÄù5xÃa’œ}d^™Y—QiBº@uªƒËYñʆHX–Fý5UÖT,¯rçé™ÅÖbÿ®“½P.qK<ƒÖçÛqûw"g(ΆM“ô2_xNf«ÉV©ÍÛš-eß»®‚J©”••š¢%cªTç#ÈV“`ãxf Õ†;¬A|:¨S<¨ém6xîGSv%ÇÛ6ÌònûVåZx.oFîãž¾«¥”aÑPzª¶§vš‘ÒÑÞ¥TK–Ø?ؿĶ›sýÆaõfc×%¯WT’ÎEär×aßòð²–€b³8m£*í<Êle¥ƒ%È/¬ÏtK›™®U–pYIÄF4ßgUÅϳX¼RE¾d6Û㊌!¿MÓö|2fâ:ë­[}-uräM¢Nݲ×ýl|…éõûkêr1lÄåñ¥­n>Ť|¥gk«¡‘þëö{'ØH€gUÞª¬‚©¤eßÈK¯$ÿäy|“ý4Ù5s,·Pú_ëH“³1—tP§:¸Õ–.ú;pÝ)ÄjwÄ ]ì^::øÕâøÂ¶f¶ZÒ6ñ ^láäÇ¡ Pú¸œWw}÷¥f xÇ^µ´Q ?Ÿ'ÄÛh%ªÚrÖ7ÍAku£ð¶ï×}s,‰ ò2õ,aþc=õ»63]®ðÎÛ¤^|®œ«/ÕßÓÖâ¯nEWý?9«9”s#دd„íÇÇìow¹¦Û=ŸÌ­»ÉÖ¾&î]¾Ý¬Q,1Ém)Ä]7ŸM*¸Ægêgÿ2'H< 8Å ^ö°*èXÈdíUä^“ü(#®BQ`¯Aêc1X꤅S¾*ìêUÏÌ#:Ôñ8Á~²÷œ”>ᪧáÊ­½·µÎ;€ß6Ìè A a¨ âpò:HÈ8ÊfÍ¿d°É°I¾ÅBéU‰ƒµX˜êîPÉþ†søÖKž-ä±ÑÎmih}ØUæ~d¹ÞÐliA)ØC¼D!öË¡ßCxb͆7µ™©µß-RÞÕÜÔö“®îRõ](jýÝØL*t0—ÂàÛhuž.‚¯³s¹åÞŸÁ¦B ^LÃf÷U#σ³m£©sq74¼þ•Ò@/”¯kVE_«yHÚƒv›òûEÈ5"³rÕ†¹‰ÖÃ|ÒwÚÈ,%ó(BÚ k ƒ:ÕÁ¯ÄoÜPÁv˜Â<]•4Ÿ_J™Ù[ XS3Ëër‘­ùÚ‹³N1ÃæƒÞĉÐóô&gõ…¬3§bÖEÊ¿¤™ì§YŨ}éÃ$Ú’å±0iÅe]ÙMÈ-î<¾ýŠËÖ‚aèç̵¤c1³MJú:ÿö×qvI›·g‚‹¦•¥õ÷Ðz¦™63=æ¹L4öâ²Ë°[êJ5ýaŠÚÊ¿·c¢ûëŽ+H>TpkŸ‰Däe÷••B6wºÌj襩köJ{A28+:+ÑÐE”Þ•|¯ÑsµŠäö¬»r×_¦÷sB<:¨S<$6Á¶ËúRlBà…GMñ7;5ý!ÒNÒoÈŒÈk™E‘ü¹êkœJÈsü xƒÅ)ý +€rÊø«¤NdoÍ Ò»Vô4pÑò^ÆT5…/Ÿ„D^¤¶L³7žÝÍþ½ yç×N!žqLÍ‚û~Þ:±4ÿÊßvÌÛ4KiXðš¶ Tl¨14SQOûÖÕ4Ï»»­ÂüËÖÅYV›™¦ExnİÊò—å'í¸"Û!”œ*-ÐÈv±¬ æ¢ýSÝ!üsâƒxÔ :÷ÂÂß(&1ÂÎ'ËU â¹/DäuDæ!t·›Y;oµå§X©éP±{g…,6):ü†9Ú?ý;zòtP§:ø0Ê*pu|oÐ*z½˜Ãð ‹ó¥å¦’ê‡Ä¸õUã;‹NHάåÄF¹•¼ù’söÙÔõ_\¶{+>cUûñôÿî[½pÆ<Ù”6u á•§³9ÀR’¿›ýÊÀ×?þ•oþ#•“]¶@3Ô|Þc©—¸âïÇggV”|%›F;MT7~èo{ñ¢¤{ Lò@ N#¶I]j3(!Õœüöã3ùýïíXñÞ‡›øõrާ§xdLÚ£¯Þî߯®éâOà+›l/LË5Y­WKˆ«‘Wå§„9…”®Ñ/(4ƒª³¿ö î”ÔÁ¶»/tPo:ÈoR.”¸~[EŸ_¤ÖÖßÓå>63¸¢\²'QUÿU·mÔÕ­°M+[>ÎË7ÞÂò­¸sô"—Hg ƒ:ÕÁ|6o›Îfi0SZÍ™Lê{qzŒv-o£¢"\jjn[·‰v5ߨ±níNo°9l=U5GbZׯ¾Ø!Y¢³S4òû¢»äÐ4Òý>!w•¹ûgF;µz+ËLÞ{¡®ôAÅ-þæë4\‹8^´ŒúN¡È49銰Å6ìûk-ÄSoŸ©@›öuyƒ·9Ô š÷ôKîë6¤X-÷HdÉuGð¹°¶ÎB`!©”¾myüü\¯/ÞªlŽŒ¤[ù½ˆy¼²!¦ÙXÐ](}ô®¤þ‘%‰ÕŒÉÉïù¢¡ÛÜ¥4…êT…Õës½’Þv~„>h€Û8úy=Ãv *!ë ‡Çolq –$@>.ÿ$NÞD[-¼P‰É?4Yé¸s˛Ӕ3•Šk2aâž”F«« aÖ¢Ì}Ú\ƒŸ¦’+ :¨W,ÀlbôqñŒó _—4P yZXFÍ„j‘>' |,íË ›(ýH}UQé—+·ª%YY3sÇF‡wÕFÁ]ìYÊŸSßʤ4i²%Îm^ªþzJç^ãØÓÐAýè Û²Òø`E†Y=J“üÅzûÃg“ÅÞªÏ{*üE±NÖWß(Ô»¹\û£è´z¢ rìîE>KOWUPÛdÄÀr”kðD°3¸`ÿ¤Uý‘G¥·FYn¦Ážê ÖåLú[“ÂÆÿ… ÚÖW{°õYM ¹W¥…:ë1~• Řt²ÚT;WBÆrq¾›7pϬbÍ~ûÕ1"kù¤ Ó97K$Ó4~†qÏgÅ×jæ;¼ì8×(Ç:z>+_q€êEùn“È£»ð †dSôµÌéSŽ4ê.z"Œ E¹âÝ’š^ÂüMªÚ7ƒrµž{’ÚÍ›ˆ(­vô/M9 ©r`8Ÿ‹Gï{®à»X£ÄÒZi!! 'nÊ}¡•z[›.P­·l?JyI( ‹TΦÈX n«J»óÌWyÈɬZg L×;% }æGJ{isÌrɲ—KÞéQM¶ C<¸(¼Ö?CN£õl¶‹X’¦DîŸá¼ÑýãTt¢ŸËòÐA]è` Ëdc.BZøÂb3è$¹WÚ»·<$Aé7³T8½Ø6¶x“¦Ø±=òÙ\B%ߨbW†ýR\¶?6ÁºÛݺ­yÙ6ÖýˆMžJbE‘Æ é¿–kˆ}¥BÞØõDn•Æ©ŽšÅ^9YõŽ!°Á–zíǯfªšD¨js4ÞeÉò¯f ž»nÁ€Œûâ¾zßhC¯»j·»3ƒw2„qd¡M¶]§wîÆWV*¥ÕV³² t0Ãë u Vl^ðëÆî¡œkËõ<Ò3Ynu4•†‡gØsÒ2Z“-¾uR›º]3ÀÐûT*Ý&ñZÛUÜV´fo$ôÜ–¬²àE=Ny­Ÿò ÊOÔ‹¹ªùÊØx‹óµ…r(½ý¾7¿Ï>Ø•Çaà›M2kî¢l]Öe]ƒµùÑÔ[øÅD‰œšö!áÌPšÊ{ºYÖO2Ob•ý6ë¹äK…êGéé5âºV°zŸÊ¤ÿÛĽåa=Çny°‡÷F¯;qs–ëßð‚ï:~Œ¶öK¯&öokïrA,×-~Ë„ù+Bjv“ÔjÜî¨hp¹mO~£x7YbNá$†ZÊ}2%Ø;%{;üòÁß®Û}2…Ò«¶ï”^î4¢ÐÐ7Þ¾éwƒz*DGiJ9BZÑ.ª²AI› Ý&ÕQŒÿEÇ]åò8Ø8ûƒJÏ ªËô£ b\Â#\Dêea¶Ø—4™Õƒ Él}A["l¥il½zã‰ùc»¡¬ÿ:¨¤)yS3*¯ãdY‹ü\ÜψEåJîóKnôÛgªaþÞ½æË€ˆæ£º(^ À®è ·T…ÛÐÿ¢mÃݵïEŒ?ÚYÌMVþš5êŠïž%ÅM’eÕÒÇκ’­ï×Ü^8®*,YZR¦½Ð–¦îa‹›Gªì ñ…„Œ~òû»­}5NµòE¹M©š «½×ýÇê>¨^"ÈÕo¨co1zÅý&—õÅÝ(â~êc-p ÷¿ ·6(YÂŒ¡ôo;ë{»°bʰáÓÖþζ2áZ‘»¡ƒ:ÒÁ´15WECù]n™bÌ¥]‹¥£Ô =Î>¶¼;¸„øÀÿP™U®ãÄÖ@¶ËÐz¯‚ïh-C?¦óÙ– †!O$&Ã[Ì]†z]\œFX'Ë 7~ðGwaD8´¦\‹ÈTQŒ·þfÆÉl¼b“Ì¢EþMÉëý¡J¾É°?.§ËqBpñó–¯Yæ´†—jP»!øÚ†Nu纒ͽdªx’4›ÁUgrU%ÖqNOâ=Çá¼ô#KMÕTTpÁ¬êGŸ°BÂÐâ¥,±V#mªÜ³!”“cnêóG áËæ>ŠâZ7“!Ýe/a™rÆ«ŸgëA½Blïqá9òOb²oË{unYMf Þ¤µ=H³)ŽØjwA([áÖVÔñŽàåkÊ$.é¯*æà ß›ré·S+ÝdÞg*ƆÉZ*y÷¥¹L'ÂIÂÒ&ü…víxñ¯ó@‰.E:ÌÊ %d+tP?:8ËÓJ?Szܯ=62)én‹¶{×}´K[d”ëäÖ(“÷Ën!¶Ù-ŤíÔNR%E†Ñ®“}þw«‚‹³¡ƒºÑÁÅ\~>ËÖªº“Ѫs<½}hœëq †_qÿø#5S`âº_Ô7Cåi{VÔrÃú"&²¶Ý¢"­ ↩ÖÚ.-Ìæ«ü°ö‘Æw˜+TŒÛi5ÔJœ½Ü…!»Žò¨Ý]ª™|×_ÞÙä°üä)"äÒ¶W®€˜´=Ÿ–ÈÛ  ÑÁ»j'ð¸j£‡Ü†êEïf%¤‰0 !S€ P‰[ǰ,2f,Ó¿ˆö'ÉÇÑ=Ò£Ú:ò¿»Ž}†…ïð™HHõD•¡ñíŸÄ–_4Û=²T«¡*x8ËW¹ c¨ŠvɱÌsÞ„Qá~ƒ«$÷Án¹R8/´yÈ<àÒáA¡r‹•äxçzÌýo«Pè ^tp*!™þ>ªB4¿¨!ym~ŵfšzŸš7öyo§}DÕÉ/bÎCN}xÍ®­Rí NtÐÌ¿ qyC£>"žÛjÏXœsù¸d‰ G>WaŠÜçÉXT7 #ƒ¯ì÷`âôðnOƒ ^5ÓÔ÷ÜŠ¤™ÒÒJUãã4²zÕ󛡃zÑÁÒl÷Wž+*KNS J€¨­j¸¾0­œ:£—‰axŽ€ÄÅè᩼¦'­Åd38…âsY|C«þ%›NźŽYÆ%Ö>Ësw3æÔ}‡š±e§¶U¥:X,—<5±[¼£i0V˜Ï-&{ ÔÀþÅþxÝ÷¦ÑÑA-pŠçü¶^(-D"+µ¨›Ç–\ ágkå(þ#a¤Ø­9–²b5tP':xŠ{ .Súï-›Õ®PX8pFçÿ°£ßVÿSSlœoäÅh×ÎÖRdråpø+{S7G©(¥kxÓ°º©ÕN-³Tr/ع|0ó¹ÒÐç å·á³vK†¹é‹q?é-Ž~ÕDª’ÙJrMÂJ¾4|Y‚KÔWžá¯µæòÉ›y˜Ò»Ö„3”|ñ;¡龸ÈBYè Ntp5!.½Y1ãÚ³ß'Ôv_Nü]ÛOLôEˆ9_k,¶i )Ç&‹Sz¡u;†„˜óo¹(¢‡µö&‘Ûk]NF§ßã¾ ‰þq¯çݵ?¯u¿…t&‡iÕM¶ew5‘« ÷ð…—žO¯·Â»5½ ºO+õÞSáʧ 8?÷s6f÷ŠßΰôžêCgR2JSÅÑ6HœÞxÛ˜£7rà£NÒh ¿KZ'†Ç2€Ò\#×TVòhwù"½ã]ú¡lHÒA’s<¹½ë<Öd¦f‹ç*¢ð m\9ñbŠÛÙ EÒ²³M…HZÚ^Kª´çíû‰édÄï¶Ó*¥%1‚•Ú_ôõPæ¬J×$/³A664Ï/|[ÿoJSª”ÏÞ»9ÏzjtP:8ö){+D/žΠöá2ÿ™6Ñ’mÜÿë·±æ¡a½aS²Â£áMž·åmŒüé8ëþôÑd¦'¥AE²Í•$^ƸþÛNßÚoq‡wfûDîÙýn+—P@tnFœv;ø×t”í¯4JòóKl¿‹˜‘ÿ»'Ýc"ÂSñ­rô¥éiÒŽpòÔc˜ÂO„xÌ™Ñeú€_½i¹¶ŠÖ´É,ó\´fŸZCu¡ƒíÄÊÎw[Q»¢¤îü¦MÓoû`''ØJïô2¬»öº¸¢@|”®óùB™Åªð Í£ë 5´¬Âïý,ÝïÍykfó£B³¹ž¿ÊîV÷:±Û|éóÙv¹B/5W“ÂEÞ•gžŽ”²ak˜OBy‹Y×EîÃÊoØÜ-ÔR2Õ¶¿C¡'ìßÐA=èàÿDzh“ħ’³EÒÓ/j?–Ÿ>’Ù‹6÷øù‚Gt3×JKyÑÖr(/ÄQ”^ŒW2ò¨bÛ–/éæ}Þ~¯yû ‘m^q_¦ñþÉyDØD„-¶÷–™îË©:žÛ¾Æ¼!O›ù\ZÊS§wæê¿Ï}¾±•AØÄÁè]yE®ò[@O†êAë ïÀ2ö9×SüdÏD2Ôè :W_òþÇEŽÑTæu ­G\M'î®Åwæ°cæ4ÕÖùmq—él·òk‡ 5¬¥r >cØÄžÁÖ0ösGoRú‹”dv‚²EŠÖ,T®Õ(ø Ÿ*¸ìÎÁfñp¥ASÛN,£]®YTÿöï÷ÐAèàU±Q0€Òë‡O½gto–iÓÚÜÞ•âüÚ13X¯Y³+ýÿ¤×TÚæ…ê*[*“kRAȱ)ÖP8m¬šF¯æ%$‡«­„°Êÿ.xÖT‹Ýçaz•ƾtõ©¢iý¼å!^%=káå³?ëÚ_Ϻ³¦Au ƒ -r«"O•2à3i-øb.µ°:<žøéUçP¾(¥ëͳRgš?μ[æ“Ú! ÕÛa å:§Š;)íÊ=̵ŽË_·›ªº,4t=MÙ^UÆË”^ì¡ ÕMï`öœé'½„1úñSª{ÈV‰b…ê@‡>޾iþ}é9«²Mk¿6ãÞͬ¾W"¹"#Å*/{UYæ^¯„£5å'TÆZ§í/&¤(¥ ¬õ&öj?ÓÆ…4ä}É2ÅCE3¢??B".³Ÿ$IrÊ~ä|.:ôé*rzöµ÷\÷áëOš,™r:¨l/q +$Ý [¯5„Êe Ùz«¥¿tv”Åï´O•STù”¼fÕ¬2í?-º¥‡VL7ãÓÓ\3m8¥¹Šƒ™ö‘–Æ”ÞR7 PÓÌél¦„€;"Þr(ñŸBÂåª~<¡}ó[®ÂºÂÊwà„fd¬÷”›~F«dÓ:R14Œ#´-!‰%3‘ìåü¶!_ ° º»¨1LËR &eâdf~˜æñNû¨Ã#-Ý61l=«Ç±„l¡tÝO¢ìÆ¡²Ý«ŠWÑâ x-ƒÀ›ô tP:ØQ¨Ôg^=- Uà0¼?°®ïéõ’]¹Í"-ãØl²î#'_{‰û‘ å1ªè ü· õ¹ëÙ|}îäôð5—µJ³Su&¢QÏÖ*AW3¿cÈŽKQ*Í9%k75…êB‡ /û z}~#LJOÄRÜÚ:7öô6¤ÁlíèT–½—ýð e%í5öO?åvY_Ë}ùŠZHµ.;Tàõ©ç|BPú‚w£‚»Ðåj2mÜs„ÀxŸZ"¡ƒºÐÁeBv¾ZË›ÎhÂèåïLÇè·„ã³×2¬³[‚ÿž+‡â„wYX ƒëfaÎyÂ6¨WøÍ5 qZèa÷ /Ø®b`M™oèO³=…FD0NF:x½ƒÊÛ ¾èUè#Wòø¤Ÿ²¥k ©Ægo_ì 6¤ðw¥f¹Áú³¯ÊßžÖý&f‰gúçc9\?gåDÞ•jð¨k!vÍÎÌÎl@F•ø#ÐA=è µ®AY°k}¼;éõÊJ j£ÆÁê9¯RÖsVˆËÛ­åý^,¼Z†­JÍr„¶g‘lÃ{Î"Zù¹’é7¿8îÍ’™ÆB¼óרûæR!]oï”ÛÏáççGd} Ô…ZVø?D馧U†Œe §©©íçìÅ<ÁµÞnæÿgÍ–ÄÝd¾R³T9ò'6g&©u2[2¯“4p»ÅØï¬¡™ \cY_y¬ÎÍ>üÞîHGÏ¿«D†N}È;[~€êAÍ–%|U§¢å•±G¬†i×Á6\®&Dz°„µ`õ—»È°•6áî¤Ô,mîË¢¢Ù¹oûƼ~ÈÌ{R-Ïý¯Í™ßÀÞ7Ë×eŠz(ô•Ä'.€µ @f];u}²@>7.wÓobâtPýƒpJf4ªhüý&.[» Ëk·ÞmÕ ÿ´(îÓR„|¥Ô,­“»ým°*Žeß]õ‰sš«¥Uå’C,¬ËZƒ9YÈ…Xõøší]žG‹Šy±ñn©IãŠÂfuKœ»AP™fœàÿ>„êAOŒË`TÐøû’©”nå¥åJùº«ÿžµ5guB©YZÖ­êcÞn ¡áa¡–»·SàeÚד:¯g?B¹Ê&Óqœ¬P{\i×>-éµ0y1¢Ê<¥ðK‘cÐA=è ÛÝ´gmu¢ªÖØjÔl‹Á×¹¿~,¥ù•ÕF’_±YŠýƒÏ<¦K-d]sÇÅèÌAË]uîùŽò¤§ì.û~âPÊ6_¤xŠT60NF:ø;—•{öc™— „æµA_¢4µ÷·Æ5J}5ÖÃY0Œ|»•³œaŠÍR\áì'J§KÂqq·9ôþÛ¥,‘--_1}Äò‰èé-<=QhÃYtÔÐâ³sã¸çÌåó¸Ê1Õb†ÖWòÝUÐA=èàT.+g'$¦VÅHwG‹°õU­á”á'N0_cÛ,þêÅnQ*.ÝùÈ6¿ß¯p5´†|qTñÛÔ¹6ÁœJ“ròÝx†ñÉô¿(ÿÄ(«ª2³|MX®Î§“ܘ¯à»_Cõ ƒlUª|„„î£ÿCGaz³È7Ádæ_ºÂzè!T­v§t³§P³‹Õ²“)\ôíváÚÆ/VòC?k™‡TÚ” ÉíÐÄ4ºM€Pl¬ÔpÖ§)a†yôºÐÁVBnFÌ€ ƒ–uî0XX>®#N”n*7ËwÅßl¦§½¸å”ë¥8–¿÷;¢Oß vSºR;·ÎÎW•Ýoõ??ôˆ„!>ÅTjêñ+Q/ª &›.ókq}Hh2ÍNH)b¦A³«0ËO­nÏÙÕßr =— îW–_Òt !EÉ1Ùý2hZ¦†^n÷´ûŸö†³‡$„{Ë(tP:Ø“Võ7= Ñ ÙiŠÑ/âç*˜PfyÁzïP/:.OR:[ü8¬U±(cN®”~3†ñÉýüÞÂÀ%E¡ƒºÐÁq„°™¢9¾n›Ö Yo™T‘ç*Ć;*ìRõ”©vEPšœÓázɬ焢°BaÀç¾—ÐA=èà×^MšÇrŸÌ#ù¡ »”€gò,…%)èt9’¸-¼/#tÚÂ\È{XÎBõ ƒO2£ª¬CÄ 5–òë]ø5©°ËÔ²êobÊcý¸™®>äõõâ8B‚N îVS„c ÒP – ¼Â”Ðãø«v©ˆu¶u¡ƒtËÌ‘ÍaàÀKÉ} Â0wi+…?ØÁÿiúäöøB¢þÑŠ ßÃgI—"¤:¸:¨ ¼Åv*ï1Ô âßÓj,ó]mwÖ"­×›-ˆi;¥æ©®T0™üE˜ýâ[c ƒºÐAú1«Óc°¨žè$þ,ãï[q†³K…aš»øìÎ%„ulfÃÿÒ‘jÐA}è í cÖ±ILõ÷âá…ùN…aNòÕ³ÌJƒlüw‚XÉÔ‰>. óÖV_aû?ßiu4!(·ËS>›»1ɾƒÛ=¡\Ë#¢ßÞµ'ÐA}è ½Œí&ôÊpÿv•…Åw•[ZGö£Rž¦Nô|ã8«ø¦zÞ;w Ö~ãtP':H߆5ë‹(ë?~&!U•ÛÙEæUÊu!åeW 4C¼SsÖEß«ÎçeA~S_‘„áºO° ¨%DáºK ð‹êFÍXNX_¦dàkªr;û„w¥rNÔpr/)õ]¶§ô !Ž­GMŸÐCÉIQ0à/ÊAu£ƒ´ìYDz&»_äåfÆÖ­.Å/‘ý˜o¹Õ®®^¶B/¸ZU€ôatP?:Xö Ô`ëv ÂÌØö“„lQ[2ØäN]e˜Mé“ç¼i½"×€ïÙÔ¶‡9/}¯STØYîû? ½_À¨s俦úgYcÀ×ÎBBR¡ƒzÑÁÊ0j=¿ª~Bt_¾ Â,Y#ð¢ð±×÷&ìVa´Á¾KºÑÁ¾(0€×ÔUé~·iªëý į7vï®Eáòzt%¬8 Dè Nt-]³ ¼"— ³d«b‹«‘vÒzß<\ÕíjÒ^—×0ˆÒÐAè`nBL¿…Eë‹âºQDšr³dk~)|ä‹{ ÛÎdFS’LÐA}èà:.3Çô‚A닸f»ÕoÊÍò’Í‘ÔÁû¾upûÇ­x—è»tý%CžÊÙ‘ù €Ü‡êBë5“ˆ{ª°¤|ÀnµN…]V"Ät‰ÿ”Ù»›±~lÓ,3¥ûsŸbϬDVƒtåtP:MH½ ”ÑÃü;M@ºøË,vù óØr*Fy)ƒÂd»S)e[Jeõ´pÌø÷MÀ¼ ]è`——•`Î@ëCl*ÓYa2wm¥;”Žu!¨ ›ƒü€YŸí©î—F~ç |KôêBÏZ246 R{³dÆBøM†ù€oÅ­2W÷þæU;IyX¤ÂZHõ ƒºÐÁÝbu[´¥Du¶•9Ze Óª^%èþÖ6΃ìéHKè .tðªÍÁ€b$Sô¢¨1Í4íþÀUÂkq$mª€,€öÐA}Œ“õä*&9جÆ4Ó4mÑFè<‚ R@† *tP:ˆõ‡F«°Ì”ç´ÜÉP•wÎ.îÀûeÃò%"íAúR:¨ì[Ö%lç7Sa™Ã¸ïWøß<ËOU.ÿbäbUÄâ"mðe!d3H_Â0oB:8¶ ´ÉlY冹‚ù6ïÓ+_ÜPÂbè t6‚S)÷²Òè ¥©Z-±mN¤;ÈêB'”†V!÷_#Åvù!ÑW؇M­¾ðM”šj‰ôéˆèÓ?ÔƒŽA ä'¤¯b»¬@Èö÷Gï•·§’kùÀ® ñAú3:¨|– 4CÈ¥fyŽÓ±¿)ý¥©†ûU!¤‚™í7$>HAõ ƒkaÉ@኷žYÇö-5¿©µsðMaŒÞ$=HZCõ ƒ¿Â’&ú(6Ë9„´KéªýŽYžß”FÓº éAúÓ:¨œKœ¢ÊC”N ä6°ôjÍw®´¥’dÚ@õ ƒ`ÉÀKŠÔçý¢ŠÍrß½GZÜYŒ´:¡tP:X –¬?³{HB6áï!¥fù)ÿdõŽUÔvßá²#‹A¡tP:˜–¬?·Û…­›R³<Â~½,tÃè tëlï ¯ÄýSF±]ä¾Ý;Ô'ë£a‰5!˜Ôƒ&Â’69Ê¡Ø.ûqßæ*^™ŸEÂ0 :¨¬KÚˆWl—³ùïGýö  è„ ÐA=èàk°dà5ü‹ÛåÛü–.I@Ê &4Ôöù è t«4uÄpâQF2$µ¶b»Î*‚šˆ_W…[úCõ ƒ‡aÖÀ‹†`6Û„›¹Šír¼/#e@`0tP:ˆýèFþPl—#±€Îx :¨¼KÚø@±]~‡Ä:c tP:¸† ¼!ÌöñEÅv™Áü™ó²!ù€N0Ü€ê@_†%tPe˜d†(ÝE¡ƒ:ÐÁn°d ‘–Ê ³?÷õAaH2 "¡ƒzÐÁF°d ‘þÊ ³5R èŠÌÐA=è †‹­¼©Ü0‹#µ€®H„êA‡Ã’Fv)7ÌX¤ÐÕ¡ƒzÐÁ°d ¸TÅv™¤ùfl!7ì>2 㡃zÐÁ+F˜2ÐDMåv™jòÅ #‘æ £ð;tP:H+À”&Z¨0LøE®PæTn™ã‘p@W„Bu ƒ—aÈ@³$*_j»*R èŠTè`ðëà×0d ™{J óKtGq:ü:øìh%F©]^Ë„Ä:ãkè`ðë`;Ø1ÐJ1¥v9 iôÆbè`ðë úk€fš(4ËËXfèŽÕÐÁà×Áаc •~ Ír.’ èŽÝÐÁà×ÁV°c •! Í‹Ùýq:ü:8v ´ò‚B³Ìƒ¤ºc#t0øup=ìhåMe¶–‚¤ºc2t0øu0 C€V)³µ;H) ?Bƒ_i2ÐÈ9e¦fCRÝÑ :¨|† ´¢Ô,ã‘V@wô…ê@§Ã6"”še>¤Ðm¡ƒ:ÐÁ)0d p¥fYitG è tp hCél4itGSè t° hàÔ,‹!­€î¨ÔN€!(5ËÒH* ;@u ƒaÈ @:XItGwè t°$ hCqÿ`[¤Ð£¡ƒ:ÐÁ,0d H¥fùÒ èŽåÐÁà×Á'F2ÐF¥fù Ò èŽuÐÁà×Á‡°c ‘ÕJÍò{¤Ð_BuàE{hÃðD©Y>AbÝñ t0øuð<ìh#L±Y^CbÝ1:ü:8 v 4ò—R³<Œ´º£t0øu°ìhäC¥f¹itGè`ðë`ìhdˆR³ˆ´º# :ü:ˆa2 @Ž!ÌUzÄ ~4ÀŽF*+5KÐè t€’ ­ò$Ð!ÐAè YZ%–UÐAu0f 4bz¬ÌÖj"©t`¼(Ð#Û•ÙZ>¤€‚ ¨ƒaÆ@+Ó”ÙZ.¤€‚ ¨ƒØ†hf¨2[ÃV—:2¢΀­´UfkM‘R:2 .‚­ôUfko"¥€þ…¿Ž­¼ ßxj ƒjÀüï‘ý;6¯ûú‡ÃçSÓQkÃŽVŽý)Ð.-îñLœ-!#ÊwþøB:é`nØ1ЊÂùƒ»‘R@D@½!yaW©YiIJzè`,ìhDá‹ô:’ èxè |šß]zÙ˜: ;‰Th•#©€þÈTMʹ}=-à:;)¤Ð*!©€þ( T=8¦»˜vy;¿¾à«ï9väÀ÷_-šø|1ñô´AÐÑF¡U¶DRýÑ:¨–å|Â%¾ý·ã…ÿVã/m ´FÃŽF>Ph•õT@ô‚ªä!$29ÙeSñó¬ÜÅìÉÖÁxØ1ЈÂåEi7$ÐÏAUòK¶µî®ÏÌ]Ý`Ì;ò‹b=ðôš?tÐJ{.ÕúË{M»Xã`Ç@# MîGRýQ:¨’²\ªýîþòãxB*( êFçÊ2DRVY8y`Ç@#JÇ‹¦†"­€î(TI!&¹Ùòµɪ0¨Éžr'—ri@ •Ú?ÊýÑ:¨’pBbå®·!$\aP_<äÎ3ÊÂ;©«ÔþAZÝñtP%‰\ªÝ’¹^N¹‰\'C+Åi~ v 4ÒSñ ‰ôÆ2è Jjq©¶ÜýåsFBêøäFÊÓ< v 4²B±]¾Ä:Ãx :¨’ \²½ã3wùÍë Í Kš½­Ø.ïeGr}јBUrŠ¥[ýÿ\_L~‘]=h|– 4ÑC…aÎAr]a:TM–rÙ?p¾’òeiv­= ´¦`¥m …°¿T¦¹ è‰(tP5׿P\Ÿ%'$ ¨¥œ[ó¢°nÎ×Aúlhà-U–y¿R è‡gB½`_KrWiÔªcÇÖ«ç3YÎeû‰^1…h ½Yi>(€4z¡ÄE ô†¿dT§üß4=t09ö ¼¤]’ZÛL-ŒTú Õ ôŽ' ÝlH_pi M¤IE`ÑÀL“Íê3åÙtyVƒù|IÁÏÌ:è5É_ôsš¬ë…ÍO|x µiÞePOK/G7Ïu^6÷f˜séjfø–  6ìÒmäûûÎ]§w;‘e>£Q­§;þ¹zo|ì×2ùi íä¦éýÚ4¬V¦Lµ†mú½»ùTšoÃWæ×k¨(# ¡Y ×t,³XuÛ`Jhö¿Ý…¥WŒ%ÛÖO©†ðPŸk»S€SXºV ÂkoS,><4D8,÷ÖÑþ²ûIš¼ŽyXžÒ*”«œhÍJCDéÙÿzmŸ§´'£GåæßûµßéíÖÖG4FY“ÖPd?ªìæ"›‘‹—в~¶{ÖÄî Nñ²¯ìß´å»g<7"¯ƒ\†f-]¯x¤åÈd½eHÞf/¶†]ÝàÞDò úî»™KΙ9Bòc\ŒÅ×èòæ†B¦C žÛÂaeªåñh× ­Í|WïF©ÿ¡¸Ôº)>\Û›c ãÞoß7ñ ®^KwCHLb™2…³˜HHžÖïýþÄÿe2¼rìhW>g¶¼ùÊ•¯5xã¹·>×ã…G êÛ¹}ÓgûOŸØ¯j꽿~•D/ì± “?÷Z•’ÅJVmÖû¯Ùuý2¸h|\™—®œ:xIðõ^ødpïéûnî™õêð—›—èöås !SxΊ [–-Z´~¯î5˶ßpíÇ Ö¬ß0µmÝ’åk ølÁœæOï[¯J½ö#šÉ‘«l•jù³'V1ïíZ¶Ÿ0²P\XdŽgOùßþ£?lß?½NBxXd†íºzw}Ÿ2íÏ ñß±ÿíûãñÎvyâó5žñõ7ë×ý^÷JY£"b õýl×Ú%ãº>S:et}ï ®"r |¦Ð°øš¿žÛ·vþ¸s~¿öl\WN¶;hð;ë¾üfÝ7$¥­¬[ ![¡Æ‹×ïùbëoü<Ðä¾ýtÿŸ¿nÝ´måügc¢ ÙõåÆ}ÿÜ8wßûÏÕ®ÛdØëó¦ôì–/SdBÃôæÀ¼&ƒÁ_µQ½â…ó¬Õ÷ôÙËÞŸ³êç?^8ÿù€lQ¡ÑyŸi_µã ¡­*/YºtýgËU¨Åçiÿ|<¸S±ýê-Þòí«ôôš±]žï<â£ßlÕ˜_·lÚY‡rzóêá Ö|óç›|öíWGõh–ÞŠÍZ¸zhÇ—ËfÏùˆKÅFµ·}}׃‹ûwl^;c܈~cFÏülÿíý_,XûõÞOFuöîúÃW¸ÚÙŸ›fÌßqß–µw68aâ‚Ú·‹>ûéÌqSWG‘ž³”>=ªB®Ü•_¾ÂÒvç¢q½‡N=$½Yòœ¢ e?ø‹?uk÷¤‡LÙr:uÏâɯÍ^ƒ>>ðÜ#ùÛþùÝò¥_ܵb܈ѹg T²Àíã»öý-Öôol\6ëýÕû˜ _ß0gü¤E;ï°Ÿì|mÔ©”>:wðôñ1¥2Ç•úÝ¡«RÙÙKgLûúÔ ¿²ç¼}îÌ×K§üö€š¥JÕûéïæO²öß¿ùhÔ¨—çnÚ·SÇá…Õ+R¼v繿Ӵ3ß~üÙÑ{iWî8TÊhàˆ›Á%Ó£¿¹ì0_=ÿðÖçºõžñíé]«mXòéÂÕ?\¥ôü¾_ºEÍ?MíÙý­ý—¿üìð“s;FÕ/SeØü/>|oÅŽ$úð·Ãû[{U¸¯ü´iËÞýïm>öõ.ÝÖ]¡¿\0}Ѷ?V¼X¥FûéœÿúíWþ\3²]‹Ã^îÓ«qõÊe«·œ´õ·ëçö^Øür‹ŸY_vó™ý»¾4yý²w÷éÚ®ý¤3æ]/Ö­ÚmAê‘—òED~eÉË}‡ÎýáÈæ7ŠÅ††go¾Ý¹ºŸôí³nX3_Þj='½<èåwÖûJëruº¾7gæëyB¸È›Š¿°`ÃŽÅKV4(˜)6Wå)½šW«ÑåCËê”iWÿçøá+'·|<²WûNæŸ:Ù©XT(K¶|ÿK»ÿÅÄ^=†Ì8˜Äó§_ï\Y7ûµ‰#êçŒ +Òú¥Í÷¸D>|vǾ ž)S¥ÑK«Îs…ÆÂÕŸ©ÝkÙÞ³»¶¯Ûyâ1—âÌì­m¿Ô[i+“AàuÊd¤9”ÉHs(“‘æP&#Í LFš@™Œ4€2ie2ÒÊd¤9”ÉHs(“‘æP&#Í LFš@™Œ4€2i(“‘ Hs@™ æ€2 Íe2@šÊd€4”Éi(“ÒP&¤9 LHs@™ æ€2 Íe2@šÊd€4”Éi(“ÒP&7i^v ZÚfÍWRoNÐcœòë.N…t§ˆSP0KÝ ,t0=t@Æ:`>€Í@Fâ(S`Iþ`œzb)U]g„RZoq !¤¬Þâd"¤œÞâd ¤¼ÞâÄæu¥ª\œ† $C™‚€ü„|¯·8å$ä'½Å)ßô'®vLoq #ä´ÞâÄiÆy½µ¸8]Fé ƒÐAè t:t:„Bt:„B¡ƒ:„B¡ƒÐA„B¡ƒÐAè €B¡ƒÐAè t@¡ƒÐAè t: ƒÐAè t:ÐAè t:„è t:„Bt:„B¡ƒ:„B¡ƒÐA„B¡ƒÐAè €B¡ƒÐAè t@¡ƒÐAè t: ƒÐAè t:ÐAè t:„è t:„Bt:„B¡ƒ:„B¡ƒÐA„B¡ƒÐAè €B¡ƒÐAè t@¡ƒÐAè t: ƒÐAè t:ÐAè t:„è t:„Bt:„B¡ƒ PÔ!Æ¿ô§j$ä‚ÞâT‘„^Õ[œJ“ðz‹SQy[oq*@¢ïë,Jæ\$öJ`áüëÛt§s¶ë.Ng&|§»8¿Kwq:þšîÜ+ôØkût§ß_ÓËàéaÝ„ Gts{6¬Pª~·OþDÖŸN˜°©@pðç›u …g-ÿܺG Ô/7t&5!Ÿù=¡Z×ø:6;ÚÂnºWq¢G§5/’¥hûé%Ÿ¬ì5ROq:´Ê‘¯ô‘O§'4,[¸ËÒ‡z³= šëÏZ³%óª@ê—ºTâStóܱñÔñö¡¿ò$øãDµ´ml^ùdãn"ñ¦kœz;…_Yùôg}kØ9–šue{@5ûsJ3¦gŠßõË ]Ò×§:èî¹cãCƒo“ôqZexì&ä“ç‰ït0}ãTÓ/:˜Þù´"Zzß4=ÙPËù¬BŽÄ…¿/ù;P¿ÜеÏÍäKtûÜnl<ܧqY͇Yzþ©û÷Ï)ÆŒ ö8í6‰ç<áCè® Ï'k‰ït0ã”Í:˜Þù´ÚRû"¾+‡2Šíµ<)Çò£È’ÿÌɇúòy³Ú¿úå†.9U€øPÝ?÷.§Þ“UE¸ËK}—ǹÙG‹MÀ”‰ìÈp8¸ãt7;»c™O¯Súèè ¾¬Íû0ÈóÉÆ…̾ÓÁtŽÓâLï|ú9œÝ³Ëž$zkwcþþ;uc{@5‹XnÕ½-¬ á $û5P¿ÜЙ‡ß #¾ÔA5Ͻ†»:ЧÑYÊîÞÕv<·î8½ÇDÅ£+eÙáûAžOVÒßé`:Çé dDZ:<~ˆSJq.̨ Âù#ö0åÌ:±= šdÖfÊvÃr8‰eäbê—:òv»"KÍõ³À'k <ãÛ‘°M˜å_I1û s#Þ æ8™ós·+öÀz|&”;®äùd/ò>ÒÁôŽÓgÜýʦcÁã8-g7\k=|î׉íÕlbyµÈ–“lˆ[Eê—:’CâÁù,à •Ö˜¿|¡'¬K¿‡ô̧ìy6sœþdwŸ/9щùzïu>Y9̉zTeé`zÇé-î~Ï¥_Áã8¥´÷¯\cz£õa{@=ý¹¬Êô@Ò’bYyYúSÓ‰ŽÈÝtÊYŸêù†ÐAÇÉ÷¹+ }¡_ÙÝ즘\cgfsœ–°»Iv*;q*¨óÉÂÃRL㻸ÒÁ ŒS/.Ð r_¾8ía·ûCr¢¹£3"hm¨' óí#9qÞ¡-¦­MQ:žÕ¨Çú„­xš¹ÖA_ÇÉ£a„47û6B_°»‘ž1³±–¯sœÞän"¹ÅÁ7„q²ð"wÓVf:”qªÁÝn¥ûËÁ§‘¬#Oz"éÆ7ua{@='YN-‘žÉkç€[&$½As žnèSî»ÔAŸÇÉžÇ剻äã˜Ìc·,=s“y;˜ã4˜»Yaꨃç‚:ŸD¾fýDר³gœØPÞn¯cœÌÌ-:ê*NÀ{xö é™Î܉*ÖâWmbÈžE0ç’fÍšuNy nô}œìy;?Ç×1ùfذacìÎìc´<˜ãôûöíÛ’ž`CKŒO‚:Ÿ®3¿üꬃÁ'~Ú„Û!YA§Kìö¿R]Å xÏt–ÉÉŽY'¶Ø÷ó³AkmzÀ5?bŸC9†p•;û¥ò@åoôCœì¸IHé'þÏ9ÖANë)N)lòU+䓹wËÔYƒ4N¬s:}´¼K¡˜°¼UG—üïÓö Iî®ê¥ŒJéÇeT.»3 X¶_ç?>(Ê>ÏóñQvT>ͳ=È*{Ãè ?âäôÅÿù?ãβIÌ:ŠÓ}~²}:È'vÇÂ÷u0XãĦMÔYf[S¦ä:s°ÇéC.Ô|ÜßÛË:×(P¼Þ°¯é°ŒŠiãÔpÿŠe°Wß)es¢›»³ãžíA.PÙ@ý')Ǹªä³þÏ·ÿØ,`²BqztåøÞÏ_ä]PÓtO§£1ñ_ Ö8Mánf²[M¦Ï£ [¬·:MždíÌ=?EoePÛɧ‘ݙףּöÌ¥¹O5%õ {lÑA>=ay3‘:ë`ÐÆéyKþ˜â-«S4I î8udq¸^AªíMn꫌*¨&í’áù…eÝö‰­¦D¾‘^›ÉÈböhrÊ] €ú%NvùaƱæO3±{'œ×Iœ,:Xï?=äÓ.èªO\è`ÐÆ©Ÿ;…çü“FSÏÈÃî8±UŸ±_2µÌ=•@eØôûF;˺ÍìÓ,îCV»>q~>Ìqö ¨Üµè _âdƒ_íÌßU½ß…]Ó2ÿ¬—8YÛƒ5·™ƒ>NlïÝ(qü’½mœø=^°Œ*yÄÐ2ê8Õ-.ß´ƒ·ýó?јt2릌Zuð˺uìS'§küD¢¥^؃-P¹kÐA¿ÄÉÛjÇÏžÿkßT飺‰SÇVÍk­ ÒéAljß{ײXœ½kœn³› ·5‡ÌüÀ‘ÎA§ò‚¹´LÉÝiÛp"øË –jN»`Y÷5ûTÖnÁæ9O‘À] r× ƒ~‰“ ¶ ä.æ×“™ÂniÆqu' Sxgo{spljõ¥µ6»ÔÁ`ÓãÇÿ.õ &±é‘a‚9N¥ø·hœíÄ:ÛšèúxŸ€X×nc»3|×îìS×[G¾áÑä•»ôKœ¬°î€Rþ\-iYáy+ì×Oœ¬üÃWßÔqZ+,$ãRõ’O”¾Ãn¿=˜ãT…ݬ„ÔùÉ»FÿÕW>¥´áÇKá‡úò¼F¹¶aôA.¯Uö¨Üµè _âd…Í šë¿ÌJ/¸Dó¯LÓMœ¤œd¶5 æ8ñ{ïn¡®uP7ùDg·'˜ãÄoi·Î5¿̧úÊ' ”~â|RüV’çÙ§P×öÐߣ=È*w-:è—8Y¸IHÔ}¿åÕ¿Bç~æ÷v- æ8ÙÓú GÆi„¸ŒKÔO>¥±iw/sœ˜d‘ Ò3·¬m>ýäPÊ»lVÝØ¨‰lïiþ ëî5ωíA.P¹kÐA¿ÄÉÂlû-Í|ÌE~ê<éwÓñBÇÉUìÙþ â8¹~2}åÍÍÝ­g0ljm»fïLàN ÒY>…l¶_⟠ýåøOŸO³Üýð{‹y°Eõ†X6x TîZtÐ/q1—°sŠù˜;|ïYÞíÎW‚4N¿¿Åa·£°)Üî Ž“¬¯í9Áö]1˜ãĶÿ‹·?Åv è­³| 9ŲÎn1õâÖ1ÑíÐ좿X.P¹kÐA¿ÄId7[T÷±Ÿ2ÊÜ=@í[..iœ¶;¯9ÅîF¾â8Éê`ÐÚž3lÆç”`ŽÛËbw*ž;õŠÎò („ß:òEÉ ~[»ùœº}Úƒ\ r× ƒ~‰“HK…Òð=î-¸º¤q:Ín¶ÊîÔë†ôA§Ñv°E9ü§ ŽÓ?å9vÚâ畯æ÷‰ßwÉn‰ëìÌA]Fïa‹Cä‘x°Ù:·1w·Ýf‘G:vìØ%Å£=È*{Íÿ:èŸ8ñ$³JòZ5+²Û»Þ.Hã”åTïf«‡&s>Ùc?N&HãdÎÅ…ÝÁîÔ|냠Í'ö>M’žXÉîÿ‹~l¨‚.¼ÍfôÕ¹ÃJÂçÌSð²ôËíÙ,žëErÊ^ó¿ú'N<;™«å†ŸbÂT_ïúZ°Æ©5›"Ý…ín‚u¡â`“œkœØò1!—%'RY'×3ÁO“Ùâi÷$m9¶æv–TýØPW+g]Þe¬¥¿¬Â"ñ` «íµ}÷W.LWö ¨Ü5ÿë âÄ󊛽§}ÛÐ3Ú]¿BÆiýö6”%¶¹UA'9 Ö8ýÄnWW2¢‰9-­š`ͧ?ÙV»Ýl#F§±û¿ª#ÛêXÌ2k„h'Ù˜á"–Œü‡µâã­kícKze¨À䕽æôOœluÁñþÊ%¶´v‰UN\ æ8=`Ës[SƱ‡I|Ôù$«ƒÁ'~Þjwˤ·Ô×ùÍÒ‚<Ÿ°Û÷­Íü[¡"ö?ÙPÇ“r,ﺰY[É+ãíwœäýÛ†n»8kyx ?¿tUbrÊ]ó¿ú'NÙ™­~Šˆ9Þõ0Ä/ƒ8N”~Äǡц¹þ5¿$‰­AOò:¬q:Â?iöÙ< ig?aÓ Hô±`ϧËüB½ç]1Ó;ë„¥VêÉö€JÎóÛª˜*´­ÃïN&HŠßþâþ›9³‰ï+T‘=È*{Íÿ:èŸ8‰ïÎe?Eä‘ÕÁ Œ÷ØÄ§ O?Í î|ò ƒÁ§,ö–YÜ–>ô‹àϧïD›‹ˆuzn=ØPË9¤Eë`éÚ•i£íŠ]ãd³B{ TöšßuÐOqâw¸Îí¯ˆ•×Á ŒóŒv²NÔ2spç“ Ú8}h²{îl{u'úY¤ÝsÏÒ—íÕüÛÖfáŽ>Êåm¹Zý€•»æwôOœR⸓mü‘t0ãÄW¼°=¶©Ç©`Ï'O:´q:XÝöØ/_×G>m`{î&¿êÌö€œšP+1<¡\§/œ‡$¦î[-Ddžzãú.PÙkþÇ?qJ_‚4N)[GVË’­d—yO8N‡'4ÍkÊVºó²ëúɧ?&Ö)Y Î”CO…í ¸MÈW¾g4qOŸÜá* ê¾óùÔR$Ûud: ?HMóÓ£ƒt=!ÍÈv ²3àwMGL«@Èä;-õ¸ò}žï~;™†D:ê ÝJHî$Ø@—£ù1ð‘¸tÑF$÷P %ÇÿùYÍU™;è £?!ÍÒ9B¬mØÊ硺×AºÈaH¤ôb(!ž6LËGÈÛ0$€R:ЏGO›Òq„äyKèà]Nƒ^Hï^r—ÖÃ’:¸;Þóôé -OH]XdtþšÖ¶`œ)¡X—OnÉé ùðë- f6Ef¯Ô{ÙmÁœé]"¢à—¿­NH¾4ûoß^Ù¾t|hŽÊ#¾sšlþhu›RÑq%Û,½éâ.>mU:.Jל¾ZR¸œÙÒ¸[eÓAAéL±â•ª÷¤:¸€ P…Ö5â„‹k­!ÎÏ] ѰF©Ú\>–îÚN—²ß¾`»Ewîø7XdXÌÕY1^aõ 3}ü[WVŠOq§ÿž7o^Qî ÷—ß#Â\–}¯ÌÒÓ¨ùÖÖæ¼ü-‘“ÅÙ¸rv5%Ùù·ô–‘‚Ò›6c?Ï=÷¥×¿âŽ»nÑÁŠÜ3„=žJאָgÓeñ.cÉé•+,„Íص’–÷3o$©µé¥7bŸC)ÓAɃËÇÒÝCKup KÀ¢—$·˜Ã˜3€ ËAVŠ·NÞbG“Å»±.¿°+¬½uØá'9áÔ¤ÆN›Ð~œÌ×ÜQWÉM—±_×Ç䤼ȎFYt#ÿ1Qyfó-»Ÿmw1ˆb7s²‹g„ƒLwÉLñþú°£òiŠtÐîÁåbéî¡%:¸ˆ},vYz‹ŸIú¯£À=LùBîZŽÒ ÛjØvZÆ$#Ê6|Ó̾8VrîÒ ãö:ø&w4Ëv1•µåŠZ;Þ’+s‡¹Ò¬:{ÜúÍ÷Ùqé]VZ¯­g‡ßŸç±ÏÓmOǼ‘d£"´{p™Xº}h›2§-)qÅîžC Éœ;€ŒÊ@®è~ÆvøÊví»å·®BÝíÜ­Ç<“¥¬w)C]ê ksu´Š]ªDóË$Ž$–îZÐÁ9¼K·‰óTA6Öfì 2*É„±)W^Pªƒw^ÐÉDt°¾Ìo÷qùl×¾e¿½âVÿ²;õ!ë 4[îÒĵ²Y ¯ÙÅz ßS¢ƒõÝ$ŒC,Ý?4¯ƒoÙM)”ò³FÈ@ì°Ìy/Ø{é yüoã´¾µsX'ÉKu°­Œ~Ãf(Ú®­e ÌnuÐοI7³SI–»<çZ󗼡DFӏޥû‡¾*½e6§QWpg›ÂÌ ãr¨¤­75^ðЦ̯e´}3ÌA;ËèàÉd *Lrˆ¥îtÐáÊv³K–»tq­ƒQ®up¤txpw±tÿМ<–ýÛÏñ2gZV˜”•$‹jÝãZ)mýJÖºã9Ží"£ƒ¹ƒ¶klv|‚[t¸Â|ªä¬ u­ƒý•è ýƒ»¥û‡up*}H\ì.õ[$F››ËŸ³ ÀWZvX¸^ ëì]üÔ€Ñ*tùEËÛ®-gëwºõ‹†Ø_á+½éAÙ ˜^óœØ¡ZÝÇÒýC_µNzÜÎ>ly%ü¢¤þö~+¡«ÐxÌYËžðm¶£Õè kÓåµ]ã¶¾çN‰ýžl_Cª,f¿^;<ê L,Ý?4¯ƒÂÝ»²í/ϲ­ˆ ƒ“´Š=:ÐYËÖ®?jü¢²©¶k¿±°ö»ÕÁÝv§Øz7¹©l$ì[¨Yebéþ¡%ë‹^ÍÌúOÚ]~ÝqJ$€ Ì<ÖùzvZö÷¹’Ô-ØG…&³‘'¶ñ7OØ–FH¿½ xñâ],:ø–ôйˆµ9%£ƒlŽ^uè L,Ý?´t¿ Öz%õìܧC\LàQ8Pšã¨äÄXÛx©–Uâ>•þ°¢ ¤,c>Øn„Õ¤ßnÀú÷,:XR*#?Ø•ÑA6&Ó$Ýíˆ騱c—µ:(K·-ÕÁ´Úì`‰ôk]­ø ƒp‚•ÛÓ¤!¿³–±åÍÆK¾ö+Q£ƒ-¸£}¶‹¬ËLz|'D#¬³½YÒ¬g.*§ƒâ¹/K¯µçNÔQÝ”‹¥Û‡¶Û‡÷8ºš ]d´wâ 2(X¹]CÒ«ez’•1+ØÏ8O*Ç ÿ¾ò:h[Us’½Oñó1–³mó0”…¹dÕÁ¶Ùüü„ͨ'¤cXƒp¯C3òcÕ:(K·m§ƒô vÔÃFrØÿÛ»›Ð8Ê0àomRM´15ýH[­Vm=HÓHš¬ÔˆJ •¢‡zÐCE<ă z(XŒAEE"h=ŠPl¤V„JÅ‹Ä*ØZ©–’Iöug2»Ù ÙMR/Kö÷;ÍìÌlæÍ ûgvgž'„«õ]¨Y½¡ìÊm°¤ñQ’e}YD&m)š¿+¬u:mbn«šƒ}ÅxýdÖ Òx+t=LJµ„¾XÌÁ°-«_–;œÎ›?G’ˆ[5\XòÅÊüìÚÑEç`ÕQVÚéòK;-¾åW›¨i烈õ}:‘sïïJfZ³zûÒ_ëè}2få¸7˜\Øä~>”™¶tá¡ 9XºmŒç—‡pCéUhò C¸öõ³ùÉS{“é†Jr0´¾ðÓT¼ðAú¥hx,ΟƒÓà—íqôä#ésõGâ¢s°ê(+ítyÆádö¦b'm(f5kjG–=-× ¾“-:œÍ'Ñ1Õ™N¶÷ìéJz0„ûGV¤/쬃¥ÛæÝ™Ÿ,ýÑìëUYàµgë½ 9ض'}¡qe¶¤óï…ä`nV®}M¶ÝÓqñ9Xu”•vzV¦÷˜ÎTýN:ûžršÔ®³·”#k(Þí8±£$Ë~l/]éÑñøvÕ,Û6Æ—Ë{¹ÇømÙÛ-Ï~JLrpÝøîÒEÝçãBr0N ”â²ÁÜ%ä`ÕQVÚéÙ9øçê俘Õ"ˆ[BXŸs–Ô° ý %Ÿî÷–4¯ê^·bS÷óéÌÈ®â:éÏ_Ãw·^Óõl…,ß6}’¾ì~ÎøWÿLMÓ®ÏcIÆÉW‹u³›_œˆ ËÁÝ>3Ší'çéê‹Ve¥žƒi%µÐ3}oÌïùÉ'œc5~I8ôðm«/ohëxð¥_*¯•û²¿³­aí¶Ç_Âí=!l,o¨OÝ·¥¥qýŸ¯—¦s0Æ3¯õÞØtUÇî·Î-æoLžx¦{ÓMwü_DÎ3Ê9vºªWò#úÆP÷Þœ¹ï³ŠB.[çxŒ€úóÏ•3ÖQ~ŸÐ{Ž>ñ©ZFë.†°á_€øk㮌–ZN]?«l8uk÷Ô[ ¡é‡€¼ßšC8Q_9˜ÛÂ!G€Ôs!ÜU_9øQ.:ð¤.nž÷щ¥•ƒS[gjÔÀñeež–| a¯’j „ðqýäàä­aÍ€¢ÿ´Ü” endstream endobj 220 0 obj << /Length 779 /Filter /FlateDecode >> stream xÚÿü  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ™b~ endstream endobj 223 0 obj << /Length 2686 /Filter /FlateDecode >> stream xÚíZKsǾëW èJeQ1Ö;;ûL%©’X&eW,©,Ú>È:,^J–ÚH3¿>ýœ™%–’sÏÚyöôôtóMSÉäv’L®_$ò}uó⻫jRÇu‘“›õÄdU\štRäeœÚ|r³œ|ˆn¦•Úé,­ªh=5QÛí±RFG¨lV\Þ5s(Ñj=·­Ûî|àoPþᚥõP>ÍáÐÁ¯YLÓ2ú„"¾ÎLi¢ßÍxð´^@ca£­,°hиhpú ‹\Zr/t¦UtÍIìõÒPÕS?ýxóãdf²¸Î2øš¸ÎeãOµšYX»Áup[‰rغ¿À–Z×D+qÇQÖ¤A[(ÓX•{ÏöOg¹Í£«i•Á4ÙÑ Ç¬dÎÃV ¶©PÜ¢%{o¢[ìÈÆÔO£-ÐSñ[Ð ·ßt¢º)Ø\ ˆ­kMñbÔÙðç|=F§²×IÝ¡®Ö1µž4 ¢9ÜzG^Õö8é÷Ädðùl”Ù2úáè5éy&÷2¥Ã)œ¯&Ç‚K´GÝ·oÀ#6Pϵuõ'¨·ê.«èSÏ}{Ü2ö÷GnhÀŠ%µ–ì£â[Ù †“5qîñ‹ØìÐMyØÃF=Â#K$İ}åônG;“!-Ü¢zñù¶YzWùÒ¦m:r¨ÐH‹Z‘ 6·$ñ–ÛG'ÝËîÈMçRÙ±C€˜GôøÕùî*7&riWeÅÊY ’”"ÅD)8 `Vôn×¢²¬F@•úà{Å7ð{ÇU=Ck@?Z´®iªØVæ Z1/xTl–˜Â©áúý4Ïáôä1z±•CË!$A•4|÷WÁOk4Ä°ØøxŸpš›è­,Bp÷«•B”QŸOár*«æèmÄâáîÓªˆsS‚h÷sš—ñ?ôâZ(æ×­TÎí—gqׇˆbm–€¥C_ûΤdtw‡JÁîÂâ¡>ÀoK!§kÜÒßQ¼ijȃ»ËtÆ)4åüaÛ÷\Qh{2û¬)ÂŽÊ-C¸úQ]Ñ`$Ø– ßäX Š~DI„ 6uÊHX©¿$|û¬Å½$.¸}ç]2àH@•OÊ@ +¨À¿àÆI­ O196ýŠ3.Îeï-õšhàƒ™Óy éå·•é‚^(•¬éˆ‡ËltÖ;éÂæ5¾ô¡ù?ÀÏÀïïðËIª‰>²ãq&âãÀ¦òçbd ?Š h6eEêŒiýr‰þsÉ•yç·gQ3Zf«.çëpÄÊ•°a!ŽXÀÀ‘bˆ#8ª‘/ ]Ô=ÞŠY*zu^¹&(“B÷ä^dÌ7·wr-o‰Põ£lwĺs7s±)І pÀV× èŒJͧ ©O=Êj:+›´+ìX’ã`ñmAá³äNˆ$€T©¸›2k€‘k¯ŽA»ÒÆi](X]3ÚqÐ(››iY0ú5êvÿ&Vç2SQÃ-(®{9¢"_ÞÐöˆT(Iy³U[×!}¨)zî(¦qèbë©NÛ nèÁ7``m+F8Ç/à?½ð¢ºvW —ÅE<>Q½aô£ÈyõÃûiĉ<LËœlqÇÆ„»B/Í#²Q]m=P‹¢¥ÓŽ@W/‹Lü££;øúsçmÊ2.l¦çÝà¼cû~Ag¼ó“Â9YgnÆ Zh¹ŽÃŠŽ}‹mþr‡Pö*‰îsŽX¾ÓÔÆI©OåÁ1çý*¬ê’[n)æÚ¼#2…1UÈ‘`´òÝWv|[,‚¹nPËÒ:Ay¡Ï‘.à³Ôã.|ÃKMž~àηDL{ÚOy†Ò*ö”–¾ÅÏ57q–X=¤Ç PMôï-žÒW)b“šñÃŵ•A•eÔ,…X*Æ;Þóä݇€Šsv‰+‘¡ž€•E«×‘ˆ"Sâºà½‘pÐø¾Ýë–ÁJIç铇jOŠ £PjÍ_:)T~FîÉoË¢Jô\h>¯ô]¦„*3©€,Vw[w]RãøíYÖj!b¢„ˆb÷œ‘c³"NÓlüà~Âû¾aèY'•õ sV”µ#“¨=Ñ1 ­¶±MÊ‘—î|&": ÀGÿj&Ï£4ÿ 7~Fk7þ}§—ã—X> `džóç©Ô—I…ÏÈF@ò(³ßË”Æ_ä9º‚–—x2ò{/èQš·ÁZo¥üVÒ ë0t¹Ÿá÷‹½`Þ߯ŠrTüO¢gG† EÖw²ŒXhÂ…l¼ûß©æRÆbÜÜ÷Ðç)kþºäìû?óaÏÉm=1Yl³"•X²©Ìd˜ñJýg¹¥‡`™ñžJ¡¡aÝ ;ŒÅÌÀÏï¯FYjâ*‘ìÃË1Vw›À9Âóžž¡F¿0±;we5a)öÞRò¦¥Là‚»ÖîI~R¦^Ô.©…;Nd…ŒxpKá 5ÑÓ£p”0w&_ÄE‚9鈾vˆ<à„E2ä„ÐwR"›×Š‹çœ:‹ÜìWêx=ml«ÎÖ¦’Ò¥îîŠÏ[ÑÉe[öqBs·aÅÖÎ*Iä’ž2@ÜAÔo½Äìj®0ô$g63po•Ö ·oÖœhtkÏ~ƒÆo“Sòn‹û©ðz¹Â5“ºñÉWÉþ‚ƒìtLÌ,ŸË¿ÊJµKYã u†ž3ºJçA`£™^Ÿ=uéh'–lëÑg[ƒDîhö.Äx¼ä±|vÚ6S²NüŒ&ëˆÀ8 ›Ìdp¥¸*b‚"Ä‚,ºä¤êíÂ@x2”çO±‚v¹âÊÑãܟʺ”–͆<h‚‹›‘ÙÐle,Åúi´¿26®|ên4ddé–‹#!zn4Ÿ½o.×ËñB×ξUVJB œ³Ãø7§`›4†=Œ“¹nc¦lÓÊÝLÇ•Ëi˜ ×R=k ñæÏ'M/VÜ<ŒÈ´tÈ Å¦§œþ^h*6Ñ<åŒ]9ž/(LœÀå“hnœùåbæú’(Ü>—Ü/†›kº³™zÊÄ!®Ý–1E\Y·Ü·â“â;íévÃ-ŒP¤gD¦Ö݈£/Ê-¸oê!8¿C>æó;øœƒF“à8Nî6¸¦ùû@- :¦ã´(ª Qá®ÔòDŸx&;+á6Þq›wÊGÅÌÃ¹É =„`Bá•·s:¥uWáÖåÅØ{{} 8ì´ü òöÐ8 L3ct&êŒe]õ¡8èTG¯Ǽ^ WBvës/u„º×Pƒm0¶—1½"ëRÚ6"éY°¬g8éAs2Bò_k°²;=á¨{Qè(´nC}ñmÇ€³ü~/„]^Êä:(_åé»út|ðêùši>Èï"в“\ýøuÓì±·Sÿh–M}Ùrú|0IVFßx[Ÿä˜çÎRÔÕú÷Õf ‡}/9£¯µúª ý#ÏNq†ûßOþ+@Qäk4'±2ß g|óâ¿Ú‚Š endstream endobj 229 0 obj << /Length 2330 /Filter /FlateDecode >> stream xÚ½YK“Û¸¾Ï¯PùDe-˜ß®8{mï&Wâ‘“ƒwÅÑ(#‰³$µcÿûô (Q3öV*Š ÐºÝ_wCál3 gï¯By¿^^½x—Ï U¤&-of:ÎU¦Í,M2e¢d¶\Ï>ÿžçqPÏq¢ƒ~®ƒ[xê~‡AÕæ&~Ÿ› HtÐöÜïèx6·ðôü<‡¾< °Ù7-é`Í„e'ïù¯Ë¿¾x—Œ˜Ëbë8'¶þµ•©û´‘V¡Ž-i³š/’8øRWÂá/aÎq#Úï¾DFza³:ÂÏG[+6ù:îç “Z©š› .Æ„*Ê¢ÙBkU$¢ÃŸaîÇ9 vØÛS\ç*5É®5²¬YQdˆÙ›Ñ¤¶ðeñÞ0C¶OL°þìËs6’T™8·SQ!‡N´S*œ¯xR¦}ÁubT˜çЀN#‚ÿd0Qp@Û ¡upÏR¾‘%\ñŽÉþ Í7ß‹š$¦öölàùQföò–³´ â”AËnø”‡Ÿ¬Qd¢^ÜßJì/º†ç<ÏàùAÞB^‰Á·»–ÔÓnhT<²’æ ¥°ÚfBøš7zůg²æFÖ,d]‚'ô'”SIy£oWî™q¤¡ÊbãGg^¸‚B† #PðÒÔ¨j¶Ýt02%ër0…¦[à({¦D€-ìI+w`-_ç…2¹³ß÷ßäz±QqqÑóÄÞ£bÆÇeØÓ £ ¹0™Ê3ž+ 6pŒÚÄÁk6† JLl ,,¢,ú[ÔD–+r¯µ *ܲž`O1WQ®y³ ªùÀHë‘âb-\sûÃÇëwÜZ‰ºkÛØðôÎs†ºcⲕù¤~†êµ u<­6'G©£;ySsˆ¨"üàö‘°@¶)׿¸Ã~Ê3,Øå‘ZðóÓh_¿Á¬X㨨n¹»dç¥öï.lœ,·Wpè… ^×þ¼¢m £¸Àhø´rçb¼›PZái[ëÞ*õ”¨¤æï›š#›Ã~Ëü±O€1‹(n·C›Îyä¤;ýݰ ÏŽ„w®ØL`‰.b•™u–•‡zÖÎQ…ï'1ìOŒJc§&‹XæL–ÎÃy+UÃòž”ïãóbÔ8\.œÇ±§¢ÓwìñY€þW ò´èŸøµÁpòËÀætd3ÍJ|E dsw‡ªÜ|‹}U%%{=3Ð{S“ÁÈÉnM^Aúî:ž€Š-÷ûrÇ£äRÕÖ!‘me¶0ì;ñ dú†ßƒ'L¸Ò¾±áåf ⱊâÔˆ^"3è%!èN(:ä>ì9Œ§ûá|€ê®ã^ܦe#"tÿMÁ§ó8[­ò0üV…̬´g¾+¿ŠnÚ‰, æº ·b`E+· *| dt Ù€ w®´å€#Éi¬ô£2Žã{Ç,ð~ ²I¿Žd¶c%ºàŽOjÁìŽkÅÚóЛ“Ý"“¥ÁøŽ¨i°Ý{‡ôY×[ç\@‘ÔÁë4A"ÉGÄ–q5ÚyÓ²…: Tu>ǰ†¬ËâyÂU‘ÚÑŒ;©f°y°D3yF’—75$Гº[Ü¿÷ä`HÎ^§. ¹Jž&^ËrxøÔàˇMÍ_¿-8l%=ÇÞ­¼z äñ±Ý&±åš™y4PJ€ß ª¤Jªøýô‚66†þßÄ㉭¯’hJ¹Ž2É)ù€þ&ë¨pTA%Šr® Þ~„Øß[Ѓ¨ª_¢s¶ˆŠƒ5Z(ŒÛºõï¥ØéFg 4u9‡\¾âö“5ÖÒ^]¡õš³"4IÇPÁ§û{«Å"ä 4:ö-D,‡ˆSíý×=©«&÷Æln_vw6^­=R›9†¬»À†\x`ƒ {ZÅP Úv[^ DžY»•ÀpZŸ»‹ VÎz(Xù[õ"Ùp/ä×—&¯/KÚGWp¥Þù¸,SÞÏžæqóxÑó´~âYÓ×R—ù¨éº„“žHò‰ÞÛPÉZJ«“ûÂ_žÞÅ¥ã+¼ŸŸ^ÁHËŸžžlXé”,òžt¸i<;£t¤›ÞËŒ”°¼w¸v*¿å¶¿W‘ÓwŽ&,’³ÌnjZÌw.ô]ó|ëÔÍìUéXÆ'®JÃ8+&ËêWòþc–5bôT1zr¬ÓxâÅ•ºÀ°ôÚ„\]´|)ã pÏUsù’«a`”#HÃ8IÝî–Ôû«àh/ÿhåNVqQ½ä|Dò×á®É»çõ‚UÊËQÎ>ƒdSçÉX^­Æ4Ÿ)‚/o‡K¡QµE*-´M%ÿ˜mžA–ªbÈ‘]qŒ·€Vn¯NäzMäÎùêÌ•ŠH÷EŸœËàÆ•«©½Œ˜ÚUª[I1kY²jödF0v´u)ÇäEQ>Æ…jT—G  {e{‹'éèb01œ2ð-HÍ3>½¡»ÒÄV0»xåóúÐÙ¬)q1̲þÖ‚ÓÀñ§:ûßWœ¤»úþ•(`ØRj…s%ÃÈÆ£L…©™A¡Â$?ˆF4o—Wÿú³Ì? endstream endobj 239 0 obj << /Length 2547 /Filter /FlateDecode >> stream xÚåÛrÛÆõÝ_ÁñCNLØÅ…ðÔí$’å:n“iL§“ö"!’I°iYùúœëbAA–’ig:ÓØÝ³gÏý²ˆFËQ4zó,:ùÿvöììr:*Â"3Ùhv=Š“4,R;ÊÒ<46Í£ŸŽÿ5ûÎmý4IŠ"øÇxjƒú8žØÜÛ±™Çvž¸×<õØäÁ-Ï`¼ªðÖÊ-Œ*^¨¯=€n‡ <å‘ÜðƱ.:€ò ~6‚õŸQá¡ ¯#=G\Ÿœ¢"И7Ñ©åwÈp bæÆŒ&q 2YÜâ~  p_8ž$‰ fÄ–5²Œ?wáO¥‘C×ãîž>èî6.<QÐk‰þñ´‹ô°Ð¨Å/eb_ÒÔ–âW%¬¢„L?赆‚ ï +;%”FS<\ƒä±˪Ýis”N6µ&b¿èðž®*gÐxl#žµ¬(ùmŸä[Ù ”grHYV}”s`Ì çéØmGìþÙ] 3À®ƒ¬ùu!9äA©¢²ƒlJŠ¢7<#ò¤pÃq¹ßy;9˜¢Âv~‚yHŒ”óÓ¼'Nî4ÒQÈ“ŒÖðšnÁsªò §—-¯h¦S¼U÷ÞÑh™%!hÒÈ1i(’a|tœŒËŽ–#Ås5z×§¶t@Á=),8âÇù(tJ>¬b£ÕIÝj4§ÜW’q Tcånámªø}CñyÉdÐ £6ýt6‹€0ç Ù8ÇEçï´D¦vdáÇR p8£2EQ ZÎ÷l r)˜ý±¢j`"žJøÅÀŠ~M‡Ku LŠN»\ ¥xg%A½y+©„ Ü#°¼Ñ ‹8†Xý$tˆ_ä„¡Þ-yÐù*œ”˜”µ…+οrö$Éí Ïí%†#çuã{^´GNo\-º“jF„àOTTrzTZ¡„Ͳ<øV0öë3ÚJEË‹!Ž)K $OØy5&‰‡XJaÕo½ç •'*aW oÔºÚ~š,¥š-¥:b7Åä ôM‘t¦x¯@öSáÙ¥-FÌœáôž„E”Ãf™Ë‡q`Æ “¯?K°ÝKòIÓVãàåx2MŠàâûRª´ ˜N,K-¨n¹‰Ó -îZ1u*x?q$°¤ã4áZ-)œJÅ„çHhÂWñvÔÂ,šcÉ”‰~ËiÆ„Û< ΟúŒÿ*§ï†j‡pÚi,.­™)‹ú5ò$ר7l~iüÜuL*ÁTb0¥ht3Ò·wÏNê±8*ÂÈäZ­$Ƥ%x Ï™<•¤vNç1Ukdîg™›»XÅó åzÆC¼Àƒ"ŽhÎOÍ'Ír‡Sk•Dî(=PaÁ²]ˆU£¶Ü>Þ‘ÂÀº¢pšõÝjE¶Ln£% nÆ0p­Áƒ ŒƒFBÍ<3Ð’t u÷ªj„á‡ó÷ĸ[ë n8ìÊñsÛj•a#7–ä´0¦ÍÃÝvN&C1¤E•4kªµÉ=±aK²“a’œÅr×Ë y¸—@Y*öƒvs ¤êó1ûƒáÁ¼Ò%Çje½ã!bÙn)ì’X6‚ù,¬€¨¸“å•Z%Ý£‹g¡sƦs>½“HlD½hU¶G¿ŠƒiìäÓK˜8ýaÇLkHo9)p1ð¤üˆ=SÙêíWl67$RüôWâëåºcŸ@ßt¥‚p‰˜%G!ä ª÷ªé.ÁÓq_1±«§‰Ì„i–>%FÜzOèÅ‹+…Îm¨ôìÆk‘t(q¢ë:“3Ž‚cëRpüYhPŵWð`ª)ð¦d4…'‘÷ü qƤQ˜N{a†ýÏæÁWNØTl'©È<óYïHÜJ’Î ¹U{R—ª[Ñ:÷°”•8ì´Ò¡R]Ö ¶´[Í%1OãÆ›÷Ò»;=)#´O.7r³Eeü¯–qñRš÷ؙؓDUæùO}Œ×F‹®o<½–NgúG’"½>+YJFÊ,æBàèç=‹ÏîQÒ¿MøoRòNl‹s~üEö$4ìOÆÏ‡|U(¯ǵحúÊu'ãûÔ¿×ïAñ‰âéÏ…! ›™Ì½` oÇ`Ä}ÔÔ­¦äRÓ)˜õž¬»¡¿‡e±¥ºÌÖ£CK·Zʱ¾ ®¼ äVkA™{‹0øIϨB1q_õ¡˜ŠšF(‡v*=%Y…Œ˜gf+tEu­üþ]à”ã»gKÓ©oÈ‘_ ;ø½Ë×PÆg&±¦ÌØŸnú=BO¥ „>îÿOµÃߣô•Œ9ýÿ)=sJ‡¢M?>üç4uÚ 4ÚõàUŠÉïf °ô>–àöÓo‘Ž&A_Q#?hi…&Œ@J£€ê%ü€sºÂ%Ûu_1ï]tärM§K½ËëÜcnéjhÕA× ´pÜPÍŠiTB1ì—•oZú9pø\wæiÃfåÓ™+Ó+n'‹ú“âÐ]OCJzb%oóÐÆO)ä—^Ã_{ħÐ+ʲ.8Öý’µ;ÐP9ÝZ)ïý«ƒWRb…Í “¯¦‚.÷m…&w× `S\݃ˆÒ©è¨ê%P¡Ãka’¯9õ+•Ó|-ª]K›Ñ~~¡î¶ÿëuÒCVóÒ7ç%z_¯RN?xe”…Ó<Åo‡át*Q6Nz;^Ïžý ß¶õ endstream endobj 248 0 obj << /Length 1465 /Filter /FlateDecode >> stream xÚÅXYoã6~ϯ0Ð]iEêÚYÇISlÒÔñ-Ò`¡ÄGŒõHv²AÑÿ^­¡,ÙNQ´„)ræ›{HÚkMZ^ëüÈÃï‡ÁÑû³˜µR7xÔŒ[Ì÷Ý8JZQ»Ü[ƒaë¶ýCÇaaÌÚßtœûmÖaíX õ¹Ó\ŒLŒ1¾ˆQè­©˜.ôôgìJê¥÷bŒ§Úæbê‰!±yçnð“ÐÏaÌMÃR‡&a®’¢×怅߉©ÓÌyµÅÅÚx¡Td ²¿J½g ÿt#@¿–ìs|Þd9¦0¡I™ù©·˜z]*ñîB¡ªåLÿŒ!çeoL255R™! ç%^n/­ À´Ä* Un½+á5žún´"ïÙ½1êå'̉Ư¥ZÕÀ¶Æ£’Ú›)ß–g‡åÔŽl¼UdjŠ4I1à¼ð®,´…%IÙŸ^™Jw–E‘eQž0fvÂÖ¼4Fª/HWr¹ Eé¦@þ¬sø·Çg¿‰D›êÑF®†ùÿ-ßwÍ9ðý.Wì-|ã‘¿Íû3?m±ÀõƒˆË>-X|î&A Y"Q&Œ‡í®Ñïa¶Vúje@BÚ¼`çÌM¼T³T• «øW g> X³6Å,(ņOÖá±(gžh>QRÒYó¥tO±q€œŒ†š Ócô*9_Žõ– 8pæK-T}H‘ó§Ž#d-s“ ) M‰YçD=¬ ™m9õµÂ˳‡Ž¯#4Sóeô}ÞåÛ® EÒHà(~·ã"T×&§´Ó|´F5ç¥ebþ$d Í¿t°M°8\*ë¤××*™a¬š ‡*:Y…ÂJÀ\Í €éÂÙt†TuUj9~ê!·ÖáÖ0 RòÌ–2˜/Rœ.Aµf/§e7- ,6E±(é%ûxi3e+­èd$wGv^aÏÀ(ò¬ëxXWG”E* Áa©•s£ØQÀFW¬¡öË’‹½­’ LÅõuõ?“þaã«mßüÒîO/=¡:Uôw‚¹\v4ŠëMÂj÷Crt°c-í+ å¹ñ¿D<¡;9€2ñ“}ñ+Ö'›5ªá8q1—ôgð_"V[˜W »^Ûv·î¬¿U¶×ê8ÿå?Ó/`)Û²Y^ê?bœ€§W«ñaX¯ß%ð®€1f~}£¾ÜKÃ-üxn€}NÖÞ†ß`[\oÛ5ä]“XþùqR‰g£ÏÓz½$ÿ)F¿âçÄI˜nåQ1ïÁ¦+±+uqvkN„”»3Œrfï Š¼Ñ‰UQ°B^€ÅÔÚ Y76Z¾V=MÅtâ¹ø™^D÷Ø"o¸§Ê51CÓ5×qSX‰ "u¾e`ðsÒêL»›‰ƒÒ â~‡G,Uzääé`^€úr­y Í)0Ÿ yþ¬É»AßRöWѨTzm£¢?'kæ}7ľ¼Øß> –„—¼Kˆåa£%ÕïÒvBÒyI6.jŒ¾á¦„¶ )ßVkÀehŸ1w­£³!ü¿×1©èh®P G¼·K_ÿp}«2’}¾lì)ù/Æ*e6Ü=Håž×øÝ4…>ù‡Ö •ljïíJvËÕÜòOq›¤²¢}rÈùIí0ÿõÉy\µÁŽù®óÐ+…˜«ø#0}OìUºrÆÒBÁ!¦¯‚f7ŠG\Õéu7DÆ…?"'Ñ΄Þü]m?ÄY¹IŠVžºI’h}XhqôGU¹ûV endstream endobj 252 0 obj << /Length 673 /Filter /FlateDecode >> stream xÚ•VÛn›@}÷Wðh?°awÍ.ô-n.mÕJM‚ªJidùÇ’‘±£(_ß0PL܇Ѯ—Ý3·33öœµã9×ë$œ]YÏ Eh”q¢GGj-¬ ã[¡´ïDKç~x?’CI¢IF®¯ôð‰¶k’û”É Éç)‰"$K’9É÷û¦FÑ7²Ç•R„~Kç¸Ö™Ðv½Ù»/БíWì¼O—îÓå׺ni{GrCòdC²‡ž)®gx^µöàš÷‚¶’¯Àñ*»ŠUöáØ眶1$m3¬œeß.‹MËnÍbÒ´Ý4uµÎÌæ[è‰ïr0exãS| kÜ;¼ù¼ü(ó¶b|s…ËÀŸ°˜ÌaÊr©XL¼S°e7vf÷5pc¬;|_tøQR£¡OiÊBݸ3pz•¯¹ÚWÀΊŸXb\~f‰yÁÙ"?˯ýñ|¥qY?.˜È" {öþ©2Bf ™ýŸr»}¡”ìæâÄã’ÀÄ2.çèp*f.Ä0!mñ×T1t•ú•«%NÜâæÉ=‡õ¸w†7guTæšÛÓÌ¥kT`ÿáÆO„r‡u YaåxãxÈzÕKÓœar¼¬u¸9®k?¬ê+ÁýÿŽ“mÖï9{f>f¾¿3Ê\’¼!O¼6Ú¹îª-cø°3\Ùu¤¤pýˆ ¬=Â…²}–!Ø' æš™Þ•.¢ãX†E8¸WÖê+K{»íHO1ž\^O­¾)O3:AœÛó =_mŒ­8¾g]oÜœï=sC7gég6×CÐÙe´TC,æMÊ’~Œ·’ñV2“Yýü¦íÌy^!KL=7‹ú™õÌßU93«úÿuvðÿ^ƈÀúŽ«}%Œµ…ÁÒ4ž\Fƒ¿cB õ endstream endobj 167 0 obj << /Type /ObjStm /N 100 /First 858 /Length 2289 /Filter /FlateDecode >> stream xÚíZ]o\·}ß_Á§"}(/Éág 'pì1Ð6íi=èc!«µv YªÓßsÈ+éîjWæ®Ò yXŠ—÷p8œ93ü¸²Q”Q6UDÙd•ÍYÙ¢œ8<:åRÂ_Qâøì•D>å-Þ‰ò1«`ÜÌ$¤¢’dTŠž­Ê&@”ÊNåðWTñ|öªd>ãgÄ(“äA†uD`'üD  ’²b›‡¶å#5Gç`¡C@C†hñÐÌ”™-U5<•ÄÁÙ‰8ο@^‘¬|b£¨`•3ŽA%±@ 'è Ò9ÄA’›gŽS”HLTΛ¤|pì‰ †u&+<…BB€jÎ墰…•ÄHH°‘³èžSš` ìJÑ%á”[±`1‡ÁAAÁ9â"ͯD,ƒD(î“€Â9úЦ|(1Z…¹H‚Ƙ­$Î#I¢²Žö¥ìgKTž"I/TƒûÐ;)™Áü>ú à_áXÆ "e¶À¼¹a´¡öxl!Ÿ¢ P†Öƒñà=[…n9ïPñ´#¼ öèž„-èNƒAfÈ$B…ÜÅÛP,!`¦¡©}QÑ -ÖŽ¨Ð½˜{tÔ+L ¶85bšt™Šî…Gc¦÷1åDñüO¾°’U¶žr ¬É³áÕrq­Ôð*1È,Bí @ÒèÆ° lu*òá›ofÃOWËÓ·óku¨†Ÿ^¾Rûù/×êh†Wþî?çxq|>Ÿ /0Ð|qý‰g÷Ùðfþiysu:ÿTã³6ýe~vqüÝòuHLRqGæø }/­ë(þ¥:dZ¨Šýü÷ àœN•LÐàËâæÃ‡£íX©Ø¬¾,’´ûûÀÎj°§l¬ÎÑ÷]6ñÖ F#­‚ï½>õí &ŽÆè†nàøfAµ'ñ!?àCŠûò!¥~>¬b›¹iÚ× 6¢}ì“i1¦>°˜¨i˜.°+àƒtJv1kdÏN0È#¹W²ÍÉlÓVi3%Ô–ü²FȺ’ú'1-?dZîdZqëLË;0-o"OLšëz»í}èKô`ZéÃÅÁ¦N0Ôp¹lsq§W§D˜¸x_¯b%_÷j‘}½Z|¿WW±_H ›ÀØhnyúÀ1À«¾ìDgß©3¶_:…Ô¸+^]Y¶,{z›Úu¯rºŸW¹'îõêö6V‹¶ë©m+8ˆv¡+Vˆ¥|3›„ }X좵¥l¹m')Ss[ÞŽQss½kÂØ¾™°q_jYÿ€ZÖíK-+ýÔZÅ>¾ l‹Ý6sN–ÈÇ"ue!Þ²ÞîmÛüжqoÛ¦l»i¹JØëlX7ƒ±å’`ŸhÛ­‡¨µ”øó'ÿœŸ6Ù¯/yRþ‚Ý‚©_Œ_ÉNøÁÙ}ýà\¿V±#m‹è°)mK`~É}`‡ÄüˆÓ¶úiû†dÅÏ¿B@¸òЩËNF>_,–uXï9¨ ¯9ê_iZ¯©Pñ³á»åÕÙüªÊ6GÃÃëá0×#jîrÇÎûÉEGœä< AlxctJÜÛ›“kÈþ|±ø×ðüà Ž0_þ{øxsr9?ûöz~uù 'B¼IOÐ8m2é=/ày¯ùEŒ¿z\ 3?ûáæòxñ‡³“gïÏmY‹tÙ!Ò%ï°ñÜFöŠ&u‚ rȦå^6&œ¨]ìû ½tNа¾„>0‚Rs§ºë5éêváégÿpÿìãNie2Q¿ÃþÙoºuÂZ–û.ôvÞïk ðð^ ˜} :ï¶|%¹Ÿçã³9 ظýþûMG¿[ý·±ræR®r‰šR±òû¥Žõ z,H ü”éð§A2Î)c7_k9]?]"TëÛlˆŒAc¯¥v¬¶2a;SêùB9F«‡bQ ÓýX¶–€ˆv·å¤Ç›•Ö•žµÝA™¤Š÷£rcï©TÙúu ¢ͯ¾õMæœsæû\(7 Øê´~¶ÊØRf^ò;5FaŸÄûž±™¦ä#$^­ñƒ/u¯#`+ŽÑ²åø‰7–wõ:~ÅøjÃV6‰Ó·Â„'í1M{ÊQæ¤lcM1­%yÚ/ÑåvÎüÍëØŸ3Æq”­'¹ÚÃÑœGt•Ne"©JmýljÖ<4ŽÐµ,…r¦-Í£S»N­2Sk¡ÏªßîžF{ßµMû°µy®yhdÎÄ.Už³wÙ#·½c¤N>Òbžö`¾Ë•…ÇMº°¥•.5ßÖ·Œ€µ_Ï}e|}rÕRµŸ‹q5’muQmv“’6Ì}mŠ’\'QË*~ún¢Þ&ŶýÜ-šTŸj§û pjLr;­j¶˜™BFzeO’'±9á~žD+6ŽïǶÚw”.5 UƒòC3§5înxþ«FõìýD×kTa£7&õ‰÷jëŠOݽŒÑaÝRÈ*i™©9dò¶M Õ[YG»ÄÖJ¡û×zŒ%æß²a@|Ù±l-9–š·rÍ€uí@ö,ÌÕ¤Œüb<ô*˜‹oæ®= ²02t‘5õ!¹ú7庢ÔzF€!¡§›‰¨þn[[­0jQËTÙÞ4“úú¬x©Ù„¶¨ë°W;öh­·v¨# ܶ”P³\ëy‡n_³žµôÌrÓ·ÍV­^Ë£ÙÑéªõ endstream endobj 264 0 obj << /Length1 2121 /Length2 17232 /Length3 0 /Length 18495 /Filter /FlateDecode >> stream xÚŒ÷P]ËÖ† ãîî,ÜÝÝÝÝ…; ÷àš`Á!î$Xp·àîîn¹ì}$û|ÿ_uoQóé¡ow9 *2U &1Kgs ´³ˆ‰™• ¡$®ËÆ `eå`feeG ¢Ò´9ÿ³Ž@¥ ts·uvâÿ‡‡„Ð ô¾&izwTrvÈ{8Ø8lÜül<ü¬¬vVV¾ÿ8:»ñ$Í>Æ¿ÃbŽ@7[ 3'€’Èèø^ÑÂÌ ála ùüO ZAÈ…Ÿ…ÅËË‹ÙÌÑÙÙÍZ˜Žàe ²¨Ýnž@KÀ_’ÊfŽÀKcF hÚØºÿË álò2sÞl-€Nîï!N–@7À{u€†œ"@Åèô/gÅ90þ½96f¶ÿ¦ûwô_‰lþ6³°pvt1sò±u²XÙ:*ÒŠÌ o#ÀÌÉò/G3wç÷x3O3[3ów‡¿[7H‹©ÌÞþ[Ÿ»…›­ ÈÙÝÖá/,¥yßf)'K gGG Èá¯þ$mÝ€ïûîÃòïõwröròûYÙ:YZý%ÃÒÃ…EËÉÖÕ('ùoŸ÷%„?kÖ@€‹•••‡›t½-lXþ* éãüÛÈö×ò»†?g€Õ» `€­ðý‚Ÿ»™'róøýÓð¿„Àư´µÌÖ¶N²¿/­þÅïçïfë 0`}¿~lÖ¿~þûdô~Ã,|þ¸ÿ}Ä,jêêê² ÿ–ü_£¸¸³7À‰‹ÀÄÎÅ `cãæð¼?üožÿîÀÔÿ½ªjfûïîþ‘QÎÉÊÀ÷/ï»÷!žÿ¾´ÿ:ÀÿVPv~¿Ï@íŸëoÈÊÅjñþ‹íÿóüòÿïîÿ•åÿõúÿߎ¤=þ¶ÓþËáÿÇnæhëàóo÷ûìzŸ %ç÷ qú¿®:À ´¸³ƒåÿµÉÌÞ'DÌÉÚá¿Ûhë.më ´TµYØüëýçÞ“;Ø:UÝmÿzá˜ØXYÿí}æ,ìß_*îïgõ· ø>Rÿ[RÊÉÂÙò¯Ùc?w3773„÷£'.€ÛûZ½ÿ¾Ûf'gÐ{à]\ÀÊÙ á¯åæ°ˆýµô/â°ˆÿ!‹Äâ°Hþ!>‹Ô‰‡À"ý‡Ø,2ˆÀ"û‡8,r轞âz¯§ô‡Þë)ÿ—xß+¨þ¡÷œêè=§Æâ°hþ¡w}Z轞öz¯§ó_â{'³?ô^Ýü½«µø/ýuN,–ÿÀw½Àà{sVÿE®÷æ¬l=ÿعþ2;{¸ý#àÝÅúø.Àæø®ÀöøÞ¦ý?ð½O‡à{£ŽðýíÀâô|oÔù¿ÈùîûþÅú‡ù½3—?æ÷½ryPç(e{oí³½·æþGØ»Ñýý]öÇüžôÇü^dãüÇN¼wòrþGÀ»6à»6Ïà{¿^ý=úÅØßÓûüiþ=Ôèö¯Üÿ30nnï“¿_iïÓôþûËz-çœ-ÂìêÂÚjĽ˜vÇ…f¨vuÒé˜üÝ~x<¡À¦ÒUgXw»KêA[Ù–¢½]"}õ;ni€lMVk{ö1ITŸÚmCX˜ÄéŸ(<«ï#†'bÒÝóuõ×±‡lï”§úâêÁ‹¢Z€ùàÕ+ã]ßW¶<1·«¶WÍ­€øR6ͯgR‘!à$ž£ÈOƒ=áñ—ïj…&»{>%¾>1ä-ÆèµŸøÁgyÜy¿’oqëBó¹<Ñ—Âz“~)h㓪⹅•2 e+vbRvåyYd¹9h[L(¨iHëáü©Jd¬’«(†JLrˆlƒ_)ˆ5’tÁ-~t“tœiuÒû'}Äãg‹ßw$¹ÂÜêÈ ä~y„a)7›’Q„Nµ[£XRVÁ™ÓÈRro(ô3èûÏüížÉÒ.ÒÿÈÑp¿Ñ›WuüÙ\µá ùüôµ¨ó“ÍAc Ö-vè$šI_Ôö$ˆý#¹‰ç2ŒQŽWå´<‡wP>}õ–£;‘„Τړ¥î ÑTŸÊÌkNÇi™È²ÚÆ ç)P=V6Ñh&†9Ã%ÈdrŒH$;d‡÷,—ßù¿Y‹À£P2YßÀ1ØeЬqfe/hŽ3 ®Ñá†s0éÎ.HQ0šT'3¼ÂKÑŒÏC®ÛÕfS-8sü N—gÕ]ø¹‘{­«:ùëdõ@8ÅË'àYqsêã+´¾BªìE¢›t–པ|AÝs¦áƳràqi°öL+œ¢<ƒÉœÝLÃèMÏSa±€ôÐÐ.CñBÍ5AP;INl.œàè‘ϬÖd†úHZ²™O†B»­èQÔÓ>fôYŠÈß·¼S¿À6K W¹IE”…÷ Ÿün ­TVl‰§cND˜¼<÷k.èäó—ýÔn”b'¢´4²¸ÎÎ[¸ Ù[D!;}ã !Ìì˜)a/¿î§Ö+­rØïar7"^å[£ðÔúû¦ÅøS¥yk5Hî–²@éoi48ßéÝ÷§'C4-ùfÅÍ6 cÑ>„/$Œš%R~¶®ck{±B…5ÿù‰·õ«ÖP6$ðHÓä®t$©á îÓ‚ª 5‹l AÞsÞ5 }€ÏuÎkorÃoû wFÕ¸ûx2ºRXüµÓO—û4ÑÔ1JÔu< è-èŸAúëÏP†nÄAþ\©JÅß¹Èë?ÐwT£vŸ, ÖħJ&ÄÕ3¶)^[Ù1¤$ž wüè¿;ÎÊ!÷fí¹·¡€,_÷0] Ø¥Â}"-UØÆi”D¶sª–#÷ÁÒ$DZ‘lò nÏúyk/|`›ÓÞ³x‚†…é]wlÞâÑ#Bø-bª6iÀ˜q®ÝâžãÛ•ú²+fÔ†,C2ƒTÐ/háPÚ>ÑDâ«!!Ûl Y«_ •óyÔ×Ej±b4©ûeÐÁzrø‡}’‘Ý”Ûâ-4/Íy«ðúlÞ—6SðÞØö šÞ&:t7„Ö­¦é„ú<™¡¹jˆ¢HýÀ,‰ý4„X-f(d©X‰¶MŽ<è€9 ÓçÞâ-)ÌÄ ²Ç‰ïÑ1ï*§ WŠF MÛVf´Ûy–KÛ]úPÓ¥¡Üü^´ÅWÂ߇Öã‰u¨É¢…?â„çd«ƒ+ºŸÏK—øFÙ2ž˜"ïw¿‡c€.¸ªVð9âS„H~Ž·ã/´Bá– öÌù¨gnÖ s…ÈÅc†•å¸5ß"y£ÙTÙømÛkh VñDÊ!>hÚ ši&ßb­:…܇%ÐV!éXºkÉ==Íd )ùÏ@g&ZÊ?ê•©£”Ëø£6sZÒ¢­+Ü&úîGŽãðh0²¬âÕFÈx?¿;šxp»hïÝÑï:zßÒï+ˆ®„ û‡kÈß¾üoÊ5ç žl™ÒEžËP*­ùÑW‰±P¼…a‹à’°‘K7àv^Šô%pg•í:±gþc&¬ @%cµñ wÑ®U£j—Ëx‰ÿE•}»:o+Oã ‰°-bLTS-`ÜVŸ£<]@$ÚVcƒqcZm .ٱƨH5ë¨E”Ý~€Ù  n§§¬!uröÞäP Ýö\kSvtǽ†§[i às¾ÅÆ×åâ«Áص\'=…Õ'ÆÀX·E’Z§­;¯­ “Qk`uµÛD•¶­ÐÎæØoZæóê;kC Š› ?Tð &£’ÆM Et@#‚ƒá,-ñHä{êD•Ž«=UyYtUw¥XYR †nƒ:lHÝ3SIÎ)E“˜`>ÛsÑ‹tâ£1†¢KÖ!‡qò"Ž)W×Å”°^N㹩á-ÔÎ)ɼ&"³>¤íÂï]“~•CÅYåúd &¦LnK‹éÏÛ\Á?dáåî-¶.Ä䃠%À­§øÌåᣞ[{]?¤ ¸íÛq÷òA–)«k×Ë£îWò±7®>9ÕQlNÔ`êõ§z ‚æ‚>“,CEáröÝt%׉ ä‹•<@½|ý MRwKh…7äåãã/‹•ïw¡ˆ#èÐ9jö¦tI ŽÖŒ~æ¾<ß²°j2ÕÞû<þKXz<¶7-Æ3I-rÈ5ï "é©*‡›*×"’¢p °ñbZ̈Ê42$b::1’ÆlQƒ-ój Øë‘Fô@v7¶%Ç;< ÷iðúĘÒ/qQ”¸¥ÞŸdÚÎHøjGʰ8X¡`¬Æ…=,Zf7ò"qi®Iw†Zú…<>¢^¸ÑëpÕó¹~ÓŸ—™ó(™^tÆ]dÁö!j¬Á¼oËÐ >žE¬ü熾à£'CÙ0Lµ¢ÄN[ê8C ñ2/ÄG¬ÏD>±ÌÞÓ‹ýyÔ:µJR åv ¢ÜHs†Ÿ†qå­ ‘rº6ù÷–%EðJ‡I°´YWèÝÌŸOˆ¹âuÕ‘LY–Ÿ~”øÁò™Vñn`£~ŒÝê]’ƤVü0êoòëy¨âK’§ÙцÆnšÕ¨½ä¶"’¸¸éȾ0^ªgµ1Ø0JV¹Œ\:ãèT­&ÒÅgâÜ#pW ݦܾӓSv¦ð 8ö!†‚NëxïeIJPfø3ú/½ã…D¦SåEÚ€tâÄ_ÉÌ׉:¶åØf…Óa„Bà^¡Å"Då£Ùúœ€³³Æse´1ao5”!„âÀ¨l –/²å $ £T⎇ML<“H8¹™ìç¯ô—}R)ή$Q¿Ú&XöÐZ¹ JÑæÎМ¿w6k"]­À•æKG§Ô µ£].ð^4ÅP~Êͳܥ¦`%r~Hy4̨>Ki áõ’®}rÇô’ú}ýPQ½xÂÝZ®3©Æ |Z/ˆDåí@BXŒ0wS‰v(n³%´!ÝP°NÎnØbĸ4S+ê¤-AqÞ§ï‹ÑãyYŒ_Z0-D¬uÑ¡únë?ûò3€»Ç1|$äQzÌžæÁuštj$ø0‰Ö4UæÅι†6ÞeÉb~&h@WýkÍYœÏqðº*C Æâ¢ÚC…šJ¼(PÙJÞCOãÃs98B:Âzì ðRÊÄFgóƒ/š¨þÊÊl^š¶mG¦¿ *[¸‡üáîÍ×gÎa–î÷+y`ùâV!sb;´kUËÑy:ã n‘½Ì"-€.8g{ß7yƒ_½öþüv9Lú‘þ‹sÏE_(ZiîÎŒ"ªÏ°æÏ• ÔòùÖ[—k´N DCÁ££þµÐ>p›Ù’ê iUø÷7uÌÎÍÍ”;—Æã_„õ²™‰¥ŸWR Á3ó¨ÀSd~â¶bÙu0RƒáhQkT”±¢eÆ•§kTŽYwnïyŽÉ8^‚b°áeŽÄ"*nIüÍÍÐ7:t“Ÿ~n)1:—/pwL"ÓÛQó5¸°¿OŸB¬! /¿´þ| è*Õ"Œ Ñ©®Xÿá-XaA”ÒQR§2#væ†EU¹Æx2•ƒžUáv'ä°÷u¥¿™.`²JþPÉš|š’ë‰÷Ҥú\Â]¢‘‡Q!'õW®ÜxÛøÝ—½Ô(Î5¤'”6 ðçÖòÏ-͸Ør¤º9ª÷ ÑÍl€¯‡pfWvŒ‹ú8_±‡¸‰gRèìˆU¾-™azÍ}^ã¿”OSóa®§EßÂí”St zm•Ù‹¤ŒC.¿Ù‰V¨úÙßáq~•~;‰p ×}ý¹ ðÍ®8ãÚÂÅ((0ƒW°KtûSw:GÓW»–]öœÈT©à|<Ê㔾ŸŒ{ºc „**oóÝûD×wãGœÀÌæé`&Hµ^è$™EÆæÀæøÚsª­8ÕïØËΦt[ZF‘á¼(HPMÔ} áôG=è\77üO˜w(·p6Û'ëYûªØè’Ã}IÞ0t¼p3'½pÉTsi=»ŸÔŒg{G­&c笲„\³4cÉ÷–WH’é/wüR$š¶è¾?¢Ý,ÐÅø„Çœs@:){Ø‚Ì!‹5^*ÿñ¶R•ç!)•b„ä£:Ãw ­ÍrbMÍMpÚ\:Ò¦)cËeª†.ò«7Xf…¾²¤/øÐW‚Y–-¤hP?ëÖ·úÅiˆxE}|Ô4Ž=†ÑÏS&t}ßr9¼ço¢mÈâ+Ý=b'“,cë…Üð$juE®ÚCSGµƒt,}V—¹äQ?ÕOد³O= j´¶Ùh¬*´ìÄÓ}dž& ž*#ˆNmtøn¾é~AXóæ~Ì/ç×`J Ðpyû5‹T^žX¥·f] )ÌWz?9@[q³" åÿ:íµá„Bº$€Ú’ 8{R€Ï±NèRNt8Jƒâ«ãE£ëý¨Y4ßgÖ…±Z’®®Ñ2¡0<ÆlÏùõkEîsÀ¢‡àçå£áFÁ£4€†–1ÄxìGg—´†ßVä\¢b±ð{—æ®XGàFDw:sôÚ*I”*AKsŒÖ&p&F_XÃcªŽ˜d†u=øÖ0Èø'Áå[™$¹IÉ$.¯›¹.g'X*v„ÿeÔ¨äôõwœ'mdKÃÍ’¢y9zÐaì¼åÖù¢z¥À²L–ˆˆ™üOmMÔÍ7ãƒåÊßÍÖ_72MëôÙã6'£üc¡'ývÄä-ÒÔÔ ‘\,i×P—³}2®šïœ%ÇL5Ëä%>B­\ËFúª›­Ü Ì«¾Ô½~OA›?ŠöîÏ–m{‹KVr4øÏ:!Rò €Ð×<ºùÈ^ªnP`ÿ`Ý7Qÿ ;t 7Å :¼“¼ÌŸÖ|c}qž~û%ÿíÄíþdñÒ¿ŠŸ¿MZù“¸J·–/ÊЊ¬ù…™Lµ¤,Jõ)%7%'H±½­ZÞ¼¡]îLYOb.۵ьY!±¿I8X"ÉÁ!އ&×Ñ*‘ºÁy˜­o³”?|Ïöm:¼}׃¸Ù±{¨< ž—!Ê&>Á> Ч͟Å%TÅäè¶ŠÞ3-»qôzö\¨¨Ûè4JPd…suÞ”Ÿ?dÜ,žoàsî¬jKˆ‹‡”*î?{±¹›”VàÓ²oëïtè3Ϭ Ȉܯn† râ<ššx‘Q96\>¿ð¢Kº2&÷wP?¬¢p(!ÝlºÃô‚æX0'ʺ¿k" ìŸ%=7¡J`§IJÖz°®BÀ~EúU¨öb äü6\¤šO¯ ¡åšdÿ,%t›bKdß¾¥™N þòôY†H¤f@G™”\]ç¢Xç­melæh®¿æ8úÁÉ\þO-¬Ñ5Ž2|!³¯Æ­AhxÛF¯×;%Á¤ìÓ¸äNpà%Û&QÛÒò¼S¯?_G‡Øýn:¿X ¡³…ÆaÀ[ëE·€¥blúuVÈ-…cH —°ÊädwEm¨|­UFäÿnþ«5,´QŸc%÷[® -o.?¿©·¶>%a^â3 ÔjŒµôlÓþJÖ‡KsY5ƒJ¬ÉR’K²:çàÕ,Dr0ZNÇKTlåë]a5¨e©á:P‡·} ,$¹V•¹þ‚‚Ÿï^‰ém÷aG(3±~úiö)ÎåTÒ’…¢±!39VðšC²ñ4]ž- ›iˆ£­·1 ~UÞE‘þ°šä!kÍ& Æ¡Š.·^Sv¤Hv³¯Ý˜Éùy¦v N“Ç–è¶ÌIT6®p#Ya\þôc¿Lº8lËGÔWŠ8Â9?í‹ÖeÕ3Ÿž¸›Èw -Þ•–6°ü†£À-”â|ôB 9å—ôÌiÓ¸Ý32ºß¼ú/eÍgÞ%_|"n’iBû,‚ ì?8õôâ<Â&ÿ@ÿæ®×å>NPE782é¦Å1„ÖŽ¯ëœûjÛ©x¶G¥*A!ïƒå†’ä­øËGØÄ¿€Âá+s6äðj6Y½rÐÓ „œýZÁ“¸° /Në×c“6;òãŠÆN¤5x(ø±*½·±Î7YY&ôM;Õ¯ C—góÁxl·ˆð$ñ¿c#F ñ{)T}ÿºõðêaXܵFGõ¼Úaéá£Ýz´OÏ€[bµä ‹maj¦¾E™")¥/Pz±Ø­³³úN&1M­r ŠŒH>U™›>ñùb«gãRW¥ÒÀ€ÀH ½xzLÞ¾ÈBÐ §¶”!Ð/ïx©7ÆBtØU1\õŒý®7kÉ~ŒýÕ¼6C‚ì£^¢yËlLµPLúËK´#OððZnQÜÏ—‡Êü‚k‹¨FiýùcO1oföô®áˆúWŸ{ãiÀGæO/¦‰Õfù†Þô8åÒ8ÙbüÜh·ˆ<,×8+ò6ü_ÐÂA}ÏÞ(ØGcRÖ|as÷aó©wx8@èöiÍÒUðZ$:%Ѽ¦û•jÈŠ±œâP~2‘<¸õŸÊx•ß^C/ˆËùíÝ8÷0¯9ÁM—À?¯* ÄS¸g>2è¤jñGœzÕã“^5¿Ä^WÅ:g tÊ[ƒGém+E ˽òEÈÐÿ„»f ÎêzÉÒ†[WþÉ—ÕÐuö}ÿ…ÒÄk?@Z¶qãüf·§AGnÛ2Ž£„hO(•z÷…Û¥W/ÎÇš\‡*ÙûÀl>{Ó 5 L™DZˆ›fV¶ò( ½)4xƒ<3R€#>mb÷Çž<Ä—jËíøÔÑú¨›J¢òŽ«ëºZ$Þk.]]Glwý9G´¼ƒæÙ¸ýí6ßµÖì¨2啯ø-”ÅTj—º‰!†I³V»/‡à†c%ÚwŠ’¥GDbæø$Þ`§¬£ïÿ;-ÑŠ@Èî$ே#‰©ñ‚³}¸+&òJt†¾¦éBZt×¼Ú3ðÓw®T»,Dùrí¥ ×ƒL.?EcöžiÙ„¯´Ï",ê?#jŠ ëÌïÊÖi0v lóemU¨ãèÜÏÕWá$ìž`àùŽ”ñPŒ?Bd®Ê'Á¯ÅÈAˆ| õø¨ )XįF¢mš/l¯ hwž¾_“}z¤ç>‰^i©`æiÑM²ý‰éshe¡Kk·'ébâµd’¬~nºI#˜é¹¢Æ×¡ÐpÍS”‘ë‰ÀhÃ#ø¨ò¾:¹# »*4M ë!÷ÄþÖ-jJSцц{¨iÌ™ýf6 ñ£Q¡¬†­g?öMz¢2î`L2fžm` ½£Äõ7zˆ_Ù $ˆré”?!÷xºÀì›É<·XìÌ¥Š¦[úžñö<ì·„³½"ÉÈyÒ9UTq¥ÊrÕnxiœû¸ŒÝ —'×,\ñ+4bàÐ×, ½ýª=) À–'K£fÜT6hŠû”“íÕ¯„p\ÍÔîöû1ö"- /;Ü‹H¨­UÒ–ã!ÉØx¦·ø Ÿ–ó«Wyà±µsCî=”k(Ïf#271n‚½ÖÓÊa~C®¶'.ËÇô© —ô‚WþUæ ,ÿ#?Ó§/ê;Vª»D*Ð î5Qºc„Þ„è÷'d NY$Ga;Œ{.RÊafKµ„½â=öw+ÔfÖÇ­nï8åû×JéÓõt5úó›…ž9ÞîÐ[‰0ÝÓWî—¨äÈ9ò#1I/ŒõY¤DCÆi0£Ê9¸)3(HfJgÒì¿Ð4S•ÙÅÕuäàpûš”gþ„bíUK )J2¹È8‡Õß/§”—ª ñ$Sz›ÿŠ$x&!Ë>ý©¬ºi8.ðƒ¸‹?B.gnÉ0^%õõü¬ð]s²~R}×>-p¦I3Q7˜òAYD©Áíß–£>W§îê{Õ‘)Š6|âaªbC÷R hÑÙ?úR34™*®§é¿±¡`‰ÂÅ&'2Äžèǹ¯.AñÆŽ²¥aUh[e“‚o+4±4Éý„}´#[>ûë³?ÿ/¾ 9è>ª/¿Ô—Åï%ɶ÷7ŠÙ#«ÓÊZ—± ä”O …‹¥ÝŽ#Á§/0ëùæKæEg£íðDn¶S}mW6íî}–U5%ÀVš³LiŸT¾„“Õ¬¨ò<ßYP“_0iy¼àèæ•S'™4%xßþÀ.”0ÏGÅMÝðF£7uäèrOR8ûêÈ_›¥Ñ¨jqlÁG·E¤„f© ð‹y–è[L|ϬµoäPm Ü“©ÌŽ 'õcj†;€Öê¦;C‚â&3«þºG}!& Û¥½øþª['’¿ÚÐfž¬úS‘…Xðe-ñµò€RJ¼s:,GΠûÅFz(‚:²cgàËž±·Bvt\¾e¢3—ï"ÿ¥oq!äê”hxå8Sá™-$²ñRÙåfg·á@wn–ü²‚ ÙÀp\˜AD41ÙžwSJ¢· V«b¯¹bðóµyÊtš,yZ„Ê øwÇK‚'¶ƒÞ®“óé ¡L×x80Y×aÑ7Ó*ËTV>z[0"ú-æ›Ö­¼Úœ ð—üÁ¬n)zk›ŽºšˆTtl€%o´Jp³¤Úôü©aPá²ô¦(.YÄåc(%ѧ¨V"w®[_&ÄÝ´!>Ú/ë &߀"[Òša8Sœ1îÆƒ˜!¨nÈrF¨T(É~-ù×4-¤õ¸äOå´°×o­ÊU#òÁvzËâ˜%FøÅ8*vÇŒBKuzý©‚ØãEäÙ´§…¥ wx’Ž •Öœ¼É'Î9-”}O:d¸—¸Šºû´Ò¢Äk/üi+3°Sþ$¿Oâ'‰;%{ˆ®»aÌæHšv?gF ëO™QY ¤Â¸/ß„·†û X X>¸` µÑ´>È/@óè± ~K ÿõ;µjÇÐü6Ó€»oLíA©Ž–ÑüÈàÕÃú™×Ðì÷´Njû£WïÛô›·N´äˆ§h=¤(Å,Q–)E0L ®¼IÏ-µyÖÏZÅÉI½jÐÚߘ¼yðÜeîûù˜m8DÏ0m­FVéšß.+< >SïæN&1À!¤81zÙ…ÜTRHÖ¸"¶{}›êk¹T¦Räi é±¼t€lŸÚ$½åî[¼ÅêYò…~¾b{ÃZŒØ6¸û‹ˆn‘–sZäUôG;­–îÀ2×j̨Xç“Ï,úéÑ„˜cÍÒ‘r“¿R¹†+»H{oW¦¿£ÉÙ]´îp|[ àz;¦!\ìXGªçK™ ÕÁc‘žªYßöXK­A­‹˜Yº®ÚõFcŠ”ðï;öo’%÷C¤ÞS˜ÞµÛßÊRè®ì›6\ò½Œ>óί‚Q¦œc<ßоޤz–ôC29h&ó¾Ä#öRŠQÄ(ùJõÌpí…9Ç~­”ÄöÌ`!®^ì£ É·†“šÃO;*‹‚Ñ*šj‰¶Ö~#FtGéöÎX߬5ˆ%·®\Sà]ü}q .»töë?Úñ–ç–‚ØsO0Ð z‰dÐ[¹8”Ýj ;µD#büÚ'ÛUQÜ/z6çõ€ H¨ªz™nòk€j©t$½(lfÝ¿–¸mjan'±sÏž|xyþF¸¸s„Š>‰¤º=ä©#IJeîê±ÔùÒfͤþ©"2ñyü,&5‰ Ò.á2ÏSëC)r…ïØu竽.Þ."õ­îûý»]ø»¬(*š:Ôs®·ÖÇ XÑÛ Žòüô£°ƒëé.f”ˆ~Ÿ[*½4ß0z»öô½)L•±[œ7í:}ýPñ&VmMªC&~ `Ýbž¬Té—Ã/ž’Ï-§°až‚¯‹æ§Z:IwåÁÊbó`ûºÎ˽oÜ!wuÛ7„.{¡Žô(}ð¾ ä0¡MO?n7:F¤æo>¶7Åq—ZpG£ÃÇ€gJæˆö€h=DwÙ3‡•µ¶ÖÈ©º­_ÍöÀâè¹d©1¼güøWÊM+›P^ Ýó~O´MÒôš‡yÌÙîù¼ŽŽØûû›Ù«,à÷ãN÷¯¤@í!fHY_âLZŠ•<.ÊWâÐ; üš©4‚g9¡2z+ƒÜ²Aè°^ÚDcsÙé!ªœ³{‰¤Ãÿ6Vão¥+™rƒÉ 3xb—ìSI"„)V~Ó»¸„ŒÁ?Ýmð¤Æ M£&ùÅœ—Ÿ›it ±Æš]êýþ¹ÿÖ.6ØÉzaw©êHíJÛ4Ây4¤‡¼äïƒ@5q8£|‡DE Î4‡Y…Iµa¡ÊCßÑ@žïTb 7æœåU ÎH§¸L>ý<òW"²$ªÔ\թ鑞" PßÃT"yeÍ„|*Z¶ â·1·TR”.ö¿‚ðËËlฺ·í¾NéþâȺQUÆw¥¹ƒšqòäì ¾¢Öô±vEI:¢° Áû~*å Ó¶Ø2¾ 6€Ð²‚^ê@ró˧ag¶A,DF×<þm©O&¸ÄP¦`2©—Ìï¡‚Ì—<ìÓŒ„1Å=Ÿ®ke‰Åä)rîÏ\D¶^ÿ–ìkze DTžÏQ_'BÂïCÜÛs„sDi¢ñÅÚ•êô£è#³Äe DàŽm¥;¹YéEbÄãï\]}E3·Lá2êGÙ ŸijºÝ3Óìܪå,1ÌxÀš¶6íÆkÀ[¡ Ôe%'íª’‹0ô>R¡A§×«à²@NÁékãP~é6[!éÍC—ã<ó»ò³Ø™Å»-Ûþ@û‘¯=?»ÍëëÒËÇíÅ{ׄ:JÙi üAR0µ]G…ÒXz”ù‰ùÍòáÞ&סŸLþ +dÅN?•¯Ã1,¤ðÇUA¶›E¯Ãc<~&A’Ý™Š/“õ«áy)"fS2ËØ¶¨¿÷J“ßÛN‡²DOXëjÒ¦ÿJ´pÕËŒ&HÔδášûå¹¥©2ÄhšI Ô°PPä/ejbç_?õ·‚Ѳ„À/p~e»âî_´c’¼3‘Ü»Y!M.ýàÃ÷ D8?ô³œâx2«¼Ëç^ØÈÚ²¯qJ8HÐ'1œÓM8WUZ£™•VžPîû‚ûÁÒ¹=YC2*6™£„{à•tßÛ—òŠl~|Íšð18 M¤5¾Õû¸¤=ùcéœ7Îî­y•ØíÄ}®²¾Ç‹Áß1aWD¾¡\fþîÛÈE%ÔÍU½Ñ5üưU›O†.tÁÀR²ÉV¬Ûeª‡äT5úc9¦[ë8u¶êChʲš6ÅHá(„·k Täë ñÂU‰(¡>ÏkL’/Ò<sÆC J8£Ò£IÄbå%ã|±LVªÉ|ûíįl¥s²á(éñŠwòA¨Æ}Í£68_ô;)öVýHã.šôìr·”Ó9+÷åâEꪖ)A<¦Éˆ'iÂzG hÒç툤åE_U‹ñTðéÁ"’ Më6R0Ÿò#©‚I!Ó÷EÕ›éNø3?‹‹Xé‹÷xænìmËDÒœÿg4à,Hù‹Ã÷aFJ>áÎÕè&~°"3Eðo­ê?î^[»š÷šk^û3—B?†?¼Å&ô´îñŠ\Ñ'YÓ€–œ\ÍÕ»Æ5XqVu w÷ÀÖK®Þ=RmãY5’vøTêÖ •²×©© 2Lí…9™Â%iå6êˆæRéjgq¥&Ô“{y‚L¶å^qæ$´tnvõ.ë3¢’•(3©Sq§°£Ð†¨ã _½Ûß,yÛôΚür—qR;²Ý(3—ñÉŒ%p -\‚>ì˜Ø¦ì5ýn¹¼â:u6µ­µüaçîùü‰Õr?Tín‘7KЖƯš$—>† ùÄa¿@rœôˆYŽÑ%KêâW"8ìÉ óϼGú&îR¢R€4ÞÃc{ÛA O±tNJD&G´k %™ênÈÌmu…ŸÂü0!+a˜7”@ 2Ï ë÷^yEË&oêìPH×°VQ*9%ÕñÇ¡å”zØüß²Œ«&‡×¦E™Ä÷egÚ•ÛáxQC¨¢²Œ%[è/6p›(Ö$‚T cî™z ²u+CH˜âß~9¹¡mS*Ú²W¸Cä8—U Ž$úô WO»O™fëk¯M$¢3¬!ù# °ñÐItC׸u ®ÙÔe§Ë j–GMÆÏuäw'wv¥zþ’ï3–œÆYí ˆ;£æQ9Ó¤64Î7„sùjé§;T¶o%á,]Wn†Ðp8|xA:g^“Œ †Ø.¢Z,L`–™^CÿÄ9ØûgGm¡¿-JWàèè–\ß{ǰ ‰eìá¦8ƒ»µ„c&_ÞƒOñ©n 'Ÿäø–ZõS°“º2µë¿]åÆ?£ûåIzô4”Æó"œ6>ææ!â\{c‹Z~å``2ú™×ó™Ø=åU:­&0Œ:‰á‡ñâîy« OÇfð’YÅØBﴺ͉ðP;¿{Âäòæ ^ÄëX瀟‚ÐêvºØŠÄÛ]•´ÙO'j†‘.a‡júö•aÔ­¨,ò5êîô‰Ìª¢Q´Kª¥ï#ˆžˆŽWU^ü©*N]óà· ìfÓ‡N‹@#¾j=Å gfr;Œiî°‰c„ØuÖ2ÕÂÊ€7y³‰/¥ÒbNP‚†¼†fks»g WkÕóØÉçr÷áagÌ B8“b–¿c!ß6–KÚÖˆþÛ—ƒ¼)\A½üí˜+é¢áì³õr7&T"$þ¼w˜p’¥’Ž« wäN/]oŒÔ&¿¦è÷)ïd2!t)Ëæqbj™W!ׯbªk§‡ žÒeƒO\Ÿ…Íx?HXÊ'_¢éˆ3Xé”YQ’›wŒWqY—Ïk7”̳."ú@Áls¤°V$r¡³ßØLè⨠ìµ´lÒE⿪…uóU%ù”ؤ]7A«û%³ÎCsÖ4â—±dE£k?Lî|ÃóÊ©ZH½iÜ6”Oñó±«UÅzѪÕöw,Åø^³~ÂP]b¡„,ÔäÐö2sU‹‹Ó3«rm&Œ4½/o‹r"·n:1›*h<^Ú¢À„’ªÜ"aæ¶*XªzÐ1ÇžAhfã¦AÊà;Fg‹à©*kB&Úå¨ý# ` ©ýÎ ±;Ñg’Ë–‚ óÙŠ@Ñë%ëÁ¯fïÈVtºƒ†|c»¡.:Î,%³÷ÆZÔ¬:Xîž6!Ôœg—BzÌ{`:Óî@ºÈí<Ò$\ñGóVÎ5»¶ÛË%-õª’l&¸çm Ù¼†2ËÚÁŒG^ p€1”0]— 5éa‘z›‡>®\uq–âÅ·¤~yµxo¼Û©ëCØ¿ƒê’„8,âÇ7™Ó†ãÖ£YXeÌ:NÏ›‰áB¦Å¸µ ˆZ8“1Uwî¼{­<‚¥ÕýE¢~îU Åíd<ÍJ C9 ééYtuŒ>pP$?ÔDÙ‡«”ùtô8Š e~:ÏCJá5{CïÖ§¬qÖEgFƒ$ÿ€¿6‹Á3F…—\ÿì1M™}¥5OPH¸1‰É›h‚fÕÁf]oäfî°'Äã)ÿ}î›õ·}lÍXUL©,nƒÜ˜B‘MšÞQ­»Eñ6Ú†–„è˜l^Ÿ£Á÷uÓ*K"‘4ˆ°9[–ø3î¢HAÆéN¶ #›CêZð-!´\™õ¼“Ë#{ñ.¹)à0›Ô(CRëK{^?çú­açpl ]kG¨}0ÿ©7mÌ —µ1üF#.ÆÔFåsªµTZI…Ëbw²÷lIeNŸ“{˜‰Riä¿•±Æ2•ä.{_‹ª®:Úì'3–Ì3úðÖœÉSÛ±þ£NôH²{$üfÕî+r^®*ÿYýiwòW„?>LC_?L.ò§Öl%Ì1L·¦÷ËÙtý‰Ï¬Ó–,pÿéJ±!¤ƒ?Æ}òÐÌÉþêU—%ªºO¬à WÓ™Ú¨`ErÓ#zì²:m)i.ˆI‡/5ÅWô kvßÈáß·Ú£¿[MSÓ7ë‘4 AEV/5©ÕvÉXE7C—ˆÄsM«OÂT%1!(õö°³9mÀS<ðÆÉüNþËnúX—¥_Ì_æè˜ZTèzÖÑ» 3æ°øc»åž%km<Í/+(7˜Ó@„ÀòAL4<~uùÌr!U®ÀhɲëGû¶”úvWŽYÁƒ#fÄÑàm=ɨ{^YÁ¢a…'~¿û\¤¾‚©ï/ÐÌ${‰“ouÁ^(ûl=´hœ¦‰8¡Q^•èi#MͯûNCB¶¢3­…Ä“¤¢ õwôÅ?á_b©q ï³S*€Û°^ˆQðD¿)Óðð^Õa<}Ÿžƒ: zÅî‰áÑ»P«ß"©¡sϳ?@‘¢¦?rÙ"½©y")ãPâÐŽ) Àq'ȲN®”LG¢õ4lÓQã©éOÒåÖ'ÃÛØS]¸ÙlÔßy£4 g~¾†Hâ¹ðÐÑàyÉCI¶R ÎR- °§>ðÉ2–JpéeÜ꣉0ñ;ÖÞ=ò`Z¬Æ½r–¥–ÇiœàçómàƒàB<¤Ó”éTÓ@(õ×é¬6P‰¬qà?RZðZ+P×i9B ò¬z¥Ë¬Ë(œæs ðí=NêGY”sî}u ö}id¶ˆÞj6­À:•O½ 4ãTx.êd0'_I°)ºÝlׄÛq¡ãÄЊh§Üüw'l;jÌ º¤’‚?sí0+%\Ãö/ª+Å‘l„°6è?¥jŒvÔ‚ýa•ø?Ý´æ±äE9HûÈaÖ’…¦²ú¹ c)™‚lN¬îëû)(”£ˆ¾Êò8ùÒoÀ,j˜¶Ü EËüú0Ö¸ôL¯¼T:T¿õÃeþ¼ 2íåc+1Æh8r–ÇË®,èµ –#p^¸˜Ý"Ã5].e] y¸›*BÒ~‡>Üš”{%Eøq|½dHB(×ÊÁ®Î/>ˆ.­KîjH·'2ø˜¨dE=ñ¨jîCUûË}fjº—¸ß×ÌoN°r¯´G¹]!^D°’©©?­ÜóJò`×OÏïCŒ9É·‹ƒa.\j¦ñáº?½ì¿hþÔ賘eû>ý, V²âWùs‘3'ÖõDÕé­5¿(9‰DϘËß¶’–Ð]Ò<A£©„MS4Â0¤-à8a~êCip9Y»¼ØJ=—ˆâï=$Ú|dÞN»`z®œ)µƒY’±:¬gMy$‚ؓ֯qµ»Úß)'Lؽ@X^ðJòçU50þ«©ç|'g_²ò*žÍ‹“E{ ¿¯ÏùÞûtBQ¿C=r)SÅ85¶½^Øa;~E>l¹žXeíÉ ä_*ôˆ«Ždç ¯n@h¬ÜY(JÉšÑãÓ8¢¿©JäZ?æ AòÐBŠM¦º\Ž3,±Œ™Þ%ø?Æ9õñr¢z¶ ­§ÓIÓmkÞãd8ƒ»’n)(„rq˳.Z<Þ¥ó 4 `°±g6»,"¸Pé>áõ¥ˆÆ TÙâ¹ò'¾$3»{1•'¢y"<þôù„¯øµ¿ñ‹ôPø#®Uk%öJ¼ð7œükv)œü5¤ÒOlNH¼Ðfô'“ÿ'É6ù²‹gLQÉðÿ IÉ%]1æªfÞÃîA¨–šo8Ö_VèjDt\÷ºú/„™ŽªÌï.‚u|š•²ìæyµpúë÷²v¹wâjŽ];¾¬ 5A=lµàа=µ$sµ2·AöœÖöbÏZ…kuO…xé¬ÇΫä,äŇ҄çѲqæq’]ýw0í8†Âj—4É~àø(ùI„è(%ís5D1ÕõÞÛ¶0}_¥. †o’-׌Ͳ˜›§A@Uÿ ¹,÷™ó©Œ:®<º<0ú—¬('“ÿ5œÀÒbÍh6æC¦Û„›ÑPÃFzeˆÙ¸½Dà¯G]uî¸8ÖŒCúÁµ!Åùæä¢D°–gÑÀY9Ñtæ)¹• ¡n…”vÝ!ÿ_gŽ]—§Xº}GµGøó6ªÌªE¨‡ûL”™ùÍBL–${+Eûç€ Ÿ<´GÓ;<š£•þK-ÄÓ“eçí‰oÃEQ˪‘?ÝhÃBhäWü¯ôüʤ,sf<¯ŽÆ®¦zeC:¬Ëêoiè¿òa6VJŸñh’BuÁ^Ê%€‰®y¨}+”ßÝCä@C„ËppO¤ 5p'xöN¼«,‚¦ Ò1ƒ Hùºõ;Ôç¯Æär’é­9r ØÅ›‡Û ’MÕLl'RÐdÌÉÉœòçO0­^$ YF‰’M7ÿX—ÏÏeF')€Ä·vÒÀö¯K‡4TñöxÈqnÍz—Þ åXOö/kþMÇz¶P™ïà*×x¾2ž×=“?Q’‚óý ãZp6B,á,÷õw³ÓŽ;L±KÔ]Õ8h”ý€°˜`~'¨ÊÁê™\˜lg{XXG¦IJ—Œ4uº¦Ñ&pY5 ñ¾ 6ÙØpÔKnà»ÙX¯‚D¼÷ :1‰z;LJƒš«Îéø½"Ó÷’Ži,”A(¬È¦†ÚÉŒP¥’ \üÔ[cü,@×mª…á‚#[W /Óieú9\HýÓ)ä¸Üp-OÁ^ççm H ¾˜ÌõJδƒ—ª’Rö¶ "ÝÏFiºlY›°ÿy0IïpîCÁÜ.ÓÔ¼„>ýViK@ ÖÚÙš=”´ø FÛÜMó)L¯d± ¯Né6@BšFèÄ,ÙË^Ãlq¯l=GÈäY¾`emWô÷»¥6¥÷ÌÁ»êIÀRNŽ&wÍ,®'„ÿZ²HÏm ËF´ÕRø« Ž¢\HŒæâäXK‡r–͈ˆ*YœÉ+¯'¥»B¡¿KÆ!²±„ðž?ïœcõõ”Ÿãu齃”·ù¡˜øÎ.ƒP¸‚º1®Øž1yY{…-…Sþ–¯a¹7‚O*`aóÌj¥X”F9­èlß}wᛉʱ¹Š½n´Þåªo h®Èöõ´+FÑóˆÚƯÊâÖˆÚYµý_îöZA­„îrßמGGGåKn4Žýc"…–fN‚0 ±cQÇ.K-0tV‰Gazºå”ÚÒ…à²øk!ˆÞ„\`°žè]³$ /˜6“É‘ñ¸êà‘µt åñ¦`]‡LãÆ¢/Áü”²\±éqWÝ„{¨ýG^ùà2ôŒPÈ´rÝ]…‰|s!^?¹HŒ°L¿T ©íçüäâ`QПƒWO=ÏÈi;Ûpªó=Åɰ/ ¤ôÐ&ïã1ZÞ $ªj*:ÏNÞË&>½þ{ôvBÉsœv'_ìMc3r –+ôvÜûVòh»Å„‹Bü°3½ïƳ9D©/â1͉a7§ Çu¾-j¥7€lÈíÐj§ëþ,¦eVÈÕ E³ÉP.l³,ê%*\TÑ7a@sù¶nÓ«ÀRS½‚zÛCÑý(pa†üÖ`1ïvæ éÁÐÒç¯Þûðºm(ï7ýE$öyºc•Ÿ4#ýX¦ ª¤A³uv3ç-vÈ·¦V~‘> stream xÚ÷pk÷À ' šÆÙìØ¶mÛÎŽm›ÙØil›m³±íäÍ9zžÿ÷ͼïì™ìý[^×µÖ}Oˆñå©ùl €"6ÖŽÔô4tAi5z# 41±’™£%ð?rhb ½ƒ™5Ç?,íúŽ2!}ÇCik€„“%€ž@ÏÂAÏÊAG` £cÿ¡=@HßÙÌ M°±:@ ÚØºÙ›™˜:~äùÏO™!9€ž•êow¿ÐÞÌPß ­ïh ´úÈh¨o P´14:ºýO2.SGG[ZZ}+{r*€‹™£)@è´wþj £oüwk4ÐÄ%S3‡)mŒ]ô퀥™!ÐÚáÃÅÉÚhøÈP—ÈÚ­ÿe,õ/*À¿@OCÿßpÿöþ+™õßÎú††6V¶úÖnfÖ&c3K @VDŠÆÑÕ‘  omô—¡¾¥ƒÍ‡¿¾³¾™¥¾Á‡ÁߥëDøåúþ»?C{3[G3Ë¿z¤ý+ÌÇ1 [ ÚXY­ ÿªOÈÌhøqîn´ÿ¾\ kkÿ±™µ‘ñ_m9ÙÒ*[›Ù9Å…þmó!‚þ#3:˜éèèXYØ@;ÐÕДö¯Jn¶À¿•ô‰?zðò°µ±´ô23~|A{8è;ŽöN@/*þ— ééFf†Ž ‰™5ôŸèb ñ¿øãþíÍ\štãG ûëóß_ÚfdcméöÇüï+¦—P¡üwËÿU ظ<¨™Ô ÌôzzFv+3Àëãü÷þÓýßR9}³WG÷'¢¸µ± €ý_M|œÞqþ÷dý{mÈÿ›AÆæcž²?ã¯EÇLgøñ‡þÿóüíòÿoöÿŠòÿ:þÿ·"'KË¿õdÿ2øÿÑë[™YºýÛâcž?vCÚæcC¬ÿ¯©*ð_ -`ciôuâŽúÂombùßc4s1sÉ™9šþkˆþs Á-ͬr6f=pÔôttÿG÷±s†‡»ú[üX©ÿM)lmhcô×î10³ôííõÝ é>Œ™àAÿ±¤F@׿g@KcmãøáøhÎ `lcýײ0hùÿý‹X´ˆ@+ø‡Ø´Bˆ@+ü_b¥Њü!z­èbЊý!ÆñýCÙ%ÿÐGv©?ô‘]ú}d—ù/±}ä“ûCþÐGÅ?Ä UúCù”ÿÐG>•?ô‘Oõ¿ÄþAúè#»ÁúèÝð¿Äü¡3´±ü¸ÀÿHþºGZ£àÇyÿåÿqÿ(רÌùžù/µ“ý?>LLþ-™þ?z2û~nñü¨ÎòøQºÕ¤ÿ(ôu<¯hmþ‹L¶o´¨?*³ý£þ8=Û¶ùG§ô¥ý£púÒþ4ö¡tøxÖýQDpü£þHîhjüÇI|Tçèbó‡Þœþ½9ÿ?êuùƒ ÞÿHÆðÞíoüŸý1t²·ÿx·üý„ûX®ÿðß/2 Ðh½4ocÈh^ØöPÅíB½;Î=C¼«šLNí±dßîôÿ9‘¼2ÝÃþŽ?q¨quG˜ì–oïÕ㸹îsHK¼|ë³ç‹n¬ÂÔn+ôâ$ZÿDþ1í/Ü/8ÔJ|{ž¯vž*~`Í ÄÙvNlðr¹È.}¢®µ¿JVFƒçwå÷*Y$a^J¦©#•#´ü g‰s 2æ0 ©q¡(.\foïf²&Þñ$b)¡½N" <46¢çÜ×Ê”º0‰050pÁn‘F§H<’$Ð<Š~FK‡ÿ4ÆÕ™oäiGзcªÆï\â*™ØÁ8Ôõ,AØ™ Ž6”ß&:´TÌêÀ@Ê®e-œ~¥×̓vïØEs/ŸM·àí·p<•cIé³üxKÆ Ùqr´À²ˆ™Ûÿ‹Ý{š´.î݇/v‘Á ÇQ³ÛCßî´ãëÃ¥×Ä„¨5T¦æ’ú)Ò$Ρþ0½)~'¤Þi¦ê`Ò»(vqäÔ'IóÑê ‰Nwø÷^™ÌcÃÞe®½G>ØO› vJ»N‹F%šÀ©¨Ts‰nkðÉçï„ Š¹Uš Ç¿2 xGˤAýmkX+‹ôõó“ÂrI±šBLn ïåp9Æë¦Š§Ca*Œâ<§ÄK&Ï‚Ät\B¥*J'€„BBçô¥Œªñy]a4£“×4h, ³¸\ÉJ˜ÒC'õ<öd˜e2þ¨™I°Û„i<æÝw¦¹Cõ”ÉÊo.•ï—;Ð/uD1¿{'·µ¶Teh ÈT¦µÎeööp²Û{š¿ÂCÌòó^Yê":tKË5Þ—ÀtD¹+ºmÍwl~ëÕcwµ꿓ÛŒ©’q²Ÿ'—âv2-ŽšóŸ_Êié–› ×)ôÂhlƒèêš…þM]4î®L1¶ò±lßûnG¬À=À}WžãÓÜÐçV<øù­1š„)TC×–´DÄáêtç¯ÏTÜ-”#%*"è†{Œ¿«F0Ø,~Á˜žèBœBZ¶¢îó[CÅlè§îÖû7ÞÉt ÀÍvr\äj¦eqLš¢Î§˜¿ >K3üÖe¶¯Š¾æÈÃø]›?ø´YÞ1æ½ùf˜´ ­÷¥h3 ߘ]—Gî¨Ò J$¿ø®œbq/9±!ùó.S|.›;ð“2¥Æ)Ä#¦ÅWLX.*1ï ÒAPežJï¯HëÞäàìèI¢YÔ(º”³!?Úb¬RÍöÇ3èAì«‹On~ñh”ž®óND±mËi€ZÄ@Z…än¦R‹BYZ°cÙ:s› w骑õ»ÅË<$&cÇ*ÜG7bžçÊ]Wc*heFƾ€ULƒ¬þ&qUÚш¨µ8«­–ƒ‚Ñ’ô­®"íeÉ’¢iv›C§žšÇvˆõ.±Iªå¹n`Q#s@лvÀòöñ¶ì;R«Q }þ­ßÀŸ eº}Õ+2^~œòâ3;£Š #Q>ÒrþX´¢¾aŽŸï¨›åÖ^é%Ü´D]¢ÿ1ä—=ç{sZûɹåô \9Dr¦*ãyJY[5ÝPGos’f´‚—i¶àºKr;Þå3“?r‚‹©A§Ø#£™°W ½&BÕ‰û}¢êîÌ ˜¦p6“rPŸ­»­êã!<õ—V¿"}]qˆ½úx+Óø ñi[“ᆭ]Zc!MƼ Žrî=îI;IÉî ÿÔjJ¦Z¢õžéæüdn Ÿ$…ê§6á°JGpÝ!j‰ö„Üñ¼¼k £è‹bÓ¤˜šðè>W™ÓâÜuÛh°ŸÍ¢R¾K²¦<×Y36‘73ÇÙEX] Ëœ”ZVÐãx8˜Ï,Ã=˜ÈQóV~ì2°=¡énÍö À)‹‹?‚!÷z…³WÚ(‚ˆ`ÁÔ4ÅwOþ…'Æ’ý”7åôø~å‘…ñŠÖù¿v¼ #}t¿RkãfÖk™]à£>JŒ™¥Û$[I$kÆíÙ¡nŠ ð^waf¢*,.ú è[DV5ÁÎ\ˆîòØ:Rsût2G v©wø+¬CNR²mãÜ>cÞg/ºk_^ýÅy¹˜/ `”`Ý ëN½œ¤ô’¤}K:X3%;f`ÀÎî÷[¯~¯±¹ÉÂ=®®bò=³õÈ¿õÐãà0æ,í%J%b¢ä|IiP1úÔ¤&M¯9ôf¡·nÎ(¼‡Åô(Á5øŽV.e8‰ ö{qÒ’®ûªÈ.¶x!Ù6—ao|#Z¨ó¢ÅÌ’H¸³äŒª¤>QGŽº&ù[±@§ÎÛº9¥\K홊$U®ßˆèíÇZ"ŒŽ#­*’ߢÛD§OgF!ÔuS“¼¤ù÷HªP›O« ðhY#Ív)Ë,ˆÀ''õníYvGh AÀÒ) /…'§6²ánÿ3K#ØpúÞëÝ]jQÒX–a­Âo{@&3[§SI]|o·÷ÉŠ¸r‚U(mv‹P²°Dãi!ݬ;]gŸò§N ì|vª†îr¢D±¬3ºýÍTØä^l(åö $©ÉQæ<Žõ´Á«&ó.JÑW%av~&e|m,2K[È “2š`ƒ8>ª«?†Ÿ½ ·-pä¨}ëî¯ÕŽžQ¶ž @›bÏ”|pŒ&ýT”„6’¶ ââ3xd&Ò¾ò©Óè’ûf;µ°ÐðÓ¾’wP.F?pa\*ž” ûô„!ê×’ðÕ{FQ¯%PÌ}ÒÔåœhë.ÂAžOÑÓÙó¤ÙÔiMà¾ë¾«".Ò²J1•BÉ#òØ-uOÝŸ¿<ûµ+­w4Þ0T¨`ÆVÈ8lLG=_!øt ,›F\­á,Pm]ódí…`]ÛJþX&˘¨„ŸEÈ4•2Œ )±’JT“5œ·â¤M]•Òˉ¯ÅlÝÓXfËÏ‚š‰›gÉÕAÓŸµº0 UT«ú®KSZI66÷S¬Ò2zçõUr>ß%±æÒ²v—sØPï+û~ßÛ´N‘hÀá³Þ}gá§;ì1íBQa¯ÊRš‡õˆ!Ë%I¾ ÚŠñá¹1íĺ¿–~7ïÚÿ\”»ˆ}B#ò ]%ð}9Tt{йÑ’WO‘có˜Ch«Ð?Ú0„ðà³ÍžV ‘=²Æ¥~¯i=ø£¡üf`ýSÔ1ÊÌfÇÖ|ÛÑS'!j’iÎ÷ÒxÝ80'):"k¦©Ø¿VÎ[¸ž½ðv‚H¦5p™+÷µè=”À\ ¢UÍìUÚkñH¸²î$cNê…àÿ„ƒ2 T™?,vbø,/#R׎+kÒ% !vç»>þõwîÐÂAäçW˜¡Ä!§ôpƒÜ&Úø ÑÎÚUB€˜Ü½V±–žÁÖÎÑ=wùo íO¬{ö(®4deÄ£ã%Ö šlæâ †q@Jm»>† >ò ®ëWz“½Âã2»d‹Dî¤à“j€}[pdeÛš˜æyEêo}°Eg¾é<³Ã—ýi7ÂW£Ô÷O=#çÁˆÄÃÞiZ`Àǰ‡m²¨óehŽÝ+}†–|Þ)äÕU ìÝѬùL(¾Žþ˲§_ú{lK¢-Ó*ß[o$¾¶å¬vŒŠƒré5ŸEQóžÝjsR_£AŠz)}Ó÷„½ß²]h°p"=wIC|­üáæ"r”¸nÛ[Çð ¥9¾ÏKœb½]@p‚Ç7UVw¢éÒ Çvbµð~¶Šv }ôÊÅ£UAˆ¤‘AŒ>VË æûhÖº1“¨Îh™E™Ç~ïÇ*4TJýÛº65P¢qÑ+qÄÐo޵:ëeÔtèÞi<×çûS¿n½CZf¿b zÆ.•¾c‘›hõåÔ¨ý[3qÝ•#æ‹ bAVÁz8I®´×âJÑ c–Å ©^¤V–½“ÏÆ%ç½Y3?¶nÇY*´ˆîTСŭLÚløžµ^î“óê9CjâJJÜo"ÂS8–Ç)·s¨—ÒýíŠ-ç[åU\˜N_Ë3hbWM“ºYÄÓ sï$A˜YÔU‚¸8 KÁšs7„–Ubœ7<òIbëÕ9‘tYZiÄ·rŸ!”Ù}ïk »öÓâe<3ñÜ ?¢ŸY‚#Ji®%¿´ŸKö“Èoð̲@A™4Ò’T@fµ­vÃüTf@b—eŸãý|+nÛÈM@ÌÞš¡¯ˆ©?I(÷gkW)©±ÎÒÒ`† …ûA)ƒ‡RÝ›²ž³Iç2Má|q?`çØ­Ý2³²w¾M“»‰"„ã‰Ë†2ðu½jÝѽoý9"ÕÛÔ—ãV\Pu3ÁŒ0¥ÀGëa|,/xéUj4Ü5¸p罸c_{ˆ_ ÆÔúš5sÛa,—gÓxêÛ)=C©CJ• Æ¢K»¢êaº86t>D6•z4j¾_«è5ýv*â3åü}®á÷÷­ysô/EëµÞîiRvüZ Ó¦Däáî2ŠRkn8æ:™} q¸õ 1ý8ßȧ•&½'%5ÀøQŸäè ¢ý!%äмÉx¼Ù·Iz Ö»·uÞ   :ÈÛCÔ˜÷±¹MÁd¦ýõekЉ#é!¶ç!éWMœy÷}™XjYýÄîbÑŽñß®ëen^»Ís·e™p‹ÚQ–: ÖÞwó›#AsD®Ü®öjwo/IÎ=®]ä5)5¾KÄåÚ5AS6oñÁœïXYSm˜K[ ‹ÃZÁ)ˆâV*ƒ—שÃW²õ¤>È¡å½gH"~çÀÖîËÀ/ù….Ãë+úý|ŸtŸæÎ¢ËƒKn°çï.­AB_ð–u>8EÀÎUj; Ûw¼U']¥Œ£TúX<’3 `¾ŒI¡“¸çíc åû<]q=  hŒºâç‹òÒ– e—[Yá…gÜÉ‹«cn‘è^®~¼l„)M‚ W:¯;¯0)·þ‘½7ëx4°§l#¤ _êºÇtõ‰MŒà¼[}b v$UgK•³Ýƒ¯@ïrÇe2‚sï¨Ä“À3³/ûŸ,y^öË· wò‚» (i-²§¼QÀ܃î©÷²a:d ÒUQ‘U [í£'‘ƒÂÐ#x}zT¨Œ|Aµˆ8–9â()t£H³u ø4MJe9¨{„ Õ2Á<yèk™s6Y  g‘ŽI Ã&‘ÚÆïÂêÏ|»[ÕüŠJ?oÿ2ü¢/, ¿ÊDÐù“Kóh¨Ì ‚Õ—•x±%eßׂ–A¼Á"Œ´¼ÐÌ€kT éÎs€S};¦¢Ó²KÄc±„ õ.}¯€™”Š'Àò'OÃÎŽ¯J- E0¼êŒ žsÙóJó F“a Øã¡itwÏãF·çûÇp[f´iv‘Ý&¯ —퍓ÔIâÓÐ9’—Ä _ÜÎÍ^³&BFYNY§J»ìªq¥ÃxÁu>ä4]¬»`0¶sxŽL¶±¬ç,0‰=VÌZØ_z‹‚GXÝÌ^¦:—‡UPõh¦º–øûm "ªñ5&oÚãH¡7v‘>á1Žpèð³ F{«Qêî%w(ŠþæWésÔþ.´n×Q‡ÿežÎw›ÂÏibÅýÆà7z•röq©½úÔéÏ™ïUY Ä×S˜&P WƒXÊj$¦c¡,1‹²û×O›³ªã Õ:Ë1 ð§/3™ìéñÒ×W7ãv]Åw‚%žg½;,Ñ}è×ÁcÄo/ƒFjg1õ(·QÍjÂ^ Õé§AA{@U¤V݃,KKùbd–WH3›¢@¿8®Ú,ÆÙ” °·µmb´uyH—qŒµ€ð^4áòŽ\ nBØ!öe*Ž@Qu£¸gA"t–÷ÜrZ¥±d±™…k ú۪̽¾ 3Ãø´Tëmuj­G]àÓ¸cß*V}ì´¶ü¢Q¸[VB®ýÖ­žË…߀jJ> èõL3ÖC-±\ f\ñÖÜqï‡ÿE €,<P-lM¢:0š Ѻîd±‰L>­œ]ì:hÆîaÓDœF†7®+tãóeUÓ̆E ý|h„¤JÊÒ*Á_ô,z+A{Cä-ˆ…_·í• ·ã .-Y ÃߨÁq—ÙÑ kã…2Z!"Ÿ³Î®ß(gªøm|oÙ¹ù5U9Ϭ”­cù¼ŽE[ç>áB|´·­,>À !ˆ"U«{ãj»àœƒìØ{<åФü9x©^éKˆ¶ {­¨77¥þx»~íÓBp+Yô;t'ØðÌ»={‰iÓÄàîvžuû41Œ¤7×êˆkò¶“›¾ ᥼!:Û¤õ#Q’¦îOÿžò–7—à0eÍni£ýÓcùŽ”·u㺰ϓõ.kk„#ð$ÚÒ-œi,±·/Û:Ò=ÓnÏ¢FÍ·R8…,ø5Äß$×m7c©Rw¬m»Ñ¾Iy« Qz: ©Š²TÔ¸Ñ6(Eù¬Æ!)ZPCØwÆ:µÏ8Gm†ˆËD` 7Ο$q½„„ ™¸…‡ÊIã -$9:²jã¯ñs’3ÏÅÀõºí-ÿ%°G•Ö*±g¸³û‡ðf½ã9Š º³64c¸ôÜ¥ËýâĽiæ¯ü:EñM)¥¦ŸèþO nþÔ¦PÈŸKf+ijÁCµ *œí9Û·˜Ãnª·[Ü£c°[e§×7[!¶M3fÙ‘QÊâ2ÀÝD¦,ܧi£<‡9À%…3'ƒƒ"KXú¥JëhZ¢6ùŽÅõêÿFëǃÌëó¢Ý[QCÿ<äòh¹CK VáC–Рè츗xõKG…ߪä@—¸â\»²™šZ[&heþ¼!N•ÝÖ¤WÛJ*›äµ¬î¤`Ê÷H/O'‹U™4C0Ì6DÔÏûþÑÔ‡‘þhdkæ‚DÁžŒ³û}Ïs ï²Ð ¯Ï%ð³F9¿Œ_á´;¦½jÌ1ñÍÒ»†Ê'íÕðÿ<"µlâ$épã`-ÚTŒ¸rŠZ…(Ÿ 'ã?4q Óï>ê§çÑ^J™øùô ä’ r4pC<Ò(VÇSÉö®àm—ÛÕ÷ÝÄ'Nº˜Áˆ¶5sàš¸ˆÐõm¨ÌyÞzŒÇô<¶§úÇåæÏF6JãG)$‹Ú›PšƒoUkš¾|$„"lf;_tØÓ¸â#@]¦>)s¨ -ÛrŒÒÓœ‘Ïy~ Ža°Ýú¦I€Žva¾ ß_™\³<t°xc¢ƒD.çõG¸)×[X°ÉÌCšŠ•Ò™†¥| †‘ ˜\Ò¯0Ùÿ$±óYþZÜAÓòæ6ÔMÜ?ÏýebݵoI®LVmGFXÝéÑ’ÿ2bÓñ‡6ÎÜ>8®:óùwsÙÏÏmœéRü>•t—FíŸý×Úü0Œ­ká±ph1ù‰U¦Ï²Õ—ó%/§uÜ» †äภæê4q¢Ý^à-öÍœ¢ƒ-ûŸAr*¿û|[¼–i„¾ËEÍisx{¸æÏ‘A´^û}vl[øÚÍ]J8'ŽýÖ¸}ˆ¤ÐwíÌ*Ì=F€ªÁ:c³Jö#‰.ÅšÙ»1ñùÂb‚¿¬pN‡™D¢•©n¨zzCkMÀΩÐßë^i°W•ZÀdù€(…ÓD â;}Þ£Ò¦Û§lO9PÏŽfˆ:h¸K#¤Æ’7á€éNOXÔ5Ф¼°ƒ£ƒq#²5ý' I9Ó«X·˜$N2!ßoöùªàÆïl/f.„5‹>Òñ­.8•l¸-ôÝ;¿=CY¯Æ˜%ÆuÞŒ Ÿ(½– ˜Š¹ç™K7Q^Ê£±x;àûS¼Åœ¯~‡Ï}Ó9áª-FG°‚¶Êxà•iÄéÇá§Oêu •[ZISõ0m0£L[¾üª½„¸(…»°nSïa *³Så¥a*vÍ—HšÒž~B B '˜zác`BÏìª'“1sË—ÏÁIó;$%ö¨é…#ß¹íõ”-|Õý¤ Ñë,…1aduà®AöÀn¨ºÿn( “õŽÅ>ßÀKÞt#×TŠƒxasÛŽšVD;ö¢BÁù%úó œ írÛÓVdLç4íTå†Åhö›ìMu±? M*e(JÉV¦dÃ6iÌšZõ¸§+»û!Í‘Å9’ÔßǶs 5ßÏ蟕ä츻0u^Žâ •›yZ+(q¸ÆD˜KFÒŸ4Px4…Ç‚.bý¦NöK õmmw|çõÀ~ZÍÌÈ–½XÄí–€¯”;3¯Ÿè–œ¨´(ç«Ä",SßïG ѵ%LΛr·×YÏW5]:ßÜ{fKŠ*³ô_M@á@p‹æ#t7ƒwv3ß»Ê<ó«¢RƾŠû!5Sر蘼w¹”‚OÕÀè{›¸áÂï8ô €0r»ÿúl˜E$IZ.›– Dts®jÝšE7Žë®£65êð 7QPc‰±ó“Òý¯MT÷ElvüZqXÕ5‚Këhb É¨`„j½þ´Öº„ºas—hyâ‘N/ @¼aãE˜ƒðˆVìDϳ i¤ï×Ñ#ç[OãpE—–•꾺kFWö¯¥d÷q¡¾ëêH;NlÑ*TÑcéë>¡”s<ƒJ·Vìýh`l?·>—I‡}Qø‘†ìIÁ<-?‘ ÔQçå‚™ÐBMñ| âm=ÄÚx-zŽ3Ô‰ŸZÒΆú\tP✜F6ã(¸x›gÃÁÛ–’x(ñUmkLцãÝìàšÁƒÇ¦-Z5ÃNP9±àm)ÂæQ§†·dß–Æ—îz.˜:¢±H†‘ˆd Ñ] Ô\^ü<]—Û¿05<‹ÒwÅa±~K²†ßŽº@ÓôÇJ„U0xÒÖŽYyÞÓÊUõÛJWÃ%¿ËÝ k¦g,:\ö,‚1ÌD'R¥ÀÆÇÂ?ºÂ_ pjÀÊÜHFñyd–¢E§É =ÉS27ó3ïö¢ „öÏ€‚ˆXimIîÜÕ&Ú&å`èKZêW¡£bLšªTVâ]÷ÞÅ7ƒª59–wê+oUå+užƒÑ$®t ¾Åòä®öåüó°$,V˜õ¥ªû}IÿT¨ŸÝu…¬Ìúݰ=1ÏTW€ûÕjåüWNŽuR¼ú#‰<€5F]¸øwü…‚Çq•>ÔÓ-xþË gdãÒåÅ! 5ä[üOÛ…^ÁÊH1¸z¦ï+Vbl£à"Í>U´J¬-•sÒ«ÂAfŠö¾Aǫ́¯swÁŒÑæLõçŽÞÃ>nà‚hz¿´rucò™y¬v¨ÐÀs4é)ïp[XawÑ.7"§5”ìMãUéʆ§ºbrž*•Nç²#TË‹øóˆO– r-n´ßÊw4»‘„Ï‚¥fWÁ("¸ùT'ƒ¾¼žØR…îàÍcÑ$—‚”ŠÀtïxû´Š»„¥80|ï¾Ö ´õk`Úéž…”œkÞN[¼Ò@9¥>¸Åv\›)SW‹gYï옶çNG¢X©ªöË£Áó¡ÒbBï3'CÉF1Θñ®Žl1~¦Ü€ÜjÚFH8«äšb{ÀúRôµ'>âpì7ØM||m㩈LSM,—ÎíÔ>Z·“ñ=ËO“³R¡$ǰ¼K DÄ9NW\AóíˆhËyÇ–óp8r3‰%T‰ WÔ ´ô?#·b‚¾±Âž£.VvS”·YÔ˜‘NScSÚ).âWò_Gúî ©zz×ËH¶É7x›,gNÎ})qº8Íü¡(ïLȨoyv r<®ôËÈ;Z ja6;Ï. ÚVyÀ F.eïÁÖP“P6½W‘Ni¶f/šÁ¢ðSÂõI0'–BSÁ<%|•v â;Ï.iÇ5°ŽH2vŽò¼=øMÜà –qö,f®ßí|x»"ž™1?É3 -ã^LSìØ¸r4 Îe‚¿öÓ‹ÂdßgIùv‹!i†éˆ"/D§âöåqÂs´ê±´âœ¶å‘!»7¯bSmpß(·ö1þЧ®Z¯¶`ˆã1S&–J¾©7ͼ‹jK G2w1‹f\NÛØ´1¨+ü(Ú˜O¼º»Ýc1úɆ5£@e&vù[¡5!ÈZãr½Â×WsqaXEÅfÐÿxÀ¦r0|a™®v9Ÿ5˜sÉ'æ#\/˜„{>" ²ˆö¾Õê糪“ÍH¨I«6±õä ‹*Nn³JÌ»X«¦úÕsÉe=Yõ»ÿ7F~snÎÀ±-·:(ªÂÈ*p6ÜüDÊBÛ×êPô‹Ì(@ÉßíÄ#)ìà·S†% ÝBÁ°æó-/¯ß7 résËœ Ú¶\ªûroA¿|Ù&!]–LüȪYùó£=ÄIZg˜ù£Ï/•·ã‘) ÞÝ;z²È…™9¢ÚÆÛ–Y”Kf_Sœ ûµ\€·;g DH\ó¾V¦Ì^‡fr}Òå¹¾:›~q=O¸{zqb¦üƱ×/[ýãZ‰…§Ü&Qÿ]*äÂżðÊhÔíâH¼~}ž‘F6£“Y2‰#9vúBFɈ¯©lu‰Cˆà2 g´ìpåÐå|Ëy?BÇÕHôÈκ¨œ*|5à<ì ô ‚QLecøß ä÷zöß·3ÄqÕ·& …ü<ÎQ™Pr ¿3…~_V .Œäø†¿Ÿù£ºãó‰‚Jki@–bcû &)OSNšªÒÿ—âêÓ™TÆ…ÀH‹gOž…ÉØÇzh㩹–MÍ3Z©4]ò¬¨É»ïN`£Ÿä¦ìÃCÁ;ÉT6Æ#å5ùß=ëIï(»C0ÝŒ•Ñàñ—;!NWZ±¢²jºÃˆbI$Sòƒ²ØZ…ï„*‚•.Eœ&ðTÈpe¼ÃQ6ÁBuÿ] ×2Œˆ½,dÃÀ#zd€ÞvÏRÌß)ׯš£Ê7¸X{3iL} ­>~=Ÿ:65à”ϳ'Ù·ív ¥;!áJ¡€QÐûÑ+Ûü-@–¾õýü±šç(ãW%@’®ÕÁ-Ç÷àq^Ö÷˜ˆÏ4½À…-¸Â¾²çBòèBªÓdz辞¼d3y€ÙyàHÉ­Ÿ”ÝíÏÒIvLš¥Óû‰+ÈÀF•ãÎ÷EݦŸ”â:Ú…UŒ€%d' ÍSvefEƒÆÀÅ¥Õ¥d‚guÕ¹N|Á*ÞÇÆ!©‘†<(2Ť_LlçÖ®þÙÑ_2æ¬"þ§ôz¿[*î“õ$O¿lQ1JŠÌ|Œ:¤Ä7þœd“š lxÚb‰!»^^ô`ÒiÙiÄL˜à’‰Ô|Q>P²Œ=f$š« %<®¤¡€óÛ²y_ÜÌmÆý TêSu›ù(gNuÑå3æ@ Ê÷6¤§š‡¯¼âÎfœßßn•ªpöésGC£3ø2r¹ðŠrÝao˜ÊÄαZ§91% ÁƒÝë_F‡OðÜ’r;¹¤oÞX-k2:¾‘H)Û*"¶“™©?”FÅÕßQæÈ…4Rç½×ärßK/×xõ/.Á¨ltTqâVÒ€pتY?›V"n“ÑVD €U·Uá–™> Hϊè²  ÃoÎiÐRã(Sú²C úº4vŸn$#à“ÂMƒ¯ ÌzPI‡õz1&x“sKú\ ^íØXƒQÛ}4¹Å$É’D ;„°+æ3ÛÛÑ£ó”S[>“fH ^Û§ÁR@·ù•)ü”ë`”XèϬxíËõ‹Òc+5þ„ì{º$G=ŒL}KŃ–@'$øMðË!od¦€À×—Qy°‡¯? YÆlYH#²$²ºK‘GŠ›Oaœ°ohí¥KÒØØ¦<Ú 9ˆƒý°G\ñ]¿domõYŸðÜ'cзO`rNôÃ?BÀo¸ªQ‰âÔŠ!KS UXM«hÀ”–Ú?á˜|qÅ<Á´>ÝL×\›žÌ›ºŒ–Ų‰9D–Œz|…Ô5‡9HÁ™¡aº‰°'g̪W*º÷7"pñÞì^°ts?f½^q’S£Gp[ö¶B•Iõ:6—–CÈB”H5>r*Ð#ÍwÒ^B鞈¬Î9ÓúvèP¸¸ñgâÉK–ôNï"Üó}DºÚìÖÎÖ]>᳿‚•;D!MÍåÊOO\PܨõW½Þ%½åÏe—0Ö$Îz”p5CÎɹ› L·Uš[AAA3®HÕ•ñ jÈWŒþÚ”´x†í_NW‰­0ú^!ö˜¢¾F°p,î œU_x}s-£‹€þÖÕWc„ë(}@< £ŒC6©ÈŽ|縒OäcÆØÓ¹˜ŸguWЫ¨4ÎÑiAÒë.ZàXõCëAJ—iSt©Ž$ÒzÔ [OÂ;ÆP1´ ög"ƵӗÌ>(¢ìéPå™DŒA=ÒžúÆc­˜5›¨:•ÂB ‡ê…75d—ˆ_ó‚`gmp¦±7p3¹Ø}°GâxÉdóÎÐEGnhµ×tµÊÝ ‡°¦ýOÂÉ}3aœ^¿ÞG*º]rw \ô}ËŽL@ø—ß0ž€T9o²ðDû>$Ô÷Ö]™bªÉ‘‚¨Y‹(zä+/ U®:LÖ‡ôapßäÕ»-Ê’gÖ2}–°C-[t·í片GI䊯ÕV'pÐ6pFĈj€5£Ô¶tCà‹¦—OÔʇÁ9xNMÛû¼–G€IZ‰‚âN°LeqO1ò§ƒtÜ0‡s=ÊÈŸ‘!ƒé‘“0¦h{Éèç-ß┎ç™yó`ßx€ÔP%ýFغÀXz$³jg·yé«€Ñw{cfÏÙýy´*àJh$Ö®1ÜÞæ^w0Ÿ~-¼PšOVâ;ì…jì°^£ÈNÖŸƒx9s7º©CiŠ6†(j°Ÿú} ´|žMëlö€›ªÊa·n©“<ªß9wW]~­††ªFnégW›5;UÓ7 GJÊz†8 ']燹î¸YðøËÕ´mfÏw<È€ë@¸•?²EJF™¶Ò¤@ÚË¡âDjz@´×¶ @¬:Ä#ýÍ5<}†ý„îìdTýý-™èñÓh§¼¢—o÷¾pàÂî‹§c剅´ŒC™àxö¢Ö&©|í|BwkZæõ¶›Ž-—ã•\à~úoOøíÏMp%(&ù¯Éÿx=¢ùÁèCVwTª¥>Ñè•Û“”8nÉàHÈ«yÞåÌ‚cU«nÛU˜™ýGÎzAhÍ/Õ Â\ƒuÞ¬µ´ˆÓtÛ­Ž`ÞUm k£†ð„Ài‹W‡˜½ä5,(Gbå’&‹è²ûáë;êˆJGé¦?åkÒÅiÞ]­Ì­%¤Hñ#?’¿Í©–kÒã¡£*á"à‡[·EBœ?x¢(rY«+^DôÚàJ¤àÖmæ0®{½²­ GËcli&!lr#ÿ”»tÙÀRsü©G̲2ƒDô» ~ÒlæÊSÕÓTf:ZåˆroZïêó#å~ç¹c#Ö+,}”p-TEOjÔCGêªÆÂ.)"ç¶04 UƒÒTHÈ£±)p©î³3ÖÝ J3àÅ´˜“JSÜã†J‘ºƒ %Ôyrݘ‡(¡Æ“HÞ½0I¤0Çå\ºhܬa+‰óônÅÍGÜ©?Â@ôR—U à=»ÿÔrç½’D-±EG“½Ž˜×SÕÉÅΖå†1”Ñ\”AažGÖ2Ôœ<¼T ÷SÉ ·y"Â]l†eža ±Ä:;ƒÈÒ´Út ]Ie0Æ·Ï®FŒþ¸@>m@Åau†— JKñµWŒ}§DQF!’ñé;‚€Ðm\»yq'¬'õ³)øsÕø«fèÑݺú’Ì}Z°ÌWäéäUB¶ºÈ—é#ƒËBOļ–íQÎ1ô«f”äø9óP\‘äŠz[6lÜÔ$Ó©ƒfMžÏ¸³á½QÉ%FøÓn˜O$š ªVE¢V<Æô’بßpEö®?Õ›–ƒRš¼}Û ‚a0ÌœÅÒš–ïl_È5÷Öðû!ŸlEY b¾b{¶ˆ· 1ž®aÉy_³½è&¬ìæòо» Ü? »4…à‘z+Î^áyp¡fu˜¹B7W)’~`ÉáíyÄ}9ì¶Ýoˆ+”{÷E«3ÐËâºIhCGå˜O–ê‰tL†RBSÌZ>g€KbºL3S¢a#êˆé&û’iÓ•¢îδï%FU6þ̹—®¨‚ýš@oÄIŨ|~ým¿´1rG¸Õm2·ùd“cc¸ Õælªn¬t×§Ç–a/¨ÆÀß=ó€zo%ÔÅ; ŠÜ?•¤Aåv©!a,O¬ñ>+2Ȉ!ó+"¤æ‘½ˆÝ”ÖÏöÄ·§Óßë–› µS|Q!}ßg%X:-GÑFݱcÕváG“%1*|È©;Ÿ9%õ¼’.‡ÄäÕè£ÇÄËmÉÛ¾©ùdæY äˆÏ«5Ó—$÷bLO¯1ï í2ßfõl*®ª»Ÿ&ŒpÀ‚£3Áó³Ø¦Ïªk-Aò.pïþ ÌÃl´žÐLHœ0c?c#ZE6À›U¶æäø— ÚêbEÝH Z–ˆÖ(M;FƒnôáN¸¹P¿iäé -bXà<ÜWú–ÒtcžE½bÐ ¡…IÓMè8¿fDõÅH™^‡¾)’Ò^ ëÅÁä^^KˆäÔüƃêŒÛsÑ|‚O)¬±ptÅu¸Ê~¤KÆþ)Ä£øÝ$ÊoG ¸£¼–÷kK¯iÂsÛÇJè~•ë7üTGÿ˜)¶¹¸˜,+…ø¹(û›ä&/íŽeýç«Ôæ¼øm`È´ó†qЖoEí6#žkwiž!q~§Sï®7¥BÁýÐzÎZõ×¢#óÊ3}74ðV£ZêÄÁ¯Û²oÎëÒñ–¶ìÆ—†PëG¿ýª2¹MA‹f…ú|ØéÜiKôztÜs5òª4Ù7ÕÞë0h ¥> ´ÿà2BÒÍSÍÈ5ãü2JÀyì÷*±JdÝ0TÖàé*U]ª¡Š‹\‘'¢PQ¼¢"ÒR84¥CY=ÔpºW~2Mz5TGú}¨B¬•0äÆ~S4ð*åzÅX(Xq—ÒtÇéöˆaÂî2ª R¶È ´7h,‡5“ýt×W—bà@íŠr½ÅŽÅ[¯…×°< Òé›tÒtNÙM}ÊéÑÅñiˆrLú3§'¹lWL™GݳÛÓ»}´XãêWzOj!ÎT>¡„ÌtƒÃ>ñ^F/Öüáæfê)9ý±Ê„>ñø‡ÚWǯ5«x³†„ ¿¬¥¿145¿Dnð'ój:–”<–‰¥à9iR·H.tÁ¯²MSlåqE[¶Ä‚[-C—“»FÙÓšjxiÄ'Õ>Ä+q_<’-”È êi'mÀ´Ý»? •ž7ÆH¹Æü|Ú+’3p÷ãG"O¹â¡ã<çÁ'¿ïMÐéëNCâÕtÀÂz¨a¦«AC f‡/Çòhæ€.-czÁg1gä§~HMœÿyºÑâ¯KðãËfmOF‡3ÉWh¼ i–YoaÝ)d7ñ\WÛ¹|”º†±›Cb›«É¥ŠÎ÷›”i/×Ìfhë34”šJùöš$ÿ€Uólæ!†cúe<æ4÷’ ]Wü¾fN¤^ûß)`=ºqÞŸËÑ\ 4:YˆÎã9—}N2<ôÃéJˆ„€U©”ö:MˆLá=:sza]­T«&ÎE7í ñ· ]ºÿÒá(XA¯Á2ð(ÙñôÒ~]Û•'…[ C«¾ŒðÈÂU¥žpXã ÛÅÎ×ñôó·yÝ÷üÀHSò¾y(ïíI¼› DVî¼Ëjïƒñ‚>Ò8a5ðÑØç/y pømº*k¦&Ä—'hË6b3p,ퟕ¸ñxIçóª‡á¤Ò4ΟýüÉåõw½§ƒ†6\E[HècL‰ÞfV]U`nq>)äkmuOàF–äÒ$ÿ4ÑÑ>¼g¶¨3yëÆž¯qi;"#ŸÎi©æïTÃn5G[ ßÌékQ­Èƒ3¹‡ÐI5»ŒIß‹|¤"&äFÃXsÅ<ÏgïHãªOq†½Tc?gw½Á†lÙÄàB-ìŒã§¼›he‰XJ„(Ò‰ßæß9NÍ´×ãÃöá=nîV»¡ÏSX-=¥R='Šu!K‘|óŒ“M÷à´d+9*æù1È 2\Ú¹Wkëh\‰4cÿéx¡ý½£™Cj°z; ¯'‡ãôãÑšBméó’{Êæ9?bÍ«µÇÓIfd~n­ó±Qàú<¸‹Ð…‚*ð6( „ƒÝ~‰x M•›ŒƒÝÊJβ1=Md™Ï!çKÅW`Ô'°MÖ Ë.§u“ÓZè¨kSB>EüâÞÓ“‚¦¹¥ø0ASÇ ¬Ê¥ÚNõ¯5…“üôcl ­ÄK‚O¥ M¶à÷iW¹$U„é«g3Áq2<Å¡³´AsŸ¨3Ì! 5‹ S ÑBM檰=2J4·ûYŠm‘Ôr  âÜ…Q?O”maÄšèLüJpB'!å<ØQ0›™³1K]åGŽžÛï¯7aL[ÚõiÍøYð¢ŒüÙíuÚNxÆÇA²üJ6K8§Œ•ú^óRƒ“Í®¡ãxY5*Σn”?1‰§l±R —çǯ:¸ÇFª[áÂüÇ$ZjÄlÖai¾…` ê1š‘&÷Ú•‘=‰ìýœwG´Â¦E.k鑱Íxo5«ô;ïzµìÍ 8<üΖr—h5J2eŸCB*–U—ux‰:êýX}ÃÑéͽ›ËñK¤å²ãÙºT¸c¦Ï.S–Φ¢~ µc—9ÝŽ/%ÈåëJu¸íL+V™›L¹ü,8o…e” üOLJ•ǵŸ6£±x[¬jf–]°úsÌÞ”O:áþUügBPÉ•¼­”iÞBD#ç©°>ÉT景£Ûh*Œ;½e›•±§|f7«9™Zä!ôfÓ…·ü+ÿ͇L endstream endobj 268 0 obj << /Length1 1500 /Length2 7519 /Length3 0 /Length 8515 /Filter /FlateDecode >> stream xÚWuTÔ]×¥Kº‘º‡¡ éîF`ˆ†$%¥%UBBR¤Sº”îîA)}ê}Þïûã[³ÖÌϹwß»÷o­acÒ5à“·‡ÛB”á0$Ÿ$ PÔR05T@ ! $ˆÇÆfEºBþ©à±CžP8Lò?0Šy—{FÞAµà0€º—+@@ *) & A ‰¿€p„$à!ØjÐÔá0ˆ'›"ÜÝutBÞ­ô×#€ÓŽ !!Æû» ïA@íÀ0€éq»[Ñì 0€ÛA!H¿à”vB"Ý%ùù}||€`7O á(ËÅ ð"úOÂbøE  vƒüMˆÇ0t‚zþQ2€; }Àà.á µƒÀ<ïš¼`öàn}€š&@Çû¬ù€ðçñ€û³û× (ìw3ØÎîæ†ùAaލ+ £¬ Dú"y`˜ý/ ØÕ~×öC]Á¶w€ß›”åõà;Ž2ô´C@Ý‘ž@O¨ë/–ü¿ÆÜ´Ì^îæ!=ñ~íï!±»;y?þ¿¯Ø÷ü;@aö¿¨Ø{¹óÁ ^µ‡¢îRxÿä!H€@<_;'þ_‹ú¹C~§ïx¸ÃÝwT APÈÝ^€'Ø@"¼ AÿYøw„' °‡Ú!¶G( ïŸéwiˆÃñ P_€èN„ЯÏßOVw:³‡Ã\ýþÿ¾h~-MeUU3ž¿Iÿ]VP€ûø%|‚" €€ ˜0@LDôïIŸÁ_üguÁÐ?÷÷Õ`p€Ä4îÎï/*ÞêƒóOûpþ½‚6üN×ç?6°‰€ìî¾þßføÝòyà×”ÿ‡ þ{OÊ^®®¿œAþìuõûs§l/äK´àw^ý7Ôò‡¹à®öÿ]SC‚ï¼"s¼Ó;Ÿ€0$üGê© õ…ØëB‘vNèé¯ë¸[Á ƒèÂ=¡¿Þ@w] ÐÕî,hçr÷–ñ¼»´ß%ÈÃþ½®ÌnÿËŠ‚"¢0öûÓÀ]$¸ó¬=Ä÷·Ìü@y׸cp€#ð~]íøU~¥~Gâ‚~ý¿# 1?øïHàN üÿ…üŽÿ„wŠä‡ýG(à÷üþk»v^ij+ëŽË_ñï×⠱Û‚ÛI…:W‡6ŸWÊÓúðm~&èùöüÇdC‰Æ{[/DQúâD(/zF¾}b+úb…t_°è¶ÎÅ”äb½ø2Z’r¶¦ÓÁv7p„TærßSÓKpK£­ÍÜFfïHùµ^¿ÏçTnœ‹Š×ãxs2kWEš½¾ü¬Ìé+6Gí >Ú§Øhljqq!|´Ðù¬–r…*ùñ‰V5VÏorŸ’è•w/^v ЬõÌ•ð¢BW_Òîí¸kœfíɦï|½¯a3gÛø¨D}•ÀrÚÌië9¤›R¦±“1sÕëGùmæ¥úʇ7A‘:¶dÚÛRµZ8©2õÚœ>e~“‡UÁÏ*:Ïå5#»—I¹Xl?GBŸèŒ1'l¨Ò¦#Än‚m;oD^s ’§‹¶bÈxì­ðÅÌœô_T­+%|ôß9.Y›u)è,,9á¡.f}VáÔbêµ¶?˜ºø]èð=ÉÏ€W-dv´¬ˆü0RŒÔ²‘\w]à[-ÕV#I—–dçM<¬à/ÑdS1oŸNéDí@—·È…XÍK˜?zIô¡6mƒEÇ<‹êçï[{Ëg` å™ÌŠÿÚ~×Ö %ÔòcƒèM1úöÐW*E傳PZO‹Ç(¢ŠCõKKtåö @ùuAN’A‚CÀdJz~Ì“!+Cò@LITDiIóò…â¾rÛ½,“²Åœ™NŒÞJKú /oéÌèSê®U§ñõ/'Õþ±ö¤»¡¤J8"^ÙÃ4¾ÊMãf½?–ŠÝGK !1çzçËâë»FG¡¢nsÛ É’;?nÐñÐ'½+‚%³Ó_aÔOŒ°‚û´]Ào¦~Ò€of/¥ñ2ùd1#"ÕH0Òc£Î? 4.„hÝèHÃÞŒ-ƒH»Êþ µjkM P/ꎱp]ªa•¶ÓÙŠW×û­„?Íœ-š&W/¨ó•Ì _8£†õfÑ(APª*x0ŽÓ‡s®g¾%.Ž5¡Uo|V¾’˜'* 'éìLœÕÆ,:<„ 5úY-õ>Æécèƒý¦Ý š½* w š£7}Ë=RE Çõm©ï ëÞzùLNOÝš…´Ù°*“ùmŒ'ûñóãß/Ⱦ,°z6‹ÞÔ&7¾©wÈð,>%Û®ñŸP#HDEÝ{‹oÖýÆÝ^H¨1ÍAVMÆ)YS@–!‘EtSNúDeßü´¢C¬öN›]ø$–1Lʵ‚Î$­¿vÑ«ì{cIÓÁóï¬èƒä‹i:  Ž´Áse(œS¬7¹-C#t·ÎþÔziEÒŸnn£#K%KÊj<Ó¬œVΫT?6ÊÖO· w¸tïá˜z—™~pµ¼VæÝtø™U®òú[^Î 2ɬ`·¡Ç­£Ç%ˆ‰MÖ$‰øÒ.—¹,ZßÌá(³†$PØyÕ‚ߢèß”Oìlõqù>‹•9äÂÍ ÷w/fõ-´î7âþJüþ•Ê(¾Ž²RN=¦Vbû`hÂD¯I•R,ŸU“YƒMêyJùZè­åþRá7¬ãœ/€ŠgÊoJX¡slÝfÃ9H2Ãg´²Èç(ÜÚ—æ+|Ñ/•¥6ÜÈÕºTQ>bÄemû†3áóëEÔX8L4>¿}LÇQÉSdª€ÑÙ¯øD„EÓ•‘9mEÞ„éôj5ÈwíA’†Æ…‰/)I•°à†âG‘)ò®Ö$<^œdþËz³g—ÆÙÉò?pn:’œ:4¸†S?Ÿ 9ôÓv²\F|ê“vϱ‡4è_{ÇT«òœåiHëVOžp"¢ýkT‰ð9É®_wÇÏ-3 t™£ қĜ3( “Itè½)<•ûõUL›5?_Ÿ¾A>èVl«J/G;'àÅ[À>ÐP˜?äxÒ^†ÒôvøÐ1cÝÑX­¥y…«Ó~Ê©S46åüðrê Ss¯Ö SqÇù}ÀÞVN=D®NOtŒå _ø £Ä¤ak‘¦®b¬2@UX‰˜p¦Ï …­?Äf¹ñ ñýRÚA8{㲤0Í-7Úa¡­š*?擎JÈ~"(.ü&Ò\@P¨¸{{Ú<¼Ã“¸sëáЄiØ£â7A.bÊ ûÙa#ºÕ%}·¢a¨¹µ»ýQ¸K!ÉQ™‹‰j©]›}¶1qóÊ×ýC“*­Á¬Ÿ{4°<Âæ:²ŠYzð} KK<â9åˬ¸sŒf?µ‹| ÕçƒÂº'õë5«Ó«QÚ’Ö- £¹¶ÑÏ;\­±úá¬ovêô8>~>Hc»Æ;—±ø!X$«çŠpîW—0±!ËšïÛ’É?Ž0]ä,£}ŽdAmàÏÉJ¯Ê=´°Î3«õ"ãþ‘‹ÙY\€ñ–0ºYƒ•ZåYè{ lR¾ä­vW»q‘ÂÊ J¸.ºÒ>§ OÇ-íqyzN/[‡å㡉ÂÎ'][aNAGTå–êâYk6fË\e†pÝêýe•Šý|@oVvZ)ÖA3 g:у|†C}æÆÏ>ü¹êå pæŒR¶=Îy7j%ÅP*¬D7¦Ë•Å€ËÅȹÆúXPÕØ¼‡Q¯"Ü5ì*‹½NŒ:¼hæj~\º¾j:I‰Ùèä‡9*.j!™†ö Éb­ÛJgz£`ºYõ2›|†ƒ£ W…´ÑúÎKwcÖÑÂS®~ Žõ¥ÒB4~Éw]XÚKºø˜ÀÙø‰çß}Jó;r\±ÈÉð8¨ì:¶×€±¨ë}vÛз›•w[äüµƒë][Çm¬—q5iZÇ,&KVÅE¾èèÄ%æStI«"÷ƒm]_Cz÷…éL•©+Ú™×ÞUaU IˆVGÈ#‘xÙ"Èߤä¹wèÈÊnWKqé$6 î0‰d†[¬o³U–Q ³óÄH~ö86«ÍØ;)e1 ñ2/íÛú›lŠugÖu ½÷4_4Dah2\‡+îLvÍ$¢ÐްvN­Ì#g’…¶ß¨¢qðieŒ¬5‰V~Îox-Á¸ðɇ·ÔÚÀq/"‘>}8>‹Ëu¸0`GO½À}€ÕÂÐiñC~pª?û þ|ç\"Šñ¦w‘¥ í—°I+ £40Yt5µñ †¶ÂPѨ¾óíÖgœÞäÊL⥄$#ŸæÍëÎ6&›„èÞûn£ñ¶•³®[çÓ6%ÂLQºoqL“_è2ÉØß“4“~oA¡ÉÀlnN€FQíth~5©…Ë1aU™*¢à©FÞzõé!Ë–+®ÞS¹á5õð‰…˜ÖÛãy¦„$ÌóµJúÓÿÈ¥B%ÿîçú®›*-U_i Z¿àý–_ª5‘ì ÃG#ùe„ü”d±ÚTS:îûèŽäÓ¨]çm\D—øf”Ó(8-°†sæÅ¹1´2Ö†©qiT·>0íÌrÐyîFHÁÓ‘Ÿ˜CÓ ØÿR¯'?øX!m_áTÈ¢ UNŸ÷{Õ<—QimÖŽ£ô¸€”Š,)>²žª?B_ä^ßCIrÞñÌßœÊjŸ}QlÔ'Ñ^~og¤æTÔ)E‹Ø³yu¸Î‡ïÕÑÌ 8qÉ>xt%®FšØµX^!MéBÖªÉä(Grû/aÖû‰f:³þÐ҃܄›Ö*Fc¥™ò–jÃ!%赞J‰ÂZ­X‚`ÜYœ7Š}µV°ç™ÊË»ÿ1P&Ì—[„äË›Icê‹Çh¹`ìò¢Ki?3ázÏ48C¶»š¶•D³å‹-}.ÆråÄMÐз­‰¸çÒ4õªµ8%•íJgpÇMbPùJ\³‡Ù©¯7á*, P"Öó{#ßÿTÙôÎP%‹²%•ËåÕ:¢²®¾xX.R›Nµó"iRºAPæË@Q¿+J—>y ù(ŠË³3vžO =%ûJß¼S»H÷ÅH"zXÞéÏÍ q©~¶¿PNö¢6Ó h‰`I„}OЫ¦ÏSÀ§æ8l¹—{3úi.ÈÑØÐtÀµõl®Ûw‡¤“i#ý^I=3ÆÇ‡ôÄvoÀl¬¨³Šì0üyÙÞ(}ñ¤æ£±º—üÏü¯€Çäí4dè|ù»SÒmŒš¤ !Ž+Oý§³¡'.å³ìÙß«ùxÃ$¼%íI&_¼®Å‹Ãï(sº*YÚ1>eϪϪøX•ÜY‚xÆ÷y'¥q“p-5§³¶°.M'õ˜øX1³)™-¶-˜Ó$Š7ÃÛ,@ÝfŒ!þ(ÁÔ5ºì”K2Pȯ5Ît+Y™¬-×(¾CU÷2D¥íü ÿ ³ª0ìÊÆöê%Ÿc¦y}iv£}(Îâ¢Çô3â ›Ì.SÏŸÆRE;/fÑ>ý,vbýôT™[>æqF>Ë,ÐM;èg‹ab|áÁAéÂ]æžQføÉ9ßSȬþÏàÞô3†ï$UÀØokFý5Ðë$X÷ZÔ¨(ƱÛe Ù¾QãÕôFÙÛ‹•ÅðÔûkÑ…Ð@Uè%ΆO}ÎWy_¡Ú ›uŽo)>>à ½$5|ÝÞyh$äo°ÃÑnQt®â&sXCCßO„Øu)äGÎ騺î næì«t«Ê·J¦­õF¶íV,ƒª˜RÒÓ¡÷ðÞ3‡Wc(˜v‚‰3žšÐâëW¬ë6T6TY*uYð#N¹Ç©Ýe±vÕÉ+î <~íÏbô½Ž®Ýzu¹¾Ú`Eæ=¾ñê|ÒCäVâÇYdµ\.Ñ6Y†»D'©Onü0ü(#h‰¨É­1€4ÕQ“µ7òŵR’ÑÔDeža³öûÛ*ÕÍ”:Ïò&X5"†Ð†A̺G mÜþ› Sí=[”­ÿwI[ä‹!þ4â'EaO¦#œ3‚,ý£K𲏣?©$=D[»R"2õLæá*q¢×'åè5i+-‰CWSé„ïº÷ä¶,ÓéjȲÛ/ì^*à*¶ô&cÏF áR)e4Ùø‰ÓnÜ>§Ë¥EÝV:öÃÖx,!R±’Ù’ãgót.2Ó‘=uEl…-häXÒ¼7‰ÎïOK${Óç!EûÊ_¨.jñ 'Eë7¸WÅbÙQÌ3¹öâ’Ý[¥£ê©ŸKÇ]oüê*Ÿ^<ª2Vœ&÷A¹ë¤ z¹«_¼Ýí^ÒpQÄž.g2µAA‹0K!(oXÜîRšämâÁ`ylÉéñFºƒYLªÅòúÜ«·EB{%ïèV#Ý=^±}x®·æhß6–ÿ­9÷¼Ä¥-cò]ŸK™Ä×ô¼è–Á†ó2V™ÇBûcÍ·cíïç èÉ»”’Ïý(ô͆ŒTÊ­ª,¿âWò"èÏÇ„ôÏpc+ì»Ì%81d14”?ÌW åͯÒ!&¦Ybe¼~nõ%ÔA–F¢>[Ð(ýÒ¬Ðãx×AÞ§pyÖ…wj•·Çþ±«i/+£<ƒê[°`ÞáZÓ{nü^gTdïûs–G<‹°<‘™—'½Sl¡¨ÜʹFÌ€eŸÞ6³†^‹fÅvÙ¾U×ZE.”T„€™sTv—÷8òa¨Ï%86•(0ÛQ´?²{­k‡<[«Ž£FÜy·ãþ*j8çÙ´„•Àö;c eÝ k¹f³æØU³[MÀ ™úi‘üÖÃb[S»TûnTbëÎÇižµÎ‰uzç½1òç™rT‚Ï«p±‚êê§sjYhÓxÈeŠã-ý,†có–{qoêpšÖå¸IíÓ—Q‹j¶™¸žT’ŠÚŽý›MãäÈÕÒM»<™ðn<6þ¤jþ,ëCœ-5¼¤-)ôÔ,7¨¯—#„U »¯¯YËÇáÍ€˜cÝèˆL8%‚ …?n’%Úr€åÉ_ò½H°ŠÞrÙµ 3JÃØ6 #^)Sm&zFÈèù£böí¥”ý—ŸŒ*¦9øW§x ,IOãÖ´œó@ WêÎ…ÎOÍ?›IÏÀõð5üb‹†éš#v¤1@Úö‡’ógªª¼*âg¬îTð¥{ƒ²SŸÎ„”Žq¾ËíùÓ¿ùi©[­Ã& BÛðá&” ê×mg˜¥è±…Ã(|Œá“óô}XJË­ ‚Ý!,WèlXõûÐÑ1´ÚUÖ‡q÷Ge=qã¼óçqÉ_¸ä‡”€i[ë1~HGߪžÊt°-µdF‡uuʾƒÎY©eææI£¢O>®?2OÏPæ õ ²mVAo%hÂ’cÈŸKy¡mYΡËûã¡=Ëì E°„/˜Uö«îV… ×ú;»-öÖ"Üú ç³ý- „ïÒÍ>="†CA 㫪/=[ytÝíÙ²ê…[ȸ˛&bΩðbWU‹ãxI«:Îæ¸É˜DÌ|p< ÷O;´ëþ0ot¹¥¹„e»@›È©½ônì{Z÷î#©äuh[0[Ô…¬Ð ,Z$ïˆ\ÎàÄS ñod]€‡iÔ¶bКm{aÉc)|]þ¡¾eF'·x!ˆFáÌN÷`»QéÌþ13%f«…™Œš- ùJ%ã$£QîeAx]HQ™,Wê3ý·Yb´ÒÞ~ƒ77Úš"+¬ÖáA~_:d?Òy³Bö˜º¬ö©´b‹¡RxÚ;¡-N¿çHU!P¦Ð½°GÊ ™âT_KÛ¿5äј³Ç¸Ïn²]ûQ oJOåQœ kåʈ1IatÛô#†½¨å¦î”iZÎJǵ²\°A—QjWÉúT"[TŠÞsà=-]|=NïFÛõ6†›A©VUªÕ˜Çöá– ‡îAf—¤ù¯éѼ‹„\ŒÆ¶¢ ‡/“N\é§.W÷>C$“6.©Š÷÷´ÆÉ˰b»!C G@±¤x•ûF‹ ñ g³©N=gkÊ]*k–Ô¦Aû7UæZBÕMK¬þ¢·”x]Jz^Т’øíê’XéÛ!gß¹÷9›u ŒyÜxˆ^·õÅ¥•èãyà5¶ˆ³zÌÜ"lªT1Œl¸]cß’ 0À“ií±ö×f¿Ë ÔÖòš²â ‡ nedÉÌü 0—vÒ“Ê,¨j:ißãž;xªÐrI¹¨ûêæ!b ½‹‚Ê‚úíffŸ¶c\Hž~¦|NŽè€Â-üX|Ä×F-mq=ójÅÝ›"ÊÉþL+^¯?lQet¹ÆR…P%þ2BG Ý$pxl_ÅúõøäkµT/ÜæXr4Ž531Z8AÓùr†ùR6ï1þ¶e±$Ž}ÓJÁ^šÛ¦ŠôpQÿqÛ“5yá*Ÿ©O$­Ê8MñÊîy3¾Ö¯g÷­™àÌ Ùyvñé¨?ßÓ +NµR+ϲYŠÚ°AÏë/›ÏÆúc±L¯¢6Ÿ–Ç.F 7w‹^§âx ¨Å»\‘°Ë_èóñV&ôâ:©“sñHŽ›ý¬iùšïÚrmÑ•€8³:‹{æŒ?—õÒrp÷q¶½2Ñ5Hy \ºÍ’bOL×m2Úßõ»NœôsU »æ»õÜ‹î¿?Óþ3öÅðCb’g~ Ÿm/€|ÉJ÷ú~kv)ÌH5´½eJÐ-1ÈeaÞ™9â–Œ_-vŸ=À™VúŠÃÞc¼@Ä©Öç(÷ý†Ä£2’E®\ÑÁ¥ *Š˜¬Qù™ôú{çèç r‘æo%°=ÄóÚÅøÜI#µVMŸÿôk^n0ˆ´úb®_aXËP( Üo¡J&÷L`‡{ì“à¯éTTbç¾Èõ¦€¸,ƒz-ê©ÄOfO%n½ª¼ð/HE 0¥u3g-&â.²n€ºÞ\þ[x¯”/J£[wòôr"8ß¶<Ùê1nÔÞsyÛòi79Ædf_Â*/c >ùhØo‰ç‘`…¢Œ¢†à·ðä9{tÌ¡tliïÒˆ¬›M/qJ÷¼Z©À§â'}Œ÷ï]S ›«D°‹\å.8a‹—&Üb_¶ Ã|qÖ”[R˜^_ß$ЉnlˆŸ¦HÓu¯L+ÐÙšfåX4u/Ä`ͶèMQ6Y{æf´Q¾¸@rºwõ!®ñ±©Í9šÇ#„MAˆDàäÚt6>V¼‡4ïâ ‹“ØìUëUmRÃöë ûûéÖ™3‘ö»”[R]±Hš(.b\ÿþÓ{ƒ endstream endobj 270 0 obj << /Length1 2549 /Length2 22421 /Length3 0 /Length 23867 /Filter /FlateDecode >> stream xÚŒ÷P\ÝÖŠBpw·ÆÝÝÝÝÝiÜÝÝA‚»C€àœàî®Á%@ÜnrNrþ÷ªî-ªš=¦5mínJRuFQ '3 ”“£;#+ @\Q•ÀÂÂÎÄÂÂOI©aãnüW O©tu³qräûÃ@Ühê’I˜ºƒìröVv++7 €……÷?†N®| SO €"@ÎÉèO)îäìãjceí¢ùÏ#€ÆœÀÊËËÍð·;@ÔèjcnêP4u·:€ÍMíêNæ6@wŸÿ A#`íîîÌÇÌìååÅdêàÆääj%DËð²q·¨Ý€®ž@ À_ ”L€ÿdÆO а¶qûG®îdéîeê €ö6æ@G7‡‡£Ð"¨Ë*”Žÿ+ücÀø·6V&Öÿ†û×û¯@6Ž;›š›;98›:úØ8Z,mìe)&wow€©£Å_†¦önN SOS{S3Áß'7H‰ªLA þ›ž›¹«³»“›ý_)2ÿTeIG q' £»ü_ç“°qšƒÊîÃüOgí¼ýþ–6Ž–%aáá̬éhã┕ø×$‚ÿ-³º8YXX¸yÙ@ÐÛÜšù¯ð>ÎÀ¿•¬‰Aø9;9,AIl, ð~n¦ž@€»«0ÀïOÅÿ"xVV€…¹;À heãÿ;:H ´üƒšïjã ÐgÍ+€å¯¿ÿ>‚ÆËÂÉÑÞç·ùßýeÖÒRPP¡ÿ'ãÿêÄÄœ¼~Œ,F6Në_CÆ zøß0ÿ-À’ÿ[ªbjóïáþˆ(ëhéàý'Pñþ“‡ç¿cAóïÊÐþ—AÉ 4Ë@ÍïÑ7`ád1}°þ^€¿]þÿÍý_QþßFÿÿHÊÃÞþo5Íßúÿµ©ƒ½Ï¿ Qöp­…¢h9ÿ¯©6ðŸUVZØx8ü_­¬»)h=D­ìÿ[F7)o …Š»¹õ?3ôŸ.€ÂÛÛ8UœÜlþºlŒ †ýháÌí@ЍW«€ }ú_JIGs'‹¿“ `êêjêj=qüXAjôþ{´ÌLŽNî (½€¥“+ü_åâ0‹þ%úq˜Å~#n³øoÄ`–øxÌ’ÿEÜ,f©ßˆÀ,ý±˜e~#v³ìob—ÿ@ì ¿ˆ]ñ7±+ýF våÿ"»ÊoâSû@|ê¿€Yã7±kþF v­ßÄ®ýØu~#»î/ÈÒô7YšýF Kóÿ"NÎÜÉÔêÿH88þ’88üöÿk˜-þ€ ZGñŸümJ×ò7™[þ9þ‚6¿ñ_Æ¿!'û_Ðóøé<\ÿ2±ú‚Zÿ>>¨€Ö>ÎÖ@Ç?,@²?Y@'¶ý‚Še÷UÄþ*—ù€Jñ;2'ÈÕ´èAÉ:ý> ÈÙéÔ dœ«AÁœA/@G{ åïòq°þ+uýŸª²ƒ¸œ® Ý¦\Ëlœþèè+³Ëïnƒ]<œÜföÿÃÂÎñ[ñˆxÿÕü¯˜õ¯ÆýÑVPQÝ~Wäät°ùßYâüËèùG/8AAÜ@ï–ÿfÊÊÍÞÔÍúÀ ¤~Ó‚®gfwkWચ»—Ó @P=ÿ€ “yý1m oï? (¼ÏT.ß߇EòºþCõ?Wœ¹‡+¨Aî¿„@÷ßðß_4€@o 9üê’“9¸mCxç}(ãÁ”à<åv-£ßªk—Ç#2L*mmNè–ë­hêhêÆž$ÍÈÉ‹ßi[LT{²jÇ“ÿ³ñGµÙƒø•ì¡é’SÑÆA"8BF ‘Cÿ­;ˆ6ð¯r”.<È*E÷^ÒÞƒ•ë‘Kª‡µ\òÏ•sŒqš B>-Pšå.â’A»3ÁÒ¡_z£,ÜÜΣçO¿‘È}¤‡8‹c/õÓÛf‹XôݬÒ`sëÁ£ÀÓÃ%‚¸AŸ˜¥ò;N“ÃYö+/ÝZñn(%ÉGbHß`De:fË®µQ‹ulé¯÷œXífÝ/H„S aì'×W´`»’)cÕvÇb¸×³Û‰Ž»-Å6;oµz-mÓ ×xçß HºÖ§Á­½~OM.›£cCŒw‘éí÷£-c{½ÚŸ„… ­¼Xé$­õc6Öù²‰Ò¡*Ý'ßõhe1QÖÿT”{PÌ×e©šHðôãÚÂMY2¸ï¼sÍwÍ"cǼƒHÉÕ˜Ó•gÚÇ=¥íeÀ‘“÷3דÎë‚'&òY§AŽ‘§ŽìgSf™×J¯á’U¡ °úþXÕʘŒ³­ßƒ{ºœ½ƇœŸX¦b£´J1«õº“›ÀËdðp T¬bÀõýæ‘”YµÀE—ÕAW†4؇ôyö÷ëTù–ð@±| ¶9-îøôÝŽÁ¥U¾{5•pÅ^üôÀ¯'GhS¯®äÃNŠ %ñÖì’©5åÛ¥i‘Rm6o’cR‹¹š=§ÓÀ}V-æ#b‚"õ¿²$õê:ù>Püx˜¹¦¨þ:;Šåµóm‡ÍЩ² Pcü",k=Žâq\(æp.Ã×ÌŠ »’f[1âÃuÚ³ö @$…TŽ«àÈ©þÓ‹ª‚ñt¾®6OÚ÷¾œ÷Wp„:iŸfâ¥SöÙZé±iÉo_€œÁ ¡ài¾è€eÓ\ÖC5B¦xvâ0 Ò¢½Y[Rí°aFɲšE÷h’u 3P˜¼•ÌlyÓŸkßE©"ÉVÈG¬%J«.¦À|(P‰}ΉQ)ž'Z¼u—kÏ_ã7Þƒ@CÞ¾¢å(D –Î㧶┄Ö; C³o¬}ùÎLô5HÞßIÁci>]më•ðc’ϾâñWðç‚z£®;S÷<XeÖÓBæ\0©+’”/ì>Ää™{æ(ŠŠË3Òƒz/›úUoí¾Ó¤‚ áÐí+>“õÉ Õ!W´Ä´ÅŽ´h!7ÔGÖmð /B¾}ºPCÇnÅ.íꊆ¨ìRÉe:îR€œ ö¾‡,Ã5ÖŸÒÑŠFþþ¥ZP‹¤¡òvãVðcHr~]Ãs ²N~lMöÀ¾J ÿ`Boï‡{T½[J4±ÄábÇ—ÙR1õœõÅÓœÄ2®ËŸÄÒûÌJLW¹?‡^› H?læÉï·Y9R­ÊŽ}¬¥Å¿RØ9=Œ„^£Ì¤œ·mÃÐÉÃóy‰8ì¬?2Â*_Ð@p[„LjûQ^ê^£Ðì)ãc·VH¼=½UMoîšÙ\uÜ&iëqåbÚâ¸ÁÎ˃)‡*+NÝD à3ﮋVi막R@’›‘Ý"7‹ølGdß½°0ÕÅG%|K„ y¾x†ñh—•®1¥E•ažJݱŠÒܼ² 6¯TÉ¢+V;Žö\>àQrp RÊÍ?äáNU&K”ãEEqÇ<#“ƒ¾ÍÙQ5ßë,7Q¯Ni¯Í„Qõ±„È^ñ°²˜màlVç<àÌòðûÄáy†|EeJóÙÁá}˜~êx·ínº³ŠzTWæ":‹N3és«¯°™y¥Ð›Ü+JΕ€ø¸Ö„ ›ƒd™¤ÄûŸùé¹ J¼¼ñÐuw¥á69%k&7Ž“±Ð ó7ÚÒ¤›ïv.¿Ó‹"Ú·`Ìž³šlðx0]{Пﭒ=^ ñ_2ùŽ6ÍRÂ;uÔnxCŒ°d¸…¢-à¡k³JyOŸ/§o¬^>Æ5{kùÜ4¯¡Íæ’’ûâ¦röüÙ‹”Kù1óve°œÉUŒ÷=–c«®xµ8ëã€{¥…ù]9ØŒRÔB¬|xÁ<qÏÉB²}ˆÔ# 4ÂÊ¥ë˜2pþíR‹×ª¾§àIÕ¨Ï[t1Ce…©{ƒá•n=e¼ÍÒ Hâ’&Zß‹¬·»F(±T“§¤JTºvgÑ‚(*»ÈfÙÙ;ïTx—yÏôâÜx£À©Möª‰‘Î\×´ø”RJÏFÜæo†SZHD -ÃsŒˆ´7#¨Ø8¼Ð+ì})Ø´/0¼6#†Î”yÍÞŠÈ”Ëò1Æ&µûé¤Ð 7™ËL|*?¨ÖÃE¦¨¦öHÑUnØh`_Å)n-Œ‹MÂJ"Õ)5•Úå¹jaéÕ2—Îô]K³ŸGto1~èº:ëWKcïVt£TÁOIkJ]¿~¸œ—ëYD‘ù@ÝÐ,®§*2…"»ºíNY¼ÿ––Ó£_NË=@Õý\`=嘋X÷]—zaÝ´ï‹FÿµŽkÐÂV&³£±c*„œB!6,Mš|ÃQÁøL|u³‘Ÿ¼TóÖú¥‘]¶Ù·>Ç“@ì& µÅ†°ë¦%š…àmƒ~ÏÑèž» [í‡EÉ¿X3(‚0\DßÎÝR1û†®:êmAÐevVܹÝ\:ecš‰ø}ôYB€%'‰õÃ1‡eÒÒûrvA|Ȃ㈰mæa妒aAÁ8kp[;µM¥ àü½ÅÑ¿-0»‰çø‘it í ½åÔ°¯O¹gÉŽqƒ˜oÍXT~ä/6aÏ…NXèw'×7ËQý:à¦Å¤ê†Wùï2«ìÄ–¾W%Ѥåz’²<·ÄH¥„"nn=žWHn™êG‡ZÞ«xsËD`ùŸÀh?7ñ¯K/a¢êb±‹ýâ\½~>¼ß‘1 ›ÿ¬}Ïš6•ùÜSéž·ÒYˆ[®CìåºÙâ<æ‹ͯ o,Udw!ýš]žÉdi·ÁÖ>5 ^C.LªèGŸZ›f¼ÏÑï¶}·Úå± jbFDjb¦ö_O½ –usù8?ÕBnž¯c^ÄÀ`ÄwT£4•?1Û–Dl®’|3I9?• Ò& ©Ü_RÕi£€–Ùút„2á.[RÝ 4²È´ªKx%²âˆõÙ5 Õø×™ãFH,R·ò󞻨£’cZlº0”ñ7l#ãˆu+̤æÀ<ì¡þ8⺙åòbQß.¹€_z7Hj?¶Â ¥ÛUuþ‰ÿ¹(hž¶'òKîCséOæ8~u>{|Wóô˜yæ¤ÅÞ—Pi¡fÓŠ¯Kïw˜-Ø·Ò²OLj÷Ȥ+ÒЪ¨-ÝfaHt´5_žo›[ZušãŒ‚–)m'‡Ieº/b•eÞ`G'ãIŒ¾ÄòG5Lý ú¸+×êYˆÜb¸AO± S‰²N-n-™)®ŽûBÔñc¼®÷J$¹7.Ë´ª)˜3S4È<&ò»½“6x“"ÍÏhW°–Oäë&Ë3Žº~¶ë&ìþöï<‰jLÚ©eí ^‚¶ëIšž oæUúÆÎüRŠ %k3.§œMBV¬O•í Lr[γ÷œï«y<|6(\¦m^§zÀ[˜»ôÓsöú’¾l.æ>Ü÷œ!k2Tƒw»ÐÚðÉü,èVŽX§©1*‡|'’Òê~u™Æªò8Þ`”æ‹Þ¹ð ˋȖÑ3 LÐüá¹ÒFŒ4ã»g„»=.çC¬¤±Ûú…]·Fçt[¸ÓS.é›qž=üŽÈfoYFd#1Är:ìÅ®Ué4ûæÅ“:xØ zR}¯O¢cbÕÞç™—;»Q÷fI¼±zÐá{³Ñ—ZiNcél˜ûæUÖ²'wæ ¯Ûq»—ðÛïëY«£Ÿ$„œ¡é-+­x­)ˆËÁ E.LVŒæÚ¤åoù9?C—x Ÿv@î˺º\ˆ–³[Іné¢ÙxT÷mî÷ÿìš½8›C×uEýN$qsË—·fA £V ± HuGC™˜^¢— Åè×NÅ šÌuOHæ÷yá÷B™ úÚüT0 ÇA°«;y*Ž9 òF9¼Ðþ“yàåŸÁâH‡ì‡\k/¬Wá{›:†+ÔzÄóƒÄ™Qa–j¤ø âBÞD`ÒTNÙg’Vt¾ùuÔ­R¸Ýs¼cÈÈàù=]ÖÒ‹êØN¹’™eýzg÷·ð<'2¸¸ÕOšp¾³×V'V“¦ûñ‰MR³™ý:>›­•U3ïé:ßXݾqë°ö%r”ËdMe/ÿÌ2êqQ:5ädhþ¸D¼+MJšá:£*¹Î”qLÌ{×^^-ÊMöÝO"RM€™ÍýEqpø×ƒÛAY𓯬ί$Ë⊜YˆÝ·é—'zŒÕ2ɳOi¨#L';¤=3ýdtrëêÜÈ=kºÄµ°„ÇP¶ëHDTs«¢ÇrˆôŸ£¿¶uÀ¢¯¡ Þ¤)Ppy6¨ãk袽'_Ç­QHã˜út~$œ 6M}{v×ÿ$…c¡%­°Ä@„í†U%ýZ²mÄÜZáÒÔ9z nýa¥êáA¸Ê7\¢Â]‘ýˆž•¬¸""dK+ mm²¯Ø-ô¶\4ú¸Üþ¡%!·èŸÞÞ®ƒ0ûIÜ5fgHcDtäÁ÷å]FqRŠJ?T Ù|§üí<ùÔG‚d©»Gƒ#ü—;£…d"|þL¸ÿ5€„Á@(’ŒÇ×›êàËLu®*ûˆ¿7yk< û5‰ú_¥­ÚuÊVw¹0ÌBc…Êoç9D®ZßBúð¼ ëÚ ;…hw/ò{› ƒís 8ºQõ g¤øQ”¨Ê©1l*b ê•T{eÊ,Lþš!éÖàû!²"us¤ô†£®Ó»ÉR/PEÛa½­½ÒÅaÙ&%Ñb°Î´Ò¨ñŽÖHj–‘8ÂÑ+à…!ZO©UkFüWí‚.Bœ°Ù·oáö’½sÎþËŠû×WÝN“©@ãlïÞ¸0Í<ÿXj¤æá¨piÍ%T.Y’Ìð£[¡g¾Q-ã§w£B‹e¼t²,ØóÍd~+X°ìšk¾CW£ûR9–«%7*[åc´’‰Ñ<(¡Ïš¥9^´5—V1ãX. |Û¶ä¥mµXÑÖ0.Ã¥9nNHŒm"IðòÒÜ {dÕþª3Qï+z?}Ýü#BŠ›Ô1bJù‚-+:?õ‰²_$,]ª#° â}\Òo´hYI~–Ë1ØhÄ&®&ü‰m~¶†üü€â=îÞmË:;”-zäúƒUÓ3[óŠ7!çÙÇ Oâ÷³)b:Uë[bb|Æs¶jx“þÆ7Í^>BÈеuasú[Êíz¸JbꜼ‘÷a½àq•ydýK9VÇß;7÷Ì*´a¡×iè(¼ «îi±b>$ïEa*‘ºV÷ëú– ”FRḦó‹ZÈŠ˜0G‡À3ÚÀ¹| Æí¢L¼ÄäÈsàÓM†È3â-oj—ª¨ÄNÖˆVJS‡ `l<â4ÎÌMH^°­ÌȨp÷âÔÿÐÝ×elE—Tü¸l˜5"ö~7ŸÌðŠR@µíp7ðÂÚh‡xïûÄY]Pñ0ùÚ°ŸE™³×l8˜Í£Í ‰,¯kò¤¦Ÿ£ïx—ºáµ ŠñÞì÷Í€NU gÕR%5ýO1wÊN%/ÚÊ\•LC;Õø"¤GËéÇ¢Fø58Gò5â-ü”îKÌP‡êô­Ú½Hú­…¤SD»)1r³yx’@éIþøJâ‘LH¥ô9©N¬ž_ûN÷Öƒ+>àâ-2쪎»ðÁû ÈÖúØâTHp_óÁlòý__¯ß›Ü9¥ñÅªÜøÛè-àˆX£Fnt‹ tÑù™Ëæ dÌ[F¬SB Q(¡“‘ÞÈšˆÎ°•Ïz4Gƒ´_*VÈ€¢“È9Àµ/¬8Ú âåå3.íÁ]Þ2̉¢àtËà;ÒÕ¦Ž4J¡»bžÇ§¬…MÈD¢Ÿì œßM=A~@ÐÒû²’K·ÛÁ_íïå=ÈOé[U-Ÿø€tÑÅ»”€ 5ÁímK&hâIv~d±Z›»ì‰“Cb Ÿ:Ô~·6¶A…üR[çЫèÓ$OœþÀÔ´xkkqM¿Í³zóá#Îc¥rúFNÓá´.Þ  .1ë2ƒ±Xpn"»ZÈ®›ê(;ŠâÚ6˜Â qéR¤PÓy§Ø2.é§JPë5_¤–0ÇÇE<1‚¦†‘"Íxb“Ç´ŽÐZ—› 0Þ ßvv÷þà‹­%k$¬’D†É¡•!s©6Õ ›×#û˜0‘bú4î¹ø“§>TÉ’òÌgws|NrHpryV"Ý:ƒnºÕ\¡Kk™Ày‚ù¢PrÅ—¼¯D,¯?£–‡9 =%`Çí”>eµn€uÎåêÛÔÄ?+0ÕxÒ73òöãд³¸j½Ò1f¬(å=™¡–¨¦ß:Š.Cl•ì?ÓUé…±XV®w)™]1™…zÕÍT?|>Þ»+þ§6ð£ Ö«¡¾›æw2ÓW8¡S¶Äk;•{Dj1Öî 0› •®cê kGlW‘Gê;¥y-mï½[9V$~ÒÙB·ÖB“ª WÀàN†uˬaXPa‡” {l³ó";+g׿Z¼Nãÿ@̾´4¦1F#ܳ@mCJߨÚÞ™þâÎë%§ù–gÃ?'é*ÔpÊí¾£q_Ú“¹FŸüúŠUb™Š(QC?÷CëÈÞíkÿpîŠòׯœx—­Ø$‹oý²¶†8 Å ‘Ÿ…<×rod³¦†1'ÐÔ5 ij’y(–cÎàF¥06¿@¾'RCÚ@¦•¨èùõÕª{©£é,4ÜÜVCÚj¿UŒIs <ƒ·,YöR£æJ¤LÆZîgàuO¾ë'¼&;¶oCáÄÆ²ººJ~ž?÷Bö!:j{`!œŠøª"Û0Âa1”$ÍôìG«ïøù?DôÒ¬Þ˜U0ê<¹´µm-¢‰H²’P9<VÇÉP}‹"ëØŽ.Û:€e®©øÐyKZ¤ˆÉ߇J•@£jÑ™ûЉŽZ[Öò~Rf"Z’'ËÅ$‰ä»¡žôàß6Œx‰¢Ê&¨“´¦öÎïäaÈEHzl*Ïãgè0ø Ü*-K  ŒDMë{TUG.Mò EkÏ6VB$f‹Hú¦ß×ÞÁ=EµHo°Pž—¨ÝãŒu°f„$&]z!Ù@äÿ"È ‰.öTUñæ‚Ièeˆv·¸«š¦¢ïdJ"ª:4¥Å“cêöι*©<¥)¶iÆóó!½Ød…â&û?‡ì¾nD}†09]CsZGêÞ V¦wšÚk¬¦TÏûÑ«‰´Cq¥Å¡ð^-ugõ¾ïwá[-ô\!ÉôLï/’ÚÝ 'öfŠS,ƒ·^RËíÞðeÂBI‹GrÔHò™|#Tõ2­V:§w®ÁKÅÂo›SßÎõƒÚ®åX¥d³¥à‹ŒQûZE'Œõ©Ñ,±æ·Ó°÷Ä^ÿ¸7 ‹x²ºå¾‡+lõùGÛ¿®ÇŠ´êgR®_ z¼É|¨&ËwZÌ>ï^›3Îî/¼Á(úêóÕ‡cñg§Þ²¶f? œaÖ¼oÛŸÆ›Ä^A dóôeWûU“­Àüc~/ß…Ä|G/ô×B•æ×fö\väo aDTáÒë̺ß!2£WdÚ¼ F¤YŠØêh½%|2išÖ¼Âæ#Tž›¡ ;Íü›pŽˆbBÊhÆ€D·m‘û8£ùäL vµ‰Hoôª)ɣǬõÖp{ä?šRƒ²¨M3VÍïa¹ýâôó“KƒaÛåv•/è­Æ†z¯ýÀW]ÛÏÔÓE#ýÕxp<¦žçÄ ¿­-ÎC|V€ÖjÖ‚$·ª<Ê·öË0ÀÑ5IIÃÌójñ½~ð,ñuÖO¨ËÒ½­ûÛ@¾Š€FZòüæú=÷¤óœ™Uô)*xÙšv¨yßWl¶d¹^46‹)gª`a8⯌õû÷}¢ÐÛËvÐëù.rz¡‘$,Öy}%,©Q‹œ\y|ݵü qvç2! SBœ_¢[rµœp¤kÒTðaª‰”•„§'wÉl·“ÓR¹þ C(>%—ÇÊ(™çñ¯~äŸ=¨[Lï|‘€Æb•w0 h<Ê8ñª¨ÉÙe^P‰¼ÁzQMüL׫u?$]·.ÂØóJk·t'Œ×.1ÏsªZ3x¢õkA8Û‘N:?hb“c€OUܯ±HŸ¥?o³¼kTPþÒ÷ +ðj¼Ä•a(ÜWe¶Uß.½`î1“pÑåpÚ&õÒK ŠŽû‹ºb™ÂÚ¥Y¢àD;¾ÜÎU¯nk“„gÏ„ðò8òAÝRžÙ^gD¦uIkg…EKsЧƒ®Ïêo”¨ô«Qyœ®ú mjÒ]¡¦×ùÇ-(*´òøø;êÍ*“â•_/»–ÝßëÿšÝØ]ØÓ¹~±#‹|ÆqÇA ZÙ ¡ôå›@›Ów©ôïŽIñ/ïs`•˜"MÐßÓ¶T 9QÀ©ÇÉikv‚]u1ðw¥vò ú1ü"6æ©_L÷Ã©Ì ‘ÿ” ºûLkÚ¹Ï'ÇL,®€Ýg˜*Æí áþ»œ'‰óÍ­Sj¡s­ä3åóŠÉrÂ/Ef&W8‚‹pÜçd™ÀIr°>‰YÍ,ïïÙ±Öú"YîÌ×|æ•Iß#š1®%j.£J¯x¸"ÃÚIŽ~í²Ñq<óÖm¥Yp 6LQ×<µGál¹qF9iÏÑí¾¨{+V²ƒâqkî:Æ3NR|ÚSnÚ&±: U.`•±ÉOL¿ûÑdæTjÁ„u€[QÕ¡5¤jkû-Ô>ÉçPSswS¼ÉQõ XCæµDáß4‰K )&TD‡b¿K*¿L½ÆôñD¾˜îÈ–hJk~·Š{ŠÊ‚0ƒ<{Ù.´C\¢‚ÃÀ•³ÍßènHõ¨ÞcxØÇxIÍK’Aö®9Nê[‚d÷Äùä§QÎ’ùp/úã-~®u‰5)yã#(ýܘŒPÎ&ÓÇQQºrŒÊùž0úøl¼C#ØÊ¹ôr dó—ãmhHº±’‘ <ñ!TÐõ³kÜÌí8‚ãÔ‡° æSj¾e†…L%°r’•J²éçÍDš”òÔWÍ݇ì¶RgSZ×d¨±Ìènщ£yg%{i oêÔ,sÞGèã}ÁoĦnMy;6£¸qºËØÒÙ]"_æì¨®Æ;¸ÞïzÝ0|u—ˆrEn´åúe)'ø]üL[>¾~ )ì’ÝóDçû#dÙ?é…™6#„V|FñÉKhÅÚVÎâ äN~ŠVV—\MCšOþg¢’8ÅíõO8‚ª 8¸TRˆ'ø‰»«—ïc:¼‡&Šz ij—- '_y_šdýæÀ^›íÉ’Û ;0g•–@hr vkA~á–¸œBBŒ›Ð!jÁ}gOkÆœ±PY°Xˈµ'ädK ^Ò…úYBl¿™ËÕ|sÊè0‡Ä«Ñ<<£¯õZlÙ<¢ôÒvŽfLº >¤ˆöÕW*0|~]+¨-NtŽXÑÁ'Þ2è¹—Z­ñº«é«ZdCÙ™9Y¥ñ3é.[6M¹‰ß$:’ &ü‰8Î}?EŽ¢Ý>F‡¢z¢ä™ÚæÜ;SçÀ¡¾…“ÖWÊög”— z3¦´3+üþ{îªSù¬ö…ƒ*žÃy•ìÜ› 'H…'ó*l%|éȰmݤ‚­Œps¹Ò7#åé¤n÷/íAY÷¾¥ZWècCl—ÁÔ W:u8…zå‚ t€¨ËJ­O† j`ñ†›=#å¯1zf &ªŒ ðýXÔ0à h—FMj¼®2O_(Bß…Ó›>dUˆ•òM t½a·Í™Cȼó^gŠÎìf¬Yœ÷w41<¸[U˜DÙF6u±xÜöß7ÃNf¯ìŠ‚_ö¸h®xŸË_£ î£V«bNq벆qùRðÄâRB;sm*£Iš/ˆ–¿|PM3àÚ.$C?^ ùÇ“×æKÒ-¬A3‚¿Ë°¿]Ý$ï|AÏ"2¥©Ùwmºc@xŸÓãújm~ ö‡$ü†¶ë6m`4[ŠÍ› —u›¥¿‘èíNjÒ˰·-Ø Õ”Œ6¸³¸r$Ó™Ecæ‘=à¾Tk•sF…#¤UKÓb'Êdß³ÐÉrU.4–ClÙf &Â?,“†À‚J±"~Eñ- ¥ŸÝΪc†£ð*–á€d:(+·ÞQ>^k+æCäOÕzž„–÷N¨V?ß'Ä0+d¢2žX5a›$_”³šÁMAã;NãÈF8ë+NÙ6^Õó|€Z?vÌZ+Gm£ç#¨itWæ¸v_M ¥¶$üaµ9ÆwèØ<è(Vb°FUÝwS•:ûУ¬[­ÇÜŽ¶ÈŠWyâFÆýÈ\ƒÌžm0íPãrÔñlCý“ù•Ý2Ã[¶éK<Õš}C؇OÓp×ë .VæZ„Ãή‡·‘ÍÙ7x˜Eª:Êy}IZö8Ï ­nãŠÀ:`Q%¬®Ø­ ¾³U+:²3$"ÂpÐ}¨ß}û†6ŽU^;šdÐ;Ÿ³ ÁÁR^kF6þÉÝ—îk=ò¼%Bë™ö.6×a#ŒZ @…˜<s—»ðcV¼{Älšj*×ã /~ ®å«UnÄ-^’kÜQý/Íf?Ž=[uÿ±»£º6f4*o±œTn rˆn¼~l²Îè¤âÜpwñ—s´ÚÅ¡F€æ„íjCBTRA|œ£xMc,Ö¡ÈÏNTŽÿnUø(a`X,ׯq±õš³××ZU¥ü`ðì۸ɾñÐØµJå+N$†kçÎÖÒ»›¶4~O\jHJ£'cùJÕ}VÀÓuvH“.Ð#,.(æFÝŒÒ7íp¡%vë êÓ͹x±ºíµéŒ`‡ëƒâä>Q‡ÑfÜϲe›¬BvÛ‚-)Ô•'-„tÛ5Û åï`h.EŒ8õÅšJZ‰,ªëêã6Öm®Sœç^ý¨¯ýwªØw|3i¾ðxÜ(+w+tbP(ʼŠÉ¥pžJ¥Ú^𺬥Sùm=èo£€·‰/M"F•Y¾o‡®€ª!6}í =ú:éTm<^Ç7!Ix„Wà ÙyJE¯ @úh–5þ]“¥=|r ˆñ=Ë®‰½4{|=ìЦ†*Š­•3¯›«6#ó:² «õÀŽñ§¤lú‹»ú™áJ¢ëm™³ ׯÁG¸!Êð›Y:‰¢ñs;%»»šTQºŽ­AG¸ÙtBY3 ÒÍõÀ[J›P§Yø¸|/}v²œµ%ò€W« µãT M4Š€—á4˜+$„DD«Óî­Ä“ðÊ å§:Þ„#Ö$Ê ¯p2õØNpZI_ Ù“¨£Ÿ™!r*¸•SL$4Ú¦ÂÊÀqäD ØÇ%aJC|}'Š£2¶ Xú®Qo£¸ÆÂ±¢%ç±·tŸË/ˆ•ôvEO ãb·Â|´àüÄ÷1ï|X¿ÁÙ䨂y‹ÞQ{WþFÖ5¾¤%g`£8ù@™Îè¸H5>Kî‡pôZúcMòîbVYã÷:†Ü“Ý6ü)A…æ ØF3´8VF!½çííÔ‰[d'‹e$RU²ÃÃ!0#éÕ+1Xp ×V?ñ¯ü{µI‰»¥°ÃÑy7Z,Ÿ£¡ÒÎò 2 °TóÄã;[øl­#äem¾E 7Á&à—x;éyPŸ.7AÜßÜò¯#Ö´NVfièHs¦êhДìU¿Ê8ËóÉ›;wz–›@È…9N\ “+1~qHwæ‡;ÚÀXÇt´W}W{Õ%à# ÿÀïŸ$8*q³¥¶Ù¨Fê g[‰apw_±'ŠiŽ!î{ÿÒ¦¸D¦³…(*®âàoÁ'ØžaÅÉæÝ$þX!x÷iq\þ¾&4!à›ÏN@ɼ"û–¯ÔI,{$©õ@—fµ˜3 =鵄ðÙ ðƒ?Y™ïFà4ÏmÅÚx(K÷,3ìâÇ£sAþIfS…yyT£j¢÷*ÄÑÖ:ŸZ^×¥ÃSœtbå%õ]ËÎQʳ¾J±-C„/ rµ^&É)±I‹³9j¹î æÂèü¢•-ÞDf¥ôx±šF™I Û§šÔs¬îX¡m¥çYê2èkê”;aZ¼Ö³¾áªÑW¨'€>ÝNw'~¤2Ó²@äÐQ“ïd]Æõõd¦,¢[Æq ‡v$enR°Œ’Tžá}wº•TbZИߗgàЅÓ4ÈJK|'9rOM…ËiÍÁ&[wŸZhe]<"k°›;CMA"½¤gŠìDã¥G‘+§¦#œÖ–¼|sõû@9Ç¥ŸV&[ßñ¬Èõ°,åÀ>ÕHQ•VâšÕ0$);h» -E\àìõ#9·Å};?ìe×L…Ù€D¡™¹U€­Ò¥K“æ%§–DOääbL!1Ÿ~˜èÝ255“bжc¿•:Ò'Ìa4³'+dW$ é놬^ì»p~™’-mÛ ¼G·ô»Z¢ èK ­h0>A=O LD;ñõéðH†Æ¯MW ”Íî§Ý³[/ä\r¿z/(ðwß?I› Ê´fC=䘸|òµš<(mبhŽ3j ›'/Ñ$q|Ó!ËŠa@ Lã”S¥ie'ÏAÛuÇ;ì6b[R˜¤Uˆd;|h¼Epûe;¥.ˆî¥ÀÈ<<²Á–à× çfÆ¿zºÚµéÂHè/×gÜÏaR㣂˶)/ƒ¥¯ÎÇÛ>èßô±a"y`‰¯4_ t¿}‹éª˜}Ïj.¾lÞÅ=8ÉT¯æ7Ž‚t)ow@!ç=ú¾êÑÜÚæÝ‚¥¦ßUݸ'¾Žê9õ÷cCd™ <ôþYÛp¨ã2g&©[5ÍAÂA¯ï龨_Q#Î{ˆÉ÷¾!ßTD”eÇAEb’.@wH¨9Ü·'|Åb‰NnBÑ D ;ì¹'Ò¶zõ};NœOè¤Í†ŒCXÄóû–ë³@ äQ¡¸B̈‡—«#„=᥷Ääg=Iè–,{Ö!…lIbý8KÄÝ*Ü9bU°ŸŽ/ŽïAâüíýÈð™Äš|ŒXû쯘"ea m´ÎÌ“ë÷í9Sl.e é©:‡Rã.• ëKÐhs9Ok¹„ÄÉÓDô1Ø…LßÎ`ƒ–í>À¢²Â) Ü øÂg6ónj)žÞƒÅL²åÀÝIª#-ç8æp$9C‚ZÔsÖt%]MÀ½°.u‚О ;– ÍìBÊý“Ôðè‹ÔØÑ0[«Ÿ4Qó}ʇNÚï¦(╾÷â×(Ÿ6™M°ôÎ…i…»á$"^¸@¤6uÈ¡«/éf^XŽ8ý,íŒ g–Ä]ûv‘’Ê|˜•J’lf&ìâß_:ÅêŠjмF&üq‰àÃCc+}ñ¢ ì¥øËi¶Û¼²LzàÔ'¥KÜIÙ7\ÝsÔ|aÔò»…Twñþ¦f[[JW÷D<”;W]˜Y‹žW²|݃äDTY˜wþErʦŸê4ÒáL9¦†¯%ZäOeý™± Ä RØ‘!û— !æþ·ä)Ä]TÂù&Õèe`xäÉ%˜•Z\½8[zHÒr¤ë³¹óŠÐ“x® %•ø[cwW2´ÙΙ©è'ÔaÅ[PN×õm‚:¾Ù'šž6ø^.Ëýè0×åöµùâ{øðÚY¤Àp'¼»ò“ºç铘¡½¾Ù !©~ã/‚µéÓÍÄt¹ ‹ï}Þ¯z/$cu…q”ÁŽáþã†yÔ 3o¢§¯7LÝ·­-Q×<‹~ïÈÃʰÀ(Þ~öGÕyÖ·/-º=EÓb'@<¥nIm, ÕµÔÔhUžç¹”ÿ g«þº3–B¿pf+ò“ †h¶$åCÖ©C'BUöù°š˜ÃÌ©ÀvŠ E´v‚ƒ|Œ¤8‚ú‡ÄI臓Ú÷Cp®·‹ÂÃFˆ/rþQ~Àa‚à»|Òh!i6A­éëÙe=ìKg!Ÿ}¤2ÙÞõì!*|w,NDmf7fõ0`CÊvrœTíúÐÒœ@¹¦Øž|`"—Snœ’a¸KœIã0@üxjH‚ A€m«PÀÅ(ÌÍåÚO“TfÄ4¾ÿàá”;PhûHÁ×âfGå|H-po™Ì­pŠ]Ë‘WtAúÞêT;g"þ«Å>iÖ ¯bà·‚£ëiCE_JãÜ7»¢mN‘uÔ—/÷`º§¹<Òñ¼-g C¡^‘›Ø£¸ô4Ç便”¬;'ök'Qª™8ç•jˆãEtPÍæxm€Ï2ùÅ ®ü¨jc ”Sý¼ŸŒ˜Q1ÕAÜr›]Ç)æ?уöª}¹=°à¿<Úº€Õ”á<lKî²/Uh°yµÇ’×o%MºÂ#a-ZSÐó*ER?„݈^£6Ÿ™çMhÇ ~¹6H8‹_lÆ®· ¤$ÿì`Šú:ñ‹–#ãyסÔN…”˜Óú¨Ñ…IYœ¸SôŒr{“Çu—Q¿ 唡ލmêîÂ¥+“kªV@åá…ý+UÄ>¯Ágã캾÷”1äª³Šæ7ۼ扛ƾ9xÎ|ÇêiηVåàâ}¤ïßË‹í†!¯µ”FWðT%é:Ñ6³úÕÕ_8-×Ðà“Æ.˜&M,àŒàdªjœÜÊc¤!`|’”Iˆy\çÓ|cçX¡›síÍÀéÂu{¿3>áЯ¼ÈȽGXÔoš>¿;‡i ¢˜Y3¬»#tv¯¡’µ¶K»0·žÊ[—¨ô‚Í>IrŠôQÛæG‰úkUa‰Ëe}°qmþ¢ÀQwÞ["óAÛ„].Ô-†ëä¯W -æÄðÀpÚ#éÅHP&J©qÂ~|0äþŸ ¹ô86,ßåœãÞÕë 7@ã¸Z6ñn8 èQ‡mãÓ̰öÐOÌÓH‹‰=‚]j±­íe²ŒðTbËÁÕUW4X8%ò/kÑ™ýÙxÛB-2š—¾údúw!ïQð’3©Ã€4ON²ð;b¸&^Ôç®4°NktBò× ʨƒÔõû÷j=eFBP›¬„Ò¼,oã°:õ¼$dU‘-6Åj¸‘Éõ†“´†ôí:~Î}ÐV0NÂîˆÑˆöìÛG5ol K®œÂÍŽ>?õÏHÁ¹Ô9ñæmC-´‚Fi†zL§-í³—à¢NÍ* ·n +À][Öu&?sx?þ3¶ú%èb¼¶FÝøpl¦å:³￈ËtÛ)â»"yÖóS‹?µò›?È·‚¼×„Õ¡å³ür qø+Š¡èr"ËhÕfE•“÷lbF¸÷GeáǾNüdO«’ìK‘‡¬$wt =qZäé”°¸ TÕç›-ûY¾8ï ”/VKDrÂ[ /ûçIõë0qÅðmʺi˜8¼‡Vp¡vxsO%RMY‰ó2“›§.I†’&«ÜÚhŸ ˆ—ö Ø( …ÔP §û¨¦ÅZ®ÒÇŠžþµ5›íÈø]’Ú—36É]ug?W ö‘‰Ã×Öj<4Õp²÷lÌ @ðĦÀšéy&Ù½þ::ÆðµÖ:˜X:U ÚÉ9Xâ"Ó &ºN\-ÔÒÎ˯跿Œ(6·CJ*½ÐM9 z©Å¨2 kT‘ýij¡êŽØWOx/ y5 §~/­³lQ21®É9AA2‰´AQ…òÎa¤¼‡û¢²/-TMö¥¶˜¸Ô´Ky¿iˆC-ÕŒ×QÍÕQ"= ˆd a@Åø¾Ð]m>8râÑóU\Ú‘»yãûK Å <‘å 3qœÛ‰Ãª‡òÈ“&¥¿û­ 0Ü)F¥öHx†AØdoNÚ þ:Ž à{[P>!^U¿û7©c¿ä^'<Æf5Äéßµòåõö¾PŸ@[™ Fû©¦©ˆj§~tPÌ”žaEM´ÝTɾ,„Λï{Á‘áß8~ñN~0ÉÁ¤ÀטÏÉ'à£Z°KzŒ@*¯D`‘ðFM@㤆À9ª†Ò÷Ž3¨no7ˆ©ì¾fÄ^Ð]h§©:†/ΗÒJ*±¥RMÒ²´ :âµ:+¯›³–D6«Ü8QÍÑy^>²+O“T¸ÃÜ ›Dê¡§¢Õ‰O"Å\o¤Âþé*pfòîñ¡Z1 £D¥žÍ ¨ù++‡‹?¿òÅ57ÓÐ1 ûÂnª”Šg;¯fèyFžÝî( ÕšÚHŠëø^ÈÞmÚw¿Ý¾2Ö"¬Ÿ-Œ dnøFôô(ÚSY©äY¼7HÜÀ“ø‚Ýÿ —Zô® ~«iV'–ǰþdãˆÏ‡•rs€µŽ 8«­Ù_ Șˆ1D È «Uɯ‡Õ(-¥úß§Q<Ø¡09Ú?´›4H~.ÀYÖ«ìdеz‰‘ðŸÈ³+dÍZ´7 ЗIÞ¾Œcò±„ 2ü'L Äî¡¶.‚™Ÿ5"ž^*]€XÅxB~âdý~V·˜ç>\ò-ªúo¨¬Fñ)‘ƑۺÄë´p@T¹ÉNþèBã¨ó¦é¨O=ùÿÄtÃÚoäæM¾Ó”+ÈöªÌ¾ÿ;plj¶n$yó -]F2À¼2^(9c讜ɳÿøRí>†Èdz•DBų”#Wý×~Øù³.Ë»üÏñ±ƒ}@¤"1µ¶š“ú½Üô†ïK‘”«(’ˆ«ìªî@K„ŸÊZ<ÇÄT©¯Ç®¯` ð5Íötg@ȯ.‹ 2c¤\$jàAû¼ Èí©"¯wžfå<5uZDJÓñÛV¤Œá€æÛxyGÍ*°´TMÕBé…ä£M©3™nÒõ’Rpæ<ñÎØöØ„Ý'+Ç<û¾~ê’¼•-ˆƒì_} ù/ð îà }i^‚˜ŸS–éò¿AT>Lü2ðqta‡m$$|–‰¼P~Î /ý° ·3˜“=Gnô…Ú OÒ¼1®ÔØF¨6:V+2`¶Çù@vë8“ üp9¥8»õB¯ês¾?&‡xU±1Ãæ+}$ý «Azm풴ຮþbprà_ZŸŒ²¦záÃ]œ3pß°8ØÍQëËË{ šÍ‡àšõ•¡wÿµõ/90öÖ˜{m³<—&ùyº¬BF™í·« yR"<žò‚'íWm•W¸{+˜õ~­T 0iUµv 3Ÿ¥ŒÞç‚ÛÕ8qµ÷Z+Dô=Û… -æXQfS‡“‹©´Ù«ª•=^0u©ÂÆ‹•ÆG;¨žOI©SäΫí:â²¾×_nyh~#‘7QG‘VÍ WÈÓ¬7¥ÓÜ´ÁO¹É:Šf²aèÅr§õ-Ü­‰[ˆ+ä¹Wóõ¨ÀÍ´gÎmˆ"‚1V#çÌw¥Ýà£}bfk]bO9xÞ¶{å‘âãyË€sC<—]¼•’ÉÊ­cµ,) `SîzÒ›·‚SæøúzdŠŸ<{³©Ø.©»Lí8 #>\Àìv‘†´†»ô%-LxG8cDÈÚÈUÇb²ñ˜#¸Žü#qÎÅ OÆÎ±Ð' HÙ9ÎòË÷…£ªªQ;n²lÎLŸèèèuIÔ÷á®…ÝRr'˼é-n‹;¸Lƒ$| Ð}P ¼cÎPŸûˆe<8˜°ÌuÐË(@yàÁ»ä-N”ß/ÕFÔ?5K­’Ím’ŠMÈ«Cþ1T^[LÇ*¿¶›Îx¢úà¦xÃíá×ïa†ï$ôì+`—ÍyX\ˆ=úˆ ù6;F"¨^eW¾üÖtÌR…åW‰8H/5² V\=î¦D3 ióÏò3iÜ­¦ZZLé˜Î#p¡ê扥ϴÀóæé"Ý&‡`]Ó½“Þ¥7×Ý?RØ¿m†>[Γ ! Ž@¹æ{üyþìJ¸ïÔP $X‡êf7”ö—S^¯w¡ ¼ÙZX¦ã¿9uØ´„Ì–FeË'ÍYÄ-;4F3ƒªÓï‘a36IG@H%µ¤5öºj)9›6…{ŽÂ™­µfC7%z¿£Œ£„Ù$“ö^¸ÆŒkõÑpˆFÝÿ7+k`VÊi¿øeC:P¼““6¨¬›Æ9ï½*õêè;ê×¢.i‹?œ–B7Ó¶|G‚D”GÝXŽ%âŠ:5yËÜawŠ—pÄVéyCð¬hgK4m,:ºÔ0OGV/Å|¬\b—ž¥Ý©Å”Ú‰ÌÍIÕÖÏÍ"Ñô4 W°O`¶ÑôÿùÍÉSºÁ‹ðÂÔP3ìðYúO¤ˆÁÆ6Ø‹Ï !‚ì))ïÛNUÿöõdÞŸUô\UæXeV1zRùûÒÁ"ÆgÏpiÀ6Û"[Î"CR†wò‘héxÐÒ {y>6Õ;sîÂÖâúù(rh¢1êZ²†¢Çu¦çtÑ$ìF’em¦±i÷[vnóJû”oì(e>:Yƒ¹{“Žì%֪ߟJލš#»›' Bˆ@wÄv-éÅ+0t{.ýn€²ÈÞì-›£#Ößãy÷³Î7,ëXØ2îVW%@–‰’¸4¹3fqýe7¬u舺2åCxšþ÷Ñ'py^æµæª–§àdùÕ”^vÌØ;p_áÇŽaàÒ);m_½ð'œÀ¼½¹Æl¯‚ÿ[Q6Af¿4Ò¯måktËæ‹gÝJÕ˜™Žðy§©ðÙøõí°Î¬†Gý‹a¼ã èÀì69\EŽGÀ® ;Üe Do(lôÎÇ?OHPÉaó°£ß ¿UŒó]FÎ+9ýš«½ÐZb.€ŽJèÁ–âÏéeÇ•ÄùE =wýJÕ·ß¾¹öY¬ì×߉=³8»¬‹m¬ú.Öè vÁÖµjÞÝê?¯q d«™®û¢»ú m(=€³3|êb+²9À«TN5# ¥-#Ýió»~[j¬ÞKäsÕ¡ÍV4ÞÅC§…jT¦=áêËýªðÖ\Bt9ÑNÙH·Š­ðÕk°“ôÇ]‹¨¼oôoôØZå½Ò" ½¯hˆÏT0ο܂/Iƶ*ëè7N#tz"*›ë‡áûT“ûê_±ÒgåÃ_! eò§ÙM‹ì°ÎbÖ­rbAuº7"W/^háß!"æ·-G!5Ø&oÛ´¿ å•Ù;Å1§Ï/‡¾Âäo[A×»8š¡Mdïã´éjSï¤JL>«=8Ö´éÀt¥Ço¢ãtÃçäåý)…xI®¦ŒýáS¢¢c(±hbµŒO_FÅÝð"ãýu•²§ÜǸ~æ<0ó¾Âº¬ýbohV«Èɉ;›FQ«®O±ÛçoÙÜŽÕ…t}&?E†Rw8<× XAä´H»Nåsú ½=^Ü d>&I:Ðu¿º™ªtwÄ¿ü·L&zj/ˆ¢g‚=fšã¹Oú!l%N>÷ɧ|Õ}Ý&Ä<퉎~†>e… ÓGÞkýUnä²3aÃŶð»çáX|:¤Ò›imûÇrƒáUrÙ'0dÏÙ”UŧÓʈëÞ•ÕÒLKk'2¶ØÞï(§ÀßïïNäyS_ZêßUWž¢©ö mÿØ›Ñp ît¡µ){Û<ßk©?—'ÓáÂiIÔzvãC̱ÆÌ–«²ÈâažkäIÏ¢ÔÛüÆ>/#¯°¹W£3#¡sÍ•“cqpãçM‚‘e•€u¥× Ëÿlº&w¶Ä冧âÿµpÇǽÈëø†I+f’Bz‹ JßnPdigÖìp ½AçÌÖÅŸ5[<Cñ¬ò‰êíY#eú,þ4Sß A`ë‡ÅZ8Dr” 'þkz™|gt÷æU°u¯ðD<Ñ-t¬!ãÃø eg(·t×ò.´¼ï±E·žW˜]X`4Ú›ÐòÛzýÎ_Pã§š²™ · µõ½ƒ²ë;ËÖâƒxêçõþÞnÆ/çû)x}^ IT˜˜ÍŸ8CDìÉÚѸçÎÔ&ÜÓ@Ø¿`4+“k®$k~X˜Z®¾ÐømýC¤þŒE¸˜Ó¢Jí»VöL_N†ùÀžˆ†£Ò«)ýWÆùv '°ƒ@H¢0í®i!}B˜}_ø`þ]pþ56µIÕhÙtbDQˆ,˜áÆŒ‡SP“šj°š…öÜ…ÍÌ9vŸ;²÷³=ƒ„ ¬†-ê$ÛÑ”Ð0ŸQiŒ\ì².ÅXu¬+eÚÔ ¢wÙ ’h#Ô!.N¶ë‚è"o§}NŽœü÷üÿ6-Ć3V®¥ùtè? xœë‚¼k j”\º7»µZÕ4zË€ÛA§ð@/RÏB…žÖ_Åô­¢Ÿ4H|Ú~Ó8ÝÍÀ6J(’´X€|’óÐLͺù^@Ä_'8ÄîÆrná÷m¹½ì§1œ ±<);™ž«4n¥U—×8–A=$jÀΦ8›–+ç“à„»}޶.Ôã:ÛÅn)EÈòçtËÑRÁKÅZ\ÿz×ÝZÙÆNûɆ²ýG Þ1G¥ ðÿÁ(ˆ[ùò¥¶uN¹Ñ‹S3 lí k÷H ‚µ©®×ø#7=¸%ø*Sé± †›½µã¥×'±MÚà*c䙦æj.Ë¿«Î,“Ö„ØDá"E4# 나Ý:m˜ßp™ŒÕÓ?euÔöî*ê™ð€0„:¿+ÑK“óÆË7tX<Ó¿çLFÃ÷õJ˜O„dCƒ¬(¡«ßâ_<ëN+ûuK%/•ÕNp‹ƒ¥?ޤ3#î Šý¬L0dùúÀ馨}ù²ttnŒbÛ¬Oçõ¥8µÒA£·ßMP3r83én¶ å£ò¸†âöa/Ó„£›†Ïç'5BM),lqùLå¿ü–Çan¸·“]×Kïë p‚Á}C…t0#ÄúÒÇŸ ÈÁ/£ù¬ûŒþxÍB\ˆÞ)ÌFý]£È93íp7·Ç[Ú¬sI«OºÉäÔs™´àëà2žD„Œqà[[œÈç"ÂQ6Vdƒäìm×"ñÚÁ)3ͤ²UxºL]xˆ¯ŸË°<­_™¦Î×ûÎ+çÐK°ÎdøÕÇ º®ú™V•žì¯µŸÊ·õé*.†ðÑòñ¢Õö:ïœhyV»¬kFˆfþ¥ƒñ”3ש˜BBQÒkA=˪zÂ9ÓBzf—(ˆ÷|­mzSä&»„0~ÞÔkvk;L|f§ŠQ5 ª1‡eñTóíÕòå¬_þ H3ª×„b«“CËXK¿d0Ä¡kH‚Bø·³û÷ÌÊヾFjz:ÀT¤ª‡—ƒÎõL{ÉPôÄ{ ÆKõs¶#D5ì÷ó˹M´š`÷£ƨ-£”y#‹‚$Ç»ã¥ñwZ¦iùž_¯¯ZPC‘ó9Ïúd°Xa¦©O¹äì{CD?cX”4Àu}̪“LB5åK”zTöULHbMÃ8ÚWœ?eýK¡àÆ ’À`¹üÎ' endstream endobj 272 0 obj << /Length1 1673 /Length2 9113 /Length3 0 /Length 10192 /Filter /FlateDecode >> stream xÚ´TØ.ŒSÜÝ‚[‘àPŠS\Š·A„ÁÝŠ»SÜâÖâP¬Å¡… o‘GgæÎ̽ÿ¿Ö{+k%ù¶|û|gï}˜é5µ¹¤­-A/œ!0. 7¯@VM ÈàååçæååÃdfÖÃA™1™õ@P7°3Dì_²PìÑ&g{ŒSs†”Ý@~PH (,ÆË àãåýO 3T gᶨq”! 7LfYg/(ØÖöXæ?lVì ¨¨ðÓ?ÒÒN (ØÊP³€Ùœ+ZY8´­À ˜×Q°‰ÛÁ`.b<<žžžÜNnÜÎP[ ö§O0Ì rA=@ր߂êN ?•qc2tìÀnÚµm`žPàÑà¶AÜ3Ü!Ö (à±8@[I á‚ü¬úgÀSÀ_wrÿ¦û+û7òG²…••³“‹Ä ±Ø€AªÜ08ì)Àbý;ÐÂÑÍù1ßÂÃìhaùðÇÉ-/¤_,þ%ÏÍ v¹q»KäùMóxËòkYg''æ†ùû|r`(ÈêñÚ½xþì¬ÄÙâó°C¬m~‹°vwáÑ…€]ÝAJr…<š0ÿ±Ù‚`A^^^aQÈ‚[Ùñü¦×ñrýáþ6?*ðóqqvØ<Šùm@?˜>n êòóù·ã¿&°[Á– [0óöG3ÈæOüØ|(0â}œ= €÷÷çï&ãeí qôú'üþòÈ()È©ëpþ©øoŸŒŒ3àÃÅ/àâDED‚¼¿ÿfù[ÿ´ÿaÕ´ÿu6Þ• 6ÎÑ?%<ÞÝdxü5lm ;à¿+¨;?Ž2ÀöÏäó òZ=~ÿŸçÿ”ÿ¿±ÿÍò›üÿ=Ð wGÇ?Üløÿ?n '°£×_“ì{Ü 5çÇÝ€üo¨>èÏMVYƒÝþ׫³xÜiˆ­ãß×v{†ƒ¬5Á0+»?Gè?]x¤wC@šÎnàßo € ÈËû?¾Ç}³rx|OÜ{õ‡ ô¸Nÿ]Rbålý{ïø…P¨…&ïãxñ |€ j ‚ÿ1Ùnˆ3ì1ð(Ï`ã ÅüÝQa!êoÓŸHÀ£öðhüD}ÿ å?è1Òêo$ ðˆ÷õŸhàã<ó€þ†‚ü°è_þÇ»AAø_ð±˜ã?È àü >r;ÿSüñ(Oð¿ÜÔÐÁGÁ°NòHótþ—û1Ýó²ÇÂÞ èŸþÿºw+w(ôñ=úc3›òüÇãÁAV˜+‹ÎVÏBíC»¯ë¥©<¹ö¦žÏ3ïég°sù¬@{Ü⢧²×åo@/¥SÇð?íȳ]H­ÒÝù|ëhFèLyÙõË÷Ö,Ikv¯ sy†tdºä›tÓ0 5—ŽÔgß;W_½ äÄ^eæWw\Í"¢kÏ!xÓpåljðŽ—Ÿë„T°n+ç¸âtcƒÊ˜ -s?3 Á¸hžpžÀñ..ç ó§蔓81ýãøK} 7ùâo>x¯Uëð¹õQ0Q’Ó _N̲øÈì§)“-ùT”n@'Ò?öLn9½:î³yï©k]C~˜²0O‹±Qó +ÅÄnt*&;•Ó'£ äž|RÞ€+ýî°t{ª‘ ~ÐpnÔÂÝëÿ™ßä½ÎFÒhÀ¡eG’ÚDŒ AÌobÁ,Þ³½#[7µZ{·FÜÒ.Šk.OÓѸm›Óèt°¦C?þ >¦´pªì=éq°ÃáH|rn•í<ÒûyÒÍÚ‰Â1•¹¥%øù~}gj¾'U iS.û¥h*ecjNVA‹&Ö¨™IãÞ7,öìºý®aOÌëÈá¯;Ä•º•Òu5"9%Šè ñ7mH[“î¤ 3[brë„[Ê‘ñ÷láEgú5g“oÏŽMйxŹ+mµeð°Õ_æi$ªÏÆ R™Š6ß‹•«tr ú~úà3X¬\”ºA‘÷˵‰L¢Çž×4þ-­ñåð=«ÁàÁQÀAXT7˜{ü…—á¸æ¬e§‰Tâ¡aù“ËZ`¶^=¢_¨XYßz¥Å™5¯ÝÐ’O@€¸Ú>Ï£‰ü´Ÿá$a¶‚#þÈÁicǘ7!ÔT¢ Áv±þÓGg ìâüÚ³ä8aÖ½UHʃ‹dª´®1½ÌTa;➬À· 3Su9âÖØ<ün…¡fmH7Üðø{I2©÷|ö/î\혵s:öðâãm±ß=î4çíÅJŒf{nk%]Cc/®lÝëwŽH-7í?rÂЯR’ O~áä;iV±ÃYî$°ð ù˜»Ø,ÚáE‘]Mßâ£ÇQîlOiÔª¦»ÔÑ«ÏpOi$õ²*æÈàsÙ ïVT.à²w*Øý™xéŸ$_f°f -°§ß—pRF9½b%ÚZVF+²Ùc•ËAše 3à->}מuÃùuÚzÍDæ xGr4Ù¶Ü«õXº¬qÖt·­Ò-áB”4KûœÊûV^‡-Ö_üùÓôñ+?­/Ó¶£{¢þu3°GÝŸ$Þô•&¬PÉ_’6t×¾‰.gÙŠäÏúGz¥P»° ÙþÞû £ÕèábK‰Áõ弨&é|ö¼©Œª£! ´®jâ,ݨÁçw¨^Çqä‚$.¯OÚµòu¯Ú±ŒòvwV%³¦qmf¿i!J…)=HÃ9&Š™¶è?ÙÒi!“+j#PW=Óê×C8ÒÝ <”¤w,‹S[©žå³%ÒØÿÈM¦3$œBþ³Õs:%€]²¹TöÉFAšž%±°é¶CvÞ› ågÕV8˜ê}¯9ÎpVâ¨ûÊJ6W|³“i#uK¬&k7ŠöqÇ+¶R„æì²„P0øV6Zfòié 7=tϳ¶»5}™ÙõFÛqN:—ªri Ÿ³t[`~©&=WŽtË5£)žhLÎDõŠX¡ôõÑ .ŠjÎ{—.“ž l¯tE‰D8–Á—Ny×dAu[ÎŒý!%,€%õ€@òU€-™º›û9âwÀ$yÞœ«KõÜ'<ÕcÒÀ/¼Q2f‚@a‘Ÿ@ŽF,=Ø´5¡¥p>?‘ƒ¥CàÔeº »Ý!Ó$˜Úáe;Hj›MÄïÑÉ:šš¢Mø­¶r¹ŠJuÎn€Ö1¤ºîËÐ Ú|£=Õ¢¡)VÄ¢š$l»yâ"]èuÏR+…GyRŠÛÒµVÉ»ßÖÌ¢-îé¶,=}Aí;Éñ)$6™¨:Ú‚nÏ% —Þvzȉ â±¬U8d¥Ì¼DVù8À¿×Cpúã !¨JÃnZYz43«©[´œPÔ#>Ñ‹ƒ UÉ Ö>_+f­Îxœ\üZužê³…¼`>ìÖš¾G ñuv@dV ÇiZPï®èç2íÚa9k"‡åAÊdK¦úŸz§£á•¦°4?;APÒº¢z$tH±F©ô©Fºëf)ÅÖ4cQ]x6fèC¸ºÆWòUF¸Æ; ¼'z{\]lmôÊ-m†o½ 60z*èMê¼—>I-q·¾¹!Á<ŠB˜æJH‘Sm4ƒ®(îÔ¸Ú—×ñÐB¿”ãïÛNÖi2§ÄÀÕÖ_{Óúà ÒwV߆3ÞuNݾ²^c åË»v޳6,*’Vû©iÎ)IŠ8¨ƒ¡$›0¶”F8Ú²ŒÏƒ*ÒkðöÓ,­‰f94ä1qtuì~R¬9zôŠvQ™±#Þ,PL0¹Èfg|£Áçœ`kW‹ÇøÐ½ªùK/&YÃ¥ðÝ(ÌJÖ¼óCÁ6ovüPc`­ˆ`õ+i¶aÖƒäH r;6eÑëùçï ’ò.ññ[®EÑÆu7_YÙß› ¬Ð¼õSyUXÇÙb½(ajµ®#4BÈ+o8{:vGLDÁ^ ¾D4èšjæó!eT`Á{ŽÏ#¡éðMH]¿ü/$9͉αÒÅÇCÓvÈJŸÖ«J ’ëÂ"ÆÍZOÉ~—Á­æ‡É”Á»-XK.)ÍÇ>z3  {~ÈÚèSzk¼ó4eNê‡ çrkRO´ìG<ïŽ Ê¯Ö¡nm¯Êi,õS–A«TtõÆ”#5‰ŸvgŠ€ª2õUÓ„ŒÊ»ˆ-'}g÷ƒ§í4.dd¼$“b„)ƒ0eB‚$aCU9‹âÔs›ÏJÀ jÉ{Ø ë¸ˆ[¬RžBaþ*:»¡èQŠˆ ñÎÂÆ7ÐKÀuèýóÈæ€º.ÑÞ=ïA¥·ô(e#­P‚z¯º‹tTšš®›‰å3Û$DÚ8.U±/±W<$Õ«µ.DËiOðÄvf€ð›Ñ×?ÆvÍ“ÐôúROYäå‘òƒ$[­ðÉq¯‰±e?¦f 7r™®0¡ÔÕ¨yl ¥ùJêÛÆâ6;…]+d@?d˱žŽ0Jñ$Ø ‚°…Z¯Ä§;/8Ó]•›…¾væÃÝ_ëªÄ@Šl ÅéÇC¢€«%*õšböœ×1YËé|5\Ä¿Áž´jÛ Nûjp‘õ´ÔFêt–A÷NÜZÌk¦oÉâ³=A*Y¼%ªÀßü8i‰nÍ ëøñ1IŸˆ Ͱ1(š8¶ v „A’‚Thú5d¹HÕ¥ßl=%³|~¤o Ÿœ`C…5=¬æÉÐÖ÷¯ÂDÈðýÔóÏ•âåÞ…¾NΈê­Ê*¥ë¥J$GZG d0ñCl}AÜ;Ü—´"¯CÄ7æ¤Ç(€ò[òŽ~¦§µÙNÝGíŠÖÎaÑ'ñÑ£ZD¨Eûhö€S‰»9TÞ“ž©o…„³LYÌ÷Ji¢âÁî\DÓëÜ©+?_)ïüœ‹ÏaúÂ’ŽQ[“ês|{ Úí±¥Ó ¿ýÉëœä'/<¨õFtQ*'ËÜøèÆ¬¯Š.GâÏ ƒ£ó‰âh¢"}?в çô ã®Û@…ñ¶Z_vûCÚ¸ª‚Q/ ÷ŽxŒ¢‘z¨ÉR‚5´ÜAåd·{ CÓX¥Þ?ëì5ß×=µ×ÿôšTkµÖ]¸Ùç°ëÚÞÉ3<:‹?ŸþÓ …(49ôeãßÜ}H„¾Q‰²É ¥âFW7óVãÝ3¿xí×Ö¡Ñc”OÞáN¤ÝàÐÙv¾EGEtÔ½uö(½‹Îç$hbxÉìý|ˆ©BÑ]¼DYHK!ýò]󧉧õÝ&2æ‹›Á®ü¦9b“êçš²~¡·ŸÌø>.8Ü]±|AÂ:xjP^JF-UJ»Žíá}iÓÏÓ™t‰ý‹Žbã8;D¯½íËŸòbæYÜb"„$_ìBÁ>1âŠÝß!5kbEU:¦ü£–„,u熚©ßO“pkU÷v6ÏŒ±aÀe¼ã…·Úq¼¾Äû²ðçÞR°zl Š”ºTFì7âŒ+›º¡Ýµ›¾õú’ð"´Px5œ™ºˆ=;)P*s$ò¾í(4°!b¬HÐÁÿƒØ}O®œ§ CÕ3ûÓzi”Ÿ5SæÚZÆ­¯Pp¸ç<Õ7Éîd’ö¼ˆªü×ÝØDp§Õ…›xáófxc™¼ Š“lï›Ýõ{æK½}³u&šwô”Ôvêl86ŠC…HÐ'¬¾Ô®šŠ§çh NzpyÖrì©á-'DÞœ¥ƒõŠÊ°Á’»EÁÊ26a¹ßh´ÊÐÁ>»ŠŒÍvXlaˆT¶Ãþݘ"o¹ã—¾†õLK]³ùf“ßF}&ÕÉAÓÁRKÏ Õ¬i6?vYˆ,4÷Žõ¹gÍΉ„cG“pf%c¾'ÿ.[JUÏZéŸØpTR¤)XsË|~쫟؞@!» (*OU¾áˆ[ªï}£j”Ù6çÆae{!µìïä`ãQ!+²ön”(4GTÇÅP*Á” db¹<´,ìÒVÅךüRµªI¸±Ä¥§ÔZê »–Iÿƒäª‘S˜‹$ã!¼8÷)ŠçgIgï¦ÙmŸž(m»«Ë(â±"6Ä“ ëéW’ÄÒ-€² ºÎxüÜ®½&s³ŽØ>ú‰£ŽzxûvÝV2"‡Ð®ÜQ£>Ÿ“}©w-VÀñŠ4.!“ý¡ŒPÀIJÑç¤ÅL…²S0Ñ‹žeŒ"ÝÛ?3ñCØE¶º Xµœ°TY¦ƒ÷â’à"[Ëÿ¦ØéAèYH| †‡æ6;‘BÝíΞ&93^£ s‚,( ¡co‡ÜѦ[Ú}»Pb|1?l«…ίU*Òlº­qçõÍ™>1Ë— vTÆ›©¥Àú¬ØÅ_œ…dLã‰|ŸÁf™odr½=PŽÍ©MdFM¬8÷ƒfc;C›Q9BÞÝ´Ôî©Qñvt‡_.OŽÝ£9Ð}<‹?sêÔÃ|ó´TǨû ­xeÑ"ô˜u¿úv¥mê9g÷̬eî)k`Ù€&ûêÙLy”cž`K@?Ìe‰©‹Zׇ†+¶µb6X&Šê NéºZY„ia®1áëºeZ¸¾5Å@‰ÀE:¤÷Óå!Ú„©ÆZ$…h^éòó[xAÙÈ™!TöÓ·:¢@òcÍ”rh]ëʹ‰ŽïЬ;o¦÷¦¾Z´ö—çõ‰)Èg*Ä5Ê9‡ì›ìû¡¸' …¸§ûqC®é¤‹_ä.;4óX_ìì7z(­]}GjÃB.|I¸Nx–‹(×°ðõì—õ[Z‘Dk–yXR¾EÜÍz6{fÍÚðö±q <Ì}ÇTÕ YI¤Ì܈ݖ“›²K”µ¤7,ýÑvî,=´ÒˆáLø±Áq Ì?ãE­Œ5±ØÖ±‡·+oî.Z·QÇûú‰Sçð¼ÃP¨cóÓ9Rv©Ú‰WÛC*õ¶£3“/V)Z†«ùWŠðèíWxÝ:“sUãˆn‰\ƒ.Ú±hUý²M®b˜ÁÈ¢¢pš‰Ö¼·lrD§¤—F§ö"÷gÎMFó[s†e@ƈCRŽŸt¶Ä uˆiãÚ>…–÷ìs‚¨ƒ4ök[{éµVx„¥Œ¦µxÝN©é\üÓyz¼ÁB{NËXÊôI âµ <ÚHcHÏÕ&Dý hŒ>jñoý”æãT±þưíðBCþ"Ù蘯pjÞP]=XŽŠfgà 9Il±/á‰Ê Á¹nA6•­Ÿ$óœèá!œ]^¤*HÖQsãgd>|7zE×Þýú£š†Ëü– 65êuÒéd}i9—ï› -=5¨†5}ÜU•g-ˆ2¿³&ۜûò¬/Óœüt, 2oÿ²9ܳàA¼g?‚´r7!7N»ÄëõH÷+áäžžîê£×¸p«èÜ̽â…~ÑjÅW‘z¾ñ’iþÓ¢©?–>dŸ…pig¡qŽ‘I±àõD'ÍšôåZêoÒ©¯—º¬X ~çM¶IèvLXƒtÍcÊËÅa7» ïËBÅNëÏhö_â£Q‹Z=Êf¯ýZcû7`¬)cúáÛ(E&önÖÑåW = Bhކe6n‚àžCíµë{¿µû’û:2-L.Ã]ûE¼!r‘Üã¬È ñqºM5}žz5ÅÏ,­ß·«Çã‘ýk¼8’WÌ#Ö×ÏývÙàCW9¡|³oõòôT_dðþ¨Kö]¹À£oêQמ–Ÿ0ßìf8æãù®#xñÎ]¨½]ïÖ ´Ã~ÁvlÁ8·A:,Š%3$-v—-´ A85Õ'íW¨‚V—ºñŠÜ+M@>д½ö„Ì{üÌ𲘃_½“Ç„ç½c;6ï––‘æÓÛ„–8ûÝ£¤î÷²`ÄšãŽÉâÌk±»WÕz_^ÌF9yLö"/üÚÞoþÚaç˜ô²X~\ˆ­“ŒÑD~ñ>]:[†yéE‰˜¤>5e¹ŠpîµíX=AËŽçáâ h\yj»`ÈwI³Ø5ÌK^2™Nªð‰4+È”¶®šGtâ¥ÃÆêŸpzŒ"Éá×GÑ®ˆ%ðYe¶…<nÕ“lEð.Äø¥; þòëÊ·S*òoUceéÊo`ŒC"Þ%9? FZ,¦s&ß×O×*-kEqïŸoÏL»“éÈìcSAd¤×4®Ÿ:ø5 v¶ÜÏ\M$p~ÖÍqÜ(éiQÆÏâ![ÅÀËcY·ŸuQð½u0ƒí|ßfy?¶‘z<>x¸ ¨„ž³ÅmUKß½®´éHÒ×ê+e ƒqöc1™’túî;èw³ßè>7ަ:1íõº üžÌP]↔²ÏqLc^ôå n"oXv>U®ªJô’IZy¾š¾¶›TkH°Ülêþç²uÅ~ìèNÉd=­{WûRö}ìèJì;³F£‘Õj¬'Êñ¨FcÞF5ÇbóÃJ’:;êÃe ·+вõu¨*×L%N]IÆ•±ç\"«bÝ€Ó—¦càû™„ÝþJ° Gt…Ñ(ð¤7OSkéŠe~ k稜 Œø+y†Éuó&{`5¶ñäÄÖí9š3ñæáž޷—ÑÀ„ƒàîaÁ7ƳÙzù“o h¾1h¬UÍ›-\Í.•2Ï-„îòüÀû†‡{ Ô9ñ‘°Ÿši[´ÿk¾nίNþ<ÝôÆæ¬ Ùcl,tiÄ ³o4*œª…zæÿâÒ4:¶uš ïÛ>üvNäIá´Cä+Räí„^6*]o¥ˆá»‘¬R/Ì«ª1yãšÅ¡ÙÁâ›°Ñžä+Ü>Š¢¹èä>5Ä®–8<³×ƒ·èæ Ûsëc3 û©½&¸§N<ç7Ó[~?ñÎ3î"tšÛù2ôsбñ)«úÓî„”è}þ! †Ì–%’AUÃòSU‘Õû:*úÕd--ZQ"¢¹×&'x(ýdäÔrO>#j?°÷´©!áf} Õ7œaä– aTê™2¸g£É àvæ§óœùeØÚi"ø;é ©B ¾Ù›œç[Vš£à¼Å$µÌ=áÁÕ6Ð`ѧÿUªñ|ûËÄ4øÞö‰üóú QE¿à7Wú?ÝG%…ÅÚ…QØ¡s(ŸK9b‚-@»`êì_…”w-G9iš±Á1ÜJ5l, •3µ`óSµk÷)ÈáÍÆ÷à.¤ÞQ,¶†+­äiðwYȘk¶T0qZ~j'‹ÀQ“FÔÂ1²™gp‰ Îܽº,üÔ;Áˆe•/„êónõ̧«G3šÁ¾ æLa”ËE~ÅV›¼AŽVâwnÏÓgy pѲ•9ŒaY޳ìÝQ¿»‚Žù¸ ºI9(t©™ÿɦ¥2]S‡,ô¾©–É*ÃTõj8¸µ©/a.NM¶™òyŠ+¤UûH%ôü&šY92Ò;kMÊÓú Ú£§ Nà=cð(&yzÛ‚ Øàž>ë-^õ pæI5Œ>ì¾6Ø?íW¤i¡µ3W:Ú»¹¿2áÿjì“3I' daLi=^O^"_uX‰tÉ6æ&þŠ?Åö$Æ“ýM΂¿ÜJ1’Í»7Á²h’ë©ÞKSJ$ÂocŸš²ãvÑ5ûÒPH2q¼ó-qNò¬‡°‘ë ÉÚêY`ùœTò3ån,F1~ïj\~Ÿt¤99,.ì8,m‰\ââ$;Yxù±ª37¯‘'Ù3­lÕݾ%®Ž½¥³×\y9dVw¯•l -·ë®þ6¨b‚XT i+›Jb˜“ºT0°}˜J/Éç…qnóÜ”0œÙ©} ½ŽÇqšëý~Ýû¨>‹]Àšbu@K9¬_^x j ÒÅ@ šMཌnMOL¾V"–ÏWX”á"¬6ÚXæîºþxÙ›õ¥’ø=™Ða‹ñWÙó°m „  mÌѵӈ±nº«·=w3¸vÐ9±é ÓŠS’1øËCÂä¿3"oRc)ëŠE‡µŸ)ßoaÀìTT­Ä4æPâj¹Œ|ø4~[~»å6¹™Î´ï@ÑùJº¦»UCÐðƒÜé(HQVs¾¡ ÔƒŒ/ZûìÛ† ™QÔZÜÐè)ŽºmÅfX1sÒ×ëÔWOÎ?Jì–”Hd³S0W•#eN’²áM²èh ¼îcq ø&ŽÃ'@#󒿘Ã?û€yƒÙõ¬e ¿5'UyiFVVÑ5¦ä ”þ6(”(ÖÅãJ@­Zÿ~çb "uüÎ 9ÎèaÚÛFÖR«©¡ƒ¶m·¨ûœ]OËþáL4ÞmËôcœ©ÜŒ E‡˜JMQ‰Fùl¹9¢óÄÊé]é¸pìçÑÌj—¹U+MÊz¢¨Ozîl·¯ø¡pœDšb ÑY…ÓÞÍ™â ô"ÔxËeŸnÎ!5±W¹¶¿¥üHMÎà¢;Þ|WÁçMò¹YÕ™ëM‰Zs¨žmÁ‹iÅ<§V‡'=èFæcv7BÊøº3£¸PW™ú­f¾áéŒÈaÆ7DмØô÷d"ohrЦ ª+Nýe¬WëÊbÖbpÛWð<Ë»6ïè˜rj6’êgLÍ· ³X^®ÖÜ\²„¾r>Œý‘s¼·F/°÷±È‡qf!’:÷«4+Ñihë™à­á|ü=ñ°ÿ‘X ¨R}_äÕ<î<ëç$ûÝ÷ˆË 2„Wç2¦ôËËø2Vd­ÍØdúâ»–¨Á¤|y&“œD›ZÉôS²µ´ Â1u0C‘bK–ò÷°¼e+†È‹ÖZ<ˆQã±m¿‹ä¹'*ÆëBN¦åÐIe×–2OFÕ¦ÝÞ9a¾î.R׬~ljg#pç‹,­q’>ô\‚üiˆ¶Æ endstream endobj 274 0 obj << /Length1 1487 /Length2 7334 /Length3 0 /Length 8327 /Filter /FlateDecode >> stream xÚ¶T”Ý6 ’ÒHH ¥ôÒÝÝ 00ÌÐÝ]ŠÒÝ H‡ -!)Ò"Ý|èûžóžsþ­ï[³ÖÌsݵ÷µïëÞÏ0Шk±IX!, ²¸+';‡ PJE““ÈÁÁÍÎÁÁ``ІºÂ › ºg(.øRΰëƒMìú§‚€Ý`@Nn çKAN>A ‡À¿΂@i°;Ô ¨ÂTDÀ!.)„£—3ÔÆÖõa™=-™€œ|¬Òg¨%T»ÚBV´ÀZK(ÄÕë¿J0 Ûºº: ‚@ì`v„³(+Ðêj Ô„¸@œÝ!VÀß„ª`È_ÌØ @m[¨Ë_v-„µ«Ø|0À –¸ËC†Ü â |X¨¥  Ts„Àÿ Vþ+€ø÷Ù9Ù9ÿ]îïìß… ð?É`KK„ƒ#î…Û­¡0PMV™ÝÕÓ•†[ýÃ\ù`w0¶xø³s0PVB~ ø7=Kg¨£« » ö›"èw™‡S–[I! pWÀïýIC!–Çîú«³öp„Üço` …[Yÿ&aåæÒCÜ Ò‡<˜ÿØl ®@^>^ Ä ñ´´ý.¯íåùãäüm~`àçãˆpZ?€øA­!?°;èêìñóùOÇ#''Ð jé ´€Ø@ဪ?˜!Öá‡æ;C=FÚãrüþüûÉäA^V8ÌëŸð?ýéËè)h³üÅøß>II„'Ї›ÈÆÅËàáòñýþ»Ê¿ùÿ‹û«:ú÷Þ8þ)¨·Fþ¢ðpvÿ¢áþ·*ÿž&௠Šx2Èøò9x9,¾8ÿŸõÿ'åÿOö¿«üß”ÿ¿’uƒÁþ¸ÿøÿ?n°æõwÀƒ’Ý\¦Bñ0ðÿ Õƒü5É*+¨›Ãÿz\ÁÓ!·ýû¡.²POˆ•:ÔÕÒö/ ý« åaP8Dáý}×Ù898þÇ÷0o–ö÷‰ËC¯þ¸ ãôßKÊÀ-V¿çŽ‹÷%ìì öp<È‹‹—èÃù0 VÏ?Ê‚Øáׇà=? 5Âð»£ü<@öoÓ$ÀÿA@å¿çƒ&Aÿ€Ü@ÍÀ‡B¶ÿ*Ùÿ9¹€ Ç?ð¿voéæìü0Õôõ@í_øÏxB,sÓK¡P»šÐO—Uäl#" z)Ll>sέn×8ï˜*3‚—Ï%Þ}éÂ[X—a<Ÿ§¾óÙùX‡Ñœ Ñrã{köVsl£0û•¸w´`G¢¶‡ò1›¶ø¦ï“¯n=ÊGävE†'7~õ<ÂKÏržµ=e߆§746+_*aÝ–³½Ò‰5*ždȵȜ"¥Ewe£Äd&8ôÄ<;Ÿ Ƚ§V|ËðÛ}Å]èc¸ÂõújÊ{±\›Ë¥ƒŒžÌ”åŒ`hì¹äV’"ÉŒOIQ ^û WÞb¦Én`V‘†Ñt#°ÛÇnD©Cz÷|%ú¹'$¼upó"ÐóÐ[ö“Tf̦^˜œg§H³ƒ"ñ >»å#<ÃóvßË)·=űâ4b¨E öGÛÒÇè×O“‰Œ‚º†YeoüXÝ<µf :Ûmòdz¢œ»ùë% ð p¶—Õ'ÄÞÉÍçåà¡}SOåkÃ]LïÜL51Ã<þÔBFðJÇ!Xø2vZV[eífT·°DEþÑ*Ý÷™1/C¹ÖDË£Xí*ýÕä ?{'Ly’]lâ·g>w ŸÈKÑËpͰ½+¢¤®çëzSÛgÜ)P±ß†Ý"¾.FêÔ˜¨Èv7°Þ.o÷5ëµÅ†±j×NQ[ôaš/±h[£“¿¼Æg´º¦PÐ@f*›¾ÍÿÅJÑ¡›pXÇ’m™×ܧM>t Ìd  ˜X­Å}VÞe&„AØãY)¥4f—±Ù=¯Ûÿ‘>¥îòCÅÁ¦ºòSFïþ¼§ŒV\jâi‡_½ÍqëªðYœô5p)ð#«AW¢*‰á“iç½Âš_uŽÎQÞ£O—›6?¨ZÕwŸ#\FcšüƒŽ£E¼KM¨+P§`'o{±î ÞúDËõ_ D_ኸϱ‰~Á "è»%ðoˆ±ÄK56Q|¶L:øºµNä1 çhÖz8C%]|–ÆE¬Ú>“±²>ˆˆ‰Îs!Íœ’^Â$Äeóñ2}§ÑL”¸î@KèñFG&`å‰`ëV&À÷™`‡éÂÓ3Yo3œYë@ñ›Í•À€Š[áä8½JÙV“p…ªÑÓò«—øc1#.4£‰ò¤jÌ*ã´ªsÝ% cÏ>ô¬Š2Y'ÁMü¬Æâ¢$çkŸAµÂ³¹§ åí„c]Ý($TCµüž~ (Í#5-@n!ðáO3Œ–›)U™ÍqK`‚Ñò¥…2LÖM_}Ž$µÏ{­Së+rZ‹0‹ë[tóö> Á˜m%ÃYËÌh Ú}cNA‰ÏU$¤~+ÝÈ~$îë*†ölœâ«« ‘}§ŽxVŸ5·£±Šô>&Ψ µÑ½}0nY5›áˆÃŽ”<§8¹¬š(Ö‰ö “êÆýqޤÁùùzÍiÂ'kf31o§ä$ZÏ÷qpßæ~iyWâQ¬g ÝµÔ²¸ïJsì;9bÛÏ‚ÁÌ:v7+€«oëÅû>À’›¡ß6m|‰ÏŽUÍs"¢ñl!EÛ-²i¾M©[Cãß‹}B¤8G’ìÀøéw¥w½ã͈–sÇ…Qr•í ÷ÄxÙBïÔ®^D„Õ''â:4¶ÉØòy’5\7¯Ð¾ôò€Á„@Vª°Ø…*ÊýÊ.Y{¡'š”¼Óóòå[ƾoö¨WÛ´Ý}Ìy½!zJƒÒáÚ©ï±jçC從,hO…$·¿Dç›éždË-úÕò«^Í:]’©EgLÊZ†Ÿ½[AÃgi­On²h?,qëq=¡dõEôp˜$¡&™#mË":>Îvûš’ÙrÄY»Êéùœ¯ŽtôRêû©æá=æž¹ÃÎquO‡¶¬*gªí§«1ü£ ým²§|­š¡’ 7¢'—ú\Aþzº1ÕÀæÓ [ièöq]g;$ƒZ[¨Äh+Ÿ³jj]B¡M©Pƒó¨êu)Ø¢E÷ epª¹zPßûË?pè;J¬À=Ý rtãâÆÒ,œy,Ç‘íò·Š¼¼ï«Ðm¼QøÞÙÈÉWDŽJ1½ž›¸™¯ cgË•^!Ã&Ãâo‘V\š3´˜­ ›ô$Q{Þ²ö¥Ç w]d¿÷vFbÛ £‰òM×TÖa!J$?”:èúú=¶8Í~ˆýüàfCºˆ‘£„t‘G\_$pŒÛò¸å~‘¿f°nÓž¶ëÒFv:§Å’ˆÐû•­éþñ ”|æ·+Hº¤HšíkÜ79g†/~º¡¾ÒøŽß³~¯DªR›a°Jmí¨FnrKˆrÑ6¸µUÈ_  r3±Zìþð„‡ˆ€°âëYÙY\ŒÈ¯üçYnõGD4'“æÅ?–2?è^M=+4§'‰z7XðÍeݽ°û¡@†ÎEÝ@lñÜŒ­wµ±ÏO q0‰ëUä¿PÕy¿Æ 4}2ÆÂ!"ÃTÆÌ¤žŽlX²îhdóx Dá†Õs S•/ û›nŠçOÜŦÄ7aÓAý΋ª¸Õv{T‰È†æúTêq Ø—Qá+M?£E¾ô‰\Š€ÊUãuâÏïN<¸Ç´sVuV¹äQ'û~P«9„¼›«X0úÂKƒ=ËHå+|iÆ¥"¢Gò\)€Þ÷ëÌ ¶–á¹²}Q¤ Íj„+?þãC(#Ë÷ÆvvÔfáꬶg;€YŽ®ÓHM‘n…¯¼eFuv¹¾—\¸Ç‚®Þé'G‡ÿLUp×HH%`Ë3­ÿÁÞÁô)AÄØF=£ <±ñÈ‹i·äqó“H1£6›v†¯ ßbh£ŽóþO¢a#ß*¼• SFo\Š-[dÐ7’Ez¼¾H†÷jd,+†¾3KAòÒÌè²DÝüRPlWK4R²îðŸ˜¨Õ¦Ï Fù˜1´»–ÍóJ‡}¹ñuÜop^Ški1ÇUuIBb`©_ƒö(W]øa À¿x'YÊõl$ ºxÍÁ÷{á‰R2R÷o:êBÁ{ $ÉW¿°¼Ø7:áMZ?ÓÍŸz†Þ´ÂY @ ΛcX¥ÊÖ{ëIàÃá°š¢O£}-ÈÜ£ÇñS2_’ÐÜÕ©š©An¿ò~;\?3Ö|nà%–¹R28צRvKDæÎ¶>oZ©)g#Ç@ jL«Ó}ò ö^Έ6sXJˆ¾# ·½Ìm—±^c¼?ÎÛ¾¤ýþ¤Ãzôªé4ÍrH:B@¡Us"ïÂ$õöÂŽ@MŒž&AX_ÙêäÃúk1 –åUM,ýÕ=²™Ÿ†¾¥#Ïšk2Þa`µ@¦*ŸØøØ;Å]”q´B‡ˆ!—€…"±s£Ë¨§}?Fú Û\‡S®![ë(z´¿TváNUl»ïË K1J3”£)wì+Km¡ao»aýȨ ³1õ~ÈÓÆ-xL3z$´ùÓaŠ}…N¸ac5j4¯™«9~ïu¥cKc£cýByê¤yú[ª¹ŠÔ1¥õÕ&I‚“ø 8º€Êç‰Í´ýB«ÇÓŸ_šîZo@¶ô«J¼®è2Ƕ¢ÐÉkÊe” f5Å9RåÀîl¶JF¤€’ K¯ñ™†¯’Üè¦ù\n]•ºóYPú“¯z™d÷˜Ѩn’²Äç¢ñ<«Bß1¤|éñ°¦üQƒû´t™ ±8"ÑõCEú) ¦Dèç©d€æÓ¼4ÿ~Ö¸p)­•Žê泡ó8[hhŠòDÉDýcÂÏäÔtxì¬*>ÕZñ‘¦Ø0V_…v6¾ç^LVoHîWÍåK¾xÄe󾬧B³†·æ”ô¬™úóYìA¨ØÔäÌäê#Äø*ÕÚ/LÁ ÏϦ„}uÛþ€Mãh&–Õié®ÈúxØß. º”C]Ø'\9MÈJB9hr¤ã›z**Y‚·§%â±,ò Þî~Igÿ‡×¯ÀïÒhݹ°Wèvæ¹&”Ä8úžÚ €¡– Øm'*ò½¡(ôœx€QU„qÙ#Ã)–sâ\dPâ¦-÷çÝ~§ü†Þ·óŠûf-ÉKdù´¿5.wêÖÝ0AF ½9ê‹Í*²éO\ëØŸ'úc\k@N öu+5»rF+jf1 Ëð÷ÒMà'kO´°#I8NU3JÆÐ¥Äê?®¨ú? b”¡Œ©·’îUy»ºuæû ‹OÛmÀÚB¯$ÚÊr½ø¾'(ºxï[ô.¶z{âÀäE墜TÎgbX~"ŸÆGV‡ŠnÄ- J}Šq¦þ.åšÈeŸf„üd­#DCùdÍjFú#0K¬ÜXm!ÞóÛ#"Ì´znDÝk¤'ÉH™;ŒÀ#_] ÚzÔÇ; È'¬t§SÑÊš+ ¢â€Ý[öÅúƒÐëi,Çîô8Ïå5Ï÷Z¯¬u~RÆû¢„xä0 ØUG™¦›Æ½O™°¯>´1?µsy¿?bûœAYMÃõ &™¦ÖyÊ7x}*EfÁŠ… º:±f¢ ]>ƒÿÝÏžÌG;j‡{Áù’¥Ý†Ïš_§™öva™/C©$çßž#Öù¢C¨´©Jzã—ãèúežôޣ߰f1Y'^œ‘‘ÆÖð·Ábˆbš™¿Üÿ\ߦ8,‘Q-ؾE³¸Mm·×ÚaOÿî­€tIj1;{7˜ã$QݽÌyÿò-Å$\êàór±YWb/ E­È…fý†ɧ켚“xÎèHE¹Å‡ ¿ìDx‹lxœ‚Ëݦèž[y5YÅ>¨7­.E¼¨ê¾œYsõB–$UEŽ·‡%Ëûñ•ü"sgOXB=/*/à€foc¿¬õ¸<5£ïuDzÓSõ˜ºx„Åãȶ{äGÂUÈâuJY-™8¾G²d÷H?íZ>%ËMóºR™z,þ²á)m^ç¤áa]â˜Ô*[ö­éªŒŽQñ•ø ¿¯]"û’T4æ·GL{ùmÖ÷Aj „C‘{Ô ®]T] \ð+ägVá„Ãü~EÃ#3îЉ¨ ©ôʯ1ê^-:œ±ÆÇZ‚±ùþÐy»QÝW=T¹Œ5Ç×y0Ùj–.]{ÁÛa6¾´¦ÄÎ!ƒÌ¾G Éss¡šÈôÆKs‡Õwr°cê÷ó¾b¬Zhµ*äÙ›æIzý½˜7þÛht B­P‰ý‹YR~öËÅØçœ–báté$4Ñ ’"èÕ§¿z׿LHîf"Ðäøá×uÒN‰k;è·*ù„e“»Šx#iLµÓ'êŸtÛY…,П·¾àÜW¦š å5¦Ã%ÊjØÎ'¢†³2Ç~P{æÞÈ·=cE«è"f*h`ÜÎ6ÒÐ R(i—p¨Õ‚o¸&¥ãÍï!bÌî9ߘÌÕ]xùu—$OˆÃ« 8ºq³§®Ýp}}Þ/Õ\]ÚZŠ/• \œƒ'±´¥ðŸGæ$— Ɔ „¾ÝiðI]‘ø„®å W»™hÂKsç,ã>·IwÍH1o{”›ñY»¦§¨ßÐ,ÚJ©åŸ|Í#yäÔ_Ê’âeŸoMÖ?ϼçŸUéD£ñôÀÕ‰?X½¥ÃíëLqÑkx»2¾Èšº;Ì^º w—MHDG‰ìLb³dOåÂù5?ð{©£u_áÒ;~GòmîuËO Û‡žëLò¥Å‡äáÁT&—"LæäßЄõ:IW­'bõfIaAÒW?½4}9œÿJšôJšºÑQ©€$ù3$ªN§¡QõH¶cH cïà«ߣk[äµ”ÛÃ-lŸ “–ÄÕasþ‰Sjeqò÷tì#¡»˜àíæ¼ KšbävÔÜC޲†dOþ·Ä™)TŽ'·ñ*´{w(ZŠ„N¤Ç‰zU)âtc³o†y«I”a¢†goôš4ÔºD› ZNb.8(Û´÷>5;ûlz9,tM2¸èF3T¯LSÑ㠷áš&ÅÖ4òâ{.Š£íÃRŸÏÛ©ÛPy ¿ýJp˽’™t;S£šžJ­þ p¾7ÿ+¼…x0´«Ê‹ª<äúm¤FüµÎ€é>m“Ë«D‡sÈo˜îÔÃ)øçoå;Ô*b‹ M+n@Æù‡¬-¤pësU¹üómYéÙh¬•$ójUê5$ö¸{©Ž”G ç†áEß™*=>]ù¬•¥”J ŒÁ(Ÿ¿)-ZS¡ìRù,ª£áàŽ÷©xBïš.$8O>œN0h§ép0IaûüË¦Š¬1ÒÐ;IÆ-ÜôÚQ¬Ã޾$—ƒûè&>ødše?{”CÊå‘ÝÄØèæŽe¯m¼õ™Vfâ;yrÙd"3Þs0{­©©|—ۯ괶:Fš½¦<,ž~ô ‚Ò™bÊäYiYÔyÀÈ=“ãržw0k²Z÷³Ã~A¼LDÕ§òs¹hìf ì‹ÐÐ@QÞÚö× 0Û—GŠÃ˜2oŒÝ¯ƒ¿Fl^zÙ\ö?ÏV*›< rÖ‰åùüZ s´é¬QÄ´Z{Ø©2H–|p>Ž@UäòÊžÒ·Õ¸‡ÚZp´\7›bÂrV>6í“0$ñý±Ê;\ÖA2½Ä‰Z:$µAÌs6BP¥É·àPjþ ûåâ˜snOaGrŠ]Ícb^ö=¢XÿÌ!îç½Å{JÐ5¡¡ëísªÑÔg‘¸½à¤5˜Hf¦Š}ã#Z‰BŸÂ#%¹äy}üa¹o¤fÊ3Ô`SÏT‹S‰Âûè.KKçó„:þ†o ‘#/ï›0Åíþðñä=õ\³üÀró³õËjž`:eCɹI±°ºWëQqd²qVmŒ'ÓšÕÖôíúbT±šC_+ne¤.ÛµÄéS M¾wR9ÇTÕQD爲6„Ò¨áZƒ@)[Í”ëy‘/¿]ÕÆtØ6?¡n &£Ù.<–ìñŰýwv'÷CzmF]‰` >"/“ÿâ Mº*J¼)Xî¡+›  e/@?>'îF{]–D™ë iŸS{=nXî’ĵ"ºIá¡"°ªx#I%LÞ¹"QùÍÜ^¤b#ô\Ö»ÛðfDÃÀr¦ÂqãE…M}¤iöò¥\9½ßø â;ØOÍh/²6õÚ© ¶Ÿò(ËÕWòþ”­“×ÊÊ.éhÄêáÍÙ‹¹ŸtÏ¿)»Mv3~m[Ѩ± † ZV‹ N±–ØôôR`Ä÷u§@/erAöáüX4ÊÜçCãÑ)Þ× smœz»Úd–eµãM)mS~˜I%÷®žóV¥ùº=;5#+òÕ”uI6úY;ø+~í¥Õ—ÁÌE{ÏÚî™Gú<´÷Å·î, ü×û;Ž=ÅÕx/ŒÞ·ÍN,cË•a8¡ù×=©ÉÅ«§…™ÑŒ ¦V‘ÞmÓ ë7§~E.G}E$#ñÒpöâ \HjÊMH×-ƒMYÉG{Äåub tYvyìP X 8ùxb“3YÍÛ2Ûö ¼&cŠœ>Žp© n=ý|¢Ó—YæÊ,ž]ð g-ùH\&Ý= R0TªÜËž†iïV„»–Ëí¼8ñ›oššY½€…:Æ›§4]?F6I£è6]1ÀEî‚~aaÏ^Q ‚ņžHäé˜v…õÂÌ#)Í4dïCk0Äý Õ6ÉŒsPsÉ1”$U““§õw‰ž¨ÂyN„8è¹N7짃Â嬥ª±dÈ­š²7áSÑ©&UNñ¯•Í=ŠvÔpرÝ~™ˆ”:¿c^¿ÏY*#¼ ÀLà\(S··ë’qŸSGÈnÔÉÐ×®7Þ×C¿0n|vGM—ï<ŒЩݸd§Íîà{e‹8½y2^ó8;mc˃Jx"܃'…ÑY%ǷMË VgìShCsâ®÷¤ ä7aVYlsÄ21z€—æ_Ieçðo‚ rdѼ­ùëiäÖãéÖi«—ZÛÏtKÍP¥³ûƒÖ6s2^\Sb$!m|÷¤ÍÀÕX%xŸN­6åLûÞmÚåÃ}é}÷,ê’X,bVˆîÛ ép…Zœ^žMpÝšn¢¾µ$¨4u·–£’òµuRE‰ÌÚ'Yh8ÊÄŽŠ„—^„dD›8ÓÙFÎU¬©[¤½:_@õ1#×”&ª%­™.ü€?ù±â&5á´q£µ¿ñ•š;Vé¶î§_›µ™ÎWjß>ˆÕ0úòÈX¬Òx‹óívk”ËN„õ¬€±¹wÞr v D7ù–,³«Ùû¡Ä—σ¢>¾¤›}R‰4?r×½r  á\ñBÝ´Z'Ü5–øH°Ó(BÛBDf+vJuäyúìÚ” N::ÜéµÅ{•€¶f>™!ÑÇ>»|å+þ`žýº°kI½j 6HÁðjÙ7"óµ²ï° ¹ ¼d¡~ëJÛ¶S×!U{OÕ/JÈçÅlŠÈtÛf±–'}èÂnz¹R¯Ê÷Šl·6ñÐ^¯7 ½zéqg µÈBÈj)ú÷¦YÖÉí_xxÚWë /¾v ºæ)½Œc"’j§ÌüªÕúËÚ Q¼¤1 óŸ£zÀ˜eÞŒŽ-fö§Èkß0nÁtS¥pS±%J[QÉóšæÅkç1¤уߴQcNw[ÛÏ4¼ŸØ’K—²G„ºug¡èN)f2êDŠÌi }l^›‹g–º%/—¾™élä8¿Œ'6CÎ1^‹Bãiío[dT„ò\ª{ÑUXâ°dí8Àš•3A6JŽ„ïµ‡AhƒYD€ŽòI|šz1‘Ð* €2N,×PôÀc ‚9‡}’Þ :½Ýmª+–e·.1hu®Ë´›´ÆlÑn´=#?˜*ÞÛ‚ÎÀï~:K¼Æ¾Ú_XfŒóÀ?ß­¿>–ÁVån·_@Q™°ÃÏkô»2 endstream endobj 276 0 obj << /Length1 2722 /Length2 18086 /Length3 0 /Length 19638 /Filter /FlateDecode >> stream xÚŒ·uTÚþJI·tÝÝ ÒÝ!9„ÄÐ)ÝÝ) ´tH7ÒÝÝÝH¼9çÜ{ôþÞûã­Y‹™Ï·sï ™²“¨È(²sfbcfåˆ+¨É««³±XY9˜YYÙ©¨Ô­œm€¿9ˆTš@G'+ÿ2âŽ@cg0MÂØ,ª²ÈºØØ8lÜül<ü¬¬vVV¾ÿ ‚ùÆ®Vff€,Èè„H%²÷p´²°t{úïO­)€‡ñou€¨-ÐÑÊÔØ `ìl ´{45¶¨L­€Îÿc‚ö¥³³=? ‹››³±­3ÈÑBˆŽàfål P:]f€¿Ò(ÛÿMŽ‘  niåôK dîìfì€ 6V¦@;'°’‹ÐöP“‘(Ùíþ–ÿG€ðŸòؘÙþ5÷í¿ YÙý­llj ²µ7¶ó°²³˜[ÙJRòÌÎîÎŒc;³¿mœ@`}cWc+c°ÀßÁ¤DUÆàÿ“¡“©£•½³³“•Í_Y²üe\hI;3q­-ÐÎÙ ñ¯ø$¬¦àÊ{°üÛbk;›×olnegfþW*f.ö,vV.@‰ÿHIˆ¿i@g+++/¸±@ÐÝÔ’å/'êöÀ¿™l‘Áyx{ÙƒìæàT€ÞVæ@𢗓±+àìèôöú“ñ¿‘ `feê 0ZXÙ!þ¶&ÍÿÁà)p´r豂‡ Àú×çß_à93ÙÙxüÿ»Ñ,ÊêJâR ÿ&ý/[L äðbbg0±sp¸ÙxÜ|Üïÿ5ôo þ›þßTec«ÿ„÷‡A;s€ïŸ,Àåûo&®ÿÚÿlà=(‚Àc ÐþÞ}V.VSð¶ÿß»ð·Êÿ× üeåÿÇüߘ¤\llþ– ý¯ÈÿKÂØÖÊÆã?2àÁvq/‰¼*vÿWT øÏn+ͬ\lÿ/WÆÙ¼,¢vàgâcæäþ‡lå$eå4S¶r6µü{xþÛ°+; 2ÈÉê¯ÀÄöߦüËo ©5øq7ío¼`ÿëUÒÎdö×&²sqŒ=YÁ£ÆÎÅðb¯¬Ðýï)°0ÛœÁ*p†Þs#â_­åæ°ˆþEúqXÄ~#‹øoÄ Á߈À"ù/âa°HýFl–÷¿;€Eú7â°ÈüF`ïr¿Ø»üoö®ð½+þF`ïJÿ"^°wåßì]å7{WýÀÞÕ~#N‹úoŽEã7Ç¢ù/â{ÐýÀ‘ÿ‹8À‘ÛÚƒwã¯Óï¿T6v°c'S+pomÌ€ÿÒ9Ùÿ"ƒGÌÊÉú·A° “?TÁQš8›m€æÎ¹þCþg·þUfû‡l tþy>ŽéÿG\<ÓØ·)È<ÿ†ÈùÅÖöwŠ &ËïÜ8À©™llŒÿGñ;Kð(²ÿÇ)÷_|ð¢ÿV—Âü· 8\s+×?lüŹüé,bñÛ"˜oñ× üS»åïLÀ³ô°·Úý!¦YýÁ‘~ü‚[kýçwÄÜà*ØüµŒ¿ùàRÚþ†àC™å·+.°-;ðÿ®ص‹­É_ǨÅ!/ Ðï Á6Ah±±µÿÍû°ßìvÿÓlN¶ÿPÿ·ÕàÀ“ ¾Áÿåþ›fúÝPNpaím\þH üþaqøm\U3ÐÌäþ±©”ž œÝo \! ë•ç‹;/½ß à@~‡¾#Xœ- 8Sg7Ð àl\~1ØÃß/'SãŸå÷Ìõ.§ÛK6úG ì`¯@p©=—lÉèøOÿsꚺ8‚kíü÷ >’ÿ‹ÿ~ î@SÄ…Y©@ÐÇš Öûo¢„nL;?9z¸5n_]H9£m ·˜¡ºñ¬K9sox“³$”‡-…*õ  !Câ%£yܬùÄÚ˜á0ßcBI‡3×¾SäG>‡§¿`í!ˆÂKýr îÑ/}FVv«C%$>Š©Âö%¾×ÝÛwP‚%$)˯@PÚŸ¥ãÃy 8U’¶ñQá‡j—`ýšŠ$ÛÑ0ñ@#«‹Ôp|÷¶¢ Óhf¶W …Ëw:ä=¢s͹ ¡N ûhû£e›œH;d'caDÍÞcáÐÝ‚¸ Äç­¼2 :§b§©ù%s÷X\“÷&¸=™Eg⥿šUCF‡káµ¹Öã‡Å M•€še·¹ù…Ÿë¬îCöe½Ëz…Œ@/Rf½Ú'oI`=Ÿª€lKEoÄÅÚƒÂ&£jUÚ“˜­b‹‘ÒÕüÏv>ž—¼^)¶5·e 7¼”vqÁ…E9Q¤9 ²äBê›·ÙŽXF¢:êN™­ÌÙ=¡„½½ª©­Sgâc¤? &%”U6¶?óL]̃ǃr¢Òf„5?Hô;ºU ºœ¸…,"5t0_ìYo¨dÃyÆv±§²ùœˆê\o×DÔ)ª %±a”?Å\í›É°¡ÅìGY¸éB.(‹ª4 ‰¦ ir˜·¤W $RÜKñD¯ËP kˆ{†¢u5À\ê&¡ò™¾—gÓº&ÿWŒ wËFq¨&ŒŽ$¡m·_m?¾\ÔîÃç{Y»ï¯ÛHSZþž^쎟žIÉ”¿ÈI?<¡swÄì)JO0ƒ• å×ÿ8ïjª½û Œ©©3ÆL⪮׹{V½.£œw±F›­lA*¼øüusÅRVŠó¸¦NÆÁù(Uå#KQ¬‘ÿóÜ/w’ ’—_õ;žœ°Ïw| by0…Þ Á®{ЧýdcßN–€ç¡°”âÓ•á‰‘Üæ*ú2lúQŠ”že¸æa9^êIO/€FßßáCC-&•IÑó¨¡DJõ¡8¹«ˆ æM†Ç aÑírÍ2Vÿ.Üu=œ*†Š‡x¹ôŽ[ò9 nn©ºÞ)D+ºY¼ºi”y@Œ_(ÉOæ²ì<˜5í†ß¿:×pV¿ocw"m}Ú ”G+çK<<âd>)®8Ý7-í¢ä›ø¢ï¿"ÙÖe?¨ŒéØŠó%¿±ÕrŠûñãMV‡Ñ†ÁøõBOP}ŸpìEÙ#¨ôíÒUB¤hö´8㸾+›Ò`ã]C|!y$È”ÝÅ>`^ªòñ⇨XÐ)¾ à &Aì¸Xê%ä 8  d%žñ¯|:Q§²-˜z€èΨfõ¼ô?+˜°M‰˜èÒ³ª~BT/`®iúÎmX(¼íöùAºô@R!“'ªé*›ªîl¦_Ìf—9µk†¡‘³f”úíùk›k {çÌ;Äz¢% “á'-ãóYk¥°¦±ƒFù!E\oÉÔOI‡#ŸÒ2$ŸšÕ•‡?°ÏÒ§îN¡ç‰·ÚSa3)3~Á매©uuV}à@©bÄzÃk¨Þ¸m'RÍê6óäb'‰LrYã1a¿îÞ%ÃEÎTdb°èÑ%x@_`o°l3/½ˆá© d¢oû–Õ(¬:pYž…ÕÙX¼Ymú#ådÕgËÐŒJ¦dèS‡/1ê:Bc¾}wk‡ Ž`=¯ ü·g/9f7´'ßzÓáŸi*óÆñäjø5Â/»Ì ý…Ô›‚¯²SKg5 )AËáJ—Eìõðd ÔŸ"Ýü%¯†Çº*";±ke‹ónøüËÃY fë{/T vµë='<3s!ç•ÆñÒHûè³GÛ3³b®„ȓ֤%+Ù;öMø4ç%ýÉ6:•Ê`U/>ñ-ï'¼ml¡,ò½$sjyŸóIuí‰!…%ÄI°:|áPr£-]ã«ß0I^¢ùJx-TfÄÅ|¶p”÷gŽ©_£sOzŒ%0v?ƒ£ñP ðÔÈñ÷JÑ;`Ç„˜9êh ®Wa7ÐÎD>5Ÿa­ýh0"hšJ7»dÑ»;S-Bò~Ö=~n¿i¤Z6ž‘Œd¡ÉU^Ëe]µRÃ=æû×ÃFx„kÓË7f–Yœ›k}P¾­ƒ˜öñ—¶ ÔœÍÚçã–]·Äã>“ºÊZXü¸^³\÷ÎÖÚ’Í> .PãxèiЧ…kô3Kõž*×ÛÆš>ÝóB7²ãÝ£2s¿ôgÿÄMòþ¸‹n³GzQȽdO©““¹þ“.¥ž‘ß3©° 36ÒÚ›I/Ü·YÒ3ɪ¨HgÃtÑÇ>ãLY7ˆ¶¾¶-Û‡¨ Ò†œ£emÐ5Œ–óx„Ãî’Æ8¯‘z– õhLÊ :R𥒮W㶇Æ8ã0dáÞ“¡,:–l—)§›”¨²ße•u5e1 p’f/äF̬èa°…°à}¼+S¶CcÈß|œœWÑ6UpFJÍŽ· dçáàAÔ∇JcµØù±W|Œrn6%(iX–.Æž4õ“Û_·ÀáH¨c ‘¼Àp¥0¾S’Ó÷I¢_ëÞÉdŽ™kõ=iÀw©n: ¦5è»ñv–”FÝ Eú|¥cYõ·7‚o:_Þ†P3û›½˜Ü;7G !÷ÖË­2Äñ—âH/%@nó}ôQŽz§i’AÃ]¿V2‘”™¬ÙE`˜íéH"Ç‘¬‹Þ ¼yu‘‚múEÞ$i¶AdCoj4ùÍàGÌýT5Ò ÙrUzjž÷´ô€Ä÷2i’ÐÄ#‚H¬ä-Æ ¯ÞÎ,kËž§ÑNÒ®äòÈö¹´ö:n\¦ ^Æ«ô»f­<ëµ ­W¶¢nôm‰PH ÷=¬ü ˜ñ“¯ðƒ+’éwÀOÎ÷Ñ¢ø}‰Â—‰yIë¶°?\©¦» škVi”N_pTHÛŒ‰_Ç2ì{­Ou´<¦ÁMÒa櫘H2Ê Ã0‡p|²ÏdäÜV/ ©âÆŸìäÄŒHr4]ü¥æÍg+SXÂÑÍF}To0ÞvY„°sˆûsô‹÷u¶â¥aÏz“j.IÏ| ¾kXÙ„D[!|w¼À]¹jÌO¸¢nµÜ»X-ŽíW5bñp|^k+›áŽÐ9m€ÜIàà½ém !)K Z·Ô+ÅFèaç^iZMú)?{¥cúÅ|]ƤÏn¶q1µYì–¶Nljë¿Èô„¯§jøÒÀƒí>›}U³§×õ+{Ë63»<„'ãë.0Å”°¦ìudè—ßzžÌ¡<~ ‹2E!CuüñNý%wºÎæå§xɾxp'+};€Âµbø`'Ó©Ù[(8OË1±R«ªed§µƒ¿èòŒ&árA~´Eº¸€øŽv½Tò«9òÜš@•åZ²ð 0fÈe}ÇG5&¥I²YåøâÄ3g{Õº=ëÂ¥MXë€ö_¦öÌŸ#„ØEßÊñÒ§×¾às¸ UfèÃv;¤p#ÖÏœ÷Ŷ­z¥Ÿ%7È=êÒd{Ãl"ä2ö¤—“¨å¥‚ÇçÁ‚¨Ãw|­­Í5w˜QÚÃÄ–ŒÓãÁ­„åÔžp¼¾ðÃKßá|úg‚£8“nµk6ï>êE"¡Â-”«\ô½­ð•¨KzéZBIu}´£­‚J;Äà`[0›fÓyr!”žI&FQç+bBº5L¹ŸÌÅŠáå@Oók=ÑÌ\`“ÄüÄÚ”ÒûÁt ˜ùŸ0a'˜f|Mµ±ïzŒDœu7²Q";t¢ðkv_xRò ?7r´O°ŠEdÂÔâb*ow9 ø÷ø(Û;qe“÷8›RE>üê«W-®ŽÈ[8>@´øôM?¥Öc¶ØµreƒN=t ÛjñˆÂ‹ñ>T ¦ƒŒoaþ lyÖ›—8vãþYÆ›¯ûú£f.mƒpíJ:ýÙ:nÃUZr¾z¡Ø”ûˆ¶›ã;g ì!66¢©rꞟúׄé¸lkÚÃ@D{!¶^KÆó­óiEáçA¶§ zÑYJEÅb¿¶k¤OÏ{ªËös‹u°Æ¥µ3¶7<¬ŠøäP°ˆ›…­Æâ’r¶ï3ÂÛ¥zu£î!¿pƒf]yªÝ­ÑÓ½¢Ö-Çéª ZÄ ˜¾™HÓ—âëÖíq7fŽEþDâ]fþºÉùìó›63EÜÕÛͰ*ÛX ]æ5Ȳ^`2SÄùÂÔöÓËRTF°j8O@AúœJIÈæB–ØuJºþË·BaÑ5|ˆ]å­=V¸OÙÆ˜Ï ßPyÙ] i". ù²âµBr}tTÌ…¸ºØ2Vù^M‘>‡9û$³Ï®Fúq*¥~µÃåxÚd¬lnçj8QlΕ…™œ'k*=J\;$°û61y.¹3{‰}P#ÚvD(E ”ˆ½hJI\]vJ€_†¯’6n»TÔ™ ÚÙ¢Ô8r¥‚Cž³Iq®^« 7n\Æ*^ q’Ëù­ñ•AÑ•g”w,î{†‰¾mYC8;gÙy Ï—TáËA"7ÆCü˜eŒñÂÀA$M#g’Ldø(F&sKÀU:"ÒIÜð³xXÇw¸!v‡ËÈ(ãÆt7ú¨&¢bÓtÕJNHš6îÁ® ذ½_:ÓÂðJÑ·pã)KïõÜ{’ñ—ªþù~,‰sqvPsu7MÃF=YœÌm:„ƒ']³óí Ësµ7›-%<*•$T¾â¥FŸ,–ÇÑÅø«‘öó­sÌ„/Húd3Ú:•uôÓáçù®G‚|)àØDóNŸ ý4¾†åäÂ`ãªÊÉ—–¥ØDÛ·} ç§—´ž¯3³¶<¼ÈôöÒVzŽYKص3jðª™NVãݺ¢ÅÙD)òâÐ7„s¸õáò±ÑjV:‘"”CÚ¶T¤a¾ ‡gï»—»Ìy¬\m(·á8µ¤Š"tµB€(Ý.V±zÿ±@<´¦RYL,‡v~‚6‹{WxòîbE(Ÿ¯TŽ÷cßrì 2[ׇ¡p×~ÿMy#‘lðë²,PewT0‹Èí\Òo­’i¯ã-^8\»³O½;/Ý3õ17j(®‰p3¹a1¹öº(#t›Q•Lõõ¢æ6+‰õ41œ”Eêýû`1$Pû³ùŽ05BQòýƒ”€¼Á{ß 6eÒÇËÙ”¶T—ÖM€šF3cy"¬* "…¤ï–…ŠjI†ïUHm“(3Åaî}œ4¹ý*nvªm\Ýï£\)K1‰i¡×íßôìÅœ÷•š0bœö×X¹¬·Ú÷fíÃÄ!ƒÛÚnf_FñlfTˉ_õLYOJìTdŸçuiôg©Ôðµ}-ô±{þ‡ÁèÊV}  Á9â «(ˆt( üÉÔu=aùqäýäz„gX»O;i²”hElÞ°Ë5Ô]!Ù΢€Ûº6ëóŠ[²”<-“™Ê-;cVìôVž+?žµ„L©Íþò¡zÂu P–aCêÇa Oóeϱç§ÄÍ—G&sŠ'&«¡Ë(_e_ƒ¸ÌÇúù(j]ÂQ{¡Rô‚;­S´Ç®_ääùªà€KòÒDè‘lß2·¼¾9@´¾G0¼dˆaÞà-õ#{F„»4‡/ÀââB@õ*ìDxBšYA¹RÛFäM‡:cà¨UIàÅ·0©ö‚Š-S›½`EtêÔD@þU"~W¾x9 ­ø°$±Ë?h¬1p'µL¤¸XùdhË]™ôyTãñÌà4|°©ª5êsç‘GÒ"¿í¸eŒ dëv rh¼æçQ;ŽÀWU«Ö÷,.ÕÜÇÝAãZ2*!ÒV/¦F¥Ôž.Þßõ_eú =ä’MüÒÇÌ>nn®ùoºS&WêšmÍ]Ár|# …ä³¼˜jvcוpÙôqVåäRxzi馩ŽL*ªVCXÖÜmÀ²¦!ïÌð{ ¬+”âw6(-‰µºQãµæ«ëäå†òZǘéŸ[¾AyદKÁ­”`±­Í$pBñÇ8ë²çâˆ,<%ë"¸˜&+¤¢æÝ–ßÈͦÃÞo¢ÿ ¿¯:¡q±e©.ê¦/û ¦Ùó56ú¤®öJMV­È×'ÒqÞS*‹Ö¿]m‚¦2ŸŒ–O KJð¡w˜‚ÕˆÕYé]ÛS+G˜á¨ü'Å›ªß»ð’eÿ›êй7Ë\WÜ5·ùL˜ÇذÈ5Z2”µ í/ÇÐL‰ŸTïعcuĬõø%ålAÞ?'e6eàc‹Ág“Å\¿Q{OCOÓ ¹ßÜž9%€í ¾;„•qN,-x³?Md$è^g' .Q0Á´NÎø+9^Tɱ) Ž.ƒ¼Ü¯3æ|ÇdGKÚ’c*ădmOR)|j´­Ô>4kEÕØUÿÈÛë›’ŽSÏW­-¥O˜œ‡ƒïʾ·¿Œ’j' ªY`{д‚¢@kü™邌 ±N™skZþÃé÷lþ„Þä΋œR¹ÌåüNf¢° ˆ®åã~šÛ·—_IÒyHÇM‘ÆYù7vdÉ[bŒº_W1Ih©zà RÝK¼De„”¶m,«Ú•ÚãV³»ü ­)|ÓÁoTsa(Vgq#Å*°˜8¡&¿¨áùŒ!¤úµÖ²iËÐ''æóãþèöó/ÚºªüâS ;­k8,fôr”¶ËëS6ÔÜ_hÒQÓ¢|Öº%Ý3›^X#0Ý2ZÃy¶Õäû,Ÿ Ä0ßò‚:Wcla„P·RIZå!м#F­ N.0¯²õëÉv4QlnÀ›£¬À0Z1¨£C/æ¹QÑ®ÀGGÁoíT&‘Ž|ã©¶ZÑÉÏGÙUÈÏèÇKíú•æ„Þöþ¤§ºv‰ÛÃW“3ÓÖŠBðoûƒmŠáÊÈ3dr)é2¢H«õçR‚ùá;×Oþ¨“0E ެ 3¸t.Úât­ó»íó£Ñ|aÔ·x8,­Zj…ŸCN©O^Œ¥‘}r!&´¬š¯O4ûûÆ$ø”.ch6œ¸…,h=V‰’VÇt×ôÀîeß›†Ëް1|ßâ! M.š/;ÔIÿ]‘Vô¨·Ïp‘`s™6© ÙôÓ¥b¤På‹ûð‰æËʇ¨zÏ*¶‡ç)>TŠªHBñk§ ½t¸\¾;~Ž=— úqŸH¶\&YW5ì“>þŸóÔöC3\£á÷–KÅo-ÎB×" 5A²r¸ü|¨äŒ¥AíÖA½ìíG À*º…9©¹mÙk˜XBšØµJYÙCö’:ìîV7æ7·– þE‡ÌÈ/}9ô¥HO~m8ΖJ©Ìñ'ýÛORèš»ÖßÎ‚Ï Ï¼•<¥%…ñ1†}ñ‚Ñ©ùIBíT×µ%ù–m{«;gØÅÐ~G íT8Ú½°aìñøþ9T¿:™:Е9jcEvê,~˜Ay‹Œ±ÓÜzó­HÄd\¾c&”µÿ©#@:ž?ýE…ƒ|Á%•n¤uÈ÷]–=#ùvx–=ŽN_QÚÃ͆äÒ£ï¶öÏòs¼®ÏÞ™ˆ±'×ê‹ëѳõ¦í™ß¦ˆ¦g=[¨}‡¨®$ÔPã¡5©<ì—ôKà-Œ¨”$ÒÛâ¿éåp(ÊÍqr‘@[,ÐmÄl )~¢C ^R¥ŠP3cW9ŽÔð‚VžWLVfø0–9ʺ„XìîcW3'м\‘Ø(¤µ#p„±ÀøŠR÷Ó‰ëÀ O˜›H*{*ºRBK¹òC«|åŽCDZØâ(l ·œëÌñÛ|ŒrÙt²i#P€-üÈÂtµ‰< §žõÌ3ΰ ’NýxÛäTµÜœœÔ^ªrX;¬Ö‘BŸ^°£E°`²“²Ùü¸²ÅMHGºL‡5¨'·“…ÚèŠ÷jähwÄou`òêÒ¯²+3ò,†Ÿ)ÎsCÉkËNT3–kœ†Ü´A7ÒzªÅj¼Ð—›¹·ÏÄk°’xñæecCÌòRØFRk¿ç§¹Åù,׬l~‹Š¶¥¢Uq¥‘ñ‡-HãŽáÊ'å{}K˜6W¯s›2ÂAR­·EäZͯ0‡pÜ%f©›zÔ=\¹þXQ×0t š£íx¨Ä9(aBýÁ©°Øt¸Ð§ÀЛ“Þ~š…/òÒ+ò¶Od‰±ò¬’à„ÛdÂÆF&Þ(ͧÐâ¹r(ºÏ.0Ÿ«Ö¥ó&:Áv˜8\^4ë@Bù}ð£^ß#½VÒúÇK‹ìÍ{rÞRhÖVB¶YO2n ­EV Çw™Êtóï(¾#¿µ¥²p9FjBå¹GQ}#,Ü1h¬`q.—b‹Mj •­ãòî¡wL by·t«N¹Êov¨:9¡šª’‚˜Ì¥±è©ýþ‡£ú¿xvŠá»F‰{õQC¡¿žÕB/ÖNÓ–p%ö–ôH4Fæ ¹nuy5Â;.Œ‚`õL¢ž,Ü|”‘ùóÉ8u­‰Qdz ës>SUX(í9ä 0Óf¢l€Ñse%iê5Û©¢^0)l¬‘É÷¬Æ¾Ø>ažפ"«QÏž©Á Hs–eßÞôè|\W,½OÝ9âˆO”<—ó —àç¹afŒ¨2K^ï¿zÖöŠ—ÀÀ¼…6JዎFWžM‰CƒÒ¦ZÏçEïK(1ß-‘Åp.ÓG ?WõÅûðfçéóÍ„£Eº¡ÿw®Hµö}ÃëAE¢\ÿoÝ3ñp†A1ÝÅ,I8ï¶4ܶ`“ › nÏ\hÎSÑ‘Þõ M‹kòœ¤e·ÉsºW“}󽟩Å‘¾3(… KtAÐ#@ë%ä©#­ÑOÒ!ê./âÀ¿-k²—6Ë^ñJcYë¬ì»m?‘:ÎøöõÛª),ó˜/9°8Wœ-HTïe™Z½ù=Þ<¶½¹}ƒBÞÇ]œ°OÁy*HîËòÏ?˜˜¾Cæ0¾ÚÇÜG¾›~òŒzƒ#ƒ–U*ÀáUé![3‡¨:XvWš)”aYRnx[ÕzXúØ…Ö–ì…åVùmg0în¨œ:A´sÑb§½s+^¨Ôq€¿äþ©øVt­2aÙVèÁ%=}ØšÛ⥔ПŸŽm1±x,èU%B¿”)‰;æóÿf‘.Ët˜¢ç!°ÅS\É\öÓè- ½òB#žˆ3Ž0Ô(i»ê{Ƙdßyûj‹ïc.\%êÛ¯8L¯öœ¦âG£;¾×ìc¸çag!wmïéd¶<üÝŒ ™ßf¡Ö|¯n˜1ë! Dåþ†0Ëèt¿&]ÍZÅÈÖv¥¹v]z³Ù*N¾„Ýð|OøëìÓ/ꀀ‚9a¸¸þ6ÁI'ÚçµO Ûõfó½’®vÏŽ°¤ [§Wû‚(ŸK#‰eOÒG¥{…rdNjh„ÐÒücn/L §ÈøÂ혰tñ“$ŒÍIaÞ Ì™L*í:ÈÏ !ž.ð{ûä¯ô—0ÿ˜…a¯²r™+©¼ÜnÝ8²8·^!@ñ êð¶ÏO<f(ž€™Ô‹µ3º)ÁžïÔI›L…dŽ 9—dŸ7M¶ ¸ö]¿Ÿñ[p™™‰à+ë$¶šR»©•Ò ,÷LeG„Dô†¾“^ÊÖPØçÕ;>ó-8ÉGæúàw¹W_2Ø/’;ÆžC¿OëÜ@#«uJÛ—×¢b/ê•ÙkÉ`ßb-çáHI>”ÀÙÂ3”çí&@–`'/L’'újáÙïOTÑÚ,Š‚µâ6SЙíd}úq¯M°S,äÇw‡jÝj %êN™±\8O,Ý$—xE})üjÁmb_}sÝdì.Æ<¶$’OEU =ØNÃBB ·PœãfªÌ>oÍ`÷n½à›Ä¢ÓnXõéTHŠ˜£[½·d7e‡ù3›Dȳ־=ŠøCÑg©­VT:ãzç9ü-ŽM³óäg„9)@€EõË€ 'u¤Âôü<«[¦• €*Ý©Ã0Ù/&f¸,qѯqïûã'ؤúÜæ£U7•  P¯I_, –°ÂJô/Çú«Ø¥ªÛŒ•½fwx62’ü³ì>ÏÃÄ1tHGzÚx8G [¤ƒ"âGѽ¡éF”fÕþ¡ö¹y©ˆç/.ì½Ú-_Ió~RI >³~<ݘ TµÅ,Œ¹¼.–SœkÜ´Ï„†®Žé-¢Þ¼Ui®Må#d w´¢ºþšÍÿ׸Dk{©+ÿ<+Y6o²£w£³M¿s™ocJã.8"Û ýõ}:Ì9•M,l](ýñ!ÏY÷Þbý§CăùwÏ<%i£oÆuŽ+YŠßjŠÜ0 37mR•!g±•þ€-?X) ¡DV{«NËô‘æ‘Ë]Ûªê{R‹3úXl!ŒePLW*×ÃÖp±Zl7ýˆuï/E³é=“Š’š²êûƒ nœ¯ÍXûÞAdb¥¦º2ǾIo]z+6äƒ Q|€Åø mê .þCà.å ?õÈ$a±÷EÇð‘ ŒhjVÄU#/¾c^>Öã‚Y€„±|§ÈìTÿAË·Ñ–ù h»D ¿–ûœ#ºL¨" .$—Ùµaë÷Ž6 ´û'“fwÃÓØ…ªT±܃ɧ4°'ÐK¸Ö Åè &åN‘Ï@®ÆH¢¡N¤sHo„ñ’m)pwd‹3l™†5Y‡ÇX×o¯ÌåÓ¦B{°…ºpØPØYe:“ /òxÅú\ðš)«3ecôòš>W½ëJ[8 #%•Ißêñ޲ÓJñ‹‘5Þ¹LÇÛO*´½[}M|j·Ù ä?,Ï¥[ mVþI*MþeVOƒªxJ£îKÑUrŒÏœy–óF“Þ˜v\}‘`JõµO Uàëø÷<Ø]“aGàûò/â¸åc0ÜÄë kXp Eþ5éo%M_~XˆÍæ³ZF5ßöP`™lø©ä­0#cu*ØÖ×$lž7|Ð1$±ë 2©®æøž)! ;þ<Öe£ŒáÉÀêqkØXu$BªÇ’i¥IB–5KW”ÐTù•N8×ÌñZ†ø¤\Iûˆ–€uò8Ú}ebкK1!±²ÇžØ ’T2’,Ö€þ%êä°™›LÞé}| 3l±öõÚÒü}ñ—SnkbD<ª8Ö{u&%&þuhÒ()ÁÍu ÙË ãéÖð‚_`àAÇeNMÕ:“÷Ý|÷9ŒgIŽßãºæí•­‹|_¾ÒžÂOŠÍY‹§‹<Ó´ B¶’åDÈÎ…`{4Òn—µâËù>Ž÷sÚ»#Rî‡õP¡Jï´ï€BTþ@bÔ\`È:ÙêPÛž j—å°Yj`Šˆ d\,¯Põ öèÖ7ІûûÛ.æ/¡¤rºUÏ ÆSÍCÎËE:¯%÷ÃÇøßáFZp)7ƦêIË|é žw(cQº/iÚPý›u¨).6Ï}Pe4# ìa“à‘çD¬¤…b§ñܨ æyL‚Wˆ!¹œAf"P·ÁBv.6H;)߉ã Ò·Š‰.»’ƒ=³PÈ’Ht±\ÐàÃ'Òve‹½ˆÍí½<o Ó†œè¯òP°4mU»PU?Kà)%Ó`øàudHò¶¦eß/u mEµ ôMK©üð#ƒo๠/+£À+}ľ}Îõ™Dယíkž*ÉŒ4¯7¦,\•BÕ-0œè¬RvË-9i’»,Aè<-Vx¹•SÞ!aþlìWjó>…Ù”%Éê†%QGçMÊt¯ú'ÿRWŠŸo§*PEóû>ò8•_u2®ìšâ‰ö™XdÇB„÷7¦ô…9¥`‡„}«—FŠVq¥Peö#Ãïîý˜÷‹Fè-K< 7VN•VÉ»ÏÜÈÞF_£Ö^Æ«:\¹¥1"¯Ïœ …I?hÀëRòG¾7çI/¶¨ÐÂXòὯ\g§mèÂé,XCð?ß0@:m”±Û`ä°Ú‰í¥h^ôΑJ|bRAÂ&N]K®Vøª1¿C¬Ç÷†4<ˆÛ÷ã2Ͳ¾ d$~Âѯ¯ß0° ¶¹lNpË„Ú*´3Ÿ âhwßÙh YAX¨BwÌòÂJêJ>[߉˜òЛPÅÉå…¸’î:6½:|z›ôÈsï1VÉ+Ÿ(’êcQJôUrš„Ö܉®D†(LÙÚ)-V%h#ÍÙèf…­ë¨›…vå-¶Ê¬{¡)ÄŽ>S×9.Î,Â;FžûíýÚ¹1\V`õúRåJp‹‘|c)ˆrAîÓÂ?‡í§ Ä!‡º¹‹÷¸æebVƒß|P¦m5šµì ¨ÚŒ4]@½ÂÌ`ÝrÕn³Ä¦´B:'ÄÁ••,Ÿ¹â,ŠœÜÿb!àBÃGt¾ü–µC—þcÙ …›¨x;Y¾*Þ2bo\d.÷õýâ°„oÝksy°»Œ{Eb³ÕÙ-÷¡Þ#}õW„žYsŠKDÿ’ã–~÷d°ØÊÞ1°±f¥îŸø¬Åg»ö*ц·Fæhhª@ a1VÃõv‹×fÞõ( jѤÍ7Ñ6MªK9Û •¿V>²RƒZáĵ-´v¨ÔТ]nÆ¥Éñ%£Ï+‰lºˆÝ+²*¤}àEAd,õçbüKJê®7òŠår¶zª A¼Íþ·"u„yºŒηbï‘6ãÛ¶?½Ëˆ§>_dà‘}—Iwó¥B¦è@þ6zPßâM-ê<ï1FkSÓTáㄼ-ÒÝ‹áY€‡ˆ*c¿!d( ç]‹HÏ5otûµJmɵZUQ8ÿEtÉÈ=Ý-ž?.Â×]4”éÈ0Šy^Ù~{R¸š¶ªÛ1~î_<­>A‡Å(ÚȽ‰œxÐwŠŒÎL®9#¯¨— ÿÚ•íãýIØÃ=†2wÐå繈º›ÓÒC<äÞÿÙŠdFóû*þf¾ÌÖu%ÒL:³,,à"¬a,™«”²R~¯ÿ®´’|ŽC.ª™kðj2â­¼ÚÐk·Îy»wL寗 ©‡µžrPÁJ«Ä.щ™ŸÍìªûÇÔêÍÖÓͯùáÚ–wv0Þ:zèSnÎïûÑ¡õÈÿºA¼c:(+·£ëëÓ.”*Öõ5'öšKøÈ@í'vÐÏ/K^ï!]¸Ù¦T²¾ª|5M¢ì!‚7€˜ùDЭÀ6‰Ã8üÁ-ù—\`wQÊkô ÝYn/˜Z= bÝP:ß_MùÎã]¾•Ë!2t¥¡w Êyà5î$}'*ÝÐË“Ÿ`Äú¦û‚ó¶ûÖðe¾3±‡ÖQû{Âuî 5Õš6›‰·ŒÔ‰-Hü|èI‹·²RqXvݬ˜ºŠš½oÉòä’ÃÁä9²à M¯gÁÁNßп 0:^þØïÁñ­'ôs* ¦‘œÀ„ _° Xä)à,êœóŽGXÐx5f›žC+hÿЊխqCÉæç>ïÞm75lüÉ%˜“7M?ìÂ-ô‡¼•å³>ïÙ’ÀRÓaðApÝ1"ÁNÊ*™Š’å}âkôÛTÓ%;{ɹç2ÓèšÀ@ î¦ZÀ.ãÃK2Þ·ì/¶„îu?cZ7(¿KM}3ê5*šâ¼ó}V U[Þ=—ÁLýÌ«Œkíu¹…}Ö12¹(¬æšÌ~Ì5”yn¬"S"X Ñ*eQìyt=…ls}v ‹|õñ;Á ¾ Ñ…~$1û¡—r’Œ~Ù|qᨷdÄíàñ“¥µáBDraîiWvhC¼~$–—&þ[VˆGú#OꪖE•Þ:Éj:¡7-^GEª ”L3åYë5ΆGí39p•Ū=H1ôÞ»a]A\y{¯"G£}5‚_Å»^f>já.F&š_R¹¡g" ’'ualòPa¦áë‹TÇ'›ÓFËåDWxPŽxr>¿)%5ô`M á*÷ÇI|`–»côpÏÉ6c“Ÿã0Íb !ùÙ`~è¾°eE±6‘–üŽX屩f)|¨å=7ßåè>¡.šb¨áéïݘRáçþ zåù›öØu±íF¤|.²5JlB-tFG.ú°Ã`‰õ¡su!‚ÃáÖaJ2T–Gñühq>ÂÐYVqY–µÂŽÔ­a­®i8a+fd÷¬ =÷ú¦Ö5îD¨œó÷šÑ¯D¨²9‡˜œŸyö)Y _%åjXup «N†I嬾 t± Lö!Sq1ÆÉlZÇ5\AëÜ3”W-…-qÑBVWp“ߣ© IŠ:¡ÛïlñÒ$ŒG·´Ú½Òu{òiSÀ}H4D"G=­ :§®öÏž`¶G<ßY=³acÊ-X\çžÈݯ ð°7d:ü,ŸR”ª ?MÒ4r‘Qé³eõNXrMØp äp ÚD D±>;¤,˜R,P…Û½ÉùD"¦pïjìaŠø,²`—ÀwœÏF™])žÍv=¹¬Š\eã![sê,}‡O]Å铤fÖê«•¥?‡gZ©KéÁD)×3¶8â>;žR i¸“¹f7wp['tÚ+f Ròk–4’ ox³#\ë¶K¥lyªp.[Ù igÁÙ¹k*Íî[¦‘¾²ã\€ú÷K°Š˜æ “qj|-à cF=>GíŒNM”yªR<ï÷ÞCÇQ‹po<¿1C¹* +Ç™@þ¸orѾ_¹Š.Â¥ò~š…ˆNo¨žþr͵^§?üóTˆMí©Œµ{¨ªˆj‹ŽÒ¹ŒÁB ?÷ê†úhXÏßrv 8jò¡Á¸Z–ÊŠîN•mø¦)¯A0z‰ÎÌQMÞ}kŠñ«§j_èbk|R{äÃØœ›à3ëôˆoÉ=ϼ¨äÒŒ½ê;³4—oª¥SÅ3ƒ\àIõÇÝ9¤&~±B©„m/ ÕØrUák°µŸA´\½Z™ñXð¦ë+Ì;kò,|v­ j}‚Ì›ORü} vò ÔF3UTtíH].Ûcís#GÊï(Å»‡ÕŠ|‡â_S…ƒºÊ´—åÄI=6¬ŽdÚm“Z“+w/Ú)ˆXzäÐëh§È(Ÿ(Ø£™·²9W×of â˯›>½>ì¾{vm9ÊLP°&bü®LE_Ð`æ7ÔY†“‘ð† Fñ¼³-Q´ëCñkcLŒÑùÖYÍì/oW[BV”WwÑ9æäO©õîÑ6Ä;Ã%ÊwŒ„0ðxµÉœÀKƒÂaºh¡çŽ{•¬/*ç‘Dä×aY—¨1ØšË>ZΧz´ƒÃÅ)ç@Eù¨%GòÐewR¹»H•v’;·‡Ãp|ÇÁ¥Ïé±IÇëaì?§»ÞÇ÷’mFЙtÛa=©¥ðeæmð|¢t Ä/¾“´–­¿~·CHþÌA—e¼:úQ6­c«aNãœZÒˆÊ[î=Åæ¹£æXj! Óú]îmÈþ§wµ$¡²­Ü¬šZÜ,Ía!¥¯4qíØ(}C|?¶uNC'©ù*Ÿ“‰ YøëýzÜ q•X´-úÃñäØZ_ŸJûJºw¤"!P®¦.ñè9ÝVÇ"Æö\ß‘2<]Æ ”6ò¢UÇäF_Ä9Éı\åš¿gEM`%=_ÚCä\VH•<7*‡Ï„è0Æ%±•Ž×!@0éhÚUíeZÝz˜ë}ú¤EoüØo´]êŽÜrûl«ca˜™›#º$Ápª4Õ "äštÊÏú.fì#úÖa‹ çƒ}PXÒ~vcå]ýk¤Þ§²žÖ,}¡ô‡S$^ù~€™ˆ[BŠÔq8ø_­­}Eî›k²É ç_«YÞŸ³>¸°Ûd®÷Œ…ŠÜtu ªñ×ðŒEK™¾^YøÌ½7nxLöQ¼1—ñ~)¯•{Tc—êÙD¾@à¢|`PöqÊ(¼ Öÿ˜c!}…ó££ß<çìó8_Z£°2,îDÿ¹D"n.1zÙ>¬‘¦­úII´ÐY¸ð†@å]¡/q&ìp^ÜFc³y¾.ƒ‚61‹Wg> þ¬þÆ]í|ÿÉ£Ï_ª9†©YϳºîPW2n±Ø¢ œ@¡µ?XœQkæ1¶V$.ƒ³®\iÿOÈ 7õ…!ú†Í%ò"ëTm¿»´ X‡ÂäHæRÉÚ{5l3?¹DÒ¯JtWÿp3Ûk°zß ß#ÊgBö+-¹üü£³ƒê·éÍátÚ0Ü®€òeC3`Î!OiU‹Æ,Äåú~ª12õõø/8.ôø¨ÝvÍo'àäcÂì]e6߆¸¸&Àa²U6(Nš®‡:¡WŸûKüs¢ ×¹1Q³ Ú84… î}ĽŽZ'ßJQ°÷õ+á8)ãG™ “Í‚ô °hÆA(pB\1‘ô€°%œlmïCÍôe^À ‰§4£¯oE‡<£‡OÉ×X ”B1%ËÀË’(SË TFîWïY$t*0x™ù€h0•ESïOWÕ\l¿só ,νpXøÜ`—ù®ÃC{¿°Q£’óâþ­]è®3ò±žQ¦Í…æa· iìA!îðñåØN¡P¢Cò‹*ùãÕê^iñ¾q4MØé(©ƒêðó&£öºp3+H]ZÆÒ>7íB¦óB€w‹Oá\ BvKP‚ÞÆå`Í@îáÛ_üzDÖ·¸þŠ1‚ e©bC‹ R×ÈN¹ X•£‡¿ðiL¥JÓ8 ‚>!åxDvx4t…øp£YÖf°)ÎïM{Õë‰&›,i{4cÔ¼9 I×/h_|AêïÔ…Û'¡Ç Sÿ¥;Å®/tÞUëìN$°)‡RXÁc!‰ª™RàH?_›(ýƒÁd[®f±y©2^Y 2 7«~ç<Ø?PÝáßøº°5[ñP‰Y¿äq"!YûâáYM(q #3=QºWÚÊ“dÒ=z·ü/4 ²×%7e¬EqMæŠæ:+U‡ºø Tñ‰àBÚ÷À ï­ÈÃKü½ò9„NA*Çx+7nYä“?±iÍi™}¯Á\Š|,M¿‡ SÝšíPh­÷‡Xîà`mÎóE,ø _¤µ)ÀÌØ¹9¤Óa¾¡õ×9¥²AFbBT‚yÚÞ‹•„íùbEëW>XAaÿbP¿f†7Ì¿Bi)o<˜ÄcPžÎ>!uÂÞ9V‰9ð(ã÷âe-Ì;=rÃͨò•\¦ÉgËçç–íß0ê4m»»wË\+LQ²~ T¸9e6ªNE6fº³6SS®ï*ªö…˜ðµyùbžÄZG·9„rÿ%ò zȇUdf#tøÞco|t9)ƒóõ8‚}ªéjù’áR#¢x2Çôõ:;Ðæ´ðñˆ‚J8;ŒUeSСïl™Ã³rª_’ êL)ïÜË<^~¶c û1t'û’ÅUy0tçEVÓ»º·ÁT'B ä’ºæaÄrežõ–úâK^©lFaÒ7(`îvcbŸMŒå7!axqàíà[îŠn_öšâ·žEÓ¢8/æ;{,ž»›ºi®.%ŽfU5bíŸtÄZmüN×}‡˜R`ÒZv¾òà–:hú5lÈò†Ýð6ÃuàásJ b¸¸ˆ€Øïbb'o•pp“3>Ù@u _™ï:vSx˜ ]FÉ ô(Vm•ì6K”Yb/œÁ0øãæ_ao¢V  ÿµ`ƹlÌZo–˜nÄÂ"Ffƒô´âYAþ¼¾K«Xš Ì%Ò;¶€ðI*xü(÷ÐÃÌó¼Zבj“ÉXíÎfá ³¾ÿ+Θƒ¤åfÉç·K}‘ZcœW¸¤¢r–n»îT¥¨9ìêX2Ù¬øÇ^Ût8BO‘´=g"Ç ØHº––à§£õ1oà¦Ô$oŠ–ÑnûV–¶Ï|9‡ƒh¿A‹jT¬Û”še3‡ ‚Ò[+å á—u9Zû¹FùÕøO\ǬäPó\´G­Æî倃¯a¨} W`ô 0&§ÑáVxe®' 2/ŸZœy ½WIáË òZ(Ãz‰ ß‚rQ‡s .Íe±á! œŠÀÜ/Z¼0œÐª)UŠ Šg.hòK‰ÜÎñ=®T‰žäT‰' ðD çÌaL9kô’ÞÅËÂý$}Žî±èÈÇtj¬|¶t=Cj–±`m®V?Kœ‹ÑU|c™ˆäÐSÒ¨¤üÔw7gÀ¼)ŠqS弨Ó18òÃX½ÇmÔ Ô|»‘/:éa¾ž…c±µ®¦fµ;ËÞï›Y–ƒÑæ,T¯GCTvÚÕ öù¸ã¸·B‹Vj»z ¢bWbš«[Ú'A.hYË3GáR„ƒúJƒ—ºIP†Â8©¥-Ï ý4® Š"ýC§†”A€±+JÛþP2»jãÛ3¯&óH"º÷Äдº·þBo®²1ΠY˜N¡#2ù$oH·1a"ðÊL¯Ð"Ë gܸ T¯Y¡ô¤‡Ýέ™ýß·¹üþˆœç% %rÃ(\à¸CÂq+”SpÞ)«^˜¤´_‚»JÑàcb5>ƒž?Y¡®V·Öb„Z„ê>¡|¨÷@Ü7´žˆšEÕX8ϯ.W"/E!@´ ,lÐrT‡æ§Ù¶N º8 Ï£‚L‘s‚j¿Æºßà0®Úh),PS–üa›ñ;6ý¹?;­™" ³Ú²Ü\8@[^TæÈðÇ-¶~yiÌÝi ­¹Çm.žA@pÍYvº‚ÒîÞÔLo¶;‡Ô¬÷¶sn^¿ò#¿XÕçkÜäèð|*Àá¿Õ ³Ìòƒ³ÊŒÄOÕn¶Û”^ôÊTû€!k_ +|Œ†¡tØá}ˆåëNü c©½iš2ù:º,ˆReÿ¿ô™æL‚"C OypBj¤Òg¢áRtÏtP´ÜŠÿ#‡ö4Ž_Õ¥p­(1…CÜÍmA3øgI`?õCÊ®$ar/œÉH"J˜¿»à~ð€eühßÓGR)ïâAL^‰WÁ'š7A%$âFŠ‹ ì£ÇLÄoõòmH7[¢ZÛì±ý‹’éþ>×ê_ endstream endobj 278 0 obj << /Length1 1974 /Length2 15218 /Length3 0 /Length 16421 /Filter /FlateDecode >> stream xÚõPËòÆ ãî·…»»»»KpX¸³p  ¸»[pw·ÜÝIÐ`Áõ²åœ½Ïÿûªî-ªàýõôt?=Ó=P’ª¨3Šš;š¥@Œ¬L,|qE YV ; %¥†5Èø;¥ÐÅÕÚÑï_â.@лMÂôî¨èès³°²X¹øX¹ùXXl,,¼ÿqttáH˜¸[›™rŽ@WJqG'/kK+Ð{žÿ|hÌh¬¼¼Ü nˆÚ]¬ÍLŠ& + ý{F3;€º£™5äõ?!h¬@ '>ff&{W&GK!Z€‡5È  tº¸Í” P2±þ]%@ÃÊÚõ¯uG ‡‰ ðn°³6:¸¾oqs0ºÞ³ÔeÊN@‡¿œþr`ü}8V&Öÿ†û{÷¬þÜlbfæhïdâàeí` °°¶”¥˜@ž €‰ƒùŽ&v®ŽïûMÜM¬íLLßþ”nU˜¼Wøw}®f.ÖN W&Wk»?jdþ#Ìû1K:˜‹;ÚÛ@®è“°vš½Ÿ»óß—këàèáàó²°v0·ø£ s7'fMkg7 ¬Äß>ï&„l–@€“………‡t=ͬ˜ÿH áåüs‘õó{ ~>NŽN‹÷2€~ÖÀ÷?>®&î@ÈÅ èçóï…ÿ%VV€¹µ` ´´v@ø'ú»hñ¿ß¿‹µ'à#Ë{û±Xþøùï—Á{‡™;:Øyýãþç3«Kˆ)(ˆÒÿ]òÅÄ=>ŒìœF6N++€ûýÃïãü÷þSýŸVë¿Õý+¢¬ƒ…#€÷¯"ÞOï?…¸ÿÝ4 -à3(9¾÷3@óOûë³p²˜½ÿbýÿ<nùÿ×ûDùmÿÿ«HÊÍÎîÏuš¿þÖMì­í¼þöxïg7Ðûl(:¾OˆÃÿuÕþ5Њ@sk7ûÿ»* 2yŸQË÷>gdå`báøËní*eí 4W±™YýÕKÿ¹Œ÷vÖ@GWë?Þ÷],,ÿgí}ôÌlßß×÷+ûs ø>Yÿ›WÒÁÌÑüdã䘸¸˜x!¼wÀ;q|XßgÕèùg‹˜™Aï[ï5ú,]þ¸X.N³è¦¿ˆ À,öq˜Åÿ!³Ä‰›À,ý±˜eÿ¡÷( ÿÐ{ňÀ¬ü_âa0«üClfµè=¦ú?Ä`Öø‡ÞUkþCïù´þK¼ïùLþ¡wÕ¦ÿÐ{v³ÿÒçÍlþ/|¯ ø/|—cñ¾/Zü YÞåYþ ßõYý9ÞõYy9Y½?­ÿx¼Û¬ÿ…ï¢mþ…ïªmÿ…ï²íþ…ïºíÿ%å]÷¿"ÿ!Íñ_ø®Ûé)ïyœÞÇÍñ_…²¾‹uù¾+sý¾ïý ß•¹ý ߥxüƒlï¹½þÄÿiK37—÷—ûÏ÷ã½gÿÃþ›=f+‹Žfü!6õ!÷µ¢Œ?&Ù8‡¯"¯á´÷%ñÜTƒÄ~³F-‹öÎÿŒzØÆ8a+{k±ÕÁf±5ÜòMâÃ^iì„¶0ÝcðÆ|¼PÍ[ûEùPší‹ ÅäÑ‚Ž;>ö×è¨×‡jx+WM~üb¦!n‘YNXÅtï™aÄÔä›’dá@œÁ'¢ C„«ªê’'Y¶pvïU÷ƒ¨Jó=ªÚÍÅ©’— WqgoúàPÜ-RÕ“ÌLàKâê–¿’UU$%˹ñj¸DÕmúðç³ËU$þxæË[¦¼²,E°v0$=óZköó~­¨ôŸdô4œ (¾LIjwg1ÆËÒ+°<§– y]©šG¸q)áè—š¯)_rQá¼ 娥D)ODâlóbfI¶Ïš3BTäXþüÄ6v;R" ÿA¹•è0¥MüÓM{‹jvÓ¼P¾ÈB»¶Taú`Ý}ÌÎFrazuTž­…Ñ4£î¨|S^Ý„|H•dürdµ­ã*-JÖ°Gy€?<‘J6cuÖ!ðÖ£ÅÍQmEž—LN«15™B‚R'¶ÌžoWS{a/XóS4ó3î¿J‰/zù”.]^£Ïl5ãàb°èÙÀKžmcã?=Dñ»?ˆˆ<Òsk^>­µcPÝ\^¨[&tAWú%c2bÌʘϒ@Õ2£èÀ¤´ò—¬¼\‚î’bäkgÆ®——~> ŒW¬HÍÇ‹,.[UÔãšùr¦Ä:Ÿa1µ=£¬™‹‹“/FX=Í…œ­å <=†þ·Á¯î¡ïîØ•aõ_¶N–û^µ 4QpxüÇ'÷w¢?Ö®î9ÂÉ 9ø‰~c÷´ñÛ,ïÉ¿Òß/·9f“F|-¥õJ`2À„›9Î}›7´T²Óâ»<‘A\¤)úðH2cCÁ÷)¾†3*4{oî²Þ«›ïÝÏž4!oHFBó´ñÕ+¡\økÍÚ£kX˜«D.¨šƒ˜“Vžðþ~þÙÙ¬¸ T«8­åÄosdPemL–úUMÒj½}ò‰˜°#ÜÔé¬ÐϺ£ç‹³ uQ‚P$Ûã JJ\ýª¨ò”]b[ ¦ˆ<ñécÁX†k/‰cð Tæª4K^«\7^j[5‚-OtyH¡aÉ.ç÷x¯5þT˜ô%—¬õðû™5ÔU|TÍRÍNåôÛ=”C•ÏmD>Í£ëšÞA|Þß½çvä–ÓÄ—jÒÀ€ìD¢‹§‹ËsÖ¥pýQßw15Uƒíc>Ö‹ÜßïT"èð]F‚æ)~_P¨7àhÆ>"|Å;_‰óù3<~Êìo†1 6f²_`¨~[”ærå“PÒªQ~7ÝàY±)Ï æ‚M ±?ÇÊlr†“Te'AžpM‘o™“øTuÕ¤_$¨ÆŽ3Šõh.Dª»6sÂÛ¡øYµf2™YkÁ¼a§n£ŸþUì`«æA*Xöò¶…4ðzZZ×e ˆb1ÿ'à<÷·Â~ïÐý‡.žD+¾"kø,‰f„á<¶„L÷gv¿júQ}í|ÑÑã‘ʘ+î×3ø©ÓiØT àwîæêæïìôÅŸ—·ù “w¾dQû2ιy…b-r‚÷Æ$J“H€èO’Sõì«©(Å%„É÷ƒ,œÉ$íåîUB±t¤ædðg§fz6ˆqÿíó©—QZ~9þ¶Œ™ÏÛrlMdz^L¬p{`ÔÀ‚/Ô,`úeÇŠ] >ÂØO–½[ÃÇRôöAÇ.Iì‹Øõåt@ y75H’<èE´“ ±²â!±yðP1ã*öhÙƒV@»ýמU¦¼ß[7”ÔÊ]B:à(Yäñ·ÏG˜ö:cNMy5 ÒÅ}"T°Ü~ñ"BQ’!tg²bL .·£_Ék¢Ë®y·•å®ì[<ìÔ»`ƒõP—§KY{HS±}7-Æ“ЉE½™–™¼ëtŸŸ ºBÒIå»Â%š§Ú!¸wk²_:ç·õÇm·õL‰Ù.Úìel"Xýœ_:*ŒTذ}7LxN‹Gý?ÛÖ«ìÜr8>”„£î þ@ÇŠ†ÿ^ìž9þ;íwÅèÖÚϽ&çÇ6£9”cľÚ£k Œ ý÷ÇïA|o/­¬óÑh¦-È%¼/8~cRÆá‹=U,wf-ûjëÁ½²·Ÿ½¬Õ…ǽ9‰ êæÎWoÀkëÈ7dÕl9-®˜¢t!GÐ3'ÛååIvg‹žöÅk¢*ŸÊTçx¯þYï¤GÉmóow›VÁÉ·m#…d‘°â»¯J³­0!~Rëæ:üpmñß#Ï<¢F~žOR¶›(–™ äœ0œ^ššÈÓcef²9oVXX «Å„ õCC‘!8~P@]rdŽ £öˆ>@„«4¤ÓÆ,H2©/+ÎúáØ|ù¹C„’œ„jwƆGÛHÄ|Ä ¦_n ½ë¶|-ÌüŒøòrÜMZoÙˆHm1 ìÜàÑZÊ’/Ð[xÝÝPAÏ@ä1ƒ½Ðîê¦1x§= yGM÷DCÃþ,©¡d%M.Ék®mÓ&sr›z$Ù_›¨¹°–mí¹ =¨–b Od [¥wç÷¤Û[‚¾Q åªK{|Ï—‰4=ð#üˤѣ]݉mÒ¿'ÚV¨ Zî1_à6Â,¢þ¾32Ð#ÎkîKö>&IDÒ8g Ð*ŸáE·™8[ÓÛjºŽ}C#z ÀäÜíÞj)…,Œ©:WÿZIŸ•¶5›¼Ý9ó)ʆ÷-Uk€xQGC<Ä6øà..juH1ŒJÙïÅ+Äs"ÊÃãxŒÊ:v_„Rûõ[DD¾úwåoH¢îÂÂQ©Iy[ {mñZ¶®‚vS…à<£¾õßô»Œ(}.fË„¨¨¼ ea±²njQ´µºÔ­5E£Ïµ é7Àæ(¾Iø% uÞHß<f-|Q‡ô¿h·Ñ¢² %o[¾¶­Ëº'`ìœqŸZ Ëw6лväKxç±¹^A—½6sÐ÷twGüàupzÔ`^\i¥Òy‹™-ÞÈ_ÓˆaÑå÷¨@|½+ŸÇË=«ýêý­s®t{êØ¸p¹a›`&è=rqc²ÿ c¼`L“rË1ˆþˆŠ0µ!³"m˜ÅL ‚Ó~Ó~™ùþ|0éFÈIg: ‹Ëû¬´; ÝH5_ã·ÚBžM·Ž°Èý&xÎìûØ$^¬Ã–8?¦ÝKê!šzJ`ûm”ZCQ@D}&($ººËV…ǯ¢MH¸âðwUè8à‡[ ²ÐQ4EêüÊhäÒò¯:u%dÎ~)ÁMÚˆaRò%p ïèòDâ¼e]2Œ‘Rõ¢*D+æÍ:~~Yv)tVâš¾¦èsO ´¹€ˆÎ÷Æê „­~żÍINoÐ+„¢ýyJ“õðk—Üç¥å:ƒkû¾Ã…±Òü۳Ŗ™<[¡Ù*d©+¡QMÑÓ±îsчu™ J™)8‹ˆDƒ# $²ÐðEÎ8z^ÉéY 6AØñÖo?Å/b”Û>†5,`VÏÝ#_Í‚Y>† \ˆl7°)p ö@v/”:@Fól`í½¨HÛ½-ðjñ<1ÿñ¬ÑžOãùâêP²i=2߉¹§Þ0ƒYò _@ÕÉYêLŸ8*÷-¥t Kím“f.s#¨½ƒúo?¾Âžu>UU¸OÎ1W:®ÄNk`ùÓŨñ ‹Ý÷2§O¢”G§­ /fè}Â:’A;µîާévtsy“ÃÑ'jއÄ<Ñ5ϲhÖlý«—[õ¡s\þR& ¤0¢}Îr£P5«û w1…ù¿ð¾úìïbÝhÈbë ÍqOiúwUÝõA«S3¾‚X—¬t“.9Wž2ƒ^ht%8ÛÏ®\~´Ó9ê9öã€Iû±{S L­ÆGÕeHj¨F‚ôŒk|"}À*ˆABFTœ½IŸç¯¹[‰ôC1}ÛcGî.`f[‹ýìJKkˆY¶uk}[ž²•ÅŠ¥6´| ™ÂJ®!Œo=$±ä ™©ç°cîÒQƒ¤Ÿö•µ0 ñÉ·šD’ÌÿdÀüÑ!Ó—Ç€¸F<§Sl\k”ŒN)¨Xo¾ed4Õ2©f“θQøy-6»X%,RQ<¤#çê7­Â‚¤Ä*Zÿúì9¾ºú$˜#>HÙ4þ«~¬† óÊÓõS ë·™¡›¡^’¨ÛfP…°xIƒŠ…NémÆü:“ɯqÒå-p Ó¾8ÂñLÉrOüÊ_­3º¿†úÏåµ_X¯2£7Sò™umA"ÝyL¼œWª0DF3uÈß×ô ?6$°7M£Øq³²Á*ƒ«uxŸp gÀösÐ…Pd接ºÍW•$°Ä/6!¬IŽ\g.öBš“që?CLÕèaðˆr%%Éë)Z¤ØKÞI;éäÌçÝîåñwàï»á0ƒŒ¨z;ë«õ÷‚Ró²…²Þºq3_-¾z˜ù¿=fŒJ¹Hß5K¬Îgûì{Oçaw 8Å.ð]pâÌ8šâ;}é"YºÝm²QBº16Ýu"zƒ¶‰ ¾d×þÙ«†õ$tý*™‡bj2ªOëcÜѤa>´pû‰Æ*64g*,†u&Üp<"Ö3+_ ûlÛñøGþA1½”xMÀ ìš>¹ bûÂoК,Ëj0cô͵¢±zBX2ŽâG>GôHk¥ûèžÁÖ}<Ïrpú%P–ÑMJDÁ‹ ¦3}2M¨Èt­?û© …'5,ï¼éHöÓI‚Á+kdúq¯“vzô³àäyG¥£w¤ýœæ$ùÏòr˜Ë/ü½~ÓÅŸ³üéŒn^\©x´îØ¢¿ò$i!3ÔÀ·Ñ$n‡ Hs­}P¯Š62–D'Õù iz1 {"UÕýcƒ¤éõ}šÁÁ]ÌÞJC䊧*ä¬&ÍuP’dâÐì0éë>„ ä÷jÔÇrÆ÷ÕêM J%ÓËÆñRšežËCá/¹Pa7zŒ¿*Ë ?~¿ CŸ}Á&§u•beXí³Ë³¨-ÜÜ4†ÎUŠÏd¾fPPß–ô?bÂˬ'|âÑ)2ÇD) êk!–ux5!z*¯çœPóá‡DˆÛl!ÙÑ(Ú¸áEs†=ì :XºðÃô’äæ…?ØhI3öl]…ݦ²5&_u…µRÏ!r€ÑBËW ‘õn¾,¡jMtƒìv„éBàs$š­ˆU!å*%LÖQÕ{Cßû7Ø©Q3NÊâÌlƒRŸãó ŒF’?ŠËTmùn¡5÷þª+uxQ.•‹‚Ë£i«MmJBË= w<- a“î«a6«~Q6‘HT™°?„æ÷¶4@…Ækj¹)ç\³Ê"’%$ƃS 9º ¢<®ðв —|Ÿ ŒèÊ aêC:þÀùAmùbFï3OEèŽèCê9 x”åyÓïò*«°}u†F<[Äœ&ÉTšç]>r€ß\œs_ô²šÌhO4õipí°dœÊ€âÕ͆6ð´ï×$¯X_7=†Éß!Š«œEô6ðWã,™ªÒaho!äƒ}Óº~)ʲY2Ð7§òèçˆUÉ9:ÅN°¬?·ŠeÏ}yP†— K4_§ \Zý6‰%’d/¤òky×`xªŠi³€Tj I WŸä\?Rš§ÍããÛšKè±}9ÓÝ Ý›ìñبýx²Þ1mÛxoCKò]@¬©X-JýûòÇ®™~òµïRžYZèí_/©÷ÖV©´nÐ&”)¢7.©áH:/D<§…HÛE|-6I]è>’* ݰŸ‡k‡­ ŽÏzÊFYYµ>ŸÆ°y/%æÛ#@/Õp-<Í2'e'v]j‰Œ¥6[|Òpªràâ(”ì¹·¹m}23Îg§„rŽž±j‹gid”I¼jc ˜’Óï ݰ®OÕëyXxÍ3Ûòœ×üjõ@ÄÞ_®fr5FaY>HÆþ-d[‹4£GØ ¯¶ Û(bXc'ƒ&š5­V•ÛHkòÇ;7%s*ÒùaÝjviK¹Û4ìFŸ 9ËfxH÷ŒéAlkåÕkÇ»¶gº-Iá×.£XÛ•ž#=‡VAÕGCSZz·¾(»)ÙAÖU©ÌùHøö:Ä£ Û°ÊäRünu¤«R%jÛô˜ët>auóhÞ ¬qܤš6V¦1vz<°‡ñÒ íÚßý”ëY3?ýu[<ÏðÑX²þ¸5ÕÚuÔ¯MÆ÷HÙÜeÖX¨¢¹yƒàeNòOùUÇæ›A$©Ú«äÎT¦4²£q5Y=Új“#5W\ˆIù¡1Üsj÷N¦zK~¡„«ý—ì³¥{çÐ) ]Ú³\¼uËÌPôæ§,¾Qö˜_"Ý"WÏUhŽ·FS[b³Ô míL?;Ùs¼jµYÌÄ% ­ôÕ¸@njõûí>‘ÃéÆÌBÖ~M^úuŒuõ)b·¥ Õ ;I,X6˜aÍòu÷ï*—åÆ. ­(÷î™åš°v‰ó98å Mæw×X~ƒÓÜV›Ä摇wÛá?²Ñlúæk«B·od‘ÑIgëý%¶ÏmÝq%oÃg.»eîÑçã‹æ½‡éþáFʸ Ý6s²ù¶#~®Î\%ÓEKÒQ‚q0x? $숅þÏ5µSj–Ç1ïé7㮡¡È{=Ï ^0Ÿ¾«HIL» ?¸tŸií1œ4O½f-Ë¡fÅÍ©.½x’ˆ2`¢¸Y.pwµ †"8[¢¼nLÖ PÛ7íIñrgÃçV5C“ê.¼©–r¯Poˆ¿|jwÅÞãx=–-7¹BZ®à|PÀ!¹cÏÒÏò•Zû2Æ8ޡݰu†+ü8‹¤¼psû²è4Ÿ¼ ýp,D[(5HfÇÏõ RLh]t Âö¸X”~»#ácœ>ž±÷Ù ñ¯ËgŸÎ<îVs_±Cø">º+ÃtÛÄæ@é‹jÝ}vb¡¶mä>9x­)Ž(„ÖÖèj$¦µ|©øÃ3q~Ó).®“Ò ù·üPo{2ºÁﵟà}õa>ͽ·±s3'ׂ†â(9—‡|µ­6ä–ÁgW~µšwªåá1ÚV|Ó (^ Çbǯɢ‡¶€nPi•ó´™©/Qùj¦t yÀƒ¦ž¾»k1j´9»34&?Åžß7½ÆÀ™ þr=õ"±2{:¦:*kˆ{þ1¿ÞnSL¿¸ran´ï¸Æöƒþ8ûGˆ"(Rc'2¤èàëQø«(kê®"a¶Ê*E' ºÐÍì¦yH‡(€Ìvûãó›û/ƒç*~Ô^ùþžZ‰¤ÝTQ‹A=Ÿhý^¡µè9N'>‘ÈS¹O²ì!ºœúp Œ°˜Y†š'n¢±@º'cãáÔÆ¨t%EXÄÙñEí(¢°ÃXÄñ¨ÁŸ…eHå„¡$‰¾¥ôjs&ù‡–Ý|j4¤¼» ZÁÐäsTÎø´~l •UÉÚ /| †/l°,÷òI‘§Z•®Éw”-¢­ª¯Ú=wî¾µŠÐÒžÚù[J¹æÍœe§ÏFîØïÄ26Q`®òô¶Ó>é'6:§˜CÑžkµ’ŽÁ‘ìôÒ`1’14fˆútovÑx’ußšÒÙÎóÀ“ 8Á0 |îã÷P_ýÂñ*FÄ›!óÌ>rŸ?Ã]+[$:µA›iÒ…±¥üZ㬱ïôéâfŸÈÕrÿÖÓw–µ‚ÖÅø‚ëDz”„¶‹¸ñ“QD8èg©@ƒð<÷C³ÇyRü8~t^ßs‚G:¶IzÓf 4ÅÃÓI'Ê”qx»ÑÜt×øðŸ?üJfÃŒrmïÌ‹´bB¤ùU±¡ó¶‡ì–ÓËŠ¶«bYÍ0+/¥ ï^(‹,?-D²Æö=rw[“¯L껨2â9FÌuGMM‘Ô£hµvêS8É\K"Ìà»ãzüŽé]áqDt7¤ Ö|̘V¸¤±vfQ ñAò…ÀIfõX„â[¡/o9¾Eéo©>\kˆÞÐöËÑO|r£¸Bù¼ÄØ× õEqSzYE LÕ¨¸ÍnûåÿÇRü9C‡˜Î”º·—Þˆ®å‡O>â8Ö9‡¤Ñ ¬aüf«MƒÊ ‹©P‰ñÙ‚³tpõ5¼švÔçξ`&Ñ$Ô<ÕÚe-ï²X{î†r×çoƒ6Ý0D^\-H°ö¼YD˜D–E~o¼¿óP:ºAÑdTú¢kÖüAQ’iŠÏ©=†Â®ÿE”ˈâw‡ƒ(±»€–3ç+_n¹,q3çîȀϮì8?0m­¡ÔÏ—u®ý3¶a¥ó'¸A¦a£t0nnHÍ7ŒXMW¶è6³²ôPÌLá{F—Ú”ÊÑˠΥ®%AÌßµ3»sÙj6p£Hã¯_RSí½B7ø ’Ѱ«×¶¾Ù1 :‡Þ$N¬Öå* ì6?˜†ÿ† °ÛÛðÄ&Ñldѽ<\üá]á³H‘†ŒŽeå CdÇuåâÌçÃã{iâ­î2ôð”*F¢››Ž!tp“ùiS<ì»)ÖÉ£·ÿe†9º³Ò#‡4…InL6µéQ–ÒæI! é3i)ÜÁí©ôÃFo š5UH÷äØÀ§¾•p‰—´ÈÐzú&d3ŒS kl,•ë q_ŽÀ„; ÞÙÏ*'ñß#ÍÚ±ÌF©eƉ#‡ýãÀ.Øéåćha?Þõ8ÿòÚã3Pʸ¤Ì$„|ˆ¡¼÷<ýíV˜ÇFøLv~ö;e}Ü5´ü7äÈì,¼)z§ý™áÜmÙluZòZp²gè´ò úµpM% Å«xœ”,9©ÒWëhïžÜµ”²“Å!<Éiås;v§˜‡µ¸xoGÍæÆ<ƒ:+Ù%“x4µæs+›´ƒ:5Ɇ|ëÛ~sç* ¼G¦œ“jH' äÁ%|΋C„¬®}‘ùjåñˆÕ.Ð’º õ£ã£‡Z}uÔÕ3±qÜUô¼ IË7(ßÜda$®"¨Kä|ª 5&Ž °IGú I;︠nª¼ÂÖÑÔêsX*9WU.2_  ½‡éLÜà0ßX'OøCvDw2¨¡ù†nþ6cB£Eó7\wª =ÌŒß`ó[¤p?Dn­ùüó´þP§ßQxûPJ’û8¢çNSö¥oO1Æ6lŠïÆ“£DÔ¹6F…ÉÓÏ"«­¶fú_ë}õþ?ØÔ38V —úºÀ¦ÐK6NÛ¸·ßÑ]QMšI®©rn7ž¹©ÉÏ-b³pÊwYþÆo¤æû—¬Ý¬2¹å§¢â"°•o«®‡zã®›’ük]—ÔW&F_Ç•&ñÑÎöz­Œ)Ø7‰J ‚~Ekœ­ÇŽe¶¢dg –Déø¨~‡þN_ù’!‰Ú¢FðšÅÛsË+ísÇô®Ë ëIcŸS@ß`:Ô¥cIÙ°‰¨s¹¾2ÜŸ 5´LËdØ-ƒO‚\ÈøÓÚɲël¢èë7´êë°\iuwÞâäQøŠ.¤7™_4Œç…. –!βHW?2—/Ö Áô‰Ö3šô˜Òë÷ƒ1QµþØ^«×„eY€’•¿±a¸¦šl_ž¥—Äð^ǯ@ù ΜN aD`]Ã2Äò9ßZƒkE ñ®'ͲCò‚Ã’V½F¸ —•"Ya8Õ Ëye|Ô\ʆìαZñŒ+„DŠFñýWÒ¼‡Ó"®ß¨bº~†0Û@Ém`Ò’Þè;#ö¦!& »[l‡¥„XÁU—á(?ÿ)Wá+u–Òp~RñŠ\áŠÖ²0Y"Õ]~q[þ'¯GõçŠ@Ѝ7Mshž €ÂÊÜè¥_{øÙ‰ä‡.‘¦upì¼@,…a4¢]³­h¼ò¢Í… ÒoBƒ>Іí »ä1—êD°‰vèTÌ7Á€gJzD¢g¿ûP$ÇÀ>dûèÉ­­û£g½wOé_¯Ü± šw­æË‘K¦N7ƒtÌ[z–V^†aàZ©úõ”hΚu'bTòTÒI¨âsJÃ0¦ V>Ùñ\M 7±(7Ǧߪ‡î£‹ãP]¼>˨*GFô;LÎ¥‘gz¯¦yÚ¦!¼Ü–¶|^V/"wü¥²wÞhä_B ÏP®[¥ã΄÷y.Y‚T›ºìÛÉ$lv V ¬_ʈ¯‚%m6zu^htD½3{”%=ÂâÏ7—Ù’í2ネèm‰RR†–•,œ^ÁÊA¬Þ¦h'ðåW.®Äɶuy9ùGe²¸DKªÍÀÈ»ƒ0U„{øUR;Jg’j%€Õ_}­N&HŸ—ñÎ! u¦ÿ„ÁU¶û}ªá‘U)¿dèŸE"•†/˜pøIŽK\Ú•ÆÚ :!SˆãÑ5~p»PM ýS¾VvIÒ‡ŸœhÀ²&%»éäo›Š•KQOÃÖC Ÿ?AÆñÁÔMz{˜]üÕwA/ÑÎõÝ [:ÙÁs…Ï»±:[/uœ#E IàX'Ó¹Êh=xÇ«,CÌOxB¼"ó·ë›jiGò³~º×·ñá8ųIå’ù·Ï$)çeæ—F[¼U"At#Ï\ÅÉ7湫<†ÏytŒ©«ð-7;—ÉÒ\Ûn>9øM¡$Ç6QSŠ/õo+ °SJ\E;ZŒk§@*–ñ >°ïé/Ì’mȇO'Ñ– >.‘'j"|¢uÑ„»8…Dî*š³ÆNóýñCšTknX …Èß¹Tñ ¿òÌØ±k„\c:¡ø`Qä²T²C}½Äë"Ë¿0›ELŽ–}3@ C˜_TׂïO%È™Ÿ½20EÃuyjËÜ1¶cÏŸ4æÎ»A©6egJç ³'½…ꛃЎ&Ž‚Ñ‚ ŸðiO9Qçh/j€’èô.cÚpÏüò>ØÐ['y¨Ô F­ÔgGKBêm=–­îvZÇ~a¬Á‘ÞÈW¡šêoË׋V$Uáàˆ1C‹/0€Ó#ÝD¡¬4àuìWŽi„7`d öÐw/`Ç^N›¨]†;íT;L] SÝë“=•Øs(¤»’;ˆç\K;¸IÓ9ezºL’µ8XrQ‘P=êvÚ`óóÐû‡A yMv…²önûÇ ç/ «§Êp]: aCDzvOqÙèRy`]ªtʲ¿¸¦–ft¸éøÇ}E¦Qsåô†@ø- Û’'Ó4ª -OnA)áo›Co¹ûc “à5-§›}ž#rúé£wd Ù¢8>ãºf¹îUYÁÜÚ¾S>­z1{‹“~]ÛgSï“风9é1Ž4ö‹ÙrF2,U 6ÆÒëÛáº+¤É0„ËnõŒœd±&ypëáÿ:Ûr˜q#Hn"„gÙÖáæõˆ Ÿºo­7å9ÚN‰ VŒ®i ró!>Í»ê¦MÅBQ®* c¶—h“¡kJš˜¦øÍU±§âäËc6,o"ȰHVW¬%÷±'rL'_šì#bAÌ—IìÐê\›æ¼9öß ý;B},ñ¡âÜYU2Òî‘Hp†E‹ÁªiõèAàålm &™qqxâzÌ~I¾˜ódÑÇmÛWŸá7ØZ~NíÙ/°Ï.¬:TjŸïhcˆy«QsSÍ„%r*„í^ûº¦¾ªÉ\`˜ÛCQh1@dhù*ÔFðÿܺgÞ)at¿& à—˃ÉU¼ñ`Ó£j1·Bð7¸˜F9ÙO=<„ssÖ©»¦ƒíÇI¬ãCMõÀ&¾cëL„Eÿ`K¬¹—#á|ÆãáøeÂYV¿ÿy¡’¤&YbƒQƒk Wõ[ÊñDhh]•þ7àÕµ¼É³…¿´˜<‹>°0ÍÔåi¥J½Ó~ÙE‰GaE‹&{pž£’ãqá2þI¿™ð0÷SH•?®NiND¯w¡ƒ¬êü}ºøuËÝî]äs£LYÝm7QÈ•­e"î=9EíÞÛ€KÚC ¡|·¾œ ̶³zÇÎ%î•»ËÌø—$®±ZjéBªSššbª˜ýÝ!4¿.Õê¯Òl¥QR­OÅÛ„àÈfs•jUè™}ÙtÁÈž•ÜVØcÔGlšË(‘·Â&SÄÀƒQ)TßilïÊöè…"Jj–¡ÑåÁü¼½ò$ûF:ß?RY¶…ÓRÍs+J÷˜ëœâ©ûÀ†~W:w¯µ:“áwg죊a\èÁîæºn6†ÊÖyÀÅî¶UâÀ3e-ó{\Š&¥4põÖòöiÙ÷ë/ñ!˜ˆo´L?+n½ƒ¸éÐÛüˆ(†bc9ptÐûlJ²JIò[ö/úÎé}Ò.íß‹ÕÜÑ¿6ùÛž{„×U8ôbÒ‰³„©BNÈÝë( Ç畼‰ÒH+Ý ò-pJ›L}¤|eÿQª{_=ÅKå a˜m¯Ç½±„ÝÛÑç‰øË†Ò÷üv­D·Yv‰ÒE‹à®vòŒ°Æ.7¨°júË#‹'BüÆn ÒéŽoDc@QÛ‚° djåšÖ ¾ NëxaÙ‡Ën“Í_1೟ù*éŸÛÑïæDì"iͺj¡p*$¡êÿƾ µ–B¬Ãn/è,iZ2ßÖòDÊ*ÜùÖ\’˜?n &U w¸ŸrˆR”½"pù#øDbÄ&H7÷º=Ø^Qã &?ÀäOÉHÈ ¾Ðe[º©µágÝe؇Éøe'¢^ø«~þvù´òIóNì ñE8Èß/ÒO“í¹ý˜€ÿÆØ¡§ÉÓP³±;ŸÀô±Ëa S"‡@Û”Ú“–ä$Øm|ë@*¿lôQÕWgb¯ÇÚc—Þù B[ÇA±éƒÑ§%ñ ¹¢\9Q„Ü=B›]EõÐæ‡ÅS–š‰J|6}ù ©R¾¡ñbÓôQ?dçVª¼€šo1£iÄ2q…ùT$™Ödz]ªbô†Š,72éçӷɦâ+uy‘ß2Yà‡ªxLçùÐÌUÌ Áq’GJzï4¬Ç2>\NrIë·Ù£@lJ›ï¸ ´ÌÎûÎ Iï‹'ø‰±&,^‚<öØâjæÖÉbiŠõž“´jš“X8¿î{­)W4‰b²SÒžÆ/"rº,Ew¢W5oºgÏà§Êp¿ *ˆôiF’˜kÆ´ôÛ{@YíqÓ”Î_WT¹Ž5G“sº|ôÐTrj¸q}§óêà ßuyLÌ š`æúB\ž³J„ÃË·¾@+=ý‚XˆÉ¿zðµN:3f²èk˜b:¿î}Î oW+S#h$ÒàbYWÞæ•Rr]/×¹aDÅäÿ™ ¿ÇR¡^ëw†´d¿ÛÚñ¤«,|‹ƒ|(ü“Vc¼Ïr ý´2ºÖ«“æÍ€H’ñKç9hÂ‰Ž•c767^kïŒK–nŠÀ¸Hócw'”BD>”œrË›)ÀW»Hù@]aà;=˜ûÄ¢Üëjë`ΠOtímèÖÄñ1Û:ÅYêRs‡>—½iåϦ¼|‡8–•ĵýòAáŠê§u¾p1¥‰Ùž‰`Âü³L¤’ý ÂÁÁäZžïÒŠ¿ŸØN„“úy5û‰ÙtŽÀûÛMSQ ÜÎÅ?i,^âcé—ˆ¼•KãÐ\JÞ` ¼ið×î3z…åÚ²ÌÃ!-6‘†ËÞ¬86Á°A.]!½B!'pŒÌooõOCÁ=Gôm4¨œÅà RŸ¢3ˆŒ8ÄyâS¤-ŽÕ°ÛÜt+s3bã—F÷† UCµ¬’*…$qþ𲼞×Ë„cÃÕ“Ï9Ê2~n” ÁY+б9ÀæKBoÒV­œø’9Çol#¾šTõ3½-ÎÃ`EŒkÊ6R¡^ÎöÕYrhûø€ÓfŽƒY$ pÙP&%Kënj˜v`5+;+Áóñ|cÑØÑûqzÔÞÊ]9ê.Âíñð Ïqökø]EŒÇðS©Z‰[À†|r—Ù¬¸Ý ‹ODtŸgpºAzµÊ÷°iôåƒOMãñîƒQŒÏµ«$K}T*;Ògt™™§aÓG56Ó¶ï=Pˆ¥ªà/\Îý6´éûærE.®ÚûÌOL?íd=¨:Ë„j…Œ÷ðÕ§a4Ò}ælÜnZv&ï±È³Á+C^%.Iæ'Á]PÃüø"ø–t66„3¸R¡%™+…‹<’İÛDeÎàDà/ØæôÙ)¼¥ðK¸¦¸¸,¿ÀÔk^ÛÜc%¦Ý"”³ÁdiðôÏb¬‘;fbíË™€È2&6‹O“jȶ“S™ðøÍkHgóÈú?1hw| ŸowSí# åï„!;’vœªàFZ“jwTÅnÄÙF±2iºŸˆ N4ÕÆ“ÙUµ§5ˆ€êóÐpÔ£¢ 6ɤMh9õlw³™M°?Ã|ô ÛÍÍF+eÖèì†ÓEµÀ¡t‡MJ‘§“Ø¿5@yå &GºÚáKÑ&0:åØý"9­1™ññ®ÞCæ í#î+¢j·Ío††Ù^L˜¡¨¤R‰£º¯åm)KŽŒFüˆ5dÚ º›æŽ£È[üE8¶*à~xæ…@(–c>zHµç )4Ìñ«rqPD’˜Y UŸ…½òŒ“¸"E)Éqúº×­Ä9ÄÛ9¥¡eœÅ2 î9;õí~eLVÝwâŒÊ¢;4^Æ"Nõ“ÿðª [MxÞp2QƆüSšÜ®jÄ‚­F1›7gë…ò³?Ÿ–rÑBU¡á`€t7uÿ3]5y%@ýSØÚÜ;,vÛñY£aà5Ï!ÕÆiÎÑ Ú5l0¶¡éŽaÆ‚â‡ÀmEµ)Uz¶™²\m1æºÃ£$éÙJ;X7êjúá g»”îÛ-cðÔ»nQ¢¤¥êGq+âOàzþ˜[‰YüÔƒ½ÿ¢T¶É¸*½¹ùŠÌa“Õó>ºï‰@,Ñ,]ô•¬³çü·ögg• ‘оëéƒcT6qšAçSˆGcÙ]TžzLiíÎ1]†2hêJyQ‚ä} ÔÏ¿-8MÊÅO† Vls­§<-ÎàÌú¾ ª—ˆg\Ër½H(ËŸn“‘<ÆIöoÅWáÞº>_-¸lFïѯ¤5À»-¿tQ`"Ä=s?¼ëAuÒ%9enÕ}¥"!d57¢ÖâfɱRß`!ÏÆWr‘ôrG ü:ü‰v¡‹û²ÞC­–’{ˆÑUÃ'±©ÀÉûv>+°ÁùÝñ;ï°Ý+7îŠsHöëëQí ‚SÈNñ(ø¹ 2ÿöyÔÅê„‹ :~»ošãIXˆGÍUz]|¼'zæý Š ï1B“{ôGWh5™ªvO)x+]‘9Ûú.2Õ¥ÅR4’ ʸ@ªAâ䮥ë„äà&;ƒ[6ž—ÓD¾¤·¦½g°öqicUO¸®]àáÆ[Ù½@ú‘w¹Ï÷ñŸšÖãi"•bVÀ°žÀÒ$ý„ò'뤭Æê[Û‰Ôs­:ö‘‚øU!~þ´ï¯B¸äŸÃì4ŽÊ5Ag çÅ0‘QG©Z›á]ùât}‚ì(J ‘¥¯z´â49gù(b&”¬a;„)¶Á#Ëž¶ƒ$Ó#‹bȯ§+·¼Â²%t¥ŒD;“¬¢†´ƒ³@fÀšo+Й,^ùÂÃ4ûÒÈ'‹¸óóD±$QÙî¼û!dÁ/ ê<™Þk{GLžÙ¯Ï CžoÜù¬ÇP£‡iVŸØ0ìeÝÀfk©ãéŨ‰}²Åó\=ˆ"Þ¶çÐdE ÷$ªÜ˜»Õæ9ݺ˜Þ B°59²|´€–K*¦ž|µ†ÇsÍ9¢nþXæ­Îbq™=ÚnûZ I½«U}ä/B]ã@‰×Ã)á̵êîK$º´i z¯ÄJ=2ˆ_Çó0ØËDÖÙ]ÆØëÊɃÄìù·Ž‰$o=;2Uà^˰Ã?n”Ìe ]R:ô7à»dÀ,<|—ˆ‰?M—ÑÐÔçUèj:%t šIoè}~ªéÞs° ï˜l‡sP+×À2A™wÆ-ÈÒ…ùЧi5øUlM.û£Þ >²¶ïr«Ø’Ôú¡ùÖ3Žù½h¿‰Û3œ‚ŠYè|J¯7¹ñJfk‚(êGÇ6EÃ]g÷…síÈ9»Ô5ûÅdVwA†M²ÀɬÏF@%žN$t“U¨•þv ;ëù ÿ¹Ò„€ƒvܺì°ú“j=O((„ø”hu¶/̶TÔ5)”ŠÆó{p2pœlérVèŒašò’ªÏL²ò­U¦×ò}”7¨5®]î’—ÿýrö endstream endobj 280 0 obj << /Length1 2567 /Length2 18341 /Length3 0 /Length 19827 /Filter /FlateDecode >> stream xÚŒ÷PœÛÒ ãÀàîîîîî 0ØàîÁ‚w— îî.@ ¸\ïdŸ}vöùþ¿êÞš*fžî^ý´®÷…ŠLUƒIÌl”;º1±1³ò$”45ÙX¬¬̬¬ìÈTTš 7{àåÈTÚ@WØ‘ÿ_.@37ˆLÒÌ b¨vÈ»ÛØ8lÜül<ü¬¬vVV¾ÿ‚]ø’f K€3@ìtE¦’;y»€¬mÜ <ÿý  µ °ñññ0þu ætY˜9”ÌÜl€F 3{€Øtóþ´‚6nnNü,,žžžÌf®Ì`ka:F€'ÈÍ tºx-¿S(›9ÿN™  irýBlåæiæ@ö  £+䈻£%ÐahÈ)Tœ€Žÿ1Vü#àïâØ˜Ùþq÷÷éߎ@Ž6³°;8™9zƒ­V { @EZ‘ÙÍË`æhùÛÐÌÞ 9oæa²73‡üº@ZL `Éðïü\-\@Nn®Ì® ûß9²üv)³”£¥ØÁèèæŠü;>I ÐRwo–¿›kçötôý/²9ZZýNÃÒ݉EËä씓üÛ"Bþ#³º¸XYYy9Ø@gЈå7¦·ð/%Ûo1$_'°À ’Ðd„|!ûºšyn.î@ß+þ!³±,Ans 5Èùwˆhõ é¿ È `À ?6ëïÏ?¿Œ f v´÷þcþW‹Yt%Ä•u¥þNù¥¸8Ø àËÄ `bçàpqð¸ù¸þÿëåŸüÿ›û_RU3Ðß±ýËŸœ£À÷Ÿ µûoÏíßKCø_e0dšÚ?ÃoÈÊÅjùÃöÿyþ:òÿoò{ùþÿ‘´»½ý_zÚÿüÿèÍ@öÞ[@¦ÙÝ ²J`È~8þ_SàÖY h rwø¿Z973Ȇˆ9ZÛÿSH«4È h© r³°ùkbþÛˆw{#Pì ú}ߘØXYÿ²rv;ÅÒ¬¿T@ÈFý/£”£Øò÷ê±sqÌ\\̼‘Y!óÅÎÅðeƒì¨%Ðë¯Ñ°0;‚Ý GìüV`äß-åæ°ˆýýqXÄÿ ‹ÄÄ `‘üƒø,Rÿ V‹ôÄ`‘ùƒØ,²€Eî‚ð)þA>¥?§üAøTþA¼>Õ?§öAøÔÿ ŸÆÄ `Ñüƒ ¹kýAX´ÿ »îa×ûñAâ4ûq@,Íœ ;ñûºûÇ"5ÿƒ š»˜YØ!O+·?rŽäÿY”B‹Ä™Ø2#ÿ•ü–?lØ-Áööf.ÿ²€pÿ¸€Xÿ‡‚û·ÞÙ²rŽ@Jgõç$8+Ç¿|üVƒÝÿÍ1±þ„”׿È )¯·“ ðßaCd AHT¶ÿ‚ÂÚý BÒþ7$cûß«ðG)’ù YþPqA|9BVè_zHÂà?ÑAƒÿG ÉÎéâÌ òÄtüŸ~q²ý-ýßnqBÒ€ ü§#œÊ8Ù»ÿ+ZÈ‹óŸl~#w ë_›ÿO9 Án@Kóu… "ýWÍÙ %üã–ë7zü«Æ\sWÈåŸH …pµ7sµù— H¼¢‡ÜÊ,n6.À5’¼›'ø_ >Üÿ '„ó¯—W °Ë¿+é—Ç¿ ¤Âž ;ĩ׿ „Õû_R}Ÿ?1C<ù]þÁÿÜwî.ò»ýõH‚\†ÿŽw^@ äå°…@¨mmhÛíg1"O¦í ¡Yªmt:&ße—v÷{tĺšìu—k±”áž×«[R´W¢+¤O¾‡Íõˆ-Ij­~& êÓÛ­ÈKSx“E‡buýo‘ˆ™4Ewüžœý´ƒí`›¡;å©òÝyÑU?bßzöÉxÕõ— _ØVÛ©áV@y,ŸaŠÕŠ1 .™£*0Ï™' GpczûŠëÌ cîêz+oò…T>Ùÿ(–㓯þû‡»yŸµJMv×.BJB}‚·°WXcÓÔ¾â{©òø‹¾¥Å1ëB‹¹¬tÌPëcý¤~£dÇüŠrXø¬ö.Ë|2c”þ­u,Áº½¨HÙÛ¦NôµN‡è‹ VžžÒ2U¾÷ï E ÝDº0X*yÄ!*{ûîüX†»Ò;¼R8<®4ð1°ÚDBÞÄ]m_“|ŠpöÇQB ¾Üáíò+²Í*£üâÛk;yä4ëµã¥Ñ>P!u⎎ŒX”’ñ»(³‘‡j8áê 6§!R _«9’a7Á0ኴÖ7fçógÎã‚1ýt^…OOâoûäÉb9.s¬&R[‹„c}ÜJôŒ(Æ$ž¼¢…ár…/ü·¢òß,«E§[¥ Ç•"voºMÊ ,1)¬jï…šö„£àæôs"Ì¿6¥éG)_áDÉr鱬l ê×íDô'AãI2 Î•CéáÜ›¿¹F‹ù‰ŠA`ãdgÕ©lP•M…'þ8ÓlÄût72Î~GKy…èÑ´ •ßpEJ[ 9Úv°o¶Ï#,XàìÅ{²¡Æ>ÞŽíq™çÉEdGu{­åÿ0öÍj¡ lõ :iûà¼ø¡ÔÊúˆªÓ©àAtNªBBKã[7_;ŠîYñ¬±£Ì¢á•|9&Ú¬cŸœèÚñ'¹‘® Ÿ/ÏÆ¶$cýëN;Ñ/ÎC@9\~¡I‰¯ G‡Vñ–Nßkö#Kg(øávR€k-»HÕAlnˆ!_{qÄgm¤01Ë4‚À”ÃX9OÕ™úÍçÏ[Ý• F7êêYåŸ$àŒk¸žø(.ÅŽ0ˆ ŠRî®Òˆ&Öò—ÐêÐì0ÂF@=‹÷Ë”£2¹$Ži„§Ìãé‚à0BÅír`Kw©_NTH‘g¹Ÿ·.ëmÜ—™ž cN›’@ÕÓ¦TÍÒ 8dÜ¿EQ ÁPØœE£ÎÃÌ–ÚPUfäWÚóÒàaWGå6ÌÛa:›7ÆÓ¥ ú¶w(Çìl“Þ £G”wñ`bV^ê9¶¬\­å4^bZUu¹™©Ä÷á§ Ž¼õŒ¹'ÙfêX›k_ðˆæL2T•d¬yÈ0¿Ž3™Q h À³5Éôe¯¨ 1†f»ÇtÃÆ¡US3N®ÂQö=ÐþgãGÌöñÄ‹7½ù¦Xk× [ÁéA׋kšR§ÈutZ!¸ =¶æëŠ÷ùZÓ•¥,G*÷ðšÈT¦ÔGľ¡´ ýüÌG q¾^²ýLØ›Rsœ^&\$‘ÛqùË-Q™}Œ—¹%–›ö\4æ£ækÎŒ©²×Ì•¤Ï{¼ý?”•oôûd.àÝÇIš¿,(%Ãt\v[?ìÏY²ÀÂ0#‚èûÚS±~´t`ŒtqœnGÙNjýÁA PG´©§¾bo¦\•¶ÞšŠ0QsFý _ûa]dcAa•Ϭ”Ð>¬°uzä)Aë>.‰ÙÆ“iÃýzgÇ%t0@¥Wp"Yöü>ê‡_Jî!Q­ ôÙ’†ûò=vßTúݦ<¢ YWųÏ@Á`o¡3o¡X¶›)CÚø`ù ùUuZÐ;Ó2¿çÀ*3úêqË]-”x8D:f79bç„ÅçHzVØ|ç“ –/A5»¡Ê¸ƒZHý¤Cq<}A|*n~±g\.¬°¿š–ž–x×StÒ‰%ûÛÛ>ø®›Öâ$ Yz&ù-†¢ÉÈ¿ø°4eïÉÒtèS†¾_†ÊXRš(â-Úø7 ÿz,òtÑ+AžußE§ï˜½7ÚtTØX?öìFV9Þ…eh‚‹%ý9…›ô_\†>û¶ºàwké¿ðI•ç-ÌÉTÿpOàä[Þ0:wŒ³„ýØG÷ÚLÓó˶â#]¬éÒ=gv÷²’1—zdöÔxË3v!áW´³ShðEä³zemýÈm¿ïWAÝF4C€®4dF_8Gyýþm§Åj£ðÖ‘Å~àxo#bM N„ãWeŒ©Œ ¶˜ÌÝbïψ¥Ë/Ú«¨eéÊî |/+œ<˜ÑÞ2´Ó=Ïëëh¥Áh=]QäU>#›è`•“d¿J ýgbñ¢w¢MúAb¤kw¢f…@¯Ôm"s‘ø]aò Üè—aD½®°Ó“ìü÷ûšÅÖâõöpØË±|ZOÒò5"äXNF=(+ð#N61KÝù]‰¥çáZ0¼A“óI>»ß;ÃEê‚îa’ðùI¢ª¯î t^¨Æt“C¯à(—"øñ͇ùœ¶ê¥-3Å'HäÕi¡¹ ˜4é9ɲc§½õ Li”žhaQª^Õ(aW¨ŠQ X%i’[ÇÉoÒžuK¨Õ;ú¤QŒJÙƒÂû ¸áPÏElèx©ÇpYÄÍ^[½»NM"Ãoal8s{ݤ$Ø «Ë íÓζNÉM‰Ûäÿ¬#¸Îf» ÚäáÞ}¢ìàü„þ\_Ø-SÜfô˜(ÐtWÛ7ó¯]û¿mª-¥ÝÒgeNê¬ùÀöÅò/úů9„qÖ U#|¬öá†ófÞL–.ã^hVDíc¤÷X<òëÓ ç·¡‹³]7õ9e[4yoˆ|| ›Í>ÍZØ©š¿ †ZBf-øÒÓ{[<îC´%7[EЦùîk´z9å,ã'’Ò#–ü=q¨¢£Í`j©tÞÁG%$O­›ì#䥕>Æì Pq„žéz3=pÉH!ÖùR)¡ˆ¾)' …¨ËgµEð»w°ÖŽÄ”hxš^a8Qž¤QË躃{Nø÷ƒ¿Ê>¡³¦yƒ>æ|s@&¦ G”öÇúÂ|„z"Nõ}ò¸·xEµS g?ÐÑÑÊÀáòitº©;q›ýtôiïB¦d‘†Ew"&x,Uz wFBu¢ÃÍ.kV«ðsù]ñ©=HèÉ•ÇHÒ½÷7mù”å áÓ¸bmæ×0˜ “¢î~*’˜Ïáv3ÖX«8Òðâ?•WU“á¿‘š §xûƆˆØ Ï ¤!üe¦?°ß%.­¼æ¹#/˜0ÒœM%W#Jötš°ÍÂMš·Ñe»© ¹*‚¯7.vÆœ¤=ýxßÍ%Ó… ä}mo6aŒBDj‚d™Æ`_¡IîKâþlâ᢭ò ïcø+èx+„Ôݼr›wëÖ,^­Ÿ•§fµØE.¬%NpÔ‚+p(œýõä Bîú#;foÄÒOÕUÇHUí@‚7:šÐÛIEñh‡¦‘n*‘‰ª™öcqך¾ô†¬š(ã$TCâ+ÛùÊù¨µ"ð¬ÉiN„/ÇÏŠgõɺõ_ÐV¾ßI&›)#l ›c¹´q.&Í‹ÞYv”§u'ïzÔpáÔÁ´dsqû$­Ôš,„TA0/®ßtxß>gÎM98De~ªªQ<è3Ê–õ«ÒHêùü%¢ @q5Ô‰ØYrv;ú¶¾d{÷sWëF¹ý.úU-Ñ]Æ`è¦ô"Tƒï.jç XtÒÝIÆôJ\OÓúu: Â<ÍM³ô‰ÈȼŠI+ܬ9ë¼âÖ¹ç3Ýb·d¶v:±tßõÒÛÓ-‹w‹Ÿó*J}TéÕFËÒ4Õ·-éIwí•ñ—â̱m‡#Êp`<ÛÝMúK` ˆY× 8>™t:ô Á²ì­ª_Ö¹[]n~D>§‘CR†ûغ)2Œíl[~žA‡<òá0s¶–!·±@ kpúí”ËÇÍÖ2njÙ©d ¾x¿^—Z¬_2wTüò.Ï‚ßi+¬eŒ{úêëj¼T÷Œƒ6¿ÏâwoèÝë…IŽ&‘ß~M¦Ä±jâ!I[É\÷ÇlNÔý Þ‹Üåx̦ÙdÐ úñ\äyÝòIw$. Œ$RpÜ‘ÇNÓ“A[¯l ù”Ý0 ß&†ñ…´ºƒ,v\ÇÊy"[èû5vãÀSJ L“€¢gïPfÈo j7:Þpø‰%øHÿÐã¼ÖA\Ò –I—ÿQ’»Oð‚C•]bnЉ©"Ò{Þ/€›§î±Þ<(UÅU(Bž«³í$0_-Ç} “¬ Cchµ§pwéêÏCè«&FçùFþÀ Qwã.ˆÃ=F‹F3Ë™+ÁÜ$àð>QpŸý¡‹‡Ð\Ì?,8/ãÍ'EÝ9îÝ–×40¦ü¤“sçí0õõ ¥$-иç¼Ö1rДW2Œ)/cJ¦Þþ2ÅÙø#"t‰«ðߥf¾ðüP@!ãiÿ`=Ì¼Š ¾"™Äk˜wô@Vh ÕgÕ,Ûv¡dœ –‚ù±pšŒ&¨iiT@3Üh b@"CïØtiöˆõ¶få.©''aÛ/>6¬NTÊ5¢j¸b‹Ëi6ÅÌÏy\`-÷ H‘Ô[í<ì)ýª@7G¬ÎNgíÈj^PÓ.à-Ù{µÈº ŸóݬþwgÀÈåsÎ8ÓÒÁ1`™ùMz‹H…6M™×. jýq<¤ÁèÖ€h¥m ‰Ëï«“¯XgÈ]2‰\³&4$ªw`„zf¼GP ææŒɘŠÙ(?s)&WÂÄ”c~Æ›O–;b‹°¤ÈÆ’ç;¡Î‹ƒ £ø˜ì·þ°ÞhAß*Ž ÍPZ…»*­ãh®ä?©®çža® ÛR呹k!bb­dÇ¥î¯áü$.Í«{7c•€¿~,Ó#<÷¸Ôp8ɘ÷:¿2}ËÚnØFŠ»I6=oÉÔ,R™ÅÔ ¡cwbsŸ[zï6ŠDËbÐ'ºå' Q¼edæÂ½5¯{…ªó•¦M": Jïú½ÚÑ{=ÓÒ]Syñš ›’9çó}l^T2aæ‹ÉA¢Nú¾NE¥›ÊÁÓÝ,óÎäb%Â43_s°B–ÜŽã´V(ø+‘ç¼õÛ ŽÄîùX¿õç·"˜g4÷e;Ð÷ `¹mÃ>ÄoF Më¡èX“uý“#ÛpâêÂçd®¢šRe^O ¥H*D)~ä¨òPد³å§e?’ÌŠ½ð&õP?˜Ö9 Þ|™Æ^œž–‘›»n€œ…ûÞè;޼í-ÍâØé‰NÑ~úb=°~(ÆmQ©ß5½ä5<¯VÞÃ×äÑÀnÊó[Ø–s‡X±#+'6ðsHHÄ ¨¼ñ  Īá꜋0Kœ%òŹ¿Wmj¼¦öWÜqtÏ)$øÄù-OÛ`lƒù£I˜ùA)¥ÛuE<Ûs£ÿðÂàl·ÅôcïÏ AÁ,£›Õ¯ëxc> —‚÷(ãPç©CS…kP|c.ß ‚ɳÍCÜ3FÒ)½÷§Ê ´F:©= 3sÂ…k[¬°¹˜W¤ªEâ‰M:ôoõ%†²¢Tr4‚ƒYëöƒæÍâð[B&ºZ¶5B¿pM¤Ü0ùó¼y57€·ÌÔEÿUN¢:Ηm¨9\,*}]¿¿î'b5¡‹J­Ì+”7ŽéXÜ[¤8mqù@[\ëæ˜’OÊ7µ¤$4žŠ=hhÐÛŒXµ¶ä)ûP:uÞJæVYÍEwÄÔŒóᲈÕáï^O7¶É„X…÷áR'•©vy}­§–Ã"ÈÌx9,Š ÑbŒ¦åïùð‡ø2)î…à¦ê våì=ª½U/—-cf H`CÜ0[|¦= LÛ@Y|âK­Ù×EÕà=ÂòÍI@ŸÏÑ«”ç´Ãum>£¡taÈrË|ŠØá¡ ¥[w ŽVÔS›CÛRäI¢«ª³¾j _ü•0žÐHÎÙÕöbˆ|-•õD¿‰Œñ_iä:„Ÿ‡¸æÊöCV:,j9YM1\'G³N‘  àägÜÉû|ÂCÇø5ã ×–aþ<ã4%ß^>©¤þ&œib˜1Þé5ñ-7ÁŠÃ:×oH‰þ=¯ƒwŒ&•Åž¦N? =H·vÙ½LOq8÷GRͲú¿»ŠÜ_`6lHªI6å7çZ&i·}V!ƒü£d4>âyûîu ý'R¦dlj®§8Fy]‹²Vl¬G‘™{eEezƒàw´V¨¿¨dˆöä‘?¡Lu3h‘5/ÓHÅËue.êÓÌÏj_éhWrBøh¶sD÷Í®ò—åäF Š'F«NàQ`Çj¨:ŒÈæ Û^¬]®*…×ÏQö´×òM*×;ƾÜëußdZµwR±[x·ÌǸuÌ -2_*u…Wƒðóð¹G…Ÿ;ƒ?+º¡_R؈¶v×]!¢4› _ÁPÀßBÛ-åÓ—dé¹ËÓ^¸?ú˯úóm|Š ÝJâ[wý†WV “MQ2 ‹¹HFEœŒå-–ycØØ—höŒïÔ‘PŸ<ü.ÑÚ1Æ$àKXRšˆ=óC7.ß/2_C¿ÓX\¡©ø‰8C¡‘‘ÿnnü¯^?k©dsv6“ ¤7¼•qûê­ùžÎZY|6Œj¢˜á+9ÿõʹʶ÷2ÇÙhöXÈVdí6X€1ð&å Î~µPÜGbaê9$”ÙP9"àÏÏw”ï/5Œ¥ÄÞ ýú p­´S“K{? LIÃ÷—Òç”"û!Ù‹¤67v»jë¼&yÝžVRW¬sã)ú,ehwi}wo3¸Éº²èŸ¡Æ§AwTFJOv8ê×¹„‘ðæêcŸ>#œÕ!'.ÂcÅâ¯ý¢¸ÊÏBÇ•.AlC8!ìTffÇx·åÁuCLþo¸ã4^'”ÉÍ¡Ëò¾ý–ÓA,ß™\e0W“oTìè8Ü êÕØz¹E úð5„üð¬]°ýühñ~š€õL/`HzEÃ;©ÄNO¢"ZCã[ù£S¼Ä“ü†¹˜ Ž}Jü4?ôj¬n¨„­ãEÛéÌIòå™Ê'TDÐ[*.†Ö-¾9Q Î{1—’¤Rà¥g•åξKª3÷ú)5‡ïk¹±H¢©)²¡@måW‚|ƒZeÅ2¶3¬µ¬Uª[îp_Ü'ß CÖžÒóÝæ¯kÀ¶_¥-2¦ãø§;¼ÉÄŸzXã‰ÏyÍ.’aüýÜ›fx ¬ƒÃÊ&[5Z eÿýgmKÉð1Q£×Ó*ÏgŒÏMG­‹…{¬e øþ!:e¹ËæLöÌÓšz.šAu"š_ºFÅËëŠÌHʦ°ˆËVÝÂgÐI}Q‡¿RBùxÕ{íßTÜŽè\àø,º Eêœg !R}K›ÃLºØòj§3Nd¥Óúe'¼½Æjr૚HiEÖ¼É,ñ8Z½h?ÅáR¯'ƒÔû-.Q7DE*íð&w$d¼ë$ûLä=-;²7Õ|Ñ}ÊÍ?^œ7®Ýß¾èùžyÖ‹‰zêèh 5ùÑ.J~xp´®4c”÷-Ì£pS¹M•ÊgUL¢ŽCq´Z+ÄÑZÝ6pRf¡M˜Uzå&D¶‘ÏÚ¡¯j|G °!H½@<ù±ôF4ÒúLIT®øQªË‘ÇœGÿÔ Ý®W³Í¬’&å)•äHìvëCyâ;ü3bt¶.'öÀ º=ú×¾iï#à4·kgl'é•ý­Š%†$hDö&èçæÍýá=0sæßz¾tV1°ùr µg…Ša|¥ä»µð~½ñ0®Úº³þuŒøEÆ*wÑîdZ÷›À&#a*ÍE‡)ÈF£¥#Geà­ó!®ÒGƒO“Û2E×W~Ÿí¾P¬…½—×á”ßKÂ"Âìpñ&ÀÊOǺI´d‹,ÖbÐM‰@›EÃ8û)JÞ¬ ·Í ¶Ve7Hì ~Ñ_ûÚ†ƒ³Ü÷"žLã³ô`¶yø¾‡eœMÎà|ýiNèÊÑÔ‘ͨçƒv ë°ªq/­¢À~Q£š›Ú×ÓEY“”‡2]¦³å_î8Çë/£Ej­¬Àf"ñÅÔÈ׫£¦oÄÙj —ŽÆqþ^=ßC8Ê);’Ë~±N¬‚w¼(«´;¸‘ù~8ZÊ•’½qØ?ÕâœÈYPÈÝòÀá&j¹*Ö¼XÉQoƒ sTÝæÉHò`TôUج†Ý=Ñp¼±¸þöy+·ÙgðËÜ-Âs3‚lÎcê {˜)G¦ì)ö¤ªJ$º LÂG^é‰0m&É[(L¾´Ò™‡ t©ÃOKÏÌï!ÝøÆÖ»`<¦‹ñ»€ü›ìE<°bŒ¼Í­%òpRäŠÚÅÔÚ<<"ðL—ÒU¶¯ /ng}øWž!‚0¯¥©C8 ;3åý,L 4í‹üáT*ñcéët¹3LQÓ-÷AX«“Òy_^œ}1ÐÓ2€:¿†t̓û¼­%]B×½³çCRt(¬Ö …îðGØ\]+¿Ð¯çOi›Æ9f¸äËW’aµûÃûqk?R¢Pa¥Öíº¡é$0úÌM’(Å/ÿ RcêHÑ™HI8ä$™Iè‰M÷åˆ \õ¨ïýøýŸ"ª”{—„Pε¡úàA"´@±»þ&vµª÷%&ÜÑu5$™»èö¾ÕFÅèÛRISä!û²0€4‚Ž°Þ˜¿¸=›ò%¶C³ïD¾k»[ÚJÀÑ‘ßb⺦Ö {Tw§8¦[\Re ~Æ&¸rBóÖ™k"vC&šÙØŸÄ7¸éVJBIP¤­þB`åLÿvZŒ//3PZ0Þ…_¡¯¢•U`û‚i· ¶Ì(_ˆnŦ3úè‡wLiïYâbn6ö–æFA_#ZWNJ‹d`wl“íSoÃòµ³×4PŽK÷¥mp|æÞ˜…šÓ$Ùg–¤Mž,ƒCLØk?³íx¦Ï 9k÷mšºªÎL¹^§3†êše¯c•]·«bÒHuái´t{ïI“ƒÊÞ©‹wÓ§g첎{õCÚ–õ[òcš¼m€NÉqhÙù­!«¼a%ñ¬1{4áÞ™•‚ò«ûÔ°c»Û^àpR {RѤ(PsIi’ŒÕmÎ[•سR1tÒp?ÍŽ0ǰe¨ŠÕ•Àh¸ž×¯üñ‹o4•[#DÛ¡Ò_¹Ä=hm߈ÌYt []䯤Cw‘”¥V½-–{=Ž›8¯+•Ì,[QñYë˜'ÉÄ£þ§MÑgË•Ÿ4¦®ÑÙÜ=ïšØ×,4Δ.[ðcB§‘-Æ}Ôï‘f„Z·Zcm“ã]÷ô58…Ói-–‚åÍܤ®W-h™BE|se yÏÕzo,eS©”)–r¿çó¸Ãô!‘ghì´Z\\/û¤\-/0snñ1bfß3¶¡P³;œ¾u8Œ“KqV»1‹7y)£23°ëZÊ>ý,­ØŠ3ÉâÙvñmkSX±X&2½ÇZ˜å«,øÝÒ;J†µHÙiZýtò”7bd»ÍŸÜ8÷Ï¢tCɉq*¿1ͧ(jÁ†Î”O™VÇ-2ÓF}Õ ÙÊ4aïSOÌOI4ÙE S`»MÚ–Ù†iNì”4F¬³;ø}B%yPyÍÐøù”‚ÊkbÛkDtnr+¿ÎÇôüæŒ*‡Wþò©Í©EK-¿œA.ל^÷!s}O[{£Š¢§ OÛ͘2æƒVÀ«ûÞN‡5¶_ðÒù —XÀíy¦µÚzäˆ8é¼)¹æmêC¢Ð³„a8a ºW'‚BeŽØØé&&·³¦Wµ¦sX@ê·Û¤…Ë®ò¸=&‹+D‹JÌq"àf¯à:ëíÝ£LÚû˜·É‹yŒYóU‡¸ô)[|ß[½¡NÉ!yÍWKÏëaôƒ*ÀcF³ýB¡ãW-bò)¿qg¤h<Ÿçíyìƒ<. 1ûÈ^É,#SÜ:[ †âüºrâYäwió÷¯¹@“k+iIÎ$þJ TlœÑVÈàðr5˜žË•=+Ì<€,ÕXîqôÎØø æûØyøƒeª£ü ¹PñXÖÖVÖÁ"°I•âôǯȩŸ¢”³€`&ýþ»&ÞÐ’DsLÝ|;ÖµÐÔjÃk$’½%xž¼—FZvÙ¹gŒ;Î ¢ÁoÊOõDh}OVƒÆ2‚Ô§Mœ½úØÅDÊdŠNs¯Þ'òÁê º÷èTE¼§c±ž[H ,N¼ËbÒ‘³yêk´9 a&âúß;¾Ÿ¡ìÚ«=Öñû…–Ï0\¦fc ¼¢º² §<6 ÅY‘¶Yœ¨û(¨Ü‰¯Çe.†M"1ª4;bfPa[‚gÏLý¢ÞJáÚÙ^¯0¨Ü¼ŒB¤8n²ìÈ´V°ûÁ ]¶£Žq-Vöüå;“ìÄo6! Ô»Ü‘³ /ñæAׯΠ·Aµ˜ !rÒü®È-Õa¥½;Ãù‰¯A"lؼMȲ!¥…ÓãûD½R“sÆdsX3orjæ2ýáñÂÕOlò‘¼TÁ€éHîEßÏiSùÈ(”g'3ˆ(Ú$¹TU§Íõká¹klŽÚŽ Û=DȦ­"ºo¶Ð?¹œ}l¼kGÊÉ_zÆbÕÌl>{µÕ°â Šj–=šSR»P{)*³Ë`+o¨ñsÉ“!ì)™¥3oµJÿÒ§_îuv‰ÇÌÁ—CÛçÔ¬õd} Ôo~¯è–*‹MÙ Ÿ…WÓ=Â6 ú”胱o Í)µF½æ¬êàE”‰¹ÍË&ÆÁ~ªëU¦¯\B‡]%Œ%J¸ÞS~‘¢á=i=¥„u·|±L”y¿åí!ŠzC}fGñmDkÑQôë“’æ·³“ú½Õ vûÄ\º«_ŠÁ?f‚ÜïZÂWM²Ñ=u¿™}ÿ¤Í÷«p¡_Øñ›„¨Ì‘¬ðÁ/Ù]†ðŒ%#®v7£Í qûû9×Yáê<‚‡ê´Šý ã¢Ù\>èÜPf:<ï#ŸLrSu»·Ÿ­”#C’ýƒ†7‰ÕÎ^ o„×£TÂç¬ö…"í£3­Fø3ˆ0š¢\¿‚ x±”<)꜆¨Öõ¢üCŽ:½üz>šhÖÛøËqîłԌ6‚ݶ•à“bìr 빫• ¿ïîÂڥÌhà ‹ÎE7ç‡ïmüpÏ…kÂfQ6j Z¢åw{s°Ùf˜PÌ ßžÎÁÛ•¼…·¦„K™ÀÁo0Fšn\"IlÅþ|äã´Þÿ|´›çh‰"ž¥¾Ž1Jr¢ÔF2¯ ü¥1x.¤6”:—°˜Õ@3Ûþž_M6sÒ~~:I®-ó"¸ñþƒOF!í¸þ)þgÂxþÝÙèg„F½ÄO=4àÛbgKyÒåómè%AúQâ§âú¢SO‹WÔ9¼™¤;aÕ­R|‰/ý~›^rÄÕáÏéz_âíKÑDNRúïŸï÷m5xÀ¾ñè÷*ƒîXµÅçrdIËÒ¶ò󖺔\|ý†2¤HÉN¤›ûË÷¯ö¨.$(?·ÃAñÄæ7™¶wµ¾ù)çæŸ^™è$Gjrtª¼2ãìfžZ4{hŸ3æÏqVb¥làN›À2Kàõ«»¶òL˜í•Û=ÕNù|º$FçùõÝøòLàiilÁüR#•PÅ£j·òÚ'é çë³"ABºYÛ4Ïg-¬WoŒ?lñ¼Iáʨêªütž¶?»æJ9ä½]’‡øc5  çm$à/kRFk£ðS2¶Pvõ¤Æ$,î1ÛÚHt4ñ#e_IÖŒ]˜² ¶\“ÝgŠ<|B© ò†œmiÖØš}hl*ŸVêf‹á¼ó(%õ 2bóþ_<¨9¸oÌ$cæyKìÓü'ê´.Í-ˆ]?7: Ît=ù‘–ÎÖå'ág,˜Üb§4÷Ì­ h:#î7_GÍvúeòÀ§Ïí Ž÷¶éøMõÑ7¤uDâ÷È!»¬Þ;5=°Êä}õ+¸…‡‘G¯ír½3ýeެ1Ñ=eüÞ¹J¶Âsª{zj¿?v¾)r™‘ •_&P8ø¡)næ!³{‚;f"K(#kZ˺ó²;Ñ Ýt$Á—‹ÁY Éë‹T ‚×K!&* Äë=gÏ”Ðû9~+¸Òå;äµPYl1ùϸkÖeݳ#éúGàzÂb œÒQ`4ä•kæ%î¼ F¤ØæÎ„»<84 »n+•ñnîºß ukŒ¶ÅK6”2A=ëðu½RÌŸPÅv‡—å';&¬éÝ!ÐÔH³_[@2ýŽ^}˪ªèéc²ÞÜ")œx·i£Sõ~`C:…Œ/âØ|Â!cR7MÙ«NJ|ý\q[§øù–ÔAÿÜÐÛ×eõß<,±7Ö~•âkHŸrÁM›é]£Õô—öTg&½cï¦gt¥êº\ݵ­ÙÌ8ü((mšãgšÒ$3È(Í\(£jÛÖ; w­Yãâ…½þ«Å´âã‹RÀ ÓÌ1,þ^1¾·½%=q é •½Où{, ©4VÖ4J”ê¯"‹›háÆNÔX®zt×l£î+íÝ —Ü]iU²³Œé—åPõjUËèIc yŒé³üpW衵ò+$Ïu=8 CW_Ï9†­HÉ5ìåbÒ.klÜ`4æùuÐz…ë–ዠǧ&Ømç ÊK¡éÀyý³êÔkëbíj¶S~!ª`á/0 vテ³ß†–•æÞ¥¾äwf`›~Øù¨»ë4Î{ÿ*ªD€ ¸cµø­çQñ§%ÞÏL÷ÃìC`µ¾¥¤-!ýAŽJ3SïH[AÊÓ×Å=2š´Ö]¯Õo±hñ½¦j›Õ{ÖÐ"âoFZí§é³ÍÌ_i¶r»0 “‡ú>˜ãâÈ-3«³¯ 0üÐÍŸúJãc°&OO欗ê²\ät#Ÿ4( 4«ŸáÑ`-áë“oÜc⬖jQZÇÅob¤ÅD£ ð, ¼ Ô›ÅÙÝI=]®Æ®ªmϰ]¾Œ†&Í=®ºª°9P©\SZk&­¥—ö½½jCÈŠ˜nnk˜ò—nH·õöŒðm¦®OÚK7œáÂÉúÏawµïK…“…ŠšãL«óLhˆ=îüéj}¾ÜãÇëþ2”BÌä7øª.èU|÷QÛPÎ7-9“9–€dÙ‰€X VsÏv¬ñwºWù(xN&ù>Ò¢-’éP™?Œ„qÙ¿úzZ©ò̵FøótD£?ÑeMGìS¾¤eƒ³¬G“‰uËbˆÙvÆÛéA]¹ç wNG:i¾¹IwdOêS¼ÌT5Óý0†½Ì똪êÑœJOO¦jxPÇiçcA+:Oˆ~ç*‹‘þŸÊSjq¾XóŽ ô®Ñ#Ü¿ÆïÈ÷ÖÒW÷4ë2”}ÞYîõ‘cnmŸÅOº†’ æÄiF:?ÜXbl¸) Ë%jÄ!\|eŽÂ¹aãûpEJ˜“c´ïF+<ˆeõÝ; ¹Ÿà8Ò ©œp1×2ö·›Mǽ\“¨(ß¿¹ª3j„¾c×Ûü²?/ÊwŒèЍé‘Ö½ª#‘Á»XEp$ ÞQs+ˆ]#ú|åáU÷É„GÌ‚Òü5¬ˆ|VÖ§_]}n:†s*CT'>ÕœqùD=Ö7{ŒûYWµŒoúŸÇ2eüX{óKyíJ ~bü‘ã6O*XI-˜ ­£IùS%£>`®Ò·ù»Ó³ÿ’}|O[q‡Žî*Rúavm{>¯äÌÚ(þtÖ£%ãDáV›*4¥ÙÎb y`Ñ™¨åÌàûå«òàÞ˜kõ}ðÛ÷oìj¦Ld·o{Rž¸döËxpêwòÑnnËfÃóF¿ÓÅ’¡bò ~-œ¡Œö–XIS8^i’7Yi½aìWN°™+Rêà-ŽÔH6² ¶Œ'ƒ×J®ò`·9TÛÅÓsðµ9 ‡ž~3€ÜO²ê–>€=ž™x×_/D« v߈€C0ü!ÀÅFŒõô ¿ÄL¡ì©™½d™ñrÇ©Ùô®‡%qçìË9âûW¯Â âìÒ^j‡úåIvê[L6àØbžä÷ñž_zgÛÉ{ XùÒƒTáñ\ÃðLJ¨¡l”yˆ^¸H8?ÑÒpªß¥ÄÛÞN§ON$¬eeSF cQ=•]† ¹²ðbZf =3tÊ}Ð8û?¦){_ÿ&·†«ñ)÷?HT’ÁÖ5ÖÀ'–c¿S±¥Q!SæÙ+N?T ¡7òDVJ" ÷S®C…W%ðmÈøü¤:[Þ8ýÛS¡‡ «¥ù‡‘ÔÓE-{ú¦ ôýVãhŸtI7mÓͦ ½Eÿ1J˜î,v²3Zê íÔP‘¼ýO­;>æÇ#|çì??ñk#¼½ ÇGnÌñš¡ðéìau5.¢/»“ôåÀž›W5jÖ—×~ä1‚æòN<éþ¾FÅ©5µ’Ь.ÖWl¨›ÒÄÛµøÙsCvˆ¡8¾¾CwlK7ù"•ç¬è)!2yn»ÔdÈœöÑM¤MB›)ì4zñ=ˆOõ¦ Ýî;Ô&à§šJEKÈQŠáÅø”l›|VúM¬JNÿwW›j+U›—özж“öb¢Â7å¡T,TAÇúÒ° •¢¹>t];¡ŸeŒØg·žÀ,yýòÛ”åI<×éÚêxC%=‰á¤eÓö­»­¢eê…  °÷4½6Þýð$GÃóø›ôÁün9¥¥ûZÔÏÒVXHZÓrЙ|[x…ØýW´$˜1ýZ|~bd»IÉÍá<´WóílDèÅÉgß/¨ÑÃõMÕóí–¿Ò?(Öa‹4­z VNYA—£©'ëU’Kk™_ÿð"Xïoó2›K©ª£ ñ÷™úåå©ÃN,×Å®ß ²¤ÞºHR;Ÿˆ‹^¸õðëí‡ëo€½ŠD)ÿZÐs€ño*´ˆwlu´&*ºœ°ž:D“Ç?G¿Ìè°-z5 à~ 7GR}ØÅÞ{ô·[cϺØqµÿ~ìÓûF¼±a$02áü\©moà…÷Ùc³¤÷`™ÛkíSþâ‘´CkNãþnT{C¡ír!˜çÕñ(Õ)ÇæÖuy8=KÐâêÚ¬›œ„âèŒî_x šÝò\¤¥£9È÷ê–I1a¨cmÖOÄžÚ”_oZ/©Y—¹Ž!Þ¥=cz5Ó4:±ÖNtñüNq§±FÈ–—”¤^?\N>ÊeÚôž ç^Ö5SrŠì…è¹I\ÉûM”Zǂکê#t|æ¡¡C-ŽÑ(¥ž›I{ÅȪ7–GæIèö),{ÖO"ÏžÝâðùIÓXÃ…¢ßжuô-ygªZQë/g÷Ç ¹™,óûm/ÒµŸÞM5.-:9;›„P“R¬˜úI‡ÑÂ[„V;|(ÅæZ*Œk.¨ÓÎt“ëõø–w}{NURäÂèÛ@·ðf_ë—±ëþ?¡ ^ô¥?˜e!£M-ö¤ùB—ÎÕÆpÐ2Uv…L¸©uC³šúqÁ!”Eæ¤J…4\ü*ÀExÂîühIÊÜdãš!Ý!—ñÜË-ÇåÇÚu‘ëâ-ó½F`ö™ªÎ9iÂE&ýÓ#éÆñ™q "¼L8o«âÖ WyK7Ûãâeè_È#›u$˜—”è.7•x_FuàóXƒtE¿nÒoØÀäîbÁ'Âwñ»ºOö¼ÖÖ~—é‚<¬o/Ü‘PŒ7Ž~½Í>e¤ý]Ò§b$¿D¨Qã BÓW®%¿½Ðp ௺®G<'î]åŸK¤Ñ>–wÒ&7¼ÿÖmyÎe|ÐpÁ–302OI˜Ù;ûïq‹ûÍéñ^W»C!¯Åilj½+Ê0„…t«ÍôkýµÕƒ<ªÂ ¤Éóã30àìTã'LÖ <àÞ-l¾:ÍIêÙï«î»‹™Í™®{ ò<Û…ìeo-ŽÉµøÌ Í»ä)ž.+ÞïsRR„sDiëræ’¤ÓqèŠÚ¯iû™a§ïRh•RäM­ç'fª9 }œý¢c%¬‘»KˆCq{â°ªë]ã´ š%hný]Ÿîý‚=¼˜œMòvZRý*'YFBëšØGWgÿ®w3qQg–m~1Q5× pb]¤;Á‰ö¡Ö>Ãpݪ¢)J®ÑM›‘Žf8fXÞhÅ| H,ñâÊiKEÔAÎ,¤nGÖQV9m+\÷âÀW=‚ z6HO9ÿÖ‚.}Õ]6û£°º½Æ‹‘qJ»NŒªG¸“ʘ¹ÛÿHG“ò²Õ‰†´—y“ÈP×÷GçÏ1Çešy‰6JxaÉ|È)ýÌ5nŽ=ÄÏ©7'µ£ÁÇoVõ£zÉJt=æ;zƒ•jÖà±X€Rì”´ tª¯ˉt¿ðK…üøšlé|­îïìôG5÷²ˆûA ÝæÏ^eÄZ1ýâ~Hø9˜ªAºréÉu ì67â†7ßÅ>ó§Kyõ÷=„rÁ«ûpªn6Jgá©K04Ž4í‡,Å&q…4L K=©M]1L±j”j½´åžØ½VI”Âd$åC³û/ƒ‰†hÂËÉÉGPÛ$Ñ)Oó"ÅJÿÓ̵Œœ A®‡°öš+`]³ŸÀ_(Ó³ÙË• ªŸ-¼QÑÂ5•®­²Ö·ípðƒ“àq€bÑÛ;"GO@ƒŸoñÍnõHË ‡YŽ4³8ƒ–ÉËõ¤®Ö-ÚšÈÖyˆ Õ¢HÏ ƒˆÛÈà C¸©V‡Ÿ8Úõ~ÿMV±°w3Ĭ«ÕA­ýs}™·üŸÉ`ñp®_1uwEëG­‡pT›PL«¶a°)¶ìë3:,ã&Õ‹•Êš^S4Þj^Ö°Ò2VÃÑv6¦û~bø²ÀÏ~ùøúÞ…«õmGêœÒUf)¡Pn';r.·´7Ú{'³U|Žnë:nÛT¿ªæ´ŠËe[œµþG¤£†ÃAìCDÄ— yáá¡ÓzßÕœ*ѦS«.Þ-´±¼®Y~)ºû(KÃûC êG€Ù´ 7Ⓨ2ž,Úa×XžŒTÆý8‡³»Y^ ˜è, :Ò³Î`­¦ÊLªúåð…¶‚09 w—âix Šù÷ê$y/ÌS1Äyà’ÐÆ£n¥BAQYÍ@ûË@âÚ#¤ºíÿÀÅ»Ÿé|°}½¹ä²¤Õ8"÷7’ú`ž^|ÝF¡ 3¯JÌÌíRÄ„[ÐQm7x»fô¼ËI™Ô†Fç3 :|‹ fý %˜zñ¼,D8¦sEqÚ%à?¤#~±åàG;á–‹ŽÌÐF—bSwörúÓ‡ù6$ú {}df"]¿ê›0Ô”A¶³œœ¸W`Õàšíþh¶qDó'ÌHSíHŠnjh€0WTè@e?Ì\“á ±Øº!…Ìaý4TÚ#-϶_f²P+Ž…åo=<†« Í·3•@Ag =àû¬Ïx9ó–‹%%\È´Qx׃ôÐaÙš¦ßùhîàž¯:æ-Þ„°maÍ<7•¢+Mà´;; "ܚஸÛN}IÓ"ìMc{©!Dë1̺K9Z€Q¼Š“näç÷‹*°QJ¡†˜/GÚGΆ© "¦aSå»Ï •¥;a½®Ü¸#ϬãTu¸´‚rcI\eõ6K¹RÎæ–Ç÷ËÞþ•ŠÉ;]vÆYª ±·¢'r‘ñâŸ/‘»i€”Žùi€ÞÈ禣[*×Ú1D–Œ†Ú´*àgÈ#Õ©¡p…½W§·zQ~ËlTtdíû÷6·gæáP«b+èþ¹EÅ?|éL?†&^cò¡¦½¼TÓF$ijx³•È9”W¿g°„0–|»£Ä!D½&¾ñ¡[Z|æöjô\#ÌAúg\*·æÞyz¡<ºõÍ%sÿBߢvôŸ$U¨8Ä¿2§EVp;'vþ:®1´«%ÈŽ^ÏZš`’r.ªZÎ L.7c’?²Üƒh¨‰4%ÚÄn+§˜Œé#¿GÔZjDZ;ùE@£˜½õökϼFo/̆\rŠÞ>¶ÀK éào_±¸ ½«ºSP¼Xr{Ç& _Ïa*èà 2%¶¾ð£…¥ßv£¸Ã5jt*¾_ƒÙAk­jð«›Tÿ³ÚöF¢Ôið$/r~W5–±ô¢Ã]Úo£Z ~Qp¼k5ôFôêJ=¬«3kˆ ɶRlUÍ"@^¯sÔlb5AÄœª=&C-k#OYe1Hæêܯýó@^òã1eE%„«ñT 5…X`Õ÷Áíôå+JÏLا{йòIXM]V #D=¨Ò›g­Ñ­ ”}¼bÀ!IìØ}ï!,ÉØlb„s—"¶&¯²äQЯŸ°fÇjbéþxLkj¸­)V%-)ÖˆŒñ±í{¨Cø[hÐîþä1†XRÌÆL<›v áD­ÁI..¡]뤌üXLL=PŸIjtOès÷Å›ÎR²|³Ë¯³Í ê ~s¸œ÷¦] wÈÏDÀdKYNÙ· þ‡¼³Õ{Ï”&ÈÐH“s ]ýpqKE!¢G¸N»Uó¹;:ÉŸsøLè"»aÆa¼B•Ù?ƒâ½Ö¸Îèç‹{ ].ò³SgGU öݳZö‘ |£ @®úÛAþš¯J†üÐÇâŽr„J/…IâSôe22’^¡L°žFf3pGGWõìlµ‡4K•Œ+_0@èA®0µ7) Æ(8Z{½&¾:}ãˆ6º²ê¾Ý8ˆ9ˆþy¹øhhCµ–ÒUµTÁƸ*ƒñd~û„p‹xíÉ1?ÐzùC RHP]Ý#àÁÜ4ø@¢÷wÎcÓ×p¤ÅšŽÚ1 endstream endobj 303 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20151021205705-04'00') /ModDate (D:20151021205705-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj 261 0 obj << /Type /ObjStm /N 72 /First 621 /Length 2844 /Filter /FlateDecode >> stream xÚ­Z[sÓJ~÷¯˜GØ­xî·ªS§*,ár’Kñà$"ñâØÁR¸œ_¿Ý3Òx$KN T4êéë×Ý3ãaaDAãð–ÄI oM8c–p)5 <áÆ(",'Ü9ŸÔ dqš!ÅḠ뉔†ã‘Fƒ2e‰âRÁ@%`ŠkC”t(Ž(ÍÁŽÒD%a ‰²Á ¸å<Š{¢™P#’škgD â^-a Ào­pà€¢AT8  ™ƒøÂÁKm•ÀàˆvLoàm͵xˆ‚P r;oÐe 1ºÄHá‰>é,DŒƒ£Ñ ”FH–AˆÀgÛ8Œø<x€Ï{F$¨f &–ƒcB pN0x#Ô†X©ÄˆŸ:°)‚CÈåp6…ÓÄ:Ž1ƒ€‡ô pÎñ@qÄ ¹tÂB ØuZÛ‘ðœ8+" r€„]F¼°T€ßkPTÞb¾½%ÞAF„wÄ{tÚ{Dò'Á)θà#ÉnK†x ÈÞðIaÆX+!µcóKOÔÒüµ†#ÝП‘ðÔ¿™#Œv I1fŒ©ôÀåÆ2pI-¦Áe”„YÎÓù %}Q²Ö-<µJº‘ «œ1“>´w­€Û£ÕªQR£ iÈŽóù hšp¿¯eWœ“Ž…'ºÇ«¹àîÇÑÉÅXc“üâ3꩟J€V-9@Ÿø EóüX¯iߥôÀÒ¸C’¡Q4´­ Þ«ÇXgÆŽyÍà”Ç êz줇Y#°°œQ slä8ŒOãlòíähäie@5*ÕPßáÍ%x)•Ûš©Mü %çjŠ—¶æXñÆy¥Ñ¥ÂxÅæ"Bqž/Á›Pβ~z­P*£h#¡‚Úa­sŠæ ¢S Û2ú<\ñÔ²‘y²5ÅZ1æìŠÿãè?FôôÇmAèáb^åÅrz[-–£ðýjr3?û÷þ˽3Î`b6¹*‰Š{{‹ïäÃ,p;|H ”‰fGt·¼(æD œû“ÛgÅôê>Q4ƒs;'ŸW“Ùôbw~5+¨?©Š›· fÎj!¥PÇõdyRTäÝ¥{tŸÐ'ô>¥ÏèszD_ÒWô =¦'ô”þMßÒwtBÏ齤ýD?M¿Âkq·¤WôšNég:£7tNt1/è-½-–ÓÅ%]Ò’–Óï´¢Õõ²(hõmAïèWú~§?è?Årñ8F}8_„ÊÈñèÏ?„âóÿ¼?8<Œ(Š%¢«2ÇUïw Èü(¾Ø€ãÅb¶˜ÿF4Û@šm€|ytøìÙûäéó¡‚„@,HÜ!­V? åÖa¦ó)@6p®†²›Û&¶·oŽÞ@lÇCÁñ$†‡¿Í5"T#&/ÉV"¯;ErFß· åbqs3 åcÑàŸ) òò¹þq{]Ì¡Šþ—êh>…2JÅ4YóYñ©Š£eP†a5•ö…~¹[TÅåù,06‘7|Åa¨Èâf},‹¯`+´œMÊë¡®_ï{˶IéÞó§¯NCJÚN ¡í=œKFõ`F1{¯S¦0GEÌöñ,õðÁ¾õ/¶ þìÉ»ïcðv xëÙÃÙÎ^¯e<˃?…À/B“^C­Ý¶ÃÚj-?xsúz×ò“£ÓÓÁ%;Â3ðËÉx“EÆy+2üL‘ !:+ÿåNý+ëÕÿ“hœr2¿¤“òb:­¦³Ë†Ø&åg¨óå䢭F±ypø¹¨Æq¢Ûó—‹Ùl²L­_|¹›Ì:»ÆÕ²˜€µõöŸe¹Zæw7çàèôj¾Õrp;»+³5¡nû¦ÙÛm~7¿ ‹e±±ã·Ú NöŽŽv¡:†·'ø[Ÿ—„ú•žÏ¶'ãî­Ž§õQ©½z·JŸ†åE{c¯»omÜnµÕíï½:{‚( vŠ ¤å/5ÐÏítýÝ÷¹Uÿœßßjˆ{á¾êoU}QVS°;Pþ}{ÝÚÀ l{ïÝy>‘¸îMÊgÖ:´ª!\b¡Jz8]–fƒ(8Mê¼¥ ï¦—ÕuIð~dkóÝ3w×¼}¸y#¶7¿~Rí:à»Xž;Àu¿ÙÞÎq²cÝò®uÞ²Ž”¬»í­wN>]ër |ÕŠÝgàÿDéuŽ]ëk•çÚÖ³ØÜÞúú ¡ëÀZíÉ–Âdà«íènB]óþžÜçgýÎêÞ1ïø=Ñ祧×Í¿™\%,à‹;ÜFð½ÄÅ/–ƒÞÓË’|à<˜!\Ëúíâ;þr‡·ï˜Œ?eÃÙ¨ÃG‚E›‚Ëúça[ºÏ†²!Dô[Èú­jšß§“›ä¨fµ£¢V&{„_ßU3ØqÊ:5$V^ÈL¸¤_ $ä¶?¼kˆ³»x‡)œº×ß,‹¯Ä·WÒZX¯„EKØ‹LÿU G˜7ÂÞ ËúÚ©WÅ÷*ü;Ú"o“Õ«§íñÁË$Ê6Ä^ï¡"—uAò¯ÆZåXïȶ9—°vm¨ÑZOŒ.íD¯dp͹É„²uB4¹ž¸¡Ë«ÉµŠiG´Ù” ÛN…q™-ÛSJ6e²^ÉàXçD$MÕ´A59¨õ­_RíA ©V:’IÈÑ«>8fz7 y½ ù<¾&›ÑK“o6¯𺠼Ì{I÷¯ðš KªÜKÝ“•² Ì5*WÓãJh+±AM½ê^%è¥V#ó¥EõtL¨Ê~T£dÏÂ"ª²jÞ¼Õf2_Ht»&;‹¶H`‹6Ø<OôD$¾BlÌñ=øŠ„/wÃjxŽoŸ7<áËU¯š(Ù·yÈÕÆÓ‡o”-|yޝhw“êl ©å7ôm^ʦշ<_]'ú6…Ño)® yüø3Î;'ÕdY=&<ö yô~09âjÚP¼Ï)À#âÞÝPRLN‘Hqñ°A¦7Óªc6ñ}ìú'*h™Õ@‰ùj((’ç Õ¢8¤´"ôH‘]×’ÕÄÕï˜@€T¦O0Ô×¢ @*H¢PN;Üå~j$ô;%'ž~— ÊæX$äææ07ç‘–náìòÞ ×½ÁÄ´æRœ@¸Ïõa•S°F$Ë)˜tÕ¢`ÒUK&]¯!•¬&®~Ç0}Zgú05&7‰©1&#`jl âmsŸÞ¾×%ñ8ñô;R“›Ãòdu–ÅÞëü+¦Çtˆ¡E‡ˆñ8Ö!†r½‚ýœoÍÉ4‡0ø®b„"ž 3"6!S"ö!ksbTí@1$Ûu3÷ còо­â·(k:¢!a0ÉÅ»ód* Ï{èà­äî¢]îu—Wó­¹fE¢³î•B~'{èÀïÖù5ò{ÝC~¿V¼]Ϻ"›BÑ¡Yæ[ ̧šÄ¢öC“aÅšÄÅÃöO†J½!HòÕ•ë´Í„uà‡,ƒ^%‡&Ág5è3”¨æC“P¬ºD£µ¼/Ú5¿{…ï YFQ«7[ƒ²ò©/;êíKÔ»–ˆ¿p׋ïúd}•ÍÝ…¶V^¯Z¢îwÑ\†øú¶¦¹Åñzx…Ü„RcÆü><ê5UÔ{´ðãÞ¨ñ (A@²žëÔýI5™-®FñúhuÕ\e'ÉP’¥ƒæUñrqYпËbu{ôú¶˜ï`¹Læþª$7£ endstream endobj 304 0 obj << /Type /XRef /Index [0 305] /Size 305 /W [1 3 1] /Root 302 0 R /Info 303 0 R /ID [ ] /Length 711 /Filter /FlateDecode >> stream xÚ”ÉN”AFëÖßÝ Í “L" "ŠŠÌC35³¢ 3Ê`#Ľ+ãZ7&.ô-îÖ&|ucâ#øFû|›“{¿ªúëT…¿B ÚÏÕ~±NQˆà€l*)pH6@•pDÖOUJ‹ð„¬¶ ”“•’ݥ͂ ²*²^ÚJPEVGv‡¶\ k$»M[jÉšÈnÑÖz²V²Úp‘¬ƒì&m#h"ë$»AÛ ZÈzȺi[Á%²²ë´mà2Ù Ym;¸B6Jvö*è #뤸ê“d\zoö)2=¦3*Ÿ&ãÍQgF¾H¦OjÒü _"cTQ?Œ?éËd®~6«àÛdÌ(j¡XAß!ÓTµÈ¬¾?!ãoÄa0FÁ90&Á˜3 fÁ˜ `,epÜ+àxVÁxÖÁØ»BµŒÝšV ¨¨5­ P d“dx ž‚= ™‚Þ¢ùb]| jêÂ1ê\Svb¡ù½ªS‹¯þR9z»Yèþ£–ãìg8ûÃÙ.;Ë-ô¿Õ}ì×À{Gt—èèíú¤ük°û¡'¤2²z £R+¥Ú,,6éÙ‰ .'QÊQÀ»,¬îè ‡f.Í˱Éey¯…㯺YFôYØÞR‹9Ž>laÿ‹²‹kݪX}ÏYÜx£Aœ•ö¼ÅÃM]ÅGŸg2ìKGGGß+ŸŸé ŒpŒpŒpŒpŒp<ð}°gñ…éfVÚÀÅ—Ye‡€Õ÷8¬¹Ÿ€S†,õ)Å©˜6P< _Ô&¿7ªJYR±®*mIoVUÆ’wßT•Xò¹DU©%¿3ªÊ,Õ1¤ªÜR'¿Teޝf0 F€Žã &€Î :f@Ì‚9 ?¹tPèdX¶ÔÇóâ´Î>„ÿÙ0ú endstream endobj startxref 310672 %%EOF rtracklayer/inst/extdata/0000755000175100017510000000000012607264731016534 5ustar00biocbuildbiocbuildrtracklayer/inst/extdata/demo.narrowPeak.gz0000644000175100017510000000035112607264731022131 0ustar00biocbuildbiocbuild‹¿‰Qdemo.narrowPeakEÐ9nÄ0 Кs•À÷å<©sÿ"”#M C¶õô©÷÷7T«¬%¼æáÀ$‡B¯l¢û‹•YÜï«Äèõ~¶›w±¶Ï ò ºâ9XÜD/y·Ñ^‚Øö b^ƒ=¢ Lxœcb``8ñ¨ƒùËãf(`B$±ý°? òà¬h$ppxœc```(xÐÁüáwsÃаŸÁa?ƒó†„WÎŒ@‘/;˜Kþw0s°ƒå÷±=à †A–:˜=þu0ë€30ì‡`±Ã Óœ  à¬h$pàˆHþˆbpàˆHþˆÀaZxœc```(xÐÁ\à×ÉÁä04ìg`pØÏàÀ|„!á•3#PäËãæ/Ìì`ù}@lÏp@Ã…!@ФåÄ£æÌ: Å û!Xì0Ã4'˜ãšà¬h$pàˆÈP‰´ÂpàˆÈP‰ZÂZ&üˆrtracklayer/inst/tests/bed.wig0000644000175100017510000000060212607264731017504 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20 chr1 59102000 59102300 -1.0 chr1 59102300 59102600 -0.75 chr5 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr19 59103800 59104100 0.50 chr19 59104100 59104400 0.75 chr19 59104400 59104700 1.00 rtracklayer/inst/tests/genes.gff30000644000175100017510000000373612607264731020125 0ustar00biocbuildbiocbuild##gff-version 3 ##source-version rtracklayer 1.15.4 ##date 2011-12-06 chr10 rtracklayer gene 92828 95504 5 - . ID=GeneID:347688;Name=TUBB8;geneName=tubulin%2c beta 8;Alias=FLJ40100,TUBB8;genome=hg19 chr10 rtracklayer mRNA 92828 95178 . - . Parent=GeneID:347688;ID=873;Name=TUBB8; chr10 rtracklayer mRNA 92828 95504 . - . Parent=GeneID:347688;ID=872;Name=TUBB8; chr10 rtracklayer exon 92828 94054 . - . Parent=872,873; chr10 rtracklayer CDS 92997 94054 . - . Parent=872,873; chr10 rtracklayer exon 94555 94665 . - . Parent=872; chr10 rtracklayer exon 94555 94665 . - . Parent=873; chr10 rtracklayer CDS 94555 94615 . - . Parent=872; chr10 rtracklayer CDS 94555 94665 . - . Parent=873; chr10 rtracklayer exon 94744 94852 . - . Parent=872; chr10 rtracklayer exon 94744 94852 . - . Parent=873; chr10 rtracklayer CDS 94744 94852 . - . Parent=873; chr10 rtracklayer exon 95122 95178 . - . Parent=873; chr10 rtracklayer CDS 95122 95178 . - . Parent=873; chr10 rtracklayer exon 95348 95504 . . . Parent=872; chr12 rtracklayer gene 87984 91263 . + . ID=GeneID:100288778;Name=LOC100288778;geneName=WAS protein family homolog 1%3B pseudogene;Alias=LOC100288778 chr12 rtracklayer mRNA 87984 91263 . + . Parent=GeneID:100288778;ID=4644;Name=LOC100288778; chr12 rtracklayer exon 87984 88017 . + . Parent=4644; chr12 rtracklayer CDS 87984 88017 . + . Parent=4644; chr12 rtracklayer exon 88257 88392 . + . Parent=4644; chr12 rtracklayer CDS 88257 88392 . + . Parent=4644; chr12 rtracklayer exon 88570 88771 . + . Parent=4644; chr12 rtracklayer CDS 88570 88771 . + . Parent=4644; chr12 rtracklayer exon 88860 89018 . + . Parent=4644; chr12 rtracklayer CDS 88860 89018 . + . Parent=4644; chr12 rtracklayer exon 89675 89827 . + . Parent=4644; chr12 rtracklayer CDS 89675 89827 . + . Parent=4644; chr12 rtracklayer exon 90587 90655 . + . Parent=4644; chr12 rtracklayer CDS 90587 90655 . + . Parent=4644; chr12 rtracklayer exon 90796 91263 . + . Parent=4644; chr12 rtracklayer CDS 90796 91263 . ? . Parent=4644; > ACCCTGACTCCAGGATTACA rtracklayer/inst/tests/gtf.gff0000644000175100017510000000250012607264731017505 0ustar00biocbuildbiocbuildMm.16.ENSMUST00000040592.1 EnsEMBL exon 22572990 22573061 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22572990 22573010 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL start_codon 22573008 22573010 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL exon 22568081 22568323 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310133.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22568081 22568323 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310133.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL exon 22566859 22567246 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22566977 22567246 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL stop_codon 22566974 22566976 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; rtracklayer/inst/tests/multi.wig0000644000175100017510000000335712607264731020116 0ustar00biocbuildbiocbuild# 300 base wide bar graph, autoScale is on by default == graphing # limits will dynamically change to always show full range of data # in viewing window, priority = 20 positions this as the second graph # Note, zero-relative, half-open coordinate system in use for bed format track type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20 chr19 59102000 59102300 -1.0 chr19 59102300 59102600 -0.75 chr19 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr19 59103800 59104100 0.50 chr19 59104100 59104400 0.75 chr19 59104400 59104700 1.00 # 150 base wide bar graph at arbitrarily spaced positions, # threshold line drawn at y=11.76 # autoScale off viewing range set to [0:25] # priority = 10 positions this as the first graph # Note, one-relative coordinate system in use for this format track type=wiggle_0 name="variableStep" description="variableStep format" visibility=full autoScale=off viewLimits=0.0:25.0 color=255,200,0 yLineMark=11.76 yLineOnOff=on priority=10 variableStep chrom=chr19 span=150 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 # 200 base wide points graph at every 300 bases, 50 pixel high graph # autoScale off and viewing range set to [0:1000] # priority = 30 positions this as the third graph # Note, one-relative coordinate system in use for this format track type=wiggle_0 name="fixedStep" description="fixed step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 fixedStep chrom=chr19 start=59107401 step=300 span=200 1000 900 800 700 600 500 400 300 200 100 rtracklayer/inst/tests/quickload/0000755000175100017510000000000012607264731020220 5ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/T_species_Oct_2011/0000755000175100017510000000000012607264731023406 5ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/T_species_Oct_2011/T_species_Oct_2011.2bit0000644000175100017510000000010212607264731027347 0ustar00biocbuildbiocbuildC'Atestd8úè :µˆº:ŽD‰Z‚©© ¢Å»’irtracklayer/inst/tests/quickload/T_species_Oct_2011/annots.xml0000644000175100017510000000024712607264731025435 0ustar00biocbuildbiocbuild rtracklayer/inst/tests/quickload/T_species_Oct_2011/bedData.bed.gz0000644000175100017510000000043512607264731026027 0ustar00biocbuildbiocbuild‹ÿBCmÁj!E׿+$ÛLA}ꌋٔ@é&)ýƒI*AÚ™)£ú÷÷BkÐì.çp”—–áüɧaôýkòãûËóÞ3ÿðñ¼„ïæ©ß¢à«Yé8O1-ò-¿†Ná+¤Ÿ^ñ€õåÔ§Mò11©ZÝJéìm)°ÀÞæ(™`»‡RÓˆFÜÕ„iµÊu!ëš0-m]‹5äºuM˜–鬯ZçºuM˜V+@²ƒ¿àÝOåZ6ë w5aZtÖ*×…¬k´Xƒ5äºuMW' (¼Ûä» YÝ}ô¤uÿÖÿ—òïï_r  2‚‹ÿBCrtracklayer/inst/tests/quickload/T_species_Oct_2011/bedData.bed.gz.tbi0000644000175100017510000000026512607264731026605 0ustar00biocbuildbiocbuild‹ÿBC˜íËK €0Ð-\0€nÜk¡ ¨-<ÒòQÀõ½d2ÙI6o{JÑ¥è=´Œ-˽DL-µõ>Îõs|žß2?å·/äŒ{Wqó‹ÿBCrtracklayer/inst/tests/quickload/T_species_Oct_2011/bedGraphData.bw0000644000175100017510000000000012607264731026234 0ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/T_species_Oct_2011/mod_chromInfo.txt0000644000175100017510000000001112607264731026722 0ustar00biocbuildbiocbuildtest 100 rtracklayer/inst/tests/quickload/contents.txt0000644000175100017510000000004612607264731022616 0ustar00biocbuildbiocbuildT_species_Oct_2011 T_species_Oct_2011 rtracklayer/inst/tests/step.wig0000644000175100017510000000066012607264731017731 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="test" description="test track" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 variableStep chrom=chr19 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 fixedStep chrom=chr18 start=59108021 step=300 span=200 1000 900 800 700 600 500 400 300 200 100 rtracklayer/inst/tests/test.2bit0000644000175100017510000000027212607264731020006 0ustar00biocbuildbiocbuildC'A|gi|157704452|ref|AC_000143.1| Homo sapiens chromosome 11, alternate assembly (based on HuRef), whole genome shotgun sequence‘d8úè :µˆº:ŽD‰Z‚©© ¢Å»’irtracklayer/inst/tests/test.R0000644000175100017510000000050112607264731017342 0ustar00biocbuildbiocbuildlibrary(rtracklayer) files <- dir(system.file("tests", package = "rtracklayer"), pattern = "[^R~]$", full.names=TRUE) testExport <- function(file) { track <- import(file) export(track, format = "ucsc") } options(error=recover) sapply(files, testExport) ## test GRanges imports sapply(files[-8], import) rtracklayer/inst/tests/test.bed0000644000175100017510000000133312607264731017677 0ustar00biocbuildbiocbuild##Example 5 from Custom Annotation Tracks User's Guide track name="ItemRGBDemo" description="Item RGB demonstration" visibility=2 itemRgb="On" priority=1 useScore="0" color="0,60,120" colorByStrand="0,0,255 255,0,0" group="user" offset=0 url="http://genome.ucsc.edu/foo.html?query=$$" htmlUrl="http://genome.ucsc.edu/goldenPath/help/ct_description.txt" chr7 127471196 127472363 Pos1 0 + 127471196 127472363 255,0,0 3 300,200,100 0,500,1067 chr7 127472363 127473530 Pos2 2 + 127472363 127473530 255,0,0 2 250,500 0,667 chr7 127473530 127474697 Neg1 0 - 127473530 127474697 255,0,0 1 1167 0 chr9 127474697 127475864 Pos3 5 + 127474697 127475864 255,0,0 1 1167 0 chr9 127475864 127477031 Neg2 5 - 127475864 127477031 0,0,255 1 1167 0 rtracklayer/inst/tests/test.bed150000644000175100017510000000065412607264731020052 0ustar00biocbuildbiocbuildtrack type="array" expScale=3.0 expStep=0.5 expNames="breast_A,breast_B,breast_C,cerebellum_A,cerebellum_B," name="Microarray" description="Microarray custom track" chr1 159639972 159640031 2440848 500 - 159639972 159640031 0 1 59, 0, 5 0,1,2,3,4, 0.593000,1.196000,-0.190000,-1.088000,0.093000, chr1 159640161 159640190 2440849 500 - 159640161 159640190 0 1 29, 0, 5 0,1,2,3,4, -0.906000,-1.247000,0.111000,-0.515000,-0.057000,rtracklayer/inst/tests/test.bedGraph0000644000175100017510000000070712607264731020665 0ustar00biocbuildbiocbuildtrack type=bedGraph name="bedGraph track" description="Test" visibility=full color=200,100,0 altColor=0,100,200 gridDefault=Off priority=20 alwaysZero=On yLineMark=10 windowingFunction="mean" chr19 59102000 59102300 -1.0 chr19 59102300 59102600 -0.75 chr19 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr17 59103800 59104100 0.50 chr18 59104100 59104400 0.75 chr18 59104400 59104700 1.00 rtracklayer/inst/tests/test.bw0000644000175100017510000022112612607264731017561 0ustar00biocbuildbiocbuild&üˆ˜Ö*p@I'na¤a$àÁÂŒ ð¿ð?”‘@‘ŒÊxchr2í~chr19—<†xœc`€€;¬ :ŒÌÌä04ìg`pb nØR[Zxœcd``¸ÃÊÀÐÃÅÀ ÃÁÌ ,@Ñ; aÏÀàÄ öL¢à¬h$Œ *ÜÞ%ÜŒ 'xœc`€Ou†;¬ VÃ~°@ƒõ†<.Œ qU]† ,` ; ¶Ê»€äÑ Tà¬h$%-¤a%-ra2xœc`€•¹ wXA¬†ý`ë# x\ â‹6°€%ì€Ø(ï’85 öà¬h$£Â£äÁ2&üˆrtracklayer/inst/tests/test.gtf0000644000175100017510000000044612607264731017731 0ustar00biocbuildbiocbuild##gff-version 3 ##date 2011-05-17 chr1 aggregate_genes.py aggregate_gene 564418 570350 . - . aggregate_gene_id "CUFF.168931" chr1 aggregate_genes.py exonic_section 564418 565718 . - . exonic_section_number "001"; transcripts "CUFF.168931.1"; is_full_exon "True"; aggregate_gene_id "CUFF.168931"rtracklayer/inst/tests/v1.gff0000644000175100017510000000024512607264731017257 0ustar00biocbuildbiocbuildchr21 TeleGene enhancer 1000000 1011000 500 + . touch1 chr22 TeleGene promoter 1010000 1010100 900 + . touch1 chr22 TeleGene promoter 1020000 1020000 800 - . touch2 rtracklayer/inst/tests/v2.gff0000644000175100017510000000227012607264731017260 0ustar00biocbuildbiocbuild##gff-version 2 ##Type DNA Escherichia_coli_K-12_complete_genome glimmer/tico CDS 337 2799 5.347931 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 2801 3733 11.448764 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 3734 5020 6.230648 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5088 5237 3.815619 + . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 5310 5741 -0.111382 - . shift -21 ; note "weak tis" Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5310 5720 -0.111382 - . note "weak tis" Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5683 6459 0.234908 - . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 6529 7959 19.75313 - . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 8238 9191 19.169035 + . shift 63 ; Escherichia_coli_K-12_complete_genome glimmer/tico CDS 8175 9191 19.169035 + . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 9306 9893 19.613488 + . shift 3 ; Escherichia_coli_K-12_complete_genome glimmer/tico CDS 9303 9893 19.613488 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 9928 10494 4.670315 - . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 10643 11356 13.285624 - .rtracklayer/inst/tests/v3.gff0000644000175100017510000000166412607264731017267 0ustar00biocbuildbiocbuildedit_test.fa . gene 500 2610 . + . ID=newGene;Alias=NewGene,new_gene edit_test.fa . mRNA 500 2385 . + . Parent=newGene;Namo=reinhard+did+this;Name=t1%28newGene%29;ID=t1;uri=http%3A//www.yahoo.com edit_test.fa . five_prime_UTR 500 802 . + . Parent=t1 edit_test.fa . CDS 803 1012 . + . Parent=t1 edit_test.fa . three_prime_UTR 1013 1168 . + . Parent=t1 edit_test.fa . three_prime_UTR 1475 1654 . + . Parent=t1 edit_test.fa . three_prime_UTR 1720 1908 . + . Parent=t1 edit_test.fa . three_prime_UTR 2047 2385 . + . Parent=t1 edit_test.fa . mRNA 1050 2610 . + . Parent=newGene;Name=t2%28newGene%29;ID=t2 edit_test.fa . CDS 1050 1196 . + . Parent=t2 edit_test.fa . CDS 1472 1651 . + . Parent=t2 edit_test.fa . CDS 1732 2610 . + . Parent=t2 edit_test.fa . mRNA 1050 2610 . + . Parent=newGene;Name=t3%28newGene%29;ID=t3 edit_test.fa . CDS 1050 1196 . + . Parent=t3 edit_test.fa . CDS 1472 1651 . + . Parent=t3 edit_test.fa . CDS 1732 2610 . + . Parent=t3 rtracklayer/inst/tests/variableStep.bw0000644000175100017510000022140512607264731021223 0ustar00biocbuildbiocbuild&üˆ˜ãp@šUÍa+bhVgÂÅÂð¿4@À€­£@‘ŒÊxchr17»¼chr19C°Íchr5 ¬Ç xœc```ÈÐÁ|üQ3É ÃÈÀÀ„ 1††ý³‚h‡ýÀº _xœcd``øóªƒ9þ{3ÉÀÄL œ`1Ç#¯A´‡ãŽ· ºÀ±áˆîq\óD/pLøáÛ|„ÈúQ÷¢8U½xœcb``8þ¨ƒùóãf “A‡‘‰,ä»à¬h$oàˆóãˆoàˆÇâˆë)üêˆ_÷ˆJÇâˆóãˆ^#xœc```ÈÐÁÌiÖÉÁä04ìg`pØÏàÀ|„!á•3#PäÏ«æiÌœ iG†@ÌäÌðà› HËñG̉Ì:Œ`û!Xì0Ã4'8Šà¬h$oàˆa8‰+boàˆa8‰ÑaZxœc```ÈÐÁ|ݬ‹9‚ ÈahØÏÀà°ŸÁùCÂ+gF ÈŸWÌ)Ž]Ìœ iG†@ÌäÌðà› HËñGÌú–]Ì:Œ`û!Xì0Ã4'pªvà¬h$oàˆ/9ŠÅÂoàˆ/9ŠkÂZ&üˆrtracklayer/inst/tests/variableStep.wig0000644000175100017510000000070012607264731021372 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="variableStep" description="variable step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 variableStep chrom=chr19 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 variableStep chrom=chr5 span=300 59102600 -0.50 variableStep chrom=chr1 span=300 59102000 -1.0 59102300 -0.75 rtracklayer/inst/unitTests/0000755000175100017510000000000012607264731017104 5ustar00biocbuildbiocbuildrtracklayer/inst/unitTests/test_bed.R0000644000175100017510000002400612607264731021022 0ustar00biocbuildbiocbuildtest_bed <- function() { test_path <- system.file("tests", package = "rtracklayer") ## Import of classic test.bed with RGB colors test_bed <- file.path(test_path, "test.bed") ## import() createCorrectGR <- function(seqinfo) { ir <- IRanges(c(127471197, 127472364, 127473531, 127474698, 127475865), width = 1167) space <- factor(rep(c("chr7", "chr9"), c(3, 2)), seqlevels(seqinfo)) blocks <- split(IRanges(c(1, 501, 1068, 1, 668, 1, 1, 1), c(300, 700, 1167, 250, 1167, 1167, 1167, 1167)), rep(seq_len(5), c(3, 2, 1, 1, 1))) names(blocks) <- NULL correct_gr <- GRanges(space, ir, strand = strand(c("+", "+", "-", "+", "-")), name = c("Pos1", "Pos2", "Neg1", "Pos3", "Neg2"), score = c(0, 2, 0, 5, 5), itemRgb = c("#FF0000", "#FF0000", "#FF0000", "#FF0000", "#0000FF"), thick = ir, blocks) seqinfo(correct_gr) <- seqinfo correct_gr } createCorrectUCSC <- function(gr) { new("UCSCData", gr, trackLine = new("BasicTrackLine", itemRgb = TRUE, name = "ItemRGBDemo", description = "Item RGB demonstration", visibility = "2", color = c(0L, 60L, 120L), priority = 1, group = "user", offset = 0L, url = "http://genome.ucsc.edu/foo.html?query=$$", htmlUrl = paste("http://genome.ucsc.edu/goldenPath/", "help/ct_description.txt", sep = ""), colorByStrand = matrix(c(0L, 0L, 255L, 255L, 0L, 0L), 3), useScore = FALSE)) } correct_gr <- createCorrectGR(Seqinfo(c("chr7", "chr9"))) correct_ucsc <- createCorrectUCSC(correct_gr) test <- import(test_bed) checkIdentical(test, correct_ucsc) test_bed_file <- BEDFile(test_bed) test <- import(test_bed_file) checkIdentical(test, correct_ucsc) checkIdentical(import(test_bed_file, format = "bed"), correct_ucsc) checkException(import(test_bed_file, format = "gff")) test_bed_con <- file(test_bed) test <- import(test_bed_con, format = "bed") checkIdentical(test, correct_ucsc) close(test_bed_con) test_bed_con <- file(test_bed, "r") test <- import(test_bed_con, format = "bed") checkIdentical(test, correct_ucsc) close(test_bed_con) test_bed_con <- file(test_bed) test <- import(BEDFile(test_bed_con)) checkIdentical(test, correct_ucsc) close(test_bed_con) test <- import(test_bed, trackLine = FALSE) checkIdentical(test, correct_gr) test <- import(test_bed) checkIdentical(correct_ucsc, test) if (!require(BSgenome.Hsapiens.UCSC.hg19)) { stop("'BSgenome.Hsapiens.UCSC.hg19' must be installed to run tests") } hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_bed, genome = "hg19") checkIdentical(correct_genome, test) subcols <- c("name", "thick") correct_subcols <- correct_ucsc mcols(correct_subcols) <- mcols(correct_subcols)[ , subcols] test <- import(test_bed, colnames = c(subcols, "strand")) checkIdentical(correct_subcols, test) strand(correct_subcols) <- "*" test <- import(test_bed, colnames = subcols) checkIdentical(correct_subcols, test) which <- RangesList(chr7 = ranges(correct_gr)[1:2]) correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_bed, which = which) checkIdentical(correct_which, test) test <- import(test_bed, format = "bed") checkIdentical(correct_ucsc, test) ## import.bed() test <- import.bed(test_bed) checkIdentical(correct_ucsc, test) test_bed_con <- pipe(paste("head -n2", test_bed)) test <- import.bed(test_bed_con) correct_empty <- new("UCSCData", GRanges(), trackLine = correct_ucsc@trackLine) seqinfo(correct_empty) <- Seqinfo() checkIdentical(test, correct_empty) close(test_bed_con) ## export() ## the 'gsub' is to handle Windows paths (for later coercion to URL) test_bed_out <- gsub("\\\\", "/", file.path(tempdir(), "test.bed")) on.exit(unlink(test_bed_out)) export(correct_ucsc, test_bed_out) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) export(correct_ucsc, test_bed_out, format = "bed") test <- import(test_bed_out) checkIdentical(correct_ucsc, test) test_bed_out_file <- BEDFile(test_bed_out) export(correct_ucsc, test_bed_out_file) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_bed_out_file, format = "gff")) correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "ItemRGBDemo2")) export(correct_ucsc2, test_bed_out_file, append = TRUE) test <- import(test_bed_out_file) correct_list <- GenomicRangesList(ItemRGBDemo = correct_ucsc, ItemRGBDemo2 = correct_ucsc2) checkIdentical(correct_list, test) export(correct_ucsc, test_bed_out, name = "ItemRGBDemo2") test <- import(test_bed_out) checkIdentical(correct_ucsc2, test) test_bed_url <- paste("file:///", test_bed_out, sep = "") export(correct_ucsc, test_bed_url) test <- import(test_bed_url) checkIdentical(correct_ucsc, test) if (FALSE) { # enable to test an HTTP URL using the R help server http_pipe <- pipe("Rscript -e 'tools::startDynamicHelp(); writeLines(as.character(tools:::httpdPort)); Sys.sleep(10);' &") port <- readLines(http_pipe, n = 1) test_bed_http <- paste("http://127.0.0.1:", port, "/library/rtracklayer/doc/example.bed", sep = "") test <- import(test_bed_http) checkIdentical(correct_ucsc, test) close(http_pipe) } ## GenomicRangesList export(correct_list, test_bed_out) test <- import(test_bed_out) checkIdentical(correct_list, test) ## To/From gzip test_bed_gz <- paste(test_bed_out, ".gz", sep = "") on.exit(unlink(test_bed_gz)) export(correct_ucsc, test_bed_gz) test <- import(test_bed_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_bed_gz, append = TRUE) test <- import(test_bed_gz) checkIdentical(correct_list, test) test_bed_gz_url <- paste("file:///", test_bed_gz, sep = "") export(correct_ucsc, test_bed_gz_url) test <- import(test_bed_gz_url) checkIdentical(correct_ucsc, test) ## To/From tabix test_bed_bgz <- paste(test_bed_out, ".bgz", sep = "") export(correct_ucsc, test_bed_out, index = TRUE) on.exit(unlink(paste(test_bed_bgz, ".tbi", sep = ""))) test <- import(test_bed_bgz, which = which) checkIdentical(correct_which, test) ## check TabixFile test_bed_tabix <- Rsamtools::TabixFile(test_bed_bgz) test <- import(test_bed_tabix) checkIdentical(correct_ucsc, test) ## look mom, no track line export(correct_ucsc, test_bed_out, index = TRUE, trackLine = FALSE) test <- import(test_bed_bgz, which = which) checkIdentical(subsetByOverlaps(correct_gr, which), test) #test <- import(test_bed_tabix, format = "foo") ## To/From text bed_text <- export(correct_ucsc, format = "bed") test <- import(format = "bed", text = bed_text) checkIdentical(correct_ucsc, test) ## TODO: empty text ## Using connection to add comment header test_bed_con <- file(test_bed_out) open(test_bed_con, "w") comment <- "# test comment" writeLines(comment, test_bed_con) export(correct_ucsc, test_bed_con) close(test_bed_con) checkIdentical(comment, readLines(test_bed_out, n = 1)) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) ## Set offset in correct_ucsc track line, export, then: correct_offset <- shift(correct_gr, -1) correct_ucsc@trackLine@offset <- 1L export(correct_ucsc, test_bed_out) test <- import(test_bed_out, trackLine = FALSE) checkIdentical(test, correct_offset) test <- import(test_bed_out) checkIdentical(test, correct_ucsc) correct_ucsc@trackLine@offset <- 0L ## Drop all extra columns, see if it still works correct_stripped <- correct_ucsc mcols(correct_stripped) <- NULL export(correct_stripped, test_bed_out) test <- import(test_bed_out) mcols(correct_stripped)$name <- NA_character_ mcols(correct_stripped)$score <- 0 checkIdentical(test, correct_stripped) ## - and even when asking for a column like blocks: correct_blocks <- correct_ucsc mcols(correct_blocks) <- mcols(correct_blocks)[ , "blocks", drop=FALSE] test <- import(test_bed, colnames = c("blocks", "strand")) checkIdentical(test, correct_blocks) strand(correct_blocks) <- "*" test <- import(test_bed, colnames = "blocks") checkIdentical(test, correct_blocks) ## Drop the columns except for blocks, see if it still works export(correct_blocks, test_bed_out) test <- import(test_bed_out) correct_fill_to_blocks <- correct_ucsc strand(correct_fill_to_blocks) <- "*" mcols(correct_fill_to_blocks)$name <- NA_character_ mcols(correct_fill_to_blocks)$score <- 0 mcols(correct_fill_to_blocks)$itemRgb <- NA_character_ mcols(correct_fill_to_blocks)$thick <- ranges(correct_fill_to_blocks) checkIdentical(test, correct_fill_to_blocks) } test_extendedBed <- function() { # the narrowPeak format represents a variety of "BED6+N" formats # used by the ENCODE project. see # http://genome.ucsc.edu/FAQ/FAQformat.html # "This format is used to provide called peaks of signal # enrichment based on pooled, normalized (interpreted) data. # It is a BED6+4 format." file <- system.file("extdata", "demo.narrowPeak.gz", package="rtracklayer") extraCols <- c(signalValue="numeric", pValue="numeric", qValue="numeric", peak="integer") gr <- import(file, forma="bed", extraCols=extraCols, genome="hg19") checkEquals(length(gr), 6) checkEquals(colnames(mcols(gr)), c("name","score","signalValue","pValue","qValue","peak")) # make sure that all seqnames in the gr object # are also in the seqinfo(gr) object checkTrue(all(seqnames(gr) %in% names(seqinfo(gr)))) } rtracklayer/inst/unitTests/test_bedGraph.R0000644000175100017510000001117312607264731022005 0ustar00biocbuildbiocbuildtest_bedGraph <- function() { test_path <- system.file("tests", package = "rtracklayer") test_bg <- file.path(test_path, "test.bedGraph") createCorrectGR <- function(si) { part <- PartitioningByWidth(rep(300, 9)) ir <- shift(IRanges(start(part), end(part)), 59102000) score <- seq(-1, 1, by = 0.25) space <- factor(c(rep("chr19", 6), "chr17", rep("chr18", 2)), seqlevels(si)) correct_gr <- GRanges(space, ir, score = score) if (!any(is.na(genome(si)))) genome(correct_gr) <- unname(genome(si)[1]) seqinfo(correct_gr) <- si correct_gr } createCorrectUCSC <- function(gr) { track_line <- new("GraphTrackLine", type = "bedGraph", name = "bedGraph track", description = "Test", visibility = "full", alwaysZero = TRUE, gridDefault = FALSE, yLineMark = 10, windowingFunction = "mean", color = c(200L, 100L, 0L), altColor = c(0L, 100L, 200L), priority = 20) new("UCSCData", gr, trackLine = track_line) } correct_gr <- createCorrectGR(Seqinfo(c("chr19", "chr17", "chr18"))) correct_ucsc <- createCorrectUCSC(correct_gr) ## TEST: basic import test <- import(test_bg) checkIdentical(correct_ucsc, test) test <- import.bedGraph(test_bg) checkIdentical(correct_ucsc, test) test_bg_file <- BEDGraphFile(test_bg) checkException(import(test_bg_file, format = "wig")) test <- import(test_bg_file, format = "bedGraph") checkIdentical(correct_ucsc, test) test <- import(test_bg_file) checkIdentical(correct_ucsc, test) test_bg_con <- file(test_bg) test <- import(test_bg_con, format = "wig") checkIdentical(correct_ucsc, test) close(test_bg_con) test_bg_con <- file(test_bg) test <- import(WIGFile(test_bg_con)) checkIdentical(correct_ucsc, test) close(test_bg_con) ## TEST: 'genome' hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_bg, genome = "hg19") checkIdentical(correct_genome, test) ## TEST: trackLine = FALSE test <- import(test_bg, trackLine = FALSE) checkIdentical(correct_gr, test) ## TEST: which correct_which <- subsetByOverlaps(correct_ucsc, correct_gr[3:4]) test <- import(test_bg, which = correct_which) checkIdentical(correct_which, test) ## TEST: basic export test_bg_out <- file.path(tempdir(), "test.bedGraph") on.exit(unlink(test_bg_out)) export(correct_ucsc, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) export.bedGraph(correct_ucsc, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) test_foo_out <- file.path(tempdir(), "test.foo") export(correct_ucsc, test_foo_out, format = "bedGraph") on.exit(unlink(test_foo_out)) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) test_bg_out_file <- BEDGraphFile(test_bg_out) export(correct_ucsc, test_bg_out_file) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_bg_out_file, format = "gff")) ## TEST: append correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "test2")) export(correct_ucsc2, test_bg_out_file, append = TRUE) test <- import(test_bg_out_file) correct_list <- GenomicRangesList("bedGraph track" = correct_ucsc, test2 = correct_ucsc2) checkIdentical(correct_list, test) ## TEST: track line parameters export(correct_ucsc, test_bg_out, name = "test2") test <- import(test_bg_out) checkIdentical(correct_ucsc2, test) ## TEST: export trackLine export(correct_ucsc, test_bg_out, trackLine = FALSE) test <- import(test_bg_out) checkIdentical(test, correct_gr) ## TEST: RangedDataList export(correct_list, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_list, test) ## TEST: gzip test_bg_gz <- paste(test_bg_out, ".gz", sep = "") on.exit(unlink(test_bg_gz)) export(correct_ucsc, test_bg_gz) test <- import(test_bg_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_bg_gz, append = TRUE) test <- import(test_bg_gz) checkIdentical(correct_list, test) ## TEST: Using connection to add comment header test_bg_con <- file(test_bg_out) open(test_bg_con, "w") comment <- "# test comment" writeLines(comment, test_bg_con) export(correct_ucsc, test_bg_con) close(test_bg_con) checkIdentical(comment, readLines(test_bg_out, n = 1)) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) } rtracklayer/inst/unitTests/test_bw.R0000644000175100017510000000564412607264731020707 0ustar00biocbuildbiocbuildtest_bw <- function() { if (.Platform$OS.type == "windows") return() test_path <- system.file("tests", package = "rtracklayer") test_bw <- file.path(test_path, "test.bw") ir <- as(PartitioningByWidth(rep(300, 9)), "IRanges") space <- factor(c(rep("chr2", 5), rep("chr19", 4)), c("chr2", "chr19")) score <- seq(-1, 1, length = 9) correct_fixed <- GRanges(space, ir, score = score) si <- SeqinfoForBSGenome("hg19") seqlengths(correct_fixed) <- seqlengths(si)[levels(space)] test <- import(test_bw) checkIdentical(test, correct_fixed) test_bw_out <- file.path(tempdir(), "test_out.bw") export(correct_fixed, test_bw_out) on.exit(unlink(test_bw_out)) test <- import(test_bw_out) checkIdentical(test, correct_fixed) export.bw(correct_fixed, test_bw_out) test <- import.bw(test_bw_out) checkIdentical(test, correct_fixed) correct_bedgraph <- correct_fixed width(correct_bedgraph) <- seq(1, 300, length = 9) export(correct_bedgraph, test_bw_out) test <- import(test_bw_out) checkIdentical(test, correct_bedgraph) ## TEST: 'which' which <- GRanges(c("chr2", "chr2"), IRanges(c(1, 300), c(400, 1000))) correct_which <- subsetByOverlaps(correct_bedgraph, which) ranges(correct_which) <- ranges(intersect(correct_which, which)) test <- import(test_bw_out, which = which) checkIdentical(test, correct_which) ## TEST: BigWigSelection (range, no score) test <- import(test_bw_out, selection = BigWigSelection(which, colnames = character())) correct_which <- correct_which[, character()] checkIdentical(test, correct_which) ## TEST: empty which which <- RangesList() correct_which <- subsetByOverlaps(correct_bedgraph, which) test <- import(test_bw_out, which = which) checkIdentical(test, correct_which) ## TEST: non-UCSC naming correct_ncbi <- correct_bedgraph seqlevels(correct_ncbi) <- sub("chr", "", seqlevels(correct_ncbi)) export(correct_ncbi, test_bw_out) test <- import(test_bw_out) checkIdentical(test, correct_ncbi) ## TEST: as="RleList" correct_cov <- coverage(correct_ncbi, weight="score") test <- import(test_bw_out, as="RleList") checkIdentical(correct_cov, test) ## TEST: export RleList export(correct_cov, test_bw_out) test <- import(test_bw_out, as="RleList") checkIdentical(correct_cov, test) ## TEST: export/import NumericList correct_cov_short <- correct_cov[correct_cov != 0L] correct_int <- as(correct_cov_short, "NumericList") which <- GRanges(names(correct_int), IRanges(1, elementLengths(correct_int))) metadata(correct_int) <- list(ranges=which) export(correct_int, test_bw_out) test <- import(test_bw_out, as="NumericList") checkIdentical(correct_int, test) test <- import(test_bw_out, which=which[1], as="NumericList") checkIdentical(elementLengths(correct_int[1]), elementLengths(test)) test <- import(test_bw_out, which=which[1:2], as="NumericList") checkIdentical(correct_int, test) } rtracklayer/inst/unitTests/test_gff.R0000644000175100017510000002036612607264731021037 0ustar00biocbuildbiocbuildtest_gff <- function() { test_path <- system.file("tests", package = "rtracklayer") space <- c(rep("chr10", 15), rep("chr12", 16)) start <- c(rep(92828, 4), 92997, rep(94555, 4), rep(94744, 3), rep(95122, 2), 95348, rep(87984, 4), rep(c(88257, 88570, 88860, 89675, 90587, 90796), each = 2)) end <- c(95504, 95178, 95504, rep(94054, 2), rep(94665, 2), 94615, 94665, rep(94852, 3), rep(95178, 2), 95504, rep(c(91263, 88017, 88392, 88771, 89018, 89827, 90655, 91263), each = 2)) type <- c("gene", "mRNA", "mRNA", "exon", "CDS", "exon", "exon", "CDS", "CDS", "exon", "exon", "CDS", "exon", "CDS", "exon", "gene", "mRNA", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS") type <- factor(type, unique(type)) source <- factor("rtracklayer") phase <- NA_integer_ score <- c(5, rep(NA, length(type) - 1L)) strand <- strand(c(rep("-", 14), "*", rep("+", 15), "*")) Alias <- CharacterList(c(list(c("FLJ40100", "TUBB8")), rep(list(character()), 14), "LOC100288778", rep(list(character()), 15))) ID <- c("GeneID:347688", "873", "872", rep(NA, 12), "GeneID:100288778", "4644", rep(NA, 14)) Name <- c(rep("TUBB8", 3), rep(NA, 12), rep("LOC100288778", 2), rep(NA, 14)) Parent <- CharacterList(c(list(character()), rep("GeneID:347688", 2), rep(list(c("872", "873")), 2), rep(c("872", "873"), 3), rep("873", 3), "872", list(character()), "GeneID:100288778", rep("4644", 14))) geneName <- c("tubulin, beta 8", rep(NA, 14), "WAS protein family homolog 1; pseudogene", rep(NA, 15)) genome <- c("hg19", rep(NA, length(geneName) - 1)) correct_gff3 <- GRanges(space, IRanges(start, end), strand, source, type, score, phase, ID, Name, geneName, Alias, genome, Parent) seqinfo(correct_gff3) <- Seqinfo(c("chr10", "chr12")) correct_gff1 <- correct_gff3[,c("source", "type", "score", "phase")] correct_gff1$group <- as.factor(seqnames(correct_gff3)) correct_gff2 <- correct_gff3 toCSV <- function(x) { csv <- sapply(x, paste, collapse = ",") csv[nchar(csv) == 0] <- NA csv } correct_gff2$Alias <- toCSV(correct_gff2$Alias) correct_gff2$Parent <- toCSV(correct_gff2$Parent) ## TEST: basic GFF3 import test_gff3 <- file.path(test_path, "genes.gff3") test <- import(test_gff3) checkIdentical(correct_gff3, test) ## TEST: import.gff* test <- import.gff(test_gff3) checkIdentical(correct_gff3, test) test <- import.gff3(test_gff3) checkIdentical(correct_gff3, test) #suppressWarnings(test <- import.gff2(test_gff3)) #checkIdentical(correct_gff3, test) oldOpts <- options(warn = 2) checkException(import.gff2(test_gff3)) options(oldOpts) ## TEST: GFF(3)File test_gff_file <- GFF3File(test_gff3) test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFFFile(test_gff3) test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFFFile(test_gff3, version = "3") test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFF2File(test_gff3) #suppressWarnings(test <- import(test_gff_file)) #checkIdentical(correct_gff3, test) oldOpts <- options(warn = 2) checkException(test <- import(test_gff_file)) options(oldOpts) ## TEST: 'gff' extension test_gff_out <- file.path(tempdir(), "genes.gff") on.exit(unlink(test_gff_out)) export(correct_gff3, test_gff_out) test <- import(test_gff_out) checkIdentical(test, correct_gff1) export(correct_gff3, test_gff_out, version = "1") test <- import(test_gff_out) checkIdentical(test, correct_gff1) export(correct_gff3, test_gff_out, version = "2") test <- import(test_gff_out) checkIdentical(test, correct_gff2) export(correct_gff3, test_gff_out, version = "3") test <- import(test_gff_out) checkIdentical(test, correct_gff3) test <- import(GFF3File(test_gff_out)) checkIdentical(test, correct_gff3) test <- import(GFFFile(test_gff_out)) checkIdentical(test, correct_gff3) test <- import(test_gff_out, version = "3") checkIdentical(test, correct_gff3) #suppressWarnings(test <- import(test_gff_out, version = "2")) #checkIdentical(test, correct_gff3) oldOpts <- options(warn = 2) checkException(test <- import(test_gff_out, version = "2")) options(oldOpts) ## TEST: 'gff2' extension test_gff2_out <- file.path(tempdir(), "genes.gff2") export(correct_gff3, test_gff2_out) test <- import(test_gff2_out) checkIdentical(test, correct_gff2) ## TEST: 'gff1' extension test_gff1_out <- file.path(tempdir(), "genes.gff1") export(correct_gff3, test_gff1_out) test <- import(test_gff1_out) checkIdentical(test, correct_gff1) ## TEST: 'format' argument test_gff_file <- GFF3File(test_gff3) test <- import(test_gff_file, format = "gff") checkIdentical(test, correct_gff3) test <- import(test_gff_file, format = "gff3") checkIdentical(test, correct_gff3) checkException(import(test_gff_file, format = "gff2")) checkException(import(test_gff_file, format = "bed")) ## TEST: 'genome' si_hg19 <- SeqinfoForBSGenome("hg19") correct_hg19 <- correct_gff3 seqlevels(correct_hg19) <- seqlevels(si_hg19) seqinfo(correct_hg19) <- si_hg19 test <- import(test_gff3, genome = "hg19") checkIdentical(test, correct_hg19) test_gff3_out <- file.path(tempdir(), "genes.gff3") on.exit(unlink(test_gff3_out)) correct_genome_hg19 <- correct_gff3 genome(correct_genome_hg19) <- "hg19" correct_genome_hg19 <- as(correct_genome_hg19, "GRanges") export(correct_genome_hg19, test_gff3_out) test <- import(test_gff3_out) checkIdentical(test, correct_hg19) ## TEST: colnames empty, colnames := "geneName", colnames := "strand" test <- import(test_gff3, colnames = character()) target <- correct_gff3[,character()] checkIdentical(target, test) test <- import(test_gff3, colnames = "geneName") target <- correct_gff3[,"geneName"] checkIdentical(target, test) checkException(import(test_gff3, colnames = "strand")) ## TEST: import from connection test_gff_con <- file(test_gff_out) test <- import(test_gff_con, format = "gff") close(test_gff_con) checkIdentical(correct_gff3, test) ## TEST: export to connection, with preceding comment test_gff_con <- file(test_gff_out) open(test_gff_con, "w") comment <- "# test comment" writeLines(comment, test_gff_con) export(correct_gff3, test_gff_con, version = "3") close(test_gff_con) checkIdentical(comment, readLines(test_gff_out, n = 1)) test <- import(test_gff_out) checkIdentical(correct_gff3, test) ## TEST: 'append' export(correct_gff3[seqnames(correct_gff3) == "chr10", ], test_gff3_out) export(correct_gff3[seqnames(correct_gff3) == "chr12", ], test_gff3_out, append = TRUE) test <- import(test_gff3_out) checkIdentical(correct_gff3, test) ## TEST: 'source' target <- correct_gff3 mcols(target)$source <- factor("test") export(correct_gff3, test_gff3_out, source = "test") test <- import(test_gff3_out) checkIdentical(target, test) ## TEST: 'which' which <- RangesList(chr10 = IRanges(90000, 93000)) which_target <- subsetByOverlaps(correct_gff3, which) test <- import(test_gff3, which = which) checkIdentical(which_target, test) ## TEST: 'index' export(correct_gff3, test_gff3_out, index = TRUE) test_gff_bgz <- paste(test_gff3_out, ".bgz", sep = "") on.exit(unlink(test_gff_bgz)) on.exit(unlink(paste(test_gff_bgz, ".tbi", sep = ""))) test <- import(test_gff_bgz, which = which) checkIdentical(which_target, test) ## TEST: GenomicRangesList correct_grl <- GenomicRangesList(new("UCSCData", keepSeqlevels(correct_gff3, "chr10"), trackLine = new("BasicTrackLine", name = "chr10")), new("UCSCData", keepSeqlevels(correct_gff3, "chr12"), trackLine = new("BasicTrackLine", name = "chr12"))) mcols(correct_grl[[2]])$genome <- NULL names(correct_grl) <- seqlevels(correct_gff3) export(correct_grl, test_gff3_out) test <- import.ucsc(test_gff3_out) checkIdentical(correct_grl, test) } rtracklayer/inst/unitTests/test_twoBit.R0000644000175100017510000000403712607264731021542 0ustar00biocbuildbiocbuildtest_twoBit <- function() { test_path <- system.file("tests", package = "rtracklayer") test_2bit <- file.path(test_path, "test.2bit") correct_name <- "gi|157704452|ref|AC_000143.1| Homo sapiens chromosome 11, alternate assembly (based on HuRef), whole genome shotgun sequence" correct_seq <- "TGATGGAAGAATTATTTGAAAGCCATATAGAATGAAATGACTCTATACCCAAATTAAAACTCAAAAACTTACTCAAAATAGTCCAGAGACTACAACTTCA" correct_char <- setNames(correct_seq, correct_name) correct_2bit <- Biostrings::DNAStringSet(correct_char) ## TEST: basic import test <- import(test_2bit) checkIdentical(test, correct_2bit) ## TEST: basic export, import test_2bit_out <- file.path(tempdir(), "test_out.2bit") export(correct_2bit, test_2bit_out) on.exit(unlink(test_2bit_out)) test <- import(test_2bit_out) checkIdentical(test, correct_2bit) ## TEST: twoBit extension test_twoBit_out <- file.path(tempdir(), "test_out.twoBit") export(correct_2bit, test_twoBit_out) on.exit(unlink(test_twoBit_out)) test <- import(test_twoBit_out) checkIdentical(test, correct_2bit) ## TEST: character export export(correct_char, test_2bit_out) test <- import(test_2bit_out) checkIdentical(test, correct_2bit) ## TEST: 'which' which_range <- IRanges(c(10, 40), c(30, 42)) correct_which <- correct_2bit[[1]][which_range] which <- GRanges(names(correct_2bit), which_range) test <- import(test_2bit_out, which = which) checkIdentical(unlist(test), correct_which) ## TEST: empty which which_range <- IRanges() correct_which <- Biostrings::DNAStringSet() which <- GRanges(character(), which_range) test <- import(test_2bit_out, which = which) checkIdentical(as.character(test), as.character(correct_which)) ## TEST: which with empty range which_range <- IRanges(1, 0) which <- GRanges(names(correct_2bit), which_range) test <- import(test_2bit_out, which = which) checkIdentical(unlist(correct_which), unlist(test)) ## TEST: invalid characters invalid_2bit <- paste0(correct_char, "L") checkException(export(invalid_2bit, test_2bit_out)) } rtracklayer/inst/unitTests/test_wig.R0000644000175100017510000001265712607264731021067 0ustar00biocbuildbiocbuildtest_wig <- function() { test_path <- system.file("tests", package = "rtracklayer") test_wig <- file.path(test_path, "step.wig") createCorrectGR <- function(si) { score <- c(seq(10, 20, by = 2.5), seq(17.5, 10, by = -2.5), seq(1000, 100, by = -100)) start <- c(59104701 + cumsum(c(0, 200, 500, 200, 300, 180, 220, 390, 1180)), 59108021 + cumsum(c(0, rep(300, 9)))) width <- c(rep(1, 9), rep(200, 10)) space <- factor(c(rep("chr19", 9), rep("chr18", 10)), seqlevels(si)) correct_gr <- GRanges(space, IRanges(start, width = width), score = score) if (!any(is.na(genome(si)))) genome(correct_gr) <- unname(genome(si)[1]) seqinfo(correct_gr) <- si correct_gr } createCorrectUCSC <- function(gr) { track_line <- new("GraphTrackLine", type = "wig", name = "test", description = "test track", visibility = "full", autoScale = FALSE, viewLimits = c(0, 1000), color = c(0L, 200L, 100L), maxHeightPixels = c(100L, 50L, 20L), graphType = "points", priority = 30) new("UCSCData", gr, trackLine = track_line) } correct_gr <- createCorrectGR(Seqinfo(c("chr19", "chr18"))) correct_ucsc <- createCorrectUCSC(correct_gr) ## TEST: basic import test <- import(test_wig) checkIdentical(correct_ucsc, test) test <- import.wig(test_wig) checkIdentical(correct_ucsc, test) test_wig_file <- WIGFile(test_wig) checkException(import(test_wig_file, format = "bed")) test <- import(test_wig_file, format = "wig") checkIdentical(correct_ucsc, test) test <- import(test_wig_file) checkIdentical(correct_ucsc, test) test_wig_con <- file(test_wig) test <- import(test_wig_con, format = "wig") checkIdentical(correct_ucsc, test) close(test_wig_con) test_wig_con <- file(test_wig) test <- import(WIGFile(test_wig_con)) checkIdentical(correct_ucsc, test) close(test_wig_con) ## TEST: 'genome' hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_wig, genome = "hg19") checkIdentical(correct_genome, test) ## TEST: trackLine = FALSE test <- import(test_wig, trackLine = FALSE) checkIdentical(correct_gr, test) ## TEST: which which <- correct_gr[3:4] correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_wig, which = which) checkIdentical(correct_which, test) ## TEST: basic export test_wig_out <- file.path(tempdir(), "test.wig") on.exit(unlink(test_wig_out)) export(correct_ucsc, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) export.wig(correct_ucsc, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) test_foo_out <- file.path(tempdir(), "test.foo") export(correct_ucsc, test_foo_out, format = "wig") on.exit(unlink(test_foo_out)) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) test_wig_out_file <- WIGFile(test_wig_out) export(correct_ucsc, test_wig_out_file) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_wig_out_file, format = "gff")) ## TEST: append correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "test2")) export(correct_ucsc2, test_wig_out_file, append = TRUE) test <- import(test_wig_out_file) correct_list <- GenomicRangesList(test = correct_ucsc, test2 = correct_ucsc2) checkIdentical(correct_list, test) ## TEST: track line parameters export(correct_ucsc, test_wig_out, name = "test2") test <- import(test_wig_out) checkIdentical(correct_ucsc2, test) ## TEST: export trackLine export(correct_ucsc, test_wig_out, trackLine = FALSE) test <- import(test_wig_out) checkIdentical(test, correct_gr) ## TEST: Plain GRanges / bedGraph export.ucsc(correct_gr, test_wig_out) # mixture of steps leads to bedGraph test <- import(test_wig_out) default_line <- new("GraphTrackLine", name = "R Track", type = "bedGraph") correct_default <- new("UCSCData", correct_gr, trackLine = default_line) checkIdentical(test, correct_default) correct_chr18 <- keepSeqlevels(correct_gr, "chr18") export.ucsc(correct_chr18, test_wig_out) test <- import(test_wig_out) default_line <- new("GraphTrackLine", name = "R Track", type = "wig") correct_default <- new("UCSCData", keepSeqlevels(correct_gr, "chr18"), trackLine = default_line) checkIdentical(test, correct_default) ## TEST: GenomicRangesList export(correct_list, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_list, test) ## TEST: gzip test_wig_gz <- paste(test_wig_out, ".gz", sep = "") on.exit(unlink(test_wig_gz)) export(correct_ucsc, test_wig_gz) test <- import(test_wig_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_wig_gz, append = TRUE) test <- import(test_wig_gz) checkIdentical(correct_list, test) ## TEST: Using connection to add comment header test_wig_con <- file(test_wig_out) open(test_wig_con, "w") comment <- "# test comment" writeLines(comment, test_wig_con) export(correct_ucsc, test_wig_con) close(test_wig_con) checkIdentical(comment, readLines(test_wig_out, n = 1)) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) } rtracklayer/load.R0000644000175100017510000000063112607264730015166 0ustar00biocbuildbiocbuildlibrary(RCurl) library(XML) library(GenomicRanges) library(rJava) files <- c("web.R", "range.R", "trackSet.R", "browser.R", "gff.R", "ucsc.R", "bed.R", "wig.R", "io.R") sapply(files, source) #track <- import(system.file("inst", "test", "v1.gff", package = "rtracklayer")) track <- import("../inst/tests/bed.wig") track@genome <- "hg18" session <- browserSession("ucsc") layTrack(session, track) rtracklayer/man/0000755000175100017510000000000012607264731014700 5ustar00biocbuildbiocbuildrtracklayer/man/BEDFile-class.Rd0000644000175100017510000002571212607264731017473 0ustar00biocbuildbiocbuild\name{BEDFile-class} \docType{class} %% Classes: \alias{class:BEDFile} \alias{class:BED15File} \alias{class:BEDGraphFile} \alias{BEDFile-class} \alias{BED15File-class} \alias{BEDGraphFile-class} %% Constructor: \alias{BEDFile} \alias{BED15File} \alias{BEDGraphFile} %% Import: \alias{import,BEDFile,ANY,ANY-method} \alias{import,BED15File,ANY,ANY-method} \alias{import.bed} \alias{import.bed,ANY-method} \alias{import.bed15} \alias{import.bed15,ANY-method} \alias{import.bedGraph} \alias{import.bedGraph,ANY-method} %% Export: \alias{export,ANY,BEDFile,ANY-method} \alias{export,GenomicRanges,BEDFile,ANY-method} \alias{export,GRangesList,BEDFile,ANY-method} \alias{export,GenomicRangesList,BEDFile,ANY-method} \alias{export,UCSCData,BEDFile,ANY-method} \alias{export,GenomicRanges,BED15File,ANY-method} \alias{export.bed} \alias{export.bed,ANY-method} \alias{export.bed15} \alias{export.bed15,ANY-method} \alias{export.bedGraph} \alias{export.bedGraph,ANY-method} \title{BEDFile objects} \description{ These functions support the import and export of the UCSC BED format and its variants, including BEDGraph. } \usage{ \S4method{import}{BEDFile,ANY,ANY}(con, format, text, trackLine = TRUE, genome = NA, colnames = NULL, which = NULL, seqinfo = NULL, extraCols = character()) import.bed(con, ...) import.bed15(con, ...) import.bedGraph(con, ...) \S4method{export}{ANY,BEDFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,BEDFile,ANY}(object, con, format, append = FALSE, index = FALSE, ignore.strand = FALSE, trackLine = NULL) \S4method{export}{UCSCData,BEDFile,ANY}(object, con, format, trackLine = TRUE, ...) export.bed(object, con, ...) export.bed15(object, con, ...) \S4method{export}{GenomicRanges,BED15File,ANY}(object, con, format, expNames = NULL, trackLine = NULL, ...) export.bedGraph(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{BEDFile} object. For the functions ending in \code{.bed}, \code{.bedGraph} and \code{.bed15}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be one of \dQuote{bed}, \dQuote{bed15} or \dQuote{bedGraph}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. If the object has a method for \code{asBED} (like \code{GRangesList}), it is called prior to coercion. This makes it possible to export a \code{GRangesList} or \code{TxDb} in a way that preserves the hierarchical structure. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be one of \dQuote{bed}, \dQuote{bed15} or \dQuote{bedGraph}.} \item{text}{If \code{con} is missing, a character vector to use as the input} \item{trackLine}{For import, an imported track line will be stored in a \code{\linkS4class{TrackLine}} object, as part of the returned \code{\linkS4class{UCSCData}}. For the UCSCData method on export, whether to output the UCSC track line stored on the object, for the other export methods, the actual TrackLine object to export. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{colnames}{A character vector naming the columns to parse. These should name columns in the result, not those in the BED spec, so e.g. specify \dQuote{thick}, instead of \dQuote{thickStart}. } \item{which}{A range data structure like \code{RangesList} or \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. This is much more efficient when the file is indexed with the tabix utility. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Does not work when exporting a \code{RangedDataList} with multiple elements; tabix supports a single track in a file. } \item{ignore.strand}{Whether to output the strand when not required (by the existence of later fields). } \item{seqinfo}{If not \code{NULL}, the \code{Seqinfo} object to set on the result. If the \code{genome} argument is not \code{NA}, it must agree with \code{genome(seqinfo)}. } \item{extraCols}{A character vector in the same form as \code{colClasses} from \code{\link{read.table}}. It should indicate the name and class of each extra/special column to read from the BED file. As BED does not encode column names, these are assumed to be the last columns in the file. This enables parsing of the various BEDX+Y formats. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{expNames}{character vector of column names in \code{object} to export as sample columns in the BED15 file.} \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BEDFile} method on \code{import}. For export, the \code{RangedData}, \code{BEDFile} method on \code{export} is the sink. When \code{trackLine} is \code{TRUE} or the target format is BED15, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} with the metadata columns described in the details. } \details{ The BED format is a tab-separated table of intervals, with annotations like name, score and even sub-intervals for representing alignments and gene models. Official (UCSC) child formats currently include BED15 (adding a number matrix for e.g. expression data across multiple samples) and BEDGraph (a compressed means of storing a single score variable, e.g. coverage; overlapping features are not allowed). Many tools and organizations have extended the BED format with additional columns for particular use cases. These are not yet supported by rtracklayer, but a mechanism will be added soon. The advantage of BED is its balance between simplicity and expressiveness. It is also relatively scalable, because only the first three columns (chrom, start and end) are required. Thus, BED is best suited for representing simple features. For specialized cases, one is usually better off with another format. For example, genome-scale vectors belong in \link[=BigWigFile]{BigWig}, alignments from high-throughput sequencing belong in \link[Rsamtools:BamFile]{BAM}, and gene models are more richly expressed in \link[=GFFFile]{GFF}. The following is the mapping of BED elements to a \code{GRanges} or \code{RangedData} object. NA values are allowed only where indicated. These appear as a \dQuote{.} in the file. Only the first three columns (chrom, start and strand) are required. The other columns can only be included if all previous columns (to the left) are included. Upon export, default values are used to automatically pad the table, if necessary. \describe{ \item{chrom, start, end}{the \code{ranges} component.} \item{name}{character vector (NA's allowed) in the \code{name} column; defaults to NA on export. } \item{score}{numeric vector in the \code{score} column, accessible via the \code{score} accessor. Defaults to 0 on export. This is the only column present in BEDGraph (besides chrom, start and end), and it is required. } \item{strand}{strand factor (NA's allowed) in the \code{strand} column, accessible via the \code{strand} accessor; defaults to NA on export. } \item{thickStart, thickEnd}{\code{Ranges} object in a column named \code{thick}; defaults to the ranges of the feature on export. } \item{itemRgb}{an integer matrix of color codes, as returned by \code{\link{col2rgb}}, or any valid input to \code{\link{col2rgb}}, in the \code{itemRgb} column; default is NA on export, which translates to black. } \item{blockSizes, blockStarts, blockCounts}{\code{RangesList} object in a column named \code{blocks}; defaults to empty upon BED15 export. } } These columns are present only in BED15: \describe{ \item{expCount, expIds, expScores}{A column for each unique element in \code{expIds}, containing the corresponding values from \code{expScores}. When a value is not present for a feature, NA is substituted. NA values become -10000 in the file. } } } \section{BEDX+Y formats}{ To import one of the multitude of BEDX+Y formats, such as those used to distribute ENCODE data through UCSC (narrowPeaks, etc), specify the \code{extraCols} argument to indicate the expected names and classes of the special columns. We assume that the last \code{length(extraCols)} columns are special, and that the preceding columns adhere to the BED format. } \section{BEDFile objects}{ The \code{BEDFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the BED format. To cast a path, URL or connection to a \code{BEDFile}, pass it to the \code{BEDFile} constructor. Classes and constructors also exist for the subclasses \code{BED15File} and \code{BEDGraphFile}. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html} } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_bed <- file.path(test_path, "test.bed") test <- import(test_bed) test test_bed_file <- BEDFile(test_bed) import(test_bed_file) test_bed_con <- file(test_bed) import(test_bed_con, format = "bed") close(test_bed_con) import(test_bed, trackLine = FALSE) import(test_bed, genome = "hg19") import(test_bed, colnames = c("name", "strand", "thick")) which <- RangesList(chr7 = as(test, "RangesList")[[1]][1:2]) import(test_bed, which = which) \dontrun{ test_bed_out <- file.path(tempdir(), "test.bed") export(test, test_bed_out) test_bed_out_file <- BEDFile(test_bed_out) export(test, test_bed_out_file) export(test, test_bed_out, name = "Alternative name") test_bed_gz <- paste(test_bed_out, ".gz", sep = "") export(test, test_bed_gz) export(test, test_bed_out, index = TRUE) export(test, test_bed_out, index = TRUE, trackLine = FALSE) bed_text <- export(test, format = "bed") test <- import(format = "bed", text = bed_text) } } \keyword{methods} \keyword{classes} rtracklayer/man/BamFile-methods.Rd0000644000175100017510000000401312607264731020125 0ustar00biocbuildbiocbuild\name{BamFile-methods} \alias{export,ANY,BamFile,ANY-method} \alias{export,GAlignments,BamFile,ANY-method} \alias{export,GAlignmentPairs,BamFile,ANY-method} \alias{import,BamFile,ANY,ANY-method} \title{Export to BAM Files} \description{ Methods for import and export of \code{\link[GenomicAlignments]{GAlignments}} or \code{\link[GenomicAlignments]{GAlignmentPairs}} objects from and to BAM files, represented as \code{\link[Rsamtools]{BamFile}} objects. } \usage{ \S4method{import}{BamFile,ANY,ANY}(con, format, text, use.names = FALSE, param = ScanBamParam(...), ...) \S4method{export}{ANY,BamFile,ANY}(object, con, format, ...) } \arguments{ \item{object}{The object to export, such as a \code{GAlignments} or \code{GAlignmentPairs}. } \item{con}{A path, URL, connection or \code{BamFile} object.} \item{format}{If not missing, should be \dQuote{bam}.} \item{text}{Not supported.} \item{use.names}{Whether to parse QNAME as the names on the result.} \item{param}{The \code{\link[Rsamtools]{ScanBamParam}} object governing the import. } \item{\dots}{Arguments that are passed to \code{ScanBamParam} if \code{param} is missing. } } \details{ BAM fields not formally present in the \code{GAlignments[Pairs]} object are extracted from the metadata columns, if present; otherwise, the missing value, \dQuote{"."}, is output. The file is sorted and indexed. This can be useful for subsetting BAM files, although \code{\link[Rsamtools]{filterBam}} may eventually become flexible enough to be the favored alternative. } \seealso{ The \code{\link[GenomicAlignments]{readGAlignments}} and \code{\link[GenomicAlignments]{readGAlignmentPairs}} functions for reading BAM files. } \examples{ library(Rsamtools) ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") gal <- import(ex1_file, param=ScanBamParam(what="flag")) gal.minus <- gal[strand(gal) == "-"] \dontrun{ export(gal, BamFile("ex1-minus.bam")) } } \author{Michael Lawrence} rtracklayer/man/Bed15TrackLine-class.Rd0000644000175100017510000000360712607264731020735 0ustar00biocbuildbiocbuild\name{Bed15TrackLine-class} \docType{class} \alias{Bed15TrackLine-class} \alias{coerce,character,Bed15TrackLine-method} \alias{coerce,Bed15TrackLine,character-method} \title{Class "Bed15TrackLine"} \description{ A \acronym{UCSC} track line for graphical tracks. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Bed15TrackLine", ...)} or parsed from a character vector track line with \code{as(text, "Bed15TrackLine")}. } \section{Slots}{ \describe{ \item{\code{expStep}:}{A \code{"numeric"} scalar indicating the step size for the heatmap color gradient.} \item{\code{expScale}:}{A positive \code{"numeric"} scalar indicating the range of the data to be \code{[-expScale, expScale]} for determining the heatmap color gradient.} \item{\code{expNames}:}{A \code{"character"} vector naming the the experimental samples.} \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} } } \references{ Official documentation: \url{http://genomewiki.ucsc.edu/index.php/Microarray_track}. } \author{ Michael Lawrence } \seealso{ \code{\link{export.bed15}} for exporting bed15 tracks. } \keyword{classes} rtracklayer/man/BigWigFile.Rd0000644000175100017510000001713512607264731017146 0ustar00biocbuildbiocbuild\name{BigWigFile-class} \docType{class} %% Classes: \alias{class:BigWigFile} \alias{BigWigFile-class} \alias{class:BWFile} \alias{BWFile-class} \alias{class:BigWigFileList} \alias{BigWigFileList-class} %% Constructor: \alias{BigWigFile} \alias{BWFile} \alias{BigWigFileList} %% Accessors: \alias{seqinfo,BigWigFile-method} %% Import: \alias{import.bw} \alias{import.bw,ANY-method} \alias{import,BigWigFile,ANY,ANY-method} %% Export: \alias{export.bw} \alias{export.bw,ANY-method} \alias{export,ANY,BigWigFile,ANY-method} \alias{export,GenomicRanges,BigWigFile,ANY-method} \alias{export,List,BigWigFile,ANY-method} %% Utilites: \alias{summary,BigWigFile-method} \alias{path,BigWigFileList-method} \title{BigWig Import and Export} \description{ These functions support the import and export of the UCSC BigWig format, a compressed, binary form of WIG/BEDGraph with a spatial index and precomputed summaries. These functions do not work on Windows. } \usage{ \S4method{import}{BigWigFile,ANY,ANY}(con, format, text, selection = BigWigSelection(which, ...), which = con, asRle = FALSE, as = c("GRanges", "RleList", "NumericList"), ...) import.bw(con, ...) \S4method{export}{ANY,BigWigFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,BigWigFile,ANY}(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep", "bedGraph"), compress = TRUE) export.bw(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{BigWigFile} object. Connections are not supported. For the functions ending in \code{.bw}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{bigWig} or \dQuote{bw}. } \item{object}{The object to export, should be an \code{RleList}, \code{IntegerList}, \code{NumericList}, \code{GRanges} or something coercible to a \code{GRanges}. } \item{format}{If not missing, should be \dQuote{bigWig} or \dQuote{bw} (case insensitive). } \item{text}{Not supported. } \item{as}{Specifies the class of the return object. Default is \code{GRanges}, which has one range per range in the file, and a score column holding the value for each range. For \code{NumericList}, one numeric vector is returned for each range in the \code{selection} argument. For \code{RleList}, there is one \code{Rle} per sequence, and that \code{Rle} spans the entire sequence. As of version 1.23.11 \code{import} no longer returns \code{RangedData}. } \item{asRle}{Deprecated. Use \code{as} instead. If \code{TRUE}, the BigWig file is assumed to contain contiguous ranges that define a run-length encoding of a vector (like coverage), and a \code{RleList} is returned. } \item{selection}{A \code{\linkS4class{BigWigSelection}} object indicating the ranges to load. } \item{which}{A range data structure coercible to \code{RangesList}, like a \code{GRanges}, or a \code{BigWigFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{BigWigFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{RangesList} that represents the entirety of the file. } \item{dataFormat}{Probably best left to \dQuote{auto}. Exists only for historical reasons. } \item{compress}{If \code{TRUE}, compress the data. No reason to change this. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BigWigFile} method on \code{import}. For export, the \code{RangedData}, \code{BigWigFile} method on \code{export} is the sink. } } \value{ A \code{GRanges} (default), \code{RangedData}, \code{RleList} or \code{NumericList}. \code{GRanges} and \code{RangedData} return ranges with non-zero score values in a \code{score} metadata column. The length of the \code{NumericList} is the same length as the \code{selection} argument (one list element per range). The return order in the \code{NumericList} matches the order of the \code{BigWigSelection} object. } \section{\code{BigWigFile} objects}{ A \code{BigWigFile} object, an extension of \code{\linkS4class{RTLFile}} is a reference to a BigWig file. To cast a path, URL or connection to a \code{BigWigFile}, pass it to the \code{BigWigFile} constructor. BigWig files are more complex than most track files, and there are a number of methods on \code{BigWigFile} for accessing the additional information: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } \item{}{ \code{summary(ranges = as(seqinfo(object), "GenomicRanges"), size = 1L, type = c("mean", "min", "max", "coverage", "sd"), defaultValue = NA_real_), ...}: Aggregates the intervals in the file that fall into \code{ranges}, which should be something coercible to \code{GRanges}. The aggregation essentially compresses each sequence to a length of \code{size}. The algorithm is specified by \code{type}; available algorithms include the mean, min, max, coverage (percent sequence covered by at least one feature), and standard deviation. When a window contains no features, \code{defaultValue} is assumed. The result is an \code{\link[IRanges:RleList-class]{RleList}}, with an element for each element in \code{ranges}. The driving use case for this is visualization of coverage when the screen space is small compared to the viewed portion of the sequence. The operation is very fast, as it leverages cached multi-level summaries present in every BigWig file. If a summary statistic is not available / cannot be computed for a given range a warning is thrown and the defaultValue \code{NA_real_} is returned. } } } \section{\code{BigWigFileList} objects}{ A \code{BigWigFileList()} provides a convenient way of managing a list of \code{BigWigFile} instances. } \author{Michael Lawrence} \seealso{ \code{\link{wigToBigWig}} for converting a WIG file to BigWig. } \examples{ if (.Platform$OS.type != "windows") { test_path <- system.file("tests", package = "rtracklayer") test_bw <- file.path(test_path, "test.bw") ## GRanges ## Returns ranges with non-zero scores. gr <- import(test_bw) gr which <- GRanges(c("chr2", "chr2"), IRanges(c(1, 300), c(400, 1000))) import(test_bw, which = which) ## RleList ## Scores returned as an RleList is equivalent to the coverage. ## Best option when 'which' or 'selection' contain many small ranges. mini <- narrow(unlist(tile(which, 50)), 2) rle <- import(test_bw, which = mini, as = "RleList") rle ## NumericList ## The 'which' is stored as metadata: track <- import(test_bw, which = which, as = "NumericList") metadata(track) \dontrun{ test_bw_out <- file.path(tempdir(), "test_out.bw") export(test, test_bw_out) } bwf <- BigWigFile(test_bw) track <- import(bwf) seqinfo(bwf) summary(bwf) # for each sequence, average all values into one summary(bwf, range(head(track))) # just average the first few features summary(bwf, size = seqlengths(bwf) / 10) # 10X reduction summary(bwf, type = "min") # min instead of mean } } \keyword{methods} \keyword{classes} rtracklayer/man/BigWigSelection-class.Rd0000644000175100017510000000334412607264731021314 0ustar00biocbuildbiocbuild\name{BigWigSelection-class} \docType{class} \alias{BigWigSelection-class} % constructor \alias{BigWigSelection} \alias{coerce,RangesList,BigWigSelection-method} \alias{coerce,GenomicRanges,BigWigSelection-method} \title{Selection of ranges and columns} \description{A \code{BigWigSelection} represents a query against a BigWig file, see \code{\link{import.bw}}. It is simply a \link[IRanges]{RangedSelection} that requires its \code{colnames} parameter to be "score", if non-empty, as that is the only column supported by BigWig.} \section{Constructor}{ \describe{ \item{}{\code{BigWigSelection(ranges = GRanges(), colnames = "score")}: Constructs a \code{BigWigSelection} with the given \code{ranges} and \code{colnames}. \code{ranges} can be either something coercible to a \code{\linkS4class{RangesList}}, a \code{character} identifying a genome (see \code{\link{GenomicSelection}}), or a \code{\linkS4class{BigWigFile}}, in which case the ranges are derived from the bounds of its sequences. } } } \section{Coercion}{ \describe{ \item{}{\code{as(from, "BigWigSelection")}: Coerces \code{from} to a \code{BigWigSelection} object. Typically, \code{from} is a \code{\link[GenomicRanges:GRanges-class]{GRanges}} or a \code{\link[IRanges:RangesList-class]{RangesList}}, the ranges of which become the ranges in the new \code{BigWigSelection}. } } } \author{ Michael Lawrence } \examples{ rl <- IRanges::RangesList(chr1 = IRanges::IRanges(c(1, 5), c(3, 6))) BigWigSelection(rl) as(rl, "BigWigSelection") # same as above # do not select the 'score' column BigWigSelection(rl, character()) } \keyword{methods} \keyword{classes} rtracklayer/man/BrowserViewList-class.Rd0000644000175100017510000000123512607264731021405 0ustar00biocbuildbiocbuild\name{BrowserViewList-class} \docType{class} \alias{BrowserViewList-class} % Constructor \alias{BrowserViewList} \title{Lists of BrowserView} \description{ A formal list of \code{\linkS4class{BrowserView}} objects. Extends and inherits all its methods from \code{\link[S4Vectors]{Vector}}. Usually generated by passing multiple ranges to the \code{\link{browserView}} function. } \section{Constructor}{ \describe{ \item{}{\code{BrowserViewList(...)}: Concatenates the \code{BrowserView} objects in \code{...} into a new \code{BrowserViewList}. This is rarely called by the user. } } } \author{Michael Lawrence} \keyword{classes} rtracklayer/man/Chain-class.Rd0000644000175100017510000000563712607264731017327 0ustar00biocbuildbiocbuild\name{Chain-class} \docType{class} %% Classes: \alias{class:Chain} \alias{Chain-class} \alias{ChainBlock-class} \alias{class:ChainBlock} \alias{class:ChainFile} \alias{ChainFile-class} %% Constructor: \alias{import.chain} \alias{import.chain,ANY-method} \alias{import,ChainFile,ANY,ANY-method} \alias{ChainFile} %% Generics and methods: \alias{ranges,ChainBlock-method} \alias{offset,ChainBlock-method} \alias{score,ChainBlock-method} \alias{space,ChainBlock-method} \alias{reversed} \alias{reversed,ChainBlock-method} \title{Chain objects} \description{ A \code{Chain} object represents a UCSC chain alignment, typically imported from a \code{chain} file, and is essentially a list of \code{ChainBlock} objects. Each \code{ChainBlock} has a corresponding chromosome (its name in the list) and is a run-length encoded alignment, mapping a set of intervals on that chromosome to intervals on the same or other chromosomes. } \note{ A chain file essentially details many local alignments, so it is possible for the "from" ranges to map to overlapping regions in the other sequence. The "from" ranges are guaranteed to be disjoint (but do not necessarily cover the entire "from" sequence). } \section{Accessor Methods}{ In the code snippets below, \code{x} and \code{object} are \code{ChainBlock} objects. \describe{ \item{}{ \code{ranges(x)}: Get the \code{\link[IRanges:Ranges-class]{Ranges}} object holding the starts and ends of the "from" ranges. Each range is a contiguous block of positions aligned without gaps to the other sequence. } \item{}{ \code{offset(x)}: Integer offset from the "from" start to the "end" start (which could be in another chromosome). } \item{}{ \code{score(x)}: The score for each mapping. } \item{}{ \code{space(x)}: The space (chromosome) of the "to" range. } \item{}{ \code{reversed(x)}: Whether the mapping inverts the region, i.e., the alignment is between different strands. } } } \section{Import}{ A \code{Chain} object can be loaded from a UCSC chain format file simply by passing the path \code{import} function. If the file extension is not \dQuote{chain}, then either pass \dQuote{chain} to the \code{format} argument, or cast the path to a \code{ChainFile} object. The \code{import.chain} function is provided as a (slight) convenience. It is documented below, along with the extra \code{exclude} argument to the \code{import} method. \describe{ \item{}{ \code{import.chain(con, exclude = "_", ...)}: Imports a chain file named \code{con} as a \code{Chain} object, a list of \code{ChainBlock}s. Alignments for chromosomes matching the \code{exclude} pattern are not imported. } } } \author{Michael Lawrence} \seealso{ \code{\link{liftOver}} for performing lift overs using a chain alignment } \keyword{methods} \keyword{classes} rtracklayer/man/FastaFile-class.Rd0000644000175100017510000000427112607264731020134 0ustar00biocbuildbiocbuild\name{FastaFile-class} \docType{class} %% Classes: \alias{class:FastaFile} \alias{FastaFile-class} %% Constructor: \alias{FastaFile} %% Import: \alias{import,FastaFile,ANY,ANY-method} %% Export: \alias{export,ANY,FastaFile,ANY-method} \alias{export,XStringSet,FastaFile,ANY-method} \title{FastaFile objects} \description{ These functions support the import and export of the Fasta sequence format, using the Biostrings package. } \usage{ \S4method{import}{FastaFile,ANY,ANY}(con, format, text, type = c("DNA", "RNA", "AA", "B"), ...) \S4method{export}{ANY,FastaFile,ANY}(object, con, format, ...) \S4method{export}{XStringSet,FastaFile,ANY}(object, con, format, ...) } \arguments{ \item{con}{A path or \code{FastaFile} object. URLs and connections are not supported. If \code{con} is not a \code{FastaFile}, either the file extension or the \code{format} argument needs to be \dQuote{fasta}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be an \code{XStringSet} or something coercible to a \code{DNAStringSet}, like a character vector. } \item{format}{If not missing, should be \dQuote{fasta}. } \item{text}{If \code{con} is missing, a character vector to use as the input } \item{type}{Type of biological sequence.} \item{...}{Arguments to pass down to \code{\link[Biostrings]{writeXStringSet}} (export) or the \code{\link[Biostrings]{readDNAStringSet}} family of functions (import). } } \seealso{ These functions are implemented by the Biostrings \code{\link[Biostrings]{writeXStringSet}} (export) and the \code{\link[Biostrings]{readDNAStringSet}} family of functions (import). See \link[BSgenome]{export-methods} in the \pkg{BSgenome} package for exporting a \link[BSgenome]{BSgenome} object as a FASTA file. } \section{FastaFile objects}{ The \code{FastaFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the Fasta format. To cast a path, URL or connection to a \code{FastaFile}, pass it to the \code{FastaFile} constructor. } \author{Michael Lawrence} \keyword{methods} \keyword{classes} rtracklayer/man/GFFFile-class.Rd0000644000175100017510000003013612607264731017477 0ustar00biocbuildbiocbuild\name{GFFFile-class} \docType{class} %% Classes: \alias{class:GFFFile} \alias{class:GFF1File} \alias{class:GFF2File} \alias{class:GFF3File} \alias{class:GVFFile} \alias{class:GTFFile} \alias{GFFFile-class} \alias{GFF1File-class} \alias{GFF2File-class} \alias{GFF3File-class} \alias{GVFFile-class} \alias{GTFFile-class} %% Constructor: \alias{GFFFile} \alias{GFF1File} \alias{GFF2File} \alias{GFF3File} \alias{GVFFile} \alias{GTFFile} %% Import: \alias{import,GFFFile,ANY,ANY-method} \alias{import.gff} \alias{import.gff1} \alias{import.gff2} \alias{import.gff3} \alias{import.gff,ANY-method} \alias{import.gff1,ANY-method} \alias{import.gff2,ANY-method} \alias{import.gff3,ANY-method} %% Export: \alias{export,ANY,GFFFile,ANY-method} \alias{export,GenomicRanges,GFFFile,ANY-method} \alias{export,GenomicRangesList,GFFFile,ANY-method} \alias{export,GRangesList,GFFFile,ANY-method} \alias{export.gff} \alias{export.gff,ANY-method} \alias{export.gff1} \alias{export.gff1,ANY-method} \alias{export.gff2} \alias{export.gff2,ANY-method} \alias{export.gff3} \alias{export.gff3,ANY-method} % Other: \alias{genome,GFFFile-method} \title{GFFFile objects} \description{ These functions support the import and export of the GFF format, of which there are three versions and several flavors. } \usage{ \S4method{import}{GFFFile,ANY,ANY}(con, format, text, version = c("", "1", "2", "3"), genome = NA, colnames = NULL, which = NULL, feature.type = NULL, sequenceRegionsAsSeqinfo = FALSE) import.gff(con, ...) import.gff1(con, ...) import.gff2(con, ...) import.gff3(con, ...) \S4method{export}{ANY,GFFFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,GFFFile,ANY}(object, con, format, version = c("1", "2", "3"), source = "rtracklayer", append = FALSE, index = FALSE) \S4method{export}{GenomicRangesList,GFFFile,ANY}(object, con, format, ...) export.gff(object, con, ...) export.gff1(object, con, ...) export.gff2(object, con, ...) export.gff3(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{GFFFile} object. For the functions ending in \code{.gff}, \code{.gff1}, etc, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be one of \dQuote{gff}, \dQuote{gff1} \dQuote{gff2}, \dQuote{gff3}, \dQuote{gvf}, or \dQuote{gtf}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. If the object has a method for \code{asGFF}, it is called prior to coercion. This makes it possible to export a \code{GRangesList} or \code{TxDb} in a way that preserves the hierarchical structure. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be one of \dQuote{gff}, \dQuote{gff1} \dQuote{gff2}, \dQuote{gff3}, \dQuote{gvf}, or \dQuote{gtf}. } \item{version}{If the format is given as \dQuote{gff}, i.e., it does not specify a version, then this should indicate the GFF version as one of \dQuote{} (for import only, from the \code{gff-version} directive in the file or \dQuote{1} if none), \dQuote{1}, \dQuote{2} or \dQuote{3}. } \item{text}{If \code{con} is missing, a character vector to use as the input. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{colnames}{A character vector naming the columns to parse. These should name either fixed fields, like \code{source} or \code{type}, or, for GFF2 and GFF3, any attribute. } \item{which}{A range data structure like \code{RangesList} or \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. This is much more efficient when the file is indexed with the tabix utility. } \item{feature.type}{\code{NULL} (the default) or a character vector of valid feature types. If not \code{NULL}, then only the features of the specified type(s) are imported. } \item{sequenceRegionsAsSeqinfo}{If \code{TRUE}, attempt to infer the \code{Seqinfo} (\code{seqlevels} and \code{seqlengths}) from the \dQuote{##sequence-region} directives as specified by GFF3. } \item{source}{The value for the source column in GFF. This is typically the name of the package or algorithm that generated the feature. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Does not work when exporting a \code{RangedDataList} with multiple elements; tabix supports a single track in a file. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{GFFFile} method on \code{import}. For export, the \code{RangedData}, \code{GFFFile} method on \code{export} is the sink. When \code{trackLine} is \code{TRUE} or the target format is BED15, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} with the metadata columns described in the details. } \details{ The Generic Feature Format (GFF) format is a tab-separated table of intervals. There are three different versions of GFF, and they all have the same number of columns. In GFF1, the last column is a grouping factor, whereas in the later versions the last column holds application-specific attributes, with some conventions defined for those commonly used. This attribute support facilitates specifying extensions to the format. These include GTF (Gene Transfer Format, an extension of GFF2) and GVF (Genome Variation Format, an extension of GFF3). The rtracklayer package recognizes the \dQuote{gtf} and \dQuote{gvf} extensions and parses the extra attributes into columns of the result; however, it does not perform any extension-specific processing. Both GFF1 and GFF2 have been proclaimed obsolete; however, the UCSC Genome Browser only supports GFF1 (and GTF), and GFF2 is still in broad use. GFF is distinguished from the simpler BED format by its flexible attribute support and its hierarchical structure, as specified by the \code{group} column in GFF1 (only one level of grouping) and the \code{Parent} attribute in GFF3. GFF2 does not specify a convention for representing hierarchies, although its GTF extension provides this for gene structures. The combination of support for hierarchical data and arbitrary descriptive attributes makes GFF(3) the preferred format for representing gene models. Although GFF features a \code{score} column, large quantitative data belong in a format like \link[=BigWigFile]{BigWig} and alignments from high-throughput experiments belong in \link[Rsamtools:BamFile]{BAM}. For variants, the VCF format (supported by the VariantAnnotation package) seems to be more widely adopted than the GVF extension. A note on the UCSC track line metaformat: track lines are a means for passing hints to visualization tools like the UCSC Genome Browser and the Integrated Genome Browser (IGB), and they allow multiple tracks to be concatenated in the same file. Since GFF is not a UCSC format, it is not common to annotate GFF data with track lines, but rtracklayer still supports it. To export or import GFF data in the track line format, call \code{\link{export.ucsc}} or \code{\link{import.ucsc}}. The following is the mapping of GFF elements to a \code{GRanges} or \code{RangedData} object. NA values are allowed only where indicated. These appear as a \dQuote{.} in the file. GFF requires that all columns are included, so \code{export} generates defaults for missing columns. \describe{ \item{seqid, start, end}{the \code{ranges} component.} \item{source}{character vector in the \code{source} column; defaults to \dQuote{rtracklayer} on export. } \item{type}{character vector in the \code{type} column; defaults to \dQuote{sequence_feature} in the output, i.e., SO:0000110. } \item{score}{numeric vector (NA's allowed) in the \code{score} column, accessible via the \code{score} accessor; defaults to \code{NA} upon export. } \item{strand}{strand factor (NA's allowed) in the \code{strand} column, accessible via the \code{strand} accessor; defaults to \code{NA} upon export. } \item{phase}{integer vector, either 0, 1 or 2 (NA's allowed); defaults to \code{NA} upon export. } \item{group}{a factor (GFF1 only); defaults to the \code{seqid} (e.g., chromosome) on export. } } In GFF versions 2 and 3, attributes map to arbitrary columns in the result. In GFF3, some attributes (\code{Parent}, \code{Alias}, \code{Note}, \code{DBxref} and \code{Ontology_term}) can have multiple, comma-separated values; these columns are thus always \code{CharacterList} objects. } \section{GFFFile objects}{ The \code{GFFFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the GFF format. To cast a path, URL or connection to a \code{GFFFile}, pass it to the \code{GFFFile} constructor. The \code{GFF1File}, \code{GFF2File}, \code{GFF3File}, \code{GVFFile} and \code{GTFFile} classes all extend \code{GFFFile} and indicate a particular version of the format. It has the following utility methods: \describe{ \item{}{\code{genome}: Gets the genome identifier from the \dQuote{genome-build} header directive. } } } \author{Michael Lawrence} \references{ \describe{ \item{GFF1, GFF2}{ \url{http://www.sanger.ac.uk/resources/software/gff/spec.html} } \item{GFF3}{\url{http://www.sequenceontology.org/gff3.shtml}} \item{GVF}{\url{http://www.sequenceontology.org/resources/gvf.html}} \item{GTF}{\url{http://mblab.wustl.edu/GTF22.html}} } } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_gff3 <- file.path(test_path, "genes.gff3") ## basic import test <- import(test_gff3) test ## import.gff functions import.gff(test_gff3) import.gff3(test_gff3) ## GFFFile derivatives test_gff_file <- GFF3File(test_gff3) import(test_gff_file) test_gff_file <- GFFFile(test_gff3) import(test_gff_file) test_gff_file <- GFFFile(test_gff3, version = "3") import(test_gff_file) ## from connection test_gff_con <- file(test_gff3) test <- import(test_gff_con, format = "gff") close(test_gff_con) ## various arguments import(test_gff3, genome = "hg19") import(test_gff3, colnames = character()) import(test_gff3, colnames = c("type", "geneName")) ## 'which' which <- RangesList(chr10 = IRanges(90000, 93000)) import(test_gff3, which = which) \dontrun{ ## 'append' test_gff3_out <- file.path(tempdir(), "genes.gff3") export(test[seqnames(test) == "chr10"], test_gff3_out) export(test[seqnames(test) == "chr12"], test_gff3_out, append = TRUE) import(test_gff3_out) ## 'index' export(test, test_gff3_out, index = TRUE) test_bed_gz <- paste(test_gff3_out, ".gz", sep = "") import(test_bed_gz, which = which) ## RangedDataList rdl <- RangedDataList(new("UCSCData", test[1], trackLine = new("BasicTrackLine", name = "chr10")), new("UCSCData", test[2], trackLine = new("BasicTrackLine", name = "chr12"))) names(rdl) <- names(test) export(rdl, test_gff3_out) import.ucsc(test_gff3_out) } } \keyword{methods} \keyword{classes} rtracklayer/man/GRangesForUCSCGenome.Rd0000644000175100017510000000365512607264731021006 0ustar00biocbuildbiocbuild\name{GRangesForUCSCGenome} \alias{GRangesForUCSCGenome} \alias{GRangesForBSGenome} \alias{SeqinfoForUCSCGenome} \alias{SeqinfoForBSGenome} \title{ GRanges for a Genome } \description{ These functions assist in the creation of \code{\link[GenomeInfoDb]{Seqinfo}} or \code{\link[GenomicRanges:GRanges-class]{GRanges}} for a genome. } \usage{ GRangesForUCSCGenome(genome, chrom = NULL, ranges = NULL, ...) GRangesForBSGenome(genome, chrom = NULL, ranges = NULL, ...) SeqinfoForUCSCGenome(genome) SeqinfoForBSGenome(genome) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{genome}{ A string identifying a genome, usually one assigned by UCSC, like "hg19". } \item{chrom}{ A character vector of chromosome names, or \code{NULL}. } \item{ranges}{ A \code{\link[IRanges:Ranges-class]{Ranges}} object with the intervals. } \item{\dots}{ Additional arguments to pass to the \code{\link[GenomicRanges:GRanges]{GRanges}} constructor. } } \details{ The genome ID is stored in the metadata of the ranges and is retrievable via the \code{\link{genome}} function. The sequence lengths are also properly initialized for the genome. This mitigates the possibility of accidentally storing intervals for the wrong genome. \code{GRangesForUCSCGenome} obtains sequence information from the UCSC website, while \code{GRangesForBSGenome} looks for it in an installed \code{BSGenome} package. Using the latter is more efficient in the long-run, but requires downloading and installing a potentially large genome package, or creating one from scratch if it does not yet exist for the genome of interest. } \value{ For the \code{GRangesFor*} functions, a \code{GRanges} object, with the appropriate \code{\link[GenomeInfoDb]{seqlengths}} and \code{\link{genome}} ID. The \code{SeqinfoFor*} functions return a \code{Seqinfo} for the indicated genome. } \author{ Michael Lawrence } rtracklayer/man/GenomicSelection.Rd0000644000175100017510000000171312607264731020420 0ustar00biocbuildbiocbuild\name{GenomicSelection} \alias{GenomicSelection} \title{ Genomic data selection } \description{ Convenience constructor of a \link[IRanges]{RangedSelection} object for selecting a data on a per-chromosome basis for a given genome. } \usage{ GenomicSelection(genome, chrom = NULL, colnames = character(0)) } \arguments{ \item{genome}{ A string identifying a genome. Should match the end of a BSgenome package name, e.g. "hg19". } \item{chrom}{ Character vector naming chromosomes to select. } \item{colnames}{ The column names to select from the dataset. } } \value{ A \link[IRanges]{RangedSelection} object, selecting entire chromosomes } \author{ Michael Lawrence } \seealso{ \code{\link[IRanges]{RangedSelection}}, \code{\link{BigWigSelection}} } \examples{ # every chromosome from hg19 GenomicSelection("hg19") # chr1 and 2 from hg19, with a score column GenomicSelection("hg19", c("chr1", "chr2"), "score") } \keyword{ manip } rtracklayer/man/Quickload-class.Rd0000644000175100017510000000402412607264731020206 0ustar00biocbuildbiocbuild\name{Quickload-class} \docType{class} %% Classes: \alias{class:Quickload} \alias{Quickload-class} %% Constructor: \alias{Quickload} %% Accessors: \alias{$,Quickload-method} \alias{[[,Quickload,ANY,ANY-method} \alias{genome,Quickload-method} \alias{length,Quickload-method} \alias{uri} %% Coercion: \alias{coerce,character,Quickload-method} %% Show: \alias{show,Quickload-method} \title{Quickload Access} \description{ The \code{Quickload} class represents a Quickload data source, essentially directory layout separating tracks and sequences by genome, along with a few metadata files. This interface abstracts those details and provides access to a Quickload at any URL supported by R (HTTP, FTP, and local files). This is an easy way to make data accessible to the Integrated Genome Browser (IGB). } \section{Constructor}{ \describe{ \item{}{ \code{Quickload(uri = "quickload", create = FALSE)}: Constructs a new \code{Quickload} object, representing a repository at \code{uri}. If \code{create} is \code{TRUE}, and \code{uri} is writeable (i.e., local), the repository is created if it does not already exist. If it does exist, then a message is emitted to indicate that the repository was not recreated. } } } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{Quickload} object. \describe{ \item{}{\code{x$genome}, \code{x[["genome"]]}: Get the \code{\linkS4class{QuickloadGenome}} object for the genome named \code{genome}. This is where all the data is stored. } \item{}{\code{length(x)}: number of genomes in the repository } \item{}{\code{uri(x)}: Get the URI pointing to the Quickload repository. } \item{}{\code{genome(x)}: Get the identifiers of the genomes present in the repository. } } } \author{Michael Lawrence} \examples{ ql <- Quickload(system.file("tests", "quickload", package = "rtracklayer")) uri(ql) genome(ql) ql$T_species_Oct_2011 } \keyword{methods} \keyword{classes} rtracklayer/man/QuickloadGenome-class.Rd0000644000175100017510000001526212607264731021347 0ustar00biocbuildbiocbuild\name{QuickloadGenome-class} \docType{class} %% Classes: \alias{class:QuickloadGenome} \alias{QuickloadGenome-class} %% Constructor: \alias{QuickloadGenome} %% Accessors: \alias{seqinfo,QuickloadGenome-method} \alias{seqinfo,DNAStringSet-method} % sneak it in here \alias{seqinfo<-,QuickloadGenome-method} \alias{genome,QuickloadGenome-method} \alias{length,QuickloadGenome-method} \alias{names,QuickloadGenome-method} \alias{quickload} \alias{mcols,QuickloadGenome-method} \alias{releaseDate,QuickloadGenome-method} \alias{organism,QuickloadGenome-method} \alias{uri,QuickloadGenome-method} %% Data Access: \alias{track,QuickloadGenome-method} \alias{track<-,QuickloadGenome,ANY-method} \alias{track<-,QuickloadGenome,RangedData-method} \alias{track<-,QuickloadGenome,RTLFile-method} \alias{track<-,QuickloadGenome,RsamtoolsFile-method} \alias{track<-,QuickloadGenome,character-method} \alias{referenceSequence} \alias{referenceSequence<-} \alias{referenceSequence,QuickloadGenome-method} \alias{referenceSequence<-,QuickloadGenome-method} %% Show \alias{show,QuickloadGenome-method} \title{Quickload Genome Access} \description{ A Quickload data source is a collection of tracks and sequences, separated by genome. This class, \code{QuickloadGenome} provides direct access to the data for one particular genome. } \section{Constructor}{ \describe{ \item{}{ \code{QuickloadGenome(quickload, genome, create = FALSE, seqinfo = seqinfo(genome), title = toString(genome))}: Constructs a new \code{QuickloadGenome} object, representing \code{genome} in the repository \code{quickload} (a URI string or a \code{\linkS4class{Quickload}} object). The \code{genome} argument can be an ID corresponding to a genome (potentially) in \code{quickload} or an installed \code{BSgenome} package. It can also be any instance of a class which has methods for \code{organism} and \code{releaseDate}. A good example is \code{\link[BSgenome]{BSgenome}} or any other derivative of \code{\link[GenomeInfoDb]{GenomeDescription}}. Those items are necessary for constructing the canonical Quickload genome string (G_Species_Month_Year). If \code{create} is \code{TRUE}, and the genome does not already exist, the genome will be created, using \code{seqinfo} for the sequence lengths and \code{title} for the display name of the genome in a UI. Creation only works if the repository is local and writeable. Reasonable defaults are used for \code{seqinfo} and \code{title} when the necessary methods are available (and they are for \code{BSgenome}). } } } \section{Accessor Methods}{ In the code snippets below, \code{x} and \code{object} represent a \code{Quickload} object. \describe{ \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Gets or sets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences in the genome. No circularity information or genome identifier is stored. } \item{}{ \code{quickload(x)}: Get the Quickload object that contains this genome. } \item{}{ \code{uri(x)}: Get the uri pointing to the genome directory in the Quickload repository } \item{}{ \code{genome(x)}: Get the name of the genome, e.g. \dQuote{H_sapiens_Feb_2009}. } \item{}{ \code{releaseDate(x)}: Get the release portion of the genome name, e.g., \dQuote{Feb_2009}. } \item{}{ \code{organism(object)}: Get the organism portion of the genome name, e.g., \dQuote{H sapiens}. } } } \section{Data Access}{ \describe{ \item{}{ \code{length(x)}: number of datasets } \item{}{ \code{names(x), trackNames(x)}: names of the datasets } \item{}{ \code{mcols(x)}: merged metadata on the datasets } \item{}{ \code{track(x, name), x$name}: get the track called \code{name} } \item{}{ \code{track(x, name, format = bestFileFormat(value), ...) <- value, x$name <- value}: store the track \code{value} under \code{name}. Note that track storing is only supported for local repositories, i.e., those with a \code{file://} URI scheme. Currently, supported \code{value} types include a \code{GenomicRanges}, \code{GRangesList}, or a file resource (copied to the repository). The file resource may be represented as a path, URL, \code{\linkS4class{RTLFile}} or \code{\link[Rsamtools:RsamtoolsFile-class]{RsamtoolsFile}}. If not a file name, \code{value} is written in \code{format}. For generic interval data, this means a BigWig file (if there is a numeric \dQuote{score} column) or a BED file otherwise. An \code{RleList} (e.g., coverage) is output as BigWig. For \code{UCSCData} values, the format is chosen according to the type of track line. For \code{RsamtoolsFile} objects, the file and its index are copied. The arguments in \code{...} become attributes in the XML metadata. The \dQuote{description} attribute is standard and is a blurb for describing the track in a UI. For the rest, the interpretation is up to the client. IGB supports an ever-growing list; please see its documentation. } \item{}{ \code{referenceSequence(x)}: Get the reference sequence, as a \code{DNAStringSet}. } \item{}{ \code{referenceSequence(x) <- value}: Set the reference sequence, as a \code{DNAStringSet}. It is written as a 2bit file. This only works on local repositories. } } } \author{Michael Lawrence} \examples{ tests_dir <- system.file("tests", package = "rtracklayer") ql <- Quickload(file.path(tests_dir, "quickload")) qlg <- QuickloadGenome(ql, "T_species_Oct_2011") seqinfo(qlg) organism(qlg) releaseDate(qlg) names(qlg) mcols(qlg) if (.Platform$OS.type != "windows") { # temporary qlg$bedData } \dontrun{ ## populating the test repository ql <- Quickload(file.path(tests_dir, "quickload"), create = TRUE) reference_seq <- import(file.path(tests_dir, "test.2bit")) names(reference_seq) <- "test" qlg <- QuickloadGenome(ql, "T_species_Oct_2011", create = TRUE, seqinfo = seqinfo(reference_seq)) referenceSequence(qlg) <- reference_seq test_bed <- import(file.path(tests_dir, "test.bed")) names(test_bed) <- "test" qlg$bedData <- test_bed test_bedGraph <- import(file.path(tests_dir, "test.bedGraph")) names(test_bedGraph) <- "test" start(test_bedGraph) <- seq(1, 90, 10) width(test_bedGraph) <- 10 track(qlg, "bedGraphData", format = "bw") <- test_bedGraph } } \keyword{methods} \keyword{classes} rtracklayer/man/RTLFile-class.Rd0000644000175100017510000000272612607264731017542 0ustar00biocbuildbiocbuild\name{RTLFile-class} \docType{class} %% Classes: \alias{class:RTLFile} \alias{RTLFile-class} \alias{class:CompressedFile} \alias{CompressedFile-class} %% Accessors \alias{path} \alias{path,RTLFile-method} \alias{resource} %% Show: \alias{show,RTLFile-method} %% Related functions: \alias{FileForFormat} \title{RTLFile objects} \description{ A \code{RTLFile} object is the base class for classes representing files accessible with rtracklayer. It wraps a resource (either a path, URL or connection). } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{RTLFile} object. \describe{ \item{}{ \code{path(x)}: Gets the path, as a \code{character} vector, to the resource represented by the \code{RTLFile} object, if possible. } \item{}{ \code{resource(x)}: Gets the low-level resource, either a character vector (a path or URL) or a connection. } } } \section{Related functions}{ \describe{ \item{}{ \code{FileForFormat(path, format = file_ext(path))}: Determines the file type of \code{path} and returns a high-level file object such as BamFile, BEDFile, BigWigFile etc.. } } } \author{Michael Lawrence} \seealso{ Implementing classes include: \code{\linkS4class{BigWigFile}}, \code{\linkS4class{TwoBitFile}}, \code{\linkS4class{BEDFile}}, \code{\linkS4class{GFFFile}}, and \code{\linkS4class{WIGFile}}. } \keyword{methods} \keyword{classes} rtracklayer/man/RangedData-methods.Rd0000644000175100017510000000716312607264731020631 0ustar00biocbuildbiocbuild\name{RangedData-methods} \docType{methods} \alias{RangedData-methods} % constructor \alias{GenomicData} % accessors \alias{chrom} \alias{chrom,RangedData-method} \alias{chrom,GRanges-method} \alias{chrom<-} \alias{chrom<-,RangedData-method} \alias{chrom<-,GRanges-method} \alias{score,ANY-method} \alias{score,GenomicRangesORGRangesList-method} \title{Data on a Genome} \description{The \code{rtracklayer} package adds convenience methods on top of \code{RangedData} and \code{GenomicRanges} to manipulate data on genomic ranges. For \code{RangedData} the spaces are now called chromosomes (but could still refer to some other type of sequence). Similarly the universe refers to the genome.} \section{Accessors}{ In the code snippets below, \code{x} is a \code{RangedData} or \code{GenomicRanges} object. \describe{ \item{}{ \code{chrom(x), chrom(x) <- value}: Gets or sets the chromosome names for \code{x}. The length of \code{value} should equal the length of \code{x}. This is an alias for \code{\link[IRanges:RangedData-class]{names}(x)}. } \item{}{ \code{score(x)}: Gets the \dQuote{score} column from the element metadata of a \code{GenomicRanges} or \code{GRangesList}. Many track formats have a score column, so this is often used during export. The IRanges package defines a method for \code{RangedData}. The \code{ANY} fallback for this method simply returns \code{NULL}. } } } \section{Constructor}{ \describe{ \item{}{ \code{GenomicData(ranges, ..., strand = NULL, chrom = NULL, genome = NULL)}: Constructs a \code{GRanges} instance with the given \code{ranges} and variables in \code{...} (see the \code{\link[GenomicRanges]{GRanges}} constructor). If non-\code{NULL}, the \code{strand} argument specifies the strand of each range. It should be a character vector or factor of length equal to that of \code{ranges}. All values should be either \code{-}, \code{+}, or \code{*}. To get the levels for \code{strand}, call \code{levels(strand())}. \code{chrom} argument is analogous to \code{seqnames} in the \code{GRanges} and \code{space} in \code{RangedData} constructors. The \code{genome} argument should be a scalar string and is treated as the \code{RangedData} universe. See the examples. If \code{ranges} is not a \code{Ranges} object, this function calls \code{as(ranges, "RangedData")} and returns the result if successful. As a special case, the \dQuote{chrom} column in a \code{data.frame}-like object is renamed to \dQuote{space}, for convenience. Thus, one could pass a \code{data.frame} with columns \dQuote{start}, \dQuote{end} and, optionally, \dQuote{chrom}. } } } \author{ Michael Lawrence and Patrick Aboyoun } \examples{ range1 <- IRanges::RangesList(chr1 = IRanges::IRanges(c(1,2,3), c(5,2,8))) ## just ranges ## ## GRanges instance gr <- GenomicData(range1) ## with a genome (universe) ## ## GRanges instance gr <- GenomicData(range1, genome = "hg18") genome(gr) ## "hg18" ## with some data ## filter <- c(1L, 0L, 1L) score <- c(10L, 2L, NA) strand <- factor(c("+", NA, "-"), levels = levels(strand())) ## GRanges instance gr <- GenomicData(range1[[1]], score, chrom = "chr1", genome = "hg18") mcols(gr)[["score"]] strand(gr) ## all '*' gr <- GenomicData(range1[[1]], score, filt = filter, strand = strand, chrom = "chr1") mcols(gr)[["filt"]] strand(gr) ## equal to 'strand' ## coercion from data.frame ## df <- as.data.frame(gr) } \keyword{classes} \keyword{methods} rtracklayer/man/RangesList-methods.Rd0000644000175100017510000000214712607264731020707 0ustar00biocbuildbiocbuild\name{RangesList-methods} \docType{methods} \alias{RangesList-methods} % accessors \alias{chrom,RangesList-method} \alias{chrom<-,RangesList-method} \title{Ranges on a Genome} \description{ Genomic coordinates are often specified in terms of a genome identifier, chromosome name, start position and end position. \code{\link[IRanges:RangedData-class]{RangedData}} represents this with a \code{\link[IRanges:RangesList-class]{RangesList}} instance, and the \code{rtracklayer} package adds convenience methods to \code{RangesList} for the manipulation of genomic ranges. The spaces (or names) of \code{RangesList} are the chromosome names. The \code{universe} slot indicates the genome, usually as given by UCSC (e.g. \dQuote{hg18}). } \section{Accessors}{ In the code snippets below, \code{x} is a \code{RangesList} object. \describe{ \item{}{ \code{chrom(x), chrom(x) <- value}: Gets or sets the chromosome names for \code{x}. This is an alias for \code{\link[IRanges:RangesList-class]{names}(x)}. } } } \author{ Michael Lawrence } \keyword{classes} \keyword{methods} rtracklayer/man/TabixFile-methods.Rd0000644000175100017510000000625512607264731020507 0ustar00biocbuildbiocbuild\name{TabixFile-methods} \alias{import,TabixFile,character,ANY-method} \alias{import,TabixFile,missing,ANY-method} \alias{exportToTabix} \alias{exportToTabix,ANY,character-method} % undocumented/internal for now \alias{export,GenomicRanges,TabSeparatedFile,ANY-method} \alias{export,ANY,TabSeparatedFile,ANY-method} \title{TabixFile Import/Export} \description{ These methods support the import and export of \code{Rsamtools:TabixFile}{TabixFile} objects. These are generally useful when working with tabix-indexed files that have a non-standard format (i.e., not BED nor GFF), as well as exporting an object with arbitrary columns (like a GRanges) to an indexed, tab-separated file. This relies on the tabix header, which indicates the columns in the file that correspond to the chromosome, start and end. The BED and GFF parsers handle tabix transparently. } \usage{ \S4method{import}{TabixFile,character,ANY}(con, format, text, which = if (is.na(genome)) NULL else as(seqinfoForGenome(genome), "GenomicRanges"), genome = NA, header = TRUE, ...) \S4method{import}{TabixFile,missing,ANY}(con, format, text, ...) exportToTabix(object, con, ...) } \arguments{ \item{con}{For \code{import}, a \code{TabixFile} object; for \code{exportToTabix}, a string naming the destination file. } \item{object}{The object to export. It is coerced to a \code{data.frame}, written to a tab-separated file, and indexed with tabix for efficient range-based retrieval of the data using \code{import}. } \item{format}{If any known format, like \dQuote{bed} or \dQuote{gff} (or one of their variants), then the appropriate parser is applied. If any other value, then the tabix header is consulted for the format. By default, this is taken from the file extension. } \item{text}{Ignored.} \item{which}{A range data structure coercible to \code{RangesList}, like a \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. The default is to use the range over the entire genome given by \code{genome}, if specified. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{header}{If \code{TRUE}, then the header in the indexed file, which might include a track line, is sent to the parser. Otherwise, the initial lines are skipped, according to the \code{skip} field in the tabix index header. } \item{...}{Extra arguments to pass to the underlying import routine, which for non-standard formats is \code{\link{read.table}} or \code{\link{write.table}}. } } \value{ For \code{import}, a \code{GRanges} or \code{RangedData}, depending on arguments. For \code{exportToTabix}, a \code{TabixFile} object that is directly passable to \code{import}. } \references{ \url{http://samtools.sourceforge.net/tabix.shtml} } \seealso{ \code{\link[Rsamtools]{scanTabix}} and friends } \author{Michael Lawrence} rtracklayer/man/TrackDb-class.Rd0000644000175100017510000000270612607264731017611 0ustar00biocbuildbiocbuild\name{TrackDb-class} \docType{class} %% Classes: \alias{class:TrackDb} \alias{TrackDb-class} %% Accessors: \alias{$,TrackDb-method} \alias{$<-,TrackDb-method} \alias{[[,TrackDb,ANY,ANY-method} \alias{[[<-,TrackDb,ANY,ANY-method} %% Data Access: \alias{track<-,TrackDb,ANY-method} \alias{track<-,TrackDb,RangedData-method} \alias{track<-,TrackDb,RangedDataList-method} \title{Track Databases} \description{ The \code{TrackDb} class is an abstraction around a database of tracks. Implementations include \code{\linkS4class{BrowserSession}} derivatives and \code{\linkS4class{QuickloadGenome}}. Here, a track is defined as an interval dataset. } \section{Accessor Methods}{ Every implementation should support these methods: \describe{ \item{}{ \code{length(x)}: number of tracks } \item{}{ \code{names(x)}, \code{trackNames(x)}: names of the tracks } \item{}{ \code{mcols(x)}: merged metadata on the tracks } \item{}{ \code{track(x, name)}, \code{x$name}, \code{x[[name]]}: get the track called \code{name} } \item{}{ \code{track(x, name) <- value}, \code{x$name <- value}, \code{x[[name]] <- value}: store the track \code{value} under \code{name}. Different implementations will support different types for \code{value}. Generally, an interval data structure like \code{GenomicRanges}. } } } \author{Michael Lawrence} \keyword{methods} \keyword{classes} rtracklayer/man/TwoBitFile-class.Rd0000644000175100017510000001041512607264731020303 0ustar00biocbuildbiocbuild\name{TwoBitFile-class} \docType{class} %% Classes: \alias{class:TwoBitFile} \alias{TwoBitFile-class} \alias{class:2BitFile} \alias{2BitFile-class} %% Constructor: \alias{TwoBitFile} \alias{2BitFile} %% Accessors: \alias{seqinfo,TwoBitFile-method} %% Import: \alias{import.2bit} \alias{import.2bit,ANY-method} \alias{import,TwoBitFile,ANY,ANY-method} \alias{getSeq,TwoBitFile-method} %% Export: \alias{export.2bit} \alias{export.2bit,ANY-method} \alias{export,DNAStringSet,TwoBitFile,ANY-method} \alias{export,DNAStringSet,character,ANY-method} \alias{export,ANY,TwoBitFile,ANY-method} \title{2bit Files} \description{ These functions support the import and export of the UCSC 2bit compressed sequence format. The main advantage is speed of subsequence retrieval, as it only loads the sequence in the requested intervals. Compared to the FA format supported by Rsamtools, 2bit offers the additional feature of masking and also has better support in Java (and thus most genome browsers). The supporting \code{TwoBitFile} class is a reference to a TwoBit file. } \usage{ \S4method{import}{TwoBitFile,ANY,ANY}(con, format, text, which = as(seqinfo(con), "GenomicRanges"), ...) \S4method{getSeq}{TwoBitFile}(x, which = as(seqinfo(con), "GenomicRanges")) import.2bit(con, ...) \S4method{export}{ANY,TwoBitFile,ANY}(object, con, format, ...) \S4method{export}{DNAStringSet,TwoBitFile,ANY}(object, con, format) \S4method{export}{DNAStringSet,character,ANY}(object, con, format, ...) export.2bit(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{TwoBitFile} object. Connections are not supported. For the functions ending in \code{.2bit}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{twoBit} or \dQuote{2bit}. } \item{object,x}{The object to export, either a \code{DNAStringSet} or something coercible to a \code{DNAStringSet}, like a character vector. } \item{format}{If not missing, should be \dQuote{twoBit} or \dQuote{2bit} (case insensitive). } \item{text}{Not supported.} \item{which}{A range data structure coercible to \code{RangesList}, like a \code{GRanges}, or a \code{TwoBitFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{TwoBitFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{RangesList} that represents the entirety of the file. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{TwoBitFile} method on \code{import}. For export, the \code{TwoBitFile} methods on \code{export} are the sink. } } \value{ For import, a \code{DNAStringSet}. } \section{\code{TwoBitFile} objects}{ A \code{TwoBitFile} object, an extension of \code{\linkS4class{RTLFile}} is a reference to a TwoBit file. To cast a path, URL or connection to a \code{TwoBitFile}, pass it to the \code{TwoBitFile} constructor. A TwoBit file embeds the sequence information, which can be retrieved with the following: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } } } \seealso{ \link[BSgenome]{export-methods} in the \pkg{BSgenome} package for exporting a \link[BSgenome]{BSgenome} object as a twoBit file. } \author{Michael Lawrence} \examples{ test_path <- system.file("tests", package = "rtracklayer") test_2bit <- file.path(test_path, "test.2bit") test <- import(test_2bit) test test_2bit_file <- TwoBitFile(test_2bit) import(test_2bit_file) # the whole file which_range <- IRanges(c(10, 40), c(30, 42)) which <- GRanges(names(test), which_range) import(test_2bit, which = which) seqinfo(test_2bit_file) \dontrun{ test_2bit_out <- file.path(tempdir(), "test_out.2bit") export(test, test_2bit_out) ## just a character vector test_char <- as.character(test) export(test_char, test_2bit_out) } } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCData-class.Rd0000644000175100017510000000512412607264731017623 0ustar00biocbuildbiocbuild\name{UCSCData-class} \docType{class} \alias{UCSCData-class} \alias{export.bed,UCSCData,characterORconnection-method} \alias{export.bed15,UCSCData-method} \alias{export.gff,UCSCData,characterORconnection-method} \alias{export.ucsc,UCSCData,characterORconnection-method} \alias{initialize,UCSCData-method} \alias{show,UCSCData-method} \alias{coerce,GRanges,UCSCData-method} \alias{coerce,UCSCData,GRanges-method} \alias{coerce,RangedData,UCSCData-method} \alias{coerce,UCSCData,RangedData-method} \alias{split,UCSCData,ANY-method} \alias{split,UCSCData,Vector-method} \title{Class "UCSCData"} \description{Each track in \acronym{UCSC} has an associated \code{\linkS4class{TrackLine}} that contains metadata on the track.} \section{Slots}{ \describe{ \item{\code{trackLine}:}{Object of class \code{"TrackLine"} holding track metadata. } } } \section{Methods}{ \describe{ \item{\code{\link{export.bed}(object, con, variant = c("base", "bedGraph", "bed15"), color, trackLine = TRUE, ...)}}{ Exports the track and its track line (if \code{trackLine} is \code{TRUE}) to \code{con} in the Browser Extended Display (\acronym{BED}) format. The arguments in \code{...} are passed to \code{\link{export.ucsc}}. } \item{\code{\link{export.bed15}(object, con, expNames = NULL, ...)}}{ Exports the track and its track line (if \code{trackLine} is \code{TRUE}) to \code{con} in the Bed15 format. The data is taken from the columns named in \code{expNames}, which defaults to the \code{expNames} in the track line, if any, otherwise all column names. The arguments in \code{...} are passed to \code{\link{export.ucsc}}. } \item{\code{\link{export.gff}(object)}}{ Exports the track and its track line (as a comment) to \code{con} in the General Feature Format (\acronym{GFF}). } \item{\code{\link{export.ucsc}(object, con, subformat, ...)}}{ Exports the track and its track line to \code{con} in the \acronym{UCSC} meta-format. } \item{\code{as(object, "UCSCData")}}{Constructs a \code{UCSCData} from a \code{RangedData} instance, by adding a default track line and ensuring that the sequence/chromosome names are compliant with UCSC conventions. If there is a numeric score, the track line type is either "bedGraph" or "wig", depending on the feature density. Otherwise, "bed" is chosen. } } } \author{ Michael Lawrence } \seealso{ \code{\link{import}} and \code{\link{export}} for reading and writing tracks to and from connections (files), respectively. } \keyword{classes} rtracklayer/man/UCSCFile-class.Rd0000644000175100017510000001624012607264731017632 0ustar00biocbuildbiocbuild\name{UCSCFile-class} \docType{class} %% Classes: \alias{class:UCSCFile} \alias{UCSCFile-class} %% Constructor: \alias{UCSCFile} %% Import: \alias{import,UCSCFile,ANY,ANY-method} \alias{import.ucsc} \alias{import.ucsc,ANY-method} \alias{import.ucsc,RTLFile-method} %% Export: \alias{export,ANY,UCSCFile,ANY-method} \alias{export,GenomicRanges,UCSCFile,ANY-method} \alias{export,GenomicRangesList,UCSCFile,ANY-method} \alias{export,UCSCData,UCSCFile,ANY-method} \alias{export.ucsc} \alias{export.ucsc,ANY,ANY-method} \alias{export.ucsc,ANY,RTLFile-method} \title{UCSCFile objects} \description{ These functions support the import and export of tracks emucscded within the UCSC track line metaformat, whereby multiple tracks may be concatenated within a single file, along with metadata mostly oriented towards visualization. Any \code{\linkS4class{UCSCData}} or \code{RangedDataList} object is automatically exported in this format, if the targeted format is known to be compatible. The BED and WIG import methods check for a track line, and delegate to these functions if one is found. Thus, calling this API directly is only necessary when importing embedded GFF (rare), or when one wants to create the track line during the export process. } \usage{ \S4method{import}{UCSCFile,ANY,ANY}(con, format, text, subformat = "auto", drop = FALSE, genome = NA, ...) import.ucsc(con, ...) \S4method{export}{ANY,UCSCFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,UCSCFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRangesList,UCSCFile,ANY}(object, con, format, append = FALSE, index = FALSE, ...) \S4method{export}{UCSCData,UCSCFile,ANY}(object, con, format, subformat = "auto", append = FALSE, index = FALSE, ...) export.ucsc(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{UCSCFile} object. For the functions ending in \code{.ucsc}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, \dQuote{ucsc} must be passed as the \code{format} argument. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. For exporting multiple tracks pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be \dQuote{ucsc}.} \item{text}{If \code{con} is missing, a character vector to use as the input } \item{subformat}{The file format to use for the actual features, between the track lines. Must be a text-based format that is compatible with track lines (most are). If an \code{RTLFile} subclass other than \code{UCSCFile} is passed as \code{con} to \code{import.ucsc} or \code{export.ucsc}, the subformat is assumed to be the corresponding format of \code{con}. Otherwise it defaults to \dQuote{auto}. The following describes the logic of the \dQuote{auto} mode. For import, the subformat is taken as the \code{type} field in the track line. If none, the file extension is consulted. For export, if \code{object} is a \code{UCSCData}, the subformat is taken as the \code{type} in its track line, if present. Otherwise, the subformat is chosen based on whether \code{object} contains a \dQuote{score} column. If there is a score, the target is either \code{BEDGraph} or \code{WIG}, depending on the structure of the ranges. Otherwise, \code{BED} is the target. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. This defaults to the \code{db} BED track line parameter, if any. } \item{drop}{If \code{TRUE}, and there is only one track in the file, return the track object directly, rather than embedding it in a list. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Does not work when exporting a \code{RangedDataList} with multiple elements; tabix supports a single track in a file. } \item{...}{Should either specify track line parameters or arguments to pass down to the import and export routine for the subformat. } } \value{ A \code{GenomicRangesList} unless \code{drop} is \code{TRUE} and there is only a single track in the file. In that case, the first and only object is extracted from the list and returned. The structure of that object depends on the format of the data. The \code{GenomicRangesList} contains \code{GRanges} objects with a \code{trackLine} element in their metadata, whereas the \code{RangedDataList} contains \code{UCSCData} objects. } \details{ The UCSC track line permits the storage of multiple tracks in a single file by separating them with a so-called \dQuote{track line}, a line belonging with the word \dQuote{track} and containing various \code{key=value} pairs encoding metadata, most related to visualization. The standard fields in a track depend on the type of track being annotated. See \code{\linkS4class{TrackLine}} and its derivatives for how these lines are represented in R. The class \code{\linkS4class{UCSCData}} is an extension of \code{GRanges} with a formal slot for a \code{TrackLine}. Each \code{GRanges} in the returned \code{GenomicRangesList} has the track line stored in its metadata, under the \code{trackLine} key. For each track object to be exported, if the object is not a \code{UCSCData}, and there is no \code{trackLine} element in the metadata, then a new track line needs to be generated. This happens through the coercion of \code{object} to \code{UCSCData}. The track line is initialized to have the appropriate \code{type} parameter for the subformat, and the required \code{name} parameter is taken from the name of the track in the input list (if any). Otherwise, the default is simply \dQuote{R Track}. The \code{db} parameter (specific to BED track lines) is taken as \code{genome(object)} if not \code{NA}. Additional arguments passed to the export routines override parameters in the provided track line. If the subformat is either WIG or BEDGraph, and the features are stranded, a separate track will be output in the file for each strand. Neither of those formats encodes the strand and disallow overlapping features (which might occur upon destranding). } \section{UCSCFile objects}{ The \code{UCSCFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the UCSC format. To cast a path, URL or connection to a \code{UCSCFile}, pass it to the \code{UCSCFile} constructor. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html} } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCSchema-class.Rd0000644000175100017510000000247412607264731020157 0ustar00biocbuildbiocbuild\name{UCSCSchema-class} \docType{class} \alias{UCSCSchema-class} \alias{genome,UCSCSchema-method} \alias{tableName,UCSCSchema-method} \alias{genome,UCSCSchema-method} \alias{formatDescription} \alias{formatDescription,UCSCSchema-method} \alias{nrow,UCSCSchema-method} \alias{ucscSchema,UCSCSchemaDescription-method} % Accessors: \title{UCSC Schema} \description{This is a preliminary class that describes a table in the UCSC database. The description includes the table name, corresponding genome, row count, and a textual description of the format. In the future, we could provide more table information, like the links and sample data frame. This is awaiting a use-case.} \section{Accessor methods}{ In the code snippets below, \code{x}/\code{object} is a \code{UCSCSchema} object. \describe{ \item{}{\code{genome(x)}: Get the genome for the table. } \item{}{\code{tableName(x)}: Get the name of the table. } \item{}{\code{nrow(x)}: Get the number of rows in the table. } \item{}{\code{formatDescription(x)}: Get a textual description of the table format. } } } \author{ Michael Lawrence } \examples{ \dontrun{ session <- browserSession() genome(session) <- "mm9" query <- ucscTableQuery(session, "knownGene") schema <- ucscSchema(query) nrow(schema) } } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCTableQuery-class.Rd0000644000175100017510000001664612607264731021042 0ustar00biocbuildbiocbuild\name{UCSCTableQuery-class} \docType{class} \alias{UCSCTableQuery-class} % Accessors: \alias{browserSession,UCSCTableQuery-method} \alias{browserSession<-} \alias{browserSession<-,UCSCTableQuery,UCSCSession-method} \alias{trackName} \alias{trackName,UCSCTableQuery-method} \alias{trackName<-} \alias{trackName<-,UCSCTableQuery-method} \alias{tableName} \alias{tableName,UCSCTableQuery-method} \alias{tableName<-} \alias{tableName<-,UCSCTableQuery-method} \alias{range,UCSCTableQuery-method} \alias{range<-,UCSCTableQuery-method} \alias{names,UCSCTableQuery-method} \alias{names<-,UCSCTableQuery-method} \alias{trackNames,UCSCTableQuery-method} \alias{ucscSchema} \alias{ucscSchema,UCSCTableQuery-method} % Query execution \alias{tableNames} \alias{tableNames,UCSCTableQuery-method} \alias{getTable} \alias{getTable,UCSCTableQuery-method} \alias{track} \alias{track,UCSCTableQuery-method} % Constructor: \alias{ucscTableQuery} \alias{ucscTableQuery,UCSCSession-method} % Show: \alias{show,UCSCTableQuery-method} \title{Querying UCSC Tables} \description{The UCSC genome browser is backed by a large database, which is exposed by the Table Browser web interface. Tracks are stored as tables, so this is also the mechanism for retrieving tracks. The \code{UCSCTableQuery} class represents a query against the Table Browser. Storing the query fields in a formal class facilitates incremental construction and adjustment of a query.} \details{ There are five supported fields for a table query: \describe{ \item{session}{The \code{\linkS4class{UCSCSession}} instance from the tables are retrieved. Although all sessions are based on the same database, the set of user-uploaded tracks, which are represented as tables, is not the same, in general. } \item{trackName}{The name of a track from which to retrieve a table. Each track can have multiple tables. Many times there is a primary table that is used to display the track, while the other tables are supplemental. Sometimes, tracks are displayed by aggregating multiple tables. } \item{tableName}{The name of the specific table to retrieve. May be \code{NULL}, in which case the behavior depends on how the query is executed, see below. } \item{range}{A genome identifier, a \code{\link[GenomicRanges:GRanges-class]{GRanges}} or a \code{\link[IRanges:RangesList-class]{RangesList}} indicating the portion of the table to retrieve, in genome coordinates. Simply specifying the genome string is the easiest way to download data for the entire genome, and \code{\link{GRangesForUCSCGenome}} facilitates downloading data for e.g. an entire chromosome. } \item{names}{Names/accessions of the desired features} } A common workflow for querying the UCSC database is to create an instance of \code{UCSCTableQuery} using the \code{ucscTableQuery} constructor, invoke \code{tableNames} to list the available tables for a track, and finally to retrieve the desired table either as a \code{data.frame} via \code{getTable} or as a \code{RangedData} track via \code{track}. See the examples. The reason for a formal query class is to facilitate multiple queries when the differences between the queries are small. For example, one might want to query multiple tables within the track and/or same genomic region, or query the same table for multiple regions. The \code{UCSCTableQuery} instance can be incrementally adjusted for each new query. Some caching is also performed, which enhances performance. } \section{Constructor}{ \describe{ \item{}{ \code{ucscTableQuery(x, track, range = genome(x), table = NULL, names = NULL)}: Creates a \code{UCSCTableQuery} with the \code{UCSCSession} given as \code{x} and the track name given by the single string \code{track}. \code{range} should be a genome string identifier, a \code{GRanges} instance or \code{RangesList} instance, and it effectively defaults to \code{genome(x)}. If the genome is missing, it is taken from the session. The table name is given by \code{table}, which may be a single string or \code{NULL}. Feature names, such as gene identifiers, may be passed via \code{names} as a character vector. } } } \section{Executing Queries}{ Below, \code{object} is a \code{UCSCTableQuery} instance. \describe{ \item{}{ \code{track(object)}: Retrieves the indicated table as a track, i.e. a \code{GRanges} object. Note that not all tables are available as tracks. } \item{}{ \code{getTable(object)}: Retrieves the indicated table as a \code{data.frame}. Note that not all tables are output in parseable form, and that UCSC will truncate responses if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. } \item{}{ \code{tableNames(object)}: Gets the names of the tables available for the session, track and range specified by the query. } } } \section{Accessor methods}{ In the code snippets below, \code{x}/\code{object} is a \code{UCSCTableQuery} object. \describe{ \item{}{\code{browserSession(object)}, \code{browserSession(object) <- value}: Get or set the \code{UCSCSession} to query. } \item{}{\code{trackName(x)}, \code{trackName(x) <- value}: Get or set the single string indicating the track containing the table of interest. } \item{}{\code{trackNames(x)}}{List the names of the tracks available for retrieval for the assigned genome.} \item{}{\code{tableName(x)}, \code{tableName(x) <- value}: Get or set the single string indicating the name of the table to retrieve. May be \code{NULL}, in which case the table is automatically determined. } \item{}{\code{range(x)}, \code{range(x) <- value}: Get or set the \code{GRanges} indicating the portion of the table to retrieve in genomic coordinates. Any missing information, such as the genome identifier, is filled in using \code{range(browserSession(x))}. It is also possible to set the genome identifier string or a \code{RangesList}. } \item{}{\code{names(x)}, \code{names(x) <- value}: Get or set the names of the features to retrieve. If \code{NULL}, this filter is disabled. } \item{}{\code{ucscSchema(x)}: Get the \code{\linkS4class{UCSCSchema}} object describing the selected table.} } } \author{ Michael Lawrence } \examples{ \dontrun{ session <- browserSession() genome(session) <- "mm9" trackNames(session) ## list the track names ## choose the Conservation track for a portion of mm9 chr1 query <- ucscTableQuery(session, "Conservation", GRangesForUCSCGenome("mm9", "chr12", IRanges(57795963, 57815592))) ## list the table names tableNames(query) ## get the phastCons30way track tableName(query) <- "phastCons30way" ## retrieve the track data track(query) # a GRanges object ## get a data.frame summarizing the multiple alignment tableName(query) <- "multiz30waySummary" getTable(query) genome(session) <- "hg18" query <- ucscTableQuery(session, "snp129", names = c("rs10003974", "rs10087355", "rs10075230")) ucscSchema(query) getTable(query) } } \keyword{methods} \keyword{classes} rtracklayer/man/WIGFile-class.Rd0000644000175100017510000001535212607264731017526 0ustar00biocbuildbiocbuild\name{WIGFile-class} \docType{class} %% Classes: \alias{class:WIGFile} \alias{WIGFile-class} %% Constructor: \alias{WIGFile} %% Import: \alias{import,WIGFile,ANY,ANY-method} \alias{import.wig} \alias{import.wig,ANY-method} %% Export: \alias{export,ANY,WIGFile,ANY-method} \alias{export,GenomicRanges,WIGFile,ANY-method} \alias{export,GenomicRangesList,WIGFile,ANY-method} \alias{export,UCSCData,WIGFile,ANY-method} \alias{export.wig} \alias{export.wig,ANY-method} \title{WIG Import and Export} \description{ These functions support the import and export of the UCSC WIG (Wiggle) format. } \usage{ \S4method{import}{WIGFile,ANY,ANY}(con, format, text, genome = NA, trackLine = TRUE, which = NULL, seqinfo = NULL, ...) import.wig(con, ...) \S4method{export}{ANY,WIGFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,WIGFile,ANY}(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep"), writer = .wigWriter, append = FALSE, ...) \S4method{export}{GenomicRangesList,WIGFile,ANY}(object, con, format, ...) \S4method{export}{UCSCData,WIGFile,ANY}(object, con, format, trackLine = TRUE, ...) export.wig(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{WIGFile} object. For the functions ending in \code{.wig}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be \dQuote{wig}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be \dQuote{wig}. } \item{text}{If \code{con} is missing, a character vector to use as the input } \item{trackLine}{Whether to parse/output a UCSC track line. An imported track line will be stored in a \code{\linkS4class{TrackLine}} object, as part of the returned \code{\linkS4class{UCSCData}}. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{seqinfo}{If not \code{NULL}, the \code{Seqinfo} object to set on the result. If the \code{genome} argument is not \code{NA}, it must agree with \code{genome(seqinfo)}. } \item{which}{A range data structure like \code{RangesList} or \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. This is inefficient; use BigWig for efficient spatial queries. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{dataFormat}{Probably best left to \dQuote{auto}. Exists only for historical reasons. } \item{writer}{Function for writing out the blocks; for internal use only. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{WIGFile} method on \code{import}. For export, the \code{RangedData}, \code{WIGFile} method on \code{export} is the sink. When \code{trackLine} is \code{TRUE}, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} with the score values in the \code{score} metadata column, which is accessible via the \code{score} function. } \details{ The WIG format is a text-based format for efficiently representing a dense genome-scale score vector. It encodes, for each feature, a range and score. Features from the same sequence (chromosome) are grouped together into a block, with a single block header line indicating the chromosome. There are two block formats: fixed step and variable step. For fixed step, the number of positions (or step) between intervals is the same across an entire block. For variable step, the start position is specified for each feature. For both fixed and variable step, the span (or width) is specified in the header and thus must be the same across all features. This requirement of uniform width dramatically limits the applicability of WIG. For scored features of variable width, consider \link[=BEDGraphFile]{BEDGraph} or \link[=BigWigFile]{BigWig}, which is generally preferred over both WIG and BEDGraph. To efficiently convert an existing WIG or BEDGraph file to BigWig, call \code{\link{wigToBigWig}}. Neither WIG, BEDGraph nor BigWig allow overlapping features. } \section{WIGFile objects}{ The \code{WIGFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the WIG format. To cast a path, URL or connection to a \code{WIGFile}, pass it to the \code{WIGFile} constructor. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/wiggle.html} } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_wig <- file.path(test_path, "step.wig") ## basic import calls test <- import(test_wig) test import.wig(test_wig) test_wig_file <- WIGFile(test_wig) import(test_wig_file) test_wig_con <- file(test_wig) import(test_wig_con, format = "wig") close(test_wig_con) test_wig_con <- file(test_wig) import(WIGFile(test_wig_con)) close(test_wig_con) ## various options import(test_wig, genome = "hg19") import(test_wig, trackLine = FALSE) which <- as(test[3:4,], "RangesList") import(test_wig, which = which) \dontrun{ ## basic export calls test_wig_out <- file.path(tempdir(), "test.wig") export(test, test_wig_out) export.wig(test, test_wig_out) test_foo_out <- file.path(tempdir(), "test.foo") export(test, test_foo_out, format = "wig") test_wig_out_file <- WIGFile(test_wig_out) export(test, test_wig_out_file) ## appending test2 <- test metadata(test2)$trackLine <- initialize(metadata(test)$trackLine, name = "test2") export(test2, test_wig_out_file, append = TRUE) ## passing track line parameters export(test, test_wig_out, name = "test2") ## no track line export(test, test_wig_out, trackLine = FALSE) ## gzip test_wig_gz <- paste(test_wig_out, ".gz", sep = "") export(test, test_wig_gz) } } \keyword{methods} \keyword{classes} rtracklayer/man/activeView-methods.Rd0000644000175100017510000000124312607264731020736 0ustar00biocbuildbiocbuild\name{activeView-methods} \docType{methods} \alias{activeView} \alias{activeView<-} \alias{activeView-methods} \alias{activeView<--methods} \alias{activeView,BrowserSession-method} \alias{activeView,UCSCView-method} \title{Accessing the active view} \description{ Get the active view. } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "BrowserSession"}{ \code{activeView(object)}: Gets the active \code{\linkS4class{BrowserView}} from a browser session. \code{activeView(object) <- value}: Sets the active \code{\linkS4class{BrowserView}} in a browser session. } }} \keyword{methods} rtracklayer/man/asBED.Rd0000644000175100017510000000215512607264731016110 0ustar00biocbuildbiocbuild\name{asBED} \alias{asBED} \alias{asBED,GRangesList-method} \title{Coerce to BED structure} \description{ Coerce the structure of an object to one following BED-like conventions, i.e., with columns for blocks and thick regions. } \usage{ asBED(x, ...) \S4method{asBED}{GRangesList}(x) } \arguments{ \item{x}{ Generally, a tabular object to structure as BED } \item{\dots}{ Arguments to pass to methods } } \details{ The exact behavior depends on the class of \code{object}. \describe{ \item{\code{GRangesList}}{This treats \code{object} as if it were a list of transcripts, i.e., each element contains the exons of a transcript. The \code{blockStarts} and \code{blockSizes} columns are derived from the ranges in each element. Also, add \code{name} column from \code{names(object)}. } } } \value{ A \code{GRanges}, with the columns \code{name}, \code{blockStarts} and \code{blockSizes} added. } \author{ Michael Lawrence } \examples{ \dontrun{ library(TxDb.Hsapiens.UCSC.hg19.knownGene) exons <- exonsBy(TxDb_Hsapiens_UCSC_hg19_knownGene) mcols(asBED(exons)) } } rtracklayer/man/asGFF.Rd0000644000175100017510000000243712607264731016123 0ustar00biocbuildbiocbuild\name{asGFF} \alias{asGFF} \alias{asGFF,GRangesList-method} \title{Coerce to GFF structure} \description{ Coerce the structure of an object to one following GFF-like conventions, i.e., using the \code{Parent} GFF3 attribute to encode the hierarchical structure. This object is then suitable for export as GFF3. } \usage{ asGFF(x, ...) \S4method{asGFF}{GRangesList}(x, parentType = "mRNA", childType = "exon") } \arguments{ \item{x}{ Generally, a tabular object to structure as GFF(3) } \item{parentType}{The value to store in the \code{type} column for the top-level (e.g., transcript) ranges. } \item{childType}{The value to store in the \code{type} column for the child (e.g., exon) ranges. } \item{\dots}{ Arguments to pass to methods } } \value{ For the \code{GRangesList} method: A \code{GRanges}, with the columns: \code{ID} (unique identifier), \code{Name} (from \code{names(x)}, and the names on each element of \code{x}, if any), \code{type} (as given by \code{parentType} and \code{childType}), and \code{Parent} (to relate each child range to its parent at the top-level). } \author{ Michael Lawrence } \examples{ \dontrun{ library(TxDb.Hsapiens.UCSC.hg19.knownGene) exons <- exonsBy(TxDb_Hsapiens_UCSC_hg19_knownGene) mcols(asGFF(exons)) } } rtracklayer/man/basicTrackLine-class.Rd0000644000175100017510000000561212607264731021154 0ustar00biocbuildbiocbuild\name{BasicTrackLine-class} \docType{class} \alias{BasicTrackLine-class} \alias{coerce,character,BasicTrackLine-method} \alias{coerce,BasicTrackLine,character-method} \title{Class "BasicTrackLine"} \description{The type of \acronym{UCSC} track line used to annotate most types of tracks (every type except Wiggle).} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("BasicTrackLine", ...)} or parsed from a character vector track line with \code{as(text, "BasicTrackLine")} or converted from a \code{\linkS4class{GraphTrackLine}} using \code{as(wig, "BasicTrackLine")}. } \section{Slots}{ \describe{ \item{\code{itemRgb}:}{Object of class \code{"logical"} indicating whether each feature in a track uploaded as \acronym{BED} should be drawn in its specified color. } \item{\code{useScore}:}{Object of class \code{"logical"} indicating whether the data value should be mapped to color. } \item{\code{group}:}{Object of class \code{"character"} naming a group to which this track should belong. } \item{\code{db}:}{Object of class \code{"character"} indicating the associated genome assembly. } \item{\code{offset}:}{Object of class \code{"numeric"}, a number added to all positions in the track. } \item{\code{url}:}{Object of class \code{"character"} referring to additional information about this track. } \item{\code{htmlUrl}:}{Object of class \code{"character"} referring to an \acronym{HTML} page to be displayed with this track. } \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{colorByStrand}:}{Object of class \code{"matrix"} with two columns, as from \code{col2rgb}. The two colors indicate the color for each strand (positive, negative). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of the track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} \item{as(object, \code{"\linkS4class{GraphTrackLine}"})}{Convert this line to a graph track line, using defaults for slots not held in common.} } } \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK} for the official documentation. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{GraphTrackLine}} for Wiggle/bedGraph tracks. } \keyword{classes} rtracklayer/man/blocks-methods.Rd0000644000175100017510000000251512607264731020110 0ustar00biocbuildbiocbuild\name{blocks-methods} \docType{methods} \alias{blocks} \alias{blocks-methods} \alias{blocks,RangedData-method} \alias{blocks,GenomicRanges-method} \title{Get blocks/exons} \description{ Obtains the block ranges (subranges, usually exons) from an object, such as a \code{\link[IRanges:RangedData-class]{RangedData}} imported from a BED file. } \usage{ blocks(x, ...) } \arguments{ \item{x}{The instance from which to obtain the block/exon information. Currently must be a \code{RangedData} or \code{GenomicRanges}, with a value column of name \dQuote{blocks} and of type \code{RangesList}. Such an object is returned by \code{\link{import.bed}} and \code{\link{asBED}}. } \item{...}{Additional arguments for methods} } \value{ A \code{\link[GenomicRanges:GRangesList-class]{GRangesList}} with an element for each range in \code{x}. The original block ranges are relative to the start of the containing range, so the returned ranges are shifted to absolute coordinates. The seqname and strand are inherited from the containing range. } \author{Michael Lawrence} \seealso{\code{\link{import.bed}} for importing a track from BED, which can store block information; \code{\link{asBED}} for coercing a \code{GenomicRanges} into a BED-like structure that can be passed to this function. } \keyword{methods} \keyword{manip} rtracklayer/man/browseGenome.Rd0000644000175100017510000000430112607264731017621 0ustar00biocbuildbiocbuild\name{browseGenome} \alias{browseGenome} \alias{browseGenome,RangedData-method} \alias{browseGenome,RangedDataList-method} \alias{GenomicRangesORGenomicRangesList-class} \alias{browseGenome,GenomicRangesORGenomicRangesList-method} \alias{browseGenome,missing-method} \title{ Browse a genome } \description{ A generic function for launching a genome browser. } \usage{ browseGenome(object, ...) \S4method{browseGenome}{GenomicRangesORGenomicRangesList}(object, browser = "UCSC", range = base::range(object), view = TRUE, trackParams = list(), viewParams = list(), name = "customTrack", ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ A \code{\link[GenomicRanges]{GRanges}} object, a \code{\link[IRanges]{RangedData}} object, or a list of those objects (e.g. a \code{\link[GenomicRanges]{GenomicRangesList}} object). } \item{browser}{ The name of the genome browser. } \item{range}{ A genome identifier or a \code{\link[GenomicRanges:GRanges-class]{GRanges}} or \code{\link[IRanges:RangesList-class]{RangesList}} to display in the initial view. } \item{view}{ Whether to open a view. } \item{trackParams}{ Named list of parameters to pass to \code{\link{track<-}}. } \item{viewParams}{ Named list of parameters to pass to \code{\link{browserView}}. } \item{name}{ The name for the track. Ignored if \code{object} is a \code{RangedDataList}, in which case the names are taken from the list names. } \item{\dots}{ Arguments passed to \code{\link{browserSession}}. } } \value{ Returns a \code{\linkS4class{BrowserSession}}. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{BrowserSession}} and \code{\linkS4class{BrowserView}}, the two main classes for interfacing with genome browsers.} \examples{ \dontrun{ ## open UCSC genome browser: browseGenome() ## to view a specific range: range <- GRangesForUCSCGenome("hg18", "chr22", IRanges(20000, 50000)) browseGenome(range = range) ## a slightly larger range: browseGenome(range = range, end = 75000) ## with a track: track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) browseGenome(RangedDataList(track)) } } \keyword{interface} rtracklayer/man/browserSession-class.Rd0000644000175100017510000001045212607264731021323 0ustar00biocbuildbiocbuild\name{BrowserSession-class} \docType{class} \alias{BrowserSession-class} \alias{show,BrowserSession-method} \alias{range,BrowserSession-method} \alias{genome,BrowserSession-method} \alias{genome<-,BrowserSession-method} \alias{names,BrowserSession-method} \alias{trackNames,BrowserSession-method} \title{Class "BrowserSession"} \description{An object representing a genome browser session. As a derivative of \code{\linkS4class{TrackDb}}, each session contains a set of loaded tracks. In addition, it has a set of views, in the form of \code{\linkS4class{BrowserView}} instances, on those tracks. Note that this is a virtual class; a concrete implementation is provided by each backend driver.} \section{Objects from the Class}{A virtual Class: No objects may be created from it. See \code{\link{browserSession}} for obtaining an instance of an implementation for a particular genome browser.} \section{Methods}{ This specifies the API implemented by each browser backend. Note that a backend is not required to support all operations, and that each backend often has additional parameters for each of the methods. See the backend-specific documentation for more details. The only built-in backend is \code{\linkS4class{UCSCSession}}. If a method is denoted as \emph{virtual}, it must be implemented by the backend to support the corresponding feature. Otherwise, the fallback behavior is described. \describe{ \item{\emph{virtual} \code{\link{browserView}(object, range = range(object), track = trackNames(object), ...)}}{ Constructs a \code{\linkS4class{BrowserView}} of \code{range} for this session. } \item{\emph{virtual} \code{\link{browserViews}(object, ...)}}{ Gets the \code{\linkS4class{BrowserView}} instances belonging to this session.} \item{\code{\link{activeView}(object, ...)}}{ Returns the \code{\linkS4class{BrowserView}} that is currently active in the session. Fallback calls \code{browserViews} and queries each view with \code{activeView}.} \item{\code{\link{range}(x, ...)}}{ Gets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} representing the range of the genome currently displayed by the browser (i.e. the range shown by the active view) or a default value (possibly \code{NULL}) if no views exist. } \item{\emph{virtual} \code{\link[Biostrings]{getSeq}(object, range = range(object), ...)}}{ gets a genomic sequence of \code{range} from this session.} \item{\emph{virtual} \code{\link[=sequence<-]{sequence}(object, ...) <- value}}{ Loads a sequence into the session.} \item{\emph{virtual} \code{\link[=track<-]{track}(object, name = deparse(substitute(track)), view = TRUE, ...) <- value}}{ Loads one or more \code{track}s into the session and optionally open a \code{view} of the track. The default implementation will coerce \code{value} to \code{RangedData}, so the backend should implement at least a method for \code{RangedData}. } \item{\code{x[[i]] <- value}}{Loads the track \code{value} into session \code{x}, under the name \code{i}. Shortcut to above.} \item{\code{x$name <- value}}{Loads the track \code{value} into session \code{x}, under the name \code{name}. Shortcut to above.} \item{\emph{virtual} \code{\link{track}(object, ...)}}{ Gets a track from a session as a \code{\link[IRanges:RangedData-class]{RangedData}}. } \item{\code{x[[i]]}}{Gets the track named \code{i} from session \code{x}. A shortcut to \code{track}. } \item{\code{x$name}}{Gets the track named \code{name} from session \code{x}. A shortcut to \code{track}.} \item{\emph{virtual} \code{\link{trackNames}(object, ...)}}{ Gets the names of the tracks stored in this session. } \item{\emph{virtual} \code{\link{genome}(x)}, \code{genome(x) <- value}}{ Gets or sets the genome identifier (e.g. \dQuote{hg18}) for the session.} \item{\emph{virtual} \code{\link{close}(con, ...)}}{ Close this session. } \item{\code{\link{show}(object, ...)}}{ Output a textual description of this session.} } } \author{ Michael Lawrence } \seealso{ \code{\link{browserSession}} for obtaining implementations of this class for a particular genome browser. } \keyword{classes} rtracklayer/man/browserSession-methods.Rd0000644000175100017510000000171212607264731021660 0ustar00biocbuildbiocbuild\name{browserSession-methods} \docType{methods} \alias{browserSession} \alias{browserSession-methods} \alias{browserSession,character-method} \alias{browserSession,BrowserView-method} \alias{browserSession,missing-method} \title{ Get a genome browser session } \description{ Methods for getting browser sessions. } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "character"}{ \code{browserSession(object, ...)}: Creates a \code{\linkS4class{BrowserSession}} from a genome browser identifier. The identifier corresponds to the prefix of the session class name (e.g. "UCSC" in "UCSCSession"). The arguments in \dots are passed to the initialization function of the class.} \item{object = "browserView"}{ Gets the \code{\linkS4class{BrowserSession}} for the view. } \item{object = "missing"}{ Calls \code{browserSession("ucsc", ...)}. } } } \keyword{methods} rtracklayer/man/browserView-class.Rd0000644000175100017510000000403012607264731020605 0ustar00biocbuildbiocbuild\name{BrowserView-class} \docType{class} \alias{BrowserView-class} \alias{show,BrowserView-method} \alias{visible} \alias{visible,BrowserView-method} \alias{visible<-} \alias{visible<-,BrowserView-method} \title{Class "BrowserView"} \description{ An object representing a genome browser view of a particular segment of a genome. } \section{Objects from the Class}{ A virtual Class: No objects may be created from it directly. See \code{\link{browserView}} for obtaining an instance of an implementation for a particular genome browser. } \section{Slots}{ \describe{ \item{\code{session}:}{Object of class \code{"BrowserSession"} the browser session to which this view belongs. } } } \section{Methods}{ This specifies the API implemented by each browser backend. Note that a backend is not guaranteed to support all operations. See the backend-specific documentation for more details. The only built-in backend is \code{\linkS4class{UCSCView}}. \describe{ \item{\code{\link{browserSession}(object)}}{ Obtains the \code{\linkS4class{BrowserSession}} to which this view belongs. } \item{\code{\link{close}(object)}}{ Close this view. } \item{\code{\link{range}(object)}}{ Obtains the \code{\link[GenomicRanges:GRanges-class]{GRanges}} displayed by this view.} \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks in the view. } \item{\code{\link{trackNames}(object) <- value}}{ Sets the visible tracks by their names. } \item{\code{\link{show}(object)}}{ Outputs a textual description of this view. } \item{\code{visible(object)}}{Get a named logical vector indicating whether each track is visible. } \item{\code{visible(object) <- value}}{Set a logical vector indicating the visibility of each track, with the same names and in the same order as that returned by \code{visible(object)}. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserView}} for obtaining instances of this class. } \keyword{classes} rtracklayer/man/browserView-methods.Rd0000644000175100017510000000330712607264731021151 0ustar00biocbuildbiocbuild\name{browserView-methods} \docType{methods} \alias{browserView} \alias{browserView-methods} \alias{browserView,UCSCSession-method} \title{Getting browser views} \description{ Methods for creating and getting browser views. } \usage{ browserView(object, range, track, ...) } \arguments{ \item{object}{The object from which to get the views.} \item{range}{The \code{\link[GenomicRanges:GRanges-class]{GRanges}} or \code{\link[IRanges:RangesList-class]{RangesList}} to display. If there are multiple elements, a view is created for each element and a \code{\linkS4class{BrowserViewList}} is returned.} \item{track}{List of track names to make visible in the view.} \item{\dots}{Arguments to pass to methods} } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "UCSCSession"}{ \code{browserView(object, range = range(object), track = trackNames(object), imagewidth = 800, ...)}: Creates a \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. The \code{imagewidth} parameter specifies the width of the track image in pixels. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} are passed to \code{\link{ucscTrackModes}} to create the \code{UCSCTrackModes} instance that will override modes indicated by the \code{track} parameter. } }} \examples{ \dontrun{ session <- browserSession() browserView(session, GRangesForUCSCGenome("hg19", "chr2", IRanges(20000, 50000))) ## only view "knownGene" track browserView(session, track = "knownGene") } } \keyword{methods} rtracklayer/man/browserViews-methods.Rd0000644000175100017510000000110612607264731021327 0ustar00biocbuildbiocbuild\name{browserViews-methods} \docType{methods} \alias{browserViews} \alias{browserViews-methods} \alias{browserViews,UCSCSession-method} \title{ Getting the browser views } \description{ Methods for getting browser views. } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer}. \item{object = "UCSCSession"}{ Gets the instances of \code{\linkS4class{BrowserView}} in the session. } }} \seealso{\code{\link{browserView}} for creating a browser view.} \examples{ \dontrun{ session <- browseGenome() browserViews(session) } } \keyword{methods} rtracklayer/man/cpneTrack.Rd0000644000175100017510000000137512607264731017107 0ustar00biocbuildbiocbuild\name{cpneTrack} \alias{cpneTrack} \docType{data} \title{CPNE1 SNP track} \description{ A \code{RangedData} object (created by the \code{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. } \usage{data(cpneTrack)} \format{ Each feature (row) is a SNP. The association test scores are accessible via \code{\link[BiocGenerics]{score}}. } \source{ Vince Carey and the \code{GGtools} package. } \examples{ data(cpneTrack) plot(start(cpneTrack), score(cpneTrack)) } \keyword{datasets} rtracklayer/man/export.Rd0000644000175100017510000001723712607264731016522 0ustar00biocbuildbiocbuild\name{io} \alias{export} \alias{export,ANY,connection,character-method} \alias{export,ANY,connection,missing-method} \alias{export,ANY,CompressedFile,missing-method} \alias{export,ANY,missing,character-method} \alias{export,ANY,character,missing-method} \alias{export,ANY,character,character-method} \alias{import} \alias{import,connection,character,ANY-method} \alias{import,connection,missing,ANY-method} \alias{import,CompressedFile,missing,ANY-method} \alias{import,character,missing,ANY-method} \alias{import,character,character,ANY-method} \alias{import,missing,ANY,character-method} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Import and export } \description{ The functions \code{import} and \code{export} load and save objects from and to particular file formats. The rtracklayer package implements support for a number of annotation and sequence formats. } \usage{ export(object, con, format, ...) import(con, format, text, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ The object to export. } \item{con}{ The connection from which data is loaded or to which data is saved. If this is a character vector, it is assumed to be a filename and a corresponding file connection is created and then closed after exporting the object. If a \code{\linkS4class{RTLFile}} derivative, the data is loaded from or saved to the underlying resource. If missing, the function will return the output as a character vector, rather than writing to a connection. } \item{format}{ The format of the output. If missing and \code{con} is a filename, the format is derived from the file extension. This argument is unnecessary when \code{con} is a derivative of \code{\linkS4class{RTLFile}}. } \item{text}{ If \code{con} is missing, this can be a character vector directly providing the string data to import. } \item{\dots}{ Parameters to pass to the format-specific method. } } \details{ The rtracklayer package supports a number of file formats for representing annotated genomic intervals. These are each represented as a subclass of \code{\linkS4class{RTLFile}}. Below, we list the major supported formats, with some advice for when a particular file format is appropriate: \describe{ \item{\acronym{\link[=GFFFile]{GFF}}}{The General Feature Format is meant to represent any set of genomic features, with application-specific columns represented as \dQuote{attributes}. There are three principal versions (1, 2, and 3). This is a good format for interoperating with other genomic tools and is the most flexible format, in that a feature may have any number of attributes (in version 2 and above). Version 3 (GFF3) is the preferred version. Its specification lays out conventions for representing various types of data, including gene models, for which it is the format of choice. For variants, rtracklayer has rudimentary support for an extention of GFF3 called GVF. UCSC supports GFF1, but it needs to be encapsulated in the UCSC metaformat, i.e. \code{export.ucsc(subformat = "gff1")}. The BED format is typically preferred over GFF for interaction with UCSC. GFF files can be indexed with the tabix utility for fast range-based queries via rtracklayer and Rsamtools. } \item{\acronym{\link[=BEDFile]{BED}}}{The Browser Extended Display format is for displaying qualitative tracks in a genome browser, in particular UCSC. It finds a good balance between simplicity and expressiveness. It is much simpler than GFF and yet can still represent multi-exon gene structures. It is somewhat limited by its lack of the attribute support of GFF. To circumvent this, many tools and organizations have extended BED with additional columns. These are not officially valid BED files, and as such rtracklayer does not yet support them (this will be addressed soon). The rtracklayer package does support two official extensions of BED: Bed15 and bedGraph, see below. BED files can be indexed with the tabix utility for fast range-based queries via rtracklayer and Rsamtools. } \item{\acronym{\link[=BED15File]{Bed15}}}{An extension of BED with 15 columns, Bed15 is meant to represent data from microarray experiments. Multiple samples/columns are supported, and the data is displayed in UCSC as a compact heatmap. Few other tools support this format. With 15 columns per feature, this format is probably too verbose for e.g. ChIP-seq coverage (use multiple BigWig tracks instead).} \item{\acronym{\link[=BEDGraphFile]{bedGraph}}}{A variant of BED that represents a score column more compactly than \acronym{BED} and especially \acronym{Bed15}, although only one sample is supported. The data is displayed in UCSC as a bar or line graph. For large data (the typical case), \code{BigWig} is preferred. } \item{\acronym{\link[=WIGFile]{WIG}}}{The Wiggle format is meant for storing dense numerical data, such as window-based GC and conservation scores. The data is displayed in UCSC as a bar or line graph. The WIG format only works for intervals with a uniform width. For non-uniform widths, consider \code{bedGraph}. For large data, consider \code{BigWig}. } \item{\acronym{\link[=BigWigFile]{BigWig}}}{The BigWig format is a binary version of both \code{bedGraph} and \code{WIG} (which are now somewhat obsolete). A BigWig file contains a spatial index for fast range-based queries and also embeds summary statistics of the scores at several zoom levels. Thus, it is ideal for visualization of and parallel computing on genome-scale vectors, like the coverage from a high-throughput sequencing experiment. } } In summary, for the typical use case of combining gene models with experimental data, \acronym{GFF} is preferred for gene models and \code{BigWig} is preferred for quantitative score vectors. Note that the Rsamtools package provides support for the \code{\link[Rsamtools:BamFile]{BAM}} file format (for representing read alignments), among others. Based on this, the rtracklayer package provides an \code{export} method for writing \code{GAlignments} and \code{GappedReads} objects as \code{BAM}. For variants, consider VCF, supported by the VariantAnnotation package. There is also support for reading and writing biological sequences, including the UCSC \code{\link[=TwoBitFile]{TwoBit}} format for compactly storing a genome sequence along with a mask. The files are binary, so they are efficiently queried for particular ranges. A similar format is \code{\link[Rsamtools:FaFile]{FA}}, supported by Rsamtools. } \value{ If \code{con} is missing, a character vector containing the string output. Otherwise, nothing is returned. } \author{ Michael Lawrence } \seealso{ Format-specific options for the popular formats: \acronym{\link[=GFFFile]{GFF}}, \acronym{\link[=BEDFile]{BED}}, \acronym{\link[=BED15File]{Bed15}}, \acronym{\link[=BEDGraphFile]{bedGraph}}, \acronym{\link[=WIGFile]{WIG}}, \acronym{\link[=BigWigFile]{BigWig}} } \examples{ track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) \dontrun{export(track, "my.gff", version = "3")} ## equivalently, \dontrun{export(track, "my.gff3")} ## or \dontrun{ con <- file("my.gff3") export(track, con, "gff3") close(con) } ## or as a string export(track, format = "gff3") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{IO} rtracklayer/man/genomeBrowsers.Rd0000644000175100017510000000164512607264731020176 0ustar00biocbuildbiocbuild\name{genomeBrowsers} \alias{genomeBrowsers} \title{Get available genome browsers} \description{ Gets the identifiers of the loaded genome browser drivers. } \usage{ genomeBrowsers(where = topenv(parent.frame())) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{where}{ The environment in which to search for drivers. } } \details{ This searches the specified environment for classes that extend \code{\linkS4class{BrowserSession}}. The prefix of the class name, e.g. "ucsc" in "UCSCSession", is returned for each driver. } \value{ A character vector of driver identifiers. } \author{ Michael Lawrence } \seealso{ \code{\link{browseGenome}} and \code{\link{browserSession}} that create \code{browserSession} implementations given an identifier returned from this function. } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{interface} rtracklayer/man/laySequence-methods.Rd0000644000175100017510000000047712607264731021116 0ustar00biocbuildbiocbuild\name{sequence<--methods} \docType{methods} \alias{sequence<-} \alias{sequence<--methods} \title{ Load a sequence } \description{ Methods for loading sequences. } \section{Methods}{ \describe{ No methods are defined by \pkg{rtracklayer} for the \code{sequence(object, ...) <- value} generic. }} \keyword{methods} rtracklayer/man/layTrack-methods.Rd0000644000175100017510000000407512607264731020410 0ustar00biocbuildbiocbuild\name{track<--methods} \docType{methods} \alias{track<-} \alias{track<--methods} \alias{track<-,BrowserSession,RangedData-method} \alias{track<-,BrowserSession,ANY-method} \alias{track<-,BrowserSession,RangedDataList-method} \alias{track<-,UCSCSession,RangedDataList-method} \title{ Laying tracks } \description{ Methods for loading \code{\link[IRanges:RangedData-class]{RangedData}} instances (tracks) into genome browsers. } \usage{ \S4method{track}{BrowserSession,RangedData}(object, name = deparse(substitute(track)), view = FALSE, ...) <- value } \arguments{ \item{object}{A \code{\linkS4class{BrowserSession}} into which the track is loaded.} \item{value}{The track(s) to load.} \item{name}{The name(s) of the track(s) being loaded.} \item{view}{Whether to create a view of the track after loading it.} \item{\dots}{Arguments to pass on to methods.} } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. A browser session implementation must implement a method for either \code{RangedData} or \code{RangedDataList}. The base \code{browserSession} class will delegate appropriately. \describe{ \item{object = "BrowserSession", value = "RangedData"}{ Load this track into the session. } \item{object = "BrowserSession", value = "RangedDataList"}{ Load all tracks into the session. } \item{object = "UCSCSession", value = "RangedDataList"}{ \code{track(object, name = deparse(substitute(track)), view = FALSE, format = "gff", ...) <- value}: Load the tracks into the session using the specified \code{format}. The arguments in \code{...} are passed on to \code{\link{export.ucsc}}, so they could be slots in a \code{\linkS4class{TrackLine}} subclass or parameters to pass on to the export function for \code{format}. } } } \seealso{\code{\link{track}} for getting a track from a session.} \examples{ \dontrun{ session <- browserSession() track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) track(session, "My Track") <- track } } \keyword{methods} rtracklayer/man/liftOver.Rd0000644000175100017510000000227612607264731016770 0ustar00biocbuildbiocbuild\name{liftOver} \alias{liftOver} \alias{liftOver,GenomicRanges,Chain-method} \title{ Lift intervals between genome builds } \description{ A reimplementation of the UCSC liftover tool for lifting features from one genome build to another. In our preliminary tests, it is significantly faster than the command line tool. Like the UCSC tool, a chain file is required input. } \usage{ liftOver(x, chain, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ The intervals to lift-over, usually a \code{\link[GenomicRanges:GRanges]{GRanges}}. } \item{chain}{ A \code{\linkS4class{Chain}} object, usually imported with \code{\link{import.chain}}. } \item{\dots}{ Arguments for methods. } } \value{ A \code{GRangesList} object. Each element contains the ranges mapped from the corresponding element in the input (may be one-to-many). } \references{ \url{http://genome.ucsc.edu/cgi-bin/hgLiftOver} } \examples{ \dontrun{ chain <- import.chain("hg19ToHg18.over.chain") library(TxDb.Hsapiens.UCSC.hg19.knownGene) tx_hg19 <- transcripts(TxDb.Hsapiens.UCSC.hg19.knownGene) tx_hg18 <- liftOver(tx_hg19, chain) } } \author{ Michael Lawrence } rtracklayer/man/readGFF.Rd0000644000175100017510000000632512607264731016433 0ustar00biocbuildbiocbuild\name{readGFF} \alias{readGFF} \alias{GFFcolnames} \title{Reads a file in GFF format} \description{ Reads a file in GFF format and creates a data frame or \link[S4Vectors]{DataFrame} object from it. } \usage{ readGFF(filepath, version=0, columns=NULL, tags=NULL, filter=NULL, nrows=-1, raw_data=FALSE) GFFcolnames(GFF1=FALSE) } \arguments{ \item{filepath}{ A single string containing the path or URL to the file to read. Alternatively can be a connection. } \item{version}{ \code{readGFF} should do a pretty descent job at detecting the GFF version. Use this argument \emph{only} if it doesn't or if you want to force it to parse and import the file as if its 9-th column was in a different format than what it really is (e.g. specify \code{version=1} on a GTF or GFF3 file to interpret its 9-th column as the \code{"group"} column of a GFF1 file). Supported versions are 1, 2, and 3. } \item{columns}{ The standard GFF columns to load. All of them are loaded by default. } \item{tags}{ The tags to load. All of them are loaded by default. } \item{filter}{ } \item{nrows}{ \code{-1} or the maximum number of rows to read in (after filtering). } \item{raw_data}{ } \item{GFF1}{ } } \details{ } \value{ } \author{ H. Pages } \seealso{ \itemize{ \item \code{\link{import}} for importing a GFF file as a \link[GenomicRanges]{GRanges} object. \item \code{\link[GenomicRanges]{makeGRangesFromDataFrame}} in the \pkg{GenomicRanges} package for making a \link[GenomicRanges]{GRanges} object from a data frame or \link[S4Vectors]{DataFrame} object. \item \code{\link[GenomicFeatures]{makeTxDbFromGFF}} in the \pkg{GenomicFeatures} package for importing a GFF file as a \link[GenomicFeatures]{TxDb} object. \item The \link[S4Vectors]{DataFrame} class in the \pkg{S4Vectors} package. } } \examples{ ## Standard GFF columns. GFFcolnames() GFFcolnames(GFF1=TRUE) # "group" instead of "attributes" tests_dir <- system.file("tests", package="rtracklayer") test_gff3 <- file.path(tests_dir, "genes.gff3") ## Load everything. df0 <- readGFF(test_gff3) head(df0) ## Load some tags only (in addition to the standard GFF columns). my_tags <- c("ID", "Parent", "Name", "Dbxref", "geneID") df1 <- readGFF(test_gff3, tags=my_tags) head(df1) ## Load no tags (in that case, the "attributes" standard column ## is loaded). df2 <- readGFF(test_gff3, tags=character(0)) head(df2) ## Load some standard GFF columns only (in addition to all tags). my_columns <- c("seqid", "start", "end", "strand", "type") df3 <- readGFF(test_gff3, columns=my_columns) df3 table(df3$seqid, df3$type) makeGRangesFromDataFrame(df3, keep.extra.columns=TRUE) ## Combine use of 'columns' and 'tags' arguments. readGFF(test_gff3, columns=my_columns, tags=c("ID", "Parent", "Name")) readGFF(test_gff3, columns=my_columns, tags=character(0)) ## Use the 'filter' argument to load only features of type "gene" ## or "mRNA" located on chr10. my_filter <- list(type=c("gene", "mRNA"), seqid="chr10") readGFF(test_gff3, filter=my_filter) readGFF(test_gff3, columns=my_columns, tags=character(0), filter=my_filter) } \keyword{manip} rtracklayer/man/targets.Rd0000644000175100017510000000212612607264731016641 0ustar00biocbuildbiocbuild\name{targets} \Rdversion{1.1} \alias{targets} \docType{data} \title{microRNA target sites} \description{ A data frame of human microRNA target sites retrieved from MiRBase. This is a subset of the \code{hsTargets} data frame in the \code{microRNA} package. See the \code{rtracklayer} vignette for more details. } \usage{data(targets)} \format{ A data frame with 2981 observations on the following 6 variables. \describe{ \item{\code{name}}{The miRBase ID of the microRNA.} \item{\code{target}}{The Ensembl ID of the targeted transcript.} \item{\code{chrom}}{The name of the chromosome for target site.} \item{\code{start}}{Target start position.} \item{\code{end}}{Target stop position.} \item{\code{strand}}{The strand of the target site, \code{"+"}, or \code{"-"}.} } } \source{ The \code{microRNA} package, dataset \code{hsTargets}. Originally MiRBase (\url{http://microrna.sanger.ac.uk/}). } \examples{ data(targets) targetTrack <- with(targets, GenomicData(IRanges::IRanges(start, end), strand = strand, chrom = chrom)) } \keyword{datasets} rtracklayer/man/tracks-methods.Rd0000644000175100017510000000266712607264731020132 0ustar00biocbuildbiocbuild\name{tracks-methods} \docType{methods} \alias{trackNames} \alias{trackNames<-} \alias{trackNames<--methods} \alias{trackNames<-,UCSCTrackModes-method} \alias{trackNames<-,UCSCView-method} \alias{trackNames-methods} \alias{trackNames,UCSCSession-method} \alias{trackNames,UCSCTrackModes-method} \alias{trackNames,UCSCView-method} \title{ Accessing track names } \description{ Methods for getting and setting track names. } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer} for \bold{getting} track names via the generic \code{trackNames(object, ...)}. \item{object = "UCSCSession"}{ Get the tracks loaded in the session. } \item{object = "UCSCTrackModes"}{ Get the visible tracks according to the modes (all tracks not set to "hide").} \item{object = "UCSCView"}{ Get the visible tracks in the view. } The following methods are defined by \pkg{rtracklayer} for \bold{setting} track names via the generic \code{trackNames(object) <- value}. \item{object = "UCSCTrackModes"}{ Sets the tracks that should be visible in the modes. All specified tracks with mode "hide" in \code{object} are set to mode "full". Any tracks in \code{object} that are not specified in the value are set to "hide". No other modes are changed.} \item{object = "UCSCView"}{ Sets the visible tracks in the view. This opens a new web browser with only the specified tracks visible. } }} \keyword{methods}rtracklayer/man/ucscGenomes.Rd0000644000175100017510000000171512607264731017446 0ustar00biocbuildbiocbuild\name{ucscGenomes} \alias{ucscGenomes} \title{Get available genomes on UCSC} \description{ Get a \code{data.frame} describing the available UCSC genomes. } \usage{ ucscGenomes(organism=FALSE) } \arguments{ \item{organism}{A \code{logical(1)} indicating whether scientific name should be appended.} } \value{ A \code{data.frame} with the following columns: \item{db}{UCSC DB identifier (e.g. "hg18")} \item{species}{The name of the species (e.g. "Human")} \item{date}{The date the genome was built} \item{name}{The official name of the genome build} \item{organism}{The scientific name of the species (e.g. "Homo sapiens")} } \seealso{\code{\linkS4class{UCSCSession}} for details on specifying the genome.} \details{ For populating the organism column, the web url \url{http://genome.ucsc.edu/cgi-bin} is scraped for every assembly version to get the scientific name. } \examples{ ucscGenomes() } \author{ Michael Lawrence } \keyword{interface} rtracklayer/man/ucscSession-class.Rd0000644000175100017510000001240612607264731020576 0ustar00biocbuildbiocbuild\name{UCSCSession-class} \docType{class} \alias{UCSCSession-class} \alias{initialize,UCSCSession-method} \alias{track,UCSCSession-method} \alias{track<-,UCSCSession,GenomicRangesList-method} \alias{range<-} \alias{range<-,UCSCSession-method} \alias{track<-,UCSCSession,RTLFile-method} \alias{genome,UCSCSession-method} \alias{genome<-,UCSCSession-method} \alias{range,UCSCSession-method} \alias{seqinfo,UCSCSession-method} \alias{range,ucscCart-method} \alias{genome,ucscCart-method} \alias{getTable,UCSCSession-method} \title{Class "UCSCSession"} \description{An implementation of \code{\linkS4class{BrowserSession}} for the \acronym{UCSC} genome browser.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{\link{browserSession}("ucsc", url = "http://genome.ucsc.edu/cgi-bin", ...)}. The arguments in \code{...} correspond to libcurl options, see \code{\link[RCurl]{getCurlHandle}}. Setting these options may be useful e.g. for getting past a proxy. } \section{Slots}{ \describe{ \item{\code{url}:}{Object of class \code{"character"} holding the base \acronym{URL} of the \acronym{UCSC} browser. } \item{\code{hguid}:}{Object of class \code{"numeric"} holding the user identification code.} \item{\code{views}:}{Object of class \code{"environment"} containing a list stored under the name "instances". The list holds the instances of \code{\linkS4class{BrowserView}} for this session. } } } \section{Extends}{ Class \code{"\linkS4class{BrowserSession}"}, directly. } \section{Methods}{ \describe{ \item{\code{\link{browserView}(object, range = range(object), track = trackNames(object), ...)}}{ Creates a \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} should match parameters to a \code{\link{ucscTrackModes}} method for creating a \code{UCSCTrackModes} instance that will be merged with and override modes indicated by the \code{track} parameter. } \item{\code{\link{browserViews}}(object)}{ Gets the \code{\linkS4class{BrowserView}} instances for this session. } \item{\code{\link{range}}(x)}{ Gets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} last displayed in this session.} \item{\code{\link[rtracklayer:RangedData-methods]{genome}(x)}}{Gets the genome identifier of the session, i.e. \code{genome(range(x))}.} \item{\code{seqinfo}}{ Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object with the lengths of the chromosomes in the currenet genome. No circularity information is available. } \item{\code{range(x) <- value}}{ Sets \code{value}, usually a \code{GRanges} object or \code{RangesList}, as the range of session \code{x}. Note that this setting only lasts until a view is created or manipulated. This mechanism is useful, for example, when treating the UCSC browser as a database, rather than a genome viewer.} \item{\code{\link[rtracklayer:RangedData-methods]{genome}(x) <- value}}{ Sets the genome identifier on the range of session \code{x}.} \item{\code{\link[Biostrings]{getSeq}(object, range, track = "Assembly")}}{ Gets the sequence in \code{range} and \code{track}. } \item{\code{\link[=track<-]{track}(object, name = names(track), format = "auto", ...) <- value}}{ Loads a track, stored under \code{name} and formatted as \code{format}. The "auto" format resolves to "bed" for qualitative data. For quantitative data, i.e., data with a numeric \code{score} column, "wig" or "bedGraph" is chosen, depending on how well the data compresses into wig. The arguments in \code{...} are passed on to \code{\link{export.ucsc}}, so they could be slots in a \code{\linkS4class{TrackLine}} subclass (and thus specify visual attributes like color) or parameters to pass on to the export function for \code{format}. The \code{value} may be either a range object (like a \code{GRanges}) or a file object (like a \code{BEDFile}). } \item{\code{\link{track}(object, name, range = range(object), table = NULL)}}{ Retrieves a \code{\link[IRanges:RangedData-class]{RangedData}} with features in \code{range} from track named \code{name}. Some built-in tracks have multiple series, each stored in a separate database table. A specific table may be retrieved by passing its name in the \code{table} parameter. See \code{\link{tableNames}} for a way to list the available tables. } \item{}{ \code{getTable(object, name, range = base::range(object), table = NULL)}: Retrieves the table indicated by the track \code{name} and \code{table} name, over \code{range}, as a \code{data.frame}. See \code{\link{getTable}}. } \item{\code{\link{trackNames}}(object)}{ Gets the names of the tracks stored in the session. } \item{\code{\link{ucscTrackModes}}(object)}{ Gets the default view modes for the tracks in the session. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserSession}} for creating instances of this class. } \keyword{classes} rtracklayer/man/ucscTrackLine-class.Rd0000644000175100017510000000356512607264731021035 0ustar00biocbuildbiocbuild\name{TrackLine-class} \docType{class} \alias{TrackLine-class} \alias{coerce,character,TrackLine-method} \alias{coerce,TrackLine,character-method} \alias{show,TrackLine-method} \title{Class "TrackLine"} \description{An object representing a "track line" in the \acronym{UCSC} format. There are two concrete types of track lines: \code{\linkS4class{BasicTrackLine}} (used for most types of tracks) and \code{\linkS4class{GraphTrackLine}} (used for graphical tracks). This class only declares the common elements between the two.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("TrackLine", ...)} or parsed from a character vector track line with \code{as(text, "TrackLine")}. But note that \acronym{UCSC} only understands one of the subclasses mentioned above. } \section{Slots}{ \describe{ \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} } } \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK} for the official documentation. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{BasicTrackLine}} (used for most types of tracks) and \code{\linkS4class{GraphTrackLine}} (used for Wiggle/bedGraph tracks). } \keyword{classes} rtracklayer/man/ucscTrackModes-class.Rd0000644000175100017510000000504512607264731021210 0ustar00biocbuildbiocbuild\name{UCSCTrackModes-class} \docType{class} \alias{UCSCTrackModes-class} \alias{[,UCSCTrackModes,ANY,ANY-method} \alias{[<-,UCSCTrackModes,ANY,ANY,ANY-method} \title{Class "UCSCTrackModes"} \description{A vector of view modes ("hide", "dense", "full", "pack", "squish") for each track in a \acronym{UCSC} view.} \section{Objects from the Class}{ Objects may be created by calls of the form \code{\link{ucscTrackModes}(object = character(), hide = character(), dense = character(), pack = character(), squish = character(), full = character())}, where \code{object} should be a character vector of mode names (with its \code{names} attribute specifying the corresponding track names). The other parameters should contain track names that override the modes in \code{object}. Later parameters override earlier ones, so, for example, if a track is named in \code{hide} and \code{full}, it is shown in the full view mode. } \section{Slots}{ \describe{ \item{\code{.Data}:}{Object of class \code{"character"} holding the modes ("hide", "dense", "full", "pack", "squish"), with its \code{names} attribute holding corresponding track names.} \item{\code{labels}:}{Object of class \code{"character"} holding labels (human-readable names) corresponding to each track/mode.} } } \section{Extends}{ Class \code{"\linkS4class{character}"}, from data part. Class \code{"\linkS4class{vector}"}, by class "character", distance 2. } \section{Methods}{ \describe{ \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks (those that do not have mode "hide"). } \item{\code{\link{trackNames}(object) <- value}}{ Sets the names of the visible tracks. Any tracks named in \code{value} are set to "full" if the are currently set to "hide" in this object. Any tracks not in \code{value} are set to "hide". All other modes are preserved.} \item{\code{object[i]}}{Gets the track mode of the tracks indexed by \code{i}, which can be any type of index supported by character vector subsetting. If \code{i} is a character vector, it indexes first by the internal track IDs (the \code{names} on \code{.Data}) and then by the user-level track names (the \code{labels} slot).} \item{\code{object[i] <- value}}{Sets the track modes indexed by \code{i} (in the same way as in \code{object[i]} above) to those specified in \code{value}.} } } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{UCSCView}} on which track view modes may be set. } \keyword{classes} rtracklayer/man/ucscTrackModes-methods.Rd0000644000175100017510000000521512607264731021545 0ustar00biocbuildbiocbuild\name{ucscTrackModes-methods} \docType{methods} \alias{ucscTrackModes} \alias{ucscTrackModes<-} \alias{ucscTrackModes-methods} \alias{ucscTrackModes,character-method} \alias{ucscTrackModes,missing-method} \alias{ucscTrackModes,UCSCView-method} \alias{ucscTrackModes<--methods} \alias{ucscTrackModes<-,UCSCView,UCSCTrackModes-method} \alias{ucscTrackModes<-,UCSCView,character-method} \alias{ucscTrackModes,ucscTracks-method} \alias{ucscTrackModes,UCSCSession-method} \title{ Accessing UCSC track modes } \description{ Generics for getting and setting UCSC track visibility modes ("hide", "dense", "full", "pack", "squish"). } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer} for \bold{getting} the track modes through the generic \code{ucscTrackModes(object, ...)}. \item{object = "character"}{ \code{function(object, hide = character(), dense = character(), pack = character(), squish = character(), full = character())} Creates an instance of \code{\linkS4class{UCSCTrackModes}} from \code{object}, a character vector of mode names, with the corresponding track ids given in the \code{names} attribute. Note that \code{object} can be a \code{UCSCTrackModes} instance, as \code{UCSCTrackModes} extends \code{character}. The other parameters are character vectors identifying the tracks for each mode and overriding the modes specified by \code{object}. } \item{object = "missing"}{ The same interface as above, except \code{object} defaults to an empty character vector. } \item{object = "UCSCView"}{ Gets modes for tracks in the view. } \item{object = "UCSCSession"}{ Gets default modes for the tracks in the session. These are the modes that will be used as the default for a newly created view. } The following methods are defined by \pkg{rtracklayer} for \bold{setting} the track modes through the generic \code{ucscTrackModes(object) <- value}. \item{object = "UCSCView", value = "UCSCTrackModes"}{ Sets the modes for the tracks in the view. } \item{object = "UCSCView", value = "character"}{ Sets the modes from a character vector of mode names, with the corresponding track names given in the \code{names} attribute. } }} \seealso{\code{\link{trackNames}} and \code{\link{trackNames<-}} for just getting or setting which tracks are visible (not of mode "hide").} \examples{ # Tracks "foo" and "bar" are fully shown, "baz" is hidden modes <- ucscTrackModes(full = c("foo", "bar"), hide = "baz") # Update the modes to hide track "bar" modes2 <- ucscTrackModes(modes, hide = "bar") } \keyword{methods} rtracklayer/man/ucscView-class.Rd0000644000175100017510000000524612607264731020071 0ustar00biocbuildbiocbuild\name{UCSCView-class} \docType{class} \alias{UCSCView-class} \alias{range,UCSCView-method} \alias{range<-,UCSCView-method} \alias{visible,UCSCView-method} \alias{visible<-,UCSCView-method} \title{Class "UCSCView"} \description{An object representing a view of a genome in the \acronym{UCSC} browser.} \section{Objects from the Class}{ Calling \code{\link{browserView}(session, range = range(object), track = trackNames(object), ...)} creates \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} should match parameters to a \code{\link{ucscTrackModes}} method for creating a \code{UCSCTrackModes} instance that will be merged with and override modes indicated by the \code{track} parameter. } \section{Slots}{ \describe{ \item{\code{hgsid}:}{Object of class \code{"numeric"}, which identifies this view to \acronym{UCSC}.} \item{\code{session}:}{Object of class \code{"BrowserSession"} to which this view belongs.} } } \section{Extends}{ Class \code{"\linkS4class{BrowserView}"}, directly. } \section{Methods}{ \describe{ \item{\code{\link{activeView}(object)}}{ Obtains a logical indicating whether this view is the active view. } \item{\code{\link{range}(object)}}{ Obtains the \code{\link[GenomicRanges:GRanges-class]{GRanges}} displayed by this view. } \item{\code{\link{range}(object) <- value}}{ Sets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} or \code{\link[IRanges:RangesList-class]{RangesList}} displayed by this view. } \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks in this view. } \item{\code{\link{trackNames}(object) <- value}}{ Sets the visible tracks by name. } \item{\code{visible(object)}}{Get a named logical vector indicating whether each track is visible. } \item{\code{visible(object) <- value}}{Set a logical vector indicating the visibility of each track, in the same order as returned by \code{visible(object)}. } \item{\code{\link{ucscTrackModes}(object)}}{ Obtains the \code{\linkS4class{UCSCTrackModes}} for this view. } \item{\code{\link{ucscTrackModes}(object) <- value}}{ Sets the \code{\linkS4class{UCSCTrackModes}} for this view. The \code{value} may be either a \code{UCSCTrackModes} instance or a character vector that will be coerced by a call to \code{\link{ucscTrackModes}}. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserView}} for creating instances of this class. } \keyword{classes} rtracklayer/man/wigToBigWig.Rd0000644000175100017510000000166012607264731017354 0ustar00biocbuildbiocbuild\name{wigToBigWig} \alias{wigToBigWig} \title{ Convert WIG to BigWig } \description{ This function calls the Kent C library to efficiently convert a WIG file to a BigWig file, without loading the entire file into memory. This solves the problem where simple tools write out text WIG files, instead of more efficiently accessed binary BigWig files. } \usage{ wigToBigWig(x, seqinfo, dest = paste(file_path_sans_ext(x, TRUE), "bw", sep = ".")) } \arguments{ \item{x}{ Path or URL to the WIG file. Connections are not supported. } \item{seqinfo}{ \code{\linkS4class{Seqinfo}} object, describing the genome of the data. All BigWig files must have this defined. } \item{dest}{ The path to which to write the BigWig file. Defaults to \code{x} with the extension changed to \dQuote{bw}. } } \author{ Michael Lawrence } \seealso{ \code{\link[=BigWigFile]{BigWig}} import and export support } rtracklayer/man/wigTrackLine-class.Rd0000644000175100017510000000675512607264731020672 0ustar00biocbuildbiocbuild\name{GraphTrackLine-class} \docType{class} \alias{GraphTrackLine-class} \alias{coerce,character,GraphTrackLine-method} \alias{coerce,GraphTrackLine,character-method} \alias{coerce,GraphTrackLine,BasicTrackLine-method} \alias{coerce,BasicTrackLine,GraphTrackLine-method} \title{Class "GraphTrackLine"} \description{ A \acronym{UCSC} track line for graphical tracks. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("GraphTrackLine", ...)} or parsed from a character vector track line with \code{as(text, "GraphTrackLine")} or converted from a \code{\linkS4class{BasicTrackLine}} using \code{as(basic, "GraphTrackLine")}. } \section{Slots}{ \describe{ \item{\code{altColor}:}{Object of class \code{"integer"} giving an alternate color, as from \code{\link{col2rgb}}.} \item{\code{autoScale}:}{Object of class \code{"logical"} indicating whether to automatically scale to min/max of the data.} \item{\code{alwaysZero}:}{Object of class \code{"logical"} indicating whether to fix the lower limit of the Y axis at zero.} \item{\code{gridDefault}:}{Object of class \code{"logical"} indicating whether a grid should be drawn. } \item{\code{maxHeightPixels}:}{Object of class \code{"numeric"} of length three (max, default, min), giving the allowable range for the vertical height of the graph.} \item{\code{graphType}:}{Object of class \code{"character"}, specifying the graph type, either "bar" or "points". } \item{\code{viewLimits}:}{Object of class \code{"numeric"} and of length two specifying the data range (min, max) shown in the graph.} \item{\code{yLineMark}:}{Object of class \code{"numeric"} giving the position of a horizontal line.} \item{\code{yLineOnOff}:}{Object of class \code{"logical"} indicating whether the \code{yLineMark} should be visible. } \item{\code{windowingFunction}:}{Object of class \code{"character"}, one of "maximum", "mean", "minimum", for removing points when the graph shrinks.} \item{\code{smoothingWindow}:}{Object of class \code{"numeric"} giving the window size of a smoother to pass over the graph. } \item{\code{type}:}{Scalar \code{"character"} indicating the type of the track, either \code{"wig"} or \code{"bedGraph"}.} \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} \item{as(object, \code{"\linkS4class{BasicTrackLine}"})}{Convert this line to a basic UCSC track line, using defaults for slots not held in common.} } } \references{ Official documentation: \url{http://genome.ucsc.edu/goldenPath/help/wiggle.html}. } \author{ Michael Lawrence } \seealso{ \code{\link{export.wig}}, \code{\link{export.bedGraph}} for exporting graphical tracks. } \keyword{classes} rtracklayer/src/0000755000175100017510000000000012612032142014675 5ustar00biocbuildbiocbuildrtracklayer/src/IRanges_stubs.c0000644000175100017510000000003412612032142017606 0ustar00biocbuildbiocbuild#include <_IRanges_stubs.c> rtracklayer/src/Makevars0000644000175100017510000000024412612032142016371 0ustar00biocbuildbiocbuildPKG_LIBS=-lz include Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) PKG_CPPFLAGS=-D_FILE_OFFSET_BITS=64 all: $(SHLIB) clean: rm -f $(OBJECTS) rtracklayer/src/Makevars.common0000644000175100017510000000107012607264731017675 0ustar00biocbuildbiocbuildPKG_OBJECTS = \ S4Vectors_stubs.o IRanges_stubs.o XVector_stubs.o R_init_rtracklayer.o \ readGFF.o bigWig.o chain_io.o twoBit.o handlers.o utils.o UCSC_OBJECTS = \ bPlusTree.o bbiRead.o bbiWrite.o bwgCreate.o bwgQuery.o \ cirTree.o common.o dnaseq.o dnautil.o errAbort.o hash.o linefile.o localmem.o\ sqlNum.o zlibFace.o dystring.o hmmstats.o obscure.o pipeline.o \ rangeTree.o rbTree.o memalloc.o dlist.o udc.o net.o bits.o twoBit.o \ _cheapcgi.o internet.o https.o base64.o verbose.o os.o wildcmp.o _portimpl.o PKG_CFLAGS = -g PKG_LIBS += -pthread rtracklayer/src/Makevars.win0000644000175100017510000000064612612032142017173 0ustar00biocbuildbiocbuildZLIB_CFLAGS+=$(shell echo 'zlibbioc::pkgconfig("PKG_CFLAGS")'|\ "${R_HOME}/bin/R" --vanilla --slave) PKG_LIBS+=$(shell echo 'zlibbioc::pkgconfig("PKG_LIBS_shared")' |\ "${R_HOME}/bin/R" --vanilla --slave) PKG_LIBS+=-lws2_32 include Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) all: $(SHLIB) clean: rm -f $(OBJECTS) %.o: %.c $(CC) $(ZLIB_CFLAGS) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c $< -o $@ rtracklayer/src/R_init_rtracklayer.c0000644000175100017510000000206012612032142020666 0ustar00biocbuildbiocbuild#include "rtracklayer.h" #include "readGFF.h" #include "bigWig.h" #include "twoBit.h" #include "utils.h" #include #define CALLMETHOD_DEF(fun, numArgs) {#fun, (DL_FUNC) &fun, numArgs} static const R_CallMethodDef callMethods[] = { /* readGFF.c */ CALLMETHOD_DEF(gff_colnames, 1), CALLMETHOD_DEF(read_gff_pragmas, 1), CALLMETHOD_DEF(scan_gff, 5), CALLMETHOD_DEF(load_gff, 8), /* bigWig.c */ CALLMETHOD_DEF(BWGSectionList_add, 5), CALLMETHOD_DEF(BWGSectionList_write, 4), CALLMETHOD_DEF(BWGSectionList_cleanup, 1), CALLMETHOD_DEF(BWGFile_query, 4), CALLMETHOD_DEF(BWGFile_seqlengths, 1), CALLMETHOD_DEF(BWGFile_summary, 6), CALLMETHOD_DEF(BWGFile_fromWIG, 3), /* twobit.c */ CALLMETHOD_DEF(DNAString_to_twoBit, 3), CALLMETHOD_DEF(TwoBits_write, 2), CALLMETHOD_DEF(TwoBitFile_seqlengths, 1), CALLMETHOD_DEF(TwoBitFile_read, 4), /* utils.c */ CALLMETHOD_DEF(CharacterList_pasteCollapse, 2), {NULL, NULL, 0} }; void R_init_rtracklayer(DllInfo *info) { R_registerRoutines(info, NULL, callMethods, NULL, NULL); } rtracklayer/src/S4Vectors_stubs.c0000644000175100017510000000003612612032142020114 0ustar00biocbuildbiocbuild#include <_S4Vectors_stubs.c> rtracklayer/src/XVector_stubs.c0000644000175100017510000000003412612032142017650 0ustar00biocbuildbiocbuild#include <_XVector_stubs.c> rtracklayer/src/bigWig.c0000644000175100017510000003070612612032142016257 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/linefile.h" #include "ucsc/localmem.h" #include "ucsc/hash.h" #include "ucsc/bbiFile.h" #include "ucsc/bigWig.h" #include "ucsc/bwgInternal.h" #include "bigWig.h" #include "handlers.h" static struct bwgBedGraphItem * createBedGraphItems(int *start, int *width, double *score, int len, struct lm *lm) { struct bwgBedGraphItem *itemList = NULL, *item; int i; for (i=0; iend = start[i] + width[i] - 1; item->start = start[i] - 1; item->val = score[i]; slAddHead(&itemList, item); } slReverse(&itemList); return itemList; } static struct bwgVariableStepPacked * createVariableStepItems(int *start, double *score, int len, struct lm *lm) { struct bwgVariableStepPacked *packed; lmAllocArray(lm, packed, len); int i; for (i=0; ichrom = (char *)seq; section->start = start[0] - 1; section->end = start[len-1] + width[len-1] - 1; section->type = type; section->itemSpan = width[0]; if (type == bwgTypeFixedStep) { section->items.fixedStepPacked = createFixedStepItems(score, len, lm); section->itemStep = len > 1 ? start[1] - start[0] : 0; } else if (type == bwgTypeVariableStep) { section->items.variableStepPacked = createVariableStepItems(start, score, len, lm); } else section->items.bedGraphList = createBedGraphItems(start, width, score, len, lm); section->itemCount = len; return section; } static struct bwgSection * createBWGSection_Atomic(const char *seq, int start, double *score, int len, struct lm *lm) { struct bwgSection *section; lmAllocVar(lm, section); section->chrom = (char *)seq; section->start = start; section->end = start + len - 1; section->type = bwgTypeFixedStep; section->itemSpan = 1; section->items.fixedStepPacked = createFixedStepItems(score, len, lm); section->itemStep = 1; section->itemCount = len; return section; } static int itemsPerSlot = 512; static int blockSize = 1024; static void BWGSectionList_addRle(struct bwgSection **sections, const char *seq, SEXP r_ranges, double *score, enum bwgSectionType type, struct lm *lm) { int numLeft = get_IRanges_length(r_ranges); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); while(numLeft) { int numSection = numLeft > itemsPerSlot ? itemsPerSlot : numLeft; numLeft -= numSection; slAddHead(sections, createBWGSection_Rle(seq, start, width, score, numSection, type, lm)); start += numSection; width += numSection; score += numSection; } } static void BWGSectionList_addAtomic(struct bwgSection **sections, const char *seq, double *score, int num, struct lm *lm) { int numLeft = num; while(numLeft) { int numSection = numLeft > itemsPerSlot ? itemsPerSlot : numLeft; slAddHead(sections, createBWGSection_Atomic(seq, num - numLeft, score, numSection, lm)); score += numSection; numLeft -= numSection; } } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_add(SEXP r_sections, SEXP r_seq, SEXP r_ranges, SEXP r_score, SEXP r_format) { struct bwgSection *sections = NULL; const char *seq = CHAR(asChar(r_seq)); double *score = REAL(r_score); const char *format = CHAR(asChar(r_format)); SEXP ans; struct lm *lm; enum bwgSectionType type = bwgTypeBedGraph; if (sameString(format, "fixedStep")) type = bwgTypeFixedStep; else if (sameString(format, "variableStep")) type = bwgTypeVariableStep; if (r_sections != R_NilValue) { sections = R_ExternalPtrAddr(r_sections); lm = R_ExternalPtrAddr(R_ExternalPtrTag(r_sections)); } else lm = lmInit(0); pushRHandlers(); if (r_ranges != R_NilValue) { BWGSectionList_addRle(§ions, seq, r_ranges, score, type, lm); } else { BWGSectionList_addAtomic(§ions, seq, score, length(r_score), lm); } popRHandlers(); PROTECT(ans = R_MakeExternalPtr(sections, R_NilValue, R_NilValue)); R_SetExternalPtrTag(ans, R_MakeExternalPtr(lm, R_NilValue, R_NilValue)); UNPROTECT(1); return ans; } static struct hash *createIntHash(SEXP v) { struct hash *hash = hashNew(0); SEXP names = getAttrib(v, R_NamesSymbol); for (int i = 0; i < length(v); i++) hashAddInt(hash, (char *)CHAR(STRING_ELT(names, i)), INTEGER(v)[i]); return hash; } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_write(SEXP r_sections, SEXP r_seqlengths, SEXP r_compress, SEXP r_file) { struct bwgSection *sections = NULL; struct hash *lenHash = createIntHash(r_seqlengths); if (r_sections != R_NilValue) { sections = R_ExternalPtrAddr(r_sections); slReverse(§ions); } pushRHandlers(); bwgCreate(sections, lenHash, blockSize, itemsPerSlot, asLogical(r_compress), FALSE /*keepAllChromosomes*/, TRUE /*fixedSummaries*/, (char *)CHAR(asChar(r_file))); freeHash(&lenHash); popRHandlers(); return r_file; } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_cleanup(SEXP r_sections) { pushRHandlers(); if (r_sections != R_NilValue) { struct lm *lm = R_ExternalPtrAddr(R_ExternalPtrTag(r_sections)); lmCleanup(&lm); } popRHandlers(); return R_NilValue; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_seqlengths(SEXP r_filename) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); struct bbiChromInfo *chromList = bbiChromList(file); struct bbiChromInfo *chrom = chromList; SEXP seqlengths, seqlengthNames; PROTECT(seqlengths = allocVector(INTSXP, slCount(chromList))); seqlengthNames = allocVector(STRSXP, length(seqlengths)); setAttrib(seqlengths, R_NamesSymbol, seqlengthNames); for(int i = 0; i < length(seqlengths); i++) { INTEGER(seqlengths)[i] = chrom->size; SET_STRING_ELT(seqlengthNames, i, mkChar(chrom->name)); chrom = chrom->next; } bbiFileClose(&file); bbiChromInfoFreeList(&chromList); popRHandlers(); UNPROTECT(1); return seqlengths; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_query(SEXP r_filename, SEXP r_ranges, SEXP r_return_score, SEXP r_return_list) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); SEXP chromNames = getAttrib(r_ranges, R_NamesSymbol); int nchroms = length(r_ranges); Rboolean return_list = asLogical(r_return_list); SEXP rangesList, rangesListEls, dataFrameList, dataFrameListEls, ans; SEXP numericListEls; bool returnScore = asLogical(r_return_score); const char *var_names[] = { "score", "" }; struct lm *lm = lmInit(0); struct bbiInterval *hits = NULL; struct bbiInterval *qhits = NULL; if (return_list) { int n_ranges = 0; for(int i = 0; i < nchroms; i++) { SEXP localRanges = VECTOR_ELT(r_ranges, i); n_ranges += get_IRanges_length(localRanges); } PROTECT(numericListEls = allocVector(VECSXP, n_ranges)); } else { PROTECT(rangesListEls = allocVector(VECSXP, nchroms)); setAttrib(rangesListEls, R_NamesSymbol, chromNames); PROTECT(dataFrameListEls = allocVector(VECSXP, nchroms)); setAttrib(dataFrameListEls, R_NamesSymbol, chromNames); } int elt_len = 0; for (int i = 0; i < nchroms; i++) { SEXP localRanges = VECTOR_ELT(r_ranges, i); int nranges = get_IRanges_length(localRanges); int *start = INTEGER(get_IRanges_start(localRanges)); int *width = INTEGER(get_IRanges_width(localRanges)); for (int j = 0; j < nranges; j++) { struct bbiInterval *queryHits = bigWigIntervalQuery(file, (char *)CHAR(STRING_ELT(chromNames, i)), start[j] - 1, start[j] - 1 + width[j], lm); /* IntegerList */ if (return_list) { qhits = queryHits; int nqhits = slCount(queryHits); SEXP ans_numeric; PROTECT(ans_numeric = allocVector(REALSXP, width[j])); memset(REAL(ans_numeric), 0, sizeof(double) * width[j]); for (int k = 0; k < nqhits; k++, qhits = qhits->next) { for (int l = qhits->start; l < qhits->end; l++) REAL(ans_numeric)[(l - start[j] + 1)] = qhits->val; } SET_VECTOR_ELT(numericListEls, elt_len, ans_numeric); elt_len++; UNPROTECT(1); } slReverse(&queryHits); hits = slCat(queryHits, hits); } /* RangedData */ if (!return_list) { int nhits = slCount(hits); slReverse(&hits); SEXP ans_start, ans_width, ans_score, ans_score_l; PROTECT(ans_start = allocVector(INTSXP, nhits)); PROTECT(ans_width = allocVector(INTSXP, nhits)); if (returnScore) { PROTECT(ans_score_l = mkNamed(VECSXP, var_names)); ans_score = allocVector(REALSXP, nhits); SET_VECTOR_ELT(ans_score_l, 0, ans_score); } else { PROTECT(ans_score_l = mkNamed(VECSXP, var_names + 1)); } for (int j = 0; j < nhits; j++, hits = hits->next) { INTEGER(ans_start)[j] = hits->start + 1; INTEGER(ans_width)[j] = hits->end - hits->start; if (returnScore) REAL(ans_score)[j] = hits->val; } SET_VECTOR_ELT(rangesListEls, i, new_IRanges("IRanges", ans_start, ans_width, R_NilValue)); SET_VECTOR_ELT(dataFrameListEls, i, new_DataFrame("DataFrame", ans_score_l, R_NilValue, ScalarInteger(nhits))); UNPROTECT(3); } } bbiFileClose(&file); if (return_list) { ans = new_SimpleList("SimpleList", numericListEls); UNPROTECT(1); } else { PROTECT(dataFrameList = new_SimpleList("SimpleSplitDataFrameList", dataFrameListEls)); PROTECT(rangesList = new_SimpleList("SimpleRangesList", rangesListEls)); ans = new_RangedData("RangedData", rangesList, dataFrameList); UNPROTECT(4); } lmCleanup(&lm); popRHandlers(); return ans; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); enum bbiSummaryType type = bbiSummaryTypeFromString((char *)CHAR(asChar(r_type))); double default_value = asReal(r_default_value); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); SEXP ans; PROTECT(ans = allocVector(VECSXP, length(r_chrom))); for (int i = 0; i < length(r_chrom); i++) { int size = INTEGER(r_size)[i]; char *chrom = (char *)CHAR(STRING_ELT(r_chrom, i)); SEXP r_values = allocVector(REALSXP, size); double *values = REAL(r_values); for (int j = 0; j < size; j++) values[j] = default_value; SET_VECTOR_ELT(ans, i, r_values); bool success = bigWigSummaryArray(file, chrom, start[i] - 1, start[i] - 1 + width[i], type, size, values); if (!success) warning("Failed to summarize range %d (%s:%d-%d)", i, chrom, start[i], start[i] - 1 + width[i]); } bbiFileClose(&file); popRHandlers(); UNPROTECT(1); return ans; } #include "ucsc/verbose.h" SEXP BWGFile_fromWIG(SEXP r_infile, SEXP r_seqlengths, SEXP r_outfile) { pushRHandlers(); struct lm *lm = lmInit(0); struct hash *lenHash = createIntHash(r_seqlengths); struct bwgSection *sections = bwgParseWig((char *)CHAR(asChar(r_infile)), FALSE, lenHash, itemsPerSlot, lm); bwgCreate(sections, lenHash, blockSize, itemsPerSlot, TRUE, TRUE, TRUE, (char *)CHAR(asChar(r_outfile))); lmCleanup(&lm); freeHash(&lenHash); popRHandlers(); return r_outfile; } rtracklayer/src/bigWig.h0000644000175100017510000000135312612032142016260 0ustar00biocbuildbiocbuild#ifndef BIG_WIG_H #define BIG_WIG_H #include "rtracklayer.h" /* The .Call entry points */ SEXP BWGSectionList_add(SEXP r_sections, SEXP r_seq, SEXP r_ranges, SEXP r_score, SEXP r_format); SEXP BWGSectionList_write(SEXP r_sections, SEXP r_seqlengths, SEXP r_compress, SEXP r_file); SEXP BWGSectionList_cleanup(SEXP r_sections); SEXP BWGFile_query(SEXP r_filename, SEXP r_ranges, SEXP r_colnames, SEXP r_int_ranges); SEXP BWGFile_seqlengths(SEXP r_filename); SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value); SEXP BWGFile_fromWIG(SEXP r_infile, SEXP r_outfile, SEXP r_seqlengths); #endif rtracklayer/src/chain_io.c0000644000175100017510000001423612612032142016620 0ustar00biocbuildbiocbuild#include #include "ucsc/common.h" #include "ucsc/hash.h" #include "rtracklayer.h" #define LINEBUF_SIZE 20001 /* hash these chain blocks by target and query name */ typedef struct _ChainBlock { char *name; IntPairAE *ranges; /* to become an IRanges */ IntAE *offset; /* starts in the other sequence */ /* rle of spaces and scores */ IntAE *length, *score; CharAE *rev; /* use CharAE until we have a bitset */ CharAEAE *space; } ChainBlock; #define HEADER_SIZE 11 #define DATA_SIZE 3 /* returns an array of ChainBlock pointers */ ChainBlock **read_chain_file(FILE *stream, const char *exclude, int *nblocks) { /* fgets() a line if first or after blank, parse header get names, use hash table to get existing block, ow create one add score, get offsets for starts ow parse a record for width, tstart, qstart */ char linebuf[LINEBUF_SIZE]; char *header[HEADER_SIZE]; char *data[DATA_SIZE]; int tstart, qstart; Rboolean new_block = TRUE, excluded = FALSE, trc, qrc; ChainBlock *block, **result; struct hash *hash = hashNew(6); struct hashEl *hash_elements; int line = 0, i = 0, header_line; while (fgets(linebuf, LINEBUF_SIZE, stream) != NULL) { line++; if (strlen(linebuf) == LINEBUF_SIZE - 1) { error("line %d is too long", line); } if (excluded) { eraseWhiteSpace(linebuf); if (!strlen(linebuf)) { excluded = FALSE; new_block = TRUE; } } else if (new_block) { /* have a header */ void *value; int matches = chopByChar(linebuf, ' ', header, HEADER_SIZE); if (matches < HEADER_SIZE) error("expected %d elements in header, got %d, on line %d", HEADER_SIZE, matches, line); new_block = FALSE; if (exclude && (strstr(header[2], exclude) || strstr(header[7], exclude))) { //Rprintf("excluding: [%s -> %s]\n", header[2], header[7]); excluded = TRUE; continue; } value = hashFindVal(hash, header[2]); if (!value) { /* new block */ int name_size = strlen(header[2])+1; block = Salloc(1, ChainBlock); hashAdd(hash, header[2], block); block->name = Salloc(name_size, char); memcpy(block->name, header[2], name_size); block->ranges = new_IntPairAE(0, 0); block->offset = new_IntAE(0, 0, 0); block->length = new_IntAE(0, 0, 0); block->score = new_IntAE(0, 0, 0); block->rev = new_CharAE(0); block->space = new_CharAEAE(0, 0); } else block = value; IntAE_insert_at(block->score, IntAE_get_nelt(block->score), atoi(header[1])); append_string_to_CharAEAE(block->space, header[7]); header_line = line; trc = strcmp("+", header[4]); qrc = strcmp("+", header[9]); CharAE_insert_at(block->rev, CharAE_get_nelt(block->rev), trc != qrc); tstart = atoi(header[5]) + 1; /* 0-based -> 1-based */ if (trc) tstart = atoi(header[3]) - tstart + 2; /* start one too high */ qstart = atoi(header[10]) + 1; if (qrc) qstart = atoi(header[8]) - qstart + 2; } else { int matches = chopByChar(linebuf, '\t', data, DATA_SIZE), width; if (matches != 1 && matches != 3) error("expecting 1 or 3 elements on line %d, got %d", line, matches); width = atoi(data[0]); tstart -= (trc ? width : 0); qstart -= (qrc ? width : 0); IntPairAE_insert_at(block->ranges, IntPairAE_get_nelt(block->ranges), tstart, width); IntAE_insert_at(block->offset, IntAE_get_nelt(block->offset), tstart - qstart); if (matches == 3) { /* normal line */ int dt = atoi(data[1]), dq = atoi(data[2]); int tchange, qchange; if (trc) /* width already subtracted above */ tchange = -dt; else tchange = width + dt; tstart += tchange; if (qrc) qchange = -dq; else qchange = width + dq; qstart += qchange; } else { new_block = TRUE; IntAE_insert_at(block->length, IntAE_get_nelt(block->length), line-header_line); //Rprintf("end of %s block, line: %d\n", block->name, line); fgets(linebuf, LINEBUF_SIZE, stream); /* skip empty line */ line++; } } } result = Salloc(hashNumEntries(hash), ChainBlock *); hash_elements = hashElListHash(hash); for (struct hashEl *h = hash_elements; h; h = h->next, i++) { result[i] = h->val; } *nblocks = i; hashElFreeList(&hash_elements); hashFree(&hash); return result; } /* parse the chain file format from UCSC for representing alignments */ SEXP readChain(SEXP r_path, SEXP r_exclude) { const char *path, *exclude; FILE *stream; SEXP ans, ans_names, ans_listData, chain_class, chainBlock_class; ChainBlock **chains; int i, nblocks; path = translateChar(STRING_ELT(r_path, 0)); if ((stream = fopen(path, "r")) == NULL) error("cannot open file '%s'", path); exclude = r_exclude == R_NilValue ? NULL : CHAR(STRING_ELT(r_exclude, 0)); chains = read_chain_file(stream, exclude, &nblocks); PROTECT(chain_class = MAKE_CLASS("Chain")); PROTECT(chainBlock_class = MAKE_CLASS("ChainBlock")); PROTECT(ans = NEW_OBJECT(chain_class)); ans_listData = allocVector(VECSXP, nblocks); SET_SLOT(ans, install("listData"), ans_listData); ans_names = allocVector(STRSXP, nblocks); SET_NAMES(ans_listData, ans_names); for (i = 0; i < nblocks; i++) { SEXP block; block = NEW_OBJECT(chainBlock_class); SET_VECTOR_ELT(ans_listData, i, block); SET_SLOT(block, install("ranges"), new_IRanges_from_IntPairAE("IRanges", chains[i]->ranges)); SET_SLOT(block, install("offset"), new_INTEGER_from_IntAE(chains[i]->offset)); SET_SLOT(block, install("length"), new_INTEGER_from_IntAE(chains[i]->length)); SET_SLOT(block, install("score"), new_INTEGER_from_IntAE(chains[i]->score)); SET_SLOT(block, install("space"), new_CHARACTER_from_CharAEAE(chains[i]->space)); SET_SLOT(block, install("reversed"), new_LOGICAL_from_CharAE(chains[i]->rev)); SET_STRING_ELT(ans_names, i, mkChar(chains[i]->name)); } UNPROTECT(3); return ans; } rtracklayer/src/handlers.c0000644000175100017510000000077112612032142016646 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/errAbort.h" #include "handlers.h" #define WARN_BUF_SIZE 512 static void R_warnHandler(char *format, va_list args) { char warn_buf[WARN_BUF_SIZE]; vsnprintf(warn_buf, WARN_BUF_SIZE, format, args); warning(warn_buf); } static void R_abortHandler() { error("UCSC library operation failed"); } void pushRHandlers() { pushAbortHandler(R_abortHandler); pushWarnHandler(R_warnHandler); } void popRHandlers() { popAbortHandler(); popWarnHandler(); } rtracklayer/src/handlers.h0000644000175100017510000000016412612032142016647 0ustar00biocbuildbiocbuild#ifndef HANDLERS_H #define HANDLERS_H #include "rtracklayer.h" void pushRHandlers(); void popRHandlers(); #endif rtracklayer/src/readGFF.c0000644000175100017510000007705212612032142016312 0ustar00biocbuildbiocbuild#include "XVector_interface.h" #include "S4Vectors_interface.h" #include /* for R_ReadConnection() */ #include /* for isdigit() and isspace() */ #include /* for strtod() */ #include /* for memcpy() and memcmp() */ /* #include static clock_t clock0; static void init_clock(const char *msg) { printf("%s", msg); clock0 = clock(); } static void print_elapsed_time() { printf("%8.6f s\n", ((double) clock() - clock0) / CLOCKS_PER_SEC); } */ /**************************************************************************** * filexp_gets2(): A version of filexp_gets() that also works on connections */ Rconnection getConnection(int n); /* not in , why? */ static char con_buf[25000]; static int con_buf_len, con_buf_offset; static void init_con_buf() { con_buf_len = con_buf_offset = 0; return; } static int filexp_gets2(SEXP filexp, char *buf, int buf_size, int *EOL_in_buf) { Rconnection con; int buf_offset; char c; if (TYPEOF(filexp) == EXTPTRSXP) return filexp_gets(filexp, buf, buf_size, EOL_in_buf); buf_offset = *EOL_in_buf = 0; while (buf_offset < buf_size - 1) { if (con_buf_offset == con_buf_len) { con = getConnection(asInteger(filexp)); con_buf_len = (int) R_ReadConnection(con, con_buf, sizeof(con_buf) / sizeof(char)); if (con_buf_len == 0) break; con_buf_offset = 0; } c = con_buf[con_buf_offset++]; buf[buf_offset++] = c; if (c == '\n') { *EOL_in_buf = 1; break; } } buf[buf_offset] = '\0'; if (buf_offset == 0) return 0; if (con_buf_len == 0 || *EOL_in_buf) return 2; return 1; } /**************************************************************************** * Buffer of tags */ #define MAX_COLLECTED_TAGS 4096 typedef struct tags_buf { CharAEAE *collected_tags; /* used in COLLECT MODE */ SEXP tags; /* used in LOAD MODE */ /* We use a hash table for fast mapping of the tags to their corresponding column in the output of readGFF(). */ struct htab htab; } TagsBuf; #define IN_COLLECT_MODE(tags_buf) ((tags_buf)->collected_tags != NULL) /* Copied from R_HOME/src/main/envir.c */ static unsigned int char_hash(const char *s, int len) { /* djb2 as from http://www.cse.yorku.ca/~oz/hash.html */ int i; unsigned int h = 5381; for (i = 0; i < len; i++) h = ((h << 5) + h) + (*s); return h; } static int TagsBuf_get_bucket_idx(const TagsBuf *tags_buf, const char *tag, int tag_len) { unsigned int hval; int bucket_idx, M, i2; const int *buckets; const CharAE *tag_ae; SEXP tags_elt; hval = char_hash(tag, tag_len); bucket_idx = hval & tags_buf->htab.Mminus1; buckets = tags_buf->htab.buckets; M = tags_buf->htab.M; while ((i2 = buckets[bucket_idx]) != NA_INTEGER) { if (IN_COLLECT_MODE(tags_buf)) { /* COLLECT MODE */ tag_ae = tags_buf->collected_tags->elts[i2]; if (CharAE_get_nelt(tag_ae) == tag_len && memcmp(tag_ae->elts, tag, tag_len) == 0) break; } else { /* LOAD MODE */ tags_elt = STRING_ELT(tags_buf->tags, i2); if (LENGTH(tags_elt) == tag_len && memcmp(CHAR(tags_elt), tag, tag_len) == 0) break; } bucket_idx = (bucket_idx + 1) % M; } return bucket_idx; } static int TagsBuf_get_bucket_val(const TagsBuf *tags_buf, int bucket_idx) { return get_hbucket_val(&(tags_buf->htab), bucket_idx); } static void TagsBuf_set_bucket_val(TagsBuf *tags_buf, int bucket_idx, int val) { set_hbucket_val(&(tags_buf->htab), bucket_idx, val); return; } static void init_tags_buf_in_COLLECT_MODE(TagsBuf *tags_buf) { tags_buf->collected_tags = new_CharAEAE(MAX_COLLECTED_TAGS, 0); tags_buf->tags = R_NilValue; tags_buf->htab = new_htab(MAX_COLLECTED_TAGS); return; } /* The tags in 'tags' must be unique. */ static void init_tags_buf_in_LOAD_MODE(TagsBuf *tags_buf, SEXP tags) { int ntag, i, tag_len, bucket_idx, bucket_val; SEXP tags_elt; const char *tag; tags_buf->collected_tags = NULL; tags_buf->tags = tags; ntag = LENGTH(tags); tags_buf->htab = new_htab(ntag); for (i = 0; i < ntag; i++) { tags_elt = STRING_ELT(tags, i); if (tags_elt == NA_STRING) error("'tags' cannot contain NAs"); tag = CHAR(tags_elt); tag_len = LENGTH(tags_elt); bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); bucket_val = TagsBuf_get_bucket_val(tags_buf, bucket_idx); if (bucket_val != NA_INTEGER) error("'tags' cannot contain duplicates"); TagsBuf_set_bucket_val(tags_buf, bucket_idx, i); } return; } static void collect_tag(TagsBuf *tags_buf, const char *tag, int tag_len) { int bucket_idx, bucket_val; int i; CharAE *ae; /* We want to store unique tags in 'tags_buf' so we first check to see if 'tag' is already stored and we don't do anything if it is. */ bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); bucket_val = TagsBuf_get_bucket_val(tags_buf, bucket_idx); if (bucket_val != NA_INTEGER) return; /* 'tag' was found ==> nothing to do */ /* 'tag' was not found ==> add it */ i = CharAEAE_get_nelt(tags_buf->collected_tags); if (i >= MAX_COLLECTED_TAGS) error("GFF files with more than %d tags are not supported", MAX_COLLECTED_TAGS); TagsBuf_set_bucket_val(tags_buf, bucket_idx, i); ae = new_CharAE(tag_len); CharAE_set_nelt(ae, tag_len); memcpy(ae->elts, tag, tag_len); CharAEAE_insert_at(tags_buf->collected_tags, i, ae); return; } static int match_tag(const TagsBuf *tags_buf, const char *tag, int tag_len) { int bucket_idx; bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); return TagsBuf_get_bucket_val(tags_buf, bucket_idx); } static SEXP get_collected_tags(const TagsBuf *tags_buf) { if (tags_buf == NULL || !IN_COLLECT_MODE(tags_buf)) return R_NilValue; return new_CHARACTER_from_CharAEAE(tags_buf->collected_tags); } /**************************************************************************** * gff_colnames() * * See http://www.sequenceontology.org/resources/gff3.html for the official * GFF3 specs. */ static const char *col_names[] = { "seqid", "source", "type", "start", "end", "score", "strand", "phase", "attributes" /* "group" for GFF1 */ }; static const SEXPTYPE col_types[] = { STRSXP, /* seqid */ STRSXP, /* source */ STRSXP, /* type */ INTSXP, /* start */ INTSXP, /* end */ REALSXP, /* score */ STRSXP, /* strand */ INTSXP, /* phase */ STRSXP /* attributes */ }; #define GFF_NCOL ((int) (sizeof(col_names) / sizeof(char *))) #define SEQID_IDX 0 #define SOURCE_IDX 1 #define TYPE_IDX 2 #define START_IDX 3 #define END_IDX 4 #define SCORE_IDX 5 #define STRAND_IDX 6 #define PHASE_IDX 7 #define ATTRIBUTES_IDX 8 static const char *gff_colname(int col_idx, int gff1) { if (col_idx == ATTRIBUTES_IDX && gff1) return "group"; return col_names[col_idx]; } /* --- .Call ENTRY POINT --- */ SEXP gff_colnames(SEXP GFF1) { SEXP ans, ans_elt; int col_idx; const char *colname; PROTECT(ans = NEW_CHARACTER(GFF_NCOL)); for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { colname = gff_colname(col_idx, LOGICAL(GFF1)[0]); PROTECT(ans_elt = mkChar(colname)); SET_STRING_ELT(ans, col_idx, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } /**************************************************************************** * read_gff_pragmas(), scan_gff(), and load_gff() */ /* * Turn string pointed by 'val' into an int. The string has no terminating * null byte ('\0') and must have the following format: * ^[[:space:]]*[+-]?[[:digit:]]+[[:space:]]*$ * Return NA_INTEGER if the string is malformed or if it represents a integer * value that cannot be represented by an int (int overflow). * TODO: Maybe implement this on top of strtol(). Would be much simpler but * would it be equivalent? Also would it be as fast? See how as_double() below * is implemented on top of strtod(). */ #define LEADING_SPACE 0 #define NUMBER 1 #define TRAILING_SPACE 2 static int as_int(const char *val, int val_len) { int n, ndigit, sign, state, i; char c; n = ndigit = 0; sign = 1; state = LEADING_SPACE; for (i = 0; i < val_len; i++) { c = val[i]; if (isdigit(c)) { if (state == TRAILING_SPACE) return NA_INTEGER; /* malformed string */ state = NUMBER; ndigit++; n = safe_int_mult(n, 10); n = safe_int_add(n, c - '0'); if (n == NA_INTEGER) return NA_INTEGER; /* int overflow */ continue; } if (c == '+' || c == '-') { if (state != LEADING_SPACE) return NA_INTEGER; /* malformed string */ state = NUMBER; if (c == '-') sign = -1; continue; } if (!isspace(c)) return NA_INTEGER; /* malformed string */ if (state == NUMBER) { if (ndigit == 0) return NA_INTEGER; /* malformed string */ state = TRAILING_SPACE; } } if (ndigit == 0) return NA_INTEGER; /* malformed string */ if (sign == -1) n = -n; return n; } static double as_double(const char *val, int val_len) { double x; char *end_conversion, c; int end_offset, i; x = strtod(val, &end_conversion); end_offset = end_conversion - val; if (end_offset == 0) return NA_REAL; for (i = end_offset; i < val_len; i++) { c = val[i]; if (!isspace(c)) return NA_REAL; } return x; } static int prepare_colmap0(int *colmap0, SEXP colmap) { int ans_ncol0, col_idx, j; ans_ncol0 = 0; for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { j = INTEGER(colmap)[col_idx]; if (j != NA_INTEGER) { if (j > ans_ncol0) ans_ncol0 = j; j--; } colmap0[col_idx] = j; } return ans_ncol0; } static SEXP alloc_ans(int ans_nrow, int ans_ncol0, const int *colmap0, SEXP tags, SEXP pragmas, SEXP attrcol_fmt, SEXP raw_data) { int ans_ntag, ans_ncol, gff1, is_raw, col_idx, j, i; SEXP ans, ans_attr, ans_names, ans_col, ans_colname, tags_elt; SEXPTYPE col_type; const char *colname; ans_ntag = LENGTH(tags); ans_ncol = ans_ncol0 + ans_ntag; gff1 = INTEGER(attrcol_fmt)[0] == 1; is_raw = LOGICAL(raw_data)[0]; PROTECT(ans = NEW_LIST(ans_ncol)); PROTECT(ans_names = NEW_CHARACTER(ans_ncol)); /* Alloc standard GFF columns. */ for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { j = colmap0[col_idx]; if (j == NA_INTEGER) continue; col_type = is_raw ? STRSXP : col_types[col_idx]; PROTECT(ans_col = allocVector(col_type, ans_nrow)); SET_ELEMENT(ans, j, ans_col); UNPROTECT(1); colname = gff_colname(col_idx, gff1); PROTECT(ans_colname = mkChar(colname)); SET_STRING_ELT(ans_names, j, ans_colname); UNPROTECT(1); j++; } /* Alloc tag columns. */ for (j = ans_ncol0; j < ans_ncol; j++) { PROTECT(ans_col = NEW_CHARACTER(ans_nrow)); for (i = 0; i < ans_nrow; i++) SET_STRING_ELT(ans_col, i, NA_STRING); SET_ELEMENT(ans, j, ans_col); UNPROTECT(1); tags_elt = STRING_ELT(tags, j - ans_ncol0); PROTECT(ans_colname = duplicate(tags_elt)); SET_STRING_ELT(ans_names, j, ans_colname); UNPROTECT(1); } SET_NAMES(ans, ans_names); UNPROTECT(1); /* list_as_data_frame() performs IN-PLACE coercion */ list_as_data_frame(ans, ans_nrow); /* Set additional attributes. */ PROTECT(ans_attr = duplicate(pragmas)); SET_ATTR(ans, install("pragmas"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = duplicate(attrcol_fmt)); SET_ATTR(ans, install("attrcol_fmt"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = ScalarInteger(ans_ncol0)); SET_ATTR(ans, install("ncol0"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = ScalarInteger(ans_ntag)); SET_ATTR(ans, install("ntag"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = duplicate(raw_data)); SET_ATTR(ans, install("raw_data"), raw_data); UNPROTECT(1); UNPROTECT(1); return ans; } static void load_string(const char *data, int data_len, SEXP ans_col, int row_idx) { SEXP tmp; PROTECT(tmp = mkCharLen(data, data_len)); SET_STRING_ELT(ans_col, row_idx, tmp); UNPROTECT(1); return; } static void load_int(const char *data, int data_len, SEXP ans_col, int row_idx) { INTEGER(ans_col)[row_idx] = as_int(data, data_len); return; } static void load_double(const char *data, int data_len, SEXP ans_col, int row_idx) { REAL(ans_col)[row_idx] = as_double(data, data_len); return; } static void load_data(const char *data, int data_len, SEXP ans, int row_idx, int col_idx, const int *colmap0) { SEXP ans_col; int is_raw; SEXPTYPE col_type; ans_col = VECTOR_ELT(ans, colmap0[col_idx]); is_raw = LOGICAL(GET_ATTR(ans, install("raw_data")))[0]; if (is_raw) { load_string(data, data_len, ans_col, row_idx); return; } col_type = col_types[col_idx]; switch (col_type) { case STRSXP: if (data_len == 1) { if (col_idx == STRAND_IDX && (data[0] == '.' || data[0] == '?')) { data = "*"; data_len = 1; } else if (data[0] == '.') { SET_STRING_ELT(ans_col, row_idx, NA_STRING); break; } } load_string(data, data_len, ans_col, row_idx); break; case INTSXP: load_int(data, data_len, ans_col, row_idx); break; case REALSXP: load_double(data, data_len, ans_col, row_idx); break; } return; } static void load_tagval(const char *tag, int tag_len, const char *val, int val_len, SEXP ans, int row_idx, const TagsBuf *tags_buf) { int j; SEXP ans_col; j = match_tag(tags_buf, tag, tag_len); if (j == NA_INTEGER) return; /* 'tag' was not found ==> nothing to do */ j += INTEGER(GET_ATTR(ans, install("ncol0")))[0]; ans_col = VECTOR_ELT(ans, j); load_string(val, val_len, ans_col, row_idx); return; } #define IOBUF_SIZE 65536 static char errmsg_buf[200]; /* * We use a heuristic to detect the format of the "attributes" col. * Terminology: * - Chunks in 'data' separated by ';' are called units. * - A unit with only white-space characters is called a "white" unit. * - A "tag-like word" is a sequence of contiguous non-white-space characters * with no '=' in it. * - A unit made of one "tag-like word" (possibly surrounded by white-space * characters) is called a "tag-only" unit. * Heuristic: * (a) If 'data' contains only 1 unit (i.e. no ';' in it), * then: * - if it's "white" -> return UNKNOWN_FMT * - if it's "tag-only" -> return GFF1_FMT * - otherwise -> (c) below applies. * (b) If 'data' contains > 1 units (i.e. at least 1 ';' in it), then the * format can't be GFF1_FMT anymore so we have to choose between GFF2_FMT * and GFF3_FMT. For that matter "white" and "tag-only" units are * considered uninformative so we skip them. If all units are * uninformative then we return UNKNOWN_FMT. Otherwise the first * informative unit is used and (c) below applies. * (c) Now we're looking at a unit that is not "white" or "tag-only" and * want to be able to tell whether its format is GFF2_FMT or GFF3_FMT * (UNKNOWN_FMT or GFF1_FMT are not an option anymore). The rule is: if * the unit contains a '=' and if this '=' is preceded by one * "tag-like word" only (possibly surrounded by white-space characters) * then the format is GFF3_FMT. Otherwise it's GFF2_FMT. * Examples: * data detected format * |ID=4|----------------> GFF3_FMT * | ID = 4 |--------> GFF3_FMT * |=|-------------------> GFF3_FMT * | = 4 |---------> GFF3_FMT * | = ID 4 |-------> GFF3_FMT * |ID 4|----------------> GFF2_FMT * | ID 4 |----------> GFF2_FMT * |X Y=4|---------------> inherently ambiguous (could be GFF2 or GFF3) but * our heuristic returns GFF2_FMT (tag is "X" and * value is "Y=4") * |XY z =|--------------> GFF2_FMT (tag is "XY" and value is "z =") * |; ;ID=4;Parent 12|---> GFF3_FMT (we look at the 1st informative unit) * |; ;ID 4;Parent=12|---> GFF2_FMT (we look at the 1st informative unit) * |99|------------------> GFF1_FMT * ||--------------------> UNKNOWN_FMT * | |-----------------> UNKNOWN_FMT * | ; 99 ; |----------> UNKNOWN_FMT * |99; ID = 4|---------> GFF3_FMT */ #define UNKNOWN_FMT 0 #define GFF1_FMT 1 #define GFF2_FMT 2 #define GFF3_FMT 3 #define FIRST_SPACE 0 #define FIRST_WORD 1 #define SECOND_SPACE 2 static int detect_attrcol_fmt(const char *data, int data_len) { int nsep, state, i; char c; nsep = 0; state = FIRST_SPACE; for (i = 0; i < data_len; i++) { c = data[i]; if (isspace(c)) { if (state == FIRST_WORD) state = SECOND_SPACE; continue; } if (c == ';') { nsep++; /* We came to the end of a unit that was "white" (i.e. current state is FIRST_SPACE) or "tag-only" (i.e. current state is FIRST_WORD or SECOND_SPACE). This is considered uninformative i.e. it didn't allow us to decide between GFF2_FMT and GFF3_FMT (see (b) above). */ state = FIRST_SPACE; continue; } if (c == '=') return GFF3_FMT; if (state == SECOND_SPACE) return GFF2_FMT; if (state == FIRST_SPACE) state = FIRST_WORD; } if (nsep == 0 && state != FIRST_SPACE) return GFF1_FMT; return UNKNOWN_FMT; } static void parse_GFF3_tagval(const char *tagval, int tagval_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { int tag_len, val_len; char c; const char *val; /* Compute 'tag_len'. */ for (tag_len = 0; tag_len < tagval_len; tag_len++) { c = tagval[tag_len]; if (c == '=') break; } /* If 'tagval' is not in the "tag=value" format then we ignore it. */ if (tag_len >= tagval_len) return; if (ans != R_NilValue) { val = tagval + tag_len + 1; val_len = tagval_len - tag_len - 1; load_tagval(tagval, tag_len, val, val_len, ans, row_idx, tags_buf); return; } if (tags_buf != NULL && IN_COLLECT_MODE(tags_buf)) collect_tag(tags_buf, tagval, tag_len); return; } /* * It seems that embedded double-quotes might be allowed in the value part of * the tag value pairs of a GFF2 file, and that they are represented with 2 * consecutive double-quotes. To handle them properly, we should replace the * 2 double-quotes by only 1, but this would require to generate a (shrinked) * copy of 'val'. So for now we don't do this and just leave the 2 consecutive * double-quotes in 'val' as-is, and attach an attribute to 'ans' to indicate * that we've found embedded double-quotes. We also issue a warning. If we ever * get that warning on real-world files, then we'll revisit this. */ static void check_for_embedded_dblquotes(const char *val, int val_len, SEXP ans) { SEXP has_embedded_quotes; int i, j; has_embedded_quotes = GET_ATTR(ans, install("has_embedded_quotes")); if (!isNull(has_embedded_quotes) && LOGICAL(has_embedded_quotes)[0]) return; for (i = 0, j = 1; j < val_len; i++, j++) { if (val[i] == '"' && val[j] == '"') break; } if (j >= val_len) return; PROTECT(has_embedded_quotes = ScalarLogical(1)); SET_ATTR(ans, install("has_embedded_quotes"), has_embedded_quotes); UNPROTECT(1); warning("the value part of some of the tag value pairs " "contains embedded double-quotes"); return; } static void parse_GFF2_tagval(const char *tagval, int tagval_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { int i, tag_len, val_len; char c; const char *val; /* Trim leading space. */ for (i = 0; i < tagval_len; i++) { c = tagval[i]; if (!isspace(c)) break; } tagval += i; tagval_len -= i; /* Compute 'tag_len'. */ for (tag_len = 0; tag_len < tagval_len; tag_len++) { c = tagval[tag_len]; if (isspace(c)) break; } /* If 'tagval' is not in the "tag value" format then we ignore it. */ if (tag_len >= tagval_len) return; if (ans != R_NilValue) { val = tagval + tag_len + 1; val_len = tagval_len - tag_len - 1; /* Trim leading space in 'val'. */ for (i = 0; i < val_len; i++) { c = val[i]; if (!isspace(c)) break; } val += i; val_len -= i; /* Trim trailing space in 'val'. */ for (i = val_len - 1; i >= 0; i--) { c = val[i]; if (!isspace(c)) break; } val_len = i + 1; /* Trim leading and trailing double-quotes in 'val'. */ if (val_len != 0 && val[0] == '"') { val++; val_len--; } if (val_len != 0 && val[val_len - 1] == '"') { val_len--; } check_for_embedded_dblquotes(val, val_len, ans); load_tagval(tagval, tag_len, val, val_len, ans, row_idx, tags_buf); return; } if (tags_buf != NULL && IN_COLLECT_MODE(tags_buf)) collect_tag(tags_buf, tagval, tag_len); return; } static void parse_GFF3_attrcol(const char *data, int data_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { const char *tagval; int tagval_len, i; char c; tagval = data; tagval_len = 0; for (i = 0; i < data_len; i++) { c = data[i]; if (c != ';') { tagval_len++; continue; } parse_GFF3_tagval(tagval, tagval_len, ans, row_idx, tags_buf); tagval = data + i + 1; tagval_len = 0; } parse_GFF3_tagval(tagval, tagval_len, ans, row_idx, tags_buf); return; } static void parse_GFF2_attrcol(const char *data, int data_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { const char *tagval; int tagval_len, in_quotes, i; char c; tagval = data; tagval_len = 0; in_quotes = 0; for (i = 0; i < data_len; i++) { c = data[i]; if (c == '"') { tagval_len++; in_quotes = !in_quotes; continue; } if (in_quotes || c != ';') { tagval_len++; continue; } parse_GFF2_tagval(tagval, tagval_len, ans, row_idx, tags_buf); tagval = data + i + 1; tagval_len = 0; } parse_GFF2_tagval(tagval, tagval_len, ans, row_idx, tags_buf); return; } static const char *set_data_holders(Chars_holder *data_holders, const char *line, int lineno) { int col_idx, i, data_len; const char *data; char c; col_idx = i = 0; data = line; data_len = 0; while ((c = line[i++])) { if (c != '\t') { data_len++; continue; } data_holders[col_idx].ptr = data; data_holders[col_idx].length = data_len; col_idx++; if (col_idx == GFF_NCOL) break; data = line + i; data_len = 0; } if (col_idx == GFF_NCOL) { /* We've seen 9 tabs but it's OK if the 9th tab is followed by white spaces only (some GTF files are like that). Otherwise we raise an error. */ while ((c = line[i++])) { if (isspace(c)) continue; snprintf(errmsg_buf, sizeof(errmsg_buf), "line %d has more than %d " "tab-separated columns", lineno, GFF_NCOL); return errmsg_buf; } } else { if (col_idx < GFF_NCOL - 2) { snprintf(errmsg_buf, sizeof(errmsg_buf), "line %d has less than %d " "tab-separated columns", lineno, GFF_NCOL - 1); return errmsg_buf; } data_len = delete_trailing_LF_or_CRLF(data, data_len); data_holders[col_idx].ptr = data; data_holders[col_idx].length = data_len; col_idx++; if (col_idx == GFF_NCOL - 1) data_holders[col_idx].length = 0; } return NULL; } static void check_filter(SEXP filter, int attrcol_fmt) { int filter_len, col_idx, nval, i; SEXP filter_elt, val; if (isNull(filter)) return; filter_len = attrcol_fmt == 1 ? GFF_NCOL : GFF_NCOL - 1; if (!(IS_LIST(filter) && LENGTH(filter) == filter_len)) error("incorrect 'filter'"); for (col_idx = 0; col_idx < filter_len; col_idx++) { filter_elt = VECTOR_ELT(filter, col_idx); if (isNull(filter_elt)) continue; if (!IS_CHARACTER(filter_elt)) error("each list element in 'filter' must be " "NULL or a character vector"); nval = LENGTH(filter_elt); for (i = 0; i < nval; i++) { val = STRING_ELT(filter_elt, i); if (val == NA_STRING) error("'filter' cannot contain NAs"); } } return; } static int pass_filter(Chars_holder *data_holders, SEXP filter) { int filter_len, col_idx, data_len, nval, i; SEXP filter_elt, val; const char *data; filter_len = LENGTH(filter); for (col_idx = 0; col_idx < filter_len; col_idx++) { filter_elt = VECTOR_ELT(filter, col_idx); if (isNull(filter_elt)) continue; data = data_holders[col_idx].ptr; data_len = data_holders[col_idx].length; nval = LENGTH(filter_elt); for (i = 0; i < nval; i++) { val = STRING_ELT(filter_elt, i); if (LENGTH(val) == data_len && memcmp(CHAR(val), data, data_len) == 0) break; } if (i >= nval) return 0; } return 1; } static const char *parse_GFF_line(const char *line, int lineno, int *attrcol_fmt, SEXP filter, /* used during scan and load */ SEXP ans, /* used during load (2nd pass) */ int *row_idx, /* used during scan and load */ const int *colmap0, /* used during load (2nd pass) */ TagsBuf *tags_buf) /* used during scan and load */ { const char *errmsg; Chars_holder data_holders[GFF_NCOL]; const Chars_holder *data_holder; const char *data; int data_len, col_idx; errmsg = set_data_holders(data_holders, line, lineno); if (errmsg != NULL) return errmsg; /* Try to detect the format of the "attributes" col before filtering. */ if (*attrcol_fmt == UNKNOWN_FMT) { data_holder = data_holders + ATTRIBUTES_IDX; data = data_holder->ptr; data_len = data_holder->length; *attrcol_fmt = detect_attrcol_fmt(data, data_len); } if (!(isNull(filter) || pass_filter(data_holders, filter))) return NULL; for (col_idx = 0, data_holder = data_holders; col_idx < GFF_NCOL; col_idx++, data_holder++) { data = data_holder->ptr; data_len = data_holder->length; if (ans != R_NilValue && colmap0[col_idx] != NA_INTEGER) load_data(data, data_len, ans, *row_idx, col_idx, colmap0); if (col_idx != ATTRIBUTES_IDX) continue; switch (*attrcol_fmt) { case GFF3_FMT: parse_GFF3_attrcol(data, data_len, ans, *row_idx, tags_buf); break; case GFF2_FMT: parse_GFF2_attrcol(data, data_len, ans, *row_idx, tags_buf); break; } } (*row_idx)++; return NULL; } /* Stop parsing after 1st GFF line. */ static const char *load_GFF_pragmas(SEXP filexp, CharAEAE *pragmas_buf, int *attrcol_fmt) { int row_idx, lineno, ret_code, EOL_in_buf, buf_len; char buf[IOBUF_SIZE], c; if (TYPEOF(filexp) != EXTPTRSXP) init_con_buf(); row_idx = 0; for (lineno = 1; (ret_code = filexp_gets2(filexp, buf, IOBUF_SIZE, &EOL_in_buf)); lineno += EOL_in_buf) { if (ret_code == -1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "read error while reading characters " "from line %d", lineno); return errmsg_buf; } if (!EOL_in_buf) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, " "line is too long", lineno); return errmsg_buf; } c = buf[0]; if (c != '#') { /* Skip empty line. */ if (c == '\n' || (c == '\r' && buf[1] == '\n')) continue; /* Stop parsing at 1st FASTA header... */ if (c == '>') return NULL; /* ... or at 1st GFF line. */ return parse_GFF_line(buf, lineno, attrcol_fmt, R_NilValue, R_NilValue, &row_idx, NULL, NULL); } /* Line starting with a single # -> human-readable comment. */ if (buf[1] != '#') continue; /* Line starting with ## -> pragma line. */ buf_len = delete_trailing_LF_or_CRLF(buf, -1); buf[buf_len] = '\0'; append_string_to_CharAEAE(pragmas_buf, buf); } return NULL; } static const char *parse_GFF_file(SEXP filexp, int *attrcol_fmt, SEXP filter, /* used during scan and load */ int *nrows, /* used during scan and load */ SEXP ans, /* used during load (2nd pass) */ const int *colmap0, /* used during load (2nd pass) */ TagsBuf *tags_buf) /* used during scan and load */ { int row_idx, lineno, ret_code, EOL_in_buf; char buf[IOBUF_SIZE], c; const char *errmsg; if (TYPEOF(filexp) != EXTPTRSXP) init_con_buf(); row_idx = 0; for (lineno = 1; (ret_code = filexp_gets2(filexp, buf, IOBUF_SIZE, &EOL_in_buf)); lineno += EOL_in_buf) { if (ret_code == -1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "read error while reading characters " "from line %d", lineno); return errmsg_buf; } if (!EOL_in_buf) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, " "line is too long", lineno); return errmsg_buf; } if (*nrows >= 0 && row_idx == *nrows) return NULL; c = buf[0]; if (c == '#') continue; if (c == '\n' || (c == '\r' && buf[1] == '\n')) continue; /* skip empty line */ if (c == '>') break; /* stop parsing at 1st FASTA header */ errmsg = parse_GFF_line(buf, lineno, attrcol_fmt, filter, ans, &row_idx, colmap0, tags_buf); if (errmsg != NULL) return errmsg; } *nrows = row_idx; return NULL; } /* --- .Call ENTRY POINT --- * Return pragmas and detected format of the "attributes" col from the 1st * GFF line. * Arg: * filexp: A "file external pointer" (see src/io_utils.c in the XVector * package). Alternatively can be a connection. */ SEXP read_gff_pragmas(SEXP filexp) { CharAEAE *pragmas_buf; int attrcol_fmt0; const char *errmsg; SEXP pragmas, attrcol_fmt; pragmas_buf = new_CharAEAE(0, 0); attrcol_fmt0 = UNKNOWN_FMT; errmsg = load_GFF_pragmas(filexp, pragmas_buf, &attrcol_fmt0); if (errmsg != NULL) error("reading GFF file: %s", errmsg); PROTECT(pragmas = new_CHARACTER_from_CharAEAE(pragmas_buf)); PROTECT(attrcol_fmt = ScalarInteger(attrcol_fmt0)); SET_ATTR(pragmas, install("attrcol_fmt"), attrcol_fmt); UNPROTECT(2); return pragmas; } /* --- .Call ENTRY POINT --- * Perform the 1st pass of readGFF(). * Args: * filexp: MUST be the same as passed to read_gff_pragmas(). * attrcol_fmt: * tags: NULL or a character vector indicating which tags to load. * NULL means load all tags. * filter: NULL or a list of length GFF_NCOL-1 (or GFF_NCOL if * 'attrcol_fmt' is 1). Each list element must be NULL or a * character vector with no NAs. * nrows: -1 or the maximum number of rows to read in (after * filtering). */ SEXP scan_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows) { int attrcol_fmt0, nrows0; TagsBuf tags_buf, *tags_buf_p; const char *errmsg; SEXP scan_ans, scan_ans_elt; //init_clock("scan_gff: T1 = "); attrcol_fmt0 = INTEGER(attrcol_fmt)[0]; if (tags == R_NilValue) { tags_buf_p = &tags_buf; init_tags_buf_in_COLLECT_MODE(tags_buf_p); } else { tags_buf_p = NULL; } check_filter(filter, attrcol_fmt0); nrows0 = INTEGER(nrows)[0]; errmsg = parse_GFF_file(filexp, &attrcol_fmt0, filter, &nrows0, R_NilValue, NULL, tags_buf_p); if (errmsg != NULL) error("reading GFF file: %s", errmsg); PROTECT(scan_ans = NEW_LIST(2)); PROTECT(scan_ans_elt = get_collected_tags(tags_buf_p)); SET_ELEMENT(scan_ans, 0, scan_ans_elt); UNPROTECT(1); PROTECT(scan_ans_elt = ScalarInteger(nrows0)); SET_ELEMENT(scan_ans, 1, scan_ans_elt); UNPROTECT(2); //print_elapsed_time(); return scan_ans; } /* --- .Call ENTRY POINT --- * Perform the 2nd pass of readGFF(). * Args: * filexp: MUST be the same as passed to scan_gff(). * attrcol_fmt: * tags: A character vector indicating which tags to load. Unlike for * scan_gff() above, it cannot be NULL. * filter: MUST be the same as passed to scan_gff(). This time we * don't check it. * nrows: Integer vector of length 1 containing the number of rows * scan_gff() said will end up in 'ans'. * pragmas: Character vector containing the pragma lines returned by * read_gff_pragmas(). * colmap: An integer vector of length GFF_NCOL indicating which columns * to load and in which order. * raw_data: TRUE or FALSE. If TRUE, numeric columns (e.g. "start" or * "score") are loaded as character vectors and as-is i.e. how * they are found in the file. */ SEXP load_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows, SEXP pragmas, SEXP colmap, SEXP raw_data) { int attrcol_fmt0, colmap0[GFF_NCOL], ans_ncol0; TagsBuf tags_buf; SEXP ans; const char *errmsg; //init_clock("load_gff: T2 = "); attrcol_fmt0 = INTEGER(attrcol_fmt)[0]; init_tags_buf_in_LOAD_MODE(&tags_buf, tags); ans_ncol0 = prepare_colmap0(colmap0, colmap); PROTECT(ans = alloc_ans(INTEGER(nrows)[0], ans_ncol0, colmap0, tags, pragmas, attrcol_fmt, raw_data)); errmsg = parse_GFF_file(filexp, &attrcol_fmt0, filter, INTEGER(nrows), ans, colmap0, &tags_buf); UNPROTECT(1); if (errmsg != NULL) error("reading GFF file: %s", errmsg); //print_elapsed_time(); return ans; } rtracklayer/src/readGFF.h0000644000175100017510000000060212612032142016302 0ustar00biocbuildbiocbuild#ifndef GFF_H #define GFF_H #include "rtracklayer.h" /* The .Call entry points */ SEXP gff_colnames(SEXP GFF1); SEXP read_gff_pragmas(SEXP filexp); SEXP scan_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows); SEXP load_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows, SEXP pragmas, SEXP colmap, SEXP raw_data); #endif rtracklayer/src/rtracklayer.h0000644000175100017510000000025512612032142017373 0ustar00biocbuildbiocbuild#ifndef RTRACKLAYER_H #define RTRACKLAYER_H #include #include #include #include #endif rtracklayer/src/twoBit.c0000644000175100017510000000753312612032142016321 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/dnaseq.h" #include "ucsc/twoBit.h" #include "twoBit.h" #include "handlers.h" /* .Call entry point */ SEXP DNAString_to_twoBit(SEXP r_dna, SEXP r_mask, SEXP r_seqname) { pushRHandlers(); dnaUtilOpen(); const DNA *dna = CHAR(asChar(r_dna)); struct dnaSeq *seq = newDnaSeq((DNA *)dna, strlen(dna), (char *)CHAR(asChar(r_seqname))); struct twoBit *twoBit = twoBitFromDnaSeq(seq, FALSE); int *mask_start = INTEGER(get_IRanges_start(r_mask)); int *mask_width = INTEGER(get_IRanges_width(r_mask)); int mask_count = get_IRanges_length(r_mask); SEXP ans; if (mask_count) { AllocArray(twoBit->maskStarts, mask_count); AllocArray(twoBit->maskSizes, mask_count); } for (int i = 0; i < mask_count; i++) { twoBit->maskStarts[i] = mask_start[i] - 1; twoBit->maskSizes[i] = mask_width[i]; } seq->dna = NULL; /* do not free memory owned by R */ freeDnaSeq(&seq); popRHandlers(); PROTECT(ans = R_MakeExternalPtr(twoBit, R_NilValue, R_NilValue)); setAttrib(ans, R_ClassSymbol, mkString("twoBit")); UNPROTECT(1); return ans; } /* .Call entry point */ /* Writes the list of twoBit pointers to disk and frees them */ SEXP TwoBits_write(SEXP r_twoBits, SEXP r_filename) { pushRHandlers(); FILE *file = mustOpen((char *)CHAR(asChar(r_filename)), "wb"); struct twoBit *twoBits = NULL, *twoBit_it = NULL; for (int i = 0; i < length(r_twoBits); i++) slAddHead(&twoBits, R_ExternalPtrAddr(VECTOR_ELT(r_twoBits, i))); slReverse(&twoBits); twoBitWriteHeader(twoBits, file); for (twoBit_it = twoBits; twoBit_it != NULL; twoBit_it = twoBit_it->next) { twoBitWriteOne(twoBit_it, file); } twoBitFreeList(&twoBits); carefulClose(&file); popRHandlers(); return R_NilValue; } /* .Call entry point */ SEXP TwoBitFile_seqlengths(SEXP r_filename) { pushRHandlers(); struct twoBitFile *tbf = twoBitOpen((char *)CHAR(asChar(r_filename))); struct twoBitIndex *index; int i, n = slCount(tbf->indexList); SEXP r_seqlengths, r_seqnames; PROTECT(r_seqlengths = allocVector(INTSXP, n)); r_seqnames = allocVector(STRSXP, n); setAttrib(r_seqlengths, R_NamesSymbol, r_seqnames); for (index = tbf->indexList, i = 0; index != NULL; index = index->next, i++) { SET_STRING_ELT(r_seqnames, i, mkChar(index->name)); INTEGER(r_seqlengths)[i] = twoBitSeqSize(tbf, index->name); } twoBitClose(&tbf); popRHandlers(); UNPROTECT(1); return r_seqlengths; } SEXP TwoBitFile_read(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP lkup) { pushRHandlers(); struct twoBitFile *file = twoBitOpen((char *)CHAR(asChar(r_filename))); int *frag_start = INTEGER(get_IRanges_start(r_ranges)); int *frag_width = INTEGER(get_IRanges_width(r_ranges)); int frag_count = get_IRanges_length(r_ranges); SEXP r_ans_width, r_ans; XVectorList_holder r_ans_holder; PROTECT(r_ans_width = duplicate(get_IRanges_width(r_ranges))); PROTECT(r_ans = alloc_XRawList("DNAStringSet", "DNAString", r_ans_width)); r_ans_holder = hold_XVectorList(r_ans); for (int i = 0; i < frag_count; i++) { if (frag_width[i]) { // UCSC library does not like zero width ranges struct dnaSeq *frag = twoBitReadSeqFrag(file, (char *)CHAR(STRING_ELT(r_seqnames, i)), frag_start[i] - 1, frag_start[i] + frag_width[i] - 1); Chars_holder r_ans_elt_holder = get_elt_from_XRawList_holder(&r_ans_holder, i); /* r_ans_elt_holder.ptr is a const char * so we need to cast it to char * before we can write to it */ Ocopy_bytes_to_i1i2_with_lkup(0, r_ans_elt_holder.length - 1, (char *)r_ans_elt_holder.ptr, r_ans_elt_holder.length, frag->dna, frag->size, INTEGER(lkup), LENGTH(lkup)); freeDnaSeq(&frag); } } twoBitClose(&file); popRHandlers(); UNPROTECT(2); return r_ans; } rtracklayer/src/twoBit.h0000644000175100017510000000056112612032142016320 0ustar00biocbuildbiocbuild#ifndef TWO_BIT_H #define TWO_BIT_H #include "rtracklayer.h" /* The .Call entry points */ SEXP DNAString_to_twoBit(SEXP r_dna, SEXP r_mask, SEXP r_seqname); SEXP TwoBits_write(SEXP r_twoBits, SEXP r_filename); SEXP TwoBitFile_seqlengths(SEXP r_filename); SEXP TwoBitFile_read(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP lkup); #endif rtracklayer/src/ucsc/0000755000175100017510000000000012612032142015632 5ustar00biocbuildbiocbuildrtracklayer/src/ucsc/_cheapcgi.c0000644000175100017510000000310712612032142017701 0ustar00biocbuildbiocbuild/* rtracklayer took out these little utilities from cheapcgi.c */ #include "common.h" void cgiDecode(char *in, char *out, int inLength) /* Decode from cgi pluses-for-spaces format to normal. * Out will be a little shorter than in typically, and * can be the same buffer. */ { char c; int i; for (i=0; isize = size; fi->isDir = isDir; fi->statErrno = statErrno; fi->lastAccess = lastAccess; strcpy(fi->name, name); return fi; } int cmpFileInfo(const void *va, const void *vb) /* Compare two fileInfo. */ { const struct fileInfo *a = *((struct fileInfo **)va); const struct fileInfo *b = *((struct fileInfo **)vb); return strcmp(a->name, b->name); } rtracklayer/src/ucsc/_portimpl.h0000644000175100017510000000037112612032142020011 0ustar00biocbuildbiocbuild/* Utilities that rtracklayer made common between win9x and unix */ struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno, time_t lastAccess); int cmpFileInfo(const void *va, const void *vb); rtracklayer/src/ucsc/bPlusTree.c0000644000175100017510000004645412612032142017720 0ustar00biocbuildbiocbuild/* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ /* bptFile - B+ Trees. These are a method of indexing data similar to binary trees, but * with many children rather than just two at each node. They work well when stored on disk, * since typically only two or three disk accesses are needed to locate any particular * piece of data. This implementation is *just* for disk based storage. For memory * use the rbTree instead. Currently the implementation is just useful for data warehouse * type applications. That is it implements a function to create a b+ tree from bulk data * (bptFileCreate) and a function to lookup a value given a key (bptFileFind) but not functions * to add or delete individual items. * * The layout of the file on disk is: * header * root node * (other nodes) * In general when the tree is first built the higher level nodes are stored before the * lower level nodes. It is possible if a b+ tree is dynamically updated for this to * no longer be strictly true, but actually currently the b+ tree code here doesn't implement * dynamic updates - it just creates a b+ tree from a sorted list. * * Each node can be one of two types - index or leaf. The index nodes contain pointers * to child nodes. The leaf nodes contain the actual data. * * The layout of the file header is: * 4 bytes - The value bptSig (0x78CA8C91) * 4 bytes - Number of children per block (not byte size of block) * 4 bytes - Number of significant bytes in key * 4 bytes - Number of bytes in value * 8 bytes - Number of items in index * 4 bytes - Always 0 for now * 4 bytes - Always 0 for now * The magic number may be byte-swapped, in which case all numbers in the file * need to be byte-swapped. * * The nodes start with a header: * 1 byte - 1 for leaf nodes, 0 for index nodes. * 1 byte - Always 0 for now. * 2 bytes - The number of children/items in node * This is followed by count items. For the index nodes the items are * key size bytes - always written most significant byte first * 8 bytes - Offset of child node in index file. * For leaf nodes the items are * key size bytes - always written most significant byte first * val sized bytes - the value associated with the key. * Note in general the leaf nodes may not be the same size as the index nodes, though in * the important case where the values are file offsets they will be. */ #include "common.h" #include "sig.h" #include "udc.h" #include "bPlusTree.h" /* This section of code deals with locating a value in a b+ tree. */ struct bptFile *bptFileAttach(char *fileName, struct udcFile *udc) /* Open up index file on previously open file, with header at current file position. */ { /* Open file and allocate structure to hold info from header etc. */ struct bptFile *bpt = needMem(sizeof(*bpt)); bpt->fileName = fileName; bpt->udc = udc; /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustReadOne(udc, magic); if (magic != bptSig) { magic = byteSwap32(magic); isSwapped = bpt->isSwapped = TRUE; if (magic != bptSig) errAbort("%s is not a bpt b-plus tree index file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ bpt->blockSize = udcReadBits32(udc, isSwapped); bpt->keySize = udcReadBits32(udc, isSwapped); bpt->valSize = udcReadBits32(udc, isSwapped); bpt->itemCount = udcReadBits64(udc, isSwapped); /* Skip over reserved bits of header. */ bits32 reserved32; udcMustReadOne(udc, reserved32); udcMustReadOne(udc, reserved32); /* Save position of root block of b+ tree. */ bpt->rootOffset = udcTell(udc); return bpt; } void bptFileDetach(struct bptFile **pBpt) /* Detach and free up cirTree file opened with cirTreeFileAttach. */ { freez(pBpt); } struct bptFile *bptFileOpen(char *fileName) /* Open up index file - reading header and verifying things. */ { return bptFileAttach(cloneString(fileName), udcFileOpen(fileName, udcDefaultDir())); } void bptFileClose(struct bptFile **pBpt) /* Close down and deallocate index file. */ { struct bptFile *bpt = *pBpt; if (bpt != NULL) { udcFileClose(&bpt->udc); freeMem(bpt->fileName); bptFileDetach(pBpt); } } static boolean rFind(struct bptFile *bpt, bits64 blockStart, void *key, void *val) /* Find value corresponding to key. If found copy value to memory pointed to by val and return * true. Otherwise return false. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); UBYTE keyBuf[bpt->keySize]; /* Place to put a key, buffered on stack. */ if (isLeaf) { for (i=0; iudc, keyBuf, bpt->keySize); udcMustRead(bpt->udc, val, bpt->valSize); if (memcmp(key, keyBuf, bpt->keySize) == 0) return TRUE; } return FALSE; } else { /* Read and discard first key. */ udcMustRead(bpt->udc, keyBuf, bpt->keySize); /* Scan info for first file offset. */ bits64 fileOffset = udcReadBits64(bpt->udc, isSwapped); /* Loop through remainder. */ for (i=1; iudc, keyBuf, bpt->keySize); if (memcmp(key, keyBuf, bpt->keySize) < 0) break; fileOffset = udcReadBits64(bpt->udc, isSwapped); } return rFind(bpt, fileOffset, key, val); } } static void rFindMulti(struct bptFile *bpt, bits64 blockStart, void *key, struct slRef **pList) /* Find values corresponding to key and add them to pList. You'll need to * Do a slRefFreeListAndVals() on the list when done. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); int keySize = bpt->keySize; UBYTE keyBuf[keySize]; /* Place to put a key, buffered on stack. */ UBYTE valBuf[bpt->valSize]; /* Place to put a value, buffered on stack. */ if (isLeaf) { for (i=0; iudc, keyBuf, keySize); udcMustRead(bpt->udc, valBuf, bpt->valSize); if (memcmp(key, keyBuf, keySize) == 0) { void *val = cloneMem(valBuf, bpt->valSize); refAdd(pList, val); } } } else { /* Read first key and first file offset. */ udcMustRead(bpt->udc, keyBuf, keySize); bits64 lastFileOffset = udcReadBits64(bpt->udc, isSwapped); bits64 fileOffset = lastFileOffset; int lastCmp = memcmp(key, keyBuf, keySize); /* Loop through remainder. */ for (i=1; iudc, keyBuf, keySize); fileOffset = udcReadBits64(bpt->udc, isSwapped); int cmp = memcmp(key, keyBuf, keySize); if (lastCmp >= 0 && cmp <= 0) { bits64 curPos = udcTell(bpt->udc); rFindMulti(bpt, lastFileOffset, key, pList); udcSeek(bpt->udc, curPos); } if (cmp < 0) return; lastCmp = cmp; lastFileOffset = fileOffset; } /* If made it all the way to end, do last one too. */ rFindMulti(bpt, fileOffset, key, pList); } } static void rTraverse(struct bptFile *bpt, bits64 blockStart, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ) /* Recursively go across tree, calling callback at leaves. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); char keyBuf[bpt->keySize], valBuf[bpt->valSize]; if (isLeaf) { for (i=0; iudc, keyBuf, bpt->keySize); udcMustRead(bpt->udc, valBuf, bpt->valSize); callback(context, keyBuf, bpt->keySize, valBuf, bpt->valSize); } } else { bits64 fileOffsets[childCount]; /* Loop through to get file offsets of children. */ for (i=0; iudc, keyBuf, bpt->keySize); fileOffsets[i] = udcReadBits64(bpt->udc, isSwapped); } /* Loop through recursing on child offsets. */ for (i=0; irootOffset; for (;;) { /* Seek to block start */ udcSeek(bpt->udc, offset); /* Read block header, break if we are leaf. */ UBYTE isLeaf; UBYTE reserved; bits16 childCount; udcMustReadOne(bpt->udc, isLeaf); if (isLeaf) break; udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); /* Read and discard first key. */ char keyBuf[bpt->keySize]; udcMustRead(bpt->udc, keyBuf, bpt->keySize); /* Get file offset of sub-block. */ offset = udcReadBits64(bpt->udc, isSwapped); } return offset; } static bits64 bptDataOffset(struct bptFile *bpt, bits64 itemPos) /* Return position of file of data corresponding to given itemPos. For first piece of * data pass in 0. */ { if (itemPos >= bpt->itemCount) errAbort("Item index %lld greater than item count %lld in %s", itemPos, bpt->itemCount, bpt->fileName); bits64 blockPos = itemPos/bpt->blockSize; bits32 insidePos = itemPos - blockPos*bpt->blockSize; int blockHeaderSize = 4; bits64 itemByteSize = bpt->valSize + bpt->keySize; bits64 blockByteSize = bpt->blockSize * itemByteSize + blockHeaderSize; bits64 blockOffset = blockByteSize*blockPos + bptDataStart(bpt); bits64 itemOffset = blockOffset + blockHeaderSize + itemByteSize * insidePos; return itemOffset; } void bptKeyAtPos(struct bptFile *bpt, bits64 itemPos, void *result) /* Fill in result with the key at given itemPos. For first piece of data itemPos is 0 * Result must be at least bpt->keySize. If result is a string it won't be zero terminated * by this routine. Use bptStringKeyAtPos instead. */ { bits64 offset = bptDataOffset(bpt, itemPos); udcSeek(bpt->udc, offset); udcMustRead(bpt->udc, result, bpt->keySize); } void bptStringKeyAtPos(struct bptFile *bpt, bits64 itemPos, char *result, int maxResultSize) /* Fill in result with the key at given itemPos. The maxResultSize should be 1+bpt->keySize * to accommodate zero termination of string. */ { assert(maxResultSize > bpt->keySize); bptKeyAtPos(bpt, itemPos, result); result[bpt->keySize] = 0; } static boolean bptFileFindMaybeMulti(struct bptFile *bpt, void *key, int keySize, int valSize, boolean multi, void *singleVal, struct slRef **multiVal) /* Do either a single or multiple find depending in multi parameter. Only one of singleVal * or multiVal should be non-NULL, depending on the same parameter. */ { /* Check key size vs. file key size, and act appropriately. If need be copy key to a local * buffer and zero-extend it. */ if (keySize > bpt->keySize) return FALSE; char keyBuf[bpt->keySize]; if (keySize != bpt->keySize) { memcpy(keyBuf, key, keySize); memset(keyBuf+keySize, 0, bpt->keySize - keySize); key = keyBuf; } /* Make sure the valSize matches what's in file. */ if (valSize != bpt->valSize) errAbort("Value size mismatch between bptFileFind (valSize=%d) and %s (valSize=%d)", valSize, bpt->fileName, bpt->valSize); if (multi) { rFindMulti(bpt, bpt->rootOffset, key, multiVal); return *multiVal != NULL; } else return rFind(bpt, bpt->rootOffset, key, singleVal); } boolean bptFileFind(struct bptFile *bpt, void *key, int keySize, void *val, int valSize) /* Find value associated with key. Return TRUE if it's found. * Parameters: * bpt - file handle returned by bptFileOpen * key - pointer to key string, which needs to be bpt->keySize long * val - pointer to where to put retrieved value */ { return bptFileFindMaybeMulti(bpt, key, keySize, valSize, FALSE, val, NULL); } struct slRef *bptFileFindMultiple(struct bptFile *bpt, void *key, int keySize, int valSize) /* Find all values associated with key. Store this in ->val item of returned list. * Do a slRefFreeListAndVals() on list when done. */ { struct slRef *list = NULL; bptFileFindMaybeMulti(bpt, key, keySize, valSize, TRUE, NULL, &list); slReverse(&list); return list; } void bptFileTraverse(struct bptFile *bpt, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ) /* Traverse bPlusTree on file, calling supplied callback function at each * leaf item. */ { return rTraverse(bpt, bpt->rootOffset, context, callback); } /* This section of code deals with making balanced b+ trees given a sorted array as input. * The difficult part is mostly just calculating the offsets of various things. As an example * if you had the sorted array: * 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 * and wanted to create a tree of block size 4, the resulting tree would have three levels * as so: * 01 17 * 01 05 09 13 17 21 25 * 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 */ static long xToY(int x, unsigned y) /* Return x to the Y power, with y usually small. */ { long i, val = 1; for (i=0; i maxBlockSize) { itemCount = (itemCount + maxBlockSize - 1) / maxBlockSize; levels += 1; } return levels; } static bits32 writeIndexLevel(bits16 blockSize, void *itemArray, int itemSize, long itemCount, bits32 indexOffset, int level, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, bits32 valSize, FILE *f) /* Write out a non-leaf level. */ { char *items = itemArray; /* Calculate number of nodes to write at this level. */ long slotSizePer = xToY(blockSize, level); // Number of items per slot in node long nodeSizePer = slotSizePer * blockSize; // Number of items per node long nodeCount = (itemCount + nodeSizePer - 1)/nodeSizePer; /* Calculate sizes and offsets. */ long bytesInIndexBlock = (bptBlockHeaderSize + blockSize * (keySize+sizeof(bits64))); long bytesInLeafBlock = (bptBlockHeaderSize + blockSize * (keySize+valSize)); bits64 bytesInNextLevelBlock = (level == 1 ? bytesInLeafBlock : bytesInIndexBlock); bits64 levelSize = nodeCount * bytesInIndexBlock; bits64 endLevel = indexOffset + levelSize; bits64 nextChild = endLevel; UBYTE isLeaf = FALSE; UBYTE reserved = 0; long i,j; char keyBuf[keySize+1]; keyBuf[keySize] = 0; for (i=0; i blockSize) countOne = blockSize; bits16 shortCountOne = countOne; /* Write block header. */ writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, shortCountOne); /* Write out the slots that are used one by one, and do sanity check. */ int slotsUsed = 0; long endIx = i + nodeSizePer; if (endIx > itemCount) endIx = itemCount; for (j=i; j blockSize) countOne = blockSize; else countOne = countLeft; writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out position in genome and in file for each item. */ for (j=0; j 0; --i) { bits32 endLevelOffset = writeIndexLevel(blockSize, itemArray, itemSize, itemCount, indexOffset, i, fetchKey, keySize, valSize, f); indexOffset = ftell(f); if (endLevelOffset != indexOffset) internalErr(); } /* Write leaf nodes */ writeLeafLevel(blockSize, itemArray, itemSize, itemCount, fetchKey, keySize, fetchVal, valSize, f); } void bptFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* B+ tree block size - # of children for each node. */ void (*fetchKey)(const void *va, char *keyBuf), /* Given item, copy key to keyBuf */ bits32 keySize, /* Size of key */ void* (*fetchVal)(const void *va), /* Given item, return pointer to value */ bits32 valSize, /* Size of value */ char *fileName) /* Name of output file. */ /* Create a b+ tree index file from a sorted array. */ { /* Open file and write header. */ FILE *f = mustOpen(fileName, "wb"); bptFileBulkIndexToOpenFile(itemArray, itemSize, itemCount, blockSize, fetchKey, keySize, fetchVal, valSize, f); carefulClose(&f); } rtracklayer/src/ucsc/bPlusTree.h0000644000175100017510000001432212612032142017712 0ustar00biocbuildbiocbuild/* bptFile - B+ Trees. These are a method of indexing data similar to binary trees, but * with many children rather than just two at each node. They work well when stored on disk, * since typically only two or three disk accesses are needed to locate any particular * piece of data. This implementation is *just* for disk based storage. For memory * use the rbTree instead. Currently the implementation is just useful for data warehouse * type applications. That is it implements a function to create a b+ tree from bulk data * (bptFileCreate) and a function to lookup a value given a key (bptFileFind) but not functions * to add or delete individual items. * * * The layout of the file on disk is: * header * root node * (other nodes) * In general when the tree is first built the higher level nodes are stored before the * lower level nodes. It is possible if a b+ tree is dynamically updated for this to * no longer be strictly true, but actually currently the b+ tree code here doesn't implement * dynamic updates - it just creates a b+ tree from a sorted list. * * Each node can be one of two types - index or leaf. The index nodes contain pointers * to child nodes. The leaf nodes contain the actual data. * * The layout of the file header is: * 4 bytes - The value bptSig (0x78CA8C91) * 4 bytes - Number of children per block (not byte size of block) * 4 bytes - Number of significant bytes in key * 4 bytes - Number of bytes in value * 8 bytes - Number of items in index * 4 bytes - Always 0 for now * 4 bytes - Always 0 for now * The magic number may be byte-swapped, in which case all numbers in the file * need to be byte-swapped. * * The nodes start with a header: * 1 byte - 1 for leaf nodes, 0 for index nodes. * 1 byte - Always 0 for now. * 2 bytes - The number of children/items in node * This is followed by count items. For the index nodes the items are * key size bytes - always written most significant byte first * 8 bytes - Offset of child node in index file. * For leaf nodes the items are * key size bytes - always written most significant byte first * val sized bytes - the value associated with the key. * Note in general the leaf nodes may not be the same size as the index nodes, though in * the important case where the values are file offsets they will be. */ #ifndef BPLUSTREE_H #define BPLUSTREE_H struct bptFile /* B+ tree index file handle. */ { struct bptFile *next; /* Next in list of index files if any. */ char *fileName; /* Name of file - for error reporting. */ struct udcFile *udc; /* Open file pointer. */ bits32 blockSize; /* Size of block. */ bits32 keySize; /* Size of keys. */ bits32 valSize; /* Size of values. */ bits64 itemCount; /* Number of items indexed. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ bits64 rootOffset; /* Offset of root block. */ }; struct bptFile *bptFileOpen(char *fileName); /* Open up index file - reading header and verifying things. */ void bptFileClose(struct bptFile **pBpt); /* Close down and deallocate index file. */ struct bptFile *bptFileAttach(char *fileName, struct udcFile *udc); /* Open up index file on previously open file, with header at current file position. */ void bptFileDetach(struct bptFile **pBpt); /* Detach and free up bptFile opened with bptFileAttach. */ boolean bptFileFind(struct bptFile *bpt, void *key, int keySize, void *val, int valSize); /* Find value associated with key. Return TRUE if it's found. * Parameters: * bpt - file handle returned by bptFileOpen * key - pointer to key string * keySize - size of key. Normally just strlen(key) * val - pointer to where to put retrieved value * valSize - size of memory buffer that will hold val. Should match bpt->valSize. */ struct slRef *bptFileFindMultiple(struct bptFile *bpt, void *key, int keySize, int valSize); /* Find all values associated with key. Store this in ->val item of returned list. * Do a slRefFreeListAndVals() on list when done. */ void bptFileTraverse(struct bptFile *bpt, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ); /* Traverse bPlusTree on file, calling supplied callback function at each * leaf item. */ void bptKeyAtPos(struct bptFile *bpt, bits64 itemPos, void *result); /* Fill in result with the key at given itemPos. For first piece of data itemPos is 0 * and for last piece is bpt->itemCount - 1. Result must be at least bpt->keySize. * If result is a string it won't be zero terminated * by this routine. Use bptStringKeyAtPos instead. */ void bptStringKeyAtPos(struct bptFile *bpt, bits64 itemPos, char *result, int maxResultSize); /* Fill in result with the key at given itemPos. The maxResultSize should be 1+bpt->keySize * to accommodate zero termination of string. */ void bptFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* B+ tree block size - # of children for each node. */ void (*fetchKey)(const void *va, char *keyBuf), /* Given item, copy key to keyBuf */ bits32 keySize, /* Size of key */ void* (*fetchVal)(const void *va), /* Given item, return pointer to value */ bits32 valSize, /* Size of value */ char *fileName); /* Name of output file. */ /* Create a b+ tree index file from a sorted array. */ void bptFileBulkIndexToOpenFile(void *itemArray, int itemSize, bits64 itemCount, bits32 blockSize, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, void* (*fetchVal)(const void *va), bits32 valSize, FILE *f); /* Create a b+ tree index from a sorted array, writing output starting at current position * of an already open file. See bptFileCreate for explanation of parameters. */ #define bptFileHeaderSize 32 #define bptBlockHeaderSize 4 #endif /* BPLUSTREE_H */ rtracklayer/src/ucsc/base64.c0000644000175100017510000000567612612032142017100 0ustar00biocbuildbiocbuild/* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "base64.h" char *base64Encode(char *input, size_t inplen) /* Use base64 to encode a string. Returns one long encoded * string which need to be freeMem'd. Note: big-endian algorithm. * For some applications you may need to break the base64 output * of this function into lines no longer than 76 chars. */ { char b64[] = B64CHARS; int words = (inplen+2)/3; int remains = inplen % 3; char *result = (char *)needMem(4*words+1); size_t i=0, j=0; int word = 0; unsigned char *p = (unsigned char*) input; /* p must be unsigned char*, because without "unsigned", sign extend messes up last group outputted when the value of the chars following last in input happens to be char 0x80 or higher */ for(i=1; i<=words; i++) { word = 0; word |= *p++; word <<= 8; word |= *p++; word <<= 8; word |= *p++; if (i==words && remains>0) { word &= 0x00FFFF00; if (remains==1) word &= 0x00FF0000; } result[j++]=b64[word >> 18 & 0x3F]; result[j++]=b64[word >> 12 & 0x3F]; result[j++]=b64[word >> 6 & 0x3F]; result[j++]=b64[word & 0x3F]; } result[j] = 0; if (remains >0) result[j-1] = '='; if (remains==1) result[j-2] = '='; return result; } boolean base64Validate(char *input) /* Return true if input is valid base64. * Note that the input string is changed by * eraseWhiteSpace(). */ { size_t i = 0, l = 0; char *p = input; boolean validB64 = TRUE; /* remove whitespace which is unnecessary and */ eraseWhiteSpace(input); l = strlen(p); for(i=0;i> 16 & 0xFF; result[j++]=word >> 8 & 0xFF; result[j++]=word & 0xFF; } result[j] = 0; if (returnSize) *returnSize = j; return result; } rtracklayer/src/ucsc/base64.h0000644000175100017510000000171012612032142017066 0ustar00biocbuildbiocbuild/* Base64 encoding and decoding. * by Galt Barber */ #ifndef BASE64_H #define BASE64_H #define B64CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" char *base64Encode(char *input, size_t inplen); /* Use base64 to encode a string. Returns one long encoded * string which need to be freeMem'd. Note: big-endian algorithm. * For some applications you may need to break the base64 output * of this function into lines no longer than 76 chars. */ boolean base64Validate(char *input); /* Return true if input is valid base64. * Note that the input string is changed by * eraseWhiteSpace(). */ char *base64Decode(char *input, size_t *returnSize); /* Use base64 to decode a string. Return decoded * string which will be freeMem'd. Note: big-endian algorithm. * Call eraseWhiteSpace() and check for invalid input * before passing in input if needed. * Optionally set retun size for use with binary data. */ #endif /* BASE64_H */ rtracklayer/src/ucsc/bbiFile.h0000644000175100017510000004763612612032142017357 0ustar00biocbuildbiocbuild/* bbiFile - Big Binary Indexed file. Stuff that's common between bigWig and bigBed. */ #ifndef BBIFILE_H #define BBIFILE_H #include "cirTree.h" #include "linefile.h" #include "localmem.h" /* bigWig/bigBed file structure: * fixedWidthHeader * magic# 4 bytes * version 2 bytes * zoomLevels 2 bytes * chromosomeTreeOffset 8 bytes * fullDataOffset 8 bytes * fullIndexOffset 8 bytes * fieldCount 2 bytes (for bigWig 0) * definedFieldCount 2 bytes (for bigWig 0) * autoSqlOffset 8 bytes (for bigWig 0) (0 if no autoSql information) * totalSummaryOffset 8 bytes (0 in earlier versions of file lacking totalSummary) * uncompressBufSize 4 bytes (Size of uncompression buffer. 0 if uncompressed.) * extensionOffset 8 bytes (Offset to header extension 0 if no such extension) * zoomHeaders there are zoomLevels number of these * reductionLevel 4 bytes * reserved 4 bytes * dataOffset 8 bytes * indexOffset 8 bytes * autoSql string (zero terminated - only present if autoSqlOffset non-zero) * totalSummary - summary of all data in file - only present if totalSummaryOffset non-zero * basesCovered 8 bytes * minVal 8 bytes float (for bigBed minimum depth of coverage) * maxVal 8 bytes float (for bigBed maximum depth of coverage) * sumData 8 bytes float (for bigBed sum of coverage) * sumSquared 8 bytes float (for bigBed sum of coverage squared) * extendedHeader * extensionSize 2 size of extended header in bytes - currently 64 * extraIndexCount 2 number of extra fields we will be indexing * extraIndexListOffset 8 Offset to list of non-chrom/start/end indexes * reserved 48 All zeroes for now * extraIndexList - one of these for each extraIndex * type 2 Type of index. Always 0 for bPlusTree now * fieldCount 2 Number of fields used in this index. Always 1 for now * indexOffset 8 offset for this index in file * reserved 4 All zeroes for now * fieldList - one of these for each field being used in _this_ index * fieldId 2 index of field within record * reserved 2 All zeroes for now * chromosome b+ tree bPlusTree index * full data * sectionCount 8 bytes (item count for bigBeds) * section data section count sections, of three types (bed data for bigBeds) * full index cirTree index * zoom info one of these for each zoom level * zoom data * zoomCount 4 bytes * zoom data there are zoomCount of these items * chromId 4 bytes * chromStart 4 bytes * chromEnd 4 bytes * validCount 4 bytes * minVal 4 bytes float * maxVal 4 bytes float * sumData 4 bytes float * sumSquares 4 bytes float * zoom index cirTree index * extraIndexes [optional] bPlusTreeIndex for each extra field that is indexed * magic# 4 bytes - same as magic number at start of header */ #ifndef CIRTREE_H #include "cirTree.h" #endif #define bbiCurrentVersion 4 /* Version history (of file format, not utilities - corresponds to version field in header) * 1 - Initial release * 1 - Unfortunately when attempting a transparent change to encoders, made the sectionCount * field inconsistent, sometimes not present, sometimes 32 bits. Since offset positions * in index were still accurate this did not break most applications, but it did show * up in the summary section of the Table Browser. * 2 - Made sectionCount consistently 64 bits. Also fixed missing zoomCount in first level of * zoom in files made by bedToBigBed and bedGraphToBigWig. (The older wigToBigWig was fine.) * Added totalSummary section. * 3 - Adding zlib compression. Only active if uncompressBufSize is non-zero in header. * 4 - Fixed problem in encoder for the max field in zoom levels higher than the first one. * Added an extra sig at end of file. */ struct bbiZoomLevel /* A zoom level in bigWig file. */ { struct bbiZoomLevel *next; /* Next in list. */ bits32 reductionLevel; /* How many bases per item */ bits32 reserved; /* Zero for now. */ bits64 dataOffset; /* Offset of data for this level in file. */ bits64 indexOffset; /* Offset of index for this level in file. */ }; struct bbiZoomLevel *bbiBestZoom(struct bbiZoomLevel *levelList, int desiredReduction); /* Return zoom level that is the closest one that is less than or equal to * desiredReduction. */ struct bbiFile /* An open bbiFile */ { struct bbiFile *next; /* Next in list. */ char *fileName; /* Name of file - for better error reporting. */ struct udcFile *udc; /* Open UDC file handle. */ bits32 typeSig; /* bigBedSig or bigWigSig for now. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ struct bptFile *chromBpt; /* Index of chromosomes. */ bits16 version; /* Version number - initially 1. */ bits16 zoomLevels; /* Number of zoom levels. */ bits64 chromTreeOffset; /* Offset to chromosome index. */ bits64 unzoomedDataOffset; /* Start of unzoomed data. */ bits64 unzoomedIndexOffset; /* Start of unzoomed index. */ bits16 fieldCount; /* Number of columns in bed version. */ bits16 definedFieldCount; /* Number of columns using bed standard definitions. */ bits64 asOffset; /* Offset to embedded null-terminated AutoSQL file. */ bits64 totalSummaryOffset; /* Offset to total summary information if any. (On older files have to calculate) */ bits32 uncompressBufSize; /* Size of uncompression buffer, 0 if uncompressed */ bits64 extensionOffset; /* Start of header extension block or 0 if none. */ struct cirTreeFile *unzoomedCir; /* Unzoomed data index in memory - may be NULL. */ struct bbiZoomLevel *levelList; /* List of zoom levels. */ /* Fields based on extension block. */ bits16 extensionSize; /* Size of extension block */ bits16 extraIndexCount; /* Number of extra indexes (on fields other than chrom,start,end */ bits64 extraIndexListOffset; /* Offset to list of extra indexes */ }; struct bbiFile *bbiFileOpen(char *fileName, bits32 sig, char *typeName); /* Open up big wig or big bed file. */ void bbiFileClose(struct bbiFile **pBwf); /* Close down a big wig/big bed file. */ struct fileOffsetSize *bbiOverlappingBlocks(struct bbiFile *bbi, struct cirTreeFile *ctf, char *chrom, bits32 start, bits32 end, bits32 *retChromId); /* Fetch list of file blocks that contain items overlapping chromosome range. */ struct bbiChromIdSize /* We store an id/size pair in chromBpt bPlusTree */ { bits32 chromId; /* Chromosome ID */ bits32 chromSize; /* Chromosome Size */ }; struct bbiChromInfo /* Pair of a name and a 32-bit integer. Used to assign IDs to chromosomes. */ { struct bbiChromInfo *next; char *name; /* Chromosome name */ bits32 id; /* Chromosome ID - a small number usually */ bits32 size; /* Chromosome size in bases */ }; struct bbiChromInfo *bbiChromList(struct bbiFile *bbi); /* Return all chromosomes in file. Dispose of this with bbiChromInfoFreeList. */ void bbiChromInfoFreeList(struct bbiChromInfo **pList); /* Free a list of bbiChromInfo's */ bits32 bbiChromSize(struct bbiFile *bbi, char *chrom); /* Returns size of given chromosome. */ void bbiChromInfoKey(const void *va, char *keyBuf); /* Get key field out of bbiChromInfo. */ void *bbiChromInfoVal(const void *va); /* Get val field out of bbiChromInfo. */ char *bbiCachedChromLookup(struct bbiFile *bbi, int chromId, int lastChromId, char *chromBuf, int chromBufSize); /* Return chromosome name corresponding to chromId. Because this is a bit expensive, * if you are doing this repeatedly pass in the chromId used in the previous call to * this in lastChromId, which will save it from doing the lookup again on the same * chromosome. Pass in -1 to lastChromId if this is the first time or if you can't be * bothered. The chromBufSize should be at greater or equal to bbi->keySize+1. */ struct bbiChromUsage /* Information on how many items per chromosome etc. Used by multipass bbiFile writers. */ { struct bbiChromUsage *next; char *name; /* chromosome name. */ bits32 itemCount; /* Number of items for this chromosome. */ bits32 id; /* Unique ID for chromosome. */ bits32 size; /* Size of chromosome. */ }; enum bbiSummaryType /* Way to summarize data. */ { bbiSumMean = 0, /* Average value */ bbiSumMax = 1, /* Maximum value */ bbiSumMin = 2, /* Minimum value */ bbiSumCoverage = 3, /* Bases in region containing actual data. */ bbiSumStandardDeviation = 4, /* Standard deviation in window. */ }; enum bbiSummaryType bbiSummaryTypeFromString(char *string); /* Return summary type given a descriptive string. */ char *bbiSummaryTypeToString(enum bbiSummaryType type); /* Convert summary type from enum to string representation. */ struct bbiSummary /* A summary type item. */ { struct bbiSummary *next; bits32 chromId; /* ID of associated chromosome. */ bits32 start,end; /* Range of chromosome covered. */ bits32 validCount; /* Count of (bases) with actual data. */ float minVal; /* Minimum value of items */ float maxVal; /* Maximum value of items */ float sumData; /* sum of values for each base. */ float sumSquares; /* sum of squares for each base. */ bits64 fileOffset; /* Offset of summary in file. */ }; #define bbiSummaryFreeList slFreeList struct bbiSummaryOnDisk /* The part of the summary that ends up on disk - in the same order written to disk. */ { bits32 chromId; /* ID of associated chromosome. */ bits32 start,end; /* Range of chromosome covered. */ bits32 validCount; /* Count of (bases) with actual data. */ float minVal; /* Minimum value of items */ float maxVal; /* Maximum value of items */ float sumData; /* sum of values for each base. */ float sumSquares; /* sum of squares for each base. */ }; struct bbiInterval /* Data on a single interval. */ { struct bbiInterval *next; /* Next in list. */ bits32 start, end; /* Position in chromosome, half open. */ double val; /* Value at that position. */ }; typedef struct bbiInterval *(*BbiFetchIntervals)(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, struct lm *lm); /* A callback function that returns a bbiInterval list. */ void bbiAttachUnzoomedCir(struct bbiFile *bbi); /* Make sure unzoomed cir is attached. */ struct bbiSummaryElement /* An element of a summary from the user side. */ { bits64 validCount; /* Count of (bases) with actual data. */ double minVal; /* Minimum value of items */ double maxVal; /* Maximum value of items */ double sumData; /* sum of values for each base. */ double sumSquares; /* sum of squares for each base. */ }; boolean bbiSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary); /* Fill in summary with data from indicated chromosome range in bigWig/bigBed file. * Returns FALSE if no data at that position. */ boolean bbiSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ struct bbiSummaryElement bbiTotalSummary(struct bbiFile *bbi); /* Return summary of entire file! */ /****** Write side of things - implemented in bbiWrite.c. Few people need this. ********/ struct bbiBoundsArray /* Minimum info needed for r-tree indexer - where a section lives on disk and the * range it covers. */ { bits64 offset; /* Offset within file. */ struct cirTreeRange range; /* What is covered. */ }; struct cirTreeRange bbiBoundsArrayFetchKey(const void *va, void *context); /* Fetch bbiBoundsArray key for r-tree */ bits64 bbiBoundsArrayFetchOffset(const void *va, void *context); /* Fetch bbiBoundsArray file offset for r-tree */ struct bbiSumOutStream /* Buffer output to file so have a chance to compress. */ { struct bbiSummaryOnDisk *array; int elCount; int allocCount; FILE *f; boolean doCompress; }; struct bbiSumOutStream *bbiSumOutStreamOpen(int allocCount, FILE *f, boolean doCompress); /* Open new bbiSumOutStream. */ void bbiSumOutStreamClose(struct bbiSumOutStream **pStream); /* Free up bbiSumOutStream */ void bbiSumOutStreamWrite(struct bbiSumOutStream *stream, struct bbiSummary *sum); /* Write out next one to stream. */ void bbiOutputOneSummaryFurtherReduce(struct bbiSummary *sum, struct bbiSummary **pTwiceReducedList, int doubleReductionSize, struct bbiBoundsArray **pBoundsPt, struct bbiBoundsArray *boundsEnd, struct lm *lm, struct bbiSumOutStream *stream); /* Write out sum to file, keeping track of minimal info on it in *pBoundsPt, and also adding * it to second level summary. */ struct bbiSummary *bbiSummarySimpleReduce(struct bbiSummary *list, int reduction, struct lm *lm); /* Do a simple reduction - where among other things the reduction level is an integral * multiple of the previous reduction level, and the list is sorted. Allocate result out of lm. */ void bbiWriteDummyHeader(FILE *f); /* Write out all-zero header, just to reserve space for it. */ void bbiWriteDummyZooms(FILE *f); /* Write out zeroes to reserve space for ten zoom levels. */ void bbiSummaryElementWrite(FILE *f, struct bbiSummaryElement *sum); /* Write out summary element to file. */ void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f); /* Write out information on chromosomes to file. */ void bbiWriteFloat(FILE *f, float val); /* Write out floating point val to file. Mostly to convert from double... */ struct hash *bbiChromSizesFromFile(char *fileName); /* Read two column file into hash keyed by chrom. */ bits64 bbiTotalSummarySize(struct bbiSummary *list); /* Return size on disk of all summaries. */ void bbiChromUsageFree(struct bbiChromUsage **pUsage); /* free a single bbiChromUsage structure */ void bbiChromUsageFreeList(struct bbiChromUsage **pList); /* free a list of bbiChromUsage structures */ struct bbNamedFileChunk /* A name associated with an offset into a possibly large file. Used for extra * indexes in bigBed files. */ { char *name; /* Name of chunk. */ bits64 offset; /* Start in file. */ bits64 size; /* Size in file. */ }; struct bbExIndexMaker /* A helper structure to make indexes beyond primary one. Just used for bigBeds */ { bits16 indexCount; /* Number of extra indexes. */ /* Kind of wish next four fields, all of which are arrays indexed * by the same thing, were a single array of a structure instead. */ bits16 *indexFields; /* array of field ids, one for each extra index. */ int *maxFieldSize; /* array of maximum sizes seen for this field. */ struct bbNamedFileChunk **chunkArrayArray; /* where we keep name/start/size triples */ bits64 *fileOffsets; /* array of file offsets where indexes starts. */ int recordCount; /* number of records in file. */ }; struct bbiChromUsage *bbiChromUsageFromBedFile(struct lineFile *lf, struct hash *chromSizesHash, struct bbExIndexMaker *eim, int *retMinDiff, double *retAveSize, bits64 *retBedCount); /* Go through bed file and collect chromosomes and statistics. If eim parameter is non-NULL * collect max field sizes there too. */ #define bbiMaxZoomLevels 10 /* Max number of zoom levels */ #define bbiResIncrement 4 /* Amount to reduce at each zoom level */ int bbiCalcResScalesAndSizes(int aveSize, int resScales[bbiMaxZoomLevels], int resSizes[bbiMaxZoomLevels]); /* Fill in resScales with amount to zoom at each level, and zero out resSizes based * on average span. Returns the number of zoom levels we actually will use. */ typedef struct bbiSummary *bbiWriteReducedOnceReturnReducedTwice( struct bbiChromUsage *usageList, int fieldCount, struct lineFile *lf, bits32 initialReduction, bits32 initialReductionCount, int zoomIncrement, int blockSize, int itemsPerSlot, boolean doCompress, struct lm *lm, FILE *f, bits64 *retDataStart, bits64 *retIndexStart, struct bbiSummaryElement *totalSum); /* Typedef for a function that writes out data reduced by factor of initial reduction, and * also returns an array of bbiSummaries for the next reduction level. */ int bbiWriteZoomLevels( struct lineFile *lf, /* Input file. */ FILE *f, /* Output. */ int blockSize, /* Size of index block */ int itemsPerSlot, /* Number of data points bundled at lowest level. */ bbiWriteReducedOnceReturnReducedTwice writeReducedOnceReturnReducedTwice, /* callback */ int fieldCount, /* Number of fields in bed (4 for bedGraph) */ boolean doCompress, /* Do we compress. Answer really should be yes! */ bits64 dataSize, /* Size of data on disk (after compression if any). */ struct bbiChromUsage *usageList, /* Result from bbiChromUsageFromBedFile */ int resTryCount, int resScales[], int resSizes[], /* How much to zoom at each level */ bits32 zoomAmounts[bbiMaxZoomLevels], /* Fills in amount zoomed at each level. */ bits64 zoomDataOffsets[bbiMaxZoomLevels], /* Fills in where data starts for each zoom level. */ bits64 zoomIndexOffsets[bbiMaxZoomLevels], /* Fills in where index starts for each level. */ struct bbiSummaryElement *totalSum); /* Write out all the zoom levels and return the number of levels written. Writes * actual zoom amount and the offsets of the zoomed data and index in the last three * parameters. Sorry for all the parameters - it was this or duplicate a big chunk of * code between bedToBigBed and bedGraphToBigWig. */ int bbiCountSectionsNeeded(struct bbiChromUsage *usageList, int itemsPerSlot); /* Count up number of sections needed for data. */ void bbiAddToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, bits32 validCount, double minVal, double maxVal, double sumData, double sumSquares, int reduction, struct bbiSummary **pOutList); /* Add data range to summary - putting it onto top of list if possible, otherwise * expanding list. */ void bbiAddRangeToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, double val, int reduction, struct bbiSummary **pOutList); /* Add chromosome range to summary - putting it onto top of list if possible, otherwise * expanding list. */ struct bbiSummary *bbiReduceSummaryList(struct bbiSummary *inList, struct bbiChromInfo *chromInfoArray, int reduction); /* Reduce summary list to another summary list. */ bits64 bbiWriteSummaryAndIndex(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, boolean doCompress, FILE *f); /* Write out summary and index to summary, returning start position of * summary index. */ boolean bbiFileCheckSigs(char *fileName, bits32 sig, char *typeName); /* check file signatures at beginning and end of file */ time_t bbiUpdateTime(struct bbiFile *bbi); /* return bbi->udc->updateTime */ struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, int chromId, bits32 start, bits32 end); /* Return list of all summaries in region at given zoom level of bbiFile. */ #endif /* BBIFILE_H */ rtracklayer/src/ucsc/bbiRead.c0000644000175100017510000005750712612032142017344 0ustar00biocbuildbiocbuild/* bbiRead - Big Binary Indexed file. Stuff that's common between bigWig and bigBed on the * read side. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "obscure.h" #include "zlibFace.h" #include "bPlusTree.h" #include "hmmstats.h" #include "cirTree.h" #include "udc.h" #include "bbiFile.h" struct bbiZoomLevel *bbiBestZoom(struct bbiZoomLevel *levelList, int desiredReduction) /* Return zoom level that is the closest one that is less than or equal to * desiredReduction. */ { if (desiredReduction < 0) errAbort("bad value %d for desiredReduction in bbiBestZoom", desiredReduction); if (desiredReduction <= 1) return NULL; int closestDiff = BIGNUM; struct bbiZoomLevel *closestLevel = NULL; struct bbiZoomLevel *level; for (level = levelList; level != NULL; level = level->next) { int diff = desiredReduction - level->reductionLevel; if (diff >= 0 && diff < closestDiff) { closestDiff = diff; closestLevel = level; } } return closestLevel; } boolean bbiFileCheckSigs(char *fileName, bits32 sig, char *typeName) /* check file signatures at beginning and end of file */ { int fd = mustOpenFd(fileName, O_RDONLY); bits32 magic; boolean isSwapped = FALSE; // look for signature at the beginning of the file mustReadFd(fd, &magic, sizeof(magic)); if (magic != sig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != sig) return FALSE; } // look for signature at the end of the file mustLseek(fd, -sizeof(magic), SEEK_END); mustReadFd(fd, &magic, sizeof(magic)); mustCloseFd(&fd); if (isSwapped) { magic = byteSwap32(magic); if (magic != sig) return FALSE; } else { if (magic != sig) return FALSE; } return TRUE; } struct bbiFile *bbiFileOpen(char *fileName, bits32 sig, char *typeName) /* Open up big wig or big bed file. */ { /* This code needs to agree with code in two other places currently - bigBedFileCreate, * and bigWigFileCreate. I'm thinking of refactoring to share at least between * bigBedFileCreate and bigWigFileCreate. It'd be great so it could be structured * so that it could send the input in one chromosome at a time, and send in the zoom * stuff only after all the chromosomes are done. This'd potentially reduce the memory * footprint by a factor of 2 or 4. Still, for now it works. -JK */ struct bbiFile *bbi; AllocVar(bbi); bbi->fileName = cloneString(fileName); struct udcFile *udc = bbi->udc = udcFileOpen(fileName, udcDefaultDir()); /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustRead(udc, &magic, sizeof(magic)); if (magic != sig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != sig) errAbort("%s is not a %s file", fileName, typeName); } bbi->typeSig = sig; bbi->isSwapped = isSwapped; /* Read rest of defined bits of header, byte swapping as needed. */ bbi->version = udcReadBits16(udc, isSwapped); bbi->zoomLevels = udcReadBits16(udc, isSwapped); bbi->chromTreeOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedDataOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedIndexOffset = udcReadBits64(udc, isSwapped); bbi->fieldCount = udcReadBits16(udc, isSwapped); bbi->definedFieldCount = udcReadBits16(udc, isSwapped); bbi->asOffset = udcReadBits64(udc, isSwapped); bbi->totalSummaryOffset = udcReadBits64(udc, isSwapped); bbi->uncompressBufSize = udcReadBits32(udc, isSwapped); bbi->extensionOffset = udcReadBits64(udc, isSwapped); /* Read zoom headers. */ int i; struct bbiZoomLevel *level, *levelList = NULL; for (i=0; izoomLevels; ++i) { AllocVar(level); level->reductionLevel = udcReadBits32(udc, isSwapped); level->reserved = udcReadBits32(udc, isSwapped); level->dataOffset = udcReadBits64(udc, isSwapped); level->indexOffset = udcReadBits64(udc, isSwapped); slAddHead(&levelList, level); } slReverse(&levelList); bbi->levelList = levelList; /* Deal with header extension if any. */ if (bbi->extensionOffset != 0) { udcSeek(udc, bbi->extensionOffset); bbi->extensionSize = udcReadBits16(udc, isSwapped); bbi->extraIndexCount = udcReadBits16(udc, isSwapped); bbi->extraIndexListOffset = udcReadBits64(udc, isSwapped); } /* Attach B+ tree of chromosome names and ids. */ udcSeek(udc, bbi->chromTreeOffset); bbi->chromBpt = bptFileAttach(fileName, udc); return bbi; } void bbiFileClose(struct bbiFile **pBwf) /* Close down a big wig/big bed file. */ { struct bbiFile *bwf = *pBwf; if (bwf != NULL) { cirTreeFileDetach(&bwf->unzoomedCir); slFreeList(&bwf->levelList); slFreeList(&bwf->levelList); bptFileDetach(&bwf->chromBpt); udcFileClose(&bwf->udc); freeMem(bwf->fileName); freez(pBwf); } } static void chromIdSizeHandleSwapped(boolean isSwapped, struct bbiChromIdSize *idSize) /* Swap bytes in chromosome Id and Size as needed. */ { if (isSwapped) { idSize->chromId = byteSwap32(idSize->chromId); idSize->chromSize = byteSwap32(idSize->chromSize); } } struct fileOffsetSize *bbiOverlappingBlocks(struct bbiFile *bbi, struct cirTreeFile *ctf, char *chrom, bits32 start, bits32 end, bits32 *retChromId) /* Fetch list of file blocks that contain items overlapping chromosome range. */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return NULL; chromIdSizeHandleSwapped(bbi->isSwapped, &idSize); if (retChromId != NULL) *retChromId = idSize.chromId; return cirTreeFindOverlappingBlocks(ctf, idSize.chromId, start, end); } struct chromNameCallbackContext /* Some stuff that the bPlusTree traverser needs for context. */ { struct bbiChromInfo *list; /* The list we are building. */ boolean isSwapped; /* Need to byte-swap things? */ }; static void chromNameCallback(void *context, void *key, int keySize, void *val, int valSize) /* Callback that captures chromInfo from bPlusTree. */ { struct chromNameCallbackContext *c = context; struct bbiChromInfo *info; struct bbiChromIdSize *idSize = val; assert(valSize == sizeof(*idSize)); chromIdSizeHandleSwapped(c->isSwapped, idSize); AllocVar(info); info->name = cloneStringZ(key, keySize); info->id = idSize->chromId; info->size = idSize->chromSize; slAddHead(&c->list, info); } struct bbiChromInfo *bbiChromList(struct bbiFile *bbi) /* Return list of chromosomes. */ { struct chromNameCallbackContext context; context.list = NULL; context.isSwapped = bbi->isSwapped; bptFileTraverse(bbi->chromBpt, &context, chromNameCallback); slReverse(&context.list); return context.list; } bits32 bbiChromSize(struct bbiFile *bbi, char *chrom) /* Return chromosome size, or 0 if no such chromosome in file. */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return 0; chromIdSizeHandleSwapped(bbi->isSwapped, &idSize); return idSize.chromSize; } void bbiChromInfoFree(struct bbiChromInfo **pInfo) /* Free up one chromInfo */ { struct bbiChromInfo *info = *pInfo; if (info != NULL) { freeMem(info->name); freez(pInfo); } } void bbiChromInfoFreeList(struct bbiChromInfo **pList) /* Free a list of dynamically allocated bbiChromInfo's */ { struct bbiChromInfo *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; bbiChromInfoFree(&el); } *pList = NULL; } void bbiAttachUnzoomedCir(struct bbiFile *bbi) /* Make sure unzoomed cir is attached. */ { if (bbi->unzoomedCir == NULL) { udcSeek(bbi->udc, bbi->unzoomedIndexOffset); bbi->unzoomedCir = cirTreeFileAttach(bbi->fileName, bbi->udc); } } enum bbiSummaryType bbiSummaryTypeFromString(char *string) /* Return summary type given a descriptive string. */ { if (sameWord(string, "mean") || sameWord(string, "average")) return bbiSumMean; else if (sameWord(string, "max") || sameWord(string, "maximum")) return bbiSumMax; else if (sameWord(string, "min") || sameWord(string, "minimum")) return bbiSumMin; else if (sameWord(string, "coverage") || sameWord(string, "dataCoverage")) return bbiSumCoverage; else if (sameWord(string, "std")) return bbiSumStandardDeviation; else { errAbort("Unknown bbiSummaryType %s", string); return bbiSumMean; /* Keep compiler quiet. */ } } char *bbiSummaryTypeToString(enum bbiSummaryType type) /* Convert summary type from enum to string representation. */ { switch (type) { case bbiSumMean: return "mean"; case bbiSumMax: return "max"; case bbiSumMin: return "min"; case bbiSumCoverage: return "coverage"; case bbiSumStandardDeviation: return "std"; default: errAbort("Unknown bbiSummaryType %d", (int)type); return NULL; } } #ifdef UNUSED static void bbiSummaryOnDiskRead(struct bbiFile *bbi, struct bbiSummaryOnDisk *sum) /* Read in summary from file. */ { struct udcFile *udc = bbi->udc; boolean isSwapped = bbi->isSwapped; sum->chromId = udcReadBits32(udc, isSwapped); sum->start = udcReadBits32(udc, isSwapped); sum->end = udcReadBits32(udc, isSwapped); sum->validCount = udcReadBits32(udc, isSwapped); // looks like a bug to me, these should call udcReadFloat() udcMustReadOne(udc, sum->minVal); udcMustReadOne(udc, sum->maxVal); udcMustReadOne(udc, sum->sumData); udcMustReadOne(udc, sum->sumSquares); } #endif /* UNUSED */ static void bbiSummaryHandleSwapped(struct bbiFile *bbi, struct bbiSummaryOnDisk *in) /* Swap integer fields in summary as needed. */ { if (bbi->isSwapped) { in->chromId = byteSwap32(in->chromId); in->start = byteSwap32(in->start); in->end = byteSwap32(in->end); in->validCount = byteSwap32(in->validCount); in->minVal = byteSwapFloat(in->minVal); in->maxVal = byteSwapFloat(in->maxVal); in->sumData = byteSwapFloat(in->sumData); in->sumSquares = byteSwapFloat(in->sumSquares); } } static struct bbiSummary *bbiSummaryFromOnDisk(struct bbiSummaryOnDisk *in) /* Create a bbiSummary unlinked to anything from input in onDisk format. */ { struct bbiSummary *out; AllocVar(out); out->chromId = in->chromId; out->start = in->start; out->end = in->end; out->validCount = in->validCount; out->minVal = in->minVal; out->maxVal = in->maxVal; out->sumData = in->sumData; out->sumSquares = in->sumSquares; return out; } struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, int chromId, bits32 start, bits32 end) /* Return list of all summaries in region at given zoom level of bbiFile. */ { struct bbiSummary *sumList = NULL, *sum; struct udcFile *udc = bbi->udc; udcSeek(udc, zoom->indexOffset); struct cirTreeFile *ctf = cirTreeFileAttach(bbi->fileName, bbi->udc); struct fileOffsetSize *blockList = cirTreeFindOverlappingBlocks(ctf, chromId, start, end); struct fileOffsetSize *block, *beforeGap, *afterGap; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bbi->uncompressBufSize > 0) uncompressBuf = needLargeMem(bbi->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bbi->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Figure out bounds and number of items in block. */ int blockSize = blockEnd - blockPt; struct bbiSummaryOnDisk *dSum; int itemSize = sizeof(*dSum); assert(blockSize % itemSize == 0); int itemCount = blockSize / itemSize; /* Read in items and convert to memory list format. */ int i; for (i=0; ichromId == chromId) { int s = max(dSum->start, start); int e = min(dSum->end, end); if (s < e) { sum = bbiSummaryFromOnDisk(dSum); slAddHead(&sumList, sum); } } } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); cirTreeFileDetach(&ctf); slReverse(&sumList); return sumList; } static int normalizeCount(struct bbiSummaryElement *el, double countFactor, double minVal, double maxVal, double sumData, double sumSquares) /* normalize statistics to be based on an integer number of valid bases * Integer value is the smallest integer not less than countFactor */ { bits32 validCount = ceil(countFactor); double normFactor = (double)validCount/countFactor; el->validCount = validCount; el->minVal = minVal; el->maxVal = maxVal; el->sumData = sumData * normFactor; el->sumSquares = sumSquares * normFactor; return validCount; } static bits32 bbiSummarySlice(struct bbiFile *bbi, bits32 baseStart, bits32 baseEnd, struct bbiSummary *sumList, struct bbiSummaryElement *el) /* Update retVal with the average value if there is any data in interval. Return number * of valid data bases in interval. */ { bits32 validCount = 0; if (sumList != NULL) { double minVal = sumList->minVal; double maxVal = sumList->maxVal; double sumData = 0, sumSquares = 0; double countFactor = 0.0; struct bbiSummary *sum; for (sum = sumList; sum != NULL && sum->start < baseEnd; sum = sum->next) { int overlap = rangeIntersection(baseStart, baseEnd, sum->start, sum->end); if (overlap > 0) { double overlapFactor = (double)overlap / (sum->end - sum->start); countFactor += sum->validCount * overlapFactor; sumData += sum->sumData * overlapFactor; sumSquares += sum->sumSquares * overlapFactor; if (maxVal < sum->maxVal) maxVal = sum->maxVal; if (minVal > sum->minVal) minVal = sum->minVal; } } if (countFactor > 0) validCount = normalizeCount(el, countFactor, minVal, maxVal, sumData, sumSquares); } return validCount; } static int bbiChromId(struct bbiFile *bbi, char *chrom) /* Return chromosome Id */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return -1; chromIdSizeHandleSwapped(bbi->isSwapped, &idSize); return idSize.chromId; } static boolean bbiSummaryArrayFromZoom(struct bbiZoomLevel *zoom, struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary) /* Look up region in index and get data at given zoom level. Summarize this data * in the summary array. */ { boolean result = FALSE; int chromId = bbiChromId(bbi, chrom); if (chromId < 0) return FALSE; struct bbiSummary *sum, *sumList = bbiSummariesInRegion(zoom, bbi, chromId, start, end); if (sumList != NULL) { int i; bits32 baseStart = start, baseEnd; bits32 baseCount = end - start; sum = sumList; for (i=0; iend <= baseStart) sum = sum->next; if (bbiSummarySlice(bbi, baseStart, baseEnd, sum, &summary[i])) result = TRUE; /* Next time round start where we left off. */ baseStart = baseEnd; } slFreeList(&sumList); } return result; } static bits32 bbiIntervalSlice(struct bbiFile *bbi, bits32 baseStart, bits32 baseEnd, struct bbiInterval *intervalList, struct bbiSummaryElement *el) /* Update retVal with the average value if there is any data in interval. Return number * of valid data bases in interval. */ { bits32 validCount = 0; if (intervalList != NULL) { double countFactor = 0; struct bbiInterval *interval; double sumData = 0, sumSquares = 0; double minVal = intervalList->val; double maxVal = intervalList->val; for (interval = intervalList; interval != NULL && interval->start < baseEnd; interval = interval->next) { int overlap = rangeIntersection(baseStart, baseEnd, interval->start, interval->end); if (overlap > 0) { int intervalSize = interval->end - interval->start; double overlapFactor = (double)overlap / intervalSize; double intervalWeight = intervalSize * overlapFactor; countFactor += intervalWeight; sumData += interval->val * intervalWeight; sumSquares += interval->val * interval->val * intervalWeight; if (maxVal < interval->val) maxVal = interval->val; if (minVal > interval->val) minVal = interval->val; } } validCount = normalizeCount(el, countFactor, minVal, maxVal, sumData, sumSquares); } return validCount; } static boolean bbiSummaryArrayFromFull(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary) /* Summarize data, not using zoom. */ { struct bbiInterval *intervalList = NULL, *interval; struct lm *lm = lmInit(0); intervalList = (*fetchIntervals)(bbi, chrom, start, end, lm); boolean result = FALSE; if (intervalList != NULL) { int i; bits32 baseStart = start, baseEnd; bits32 baseCount = end - start; interval = intervalList; for (i=0; iend <= baseStart) interval = interval->next; if (bbiIntervalSlice(bbi, baseStart, end1, interval, &summary[i])) result = TRUE; /* Next time round start where we left off. */ baseStart = baseEnd; } } lmCleanup(&lm); return result; } boolean bbiSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary) /* Fill in summary with data from indicated chromosome range in bigWig file. * Returns FALSE if no data at that position. */ { boolean result = FALSE; /* Protect from bad input. */ if (start >= end) return result; bzero(summary, summarySize * sizeof(summary[0])); /* Figure out what size of data we want. We actually want to get 2 data points per summary * value if possible to minimize the effect of a data point being split between summary pixels. */ bits32 baseSize = end - start; int fullReduction = (baseSize/summarySize); int zoomLevel = fullReduction/2; if (zoomLevel < 0) zoomLevel = 0; /* Get the closest zoom level less than what we're looking for. */ struct bbiZoomLevel *zoom = bbiBestZoom(bbi->levelList, zoomLevel); if (zoom != NULL) result = bbiSummaryArrayFromZoom(zoom, bbi, chrom, start, end, summarySize, summary); else result = bbiSummaryArrayFromFull(bbi, chrom, start, end, fetchIntervals, summarySize, summary); return result; } boolean bbiSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, enum bbiSummaryType summaryType, int summarySize, double *summaryValues) /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ { struct bbiSummaryElement *elements; AllocArray(elements, summarySize); boolean ret = bbiSummaryArrayExtended(bbi, chrom, start, end, fetchIntervals, summarySize, elements); if (ret) { int i; double covFactor = (double)summarySize/(end - start); for (i=0; ivalidCount > 0) { double val; switch (summaryType) { case bbiSumMean: val = el->sumData/el->validCount; break; case bbiSumMax: val = el->maxVal; break; case bbiSumMin: val = el->minVal; break; case bbiSumCoverage: val = covFactor*el->validCount; break; case bbiSumStandardDeviation: val = calcStdFromSums(el->sumData, el->sumSquares, el->validCount); break; default: internalErr(); val = 0.0; break; } summaryValues[i] = val; } } } freeMem(elements); return ret; } struct bbiSummaryElement bbiTotalSummary(struct bbiFile *bbi) /* Return summary of entire file! */ { struct udcFile *udc = bbi->udc; boolean isSwapped = bbi->isSwapped; struct bbiSummaryElement res; ZeroVar(&res); if (bbi->totalSummaryOffset != 0) { udcSeek(udc, bbi->totalSummaryOffset); res.validCount = udcReadBits64(udc, isSwapped); res.minVal = udcReadDouble(udc, isSwapped); res.maxVal = udcReadDouble(udc, isSwapped); res.sumData = udcReadDouble(udc, isSwapped); res.sumSquares = udcReadDouble(udc, isSwapped); } else if (bbi->version == 1) /* Require version 1 so as not to have to deal with compression. Should not happen * to have NULL totalSummaryOffset for non-empty version 2+ file anyway. */ { /* Find most extreme zoom. */ struct bbiZoomLevel *bestZoom = NULL, *zoom; bits32 bestReduction = 0; for (zoom = bbi->levelList; zoom != NULL; zoom = zoom->next) { if (zoom->reductionLevel > bestReduction) { bestReduction = zoom->reductionLevel; bestZoom = zoom; } } if (bestZoom != NULL) { udcSeek(udc, bestZoom->dataOffset); bits32 zoomSectionCount = udcReadBits32(udc, isSwapped); bits32 i; for (i=0; i res.maxVal) res.maxVal = maxVal; res.sumData += udcReadFloat(udc, isSwapped); res.sumSquares += udcReadFloat(udc, isSwapped); } } } } return res; } time_t bbiUpdateTime(struct bbiFile *bbi) /* return bbi->udc->updateTime */ { struct udcFile *udc = bbi->udc; return udcUpdateTime(udc); } char *bbiCachedChromLookup(struct bbiFile *bbi, int chromId, int lastChromId, char *chromBuf, int chromBufSize) /* Return chromosome name corresponding to chromId. Because this is a bit expensive, * if you are doing this repeatedly pass in the chromId used in the previous call to * this in lastChromId, which will save it from doing the lookup again on the same * chromosome. Pass in -1 to lastChromId if this is the first time or if you can't be * bothered. The chromBufSize should be at greater or equal to bbi->keySize+1. */ { if (chromId != lastChromId) bptStringKeyAtPos(bbi->chromBpt, chromId, chromBuf, chromBufSize); return chromBuf; } rtracklayer/src/ucsc/bbiWrite.c0000644000175100017510000005551212612032142017555 0ustar00biocbuildbiocbuild/* bbiWrite.c - Routines to help write bigWig and bigBed files. See also bbiFile.h */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "linefile.h" #include "sqlNum.h" #include "zlibFace.h" #include "cirTree.h" #include "bPlusTree.h" #include "bbiFile.h" #include "obscure.h" void bbiWriteDummyHeader(FILE *f) /* Write out all-zero header, just to reserve space for it. */ { repeatCharOut(f, 0, 64); } void bbiWriteDummyZooms(FILE *f) /* Write out zeroes to reserve space for ten zoom levels. */ { repeatCharOut(f, 0, bbiMaxZoomLevels * 24); } void bbiSummaryElementWrite(FILE *f, struct bbiSummaryElement *sum) /* Write out summary element to file. */ { writeOne(f, sum->validCount); writeOne(f, sum->minVal); writeOne(f, sum->maxVal); writeOne(f, sum->sumData); writeOne(f, sum->sumSquares); } static int bbiChromInfoCmp(const void *va, const void *vb) /* Sort bbiChromInfo. Unlike most of our sorts this is single rather * than double indirect. */ { const struct bbiChromInfo *a = (const struct bbiChromInfo *)va; const struct bbiChromInfo *b = (const struct bbiChromInfo *)vb; return strcmp(a->name, b->name); } void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f) /* Write out information on chromosomes to file. */ { int chromCount = slCount(usageList); struct bbiChromUsage *usage; /* Allocate and fill in array from list. */ struct bbiChromInfo *chromInfoArray = NULL; int maxChromNameSize = 0; if (chromCount > 0) { AllocArray(chromInfoArray, chromCount); int i; for (i=0, usage = usageList; inext) { char *chromName = usage->name; int len = strlen(chromName); if (len > maxChromNameSize) maxChromNameSize = len; chromInfoArray[i].name = chromName; chromInfoArray[i].id = usage->id; chromInfoArray[i].size = usage->size; } /* Sort so the b-Tree actually works. */ qsort(chromInfoArray, chromCount, sizeof(chromInfoArray[0]), bbiChromInfoCmp); } /* Write chromosome bPlusTree */ int chromBlockSize = min(blockSize, chromCount); bptFileBulkIndexToOpenFile(chromInfoArray, sizeof(chromInfoArray[0]), chromCount, chromBlockSize, bbiChromInfoKey, maxChromNameSize, bbiChromInfoVal, sizeof(chromInfoArray[0].id) + sizeof(chromInfoArray[0].size), f); freeMem(chromInfoArray); } void bbiWriteFloat(FILE *f, float val) /* Write out floating point val to file. Mostly to convert from double... */ { writeOne(f, val); } struct hash *bbiChromSizesFromFile(char *fileName) /* Read two column file into hash keyed by chrom. */ { struct hash *hash = hashNew(0); struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; while (lineFileRow(lf, row)) hashAddInt(hash, row[0], sqlUnsigned(row[1])); lineFileClose(&lf); return hash; } void bbiChromInfoKey(const void *va, char *keyBuf) /* Get key field out of bbiChromInfo. */ { const struct bbiChromInfo *a = ((struct bbiChromInfo *)va); strcpy(keyBuf, a->name); } void *bbiChromInfoVal(const void *va) /* Get val field out of bbiChromInfo. */ { const struct bbiChromInfo *a = ((struct bbiChromInfo *)va); return (void*)(&a->id); } void bbiChromUsageFree(struct bbiChromUsage **pUsage) /* free a single bbiChromUsage structure */ { struct bbiChromUsage *usage = *pUsage; if (usage != NULL) { freeMem(usage->name); freez(pUsage); } } void bbiChromUsageFreeList(struct bbiChromUsage **pList) /* free a list of bbiChromUsage structures */ { struct bbiChromUsage *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; bbiChromUsageFree(&el); } *pList = NULL; } int bbExIndexMakerMaxIndexField(struct bbExIndexMaker *eim) /* Return the maximum field we have to index. */ { int maxIx = 0; int i; for (i=0; iindexCount; ++i) { int ix = eim->indexFields[i]; if (ix > maxIx) maxIx = ix; } return maxIx; } void bbExIndexMakerUpdateMaxFieldSize(struct bbExIndexMaker *eim, char **row) /* Fold in information about row into bbExIndexMaker into eim->maxFieldSize */ { int i; for (i=0; iindexCount; ++i) { int rowIx = eim->indexFields[i]; int size = strlen(row[rowIx]); if (size > eim->maxFieldSize[i]) eim->maxFieldSize[i] = size; } } struct bbiChromUsage *bbiChromUsageFromBedFile(struct lineFile *lf, struct hash *chromSizesHash, struct bbExIndexMaker *eim, int *retMinDiff, double *retAveSize, bits64 *retBedCount) /* Go through bed file and collect chromosomes and statistics. If eim parameter is non-NULL * collect max field sizes there too. */ { int maxRowSize = (eim == NULL ? 3 : bbExIndexMakerMaxIndexField(eim) + 1); char *row[maxRowSize]; struct hash *uniqHash = hashNew(0); struct bbiChromUsage *usage = NULL, *usageList = NULL; int lastStart = -1; bits32 id = 0; bits64 totalBases = 0, bedCount = 0; int minDiff = BIGNUM; lineFileRemoveInitialCustomTrackLines(lf); for (;;) { int rowSize = lineFileChopNext(lf, row, maxRowSize); if (rowSize == 0) break; lineFileExpectAtLeast(lf, maxRowSize, rowSize); char *chrom = row[0]; int start = lineFileNeedNum(lf, row, 1); int end = lineFileNeedNum(lf, row, 2); if (eim != NULL) bbExIndexMakerUpdateMaxFieldSize(eim, row); if (start > end) { errAbort("end (%d) before start (%d) line %d of %s", end, start, lf->lineIx, lf->fileName); } ++bedCount; totalBases += (end - start); if (usage == NULL || differentString(usage->name, chrom)) { if (hashLookup(uniqHash, chrom)) { errAbort("%s is not sorted at line %d. Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.", lf->fileName, lf->lineIx); } hashAdd(uniqHash, chrom, NULL); struct hashEl *chromHashEl = hashLookup(chromSizesHash, chrom); if (chromHashEl == NULL) errAbort("%s is not found in chromosome sizes file", chrom); int chromSize = ptToInt(chromHashEl->val); AllocVar(usage); usage->name = cloneString(chrom); usage->id = id++; usage->size = chromSize; slAddHead(&usageList, usage); lastStart = -1; } if (end > usage->size) errAbort("End coordinate %d bigger than %s size of %d line %d of %s", end, usage->name, usage->size, lf->lineIx, lf->fileName); usage->itemCount += 1; if (lastStart >= 0) { int diff = start - lastStart; if (diff < minDiff) { if (diff < 0) errAbort("%s is not sorted at line %d. Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.", lf->fileName, lf->lineIx); minDiff = diff; } } lastStart = start; } slReverse(&usageList); double aveSize = 0; if (bedCount > 0) aveSize = (double)totalBases/bedCount; *retMinDiff = minDiff; *retAveSize = aveSize; *retBedCount = bedCount; freeHash(&uniqHash); return usageList; } int bbiCalcResScalesAndSizes(int aveSize, int resScales[bbiMaxZoomLevels], int resSizes[bbiMaxZoomLevels]) /* Fill in resScales with amount to zoom at each level, and zero out resSizes based * on average span. Returns the number of zoom levels we actually will use. */ { int resTryCount = bbiMaxZoomLevels, resTry; int resIncrement = bbiResIncrement; int minZoom = 10; int res = aveSize; if (res < minZoom) res = minZoom; for (resTry = 0; resTry < resTryCount; ++resTry) { resSizes[resTry] = 0; resScales[resTry] = res; // if aveSize is large, then the initial value of res is large, and we // and we cannot do all 10 levels without overflowing res* integers and other related variables. if (res > 1000000000) { resTryCount = resTry + 1; verbose(2, "resTryCount reduced from 10 to %d\n", resTryCount); break; } res *= resIncrement; } return resTryCount; } int bbiWriteZoomLevels( struct lineFile *lf, /* Input file. */ FILE *f, /* Output. */ int blockSize, /* Size of index block */ int itemsPerSlot, /* Number of data points bundled at lowest level. */ bbiWriteReducedOnceReturnReducedTwice writeReducedOnceReturnReducedTwice, /* callback */ int fieldCount, /* Number of fields in bed (4 for bedGraph) */ boolean doCompress, /* Do we compress. Answer really should be yes! */ bits64 dataSize, /* Size of data on disk (after compression if any). */ struct bbiChromUsage *usageList, /* Result from bbiChromUsageFromBedFile */ int resTryCount, int resScales[], int resSizes[], /* How much to zoom at each level */ bits32 zoomAmounts[bbiMaxZoomLevels], /* Fills in amount zoomed at each level. */ bits64 zoomDataOffsets[bbiMaxZoomLevels], /* Fills in where data starts for each zoom level. */ bits64 zoomIndexOffsets[bbiMaxZoomLevels], /* Fills in where index starts for each level. */ struct bbiSummaryElement *totalSum) /* Write out all the zoom levels and return the number of levels written. Writes * actual zoom amount and the offsets of the zoomed data and index in the last three * parameters. Sorry for all the parameters - it was this or duplicate a big chunk of * code between bedToBigBed and bedGraphToBigWig. */ { /* Write out first zoomed section while storing in memory next zoom level. */ assert(resTryCount > 0); int maxReducedSize = dataSize/2; int initialReduction = 0, initialReducedCount = 0; /* Figure out initialReduction for zoom - one that is maxReducedSize or less. */ int resTry; for (resTry = 0; resTry < resTryCount; ++resTry) { bits64 reducedSize = resSizes[resTry] * sizeof(struct bbiSummaryOnDisk); if (doCompress) reducedSize /= 2; // Estimate! if (reducedSize <= maxReducedSize) { initialReduction = resScales[resTry]; initialReducedCount = resSizes[resTry]; break; } } verbose(2, "initialReduction %d, initialReducedCount = %d\n", initialReduction, initialReducedCount); /* Force there to always be at least one zoom. It may waste a little space on small * files, but it makes files more uniform, and avoids special case code for calculating * overall file summary. */ if (initialReduction == 0) { initialReduction = resScales[0]; initialReducedCount = resSizes[0]; } /* Call routine to make the initial zoom level and also a bit of work towards further levels. */ struct lm *lm = lmInit(0); int zoomIncrement = bbiResIncrement; lineFileRewind(lf); struct bbiSummary *rezoomedList = writeReducedOnceReturnReducedTwice(usageList, fieldCount, lf, initialReduction, initialReducedCount, zoomIncrement, blockSize, itemsPerSlot, doCompress, lm, f, &zoomDataOffsets[0], &zoomIndexOffsets[0], totalSum); verboseTime(2, "writeReducedOnceReturnReducedTwice"); zoomAmounts[0] = initialReduction; int zoomLevels = 1; /* Loop around to do any additional levels of zoom. */ int zoomCount = initialReducedCount; int reduction = initialReduction * zoomIncrement; while (zoomLevels < bbiMaxZoomLevels) { int rezoomCount = slCount(rezoomedList); if (rezoomCount >= zoomCount) break; zoomCount = rezoomCount; zoomDataOffsets[zoomLevels] = ftell(f); zoomIndexOffsets[zoomLevels] = bbiWriteSummaryAndIndex(rezoomedList, blockSize, itemsPerSlot, doCompress, f); zoomAmounts[zoomLevels] = reduction; ++zoomLevels; reduction *= zoomIncrement; rezoomedList = bbiSummarySimpleReduce(rezoomedList, reduction, lm); } lmCleanup(&lm); verboseTime(2, "further reductions"); return zoomLevels; } int bbiCountSectionsNeeded(struct bbiChromUsage *usageList, int itemsPerSlot) /* Count up number of sections needed for data. */ { struct bbiChromUsage *usage; int count = 0; for (usage = usageList; usage != NULL; usage = usage->next) { int countOne = (usage->itemCount + itemsPerSlot - 1)/itemsPerSlot; count += countOne; verbose(2, "%s %d, %d blocks of %d\n", usage->name, usage->itemCount, countOne, itemsPerSlot); } return count; } void bbiAddToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, bits32 validCount, double minVal, double maxVal, double sumData, double sumSquares, int reduction, struct bbiSummary **pOutList) /* Add data range to summary - putting it onto top of list if possible, otherwise * expanding list. */ { struct bbiSummary *sum = *pOutList; if (end > chromSize) // Avoid pathological clipping situation on bad input end = chromSize; while (start < end) { /* See if need to allocate a new summary. */ if (sum == NULL || sum->chromId != chromId || sum->end <= start) { struct bbiSummary *newSum; AllocVar(newSum); newSum->chromId = chromId; if (sum == NULL || sum->chromId != chromId || sum->end + reduction <= start) newSum->start = start; else newSum->start = sum->end; newSum->end = newSum->start + reduction; if (newSum->end > chromSize) newSum->end = chromSize; newSum->minVal = minVal; newSum->maxVal = maxVal; sum = newSum; slAddHead(pOutList, sum); } /* Figure out amount of overlap between current summary and item */ int overlap = rangeIntersection(start, end, sum->start, sum->end); if (overlap <= 0) { warn("%u %u doesn't intersect %u %u, chromId %u chromSize %u", start, end, sum->start, sum->end, chromId, chromSize); internalErr(); } int itemSize = end - start; double overlapFactor = (double)overlap/itemSize; /* Fold overlapping bits into output. */ sum->validCount += overlapFactor * validCount; if (sum->minVal > minVal) sum->minVal = minVal; if (sum->maxVal < maxVal) sum->maxVal = maxVal; sum->sumData += overlapFactor * sumData; sum->sumSquares += overlapFactor * sumSquares; /* Advance over overlapping bits. */ start += overlap; } } void bbiAddRangeToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, double val, int reduction, struct bbiSummary **pOutList) /* Add chromosome range to summary - putting it onto top of list if possible, otherwise * expanding list. */ { int size = end-start; double sum = size*val; double sumSquares = sum*val; bbiAddToSummary(chromId, chromSize, start, end, size, val, val, sum, sumSquares, reduction, pOutList); } struct bbiSummary *bbiReduceSummaryList(struct bbiSummary *inList, struct bbiChromInfo *chromInfoArray, int reduction) /* Reduce summary list to another summary list. */ { struct bbiSummary *outList = NULL; struct bbiSummary *sum; for (sum = inList; sum != NULL; sum = sum->next) bbiAddToSummary(sum->chromId, chromInfoArray[sum->chromId].size, sum->start, sum->end, sum->validCount, sum->minVal, sum->maxVal, sum->sumData, sum->sumSquares, reduction, &outList); slReverse(&outList); return outList; } bits64 bbiTotalSummarySize(struct bbiSummary *list) /* Return size on disk of all summaries. */ { struct bbiSummary *el; bits64 total = 0; for (el = list; el != NULL; el = el->next) total += sizeof(struct bbiSummaryOnDisk); return total; } static bits64 bbiSummaryFetchOffset(const void *va, void *context) /* Fetch bbiSummary file offset for r-tree */ { const struct bbiSummary *a = *((struct bbiSummary **)va); return a->fileOffset; } static struct cirTreeRange bbiSummaryFetchKey(const void *va, void *context) /* Fetch bbiSummary key for r-tree */ { struct cirTreeRange res; const struct bbiSummary *a = *((struct bbiSummary **)va); res.chromIx = a->chromId; res.start = a->start; res.end = a->end; return res; } static bits64 bbiWriteSummaryAndIndexComp(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, FILE *f) /* Write out summary and index to summary uncompressed, returning start position of * summary index. */ { bits32 i, count = slCount(summaryList); struct bbiSummary **summaryArray; AllocArray(summaryArray, count); writeOne(f, count); struct bbiSummary *summary = summaryList; /* Figure out max size of uncompressed and compressed blocks. */ bits32 itemSize = sizeof(summary->chromId) + sizeof(summary->start) + sizeof(summary->end) + sizeof(summary->validCount) + 4*sizeof(float); int uncBufSize = itemSize * itemsPerSlot; char uncBuf[uncBufSize]; int compBufSize = zCompBufSize(uncBufSize); char compBuf[compBufSize]; /* Loop through compressing and writing one slot at a time. */ bits32 itemsLeft = count; int sumIx = 0; while (itemsLeft > 0) { bits32 itemsInSlot = itemsLeft; if (itemsInSlot > itemsPerSlot) itemsInSlot = itemsPerSlot; char *writePt = uncBuf; bits64 filePos = ftell(f); for (i=0; ichromId); memWriteOne(&writePt, summary->start); memWriteOne(&writePt, summary->end); memWriteOne(&writePt, summary->validCount); memWriteFloat(&writePt, summary->minVal); memWriteFloat(&writePt, summary->maxVal); memWriteFloat(&writePt, summary->sumData); memWriteFloat(&writePt, summary->sumSquares); summary->fileOffset = filePos; summary = summary->next; if (summary == NULL) break; } bits32 uncSize = writePt - uncBuf; int compSize = zCompress(uncBuf, uncSize, compBuf, compBufSize); mustWrite(f, compBuf, compSize); itemsLeft -= itemsInSlot; } bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(summaryArray, sizeof(summaryArray[0]), count, blockSize, itemsPerSlot, NULL, bbiSummaryFetchKey, bbiSummaryFetchOffset, indexOffset, f); freez(&summaryArray); return indexOffset; } static bits64 bbiWriteSummaryAndIndexUnc(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, FILE *f) /* Write out summary and index to summary compressed, returning start position of * summary index. */ { bits32 i, count = slCount(summaryList); struct bbiSummary **summaryArray; AllocArray(summaryArray, count); writeOne(f, count); struct bbiSummary *summary; for (summary = summaryList, i=0; summary != NULL; summary = summary->next, ++i) { summaryArray[i] = summary; summary->fileOffset = ftell(f); writeOne(f, summary->chromId); writeOne(f, summary->start); writeOne(f, summary->end); writeOne(f, summary->validCount); bbiWriteFloat(f, summary->minVal); bbiWriteFloat(f, summary->maxVal); bbiWriteFloat(f, summary->sumData); bbiWriteFloat(f, summary->sumSquares); } bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(summaryArray, sizeof(summaryArray[0]), count, blockSize, itemsPerSlot, NULL, bbiSummaryFetchKey, bbiSummaryFetchOffset, indexOffset, f); freez(&summaryArray); return indexOffset; } bits64 bbiWriteSummaryAndIndex(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, boolean doCompress, FILE *f) /* Write out summary and index to summary, returning start position of * summary index. */ { if (doCompress) return bbiWriteSummaryAndIndexComp(summaryList, blockSize, itemsPerSlot, f); else return bbiWriteSummaryAndIndexUnc(summaryList, blockSize, itemsPerSlot, f); } struct cirTreeRange bbiBoundsArrayFetchKey(const void *va, void *context) /* Fetch bbiBoundsArray key for r-tree */ { const struct bbiBoundsArray *a = ((struct bbiBoundsArray *)va); return a->range; } bits64 bbiBoundsArrayFetchOffset(const void *va, void *context) /* Fetch bbiBoundsArray file offset for r-tree */ { const struct bbiBoundsArray *a = ((struct bbiBoundsArray *)va); return a->offset; } struct bbiSumOutStream *bbiSumOutStreamOpen(int allocCount, FILE *f, boolean doCompress) /* Allocate new bbiSumOutStream. */ { struct bbiSumOutStream *stream; AllocVar(stream); AllocArray(stream->array, allocCount); stream->allocCount = allocCount; stream->f = f; stream->doCompress = doCompress; return stream; } void bbiSumOutStreamFlush(struct bbiSumOutStream *stream) /* Flush out any pending input. */ { if (stream->elCount != 0) { int uncSize = stream->elCount * sizeof(stream->array[0]); if (stream->doCompress) { int compBufSize = zCompBufSize(uncSize); char compBuf[compBufSize]; int compSize = zCompress(stream->array, uncSize, compBuf, compBufSize); mustWrite(stream->f, compBuf, compSize); } else { mustWrite(stream->f, stream->array, uncSize); } stream->elCount = 0; } } void bbiSumOutStreamClose(struct bbiSumOutStream **pStream) /* Free up bbiSumOutStream */ { struct bbiSumOutStream *stream = *pStream; if (stream != NULL) { bbiSumOutStreamFlush(stream); freeMem(stream->array); freez(pStream); } } void bbiSumOutStreamWrite(struct bbiSumOutStream *stream, struct bbiSummary *sum) /* Write out next one to stream. */ { int elCount = stream->elCount; struct bbiSummaryOnDisk *a = &stream->array[elCount]; a->chromId = sum->chromId; a->start = sum->start; a->end = sum->end; a->validCount = sum->validCount; a->minVal = sum->minVal; a->maxVal = sum->maxVal; a->sumData = sum->sumData; a->sumSquares = sum->sumSquares; elCount += 1; stream->elCount = elCount; if (elCount >= stream->allocCount) bbiSumOutStreamFlush(stream); } void bbiOutputOneSummaryFurtherReduce(struct bbiSummary *sum, struct bbiSummary **pTwiceReducedList, int doubleReductionSize, struct bbiBoundsArray **pBoundsPt, struct bbiBoundsArray *boundsEnd, struct lm *lm, struct bbiSumOutStream *stream) /* Write out sum to file, keeping track of minimal info on it in *pBoundsPt, and also adding * it to second level summary. */ { /* Get place to store file offset etc and make sure we have not gone off end. */ struct bbiBoundsArray *bounds = *pBoundsPt; assert(bounds < boundsEnd); *pBoundsPt += 1; /* Fill in bounds info. */ bounds->offset = ftell(stream->f); bounds->range.chromIx = sum->chromId; bounds->range.start = sum->start; bounds->range.end = sum->end; /* Write out summary info. */ bbiSumOutStreamWrite(stream, sum); /* Fold summary info into pTwiceReducedList. */ struct bbiSummary *twiceReduced = *pTwiceReducedList; if (twiceReduced == NULL || twiceReduced->chromId != sum->chromId || twiceReduced->start + doubleReductionSize < sum->end) { lmAllocVar(lm, twiceReduced); *twiceReduced = *sum; slAddHead(pTwiceReducedList, twiceReduced); } else { twiceReduced->end = sum->end; twiceReduced->validCount += sum->validCount; if (sum->minVal < twiceReduced->minVal) twiceReduced->minVal = sum->minVal; if (sum->maxVal > twiceReduced->maxVal) twiceReduced->maxVal = sum->maxVal; twiceReduced->sumData += sum->sumData; twiceReduced->sumSquares += sum->sumSquares; } } struct bbiSummary *bbiSummarySimpleReduce(struct bbiSummary *list, int reduction, struct lm *lm) /* Do a simple reduction - where among other things the reduction level is an integral * multiple of the previous reduction level, and the list is sorted. Allocate result out of lm. */ { struct bbiSummary *newList = NULL, *sum, *newSum = NULL; for (sum = list; sum != NULL; sum = sum->next) { if (newSum == NULL || newSum->chromId != sum->chromId || sum->end > newSum->start + reduction) { lmAllocVar(lm, newSum); *newSum = *sum; slAddHead(&newList, newSum); } else { assert(newSum->end < sum->end); // check sorted input assumption newSum->end = sum->end; newSum->validCount += sum->validCount; if (newSum->minVal > sum->minVal) newSum->minVal = sum->minVal; if (newSum->maxVal < sum->maxVal) newSum->maxVal = sum->maxVal; newSum->sumData += sum->sumData; newSum->sumSquares += sum->sumSquares; } } slReverse(&newList); return newList; } rtracklayer/src/ucsc/bigBed.h0000644000175100017510000001454112612032142017164 0ustar00biocbuildbiocbuild/* bigBed - interface to binary file with bed-style values (that is a bunch of * possibly overlapping regions. * * This shares a lot with the bigWig module. * * Most of the functions here are concerned with reading bigBed files. There's * two common things you want to do with a bigBed, either stream through everything in it, * or just read the parts that overlap a interval within the genome. The files * are optimized for interval queries, but streaming through them is not difficult either. * * To query an interval: * struct bbiFile *bbi = bigBedFileOpen(fileName); * struct lm *lm = lmInit(0); // Memory pool to hold returned list * struct bigBedInterval *list = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); * struct bigBedInterval *el; * for (el = list; el != NULL; el = el->next) * // do something involving chrom, el->start, el->end * lmCleanup(&lm); // typically do this after each query * bigBedFileClose(&bbi); // typically only do this when finished all queries * * To stream through whole file * struct bbiFile *bbi = bigBedFileOpen(fileName); * struct bbiChromInfo *chrom, *chromList = bbiChromList(bbi); * for (chrom = chromList; chrom != NULL; chrom = chrom->next) * { * struct lm *lm = lmInit(0); * struct bigBedInterval *list = bigBedIntervalQuery(bbi,chrom->name,0,chrom->size,0,lm); * struct bigBedInterval *el; * for (el = list; el != NULL; el = el->next) * // do something involving chrom, el->start, el->end * lmCleanup(&lm); * } * bigBedFileClose(&bbi); * * The processes for streaming through or doing interval queries on a bigWig file are very * similar. */ #ifndef BIGBED_H #define BIGBED_H #ifndef BBIFILE #include "bbiFile.h" #endif struct bigBedInterval /* A partially parsed out bed record plus some extra fields. Use this directly * or convert it to an array of characters with bigBedIntervalToRow. */ { struct bigBedInterval *next; /* Next in list. */ bits32 start, end; /* Range inside chromosome - half open zero based. */ char *rest; /* Rest of line. May be NULL*/ bits32 chromId; /* ID of chromosome. */ }; /*** Routines to open & close bigBed files, and to do chromosome range queries on them. ***/ struct bbiFile *bigBedFileOpen(char *fileName); /* Open up big bed file. Free this up with bbiFileClose. */ #define bigBedFileClose(a) bbiFileClose(a) struct bigBedInterval *bigBedIntervalQuery(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int maxItems, struct lm *lm); /* Get data for interval. Return list allocated out of lm. Set maxItems to maximum * number of items to return, or to 0 for all items. */ int bigBedIntervalToRow(struct bigBedInterval *interval, char *chrom, char *startBuf, char *endBuf, char **row, int rowSize); /* Convert bigBedInterval into an array of chars equivalent to what you'd get by * parsing the bed file. The startBuf and endBuf are used to hold the ascii representation of * start and end. Note that the interval->rest string will have zeroes inserted as a side effect. * Returns number of fields in row. */ boolean bigBedSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigBed file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ boolean bigBedSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary); /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ /*** Some routines for accessing bigBed items via name. ***/ struct bigBedInterval *bigBedNameQuery(struct bbiFile *bbi, struct bptFile *index, int fieldIx, char *name, struct lm *lm); /* Return list of intervals matching file. These intervals will be allocated out of lm. */ struct bigBedInterval *bigBedMultiNameQuery(struct bbiFile *bbi, struct bptFile *index, int fieldIx, char **names, int nameCount, struct lm *lm); /* Fetch all records matching any of the names. Using given index on given field. * Return list is allocated out of lm. */ int bigBedIntervalToRowLookupChrom(struct bigBedInterval *interval, struct bigBedInterval *prevInterval, struct bbiFile *bbi, char *chromBuf, int chromBufSize, char *startBuf, char *endBuf, char **row, int rowSize); /* Convert bigBedInterval to array of chars equivalend to what you'd get by parsing the * bed file. If you already know what chromosome the interval is on use the simpler * bigBedIntervalToRow. This one will look up the chromosome based on the chromId field * of the interval, which is relatively time consuming. To avoid doing this unnecessarily * pass in a non-NULL prevInterval, and if the chromId is the same on prevInterval as this, * it will avoid the lookup. The chromBufSize should be at greater or equal to * bbi->chromBpt->keySize+1. The startBuf and endBuf are used to hold the ascii representation of * start and end, and should be 16 bytes. Note that the interval->rest string will have zeroes * inserted as a side effect. Returns number of fields in row. */ void bigBedIntervalListToBedFile(struct bbiFile *bbi, struct bigBedInterval *intervalList, FILE *f); /* Write out big bed interval list to bed file, looking up chromosome. */ /** Routines to access other data from a bigBed file. */ bits64 bigBedItemCount(struct bbiFile *bbi); /* Return total items in file. */ char *bigBedAutoSqlText(struct bbiFile *bbi); /* Get autoSql text if any associated with file. Do a freeMem of this when done. */ boolean bigBedFileCheckSigs(char *fileName); /* check file signatures at beginning and end of file */ struct bptFile *bigBedOpenExtraIndex(struct bbiFile *bbi, char *fieldName, int *retFieldIx); /* Return index associated with fieldName. Aborts if no such index. Optionally return * index in a row of this field. */ struct slName *bigBedListExtraIndexes(struct bbiFile *bbi); /* Return list of names of extra indexes beyond primary chrom:start-end one" */ #endif /* BIGBED_H */ rtracklayer/src/ucsc/bigWig.h0000644000175100017510000001277012612032142017222 0ustar00biocbuildbiocbuild/* bigWig - interface to binary file with wiggle-style values (that is a bunch of * small non-overlapping regions each associated with a floating point value. * * There are several ways to use this module. To create a new bigWig file use the * bigWigCreate function, which takes as input an ascii file in fixedStep, variableStep * or bedGraph format. * * To get a section of of a bigWig for display on a browser, use the bigWigSummaryArray * function, which will fill in an array of doubles with on value for each pixel that * you want to display. * * To read all the data out of a bigWig get the chromosome info with bbiChromList * and then fetch all of it for each chromosome using bigWigIntervalQuery. * * See also the module bbiFile that has a description of they structure of * a bigWig file, and lower level routines used to implement this interface. */ #ifndef BIGWIG_H #define BIGWIG_H #ifndef BBIFILE #include "bbiFile.h" #endif #ifndef BITS_H #include "bits.h" #endif void bigWigFileCreateEx( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ boolean keepAllChromosomes, /* If TRUE then store all chromosomes in chromosomal b-tree. */ boolean fixedSummaries, /* If TRUE then impose fixed summary levels. */ char *outName); /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ void bigWigFileCreate( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ char *outName); /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ struct bbiFile *bigWigFileOpen(char *fileName); /* Open up big wig file. Free this up with bbiFileClose */ #define bigWigFileClose(a) bbiFileClose(a) struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm); /* Get data for interval. Return list allocated out of lm. */ int bigWigIntervalDump(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int maxCount, FILE *out); /* Print out info on bigWig parts that intersect chrom:start-end. Set maxCount to 0 if you * don't care how many are printed. Returns number printed. */ boolean bigWigSummaryArray(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan(0) depending on the application.) Returns FALSE if no data * at that position. */ boolean bigWigSummaryArrayExtended(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary); /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ double bigWigSingleSummary(struct bbiFile *bwf, char *chrom, int start, int end, enum bbiSummaryType summaryType, double defaultVal); /* Return the summarized single value for a range. */ boolean isBigWig(char *fileName); /* Peak at a file to see if it's bigWig */ boolean bigWigFileCheckSigs(char *fileName); /* check file signatures at beginning and end of file */ /* bigWigValsOnChrom - a little system for optimizing bigWig use when doing a pass over the * whole chromosome. How it is used typically is: * struct bigWigValsOnChrom *chromVals = bigWigValsOnChromNew(); * for (chrom = chromList; chrom != NULL; chrom = chrom->next) * { * if (bigWigValsOnChromFetchData(chromVals, chrom->name, bigWig)) * // do stuff using the valBuf, or covBuf fields which have * // the big wig data unpacked into them. Can use chromSize and chrom too * } * bigWigValsOnChromFree(&chromVals); */ struct bigWigValsOnChrom /* Object for bulk access a chromosome at a time. This is faster than * doing bigWigInterval queries when you have ~3000 or more queries. */ { struct bigWigValsOnChrom *next; char *chrom; /* Current chromosome. */ long chromSize; /* Size of current chromosome. */ long bufSize; /* Size of allocated buffer */ double *valBuf; /* A value for each base on chrom. Zero where no data. */ Bits *covBuf; /* A bit for each base with data. */ }; struct bigWigValsOnChrom *bigWigValsOnChromNew(); /* Allocate new empty bigWigValsOnChromStructure. */ void bigWigValsOnChromFree(struct bigWigValsOnChrom **pChromVals); /* Free up bigWigValsOnChrom */ boolean bigWigValsOnChromFetchData(struct bigWigValsOnChrom *chromVals, char *chrom, struct bbiFile *bigWig); /* Fetch data for chromosome from bigWig. Returns FALSE if not data on that chrom. */ #endif /* BIGWIG_H */ rtracklayer/src/ucsc/bits.c0000644000175100017510000002153512612032142016745 0ustar00biocbuildbiocbuild/* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "bits.h" static Bits oneBit[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1}; static Bits leftMask[8] = {0xFF, 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1,}; static Bits rightMask[8] = {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF,}; int bitsInByte[256]; static boolean inittedBitsInByte = FALSE; void bitsInByteInit() /* Initialize bitsInByte array. */ { int i; if (!inittedBitsInByte) { inittedBitsInByte = TRUE; for (i=0; i<256; ++i) { int count = 0; if (i&1) count = 1; if (i&2) ++count; if (i&4) ++count; if (i&8) ++count; if (i&0x10) ++count; if (i&0x20) ++count; if (i&0x40) ++count; if (i&0x80) ++count; bitsInByte[i] = count; } } } Bits *bitAlloc(int bitCount) /* Allocate bits. */ { int byteCount = ((bitCount+7)>>3); return needLargeZeroedMem(byteCount); } Bits *bitRealloc(Bits *b, int bitCount, int newBitCount) /* Resize a bit array. If b is null, allocate a new array */ { int byteCount = ((bitCount+7)>>3); int newByteCount = ((newBitCount+7)>>3); return needLargeZeroedMemResize(b, byteCount, newByteCount); } Bits *bitClone(Bits* orig, int bitCount) /* Clone bits. */ { int byteCount = ((bitCount+7)>>3); Bits* bits = needLargeZeroedMem(byteCount); memcpy(bits, orig, byteCount); return bits; } void bitFree(Bits **pB) /* Free bits. */ { freez(pB); } Bits *lmBitAlloc(struct lm *lm,int bitCount) // Allocate bits. Must supply local memory. { assert(lm != NULL); int byteCount = ((bitCount+7)>>3); return lmAlloc(lm,byteCount); } Bits *lmBitRealloc(struct lm *lm,Bits *b, int bitCount, int newBitCount) // Resize a bit array. If b is null, allocate a new array. Must supply local memory. { assert(lm != NULL); int byteCount = ((bitCount+7)>>3); int newByteCount = ((newBitCount+7)>>3); return lmAllocMoreMem(lm, b ,byteCount, newByteCount); } Bits *lmBitClone(struct lm *lm,Bits* orig, int bitCount) // Clone bits. Must supply local memory. { assert(lm != NULL); int byteCount = ((bitCount+7)>>3); Bits* bits = lmAlloc(lm,byteCount); memcpy(bits, orig, byteCount); return bits; } void bitSetOne(Bits *b, int bitIx) /* Set a single bit. */ { b[bitIx>>3] |= oneBit[bitIx&7]; } void bitClearOne(Bits *b, int bitIx) /* Clear a single bit. */ { b[bitIx>>3] &= ~oneBit[bitIx&7]; } void bitSetRange(Bits *b, int startIx, int bitCount) /* Set a range of bits. */ { if (bitCount <= 0) return; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; if (startByte == endByte) { b[startByte] |= (leftMask[startBits] & rightMask[endBits]); return; } b[startByte] |= leftMask[startBits]; for (i = startByte+1; i>3] & oneBit[bitIx&7]) != 0; } int bitCountRange(Bits *b, int startIx, int bitCount) /* Count number of bits set in range. */ { if (bitCount <= 0) return 0; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; int count = 0; if (!inittedBitsInByte) bitsInByteInit(); if (startByte == endByte) return bitsInByte[b[startByte] & leftMask[startBits] & rightMask[endBits]]; count = bitsInByte[b[startByte] & leftMask[startBits]]; for (i = startByte+1; i>3); int iByte; /* scan initial byte */ while (((iBit & 7) != 0) && (iBit < bitCount)) { if (bitReadOne(b, iBit) == val) return iBit; iBit++; } /* scan byte at a time, if not already in last byte */ iByte = (iBit >> 3); if (iByte < endByte) { while ((iByte < endByte) && (b[iByte] == notByteVal)) iByte++; iBit = iByte << 3; } /* scan last byte */ while (iBit < bitCount) { if (bitReadOne(b, iBit) == val) return iBit; iBit++; } return bitCount; /* not found */ } int bitFindSet(Bits *b, int startIx, int bitCount) /* Find the index of the the next set bit. */ { return bitFind(b, startIx, TRUE, bitCount); } int bitFindClear(Bits *b, int startIx, int bitCount) /* Find the index of the the next clear bit. */ { return bitFind(b, startIx, FALSE, bitCount); } void bitClear(Bits *b, int bitCount) /* Clear many bits (possibly up to 7 beyond bitCount). */ { int byteCount = ((bitCount+7)>>3); zeroBytes(b, byteCount); } void bitClearRange(Bits *b, int startIx, int bitCount) /* Clear a range of bits. */ { if (bitCount <= 0) return; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; if (startByte == endByte) { b[startByte] &= ~(leftMask[startBits] & rightMask[endBits]); return; } b[startByte] &= ~leftMask[startBits]; for (i = startByte+1; i>3); while (--byteCount >= 0) { *a = (*a & *b++); a++; } } int bitAndCount(Bits *a, Bits *b, int bitCount) // Without altering 2 bitmaps, count the AND bits. { int byteCount = ((bitCount+7)>>3); int count = 0; if (!inittedBitsInByte) bitsInByteInit(); while (--byteCount >= 0) count += bitsInByte[(*a++ & *b++)]; return count; } void bitOr(Bits *a, Bits *b, int bitCount) /* Or two bitmaps. Put result in a. */ { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = (*a | *b++); a++; } } int bitOrCount(Bits *a, Bits *b, int bitCount) // Without altering 2 bitmaps, count the OR'd bits. { int byteCount = ((bitCount+7)>>3); int count = 0; if (!inittedBitsInByte) bitsInByteInit(); while (--byteCount >= 0) count += bitsInByte[(*a++ | *b++)]; return count; } void bitXor(Bits *a, Bits *b, int bitCount) { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = (*a ^ *b++); a++; } } int bitXorCount(Bits *a, Bits *b, int bitCount) // Without altering 2 bitmaps, count the XOR'd bits. { int byteCount = ((bitCount+7)>>3); int count = 0; if (!inittedBitsInByte) bitsInByteInit(); while (--byteCount >= 0) count += bitsInByte[(*a++ ^ *b++)]; return count; } void bitNot(Bits *a, int bitCount) /* Flip all bits in a. */ { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = ~*a; a++; } } void bitReverseRange(Bits *bits, int startIx, int bitCount) // Reverses bits in range (e.g. 110010 becomes 010011) { if (bitCount <= 0) return; int ixA = startIx; int ixB = (startIx + bitCount - 1); for ( ;ixA < ixB; ixA++, ixB--) { boolean bitA = bitReadOne(bits, ixA); boolean bitB = bitReadOne(bits, ixB); if (!bitA && bitB) { bitSetOne( bits, ixA); bitClearOne(bits, ixB); } else if (bitA && !bitB) { bitClearOne(bits, ixA); bitSetOne( bits, ixB); } } } void bitPrint(Bits *a, int startIx, int bitCount, FILE* out) /* Print part or all of bit map as a string of 0s and 1s. Mostly useful for * debugging */ { int i; for (i = startIx; i < bitCount; i++) { if (bitReadOne(a, i)) fputc('1', out); else fputc('0', out); } fputc('\n', out); } void bitsOut(FILE* out, Bits *bits, int startIx, int bitCount, boolean onlyOnes) // Print part or all of bit map as a string of 0s and 1s. // If onlyOnes, enclose result in [] and use ' ' instead of '0'. { if (onlyOnes) fputc('[', out); int ix = startIx; for ( ; ix < bitCount; ix++) { if (bitReadOne(bits, ix)) fputc('1', out); else { if (onlyOnes) fputc(' ', out); else fputc('0', out); } } if (onlyOnes) fputc(']', out); } Bits *bitsIn(struct lm *lm,char *bitString, int len) // Returns a bitmap from a string of 1s and 0s. Any non-zero, non-blank char sets a bit. // Returned bitmap is the size of len even if that is longer than the string. // Optionally supply local memory. Note does NOT handle enclosing []s printed with bitsOut(). { if (bitString == NULL || len == 0) return NULL; Bits *bits = NULL; if (lm != NULL) bits = lmBitAlloc(lm,len); else bits = bitAlloc(len); int ix = 0; for ( ;ix < len && bitString[ix] != '\0'; ix++) { if (bitString[ix] != '0' && bitString[ix] != ' ') bitSetOne(bits, ix); } return bits; } rtracklayer/src/ucsc/bits.h0000644000175100017510000000643212612032142016751 0ustar00biocbuildbiocbuild/* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef BITS_H #define BITS_H #include "localmem.h" typedef unsigned char Bits; #define bitToByteSize(bitSize) ((bitSize+7)/8) /* Convert number of bits to number of bytes needed to store bits. */ Bits *bitAlloc(int bitCount); /* Allocate bits. */ Bits *bitRealloc(Bits *b, int bitCount, int newBitCount); /* Resize a bit array. If b is null, allocate a new array */ Bits *bitClone(Bits* orig, int bitCount); /* Clone bits. */ void bitFree(Bits **pB); /* Free bits. */ Bits *lmBitAlloc(struct lm *lm,int bitCount); // Allocate bits. Must supply local memory. Bits *lmBitRealloc(struct lm *lm, Bits *b, int bitCount, int newBitCount); // Resize a bit array. If b is null, allocate a new array. Must supply local memory. Bits *lmBitClone(struct lm *lm, Bits* orig, int bitCount); // Clone bits. Must supply local memory. void bitSetOne(Bits *b, int bitIx); /* Set a single bit. */ void bitClearOne(Bits *b, int bitIx); /* Clear a single bit. */ void bitSetRange(Bits *b, int startIx, int bitCount); /* Set a range of bits. */ boolean bitReadOne(Bits *b, int bitIx); /* Read a single bit. */ int bitCountRange(Bits *b, int startIx, int bitCount); /* Count number of bits set in range. */ int bitFindSet(Bits *b, int startIx, int bitCount); /* Find the index of the the next set bit. */ int bitFindClear(Bits *b, int startIx, int bitCount); /* Find the index of the the next clear bit. */ void bitClear(Bits *b, int bitCount); /* Clear many bits (possibly up to 7 beyond bitCount). */ void bitClearRange(Bits *b, int startIx, int bitCount); /* Clear a range of bits. */ void bitAnd(Bits *a, Bits *b, int bitCount); /* And two bitmaps. Put result in a. */ int bitAndCount(Bits *a, Bits *b, int bitCount); // Without altering 2 bitmaps, count the AND bits. void bitOr(Bits *a, Bits *b, int bitCount); /* Or two bitmaps. Put result in a. */ int bitOrCount(Bits *a, Bits *b, int bitCount); // Without altering 2 bitmaps, count the OR'd bits. void bitXor(Bits *a, Bits *b, int bitCount); /* Xor two bitmaps. Put result in a. */ int bitXorCount(Bits *a, Bits *b, int bitCount); // Without altering 2 bitmaps, count the XOR'd bits. void bitNot(Bits *a, int bitCount); /* Flip all bits in a. */ void bitReverseRange(Bits *bits, int startIx, int bitCount); // Reverses bits in range (e.g. 110010 becomes 010011) void bitPrint(Bits *a, int startIx, int bitCount, FILE* out); /* Print part or all of bit map as a string of 0s and 1s. Mostly useful for * debugging */ void bitsOut(FILE* out, Bits *bits, int startIx, int bitCount, boolean onlyOnes); // Print part or all of bit map as a string of 0s and 1s. // If onlyOnes, enclose result in [] and use ' ' instead of '0'. Bits *bitsIn(struct lm *lm,char *bitString, int len); // Returns a bitmap from a string of 1s and 0s. Any non-zero, non-blank char sets a bit. // Returned bitmap is the size of len even if that is longer than the string. // Optionally supply local memory. Note does NOT handle enclosing []s printed with bitsOut(). extern int bitsInByte[256]; /* Lookup table for how many bits are set in a byte. */ void bitsInByteInit(); /* Initialize bitsInByte array. */ #endif /* BITS_H */ rtracklayer/src/ucsc/bwgCreate.c0000644000175100017510000011520512612032142017705 0ustar00biocbuildbiocbuild/* bwgCreate - create big wig files. Implements write side of bwgInternal.h module. * See the comment in bwgInternal.h for a description of the file format. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "errAbort.h" #include "sqlNum.h" #include "sig.h" #include "zlibFace.h" #include "bPlusTree.h" #include "cirTree.h" #include "bbiFile.h" #include "bwgInternal.h" #include "bigWig.h" static int bwgBedGraphItemCmp(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bwgBedGraphItem *a = *((struct bwgBedGraphItem **)va); const struct bwgBedGraphItem *b = *((struct bwgBedGraphItem **)vb); int dif = (int)a->start - (int)b->start; if (dif == 0) dif = (int)a->end - (int)b->end; return dif; } static int bwgVariableStepItemCmp(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bwgVariableStepItem *a = *((struct bwgVariableStepItem **)va); const struct bwgVariableStepItem *b = *((struct bwgVariableStepItem **)vb); return (int)a->start - (int)b->start; } void bwgDumpSummary(struct bbiSummary *sum, FILE *f) /* Write out summary info to file. */ { fprintf(f, "summary %d:%d-%d min=%f, max=%f, sum=%f, sumSquares=%f, validCount=%d, mean=%f\n", sum->chromId, sum->start, sum->end, sum->minVal, sum->maxVal, sum->sumData, sum->sumSquares, sum->validCount, sum->sumData/sum->validCount); } static int bwgSectionWrite(struct bwgSection *section, boolean doCompress, FILE *f) /* Write out section to file, filling in section->fileOffset. */ { UBYTE type = section->type; UBYTE reserved8 = 0; int itemSize; switch (section->type) { case bwgTypeBedGraph: itemSize = 12; break; case bwgTypeVariableStep: itemSize = 8; break; case bwgTypeFixedStep: itemSize = 4; break; default: itemSize = 0; // Suppress compiler warning internalErr(); break; } int fixedSize = sizeof(section->chromId) + sizeof(section->start) + sizeof(section->end) + sizeof(section->itemStep) + sizeof(section->itemSpan) + sizeof(type) + sizeof(reserved8) + sizeof(section->itemCount); int bufSize = section->itemCount * itemSize + fixedSize; char buf[bufSize]; char *bufPt = buf; section->fileOffset = ftell(f); memWriteOne(&bufPt, section->chromId); memWriteOne(&bufPt, section->start); memWriteOne(&bufPt, section->end); memWriteOne(&bufPt, section->itemStep); memWriteOne(&bufPt, section->itemSpan); memWriteOne(&bufPt, type); memWriteOne(&bufPt, reserved8); memWriteOne(&bufPt, section->itemCount); int i; switch (section->type) { case bwgTypeBedGraph: { struct bwgBedGraphItem *item = section->items.bedGraphList; for (item = section->items.bedGraphList; item != NULL; item = item->next) { memWriteOne(&bufPt, item->start); memWriteOne(&bufPt, item->end); memWriteOne(&bufPt, item->val); } break; } case bwgTypeVariableStep: { struct bwgVariableStepPacked *items = section->items.variableStepPacked; for (i=0; iitemCount; ++i) { memWriteOne(&bufPt, items->start); memWriteOne(&bufPt, items->val); items += 1; } break; } case bwgTypeFixedStep: { struct bwgFixedStepPacked *items = section->items.fixedStepPacked; for (i=0; iitemCount; ++i) { memWriteOne(&bufPt, items->val); items += 1; } break; } default: internalErr(); break; } assert(bufSize == (bufPt - buf) ); if (doCompress) { size_t maxCompSize = zCompBufSize(bufSize); char compBuf[maxCompSize]; int compSize = zCompress(buf, bufSize, compBuf, maxCompSize); mustWrite(f, compBuf, compSize); } else mustWrite(f, buf, bufSize); return bufSize; } int bwgSectionCmp(const void *va, const void *vb) /* Compare to sort based on chrom,start,end. */ { const struct bwgSection *a = *((struct bwgSection **)va); const struct bwgSection *b = *((struct bwgSection **)vb); int dif = strcmp(a->chrom, b->chrom); if (dif == 0) { dif = (int)a->start - (int)b->start; if (dif == 0) dif = (int)a->end - (int)b->end; } return dif; } static struct cirTreeRange bwgSectionFetchKey(const void *va, void *context) /* Fetch bwgSection key for r-tree */ { struct cirTreeRange res; const struct bwgSection *a = *((struct bwgSection **)va); res.chromIx = a->chromId; res.start = a->start; res.end = a->end; return res; } static bits64 bwgSectionFetchOffset(const void *va, void *context) /* Fetch bwgSection file offset for r-tree */ { const struct bwgSection *a = *((struct bwgSection **)va); return a->fileOffset; } static boolean stepTypeLine(char *line) /* Return TRUE if it's a variableStep or fixedStep line. */ { return (startsWithWord("variableStep", line) || startsWithWord("fixedStep", line)); } static boolean steppedSectionEnd(char *line, int maxWords) /* Return TRUE if line indicates the start of another section. */ { int wordCount = chopByWhite(line, NULL, 5); if (wordCount > maxWords) return TRUE; return stepTypeLine(line); } static void parseFixedStepSection(struct lineFile *lf, boolean clipDontDie, struct lm *lm, int itemsPerSlot, char *chrom, bits32 chromSize, bits32 span, bits32 sectionStart, bits32 step, struct bwgSection **pSectionList) /* Read the single column data in section until get to end. */ { struct lm *lmLocal = lmInit(0); /* Stream through section until get to end of file or next section, * adding values from single column to list. */ char *words[1]; char *line; struct bwgFixedStepItem *item, *itemList = NULL; int originalSectionSize = 0; bits32 sectionEnd = sectionStart; while (lineFileNextReal(lf, &line)) { if (steppedSectionEnd(line, 1)) { lineFileReuse(lf); break; } chopLine(line, words); lmAllocVar(lmLocal, item); item->val = lineFileNeedDouble(lf, words, 0); if (sectionEnd + span > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item ends at %u", lf->lineIx, lf->fileName, chrom, chromSize, sectionEnd + span); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&itemList, item); ++originalSectionSize; } sectionEnd += step; } slReverse(&itemList); /* Break up into sections of no more than items-per-slot size, and convert to packed format. */ int sizeLeft = originalSectionSize; for (item = itemList; item != NULL; ) { /* Figure out size of this section */ int sectionSize = sizeLeft; if (sectionSize > itemsPerSlot) sectionSize = itemsPerSlot; sizeLeft -= sectionSize; /* Allocate and fill in section. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = chrom; section->start = sectionStart; sectionStart += sectionSize * step; section->end = sectionStart - step + span; section->type = bwgTypeFixedStep; section->itemStep = step; section->itemSpan = span; section->itemCount = sectionSize; /* Allocate array for data, and copy from list to array representation */ struct bwgFixedStepPacked *packed; /* An array */ section->items.fixedStepPacked = lmAllocArray(lm, packed, sectionSize); int i; for (i=0; ival = item->val; item = item->next; ++packed; } /* Add section to list. */ slAddHead(pSectionList, section); } lmCleanup(&lmLocal); } static void parseVariableStepSection(struct lineFile *lf, boolean clipDontDie, struct lm *lm, int itemsPerSlot, char *chrom, int chromSize, bits32 span, struct bwgSection **pSectionList) /* Read the single column data in section until get to end. */ { struct lm *lmLocal = lmInit(0); /* Stream through section until get to end of file or next section, * adding values from single column to list. */ char *words[2]; char *line; struct bwgVariableStepItem *item, *nextItem, *itemList = NULL; int originalSectionSize = 0; while (lineFileNextReal(lf, &line)) { if (steppedSectionEnd(line, 2)) { lineFileReuse(lf); break; } chopLine(line, words); lmAllocVar(lmLocal, item); int start = lineFileNeedNum(lf, words, 0); if (start <= 0) { errAbort("line %d of %s: zero or negative chromosome coordinate not allowed", lf->lineIx, lf->fileName); } item->start = start - 1; item->val = lineFileNeedDouble(lf, words, 1); if (item->start + span > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item ends at %u", lf->lineIx, lf->fileName, chrom, chromSize, item->start + span); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&itemList, item); ++originalSectionSize; } } slSort(&itemList, bwgVariableStepItemCmp); /* Make sure no overlap between items. */ if (itemList != NULL) { item = itemList; for (nextItem = item->next; nextItem != NULL; nextItem = nextItem->next) { if (item->start + span > nextItem->start) errAbort("Overlap on %s between items starting at %d and %d.\n" "Please remove overlaps and try again", chrom, item->start, nextItem->start); item = nextItem; } } /* Break up into sections of no more than items-per-slot size. */ int sizeLeft = originalSectionSize; for (item = itemList; item != NULL; ) { /* Figure out size of this section */ int sectionSize = sizeLeft; if (sectionSize > itemsPerSlot) sectionSize = itemsPerSlot; sizeLeft -= sectionSize; /* Convert from list to array representation. */ struct bwgVariableStepPacked *packed, *p; p = lmAllocArray(lm, packed, sectionSize); int i; for (i=0; istart = item->start; p->val = item->val; item = item->next; ++p; } /* Fill in section and add it to list. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = chrom; section->start = packed[0].start; section->end = packed[sectionSize-1].start + span; section->type = bwgTypeVariableStep; section->items.variableStepPacked = packed; section->itemSpan = span; section->itemCount = sectionSize; slAddHead(pSectionList, section); } lmCleanup(&lmLocal); } static unsigned parseUnsignedVal(struct lineFile *lf, char *var, char *val) /* Return val as an integer, printing error message if it's not. */ { char c = val[0]; if (!isdigit(c)) errAbort("Expecting numerical value for %s, got %s, line %d of %s", var, val, lf->lineIx, lf->fileName); return sqlUnsigned(val); } static void parseSteppedSection(struct lineFile *lf, boolean clipDontDie, struct hash *chromSizeHash, char *initialLine, struct lm *lm, int itemsPerSlot, struct bwgSection **pSectionList) /* Parse out a variableStep or fixedStep section and add it to list, breaking it up as need be. */ { /* Parse out first word of initial line and make sure it is something we recognize. */ char *typeWord = nextWord(&initialLine); enum bwgSectionType type = bwgTypeFixedStep; if (sameString(typeWord, "variableStep")) type = bwgTypeVariableStep; else if (sameString(typeWord, "fixedStep")) type = bwgTypeFixedStep; else errAbort("Unknown type %s\n", typeWord); /* Set up defaults for values we hope to parse out of rest of line. */ int span = 0; bits32 step = 0; bits32 start = 0; char *chrom = NULL; /* Parse out var=val pairs. */ char *varEqVal; while ((varEqVal = nextWord(&initialLine)) != NULL) { char *wordPairs[2]; int wc = chopByChar(varEqVal, '=', wordPairs, 2); if (wc != 2) errAbort("strange var=val pair line %d of %s", lf->lineIx, lf->fileName); char *var = wordPairs[0]; char *val = wordPairs[1]; if (sameString(var, "chrom")) chrom = cloneString(val); else if (sameString(var, "span")) span = parseUnsignedVal(lf, var, val); else if (sameString(var, "step")) step = parseUnsignedVal(lf, var, val); else if (sameString(var, "start")) { start = parseUnsignedVal(lf, var, val); } else errAbort("Unknown setting %s=%s line %d of %s", var, val, lf->lineIx, lf->fileName); } /* Check that we have all that are required and no more, and call type-specific routine to parse * rest of section. */ if (chrom == NULL) errAbort("Missing chrom= setting line %d of %s\n", lf->lineIx, lf->fileName); bits32 chromSize = (chromSizeHash ? hashIntVal(chromSizeHash, chrom) : BIGNUM); if (start > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item starts at %u", lf->lineIx, lf->fileName, chrom, chromSize, start); if (!clipDontDie) noWarnAbort(); } if (type == bwgTypeFixedStep) { if (start == 0) errAbort("Missing start= setting line %d of %s\n", lf->lineIx, lf->fileName); if (step == 0) errAbort("Missing step= setting line %d of %s\n", lf->lineIx, lf->fileName); if (span == 0) span = step; parseFixedStepSection(lf, clipDontDie, lm, itemsPerSlot, chrom, chromSize, span, start-1, step, pSectionList); } else { if (start != 0) errAbort("Extra start= setting line %d of %s\n", lf->lineIx, lf->fileName); if (step != 0) errAbort("Extra step= setting line %d of %s\n", lf->lineIx, lf->fileName); if (span == 0) span = 1; parseVariableStepSection(lf, clipDontDie, lm, itemsPerSlot, chrom, chromSize, span, pSectionList); } } struct bedGraphChrom /* A chromosome in bed graph format. */ { struct bedGraphChrom *next; /* Next in list. */ char *name; /* Chromosome name - not allocated here. */ bits32 size; /* Chromosome size. */ struct bwgBedGraphItem *itemList; /* List of items. */ }; static int bedGraphChromCmpName(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bedGraphChrom *a = *((struct bedGraphChrom **)va); const struct bedGraphChrom *b = *((struct bedGraphChrom **)vb); return strcmp(a->name, b->name); } static void parseBedGraphSection(struct lineFile *lf, boolean clipDontDie, struct hash *chromSizeHash, struct lm *lm, int itemsPerSlot, struct bwgSection **pSectionList) /* Parse out bedGraph section until we get to something that is not in bedGraph format. */ { /* Set up hash and list to store chromosomes. */ struct hash *chromHash = hashNew(0); struct bedGraphChrom *chrom, *chromList = NULL; /* Collect lines in items on appropriate chromosomes. */ struct bwgBedGraphItem *item; char *line; while (lineFileNextReal(lf, &line)) { /* Check for end of section. */ if (stepTypeLine(line)) { lineFileReuse(lf); break; } /* Parse out our line and make sure it has exactly 4 columns. */ char *words[5]; int wordCount = chopLine(line, words); lineFileExpectWords(lf, 4, wordCount); /* Get chromosome. */ char *chromName = words[0]; chrom = hashFindVal(chromHash, chromName); if (chrom == NULL) { lmAllocVar(chromHash->lm, chrom); hashAddSaveName(chromHash, chromName, chrom, &chrom->name); chrom->size = (chromSizeHash ? hashIntVal(chromSizeHash, chromName) : BIGNUM); slAddHead(&chromList, chrom); } /* Convert to item and add to chromosome list. */ lmAllocVar(lm, item); item->start = lineFileNeedNum(lf, words, 1); item->end = lineFileNeedNum(lf, words, 2); item->val = lineFileNeedDouble(lf, words, 3); /* Do sanity checking on coordinates. */ if (item->start > item->end) errAbort("bedGraph error: start (%u) after end line (%u) %d of %s.", item->start, item->end, lf->lineIx, lf->fileName); if (item->end > chrom->size) { warn("bedGraph error line %d of %s: chromosome %s has size %u but item ends at %u", lf->lineIx, lf->fileName, chrom->name, chrom->size, item->end); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&chrom->itemList, item); } } slSort(&chromList, bedGraphChromCmpName); /* Loop through each chromosome and output the item list, broken into sections * for that chrom. */ for (chrom = chromList; chrom != NULL; chrom = chrom->next) { slSort(&chrom->itemList, bwgBedGraphItemCmp); /* Check to make sure no overlap between items. */ struct bwgBedGraphItem *item = chrom->itemList, *nextItem; for (nextItem = item->next; nextItem != NULL; nextItem = nextItem->next) { if (item->end > nextItem->start) errAbort("Overlap between %s %d %d and %s %d %d.\nPlease remove overlaps and try again", chrom->name, item->start, item->end, chrom->name, nextItem->start, nextItem->end); item = nextItem; } /* Break up into sections of no more than items-per-slot size. */ struct bwgBedGraphItem *startItem, *endItem, *nextStartItem = chrom->itemList; for (startItem = chrom->itemList; startItem != NULL; startItem = nextStartItem) { /* Find end item of this section, and start item for next section. * Terminate list at end item. */ int sectionSize = 0; int i; endItem = startItem; for (i=0; inext; ++sectionSize; } endItem->next = NULL; /* Fill in section and add it to section list. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = cloneString(chrom->name); section->start = startItem->start; section->end = endItem->end; section->type = bwgTypeBedGraph; section->items.bedGraphList = startItem; section->itemCount = sectionSize; slAddHead(pSectionList, section); } } /* Free up hash, no longer needed. Free's chromList as a side effect since chromList is in * hash's memory. */ hashFree(&chromHash); chromList = NULL; } void bwgMakeChromInfo(struct bwgSection *sectionList, struct hash *chromSizeHash, int *retChromCount, struct bbiChromInfo **retChromArray, int *retMaxChromNameSize) /* Fill in chromId field in sectionList. Return array of chromosome name/ids. * The chromSizeHash is keyed by name, and has int values. */ { /* Build up list of unique chromosome names. */ struct bwgSection *section; char *chromName = ""; int chromCount = 0; int maxChromNameSize = 0; struct slRef *uniq, *uniqList = NULL; for (section = sectionList; section != NULL; section = section->next) { if (!sameString(section->chrom, chromName)) { chromName = section->chrom; refAdd(&uniqList, chromName); ++chromCount; int len = strlen(chromName); if (len > maxChromNameSize) maxChromNameSize = len; } section->chromId = chromCount-1; } slReverse(&uniqList); /* Allocate and fill in results array. */ struct bbiChromInfo *chromArray; AllocArray(chromArray, chromCount); int i; for (i = 0, uniq = uniqList; i < chromCount; ++i, uniq = uniq->next) { chromArray[i].name = uniq->val; chromArray[i].id = i; chromArray[i].size = hashIntVal(chromSizeHash, uniq->val); } /* Clean up, set return values and go home. */ slFreeList(&uniqList); *retChromCount = chromCount; *retChromArray = chromArray; *retMaxChromNameSize = maxChromNameSize; } static int bwgStrcmp (const void * A, const void * B) { char * stringA = *((char **) A); char * stringB = *((char **) B); return strcmp(stringA, stringB); } void bwgMakeAllChromInfo(struct bwgSection *sectionList, struct hash *chromSizeHash, int *retChromCount, struct bbiChromInfo **retChromArray, int *retMaxChromNameSize) /* Fill in chromId field in sectionList. Return array of chromosome name/ids. * The chromSizeHash is keyed by name, and has int values. */ { /* Build up list of unique chromosome names. */ int maxChromNameSize = 0; /* Get list of values */ int chromCount = chromSizeHash->elCount; char ** chromName, ** chromNames; AllocArray(chromNames, chromCount); chromName = chromNames; struct hashEl* el; struct hashCookie cookie = hashFirst(chromSizeHash); for (el = hashNext(&cookie); el; el = hashNext(&cookie)) { *chromName = el->name; if (strlen(el->name) > maxChromNameSize) maxChromNameSize = strlen(el->name); chromName++; } qsort(chromNames, chromCount, sizeof(char *), bwgStrcmp); /* Allocate and fill in results array. */ struct bbiChromInfo *chromArray; AllocArray(chromArray, chromCount); int i; for (i = 0; i < chromCount; ++i) { chromArray[i].name = chromNames[i]; chromArray[i].id = i; chromArray[i].size = hashIntVal(chromSizeHash, chromNames[i]); } // Assign IDs to sections: struct bwgSection *section; char *name = ""; bits32 chromId = 0; for (section = sectionList; section != NULL; section = section->next) { if (!sameString(section->chrom, name)) { for (i = 0; i < chromCount; ++i) { if (sameString(section->chrom, chromArray[i].name)) { section->chromId = i; break; } } if (i == chromCount) errAbort("Could not find %s in list of chromosomes\n", section->chrom); chromId = section->chromId; name = section->chrom; } else section->chromId = chromId; } /* Clean up, set return values and go home. */ *retChromCount = chromCount; *retChromArray = chromArray; *retMaxChromNameSize = maxChromNameSize; } int bwgAverageResolution(struct bwgSection *sectionList) /* Return the average resolution seen in sectionList. */ { if (sectionList == NULL) return 1; bits64 totalRes = 0; bits32 sectionCount = 0; struct bwgSection *section; int i; for (section = sectionList; section != NULL; section = section->next) { int sectionRes = 0; switch (section->type) { case bwgTypeBedGraph: { struct bwgBedGraphItem *item; sectionRes = BIGNUM; for (item = section->items.bedGraphList; item != NULL; item = item->next) { int size = item->end - item->start; if (sectionRes > size) sectionRes = size; } break; } case bwgTypeVariableStep: { struct bwgVariableStepPacked *items = section->items.variableStepPacked, *prev; bits32 smallestGap = BIGNUM; for (i=1; iitemCount; ++i) { prev = items; items += 1; bits32 gap = items->start - prev->start; if (smallestGap > gap) smallestGap = gap; } if (smallestGap != BIGNUM) sectionRes = smallestGap; else sectionRes = section->itemSpan; break; } case bwgTypeFixedStep: { sectionRes = section->itemStep; break; } default: internalErr(); break; } totalRes += sectionRes; ++sectionCount; } return (totalRes + sectionCount/2)/sectionCount; } #define bwgSectionHeaderSize 24 /* Size of section header in file. */ static int bwgItemSize(enum bwgSectionType type) /* Return size of an item inside a particular section. */ { switch (type) { case bwgTypeBedGraph: return 2*sizeof(bits32) + sizeof(float); break; case bwgTypeVariableStep: return sizeof(bits32) + sizeof(float); break; case bwgTypeFixedStep: return sizeof(float); break; default: internalErr(); return 0; } } static int bwgSectionSize(struct bwgSection *section) /* Return size (on disk) of section. */ { return bwgSectionHeaderSize + bwgItemSize(section->type) * section->itemCount; } static bits64 bwgTotalSectionSize(struct bwgSection *sectionList) /* Return total size of all sections. */ { bits64 total = 0; struct bwgSection *section; for (section = sectionList; section != NULL; section = section->next) total += bwgSectionSize(section); return total; } static void bwgReduceBedGraph(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a bedGraph section onto outList. */ { struct bwgBedGraphItem *item = section->items.bedGraphList; for (item = section->items.bedGraphList; item != NULL; item = item->next) { bbiAddRangeToSummary(section->chromId, chromSize, item->start, item->end, item->val, reduction, pOutList); } } static void bwgReduceVariableStep(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a variableStep section onto outList. */ { struct bwgVariableStepPacked *items = section->items.variableStepPacked; int i; for (i=0; iitemCount; ++i) { bbiAddRangeToSummary(section->chromId, chromSize, items->start, items->start + section->itemSpan, items->val, reduction, pOutList); items += 1; } } static void bwgReduceFixedStep(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a fixedStep section onto outList. */ { struct bwgFixedStepPacked *items = section->items.fixedStepPacked; int start = section->start; int i; for (i=0; iitemCount; ++i) { bbiAddRangeToSummary(section->chromId, chromSize, start, start + section->itemSpan, items->val, reduction, pOutList); start += section->itemStep; items += 1; } } struct bbiSummary *bwgReduceSectionList(struct bwgSection *sectionList, struct bbiChromInfo *chromInfoArray, int reduction) /* Return summary of section list reduced by given amount. */ { struct bbiSummary *outList = NULL; struct bwgSection *section = NULL; /* Loop through input section list reducing into outList. */ for (section = sectionList; section != NULL; section = section->next) { bits32 chromSize = chromInfoArray[section->chromId].size; switch (section->type) { case bwgTypeBedGraph: bwgReduceBedGraph(section, chromSize, reduction, &outList); break; case bwgTypeVariableStep: bwgReduceVariableStep(section, chromSize, reduction, &outList); break; case bwgTypeFixedStep: bwgReduceFixedStep(section, chromSize, reduction, &outList); break; default: internalErr(); return 0; } } slReverse(&outList); return outList; } static void bwgComputeDynamicSummaries(struct bwgSection *sectionList, struct bbiSummary ** reduceSummaries, bits16 * summaryCount, struct bbiChromInfo *chromInfoArray, int chromCount, bits32 * reductionAmounts, boolean doCompress) { /* Figure out initial summary level - starting with a summary 10 times the amount * of the smallest item. See if summarized data is smaller than half input data, if * not bump up reduction by a factor of 2 until it is, or until further summarying * yeilds no size reduction. */ int i; int minRes = bwgAverageResolution(sectionList); int initialReduction = minRes*10; bits64 fullSize = bwgTotalSectionSize(sectionList); bits64 lastSummarySize = 0, summarySize; bits64 maxReducedSize = fullSize/2; struct bbiSummary *summaryList = NULL; for (;;) { summaryList = bwgReduceSectionList(sectionList, chromInfoArray, initialReduction); bits64 summarySize = bbiTotalSummarySize(summaryList); if (doCompress) { summarySize *= 2; // Compensate for summary not compressing as well as primary data } if (summarySize >= maxReducedSize && summarySize != lastSummarySize) { /* Need to do more reduction. First scale reduction by amount that it missed * being small enough last time, with an extra 10% for good measure. Then * just to keep from spinning through loop two many times, make sure this is * at least 2x the previous reduction. */ int nextReduction = 1.1 * initialReduction * summarySize / maxReducedSize; if (nextReduction < initialReduction*2) nextReduction = initialReduction*2; initialReduction = nextReduction; bbiSummaryFreeList(&summaryList); lastSummarySize = summarySize; } else break; } *summaryCount = 1; reduceSummaries[0] = summaryList; reductionAmounts[0] = initialReduction; /* Now calculate up to 10 levels of further summary. */ bits64 reduction = initialReduction; for (i=0; i<9; i++) { reduction *= 4; if (reduction > 1000000000) break; summaryList = bbiReduceSummaryList(reduceSummaries[*summaryCount-1], chromInfoArray, reduction); summarySize = bbiTotalSummarySize(summaryList); if (summarySize != lastSummarySize) { reduceSummaries[*summaryCount] = summaryList; reductionAmounts[*summaryCount] = reduction; ++(*summaryCount); } int summaryItemCount = slCount(summaryList); if (summaryItemCount <= chromCount) break; } } static void bwgComputeFixedSummaries(struct bwgSection * sectionList, struct bbiSummary ** reduceSummaries, bits16 * summaryCount, struct bbiChromInfo *chromInfoArray, bits32 * reductionAmounts) { // Hack: pre-defining summary levels, set off Ensembl default zoom levels // The last two values of this array were extrapolated following Jim's formula int i; #define REDUCTION_COUNT 10 bits32 presetReductions[REDUCTION_COUNT] = {30, 65, 130, 260, 450, 648, 950, 1296, 4800, 19200}; bits64 reduction = reductionAmounts[0] = presetReductions[0]; reduceSummaries[0] = bwgReduceSectionList(sectionList, chromInfoArray, presetReductions[0]); for (i=1; inext) { bits32 uncSizeOne = bwgSectionWrite(section, doCompress, f); if (uncSizeOne > uncompressBufSize) uncompressBufSize = uncSizeOne; } /* Write out index - creating a temporary array rather than list representation of * sections in the process. */ indexOffset = ftell(f); struct bwgSection **sectionArray; AllocArray(sectionArray, sectionCount); for (section = sectionList, i=0; section != NULL; section = section->next, ++i) sectionArray[i] = section; cirTreeFileBulkIndexToOpenFile(sectionArray, sizeof(sectionArray[0]), sectionCount, blockSize, 1, NULL, bwgSectionFetchKey, bwgSectionFetchOffset, indexOffset, f); freez(§ionArray); /* Write out summary sections. */ verbose(2, "bwgCreate writing %d summaries\n", summaryCount); for (i=0; ivalidCount; totalSum.minVal = sum->minVal; totalSum.maxVal = sum->maxVal; totalSum.sumData = sum->sumData; totalSum.sumSquares = sum->sumSquares; for (sum = sum->next; sum != NULL; sum = sum->next) { totalSum.validCount += sum->validCount; if (sum->minVal < totalSum.minVal) totalSum.minVal = sum->minVal; if (sum->maxVal > totalSum.maxVal) totalSum.maxVal = sum->maxVal; totalSum.sumData += sum->sumData; totalSum.sumSquares += sum->sumSquares; } /* Write real summary */ fseek(f, totalSummaryOffset, SEEK_SET); bbiSummaryElementWrite(f, &totalSum); } else totalSummaryOffset = 0; /* Edge case, no summary. */ /* Go back and fill in offsets properly in header. */ fseek(f, dataOffsetPos, SEEK_SET); writeOne(f, dataOffset); fseek(f, indexOffsetPos, SEEK_SET); writeOne(f, indexOffset); fseek(f, chromTreeOffsetPos, SEEK_SET); writeOne(f, chromTreeOffset); fseek(f, totalSummaryOffsetPos, SEEK_SET); writeOne(f, totalSummaryOffset); if (doCompress) { int maxZoomUncompSize = itemsPerSlot * sizeof(struct bbiSummaryOnDisk); if (maxZoomUncompSize > uncompressBufSize) uncompressBufSize = maxZoomUncompSize; fseek(f, uncompressBufSizePos, SEEK_SET); writeOne(f, uncompressBufSize); } /* Also fill in offsets in zoom headers. */ for (i=0; ilineIx, lf->fileName, line); /* Parse out a bed graph line just to check numerical format. */ char *chrom = words[0]; int start = lineFileNeedNum(lf, words, 1); int end = lineFileNeedNum(lf, words, 2); double val = lineFileNeedDouble(lf, words, 3); verbose(2, "bedGraph %s:%d-%d@%g\n", chrom, start, end, val); /* Push back line and call bed parser. */ lineFileReuse(lf); parseBedGraphSection(lf, clipDontDie, chromSizeHash, lm, maxSectionSize, §ionList); } } slSort(§ionList, bwgSectionCmp); /* Check for overlap at section level. */ struct bwgSection *section, *nextSection; for (section = sectionList; section != NULL; section = nextSection) { nextSection = section->next; if (nextSection != NULL) { if (sameString(section->chrom, nextSection->chrom)) { if (section->end > nextSection->start) { errAbort("There's more than one value for %s base %d (in coordinates that start with 1).\n", section->chrom, nextSection->start+1); } } } } return sectionList; } void bigWigFileCreateEx( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ boolean keepAllChromosomes, /* If TRUE then store all chromosomes in chromosomal b-tree. */ boolean fixedSummaries, /* If TRUE then impose fixed summary levels. */ char *outName) /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ { /* This code needs to agree with code in two other places currently - bigBedFileCreate, * and bbiFileOpen. I'm thinking of refactoring to share at least between * bigBedFileCreate and bigWigFileCreate. It'd be great so it could be structured * so that it could send the input in one chromosome at a time, and send in the zoom * stuff only after all the chromosomes are done. This'd potentially reduce the memory * footprint by a factor of 2 or 4. Still, for now it works. -JK */ struct hash *chromSizeHash = bbiChromSizesFromFile(chromSizes); struct lm *lm = lmInit(0); struct bwgSection *sectionList = bwgParseWig(inName, clipDontDie, chromSizeHash, itemsPerSlot, lm); if (sectionList == NULL) errAbort("%s is empty of data", inName); bwgCreate(sectionList, chromSizeHash, blockSize, itemsPerSlot, compress, keepAllChromosomes, fixedSummaries, outName); lmCleanup(&lm); } void bigWigFileCreate( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ char *outName) /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ { bigWigFileCreateEx( inName, chromSizes, blockSize, itemsPerSlot, clipDontDie, compress, FALSE, FALSE, outName); } rtracklayer/src/ucsc/bwgInternal.h0000644000175100017510000001041312612032142020256 0ustar00biocbuildbiocbuild/* bwgInternal - stuff to create and use bigWig files. Generally you'll want to use the * simpler interfaces in the bigWig module instead. This file is good reading though * if you want to extend the bigWig interface, or work with bigWig files directly * without going through the Kent library. */ #ifndef BIGWIGFILE_H #define BIGWIGFILE_H enum bwgSectionType /* Code to indicate section type. */ { bwgTypeBedGraph=1, bwgTypeVariableStep=2, bwgTypeFixedStep=3, }; struct bwgBedGraphItem /* An bedGraph-type item in a bwgSection. */ { struct bwgBedGraphItem *next; /* Next in list. */ bits32 start,end; /* Range of chromosome covered. */ float val; /* Value. */ }; struct bwgVariableStepItem /* An variableStep type item in a bwgSection. */ { struct bwgVariableStepItem *next; /* Next in list. */ bits32 start; /* Start position in chromosome. */ float val; /* Value. */ }; struct bwgVariableStepPacked /* An variableStep type item in a bwgSection. */ { bits32 start; /* Start position in chromosome. */ float val; /* Value. */ }; struct bwgFixedStepItem /* An fixedStep type item in a bwgSection. */ { struct bwgFixedStepItem *next; /* Next in list. */ float val; /* Value. */ }; struct bwgFixedStepPacked /* An fixedStep type item in a bwgSection. */ { float val; /* Value. */ }; union bwgItem /* Union of item pointers for all possible section types. */ { struct bwgBedGraphItem *bedGraphList; /* A linked list */ struct bwgFixedStepPacked *fixedStepPacked; /* An array */ struct bwgVariableStepPacked *variableStepPacked; /* An array */ /* No packed format for bedGraph... */ }; struct bwgSection /* A section of a bigWig file - all on same chrom. This is a somewhat fat data * structure used by the bigWig creation code. See also bwgSection for the * structure returned by the bigWig reading code. */ { struct bwgSection *next; /* Next in list. */ char *chrom; /* Chromosome name. */ bits32 start,end; /* Range of chromosome covered. */ enum bwgSectionType type; union bwgItem items; /* List/array of items in this section. */ bits32 itemStep; /* Step within item if applicable. */ bits32 itemSpan; /* Item span if applicable. */ bits16 itemCount; /* Number of items in section. */ bits32 chromId; /* Unique small integer value for chromosome. */ bits64 fileOffset; /* Offset of section in file. */ }; struct bwgSectionHead /* A header from a bigWig file section - similar to above bug what is on disk. */ { bits32 chromId; /* Chromosome short identifier. */ bits32 start,end; /* Range covered. */ bits32 itemStep; /* For some section types, the # of bases between items. */ bits32 itemSpan; /* For some section types, the # of bases in each item. */ UBYTE type; /* Type byte. */ UBYTE reserved; /* Always zero for now. */ bits16 itemCount; /* Number of items in block. */ }; void bwgSectionHeadFromMem(char **pPt, struct bwgSectionHead *head, boolean isSwapped); /* Read section header. */ int bwgSectionCmp(const void *va, const void *vb); /* Compare to sort based on chrom,start,end. */ struct bwgSection *bwgParseWig( char *fileName, /* Name of ascii wig file. */ boolean clipDontDie, /* Skip items outside chromosome rather than aborting. */ struct hash *chromSizeHash, /* If non-NULL items checked to be inside chromosome. */ int maxSectionSize, /* Biggest size of a section. 100 - 100,000 is usual range. */ struct lm *lm); /* Memory pool to allocate from. */ /* Parse out ascii wig file - allocating memory in lm. */ int bwgAverageResolution(struct bwgSection *sectionList); /* Return the average resolution seen in sectionList. */ struct bbiSummary *bwgReduceSectionList(struct bwgSection *sectionList, struct bbiChromInfo *chromInfoArray, int reduction); /* Return summary of section list reduced by given amount. */ void bwgCreate(struct bwgSection *sectionList, struct hash *chromSizeHash, int blockSize, int itemsPerSlot, boolean doCompress, boolean keepAllChromosomes, boolean fixedSummaries, char *fileName); /* Create a bigWig file out of a sorted sectionList. A lower level routine * than the one above. */ #endif /* BIGWIGFILE_H */ rtracklayer/src/ucsc/bwgQuery.c0000644000175100017510000002657512612032142017622 0ustar00biocbuildbiocbuild/* bwgQuery - implements the query side of bigWig. See bwgInternal.h for definition of file * format. */ /* Copyright (C) 2012 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "options.h" #include "sig.h" #include "sqlNum.h" #include "obscure.h" #include "dystring.h" #include "bPlusTree.h" #include "cirTree.h" #include "rangeTree.h" #include "udc.h" #include "zlibFace.h" #include "bbiFile.h" #include "bwgInternal.h" #include "bigWig.h" #include "bigBed.h" struct bbiFile *bigWigFileOpen(char *fileName) /* Open up big wig file. */ { return bbiFileOpen(fileName, bigWigSig, "big wig"); } boolean bigWigFileCheckSigs(char *fileName) /* check file signatures at beginning and end of file */ { return bbiFileCheckSigs(fileName, bigWigSig, "big wig"); } #ifdef OLD static void bwgSectionHeadRead(struct bbiFile *bwf, struct bwgSectionHead *head) /* Read section header. */ { struct udcFile *udc = bwf->udc; boolean isSwapped = bwf->isSwapped; head->chromId = udcReadBits32(udc, isSwapped); head->start = udcReadBits32(udc, isSwapped); head->end = udcReadBits32(udc, isSwapped); head->itemStep = udcReadBits32(udc, isSwapped); head->itemSpan = udcReadBits32(udc, isSwapped); head->type = udcGetChar(udc); head->reserved = udcGetChar(udc); head->itemCount = udcReadBits16(udc, isSwapped); } #endif /* OLD */ void bwgSectionHeadFromMem(char **pPt, struct bwgSectionHead *head, boolean isSwapped) /* Read section header. */ { char *pt = *pPt; head->chromId = memReadBits32(&pt, isSwapped); head->start = memReadBits32(&pt, isSwapped); head->end = memReadBits32(&pt, isSwapped); head->itemStep = memReadBits32(&pt, isSwapped); head->itemSpan = memReadBits32(&pt, isSwapped); head->type = *pt++; head->reserved = *pt++; head->itemCount = memReadBits16(&pt, isSwapped); *pPt = pt; } static int bigWigBlockDumpIntersectingRange(boolean isSwapped, char *blockPt, char *blockEnd, char *chrom, bits32 rangeStart, bits32 rangeEnd, int maxCount, FILE *out) /* Print out info on parts of block that intersect start-end, block starting at current position. */ { struct bwgSectionHead head; bwgSectionHeadFromMem(&blockPt, &head, isSwapped); bits16 i; float val; int outCount = 0; switch (head.type) { case bwgTypeBedGraph: { fprintf(out, "#bedGraph section %s:%u-%u\n", chrom, head.start, head.end); for (i=0; i 0) { fprintf(out, "%s\t%u\t%u\t%g\n", chrom, start, end, val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } } break; } case bwgTypeVariableStep: { fprintf(out, "variableStep chrom=%s span=%u\n", chrom, head.itemSpan); for (i=0; i 0) { fprintf(out, "%u\t%g\n", start+1, val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } } break; } case bwgTypeFixedStep: { boolean gotStart = FALSE; bits32 start = head.start; for (i=0; i 0) { if (!gotStart) { fprintf(out, "fixedStep chrom=%s start=%u step=%u span=%u\n", chrom, start+1, head.itemStep, head.itemSpan); gotStart = TRUE; } fprintf(out, "%g\n", val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } start += head.itemStep; } break; } default: internalErr(); break; } assert( (maxCount != 0 && outCount >= maxCount) || (blockPt == blockEnd)); return outCount; } struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm) /* Get data for interval. Return list allocated out of lm. */ { if (bwf->typeSig != bigWigSig) errAbort("Trying to do bigWigIntervalQuery on a non big-wig file."); bbiAttachUnzoomedCir(bwf); struct bbiInterval *el, *list = NULL; struct fileOffsetSize *blockList = bbiOverlappingBlocks(bwf, bwf->unzoomedCir, chrom, start, end, NULL); struct fileOffsetSize *block, *beforeGap, *afterGap; struct udcFile *udc = bwf->udc; boolean isSwapped = bwf->isSwapped; float val; int i; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bwf->uncompressBufSize > 0) uncompressBuf = needLargeMem(bwf->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bwf->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Deal with insides of block. */ struct bwgSectionHead head; bwgSectionHeadFromMem(&blockPt, &head, isSwapped); switch (head.type) { case bwgTypeBedGraph: { for (i=0; i end) e = end; if (s < e) { lmAllocVar(lm, el); el->start = s; el->end = e; el->val = val; slAddHead(&list, el); } } break; } case bwgTypeVariableStep: { for (i=0; i end) e = end; if (s < e) { lmAllocVar(lm, el); el->start = s; el->end = e; el->val = val; slAddHead(&list, el); } } break; } case bwgTypeFixedStep: { bits32 s = head.start; bits32 e = s + head.itemSpan; for (i=0; i end) clippedE = end; if (clippedS < clippedE) { lmAllocVar(lm, el); el->start = clippedS; el->end = clippedE; el->val = val; slAddHead(&list, el); } s += head.itemStep; e += head.itemStep; } break; } default: internalErr(); break; } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); slReverse(&list); return list; } int bigWigIntervalDump(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int maxCount, FILE *out) /* Print out info on bigWig parts that intersect chrom:start-end. Set maxCount to 0 if you * don't care how many are printed. Returns number printed. */ { if (bwf->typeSig != bigWigSig) errAbort("Trying to do bigWigIntervalDump on a non big-wig file."); bbiAttachUnzoomedCir(bwf); struct fileOffsetSize *blockList = bbiOverlappingBlocks(bwf, bwf->unzoomedCir, chrom, start, end, NULL); struct fileOffsetSize *block, *beforeGap, *afterGap; struct udcFile *udc = bwf->udc; int printCount = 0; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bwf->uncompressBufSize > 0) uncompressBuf = needLargeMem(bwf->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bwf->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Do the actual dump. */ int oneCount = bigWigBlockDumpIntersectingRange(bwf->isSwapped, blockPt, blockEnd, chrom, start, end, maxCount, out); /* Keep track of how many dumped, not exceeding maximum. */ printCount += oneCount; if (maxCount != 0) { if (oneCount >= maxCount) { block = NULL; // we want to drop out of the outer loop too break; } maxCount -= oneCount; } blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); return printCount; } boolean bigWigSummaryArray(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues) /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ { boolean ret = bbiSummaryArray(bwf, chrom, start, end, bigWigIntervalQuery, summaryType, summarySize, summaryValues); return ret; } boolean bigWigSummaryArrayExtended(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary) /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ { boolean ret = bbiSummaryArrayExtended(bwf, chrom, start, end, bigWigIntervalQuery, summarySize, summary); return ret; } double bigWigSingleSummary(struct bbiFile *bwf, char *chrom, int start, int end, enum bbiSummaryType summaryType, double defaultVal) /* Return the summarized single value for a range. */ { double arrayOfOne = defaultVal; bigWigSummaryArray(bwf, chrom, start, end, summaryType, 1, &arrayOfOne); return arrayOfOne; } boolean isBigWig(char *fileName) /* Peak at a file to see if it's bigWig */ { FILE *f = mustOpen(fileName, "rb"); bits32 sig; mustReadOne(f, sig); fclose(f); if (sig == bigWigSig) return TRUE; sig = byteSwap32(sig); return sig == bigWigSig; } rtracklayer/src/ucsc/cheapcgi.h0000644000175100017510000005321412612032142017553 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Cheapcgi.h - turns variables passed from the web form into * something that C understands. */ #ifndef CHEAPCGI_H #define CHEAPCGI_H #ifndef DYSTRING_H #include "dystring.h" #endif #ifndef HASH_H #include "hash.h" #endif #define COLOR_BG_DEFAULT "#FFFEE8" #define COLOR_BG_ALTDEFAULT "#FFF9D2" #define COLOR_BG_DEFAULT_DARKER "#FCECC0" #define COLOR_BG_DEFAULT_DARKEST "#EED5B7" #define COLOR_BG_GHOST "#EEEEEE" #define COLOR_BG_PALE "#F8F8F8" #define COLOR_BG_HEADER_LTBLUE "#D9E4F8" #define COLOR_DARKGREEN "#008800" #define COLOR_LTGREEN "#CCFFCC" #define COLOR_DARKBLUE "#000088" #define COLOR_BLUE_BUTTON "#91B3E6" #define COLOR_DARKGREY "#666666" #define COLOR_LTGREY "#CCCCCC" #define COLOR_YELLOW "#FFFF00" #define COLOR_LTYELLOW "#FFF380" #define COLOR_WHITE "#FFFFFF" #define COLOR_RED "#AA0000" #define COLOR_TRACKLIST_LEVEL1 COLOR_BG_DEFAULT #define COLOR_TRACKLIST_LEVEL2 COLOR_BG_ALTDEFAULT #define COLOR_TRACKLIST_LEVEL3 COLOR_BG_DEFAULT_DARKER #define COLOR_TRACKLIST_LEVEL4 COLOR_BG_DEFAULT_DARKEST void initSigHandlers(boolean dumpStack); /* set handler for various terminal signals for logging purposes. * if dumpStack is TRUE, attempt to dump the stack. */ struct cgiVar /* Info on one cgi variable. */ { struct cgiVar *next; /* Next in list. */ char *name; /* Name - allocated in hash. */ char *val; /* Value - also not allocated here. */ boolean saved; /* True if saved. */ }; struct cgiVar* cgiVarList(); /* return the list of cgiVar's */ struct cgiDictionary /* Stuff to encapsulate parsed out CGI vars. */ { struct cgiDictionary *next; /* Next in list if we have multiple */ char *stringData; /* Where values if cgi-vars live. */ struct hash *hash; /* Keyed by cgi-var name, value is cgiVar */ struct cgiVar *list; /* List of all vars. */ }; void cgiDictionaryFree(struct cgiDictionary **pD); /* Free up resources associated with dictionary. */ void cgiDictionaryFreeList(struct cgiDictionary **pList); /* Free up a whole list of cgiDictionaries */ struct cgiDictionary *cgiDictionaryFromEncodedString(char *encodedString); /* Giving a this=that&this=that string, return cgiDictionary parsed out from it. * This does *not* destroy input like the lower level cgiParse functions do. */ char *findCookieData(char *varName); /* Get the string associated with varName from the cookie string. */ void dumpCookieList(); /* Print out the cookie list. */ boolean cgiIsOnWeb(); /* Return TRUE if looks like we're being run as a CGI. */ char *cgiRequestMethod(); /* Return CGI REQUEST_METHOD (such as 'GET/POST/PUT/DELETE/HEAD') */ char *cgiRequestUri(); /* Return CGI REQUEST_URI */ char *cgiRequestContentLength(); /* Return HTTP REQUEST CONTENT_LENGTH if available*/ char *cgiScriptName(); /* Return name of script so libs can do context-sensitive stuff. */ char *cgiServerName(); /* Return name of server, better to use cgiServerNamePort() for actual URL construction */ char *cgiServerPort(); /* Return port number of server */ char *cgiServerNamePort(); /* Return name of server with port if different than 80 */ boolean cgiServerHttpsIsOn(); /* Return true if HTTPS is on */ char *cgiAppendSForHttps(); /* if running on https, add the letter s to the url protocol */ char *cgiRemoteAddr(); /* Return IP address of client (or "unknown"). */ char *cgiUserAgent(); /* Return remote user agent (HTTP_USER_AGENT) or NULL if remote user agent is not known */ enum browserType /* How to look at a track. */ { btUnknown=0, // Not yet known btOpera=1, // Opera btIE=2, // MS Internet Explorer btFF=3, // Firefox btChrome=4, // Google Chrome btSafari=5, // Safari btOther=6 // Anything else }; enum osType /* How to look at a track. */ { osUnknown=0, // Not yet known osWindows=1, // The evil empire osLinux=2, // Workhorse osMac=3, // ashion or Religion osOther=4 // Anything else }; enum browserType cgiClientBrowser(char **browserQualifier, enum osType *clientOs, char **clientOsQualifier); /* These routines abort the html output if the input isn't * there or is misformatted. */ #define cgiBrowser() cgiClientBrowser(NULL,NULL,NULL) char *cgiString(char *varName); int cgiInt(char *varName); double cgiDouble(char *varName); boolean cgiBoolean(char *varName); /* The cgiBoolean is a little problematic. If the variable * is TRUE it exists, but if it is false it is simply not * defined. cgiBoolean() thus returns FALSE if the CGI * variable doesn't exist or if it is set to FALSE. To * work around this when need be use cgiBooleanDefined(), * which relies on the fact that when we define a boolean * variable we also define a hidden variable. */ boolean cgiBooleanDefined(char *name); /* Return TRUE if boolean variable is defined (by * checking for shadow). */ char *cgiBooleanShadowPrefix(); /* Prefix for shadow variable set with boolean variables. */ void cgiMakeHiddenBoolean(char *name, boolean on); /* Make hidden boolean variable. Also make a shadow hidden variable so we * can distinguish between variable not present and * variable set to false. */ char *cgiMultListShadowPrefix(); /* Prefix for shadow variable set with multi-select inputs. */ int cgiIntExp(char *varName); /* Evaluate an integer expression in varName and * return value. */ char *cgiOptionalString(char *varName); /* Return value of string if it exists in cgi environment, else NULL */ char *cgiUsualString(char *varName, char *usual); /* Return value of string if it exists in cgi environment. * Otherwiser return 'usual' */ struct slName *cgiStringList(char *varName); /* Find list of cgi variables with given name. This * may be empty. Free result with slFreeList(). */ int cgiOptionalInt(char *varName, int defaultVal); /* This returns value of varName if it exists in cgi environment, * otherwise it returns defaultVal. */ double cgiOptionalDouble(char *varName, double defaultVal); /* Returns double value. */ #define cgiUsualInt cgiOptionalInt #define cgiUsualDouble cgiOptionalDouble struct cgiChoice /* Choice table */ { char *name; int value; }; int cgiOneChoice(char *varName, struct cgiChoice *choices, int choiceSize); /* Returns value associated with string variable in choice table. */ boolean cgiVarExists(char *varName); /* Returns TRUE if the variable was passed in. */ void cgiBadVar(char *varName); /* Complain about a variable that's not there. */ void cgiDecode(char *in, char *out, int inLength); /* Decode from cgi pluses-for-spaces format to normal. * Out will be a little shorter than in typically. */ void cgiDecodeFull(char *in, char *out, int inLength); /* Out will be a cgi-decoded version of in (no space from plus!). * Out will be a little shorter than in typically, and * can be the same buffer. */ char *cgiEncode(char *inString); /* Return a cgi-encoded version of inString. * Alphanumerics kept as is, space translated to plus, * and all other characters translated to %hexVal. * You can free return value with freeMem(). */ char *cgiEncodeFull(char *inString); /* Return a cgi-encoded version of inString (no + for space!). * Alphanumerics/./_ kept as is and all other characters translated to * %hexVal. */ void cgiMakeButtonWithMsg(char *name, char *value, char *msg); /* Make 'submit' type button. Display msg on mouseover, if present*/ void cgiMakeButtonWithOnClick(char *name, char *value, char *msg, char *onClick); /* Make 'submit' type button, with onclick javascript */ void cgiMakeButton(char *name, char *value); /* Make 'submit' type button. */ void cgiMakeOnClickButton(char *command, char *value); /* Make 'push' type button with client side onClick (java)script. */ void cgiMakeOnClickSubmitButton(char *command, char *name, char *value); /* Make submit button with both variable name and value with client side * onClick (java)script. */ void cgiMakeOptionalButton(char *name, char *value, boolean disabled); /* Make 'submit' type button that can be disabled. */ void cgiMakeRadioButton(char *name, char *value, boolean checked); /* Make radio type button. A group of radio buttons should have the * same name but different values. The default selection should be * sent with checked on. */ void cgiMakeOnClickRadioButton(char *name, char *value, boolean checked, char *command); /* Make radio type button with onClick command. * A group of radio buttons should have the * same name but different values. The default selection should be * sent with checked on. */ void cgiMakeCheckBoxUtil(char *name, boolean checked, char *msg, char *id); /* Make check box - can be called directly, though it was originally meant * as the common code for all lower level checkbox routines. * However, it's util functionality has been taken over by * cgiMakeCheckBoxWithIdAndOptionalHtml() */ void cgiMakeCheckBox(char *name, boolean checked); /* Make check box. */ void cgiMakeCheckBoxWithMsg(char *name, boolean checked, char *msg); /* Make check box, which includes a msg. */ void cgiMakeCheckBoxWithId(char *name, boolean checked, char *id); /* Make check box, which includes an ID. */ void cgiMakeCheckBoxJS(char *name, boolean checked, char *javascript); /* Make check box with javascript */ void cgiMakeCheckBoxIdAndJS(char *name, boolean checked, char *id, char *javascript); /* Make check box with ID and javascript. */ void cgiMakeCheckBoxFourWay(char *name, boolean checked, boolean enabled, char *id, char *classes, char *moreHtml); /* Make check box - with fourWay functionality (checked/unchecked by enabled/disabled * Also makes a shadow hidden variable that supports the 2 boolean states. */ void cgiMakeTextArea(char *varName, char *initialVal, int rowCount, int columnCount); /* Make a text area with area rowCount X columnCount and with text: intialVal. */ void cgiMakeTextAreaDisableable(char *varName, char *initialVal, int rowCount, int columnCount, boolean disabled); /* Make a text area that can be disabled. The rea has rowCount X * columnCount and with text: intialVal */ void cgiMakeTextVar(char *varName, char *initialVal, int charSize); /* Make a text control filled with initial value. If charSize * is zero it's calculated from initialVal size. */ void cgiMakeTextVarWithExtraHtml(char *varName, char *initialVal, int width, char *extra); /* Make a text control filled with initial value. */ void cgiMakeOnKeypressTextVar(char *varName, char *initialVal, int charSize, char *script); /* Make a text control filled with initial value, with a (java)script * to execute every time a key is pressed. If charSize is zero it's * calculated from initialVal size. */ void cgiMakeIntVar(char *varName, int initialVal, int maxDigits); /* Make a text control filled with initial integer value. */ #define NO_VALUE -96669 void cgiMakeIntVarInRange(char *varName, int initialVal, char *title, int width, char *min, char *max); /* Make a integer control filled with initial value. If min and/or max are non-NULL will enforce range Requires utils.js jQuery.js and inputBox class */ void cgiMakeIntVarWithLimits(char *varName, int initialVal, char *title, int width, int min, int max); void cgiMakeIntVarWithMin(char *varName, int initialVal, char *title, int width, int min); void cgiMakeIntVarWithMax(char *varName, int initialVal, char *title, int width, int max); #define cgiMakeIntVarNoLimits(varName,initialVal,title,width) \ cgiMakeIntVarInRange(varName,initialVal,title,width,NULL,NULL) /* All four of these call cgiMakeIntVarInRange() and therefore require utils.js */ void cgiMakeDoubleVar(char *varName, double initialVal, int maxDigits); /* Make a text control filled with initial floating-point value. */ void cgiMakeDoubleVarInRange(char *varName, double initialVal, char *title, int width, char *min, char *max); /* Make a floating point control filled with initial value. If min and/or max are non-NULL will enforce range Requires utils.js jQuery.js and inputBox class */ void cgiMakeDoubleVarWithLimits(char *varName, double initialVal, char *title, int width, double min, double max); void cgiMakeDoubleVarWithMin(char *varName, double initialVal, char *title, int width, double min); void cgiMakeDoubleVarWithMax(char *varName, double initialVal, char *title, int width, double max); #define cgiMakeDoubleVarNoLimits(varName,initialVal,title,width) \ cgiMakeDoubleVarInRange(varName,initialVal,title,width,NULL,NULL) /* All four of these call cgiMakeDoubleVarInRange() and therefore require utils.js */ void cgiMakeDropListClass(char *name, char *menu[], int menuSize, char *checked, char *class); /* Make a drop-down list with names and style sheet class. */ void cgiMakeDropList(char *name, char *menu[], int menuSize, char *checked); /* Make a drop-down list with names. * uses style "normalText" */ void cgiMakeDropListClassWithStyleAndJavascript(char *name, char *menu[], int menuSize, char *checked, char *class, char *style,char *javascript); /* Make a drop-down list with names, text class, style and javascript. */ void cgiMakeDropListClassWithStyle(char *name, char *menu[], int menuSize, char *checked, char *class, char *style); /* Make a drop-down list with names, text class and style. */ void cgiMakeDropListWithVals(char *name, char *menu[], char *values[], int menuSize, char *checked); /* Make a drop-down list with names and values. In this case checked * corresponds to a value, not a menu. */ void cgiMakeDropListFull(char *name, char *menu[], char *values[], int menuSize, char *checked, char *extraAttribs); /* Make a drop-down list with names and values. */ void cgiDropDownWithTextValsAndExtra(char *name, char *text[], char *values[], int count, char *selected, char *extra); /* Make a drop-down list with both text and values. */ char *cgiMakeSelectDropList(boolean multiple, char *name, struct slPair *valsAndLabels, char *selected, char *anyAll,char *extraClasses, char *extraHtml); // Returns allocated string of HTML defining a drop-down select // (if multiple, REQUIRES ui-dropdownchecklist.js) // valsAndLabels: val (pair->name) must be filled in but label (pair->val) may be NULL. // selected: if not NULL is a val found in the valsAndLabels (multiple then comma delimited list). // If null and anyAll not NULL, that will be selected // anyAll: if not NULL is the string for an initial option. It can contain val and label, // delimited by a comma // extraHtml: if not NULL contains id, javascript calls and style. // It does NOT contain class definitions #define cgiMakeMultiSelectDropList(name,valsAndLabels,selected,anyAll,extraClasses,extraHtml) \ cgiMakeSelectDropList(TRUE,(name),(valsAndLabels),(selected),(anyAll),\ (extraClasses),(extraHtml)) #define cgiMakeSingleSelectDropList(name,valsAndLabels,selected,anyAll,extraClasses,extraHtml) \ cgiMakeSelectDropList(FALSE,(name),(valsAndLabels),(selected),(anyAll),\ (extraClasses),(extraHtml)) void cgiMakeMultList(char *name, char *menu[], int menuSize, struct slName *checked, int length); /* Make a list of names which can have multiple selections. * Same as drop-down list except "multiple" is added to select tag */ void cgiMakeCheckboxGroup(char *name, char *menu[], int menuSize, struct slName *checked, int tableColumns); /* Make a table of checkboxes that have the same variable name but different * values (same behavior as a multi-select input). */ void cgiMakeCheckboxGroupWithVals(char *name, char *menu[], char *values[], int menuSize, struct slName *checked, int tableColumns); /* Make a table of checkboxes that have the same variable name but different * values (same behavior as a multi-select input), with nice labels in menu[]. */ void cgiMakeHiddenVarWithExtra(char *varName, char *string, char *extra); /* Store string in hidden input for next time around. */ #define cgiMakeHiddenVar(name,val) cgiMakeHiddenVarWithExtra((name),(val),NULL) /* Store string in hidden input for next time around. */ void cgiContinueHiddenVar(char *varName); /* Write CGI var back to hidden input for next time around. * (if it exists). */ void cgiContinueAllVars(); /* Write back all CGI vars as hidden input for next time around. */ void cgiVarExclude(char *varName); /* If varName exists, remove it. */ void cgiVarExcludeExcept(char **varNames); /* Exclude all variables except for those in NULL * terminated array varNames. varNames may be NULL * in which case nothing is excluded. */ void cgiVarSet(char *varName, char *val); /* Set a cgi variable to a particular value. */ struct dyString *cgiUrlString(); /* Get URL-formatted that expresses current CGI variable state. */ void cgiEncodeIntoDy(char *var, char *val, struct dyString *dy); /* Add a CGI-encoded &var=val string to dy. */ boolean cgiSpoof(int *pArgc, char *argv[]); /* Use the command line to set up things as if we were a CGI program. * User types in command line (assuming your program called cgiScript) * like: * cgiScript nonCgiArg1 var1=value1 var2=value2 var3=value3 nonCgiArg2 * or like * cgiScript nonCgiArg1 var1=value1&var2=value2&var3=value3 nonCgiArg2 * (The non-cgi arguments can occur anywhere. The cgi arguments (all containing * the character '=') are erased from argc/argv. Normally you call this * cgiSpoof(&argc, argv); */ boolean cgiFromCommandLine(int *pArgc, char *argv[], boolean preferWeb); /* Use the command line to set up things as if we were a CGI program. * If preferWeb is TRUE will choose real CGI variables over command * line ones. */ void useTempFile(); /* tell cheapcgi to use temp files */ boolean cgiFromFile(char *fileName); /* Set up a cgi environment using parameters stored in a file. * Takes file with arguments in the form: * argument1=someVal * # This is a comment * argument2=someOtherVal * ... * and puts them into the cgi environment so that the usual * cgiGetVar() commands can be used. Useful when a program * has a lot of possible parameters. */ boolean cgiParseInput(char *input, struct hash **retHash, struct cgiVar **retList); /* Parse cgi-style input into a hash table and list. This will alter * the input data. The hash table will contain references back * into input, so please don't free input until you're done with * the hash. Prints message and returns FALSE if there's an error. * To clean up - slFreeList, hashFree, and only then free input. */ void cgiParseInputAbort(char *input, struct hash **retHash, struct cgiVar **retList); /* Parse cgi-style input into a hash table and list as above but abort if there's an error. */ char *cgiStringNewValForVar(char *cgiIn, char *varName, char *newVal); /* Return a cgi-encoded string with newVal in place of what was oldVal. * It is an error for var not to exist. Do a freeMem of this string * when you are through. */ void cgiSimpleTableStart(); /* start HTML table -- no customization. Leaves room * for a fancier implementation */ void cgiTableEnd(); /* end HTML table */ void cgiMakeSubmitButton(); /* Make 'submit' type button. */ void cgiMakeResetButton(); /* Make 'reset' type button. */ void cgiMakeClearButton(char *form, char *field); /* Make button to clear a text field. */ void cgiMakeFileEntry(char *name); /* Make file entry box/browser */ void cgiSimpleTableRowStart(); /* Start table row */ void cgiTableRowEnd(); /* End table row */ void cgiSimpleTableFieldStart(); /* Start table field */ void cgiTableFieldStartAlignRight(); /* Start table field */ void cgiTableFieldEnd(); /* End table field */ void cgiTableField(char *text); /* Make table field entry */ void cgiTableFieldWithMsg(char *text, char *msg); /* Make table field entry with mouseover */ void cgiParagraph(char *text); /* Make text paragraph */ void logCgiToStderr(); /* Log useful CGI info to stderr */ void cgiResetState(); /* This is for reloading CGI settings multiple times in the same program * execution. No effect if state has not yet been initialized. */ void cgiDown(float lines); // Drop down a certain number of lines (may be fractional) char *commonCssStyles(); /* Returns a string of common CSS styles */ char *javaScriptLiteralEncode(char *inString); /* Use backslash escaping on newline * and quote chars, backslash and others. * Intended that the encoded string will be * put between quotes at a higher level and * then interpreted by Javascript. */ struct cgiParsedVars /* A parsed out cgi variable string */ { struct cgiParsedVars *next; /* In case want to make a list of these. */ char *stringBuf; /* Holds strings inside vars. */ struct cgiVar *list; /* List of variables. */ struct hash *hash; /* Keyed by varName, value is just value, not cgiVar. */ }; struct cgiParsedVars *cgiParsedVarsNew(char *cgiString); /* Build structure containing parsed out cgiString */ void cgiParsedVarsFree(struct cgiParsedVars **pTags); /* Free up memory associated with cgiParsedVars */ #endif /* CHEAPCGI_H */ rtracklayer/src/ucsc/cirTree.c0000644000175100017510000004650612612032142017406 0ustar00biocbuildbiocbuild/* cirTree chromosome id r tree. Part of a system to index chromosome ranges - things of * form chrN:start-end. Generally you'll be using the crTree module - which * makes use of this module and the bPlusTree module - rather than this module directly. * This module works with chromosomes mapped to small integers rather than chromosomes * as strings, saving space and speeding things up in the process, but requiring the * separate bPlusTree to map the names to IDs. * This module implements a one dimensional R-tree index treating the chromosome ID * as the most significant part of a two-part key, and the base position as the least * significant part of the key. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "localmem.h" #include "sig.h" #include "udc.h" #include "cirTree.h" struct rTree /* Recursive range structure. */ { struct rTree *next; /* Next on same level. */ struct rTree *children; /* Child list. */ struct rTree *parent; /* Our parent if any. */ bits32 startChromIx; /* Starting chromosome. */ bits32 startBase; /* Starting base position. */ bits32 endChromIx; /* Ending chromosome. */ bits32 endBase; /* Ending base. */ bits64 startFileOffset; /* Start offset in file for leaves. */ bits64 endFileOffset; /* End file offset for leaves. */ }; #define fileHeaderSize (48) /* Size of file header. */ #define indexSlotSize (24) /* Size of startChrom,startBase,endChrom,endBase,offset */ #define leafSlotSize (32) /* Size of startChrom,startBase,endChrom,endBase,offset,size */ #define nodeHeaderSize (4) /* Size of rTree node header. isLeaf,reserved,childCount. */ int indexNodeSize(int blockSize) /* Return size of an index node. */ { return nodeHeaderSize + indexSlotSize * blockSize; } int leafNodeSize(int blockSize) /* Return size of a leaf node. */ { return nodeHeaderSize + leafSlotSize * blockSize; } static bits64 rWriteIndexLevel(bits16 blockSize, int childNodeSize, struct rTree *tree, int curLevel, int destLevel, bits64 offsetOfFirstChild, FILE *f) /* Recursively write an index level, skipping levels below destLevel, * writing out destLevel. */ { struct rTree *el; bits64 offset = offsetOfFirstChild; if (curLevel == destLevel) { /* We've reached the right level, write out a node header */ UBYTE reserved = 0; UBYTE isLeaf = FALSE; bits16 countOne = slCount(tree->children); writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out elements of this node. */ for (el = tree->children; el != NULL; el = el->next) { writeOne(f, el->startChromIx); writeOne(f, el->startBase); writeOne(f, el->endChromIx); writeOne(f, el->endBase); writeOne(f, offset); offset += childNodeSize; } /* Write out zeroes for empty slots in node. */ int i; for (i=countOne; ichildren; el != NULL; el = el->next) offset = rWriteIndexLevel(blockSize, childNodeSize, el, curLevel+1, destLevel, offset, f); } return offset; } static void writeIndexLevel(int blockSize, int childNodeSize, struct rTree *tree, bits64 offsetOfFirstChild, int level, FILE *f) /* Write out a non-leaf level nodes at given level. */ { rWriteIndexLevel(blockSize, childNodeSize, tree, 0, level, offsetOfFirstChild, f); } static void rWriteLeaves(int itemsPerSlot, int lNodeSize, struct rTree *tree, int curLevel, int leafLevel, FILE *f) /* Write out leaf-level nodes. */ { if (curLevel == leafLevel) { /* We've reached the right level, write out a node header. */ UBYTE reserved = 0; UBYTE isLeaf = TRUE; bits16 countOne = slCount(tree->children); writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out elements of this node. */ struct rTree *el; for (el = tree->children; el != NULL; el = el->next) { writeOne(f, el->startChromIx); writeOne(f, el->startBase); writeOne(f, el->endChromIx); writeOne(f, el->endBase); writeOne(f, el->startFileOffset); bits64 size = el->endFileOffset - el->startFileOffset; writeOne(f, size); } /* Write out zeroes for empty slots in node. */ int i; for (i=countOne; ichildren; el != NULL; el = el->next) rWriteLeaves(itemsPerSlot, lNodeSize, el, curLevel+1, leafLevel, f); } } static void writeLeaves(int itemsPerSlot, int lNodeSize, struct rTree *tree, int leafLevel, FILE *f) /* Write out leaf-level nodes. */ { rWriteLeaves(itemsPerSlot, lNodeSize, tree, 0, leafLevel, f); } void calcLevelSizes(struct rTree *tree, int *levelSizes, int level, int maxLevel) /* Recursively count sizes of levels and add to appropriate slots of levelSizes */ { struct rTree *el; for (el = tree; el != NULL; el = el->next) { levelSizes[level] += 1; if (level < maxLevel) calcLevelSizes(el->children, levelSizes, level+1, maxLevel); } } static struct rTree *rTreeFromChromRangeArray( struct lm *lm, int blockSize, int itemsPerSlot, void *itemArray, int itemSize, bits64 itemCount, void *context, struct cirTreeRange (*fetchKey)(const void *va, void *context), bits64 (*fetchOffset)(const void *va, void *context), bits64 endFileOffset, int *retLevelCount) { if (itemCount == 0) return NULL; char *items = itemArray; struct rTree *el, *list=NULL, *tree = NULL; /* Make first level above leaf. */ bits64 i; bits64 nextOffset = (*fetchOffset)(items, context); int oneSize = 0; for (i=0; istartChromIx = el->endChromIx = key.chromIx; el->startBase = key.start; el->endBase = key.end; el->startFileOffset = nextOffset; oneSize = 1; char *endItem = startItem; int j; for (j=i+1; jstartFileOffset) break; else oneSize++; } if (j == itemCount) { nextOffset = endFileOffset; } el->endFileOffset = nextOffset; /* Expand area spanned to include all items in block. */ for (j=1; jstartChromIx) { el->startChromIx = key.chromIx; el->startBase = key.start; } else if (key.chromIx == el->startChromIx) { if (key.start < el->startBase) el->startBase = key.start; } if (key.chromIx > el->endChromIx) { el->endChromIx = key.chromIx; el->endBase = key.end; } else if (key.chromIx == el->endChromIx) { if (key.end > el->endBase) el->endBase = key.end; } } } slReverse(&list); verbose(2, "Made %d primary index nodes out of %llu items\n", slCount(list), itemCount); /* Now iterate through making more and more condensed versions until have just one. */ int levelCount = 1; tree = list; while (tree->next != NULL || levelCount < 2) { list = NULL; int slotsUsed = blockSize; struct rTree *parent = NULL, *next; for (el = tree; el != NULL; el = next) { next = el->next; if (slotsUsed >= blockSize) { slotsUsed = 1; lmAllocVar(lm, parent); parent = lmCloneMem(lm, el, sizeof(*el)); parent->children = el; el->parent = parent; el->next = NULL; slAddHead(&list, parent); } else { ++slotsUsed; slAddHead(&parent->children, el); el->parent = parent; if (el->startChromIx < parent->startChromIx) { parent->startChromIx = el->startChromIx; parent->startBase = el->startBase; } else if (el->startChromIx == parent->startChromIx) { if (el->startBase < parent->startBase) parent->startBase = el->startBase; } if (el->endChromIx > parent->endChromIx) { parent->endChromIx = el->endChromIx; parent->endBase = el->endBase; } else if (el->endChromIx == parent->endChromIx) { if (el->endBase > parent->endBase) parent->endBase = el->endBase; } } } slReverse(&list); for (el = list; el != NULL; el = el->next) slReverse(&el->children); tree = list; levelCount += 1; } *retLevelCount = levelCount; return tree; } static void writeTreeToOpenFile(struct rTree *tree, int blockSize, int levelCount, FILE *f) /* Write out tree to a file that is open already - writing out index nodes from * highest to lowest level, and then leaf nodes. */ { /* Calculate sizes of each level. */ int i; int levelSizes[levelCount]; for (i=0; istartChromIx); writeOne(f, tree->startBase); writeOne(f, tree->endChromIx); writeOne(f, tree->endBase); writeOne(f, endFileOffset); writeOne(f, itemsPerSlot); writeOne(f, reserved); if (tree != &dummyTree) writeTreeToOpenFile(tree, blockSize, levelCount, f); lmCleanup(&lm); } void cirTreeFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* R tree block size - # of children for each node. */ bits32 itemsPerSlot, /* Number of items to put in each index slot at lowest level. */ void *context, /* Context pointer for use by fetch call-back functions. */ struct cirTreeRange (*fetchKey)(const void *va, void *context),/* Given item, return key. */ bits64 (*fetchOffset)(const void *va, void *context), /* Given item, return file offset */ bits64 endFileOffset, /* Last position in file we index. */ char *fileName) /* Name of output file. */ /* Create a r tree index file from a sorted array. */ { FILE *f = mustOpen(fileName, "wb"); cirTreeFileBulkIndexToOpenFile(itemArray, itemSize, itemCount, blockSize, itemsPerSlot, context, fetchKey, fetchOffset, endFileOffset, f); carefulClose(&f); } struct cirTreeFile *cirTreeFileAttach(char *fileName, struct udcFile *udc) /* Open up r-tree index file on previously open file, with cirTree * header at current file position. */ { /* Open file and allocate structure to hold info from header etc. */ struct cirTreeFile *crt = needMem(sizeof(*crt)); crt->fileName = fileName; crt->udc = udc; /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustReadOne(udc, magic); if (magic != cirTreeSig) { magic = byteSwap32(magic); isSwapped = crt->isSwapped = TRUE; if (magic != cirTreeSig) errAbort("%s is not a chromosome id r-tree index file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ crt->blockSize = udcReadBits32(udc, isSwapped); crt->itemCount = udcReadBits64(udc, isSwapped); crt->startChromIx = udcReadBits32(udc, isSwapped); crt->startBase = udcReadBits32(udc, isSwapped); crt->endChromIx = udcReadBits32(udc, isSwapped); crt->endBase = udcReadBits32(udc, isSwapped); crt->fileSize = udcReadBits64(udc, isSwapped); crt->itemsPerSlot = udcReadBits32(udc, isSwapped); /* Skip over reserved bits of header. */ bits32 reserved32; udcMustReadOne(udc, reserved32); /* Save position of root block of r tree. */ crt->rootOffset = udcTell(udc); return crt; } struct cirTreeFile *cirTreeFileOpen(char *fileName) /* Open up r-tree index file - reading header and verifying things. */ { return cirTreeFileAttach(cloneString(fileName), udcFileOpen(fileName, udcDefaultDir())); } void cirTreeFileDetach(struct cirTreeFile **pCrt) /* Detatch and free up cirTree file opened with cirTreeFileAttach. */ { freez(pCrt); } void cirTreeFileClose(struct cirTreeFile **pCrt) /* Close and free up cirTree file opened with cirTreeFileAttach. */ { struct cirTreeFile *crt = *pCrt; if (crt != NULL) { freez(&crt->fileName); udcFileClose(&crt->udc); cirTreeFileDetach(pCrt); } } INLINE int cmpTwoBits32(bits32 aHi, bits32 aLo, bits32 bHi, bits32 bLo) /* Return - if b is less than a , 0 if equal, else +*/ { if (aHi < bHi) return 1; else if (aHi > bHi) return -1; else { if (aLo < bLo) return 1; else if (aLo > bLo) return -1; else return 0; } } INLINE boolean cirTreeOverlaps(int qChrom, int qStart, int qEnd, int rStartChrom, int rStartBase, int rEndChrom, int rEndBase) { return cmpTwoBits32(qChrom, qStart, rEndChrom, rEndBase) > 0 && cmpTwoBits32(qChrom, qEnd, rStartChrom, rStartBase) < 0; } static void rFindOverlappingBlocks(struct cirTreeFile *crt, int level, bits64 indexFileOffset, bits32 chromIx, bits32 start, bits32 end, struct fileOffsetSize **retList) /* Recursively find blocks with data. */ { struct udcFile *udc = crt->udc; /* Seek to start of block. */ udcSeek(udc, indexFileOffset); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(udc, isLeaf); udcMustReadOne(udc, reserved); boolean isSwapped = crt->isSwapped; childCount = udcReadBits16(udc, isSwapped); verbose(3, "rFindOverlappingBlocks %llu %u:%u-%u. childCount %d. isLeaf %d\n", indexFileOffset, chromIx, start, end, (int)childCount, (int)isLeaf); if (isLeaf) { /* Loop through node adding overlapping leaves to block list. */ for (i=0; ioffset = offset; block->size = size; slAddHead(retList, block); } } } else { /* Read node into arrays. */ bits32 startChromIx[childCount], startBase[childCount]; bits32 endChromIx[childCount], endBase[childCount]; bits64 offset[childCount]; for (i=0; irootOffset, chromIx, start, end, &blockList); slReverse(&blockList); return blockList; } static void rEnumerateBlocks(struct cirTreeFile *crt, int level, bits64 indexFileOffset, struct fileOffsetSize **retList) /* Recursively find blocks with data. */ { struct udcFile *udc = crt->udc; /* Seek to start of block. */ udcSeek(udc, indexFileOffset); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(udc, isLeaf); udcMustReadOne(udc, reserved); boolean isSwapped = crt->isSwapped; childCount = udcReadBits16(udc, isSwapped); verbose(3, "rEnumerateBlocks %llu childCount %d. isLeaf %d\n", indexFileOffset, (int)childCount, (int)isLeaf); if (isLeaf) { /* Loop through node adding overlapping leaves to block list. */ for (i=0; ioffset = offset; block->size = size; slAddHead(retList, block); } } else { /* Read node into arrays. */ bits64 offset[childCount]; for (i=0; irootOffset, &blockList); slReverse(&blockList); return blockList; } rtracklayer/src/ucsc/cirTree.h0000644000175100017510000001015412612032142017401 0ustar00biocbuildbiocbuild/* cirTree chromosome id r tree. Part of a system to index chromosome ranges - things of * form chrN:start-end. Generally you'll be using the crTree module - which * makes use of this module and the bPlusTree module - rather than this module directly. * This module works with chromosomes mapped to small integers rather than chromosomes * as strings, saving space and speeding things up in the process, but requiring the * separate bPlusTree to map the names to IDs. * This module implements a one dimensional R-tree index treating the chromosome ID * as the most significant part of a two-part key, and the base position as the least * significant part of the key. */ #ifndef CIRTREE_H #define CIRTREE_H struct cirTreeFile /* R tree index file handle. */ { struct cirTreeFile *next; /* Next in list of index files if any. */ char *fileName; /* Name of file - for error reporting. */ struct udcFile *udc; /* Open file pointer. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ bits64 rootOffset; /* Offset of root block. */ bits32 blockSize; /* Size of block. */ bits64 itemCount; /* Number of items indexed. */ bits32 startChromIx; /* First chromosome in file. */ bits32 startBase; /* Starting base position. */ bits32 endChromIx; /* Ending chromosome in file. */ bits32 endBase; /* Ending base position. */ bits64 fileSize; /* Total size of index file. */ bits32 itemsPerSlot; /* Max number of items to put in each index slot at lowest level. */ }; struct cirTreeFile *cirTreeFileOpen(char *fileName); /* Open up r-tree index file - reading header and verifying things. */ void cirTreeFileClose(struct cirTreeFile **pCrt); /* Close and free up cirTree file opened with cirTreeFileAttach. */ struct cirTreeFile *cirTreeFileAttach(char *fileName, struct udcFile *udc); /* Open up r-tree index file on previously open file, with cirTree * header at current file position. */ void cirTreeFileDetach(struct cirTreeFile **pCrt); /* Detach and free up cirTree file opened with cirTreeFileAttach. */ struct fileOffsetSize *cirTreeFindOverlappingBlocks(struct cirTreeFile *crf, bits32 chromIx, bits32 start, bits32 end); /* Return list of file blocks that between them contain all items that overlap * start/end on chromIx. Also there will be likely some non-overlapping items * in these blocks too. When done, use slListFree to dispose of the result. */ struct fileOffsetSize *cirTreeEnumerateBlocks(struct cirTreeFile *crf); /* Return list of file blocks. When done, use slListFree to dispose of the result. */ struct cirTreeRange /* A chromosome id and an interval inside it. */ { bits32 chromIx; /* Chromosome id. */ bits32 start; /* Start position in chromosome. */ bits32 end; /* One past last base in interval in chromosome. */ }; void cirTreeFileBulkIndexToOpenFile( void *itemArray, int itemSize, bits64 itemCount, bits32 blockSize, bits32 itemsPerSlot, void *context, struct cirTreeRange (*fetchKey)(const void *va, void *context), bits64 (*fetchOffset)(const void *va, void *context), bits64 endFileOffset, FILE *f); /* Create a r tree index from a sorted array, writing output starting at current position * of an already open file. See cirTreeFileCreate for explanation of parameters. */ void cirTreeFileCreate( void *itemArray, /* Sorted array of things to index. Sort on chromIx,start. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* R tree block size - # of children for each node. */ bits32 itemsPerSlot, /* Number of items to put in each index slot at lowest level. */ void *context, /* Context pointer for use by fetch call-back functions. */ struct cirTreeRange (*fetchKey)(const void *va, void *context),/* Given item, return key. */ bits64 (*fetchOffset)(const void *va, void *context), /* Given item, return file offset */ bits64 endFileOffset, /* Last position in file we index. */ char *fileName); /* Name of output file. */ /* Create a r tree index file from a sorted array. */ #endif /* CIRTREE_H */ rtracklayer/src/ucsc/common.c0000644000175100017510000023541212612032142017275 0ustar00biocbuildbiocbuild/* Commonly used routines in a wide range of applications. * Strings, singly-linked lists, and a little file i/o. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "errAbort.h" #include "portable.h" #include "linefile.h" #include "hash.h" void *cloneMem(void *pt, size_t size) /* Allocate a new buffer of given size, and copy pt to it. */ { void *newPt = needLargeMem(size); memcpy(newPt, pt, size); return newPt; } static char *cloneStringZExt(const char *s, int size, int copySize) /* Make a zero terminated copy of string in memory */ { char *d = needMem(copySize+1); copySize = min(size,copySize); memcpy(d, s, copySize); d[copySize] = 0; return d; } char *cloneStringZ(const char *s, int size) /* Make a zero terminated copy of string in memory */ { return cloneStringZExt(s, strlen(s), size); } char *cloneString(const char *s) /* Make copy of string in dynamic memory */ { int size = 0; if (s == NULL) return NULL; size = strlen(s); return cloneStringZExt(s, size, size); } char *cloneLongString(char *s) /* Make clone of long string. */ { size_t size = strlen(s); return cloneMem(s, size+1); } char *catTwoStrings(char *a, char *b) /* Allocate new string that is a concatenation of two strings. */ { int aLen = strlen(a), bLen = strlen(b); int len = aLen + bLen; char *newBuf = needLargeMem(len+1); memcpy(newBuf, a, aLen); memcpy(newBuf+aLen, b, bLen); newBuf[len] = 0; return newBuf; } /* Reverse the order of the bytes. */ void reverseBytes(char *bytes, long length) { long halfLen = (length>>1); char *end = bytes+length; char c; while (--halfLen >= 0) { c = *bytes; *bytes++ = *--end; *end = c; } } void reverseInts(int *a, int length) /* Reverse the order of the integer array. */ { int halfLen = (length>>1); int *end = a+length; int c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseUnsigned(unsigned *a, int length) /* Reverse the order of the unsigned array. */ { int halfLen = (length>>1); unsigned *end = a+length; unsigned c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseDoubles(double *a, int length) /* Reverse the order of the double array. */ { int halfLen = (length>>1); double *end = a+length; double c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseStrings(char **a, int length) /* Reverse the order of the char* array. */ { int halfLen = (length>>1); char **end = a+length; char *c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } /* Swap buffers a and b. */ void swapBytes(char *a, char *b, int length) { char c; int i; for (i=0; inext; } return len; } void *slElementFromIx(void *list, int ix) /* Return the ix'th element in list. Returns NULL * if no such element. */ { struct slList *pt = (struct slList *)list; int i; for (i=0;inext; } return pt; } int slIxFromElement(void *list, void *el) /* Return index of el in list. Returns -1 if not on list. */ { struct slList *pt; int ix = 0; for (pt = list, ix=0; pt != NULL; pt = pt->next, ++ix) if (el == (void*)pt) return ix; return -1; } void *slLastEl(void *list) /* Returns last element in list or NULL if none. */ { struct slList *next, *el; if ((el = list) == NULL) return NULL; while ((next = el->next) != NULL) el = next; return el; } /* Add new node to tail of list. * Usage: * slAddTail(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. */ void slAddTail(void *listPt, void *node) { struct slList **ppt = (struct slList **)listPt; struct slList *n = (struct slList *)node; while (*ppt != NULL) { ppt = &((*ppt)->next); } n->next = NULL; *ppt = n; } void *slPopHead(void *vListPt) /* Return head of list and remove it from list. (Fast) */ { struct slList **listPt = (struct slList **)vListPt; struct slList *el = *listPt; if (el != NULL) { *listPt = el->next; el->next = NULL; } return el; } void *slPopTail(void *vListPt) /* Return tail of list and remove it from list. (Not so fast) */ { struct slList **listPt = (struct slList **)vListPt; struct slList *el = *listPt; if (el != NULL) { for (;;) { if (el->next == NULL) { *listPt = NULL; break; } listPt = &el->next; el = el->next; } } return el; } void *slCat(void *va, void *vb) /* Return concatenation of lists a and b. * Example Usage: * struct slName *a = getNames("a"); * struct slName *b = getNames("b"); * struct slName *ab = slCat(a,b) */ { struct slList *a = va; struct slList *b = vb; struct slList *end; if (a == NULL) return b; for (end = a; end->next != NULL; end = end->next) ; end->next = b; return a; } void slReverse(void *listPt) /* Reverse order of a list. * Usage: * slReverse(&list); */ { struct slList **ppt = (struct slList **)listPt; struct slList *newList = NULL; struct slList *el, *next; next = *ppt; while (next != NULL) { el = next; next = el->next; el->next = newList; newList = el; } *ppt = newList; } void slFreeList(void *listPt) /* Free list */ { struct slList **ppt = (struct slList**)listPt; struct slList *next = *ppt; struct slList *el; while (next != NULL) { el = next; next = el->next; freeMem((char*)el); } *ppt = NULL; } void slSort(void *pList, int (*compare )(const void *elem1, const void *elem2)) /* Sort a singly linked list with Qsort and a temporary array. */ { struct slList **pL = (struct slList **)pList; struct slList *list = *pL; int count; count = slCount(list); if (count > 1) { struct slList *el; struct slList **array; int i; array = needLargeMem(count * sizeof(*array)); for (el = list, i=0; el != NULL; el = el->next, i++) array[i] = el; qsort(array, count, sizeof(array[0]), compare); list = NULL; for (i=0; inext = list; list = array[i]; } freeMem(array); slReverse(&list); *pL = list; } } void slUniqify(void *pList, int (*compare )(const void *elem1, const void *elem2), void (*free)()) /* Return sorted list with duplicates removed. * Compare should be same type of function as slSort's compare (taking * pointers to pointers to elements. Free should take a simple * pointer to dispose of duplicate element, and can be NULL. */ { struct slList **pSlList = (struct slList **)pList; struct slList *oldList = *pSlList; struct slList *newList = NULL, *el; slSort(&oldList, compare); while ((el = slPopHead(&oldList)) != NULL) { if ((newList == NULL) || (compare(&newList, &el) != 0)) slAddHead(&newList, el); else if (free != NULL) free(el); } slReverse(&newList); *pSlList = newList; } void slSortMerge(void *pA, void *b, CmpFunction *compare) // Merges and sorts a pair of singly linked lists using slSort. { struct slList **pList = (struct slList **)pA; slCat(*pList, b); slSort(pList,compare); } void slSortMergeUniq(void *pA, void *b, CmpFunction *compare, void (*free)()) // Merges and sorts a pair of singly linked lists leaving only unique // items via slUniqufy. duplicate itens are defined by the compare routine // returning 0. If free is provided, items dropped from list can disposed of. { struct slList **pList = (struct slList **)pA; slCat(*pList, b); slUniqify(pList,compare,free); } boolean slRemoveEl(void *vpList, void *vToRemove) /* Remove element from singly linked list. Usage: * slRemove(&list, el); * Returns TRUE if element in list. */ { struct slList **pList = vpList; struct slList *toRemove = vToRemove; struct slList *el, *next, *newList = NULL; boolean didRemove = FALSE; for (el = *pList; el != NULL; el = next) { next = el->next; if (el != toRemove) { slAddHead(&newList, el); } else didRemove = TRUE; } slReverse(&newList); *pList = newList; return didRemove; } struct slInt *slIntNew(int x) /* Return a new int. */ { struct slInt *a; AllocVar(a); a->val = x; return a; } int slIntCmp(const void *va, const void *vb) /* Compare two slInts. */ { const struct slInt *a = *((struct slInt **)va); const struct slInt *b = *((struct slInt **)vb); return a->val - b->val; } int slIntCmpRev(const void *va, const void *vb) /* Compare two slInts in reverse direction. */ { const struct slInt *a = *((struct slInt **)va); const struct slInt *b = *((struct slInt **)vb); return b->val - a->val; } struct slInt * slIntFind(struct slInt *list, int target) /* Find target in slInt list or return NULL */ { struct slInt *i; for (i=list;i;i=i->next) if (i->val == target) return i; return NULL; } struct slUnsigned *slUnsignedNew(unsigned x) /* Return a new int. */ { struct slUnsigned *a; AllocVar(a); a->val = x; return a; } static int doubleCmp(const void *va, const void *vb) /* Compare function to sort array of doubles. */ { const double *a = va; const double *b = vb; double diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } void doubleSort(int count, double *array) /* Sort an array of doubles. */ { if (count > 1) qsort(array, count, sizeof(array[0]), doubleCmp); } double doubleMedian(int count, double *array) /* Return median value in array. This will sort * the array as a side effect. */ { double median; doubleSort(count, array); if ((count&1) == 1) median = array[count>>1]; else { count >>= 1; median = (array[count] + array[count-1]) * 0.5; } return median; } void doubleBoxWhiskerCalc(int count, double *array, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax) /* Calculate what you need to draw a box and whiskers plot from an array of doubles. */ { if (count <= 0) errAbort("doubleBoxWhiskerCalc needs a positive number, not %d for count", count); if (count == 1) { *retMin = *retQ1 = *retMedian = *retQ3 = *retMax = array[0]; return; } doubleSort(count, array); double min = array[0]; double max = array[count-1]; double median; int halfCount = count>>1; if ((count&1) == 1) median = array[halfCount]; else { median = (array[halfCount] + array[halfCount-1]) * 0.5; } double q1, q3; if (count <= 3) { q1 = 0.5 * (median + min); q3 = 0.5 * (median + max); } else { int q1Ix = count/4; int q3Ix = count - 1 - q1Ix; uglyf("count %d, q1Ix %d, q3Ix %d\n", count, q1Ix, q3Ix); q1 = array[q1Ix]; q3 = array[q3Ix]; } *retMin = min; *retQ1 = q1; *retMedian = median; *retQ3 = q3; *retMax = max; } struct slDouble *slDoubleNew(double x) /* Return a new double. */ { struct slDouble *a; AllocVar(a); a->val = x; return a; } int slDoubleCmp(const void *va, const void *vb) /* Compare two slDoubles. */ { const struct slDouble *a = *((struct slDouble **)va); const struct slDouble *b = *((struct slDouble **)vb); double diff = a->val - b->val; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } double slDoubleMedian(struct slDouble *list) /* Return median value on list. */ { int i,count = slCount(list); struct slDouble *el; double *array, median; if (count == 0) errAbort("Can't take median of empty list"); AllocArray(array,count); for (i=0, el=list; inext) array[i] = el->val; median = doubleMedian(count, array); freeMem(array); return median; } void slDoubleBoxWhiskerCalc(struct slDouble *list, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax) /* Calculate what you need to draw a box and whiskers plot from a list of slDoubles. */ { int i,count = slCount(list); struct slDouble *el; double *array; if (count == 0) errAbort("Can't take do slDoubleBoxWhiskerCalc of empty list"); AllocArray(array,count); for (i=0, el=list; inext) array[i] = el->val; doubleBoxWhiskerCalc(count, array, retMin, retQ1, retMedian, retQ3, retMax); freeMem(array); } static int intCmp(const void *va, const void *vb) /* Compare function to sort array of ints. */ { const int *a = va; const int *b = vb; int diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } void intSort(int count, int *array) /* Sort an array of ints. */ { if (count > 1) qsort(array, count, sizeof(array[0]), intCmp); } int intMedian(int count, int *array) /* Return median value in array. This will sort * the array as a side effect. */ { int median; intSort(count, array); if ((count&1) == 1) median = array[count>>1]; else { count >>= 1; median = (array[count] + array[count-1]) * 0.5; } return median; } struct slName *newSlName(char *name) /* Return a new name. */ { struct slName *sn; if (name != NULL) { int len = strlen(name); sn = needMem(sizeof(*sn)+len); strcpy(sn->name, name); return sn; } else { AllocVar(sn); } return sn; } struct slName *slNameNewN(char *name, int size) /* Return new slName of given size. */ { struct slName *sn = needMem(sizeof(*sn) + size); memcpy(sn->name, name, size); return sn; } int slNameCmpCase(const void *va, const void *vb) /* Compare two slNames, ignore case. */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return strcasecmp(a->name, b->name); } void slNameSortCase(struct slName **pList) /* Sort slName list, ignore case. */ { slSort(pList, slNameCmpCase); } int slNameCmp(const void *va, const void *vb) /* Compare two slNames. */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return strcmp(a->name, b->name); } int slNameCmpStringsWithEmbeddedNumbers(const void *va, const void *vb) /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return cmpStringsWithEmbeddedNumbers(a->name, b->name); } void slNameSort(struct slName **pList) /* Sort slName list. */ { slSort(pList, slNameCmp); } boolean slNameInList(struct slName *list, char *string) /* Return true if string is in name list -- case insensitive. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (sameWord(string, el->name)) return TRUE; return FALSE; } boolean slNameInListUseCase(struct slName *list, char *string) /* Return true if string is in name list -- case sensitive. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (string != NULL && !strcmp(string, el->name)) return TRUE; return FALSE; } void *slNameFind(void *list, char *string) /* Return first element of slName list (or any other list starting * with next/name fields) that matches string. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (sameWord(string, el->name)) return el; return NULL; } int slNameFindIx(struct slName *list, char *string) /* Return index of first element of slName list (or any other * list starting with next/name fields) that matches string. * Return -1 if not found. */ { struct slName *el; int ix = 0; for (el = list; el != NULL; el = el->next, ix++) if (sameString(string, el->name)) return ix; return -1; } char *slNameStore(struct slName **pList, char *string) /* Put string into list if it's not there already. * Return the version of string stored in list. */ { struct slName *el; for (el = *pList; el != NULL; el = el->next) { if (sameString(string, el->name)) return el->name; } el = newSlName(string); slAddHead(pList, el); return el->name; } struct slName *slNameAddHead(struct slName **pList, char *name) /* Add name to start of list and return it. */ { struct slName *el = slNameNew(name); slAddHead(pList, el); return el; } struct slName *slNameAddTail(struct slName **pList, char *name) /* Add name to end of list (not efficient for long lists), * and return it. */ { struct slName *el = slNameNew(name); slAddTail(pList, el); return el; } struct slName *slNameCloneList(struct slName *list) /* Return clone of list. */ { struct slName *el, *newEl, *newList = NULL; for (el = list; el != NULL; el = el->next) { newEl = slNameNew(el->name); slAddHead(&newList, newEl); } slReverse(&newList); return newList; } struct slName *slNameListFromString(char *s, char delimiter) /* Return list of slNames gotten from parsing delimited string. * The final delimiter is optional. a,b,c and a,b,c, are equivalent * for comma-delimited lists. */ { char *e; struct slName *list = NULL, *el; while (s != NULL && s[0] != 0) { e = strchr(s, delimiter); if (e == NULL) el = slNameNew(s); else { el = slNameNewN(s, e-s); e += 1; } slAddHead(&list, el); s = e; } slReverse(&list); return list; } struct slName *slNameListOfUniqueWords(char *text,boolean respectQuotes) // Return list of unique words found by parsing string delimited by whitespace. // If respectQuotes then ["Lucy and Ricky" 'Fred and Ethyl'] will yield 2 slNames no quotes { struct slName *list = NULL; char *word = NULL; while (text != NULL) { if (respectQuotes) { word = nextWordRespectingQuotes(&text); if (word != NULL) { if (word[0] == '"') stripChar(word, '"'); else if (word[0] == '\'') stripChar(word, '\''); } } else word = nextWord(&text); if (word) slNameStore(&list, word); else break; } slReverse(&list); return list; } struct slName *slNameListFromStringArray(char *stringArray[], int arraySize) /* Return list of slNames from an array of strings of length arraySize. * If a string in the array is NULL, the array will be treated as * NULL-terminated (shorter than arraySize). */ { char *s; struct slName *list = NULL, *el; int i; if (stringArray == NULL) return NULL; for (i = 0; i < arraySize; i++) { s = stringArray[i]; if (s == NULL) break; el = slNameNew(s); slAddHead(&list, el); } slReverse(&list); return list; } char *slNameListToString(struct slName *list, char delimiter) /* Return string created by joining all names with the delimiter. */ { struct slName *el; int elCount = 0; int len = 0; char del[2]; char *s; del[0] = delimiter; del[1] = '\0'; for (el = list; el != NULL; el = el->next, elCount++) len += strlen(el->name); len += elCount; AllocArray(s, len); for (el = list; el != NULL; el = el->next) { strcat(s, el->name); if (el->next != NULL) strcat(s, del); } return s; } struct slName *slNameLoadReal(char *fileName) /* load file lines that are not blank or start with a '#' into a slName * list */ { struct slName *lines = NULL; char *line; struct lineFile *lf = lineFileOpen(fileName, TRUE); while (lineFileNextReal(lf, &line)) slSafeAddHead(&lines, slNameNew(line)); lineFileClose(&lf); slReverse(&lines); return lines; } struct slName *slNameIntersection(struct slName *a, struct slName *b) /* return intersection of two slName lists. */ { struct hash *hashA = newHash(0); struct slName *el, *retval = NULL; for (el = a; el != NULL; el = el->next) hashAddInt(hashA, el->name, 1); for (el = b; el != NULL; el = el->next) if(hashLookup(hashA, el->name) != NULL) slNameAddHead(&retval, el->name); hashFree(&hashA); return retval; } struct slRef *refOnList(struct slRef *refList, void *val) /* Return ref if val is already on list, otherwise NULL. */ { struct slRef *ref; for (ref = refList; ref != NULL; ref = ref->next) if (ref->val == val) return ref; return NULL; } struct slRef *slRefNew(void *val) /* Create new slRef element. */ { struct slRef *ref; AllocVar(ref); ref->val = val; return ref; } void refAdd(struct slRef **pRefList, void *val) /* Add reference to list. */ { struct slRef *ref; AllocVar(ref); ref->val = val; slAddHead(pRefList, ref); } void refAddUnique(struct slRef **pRefList, void *val) /* Add reference to list if not already on list. */ { if (refOnList(*pRefList, val) == NULL) { refAdd(pRefList, val); } } void slRefFreeListAndVals(struct slRef **pList) /* Free up (with simple freeMem()) each val on list, and the list itself as well. */ { struct slRef *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; freeMem(el->val); freeMem(el); } *pList = NULL; } struct slRef *refListFromSlList(void *list) /* Make a reference list that mirrors a singly-linked list. */ { struct slList *el; struct slRef *refList = NULL, *ref; for (el= list; el != NULL; el = el->next) { ref = slRefNew(el); slAddHead(&refList, ref); } slReverse(&refList); return refList; } struct slPair *slPairNew(char *name, void *val) /* Allocate new name/value pair. */ { struct slPair *el; AllocVar(el); el->name = cloneString(name); el->val = val; return el; } void slPairAdd(struct slPair **pList, char *name, void *val) /* Add new slPair to head of list. */ { struct slPair *el = slPairNew(name, val); slAddHead(pList, el); } void slPairFree(struct slPair **pEl) /* Free up struct and name. (Don't free up values.) */ { struct slPair *el = *pEl; if (el != NULL) { freeMem(el->name); freez(pEl); } } void slPairFreeList(struct slPair **pList) /* Free up list. (Don't free up values.) */ { struct slPair *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; slPairFree(&el); } *pList = NULL; } void slPairFreeVals(struct slPair *list) /* Free up all values on list. */ { struct slPair *el; for (el = list; el != NULL; el = el->next) freez(&el->val); } void slPairFreeValsAndList(struct slPair **pList) /* Free up all values on list and list itself */ { slPairFreeVals(*pList); slPairFreeList(pList); } struct slPair *slPairFind(struct slPair *list, char *name) /* Return list element of given name, or NULL if not found. */ { struct slPair *el; for (el = list; el != NULL; el = el->next) if (sameString(name, el->name)) break; return el; } void *slPairFindVal(struct slPair *list, char *name) /* Return value associated with name in list, or NULL if not found. */ { struct slPair *el = slPairFind(list, name); if (el == NULL) return NULL; return el->val; } struct slPair *slPairListFromString(char *str,boolean respectQuotes) // Return slPair list parsed from list in string like: [name1=val1 name2=val2 ...] // if respectQuotes then string can have double quotes: [name1="val 1" "name 2"=val2 ...] // resulting pair strips quotes: {name1}={val 1},{name 2}={val2} // Returns NULL if parse error. Free this up with slPairFreeValsAndList. { char *s = skipLeadingSpaces(str); // Would like to remove this and tighten up the standard someday. if (isEmpty(s)) return NULL; struct slPair *list = NULL; char name[1024]; char val[1024]; char buf[1024]; bool inQuote = FALSE; char *b = buf; char sep = '='; char c = ' '; int mode = 0; while(1) { c = *s++; if (mode == 0 || mode == 2) // reading name or val { boolean term = FALSE; if (respectQuotes && b == buf && !inQuote && c == '"') inQuote = TRUE; else if (inQuote && c == '"') term = TRUE; else if ((c == sep || c == 0) && !inQuote) { term = TRUE; --s; // rewind } else if (c == ' ' && !inQuote) { warn("slPairListFromString: Unexpected whitespace in %s", str); return NULL; } else if (c == 0 && inQuote) { warn("slPairListFromString: Unterminated quote in %s", str); return NULL; } else { *b++ = c; if ((b - buf) > sizeof buf) { warn("slPairListFromString: pair name or value too long in %s", str); return NULL; } } if (term) { inQuote = FALSE; *b = 0; if (mode == 0) { safecpy(name, sizeof name, buf); if (strlen(name)<1) { warn("slPairListFromString: Pair name cannot be empty in %s", str); return NULL; } // Shall we check for name being alphanumeric, at least for the respectQuotes=FALSE case? } else // mode == 2 { safecpy(val, sizeof val, buf); if (!respectQuotes && (hasWhiteSpace(name) || hasWhiteSpace(val))) // should never happen { warn("slPairListFromString() Unexpected white space in name=value pair: [%s]=[%s] in string=[%s]\n", name, val, str); break; } slPairAdd(&list, name, cloneString(val)); } ++mode; } } else if (mode == 1) // read required "=" sign { if (c != '=') { warn("slPairListFromString: Expected character = after name in %s", str); return NULL; } ++mode; sep = ' '; b = buf; } else // (mode == 3) reading optional separating space { if (c == 0) break; if (c != ' ') { mode = 0; --s; b = buf; sep = '='; } } } slReverse(&list); return list; } char *slPairListToString(struct slPair *list,boolean quoteIfSpaces) // Returns an allocated string of pairs in form of [name1=val1 name2=val2 ...] // If requested, will wrap name or val in quotes if contain spaces: [name1="val 1" "name 2"=val2] { // Don't rely on dyString. We should do the accounting ourselves and not create extra dependencies. int count = 0; struct slPair *pair = list; for (;pair != NULL; pair = pair->next) { assert(pair->name != NULL && pair->val != NULL); // Better assert and get this over with, // complete with stack count += strlen(pair->name); count += strlen((char *)(pair->val)); count += 2; // = and ' ' delimit if (quoteIfSpaces) { if (hasWhiteSpace(pair->name)) count += 2; // " and " if (hasWhiteSpace((char *)(pair->val))) count += 2; // " and " } } if (count == 0) return NULL; char *str = needMem(count+5); // A bit of slop char *strPtr = str; for (pair = list; pair != NULL; pair = pair->next, strPtr += strlen(strPtr)) { if (pair != list) // Not first cycle *strPtr++ = ' '; if (hasWhiteSpace(pair->name)) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"=",pair->name); else { warn("slPairListToString() Unexpected white space in name: [%s]\n", pair->name); sprintf(strPtr,"%s=",pair->name); // warn but still make string } } else sprintf(strPtr,"%s=",pair->name); strPtr += strlen(strPtr); if (hasWhiteSpace((char *)(pair->val))) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"",(char *)(pair->val)); else { warn("slPairListToString() Unexpected white space in val: [%s]\n", (char *)(pair->val)); sprintf(strPtr,"%s",(char *)(pair->val)); // warn but still make string } } else sprintf(strPtr,"%s",(char *)(pair->val)); } return str; } char *slPairNameToString(struct slPair *list, char delimiter,boolean quoteIfSpaces) // Return string created by joining all names (ignoring vals) with the delimiter. // If requested, will wrap name in quotes if contain spaces: [name1,"name 2" ...] { int elCount = 0; int count = 0; struct slPair *pair = list; for (; pair != NULL; pair = pair->next, elCount++) { assert(pair->name != NULL); count += strlen(pair->name); if (quoteIfSpaces && hasWhiteSpace(pair->name)) count += 2; } count += elCount; if (count == 0) return NULL; char *str = needMem(count+5); // A bit of slop char *strPtr = str; for (pair = list; pair != NULL; pair = pair->next, strPtr += strlen(strPtr)) { if (pair != list) *strPtr++ = delimiter; if (hasWhiteSpace(pair->name)) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"",pair->name); else { if (delimiter == ' ') // if delimied by commas, this is entirely okay! warn("slPairListToString() Unexpected white space in name delimied by space: " "[%s]\n", pair->name); sprintf(strPtr,"%s",pair->name); // warn but still make string } } else sprintf(strPtr,"%s",pair->name); } return str; } int slPairCmpCase(const void *va, const void *vb) /* Compare two slPairs, ignore case. */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcasecmp(a->name, b->name); } void slPairSortCase(struct slPair **pList) /* Sort slPair list, ignore case. */ { slSort(pList, slPairCmpCase); } int slPairCmp(const void *va, const void *vb) /* Compare two slPairs. */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcmp(a->name, b->name); } int slPairValCmpCase(const void *va, const void *vb) /* Case insensitive compare two slPairs on their values (must be string). */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcasecmp((char *)(a->val), (char *)(b->val)); } int slPairValCmp(const void *va, const void *vb) /* Compare two slPairs on their values (must be string). */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcmp((char *)(a->val), (char *)(b->val)); } void slPairValSortCase(struct slPair **pList) /* Sort slPair list on values (must be string), ignore case. */ { slSort(pList, slPairValCmpCase); } void slPairValSort(struct slPair **pList) /* Sort slPair list on values (must be string). */ { slSort(pList, slPairValCmp); } int slPairIntCmp(const void *va, const void *vb) // Compare two slPairs on their integer values. { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return ((char *)(a->val) - (char *)(b->val)); // cast works and val is 0 vased integer } void slPairIntSort(struct slPair **pList) // Sort slPair list on integer values. { slSort(pList, slPairIntCmp); } int slPairAtoiCmp(const void *va, const void *vb) // Compare two slPairs on their strings interpreted as integer values. { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return (atoi((char *)(a->val)) - atoi((char *)(b->val))); } void slPairValAtoiSort(struct slPair **pList) // Sort slPair list on string values interpreted as integers. { slSort(pList, slPairAtoiCmp); } void gentleFree(void *pt) { if (pt != NULL) freeMem((char*)pt); } int differentWord(char *s1, char *s2) /* strcmp ignoring case - returns zero if strings are * the same (ignoring case) otherwise returns difference * between first non-matching characters. */ { char c1, c2; for (;;) { c1 = toupper(*s1++); c2 = toupper(*s2++); if (c1 != c2) /* Takes care of end of string in one but not the other too */ return c2-c1; if (c1 == 0) /* Take care of end of string in both. */ return 0; } } int differentStringNullOk(char *a, char *b) /* Returns 0 if two strings (either of which may be NULL) * are the same. Otherwise it returns a positive or negative * number depending on the alphabetical order of the two * strings. * This is basically a strcmp that can handle NULLs in * the input. If used in a sort the NULLs will end * up before any of the cases with data. */ { if (a == b) return FALSE; else if (a == NULL) return -1; else if (b == NULL) return 1; else return strcmp(a,b) != 0; } boolean startsWith(const char *start, const char *string) /* Returns TRUE if string begins with start. */ { char c; int i; for (i=0; ;i += 1) { if ((c = start[i]) == 0) return TRUE; if (string[i] != c) return FALSE; } } boolean startsWithWord(char *firstWord, char *line) /* Return TRUE if first white-space-delimited word in line * is same as firstWord. Comparison is case sensitive. */ { int len = strlen(firstWord); int i; for (i=0; i= haystack; pos -= 1) { if (memcmp(needle, pos, nSize) == 0) return pos; } return NULL; } char *stringBetween(char *start, char *end, char *haystack) /* Return string between start and end strings, or NULL if * none found. The first such instance is returned. * String must be freed by caller. */ { char *pos, *p; int len; if ((p = stringIn(start, haystack)) != NULL) { pos = p + strlen(start); if ((p = stringIn(end, pos)) != NULL) { len = p - pos; pos = cloneMem(pos, len + 1); pos[len] = 0; return pos; } } return NULL; } boolean endsWith(char *string, char *end) /* Returns TRUE if string ends with end. */ { int sLen, eLen, offset; sLen = strlen(string); eLen = strlen(end); offset = sLen - eLen; if (offset < 0) return FALSE; return sameString(string+offset, end); } char lastChar(char *s) /* Return last character in string. */ { if (s == NULL || s[0] == 0) return 0; return s[strlen(s)-1]; } void trimLastChar(char *s) /* Erase last character in string. */ { int len = strlen(s); if (len > 0) s[len-1] = 0; } char *lastNonwhitespaceChar(char *s) // Return pointer to last character in string that is not whitespace. { if (s == NULL || s[0] == 0) return NULL; char *sPos = s + (strlen(s) - 1); for (;sPos >= s;sPos--) { if (!isspace(*sPos)) return sPos; } return NULL; } char *matchingCharBeforeInLimits(char *limit, char *s, char c) /* Look for character c sometime before s, but going no further than limit. * Return NULL if not found. */ { while (--s >= limit) if (*s == c) return s; return NULL; } char *memMatch(char *needle, int nLen, char *haystack, int hLen) /* Returns first place where needle (of nLen chars) matches * haystack (of hLen chars) */ { char c = *needle++; nLen -= 1; hLen -= nLen; while (--hLen >= 0) { if (*haystack++ == c && memcmp(needle, haystack, nLen) == 0) { return haystack-1; } } return NULL; } void toUpperN(char *s, int n) /* Convert a section of memory to upper case. */ { int i; for (i=0; i=sz) return -1; for(p=strstr(string,oldStr);p!=NULL;p=strstr(p+strlen(newStr),oldStr)) { memmove(p+strlen(newStr),p+strlen(oldStr),strlen(p+strlen(oldStr))+1); // NULL at end is also moved! memcpy(p,newStr,strlen(newStr)); } return count; } char *strLower(char *s) /* Convert entire string to lower case */ { char c; char *ss=s; for (;;) { if ((c = *ss) == 0) break; *ss++ = tolower(c); } return s; } char * memSwapChar(char *s, int len, char oldChar, char newChar) /* Substitute newChar for oldChar throughout memory of given length. */ { int ix=0; for (;ix= 0 && bNum >= 0) { int diff = atoi(a) - atoi(b); if (diff != 0) return diff; a += aNum; b += bNum; } /* Count number of non-digits at start. */ int aNonNum = countLeadingNondigits(a); int bNonNum = countLeadingNondigits(b); // If different sizes of non-numerical part, then don't match, let strcmp sort out how if (aNonNum != bNonNum) return strcmp(a,b); // If no characters left then they are the same! else if (aNonNum == 0) return 0; // Non-numerical part is the same length and non-zero. See if it is identical. Return if not. else { int diff = memcmp(a,b,aNonNum); if (diff != 0) return diff; a += aNonNum; b += bNonNum; } } } int cmpWordsWithEmbeddedNumbers(const char *a, const char *b) /* Case insensitive version of cmpStringsWithEmbeddedNumbers. */ { char *A = cloneString(a); char *B = cloneString(b); int diff = cmpStringsWithEmbeddedNumbers(strUpper(A), strUpper(B)); freeMem(A); freeMem(B); return diff; } int countSame(char *a, char *b) /* Count number of characters that from start in a,b that are same. */ { char c; int i; int count = 0; for (i=0; ; ++i) { c = a[i]; if (b[i] != c) break; if (c == 0) break; ++count; } return count; } /* int chopString(in, sep, outArray, outSize); */ /* This chops up the input string (cannabilizing it) * into an array of zero terminated strings in * outArray. It returns the number of strings. * If you pass in NULL for outArray, it will just * return the number of strings that it *would* * chop. * GOTCHA: since multiple separators are skipped * and treated as one, it is impossible to parse * a list with an empty string. * e.g. cat\t\tdog returns only cat and dog but no empty string */ int chopString(char *in, char *sep, char *outArray[], int outSize) { int recordCount = 0; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ in += strspn(in, sep); if (*in == 0) break; if (outArray != NULL) outArray[recordCount] = in; recordCount += 1; in += strcspn(in, sep); if (*in == 0) break; if (outArray != NULL) *in = 0; in += 1; } return recordCount; } int chopByWhite(char *in, char *outArray[], int outSize) /* Like chopString, but specialized for white space separators. * See the GOTCHA in chopString */ { int recordCount = 0; char c; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ while (isspace(*in)) ++in; if (*in == 0) break; /* Store start of word and look for end of word. */ if (outArray != NULL) outArray[recordCount] = in; recordCount += 1; for (;;) { if ((c = *in) == 0) break; if (isspace(c)) break; ++in; } if (*in == 0) break; /* Tag end of word with zero. */ if (outArray != NULL) *in = 0; /* And skip over the zero. */ in += 1; } return recordCount; } int chopByWhiteRespectDoubleQuotes(char *in, char *outArray[], int outSize) /* Like chopString, but specialized for white space separators. * Further, any doubleQuotes (") are respected. * If doubleQuote is encloses whole string, then they are removed: * "Fred and Ethyl" results in word [Fred and Ethyl] * If doubleQuotes exist inside string they are retained: * Fred" and Ethyl" results in word [Fred" and Ethyl"] * Special note "" is a valid, though empty word. */ { int recordCount = 0; char c; char *quoteBegins = NULL; boolean quoting = FALSE; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ while (isspace(*in)) ++in; if (*in == 0) break; /* Store start of word and look for end of word. */ if (outArray != NULL) { outArray[recordCount] = in; if (*in == '"') quoteBegins = (in+1); else quoteBegins = NULL; } recordCount += 1; quoting = FALSE; for (;;) { if ((c = *in) == 0) break; if (quoting) { if (c == '"') { quoting = FALSE; if (quoteBegins != NULL) // implies out array { if ((c = *(in+1) == 0 )|| isspace(c)) // whole word is quoted. { outArray[recordCount-1] = quoteBegins; // Fix beginning of word quoteBegins = NULL; break; } } } } else { quoting = (c == '"'); if (isspace(c)) break; } ++in; } if (*in == 0) break; /* Tag end of word with zero. */ if (outArray != NULL) *in = 0; /* And skip over the zero. */ in += 1; } return recordCount; } int chopByChar(char *in, char chopper, char *outArray[], int outSize) /* Chop based on a single character. */ { int i; char c; if (*in == 0) return 0; for (i=0; (i=0; --i) { c = s[i]; if (isspace(c)) s[i] = 0; else break; } } /* Remove white space from a string */ void eraseWhiteSpace(char *s) { char *in, *out; char c; in = out = s; for (;;) { c = *in++; if (c == 0) break; if (!isspace(c)) *out++ = c; } *out++ = 0; } /* Remove non-alphanumeric chars from string */ void eraseNonAlphaNum(char *s) { char *in, *out; char c; in = out = s; for (;;) { c = *in++; if (c == 0) break; if (isalnum(c)) *out++ = c; } *out = 0; } char *trimSpaces(char *s) /* Remove leading and trailing white space. */ { if (s != NULL) { s = skipLeadingSpaces(s); eraseTrailingSpaces(s); } return s; } void repeatCharOut(FILE *f, char c, int count) /* Write character to file repeatedly. */ { while (--count >= 0) fputc(c, f); } void spaceOut(FILE *f, int count) /* Put out some spaces to file. */ { repeatCharOut(f, ' ', count); } void starOut(FILE *f, int count) /* Put out some asterisks to file. */ { repeatCharOut(f, '*', count); } boolean hasWhiteSpace(char *s) /* Return TRUE if there is white space in string. */ { char c; while ((c = *s++) != 0) if (isspace(c)) return TRUE; return FALSE; } char *firstWordInLine(char *line) /* Returns first word in line if any (white space separated). * Puts 0 in place of white space after word. */ { char *e; line = skipLeadingSpaces(line); if ((e = skipToSpaces(line)) != NULL) *e = 0; return line; } char *cloneFirstWord(char *line) /* Clone first word in line */ { char *startFirstWord = skipLeadingSpaces(line); if (startFirstWord == NULL) return NULL; char *endFirstWord = skipToSpaces(startFirstWord); if (endFirstWord == NULL) return cloneString(startFirstWord); else return cloneStringZ(startFirstWord, endFirstWord - startFirstWord); } char *lastWordInLine(char *line) /* Returns last word in line if any (white space separated). * Returns NULL if string is empty. Removes any terminating white space * from line. */ { char *s = line; char *word = NULL, *wordEnd = NULL; for (;;) { s = skipLeadingSpaces(s); if (s == NULL || s[0] == 0) break; word = s; s = wordEnd = skipToSpaces(s); if (s == NULL) break; } if (wordEnd != NULL) *wordEnd = 0; return word; } char *nextWord(char **pLine) /* Return next word in *pLine and advance *pLine to next * word. */ { char *s = *pLine, *e; if (s == NULL || s[0] == 0) return NULL; s = skipLeadingSpaces(s); if (s[0] == 0) return NULL; e = skipToSpaces(s); if (e != NULL) *e++ = 0; *pLine = e; return s; } char *nextWordRespectingQuotes(char **pLine) // return next word but respects single or double quotes surrounding sets of words. { char *s = *pLine, *e; if (s == NULL || s[0] == 0) return NULL; s = skipLeadingSpaces(s); if (s[0] == 0) return NULL; if (s[0] == '"') { e = skipBeyondDelimit(s+1,'"'); if (e != NULL && !isspace(e[0])) e = skipToSpaces(s); } else if (s[0] == '\'') { e = skipBeyondDelimit(s+1,'\''); if (e != NULL && !isspace(e[0])) e = skipToSpaces(s); } else e = skipToSpaces(s); if (e != NULL) *e++ = 0; *pLine = e; return s; } char *nextTabWord(char **pLine) /* Return next tab-separated word. */ { char *s = *pLine; char *e; if (s == NULL || *s == '\n' || *s == 0) { *pLine = NULL; return NULL; } e = strchr(s, '\t'); if (e == NULL) { e = strchr(s, '\n'); if (e != NULL) *e = 0; *pLine = NULL; } else { *e++ = 0; *pLine = e; } return s; } char *cloneFirstWordByDelimiter(char *line,char delimit) /* Returns a cloned first word, not harming the memory passed in */ { if (line == NULL || *line == 0) return NULL; line = skipLeadingSpaces(line); if (*line == 0) return NULL; int size=0; char *e; for (e=line;*e!=0;e++) { if (*e==delimit) break; else if (delimit == ' ' && isspace(*e)) break; size++; } if (size == 0) return NULL; char *new = needMem(size + 2); // Null terminated by 2 memcpy(new, line, size); return new; } char *cloneNextWordByDelimiter(char **line,char delimit) /* Returns a cloned first word, advancing the line pointer but not harming memory passed in */ { char *new = cloneFirstWordByDelimiter(*line,delimit); if (new != NULL) { *line = skipLeadingSpaces(*line); *line += strlen(new); if ( **line != 0) (*line)++; } return new; } char *nextStringInList(char **pStrings) /* returns pointer to the first string and advances pointer to next in list of strings dilimited by 1 null and terminated by 2 nulls. */ { if (pStrings == NULL || *pStrings == NULL || **pStrings == 0) return NULL; char *p=*pStrings; *pStrings += strlen(p)+1; return p; } int cntStringsInList(char *pStrings) /* returns count of strings in a list of strings dilimited by 1 null and terminated by 2 nulls. */ { int cnt=0; char *p = pStrings; while (nextStringInList(&p) != NULL) cnt++; return cnt; } int stringArrayIx(char *string, char *array[], int arraySize) /* Return index of string in array or -1 if not there. */ { int i; for (i=0; i 255) { warn("String too long in writeString (%d chars):\n%s", len, s); len = 255; } bLen = len; writeOne(f, bLen); mustWrite(f, s, len); } char *readString(FILE *f) /* Read a string (written with writeString) into * memory. freeMem the result when done. */ { UBYTE bLen; int len; char *s; if (!readOne(f, bLen)) return NULL; len = bLen; s = needMem(len+1); if (len > 0) mustRead(f, s, len); return s; } char *mustReadString(FILE *f) /* Read a string. Squawk and die at EOF or if any problem. */ { char *s = readString(f); if (s == NULL) errAbort("Couldn't read string"); return s; } boolean fastReadString(FILE *f, char buf[256]) /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ { UBYTE bLen; int len; if (!readOne(f, bLen)) return FALSE; if ((len = bLen)> 0) mustRead(f, buf, len); buf[len] = 0; return TRUE; } void msbFirstWriteBits64(FILE *f, bits64 x) /* Write out 64 bit number in manner that is portable across architectures */ { int i; UBYTE buf[8]; for (i=7; i>=0; --i) { buf[i] = (UBYTE)(x&0xff); x >>= 8; } mustWrite(f, buf, 8); } bits64 msbFirstReadBits64(FILE *f) /* Write out 64 bit number in manner that is portable across architectures */ { int i; UBYTE buf[8]; bits64 x = 0; mustRead(f, buf, 8); for (i=0; i<8; ++i) { x <<= 8; x |= buf[i]; } return x; } void mustGetLine(FILE *file, char *buf, int charCount) /* Read at most charCount-1 bytes from file, but stop after newline if one is * encountered. The string in buf is '\0'-terminated. (See man 3 fgets.) * Die if there is an error. */ { char *success = fgets(buf, charCount, file); if (success == NULL && charCount > 0) buf[0] = '\0'; if (ferror(file)) errAbort("mustGetLine: fgets failed: %s", strerror(ferror(file))); } int mustOpenFd(char *fileName, int flags) /* Open a file descriptor (see man 2 open) or squawk and die. */ { if (sameString(fileName, "stdin")) return STDIN_FILENO; if (sameString(fileName, "stdout")) return STDOUT_FILENO; // mode is necessary when O_CREAT is given, ignored otherwise int mode = 00664; int fd = open(fileName, flags, mode); if (fd < 0) { char *modeName = ""; if ((flags & (O_WRONLY | O_CREAT | O_TRUNC)) == (O_WRONLY | O_CREAT | O_TRUNC)) modeName = " to create and truncate"; else if ((flags & (O_WRONLY | O_CREAT)) == (O_WRONLY | O_CREAT)) modeName = " to create"; else if ((flags & O_WRONLY) == O_WRONLY) modeName = " to write"; else if ((flags & O_RDWR) == O_RDWR) modeName = " to append"; else modeName = " to read"; errnoAbort("mustOpenFd: Can't open %s%s", fileName, modeName); } return fd; } void mustReadFd(int fd, void *buf, size_t size) /* Read size bytes from a file or squawk and die. */ { ssize_t actualSize; char *cbuf = buf; // using a loop because linux was not returning all data in a single request when request size exceeded 2GB. while (size > 0) { actualSize = read(fd, cbuf, size); if (actualSize < 0) errnoAbort("Error reading %lld bytes", (long long)size); if (actualSize == 0) errAbort("End of file reading %llu bytes (got %lld)", (unsigned long long)size, (long long)actualSize); cbuf += actualSize; size -= actualSize; } } void mustWriteFd(int fd, void *buf, size_t size) /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ { ssize_t result = write(fd, buf, size); if (result < size) { if (result < 0) errnoAbort("mustWriteFd: write failed"); else errAbort("mustWriteFd only wrote %lld of %lld bytes. Likely the disk is full.", (long long)result, (long long)size); } } off_t mustLseek(int fd, off_t offset, int whence) /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort. * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */ { off_t ret = lseek(fd, offset, whence); if (ret < 0) errnoAbort("lseek(%d, %lld, %s (%d)) failed", fd, (long long)offset, ((whence == SEEK_SET) ? "SEEK_SET" : (whence == SEEK_CUR) ? "SEEK_CUR" : (whence == SEEK_END) ? "SEEK_END" : "invalid 'whence' value"), whence); return ret; } void mustCloseFd(int *pFd) /* Close file descriptor *pFd if >= 0, abort if there's an error, set *pFd = -1. */ { if (pFd != NULL && *pFd >= 0) { if (close(*pFd) < 0) errnoAbort("close failed"); *pFd = -1; } } char *addSuffix(char *head, char *suffix) /* Return a needMem'd string containing "headsuffix". Should be free'd when finished. */ { char *ret = NULL; int size = strlen(head) + strlen(suffix) +1; ret = needMem(sizeof(char)*size); snprintf(ret, size, "%s%s", head, suffix); return ret; } void chopSuffix(char *s) /* Remove suffix (last . in string and beyond) if any. */ { char *e = strrchr(s, '.'); if (e != NULL) *e = 0; } void chopSuffixAt(char *s, char c) /* Remove end of string from first occurrence of char c. * chopSuffixAt(s, '.') is equivalent to regular chopSuffix. */ { char *e = strrchr(s, c); if (e != NULL) *e = 0; } char *chopPrefixAt(char *s, char c) /* Like chopPrefix, but can chop on any character, not just '.' */ { char *e = strchr(s, c); if (e == NULL) return s; *e++ = 0; return e; } char *chopPrefix(char *s) /* This will replace the first '.' in a string with * 0, and return the character after this. If there * is no '.' in the string this will just return the * unchanged s passed in. */ { return chopPrefixAt(s, '.'); } boolean carefulCloseWarn(FILE **pFile) /* Close file if open and null out handle to it. * Return FALSE and print a warning message if there * is a problem.*/ { FILE *f; boolean ok = TRUE; if ((pFile != NULL) && ((f = *pFile) != NULL)) { if (f != stdin && f != stdout) { if (fclose(f) != 0) { errnoWarn("fclose failed"); ok = FALSE; } } *pFile = NULL; } return ok; } void carefulClose(FILE **pFile) /* Close file if open and null out handle to it. * Warn and abort if there's a problem. */ { if (!carefulCloseWarn(pFile)) noWarnAbort(); } char *firstWordInFile(char *fileName, char *wordBuf, int wordBufSize) /* Read the first word in file into wordBuf. */ { FILE *f = mustOpen(fileName, "r"); mustGetLine(f, wordBuf, wordBufSize); fclose(f); return trimSpaces(wordBuf); } int fileOffsetSizeCmp(const void *va, const void *vb) /* Help sort fileOffsetSize by offset. */ { const struct fileOffsetSize *a = *((struct fileOffsetSize **)va); const struct fileOffsetSize *b = *((struct fileOffsetSize **)vb); if (a->offset > b->offset) return 1; else if (a->offset == b->offset) return 0; else return -1; } struct fileOffsetSize *fileOffsetSizeMerge(struct fileOffsetSize *inList) /* Returns a new list which is inList transformed to have adjacent blocks * merged. Best to use this with a sorted list. */ { struct fileOffsetSize *newList = NULL, *newEl = NULL, *oldEl, *nextOld; for (oldEl = inList; oldEl != NULL; oldEl = nextOld) { nextOld = oldEl->next; if (nextOld != NULL && nextOld->offset < oldEl->offset) errAbort("Unsorted inList in fileOffsetSizeMerge %llu %llu", oldEl->offset, nextOld->offset); if (newEl == NULL || newEl->offset + newEl->size < oldEl->offset) { newEl = CloneVar(oldEl); slAddHead(&newList, newEl); } else { newEl->size = oldEl->offset + oldEl->size - newEl->offset; } } slReverse(&newList); return newList; } void fileOffsetSizeFindGap(struct fileOffsetSize *list, struct fileOffsetSize **pBeforeGap, struct fileOffsetSize **pAfterGap) /* Starting at list, find all items that don't have a gap between them and the previous item. * Return at gap, or at end of list, returning pointers to the items before and after the gap. */ { struct fileOffsetSize *pt, *next; for (pt = list; ; pt = next) { next = pt->next; if (next == NULL || next->offset != pt->offset + pt->size) { *pBeforeGap = pt; *pAfterGap = next; return; } } } void mustSystem(char *cmd) /* Execute cmd using "sh -c" or die. (See man 3 system.) fail on errors */ { if (cmd == NULL) // don't allow (system() supports testing for shell this way) errAbort("mustSystem: called with NULL command."); int status = system(cmd); if (status == -1) errnoAbort("error starting command: %s", cmd); else if (WIFSIGNALED(status)) errAbort("command terminated by signal %d: %s", WTERMSIG(status), cmd); else if (WIFEXITED(status)) { if (WEXITSTATUS(status) != 0) errAbort("command exited with %d: %s", WEXITSTATUS(status), cmd); } else errAbort("bug: invalid exit status for command: %s", cmd); } int roundingScale(int a, int p, int q) /* returns rounded a*p/q */ { if (a > 100000 || p > 100000) { double x = a; x *= p; x /= q; return round(x); } else return (a*p + q/2)/q; } int intAbs(int a) /* Return integer absolute value */ { return (a >= 0 ? a : -a); } int rangeIntersection(int start1, int end1, int start2, int end2) /* Return amount of bases two ranges intersect over, 0 or negative if no * intersection. */ { int s = max(start1,start2); int e = min(end1,end2); return e-s; } int positiveRangeIntersection(int start1, int end1, int start2, int end2) /* Return number of bases in intersection of two ranges, or * zero if they don't intersect. */ { int ret = rangeIntersection(start1,end1,start2,end2); if (ret < 0) ret = 0; return ret; } bits64 byteSwap64(bits64 a) /* Return byte-swapped version of a */ { union {bits64 whole; UBYTE bytes[8];} u,v; u.whole = a; v.bytes[0] = u.bytes[7]; v.bytes[1] = u.bytes[6]; v.bytes[2] = u.bytes[5]; v.bytes[3] = u.bytes[4]; v.bytes[4] = u.bytes[3]; v.bytes[5] = u.bytes[2]; v.bytes[6] = u.bytes[1]; v.bytes[7] = u.bytes[0]; return v.whole; } bits64 readBits64(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; mustReadOne(f, val); if (isSwapped) val = byteSwap64(val); return val; } bits64 fdReadBits64(int fd, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap64(val); return val; } bits64 memReadBits64(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits64 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap64(val); *pPt += sizeof(val); return val; } bits32 byteSwap32(bits32 a) /* Return byte-swapped version of a */ { union {bits32 whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[3]; v.bytes[1] = u.bytes[2]; v.bytes[2] = u.bytes[1]; v.bytes[3] = u.bytes[0]; return v.whole; } bits32 readBits32(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; mustReadOne(f, val); if (isSwapped) val = byteSwap32(val); return val; } bits32 fdReadBits32(int fd, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap32(val); return val; } bits32 memReadBits32(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits32 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap32(val); *pPt += sizeof(val); return val; } bits16 byteSwap16(bits16 a) /* Return byte-swapped version of a */ { union {bits16 whole; UBYTE bytes[2];} u,v; u.whole = a; v.bytes[0] = u.bytes[1]; v.bytes[1] = u.bytes[0]; return v.whole; } bits16 readBits16(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; mustReadOne(f, val); if (isSwapped) val = byteSwap16(val); return val; } bits16 fdReadBits16(int fd, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap16(val); return val; } bits16 memReadBits16(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits16 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap16(val); *pPt += sizeof(val); return val; } double byteSwapDouble(double a) /* Return byte-swapped version of a */ { union {double whole; UBYTE bytes[8];} u,v; u.whole = a; v.bytes[0] = u.bytes[7]; v.bytes[1] = u.bytes[6]; v.bytes[2] = u.bytes[5]; v.bytes[3] = u.bytes[4]; v.bytes[4] = u.bytes[3]; v.bytes[5] = u.bytes[2]; v.bytes[6] = u.bytes[1]; v.bytes[7] = u.bytes[0]; return v.whole; } double readDouble(FILE *f, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point entity. */ { double val; mustReadOne(f, val); if (isSwapped) val = byteSwapDouble(val); return val; } double memReadDouble(char **pPt, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ { double val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwapDouble(val); *pPt += sizeof(val); return val; } float byteSwapFloat(float a) /* Return byte-swapped version of a */ { union {float whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[3]; v.bytes[1] = u.bytes[2]; v.bytes[2] = u.bytes[1]; v.bytes[3] = u.bytes[0]; return v.whole; } float readFloat(FILE *f, boolean isSwapped) /* Read and optionally byte-swap single-precision floating point entity. */ { float val; mustReadOne(f, val); if (isSwapped) val = byteSwapFloat(val); return val; } float memReadFloat(char **pPt, boolean isSwapped) /* Read and optionally byte-swap single-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ { float val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwapFloat(val); *pPt += sizeof(val); return val; } void removeReturns(char *dest, char *src) /* Removes the '\r' character from a string. * The source and destination strings can be the same, if there are * no other threads */ { int i = 0; int j = 0; /* until the end of the string */ for (;;) { /* skip the returns */ while(src[j] == '\r') j++; /* copy the characters */ dest[i] = src[j]; /* check to see if done */ if(src[j] == '\0') break; /* advance the counters */ i++; j++; } } char* readLine(FILE* fh) /* Read a line of any size into dynamic memory, return null on EOF */ { int bufCapacity = 256; int bufSize = 0; char* buf = needMem(bufCapacity); int ch; /* loop until EOF of EOLN */ while (((ch = getc(fh)) != EOF) && (ch != '\n')) { /* expand if almost full, always keep one extra char for * zero termination */ if (bufSize >= bufCapacity-2) { bufCapacity *= 2; buf = realloc(buf, bufCapacity); if (buf == NULL) { errAbort("Out of memory in readline - request size %d bytes", bufCapacity); } } buf[bufSize++] = ch; } /* only return EOF if no data was read */ if ((ch == EOF) && (bufSize == 0)) { freeMem(buf); return NULL; } buf[bufSize] = '\0'; return buf; } boolean fileExists(char *fileName) /* Return TRUE if file exists (may replace this with non- * portable faster way some day). */ { /* To make piping easier stdin and stdout always exist. */ if (sameString(fileName, "stdin")) return TRUE; if (sameString(fileName, "stdout")) return TRUE; return fileSize(fileName) != -1; } /* Friendly name for strstrNoCase */ char *containsStringNoCase(char *haystack, char *needle) { return strstrNoCase(haystack, needle); } char *strstrNoCase(char *haystack, char *needle) /* A case-insensitive strstr function Will also robustly handle null strings param haystack - The string to be searched param needle - The string to look for in the haystack string return - The position of the first occurence of the desired substring or -1 if it is not found */ { char *haystackCopy = NULL; char *needleCopy = NULL; int index = 0; int haystackLen = 0; int needleLen = 0; char *p, *q; if (NULL == haystack || NULL == needle) { return NULL; } haystackLen = strlen(haystack); needleLen = strlen(needle); haystackCopy = (char*) needMem(haystackLen + 1); needleCopy = (char*) needMem(needleLen + 1); for(index = 0; index < haystackLen; index++) { haystackCopy[index] = tolower(haystack[index]); } haystackCopy[haystackLen] = 0; /* Null terminate */ for(index = 0; index < needleLen; index++) { needleCopy[index] = tolower(needle[index]); } needleCopy[needleLen] = 0; /* Null terminate */ p=strstr(haystackCopy, needleCopy); q=haystackCopy; freeMem(haystackCopy); freeMem(needleCopy); if(p==NULL) return NULL; return p-q+haystack; } int vasafef(char* buffer, int bufSize, char *format, va_list args) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ { int sz = vsnprintf(buffer, bufSize, format, args); /* note that some version return -1 if too small */ if ((sz < 0) || (sz >= bufSize)) { buffer[bufSize-1] = (char) 0; errAbort("buffer overflow, size %d, format: %s, buffer: '%s'", bufSize, format, buffer); } return sz; } int safef(char* buffer, int bufSize, char *format, ...) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ { int sz; va_list args; va_start(args, format); sz = vasafef(buffer, bufSize, format, args); va_end(args); return sz; } void safecpy(char *buf, size_t bufSize, const char *src) /* copy a string to a buffer, with bounds checking.*/ { size_t slen = strlen(src); if (slen > bufSize-1) errAbort("buffer overflow, size %lld, string size: %lld", (long long)bufSize, (long long)slen); strcpy(buf, src); } void safencpy(char *buf, size_t bufSize, const char *src, size_t n) /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ { if (n > bufSize-1) errAbort("buffer overflow, size %lld, substring size: %lld", (long long)bufSize, (long long)n); // strlen(src) can take a long time when src is for example a pointer into a chromosome sequence. // Instead of setting slen to max(strlen(src), n), just stop counting length at n. size_t slen = 0; while (src[slen] != '\0' && slen < n) slen++; strncpy(buf, src, n); buf[slen] = '\0'; } void safecat(char *buf, size_t bufSize, const char *src) /* Append a string to a buffer, with bounds checking.*/ { size_t blen = strlen(buf); size_t slen = strlen(src); if (blen+slen > bufSize-1) errAbort("buffer overflow, size %lld, new string size: %lld", (long long)bufSize, (long long)(blen+slen)); strcat(buf, src); } void safencat(char *buf, size_t bufSize, const char *src, size_t n) /* append n characters from a string to a buffer, with bounds checking. */ { size_t blen = strlen(buf); if (blen+n > bufSize-1) errAbort("buffer overflow, size %lld, new string size: %lld", (long long)bufSize, (long long)(blen+n)); size_t slen = strlen(src); if (slen > n) slen = n; strncat(buf, src, n); buf[blen+slen] = '\0'; } static char *naStr = "n/a"; static char *emptyStr = ""; char *naForNull(char *s) /* Return 'n/a' if s is NULL, otherwise s. */ { if (s == NULL) s = naStr; return s; } char *naForEmpty(char *s) /* Return n/a if s is "" or NULL, otherwise s. */ { if (s == NULL || s[0] == 0) s = naStr; return s; } char *emptyForNull(char *s) /* Return "" if s is NULL, otherwise s. */ { if (s == NULL) s = emptyStr; return s; } char *nullIfAllSpace(char *s) /* Return NULL if s is all spaces, otherwise s. */ { s = skipLeadingSpaces(s); if (s != NULL) if (s[0] == 0) s = NULL; return s; } char *trueFalseString(boolean b) /* Return "true" or "false" */ { return (b ? "true" : "false"); } void uglyTime(char *label, ...) /* Print label and how long it's been since last call. Call with * a NULL label to initialize. */ { static long lastTime = 0; long time = clock1000(); va_list args; va_start(args, label); if (label != NULL) { fprintf(stdout, ""); vfprintf(stdout, label, args); fprintf(stdout, ": %ld millis
    \n", time - lastTime); } lastTime = time; va_end(args); } void makeDirs(char* path) /* make a directory, including parent directories */ { char pathBuf[PATH_LEN]; char* next = pathBuf; strcpy(pathBuf, path); if (*next == '/') next++; while((*next != '\0') && (next = strchr(next, '/')) != NULL) { *next = '\0'; makeDir(pathBuf); *next = '/'; next++; } makeDir(pathBuf); } char *skipNumeric(char *s) /* Return first char of s that's not a digit */ { while (isdigit(*s)) ++s; return s; } char *skipToNumeric(char *s) /* skip up to where numeric digits appear */ { while (*s != 0 && !isdigit(*s)) ++s; return s; } char *splitOffNonNumeric(char *s) /* Split off non-numeric part, e.g. mm of mm8. Result should be freed when done */ { return cloneStringZ(s,skipToNumeric(s)-s); } char *splitOffNumber(char *db) /* Split off number part, e.g. 8 of mm8. Result should be freed when done */ { return cloneString(skipToNumeric(db)); } #ifndef WIN32 time_t mktimeFromUtc (struct tm *t) /* Return time_t for tm in UTC (GMT) * Useful for stuff like converting to time_t the * last-modified HTTP response header * which is always GMT. Returns -1 on failure of mktime */ { time_t time; char *tz; char save_tz[100]; tz=getenv("TZ"); if (tz) safecpy(save_tz, sizeof(save_tz), tz); setenv("TZ", "GMT0", 1); tzset(); t->tm_isdst = 0; time=mktime(t); if (tz) setenv("TZ", save_tz, 1); else unsetenv("TZ"); tzset(); return (time); } time_t dateToSeconds(const char *date,const char*format) // Convert a string date to time_t { struct tm storage={0,0,0,0,0,0,0,0,0}; if (strptime(date,format,&storage)==NULL) return 0; else return mktime(&storage); } boolean dateIsOld(const char *date,const char*format) // Is this string date older than now? { time_t test = dateToSeconds(date,format); time_t now = clock1(); return (test < now); } boolean dateIsOlderBy(const char *date,const char*format, time_t seconds) // Is this string date older than now by this many seconds? { time_t test = dateToSeconds(date,format); time_t now = clock1(); return (test + seconds < now); } static int daysOfMonth(struct tm *tp) /* Returns the days of the month given the year */ { int days=0; switch(tp->tm_mon) { case 3: case 5: case 8: case 10: days = 30; break; case 1: days = 28; if ( (tp->tm_year % 4) == 0 && ((tp->tm_year % 20) != 0 || (tp->tm_year % 100) == 0) ) days = 29; break; default: days = 31; break; } return days; } static void dateAdd(struct tm *tp,int addYears,int addMonths,int addDays) /* Add years,months,days to a date */ { tp->tm_mday += addDays; tp->tm_mon += addMonths; tp->tm_year += addYears; int dom=28; while ( (tp->tm_mon >11 || tp->tm_mon <0) || (tp->tm_mday>dom || tp->tm_mday<1) ) { if (tp->tm_mon>11) // First month: tm.tm_mon is 0-11 range { tp->tm_year += (tp->tm_mon / 12); tp->tm_mon = (tp->tm_mon % 12); } else if (tp->tm_mon<0) { tp->tm_year += (tp->tm_mon / 12) - 1; tp->tm_mon = (tp->tm_mon % 12) + 12; } else { dom = daysOfMonth(tp); if (tp->tm_mday>dom) { tp->tm_mday -= dom; tp->tm_mon += 1; dom = daysOfMonth(tp); } else if (tp->tm_mday < 1) { tp->tm_mon -= 1; dom = daysOfMonth(tp); tp->tm_mday += dom; } } } } char *dateAddTo(char *date,char *format,int addYears,int addMonths,int addDays) /* Add years,months,days to a formatted date and returns the new date as a cloned string * format is a strptime/strftime format: %F = yyyy-mm-dd */ { char *newDate = needMem(12); struct tm tp; if (strptime(date,format, &tp)) { dateAdd(&tp,addYears,addMonths,addDays); // tp.tm_year only contains years since 1900 strftime(newDate,12,format,&tp); } return cloneString(newDate); // newDate is never freed! } #endif boolean haplotype(const char *name) /* Is this name a haplotype name ? _hap or _alt in the name */ { if (stringIn("_hap", name) || stringIn("_alt", name)) return TRUE; else return FALSE; } rtracklayer/src/ucsc/common.h0000644000175100017510000014257412612032142017310 0ustar00biocbuildbiocbuild/* Common.h - functions that are commonly used. Includes * routines for managing singly linked lists, some basic * string manipulation stuff, and other stuff of the * short but useful nature. * * This file is copyright 2002-2005 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef COMMON_H /* Wrapper to avoid including this twice. */ #define COMMON_H /* Some stuff to support large files in Linux. */ #ifndef _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE 1 #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifndef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #endif /* Some stuff for safer pthreads. */ #ifndef _REENTRANT #define _REENTRANT #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(MACHTYPE_ppc) #include #endif #if defined(__APPLE__) #if defined(__i686__) /* The i686 apple math library defines warn. */ #define warn jkWarn #endif #endif #ifdef __CYGWIN32__ #include #endif #ifndef NAN #define NAN (0.0 / 0.0) #endif #ifndef WIFEXITED #define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0) #endif #ifndef WEXITSTATUS #define WEXITSTATUS(stat) (short)(((*((int *) &(stat))) >> 8) & 0xffff) #endif #ifndef WIFSIGNALED #define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) &0x00ff))) #endif #ifndef WTERMSIG #define WTERMSIG(stat) ((*((int *) &(stat))) & 0x7f) #endif #ifndef WIFSTOPPED #define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177) #endif #ifndef WSTOPSIG #define WSTOPSIG(stat) (((*((int *) &(stat))) >> 8) & 0xff) #endif #ifndef HUGE #define HUGE MAXFLOAT #endif /* Let's pretend C has a boolean type. */ #define TRUE 1 #define FALSE 0 #define boolean int #ifndef __cplusplus #ifndef bool #define bool char #endif #endif /* Some other type synonyms */ #define UBYTE unsigned char /* Wants to be unsigned 8 bits. */ #define BYTE signed char /* Wants to be signed 8 bits. */ #define UWORD unsigned short /* Wants to be unsigned 16 bits. */ #define WORD short /* Wants to be signed 16 bits. */ #define bits64 unsigned long long /* Wants to be unsigned 64 bits. */ #define bits32 unsigned /* Wants to be unsigned 32 bits. */ #define bits16 unsigned short /* Wants to be unsigned 16 bits. */ #define bits8 unsigned char /* Wants to be unsigned 8 bits. */ #define signed32 int /* Wants to be signed 32 bits. */ #define bits8 unsigned char /* Wants to be unsigned 8 bits. */ #define BIGNUM 0x3fffffff /* A really big number */ #define BIGDOUBLE 1.7E+308 /* Close to biggest double-precision number */ #define LIMIT_2or8GB (2147483647 * ((sizeof(size_t)/4)*(sizeof(size_t)/4))) /* == 2 Gb for 32 bit machines, 8 Gb for 64 bit machines */ #define LIMIT_2or6GB (2147483647 + (2147483647 * ((sizeof(size_t)/4)-1)) + \ (2147483647 * ((sizeof(size_t)/4)-1))) /* == 2 Gb for 32 bit machines, 6 Gb for 64 bit machines */ /* Default size of directory path, file name and extension string buffers */ #define PATH_LEN 512 #define FILENAME_LEN 128 #define FILEEXT_LEN 64 /* inline functions: To declare a function inline, place the entire function * in a header file and prefix it with the INLINE macro. If used with a * compiler that doesn't support inline, change the INLINE marco to be simply * `static'. */ #ifndef INLINE #define INLINE static inline #endif /* stdargs compatibility: in a unix universe a long time ago, types of va_list * were passed by value. It was assume one could do things like: * * va_start(args); * vfprintf(fh1, fmt, args); * vfprintf(fh2, fmt, args); * va_end(args); * * and life would good. However this is not true on some modern systems (for * instance gcc/glibc on x86_64), where va_args can be a pointer to some type * of object). The second call to vfprintf() would then crash, since the * first call modified the object that va_args was pointing to. C99 adds a * va_copy macro that to address this issue. Many non-C99 system include this * macro, sometimes called __va_copy. Here we ensure that va_copy is defined. * If if doesn't exist, we try to define it in terms of __va_copy. If that is * not available, we make the assumption that va_list can be copied by value * and create our own. Our implementation is the same as used on Solaris. */ #if defined(__va_copy) && !defined(va_copy) # define va_copy __va_copy #endif #if !defined(va_copy) # define va_copy(to, from) ((to) = (from)) #endif /* Cast a pointer to a long long. Use to printf format points as long-longs * in a 32/64bit portable manner. Format should use %llx for the result. * Needed because casting a pointer to a different sized number cause a * warning with gcc */ #define ptrToLL(p) ((long long)((size_t)p)) /* How big is this array? */ #define ArraySize(a) (sizeof(a)/sizeof((a)[0])) #define uglyf printf /* debugging printf */ #define uglyAbort errAbort /* debugging error abort. */ #define uglyOut stdout /* debugging fprintf target. */ void *needMem(size_t size); /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ void *needLargeMem(size_t size); /* This calls abort if the memory allocation fails. The memory is * not initialized to zero. */ void *needLargeZeroedMem(size_t size); /* Request a large block of memory and zero it. */ void *needLargeMemResize(void* vp, size_t size); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. Memory not initted. */ void *needLargeZeroedMemResize(void* vp, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. If block is grown, new memory is zeroed. */ void *needHugeMem(size_t size); /* No checking on size. Memory not initted to 0. */ void *needHugeZeroedMem(size_t size); /* Request a large block of memory and zero it. */ void *needHugeMemResize(void* vp, size_t size); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. No checking on size. Memory not * initted. */ void *needHugeZeroedMemResize(void* vp, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ void *needMoreMem(void *old, size_t copySize, size_t newSize); /* Allocate a new buffer, copy old buffer to it, free old buffer. */ void *cloneMem(void *pt, size_t size); /* Allocate a new buffer of given size, and copy pt to it. */ #define CloneVar(pt) cloneMem(pt, sizeof((pt)[0])) /* Allocate copy of a structure. */ void *wantMem(size_t size); /* Want mem just calls malloc - no zeroing of memory, no * aborting if request fails. */ void freeMem(void *pt); /* Free memory will check for null before freeing. */ void freez(void *ppt); /* Pass address of pointer. Will free pointer and set it * to NULL. Typical use: * s = needMem(1024); * ... * freez(&s); */ #define AllocVar(pt) (pt = needMem(sizeof(*pt))) /* Shortcut to allocating a single variable on the heap and * assigning pointer to it. */ #define AllocArray(pt, size) (pt = needLargeZeroedMem(sizeof(*pt) * (size))) #define AllocA(type) needMem(sizeof(type)) /* Shortcut to allocating a variable on heap of a specific type. */ #define AllocN(type,count) ((type*)needLargeZeroedMem(sizeof(type) * (count))) /* Shortcut to allocating an array on the heap of a specific type. */ #define ExpandArray(array, oldCount, newCount) \ (array = needMoreMem((array), (oldCount)*sizeof((array)[0]), (newCount)*sizeof((array)[0]))) /* Expand size of dynamically allocated array. */ #define CopyArray(source, dest,count) memcpy(dest,source,(count)*sizeof(dest[0])) /* Copy count elements of array from source to dest. */ #define CloneArray(a, count) cloneMem(a, (count)*sizeof(a[0])) /* Make new dynamic array initialized with count elements of a */ void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; #define internalErr() errAbort("Internal error %s %d", __FILE__, __LINE__) /* Generic internal error message */ void warn(char *format, ...) /* Issue a warning message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void warnWithBackTrace(char *format, ...) /* Issue a warning message and append backtrace. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stdout) if global verbose variable * is set to verbosity or higher. Default level is 1. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseTimeInit(void); /* Initialize or reinitialize the previous time for use by verboseTime. */ void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseDot(); /* Write I'm alive dot (at verbosity level 1) */ int verboseLevel(); /* Get verbosity level. */ void verboseSetLevel(int verbosity); /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ INLINE void zeroBytes(void *vpt, int count) /* fill a specified area of memory with zeroes */ { memset(vpt, '\0', count); } #define ZeroVar(v) zeroBytes(v, sizeof(*v)) void reverseBytes(char *bytes, long length); /* Reverse the order of the bytes. */ void reverseInts(int *a, int length); /* Reverse the order of the integer array. */ void reverseUnsigned(unsigned *a, int length); /* Reverse the order of the unsigned array. */ void reverseDoubles(double *a, int length); /* Reverse the order of the double array. */ void reverseStrings(char **a, int length); /* Reverse the order of the char* array. */ void swapBytes(char *a, char *b, int length); /* Swap buffers a and b. */ /******* Some things to manage simple lists - structures that begin ****** ******* with a pointer to the next element in the list. ******/ struct slList { struct slList *next; }; int slCount(const void *list); /* Return # of elements in list. */ void *slElementFromIx(void *list, int ix); /* Return the ix'th element in list. Returns NULL * if no such element. */ int slIxFromElement(void *list, void *el); /* Return index of el in list. Returns -1 if not on list. */ INLINE void slAddHead(void *listPt, void *node) /* Add new node to start of list. * Usage: * slAddHead(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. */ { struct slList **ppt = (struct slList **)listPt; struct slList *n = (struct slList *)node; n->next = *ppt; *ppt = n; } INLINE void slSafeAddHead(void *listPt, void *node) /* Add new node to start of list. Now that slAddHead is an inline instead of * a macro, this function is obsolete. */ { slAddHead(listPt, node); } void slAddTail(void *listPt, void *node); /* Add new node to tail of list. * Usage: * slAddTail(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. This is sometimes * convenient but relatively slow. For longer lists * it's better to slAddHead, and slReverse when done. */ void *slPopHead(void *listPt); /* Return head of list and remove it from list. (Fast) */ void *slPopTail(void *listPt); /* Return tail of list and remove it from list. (Not so fast) */ void *slCat(void *a, void *b); /* Return concatenation of lists a and b. * Example Usage: * struct slName *a = getNames("a"); * struct slName *b = getNames("b"); * struct slName *ab = slCat(a,b) * After this it is no longer safe to use a or b. */ void *slLastEl(void *list); /* Returns last element in list or NULL if none. */ void slReverse(void *listPt); /* Reverse order of a list. * Usage: * slReverse(&list); */ typedef int CmpFunction(const void *elem1, const void *elem2); void slSort(void *pList, CmpFunction *compare); /* Sort a singly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers. */ void slUniqify(void *pList, CmpFunction *compare, void (*free)()); /* Return sorted list with duplicates removed. * Compare should be same type of function as slSort's compare (taking * pointers to pointers to elements. Free should take a simple * pointer to dispose of duplicate element, and can be NULL. */ void slSortMerge(void *pA, void *b, CmpFunction *compare); // Merges and sorts a pair of singly linked lists using slSort. void slSortMergeUniq(void *pA, void *b, CmpFunction *compare, void (*free)()); // Merges and sorts a pair of singly linked lists leaving only unique // items via slUniqufy. duplicate itens are defined by the compare routine // returning 0. If free is provided, items dropped from list can disposed of. boolean slRemoveEl(void *vpList, void *vToRemove); /* Remove element from singly linked list. Usage: * slRemove(&list, el); * Returns TRUE if element in list. */ void slFreeList(void *listPt); /* Free all elements in list and set list pointer to null. * Usage: * slFreeList(&list); */ /******* slInt - an int on a list - the first of many singly linked list structures *******/ struct slInt /* List of integers. */ { struct slInt *next; /* Next in list. */ int val; /* Integer value. */ }; struct slInt *slIntNew(int x); #define newSlInt slIntNew /* Return a new double. */ int slIntCmp(const void *va, const void *vb); /* Compare two slInts. */ int slIntCmpRev(const void *va, const void *vb); /* Compare two slInts in reverse direction. */ struct slInt * slIntFind(struct slInt *list, int target); /* Find target in slInt list or return NULL */ struct slUnsigned /* List of unsigned */ { struct slUnsigned *next; /* Next in list */ unsigned val; /* Unsigned value */ }; struct slUnsigned *slUnsignedNew(unsigned x); /* Return a new slUnsigned. */ /******* slDouble - a double on a list *******/ struct slDouble /* List of double-precision numbers. */ { struct slDouble *next; /* Next in list. */ double val; /* Double-precision value. */ }; struct slDouble *slDoubleNew(double x); #define newSlDouble slDoubleNew /* Return a new int. */ int slDoubleCmp(const void *va, const void *vb); /* Compare two slDoubles. */ double slDoubleMedian(struct slDouble *list); /* Return median value on list. */ /******* slName - a zero terminated string on a list *******/ struct slName /* List of names. The name array is allocated to accommodate full name */ { struct slName *next; /* Next in list. */ char name[1]; /* Allocated at run time to length of string. */ }; struct slName *newSlName(char *name); #define slNameNew newSlName /* Return a new slName. */ #define slNameFree freez /* Free a single slName */ #define slNameFreeList slFreeList /* Free a list of slNames */ struct slName *slNameNewN(char *name, int size); /* Return new slName of given size. */ int slNameCmpCase(const void *va, const void *vb); /* Compare two slNames, ignore case. */ int slNameCmp(const void *va, const void *vb); /* Compare two slNames. */ int slNameCmpStringsWithEmbeddedNumbers(const void *va, const void *vb); /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ void slNameSortCase(struct slName **pList); /* Sort slName list, ignore case. */ void slNameSort(struct slName **pList); /* Sort slName list. */ boolean slNameInList(struct slName *list, char *string); /* Return true if string is in name list -- case insensitive. */ boolean slNameInListUseCase(struct slName *list, char *string); /* Return true if string is in name list -- case sensitive. */ void *slNameFind(void *list, char *string); /* Return first element of slName list (or any other list starting * with next/name fields) that matches string. */ int slNameFindIx(struct slName *list, char *string); /* Return index of first element of slName list (or any other * list starting with next/name fields) that matches string. * ... Return -1 if not found. */ char *slNameStore(struct slName **pList, char *string); /* Put string into list if it's not there already. * Return the version of string stored in list. */ struct slName *slNameAddHead(struct slName **pList, char *name); /* Add name to start of list and return it. */ struct slName *slNameAddTail(struct slName **pList, char *name); /* Add name to end of list (not efficient for long lists), * and return it. */ struct slName *slNameCloneList(struct slName *list); /* Return clone of list. */ struct slName *slNameListFromString(char *s, char delimiter); /* Return list of slNames gotten from parsing delimited string. * The final delimiter is optional. a,b,c and a,b,c, are equivalent * for comma-delimited lists. */ #define slNameListFromComma(s) slNameListFromString(s, ',') /* Parse out comma-separated list. */ struct slName *slNameListOfUniqueWords(char *text,boolean respectQuotes); // Return list of unique words found by parsing string delimited by whitespace. // If respectQuotes then ["Lucy and Ricky" 'Fred and Ethyl'] will yield 2 slNames no quotes struct slName *slNameListFromStringArray(char *stringArray[], int arraySize); /* Return list of slNames from an array of strings of length arraySize. * If a string in the array is NULL, the array will be treated as * NULL-terminated. */ char *slNameListToString(struct slName *list, char delimiter); /* Return string created by joining all names with the delimiter. */ struct slName *slNameLoadReal(char *fileName); /* load file lines that are not blank or start with a '#' into a slName * list */ struct slName *slNameIntersection(struct slName *a, struct slName *b); /* return intersection of two slName lists. */ /******* slRef - a void pointer on a list *******/ struct slRef /* Singly linked list of generic references. */ { struct slRef *next; /* Next in list. */ void *val; /* A reference to something. */ }; struct slRef *slRefNew(void *val); /* Create new slRef element. */ struct slRef *refOnList(struct slRef *refList, void *val); /* Return ref if val is already on list, otherwise NULL. */ void refAdd(struct slRef **pRefList, void *val); /* Add reference to list. */ void refAddUnique(struct slRef **pRefList, void *val); /* Add reference to list if not already on list. */ void slRefFreeListAndVals(struct slRef **pList); /* Free up (with simple freeMem()) each val on list, and the list itself as well. */ struct slRef *refListFromSlList(void *list); /* Make a reference list that mirrors a singly-linked list. */ /******* slPair - a name/value pair on list where value not always a string *******/ struct slPair /* A name/value pair. */ { struct slPair *next; /* Next in list. */ char *name; /* Name of item. */ void *val; /* Pointer to item data. */ }; struct slPair *slPairNew(char *name, void *val); /* Allocate new name/value pair. */ void slPairAdd(struct slPair **pList, char *name, void *val); /* Add new slPair to head of list. */ void slPairFree(struct slPair **pEl); /* Free up struct and name. (Don't free up values.) */ void slPairFreeList(struct slPair **pList); /* Free up list. (Don't free up values.) */ void slPairFreeVals(struct slPair *list); /* Free up all values on list. */ void slPairFreeValsAndList(struct slPair **pList); /* Free up all values on list and list itself */ struct slPair *slPairFind(struct slPair *list, char *name); /* Return list element of given name, or NULL if not found. */ void *slPairFindVal(struct slPair *list, char *name); /* Return value associated with name in list, or NULL if not found. */ struct slPair *slPairListFromString(char *str,boolean respectQuotes); // Return slPair list parsed from list in string like: [name1=val1 name2=val2 ...] // if respectQuotes then string can have double quotes: [name1="val 1" "name 2"=val2 ...] // resulting pair strips quotes: {name1}={val 1},{name 2}={val2} // Returns NULL if parse error. Free this up with slPairFreeValsAndList. #define slPairFromString(s) slPairListFromString(s,FALSE) char *slPairListToString(struct slPair *list,boolean quoteIfSpaces); // Returns an allocated string of pairs in form of [name1=val1 name2=val2 ...] // If requested, will wrap name or val in quotes if contain spaces: [name1="val 1" "name 2"=val2] char *slPairNameToString(struct slPair *list, char delimiter,boolean quoteIfSpaces); // Return string created by joining all names (ignoring vals) with the delimiter. // If requested, will wrap name in quotes if contain spaces: [name1,"name 2" ...] int slPairCmpCase(const void *va, const void *vb); /* Compare two slPairs, ignore case. */ void slPairSortCase(struct slPair **pList); /* Sort slPair list, ignore case. */ int slPairCmp(const void *va, const void *vb); /* Compare two slPairs. */ int slPairValCmpCase(const void *va, const void *vb); /* Case insensitive compare two slPairs on their values (must be string). */ int slPairValCmp(const void *va, const void *vb); /* Compare two slPairs on their values (must be string). */ void slPairValSortCase(struct slPair **pList); /* Sort slPair list on values (must be string), ignore case. */ void slPairValSort(struct slPair **pList); /* Sort slPair list on values (must be string). */ int slPairIntCmp(const void *va, const void *vb); // Compare two slPairs on their integer values. void slPairIntSort(struct slPair **pList); // Sort slPair list on integer values. int slPairAtoiCmp(const void *va, const void *vb); // Compare two slPairs on their strings interpreted as integer values. void slPairValAtoiSort(struct slPair **pList); // Sort slPair list on string values interpreted as integers. /******* Some old stuff maybe we could trim. *******/ void gentleFree(void *pt); /* check pointer for NULL before freeing. * (Actually plain old freeMem does that these days.) */ /******* Some math stuff *******/ void doubleSort(int count, double *array); /* Sort an array of doubles. */ double doubleMedian(int count, double *array); /* Return median value in array. This will sort * the array as a side effect. */ void doubleBoxWhiskerCalc(int count, double *array, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax); /* Calculate what you need to draw a box and whiskers plot from an array of doubles. */ void slDoubleBoxWhiskerCalc(struct slDouble *list, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax); /* Calculate what you need to draw a box and whiskers plot from a list of slDoubles. */ int intMedian(int count, int *array); /* Return median value in array. This will sort * the array as a side effect. */ void intSort(int count, int *array); /* Sort an array of ints. */ /******* Some stuff for processing strings. *******/ char *cloneStringZ(const char *s, int size); /* Make a zero terminated copy of string in memory */ char *cloneString(const char *s); /* Make copy of string in dynamic memory */ char *cloneLongString(char *s); /* Make clone of long string. */ char *catTwoStrings(char *a, char *b); /* Allocate new string that is a concatenation of two strings. */ int differentWord(char *s1, char *s2); /* strcmp ignoring case - returns zero if strings are * the same (ignoring case) otherwise returns difference * between first non-matching characters. */ #define sameWord(a,b) (!differentWord(a,b)) /* Return TRUE if two strings are same ignoring case */ #define differentString(a,b) (strcmp(a,b)) /* Returns FALSE if two strings same. */ int differentStringNullOk(char *a, char *b); /* Returns 0 if two strings (either of which may be NULL) * are the same. Otherwise it returns a positive or negative * number depending on the alphabetical order of the two * strings. * This is basically a strcmp that can handle NULLs in * the input. If used in a sort the NULLs will end * up before any of the cases with data. */ #define sameOk(a,b) (differentStringNullOk(a,b) == 0) /* returns TRUE if two strings same, NULLs OK */ #define sameString(a,b) (strcmp(a,b)==0) /* Returns TRUE if two strings same. */ #define sameStringN(a,b,c) (strncmp(a,b,c)==0) /* Returns TRUE if two strings start with the same c characters. */ #define isEmpty(string) ((string) == NULL || (string)[0] == 0) #define isNotEmpty(string) (! isEmpty(string)) int cmpStringsWithEmbeddedNumbers(const char *a, const char *b); /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ int cmpWordsWithEmbeddedNumbers(const char *a, const char *b); /* Case insensitive version of cmpStringsWithEmbeddedNumbers. */ boolean startsWith(const char *start, const char *string); /* Returns TRUE if string begins with start. */ boolean startsWithWord(char *firstWord, char *line); /* Return TRUE if first white-space-delimited word in line * is same as firstWord. Comparison is case sensitive. */ boolean startsWithWordByDelimiter(char *firstWord,char delimit, char *line); /* Return TRUE if first word in line is same as firstWord as delimited by delimit. Comparison is case sensitive. Delimit of ' ' uses isspace() */ #define stringIn(needle, haystack) strstr(haystack, needle) /* Returns position of needle in haystack or NULL if it's not there. */ /* char *stringIn(char *needle, char *haystack); */ char *rStringIn(char *needle, char *haystack); /* Return last position of needle in haystack, or NULL if it's not there. */ char *stringBetween(char *start, char *end, char *haystack); /* Return string between start and end strings, or NULL if * none found. The first such instance is returned. * String must be freed by caller. */ char * findWordByDelimiter(char *word,char delimit, char *line); /* Return pointer to first word in line matching 'word' and delimited by 'delimit'. Comparison is case sensitive. Delimit of ' ' uses isspace() */ boolean endsWith(char *string, char *end); /* Returns TRUE if string ends with end. */ char lastChar(char *s); /* Return last character in string. */ void trimLastChar(char *s); /* Erase last character in string. */ char *lastNonwhitespaceChar(char *s); // Return pointer to last character in string that is not whitespace. char *matchingCharBeforeInLimits(char *limit, char *s, char c); /* Look for character c sometime before s, but going no further than limit. * Return NULL if not found. */ boolean wildMatch(const char *wildCard, const char *string); /* does a case insensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ boolean sqlMatchLike(char *wildCard, char *string); /* Match using % and _ wildcards. */ boolean anyWild(const char *string); /* Return TRUE if any wild card characters in string. */ char *memMatch(char *needle, int nLen, char *haystack, int hLen); /* Returns first place where needle (of nLen chars) matches * haystack (of hLen chars) */ void toUpperN(char *s, int n); /* Convert a section of memory to upper case. */ void toLowerN(char *s, int n); /* Convert a section of memory to lower case. */ void toggleCase(char *s, int size); /* toggle upper and lower case chars in string. */ char *strUpper(char *s); #define touppers(s) (void)strUpper(s) /* Convert entire string to upper case. */ char *strLower(char *s); #define tolowers(s) (void)strLower(s) /* Convert entire string to lower case */ char *replaceChars(char *string, char *oldStr, char *newStr); /* Replaces the old with the new. The old and new string need not be of equal size Can take any length string. Return value needs to be freeMem'd. */ int strSwapStrs(char *string, int sz,char *oldStr, char *newStr); /* Swaps all occurrences of the oldStr with the newStr in string. Need not be same size Swaps in place but restricted by sz. Returns count of swaps or -1 for sz failure.*/ char * memSwapChar(char *s, int len, char oldChar, char newChar); /* Substitute newChar for oldChar throughout memory of given length. old or new may be null */ #define strSwapChar(s,old,new) memSwapChar((s),strlen(s),(old),(new)) #define subChar(s,old,new) (void)memSwapChar((s),strlen(s),(old),(new)) /* Substitute newChar for oldChar throughout string s. */ void stripChar(char *s, char c); /* Remove all occurences of c from s. */ char *stripEnclosingChar(char *inout,char encloser); // Removes enclosing char if found at both beg and end, preserving pointer // Note: handles brackets '(','{' and '[' by complement at end #define stripEnclosingDoubleQuotes(inout) stripEnclosingChar((inout),'"') #define stripEnclosingSingleQuotes(inout) stripEnclosingChar((inout),'\'') void stripString(char *s, char *strip); /* Remove all occurences of strip from s. */ int countCase(char *s,boolean upper); // Count letters with case (upper or lower) int countChars(char *s, char c); /* Return number of characters c in string s. */ int countCharsN(char *s, char c, int size); /* Return number of characters c in string s of given size. */ int countLeadingChars(char *s, char c); /* Count number of characters c at start of string. */ int countLeadingDigits(const char *s); /* Return number of leading digits in s */ int countLeadingNondigits(const char *s); /* Count number of leading non-digit characters in s. */ int countSame(char *a, char *b); /* Count number of characters that from start in a,b that are same. */ int countSeparatedItems(char *string, char separator); /* Count number of items in string you would parse out with given * separator, assuming final separator is optional. */ int chopString(char *in, char *sep, char *outArray[], int outSize); /* int chopString(in, sep, outArray, outSize); */ /* This chops up the input string (cannabilizing it) * into an array of zero terminated strings in * outArray. It returns the number of strings. * If you pass in NULL for outArray, it will just * return the number of strings that it *would* * chop. */ extern char crLfChopper[]; extern char whiteSpaceChopper[]; /* Some handy predefined separators. */ int chopByWhite(char *in, char *outArray[], int outSize); /* Like chopString, but specialized for white space separators. */ #define chopLine(line, words) chopByWhite(line, words, ArraySize(words)) /* Chop line by white space. */ int chopByWhiteRespectDoubleQuotes(char *in, char *outArray[], int outSize); /* Like chopString, but specialized for white space separators. * Further, any doubleQuotes (") are respected. * If doubleQuote encloses whole string, then they are removed: * "Fred and Ethyl" results in word [Fred and Ethyl] * If doubleQuotes exist inside string they are retained: * Fred "and Ethyl" results in word [Fred "and Ethyl"] * Special note "" is a valid, though empty word. */ int chopByChar(char *in, char chopper, char *outArray[], int outSize); /* Chop based on a single character. */ #define chopTabs(string, words) chopByChar(string, '\t', words, ArraySize(words)) /* Chop string by tabs. */ #define chopCommas(string, words) chopByChar(string, ',', words, ArraySize(words)) /* Chop string by commas. */ char *skipBeyondDelimit(char *s,char delimit); /* Returns NULL or pointer to first char beyond one (or more contiguous) delimit char. If delimit is ' ' then skips beyond first patch of whitespace. */ char *skipLeadingSpaces(char *s); /* Return first white space or NULL if none.. */ char *skipToSpaces(char *s); /* Return first white space. */ void eraseTrailingSpaces(char *s); /* Replace trailing white space with zeroes. */ void eraseWhiteSpace(char *s); /* Remove white space from a string */ void eraseNonAlphaNum(char *s); /* Remove non-alphanumeric chars from string */ char *trimSpaces(char *s); /* Remove leading and trailing white space. */ void repeatCharOut(FILE *f, char c, int count); /* Write character to file repeatedly. */ void spaceOut(FILE *f, int count); /* Put out some spaces to file. */ void starOut(FILE *f, int count); /* Put out some asterisks to file. */ boolean hasWhiteSpace(char *s); /* Return TRUE if there is white space in string. */ char *firstWordInLine(char *line); /* Returns first word in line if any (white space separated). * Puts 0 in place of white space after word. */ char *lastWordInLine(char *line); /* Returns last word in line if any (white space separated). * Returns NULL if string is empty. Removes any terminating white space * from line. */ char *nextWord(char **pLine); /* Return next word in *pLine and advance *pLine to next * word. Returns NULL when no more words. */ char *nextWordRespectingQuotes(char **pLine); // return next word but respects single or double quotes surrounding sets of words. char *cloneFirstWord(char *line); /* Clone first word in line */ char *nextTabWord(char **pLine); /* Return next tab-separated word. */ char *cloneFirstWordByDelimiter(char *line,char delimit); /* Returns a cloned first word, not harming the memory passed in Delimiter of ' ' will delimit by isspace() */ #define cloneFirstWordInLine(line) cloneFirstWordByDelimiter((line),' ') #define cloneFirstWordByTab(line) cloneFirstWordByDelimiter((line),'\t') /* Returns a cloned first word, not harming the memory passed in */ char *cloneNextWordByDelimiter(char **line,char delimit); /* Returns a cloned first word, advancing the line pointer but not harming memory passed in. Delimit ' ' uses isspace() */ #define cloneNextWord(line) cloneNextWordByDelimiter((line),' ') #define cloneNextWordByTab(line) cloneNextWordByDelimiter((line),'\t') char *nextStringInList(char **pStrings); /* returns pointer to the first string and advances pointer to next in list of strings dilimited by 1 null and terminated by 2 nulls. */ int cntStringsInList(char *pStrings); /* returns count of strings in a list of strings dilimited by 1 null and terminated by 2 nulls. */ int stringArrayIx(char *string, char *array[], int arraySize); /* Return index of string in array or -1 if not there. */ int ptArrayIx(void *pt, void *array, int arraySize); /* Return index of pt in array or -1 if not there. */ #define stringIx(string, array) stringArrayIx( (string), (array), ArraySize(array)) /* Some stuff that is left out of GNU .h files!? */ #ifndef SEEK_SET #define SEEK_SET 0 #endif #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef FILEPATH_H void splitPath(char *path, char dir[PATH_LEN], char name[FILENAME_LEN], char extension[FILEEXT_LEN]); /* Split a full path into components. The dir component will include the * trailing / if any. The extension component will include the starting * . if any. Pass in NULL for dir, name, or extension if you don't care about * that part. */ #endif /* FILEPATH_H */ char *addSuffix(char *head, char *suffix); /* Return a needMem'd string containing "headsuffix". Should be free'd when finished. */ void chopSuffix(char *s); /* Remove suffix (last . in string and beyond) if any. */ void chopSuffixAt(char *s, char c); /* Remove end of string from last occurrence of char c. * chopSuffixAt(s, '.') is equivalent to regular chopSuffix. */ char *chopPrefix(char *s); /* This will replace the first '.' in a string with * 0, and return the character after this. If there * is no '.' in the string this will just return the * unchanged s passed in. */ char *chopPrefixAt(char *s, char c); /* Like chopPrefix, but can chop on any character, not just '.' */ FILE *mustOpen(char *fileName, char *mode); /* Open a file - or squawk and die. */ void mustWrite(FILE *file, void *buf, size_t size); /* Write to file or squawk and die. */ #define writeOne(file, var) mustWrite((file), &(var), sizeof(var)) /* Write out one variable to file. */ void mustRead(FILE *file, void *buf, size_t size); /* Read size bytes from a file or squawk and die. */ #define mustReadOne(file, var) mustRead((file), &(var), sizeof(var)) /* Read one variable from file or die. */ void mustGetLine(FILE *file, char *buf, int charCount); /* Read at most charCount-1 bytes from file, but stop after newline if one is * encountered. The string in buf is '\0'-terminated. (See man 3 fgets.) * Die if there is an error. */ int mustOpenFd(char *fileName, int flags); /* Open a file descriptor (see man 2 open) or squawk and die. */ void mustReadFd(int fd, void *buf, size_t size); /* Read size bytes from a file descriptor or squawk and die. */ void mustWriteFd(int fd, void *buf, size_t size); /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ off_t mustLseek(int fd, off_t offset, int whence); /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort. * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */ void mustCloseFd(int *pFd); /* Close file descriptor *pFd if >= 0, abort if there's an error, set *pFd = -1. */ #define writeOneFd(fd, var) mustWriteFd((fd), &(var), sizeof(var)) /* Write out one variable to file descriptor fd. */ #define readOne(file, var) (fread(&(var), sizeof(var), 1, (file)) == 1) /* Read one variable from file. Returns FALSE if can't do it. */ #define readOneFd(fd, var) (read((fd), &(var), sizeof(var)) == sizeof(var)) /* Read one variable from file. Returns FALSE if can't do it. */ #define mustReadOneFd(fd, var) mustReadFd((fd), &(var), sizeof(var)) /* Read one variable from file or die. */ #define memReadOne(pPt, var) memRead((pPt), &(var), sizeof(var)) /* Read one variable from memory. */ void writeString(FILE *f, char *s); /* Write a 255 or less character string to a file. * This will write the length of the string in the first * byte then the string itself. */ char *readString(FILE *f); /* Read a string (written with writeString) into * memory. freeMem the result when done. Returns * NULL at EOF. */ char *mustReadString(FILE *f); /* Read a string. Squawk and die at EOF or if any problem. */ boolean fastReadString(FILE *f, char buf[256]); /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. * Returns FALSE at EOF. */ void msbFirstWriteBits64(FILE *f, bits64 x); /* Write out 64 bit number in manner that is portable across architectures */ bits64 msbFirstReadBits64(FILE *f); /* Write out 64 bit number in manner that is portable across architectures */ void carefulClose(FILE **pFile); /* Close file if open and null out handle to it. */ boolean carefulCloseWarn(FILE **pFile); /* Close file if open and null out handle to it. * Return FALSE and print a warning message if there * is a problem.*/ char *firstWordInFile(char *fileName, char *wordBuf, int wordBufSize); /* Read the first word in file into wordBuf. */ struct fileOffsetSize /* A piece of a file. */ { struct fileOffsetSize *next; /* Next in list. */ bits64 offset; /* Start offset of block. */ bits64 size; /* Size of block. */ }; int fileOffsetSizeCmp(const void *va, const void *vb); /* Help sort fileOffsetSize by offset. */ struct fileOffsetSize *fileOffsetSizeMerge(struct fileOffsetSize *inList); /* Returns a new list which is inList transformed to have adjacent blocks * merged. Best to use this with a sorted list. */ void fileOffsetSizeFindGap(struct fileOffsetSize *list, struct fileOffsetSize **pBeforeGap, struct fileOffsetSize **pAfterGap); /* Starting at list, find all items that don't have a gap between them and the previous item. * Return at gap, or at end of list, returning pointers to the items before and after the gap. */ void mustSystem(char *cmd); /* Execute cmd using "sh -c" or die. (See man 3 system.) fail on errors */ int roundingScale(int a, int p, int q); /* returns rounded a*p/q */ int intAbs(int a); /* Return integer absolute value */ #define logBase2(x)(log(x)/log(2)) /* return log base two of number */ #define round(a) ((int)((a)+0.5)) /* Round floating point val to nearest integer. */ #define roundll(a) ((long long)((a)+0.5)) /* Round floating point val to nearest long long. */ #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) /* Return min of a and b. */ #endif #ifndef max #define max(a,b) ( (a) > (b) ? (a) : (b) ) /* Return max of a and b. */ #endif int rangeIntersection(int start1, int end1, int start2, int end2); /* Return amount of bases two ranges intersect over, 0 or negative if no * intersection. */ int positiveRangeIntersection(int start1, int end1, int start2, int end2); /* Return amount of bases two ranges intersect over, 0 if no * intersection. */ INLINE void memRead(char **pPt, void *buf, int size) /* Copy memory from *pPt to buf, and advance *pPt by size. */ { memcpy(buf, *pPt, size); *pPt += size; } INLINE void memWrite(char **pPt, void *buf, int size) /* Copy memory from buf to *pPt and advance *pPt by size. */ { memcpy(*pPt, buf, size); *pPt += size; } #define memWriteOne(pPt, var) memWrite((pPt), &(var), sizeof(var)) /* Write out one variable to memory stream. */ INLINE void memWriteFloat(char **pPt, float val) /* Write out floating point val to file. Mostly to convert from double... */ { memWriteOne(pPt, val); } bits64 byteSwap64(bits64 a); /* Swap from intel to sparc order of a 64 bit quantity. */ bits64 readBits64(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits64 fdReadBits64(int fd, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits64 memReadBits64(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ bits32 byteSwap32(bits32 a); /* Swap from intel to sparc order of a 32 bit quantity. */ bits32 readBits32(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits32 fdReadBits32(int fd, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits32 memReadBits32(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ bits16 byteSwap16(bits16 a); /* Swap from intel to sparc order of a 16 bit quantity. */ bits16 readBits16(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ bits16 fdReadBits16(int fd, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ bits16 memReadBits16(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ double byteSwapDouble(double a); /* Return byte-swapped version of a */ double readDouble(FILE *f, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point entity. */ double memReadDouble(char **pPt, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ float byteSwapFloat(float a); /* Return byte-swapped version of a */ float readFloat(FILE *f, boolean isSwapped); /* Read and optionally byte-swap single-precision floating point entity. */ float memReadFloat(char **pPt, boolean isSwapped); /* Read and optionally byte-swap single-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ void removeReturns(char* dest, char* src); /* Removes the '\r' character from a string. * the source and destination strings can be the same, * if there are no threads */ int intExp(char *text); /* Convert text to integer expression and evaluate. * Throws if it finds a non-number. */ double doubleExp(char *text); /* Convert text to floating point expression and * evaluate. */ char* readLine(FILE* fh); /* Read a line of any size into dynamic memory, return null on EOF */ off_t fileSize(char *fileName); /* The size of a file. */ boolean fileExists(char *fileName); /* Does a file exist? */ /* Friendly name for strstrNoCase */ char *containsStringNoCase(char *haystack, char *needle); char *strstrNoCase(char *haystack, char *needle); /* A case-insensitive strstr */ int vasafef(char* buffer, int bufSize, char *format, va_list args); /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ int safef(char* buffer, int bufSize, char *format, ...) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ #ifdef __GNUC__ __attribute__((format(printf, 3, 4))) #endif ; void safecpy(char *buf, size_t bufSize, const char *src); /* copy a string to a buffer, with bounds checking.*/ void safencpy(char *buf, size_t bufSize, const char *src, size_t n); /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ void safecat(char *buf, size_t bufSize, const char *src); /* Append a string to a buffer, with bounds checking.*/ void safencat(char *buf, size_t bufSize, const char *src, size_t n); /* append n characters from a string to a buffer, with bounds checking. */ char *naForNull(char *s); /* Return 'n/a' if s is NULL, otherwise s. */ char *naForEmpty(char *s); /* Return n/a if s is "" or NULL, otherwise s. */ char *emptyForNull(char *s); /* Return "" if s is NULL, otherwise s. */ char *nullIfAllSpace(char *s); /* Return NULL if s is all spaces, otherwise s. */ char *trueFalseString(boolean b); /* Return "true" or "false" */ void uglyTime(char *label, ...); /* Print label and how long it's been since last call. Call with * a NULL label to initialize. */ /* In case the development environment does not supply INFINITY */ #if !defined(INFINITY) #define INFINITY (1.0/0.0) #endif void makeDirs(char* path); /* make a directory, including parent directories */ char *skipNumeric(char *s); /* Return first char of s that's not a digit */ char *skipToNumeric(char *s); /* skip up to where numeric digits appear */ char *splitOffNonNumeric(char *s); /* Split off non-numeric part, e.g. mm of mm8. Result should be freed when done */ char *splitOffNumber(char *db); /* Split off number part, e.g. 8 of mm8. Result should be freed when done */ void childExecFailedExit(char *msg); /* Child exec failed, so quit without atexit cleanup */ void vaDumpStack(char *format, va_list args); /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ void dumpStack(char *format, ...) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; // SETTING_ON set of macros are frequently used comparisons of string values for boolean questions. // Notice the subtle difference between NOT_ON and IS_OFF. // NOT_ON could be NULL but IS_OFF must be explicitly set #define SETTING_IS_ON(setting) ( setting && (sameWord(setting,"on") || sameWord(setting,"true") \ || sameWord(setting,"yes") || sameWord(setting,"enabled") \ || atoi(setting) != 0) ) #define SETTING_NOT_ON(setting) (!SETTING_IS_ON(setting)) #define SETTING_IS_OFF(setting) ( setting && (sameWord(setting,"off") \ || sameWord(setting,"false") || sameWord(setting,"no") \ || sameWord(setting,"disabled") || sameWord(setting,"0")) ) // Standard bit mask macros #define BITS_ADD( flags,bits) ((flags) = ((flags) | (bits))) #define BITS_REMOVE( flags,bits) ((flags) = ((flags) & ~(bits))) #define BITS_ARE_ON( flags,bits) (((flags) & (bits)) == (bits)) #define BITS_ARE_OFF(flags,bits) (((flags) & (bits)) == 0) // It is sometimes useful to distinguish between 3 "boolean" states: TRUE, FALSE and UNKNOWN enum enumBool { beUnknown=0, // Not yet set ebYes=1, // already set to TRUE ebNo=-1 // already set to FALSE }; #define SET_TO_YES(ebool) { (ebool) = ebYes; } #define SET_TO_NO(ebool) { (ebool) = ebNo; } #define IS_YES(ebool) ((ebool) == ebYes) #define IS_NO(ebool) ((ebool) == ebNo) #define IS_KNOWN(ebool) (IS_YES(ebool) || IS_NO(ebool)) #define IS_TRUE IS_YES #define IS_FALSE IS_NO time_t mktimeFromUtc (struct tm *t); /* Return time_t for tm in UTC (GMT) * Useful for stuff like converting to time_t the * last-modified HTTP response header * which is always GMT. Returns -1 on failure of mktime */ time_t dateToSeconds(const char *date,const char*format); // Convert a string date to time_t boolean dateIsOld(const char *date,const char*format); // Is this string date older than now? boolean dateIsOlderBy(const char *date,const char*format, time_t seconds); // Is this string date older than now by this many seconds? char *dateAddTo(char *date,char *format,int addYears,int addMonths,int addDays); /* Add years,months,days to a formatted date and returns the new date as a cloned string * format is a strptime/strftime format: %F = yyyy-mm-dd */ boolean haplotype(const char *name); /* Is this name a haplotype name ? _hap or _alt in the name */ #endif /* COMMON_H */ rtracklayer/src/ucsc/dlist.c0000644000175100017510000001557512612032142017132 0ustar00biocbuildbiocbuild/* dlist.c - Doubly-linked list routines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dlist.h" void dlListInit(struct dlList *dl) /* Initialize list to be empty */ { dl->head = (struct dlNode *)(&dl->nullMiddle); dl->nullMiddle = NULL; dl->tail = (struct dlNode *)(&dl->head); } struct dlList *newDlList() /* Return a new doubly linked list. */ { struct dlList *dl; AllocVar(dl); dl->head = (struct dlNode *)(&dl->nullMiddle); dl->tail = (struct dlNode *)(&dl->head); return dl; } void dlListReset(struct dlList *dl) /* Reset a list to the empty state (does not free values) */ { struct dlNode *node, *next; for (node = dl->head; node->next != NULL; node = next) { next = node->next; freeMem(node); } dl->head = (struct dlNode *)(&dl->nullMiddle); dl->nullMiddle = NULL; dl->tail = (struct dlNode *)(&dl->head); } void freeDlList(struct dlList **pList) /* Free up a doubly linked list and it's nodes (but not the node values). */ { struct dlList *list = *pList; if (list != NULL) { dlListReset(list); freez(pList); } } void freeDlListAndVals(struct dlList **pList) /* Free all values in doubly linked list and the list itself. (Just calls * freeMem on all values. */ { struct dlList *list = *pList; if (list != NULL) { struct dlNode *node; for (node = list->head; node->next != NULL; node = node->next) freeMem(node->val); freeDlList(pList); } } void dlInsertBetween(struct dlNode *before, struct dlNode *after, struct dlNode *newNode) { before->next = newNode; newNode->prev = before; newNode->next = after; after->prev = newNode; } void dlAddBefore(struct dlNode *anchor, struct dlNode *newNode) /* Add a node to list before anchor member. */ { dlInsertBetween(anchor->prev, anchor, newNode); } void dlAddAfter(struct dlNode *anchor, struct dlNode *newNode) /* Add a node to list after anchor member. */ { dlInsertBetween(anchor, anchor->next, newNode); } void dlAddHead(struct dlList *list, struct dlNode *newNode) /* Add a node to head of list. */ { struct dlNode *head = list->head; dlInsertBetween(head->prev, head, newNode); } void dlAddTail(struct dlList *list, struct dlNode *newNode) /* Add a node to tail of list. */ { struct dlNode *tail = list->tail; dlInsertBetween(tail, tail->next, newNode); } struct dlNode *dlAddValBefore(struct dlNode *anchor, void *val) /* Create a node containing val and add to list before anchor member. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddBefore(anchor, node); return node; } struct dlNode *dlAddValAfter(struct dlNode *anchor, void *val) /* Create a node containing val and add to list after anchor member. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddAfter(anchor, node); return node; } struct dlNode *dlAddValHead(struct dlList *list, void *val) /* Create a node containing val and add to head of list. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddHead(list, node); return node; } struct dlNode *dlAddValTail(struct dlList *list, void *val) /* Create a node containing val and add to tail of list. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddTail(list, node); return node; } void dlRemove(struct dlNode *node) /* Removes a node from list. Node is not freed. */ { struct dlNode *before = node->prev; struct dlNode *after = node->next; before->next = after; after->prev = before; node->prev = NULL; node->next = NULL; } void dlRemoveHead(struct dlList *list) /* Removes head from list. Node is not freed. */ { dlRemove(list->head); } void dlRemoveTail(struct dlList *list) /* Remove tail from list. Node is not freed. */ { dlRemove(list->tail); } struct dlNode *dlPopHead(struct dlList *list) /* Remove first node from list and return it. */ { struct dlNode *node = list->head; if (node->next == NULL) return NULL; dlRemove(node); return node; } struct dlNode *dlPopTail(struct dlList *list) /* Remove last node from list and return it. */ { struct dlNode *node = list->tail; if (node->prev == NULL) return NULL; dlRemove(node); return node; } void dlDelete(struct dlNode **nodePtr) /* Removes a node from list and frees it. */ { struct dlNode *node = *nodePtr; if (node != NULL) { dlRemove(node); freeMem(node); } } int dlCount(struct dlList *list) /* Return length of list. */ { return slCount(list->head) - 1; } struct dlSorter /* Helper structure for sorting dlNodes preserving order */ { struct dlNode *node; }; static int (*compareFunc)(const void *elem1, const void *elem2); /* Node comparison pointer, just used by dlSortNodes and helpers. */ static int dlNodeCmp(const void *elem1, const void *elem2) /* Compare two dlSorters indirectly, by calling compareFunc. */ { struct dlSorter *a = (struct dlSorter *)elem1; struct dlSorter *b = (struct dlSorter *)elem2; return compareFunc(&a->node->val, &b->node->val); } void dlSort(struct dlList *list, int (*compare )(const void *elem1, const void *elem2)) /* Sort a singly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers of the type that is in the val field of * the nodes of the list. */ { int len = dlCount(list); if (len > 1) { /* Move val's onto an array, sort, and then put back into list. */ struct dlSorter *sorter = needLargeMem(len * sizeof(sorter[0])), *s; struct dlNode *node; int i; for (i=0, node = list->head; inext) { s = &sorter[i]; s->node = node; } compareFunc = compare; qsort(sorter, len, sizeof(sorter[0]), dlNodeCmp); dlListInit(list); for (i=0; ihead; else return list->head->prev; } struct dlNode *dlGetAfterTail(struct dlList *list) /* Get the node after the tail of the list */ { if (dlEmpty(list)) return list->tail; else return list->tail->next; } void *dlListToSlList(struct dlList *dList) /* Return slList from dlList. */ { struct slList *list = NULL, *el; struct dlNode *node; for (node = dList->tail; node->prev != NULL; node = node->prev) { el = node->val; slAddHead(&list, el); } return list; } void dlCat(struct dlList *a, struct dlList *b) /* Move items from b to end of a. */ { struct dlNode *node; while ((node = dlPopHead(b)) != NULL) dlAddTail(a, node); } struct dlNode *dlValInList(struct dlList *list, void *val) /* Return node on list if any that has associated val. */ { struct dlNode *node; for (node = list->head; !dlEnd(node); node = node->next) if (node->val == val) return node; return NULL; } rtracklayer/src/ucsc/dlist.h0000644000175100017510000001000312612032142017114 0ustar00biocbuildbiocbuild/* dlist.h - Headers for generic doubly-linked list routines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DLIST_H #define DLIST_H #ifndef COMMON_H #include "common.h" #endif struct dlNode /* An element on a doubly linked list. */ { struct dlNode *next; struct dlNode *prev; void *val; }; struct dlList /* A doubly linked list. */ { struct dlNode *head; struct dlNode *nullMiddle; struct dlNode *tail; }; #define dlEnd(node) (node->next == NULL) /* True if node past end. */ #define dlStart(node) (node->prev == NULL) /* True if node before start. */ /* Iterate on a doubly linked list as so: for (el = list->head; !dlEnd(el); el = el->next) val = el->val; or for (el = list->tail; !dlStart(el); el = el->prev) val = el->val; */ struct dlList *newDlList(); /* Return a new doubly linked list. */ #define dlListNew newDlList /* Add object-first synonym. */ void dlListInit(struct dlList *dl); /* Initialize list to be empty */ void dlListReset(struct dlList *dl); /* Reset a list to the empty state (does not free values) */ void freeDlList(struct dlList **pList); /* Free up a doubly linked list and it's nodes (but not the node values). */ #define dlListFree freeDlList void freeDlListAndVals(struct dlList **pList); /* Free all values in doubly linked list and the list itself. (Just calls * freeMem on all values. */ #define dlListFreeAndVals freeDlListAndVals void dlAddBefore(struct dlNode *anchor, struct dlNode *newNode); /* Add a node to list before anchor member. */ void dlAddAfter(struct dlNode *anchor, struct dlNode *newNode); /* Add a node to list after anchor member. */ void dlAddHead(struct dlList *list, struct dlNode *newNode); /* Add a node to head of list. */ void dlAddTail(struct dlList *list, struct dlNode *newNode); /* Add a node to tail of list. */ struct dlNode *dlAddValBefore(struct dlNode *anchor, void *val); /* Create a node containing val and add to list before anchor member. */ struct dlNode *dlAddValAfter(struct dlNode *anchor, void *val); /* Create a node containing val and add to list after anchor member. */ struct dlNode *dlAddValHead(struct dlList *list, void *val); /* Create a node containing val and add to head of list. */ struct dlNode *dlAddValTail(struct dlList *list, void *val); /* Create a node containing val and add to tail of list. */ void dlRemove(struct dlNode *node); /* Removes a node from list. Node is not freed. */ void dlRemoveHead(struct dlList *list); /* Removes head from list. Node is not freed. */ void dlRemoveTail(struct dlList *list); /* Remove tail from list. Node is not freed. */ struct dlNode *dlPopHead(struct dlList *list); /* Remove first node from list and return it. */ struct dlNode *dlPopTail(struct dlList *list); /* Remove last node from list and return it. */ void dlDelete(struct dlNode **nodePtr); /* Removes a node from list and frees it. */ int dlCount(struct dlList *list); /* Return length of list. */ boolean dlEmpty(struct dlList *list); /* Return TRUE if list is empty. */ #define dlIsEmpty(list) ((list)->head->next == NULL) /* Return TRUE if list is empty. Macro version of above. */ struct dlNode *dlGetBeforeHead(struct dlList *list); /* Get the node before the head of the list */ struct dlNode *dlGetAfterTail(struct dlList *list); /* Get the node after the tail of the list */ void dlSort(struct dlList *list, int (*compare )(const void *elem1, const void *elem2)); /* Sort a doubly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers of the type that is in the val field of * the nodes of the list. */ void *dlListToSlList(struct dlList *dList); /* Return slList from dlList. */ void dlCat(struct dlList *a, struct dlList *b); /* Move items from b to end of a. */ struct dlNode *dlValInList(struct dlList *list, void *val); /* Return node on list if any that has associated val. */ #endif /* DLIST_H */ rtracklayer/src/ucsc/dnaseq.c0000644000175100017510000000765312612032142017264 0ustar00biocbuildbiocbuild/* dnaSeq.c - stuff to manage DNA sequences. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dnaseq.h" #include "bits.h" #include "hash.h" #include "obscure.h" struct dnaSeq *newDnaSeq(DNA *dna, int size, char *name) /* Create a new DNA seq. */ { struct dnaSeq *seq; seq = needMem(sizeof(*seq)); if (name != NULL) seq->name = cloneString(name); seq->dna = dna; seq->size = size; seq->mask = NULL; return seq; } struct dnaSeq *cloneDnaSeq(struct dnaSeq *orig) /* Duplicate dna sequence in RAM. */ { struct dnaSeq *seq = CloneVar(orig); seq->name = cloneString(seq->name); seq->dna = needHugeMem(seq->size+1); memcpy(seq->dna, orig->dna, seq->size+1); seq->mask = NULL; if (orig->mask != NULL) { seq->mask = bitClone(orig->mask, seq->size); } return seq; } void freeDnaSeq(struct dnaSeq **pSeq) /* Free up DNA seq. (And unlink underlying resource node.) */ { struct dnaSeq *seq = *pSeq; if (seq == NULL) return; freeMem(seq->name); freeMem(seq->dna); bitFree(&seq->mask); freez(pSeq); } void freeDnaSeqList(struct dnaSeq **pSeqList) /* Free up list of DNA sequences. */ { struct dnaSeq *seq, *next; for (seq = *pSeqList; seq != NULL; seq = next) { next = seq->next; freeDnaSeq(&seq); } *pSeqList = NULL; } boolean seqIsLower(bioSeq *seq) /* Return TRUE if sequence is all lower case. */ { int size = seq->size, i; char *poly = seq->dna; for (i=0; idna, seq->size); } aaSeq *translateSeqN(struct dnaSeq *inSeq, unsigned offset, unsigned inSize, boolean stop) /* Return a translated sequence. Offset is position of first base to * translate. If size is 0 then use length of inSeq. */ { aaSeq *seq; DNA *dna = inSeq->dna; AA *pep, aa; int i, lastCodon; int actualSize = 0; assert(offset <= inSeq->size); if ((inSize == 0) || (inSize > (inSeq->size - offset))) inSize = inSeq->size - offset; lastCodon = offset + inSize - 3; AllocVar(seq); seq->dna = pep = needLargeMem(inSize/3+1); for (i=offset; i <= lastCodon; i += 3) { aa = lookupCodon(dna+i); if (aa == 0) { if (stop) break; else aa = 'Z'; } *pep++ = aa; ++actualSize; } *pep = 0; assert(actualSize <= inSize/3+1); seq->size = actualSize; seq->name = cloneString(inSeq->name); return seq; } aaSeq *translateSeq(struct dnaSeq *inSeq, unsigned offset, boolean stop) /* Return a translated sequence. Offset is position of first base to * translate. If stop is TRUE then stop at first stop codon. (Otherwise * represent stop codons as 'Z'). */ { return translateSeqN(inSeq, offset, 0, stop); } bioSeq *whichSeqIn(bioSeq **seqs, int seqCount, char *letters) /* Figure out which if any sequence letters is in. */ { aaSeq *seq; int i; for (i=0; idna <= letters && letters < seq->dna + seq->size) return seq; } internalErr(); return NULL; } Bits *maskFromUpperCaseSeq(bioSeq *seq) /* Allocate a mask for sequence and fill it in based on * sequence case. */ { int size = seq->size, i; char *poly = seq->dna; Bits *b = bitAlloc(size); for (i=0; inext) hashAddUnique(hash, seq->name, seq); return hash; } int dnaSeqCmpName(const void *va, const void *vb) /* Compare to sort based on sequence name. */ { const struct dnaSeq *a = *((struct dnaSeq **)va); const struct dnaSeq *b = *((struct dnaSeq **)vb); return strcmp(a->name, b->name); } rtracklayer/src/ucsc/dnaseq.h0000644000175100017510000000433112612032142017257 0ustar00biocbuildbiocbuild/* dnaSeq - stuff to manage DNA sequences. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DNASEQ_H #define DNASEQ_H #ifndef DNAUTIL_H #include "dnautil.h" #endif #ifndef BITS_H #include "bits.h" #endif struct dnaSeq /* A dna sequence in one-character per base format. */ { struct dnaSeq *next; /* Next in list. */ char *name; /* Name of sequence. */ DNA *dna; /* Sequence base by base. */ int size; /* Size of sequence. */ Bits* mask; /* Repeat mask (optional) */ }; typedef struct dnaSeq bioSeq; /* Preferred use if either DNA or protein. */ typedef struct dnaSeq aaSeq; /* Preferred use if protein. */ struct dnaSeq *newDnaSeq(DNA *dna, int size, char *name); /* Create a new DNA seq. */ struct dnaSeq *cloneDnaSeq(struct dnaSeq *seq); /* Duplicate dna sequence in RAM. */ void freeDnaSeq(struct dnaSeq **pSeq); /* Free up DNA seq. */ #define dnaSeqFree freeDnaSeq void freeDnaSeqList(struct dnaSeq **pSeqList); /* Free up list of DNA sequences. */ #define dnaSeqFreeList freeDnaSeqList aaSeq *translateSeqN(struct dnaSeq *inSeq, unsigned offset, unsigned size, boolean stop); /* Return a translated sequence. Offset is position of first base to * translate. If size is 0 then use length of inSeq. */ aaSeq *translateSeq(struct dnaSeq *inSeq, unsigned offset, boolean stop); /* Return a translated sequence. Offset is position of first base to * translate. If stop is TRUE then stop at first stop codon. (Otherwise * represent stop codons as 'Z'). */ boolean seqIsDna(bioSeq *seq); /* Make educated guess whether sequence is DNA or protein. */ boolean seqIsLower(bioSeq *seq); /* Return TRUE if sequence is all lower case. */ bioSeq *whichSeqIn(bioSeq **seqs, int seqCount, char *letters); /* Figure out which if any sequence letters is in. */ Bits *maskFromUpperCaseSeq(bioSeq *seq); /* Allocate a mask for sequence and fill it in based on * sequence case. */ struct hash *dnaSeqHash(struct dnaSeq *seqList); /* Return hash of sequences keyed by name. */ int dnaSeqCmpName(const void *va, const void *vb); /* Compare to sort based on sequence name. */ #endif /* DNASEQ_H */ rtracklayer/src/ucsc/dnautil.c0000644000175100017510000006313712612032142017450 0ustar00biocbuildbiocbuild/* Some stuff that you'll likely need in any program that works with * DNA. Includes stuff for amino acids as well. * * Assumes that DNA is stored as a character. * The DNA it generates will include the bases * as lowercase tcag. It will generally accept * uppercase as well, and also 'n' or 'N' or '-' * for unknown bases. * * Amino acids are stored as single character upper case. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dnautil.h" struct codonTable /* The dread codon table. */ { DNA *codon; /* Lower case. */ AA protCode; /* Upper case. The "Standard" code */ AA mitoCode; /* Upper case. Vertebrate Mitochondrial translations */ }; struct codonTable codonTable[] = /* The master codon/protein table. */ { {"ttt", 'F', 'F',}, {"ttc", 'F', 'F',}, {"tta", 'L', 'L',}, {"ttg", 'L', 'L',}, {"tct", 'S', 'S',}, {"tcc", 'S', 'S',}, {"tca", 'S', 'S',}, {"tcg", 'S', 'S',}, {"tat", 'Y', 'Y',}, {"tac", 'Y', 'Y',}, {"taa", 0, 0,}, {"tag", 0, 0,}, {"tgt", 'C', 'C',}, {"tgc", 'C', 'C',}, {"tga", 0, 'W',}, {"tgg", 'W', 'W',}, {"ctt", 'L', 'L',}, {"ctc", 'L', 'L',}, {"cta", 'L', 'L',}, {"ctg", 'L', 'L',}, {"cct", 'P', 'P',}, {"ccc", 'P', 'P',}, {"cca", 'P', 'P',}, {"ccg", 'P', 'P',}, {"cat", 'H', 'H',}, {"cac", 'H', 'H',}, {"caa", 'Q', 'Q',}, {"cag", 'Q', 'Q',}, {"cgt", 'R', 'R',}, {"cgc", 'R', 'R',}, {"cga", 'R', 'R',}, {"cgg", 'R', 'R',}, {"att", 'I', 'I',}, {"atc", 'I', 'I',}, {"ata", 'I', 'M',}, {"atg", 'M', 'M',}, {"act", 'T', 'T',}, {"acc", 'T', 'T',}, {"aca", 'T', 'T',}, {"acg", 'T', 'T',}, {"aat", 'N', 'N',}, {"aac", 'N', 'N',}, {"aaa", 'K', 'K',}, {"aag", 'K', 'K',}, {"agt", 'S', 'S',}, {"agc", 'S', 'S',}, {"aga", 'R', 0,}, {"agg", 'R', 0,}, {"gtt", 'V', 'V',}, {"gtc", 'V', 'V',}, {"gta", 'V', 'V',}, {"gtg", 'V', 'V',}, {"gct", 'A', 'A',}, {"gcc", 'A', 'A',}, {"gca", 'A', 'A',}, {"gcg", 'A', 'A',}, {"gat", 'D', 'D',}, {"gac", 'D', 'D',}, {"gaa", 'E', 'E',}, {"gag", 'E', 'E',}, {"ggt", 'G', 'G',}, {"ggc", 'G', 'G',}, {"gga", 'G', 'G',}, {"ggg", 'G', 'G',}, }; /* A table that gives values 0 for t 1 for c 2 for a 3 for g * (which is order aa's are in biochemistry codon tables) * and gives -1 for all others. */ int ntVal[256]; int ntValLower[256]; /* NT values only for lower case. */ int ntValUpper[256]; /* NT values only for upper case. */ int ntVal5[256]; int ntValNoN[256]; /* Like ntVal, but with T_BASE_VAL in place of -1 for nonexistent ones. */ DNA valToNt[(N_BASE_VAL|MASKED_BASE_BIT)+1]; /* convert tables for bit-4 indicating masked */ int ntValMasked[256]; DNA valToNtMasked[256]; static boolean inittedNtVal = FALSE; static void initNtVal() { if (!inittedNtVal) { int i; for (i=0; i= 3) { int c = ntVal[(int)dna[pos-3]]; if (c == A_BASE_VAL || c == G_BASE_VAL) return TRUE; } return FALSE; } boolean isReallyStopCodon(char *dna, boolean selenocysteine) /* Return TRUE if it's really a stop codon, even considering * possibilility of selenocysteine. */ { if (selenocysteine) { /* Luckily the mitochondria *also* replaces TGA with * something else, even though it isn't selenocysteine */ return lookupMitoCodon(dna) == 0; } else { return lookupCodon(dna) == 0; } } /* Returns one letter code for protein, * 0 for stop codon or X for bad input, * Vertebrate Mitochondrial Code */ AA lookupMitoCodon(DNA *dna) { int ix; int i; char c; if (!inittedNtVal) initNtVal(); ix = 0; for (i=0; i<3; ++i) { int bv = ntVal[(int)dna[i]]; if (bv<0) return 'X'; ix = (ix<<2) + bv; } c = codonTable[ix].mitoCode; c = toupper(c); return c; } Codon codonVal(DNA *start) /* Return value from 0-63 of codon starting at start. * Returns -1 if not a codon. */ { int v1,v2,v3; if ((v1 = ntVal[(int)start[0]]) < 0) return -1; if ((v2 = ntVal[(int)start[1]]) < 0) return -1; if ((v3 = ntVal[(int)start[2]]) < 0) return -1; return ((v1<<4) + (v2<<2) + v3); } DNA *valToCodon(int val) /* Return codon corresponding to val (0-63) */ { assert(val >= 0 && val < 64); return codonTable[val].codon; } void dnaTranslateSome(DNA *dna, char *out, int outSize) /* Translate DNA upto a stop codon or until outSize-1 amino acids, * whichever comes first. Output will be zero terminated. */ { int i; int dnaSize; int protSize = 0; outSize -= 1; /* Room for terminal zero */ dnaSize = strlen(dna); for (i=0; i= outSize) break; if ((out[protSize++] = lookupCodon(dna+i)) == 0) break; } out[protSize] = 0; } /* A little array to help us decide if a character is a * nucleotide, and if so convert it to lower case. */ char ntChars[256]; static void initNtChars() { static boolean initted = FALSE; if (!initted) { zeroBytes(ntChars, sizeof(ntChars)); ntChars['a'] = ntChars['A'] = 'a'; ntChars['c'] = ntChars['C'] = 'c'; ntChars['g'] = ntChars['G'] = 'g'; ntChars['t'] = ntChars['T'] = 't'; ntChars['n'] = ntChars['N'] = 'n'; ntChars['u'] = ntChars['U'] = 'u'; ntChars['-'] = 'n'; initted = TRUE; } } char ntMixedCaseChars[256]; static void initNtMixedCaseChars() { static boolean initted = FALSE; if (!initted) { zeroBytes(ntMixedCaseChars, sizeof(ntMixedCaseChars)); ntMixedCaseChars['a'] = 'a'; ntMixedCaseChars['A'] = 'A'; ntMixedCaseChars['c'] = 'c'; ntMixedCaseChars['C'] = 'C'; ntMixedCaseChars['g'] = 'g'; ntMixedCaseChars['G'] = 'G'; ntMixedCaseChars['t'] = 't'; ntMixedCaseChars['T'] = 'T'; ntMixedCaseChars['n'] = 'n'; ntMixedCaseChars['N'] = 'N'; ntMixedCaseChars['u'] = 'u'; ntMixedCaseChars['U'] = 'U'; ntMixedCaseChars['-'] = 'n'; initted = TRUE; } } /* Another array to help us do complement of DNA */ DNA ntCompTable[256]; static boolean inittedCompTable = FALSE; static void initNtCompTable() { zeroBytes(ntCompTable, sizeof(ntCompTable)); ntCompTable[' '] = ' '; ntCompTable['-'] = '-'; ntCompTable['='] = '='; ntCompTable['a'] = 't'; ntCompTable['c'] = 'g'; ntCompTable['g'] = 'c'; ntCompTable['t'] = 'a'; ntCompTable['u'] = 'a'; ntCompTable['n'] = 'n'; ntCompTable['-'] = '-'; ntCompTable['.'] = '.'; ntCompTable['A'] = 'T'; ntCompTable['C'] = 'G'; ntCompTable['G'] = 'C'; ntCompTable['T'] = 'A'; ntCompTable['U'] = 'A'; ntCompTable['N'] = 'N'; ntCompTable['R'] = 'Y'; ntCompTable['Y'] = 'R'; ntCompTable['M'] = 'K'; ntCompTable['K'] = 'M'; ntCompTable['S'] = 'S'; ntCompTable['W'] = 'W'; ntCompTable['V'] = 'B'; ntCompTable['H'] = 'D'; ntCompTable['D'] = 'H'; ntCompTable['B'] = 'V'; ntCompTable['X'] = 'N'; ntCompTable['r'] = 'y'; ntCompTable['y'] = 'r'; ntCompTable['s'] = 's'; ntCompTable['w'] = 'w'; ntCompTable['m'] = 'k'; ntCompTable['k'] = 'm'; ntCompTable['v'] = 'b'; ntCompTable['h'] = 'd'; ntCompTable['d'] = 'h'; ntCompTable['b'] = 'v'; ntCompTable['x'] = 'n'; ntCompTable['('] = ')'; ntCompTable[')'] = '('; inittedCompTable = TRUE; } /* Complement DNA (not reverse). */ void complement(DNA *dna, long length) { int i; if (!inittedCompTable) initNtCompTable(); for (i=0; i= 0; i--) { char *allele = alleles[i]; int alLen = strlen(allele); if (isAllNt(allele, alLen)) reverseComplement(allele, alLen); if (i != alCount-1) safecat(outStr, len+1, "/"); safecat(outStr, len+1, allele); } if (startsWith("-/", alleleStr)) { // Keep "-/" at the beginning: memmove(outStr+2, outStr, len-2); outStr[0] = '-'; outStr[1] = '/'; } return outStr; } int cmpDnaStrings(DNA *a, DNA *b) /* Compare using screwy non-alphabetical DNA order TCGA */ { for (;;) { DNA aa = *a++; DNA bb = *b++; if (aa != bb) return ntVal[(int)aa] - ntVal[(int)bb]; if (aa == 0) break; } return 0; } /* Convert T's to U's */ void toRna(DNA *dna) { DNA c; for (;;) { c = *dna; if (c == 't') *dna = 'u'; else if (c == 'T') *dna = 'U'; else if (c == 0) break; ++dna; } } char *skipIgnoringDash(char *a, int size, bool skipTrailingDash) /* Count size number of characters, and any * dash characters. */ { while (size > 0) { if (*a++ != '-') --size; } if (skipTrailingDash) while (*a == '-') ++a; return a; } int countNonDash(char *a, int size) /* Count number of non-dash characters. */ { int count = 0; int i; for (i=0; i 4) { count += 1; x >>= 2; } return count; } long dnaOrAaFilteredSize(char *raw, char filter[256]) /* Return how long DNA will be after non-DNA is filtered out. */ { char c; long count = 0; dnaUtilOpen(); while ((c = *raw++) != 0) { if (filter[(int)c]) ++count; } return count; } void dnaOrAaFilter(char *in, char *out, char filter[256]) /* Run chars through filter. */ { char c; dnaUtilOpen(); while ((c = *in++) != 0) { if ((c = filter[(int)c]) != 0) *out++ = c; } *out++ = 0; } long dnaFilteredSize(char *rawDna) /* Return how long DNA will be after non-DNA is filtered out. */ { return dnaOrAaFilteredSize(rawDna, ntChars); } void dnaFilter(char *in, DNA *out) /* Filter out non-DNA characters and change to lower case. */ { dnaOrAaFilter(in, out, ntChars); } void dnaFilterToN(char *in, DNA *out) /* Change all non-DNA characters to N. */ { DNA c; initNtChars(); while ((c = *in++) != 0) { if ((c = ntChars[(int)c]) != 0) *out++ = c; else *out++ = 'n'; } *out++ = 0; } void dnaMixedCaseFilter(char *in, DNA *out) /* Filter out non-DNA characters but leave case intact. */ { dnaOrAaFilter(in, out, ntMixedCaseChars); } long aaFilteredSize(char *raw) /* Return how long aa will be after non-aa chars is filtered out. */ { return dnaOrAaFilteredSize(raw, aaChars); } void aaFilter(char *in, DNA *out) /* Filter out non-aa characters and change to upper case. */ { dnaOrAaFilter(in, out, aaChars); } void upperToN(char *s, int size) /* Turn upper case letters to N's. */ { char c; int i; for (i=0; i= 0) { if ((val = ntVal[(int)*dna++]) >= 0) ++histogram[val]; } } bits64 basesToBits64(char *dna, int size) /* Convert dna of given size (up to 32) to binary representation */ { if (size > 32) errAbort("basesToBits64 called on %d bases, can only go up to 32", size); bits64 result = 0; int i; for (i=0; i= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } bits16 packDna8(DNA *in) /* Pack 8 bases into a short word */ { bits16 out = 0; int count = 8; int bVal; while (--count >= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } UBYTE packDna4(DNA *in) /* Pack 4 bases into a UBYTE */ { UBYTE out = 0; int count = 4; int bVal; while (--count >= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } void unpackDna(bits32 *tiles, int tileCount, DNA *out) /* Unpack DNA. Expands to 16x tileCount in output. */ { int i, j; bits32 tile; for (i=0; i=0; --j) { out[j] = valToNt[tile & 0x3]; tile >>= 2; } out += 16; } } void unpackDna4(UBYTE *tiles, int byteCount, DNA *out) /* Unpack DNA. Expands to 4x byteCount in output. */ { int i, j; UBYTE tile; for (i=0; i=0; --j) { out[j] = valToNt[tile & 0x3]; tile >>= 2; } out += 4; } } static void checkSizeTypes() /* Make sure that some of our predefined types are the right size. */ { assert(sizeof(UBYTE) == 1); assert(sizeof(WORD) == 2); assert(sizeof(bits32) == 4); assert(sizeof(bits16) == 2); } int intronOrientationMinSize(DNA *iStart, DNA *iEnd, int minIntronSize) /* Given a gap in genome from iStart to iEnd, return * Return 1 for GT/AG intron between left and right, -1 for CT/AC, 0 for no * intron. Assumes DNA is lower cased. */ { if (iEnd - iStart < minIntronSize) return 0; if (iStart[0] == 'g' && iStart[1] == 't' && iEnd[-2] == 'a' && iEnd[-1] == 'g') { return 1; } else if (iStart[0] == 'c' && iStart[1] == 't' && iEnd[-2] == 'a' && iEnd[-1] == 'c') { return -1; } else return 0; } int intronOrientation(DNA *iStart, DNA *iEnd) /* Given a gap in genome from iStart to iEnd, return * Return 1 for GT/AG intron between left and right, -1 for CT/AC, 0 for no * intron. Assumes DNA is lower cased. */ { return intronOrientationMinSize(iStart, iEnd, 32); } int dnaScore2(DNA a, DNA b) /* Score match between two bases (relatively crudely). */ { if (a == 'n' || b == 'n') return 0; if (a == b) return 1; else return -1; } int dnaOrAaScoreMatch(char *a, char *b, int size, int matchScore, int mismatchScore, char ignore) /* Compare two sequences (without inserts or deletions) and score. */ { int i; int score = 0; for (i=0; i 0) { lineSize = lettersLeft; if (lineSize > maxPerLine) lineSize = maxPerLine; mustWrite(f, letters, lineSize); fputc('\n', f); letters += lineSize; lettersLeft -= lineSize; } } static int findTailPolyAMaybeMask(DNA *dna, int size, boolean doMask, boolean loose) /* Identify PolyA at end; mask to 'n' if specified. This allows a few * non-A's as noise to be trimmed too. Returns number of bases trimmed. * Leaves first two bases of PolyA in case there's a taa stop codon. */ { int i; int score = 10; int bestScore = 10; int bestPos = -1; int trimSize = 0; for (i=size-1; i>=0; --i) { DNA b = dna[i]; if (b == 'n' || b == 'N') continue; if (score > 20) score = 20; if (b == 'a' || b == 'A') { score += 1; if (score >= bestScore) { bestScore = score; bestPos = i; } else if (loose && score >= (bestScore - 8)) { /* If loose, keep extending even if score isn't back up to best. */ bestPos = i; } } else { score -= 10; } if (score < 0) { break; } } if (bestPos >= 0) { trimSize = size - bestPos - 2; // Leave two for aa in taa stop codon if (trimSize > 0) { if (doMask) for (i=size - trimSize; i 20) score = 20; if (b == 't' || b == 'T') { score += 1; if (score >= bestScore) { bestScore = score; bestPos = i; } else if (loose && score >= (bestScore - 8)) { /* If loose, keep extending even if score isn't back up to best. */ bestPos = i; } } else { score -= 10; } if (score < 0) { pastPoly = i; break; } } if (bestPos >= 0) { trimSize = bestPos+1 - 2; // Leave two for aa in taa stop codon if (trimSize > 0) { if (doMask) memset(dna, 'n', trimSize); } else trimSize = 0; } return trimSize; } int headPolyTSizeLoose(DNA *dna, int size) /* Return size of PolyT at start (if present). This allows a few non-T's as * noise to be trimmed too, but skips last two tt for revcomp'd taa stop * codon. * It is less conservative in extending the polyA region than maskHeadPolyT. */ { return findHeadPolyTMaybeMask(dna, size, FALSE, TRUE); } int maskHeadPolyT(DNA *dna, int size) /* Convert PolyT at start. This allows a few non-T's as noise to be * trimmed too. Returns number of bases trimmed. */ { return findHeadPolyTMaybeMask(dna, size, TRUE, FALSE); } boolean isDna(char *poly, int size) /* Return TRUE if letters in poly are at least 90% ACGTNU- */ { int i; int dnaCount = 0; dnaUtilOpen(); for (i=0; i= round(0.9 * size)); } boolean isAllNt(char *seq, int size) /* Return TRUE if all letters in seq are ACGTNU-. */ { int i; dnaUtilOpen(); for (i=0; istring = needMem(initialBufSize+1); ds->bufSize = initialBufSize; return ds; } void freeDyString(struct dyString **pDs) /* Free up dynamic string. */ { struct dyString *ds; if ((ds = *pDs) != NULL) { freeMem(ds->string); freez(pDs); } } char *dyStringCannibalize(struct dyString **pDy) /* Kill dyString, but return the string it is wrapping * (formerly dy->string). This should be free'd at your * convenience. */ { char *s; struct dyString *ds = *pDy; assert(ds != NULL); s = ds->string; freez(pDy); return s; } void freeDyStringList(struct dyString **pDs) /* free up a list of dyStrings */ { struct dyString *ds, *next; for(ds = *pDs; ds != NULL; ds = next) { next = ds->next; freeDyString(&ds); } *pDs = NULL; } static void dyStringExpandBuf(struct dyString *ds, int newSize) /* Expand buffer to new size. */ { ds->string = needMoreMem(ds->string, ds->stringSize+1, newSize+1); ds->bufSize = newSize; } void dyStringBumpBufSize(struct dyString *ds, int size) /* Force dyString buffer to be at least given size. */ { if (ds->bufSize < size) dyStringExpandBuf(ds, size); } void dyStringAppendN(struct dyString *ds, char *string, int stringSize) /* Append string of given size to end of string. */ { int oldSize = ds->stringSize; int newSize = oldSize + stringSize; char *buf; if (newSize > ds->bufSize) { int newAllocSize = newSize + oldSize; int oldSizeTimesOneAndAHalf = oldSize * 1.5; if (newAllocSize < oldSizeTimesOneAndAHalf) newAllocSize = oldSizeTimesOneAndAHalf; dyStringExpandBuf(ds,newAllocSize); } buf = ds->string; memcpy(buf+oldSize, string, stringSize); ds->stringSize = newSize; buf[newSize] = 0; } char dyStringAppendC(struct dyString *ds, char c) /* Append char to end of string. */ { char *s; if (ds->stringSize >= ds->bufSize) dyStringExpandBuf(ds, ds->bufSize+256); s = ds->string + ds->stringSize++; *s++ = c; *s = 0; return c; } void dyStringAppendMultiC(struct dyString *ds, char c, int n) /* Append N copies of char to end of string. */ { int oldSize = ds->stringSize; int newSize = oldSize + n; int newAllocSize = newSize + oldSize; char *buf; if (newSize > ds->bufSize) dyStringExpandBuf(ds,newAllocSize); buf = ds->string; memset(buf+oldSize, c, n); ds->stringSize = newSize; buf[newSize] = 0; } void dyStringAppend(struct dyString *ds, char *string) /* Append zero terminated string to end of dyString. */ { dyStringAppendN(ds, string, strlen(string)); } void dyStringAppendEscapeQuotes(struct dyString *dy, char *string, char quot, char esc) /* Append escaped-for-quotation version of string to dy. */ { char c; char *s = string; while ((c = *s++) != 0) { if (c == quot) dyStringAppendC(dy, esc); dyStringAppendC(dy, c); } } void dyStringVaPrintf(struct dyString *ds, char *format, va_list args) /* VarArgs Printf to end of dyString. */ { /* attempt to format the string in the current space. If there * is not enough room, increase the buffer size and try again */ int avail, sz; while (TRUE) { va_list argscp; va_copy(argscp, args); avail = ds->bufSize - ds->stringSize; if (avail <= 0) { /* Don't pass zero sized buffers to vsnprintf, because who knows * if the library function will handle it. */ dyStringExpandBuf(ds, ds->bufSize+ds->bufSize); avail = ds->bufSize - ds->stringSize; } sz = vsnprintf(ds->string + ds->stringSize, avail, format, argscp); va_end(argscp); /* note that some version return -1 if too small */ if ((sz < 0) || (sz >= avail)) dyStringExpandBuf(ds, ds->bufSize+ds->bufSize); else { ds->stringSize += sz; break; } } } void dyStringPrintf(struct dyString *ds, char *format, ...) /* Printf to end of dyString. */ { va_list args; va_start(args, format); dyStringVaPrintf(ds, format, args); va_end(args); } struct dyString *dyStringCreate(char *format, ...) /* Create a dyString with a printf style initial content */ { int len = strlen(format) * 3; struct dyString *ds = newDyString(len); va_list args; va_start(args, format); dyStringVaPrintf(ds, format, args); va_end(args); return ds; } struct dyString * dyStringSub(char *orig, char *in, char *out) /* Make up a duplicate of orig with all occurences of in substituted * with out. */ { int inLen = strlen(in), outLen = strlen(out), origLen = strlen(orig); struct dyString *dy = newDyString(origLen + 2*outLen); char *s, *e; if (orig == NULL) return NULL; for (s = orig; ;) { e = stringIn(in, s); if (e == NULL) { e = orig + origLen; dyStringAppendN(dy, s, e - s); break; } else { dyStringAppendN(dy, s, e - s); dyStringAppendN(dy, out, outLen); s = e + inLen; } } return dy; } void dyStringResize(struct dyString *ds, int newSize) /* resize a string, if the string expands, blanks are appended */ { int oldSize = ds->stringSize; if (newSize > oldSize) { /* grow */ if (newSize > ds->bufSize) dyStringExpandBuf(ds, newSize + ds->stringSize); memset(ds->string+newSize, ' ', newSize); } ds->string[newSize] = '\0'; ds->stringSize = newSize; } void dyStringQuoteString(struct dyString *dy, char quotChar, char *text) /* Append quotChar-quoted text (with any internal occurrences of quotChar * \-escaped) onto end of dy. */ { char c; dyStringAppendC(dy, quotChar); while ((c = *text++) != 0) { if (c == quotChar) dyStringAppendC(dy, '\\'); dyStringAppendC(dy, c); } dyStringAppendC(dy, quotChar); } rtracklayer/src/ucsc/dystring.h0000644000175100017510000000610112612032142017644 0ustar00biocbuildbiocbuild/* dystring - dynamically resizing string. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DYSTRING_H /* Wrapper to avoid including this twice. */ #define DYSTRING_H #include "common.h" struct dyString /* Dynamically resizable string that you can do formatted * output to. */ { struct dyString *next; /* Next in list. */ char *string; /* Current buffer. */ int bufSize; /* Size of buffer. */ int stringSize; /* Size of string. */ }; struct dyString *newDyString(int initialBufSize); /* Allocate dynamic string with initial buffer size. (Pass zero for default) */ #define dyStringNew newDyString void freeDyString(struct dyString **pDs); /* Free up dynamic string. */ #define dyStringFree(a) freeDyString(a); void freeDyStringList(struct dyString **pDs); /* Free up a list of dynamic strings */ #define dyStringFreeList(a) freeDyStringList(a); void dyStringAppend(struct dyString *ds, char *string); /* Append zero terminated string to end of dyString. */ void dyStringAppendN(struct dyString *ds, char *string, int stringSize); /* Append string of given size to end of string. */ char dyStringAppendC(struct dyString *ds, char c); /* Append char to end of string. */ void dyStringAppendMultiC(struct dyString *ds, char c, int n); /* Append N copies of char to end of string. */ void dyStringAppendEscapeQuotes(struct dyString *dy, char *string, char quot, char esc); /* Append escaped-for-quotation version of string to dy. */ #define dyStringWriteOne(dy, var) dyStringAppendN(dy, (char *)(&var), sizeof(var)) /* Write one variable (binary!) to dyString - for cases when want to treat string like * a file stream. */ void dyStringVaPrintf(struct dyString *ds, char *format, va_list args); /* VarArgs Printf to end of dyString. */ void dyStringPrintf(struct dyString *ds, char *format, ...) /* Printf to end of dyString. */ #ifdef __GNUC__ __attribute__((format(printf, 2, 3))) #endif ; struct dyString *dyStringCreate(char *format, ...); /* Create a dyString with a printf style initial content */ #define dyStringClear(ds) (ds->string[0] = ds->stringSize = 0) /* Clear string. */ struct dyString * dyStringSub(char *orig, char *in, char *out); /* Make up a duplicate of orig with all occurences of in substituted * with out. */ void dyStringBumpBufSize(struct dyString *ds, int size); /* Force dyString buffer to be at least given size. */ char *dyStringCannibalize(struct dyString **pDy); /* Kill dyString, but return the string it is wrapping * (formerly dy->string). This should be free'd at your * convenience. */ #define dyStringContents(ds) (ds)->string /* return raw string. */ #define dyStringLen(ds) ds->stringSize /* return raw string length. */ void dyStringResize(struct dyString *ds, int newSize); /* resize a string, if the string expands, blanks are appended */ void dyStringQuoteString(struct dyString *dy, char quotChar, char *text); /* Append quotChar-quoted text (with any internal occurrences of quotChar * \-escaped) onto end of dy. */ #endif /* DYSTRING_H */ rtracklayer/src/ucsc/errAbort.c0000644000175100017510000002631112612032142017561 0ustar00biocbuildbiocbuild/* errAbort.c - our error handler. * * This maintains two stacks - a warning message printer * stack, and a "abort handler" stack. * * Note that the abort function always calls the warn handler first. * This is so that the message gets sent. * * By default the warnings will go to stderr, and * aborts will exit the program. You can push a * function on to the appropriate stack to change * this behavior. The top function on the stack * gets called. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ // developer: this include is for an occasionally useful means of getting stack info without // crashing // however, it is not supported on cygwin. Conditionally compile this in when desired. //#define BACKTRACE_EXISTS #ifdef BACKTRACE_EXISTS #include #endif///def BACKTRACE_EXISTS #include #include "common.h" #include "hash.h" #include "dystring.h" #include "errAbort.h" #define maxWarnHandlers 20 #define maxAbortHandlers 12 struct perThreadAbortVars /* per thread variables for abort and warn */ { boolean debugPushPopErr; // generate stack dump on push/pop error boolean errAbortInProgress; /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ WarnHandler warnArray[maxWarnHandlers]; int warnIx; AbortHandler abortArray[maxAbortHandlers]; int abortIx; }; static struct perThreadAbortVars *getThreadVars(); // forward declaration static void defaultVaWarn(char *format, va_list args) /* Default error message handler. */ { if (format != NULL) { fflush(stdout); vfprintf(stderr, format, args); fprintf(stderr, "\n"); fflush(stderr); } } static void silentVaWarn(char *format, va_list args) /* Warning handler that just hides it. Useful sometimes when high level code * expects low level code may fail (as in finding a file on the net) but doesn't * want user to be bothered about it. */ { } void vaWarn(char *format, va_list args) /* Call top of warning stack to issue warning. */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->warnArray[ptav->warnIx](format, args); } void warn(char *format, ...) /* Issue a warning message. */ { va_list args; va_start(args, format); vaWarn(format, args); va_end(args); } void warnWithBackTrace(char *format, ...) /* Issue a warning message and append backtrace. */ { va_list args; va_start(args, format); struct dyString *dy = newDyString(255); dyStringAppend(dy, format); #define STACK_LIMIT 20 char **strings = NULL; int count = 0; // developer: this is an occasionally useful means of getting stack info without crashing // however, it is not supported on cygwin. Conditionally compile this in when desired. // The define is at top to include execinfo.h #ifdef BACKTRACE_EXISTS void *buffer[STACK_LIMIT]; count = backtrace(buffer, STACK_LIMIT); strings = backtrace_symbols(buffer, count); #endif///def BACKTRACE_EXISTS if (strings == NULL) dyStringAppend(dy,"\nno backtrace_symbols available in errabort::warnWithBackTrace()."); else { int ix = 1; dyStringAppend(dy,"\nBACKTRACE (use on cmdLine):"); if (strings[1] != NULL) { strSwapChar(strings[1],' ','\0'); dyStringPrintf(dy,"\naddr2line -Cfise %s",strings[1]); strings[1] += strlen(strings[1]) + 1; } for (; ix < count && strings[ix] != NULL; ix++) { strings[ix] = skipBeyondDelimit(strings[ix],'['); strSwapChar(strings[ix],']','\0'); dyStringPrintf(dy," %s",strings[ix]); } free(strings); } vaWarn(dyStringCannibalize(&dy), args); va_end(args); } void errnoWarn(char *format, ...) /* Prints error message from UNIX errno first, then does rest of warning. */ { char fbuf[512]; va_list args; va_start(args, format); sprintf(fbuf, "%s\n%s", strerror(errno), format); vaWarn(fbuf, args); va_end(args); } void pushWarnHandler(WarnHandler handler) /* Set abort handler */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->warnIx >= maxWarnHandlers-1) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("pushWarnHandler overflow"); #endif errAbort("Too many pushWarnHandlers, can only handle %d\n", maxWarnHandlers-1); } ptav->warnArray[++ptav->warnIx] = handler; } void popWarnHandler() /* Revert to old warn handler. */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->warnIx <= 0) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("popWarnHandler underflow"); #endif errAbort("Too few popWarnHandlers"); } --ptav->warnIx; } static void defaultAbort() /* Default error handler exits program. */ { if ((getenv("ERRASSERT") != NULL) || (getenv("ERRABORT") != NULL)) abort(); else exit(-1); } void noWarnAbort() /* Abort without message. */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->abortArray[ptav->abortIx](); exit(-1); /* This is just to make compiler happy. * We have already exited or longjmped by now. */ } void vaErrAbort(char *format, va_list args) /* Abort function, with optional (vprintf formatted) error message. */ { /* flag is needed because both errAbort and warn generate message * using the warn handler, however sometimes one needed to know * (like when logging), if it's an error or a warning. This is far from * perfect, as this isn't cleared if the error handler continues, * as with an exception mechanism. */ struct perThreadAbortVars *ptav = getThreadVars(); ptav->errAbortInProgress = TRUE; vaWarn(format, args); noWarnAbort(); } void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ { va_list args; va_start(args, format); vaErrAbort(format, args); va_end(args); } void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ { char fbuf[512]; va_list args; va_start(args, format); sprintf(fbuf, "%s\n%s", strerror(errno), format); vaErrAbort(fbuf, args); va_end(args); } void pushAbortHandler(AbortHandler handler) /* Set abort handler */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->abortIx >= maxAbortHandlers-1) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("pushAbortHandler overflow"); #endif errAbort("Too many pushAbortHandlers, can only handle %d", maxAbortHandlers-1); } ptav->abortArray[++ptav->abortIx] = handler; } void popAbortHandler() /* Revert to old abort handler. */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->abortIx <= 0) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("popAbortHandler underflow"); #endif errAbort("Too many popAbortHandlers\n"); } --ptav->abortIx; } static void debugAbort() /* Call the debugger. */ { fflush(stdout); assert(FALSE); defaultAbort(); } void pushDebugAbort() /* Push abort handler that will invoke debugger. */ { pushAbortHandler(debugAbort); } static void warnAbortHandler(char *format, va_list args) /* warn handler that also aborts. */ { defaultVaWarn(format, args); noWarnAbort(); } void pushWarnAbort() /* Push handler that will abort on warnings. */ { pushWarnHandler(warnAbortHandler); } void pushSilentWarnHandler() /* Set warning handler to be quiet. Do a popWarnHandler to restore. */ { pushWarnHandler(silentVaWarn); } void errAbortDebugnPushPopErr() /* generate stack dump if there is a error in the push/pop functions */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->debugPushPopErr = TRUE; } boolean isErrAbortInProgress() /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ { struct perThreadAbortVars *ptav = getThreadVars(); return ptav->errAbortInProgress; } static struct perThreadAbortVars *getThreadVars() /* Return a pointer to the perThreadAbortVars for the current pthread. */ { pthread_t pid = pthread_self(); // pthread_t can be a pointer or a number, implementation-dependent. // Test for out-of-memory condition causing re-entrancy into this function that would block // on its own main mutex ptavMutex. Do this by looking for its own pid. // Some care must be exercised in testing and comparing the threads pid against one in-use. // We need yet another mutex and a boolean to tell us when the pidInUse value may be safely compared to pid. // Use a boolean since there is no known unused value for pthread_t variable. NULL and -1 are not portable. static boolean pidInUseValid = FALSE; // tells when pidInUse contains a valid pid that can be compared. static pthread_t pidInUse; // there is no "unused" value to which we can initialize this. static pthread_mutex_t pidInUseMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &pidInUseMutex ); // If this pid equals pidInUse, then this function has been re-entered due to severe out-of-memory error. // But we only compare them when pidInUseValid is TRUE. if (pidInUseValid && pthread_equal(pid, pidInUse)) { // Avoid deadlock on self by exiting immediately. // Use pthread_equal because directly comparing two pthread_t vars is not allowed. // This re-entrancy only happens when it has aborted already due to out of memory // which should be a rare occurrence. char *errMsg = "errAbort re-entered due to out-of-memory condition. Exiting.\n"; write(STDERR_FILENO, errMsg, strlen(errMsg)); exit(1); // out of memory is a serious problem, exit immediately, but allow atexit cleanup. } pthread_mutex_unlock( &pidInUseMutex ); // This is the main mutex we really care about. // It controls access to the hash where thread-specific data is stored. static pthread_mutex_t ptavMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &ptavMutex ); // safely tell threads that pidInUse // is valid and correctly set and may be compared to pid pthread_mutex_lock( &pidInUseMutex ); pidInUse = pthread_self(); // setting it directly to pid is not allowed. pidInUseValid = TRUE; pthread_mutex_unlock( &pidInUseMutex ); // This means that if we crash due to out-of-memory below, // it will be able to detect the re-entrancy and handle it above. static struct hash *perThreadVars = NULL; if (perThreadVars == NULL) perThreadVars = hashNew(0); // convert the pid into a string for the hash key char pidStr[64]; safef(pidStr, sizeof(pidStr), "%lld", ptrToLL(pid)); struct hashEl *hel = hashLookup(perThreadVars, pidStr); if (hel == NULL) { // if it is the first time, initialization the perThreadAbortVars struct perThreadAbortVars *ptav; AllocVar(ptav); ptav->debugPushPopErr = FALSE; ptav->errAbortInProgress = FALSE; ptav->warnIx = 0; ptav->warnArray[0] = defaultVaWarn; ptav->abortIx = 0; ptav->abortArray[0] = defaultAbort; hel = hashAdd(perThreadVars, pidStr, ptav); } // safely tell other threads that pidInUse // is no longer valid and may not be compared to pid pthread_mutex_lock( &pidInUseMutex ); pidInUseValid = FALSE; pthread_mutex_unlock( &pidInUseMutex ); // unlock our mutex controlling the hash of thread-specific data pthread_mutex_unlock( &ptavMutex ); return (struct perThreadAbortVars *)(hel->val); } rtracklayer/src/ucsc/errAbort.h0000644000175100017510000000472512612032142017573 0ustar00biocbuildbiocbuild/* ErrAbort.h - our error handler. * * This maintains two stacks - a warning message printer * stack, and a "abort handler" stack. * * By default the warnings will go to stderr, and * aborts will exit the program. You can push a * function on to the appropriate stack to change * this behavior. The top function on the stack * gets called. * * Most functions in this library will call errAbort() * if they run out of memory. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef ERRABORT_H #define ERRABORT_H boolean isErrAbortInProgress(); /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void vaErrAbort(char *format, va_list args); /* Abort function, with optional (vprintf formatted) error message. */ void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; typedef void (*AbortHandler)(); /* Function that can abort. */ void pushAbortHandler(AbortHandler handler); /* Set abort handler */ void popAbortHandler(); /* Revert to old abort handler. */ void noWarnAbort(); /* Abort without message. */ void pushDebugAbort(); /* Push abort handler that will invoke debugger. */ void vaWarn(char *format, va_list args); /* Call top of warning stack to issue warning. */ void warn(char *format, ...) /* Issue a warning message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void errnoWarn(char *format, ...) /* Prints error message from UNIX errno first, then does rest of warning. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; typedef void (*WarnHandler)(char *format, va_list args); /* Function that can warn. */ void pushWarnHandler(WarnHandler handler); /* Set warning handler */ void popWarnHandler(); /* Revert to old warn handler. */ void pushWarnAbort(); /* Push handler that will abort on warnings. */ void pushSilentWarnHandler(); /* Set warning handler to be quiet. Do a popWarnHandler to restore. */ void errAbortDebugnPushPopErr(); /* generate stack dump if there is a error in the push/pop functions */ #endif /* ERRABORT_H */ rtracklayer/src/ucsc/errCatch.h0000644000175100017510000000375512612032142017550 0ustar00biocbuildbiocbuild/* errCatch - help catch errors so that errAborts aren't * fatal, and warn's don't necessarily get printed immediately. * Note that error conditions caught this way will tend to * leak resources unless there are additional wrappers. * * Typical usage is * errCatch = errCatchNew(); * if (errCatchStart(errCatch)) * doFlakyStuff(); * errCatchEnd(errCatch); * if (errCatch->gotError) * warn("Flaky stuff failed: %s", errCatch->message->string); * errCatchFree(&errCatch); * cleanupFlakyStuff(); */ #ifndef ERRCATCH_H #define ERRCATCH_H #ifndef DYSTRING_H #include "dystring.h" #endif struct errCatch /* Something to help catch errors. */ { struct errCatch *next; /* Next in stack. */ jmp_buf jmpBuf; /* Where to jump back to for recovery. */ struct dyString *message; /* Error message if any */ boolean gotError; /* Some sort of error was caught. */ boolean gotWarning; /* Some sort of error warning was raised. */ }; struct errCatch *errCatchNew(); /* Return new error catching structure. */ void errCatchFree(struct errCatch **pErrCatch); /* Free up resources associated with errCatch */ #define errCatchStart(e) (errCatchPushHandlers(e) && setjmp(e->jmpBuf) == 0) /* Little wrapper around setjmp. This returns TRUE * on the main execution thread, FALSE after abort. */ boolean errCatchPushHandlers(struct errCatch *errCatch); /* Push error handlers. Not usually called directly. * but rather through errCatchStart() macro. Always * returns TRUE. */ void errCatchEnd(struct errCatch *errCatch); /* Restore error handlers and pop self off of catching stack. */ void errCatchReWarn(struct errCatch *errCatch); /* Re-warn any warnings that happened even though no abort happened * to make them visible. */ boolean errCatchFinish(struct errCatch **pErrCatch); /* Finish up error catching. Report error if there is a * problem and return FALSE. If no problem return TRUE. * This handles errCatchEnd and errCatchFree. */ #endif /* ERRCATCH_H */ rtracklayer/src/ucsc/hash.c0000644000175100017510000004577712612032142016745 0ustar00biocbuildbiocbuild/* Hash.c - implements hashing. See hash.h for usage comments. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "localmem.h" #include "hash.h" #include "obscure.h" #include "dystring.h" /* * Hash a string key. This code is taken from Tcl interpreter. I was borrowed * after discovering a lot of collisions and poor utilization of the table * when hashing accessions. * * This function was compared to Bob Jenkins' lookup2 hash function and * (http://burtleburtle.net/bob/hash/) and Paul Hsieh's SuperFast * hash function (http://www.azillionmonkeys.com/qed/hash.html). * Both of those functions provided better utilization of the table, * but were also more expensive, so the Tcl function was used. * If hashing of binary keys is implemented, SuperFast hash should * be considered. * * for an explanation of this function, see HashStringKey() in the * Tcl source file, generic/tclHash.c, available from * http://tcl.sourceforge.net/. * * The Tcl code is: * Copyright (c) 1991-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" (in the Tcl distribution) for complete * license (which is a BSD-style license). * * Since hashCrc() is in use elsewhere, * a new function hashString() was created for use in hash table. * -- markd */ bits32 hashString(char *string) /* Compute a hash value of a string. */ { char *keyStr = string; unsigned int result = 0; int c; while ((c = *keyStr++) != '\0') { result += (result<<3) + c; } return result; } bits32 hashCrc(char *string) /* Returns a CRC value on string. */ { unsigned char *us = (unsigned char *)string; unsigned char c; bits32 shiftAcc = 0; bits32 addAcc = 0; while ((c = *us++) != 0) { shiftAcc <<= 2; shiftAcc += c; addAcc += c; } return shiftAcc + addAcc; } struct hashEl *hashLookup(struct hash *hash, char *name) /* Looks for name in hash table. Returns associated element, * if found, or NULL if not. If there are multiple entries * for name, the last one added is returned (LIFO behavior). */ { struct hashEl *el = hash->table[hashString(name)&hash->mask]; while (el != NULL) { if (strcmp(el->name, name) == 0) break; el = el->next; } return el; } struct hashEl *hashLookupUpperCase(struct hash *hash, char *name) /* Lookup upper cased name in hash. (Assumes all elements of hash * are themselves already in upper case.) */ { char s[256]; safef(s, sizeof(s), "%s", name); touppers(s); return hashLookup(hash, s); } struct hashEl *hashLookupNext(struct hashEl *hashEl) /* Find the next occurance of name that may occur in the table multiple times, * or NULL if not found. Use hashLookup to find the first occurrence. Elements * are returned in LIFO order. */ { struct hashEl *el = hashEl->next; while (el != NULL) { if (strcmp(el->name, hashEl->name) == 0) break; el = el->next; } return el; } struct hashEl *hashAddN(struct hash *hash, char *name, int nameSize, void *val) /* Add name of given size to hash (no need to be zero terminated) */ { struct hashEl *el; if (hash->lm) el = lmAlloc(hash->lm, sizeof(*el)); else AllocVar(el); el->hashVal = hashString(name); int hashVal = el->hashVal & hash->mask; if (hash->lm) { el->name = lmAlloc(hash->lm, nameSize+1); memcpy(el->name, name, nameSize); } else el->name = cloneStringZ(name, nameSize); el->val = val; el->next = hash->table[hashVal]; hash->table[hashVal] = el; hash->elCount += 1; if (hash->autoExpand && hash->elCount > (int)(hash->size * hash->expansionFactor)) { /* double the size */ hashResize(hash, digitsBaseTwo(hash->size)); } return el; } struct hashEl *hashAdd(struct hash *hash, char *name, void *val) /* Add new element to hash table. If an item with name, already exists, a new * item is added in a LIFO manner. The last item added for a given name is * the one returned by the hashLookup functions. hashLookupNext must be used * to find the preceding entries for a name. */ { return hashAddN(hash, name, strlen(name), val); } boolean hashMayRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table, if present. * Return true if it was present */ { return (hashRemove(hash, name) != NULL); } void hashMustRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table, or error * if not present */ { if (hashRemove(hash, name) == NULL) errAbort("attempt to remove non-existant %s from hash", name); } void freeHashEl(struct hashEl *hel) /* Free hash element. Use only on non-local memory version. */ { freeMem(hel->name); freeMem(hel); } void *hashRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table. * Returns value of removed item, or NULL if not in the table. * If their are multiple entries for name, the last one added * is removed (LIFO behavior). */ { struct hashEl *hel; void *ret; struct hashEl **pBucket = &hash->table[hashString(name)&hash->mask]; for (hel = *pBucket; hel != NULL; hel = hel->next) if (sameString(hel->name, name)) break; if (hel == NULL) return NULL; ret = hel->val; if (slRemoveEl(pBucket, hel)) { hash->elCount -= 1; if (!hash->lm) freeHashEl(hel); } return ret; } struct hashEl *hashAddUnique(struct hash *hash, char *name, void *val) /* Add new element to hash table. Squawk and die if not unique */ { if (hashLookup(hash, name) != NULL) errAbort("%s duplicated, aborting", name); return hashAdd(hash, name, val); } struct hashEl *hashAddSaveName(struct hash *hash, char *name, void *val, char **saveName) /* Add new element to hash table. Save the name of the element, which is now * allocated in the hash table, to *saveName. A typical usage would be: * AllocVar(el); * hashAddSaveName(hash, name, el, &el->name); */ { struct hashEl *hel = hashAdd(hash, name, val); *saveName = hel->name; return hel; } struct hashEl *hashStore(struct hash *hash, char *name) /* If element in hash already return it, otherwise add it * and return it. */ { struct hashEl *hel; if ((hel = hashLookup(hash, name)) != NULL) return hel; return hashAdd(hash, name, NULL); } char *hashStoreName(struct hash *hash, char *name) /* If element in hash already return it, otherwise add it * and return it. */ { struct hashEl *hel; if (name == NULL) return NULL; if ((hel = hashLookup(hash, name)) != NULL) return hel->name; return hashAdd(hash, name, NULL)->name; } int hashIntVal(struct hash *hash, char *name) /* Return integer value associated with name in a simple * hash of ints. */ { void *val = hashMustFindVal(hash, name); return ptToInt(val); } int hashIntValDefault(struct hash *hash, char *name, int defaultInt) /* Return integer value associated with name in a simple * hash of ints or defaultInt if not found. */ { struct hashEl *hel = hashLookup(hash, name); if(hel == NULL) return defaultInt; return ptToInt(hel->val); } void *hashMustFindVal(struct hash *hash, char *name) /* Lookup name in hash and return val. Abort if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) errAbort("hashMustFindVal: '%s' not found", name); return hel->val; } void *hashFindVal(struct hash *hash, char *name) /* Look up name in hash and return val or NULL if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) return NULL; return hel->val; } void *hashOptionalVal(struct hash *hash, char *name, void *usual) /* Look up name in hash and return val, or usual if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) return usual; else return hel->val; } void *hashFindValUpperCase(struct hash *hash, char *name) /* Lookup upper cased name in hash and return val or return NULL if not found. * (Assumes all elements of hash are themselves already in upper case.) */ { struct hashEl *hel = hashLookupUpperCase(hash, name); if (hel == NULL) return NULL; return hel->val; } char *hashMustFindName(struct hash *hash, char *name) /* Return name as stored in hash table (in hel->name). * Abort if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) errAbort("hashMustFindName: '%s' not found", name); return hel->name; } struct hashEl *hashAddInt(struct hash *hash, char *name, int val) /* Store integer value in hash */ { char *pt = NULL; return hashAdd(hash, name, pt + val); } void hashIncInt(struct hash *hash, char *name) /* Increment integer value in hash */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) { hashAddInt(hash, name, 1); } else { hel->val = ((char *)hel->val)+1; /* The much simpler ++hel->val works for gnu C, but really adding one to a void pointer * I think is not well defined. */ } } long long hashIntSum(struct hash *hash) /* Return sum of all the ints in a hash of ints. */ { long long sum = 0; int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) { int num = ptToInt(hel->val); sum += (long long)num; } } return sum; } struct hash *newHashExt(int powerOfTwoSize, boolean useLocalMem) /* Returns new hash table. Uses local memory optionally. */ { struct hash *hash = needMem(sizeof(*hash)); int memBlockPower = 16; if (powerOfTwoSize == 0) powerOfTwoSize = 12; assert(powerOfTwoSize <= hashMaxSize && powerOfTwoSize > 0); hash->powerOfTwoSize = powerOfTwoSize; hash->size = (1<lm = lmInit(1<mask = hash->size-1; AllocArray(hash->table, hash->size); hash->autoExpand = TRUE; hash->expansionFactor = defaultExpansionFactor; /* Expand when elCount > size*expansionFactor */ return hash; } void hashResize(struct hash *hash, int powerOfTwoSize) /* Resize the hash to a new size */ { int oldHashSize = hash->size; struct hashEl **oldTable = hash->table; if (powerOfTwoSize == 0) powerOfTwoSize = 12; assert(powerOfTwoSize <= hashMaxSize && powerOfTwoSize > 0); hash->powerOfTwoSize = powerOfTwoSize; hash->size = (1<mask = hash->size-1; AllocArray(hash->table, hash->size); int i; struct hashEl *hel, *next; for (i=0; inext; int hashVal = hel->hashVal & hash->mask; hel->next = hash->table[hashVal]; hash->table[hashVal] = hel; } } /* restore original list order */ for (i=0; isize; ++i) { struct hashEl *hel = hash->table[i]; if (hel != NULL && hel->next != NULL) slReverse(&hash->table[i]); } freeMem(oldTable); hash->numResizes++; } struct hash *hashFromSlNameList(void *list) /* Create a hash out of a list of slNames. */ { struct hash *hash = NULL; struct slName *namedList = list, *item; if (!list) return NULL; hash = newHash(0); for (item = namedList; item != NULL; item = item->next) hashAdd(hash, item->name, item); return hash; } struct hash *hashSetFromSlNameList(void *list) /* Create a hashSet (hash with only keys) out of a list of slNames. */ { struct hash *hash = NULL; struct slName *namedList = list, *item; if (!list) return NULL; hash = newHash(0); for (item = namedList; item != NULL; item = item->next) hashAdd(hash, item->name, NULL); return hash; } void hashTraverseEls(struct hash *hash, void (*func)(struct hashEl *hel)) /* Apply func to every element of hash with hashEl as parameter. */ { int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) func(hel); } } void hashTraverseVals(struct hash *hash, void (*func)(void *val)) /* Apply func to every element of hash with hashEl->val as parameter. */ { int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) func(hel->val); } } int hashElCmp(const void *va, const void *vb) /* Compare two hashEl by name. */ { const struct hashEl *a = *((struct hashEl **)va); const struct hashEl *b = *((struct hashEl **)vb); return strcmp(a->name, b->name); } int hashElCmpWithEmbeddedNumbers(const void *va, const void *vb) /* Compare two hashEl by name sorting including numbers within name, * suitable for chromosomes, genes, etc. */ { const struct hashEl *a = *((struct hashEl **)va); const struct hashEl *b = *((struct hashEl **)vb); return cmpStringsWithEmbeddedNumbers(a->name, b->name); } void *hashElFindVal(struct hashEl *list, char *name) /* Look up name in hashEl list and return val or NULL if not found. */ { struct hashEl *el; for (el = list; el != NULL; el = el->next) { if (strcmp(el->name, name) == 0) return el->val; } return NULL; } struct hashEl *hashElListHash(struct hash *hash) /* Return a list of all elements of hash. Free return with hashElFreeList. */ { int i; struct hashEl *hel, *dupe, *list = NULL; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) { dupe = CloneVar(hel); slAddHead(&list, dupe); } } return list; } void hashElFree(struct hashEl **pEl) /* Free hash el list returned from hashListAll. (Don't use * this internally.) */ { freez(pEl); } void hashElFreeList(struct hashEl **pList) /* Free hash el list returned from hashListAll. (Don't use * this internally. */ { slFreeList(pList); } struct hashCookie hashFirst(struct hash *hash) /* Return an object to use by hashNext() to traverse the hash table. * The first call to hashNext will return the first entry in the table. */ { struct hashCookie cookie; cookie.hash = hash; cookie.idx = 0; cookie.nextEl = NULL; /* find first entry */ for (cookie.idx = 0; (cookie.idx < hash->size) && (hash->table[cookie.idx] == NULL); cookie.idx++) continue; /* empty body */ if (cookie.idx < hash->size) cookie.nextEl = hash->table[cookie.idx]; return cookie; } struct hashEl* hashNext(struct hashCookie *cookie) /* Return the next entry in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { /* NOTE: if hashRemove were coded to track the previous entry during the * search and then use it to do the remove, it would be possible to * remove the entry returned by this method */ struct hashEl *retEl = cookie->nextEl; if (retEl == NULL) return NULL; /* no more */ /* find next entry */ cookie->nextEl = retEl->next; if (cookie->nextEl == NULL) { for (cookie->idx++; (cookie->idx < cookie->hash->size) && (cookie->hash->table[cookie->idx] == NULL); cookie->idx++) continue; /* empty body */ if (cookie->idx < cookie->hash->size) cookie->nextEl = cookie->hash->table[cookie->idx]; } return retEl; } void* hashNextVal(struct hashCookie *cookie) /* Return the next value in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { struct hashEl *hel = hashNext(cookie); if (hel == NULL) return NULL; else return hel->val; } char *hashNextName(struct hashCookie *cookie) /* Return the next name in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { struct hashEl *hel = hashNext(cookie); if (hel == NULL) return NULL; else return hel->name; } void freeHash(struct hash **pHash) /* Free up hash table. */ { struct hash *hash = *pHash; if (hash == NULL) return; if (hash->lm) lmCleanup(&hash->lm); else { int i; struct hashEl *hel, *next; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = next) { next = hel->next; freeHashEl(hel); } } } freeMem(hash->table); freez(pHash); } void freeHashAndVals(struct hash **pHash) /* Free up hash table and all values associated with it. * (Just calls freeMem on each hel->val) */ { struct hash *hash; if ((hash = *pHash) != NULL) { hashTraverseVals(hash, freeMem); freeHash(pHash); } } void hashFreeWithVals(struct hash **pHash, void (freeFunc)()) /* Free up hash table and all values associated with it. freeFunc is a * function to free an entry, should take a pointer to a pointer to an * entry. */ { struct hash *hash = *pHash; if (hash != NULL) { struct hashCookie cookie = hashFirst(hash); struct hashEl *hel; while ((hel = hashNext(&cookie)) != NULL) freeFunc(&hel->val); hashFree(pHash); } } void hashFreeList(struct hash **pList) /* Free up a list of hashes. */ { struct hash *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; hashFree(&el); } *pList = NULL; } static int bucketLen(struct hashEl *hel) /* determine how many elements are in a hash bucket */ { int nel = 0; for (; hel != NULL; hel = hel->next) nel++; return nel; } void hashHisto(struct hash *hash, char *fname) /* Output bucket usage counts to a file for producing a histogram */ { FILE* fh = mustOpen(fname, "w"); int i; for (i=0; isize; ++i) fprintf(fh, "%d\n", bucketLen(hash->table[i])); carefulClose(&fh); } void hashPrintStats(struct hash *hash, char *label, FILE *fh) /* print statistic about a hash table */ { // count up usage int i, occupiedCnt = 0, maxBucket = 0; for (i=0; isize; ++i) { if (hash->table[i] != NULL) occupiedCnt++; int sz = bucketLen(hash->table[i]); maxBucket = max(maxBucket, sz); } fprintf(fh, "hashTable\t%s\n", label); fprintf(fh, "tableSize\t%d\t%d\n", hash->size, hash->powerOfTwoSize); fprintf(fh, "numElements\t%d\n", hash->elCount); fprintf(fh, "occupied\t%d\t%0.4f\n", occupiedCnt, ((hash->size == 0) ? 0.0 : ((float)occupiedCnt)/hash->size)); fprintf(fh, "maxBucket\t%d\n", maxBucket); fprintf(fh, "numResizes\t%d\n", hash->numResizes); fprintf(fh, "\n"); } struct hashEl *hashReplace(struct hash *hash, char *name, void *val) /* Replace an existing element in hash table, or add it if not present. */ { if (hashLookup(hash, name)) hashRemove(hash, name); return hashAdd(hash, name, val); } char *hashToRaString(struct hash *hash) /* Convert hash to string in ra format. */ { struct hashEl *el, *list = hashElListHash(hash); struct dyString *dy = dyStringNew(0); slSort(&list, hashElCmp); for (el = list; el != NULL; el = el->next) { dyStringAppend(dy, el->name); dyStringAppendC(dy, ' '); dyStringAppend(dy, el->val); dyStringAppendC(dy, '\n'); } hashElFreeList(&list); return dyStringCannibalize(&dy); } int hashNumEntries(struct hash *hash) /* count the number of entries in a hash */ { int n = 0, i; for (i=0; isize; ++i) n += bucketLen(hash->table[i]); return n; } struct hash *hashFromString(char *string) /* parse a whitespace-separated string with tuples in the format name=val or * name="val" to a hash name->val */ { if (string==NULL) return NULL; struct slPair *keyVals = slPairListFromString(string, TRUE); if (keyVals==NULL) return NULL; struct hash *nameToVal = newHash(0); struct slPair *kv; for (kv = keyVals; kv != NULL; kv = kv->next) hashAdd(nameToVal, kv->name, kv->val); return nameToVal; } rtracklayer/src/ucsc/hash.h0000644000175100017510000002531712612032142016736 0ustar00biocbuildbiocbuild/* Hash - a simple hash table that provides name/value pairs. * The most common usage is to create a hash as so: * struct hash *hash = hashNew(0); * to add elements to a hash as so: * hashAdd(hash, name, value); * and to retrieve a named element as so: * value = hashFindVal(hash, name); * The hashFindVal function will return NULL if the name does not * appear in the hash. Alternatively you can use: * value = hashMustFindVal(hash, name); * which will abort if name is not in the hash. When done with a hash do: * hashFree(&hash); * * The hash does support multiple values for the same key. To use * this functionality, try the loop: * struct hashEl *hel; * for (hel = hashLookup(hash, name); hel != NULL; hel = hashLookupNext(hel)) * { * value = hel->val; * // Further processing here. * The order of elements retrieved this way will be most-recently-added first. * The hashLookup function is _slightly_ faster than the hashFindVal function, * so sometimes it is used just to test for the presence of an element in the * hash when not interested in the value associated with it. * * One can iterate through all the elements in a hash in three ways. One can * get a list of all things in the hash as so: * struct hashEl *hel, *helList = hashElListHash(hash); * for (hel = helList; hel != NULL; hel = hel->next) * { * value = hel->val; * // Further processing of value here. * } * hashElFreeList(&helList); * One can avoid the overhead of creating a list by using an iterator object * and function: * struct hashEl *hel; * struct hashCookie cookie = hashFirst(hash); * while ((hel = hashNext(&cookie)) != NULL) * { * value = hel->val; * Finally one can use hashTraverseEls or hashTraverseVals with a callback * function that takes a hashEl, or the void *value as parameter respectively. * * There are various other functions involving hashes in this module as well * that provide various short cuts. For information on these and additional * details of the functions described, please read the full hash.h file, and * if so inclined the hash.c file as well. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef HASH_H #define HASH_H struct hashEl /* An element in a hash list. */ { struct hashEl *next; char *name; void *val; bits32 hashVal; }; struct hash { struct hash *next; /* Next in list. */ bits32 mask; /* Mask hashCrc with this to get it to fit table. */ struct hashEl **table; /* Hash buckets. */ int powerOfTwoSize; /* Size of table as a power of two. */ int size; /* Size of table. */ struct lm *lm; /* Local memory pool. */ int elCount; /* Count of elements. */ boolean autoExpand; /* Automatically expand hash */ float expansionFactor; /* Expand when elCount > size*expansionFactor */ int numResizes; /* number of times resize was called */ }; #define defaultExpansionFactor 1.0 #define hashMaxSize 28 struct hashCookie /* used by hashFirst/hashNext in tracking location in traversing hash */ { struct hash *hash; /* hash we are associated with */ int idx; /* current index in hash */ struct hashEl *nextEl; /* current element in hash */ }; bits32 hashString(char *string); /* Compute a hash value of a string. */ bits32 hashCrc(char *string); /* Returns a CRC value on string. */ struct hashEl *hashLookup(struct hash *hash, char *name); /* Looks for name in hash table. Returns associated element, * if found, or NULL if not. If there are multiple entries * for name, the last one added is returned (LIFO behavior). */ struct hashEl *hashLookupUpperCase(struct hash *hash, char *name); /* Lookup upper cased name in hash. (Assumes all elements of hash * are themselves already in upper case.) */ struct hashEl *hashLookupNext(struct hashEl *hashEl); /* Find the next occurance of name that may occur in the table multiple times, * or NULL if not found. Use hashLookup to find the first occurrence. Elements * are returned in LIFO order. */ struct hashEl *hashAdd(struct hash *hash, char *name, void *val); /* Add new element to hash table. If an item with name, already exists, a new * item is added in a LIFO manner. The last item added for a given name is * the one returned by the hashLookup functions. hashLookupNext must be used * to find the preceding entries for a name. */ struct hashEl *hashAddN(struct hash *hash, char *name, int nameSize, void *val); /* Add name of given size to hash (no need to be zero terminated) */ void *hashRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table. * Returns value of removed item, or NULL if not in the table. * If their are multiple entries for name, the last one added * is removed (LIFO behavior). */ struct hashEl *hashAddUnique(struct hash *hash, char *name, void *val); /* Add new element to hash table. Squawk and die if is already in table. */ struct hashEl *hashAddSaveName(struct hash *hash, char *name, void *val, char **saveName); /* Add new element to hash table. Save the name of the element, which is now * allocated in the hash table, to *saveName. A typical usage would be: * AllocVar(el); * hashAddSaveName(hash, name, el, &el->name); */ struct hashEl *hashStore(struct hash *hash, char *name); /* If element in hash already return it, otherwise add it * and return it. */ char *hashStoreName(struct hash *hash, char *name); /* Put name into hash table. */ char *hashMustFindName(struct hash *hash, char *name); /* Return name as stored in hash table (in hel->name). * Abort if not found. */ void *hashMustFindVal(struct hash *hash, char *name); /* Lookup name in hash and return val. Abort if not found. */ void *hashFindVal(struct hash *hash, char *name); /* Look up name in hash and return val or NULL if not found. */ void *hashOptionalVal(struct hash *hash, char *name, void *usual); /* Look up name in hash and return val, or usual if not found. */ void *hashFindValUpperCase(struct hash *hash, char *name); /* Lookup upper cased name in hash and return val or return NULL if not found. * (Assumes all elements of hash are themselves already in upper case.) */ struct hashEl *hashAddInt(struct hash *hash, char *name, int val); /* Store integer value in hash */ void hashIncInt(struct hash *hash, char *name); /* Increment integer value in hash */ int hashIntVal(struct hash *hash, char *name); /* Return integer value associated with name in a simple * hash of ints. */ int hashIntValDefault(struct hash *hash, char *name, int defaultInt); /* Return integer value associated with name in a simple * hash of ints or defaultInt if not found. */ long long hashIntSum(struct hash *hash); /* Return sum of all the ints in a hash of ints. */ void hashTraverseEls(struct hash *hash, void (*func)(struct hashEl *hel)); /* Apply func to every element of hash with hashEl as parameter. */ void hashTraverseVals(struct hash *hash, void (*func)(void *val)); /* Apply func to every element of hash with hashEl->val as parameter. */ struct hashEl *hashElListHash(struct hash *hash); /* Return a list of all elements of hash. Free return with hashElFreeList. */ int hashElCmp(const void *va, const void *vb); /* Compare two hashEl by name. */ int hashElCmpWithEmbeddedNumbers(const void *va, const void *vb); /* Compare two hashEl by name sorting including numbers within name, * suitable for chromosomes, genes, etc. */ void *hashElFindVal(struct hashEl *list, char *name); /* Look up name in hashEl list and return val or NULL if not found. */ void hashElFree(struct hashEl **pEl); /* Free hash el list returned from hashListAll. */ void hashElFreeList(struct hashEl **pList); /* Free hash el list returned from hashListAll. (Don't use * this internally. */ struct hashCookie hashFirst(struct hash *hash); /* Return an object to use by hashNext() to traverse the hash table. * The first call to hashNext will return the first entry in the table. */ struct hashEl* hashNext(struct hashCookie *cookie); /* Return the next entry in the hash table, or NULL if no more. Do not modify * hash table while this is being used. (see note in code if you want to fix * this) */ void *hashNextVal(struct hashCookie *cookie); /* Return the next value in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ char *hashNextName(struct hashCookie *cookie); /* Return the next name in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ struct hash *newHashExt(int powerOfTwoSize, boolean useLocalMem); /* Returns new hash table. Uses local memory optionally. */ #define hashNewExt(a) newHashExt(a) /* Synonym */ #define newHash(a) newHashExt(a, TRUE) /* Returns new hash table using local memory. */ #define hashNew(a) newHash(a) /* Synonym */ void hashResize(struct hash *hash, int powerOfTwoSize); /* Resize the hash to a new size */ struct hash *hashFromSlNameList(void *list); /* Create a hash out of a list of slNames. */ struct hash *hashSetFromSlNameList(void *list); /* Create a hashSet (hash without values) out of a list of slNames. */ void freeHash(struct hash **pHash); /* Free up hash table. */ #define hashFree(a) freeHash(a) /* Synonym */ void freeHashAndVals(struct hash **pHash); /* Free up hash table and all values associated with it. * (Just calls freeMem on each hel->val) */ void hashFreeWithVals(struct hash **pHash, void (freeFunc)()); /* Free up hash table and all values associated with it. freeFunc is a * function to free an entry, should take a pointer to a pointer to an * entry. */ void hashFreeList(struct hash **pList); /* Free up a list of hashes. */ void hashHisto(struct hash *hash, char *fname); /* Output bucket usage counts to a file for producing a histogram */ void hashPrintStats(struct hash *hash, char *label, FILE *fh); /* print statistic about a hash table */ struct hashEl *hashReplace(struct hash *hash, char *name, void *val); /* Replace an existing element in hash table, or add it if not present. */ boolean hashMayRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table, if present. * Return true if it was present */ void hashMustRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table, or error * if not present */ char *hashToRaString(struct hash *hash); /* Convert hash to string in ra format. */ int hashNumEntries(struct hash *hash); /* count the number of entries in a hash */ struct hash *hashFromString(char *string); /* parse a whitespace-separated string with tuples in the format name=val or * name="val" to a hash name->val */ #endif /* HASH_H */ rtracklayer/src/ucsc/hmmstats.c0000644000175100017510000000211212612032142017632 0ustar00biocbuildbiocbuild/* hmmstats.c - Stuff for doing statistical analysis in general and * hidden Markov models in particular. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "hmmstats.h" int scaledLog(double val) /* Return scaled log of val. */ { return round(logScaleFactor * log(val)); } double oneOverSqrtTwoPi = 0.39894228; double simpleGaussean(double x) /* Gaussean distribution with standard deviation 1 and mean 0. */ { return oneOverSqrtTwoPi * exp(-0.5*x*x ); } double gaussean(double x, double mean, double sd) /* Gaussean distribution with mean and standard deviation at point x */ { x -= mean; x /= sd; return oneOverSqrtTwoPi * exp(-0.5*x*x) / sd; } double calcVarianceFromSums(double sum, double sumSquares, bits64 n) /* Calculate variance. */ { double var = sumSquares - sum*sum/n; if (n > 1) var /= n-1; return var; } double calcStdFromSums(double sum, double sumSquares, bits64 n) /* Calculate standard deviation. */ { return sqrt(calcVarianceFromSums(sum, sumSquares, n)); } rtracklayer/src/ucsc/hmmstats.h0000644000175100017510000000213312612032142017642 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* hmmstats.h - Stuff for doing statistical analysis in general and * hidden Markov models in particular. */ #ifndef HMMSTATS_H #define HMMSTATS_H int scaledLog(double val); /* Return scaled log of val. */ #define logScaleFactor 1000 /* Amount we scale logs by. */ double simpleGaussean(double x); /* Gaussean distribution with standard deviation 1 and mean 0. */ double gaussean(double x, double mean, double sd); /* Gaussean distribution with mean and standard deviation at point x */ double calcVarianceFromSums(double sum, double sumSquares, bits64 n); /* Calculate variance. */ double calcStdFromSums(double sum, double sumSquares, bits64 n); /* Calculate standard deviation. */ #endif /* HMMSTATS_H */ rtracklayer/src/ucsc/htmshell.h0000644000175100017510000001441312612032142017626 0ustar00biocbuildbiocbuild/* Htmshell.h - stuff to make it easier to generate HTML files on * the fly. Typically included with cheapcgi.h in almost any * CGI program. * * To use this generally you should call the function htmShell() * very early inside of main(). You pass htmShell() a routine * which does most of the work of your web server-side applet. * * These routines will throw errors, which are caught by * htmShell, which then returns. For the most part you just * want an error to cause an error message to be printed and * then terminate your CGI program, so this works fine. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ void htmlSetCookie(char* name, char* value, char* expires, char* path, char* domain, boolean isSecure); /* create a cookie with the given stats */ void htmlParagraph(char *line, ...); /* Print a line in it's own paragraph. */ void htmlVaParagraph(char *line, va_list args); /* Print a line in it's own paragraph. */ void htmlCenterParagraph(char *line, ...); /* Center a line in it's own paragraph. */ void htmlHorizontalLine(); /* Print a horizontal line. */ void htmlNbSpaces(int count); /* Print a number of non-breaking spaces. */ void htmHorizontalLine(FILE *f); /* Print a horizontal line. */ void htmTextOut(FILE *f, char *s); /* Print out string to file, if necessary replacing > with > and the like */ void htmlTextOut(char *s); /* Print out string, if necessary replacing > with > and the like */ char *htmlTextStripTags(char *s); /* Returns a cloned string with all html tags stripped out */ char *htmlTextReplaceTagsWithChar(char *s, char ch); /* Returns a cloned string with all html tags replaced with given char (useful for tokenizing) */ char *htmlEncodeText(char *s, boolean tagsOkay); /* Returns a cloned string with quotes replaced by html codes. Changes ',",\n and if not tagsOkay >,<,& to code equivalents. This differs from cgiEncode as it handles text that will be displayed in an html page or tooltip style title. */ #define htmlEncode(s) htmlEncodeText(s,FALSE) char *attributeEncode(char *str); // encode double and single quotes in a string to be used as an element attribute void htmlMemDeath(); /* Complain about lack of memory and abort. */ void htmlStart(char *title); /* Write the start of a cgi-generated html file */ void htmStart(FILE *f, char *title); /* Write the start of a stand alone .html file. */ void printBodyTag(FILE *f); // print starting BODY tag, including any appropriate attributes (class, background and bgcolor). void htmStartWithHead(FILE *f, char *head, char *title); /* Write the start of a stand alone .html file, plus head info */ void htmStartDirDepth(FILE *f, char *title, int dirDepth); /* Write the start of a stand alone .html file. dirDepth is the number of levels * beneath apache root that caller's HTML will appear to the web client. * E.g. if writing HTML from cgi-bin, dirDepth is 1; if trash/body/, 2. */ void htmlEnd(); /* Write the end of a cgi-generated html file */ void htmEnd(FILE *f); /* Write the end of a stand-alone html file */ extern char *htmlStyleUndecoratedLink; /* Style that gets rid of underline of links. */ void htmlSetStyle(char *style); /* Set document wide style. A favorite style to * use for many purposes is htmlStyleUndecoratedLink * which will remove underlines from links. * Needs to be called before htmlStart or htmShell. */ void htmlSetStyleSheet(char *styleSheet); /* Set document wide style sheet by adding css name to HEAD part. * Needs to be called before htmlStart or htmShell. */ void htmlSetFormClass(char *formClass); /* Set class in the BODY part. */ void htmlSetStyleTheme(char *style); /* Set theme style, these styles can overwrite document wide styles. * Needs to be called before htmlStart or htmShell. */ void htmlSetBackground(char *imageFile); /* Set background image - needs to be called before htmlStart * or htmShell. */ void htmlSetBgColor(int color); /* Set background color - needs to be called before htmlStart * or htmShell. */ void htmlBadVar(char *varName); /* Complain about input variables. */ void htmlImage(char *fileName, int width, int height); /* Display centered image file. */ jmp_buf htmlRecover; /* Error recovery jump. Exposed for cart's use. */ void htmlVaWarn(char *format, va_list args); /* Write an error message. (Generally you just call warn() or errAbort(). * This is exposed mostly for the benefit of the cart.) */ char *htmlWarnStartPattern(); /* Return starting pattern for warning message. */ char *htmlWarnEndPattern(); /* Return ending pattern for warning message. */ void htmlWarnBoxSetup(FILE *f); /* Creates an invisible, empty warning box than can be filled with errors * and then made visible. */ void htmlAbort(); /* Terminate HTML file. Exposed for cart's use. */ void htmlPushEarlyHandlers(); /* Push stuff to close out web page to make sensible error * message during initialization. */ /* Wrap error recovery around call to doMiddle. */ void htmErrOnlyShell(void (*doMiddle)()); /* Wrap error recovery and and input processing around call to doMiddle. */ void htmEmptyShell(void (*doMiddle)(), char *method); /* Wrap an html file around the passed in function. * The passed in function is already in the body. It * should just make paragraphs and return. * Method should be "query" or "get" or "post" (or NULL * if you don't care).. */ void htmShell( char *title, void (*doMiddle)(), char *method); /* Wrap an html file around the passed in function. * The passed in function is already in the body. It * should just make paragraphs and return. * Method should be "query" or "get" or "post". param title - The HTML page title param head - The head text: can be a refresh directive or javascript param method - The function pointer to execute in the middle param method - The browser request method to use */ void htmShellWithHead( char *title, char *head, void (*doMiddle)(), char *method); /* tell htmlOut to not escape special HTML chars '<', '>' */ void htmlNoEscape(); /* tell htmlOut to escape special HTML chars '<', '>' */ void htmlDoEscape(); /* Include an HTML file in a CGI. * The file path is relative to the web server document root */ void htmlIncludeWebFile(char *file); /* Include an HTML file in a CGI */ void htmlIncludeFile(char *path); rtracklayer/src/ucsc/https.c0000644000175100017510000001725012612032142017145 0ustar00biocbuildbiocbuild/* Connect via https. */ /* Copyright (C) 2012 The Regents of the University of California * See README in this or parent directory for licensing information. */ #ifdef USE_SSL #include "openssl/ssl.h" #include "openssl/err.h" #include #include #include #include "common.h" #include "errAbort.h" #include "net.h" static pthread_mutex_t *mutexes = NULL; static unsigned long openssl_id_callback(void) { return ((unsigned long)pthread_self()); } static void openssl_locking_callback(int mode, int n, const char * file, int line) { if (mode & CRYPTO_LOCK) pthread_mutex_lock(&mutexes[n]); else pthread_mutex_unlock(&mutexes[n]); } void openssl_pthread_setup(void) { int i; int numLocks = CRYPTO_num_locks(); AllocArray(mutexes, numLocks); for (i = 0; i < numLocks; i++) pthread_mutex_init(&mutexes[i], NULL); CRYPTO_set_id_callback(openssl_id_callback); CRYPTO_set_locking_callback(openssl_locking_callback); } struct netConnectHttpsParams /* params to pass to thread */ { pthread_t thread; char *hostName; int port; int sv[2]; /* the pair of socket descriptors */ }; static void xerrno(char *msg) { fprintf(stderr, "%s : %s\n", strerror(errno), msg); fflush(stderr); } static void xerr(char *msg) { fprintf(stderr, "%s\n", msg); fflush(stderr); } void openSslInit() /* do only once */ { static boolean done = FALSE; static pthread_mutex_t osiMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &osiMutex ); if (!done) { SSL_library_init(); ERR_load_crypto_strings(); ERR_load_SSL_strings(); OpenSSL_add_all_algorithms(); openssl_pthread_setup(); done = TRUE; } pthread_mutex_unlock( &osiMutex ); } void *netConnectHttpsThread(void *threadParam) /* use a thread to run socket back to user */ { /* child */ struct netConnectHttpsParams *params = threadParam; pthread_detach(params->thread); // this thread will never join back with it's progenitor int fd=0; char hostnameProto[256]; BIO *sbio; SSL_CTX *ctx; SSL *ssl; openSslInit(); ctx = SSL_CTX_new(SSLv23_client_method()); fd_set readfds; fd_set writefds; int err; struct timeval tv; /* TODO checking certificates char *certFile = NULL; char *certPath = NULL; if (certFile || certPath) { SSL_CTX_load_verify_locations(ctx,certFile,certPath); #if (OPENSSL_VERSION_NUMBER < 0x0090600fL) SSL_CTX_set_verify_depth(ctx,1); #endif } // verify paths and mode. */ sbio = BIO_new_ssl_connect(ctx); BIO_get_ssl(sbio, &ssl); if(!ssl) { xerr("Can't locate SSL pointer"); goto cleanup; } /* Don't want any retries since we are non-blocking bio now */ //SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); safef(hostnameProto,sizeof(hostnameProto),"%s:%d",params->hostName,params->port); BIO_set_conn_hostname(sbio, hostnameProto); BIO_set_nbio(sbio, 1); /* non-blocking mode */ while (1) { if (BIO_do_connect(sbio) == 1) { break; /* Connected */ } if (! BIO_should_retry(sbio)) { xerr("BIO_do_connect() failed"); char s[256]; safef(s, sizeof s, "SSL error: %s", ERR_reason_error_string(ERR_get_error())); xerr(s); goto cleanup; } fd = BIO_get_fd(sbio, NULL); if (fd == -1) { xerr("unable to get BIO descriptor"); goto cleanup; } FD_ZERO(&readfds); FD_ZERO(&writefds); if (BIO_should_read(sbio)) { FD_SET(fd, &readfds); } else if (BIO_should_write(sbio)) { FD_SET(fd, &writefds); } else { /* BIO_should_io_special() */ FD_SET(fd, &readfds); FD_SET(fd, &writefds); } tv.tv_sec = (long) (DEFAULTCONNECTTIMEOUTMSEC/1000); // timeout default 10 seconds tv.tv_usec = (long) (((DEFAULTCONNECTTIMEOUTMSEC/1000)-tv.tv_sec)*1000000); err = select(fd + 1, &readfds, &writefds, NULL, &tv); if (err < 0) { xerr("select() error"); goto cleanup; } if (err == 0) { char s[256]; safef(s, sizeof s, "connection timeout to %s", params->hostName); xerr(s); goto cleanup; } } /* TODO checking certificates if (certFile || certPath) if (!check_cert(ssl, host)) return -1; */ /* we need to wait on both the user's socket and the BIO SSL socket * to see if we need to ferry data from one to the other */ char sbuf[32768]; // socket buffer sv[1] to user char bbuf[32768]; // bio buffer int srd = 0; int swt = 0; int brd = 0; int bwt = 0; while (1) { // Do NOT move this outside the while loop. /* Get underlying file descriptor, needed for select call */ fd = BIO_get_fd(sbio, NULL); if (fd == -1) { xerr("BIO doesn't seem to be initialized in https, unable to get descriptor."); goto cleanup; } FD_ZERO(&readfds); FD_ZERO(&writefds); if (brd == 0) FD_SET(fd, &readfds); if (swt < srd) FD_SET(fd, &writefds); if (srd == 0) FD_SET(params->sv[1], &readfds); tv.tv_sec = (long) (DEFAULTCONNECTTIMEOUTMSEC/1000); // timeout default 10 seconds tv.tv_usec = (long) (((DEFAULTCONNECTTIMEOUTMSEC/1000)-tv.tv_sec)*1000000); err = select(max(fd,params->sv[1]) + 1, &readfds, &writefds, NULL, &tv); /* Evaluate select() return code */ if (err < 0) { xerr("error during select()"); goto cleanup; } else if (err == 0) { /* Timed out - just quit */ xerr("https timeout expired"); goto cleanup; } else { if (FD_ISSET(params->sv[1], &readfds)) { swt = 0; srd = read(params->sv[1], sbuf, 32768); if (srd == -1) { if (errno != 104) // udcCache often closes causing "Connection reset by peer" xerrno("error reading https socket"); goto cleanup; } if (srd == 0) break; // user closed socket, we are done } if (FD_ISSET(fd, &writefds)) { int swtx = BIO_write(sbio, sbuf+swt, srd-swt); if (swtx <= 0) { if (!BIO_should_write(sbio)) { ERR_print_errors_fp(stderr); xerr("Error writing SSL connection"); goto cleanup; } } else { swt += swtx; if (swt >= srd) { swt = 0; srd = 0; } } } if (FD_ISSET(fd, &readfds)) { bwt = 0; brd = BIO_read(sbio, bbuf, 32768); if (brd <= 0) { if (BIO_should_read(sbio)) { brd = 0; continue; } else { if (brd == 0) break; ERR_print_errors_fp(stderr); xerr("Error reading SSL connection"); goto cleanup; } } // write the https data received immediately back on socket to user, and it's ok if it blocks. while(bwt < brd) { int bwtx = write(params->sv[1], bbuf+bwt, brd-bwt); if (bwtx == -1) { if ((errno != 104) // udcCache often closes causing "Connection reset by peer" && (errno != 32)) // udcCache often closes causing "Broken pipe" xerrno("error writing https data back to user socket"); goto cleanup; } bwt += bwtx; } brd = 0; bwt = 0; } } } cleanup: BIO_free_all(sbio); close(params->sv[1]); /* we are done with it */ return NULL; } int netConnectHttps(char *hostName, int port) /* Return socket for https connection with server or -1 if error. */ { fflush(stdin); fflush(stdout); fflush(stderr); struct netConnectHttpsParams *params; AllocVar(params); params->hostName = cloneString(hostName); params->port = port; socketpair(AF_UNIX, SOCK_STREAM, 0, params->sv); int rc; rc = pthread_create(¶ms->thread, NULL, netConnectHttpsThread, (void *)params); if (rc) { errAbort("Unexpected error %d from pthread_create(): %s",rc,strerror(rc)); } /* parent */ return params->sv[0]; } #else #include #include "common.h" #include "errAbort.h" int netConnectHttps(char *hostName, int port) /* Start https connection with server or die. */ { errAbort("No openssl available in netConnectHttps for %s : %d", hostName, port); return -1; /* will never get to here, make compiler happy */ } #endif rtracklayer/src/ucsc/https.h0000644000175100017510000000032112612032142017141 0ustar00biocbuildbiocbuild/* Connect via https. */ #ifndef NET_HTTPS_H #define NET_HTTPS_H int netConnectHttps(char *hostName, int port); /* Return socket for https connection with server or -1 if error. */ #endif//ndef NET_HTTPS_H rtracklayer/src/ucsc/internet.c0000644000175100017510000000722712612032142017636 0ustar00biocbuildbiocbuild#ifndef WIN32 /* internet - some stuff to make it easier to use * internet sockets and the like. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "internet.h" boolean internetIsDottedQuad(char *s) /* Returns TRUE if it looks like s is a dotted quad. */ { int i; if (!isdigit(s[0])) return FALSE; for (i=0; i<3; ++i) { s = strchr(s, '.'); if (s == NULL) return FALSE; s += 1; if (!isdigit(s[0])) return FALSE; } return TRUE; } bits32 internetHostIp(char *hostName) /* Get IP v4 address (in host byte order) for hostName. * Warn and return 0 if there's a problem. */ { bits32 ret; if (internetIsDottedQuad(hostName)) { internetDottedQuadToIp(hostName, &ret); } else { /* getaddrinfo is thread-safe and widely supported */ struct addrinfo hints, *res; struct in_addr addr; int err; zeroBytes(&hints, sizeof(hints)); hints.ai_family = AF_INET; if ((err = getaddrinfo(hostName, NULL, &hints, &res)) != 0) { warn("getaddrinfo() error on hostName=%s: %s\n", hostName, gai_strerror(err)); return 0; } addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr; ret = ntohl((uint32_t)addr.s_addr); freeaddrinfo(res); } return ret; } boolean internetFillInAddress(char *hostName, int port, struct sockaddr_in *address) /* Fill in address. Return FALSE if can't. */ { ZeroVar(address); address->sin_family = AF_INET; address->sin_port = htons(port); if (hostName == NULL) address->sin_addr.s_addr = INADDR_ANY; else { if ((address->sin_addr.s_addr = htonl(internetHostIp(hostName))) == 0) return FALSE; } return TRUE; } boolean internetIpToDottedQuad(bits32 ip, char dottedQuad[17]) /* Convert IP4 address in host byte order to dotted quad * notation. Warn and return FALSE if there's a * problem. */ { #ifndef __CYGWIN32__ struct in_addr ia; zeroBytes(dottedQuad, 17); ZeroVar(&ia); ia.s_addr = htonl(ip); if (inet_ntop(AF_INET, &ia, dottedQuad, 16) == NULL) { warn("conversion problem on 0x%x in internetIpToDottedQuad: %s", ip, strerror(errno)); return FALSE; } return TRUE; #else warn("Sorry, internetIpToDottedQuad not supported in Windows."); return FALSE; #endif } boolean internetDottedQuadToIp(char *dottedQuad, bits32 *retIp) /* Convert dotted quad format address to IP4 address in * host byte order. Warn and return FALSE if there's a * problem. */ { #ifndef __CYGWIN32__ struct in_addr ia; if (inet_pton(AF_INET, dottedQuad, &ia) < 0) { warn("internetDottedQuadToIp problem on %s: %s", dottedQuad, strerror(errno)); return FALSE; } *retIp = ntohl(ia.s_addr); return TRUE; #else warn("Sorry, internetDottedQuadToIp not supported in Windows."); return FALSE; #endif } void internetParseDottedQuad(char *dottedQuad, unsigned char quad[4]) /* Parse dotted quads into quad */ { char *s = dottedQuad; int i; if (!internetIsDottedQuad(s)) errAbort("%s is not a dotted quad", s); for (i=0; i<4; ++i) { quad[i] = atoi(s); s = strchr(s, '.') + 1; } } void internetUnpackIp(bits32 packed, unsigned char unpacked[4]) /* Convert from 32 bit to 4-byte format with most significant * byte first. */ { int i; for (i=3; i>=0; --i) { unpacked[i] = (packed&0xff); packed >>= 8; } } boolean internetIpInSubnet(unsigned char unpackedIp[4], unsigned char subnet[4]) /* Return true if unpacked IP address is in subnet. */ { int i; for (i=0; i<4; ++i) { unsigned char c = subnet[i]; if (c == 255) return TRUE; if (c != unpackedIp[i]) return FALSE; } return TRUE; } #endif rtracklayer/src/ucsc/internet.h0000644000175100017510000000271612612032142017641 0ustar00biocbuildbiocbuild/* internet - some stuff for routines that use the internet * and aren't afraid to include some internet specific structures * and the like. See also net for stuff that is higher level. */ #ifndef INTERNET_H #include #include #include #include bits32 internetHostIp(char *hostName); /* Get IP v4 address (in host byte order) for hostName. * Warn and return 0 if there's a problem. */ boolean internetFillInAddress(char *hostName, int port, struct sockaddr_in *address); /* Fill in address. Warn and return FALSE if can't. */ boolean internetIpToDottedQuad(bits32 ip, char dottedQuad[17]); /* Convert IP4 address in host byte order to dotted quad * notation. Warn and return FALSE if there's a * problem. */ boolean internetDottedQuadToIp(char *dottedQuad, bits32 *retIp); /* Convert dotted quad format address to IP4 address in * host byte order. Warn and return FALSE if there's a * problem. */ boolean internetIsDottedQuad(char *s); /* Returns TRUE if it looks like s is a dotted quad. */ void internetParseDottedQuad(char *dottedQuad, unsigned char quad[4]); /* Parse dotted quads into quad */ void internetUnpackIp(bits32 packed, unsigned char unpacked[4]); /* Convert from 32 bit to 4-byte format with most significant * byte first. */ boolean internetIpInSubnet(unsigned char unpackedIp[4], unsigned char subnet[4]); /* Return true if unpacked IP address is in subnet. */ #endif /* INTERNET_H */ rtracklayer/src/ucsc/linefile.c0000644000175100017510000011304512612032142017571 0ustar00biocbuildbiocbuild/* lineFile - stuff to rapidly read text files and parse them into * lines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "hash.h" #include #include #include "dystring.h" #include "errAbort.h" #include "linefile.h" #include "pipeline.h" #include "localmem.h" #include "cheapcgi.h" #include "udc.h" char *getFileNameFromHdrSig(char *m) /* Check if header has signature of supported compression stream, and return a phoney filename for it, or NULL if no sig found. */ { char buf[20]; char *ext=NULL; if (startsWith("\x1f\x8b",m)) ext = "gz"; else if (startsWith("\x1f\x9d\x90",m)) ext = "Z"; else if (startsWith("BZ",m)) ext = "bz2"; else if (startsWith("PK\x03\x04",m)) ext = "zip"; if (ext==NULL) return NULL; safef(buf, sizeof(buf), LF_BOGUS_FILE_PREFIX "%s", ext); return cloneString(buf); } static char **getDecompressor(char *fileName) /* if a file is compressed, return the command to decompress the * approriate format, otherwise return NULL */ { static char *GZ_READ[] = {"gzip", "-dc", NULL}; static char *Z_READ[] = {"gzip", "-dc", NULL}; static char *BZ2_READ[] = {"bzip2", "-dc", NULL}; static char *ZIP_READ[] = {"gzip", "-dc", NULL}; char **result = NULL; char *fileNameDecoded = cloneString(fileName); if (startsWith("http://" , fileName) || startsWith("https://", fileName) || startsWith("ftp://", fileName)) cgiDecode(fileName, fileNameDecoded, strlen(fileName)); if (endsWith(fileNameDecoded, ".gz")) result = GZ_READ; else if (endsWith(fileNameDecoded, ".Z")) result = Z_READ; else if (endsWith(fileNameDecoded, ".bz2")) result = BZ2_READ; else if (endsWith(fileNameDecoded, ".zip")) result = ZIP_READ; freeMem(fileNameDecoded); return result; } static void metaDataAdd(struct lineFile *lf, char *line) /* write a line of metaData to output file * internal function called by lineFileNext */ { struct metaOutput *meta = NULL; if (lf->isMetaUnique) { /* suppress repetition of comments */ if (hashLookup(lf->metaLines, line)) { return; } hashAdd(lf->metaLines, line, NULL); } for (meta = lf->metaOutput ; meta != NULL ; meta = meta->next) if (line != NULL && meta->metaFile != NULL) fprintf(meta->metaFile,"%s\n", line); } static void metaDataFree(struct lineFile *lf) /* free saved comments */ { if (lf->isMetaUnique && lf->metaLines) freeHash(&lf->metaLines); } void lineFileSetMetaDataOutput(struct lineFile *lf, FILE *f) /* set file to write meta data to, * should be called before reading from input file */ { struct metaOutput *meta = NULL; if (lf == NULL) return; AllocVar(meta); meta->next = NULL; meta->metaFile = f; slAddHead(&lf->metaOutput, meta); } void lineFileSetUniqueMetaData(struct lineFile *lf) /* suppress duplicate lines in metadata */ { lf->isMetaUnique = TRUE; lf->metaLines = hashNew(8); } static char * headerBytes(char *fileName, int numbytes) /* Return specified number of header bytes from file * if file exists as a string which should be freed. */ { int fd,bytesread=0; char *result = NULL; if ((fd = open(fileName, O_RDONLY)) >= 0) { result=needMem(numbytes+1); if ((bytesread=read(fd,result,numbytes)) < numbytes) freez(&result); /* file too short? can read numbytes */ else result[numbytes]=0; close(fd); } return result; } #ifndef WIN32 struct lineFile *lineFileDecompress(char *fileName, bool zTerm) /* open a linefile with decompression */ { struct pipeline *pl; struct lineFile *lf; char *testName = NULL; char *testbytes = NULL; /* the header signatures for .gz, .bz2, .Z, * .zip are all 2-4 bytes only */ if (fileName==NULL) return NULL; testbytes=headerBytes(fileName,4); if (!testbytes) return NULL; /* avoid error from pipeline */ testName=getFileNameFromHdrSig(testbytes); freez(&testbytes); if (!testName) return NULL; /* avoid error from pipeline */ pl = pipelineOpen1(getDecompressor(fileName), pipelineRead|pipelineSigpipe, fileName, NULL); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd) /* open a linefile with decompression from a file or socket descriptor */ { struct pipeline *pl; struct lineFile *lf; pl = pipelineOpenFd1(getDecompressor(name), pipelineRead|pipelineSigpipe, fd, STDERR_FILENO); lf = lineFileAttach(name, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } struct lineFile *lineFileDecompressMem(bool zTerm, char *mem, long size) /* open a linefile with decompression from a memory stream */ { struct pipeline *pl; struct lineFile *lf; char *fileName = getFileNameFromHdrSig(mem); if (fileName==NULL) return NULL; pl = pipelineOpenMem1(getDecompressor(fileName), pipelineRead|pipelineSigpipe, mem, size, STDERR_FILENO); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } #endif struct lineFile *lineFileAttach(char *fileName, bool zTerm, int fd) /* Wrap a line file around an open'd file. */ { struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(fileName); lf->fd = fd; lf->bufSize = 64*1024; lf->zTerm = zTerm; lf->buf = needMem(lf->bufSize+1); return lf; } struct lineFile *lineFileOnString(char *name, bool zTerm, char *s) /* Wrap a line file object around string in memory. This buffer * have zeroes written into it and be freed when the line file * is closed. */ { struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(name); lf->fd = -1; lf->bufSize = lf->bytesInBuf = strlen(s); lf->zTerm = zTerm; lf->buf = s; return lf; } #if (defined USE_TABIX && defined KNETFILE_HOOKS && !defined USE_SAMTABIX) // UCSC aliases for backwards compatibility with independently patched & linked samtools and tabix: #define bgzf_tell ti_bgzf_tell #define bgzf_read ti_bgzf_read #endif struct lineFile *lineFileTabixMayOpen(char *fileOrUrl, bool zTerm) /* Wrap a line file around a data file that has been compressed and indexed * by the tabix command line program. The index file .tbi must be * readable in addition to fileOrUrl. If there's a problem, warn & return NULL. * This works only if kent/src has been compiled with USE_TABIX=1 and linked * with the tabix C library. */ { #ifdef USE_TABIX if (fileOrUrl == NULL) errAbort("lineFileTabixMayOpen: fileOrUrl is NULL"); int tbiNameSize = strlen(fileOrUrl) + strlen(".tbi") + 1; char tbiName[tbiNameSize]; safef(tbiName, sizeof(tbiName), "%s.tbi", fileOrUrl); tabix_t *tabix = ti_open(fileOrUrl, tbiName); if (tabix == NULL) { warn("Unable to open \"%s\"", fileOrUrl); return NULL; } if ((tabix->idx = ti_index_load(tbiName)) == NULL) { warn("Unable to load tabix index from \"%s\"", tbiName); ti_close(tabix); tabix = NULL; return NULL; } struct lineFile *lf = needMem(sizeof(struct lineFile)); lf->fileName = cloneString(fileOrUrl); lf->fd = -1; lf->bufSize = 64 * 1024; lf->buf = needMem(lf->bufSize); lf->zTerm = zTerm; lf->tabix = tabix; lf->tabixIter = ti_iter_first(); return lf; #else // no USE_TABIX warn(COMPILE_WITH_TABIX, "lineFileTabixMayOpen"); return NULL; #endif // no USE_TABIX } boolean lineFileSetTabixRegion(struct lineFile *lf, char *seqName, int start, int end) /* Assuming lf was created by lineFileTabixMayOpen, tell tabix to seek to the specified region * and return TRUE (or if there are no items in region, return FALSE). */ { #ifdef USE_TABIX if (lf->tabix == NULL) errAbort("lineFileSetTabixRegion: lf->tabix is NULL. Did you open lf with lineFileTabixMayOpen?"); if (seqName == NULL) return FALSE; int tabixSeqId = ti_get_tid(lf->tabix->idx, seqName); if (tabixSeqId < 0 && startsWith("chr", seqName)) // We will get some files that have chr-less Ensembl chromosome names: tabixSeqId = ti_get_tid(lf->tabix->idx, seqName+strlen("chr")); if (tabixSeqId < 0) return FALSE; ti_iter_t iter = ti_queryi(lf->tabix, tabixSeqId, start, end); if (iter == NULL) return FALSE; if (lf->tabixIter != NULL) ti_iter_destroy(lf->tabixIter); lf->tabixIter = iter; lf->bufOffsetInFile = bgzf_tell(lf->tabix->fp); lf->bytesInBuf = 0; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = 0; return TRUE; #else // no USE_TABIX warn(COMPILE_WITH_TABIX, "lineFileSetTabixRegion"); return FALSE; #endif // no USE_TABIX } struct lineFile *lineFileUdcMayOpen(char *fileOrUrl, bool zTerm) /* Create a line file object with an underlying UDC cache. NULL if not found. */ { if (fileOrUrl == NULL) errAbort("lineFileUdcMayOpen: fileOrUrl is NULL"); struct udcFile *udcFile = udcFileMayOpen(fileOrUrl, NULL); if (udcFile == NULL) return NULL; struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(fileOrUrl); lf->fd = -1; lf->bufSize = 0; lf->buf = NULL; lf->zTerm = zTerm; lf->udcFile = udcFile; return lf; } void lineFileExpandBuf(struct lineFile *lf, int newSize) /* Expand line file buffer. */ { assert(newSize > lf->bufSize); lf->buf = needMoreMem(lf->buf, lf->bytesInBuf, newSize); lf->bufSize = newSize; } struct lineFile *lineFileStdin(bool zTerm) /* Wrap a line file around stdin. */ { return lineFileAttach("stdin", zTerm, fileno(stdin)); } struct lineFile *lineFileMayOpen(char *fileName, bool zTerm) /* Try and open up a lineFile. */ { if (sameString(fileName, "stdin")) return lineFileStdin(zTerm); #ifndef WIN32 else if (getDecompressor(fileName) != NULL) return lineFileDecompress(fileName, zTerm); #endif else { int fd = open(fileName, O_RDONLY); if (fd == -1) return NULL; return lineFileAttach(fileName, zTerm, fd); } } struct lineFile *lineFileOpen(char *fileName, bool zTerm) /* Open up a lineFile or die trying. */ { struct lineFile *lf = lineFileMayOpen(fileName, zTerm); if (lf == NULL) errAbort("Couldn't open %s , %s", fileName, strerror(errno)); return lf; } void lineFileReuse(struct lineFile *lf) /* Reuse current line. */ { lf->reuse = TRUE; } INLINE void noTabixSupport(struct lineFile *lf, char *where) { #ifdef USE_TABIX if (lf->tabix != NULL) lineFileAbort(lf, "%s: not implemented for lineFile opened with lineFileTabixMayOpen.", where); #endif // USE_TABIX } void lineFileSeek(struct lineFile *lf, off_t offset, int whence) /* Seek to read next line from given position. */ { noTabixSupport(lf, "lineFileSeek"); if (lf->checkSupport) lf->checkSupport(lf, "lineFileSeek"); if (lf->pl != NULL) errnoAbort("Can't lineFileSeek on a compressed file: %s", lf->fileName); lf->reuse = FALSE; if (lf->udcFile) { udcSeek(lf->udcFile, offset); return; } lf->lineStart = lf->lineEnd = lf->bytesInBuf = 0; if ((lf->bufOffsetInFile = lseek(lf->fd, offset, whence)) == -1) errnoAbort("Couldn't lineFileSeek %s", lf->fileName); } void lineFileRewind(struct lineFile *lf) /* Return lineFile to start. */ { lineFileSeek(lf, 0, SEEK_SET); lf->lineIx = 0; } int lineFileLongNetRead(int fd, char *buf, int size) /* Keep reading until either get no new characters or * have read size */ { int oneSize, totalRead = 0; while (size > 0) { oneSize = read(fd, buf, size); if (oneSize <= 0) break; totalRead += oneSize; buf += oneSize; size -= oneSize; } return totalRead; } static void determineNlType(struct lineFile *lf, char *buf, int bufSize) /* determine type of newline used for the file, assumes buffer not empty */ { char *c = buf; if (bufSize==0) return; if (lf->nlType != nlt_undet) return; /* if already determined just exit */ lf->nlType = nlt_unix; /* start with default of unix lf type */ while (c < buf+bufSize) { if (*c=='\r') { lf->nlType = nlt_mac; if (++c < buf+bufSize) if (*c == '\n') lf->nlType = nlt_dos; return; } if (*(c++) == '\n') { return; } } } boolean lineFileNext(struct lineFile *lf, char **retStart, int *retSize) /* Fetch next line from file. */ { char *buf = lf->buf; int bytesInBuf = lf->bytesInBuf; int endIx = lf->lineEnd; boolean gotLf = FALSE; int newStart; if (lf->reuse) { lf->reuse = FALSE; if (retSize != NULL) *retSize = lf->lineEnd - lf->lineStart; *retStart = buf + lf->lineStart; if (lf->metaOutput && *retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } if (lf->nextCallBack) return lf->nextCallBack(lf, retStart, retSize); if (lf->udcFile) { lf->bufOffsetInFile = udcTell(lf->udcFile); char *line = udcReadLine(lf->udcFile); if (line==NULL) return FALSE; int lineSize = strlen(line); lf->bytesInBuf = lineSize; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = lineSize; *retStart = line; freeMem(lf->buf); lf->buf = line; lf->bufSize = lineSize; return TRUE; } #ifdef USE_TABIX if (lf->tabix != NULL && lf->tabixIter != NULL) { // Just use line-oriented ti_read: int lineSize = 0; const char *line = ti_read(lf->tabix, lf->tabixIter, &lineSize); if (line == NULL) return FALSE; lf->bufOffsetInFile = -1; lf->bytesInBuf = lineSize; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = lineSize; if (lineSize > lf->bufSize) // shouldn't be! but just in case: lineFileExpandBuf(lf, lineSize * 2); safecpy(lf->buf, lf->bufSize, line); *retStart = lf->buf; if (retSize != NULL) *retSize = lineSize; return TRUE; } #endif // USE_TABIX determineNlType(lf, buf+endIx, bytesInBuf); /* Find next end of line in buffer. */ switch(lf->nlType) { case nlt_unix: case nlt_dos: for (endIx = lf->lineEnd; endIx < bytesInBuf; ++endIx) { if (buf[endIx] == '\n') { gotLf = TRUE; endIx += 1; break; } } break; case nlt_mac: for (endIx = lf->lineEnd; endIx < bytesInBuf; ++endIx) { if (buf[endIx] == '\r') { gotLf = TRUE; endIx += 1; break; } } break; case nlt_undet: break; } /* If not in buffer read in a new buffer's worth. */ while (!gotLf) { int oldEnd = lf->lineEnd; int sizeLeft = bytesInBuf - oldEnd; int bufSize = lf->bufSize; int readSize = bufSize - sizeLeft; if (oldEnd > 0 && sizeLeft > 0) { memmove(buf, buf+oldEnd, sizeLeft); } lf->bufOffsetInFile += oldEnd; if (lf->fd >= 0) readSize = lineFileLongNetRead(lf->fd, buf+sizeLeft, readSize); #ifdef USE_TABIX else if (lf->tabix != NULL && readSize > 0) { readSize = bgzf_read(lf->tabix->fp, buf+sizeLeft, readSize); if (readSize < 1) return FALSE; } #endif // USE_TABIX else readSize = 0; if ((readSize == 0) && (endIx > oldEnd)) { endIx = sizeLeft; buf[endIx] = 0; lf->bytesInBuf = newStart = lf->lineStart = 0; lf->lineEnd = endIx; ++lf->lineIx; if (retSize != NULL) *retSize = endIx - newStart; *retStart = buf + newStart; if (*retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } else if (readSize <= 0) { lf->bytesInBuf = lf->lineStart = lf->lineEnd = 0; return FALSE; } bytesInBuf = lf->bytesInBuf = readSize + sizeLeft; lf->lineEnd = 0; determineNlType(lf, buf+endIx, bytesInBuf); /* Look for next end of line. */ switch(lf->nlType) { case nlt_unix: case nlt_dos: for (endIx = sizeLeft; endIx bufSize) { if (bufSize >= 512*1024*1024) { errAbort("Line too long (more than %d chars) line %d of %s", lf->bufSize, lf->lineIx+1, lf->fileName); } else { lineFileExpandBuf(lf, bufSize*2); buf = lf->buf; } } } if (lf->zTerm) { buf[endIx-1] = 0; if ((lf->nlType == nlt_dos) && (buf[endIx-2]=='\r')) { buf[endIx-2] = 0; } } lf->lineStart = newStart = lf->lineEnd; lf->lineEnd = endIx; ++lf->lineIx; if (retSize != NULL) *retSize = endIx - newStart; *retStart = buf + newStart; if (*retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } void lineFileVaAbort(struct lineFile *lf, char *format, va_list args) /* Print file name, line number, and error message, and abort. */ { struct dyString *dy = dyStringNew(0); dyStringPrintf(dy, "Error line %d of %s: ", lf->lineIx, lf->fileName); dyStringVaPrintf(dy, format, args); errAbort("%s", dy->string); dyStringFree(&dy); } void lineFileAbort(struct lineFile *lf, char *format, ...) /* Print file name, line number, and error message, and abort. */ { va_list args; va_start(args, format); lineFileVaAbort(lf, format, args); va_end(args); } void lineFileUnexpectedEnd(struct lineFile *lf) /* Complain about unexpected end of file. */ { errAbort("Unexpected end of file in %s", lf->fileName); } void lineFileNeedNext(struct lineFile *lf, char **retStart, int *retSize) /* Fetch next line from file. Squawk and die if it's not there. */ { if (!lineFileNext(lf, retStart, retSize)) lineFileUnexpectedEnd(lf); } void lineFileClose(struct lineFile **pLf) /* Close up a line file. */ { struct lineFile *lf; if ((lf = *pLf) != NULL) { #ifndef WIN32 struct pipeline *pl = lf->pl; if (pl != NULL) { pipelineWait(pl); pipelineFree(&lf->pl); } else #endif if (lf->fd > 0 && lf->fd != fileno(stdin)) { close(lf->fd); freeMem(lf->buf); } #ifdef USE_TABIX else if (lf->tabix != NULL) { if (lf->tabixIter != NULL) ti_iter_destroy(lf->tabixIter); ti_close(lf->tabix); } #endif // USE_TABIX else if (lf->udcFile != NULL) udcFileClose(&lf->udcFile); if (lf->closeCallBack) lf->closeCallBack(lf); freeMem(lf->fileName); metaDataFree(lf); freez(pLf); } } void lineFileCloseList(struct lineFile **pList) /* Close up a list of line files. */ { struct lineFile *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; lineFileClose(&el); } *pList = NULL; } void lineFileExpectWords(struct lineFile *lf, int expecting, int got) /* Check line has right number of words. */ { if (expecting != got) errAbort("Expecting %d words line %d of %s got %d", expecting, lf->lineIx, lf->fileName, got); } void lineFileExpectAtLeast(struct lineFile *lf, int expecting, int got) /* Check line has right number of words. */ { if (got < expecting) errAbort("Expecting at least %d words line %d of %s got %d", expecting, lf->lineIx, lf->fileName, got); } void lineFileShort(struct lineFile *lf) /* Complain that line is too short. */ { errAbort("Short line %d of %s", lf->lineIx, lf->fileName); } void lineFileReuseFull(struct lineFile *lf) // Reuse last full line read. Unlike lineFileReuse, // lineFileReuseFull only works with previous lineFileNextFull call { assert(lf->fullLine != NULL); lf->fullLineReuse = TRUE; } boolean lineFileNextFull(struct lineFile *lf, char **retFull, int *retFullSize, char **retRaw, int *retRawSize) // Fetch next line from file joining up any that are continued by ending '\' // If requested, and was joined, the unjoined raw lines are also returned // NOTE: comment lines can't be continued! ("# comment \ \n more comment" is 2 lines.) { // May have requested reusing the last full line. if (lf->fullLineReuse) { lf->fullLineReuse = FALSE; assert(lf->fullLine != NULL); *retFull = dyStringContents(lf->fullLine); if (retFullSize) *retFullSize = dyStringLen(lf->fullLine); if (retRaw != NULL) { assert(lf->rawLines != NULL); *retRaw = dyStringContents(lf->rawLines); if (retRawSize) *retRawSize = dyStringLen(lf->rawLines); } return TRUE; } // Empty pointers *retFull = NULL; if (retRaw != NULL) *retRaw = NULL; // Prepare lf buffers if (lf->fullLine == NULL) { lf->fullLine = dyStringNew(1024); lf->rawLines = dyStringNew(1024); // Better to always create it than test every time } else { dyStringClear(lf->fullLine); dyStringClear(lf->rawLines); } char *line; while (lineFileNext(lf, &line, NULL)) { char *start = skipLeadingSpaces(line); // Will the next line continue this one? char *end = start; if (*start == '#') // Comment lines can't be continued! end = start + strlen(start); else { while (*end != '\0') // walking forward for efficiency (avoid strlens()) { for (;*end != '\0' && *end != '\\'; end++) ; // Tight loop to find '\' if (*end == '\0') break; // This could be a continuation char *slash = end; if (*(++end) == '\\') // escaped continue; end = skipLeadingSpaces(end); if (*end == '\0') // Just whitespace after '\', so true continuation mark { if (retRaw != NULL) // Only if actually requested. { dyStringAppendN(lf->rawLines,line,(end - line)); dyStringAppendC(lf->rawLines,'\n'); // New lines delimit raw lines. } end = slash; // Don't need to zero, because of appending by length break; } } } // Stitch together full lines if (dyStringLen(lf->fullLine) == 0) dyStringAppendN(lf->fullLine,line,(end - line)); // includes first line's whitespace else if (start < end) // don't include continued line's leading spaces dyStringAppendN(lf->fullLine,start,(end - start)); if (*end == '\\') continue; // Got a full line now! *retFull = dyStringContents(lf->fullLine); if (retFullSize) *retFullSize = dyStringLen(lf->fullLine); if (retRaw != NULL && dyStringLen(lf->rawLines) > 0) // Only if actually requested & continued { // This is the final line which doesn't have a continuation char dyStringAppendN(lf->rawLines,line,(end - line)); *retRaw = dyStringContents(lf->rawLines); if (retRawSize) *retRawSize = dyStringLen(lf->rawLines); } return TRUE; } return FALSE; } boolean lineFileNextReal(struct lineFile *lf, char **retStart) /* Fetch next line from file that is not blank and * * does not start with a '#'. */ { char *s, c; while (lineFileNext(lf, retStart, NULL)) { s = skipLeadingSpaces(*retStart); c = s[0]; if (c != 0 && c != '#') return TRUE; } return FALSE; } boolean lineFileNextFullReal(struct lineFile *lf, char **retStart) // Fetch next line from file that is not blank and does not start with a '#'. // Continuation lines (ending in '\') are joined into a single line. { while (lineFileNextFull(lf, retStart, NULL, NULL, NULL)) { char *clippedText = skipLeadingSpaces(*retStart); if (clippedText[0] != '\0' && clippedText[0] != '#') return TRUE; } return FALSE; } int lineFileChopNext(struct lineFile *lf, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words. */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByWhite(line, words, maxWords); if (wordCount != 0) return wordCount; } return 0; } int lineFileChopCharNext(struct lineFile *lf, char sep, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words delimited by sep. */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByChar(line, sep, words, maxWords); if (wordCount != 0) return wordCount; } return 0; } int lineFileChopNextTab(struct lineFile *lf, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words * on tabs */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByChar(line, '\t', words, maxWords); if (wordCount != 0) return wordCount; } return 0; } boolean lineFileNextCharRow(struct lineFile *lf, char sep, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words * delimited by sep. Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopCharNext(lf, sep, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } boolean lineFileNextRow(struct lineFile *lf, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words. * Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopNext(lf, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } boolean lineFileNextRowTab(struct lineFile *lf, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words * at tabs. Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopNextTab(lf, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } int lineFileNeedFullNum(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Require all chars in word to be digits.*/ { char *c; for (c = words[wordIx]; *c; c++) { if (*c == '-' || isdigit(*c)) /* NOTE: embedded '-' will be caught by lineFileNeedNum */ continue; errAbort("Expecting integer field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, words[wordIx]); } return lineFileNeedNum(lf, words, wordIx); } int lineFileNeedNum(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Conversion stops at first non-digit char. */ { char *ascii = words[wordIx]; char c = ascii[0]; if (c != '-' && !isdigit(c)) errAbort("Expecting number field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, ascii); return atoi(ascii); } int lineFileCheckAllIntsNoAbort(char *s, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg, char *errMsg, int errMsgSize) /* Convert string to (signed) integer of the size specified. * Unlike atol assumes all of string is number, no trailing trash allowed. * Returns 0 if conversion possible, and value is returned in 'val' * Otherwise 1 for empty string or trailing chars, and 2 for numeric overflow, * and 3 for (-) sign in unsigned number. * Error messages if any are written into the provided buffer. * Pass NULL val if you only want validation. * Use noNeg if negative values are not allowed despite the type being signed, * returns 4. */ { unsigned long long res = 0, oldRes = 0; boolean isMinus = FALSE; if ((byteCount != 1) && (byteCount != 2) && (byteCount != 4) && (byteCount != 8)) errAbort("Unexpected error: Invalid byte count for integer size in lineFileCheckAllIntsNoAbort, expected 1 2 4 or 8, got %d.", byteCount); unsigned long long limit = 0xFFFFFFFFFFFFFFFFULL >> (8*(8-byteCount)); if (isSigned) limit >>= 1; char *p, *p0 = s; if (*p0 == '-') { if (isSigned) { if (noNeg) { safef(errMsg, errMsgSize, "Negative value not allowed"); return 4; } p0++; ++limit; isMinus = TRUE; } else { safef(errMsg, errMsgSize, "Unsigned %s may not begin with minus sign (-)", typeString); return 3; } } p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; if (res < oldRes) { safef(errMsg, errMsgSize, "%s%s overflowed", isSigned ? "signed ":"", typeString); return 2; } oldRes = res; res += *p - '0'; if (res < oldRes) { safef(errMsg, errMsgSize, "%s%s overflowed", isSigned ? "signed ":"", typeString); return 2; } if (res > limit) { safef(errMsg, errMsgSize, "%s%s overflowed, limit=%s%llu", isSigned ? "signed ":"", typeString, isMinus ? "-" : "", limit); return 2; } oldRes = res; p++; } /* test for invalid character, empty, or just a minus */ if (*p != '\0') { safef(errMsg, errMsgSize, "Trailing characters parsing %s%s", isSigned ? "signed ":"", typeString); return 1; } if (p == p0) { safef(errMsg, errMsgSize, "Empty string parsing %s%s", isSigned ? "signed ":"", typeString); return 1; } if (!val) return 0; // only validation required switch (byteCount) { case 1: if (isSigned) { if (isMinus) *(char *)val = -res; else *(char *)val = res; } else *(unsigned char *)val = res; break; case 2: if (isSigned) { if (isMinus) *(short *)val = -res; else *(short *)val = res; } else *(unsigned short *)val = res; break; case 4: if (isSigned) { if (isMinus) *(int *)val = -res; else *(int *)val = res; } else *(unsigned *)val = res; break; case 8: if (isSigned) { if (isMinus) *(long long *)val = -res; else *(long long *) val =res; } else *(unsigned long long *)val = res; break; } return 0; } void lineFileAllInts(struct lineFile *lf, char *words[], int wordIx, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg) /* Returns long long integer from converting the input string. Aborts on error. */ { char *s = words[wordIx]; char errMsg[256]; int res = lineFileCheckAllIntsNoAbort(s, val, isSigned, byteCount, typeString, noNeg, errMsg, sizeof errMsg); if (res > 0) { errAbort("%s in field %d line %d of %s, got %s", errMsg, wordIx+1, lf->lineIx, lf->fileName, s); } } int lineFileAllIntsArray(struct lineFile *lf, char *words[], int wordIx, void *array, int arraySize, boolean isSigned, int byteCount, char *typeString, boolean noNeg) /* Convert comma separated list of numbers to an array. Pass in * array and max size of array. Aborts on error. Returns number of elements in parsed array. */ { char *s = words[wordIx]; char errMsg[256]; unsigned count = 0; char *cArray = array; for (;;) { char *e; if (s == NULL || s[0] == 0 || count == arraySize) break; e = strchr(s, ','); if (e) *e = 0; int res = lineFileCheckAllIntsNoAbort(s, cArray, isSigned, byteCount, typeString, noNeg, errMsg, sizeof errMsg); if (res > 0) { errAbort("%s in column %d of array field %d line %d of %s, got %s", errMsg, count, wordIx+1, lf->lineIx, lf->fileName, s); } if (cArray) // NULL means validation only. cArray += byteCount; count++; if (e) // restore input string *e++ = ','; s = e; } return count; } double lineFileNeedDouble(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii double value, and return * binary representation of it. */ { char *valEnd; char *val = words[wordIx]; double doubleValue; doubleValue = strtod(val, &valEnd); if ((*val == '\0') || (*valEnd != '\0')) errAbort("Expecting double field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, val); return doubleValue; } void lineFileSkip(struct lineFile *lf, int lineCount) /* Skip a number of lines. */ { int i, lineSize; char *line; for (i=0; ifileName); } } char *lineFileSkipToLineStartingWith(struct lineFile *lf, char *start, int maxCount) /* Skip to next line that starts with given string. Return NULL * if no such line found, otherwise return the line. */ { char *line; while (lineFileNext(lf, &line, NULL) && --maxCount >= 0) { if (startsWith(start, line)) return line; } return NULL; } char *lineFileReadAll(struct lineFile *lf) /* Read remainder of lineFile and return it as a string. */ { struct dyString *dy = dyStringNew(1024*4); lf->zTerm = 0; int size; char *line; while (lineFileNext(lf, &line, &size)) dyStringAppendN(dy, line, size); return dyStringCannibalize(&dy); } boolean lineFileParseHttpHeader(struct lineFile *lf, char **hdr, boolean *chunked, int *contentLength) /* Extract HTTP response header from lf into hdr, tell if it's * "Transfer-Encoding: chunked" or if it has a contentLength. */ { struct dyString *header = newDyString(1024); char *line; int lineSize; if (chunked != NULL) *chunked = FALSE; if (contentLength != NULL) *contentLength = -1; dyStringClear(header); if (lineFileNext(lf, &line, &lineSize)) { if (startsWith("HTTP/", line)) { char *version, *code; dyStringAppendN(header, line, lineSize-1); dyStringAppendC(header, '\n'); version = nextWord(&line); code = nextWord(&line); if (code == NULL) { warn("%s: Expecting HTTP/ header line, got this: %s\n", lf->fileName, header->string); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } if (!sameString(code, "200")) { warn("%s: Errored HTTP response header: %s %s %s\n", lf->fileName, version, code, line); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } while (lineFileNext(lf, &line, &lineSize)) { /* blank line means end of HTTP header */ if ((line[0] == '\r' && line[1] == 0) || line[0] == 0) break; if (strstr(line, "Transfer-Encoding: chunked") && chunked != NULL) *chunked = TRUE; dyStringAppendN(header, line, lineSize-1); dyStringAppendC(header, '\n'); if (strstr(line, "Content-Length:")) { code = nextWord(&line); code = nextWord(&line); if (contentLength != NULL) *contentLength = atoi(code); } } } else { /* put the line back, don't put it in header/hdr */ lineFileReuse(lf); warn("%s: Expecting HTTP/ header line, got this: %s\n", lf->fileName, header->string); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } } else { *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } *hdr = cloneString(header->string); dyStringFree(&header); return TRUE; } /* lineFileParseHttpHeader */ struct dyString *lineFileSlurpHttpBody(struct lineFile *lf, boolean chunked, int contentLength) /* Return a dyString that contains the http response body in lf. Handle * chunk-encoding and content-length. */ { struct dyString *body = newDyString(64*1024); char *line; int lineSize; dyStringClear(body); if (chunked) { /* Handle "Transfer-Encoding: chunked" body */ /* Procedure from RFC2068 section 19.4.6 */ char *csword; unsigned chunkSize = 0; unsigned size; do { /* Read line that has chunk size (in hex) as first word. */ if (lineFileNext(lf, &line, NULL)) csword = nextWord(&line); else break; if (sscanf(csword, "%x", &chunkSize) < 1) { warn("%s: chunked transfer-encoding chunk size parse error.\n", lf->fileName); break; } /* If chunk size is 0, read in a blank line & then we're done. */ if (chunkSize == 0) { lineFileNext(lf, &line, NULL); if (line == NULL || (line[0] != '\r' && line[0] != 0)) warn("%s: chunked transfer-encoding: expected blank line, got %s\n", lf->fileName, line); break; } /* Read (and save) lines until we have read in chunk. */ for (size = 0; size < chunkSize; size += lineSize) { if (! lineFileNext(lf, &line, &lineSize)) break; dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } /* Read blank line - or extra CRLF inserted in the middle of the * current line, in which case we need to trim it. */ if (size > chunkSize) { body->stringSize -= (size - chunkSize); body->string[body->stringSize] = 0; } else if (size == chunkSize) { lineFileNext(lf, &line, NULL); if (line == NULL || (line[0] != '\r' && line[0] != 0)) warn("%s: chunked transfer-encoding: expected blank line, got %s\n", lf->fileName, line); } } while (chunkSize > 0); /* Try to read in next line. If it's an HTTP header, put it back. */ /* If there is a next line but it's not an HTTP header, it's a footer. */ if (lineFileNext(lf, &line, NULL)) { if (startsWith("HTTP/", line)) lineFileReuse(lf); else { /* Got a footer -- keep reading until blank line */ warn("%s: chunked transfer-encoding: got footer %s, discarding it.\n", lf->fileName, line); while (lineFileNext(lf, &line, NULL)) { if ((line[0] == '\r' && line[1] == 0) || line[0] == 0) break; warn("discarding footer line: %s\n", line); } } } } else if (contentLength >= 0) { /* Read in known length */ int size; for (size = 0; size < contentLength; size += lineSize) { if (! lineFileNext(lf, &line, &lineSize)) break; dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } } else { /* Read in to end of file (assume it's not a persistent connection) */ while (lineFileNext(lf, &line, &lineSize)) { dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } } return(body); } /* lineFileSlurpHttpBody */ void lineFileRemoveInitialCustomTrackLines(struct lineFile *lf) /* remove initial browser and track lines */ { char *line; while (lineFileNextReal(lf, &line)) { if (!(startsWith("browser", line) || startsWith("track", line) )) { verbose(2, "found line not browser or track: %s\n", line); lineFileReuse(lf); break; } verbose(2, "skipping %s\n", line); } } rtracklayer/src/ucsc/linefile.h0000644000175100017510000003062212612032142017575 0ustar00biocbuildbiocbuild/* lineFile - stuff to rapidly read text files and parse them into * lines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef LINEFILE_H #define LINEFILE_H #include "dystring.h" #include "udc.h" #ifdef USE_TABIX #include "tabix.h" #endif #define LF_BOGUS_FILE_PREFIX "somefile." enum nlType { nlt_undet, /* undetermined */ nlt_unix, /* lf */ nlt_dos, /* crlf */ nlt_mac /* cr */ }; struct metaOutput /* struct to store list of file handles to output meta data to * meta data is text after # */ { struct metaOutput *next; /* next file handle */ FILE *metaFile; /* file to write metadata to */ }; struct lineFile /* Structure to handle fast, line oriented * fileIo. */ { struct lineFile *next; /* Might need to be on a list. */ char *fileName; /* Name of file. */ int fd; /* File handle. -1 for 'memory' files. */ int bufSize; /* Size of buffer. */ off_t bufOffsetInFile; /* Offset in file of first buffer byte. */ int bytesInBuf; /* Bytes read into buffer. */ int reserved; /* Reserved (zero for now). */ int lineIx; /* Current line. */ int lineStart; /* Offset of line in buffer. */ int lineEnd; /* End of line in buffer. */ bool zTerm; /* Replace '\n' with zero? */ enum nlType nlType; /* type of line endings: dos, unix, mac or undet */ bool reuse; /* Set if reusing input. */ char *buf; /* Buffer. */ struct pipeline *pl; /* pipeline if reading compressed */ struct metaOutput *metaOutput; /* list of FILE handles to write metaData to */ bool isMetaUnique; /* if set, do not repeat comments in output */ struct hash *metaLines; /* save lines to suppress repetition */ #ifdef USE_TABIX tabix_t *tabix; /* A tabix-compressed file and its binary index file (.tbi) */ ti_iter_t tabixIter; /* An iterator to get decompressed indexed lines of text */ #endif struct udcFile *udcFile; /* udc file if using caching */ struct dyString *fullLine; // Filled with full line when a lineFileNextFull is called struct dyString *rawLines; // Filled with raw lines used to create the full line boolean fullLineReuse; // If TRUE, next call to lineFileNextFull will get // already built fullLine void *dataForCallBack; // ptr to data needed for callbacks void(*checkSupport)(struct lineFile *lf, char *where); // check if operation supported boolean(*nextCallBack)(struct lineFile *lf, char **retStart, int *retSize); // next line callback void(*closeCallBack)(struct lineFile *lf); // close callback }; char *getFileNameFromHdrSig(char *m); /* Check if header has signature of supported compression stream, and return a phoney filename for it, or NULL if no sig found. */ struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd); /* open a linefile with decompression from a file or socket descriptor */ struct lineFile *lineFileDecompressMem(bool zTerm, char *mem, long size); /* open a linefile with decompression from a memory stream */ struct lineFile *lineFileMayOpen(char *fileName, bool zTerm); /* Try and open up a lineFile. If fileName ends in .gz, .Z, or .bz2, * it will be read from a decompress pipeline. */ struct lineFile *lineFileUdcMayOpen(char *fileName, bool zTerm); /* Open a lineFile through the UDC */ struct lineFile *lineFileOpen(char *fileName, bool zTerm); /* Open up a lineFile or die trying If fileName ends in .gz, .Z, or .bz2, * it will be read from a decompress pipeline.. */ struct lineFile *lineFileAttach(char *fileName, bool zTerm, int fd); /* Wrap a line file around an open'd file. */ struct lineFile *lineFileStdin(bool zTerm); /* Wrap a line file around stdin. */ struct lineFile *lineFileOnString(char *name, bool zTerm, char *s); /* Wrap a line file object around string in memory. This buffer * have zeroes written into it if zTerm is non-zero. It will * be freed when the line file is closed. */ struct lineFile *lineFileOnBigBed(char *bigBedFileName); /* Wrap a line file object around a BigBed. */ void lineFileClose(struct lineFile **pLf); /* Close up a line file. */ void lineFileCloseList(struct lineFile **pList); /* Close up a list of line files. */ boolean lineFileNext(struct lineFile *lf, char **retStart, int *retSize); /* Fetch next line from file. */ boolean lineFileNextFull(struct lineFile *lf, char **retFull, int *retFullSize, char **retRaw, int *retRawSize); // Fetch next line from file joining up any that are continued by ending '\' // If requested, and was joined, the unjoined raw lines are also returned // NOTE: comment lines can't be continued! ("# comment \ \n more comment" is 2 lines.) boolean lineFileNextReal(struct lineFile *lf, char **retStart); /* Fetch next line from file that is not blank and * does not start with a '#'. */ boolean lineFileNextFullReal(struct lineFile *lf, char **retStart); // Fetch next line from file that is not blank and does not start with a '#'. // Continuation lines (ending in '\') are joined into a single line. void lineFileNeedNext(struct lineFile *lf, char **retStart, int *retSize); /* Fetch next line from file. Squawk and die if it's not there. */ void lineFileReuse(struct lineFile *lf); /* Reuse current line. */ void lineFileReuseFull(struct lineFile *lf); // Reuse last full line read. Unlike lineFileReuse, // lineFileReuseFull only works with previous lineFileNextFull call #define lineFileString(lf) ((lf)->buf + (lf)->lineStart) /* Current string in line file. */ #define lineFileTell(lf) ((lf)->bufOffsetInFile + (lf)->lineStart) /* Current offset (of string start) in file. */ void lineFileSeek(struct lineFile *lf, off_t offset, int whence); /* Seek to read next line from given position. */ void lineFileRewind(struct lineFile *lf); /* Return lineFile to start. */ void lineFileAbort(struct lineFile *lf, char *format, ...) /* Print file name, line number, and error message, and abort. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void lineFileVaAbort(struct lineFile *lf, char *format, va_list args); /* Print file name, line number, and error message, and abort. */ void lineFileUnexpectedEnd(struct lineFile *lf); /* Complain about unexpected end of file. */ void lineFileExpectWords(struct lineFile *lf, int expecting, int got); /* Check line has right number of words. */ void lineFileExpectAtLeast(struct lineFile *lf, int expecting, int got); /* Check line has right number of words. */ void lineFileShort(struct lineFile *lf); /* Complain that line is too short. */ boolean lineFileNextRow(struct lineFile *lf, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words. * Returns FALSE at EOF. Aborts on error. */ #define lineFileRow(lf, words) lineFileNextRow(lf, words, ArraySize(words)) /* Read in line chopped into fixed size word array. */ boolean lineFileNextCharRow(struct lineFile *lf, char sep, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words * delimited by sep. Returns FALSE at EOF. Aborts on error. */ boolean lineFileNextRowTab(struct lineFile *lf, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words * at tabs. Returns FALSE at EOF. Aborts on error. */ #define lineFileRowTab(lf, words) \ lineFileNextRowTab(lf, words, ArraySize(words)) /* Read in line chopped by tab into fixed size word array. */ int lineFileChopNext(struct lineFile *lf, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words. */ #define lineFileChop(lf, words) lineFileChopNext(lf, words, ArraySize(words)) /* Ease-of-usef macro for lineFileChopNext above. */ int lineFileChopCharNext(struct lineFile *lf, char sep, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words delimited by sep. */ int lineFileChopNextTab(struct lineFile *lf, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words * on tabs */ #define lineFileChopTab(lf, words) lineFileChopNextTab(lf, words, ArraySize(words)) /* Ease-of-usef macro for lineFileChopNext above. */ int lineFileCheckAllIntsNoAbort(char *s, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg, char *errMsg, int errMsgSize); /* Convert string to (signed) integer of the size specified. * Unlike atol assumes all of string is number, no trailing trash allowed. * Returns 0 if conversion possible, and value is returned in 'val' * Otherwise 1 for empty string or trailing chars, and 2 for numeric overflow, * and 3 for (-) sign in unsigned number. * Error messages if any are written into the provided buffer. * Pass NULL val if you only want validation. * Use noNeg if negative values are not allowed despite the type being signed, * returns 4. */ void lineFileAllInts(struct lineFile *lf, char *words[], int wordIx, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg); /* Returns long long integer from converting the input string. Aborts on error. */ int lineFileAllIntsArray(struct lineFile *lf, char *words[], int wordIx, void *array, int arraySize, boolean isSigned, int byteCount, char *typeString, boolean noNeg); /* Convert comma separated list of numbers to an array. Pass in * array and max size of array. Aborts on error. Returns number of elements in parsed array. */ int lineFileNeedNum(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. */ int lineFileNeedFullNum(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Require all chars in word to be digits.*/ double lineFileNeedDouble(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii double value, and return * binary representation of it. */ void lineFileSkip(struct lineFile *lf, int lineCount); /* Skip a number of lines. */ char *lineFileSkipToLineStartingWith(struct lineFile *lf, char *start, int maxCount); /* Skip to next line that starts with given string. Return NULL * if no such line found, otherwise return the line. */ char *lineFileReadAll(struct lineFile *lf); /* Read remainder of lineFile and return it as a string. */ boolean lineFileParseHttpHeader(struct lineFile *lf, char **hdr, boolean *chunked, int *contentLength); /* Extract HTTP response header from lf into hdr, tell if it's * "Transfer-Encoding: chunked" or if it has a contentLength. */ struct dyString *lineFileSlurpHttpBody(struct lineFile *lf, boolean chunked, int contentLength); /* Return a dyString that contains the http response body in lf. Handle * chunk-encoding and content-length. */ void lineFileSetMetaDataOutput(struct lineFile *lf, FILE *f); /* set file to write meta data to, * should be called before reading from input file */ void lineFileSetUniqueMetaData(struct lineFile *lf); /* suppress duplicate lines in metadata */ void lineFileExpandBuf(struct lineFile *lf, int newSize); /* Expand line file buffer. */ void lineFileRemoveInitialCustomTrackLines(struct lineFile *lf); /* remove initial browser and track lines */ /*----- Optionally-compiled wrapper on tabix (compression + indexing): -----*/ #define COMPILE_WITH_TABIX "%s: Sorry, this functionality is available only when\n" \ "you have installed the tabix library from\n" \ "http://samtools.sourceforge.net/ and rebuilt kent/src with USE_TABIX=1\n" \ "(see http://genomewiki.ucsc.edu/index.php/Build_Environment_Variables)." struct lineFile *lineFileTabixMayOpen(char *fileOrUrl, bool zTerm); /* Wrap a line file around a data file that has been compressed and indexed * by the tabix command line program. The index file .tbi must be * readable in addition to fileName. If there's a problem, warn & return NULL. * This works only if kent/src has been compiled with USE_TABIX=1 and linked * with the tabix C library. */ boolean lineFileSetTabixRegion(struct lineFile *lf, char *seqName, int start, int end); /* Assuming lf was created by lineFileTabixMayOpen, tell tabix to seek to the specified region * and return TRUE (or if there are no items in region, return FALSE). */ #endif /* LINEFILE_H */ rtracklayer/src/ucsc/localmem.c0000644000175100017510000001117312612032142017572 0ustar00biocbuildbiocbuild/* LocalMem.c - local memory routines. * * These routines are meant for the sort of scenario where * a lot of little to medium size pieces of memory are * allocated, and then disposed of all at once. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "localmem.h" struct lm { struct lmBlock *blocks; size_t blockSize; size_t allignMask; size_t allignAdd; }; struct lmBlock { struct lmBlock *next; char *free; char *end; char *extra; }; static struct lmBlock *newBlock(struct lm *lm, size_t reqSize) /* Allocate a new block of at least reqSize */ { size_t size = (reqSize > lm->blockSize ? reqSize : lm->blockSize); size_t fullSize = size + sizeof(struct lmBlock); struct lmBlock *mb = needLargeZeroedMem(fullSize); if (mb == NULL) errAbort("Couldn't allocate %lld bytes", (long long)fullSize); mb->free = (char *)(mb+1); mb->end = ((char *)mb) + fullSize; mb->next = lm->blocks; lm->blocks = mb; return mb; } struct lm *lmInit(int blockSize) /* Create a local memory pool. */ { struct lm *lm; int aliSize = sizeof(long); if (aliSize < sizeof(double)) aliSize = sizeof(double); if (aliSize < sizeof(void *)) aliSize = sizeof(void *); lm = needMem(sizeof(*lm)); lm->blocks = NULL; if (blockSize <= 0) blockSize = (1<<14); /* 16k default. */ lm->blockSize = blockSize; lm->allignAdd = (aliSize-1); lm->allignMask = ~lm->allignAdd; newBlock(lm, blockSize); return lm; } void lmCleanup(struct lm **pLm) /* Clean up a local memory pool. */ { struct lm *lm = *pLm; if (lm == NULL) return; slFreeList(&lm->blocks); freeMem(lm); *pLm = NULL; } size_t lmAvailable(struct lm *lm) // Returns currently available memory in pool { struct lmBlock *mb = lm->blocks; return (mb->end - mb->free); } size_t lmSize(struct lm *lm) // Returns current size of pool, even for memory already allocated { size_t fullSize = 0; struct lmBlock *mb = lm->blocks; for (;mb != NULL;mb = mb->next) fullSize += (mb->end - (char *)(mb+1)); return fullSize; } void *lmAlloc(struct lm *lm, size_t size) /* Allocate memory from local pool. */ { struct lmBlock *mb = lm->blocks; void *ret; size_t memLeft = mb->end - mb->free; if (memLeft < size) mb = newBlock(lm, size); ret = mb->free; mb->free += ((size+lm->allignAdd)&lm->allignMask); if (mb->free > mb->end) mb->free = mb->end; return ret; } void *lmAllocMoreMem(struct lm *lm, void *pt, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If block is grown, * new memory is zeroed. */ { struct lmBlock *mb = lm->blocks; // rare case that pointer is to last lm alloc, but still try. // Note this is the one place where the pointer gets reused and it is known to be in this lm if ((char *)pt + oldSize == mb->free && (char *)pt + newSize <= mb->end) { if (newSize > oldSize) // only move the free pointer on more mem mb->free = pt + newSize; return pt; } void *new = lmAlloc(lm, newSize); memcpy(new, pt, oldSize); return new; } void *lmCloneMem(struct lm *lm, void *pt, size_t size) /* Return a local mem copy of memory block. */ { void *d = lmAlloc(lm, size); memcpy(d, pt, size); return d; } char *lmCloneStringZ(struct lm *lm, char *string, int size) /* Return local mem copy of string. */ { if (string == NULL) return NULL; else { char *s = lmAlloc(lm, size+1); memcpy(s, string, size); return s; } } char *lmCloneString(struct lm *lm, char *string) /* Return local mem copy of string. */ { if (string == NULL) return NULL; else return lmCloneStringZ(lm, string, strlen(string)); } char *lmCloneFirstWord(struct lm *lm, char *line) /* Clone first word in line */ { char *startFirstWord = skipLeadingSpaces(line); if (startFirstWord == NULL) return NULL; char *endFirstWord = skipToSpaces(startFirstWord); if (endFirstWord == NULL) return lmCloneString(lm, startFirstWord); else return lmCloneStringZ(lm, startFirstWord, endFirstWord - startFirstWord); } char *lmCloneSomeWord(struct lm *lm, char *line, int wordIx) /* Return a clone of the given space-delimited word within line. Returns NULL if * not that many words in line. */ { if (wordIx < 0) return NULL; int i; for (i=0; iname, name); return n; } rtracklayer/src/ucsc/localmem.h0000644000175100017510000000436012612032142017577 0ustar00biocbuildbiocbuild/* LocalMem.h - local memory routines. * * These routines are meant for the sort of scenario where * a lot of little to medium size pieces of memory are * allocated, and then disposed of all at once. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef LOCALMEM_H #define LOCALMEM_H struct lm *lmInit(int blockSize); /* Create a local memory pool. Parameters are: * blockSize - how much system memory to allocate at a time. Can * pass in zero and a reasonable default will be used. */ void lmCleanup(struct lm **pLm); /* Clean up a local memory pool. */ size_t lmAvailable(struct lm *lm); // Returns currently available memory in pool size_t lmSize(struct lm *lm); // Returns current size of pool, even for memory already allocated void *lmAlloc(struct lm *lm, size_t size); /* Allocate memory from local pool. */ void *lmAllocMoreMem(struct lm *lm, void *pt, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If block is grown, * new memory is zeroed. NOTE: in RARE cases, same pointer may be returned. */ void *lmCloneMem(struct lm *lm, void *pt, size_t size); /* Return a local mem copy of memory block. */ char *lmCloneStringZ(struct lm *lm, char *string, int size); /* Return local mem copy of string of given size, adding null terminator. */ char *lmCloneString(struct lm *lm, char *string); /* Return local mem copy of string. */ char *lmCloneFirstWord(struct lm *lm, char *line); /* Clone first word in line */ char *lmCloneSomeWord(struct lm *lm, char *line, int wordIx); /* Return a clone of the given space-delimited word within line. Returns NULL if * not that many words in line. */ struct slName *lmSlName(struct lm *lm, char *name); /* Return slName in memory. */ #define lmAllocVar(lm, pt) (pt = lmAlloc(lm, sizeof(*pt))); /* Shortcut to allocating a single variable in local mem and * assigning pointer to it. */ #define lmCloneVar(lm, pt) lmCloneMem(lm, pt, sizeof((pt)[0])) /* Allocate copy of a structure. */ #define lmAllocArray(lm, pt, size) (pt = lmAlloc(lm, sizeof(*pt) * (size))) /* Shortcut to allocating an array in local mem and * assigning pointer to it. */ #endif//ndef LOCALMEM_H rtracklayer/src/ucsc/memalloc.c0000644000175100017510000003376612612032142017606 0ustar00biocbuildbiocbuild/* memalloc.c - Routines to allocate and deallocate dynamic memory. * This lets you have a stack of memory handlers. The default * memory handler is a thin shell around malloc/free. You can * substitute routines that do more integrety checking with * pushCarefulMem(), or routines of your own devising with * pushMemHandler(). * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include #include "common.h" #include "obscure.h" #include "memalloc.h" #include "dlist.h" static void *defaultAlloc(size_t size) /* Default allocator. */ { return malloc(size); } static void defaultFree(void *vpt) /* Default deallocator. */ { free(vpt); } static void *defaultRealloc(void *vpt, size_t size) /* Default deallocator. */ { return realloc(vpt, size); } static struct memHandler defaultMemHandler = /* Default memory handler. */ { NULL, defaultAlloc, defaultFree, defaultRealloc, }; static struct memHandler *mhStack = &defaultMemHandler; struct memHandler *pushMemHandler(struct memHandler *newHandler) /* Use newHandler for memory requests until matching popMemHandler. * Returns previous top of memory handler stack. */ { struct memHandler *oldHandler = mhStack; slAddHead(&mhStack, newHandler); return oldHandler; } struct memHandler *popMemHandler() /* Removes top element from memHandler stack and returns it. */ { struct memHandler *oldHandler = mhStack; if (mhStack == &defaultMemHandler) errAbort("Too many popMemHandlers()"); mhStack = mhStack->next; return oldHandler; } void setDefaultMemHandler() /* Sets memHandler to the default. */ { mhStack = &defaultMemHandler; } /* 128*8*1024*1024 == 1073741824 == 2^30 on 32 bit machines,size_t == 4 bytes*/ /* on 64 bit machines, size_t = 8 bytes, 2^30 * 2 * 2 * 2 * 2 = 2^34 == 16 Gb */ static size_t maxAlloc = (size_t)128*8*1024*1024*(sizeof(size_t)/4)*(sizeof(size_t)/4)*(sizeof(size_t)/4*(sizeof(size_t)/4)); void setMaxAlloc(size_t s) /* Set large allocation limit. */ { maxAlloc = s; } void *needLargeMem(size_t size) /* This calls abort if the memory allocation fails. The memory is * not initialized to zero. */ { void *pt; if (size == 0 || size >= maxAlloc) errAbort("needLargeMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)maxAlloc); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needLargeMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needLargeZeroedMem(size_t size) /* Request a large block of memory and zero it. */ { void *v; v = needLargeMem(size); memset(v, 0, size); return v; } void *needLargeMemResize(void* vp, size_t size) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. Memory not initted. */ { void *pt; if (size == 0 || size >= maxAlloc) errAbort("needLargeMemResize: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)maxAlloc); if ((pt = mhStack->realloc(vp, size)) == NULL) errAbort("needLargeMemResize: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needLargeZeroedMemResize(void* vp, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. If block is grown, new memory is zeroed. */ { void *v = needLargeMemResize(vp, newSize); if (newSize > oldSize) memset(((char*)v)+oldSize, 0, newSize-oldSize); return v; } void *needHugeMem(size_t size) /* No checking on size. Memory not initted. */ { void *pt; if (size == 0) errAbort("needHugeMem: trying to allocate 0 bytes"); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needHugeMem: Out of huge memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needHugeZeroedMem(size_t size) /* Request a large block of memory and zero it. */ { void *v; v = needHugeMem(size); memset(v, 0, size); return v; } void *needHugeMemResize(void* vp, size_t size) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. No checking on size. Memory not * initted. */ { void *pt; if ((pt = mhStack->realloc(vp, size)) == NULL) errAbort("needHugeMemResize: Out of memory - request resize %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needHugeZeroedMemResize(void* vp, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ { void *v; v = needHugeMemResize(vp, newSize); if (newSize > oldSize) memset(((char*)v)+oldSize, 0, newSize-oldSize); return v; } #define NEEDMEM_LIMIT 500000000 void *needMem(size_t size) /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ { void *pt; if (size == 0 || size > NEEDMEM_LIMIT) errAbort("needMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)NEEDMEM_LIMIT); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); memset(pt, 0, size); return pt; } void *needMoreMem(void *old, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ { return needLargeZeroedMemResize(old, oldSize, newSize); } void *wantMem(size_t size) /* Want mem just calls malloc - no zeroing of memory, no * aborting if request fails. */ { return mhStack->alloc(size); } void freeMem(void *pt) /* Free memory will check for null before freeing. */ { if (pt != NULL) mhStack->free(pt); } void freez(void *vpt) /* Pass address of pointer. Will free pointer and set it * to NULL. */ { void **ppt = (void **)vpt; void *pt = *ppt; *ppt = NULL; freeMem(pt); } static pthread_mutex_t carefulMutex = PTHREAD_MUTEX_INITIALIZER; static int carefulAlignSize; /* Alignment size for machine - 8 bytes for DEC alpha, 4 for Sparc. */ static int carefulAlignAdd; /* Do aliSize = *(unaliSize+carefulAlignAdd)&carefulAlignMask); */ #if __WORDSIZE == 64 static bits64 carefulAlignMask; /* to make sure requests are aligned. */ #elif __WORDSIZE == 32 static bits32 carefulAlignMask; /* to make sure requests are aligned. */ #else static bits32 carefulAlignMask; /* to make sure requests are aligned. */ #endif static struct memHandler *carefulParent; static size_t carefulMaxToAlloc; static size_t carefulAlloced; struct carefulMemBlock /* Keep one of these for each outstanding memory block. It's a doubly linked list. */ { struct carefulMemBlock *next; struct carefulMemBlock *prev; int size; int startCookie; }; int cmbStartCookie = 0x78753421; char cmbEndCookie[4] = {0x44, 0x33, 0x7F, 0x42}; struct dlList *cmbAllocedList; static void carefulMemInit(size_t maxToAlloc) /* Initialize careful memory system */ { carefulMaxToAlloc = maxToAlloc; cmbAllocedList = newDlList(); carefulAlignSize = sizeof(double); if (sizeof(void *) > carefulAlignSize) carefulAlignSize = sizeof(void *); if (sizeof(long) > carefulAlignSize) carefulAlignSize = sizeof(long); if (sizeof(off_t) > carefulAlignSize) carefulAlignSize = sizeof(off_t); if (sizeof(long long) > carefulAlignSize) carefulAlignSize = sizeof(long long); carefulAlignAdd = carefulAlignSize-1; carefulAlignMask = ~carefulAlignAdd; } static void *carefulAlloc(size_t size) /* Allocate extra memory for cookies and list node, and then * return memory block. */ { pthread_mutex_lock( &carefulMutex ); struct carefulMemBlock *cmb; char *pEndCookie; size_t newAlloced = size + carefulAlloced; size_t aliSize; if (newAlloced > carefulMaxToAlloc) { char maxAlloc[32]; char allocRequest[32]; sprintLongWithCommas(maxAlloc, (long long)carefulMaxToAlloc); sprintLongWithCommas(allocRequest, (long long)newAlloced); pthread_mutex_unlock( &carefulMutex ); errAbort("carefulAlloc: Allocated too much memory - more than %s bytes (%s)", maxAlloc, allocRequest); } carefulAlloced = newAlloced; aliSize = ((size + sizeof(*cmb) + 4 + carefulAlignAdd)&carefulAlignMask); cmb = carefulParent->alloc(aliSize); cmb->size = size; cmb->startCookie = cmbStartCookie; pEndCookie = (char *)(cmb+1); pEndCookie += size; memcpy(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)); dlAddHead(cmbAllocedList, (struct dlNode *)cmb); pthread_mutex_unlock( &carefulMutex ); return (void *)(cmb+1); } static void carefulFree(void *vpt) /* Check cookies and free. */ { pthread_mutex_lock( &carefulMutex ); struct carefulMemBlock *cmb = ((struct carefulMemBlock *)vpt)-1; size_t size = cmb->size; char *pEndCookie; carefulAlloced -= size; pEndCookie = (((char *)(cmb+1)) + size); if (cmb->startCookie != cmbStartCookie) { pthread_mutex_unlock( &carefulMutex ); errAbort("Bad start cookie %x freeing %llx\n", cmb->startCookie, ptrToLL(vpt)); } if (memcmp(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)) != 0) { pthread_mutex_unlock( &carefulMutex ); errAbort("Bad end cookie %x%x%x%x freeing %llx\n", pEndCookie[0], pEndCookie[1], pEndCookie[2], pEndCookie[3], ptrToLL(vpt)); } dlRemove((struct dlNode *)cmb); carefulParent->free(cmb); pthread_mutex_unlock( &carefulMutex ); } static void *carefulRealloc(void *vpt, size_t size) /* realloc a careful memblock block. */ { unsigned char* newBlk = carefulAlloc(size); if (vpt != NULL) { struct carefulMemBlock *cmb = ((struct carefulMemBlock *)vpt)-1; memcpy(newBlk, vpt, cmb->size); carefulFree(vpt); } return newBlk; } void carefulCheckHeap() /* Walk through allocated memory and make sure that all cookies are * in place. */ { int maxPieces = 10000000; /* Assume no more than this many pieces allocated. */ struct carefulMemBlock *cmb; char *pEndCookie; size_t size; char errMsg[1024]; boolean errFound = FALSE; if (carefulParent == NULL) return; pthread_mutex_lock( &carefulMutex ); for (cmb = (struct carefulMemBlock *)(cmbAllocedList->head); cmb->next != NULL; cmb = cmb->next) { size = cmb->size; pEndCookie = (((char *)(cmb+1)) + size); if (cmb->startCookie != cmbStartCookie) { safef(errMsg, sizeof errMsg, "Bad start cookie %x checking %llx\n", cmb->startCookie, ptrToLL(cmb+1)); errFound = TRUE; break; } if (memcmp(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)) != 0) { safef(errMsg, sizeof errMsg, "Bad end cookie %x%x%x%x checking %llx\n", pEndCookie[0], pEndCookie[1], pEndCookie[2], pEndCookie[3], ptrToLL(cmb+1)); errFound = TRUE; break; } if (--maxPieces == 0) { safef(errMsg, sizeof errMsg, "Loop or more than 10000000 pieces in memory list"); errFound = TRUE; break; } } pthread_mutex_unlock( &carefulMutex ); if (errFound) errAbort("%s", errMsg); } int carefulCountBlocksAllocated() /* How many memory items are allocated? */ { pthread_mutex_lock( &carefulMutex ); int result = dlCount(cmbAllocedList); pthread_mutex_unlock( &carefulMutex ); return result; } size_t carefulTotalAllocated() /* Return total bases allocated */ { pthread_mutex_lock( &carefulMutex ); size_t result = carefulAlloced; pthread_mutex_unlock( &carefulMutex ); return result; } static struct memHandler carefulMemHandler = /* Default memory handler. */ { NULL, carefulAlloc, carefulFree, carefulRealloc, }; void pushCarefulMemHandler(size_t maxAlloc) /* Push the careful (paranoid, conservative, checks everything) * memory handler top of the memHandler stack and use it. */ { carefulMemInit(maxAlloc); carefulParent = pushMemHandler(&carefulMemHandler); } struct memTracker /* A structure to keep track of memory. */ { struct memTracker *next; /* Next in list. */ struct dlList *list; /* List of allocated blocks. */ struct memHandler *parent; /* Underlying memory handler. */ struct memHandler *handler; /* Memory handler. */ }; static struct memTracker *memTracker = NULL; /* Head in memTracker list. */ static void *memTrackerAlloc(size_t size) /* Allocate extra memory for cookies and list node, and then * return memory block. */ { struct dlNode *node; size += sizeof (*node); node = memTracker->parent->alloc(size); if (node == NULL) return node; dlAddTail(memTracker->list, node); return (void*)(node+1); } static void memTrackerFree(void *vpt) /* Check cookies and free. */ { struct dlNode *node = vpt; node -= 1; dlRemove(node); memTracker->parent->free(node); } static void *memTrackerRealloc(void *vpt, size_t size) /* Resize a memory block from memTrackerAlloc. */ { if (vpt == NULL) return memTrackerAlloc(size); else { struct dlNode *node = ((struct dlNode *)vpt)-1; size += sizeof(*node); dlRemove(node); node = memTracker->parent->realloc(node, size); if (node == NULL) return node; dlAddTail(memTracker->list, node); return (void*)(node+1); } } void memTrackerStart() /* Push memory handler that will track blocks allocated so that * they can be automatically released with memTrackerEnd(). You * can have memTrackerStart one after the other, but memTrackerStart/End * need to nest. */ { struct memTracker *mt; if (memTracker != NULL) errAbort("multiple memTrackerStart calls"); AllocVar(mt); AllocVar(mt->handler); mt->handler->alloc = memTrackerAlloc; mt->handler->free = memTrackerFree; mt->handler->realloc = memTrackerRealloc; mt->list = dlListNew(); mt->parent = pushMemHandler(mt->handler); memTracker = mt; } void memTrackerEnd() /* Free any remaining blocks and pop tracker memory handler. */ { struct memTracker *mt = memTracker; if (mt == NULL) errAbort("memTrackerEnd without memTrackerStart"); memTracker = NULL; popMemHandler(); dlListFree(&mt->list); freeMem(mt->handler); freeMem(mt); } rtracklayer/src/ucsc/memalloc.h0000644000175100017510000000322512612032142017576 0ustar00biocbuildbiocbuild/* Let the user redirect where memory allocation/deallocation * happens. 'careful' routines help debug scrambled heaps. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef MEMALLOC_H #define MEMALLOC_H struct memHandler { struct memHandler *next; void * (*alloc)(size_t size); void (*free)(void *vpt); void * (*realloc)(void* vpt, size_t size); }; struct memHandler *pushMemHandler(struct memHandler *newHandler); /* Use newHandler for memory requests until matching popMemHandler. * Returns previous top of memory handler stack. */ struct memHandler *popMemHandler(); /* Removes top element from memHandler stack and returns it. */ void setDefaultMemHandler(); /* Sets memHandler to the default. */ void pushCarefulMemHandler(size_t maxAlloc); /* Push the careful (paranoid, conservative, checks everything) * memory handler top of the memHandler stack and use it. */ void carefulCheckHeap(); /* Walk through allocated memory and make sure that all cookies are * in place. Only walks through what's been done since * pushCarefulMemHandler(). */ int carefulCountBlocksAllocated(); /* How many memory items are allocated? (Since called * pushCarefulMemHandler(). */ size_t carefulTotalAllocated(); /* Return total bases allocated */ void setMaxAlloc(size_t s); /* Set large allocation limit. */ void memTrackerStart(); /* Push memory handler that will track blocks allocated so that * they can be automatically released with memTrackerEnd(). */ void memTrackerEnd(); /* Free any remaining blocks and pop tracker memory handler. */ #endif /* MEMALLOC_H */ rtracklayer/src/ucsc/net.c0000644000175100017510000015167512612032142016603 0ustar00biocbuildbiocbuild/* net.c some stuff to wrap around net communications. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #ifndef WIN32 #include #include #include #include #include #include "internet.h" #include "errAbort.h" #include "hash.h" #include "net.h" #include "linefile.h" #include "base64.h" #include "cheapcgi.h" #include "https.h" #include "sqlNum.h" #include "obscure.h" /* Brought errno in to get more useful error messages */ extern int errno; static int netStreamSocket() /* Create a TCP/IP streaming socket. Complain and return something * negative if can't */ { int sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) warn("Couldn't make AF_INET socket."); return sd; } static int setSocketNonBlocking(int sd, boolean set) /* Use socket control flags to set O_NONBLOCK if set==TRUE, * or clear it if set==FALSE. * Return -1 if there are any errors, 0 if successful. */ { long fcntlFlags; // Set or clear non-blocking if ((fcntlFlags = fcntl(sd, F_GETFL, NULL)) < 0) { warn("Error fcntl(..., F_GETFL) (%s)", strerror(errno)); return -1; } if (set) fcntlFlags |= O_NONBLOCK; else fcntlFlags &= (~O_NONBLOCK); if (fcntl(sd, F_SETFL, fcntlFlags) < 0) { warn("Error fcntl(..., F_SETFL) (%s)", strerror(errno)); return -1; } return 0; } int setReadWriteTimeouts(int sd, int seconds) /* Set read and write timeouts on socket sd * Return -1 if there are any errors, 0 if successful. */ { struct timeval timeout; timeout.tv_sec = seconds; timeout.tv_usec = 0; if (setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { warn("setsockopt failed setting socket receive timeout\n"); return -1; } if (setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { warn("setsockopt failed setting socket send timeout\n"); return -1; } return 0; } static struct timeval tvMinus(struct timeval a, struct timeval b) /* Return the result of a - b; this handles wrapping of milliseconds. * result.tv_usec will always be positive. * result.tv_sec will be negative if b > a. */ { // subtract b from a. if (a.tv_usec < b.tv_usec) { a.tv_usec += 1000000; a.tv_sec--; } a.tv_usec -= b.tv_usec; a.tv_sec -= b.tv_sec; return a; } static int netConnectWithTimeout(char *hostName, int port, long msTimeout) /* In order to avoid a very long default timeout (several minutes) for hosts that will * not answer the port, we are forced to connect non-blocking. * After the connection has been established, we return to blocking mode. * Also closes sd if error. */ { int sd; struct sockaddr_in sai; /* Some system socket info. */ int res; fd_set mySet; if (hostName == NULL) { warn("NULL hostName in netConnect"); return -1; } if (!internetFillInAddress(hostName, port, &sai)) return -1; if ((sd = netStreamSocket()) < 0) return sd; // Set socket to nonblocking so we can manage our own timeout time. if (setSocketNonBlocking(sd, TRUE) < 0) { close(sd); return -1; } // Trying to connect with timeout res = connect(sd, (struct sockaddr*) &sai, sizeof(sai)); if (res < 0) { if (errno == EINPROGRESS) { struct timeval startTime; gettimeofday(&startTime, NULL); struct timeval remainingTime; remainingTime.tv_sec = (long) (msTimeout/1000); remainingTime.tv_usec = (long) (((msTimeout/1000)-remainingTime.tv_sec)*1000000); while (1) { FD_ZERO(&mySet); FD_SET(sd, &mySet); // use tempTime (instead of using remainingTime directly) because on some platforms select() may modify the time val. struct timeval tempTime = remainingTime; res = select(sd+1, NULL, &mySet, &mySet, &tempTime); if (res < 0) { if (errno == EINTR) // Ignore the interrupt { // Subtract the elapsed time from remaining time since some platforms need this. struct timeval newTime; gettimeofday(&newTime, NULL); struct timeval elapsedTime = tvMinus(newTime, startTime); remainingTime = tvMinus(remainingTime, elapsedTime); if (remainingTime.tv_sec < 0) // means our timeout has more than expired { remainingTime.tv_sec = 0; remainingTime.tv_usec = 0; } startTime = newTime; } else { warn("Error in select() during TCP non-blocking connect %d - %s", errno, strerror(errno)); close(sd); return -1; } } else if (res > 0) { // Socket selected for write when it is ready int valOpt; socklen_t lon; // But check the socket for any errors lon = sizeof(valOpt); if (getsockopt(sd, SOL_SOCKET, SO_ERROR, (void*) (&valOpt), &lon) < 0) { warn("Error in getsockopt() %d - %s", errno, strerror(errno)); close(sd); return -1; } // Check the value returned... if (valOpt) { warn("Error in TCP non-blocking connect() %d - %s", valOpt, strerror(valOpt)); close(sd); return -1; } break; } else { warn("TCP non-blocking connect() to %s timed-out in select() after %ld milliseconds - Cancelling!", hostName, msTimeout); close(sd); return -1; } } } else { warn("TCP non-blocking connect() error %d - %s", errno, strerror(errno)); close(sd); return -1; } } // Set to blocking mode again if (setSocketNonBlocking(sd, FALSE) < 0) { close(sd); return -1; } if (setReadWriteTimeouts(sd, DEFAULTREADWRITETTIMEOUTSEC) < 0) { close(sd); return -1; } return sd; } int netConnect(char *hostName, int port) /* Start connection with a server. */ { return netConnectWithTimeout(hostName, port, DEFAULTCONNECTTIMEOUTMSEC); // 10 seconds connect timeout } int netMustConnect(char *hostName, int port) /* Start connection with server or die. */ { int sd = netConnect(hostName, port); if (sd < 0) noWarnAbort(); return sd; } int netMustConnectTo(char *hostName, char *portName) /* Start connection with a server and a port that needs to be converted to integer */ { if (!isdigit(portName[0])) errAbort("netConnectTo: ports must be numerical, not %s", portName); return netMustConnect(hostName, atoi(portName)); } int netAcceptingSocketFrom(int port, int queueSize, char *host) /* Create a socket that can accept connections from a * IP address on the current machine if the current machine * has multiple IP addresses. */ { struct sockaddr_in sai; int sd; int flag = 1; netBlockBrokenPipes(); if ((sd = netStreamSocket()) < 0) return sd; if (!internetFillInAddress(host, port, &sai)) return -1; if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int))) return -1; if (bind(sd, (struct sockaddr*)&sai, sizeof(sai)) == -1) { warn("Couldn't bind socket to %d: %s", port, strerror(errno)); close(sd); return -1; } listen(sd, queueSize); return sd; } int netAcceptingSocket(int port, int queueSize) /* Create a socket that can accept connections from * anywhere. */ { return netAcceptingSocketFrom(port, queueSize, NULL); } int netAccept(int sd) /* Accept incoming connection from socket descriptor. */ { socklen_t fromLen; return accept(sd, NULL, &fromLen); } int netAcceptFrom(int acceptor, unsigned char subnet[4]) /* Wait for incoming connection from socket descriptor * from IP address in subnet. Subnet is something * returned from netParseSubnet or internetParseDottedQuad. * Subnet may be NULL. */ { struct sockaddr_in sai; /* Some system socket info. */ ZeroVar(&sai); sai.sin_family = AF_INET; for (;;) { socklen_t addrSize = sizeof(sai); int sd = accept(acceptor, (struct sockaddr *)&sai, &addrSize); if (sd >= 0) { if (subnet == NULL) return sd; else { unsigned char unpacked[4]; internetUnpackIp(ntohl(sai.sin_addr.s_addr), unpacked); if (internetIpInSubnet(unpacked, subnet)) { return sd; } else { close(sd); } } } } } FILE *netFileFromSocket(int socket) /* Wrap a FILE around socket. This should be fclose'd * and separately the socket close'd. */ { FILE *f; if ((socket = dup(socket)) < 0) errnoAbort("Couldn't dupe socket in netFileFromSocket"); f = fdopen(socket, "r+"); if (f == NULL) errnoAbort("Couldn't fdopen socket in netFileFromSocket"); return f; } static boolean plumberInstalled = FALSE; void netBlockBrokenPipes() /* Make it so a broken pipe doesn't kill us. */ { if (!plumberInstalled) { signal(SIGPIPE, SIG_IGN); /* Block broken pipe signals. */ plumberInstalled = TRUE; } } ssize_t netReadAll(int sd, void *vBuf, ssize_t size) /* Read given number of bytes into buffer. * Don't give up on first read! */ { char *buf = vBuf; ssize_t totalRead = 0; int oneRead; if (!plumberInstalled) netBlockBrokenPipes(); while (totalRead < size) { oneRead = read(sd, buf + totalRead, size - totalRead); if (oneRead < 0) return oneRead; if (oneRead == 0) break; totalRead += oneRead; } return totalRead; } ssize_t netMustReadAll(int sd, void *vBuf, ssize_t size) /* Read given number of bytes into buffer or die. * Don't give up if first read is short! */ { ssize_t ret = netReadAll(sd, vBuf, size); if (ret < 0) errnoAbort("Couldn't finish netReadAll"); return ret; } static void notGoodSubnet(char *sns) /* Complain about subnet format. */ { errAbort("'%s' is not a properly formatted subnet. Subnets must consist of\n" "one to three dot-separated numbers between 0 and 255", sns); } void netParseSubnet(char *in, unsigned char out[4]) /* Parse subnet, which is a prefix of a normal dotted quad form. * Out will contain 255's for the don't care bits. */ { out[0] = out[1] = out[2] = out[3] = 255; if (in != NULL) { char *snsCopy = strdup(in); char *words[5]; int wordCount, i; wordCount = chopString(snsCopy, ".", words, ArraySize(words)); if (wordCount > 3 || wordCount < 1) notGoodSubnet(in); for (i=0; i 255) notGoodSubnet(in); out[i] = x; } freez(&snsCopy); } } static void parseByteRange(char *url, ssize_t *rangeStart, ssize_t *rangeEnd, boolean terminateAtByteRange) /* parse the byte range information from url */ { char *x; /* default to no byte range specified */ *rangeStart = -1; *rangeEnd = -1; x = strrchr(url, ';'); if (x) { if (startsWith(";byterange=", x)) { char *y=strchr(x, '='); ++y; char *z=strchr(y, '-'); if (z) { ++z; if (terminateAtByteRange) *x = 0; // TODO: use something better than atoll() ? *rangeStart = atoll(y); if (z[0] != '\0') *rangeEnd = atoll(z); } } } } void cgiDecodeFull(char *in, char *out, int inLength) /* Out will be a cgi-decoded version of in (no space from plus!). * Out will be a little shorter than in typically, and * can be the same buffer. */ { char c; int i; for (i=0; i= sizeof(buf)) errAbort("Url too long: '%s'", url); strcpy(buf, url); url = buf; /* Find out protocol - default to http. */ s = trimSpaces(url); s = stringIn("://", url); if (s == NULL) { strcpy(parsed->protocol, "http"); s = url; } else { *s = 0; tolowers(url); safecpy(parsed->protocol, sizeof(parsed->protocol), url); s += 3; } /* Split off file part. */ parsed->byteRangeStart = -1; /* default to no byte range specified */ parsed->byteRangeEnd = -1; u = strchr(s, '/'); if (u == NULL) strcpy(parsed->file, "/"); else { parseByteRange(u, &parsed->byteRangeStart, &parsed->byteRangeEnd, TRUE); if (sameWord(parsed->protocol,"http") || sameWord(parsed->protocol,"https")) { // http servers expect the URL request to be URL-encoded already. /* need to encode spaces, but not ! other characters */ char *t=replaceChars(u," ","%20"); safecpy(parsed->file, sizeof(parsed->file), t); freeMem(t); } *u = 0; // terminate the host:port string if (sameWord(parsed->protocol,"ftp")) { ++u; // that first slash is not considered part of the ftp path // decode now because the FTP server does NOT expect URL-encoding. cgiDecodeFull(u,parsed->file,strlen(u)); // decodes %FF but not + } } /* Split off user part */ v = strchr(s, '@'); if (v == NULL) { if (sameWord(parsed->protocol,"http") || sameWord(parsed->protocol,"https")) { strcpy(parsed->user, ""); strcpy(parsed->password, ""); } if (sameWord(parsed->protocol,"ftp")) { strcpy(parsed->user, "anonymous"); strcpy(parsed->password, "x@genome.ucsc.edu"); } } else { *v = 0; /* split off password part */ w = strchr(s, ':'); if (w == NULL) { safecpy(parsed->user, sizeof(parsed->user), s); strcpy(parsed->password, ""); } else { *w = 0; safecpy(parsed->user, sizeof(parsed->user), s); safecpy(parsed->password, sizeof(parsed->password), w+1); } cgiDecode(parsed->user,parsed->user,strlen(parsed->user)); cgiDecode(parsed->password,parsed->password,strlen(parsed->password)); s = v+1; } /* Save port if it's there. If not default to 80. */ t = strchr(s, ':'); if (t == NULL) { if (sameWord(parsed->protocol,"http")) strcpy(parsed->port, "80"); if (sameWord(parsed->protocol,"https")) strcpy(parsed->port, "443"); if (sameWord(parsed->protocol,"ftp")) strcpy(parsed->port, "21"); } else { *t++ = 0; if (!isdigit(t[0])) errAbort("Non-numeric port name %s", t); safecpy(parsed->port, sizeof(parsed->port), t); } /* What's left is the host. */ safecpy(parsed->host, sizeof(parsed->host), s); } char *urlFromNetParsedUrl(struct netParsedUrl *npu) /* Build URL from netParsedUrl structure */ { struct dyString *dy = newDyString(512); dyStringAppend(dy, npu->protocol); dyStringAppend(dy, "://"); if (npu->user[0] != 0) { char *encUser = cgiEncode(npu->user); dyStringAppend(dy, encUser); freeMem(encUser); if (npu->password[0] != 0) { dyStringAppend(dy, ":"); char *encPassword = cgiEncode(npu->password); dyStringAppend(dy, encPassword); freeMem(encPassword); } dyStringAppend(dy, "@"); } dyStringAppend(dy, npu->host); /* do not include port if it is the default */ if (!( (sameString(npu->protocol, "ftp" ) && sameString("21", npu->port)) || (sameString(npu->protocol, "http" ) && sameString("80", npu->port)) || (sameString(npu->protocol, "https") && sameString("443",npu->port)) )) { dyStringAppend(dy, ":"); dyStringAppend(dy, npu->port); } dyStringAppend(dy, npu->file); if (npu->byteRangeStart != -1) { dyStringPrintf(dy, ";byterange=%lld-", (long long)npu->byteRangeStart); if (npu->byteRangeEnd != -1) dyStringPrintf(dy, "%lld", (long long)npu->byteRangeEnd); } /* Clean up and return handle. */ return dyStringCannibalize(&dy); } int netWaitForData(int sd, int microseconds) /* Wait for descriptor to have some data to read, up to given number of * microseconds. Returns amount of data there or zero if timed out. */ { struct timeval tv; fd_set set; int readyCount; for (;;) { if (microseconds >= 1000000) { tv.tv_sec = microseconds/1000000; tv.tv_usec = microseconds%1000000; } else { tv.tv_sec = 0; tv.tv_usec = microseconds; } FD_ZERO(&set); FD_SET(sd, &set); readyCount = select(sd+1, &set, NULL, NULL, &tv); if (readyCount < 0) { if (errno == EINTR) /* Select interrupted, not timed out. */ continue; else warn("select failure %s", strerror(errno)); } else { return readyCount; /* Zero readyCount indicates time out */ } } } static boolean readReadyWait(int sd, int microseconds) /* Wait for descriptor to have some data to read, up to given number of * number of microseconds. Returns true if there is data, false if timed out. */ { int readyCount = netWaitForData(sd, microseconds); return readyCount > 0; /* Zero readyCount indicates time out */ } static void sendFtpCommandOnly(int sd, char *cmd) /* send command to ftp server */ { mustWriteFd(sd, cmd, strlen(cmd)); } #define NET_FTP_TIMEOUT 1000000 static boolean receiveFtpReply(int sd, char *cmd, struct dyString **retReply, int *retCode) /* send command to ftp server and check resulting reply code, * warn and return FALSE if not desired reply. If retReply is non-NULL, store reply text there. */ { char *startLastLine = NULL; struct dyString *rs = newDyString(4*1024); while (1) { int readSize = 0; while (1) { char buf[4*1024]; if (!readReadyWait(sd, NET_FTP_TIMEOUT)) { warn("ftp server response timed out > %d microsec", NET_FTP_TIMEOUT); return FALSE; } if ((readSize = read(sd, buf, sizeof(buf))) == 0) break; dyStringAppendN(rs, buf, readSize); if (endsWith(rs->string,"\n")) break; } /* find the start of the last line in the buffer */ startLastLine = rs->string+strlen(rs->string)-1; if (startLastLine >= rs->string) if (*startLastLine == '\n') --startLastLine; while ((startLastLine >= rs->string) && (*startLastLine != '\n')) --startLastLine; ++startLastLine; if (strlen(startLastLine)>4) if ( isdigit(startLastLine[0]) && isdigit(startLastLine[1]) && isdigit(startLastLine[2]) && startLastLine[3]==' ') break; if (readSize == 0) break; // EOF /* must be some text info we can't use, ignore it till we get status code */ } int reply = atoi(startLastLine); if ((reply < 200) || (reply > 399)) { warn("ftp server error on cmd=[%s] response=[%s]",cmd,rs->string); return FALSE; } if (retReply) *retReply = rs; else dyStringFree(&rs); if (retCode) *retCode = reply; return TRUE; } static boolean sendFtpCommand(int sd, char *cmd, struct dyString **retReply, int *retCode) /* send command to ftp server and check resulting reply code, * warn and return FALSE if not desired reply. If retReply is non-NULL, store reply text there. */ { sendFtpCommandOnly(sd, cmd); return receiveFtpReply(sd, cmd, retReply, retCode); } static int parsePasvPort(char *rs) /* parse PASV reply to get the port and return it */ { char *words[7]; int wordCount; char *rsStart = strchr(rs,'('); char *rsEnd = strchr(rs,')'); int result = 0; rsStart++; *rsEnd=0; wordCount = chopString(rsStart, ",", words, ArraySize(words)); if (wordCount != 6) errAbort("PASV reply does not parse correctly"); result = atoi(words[4])*256+atoi(words[5]); return result; } static long long parseFtpSIZE(char *rs) /* parse reply to SIZE and return it */ { char *words[3]; int wordCount; char *rsStart = rs; long long result = 0; wordCount = chopString(rsStart, " ", words, ArraySize(words)); if (wordCount != 2) errAbort("SIZE reply does not parse correctly"); result = atoll(words[1]); return result; } static time_t parseFtpMDTM(char *rs) /* parse reply to MDTM and return it * 200 YYYYMMDDhhmmss */ { char *words[3]; int wordCount = chopString(rs, " ", words, ArraySize(words)); if (wordCount != 2) errAbort("MDTM reply should have 2 words but has %d", wordCount); #define EXPECTED_MDTM_FORMAT "YYYYmmddHHMMSS" if (strlen(words[1]) < strlen(EXPECTED_MDTM_FORMAT)) errAbort("MDTM reply word [%s] shorter than " EXPECTED_MDTM_FORMAT, words[1]); // man strptime -> // "There should be whitespace or other alphanumeric characters between any two field descriptors." // There are no separators in the MDTM timestamp, so make a spread-out version for strptime: char spread[] = "YYYY mm dd HH MM SS"; char *from = words[1]; char *to = spread; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = '-'; *to++ = *from++; *to++ = *from++; *to++ = '-'; *to++ = *from++; *to++ = *from++; *to++ = ' '; *to++ = *from++; *to++ = *from++; *to++ = ':'; *to++ = *from++; *to++ = *from++; *to++ = ':'; *to++ = *from++; *to++ = *from++; *to++ = 0; struct tm tm; if (strptime(spread, "%Y-%m-%d %H:%M:%S", &tm) == NULL) errAbort("unable to parse MDTM string [%s]", spread); // Not set by strptime(); tells mktime() to determine whether daylight saving time is in effect: tm.tm_isdst = -1; time_t t = mktime(&tm); if (t == -1) errAbort("mktime failed while parsing strptime'd MDTM string [%s]", words[1]); return t; } static int openFtpControlSocket(char *host, int port, char *user, char *password) /* Open a socket to host,port; authenticate anonymous ftp; set type to I; * return socket desc or -1 if there was an error. */ { int sd = netConnect(host, port); if (sd < 0) return -1; /* First read the welcome msg */ if (readReadyWait(sd, NET_FTP_TIMEOUT)) sendFtpCommand(sd, "", NULL, NULL); char cmd[256]; int retCode = 0; safef(cmd,sizeof(cmd),"USER %s\r\n", user); if (!sendFtpCommand(sd, cmd, NULL, &retCode)) { close(sd); return -1; } if (retCode == 331) { safef(cmd,sizeof(cmd),"PASS %s\r\n", password); if (!sendFtpCommand(sd, cmd, NULL, NULL)) { close(sd); return -1; } } if (!sendFtpCommand(sd, "TYPE I\r\n", NULL, NULL)) { close(sd); return -1; } /* 200 Type set to I */ /* (send the data as binary, so can support compressed files) */ return sd; } boolean netGetFtpInfo(char *url, long long *retSize, time_t *retTime) /* Return date in UTC and size of ftp url file */ { /* Parse the URL and connect. */ struct netParsedUrl npu; netParseUrl(url, &npu); if (!sameString(npu.protocol, "ftp")) errAbort("netGetFtpInfo: url (%s) is not for ftp.", url); // TODO maybe remove this workaround where udc cache wants info on URL "/" ? if (sameString(npu.file,"/")) { *retSize = 0; *retTime = time(NULL); return TRUE; } int sd = openFtpControlSocket(npu.host, atoi(npu.port), npu.user, npu.password); if (sd < 0) return FALSE; char cmd[256]; safef(cmd,sizeof(cmd),"SIZE %s\r\n", npu.file); struct dyString *rs = NULL; if (!sendFtpCommand(sd, cmd, &rs, NULL)) { close(sd); return FALSE; } *retSize = parseFtpSIZE(rs->string); /* 200 12345 */ dyStringFree(&rs); safef(cmd,sizeof(cmd),"MDTM %s\r\n", npu.file); if (!sendFtpCommand(sd, cmd, &rs, NULL)) { close(sd); return FALSE; } *retTime = parseFtpMDTM(rs->string); /* 200 YYYYMMDDhhmmss */ dyStringFree(&rs); close(sd); return TRUE; } struct netConnectFtpParams /* params to pass to thread */ { pthread_t thread; int pipefd[2]; int sd; int sdata; struct netParsedUrl npu; }; static void *sendFtpDataToPipeThread(void *threadParams) /* This is to be executed by the child process after the fork in netGetOpenFtpSockets. * It keeps the ftp control socket alive while reading from the ftp data socket * and writing to the pipe to the parent process, which closes the ftp sockets * and reads from the pipe. */ { struct netConnectFtpParams *params = threadParams; pthread_detach(params->thread); // this thread will never join back with it's progenitor char buf[32768]; int rd = 0; long long dataPos = 0; if (params->npu.byteRangeStart != -1) dataPos = params->npu.byteRangeStart; while((rd = read(params->sdata, buf, 32768)) > 0) { if (params->npu.byteRangeEnd != -1 && (dataPos + rd) > params->npu.byteRangeEnd) rd = params->npu.byteRangeEnd - dataPos + 1; int wt = write(params->pipefd[1], buf, rd); if (wt == -1 && params->npu.byteRangeEnd != -1) { // errAbort in child process is messy; let reader complain if // trouble. If byterange was open-ended, we will hit this point // when the parent stops reading and closes the pipe. errnoWarn("error writing ftp data to pipe"); break; } dataPos += rd; if (params->npu.byteRangeEnd != -1 && dataPos >= params->npu.byteRangeEnd) break; } if (rd == -1) // Again, avoid abort in child process. errnoWarn("error reading ftp socket"); close(params->pipefd[1]); /* we are done with it */ close(params->sd); close(params->sdata); return NULL; } static int netGetOpenFtpSockets(char *url, int *retCtrlSd) /* Return a socket descriptor for url data (url can end in ";byterange:start-end", * or -1 if error. * If retCtrlSd is non-null, keep the control socket alive and set *retCtrlSd. * Otherwise, create a pipe and fork to keep control socket alive in the child * process until we are done fetching data. */ { char cmd[256]; /* Parse the URL and connect. */ struct netParsedUrl npu; netParseUrl(url, &npu); if (!sameString(npu.protocol, "ftp")) errAbort("netGetOpenFtpSockets: url (%s) is not for ftp.", url); int sd = openFtpControlSocket(npu.host, atoi(npu.port), npu.user, npu.password); if (sd == -1) return -1; struct dyString *rs = NULL; if (!sendFtpCommand(sd, "PASV\r\n", &rs, NULL)) { close(sd); return -1; } /* 227 Entering Passive Mode (128,231,210,81,222,250) */ if (npu.byteRangeStart != -1) { safef(cmd,sizeof(cmd),"REST %lld\r\n", (long long) npu.byteRangeStart); if (!sendFtpCommand(sd, cmd, NULL, NULL)) { close(sd); return -1; } } /* RETR for files, LIST for directories ending in / */ safef(cmd,sizeof(cmd),"%s %s\r\n",((npu.file[strlen(npu.file)-1]) == '/') ? "LIST" : "RETR", npu.file); sendFtpCommandOnly(sd, cmd); int sdata = netConnect(npu.host, parsePasvPort(rs->string)); dyStringFree(&rs); if (sdata < 0) { close(sd); return -1; } int secondsWaited = 0; while (TRUE) { if (secondsWaited >= 10) { warn("ftp server error on cmd=[%s] timed-out waiting for data or error", cmd); close(sd); close(sdata); return -1; } if (readReadyWait(sdata, NET_FTP_TIMEOUT)) break; // we have some data if (readReadyWait(sd, 0)) /* wait in microsec */ { // this can see an error like bad filename if (!receiveFtpReply(sd, cmd, NULL, NULL)) { close(sd); close(sdata); return -1; } } ++secondsWaited; } if (retCtrlSd != NULL) { *retCtrlSd = sd; return sdata; } else { /* Because some FTP servers will kill the data connection * as soon as the control connection closes, * we have to develop a workaround using a partner process. */ fflush(stdin); fflush(stdout); fflush(stderr); struct netConnectFtpParams *params; AllocVar(params); params->sd = sd; params->sdata = sdata; params->npu = npu; /* make a pipe (fds go in pipefd[0] and pipefd[1]) */ if (pipe(params->pipefd) != 0) errAbort("netGetOpenFtpSockets: failed to create pipe: %s", strerror(errno)); int rc; rc = pthread_create(¶ms->thread, NULL, sendFtpDataToPipeThread, (void *)params); if (rc) { errAbort("Unexpected error %d from pthread_create(): %s",rc,strerror(rc)); } return params->pipefd[0]; } } int connectNpu(struct netParsedUrl npu, char *url) /* Connect using NetParsedUrl. */ { int sd = -1; if (sameString(npu.protocol, "http")) { sd = netConnect(npu.host, atoi(npu.port)); } else if (sameString(npu.protocol, "https")) { sd = netConnectHttps(npu.host, atoi(npu.port)); } else { errAbort("netHttpConnect: url (%s) is not for http.", url); return -1; /* never gets here, fixes compiler complaint */ } return sd; } void setAuthorization(struct netParsedUrl npu, char *authHeader, struct dyString *dy) /* Set the specified authorization header with BASIC auth base64-encoded user and password */ { if (!sameString(npu.user,"")) { char up[256]; char *b64up = NULL; safef(up, sizeof(up), "%s:%s", npu.user, npu.password); b64up = base64Encode(up, strlen(up)); dyStringPrintf(dy, "%s: Basic %s\r\n", authHeader, b64up); freez(&b64up); } } int netHttpConnect(char *url, char *method, char *protocol, char *agent, char *optionalHeader) /* Parse URL, connect to associated server on port, and send most of * the request to the server. If specified in the url send user name * and password too. Typically the "method" will be "GET" or "POST" * and the agent will be the name of your program or * library. optionalHeader may be NULL or contain additional header * lines such as cookie info. * Proxy support via hg.conf httpProxy or env var http_proxy * Return data socket, or -1 if error.*/ { struct netParsedUrl npu; struct netParsedUrl pxy; struct dyString *dy = newDyString(512); int sd = -1; /* Parse the URL and connect. */ netParseUrl(url, &npu); char *proxyUrl = getenv("http_proxy"); if (proxyUrl) { netParseUrl(proxyUrl, &pxy); sd = connectNpu(pxy, url); } else { sd = connectNpu(npu, url); } if (sd < 0) return -1; /* Ask remote server for a file. */ char *urlForProxy = NULL; if (proxyUrl) { /* trim off the byterange part at the end of url because proxy does not understand it. */ urlForProxy = cloneString(url); char *x = strrchr(urlForProxy, ';'); if (x && startsWith(";byterange=", x)) *x = 0; } dyStringPrintf(dy, "%s %s %s\r\n", method, proxyUrl ? urlForProxy : npu.file, protocol); freeMem(urlForProxy); dyStringPrintf(dy, "User-Agent: %s\r\n", agent); /* do not need the 80 since it is the default */ if ((sameString(npu.protocol, "http" ) && sameString("80", npu.port)) || (sameString(npu.protocol, "https") && sameString("443",npu.port))) dyStringPrintf(dy, "Host: %s\r\n", npu.host); else dyStringPrintf(dy, "Host: %s:%s\r\n", npu.host, npu.port); setAuthorization(npu, "Authorization", dy); if (proxyUrl) setAuthorization(pxy, "Proxy-Authorization", dy); dyStringAppend(dy, "Accept: */*\r\n"); if (npu.byteRangeStart != -1) { if (npu.byteRangeEnd != -1) dyStringPrintf(dy, "Range: bytes=%lld-%lld\r\n" , (long long)npu.byteRangeStart , (long long)npu.byteRangeEnd); else dyStringPrintf(dy, "Range: bytes=%lld-\r\n" , (long long)npu.byteRangeStart); } if (optionalHeader) dyStringAppend(dy, optionalHeader); /* finish off the header with final blank line */ dyStringAppend(dy, "\r\n"); mustWriteFd(sd, dy->string, dy->stringSize); /* Clean up and return handle. */ dyStringFree(&dy); return sd; } int netOpenHttpExt(char *url, char *method, char *optionalHeader) /* Return a file handle that will read the url. optionalHeader * may by NULL or may contain cookies and other info. */ { return netHttpConnect(url, method, "HTTP/1.0", "genome.ucsc.edu/net.c", optionalHeader); } static int netGetOpenHttp(char *url) /* Return a file handle that will read the url. */ { return netOpenHttpExt(url, "GET", NULL); } int netUrlHeadExt(char *url, char *method, struct hash *hash) /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ { int sd = netOpenHttpExt(url, method, NULL); int status = EIO; if (sd >= 0) { char *line, *word; struct lineFile *lf = lineFileAttach(url, TRUE, sd); if (lineFileNext(lf, &line, NULL)) { if (startsWith("HTTP/", line)) { word = nextWord(&line); word = nextWord(&line); if (word != NULL && isdigit(word[0])) { status = atoi(word); if (hash != NULL) { while (lineFileNext(lf, &line, NULL)) { word = nextWord(&line); if (word == NULL) break; hashAdd(hash, strUpper(word), cloneString(skipLeadingSpaces(line))); } } } } } lineFileClose(&lf); } else status = errno; return status; } int netUrlHead(char *url, struct hash *hash) /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ { return netUrlHeadExt(url, "HEAD", hash); } long long netUrlSizeByRangeResponse(char *url) /* Use byteRange as a work-around alternate method to get file size (content-length). * Return negative number if can't get. */ { long long retVal = -1; char rangeUrl[2048]; safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=0-0", url); struct hash *hash = newHash(0); int status = netUrlHeadExt(rangeUrl, "GET", hash); if (status == 206) { char *rangeString = hashFindValUpperCase(hash, "Content-Range:"); if (rangeString) { /* input pattern: Content-Range: bytes 0-99/2738262 */ char *slash = strchr(rangeString,'/'); if (slash) { retVal = atoll(slash+1); } } } hashFree(&hash); return retVal; } int netUrlOpenSockets(char *url, int *retCtrlSocket) /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. * If retCtrlSocket is non-NULL and url is FTP, set *retCtrlSocket * to the FTP control socket which is left open for a persistent connection. * close(result) (and close(*retCtrlSocket) if applicable) when done. * If url is missing :// then it's just treated as a file. */ { if (stringIn("://", url) == NULL) return open(url, O_RDONLY); else { if (startsWith("http://",url) || startsWith("https://",url)) return netGetOpenHttp(url); else if (startsWith("ftp://",url)) return netGetOpenFtpSockets(url, retCtrlSocket); else errAbort("Sorry, can only netUrlOpen http, https and ftp currently, not '%s'", url); } return -1; } int netUrlOpen(char *url) /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. Just close(result) when done. */ { return netUrlOpenSockets(url, NULL); } struct dyString *netSlurpFile(int sd) /* Slurp file into dynamic string and return. */ { char buf[4*1024]; int readSize; struct dyString *dy = newDyString(4*1024); /* Slurp file into dy and return. */ while ((readSize = read(sd, buf, sizeof(buf))) > 0) dyStringAppendN(dy, buf, readSize); return dy; } struct dyString *netSlurpUrl(char *url) /* Go grab all of URL and return it as dynamic string. */ { int sd = netUrlOpen(url); if (sd < 0) errAbort("netSlurpUrl: failed to open socket for [%s]", url); struct dyString *dy = netSlurpFile(sd); close(sd); return dy; } static void parseContentRange(char *x, ssize_t *rangeStart, ssize_t *rangeEnd) /* parse the content range information from response header value "bytes 763400000-763400112/763400113" */ { /* default to no byte range specified */ *rangeStart = -1; *rangeEnd = -1; if (startsWith("bytes ", x)) { char *y=strchr(x, ' '); ++y; char *z=strchr(y, '-'); if (z) { ++z; // TODO: use something better than atoll() ? *rangeStart = atoll(y); if (z[0] != '\0') *rangeEnd = atoll(z); } } } boolean netSkipHttpHeaderLinesWithRedirect(int sd, char *url, char **redirectedUrl) /* Skip http header lines. Return FALSE if there's a problem. * The input is a standard sd or fd descriptor. * This is meant to be able work even with a re-passable stream handle, * e.g. can pass it to the pipes routines, which means we can't * attach a linefile since filling its buffer reads in more than just the http header. * Handles 300, 301, 302, 303, 307 http redirects by setting *redirectedUrl to * the new location. */ { char buf[2000]; char *line = buf; int maxbuf = sizeof(buf); int i=0; char c = ' '; int nread = 0; char *sep = NULL; char *headerName = NULL; char *headerVal = NULL; boolean redirect = FALSE; boolean byteRangeUsed = (strstr(url,";byterange=") != NULL); ssize_t byteRangeStart = -1; ssize_t byteRangeEnd = -1; boolean foundContentRange = FALSE; ssize_t contentRangeStart = -1; ssize_t contentRangeEnd = -1; boolean mustUseProxy = FALSE; /* User must use proxy 305 error*/ char *proxyLocation = NULL; boolean mustUseProxyAuth = FALSE; /* User must use proxy authentication 407 error*/ if (byteRangeUsed) { parseByteRange(url, &byteRangeStart, &byteRangeEnd, FALSE); } while(TRUE) { i = 0; while (TRUE) { nread = read(sd, &c, 1); /* one char at a time, but http headers are small */ if (nread != 1) { if (nread == -1) warn("Error (%s) reading http header on %s", strerror(errno), url); else if (nread == 0) warn("Error unexpected end of input reading http header on %s", url); else warn("Error reading http header on %s", url); return FALSE; /* err reading descriptor */ } if (c == 10) break; if (c != 13) buf[i++] = c; if (i >= maxbuf) { warn("http header line too long > %d chars.",maxbuf); return FALSE; } } buf[i] = 0; /* add string terminator */ if (sameString(line,"")) { break; /* End of Header found */ } if (startsWith("HTTP/", line)) { char *version, *code; version = nextWord(&line); code = nextWord(&line); if (code == NULL) { warn("Strange http header on %s", url); return FALSE; } if (startsWith("30", code) && isdigit(code[2]) && ((code[2] >= '0' && code[2] <= '3') || code[2] == '7') && code[3] == 0) { redirect = TRUE; } else if (sameString(code, "305")) { mustUseProxy = TRUE; } else if (sameString(code, "407")) { mustUseProxyAuth = TRUE; } else if (byteRangeUsed /* hack for Apache bug 2.2.20 and 2.2.21 2011-10-21 should be OK to remove after one year. */ && !(sameString(code, "200") && byteRangeStart == 0 && byteRangeEnd == -1)) { if (!sameString(code, "206")) { if (sameString(code, "200")) warn("Byte-range request was ignored by server. "); warn("Expected Partial Content 206. %s: %s %s", url, code, line); return FALSE; } } else if (sameString(code, "404")) { warn("404 file not found on %s", url); return FALSE; } else if (!sameString(code, "200")) { warn("Expected 200 %s: %s %s", url, code, line); return FALSE; } line = buf; /* restore it */ } headerName = line; sep = strchr(line,':'); if (sep) { *sep = 0; headerVal = skipLeadingSpaces(++sep); } else { headerVal = NULL; } if (sameWord(headerName,"Location")) { if (redirect) *redirectedUrl = cloneString(headerVal); if (mustUseProxy) proxyLocation = cloneString(headerVal); } if (sameWord(headerName,"Content-Range")) { if (byteRangeUsed) { foundContentRange = TRUE; parseContentRange(headerVal, &contentRangeStart, &contentRangeEnd); if ((contentRangeStart != byteRangeStart) || (byteRangeEnd != -1 && (contentRangeEnd != byteRangeEnd))) { char bre[256]; safef(bre, sizeof bre, "%lld", (long long)byteRangeEnd); if (byteRangeEnd == -1) bre[0] = 0; warn("Found Content-Range: %s. Expected bytes %lld-%s. Improper caching of 206 reponse byte-ranges?", headerVal, (long long) byteRangeStart, bre); return FALSE; } } } } if (mustUseProxy || mustUseProxyAuth) { warn("%s: %s error. Use Proxy%s. Location = %s", url, mustUseProxy ? "" : " Authentication", mustUseProxy ? "305" : "407", proxyLocation ? proxyLocation : "not given"); return FALSE; } if (byteRangeUsed && !foundContentRange /* hack for Apache bug 2.2.20 and 2.2.21 2011-10-21 should be OK to remove after one year. */ && !(byteRangeStart == 0 && byteRangeEnd == -1)) { char bre[256]; safef(bre, sizeof bre, "%lld", (long long)byteRangeEnd); if (byteRangeEnd == -1) bre[0] = 0; warn("Expected response header Content-Range: %lld-%s", (long long) byteRangeStart, bre); return FALSE; } return TRUE; } boolean netSkipHttpHeaderLinesHandlingRedirect(int sd, char *url, int *redirectedSd, char **redirectedUrl) /* Skip http headers lines, returning FALSE if there is a problem. Generally called as * netSkipHttpHeaderLine(sd, url, &sd, &url); * where sd is a socket (file) opened with netUrlOpen(url), and url is in dynamic memory. * If the http header indicates that the file has moved, then it will update the *redirectedSd and * *redirectedUrl with the new socket and URL, first closing sd. * If for some reason you want to detect whether the forwarding has occurred you could * call this as: * char *newUrl = NULL; * int newSd = 0; * netSkipHttpHeaderLine(sd, url, &newSd, &newUrl); * if (newUrl != NULL) * // Update sd with newSd, free url if appropriate and replace it with newUrl, etc. * // free newUrl when finished. * This routine handles up to 5 steps of redirection. * The logic to this routine is also complicated a little to make it work in a pipe, which means we * can't attach a lineFile since filling the lineFile buffer reads in more than just the http header. */ { int redirectCount = 0; while (TRUE) { /* url needed for err msgs, and to return redirect location */ char *newUrl = NULL; boolean success = netSkipHttpHeaderLinesWithRedirect(sd, url, &newUrl); if (success && !newUrl) /* success after 0 to 5 redirects */ { if (redirectCount > 0) { *redirectedSd = sd; *redirectedUrl = url; } else { *redirectedSd = -1; *redirectedUrl = NULL; } return TRUE; } close(sd); if (redirectCount > 0) freeMem(url); if (success) { /* we have a new url to try */ ++redirectCount; if (redirectCount > 5) { warn("code 30x redirects: exceeded limit of 5 redirects, %s", newUrl); success = FALSE; } else if (!startsWith("http://",newUrl) && !startsWith("https://",newUrl)) { warn("redirected to non-http(s): %s", newUrl); success = FALSE; } else { struct netParsedUrl npu, newNpu; /* Parse the old URL to make parts available for graft onto the redirected url. */ /* This makes redirection work with byterange urls and user:password@ */ netParseUrl(url, &npu); netParseUrl(newUrl, &newNpu); boolean updated = FALSE; if (npu.byteRangeStart != -1) { newNpu.byteRangeStart = npu.byteRangeStart; newNpu.byteRangeEnd = npu.byteRangeEnd; updated = TRUE; } if ((npu.user[0] != 0) && (newNpu.user[0] == 0)) { safecpy(newNpu.user, sizeof newNpu.user, npu.user); safecpy(newNpu.password, sizeof newNpu.password, npu.password); updated = TRUE; } if (updated) { freeMem(newUrl); newUrl = urlFromNetParsedUrl(&newNpu); } sd = netUrlOpen(newUrl); if (sd < 0) { warn("Couldn't open %s", newUrl); success = FALSE; } } } if (!success) { /* failure after 0 to 5 redirects */ if (redirectCount > 0) freeMem(newUrl); return FALSE; } url = newUrl; } return FALSE; } struct lineFile *netLineFileMayOpen(char *url) /* Return a lineFile attached to url. http skips header. * Supports some compression formats. Prints warning message, but * does not abort, just returning NULL if there's a problem. */ { int sd = netUrlOpen(url); if (sd < 0) { warn("Couldn't open %s", url); return NULL; } else { struct lineFile *lf = NULL; char *newUrl = NULL; int newSd = 0; if (startsWith("http://",url) || startsWith("https://",url)) { if (!netSkipHttpHeaderLinesHandlingRedirect(sd, url, &newSd, &newUrl)) { return NULL; } if (newUrl != NULL) { /* Update sd with newSd, replace it with newUrl, etc. */ sd = newSd; url = newUrl; } } char *urlDecoded = cloneString(url); cgiDecode(url, urlDecoded, strlen(url)); boolean isCompressed = (endsWith(urlDecoded,".gz") || endsWith(urlDecoded,".Z") || endsWith(urlDecoded,".bz2")); freeMem(urlDecoded); if (isCompressed) { lf = lineFileDecompressFd(url, TRUE, sd); /* url needed only for compress type determination */ } else { lf = lineFileAttach(url, TRUE, sd); } if (newUrl) freeMem(newUrl); return lf; } } int netUrlMustOpenPastHeader(char *url) /* Get socket descriptor for URL. Process header, handling any forwarding and * the like. Do errAbort if there's a problem, which includes anything but a 200 * return from http after forwarding. */ { int sd = netUrlOpen(url); if (sd < 0) noWarnAbort(); int newSd = 0; if (startsWith("http://",url) || startsWith("https://",url)) { char *newUrl = NULL; if (!netSkipHttpHeaderLinesHandlingRedirect(sd, url, &newSd, &newUrl)) noWarnAbort(); if (newUrl != NULL) { sd = newSd; freeMem(newUrl); } } return sd; } struct lineFile *netLineFileSilentOpen(char *url) /* Open a lineFile on a URL. Just return NULL without any user * visible warning message if there's a problem. */ { pushSilentWarnHandler(); struct lineFile *lf = netLineFileMayOpen(url); popWarnHandler(); return lf; } char *netReadTextFileIfExists(char *url) /* Read entire URL and return it as a string. URL should be text (embedded zeros will be * interpreted as end of string). If the url doesn't exist or has other problems, * returns NULL. */ { struct lineFile *lf = netLineFileSilentOpen(url); if (lf == NULL) return NULL; char *text = lineFileReadAll(lf); lineFileClose(&lf); return text; } struct lineFile *netLineFileOpen(char *url) /* Return a lineFile attached to url. This one * will skip any headers. Free this with * lineFileClose(). */ { struct lineFile *lf = netLineFileMayOpen(url); if (lf == NULL) noWarnAbort(); return lf; } boolean netSendString(int sd, char *s) /* Send a string down a socket - length byte first. */ { int length = strlen(s); UBYTE len; if (length > 255) errAbort("Trying to send a string longer than 255 bytes (%d bytes)", length); len = length; if (write(sd, &len, 1)<0) { warn("Couldn't send string to socket"); return FALSE; } if (write(sd, s, length)<0) { warn("Couldn't send string to socket"); return FALSE; } return TRUE; } boolean netSendLongString(int sd, char *s) /* Send a long string down socket: two bytes for length. */ { unsigned length = strlen(s); UBYTE b[2]; if (length >= 64*1024) { warn("Trying to send a string longer than 64k bytes (%d bytes)", length); return FALSE; } b[0] = (length>>8); b[1] = (length&0xff); if (write(sd, b, 2) < 0) { warn("Couldn't send long string to socket"); return FALSE; } if (write(sd, s, length)<0) { warn("Couldn't send long string to socket"); return FALSE; } return TRUE; } boolean netSendHugeString(int sd, char *s) /* Send a long string down socket: four bytes for length. */ { unsigned long length = strlen(s); unsigned long l = length; UBYTE b[4]; int i; for (i=3; i>=0; --i) { b[i] = l & 0xff; l >>= 8; } if (write(sd, b, 4) < 0) { warn("Couldn't send huge string to socket"); return FALSE; } if (write(sd, s, length) < 0) { warn("Couldn't send huge string to socket"); return FALSE; } return TRUE; } char *netGetString(int sd, char buf[256]) /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Print warning message * and return NULL if any problem. */ { static char sbuf[256]; UBYTE len = 0; int length; int sz; if (buf == NULL) buf = sbuf; sz = netReadAll(sd, &len, 1); if (sz == 0) return NULL; if (sz < 0) { warn("Couldn't read string length"); return NULL; } length = len; if (length > 0) if (netReadAll(sd, buf, length) < 0) { warn("Couldn't read string body"); return NULL; } buf[length] = 0; return buf; } char *netGetLongString(int sd) /* Read string and return it. freeMem * the result when done. */ { UBYTE b[2]; char *s = NULL; int length = 0; int sz; b[0] = b[1] = 0; sz = netReadAll(sd, b, 2); if (sz == 0) return NULL; if (sz < 0) { warn("Couldn't read long string length"); return NULL; } length = (b[0]<<8) + b[1]; s = needMem(length+1); if (length > 0) if (netReadAll(sd, s, length) < 0) { warn("Couldn't read long string body"); return NULL; } s[length] = 0; return s; } char *netGetHugeString(int sd) /* Read string and return it. freeMem * the result when done. */ { UBYTE b[4]; char *s = NULL; unsigned long length = 0; int sz, i; sz = netReadAll(sd, b, 4); if (sz == 0) return NULL; if (sz < 4) { warn("Couldn't read huge string length"); return NULL; } for (i=0; i<4; ++i) { length <<= 8; length += b[i]; } s = needMem(length+1); if (length > 0) { if (netReadAll(sd, s, length) < 0) { warn("Couldn't read huge string body"); return NULL; } } s[length] = 0; return s; } char *netRecieveString(int sd, char buf[256]) /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Abort if any problem. */ { char *s = netGetString(sd, buf); if (s == NULL) noWarnAbort(); return s; } char *netRecieveLongString(int sd) /* Read string and return it. freeMem * the result when done. Abort if any problem*/ { char *s = netGetLongString(sd); if (s == NULL) noWarnAbort(); return s; } char *netRecieveHugeString(int sd) /* Read string and return it. freeMem * the result when done. Abort if any problem*/ { char *s = netGetHugeString(sd); if (s == NULL) noWarnAbort(); return s; } struct lineFile *netHttpLineFileMayOpen(char *url, struct netParsedUrl **npu) /* Parse URL and open an HTTP socket for it but don't send a request yet. */ { int sd; struct lineFile *lf; /* Parse the URL and try to connect. */ AllocVar(*npu); netParseUrl(url, *npu); if (!sameString((*npu)->protocol, "http")) errAbort("netHttpLineFileMayOpen: url (%s) is not for http.", url); sd = netConnect((*npu)->host, atoi((*npu)->port)); if (sd < 0) return NULL; /* Return handle. */ lf = lineFileAttach(url, TRUE, sd); return lf; } /* netHttpLineFileMayOpen */ void netHttpGet(struct lineFile *lf, struct netParsedUrl *npu, boolean keepAlive) /* Send a GET request, possibly with Keep-Alive. */ { struct dyString *dy = newDyString(512); /* Ask remote server for the file/query. */ dyStringPrintf(dy, "GET %s HTTP/1.1\r\n", npu->file); dyStringPrintf(dy, "User-Agent: genome.ucsc.edu/net.c\r\n"); dyStringPrintf(dy, "Host: %s:%s\r\n", npu->host, npu->port); if (!sameString(npu->user,"")) { char up[256]; char *b64up = NULL; safef(up,sizeof(up), "%s:%s", npu->user, npu->password); b64up = base64Encode(up, strlen(up)); dyStringPrintf(dy, "Authorization: Basic %s\r\n", b64up); freez(&b64up); } dyStringAppend(dy, "Accept: */*\r\n"); if (keepAlive) { dyStringAppend(dy, "Connection: Keep-Alive\r\n"); dyStringAppend(dy, "Connection: Persist\r\n"); } else dyStringAppend(dy, "Connection: close\r\n"); dyStringAppend(dy, "\r\n"); mustWriteFd(lf->fd, dy->string, dy->stringSize); /* Clean up. */ dyStringFree(&dy); } /* netHttpGet */ int netHttpGetMultiple(char *url, struct slName *queries, void *userData, void (*responseCB)(void *userData, char *req, char *hdr, struct dyString *body)) /* Given an URL which is the base of all requests to be made, and a * linked list of queries to be appended to that base and sent in as * requests, send the requests as a batch and read the HTTP response * headers and bodies. If not all the requests get responses (i.e. if * the server is ignoring Keep-Alive or is imposing a limit), try again * until we can't connect or until all requests have been served. * For each HTTP response, do a callback. */ { struct slName *qStart; struct slName *qPtr; struct lineFile *lf; struct netParsedUrl *npu; struct dyString *dyQ = newDyString(512); struct dyString *body; char *base; char *hdr; int qCount; int qTotal; int numParseFailures; int contentLength; boolean chunked; boolean done; boolean keepAlive; /* Find out how many queries we'll need to do so we know how many times * it's OK to run into end of file in case server ignores Keep-Alive. */ qTotal = 0; for (qPtr = queries; qPtr != NULL; qPtr = qPtr->next) { qTotal++; } done = FALSE; qCount = 0; numParseFailures = 0; qStart = queries; while ((! done) && (qStart != NULL)) { lf = netHttpLineFileMayOpen(url, &npu); if (lf == NULL) { done = TRUE; break; } base = cloneString(npu->file); /* Send all remaining requests with keep-alive. */ for (qPtr = qStart; qPtr != NULL; qPtr = qPtr->next) { dyStringClear(dyQ); dyStringAppend(dyQ, base); dyStringAppend(dyQ, qPtr->name); strcpy(npu->file, dyQ->string); keepAlive = (qPtr->next == NULL) ? FALSE : TRUE; netHttpGet(lf, npu, keepAlive); } /* Get as many responses as we can; call responseCB() and * advance qStart for each. */ for (qPtr = qStart; qPtr != NULL; qPtr = qPtr->next) { if (lineFileParseHttpHeader(lf, &hdr, &chunked, &contentLength)) { body = lineFileSlurpHttpBody(lf, chunked, contentLength); dyStringClear(dyQ); dyStringAppend(dyQ, base); dyStringAppend(dyQ, qPtr->name); responseCB(userData, dyQ->string, hdr, body); qStart = qStart->next; qCount++; } else { if (numParseFailures++ > qTotal) { done = TRUE; } break; } } } return qCount; } /* netHttpMultipleQueries */ #endif boolean hasProtocol(char *urlOrPath) /* Return TRUE if it looks like it has http://, ftp:// etc. */ { return stringIn("://", urlOrPath) != NULL; } rtracklayer/src/ucsc/net.h0000644000175100017510000002576312612032142016606 0ustar00biocbuildbiocbuild/* Net.h some stuff to wrap around net communications. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef NET_H #define NET_H #include "linefile.h" #include "dystring.h" #define DEFAULTCONNECTTIMEOUTMSEC 10000 /* default connect timeout for tcp in milliseconds */ #define DEFAULTREADWRITETTIMEOUTSEC 120 /* default read/write timeout for tcp in seconds */ int setReadWriteTimeouts(int sd, int seconds); /* Set read and write timeouts on socket sd * Return -1 if there are any errors, 0 if successful. */ /* add a failure to connFailures[] * which can save time and avoid more timeouts */ int netConnect(char *hostName, int port); /* Start connection with a server having resolved port. Return < 0 if error. */ int netMustConnect(char *hostName, int port); /* Start connection with server or die. */ int netMustConnectTo(char *hostName, char *portName); /* Start connection with a server and a port that needs to be converted to integer */ int netAcceptingSocket(int port, int queueSize); /* Create a socket for to accept connections. */ int netAcceptingSocketFrom(int port, int queueSize, char *host); /* Create a socket that can accept connections from a * IP address on the current machine if the current machine * has multiple IP addresses. */ int netAccept(int sd); /* Accept incoming connection from socket descriptor. */ int netAcceptFrom(int sd, unsigned char subnet[4]); /* Wait for incoming connection from socket descriptor * from IP address in subnet. Subnet is something * returned from netParseDottedQuad. */ FILE *netFileFromSocket(int socket); /* Wrap a FILE around socket. This should be fclose'd * and separately the socket close'd. */ int netWaitForData(int sd, int microseconds); /* Wait for descriptor to have some data to read, up to given number of * microseconds. Returns amount of data there or zero if timed out. */ void netBlockBrokenPipes(); /* Make it so a broken pipe doesn't kill us. */ ssize_t netReadAll(int sd, void *vBuf, ssize_t size); /* Read given number of bytes into buffer. * Don't give up on first read! */ ssize_t netMustReadAll(int sd, void *vBuf, ssize_t size); /* Read given number of bytes into buffer or die. * Don't give up if first read is short! */ boolean netSendString(int sd, char *s); /* Send a string down a socket - length byte first. */ boolean netSendLongString(int sd, char *s); /* Send a string down a socket - up to 64k characters. */ boolean netSendHugeString(int sd, char *s); /* Send a string down a socket - up to 4G characters. */ char *netRecieveString(int sd, char buf[256]); /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Abort if any problem. */ char *netRecieveLongString(int sd); /* Read string up to 64k and return it. freeMem * the result when done. Abort if any problem*/ char *netRecieveHugeString(int sd); /* Read string up to 4G and return it. freeMem * the result when done. Abort if any problem*/ char *netGetString(int sd, char buf[256]); /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Print warning message * and return NULL if any problem. */ char *netGetLongString(int sd); /* Read string up to 64k and return it. freeMem * the result when done. Print warning message and * return NULL if any problem. */ char *netGetHugeString(int sd); /* Read string up to 4 gig and return it. freeMem * the result when done. Print warning message and * return NULL if any problem. */ void netCatchPipes(); /* Set up to catch broken pipe signals. */ boolean netPipeIsBroken(); /* Return TRUE if pipe is broken */ void netClearPipeFlag(); /* Clear broken pipe flag. */ void netParseSubnet(char *in, unsigned char out[4]); /* Parse subnet, which is a prefix of a normal dotted quad form. * Out will contain 255's for the don't care bits. */ struct netParsedUrl /* A parsed URL. */ { char protocol[16]; /* Protocol - http or ftp, etc. */ char user[128]; /* User name (optional) */ char password[128]; /* Password (optional) */ char host[128]; /* Name of host computer - www.yahoo.com, etc. */ char port[16]; /* Port, usually 80 or 8080. */ char file[1024]; /* Remote file name/query string, starts with '/' */ ssize_t byteRangeStart; /* Start of byte range, use -1 for none */ ssize_t byteRangeEnd; /* End of byte range use -1 for none */ }; void netParseUrl(char *url, struct netParsedUrl *parsed); /* Parse a URL into components. A full URL is made up as so: * http://user:password@hostName:port/file;byterange=0-499 * User and password may be cgi-encoded. * This is set up so that the http:// and the port are optional. */ char *urlFromNetParsedUrl(struct netParsedUrl *npu); /* Build URL from netParsedUrl structure */ int netUrlOpen(char *url); /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. Just close(result) when done. Errors from this routine * from web urls are rare, because this just opens up enough to read header, * which may just say "file not found." Consider using netUrlMustOpenPastHeader * instead .*/ int netUrlMustOpenPastHeader(char *url); /* Get socket descriptor for URL. Process header, handling any forwarding and * the like. Do errAbort if there's a problem, which includes anything but a 200 * return from http after forwarding. */ int netUrlOpenSockets(char *url, int *retCtrlSocket); /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. * If retCtrlSocket is non-NULL and url is FTP, set *retCtrlSocket * to the FTP control socket which is left open for a persistent connection. * close(result) (and close(*retCtrlSocket) if applicable) when done. */ struct hash; int netUrlHeadExt(char *url, char *method, struct hash *hash); /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ int netUrlHead(char *url, struct hash *hash); /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ long long netUrlSizeByRangeResponse(char *url); /* Use byteRange as a work-around alternate method to get file size (content-length). * Return negative number if can't get. */ struct lineFile *netLineFileOpen(char *url); /* Return a lineFile attached to url. This one * will skip any headers. Free this with * lineFileClose(). */ struct lineFile *netLineFileMayOpen(char *url); /* Same as netLineFileOpen, but warns and returns * null rather than aborting on problems. */ struct lineFile *netLineFileSilentOpen(char *url); /* Open a lineFile on a URL. Just return NULL without any user * visible warning message if there's a problem. */ struct dyString *netSlurpFile(int sd); /* Slurp file into dynamic string and return. Result will include http headers and * the like. */ struct dyString *netSlurpUrl(char *url); /* Go grab all of URL and return it as dynamic string. Result will include http headers * and the like. This will errAbort if there's a problem. */ char *netReadTextFileIfExists(char *url); /* Read entire URL and return it as a string. URL should be text (embedded zeros will be * interpreted as end of string). If the url doesn't exist or has other problems, * returns NULL. Does *not* include http headers. */ struct lineFile *netHttpLineFileMayOpen(char *url, struct netParsedUrl **npu); /* Parse URL and open an HTTP socket for it but don't send a request yet. */ void netHttpGet(struct lineFile *lf, struct netParsedUrl *npu, boolean keepAlive); /* Send a GET request, possibly with Keep-Alive. */ int netOpenHttpExt(char *url, char *method, char *optionalHeader); /* Return a file handle that will read the url. optionalHeader * may by NULL or may contain cookies and other info. */ int netHttpConnect(char *url, char *method, char *protocol, char *agent, char *optionalHeader); /* Parse URL, connect to associated server on port, and send most of * the request to the server. If specified in the url send user name * and password too. Typically the "method" will be "GET" or "POST" * and the agent will be the name of your program or * library. optionalHeader may be NULL or contain additional header * lines such as cookie info. * Proxy support via hg.conf httpProxy or env var http_proxy * Return data socket, or -1 if error.*/ int netHttpGetMultiple(char *url, struct slName *queries, void *userData, void (*responseCB)(void *userData, char *req, char *hdr, struct dyString *body)); /* Given an URL which is the base of all requests to be made, and a * linked list of queries to be appended to that base and sent in as * requests, send the requests as a batch and read the HTTP response * headers and bodies. If not all the requests get responses (i.e. if * the server is ignoring Keep-Alive or is imposing a limit), try again * until we can't connect or until all requests have been served. * For each HTTP response, do a callback. */ boolean netSkipHttpHeaderLinesWithRedirect(int sd, char *url, char **redirectedUrl); /* Skip http header lines. Return FALSE if there's a problem. * The input is a standard sd or fd descriptor. * This is meant to be able work even with a re-passable stream handle, * e.g. can pass it to the pipes routines, which means we can't * attach a linefile since filling its buffer reads in more than just the http header. * Handles 300, 301, 302, 303, 307 http redirects by setting *redirectedUrl to * the new location. */ boolean netSkipHttpHeaderLinesHandlingRedirect(int sd, char *url, int *redirectedSd, char **redirectedUrl); /* Skip http headers lines, returning FALSE if there is a problem. Generally called as * netSkipHttpHeaderLine(sd, url, &sd, &url); * where sd is a socket (file) opened with netUrlOpen(url), and url is in dynamic memory. * If the http header indicates that the file has moved, then it will update the *redirectedSd and * *redirectedUrl with the new socket and URL, first closing sd. * If for some reason you want to detect whether the forwarding has occurred you could * call this as: * char *newUrl = NULL; * int newSd = 0; * netSkipHttpHeaderLine(sd, url, &newSd, &newUrl); * if (newUrl != NULL) * // Update sd with newSd, free url if appropriate and replace it with newUrl, etc. * // free newUrl when finished. * This routine handles up to 5 steps of redirection. * The logic to this routine is also complicated a little to make it work in a pipe, which means we * can't attach a lineFile since filling the lineFile buffer reads in more than just the http header. */ boolean netGetFtpInfo(char *url, long long *retSize, time_t *retTime); /* Return date in UTC and size of ftp url file */ boolean hasProtocol(char *urlOrPath); /* Return TRUE if it looks like it has http://, ftp:// etc. */ #endif /* NET_H */ rtracklayer/src/ucsc/obscure.c0000644000175100017510000004411012612032142017440 0ustar00biocbuildbiocbuild/* Obscure stuff that is handy every now and again. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #include "portable.h" #include "localmem.h" #include "hash.h" #include "obscure.h" #include "linefile.h" static int _dotForUserMod = 100; /* How often does dotForUser() output a dot. */ long incCounterFile(char *fileName) /* Increment a 32 bit value on disk. */ { long val = 0; FILE *f = fopen(fileName, "r+b"); if (f != NULL) { mustReadOne(f, val); rewind(f); } else { f = fopen(fileName, "wb"); } ++val; if (f != NULL) { fwrite(&val, sizeof(val), 1, f); if (fclose(f) != 0) errnoAbort("fclose failed"); } return val; } int digitsBaseTwo(unsigned long x) /* Return base two # of digits. */ { int digits = 0; while (x) { digits += 1; x >>= 1; } return digits; } int digitsBaseTen(int x) /* Return number of digits base 10. */ { int digCount = 1; if (x < 0) { digCount = 2; x = -x; } while (x >= 10) { digCount += 1; x /= 10; } return digCount; } void writeGulp(char *file, char *buf, int size) /* Write out a bunch of memory. */ { FILE *f = mustOpen(file, "w"); mustWrite(f, buf, size); carefulClose(&f); } void readInGulp(char *fileName, char **retBuf, size_t *retSize) /* Read whole file in one big gulp. */ { size_t size = (size_t)fileSize(fileName); char *buf; FILE *f = mustOpen(fileName, "rb"); *retBuf = buf = needLargeMem(size+1); mustRead(f, buf, size); buf[size] = 0; /* Just in case it needs zero termination. */ fclose(f); if (retSize != NULL) *retSize = size; } void readAllWords(char *fileName, char ***retWords, int *retWordCount, char **retBuf) /* Read in whole file and break it into words. You need to freeMem both * *retWordCount and *retBuf when done. */ { int wordCount; char *buf = NULL; char **words = NULL; size_t bufSize; readInGulp(fileName, &buf, &bufSize); wordCount = chopByWhite(buf, NULL, 0); if (wordCount != 0) { words = needMem(wordCount * sizeof(words[0])); chopByWhite(buf, words, wordCount); } *retWords = words; *retWordCount = wordCount; *retBuf = buf; } int countWordsInFile(char *fileName) /* Count number of words in file. */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *line; int wordCount = 0; while (lineFileNext(lf, &line, NULL)) wordCount += chopByWhite(line, NULL, 0); lineFileClose(&lf); return wordCount; } struct hash *hashWordsInFile(char *fileName, int hashSize) /* Create a hash of space delimited words in file. */ { struct hash *hash = newHash(hashSize); struct lineFile *lf = lineFileOpen(fileName, TRUE); char *line, *word; while (lineFileNext(lf, &line, NULL)) { while ((word = nextWord(&line)) != NULL) hashAdd(hash, word, NULL); } lineFileClose(&lf); return hash; } struct hash *hashNameIntFile(char *fileName) /* Given a two column file (name, integer value) return a * hash keyed by name with integer values */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; struct hash *hash = hashNew(16); while (lineFileRow(lf, row)) hashAddInt(hash, row[0], lineFileNeedNum(lf, row, 1)); lineFileClose(&lf); return hash; } struct hash *hashTwoColumnFile(char *fileName) /* Given a two column file (key, value) return a hash. */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; struct hash *hash = hashNew(16); while (lineFileRow(lf, row)) { char *name = row[0]; char *value = lmCloneString(hash->lm, row[1]); hashAdd(hash, name, value); } lineFileClose(&lf); return hash; } struct slName *readAllLines(char *fileName) /* Read all lines of file into a list. (Removes trailing carriage return.) */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); struct slName *list = NULL, *el; char *line; while (lineFileNext(lf, &line, NULL)) { el = newSlName(line); slAddHead(&list, el); } lineFileClose(&lf); slReverse(&list); return list; } void copyFile(char *source, char *dest) /* Copy file from source to dest. */ { int bufSize = 64*1024; char *buf = needMem(bufSize); int bytesRead; int s, d; s = open(source, O_RDONLY); if (s < 0) errAbort("Couldn't open %s. %s\n", source, strerror(errno)); d = creat(dest, 0777); if (d < 0) { close(s); errAbort("Couldn't open %s. %s\n", dest, strerror(errno)); } while ((bytesRead = read(s, buf, bufSize)) > 0) { if (write(d, buf, bytesRead) < 0) errAbort("Write error on %s. %s\n", dest, strerror(errno)); } close(s); if (close(d) != 0) errnoAbort("close failed"); freeMem(buf); } void copyOpenFile(FILE *inFh, FILE *outFh) /* copy an open stdio file */ { int c; while ((c = fgetc(inFh)) != EOF) fputc(c, outFh); if (ferror(inFh)) errnoAbort("file read failed"); if (ferror(outFh)) errnoAbort("file write failed"); } void cpFile(int s, int d) /* Copy from source file to dest until reach end of file. */ { int bufSize = 64*1024, readSize; char *buf = needMem(bufSize); for (;;) { readSize = read(s, buf, bufSize); if (readSize > 0) mustWriteFd(d, buf, readSize); if (readSize <= 0) break; } freeMem(buf); } void *intToPt(int i) /* Convert integer to pointer. Use when really want to store an * int in a pointer field. */ { char *pt = NULL; return pt+i; } int ptToInt(void *pt) /* Convert pointer to integer. Use when really want to store a * pointer in an int. */ { char *a = NULL, *b = pt; return b - a; } void *sizetToPt(size_t i) /* Convert size_t to pointer. Use when really want to store a * size_t in a pointer. */ { char *pt = NULL; return pt+i; } size_t ptToSizet(void *pt) /* Convert pointer to size_t. Use when really want to store a * pointer in a size_t. */ { char *a = NULL, *b = pt; return b - a; } boolean parseQuotedStringNoEscapes( char *in, char *out, char **retNext) /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. * Unlike parseQuotedString() do not treat backslash as an escape * character, merely pass it on through. */ { char c, *s = in; int quoteChar = *s++; for (;;) { c = *s++; if (c == 0) { warn("Unmatched %c", quoteChar); return FALSE; } else if (c == quoteChar) break; else *out++ = c; } *out = 0; if (retNext != NULL) *retNext = s; return TRUE; } boolean parseQuotedString( char *in, char *out, char **retNext) /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. */ { char c, *s = in; int quoteChar = *s++; boolean escaped = FALSE; for (;;) { c = *s++; if (c == 0) { warn("Unmatched %c", quoteChar); return FALSE; } if (escaped) { if (c == '\\' || c == quoteChar) *out++ = c; else { *out++ = '\\'; *out++ = c; } escaped = FALSE; } else { if (c == '\\') escaped = TRUE; else if (c == quoteChar) break; else *out++ = c; } } *out = 0; if (retNext != NULL) *retNext = s; return TRUE; } char *nextQuotedWord(char **pLine) /* Generalization of nextWord. Returns next quoted * string or if no quotes next word. Updates *pLine * to point past word that is returned. Does not return * quotes. */ { char *line, c; line = skipLeadingSpaces(*pLine); if (line == NULL || line[0] == 0) return NULL; c = *line; if (c == '"' || c == '\'') { if (!parseQuotedString(line, line, pLine)) return NULL; return line; } else { return nextWord(pLine); } } void escCopy(char *in, char *out, char toEscape, char escape) /* Copy in to out, escaping as needed. Out better be big enough. * (Worst case is strlen(in)*2 + 1.) */ { char c; for (;;) { c = *in++; if (c == toEscape) *out++ = escape; *out++ = c; if (c == 0) break; } } char *makeEscapedString(char *in, char toEscape) /* Return string that is a copy of in, but with all * toEscape characters preceded by '\' * When done freeMem result. */ { int newSize = strlen(in) + countChars(in, toEscape); char *out = needMem(newSize+1); escCopy(in, out, toEscape, '\\'); return out; } char *makeQuotedString(char *in, char quoteChar) /* Create a string surrounded by quoteChar, with internal * quoteChars escaped. freeMem result when done. */ { int newSize = 2 + strlen(in) + countChars(in, quoteChar); char *out = needMem(newSize+1); out[0] = quoteChar; escCopy(in, out+1, quoteChar, '\\'); out[newSize-1] = quoteChar; return out; } struct hash *hashThisEqThatLine(char *line, int lineIx, boolean firstStartsWithLetter) /* Return a symbol table from a line of form: * 1-this1=val1 2-this='quoted val2' var3="another val" * If firstStartsWithLetter is true, then the left side of the equals must start with * a letter. */ { char *dupe = cloneString(line); char *s = dupe, c; char *var, *val; struct hash *hash = newHash(8); for (;;) { if ((var = skipLeadingSpaces(s)) == NULL) break; if ((c = *var) == 0) break; if (firstStartsWithLetter && !isalpha(c)) errAbort("line %d of custom input: variable needs to start with letter '%s'", lineIx, var); val = strchr(var, '='); if (val == NULL) { errAbort("line %d of var %s in custom input: %s \n missing = in var/val pair", lineIx, var, line); } *val++ = 0; c = *val; if (c == '\'' || c == '"') { if (!parseQuotedString(val, val, &s)) errAbort("line %d of input: missing closing %c", lineIx, c); } else { s = skipToSpaces(val); if (s != NULL) *s++ = 0; } hashAdd(hash, var, cloneString(val)); } freez(&dupe); return hash; } struct hash *hashVarLine(char *line, int lineIx) /* Return a symbol table from a line of form: * var1=val1 var2='quoted val2' var3="another val" */ { return hashThisEqThatLine(line, lineIx, TRUE); } struct slName *stringToSlNames(char *string) /* Convert string to a list of slNames separated by * white space, but allowing multiple words in quotes. * Quotes if any are stripped. */ { struct slName *list = NULL, *name; char *dupe = cloneString(string); char c, *s = dupe, *e; for (;;) { if ((s = skipLeadingSpaces(s)) == NULL) break; if ((c = *s) == 0) break; if (c == '\'' || c == '"') { if (!parseQuotedString(s, s, &e)) errAbort("missing closing %c in %s", c, string); } else { e = skipToSpaces(s); if (e != NULL) *e++ = 0; } name = slNameNew(s); slAddHead(&list, name); s = e; } freeMem(dupe); slReverse(&list); return list; } struct slName *charSepToSlNames(char *string, char c) /* Convert character-separated list of items to slName list. * Note that the last occurence of c is optional. (That * is for a comma-separated list a,b,c and a,b,c, are * equivalent. */ { struct slName *list = NULL, *el; char *s, *e; s = string; while (s != NULL && s[0] != 0) { e = strchr(s, c); if (e == NULL) { el = slNameNew(s); slAddHead(&list, el); break; } else { el = slNameNewN(s, e - s); slAddHead(&list, el); s = e+1; } } slReverse(&list); return list; } struct slName *commaSepToSlNames(char *commaSep) /* Convert comma-separated list of items to slName list. */ { return charSepToSlNames(commaSep, ','); } void sprintLongWithCommas(char *s, long long l) /* Print out a long number with commas a thousands, millions, etc. */ { long long trillions, billions, millions, thousands; if (l >= 1000000000000LL) { trillions = l/1000000000000LL; l -= trillions * 1000000000000LL; billions = l/1000000000; l -= billions * 1000000000; millions = l/1000000; l -= millions * 1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld,%03lld,%03lld", trillions, billions, millions, thousands, l); } else if (l >= 1000000000) { billions = l/1000000000; l -= billions * 1000000000; millions = l/1000000; l -= millions * 1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld,%03lld", billions, millions, thousands, l); } else if (l >= 1000000) { millions = l/1000000; l -= millions * (long long)1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld", millions, thousands, l); } else if (l >= 1000) { thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld", thousands, l); } else sprintf(s, "%lld", l); } void printLongWithCommas(FILE *f, long long l) /* Print out a long number with commas at thousands, millions, etc. */ { char ascii[32]; sprintLongWithCommas(ascii, l); fprintf(f, "%s", ascii); } void sprintWithGreekByte(char *s, int slength, long long size) /* Numbers formatted with PB, TB, GB, MB, KB, B */ { char *greek[] = {"B", "KB", "MB", "GB", "TB", "PB"}; int i = 0; long long d = 1; while ((size/d) >= 1024) { ++i; d *= 1024; } double result = ((double)size)/d; if (result < 10) safef(s,slength,"%3.1f %s",((double)size)/d, greek[i]); else safef(s,slength,"%3.0f %s",((double)size)/d, greek[i]); } void shuffleArrayOfChars(char *array, int arraySize) /* Shuffle array of characters of given size given number of times. */ { char c; int i, randIx; /* Randomly permute an array using the method from Cormen, et al */ for (i=0; i 1) { struct slList *el; struct slList **array; int i; array = needLargeMem(count * sizeof(*array)); for (el = list, i=0; el != NULL; el = el->next, i++) array[i] = el; for (i=0; i<4; ++i) shuffleArrayOfPointers(array, count); list = NULL; for (i=0; inext = list; list = array[i]; } freeMem(array); slReverse(&list); *pL = list; } } void *slListRandomReduce(void *list, double reduceRatio) /* Reduce list to approximately reduceRatio times original size. Destroys original list. */ { if (reduceRatio >= 1.0) return list; int threshold = RAND_MAX * reduceRatio; struct slList *newList = NULL, *next, *el; for (el = list; el != NULL; el = next) { next = el->next; if (rand() <= threshold) { slAddHead(&newList, el); } } return newList; } void *slListRandomSample(void *list, int maxCount) /* Return a sublist of list with at most maxCount. Destroy list in process */ { if (list == NULL) return list; int initialCount = slCount(list); if (initialCount <= maxCount) return list; double reduceRatio = (double)maxCount/initialCount; if (reduceRatio < 0.9) { double conservativeReduceRatio = reduceRatio * 1.05; list = slListRandomReduce(list, conservativeReduceRatio); } int midCount = slCount(list); if (midCount <= maxCount) return list; shuffleList(list); struct slList *lastEl = slElementFromIx(list, maxCount-1); lastEl->next = NULL; return list; } char *stripCommas(char *position) /* make a new string with commas stripped out */ { char *newPos = cloneString(position); char *nPtr = newPos; if (position == NULL) return NULL; while((*nPtr = *position++)) if (*nPtr != ',') nPtr++; return newPos; } void dotForUserInit(int dotMod) /* Set how often dotForUser() outputs a dot. */ { assert(dotMod > 0); _dotForUserMod = dotMod; } void dotForUser() /* Write out a dot every _dotForUserMod times this is called. */ { static int dot = -10; /* Check to see if dot has been initialized. */ if(dot == - 10) dot = _dotForUserMod; if (--dot <= 0) { putc('.', stderr); fflush(stderr); dot = _dotForUserMod; } } void spaceToUnderbar(char *s) /* Convert white space to underbar. */ { char c; while ((c = *s) != 0) { if (isspace(c)) *s = '_'; ++s; } } void printVmPeak() /* print to stderr peak Vm memory usage (if /proc/ business exists) */ { pid_t pid = getpid(); char temp[256]; safef(temp, sizeof(temp), "/proc/%d/status", (int) pid); struct lineFile *lf = lineFileMayOpen(temp, TRUE); if (lf) { char *line; while (lineFileNextReal(lf, &line)) { if (stringIn("VmPeak", line)) { fprintf(stderr, "# pid=%d: %s\n", pid, line); break; } } lineFileClose(&lf); } else fprintf(stderr, "# printVmPeak: %s - not available\n", temp); fflush(stderr); } boolean nameInCommaList(char *name, char *commaList) /* Return TRUE if name is in comma separated list. */ { if (commaList == NULL) return FALSE; int nameLen = strlen(name); for (;;) { char c = *commaList; if (c == 0) return FALSE; if (memcmp(name, commaList, nameLen) == 0) { c = commaList[nameLen]; if (c == 0 || c == ',') return TRUE; } commaList = strchr(commaList, ','); if (commaList == NULL) return FALSE; commaList += 1; } } rtracklayer/src/ucsc/obscure.h0000644000175100017510000001522512612032142017452 0ustar00biocbuildbiocbuild/* Obscure.h - stuff that's relatively rarely used * but still handy. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef OBSCURE_H #define OBSCURE_H long incCounterFile(char *fileName); /* Increment a 32 bit value on disk. */ int digitsBaseTwo(unsigned long x); /* Return base two # of digits. */ int digitsBaseTen(int x); /* Return number of digits base 10. */ void sprintLongWithCommas(char *s, long long l); /* Print out a long number with commas a thousands, millions, etc. */ void printLongWithCommas(FILE *f, long long l); /* Print out a long number with commas a thousands, millions, etc. */ void sprintWithGreekByte(char *s, int slength, long long size); /* Numbers formatted with PB, TB, GB, MB, KB, B */ void writeGulp(char *file, char *buf, int size); /* Write out a bunch of memory. */ void readInGulp(char *fileName, char **retBuf, size_t *retSize); /* Read whole file in one big gulp. */ void readAllWords(char *fileName, char ***retWords, int *retWordCount, char **retBuf); /* Read in whole file and break it into words. You need to freeMem both * *retWordCount and *retBuf when done. */ int countWordsInFile(char *fileName); /* Count number of words in file. */ struct slName *readAllLines(char *fileName); /* Read all lines of file into a list. (Removes trailing carriage return.) */ void copyFile(char *source, char *dest); /* Copy file from source to dest. */ void copyOpenFile(FILE *inFh, FILE *outFh); /* copy an open stdio file */ void cpFile(int s, int d); /* Copy from source file to dest until reach end of file. */ void *intToPt(int i); /* Convert integer to pointer. Use when really want to store an * int in a pointer field. */ int ptToInt(void *pt); /* Convert pointer to integer. Use when really want to store a * pointer in an int. */ void *sizetToPt(size_t i); /* Convert size_t to pointer. Use when really want to store a * size_t in a pointer. */ size_t ptToSizet(void *pt); /* Convert pointer to size_t. Use when really want to store a * pointer in a size_t. */ boolean parseQuotedStringNoEscapes( char *in, char *out, char **retNext); /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. * Unlike parseQuotedString() do not treat backslash as an escape * character, merely pass it on through. */ boolean parseQuotedString( char *in, char *out, char **retNext); /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. */ char *nextQuotedWord(char **pLine); /* Generalization of nextWord. Returns next quoted * string or if no quotes next word. Updates *pLine * to point past word that is returned. Does not return * quotes. */ char *makeQuotedString(char *in, char quoteChar); /* Create a string surrounded by quoteChar, with internal * quoteChars escaped. freeMem result when done. */ char *makeEscapedString(char *in, char toEscape); /* Return string that is a copy of in, but with all * toEscape characters preceded by '\' * When done freeMem result. */ void escCopy(char *in, char *out, char toEscape, char escape); /* Copy in to out, escaping as needed. Out better be big enough. * (Worst case is strlen(in)*2 + 1.) */ struct slName *stringToSlNames(char *string); /* Convert string to a list of slNames separated by * white space, but allowing multiple words in quotes. * Quotes if any are stripped. */ struct slName *commaSepToSlNames(char *commaSep); /* Convert comma-separated list of items to slName list. */ struct slName *charSepToSlNames(char *string, char c); /* Convert character-separated list of items to slName list. * Note that the last occurence of c is optional. (That * is for a comma-separated list a,b,c and a,b,c, are * equivalent. */ struct hash *hashVarLine(char *line, int lineIx); /* Return a symbol table from a line of form: * var1=val1 var2='quoted val2' var3="another val" */ struct hash *hashThisEqThatLine(char *line, int lineIx, boolean firstStartsWithLetter); /* Return a symbol table from a line of form: * 1-this1=val1 2-this='quoted val2' var3="another val" * If firstStartsWithLetter is true, then the left side of the equals must start with * and equals. */ struct hash *hashWordsInFile(char *fileName, int hashSize); /* Create a hash of space delimited words in file. * hashSize is as in hashNew() - pass 0 for default. */ struct hash *hashNameIntFile(char *fileName); /* Given a two column file (name, integer value) return a * hash keyed by name with integer values */ struct hash *hashTwoColumnFile(char *fileName); /* Given a two column file (key, value) return a hash. */ void shuffleArrayOfChars(char *array, int arraySize); /* Shuffle array of characters of given size given number of times. */ void shuffleArrayOfInts(int *array, int arraySize); /* Shuffle array of ints of given size given number of times. */ void shuffleArrayOfPointers(void *pointerArray, int arraySize); /* Shuffle array of pointers of given size given number of times. */ void shuffleList(void *pList); /* Randomize order of slList. Usage: * shuffleList(&list) * where list is a pointer to a structure that * begins with a next field. */ void *slListRandomReduce(void *list, double reduceRatio); /* Reduce list to approximately reduceRatio times original size. Destroys original list. */ void *slListRandomSample(void *list, int maxCount); /* Return a sublist of list with at most maxCount. Destroy list in process */ char *stripCommas(char *position); /* make a new string with commas stripped out */ void dotForUserInit(int dotMod); /* Set how often dotForUser() outputs a dot. */ void dotForUser(); /* Write out a dot every _dotForUserMod times this is called. */ void spaceToUnderbar(char *s); /* Convert white space to underbar. */ void rangeRoundUp(double start, double end, double *retStart, double *retEnd); /* Round start and end so that they cover a slightly bigger range, but with more round * numbers. For instance 0.23:9.89 becomes 0:10 */ void rangeFromMinMaxMeanStd(double minVal, double maxVal, double mean, double std, double *retStart, double *retEnd); /* Given some basic statistical properties, set a range that will be good on a wide * range of biological data. */ void printVmPeak(); /* print to stderr peak Vm memory usage (if /proc/ business exists) */ boolean nameInCommaList(char *name, char *commaList); /* Return TRUE if name is in comma separated list. */ #endif /* OBSCURE_H */ rtracklayer/src/ucsc/options.h0000644000175100017510000000733612612032142017507 0ustar00biocbuildbiocbuild/* Stuff to process options out of command line. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef OPTIONS_H #define OPTIONS_H #include "common.h" /* Types for options */ #define OPTION_BOOLEAN 0x01 #define OPTION_STRING 0x02 #define OPTION_INT 0x04 #define OPTION_FLOAT 0x10 #define OPTION_LONG_LONG 0x20 #define OPTION_MULTI 0x40 #define OPTION_DOUBLE 0x80 /* Mask for option types (excluding OPTION_MULTI) */ #define OPTION_TYPE_MASK (OPTION_BOOLEAN|OPTION_STRING|OPTION_INT|OPTION_FLOAT|OPTION_LONG_LONG|OPTION_DOUBLE) struct optionSpec /* Specification of a single option. An array of these are passed * to optionInit() to validate options. */ { char *name; /* option name */ unsigned flags; /* Flags for option, specifies types */ }; char *optionVal(char *name, char *defaultVal); /* Return named option if in options hash, otherwise default. */ int optionInt(char *name, int defaultVal); /* Return integer value of named option, or default value * if not set. */ long long optionLongLong(char *name, long long defaultVal); /* Return long long value of named option, or default value * if not set. */ float optionFloat(char *name, float defaultVal); /* Return floating point value or default value if not set. */ struct slName *optionMultiVal(char *name, struct slName *defaultVal); /* Returns a list of the values assocated with a named option if in options hash, otherwise default. */ double optionDouble(char *name, double defaultVal); /* Return double value or default value if not set */ boolean optionExists(char *name); /* Return TRUE if option has been set. */ void optionMustExist(char *name); /* Abort if option has not been set. */ void optionInit(int *pArgc, char *argv[], struct optionSpec *optionSpecs); /* Read options in command line into options hash. * Options come in three forms: * -option words starting with dash * option=val words with = in the middle * -option=val combining the two. * The resulting hash will be keyed by the option name with the val * string for value. For '-option' types the value is 'on'. * The words in argv are parsed in assending order. If a word of * "--" is encountered, argument parsing stops. * If optionSpecs is not NULL, it is an array of optionSpec that are * used to validate the options. An option must exist in the array * and the value must be convertable to the type specified in flags. * Boolean options have must no value, all other options must have one. * Array is terminated by a optionSpec with a NULL name. * If array NULL, no validation is done. */ void optionHash(int *pArgc, char *argv[]); /* Read options in command line into options hash. * Options come in three forms: * -option words starting with dash * option=val words with = in the middle * -option=val combining the two. * The resulting hash will be keyed by the option name with the val * string for value. For '-option' types the value is 'on'. * The words in argv are parsed in assending order. If a word of * "--" is encountered, argument parsing stops. */ void optionHashSome(int *pArgc, char *argv[], boolean justFirst); /* Set up option hash from command line, optionally only adding * up to first non-optional word. */ struct hash *optionParseIntoHash(int *pArgc, char *argv[], boolean justFirst); /* Read options in argc/argv into a hash of your own choosing. */ struct hash *optionParseIntoHashExceptNumbers(int *pArgc, char *argv[], boolean justFirst); /* Read options in argc/argv into a hash (except negative numbers) of your own choosing. */ void optionFree(); /* free the option hash */ #endif /* OPTIONS_H */ rtracklayer/src/ucsc/os.c0000644000175100017510000000017412612032142016421 0ustar00biocbuildbiocbuild/* Added by rtracklayer to condition on the platform */ #ifdef WIN32 #include "oswin9x.c" #else #include "osunix.c" #endif rtracklayer/src/ucsc/osunix.c0000644000175100017510000004047412612032142017334 0ustar00biocbuildbiocbuild/* Some wrappers around operating-system specific stuff. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #include #include #include #include #include #include "portable.h" #include "portimpl.h" #include "_portimpl.h" #include #include #include off_t fileSize(char *pathname) /* get file size for pathname. return -1 if not found */ { struct stat mystat; ZeroVar(&mystat); if (stat(pathname,&mystat)==-1) { return -1; } return mystat.st_size; } long long freeSpaceOnFileSystem(char *path) /* Given a path to a file or directory on a file system, return free space * in bytes. */ { struct statvfs fi; int err = statvfs(path,&fi); if (err < 0) errnoAbort("freeSpaceOnFileSystem could not statvfs"); return (long long)fi.f_bsize * fi.f_bavail; } long clock1000() /* A millisecond clock. */ { struct timeval tv; static long origSec; gettimeofday(&tv, NULL); if (origSec == 0) origSec = tv.tv_sec; return (tv.tv_sec-origSec)*1000 + tv.tv_usec / 1000; } void sleep1000(int milli) /* Sleep for given number of 1000ths of second */ { if (milli > 0) { struct timeval tv; tv.tv_sec = milli/1000; tv.tv_usec = (milli%1000)*1000; select(0, NULL, NULL, NULL, &tv); } } long clock1() /* A seconds clock. */ { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec; } void uglyfBreak() /* Go into debugger. */ { static char *nullPt = NULL; nullPt[0] = 0; } char *getCurrentDir() /* Return current directory. Abort if it fails. */ { static char dir[PATH_LEN]; if (getcwd( dir, sizeof(dir) ) == NULL ) errnoAbort("getCurrentDir: can't get current directory"); return dir; } void setCurrentDir(char *newDir) /* Set current directory. Abort if it fails. */ { if (chdir(newDir) != 0) errnoAbort("setCurrentDir: can't to set current directory: %s", newDir); } boolean maybeSetCurrentDir(char *newDir) /* Change directory, return FALSE (and set errno) if fail. */ { return chdir(newDir) == 0; } struct slName *listDir(char *dir, char *pattern) /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ { struct slName *list = NULL, *name; struct dirent *de; DIR *d; if ((d = opendir(dir)) == NULL) return NULL; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (pattern == NULL || wildMatch(pattern, fileName)) { name = newSlName(fileName); slAddHead(&list, name); } } } closedir(d); slNameSort(&list); return list; } struct slName *listDirRegEx(char *dir, char *regEx, int flags) /* Return an alphabetized list of all files that match * the regular expression pattern in directory. * See REGCOMP(3) for flags (e.g. REG_ICASE) */ { struct slName *list = NULL, *name; struct dirent *de; DIR *d; regex_t re; int err = regcomp(&re, regEx, flags | REG_NOSUB); if(err) errAbort("regcomp failed; err: %d", err); if ((d = opendir(dir)) == NULL) return NULL; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (!regexec(&re, fileName, 0, NULL, 0)) { name = newSlName(fileName); slAddHead(&list, name); } } } closedir(d); regfree(&re); slNameSort(&list); return list; } boolean makeDir(char *dirName) /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ { int err; if ((err = mkdir(dirName, 0777)) < 0) { if (errno != EEXIST) { perror(""); errAbort("Couldn't make directory %s", dirName); } return FALSE; } return TRUE; } struct fileInfo *listDirXExt(char *dir, char *pattern, boolean fullPath, boolean ignoreStatFailures) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { struct fileInfo *list = NULL, *el; struct dirent *de; DIR *d; int dirNameSize = strlen(dir); int fileNameOffset = dirNameSize+1; char pathName[512]; if ((d = opendir(dir)) == NULL) return NULL; memcpy(pathName, dir, dirNameSize); pathName[dirNameSize] = '/'; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (pattern == NULL || wildMatch(pattern, fileName)) { struct stat st; bool isDir = FALSE; int statErrno = 0; strcpy(pathName+fileNameOffset, fileName); if (stat(pathName, &st) < 0) { if (ignoreStatFailures) statErrno = errno; else errAbort("stat failed in listDirX"); } if (S_ISDIR(st.st_mode)) isDir = TRUE; if (fullPath) fileName = pathName; el = newFileInfo(fileName, st.st_size, isDir, statErrno, st.st_atime); slAddHead(&list, el); } } } closedir(d); slSort(&list, cmpFileInfo); return list; } struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { return listDirXExt(dir, pattern, fullPath, FALSE); } time_t fileModTime(char *pathName) /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ { struct stat st; if (stat(pathName, &st) < 0) errAbort("stat failed in fileModTime: %s", pathName); return st.st_mtime; } char *getHost() /* Return host name. */ { static char *hostName = NULL; static char buf[128]; if (hostName == NULL) { hostName = getenv("HTTP_HOST"); if (hostName == NULL) { hostName = getenv("HOST"); if (hostName == NULL) { if (hostName == NULL) { static struct utsname unamebuf; if (uname(&unamebuf) >= 0) hostName = unamebuf.nodename; else hostName = "unknown"; } } } strncpy(buf, hostName, sizeof(buf)); chopSuffix(buf); hostName = buf; } return hostName; } char *mysqlHost() /* Return host computer on network for mySQL database. */ { boolean gotIt = FALSE; static char *host = NULL; if (!gotIt) { static char hostBuf[128]; gotIt = TRUE; if (fileExists("mysqlHost")) { return (host = firstWordInFile("mysqlHost", hostBuf, sizeof(hostBuf))); } else return (host = getenv("MYSQLHOST")); } return host; } char *semiUniqName(char *base) /* Figure out a name likely to be unique. * Name will have no periods. Returns a static * buffer, so best to clone result unless using * immediately. */ { int pid = getpid(); int num = time(NULL)&0xFFFFF; char host[512]; strcpy(host, getHost()); char *s = strchr(host, '.'); if (s != NULL) *s = 0; subChar(host, '-', '_'); subChar(host, ':', '_'); static char name[PATH_LEN]; safef(name, sizeof(name), "%s_%s_%x_%x", base, host, pid, num); return name; } char *rTempName(char *dir, char *base, char *suffix) /* Make a temp name that's almost certainly unique. */ { char *x; static char fileName[PATH_LEN]; int i; char *lastSlash = (lastChar(dir) == '/' ? "" : "/"); for (i=0;;++i) { x = semiUniqName(base); safef(fileName, sizeof(fileName), "%s%s%s%d%s", dir, lastSlash, x, i, suffix); if (!fileExists(fileName)) break; } return fileName; } void mustRename(char *oldName, char *newName) /* Rename file or die trying. */ { int err = rename(oldName, newName); if (err < 0) errnoAbort("Couldn't rename %s to %s", oldName, newName); } void mustRemove(char *path) /* Remove file or die trying */ { int err = remove(path); if (err < 0) errnoAbort("Couldn't remove %s", path); } static void eatSlashSlashInPath(char *path) /* Convert multiple // to single // */ { char *s, *d; s = d = path; char c, lastC = 0; while ((c = *s++) != 0) { if (c == '/' && lastC == c) continue; *d++ = c; lastC = c; } *d = 0; } static void eatExcessDotDotInPath(char *path) /* If there's a /.. in path take it out. Turns * 'this/long/../dir/file' to 'this/dir/file * and * 'this/../file' to 'file' * * and * 'this/long/..' to 'this' * and * 'this/..' to '' * and * /this/..' to '/' */ { /* Take out each /../ individually */ for (;;) { /* Find first bit that needs to be taken out. */ char *excess= strstr(path, "/../"); char *excessEnd = excess+4; if (excess == NULL || excess == path) break; /* Look for a '/' before this */ char *excessStart = matchingCharBeforeInLimits(path, excess, '/'); if (excessStart == NULL) /* Preceding '/' not found */ excessStart = path; else excessStart += 1; strcpy(excessStart, excessEnd); } /* Take out final /.. if any */ if (endsWith(path, "/..")) { if (!sameString(path, "/..")) /* We don't want to turn this to blank. */ { int len = strlen(path); char *excessStart = matchingCharBeforeInLimits(path, path+len-3, '/'); if (excessStart == NULL) /* Preceding '/' not found */ excessStart = path; else excessStart += 1; *excessStart = 0; } } } char *simplifyPathToDir(char *path) /* Return path with ~ and .. taken out. Also any // or trailing /. * freeMem result when done. */ { /* Expand ~ if any with result in newPath */ char newPath[PATH_LEN]; int newLen = 0; char *s = path; if (*s == '~') { char *homeDir = getenv("HOME"); if (homeDir == NULL) errAbort("No HOME environment var defined after ~ in simplifyPathToDir"); ++s; if (*s == '/') /* ~/something */ { ++s; safef(newPath, sizeof(newPath), "%s/", homeDir); } else /* ~something */ { safef(newPath, sizeof(newPath), "%s/../", homeDir); } newLen = strlen(newPath); } int remainingLen = strlen(s); if (newLen + remainingLen >= sizeof(newPath)) errAbort("path too big in simplifyPathToDir"); strcpy(newPath+newLen, s); /* Remove //, .. and trailing / */ eatSlashSlashInPath(newPath); eatExcessDotDotInPath(newPath); int lastPos = strlen(newPath)-1; if (lastPos > 0 && newPath[lastPos] == '/') newPath[lastPos] = 0; return cloneString(newPath); } #ifdef DEBUG void simplifyPathToDirSelfTest() { /* First test some cases which should remain the same. */ assert(sameString(simplifyPathToDir(""),"")); assert(sameString(simplifyPathToDir("a"),"a")); assert(sameString(simplifyPathToDir("a/b"),"a/b")); assert(sameString(simplifyPathToDir("/"),"/")); assert(sameString(simplifyPathToDir("/.."),"/..")); assert(sameString(simplifyPathToDir("/../a"),"/../a")); /* Now test removing trailing slash. */ assert(sameString(simplifyPathToDir("a/"),"a")); assert(sameString(simplifyPathToDir("a/b/"),"a/b")); /* Test .. removal. */ assert(sameString(simplifyPathToDir("a/.."),"")); assert(sameString(simplifyPathToDir("a/../"),"")); assert(sameString(simplifyPathToDir("a/../b"),"b")); assert(sameString(simplifyPathToDir("/a/.."),"/")); assert(sameString(simplifyPathToDir("/a/../"),"/")); assert(sameString(simplifyPathToDir("/a/../b"),"/b")); assert(sameString(simplifyPathToDir("a/b/.."),"a")); assert(sameString(simplifyPathToDir("a/b/../"),"a")); assert(sameString(simplifyPathToDir("a/b/../c"),"a/c")); assert(sameString(simplifyPathToDir("a/../b/../c"),"c")); assert(sameString(simplifyPathToDir("a/../b/../c/.."),"")); assert(sameString(simplifyPathToDir("/a/../b/../c/.."),"/")); /* Test // removal */ assert(sameString(simplifyPathToDir("//"),"/")); assert(sameString(simplifyPathToDir("//../"),"/..")); assert(sameString(simplifyPathToDir("a//b///c"),"a/b/c")); assert(sameString(simplifyPathToDir("a/b///"),"a/b")); } #endif /* DEBUG */ char *getUser() /* Get user name */ { uid_t uid = geteuid(); struct passwd *pw = getpwuid(uid); if (pw == NULL) errnoAbort("getUser: can't get user name for uid %d", (int)uid); return pw->pw_name; } int mustFork() /* Fork or abort. */ { int childId = fork(); if (childId == -1) errnoAbort("mustFork: Unable to fork"); return childId; } int rawKeyIn() /* Read in an unbuffered, unechoed character from keyboard. */ { struct termios attr; tcflag_t old; char c; /* Set terminal to non-echoing non-buffered state. */ if (tcgetattr(STDIN_FILENO, &attr) != 0) errAbort("Couldn't do tcgetattr"); old = attr.c_lflag; attr.c_lflag &= ~ICANON; attr.c_lflag &= ~ECHO; if (tcsetattr(STDIN_FILENO, TCSANOW, &attr) == -1) errAbort("Couldn't do tcsetattr"); /* Read one byte */ if (read(STDIN_FILENO,&c,1) != 1) errnoAbort("rawKeyIn: I/O error"); /* Put back terminal to how it was. */ attr.c_lflag = old; if (tcsetattr(STDIN_FILENO, TCSANOW, &attr) == -1) errAbort("Couldn't do tcsetattr2"); return c; } boolean isPipe(int fd) /* determine in an open file is a pipe */ { struct stat buf; if (fstat(fd, &buf) < 0) errnoAbort("isPipe: fstat failed"); return S_ISFIFO(buf.st_mode); } void childExecFailedExit(char *msg) /* Child exec failed, so quit without atexit cleanup */ { fprintf(stderr, "child exec failed: %s\n", msg); fflush(stderr); _exit(1); // Let the parent know that the child failed by returning 1. /* Explanation: _exit() is not the normal exit(). _exit() avoids the usual atexit() cleanup. The MySQL library that we link to uses atexit() cleanup to close any open MySql connections. However, because the child's mysql connections are shared by the parent, this causes the parent MySQL connections to become invalid, and causes the puzzling "MySQL has gone away" error in the parent when it tries to use its now invalid MySQL connections. */ } static void execPStack(pid_t ppid) /* exec pstack on the specified pid */ { char *cmd[3], pidStr[32]; safef(pidStr, sizeof(pidStr), "%ld", (long)ppid); cmd[0] = "pstack"; cmd[1] = pidStr; cmd[2] = NULL; // redirect stdout to stderr if (dup2(2, 1) < 0) errAbort("dup2 failed"); execvp(cmd[0], cmd); childExecFailedExit(cmd[0]); // cannot use the normal errAbort. } void vaDumpStack(char *format, va_list args) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ { static boolean inDumpStack = FALSE; // don't allow re-entry if called from error handler if (inDumpStack) return; inDumpStack = TRUE; fflush(stdout); // clear buffer before forking vfprintf(stderr, format, args); fputc('\n', stderr); fflush(stderr); pid_t ppid = getpid(); pid_t pid = fork(); if (pid < 0) { perror("can't fork pstack"); return; } if (pid == 0) execPStack(ppid); int wstat; if (waitpid(pid, &wstat, 0) < 0) perror("waitpid on pstack failed"); else { if (WIFEXITED(wstat)) { if (WEXITSTATUS(wstat) != 0) fprintf(stderr, "pstack failed\n"); } else if (WIFSIGNALED(wstat)) fprintf(stderr, "pstack signaled %d\n", WTERMSIG(wstat)); } inDumpStack = FALSE; } void dumpStack(char *format, ...) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ { va_list args; va_start(args, format); vaDumpStack(format, args); va_end(args); } boolean maybeTouchFile(char *fileName) /* If file exists, set its access and mod times to now. If it doesn't exist, create it. * Return FALSE if we have a problem doing so (e.g. when qateam is gdb'ing and code tries * to touch some file owned by www). */ { if (fileExists(fileName)) { struct utimbuf ut; ut.actime = ut.modtime = clock1(); int ret = utime(fileName, &ut); if (ret != 0) { warn("utime(%s) failed (ownership?)", fileName); return FALSE; } } else { FILE *f = fopen(fileName, "w"); if (f == NULL) return FALSE; else carefulClose(&f); } return TRUE; } boolean isRegularFile(char *fileName) /* Return TRUE if fileName is a regular file. */ { struct stat st; if (stat(fileName, &st) < 0) return FALSE; if (S_ISREG(st.st_mode)) return TRUE; return FALSE; } void makeSymLink(char *oldName, char *newName) /* Return a symbolic link from newName to oldName or die trying */ { int err = symlink(oldName, newName); if (err < 0) errnoAbort("Couldn't make symbolic link from %s to %s\n", oldName, newName); } rtracklayer/src/ucsc/oswin9x.c0000644000175100017510000001133212612032142017416 0ustar00biocbuildbiocbuild/* Stuff that's specific for Win95 goes here. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include #include "common.h" #include #include #include "portable.h" #include "_portimpl.h" /* for cmpFileInfo */ static char const rcsid[] = "$Id: oswin9x.c,v 1.9 2008/06/27 18:46:53 markd Exp $"; boolean isRegularFile(char *fileName) { DWORD dwAttrib = GetFileAttributes((LPCTSTR)fileName); return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); } /* Return how long the named file is in bytes. * Return -1 if no such file. */ off_t fileSize(char *fileName) { int fd; long size; fd = _open(fileName, _O_RDONLY, 0); if (fd < 0) return -1; size = _lseek(fd, 0L, SEEK_END); _close(fd); return size; } time_t fileModTime(char *pathName) /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ { struct _finddata_t fileInfo; if (_findfirst( pathName, &fileInfo) == -1L) errAbort("_findFirst failed in fileModTime: %s", pathName); return fileInfo.time_write; } void sleep1000(int milli) /* Sleep for given number of 1000ths of second */ { if (milli > 0) { Sleep(milli); } } long clock1000() /* A millisecond clock. */ { return clock() /* 1000/CLOCKS_PER_SEC */; /* CLOCKS_PER_SEC == 1000 for windows */ } long clock1() /* Second clock. */ { return clock()/CLOCKS_PER_SEC; } void uglyfBreak() /* Go into debugger. */ { /* __asm { int 3 } */ } char *getCurrentDir() /* Return current directory. */ { static char dir[_MAX_PATH]; if( _getcwd( dir, _MAX_PATH ) == NULL ) errnoAbort("can't get current directory"); return dir; } void setCurrentDir(char *newDir) /* Set current directory. Abort if it fails. */ { if (_chdir(newDir) != 0) errnoAbort("can't to set current directory: %s", newDir); } boolean maybeSetCurrentDir(char *newDir) /* Change directory, return FALSE (and set errno) if fail. */ { return _chdir(newDir) == 0; } struct slName *listDir(char *dir, char *pattern) /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ { long hFile; struct _finddata_t fileInfo; struct slName *list = NULL, *name; boolean otherDir = FALSE; char *currentDir; if (dir == NULL || sameString(".", dir) || sameString("", dir)) dir = ""; else { currentDir = getCurrentDir(); setCurrentDir(dir); otherDir = TRUE; } if (pattern == NULL) pattern = "*"; if( (hFile = _findfirst( pattern, &fileInfo)) == -1L ) return NULL; do { if (!sameString(".", fileInfo.name) && !sameString("..", fileInfo.name)) { name = newSlName(fileInfo.name); slAddHead(&list, name); } } while( _findnext( hFile, &fileInfo) == 0 ); _findclose( hFile ); if (otherDir) setCurrentDir(currentDir); slNameSort(&list); return list; } boolean makeDir(char *dirName) /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ { if (!CreateDirectory(dirName, NULL)) { perror(""); errAbort("Couldn't make directory %s", dirName); return FALSE; } return TRUE; } struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { struct fileInfo *list = NULL, *el; long hFile; struct _finddata_t fileInfo; boolean otherDir = FALSE; char *currentDir; int dirNameSize = strlen(dir); int fileNameOffset = dirNameSize+1; char pathName[512]; if (dir == NULL || sameString(".", dir) || sameString("", dir)) dir = ""; else { currentDir = getCurrentDir(); setCurrentDir(dir); otherDir = TRUE; } if (pattern == NULL) pattern = "*"; if( (hFile = _findfirst( pattern, &fileInfo)) == -1L ) return NULL; memcpy(pathName, dir, dirNameSize); pathName[dirNameSize] = '/'; do { if (!sameString(".", fileInfo.name) && !sameString("..", fileInfo.name)) { char *fileName = fileInfo.name; strcpy(pathName+fileNameOffset, fileName); if (fullPath) fileName = pathName; el = newFileInfo(fileInfo.name, fileInfo.size, fileInfo.attrib & _A_SUBDIR, 0, fileInfo.time_access); slAddHead(&list, el); } } while( _findnext( hFile, &fileInfo) == 0 ); _findclose( hFile ); if (otherDir) setCurrentDir(currentDir); slSort(&list, cmpFileInfo); return list; } rtracklayer/src/ucsc/pipeline.c0000644000175100017510000005224012612032142017606 0ustar00biocbuildbiocbuild#ifndef WIN32 /* pipeline.c - create a process pipeline that can be used for reading or * writing */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "pipeline.h" #include "common.h" #include "sqlNum.h" #include "dystring.h" #include "errAbort.h" #include "portable.h" #include "linefile.h" #include #include #include #include enum procState /* process state, in order of transition */ { procStateNew, // plProc object created procStateRun, // proccess running procStateDone // process finished (ok or failed) }; struct plProc /* A single process in a pipeline */ { struct plProc *next; /* order list of processes */ struct pipeline *pl; /* pipeline we are associated with */ char **cmd; /* null-terminated command for this process */ pid_t pid; /* pid for process, -1 if not running */ enum procState state; /* state of process */ int status; /* status from wait */ }; struct pipeline /* Object for a process pipeline and associated open file. Pipeline process * consist of a process group leader and then all of the child process. The * group leader does no work, just wait on processes to complete and report * errors to the top level process. This object is create in the calling * process, and then passed down, but not shared, via forks. */ { struct plProc *procs; /* list of processes */ int numRunning; /* number of processes running */ pid_t groupLeader; /* process group id, or -1 if not set. This is pid of group leader */ char *procName; /* name to use in error messages. */ int pipeFd; /* fd of pipe to/from process, -1 if none */ unsigned options; /* options */ FILE* pipeFh; /* optional stdio around pipe */ char* stdioBuf; /* optional stdio buffer */ struct lineFile *pipeLf; /* optional lineFile around pipe */ }; /* file buffer size */ #define FILE_BUF_SIZE 64*1024 static int pipeCreate(int *writeFd) /* create a pipe or die, return readFd */ { int pipeFds[2]; if (pipe(pipeFds) < 0) errnoAbort("can't create pipe"); *writeFd = pipeFds[1]; return pipeFds[0]; } static void safeClose(int *fdPtr) /* Close with error checking. *fdPtr == -1 indicated already closed */ { int fd = *fdPtr; if (fd != -1) { if (close(fd) < 0) errnoAbort("close failed on fd %d", fd); *fdPtr = -1; } } static void closeNonStdDescriptors(void) /* close non-standard file descriptors */ { long maxFd = sysconf(_SC_OPEN_MAX); if (maxFd < 0) maxFd = 4096; // shouldn't really happen int fd; for (fd = STDERR_FILENO+1; fd < maxFd; fd++) close(fd); } static char* joinCmd(char **cmd) /* join an cmd vector into a space separated string */ { struct dyString *str = dyStringNew(512); int i; for (i = 0; cmd[i] != NULL; i++) { if (i > 0) dyStringAppend(str, " "); dyStringAppend(str, cmd[i]); } return dyStringCannibalize(&str); } static char* joinCmds(char ***cmds) /* join an cmds vetor into a space and pipe separated string */ { struct dyString *str = dyStringNew(512); int i, j; for (i = 0; cmds[i] != NULL; i++) { if (i > 0) dyStringAppend(str, " | "); for (j = 0; cmds[i][j] != NULL; j++) { if (j > 0) dyStringAppend(str, " "); dyStringAppend(str, cmds[i][j]); } } return dyStringCannibalize(&str); } static char** cloneCmdVector(char **cmd) /* make a copy of the vector */ { int i, cmdLen = 0; for (i = 0; cmd[i] != NULL; i++) cmdLen++; char **cmd2 = needMem((cmdLen+1)*sizeof(char*)); for (i = 0; i < cmdLen; i++) cmd2[i] = cloneString(cmd[i]); cmd2[cmdLen] = NULL; return cmd2; } static struct plProc* plProcNew(char **cmd, struct pipeline *pl) /* create a new plProc object for a command. */ { struct plProc* proc; AllocVar(proc); proc->pl = pl; proc->cmd = cloneCmdVector(cmd); proc->state = procStateNew; return proc; } static void plProcFree(struct plProc *proc) /* free a plProc object. */ { int i; for (i = 0; proc->cmd[i] != NULL; i++) freeMem(proc->cmd[i]); freeMem(proc->cmd); freeMem(proc); } static void plProcStateTrans(struct plProc *proc, enum procState newState) /* do state transition for process changing it to a new state */ { // States must transition in order. New state must immediately follow the // current state. if (newState != proc->state+1) errAbort("invalid state transition: %d -> %d", proc->state, newState); proc->state = newState; } static void plProcSetup(struct plProc* proc, int stdinFd, int stdoutFd, int stderrFd) /* setup signal, error handling, and file descriptors after fork */ { /* Optionally treat a closed pipe as an EOF rather than getting SIGPIPE */ if (signal(SIGPIPE, ((proc->pl->options & pipelineSigpipe) ? SIG_DFL : SIG_IGN)) == SIG_ERR) errnoAbort("error ignoring SIGPIPE"); if (setpgid(getpid(), proc->pl->groupLeader) != 0) errnoAbort("error from setpgid(%d, %d)", getpid(), proc->pl->groupLeader); /* child, first setup stdio files */ if (stdinFd != STDIN_FILENO) { if (dup2(stdinFd, STDIN_FILENO) < 0) errnoAbort("can't dup2 to stdin"); } if (stdoutFd != STDOUT_FILENO) { if (dup2(stdoutFd, STDOUT_FILENO) < 0) errnoAbort("can't dup2 to stdout"); } if (stderrFd != STDERR_FILENO) { if (dup2(stderrFd, STDERR_FILENO) < 0) errnoAbort("can't dup2 to stderr"); } closeNonStdDescriptors(); } static void plProcExecChild(struct plProc* proc, int stdinFd, int stdoutFd, int stderrFd) /* child part of process startup. */ { plProcSetup(proc, stdinFd, stdoutFd, stderrFd); execvp(proc->cmd[0], proc->cmd); errnoAbort("exec failed: %s", proc->cmd[0]); } static void plProcMemWrite(struct plProc* proc, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* implements child process to write memory buffer to pipeline after * fork */ { plProcSetup(proc, STDIN_FILENO, stdoutFd, stderrFd); ssize_t wrCnt = write(STDOUT_FILENO, otherEndBuf, otherEndBufSize); if (wrCnt < 0) errnoAbort("pipeline input buffer write failed"); else if (wrCnt != otherEndBufSize) errAbort("pipeline input buffer short write %lld, expected %lld", (long long)wrCnt, (long long)otherEndBufSize); else { close(STDOUT_FILENO); exit(0); } } static void plProcHandleSignaled(struct plProc* proc, int status) /* handle one of the processes terminating on a signal */ { assert(WIFSIGNALED(proc->status)); if (!((WTERMSIG(proc->status) == SIGPIPE) && (proc->pl->options & pipelineSigpipe))) { errAbort("process terminated on signal %d: \"%s\" in pipeline \"%s\"", WTERMSIG(proc->status), joinCmd(proc->cmd), proc->pl->procName); } } static void plProcHandleExited(struct plProc* proc, int status) /* handle one of the processes terminating on an exit */ { assert(WIFEXITED(proc->status)); if (WEXITSTATUS(proc->status) != 0) { // only print an error message if aborting if (!(proc->pl->options & pipelineNoAbort)) fprintf(stderr, "process exited with %d: \"%s\" in pipeline \"%s\"\n", WEXITSTATUS(proc->status), joinCmd(proc->cmd), proc->pl->procName); exit(WEXITSTATUS(proc->status)); // pass back exit code } } static void plProcHandleTerminate(struct plProc* proc, int status) /* handle one of the processes terminating, save exit status */ { proc->pid = -1; proc->status = status; plProcStateTrans(proc, procStateDone); if (WIFSIGNALED(proc->status)) plProcHandleSignaled(proc, status); else plProcHandleExited(proc, status); } static struct pipeline* pipelineNew(char ***cmds, unsigned options) /* create a new pipeline object. Doesn't start processes */ { static char *memPseudoCmd[] = {"[mem]", NULL}; struct pipeline *pl; int iCmd; AllocVar(pl); pl->groupLeader = -1; pl->pipeFd = -1; pl->options = options; pl->procName = joinCmds(cmds); if (cmds[0] == NULL) errAbort("no commands in pipeline"); if (options & pipelineMemInput) { /* add proc for forked process to write memory to pipeline */ slAddTail(&pl->procs, plProcNew(memPseudoCmd, pl)); } for(iCmd = 0; cmds[iCmd] != NULL; iCmd++) slAddTail(&pl->procs, plProcNew(cmds[iCmd], pl)); return pl; } void pipelineFree(struct pipeline **plPtr) /* free a pipeline object */ { struct pipeline *pl = *plPtr; if (pl != NULL) { struct plProc *proc = pl->procs; while (proc != NULL) { struct plProc *delProc = proc; proc = proc->next; plProcFree(delProc); } freez(&pl->procName); freez(&pl->stdioBuf); freez(plPtr); } } static struct plProc *pipelineFindProc(struct pipeline *pl, pid_t pid) /* find a plProc by pid */ { struct plProc *proc; for (proc = pl->procs; proc != NULL; proc = proc->next) if (proc->pid == pid) return proc; errAbort("pid not found in pipeline: %d", (int)pid); return 0; // never reached } static void execProcChild(struct pipeline* pl, struct plProc *proc, int procStdinFd, int procStdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* handle child process setup after fork. This does not return */ { if (otherEndBuf != NULL) plProcMemWrite(proc, procStdoutFd, stderrFd, otherEndBuf, otherEndBufSize); else plProcExecChild(proc, procStdinFd, procStdoutFd, stderrFd); } static int pipelineExecProc(struct pipeline* pl, struct plProc *proc, int prevStdoutFd, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* start a process in the pipeline, return the stdout fd of the process */ { /* determine stdin/stdout to use */ int procStdinFd, procStdoutFd; if (proc == pl->procs) procStdinFd = stdinFd; /* first process in pipeline */ else procStdinFd = prevStdoutFd; if (proc->next == NULL) procStdoutFd = stdoutFd; /* last process in pipeline */ else prevStdoutFd = pipeCreate(&procStdoutFd); /* start process */ if ((proc->pid = fork()) < 0) errnoAbort("can't fork"); if (proc->pid == 0) execProcChild(pl, proc, procStdinFd, procStdoutFd, stderrFd, otherEndBuf, otherEndBufSize); /* record that we did this */ plProcStateTrans(proc, procStateRun); pl->numRunning++; /* don't leave intermediate pipes open in parent */ if (proc != pl->procs) safeClose(&procStdinFd); if (proc->next != NULL) safeClose(&procStdoutFd); return prevStdoutFd; } static void pipelineGroupExec(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* Start all processes in a pipeline, stdinFd and stdoutFd are the ends of * the pipeline, stderrFd is applied to all processed */ { struct plProc *proc; int prevStdoutFd = -1; for (proc = pl->procs; proc != NULL; proc = proc->next) { prevStdoutFd = pipelineExecProc(pl, proc, prevStdoutFd, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); otherEndBuf = NULL; /* only for first process (read pipes) */ otherEndBufSize = 0; } } static void waitOnOne(struct pipeline *pl) /* wait on one process to finish */ { int status; pid_t pid = waitpid(-pl->groupLeader, &status, 0); if (pid < 0) errnoAbort("waitpid failed"); plProcHandleTerminate(pipelineFindProc(pl, pid), status); pl->numRunning--; assert(pl->numRunning >= 0); } static void groupWait(struct pipeline *pl) /* Wait for pipeline to complete */ { /* wait on all processes to complete */ while (pl->numRunning > 0) waitOnOne(pl); } static void groupLeaderRun(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* group leader process */ { pl->groupLeader = getpid(); if (setpgid(pl->groupLeader, pl->groupLeader) != 0) errnoAbort("error from child setpgid(%d, %d)", pl->groupLeader, pl->groupLeader); pipelineGroupExec(pl, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); // only keep stderr open close(STDIN_FILENO); close(STDOUT_FILENO); closeNonStdDescriptors(); groupWait(pl); exit(0); } static int groupLeaderWait(struct pipeline *pl) /* Wait for group leader to complete. If pipelineNoAbort was specified, return * the exit code of the first group process exit non-zero, or zero if none * failed. */ { int status; pid_t pid = waitpid(-pl->groupLeader, &status, 0); if (pid < 0) errnoAbort("waitpid failed"); if (WIFSIGNALED(status)) errAbort("process pipeline terminated on signal %d", WTERMSIG(status)); assert(WIFEXITED(status)); if ((WEXITSTATUS(status) != 0) && !(pl->options & pipelineNoAbort)) errAbort("pipeline exited with %d", WEXITSTATUS(status)); return WEXITSTATUS(status); } static void pipelineExec(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* Fork the group leader, which then launches all processes in a pipeline, * stdinFd and stdoutFd are the ends of the pipeline, stderrFd is applied to * all processes, including group leader */ { assert(pl->groupLeader < 0); // should not be set if ((pl->groupLeader = fork()) < 0) errnoAbort("can't fork"); if (pl->groupLeader == 0) { groupLeaderRun(pl, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); exit(1); // doesn't return to here } else { // parent also must also setpgid to prevent race condition if (setpgid(pl->groupLeader, pl->groupLeader) != 0) errnoAbort("error from parent setpgid(%d, %d)", pl->groupLeader, pl->groupLeader); } } static int openRead(char *fname) /* open a file for reading */ { int fd = open(fname, O_RDONLY); if (fd < 0) errnoAbort("can't open for read access: %s", fname); return fd; } static int openWrite(char *fname, boolean append) /* open a file for write access */ { int flags = O_WRONLY|O_CREAT; if (append) flags |= O_APPEND; else flags |= O_TRUNC; int fd = open(fname, flags, 0666); if (fd < 0) errnoAbort("can't open for write access: %s", fname); return fd; } static void pipelineStartRead(struct pipeline *pl, int stdinFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* start a read pipeline */ { int pipeWrFd; pl->pipeFd = pipeCreate(&pipeWrFd); pipelineExec(pl, stdinFd, pipeWrFd, stderrFd, otherEndBuf, otherEndBufSize); safeClose(&pipeWrFd); } static void pipelineStartWrite(struct pipeline *pl, int stdoutFd, int stderrFd) /* start a write pipeline */ { int pipeRdFd = pipeCreate(&pl->pipeFd); pipelineExec(pl, pipeRdFd, stdoutFd, stderrFd, NULL, 0); safeClose(&pipeRdFd); } static void checkOpts(unsigned opts) /* check option set for consistency */ { if (((opts & (pipelineRead|pipelineWrite)) == 0) || ((opts & (pipelineRead|pipelineWrite)) == (pipelineRead|pipelineWrite))) errAbort("must specify one of pipelineRead or pipelineWrite to pipelineOpen"); if ((opts & pipelineAppend) && ((opts & pipelineWrite) == 0)) errAbort("pipelineAppend is valid only in conjunction with pipelineWrite"); } struct pipeline *pipelineOpenFd(char ***cmds, unsigned opts, int otherEndFd, int stderrFd) /* Create a pipeline from an array of commands. See pipeline.h for * full documentation. */ { struct pipeline *pl; checkOpts(opts); pl = pipelineNew(cmds, opts); if (opts & pipelineRead) pipelineStartRead(pl, otherEndFd, stderrFd, NULL, 0); else pipelineStartWrite(pl, otherEndFd, stderrFd); return pl; } struct pipeline *pipelineOpen(char ***cmds, unsigned opts, char *otherEndFile, char *stderrFile) /* Create a pipeline from an array of commands. See pipeline.h for * full documentation */ { int otherEndFd; int stderrFd = (stderrFile == NULL) ? STDERR_FILENO : openWrite(stderrFile, FALSE); checkOpts(opts); boolean append = ((opts & pipelineAppend) != 0); if (opts & pipelineRead) otherEndFd = (otherEndFile == NULL) ? STDIN_FILENO : openRead(otherEndFile); else otherEndFd = (otherEndFile == NULL) ? STDOUT_FILENO : openWrite(otherEndFile, append); struct pipeline *pl = pipelineOpenFd(cmds, opts, otherEndFd, stderrFd); safeClose(&otherEndFd); if (stderrFile != NULL) safeClose(&stderrFd); return pl; } struct pipeline *pipelineOpenMem(char ***cmds, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd) /* Create a pipeline from an array of commands, with the pipeline input/output * in a memory buffer. See pipeline.h for full documentation. Currently only * input to a read pipeline is supported */ { struct pipeline *pl; checkOpts(opts); if (opts & pipelineWrite) errAbort("pipelineOpenMem only supports read pipelines at this time"); opts |= pipelineMemInput; pl = pipelineNew(cmds, opts); pipelineStartRead(pl, STDIN_FILENO, stderrFd, otherEndBuf, otherEndBufSize); return pl; } struct pipeline *pipelineOpenFd1(char **cmd, unsigned opts, int otherEndFd, int stderrFd) /* like pipelineOpenFd(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpenFd(cmds, opts, otherEndFd, stderrFd); } struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile) /* like pipelineOpen(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpen(cmds, opts, otherEndFile, stderrFile); } struct pipeline *pipelineOpenMem1(char **cmd, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd) /* like pipelineOpenMem(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpenMem(cmds, opts, otherEndBuf, otherEndBufSize, stderrFd); } char *pipelineDesc(struct pipeline *pl) /* Get the description of a pipeline for use in error messages */ { return pl->procName; } int pipelineFd(struct pipeline *pl) /* Get the file descriptor for a pipeline */ { return pl->pipeFd; } FILE *pipelineFile(struct pipeline *pl) /* Get a FILE object wrapped around the pipeline. Do not close the FILE, is * owned by the pipeline object. A FILE is created on first call to this * function. Subsequent calls return the same FILE.*/ { if (pl->pipeFh == NULL) { /* create FILE* on first access */ char *mode = (pl->options & pipelineRead) ? "r" : "w"; if (pl->pipeLf != NULL) errAbort("can't call pipelineFile after having associated a lineFile with a pipeline"); pl->pipeFh = fdopen(pl->pipeFd, mode); if (pl->pipeFh == NULL) errnoAbort("fdopen failed for: %s", pl->procName); pl->stdioBuf = needLargeMem(FILE_BUF_SIZE); setvbuf(pl->pipeFh, pl->stdioBuf, _IOFBF, FILE_BUF_SIZE); } return pl->pipeFh; } struct lineFile *pipelineLineFile(struct pipeline *pl) /* Get a lineFile object wrapped around the pipeline. Do not close the * lineFile, is owned by the pipeline object. A lineFile is created on first * call to this function. Subsequent calls return the same object.*/ { if (pl->pipeLf == NULL) { /* create line on first acess */ if (pl->pipeFh != NULL) errAbort("can't call pipelineLineFile after having associated a FILE with a pipeline"); if (pl->options & pipelineWrite) errAbort("can't associated a lineFile with a write pipeline"); pl->pipeLf = lineFileAttach(pipelineDesc(pl), TRUE, pl->pipeFd); } return pl->pipeLf; } static void closePipelineFile(struct pipeline *pl) /* close a pipeline with a FILE associated with it */ { if (pl->options & pipelineWrite) { fflush(pl->pipeFh); if (ferror(pl->pipeFh)) errAbort("write failed to pipeline: %s ", pl->procName); } else if (ferror(pl->pipeFh)) errAbort("read failed from pipeline: %s ", pl->procName); if (fclose(pl->pipeFh) == EOF) errAbort("close failed on pipeline: %s ", pl->procName); pl->pipeFh = NULL; } static void closePipeline(struct pipeline *pl) /* Close the pipe file */ { if (pl->pipeFh != NULL) closePipelineFile(pl); else if (pl->pipeLf != NULL) lineFileClose(&pl->pipeLf); else { if (close(pl->pipeFd) < 0) errAbort("close failed on pipeline: %s ", pl->procName); } pl->pipeFd = -1; } int pipelineWait(struct pipeline *pl) /* Wait for processes in a pipeline to complete; normally aborts if any * process exists non-zero. If pipelineNoAbort was specified, return the exit * code of the first process exit non-zero, or zero if none failed. */ { /* must close before waiting to so processes get pipe EOF */ closePipeline(pl); return groupLeaderWait(pl); } void pipelineSetNoAbort(struct pipeline *pl) /* Make it so pipeline won't abort on error - can be done after the fact. * (This is needed to close a pipelined lineFile early.) */ { pl->options |= pipelineNoAbort; } void pipelineDumpCmds(char ***cmds) /* Dump out pipeline-formatted commands to stdout for debugging. */ { char **cmd; boolean first = TRUE; while ((cmd = *cmds++) != NULL) { char *word; if (first) first = FALSE; else printf("| "); while ((word = *cmd++) != NULL) printf("%s ", word); } printf("
    \n"); } /* * Local Variables: * c-file-style: "jkent-c" * End: */ #endif rtracklayer/src/ucsc/pipeline.h0000644000175100017510000001443512612032142017617 0ustar00biocbuildbiocbuild/* pipeline.h - create a process pipeline that can be used for reading or * writing. These pipeline objects don't go through the shell, so they * avoid many of the obscure problems associated with system() and popen(). * * Read pipelines are pipelines where a program reads output written by the * pipeline, and write pipelines are where the program writes data to the * pipeline. The type of pipeline is specified in the set of option flags * passed to pipelineOpen(). The file at the other end of the pipeline is * specified in the otherEndFile argument of pipelineOpen(), as shown here: * * pipelineRead: * * otherEndFile --> cmd[0] --> ... --> cmd[n] --> pipelineLf() etc. * * pipelineWrite: * * pipeLineFile() --> cmd[0] --> ... --> cmd[n] --> otherEndFile * * Specify otherEndFile as "/dev/null" for no input or no output (or to * discard output). If otherEndFile is NULL, then either stdin or stdout are * inherited from the current process. * * I/O to the pipeline is done by using the result of pipelineFd(), * pipelineFile(), or pipelineLineFile(). * * An example that reads a compressed file, sorting it numerically by the * first column: * * static char *cmd1[] = {"gzip", "-dc", NULL}; * static char *cmd2[] = {"sort", "-k", "1,1n", NULL}; * static char **cmds[] = {cmd1, cmd2, NULL}; * * struct pipeline *pl = pipelineOpen(cmds, pipelineRead, inFilePath, stderrFd); * struct lineFile *lf = pipelineLineFile(pl); * char *line; * * while (lineFileNext(lf, &line, NULL)) * { * ... * } * pipelineWait(pl); * pipelineFree(&pl); * * A similar example that generates data and writes a compressed file, sorting * it numerically by the first column: * * * static char *cmd1[] = {"sort", "-k", "1,1n", NULL}; * static char *cmd2[] = {"gzip", "-c3", NULL}; * static char **cmds[] = {cmd1, cmd2, NULL}; * * struct pipeline *pl = pipelineOpen(cmds, pipelineWrite, outFilePath, stderrFd); * char *line; * * while ((line = makeNextRow()) != NULL) * fprintf(fh, "%s\n", line); * * pipelineWait(pl); * pipelineFree(&pl); * * To append to an output file, use pipelineWrite|pipelineAppend: * * struct pipeline *pl = pipelineOpen(cmds, pipelineWrite|pipelineAppend, outFilePath, stderrFd); */ #ifndef PIPELINE_H #define PIPELINE_H #include struct linefile; struct pipeline; enum pipelineOpts /* pipeline options bitset */ { pipelineRead = 0x01, /* read from pipeline */ pipelineWrite = 0x02, /* write to pipeline */ pipelineNoAbort = 0x04, /* don't abort if a process exits non-zero, * wait will return exit code instead. * Still aborts if process signals. */ pipelineMemInput = 0x08, /* pipeline takes input from memory (internal) */ pipelineAppend = 0x10, /* Append to output file (used only with pipelineWrite) */ pipelineSigpipe = 0x20 /* enable sigpipe in the children and don't treat as an error in the parent */ }; struct pipeline *pipelineOpenFd(char ***cmds, unsigned opts, int otherEndFd, int stderrFd); /* Create a pipeline from an array of commands. Each command is an array of * arguments. Shell expansion is not done on the arguments. If pipelineRead * is specified, the output of the pipeline is readable from the pipeline * object. If pipelineWrite is specified, the input of the pipeline is * writable from the pipeline object. */ struct pipeline *pipelineOpen(char ***cmds, unsigned opts, char *otherEndFile, char *stderrFile); /* Create a pipeline from an array of commands. Each command is an array of * arguments. Shell expansion is not done on the arguments. If pipelineRead * is specified, the output of the pipeline is readable from the pipeline * object. If pipelineWrite is specified, the input of the pipeline is * writable from the pipeline object. If stderrFile is NULL, stderr is inherited, * otherwise it is redirected to this file. */ void pipelineDumpCmds(char ***cmds); /* Dump out pipeline-formatted commands to stdout for debugging. */ struct pipeline *pipelineOpenMem(char ***cmds, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd); /* Create a pipeline from an array of commands, with the pipeline input/output * in a memory buffer. See pipeline.h for full documentation. Currently only * input to a read pipeline is supported */ struct pipeline *pipelineOpenFd1(char **cmd, unsigned opts, int otherEndFd, int stderrFd); /* like pipelineOpenFd(), only takes a single command */ struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile); /* like pipelineOpen(), only takes a single command */ struct pipeline *pipelineOpenMem1(char **cmd, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd); /* like pipelineOpenMem(), only takes a single command */ char *pipelineDesc(struct pipeline *pl); /* Get the desciption of a pipeline for use in error messages */ int pipelineFd(struct pipeline *pl); /* Get the file descriptor for a pipeline */ FILE *pipelineFile(struct pipeline *pl); /* Get a FILE object wrapped around the pipeline. Do not close the FILE, is * owned by the pipeline object. A FILE is created on first call to this * function. Subsequent calls return the same FILE.*/ struct lineFile *pipelineLineFile(struct pipeline *pl); /* Get a lineFile object wrapped around the pipeline. Do not close the * lineFile, is owned by the pipeline object. A lineFile is created on first * call to this function. Subsequent calls return the same object.*/ int pipelineWait(struct pipeline *pl); /* Wait for processes in a pipeline to complete; normally aborts if any * process exists non-zero. If pipelineNoAbort was specified, return the exit * code of the first process exit non-zero, or zero if none failed. */ void pipelineFree(struct pipeline **plPtr); /* free a pipeline object */ #endif /* * Local Variables: * c-file-style: "jkent-c" * End: */ rtracklayer/src/ucsc/portable.h0000644000175100017510000001211212612032142017610 0ustar00biocbuildbiocbuild/* portable.h - wrappers around things that vary from server * to server and operating system to operating system. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef PORTABLE_H #define PORTABLE_H #include #include struct slName *listDir(char *dir, char *pattern); /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ struct slName *listDirRegEx(char *dir, char *regEx, int flags); /* Return an alphabetized list of all files that match * the regular expression pattern in directory. * See REGCOMP(3) for flags (e.g. REG_ICASE) */ struct fileInfo /* Info about a file. */ { struct fileInfo *next; /* Next in list. */ off_t size; /* Size in bytes. */ bool isDir; /* True if file is a directory. */ int statErrno; /* Result of stat (e.g. bad symlink). */ time_t lastAccess; /* Last access time. */ char name[1]; /* Allocated at run time. */ }; struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno, time_t lastAccess); /* Return a new fileInfo. */ struct fileInfo *listDirXExt(char *dir, char *pattern, boolean fullPath, boolean ignoreStatFailures); /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. You can free the * resulting list with slFreeList. */ struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath); /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. You can free the * resulting list with slFreeList. */ char *getCurrentDir(); /* Return current directory. Abort if it fails. */ void setCurrentDir(char *newDir); /* Set current directory. Abort if it fails. */ boolean maybeSetCurrentDir(char *newDir); /* Change directory, return FALSE (and set errno) if fail. */ boolean makeDir(char *dirName); /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ void makeDirsOnPath(char *pathName); /* Create directory specified by pathName. If pathName contains * slashes, create directory at each level of path if it doesn't * already exist. Abort with error message if there's a problem. * (It's not considered a problem for the directory to already * exist. ) */ char *simplifyPathToDir(char *path); /* Return path with ~ (for home) and .. taken out. freeMem result when done. */ long clock1000(); /* 1000 hz clock */ void sleep1000(int milli); /* Sleep for given number of milliseconds. */ long clock1(); /* A 1 hz clock. */ char *rTempName(char *dir, char *base, char *suffix); /* Make a temp name that's almost certainly unique. */ /* This structure helps us generate temp names and use * them. Since different servers locate where the cgi * runs from differently, and where the generated html * file runs from - this is necessary for portable code. */ struct tempName { char forCgi[128]; char forHtml[128]; }; void makeTempName(struct tempName *tn, char *base, char *suffix); /* Make a good name for a temp file. */ void mustRename(char *oldName, char *newName); /* Rename file or die trying. */ void mustRemove(char *path); /* Remove file or die trying */ char *semiUniqName(char *base); /* Figure out a name likely to be unique. * Name will have no periods. Returns a static * buffer, so best to clone result unless using * immediately. */ char *cgiDir(); /* Return directory to look for cgi in. */ char *trashDir(); /* Return directory for relative path to trash from cgi binaries */ void mkdirTrashDirectory(char *prefix); /* create the specified trash directory if it doesn't exist */ double machineSpeed(); /* Return relative speed of machine. UCSC CSE dept. 1999 web server is 1.0 */ char *mysqlHost(); /* Return host computer on network for mySQL database. */ char *getHost(); /* Get name of this machine. */ void uglyfBreak(); /* Invoke the debugger. */ char *getUser(); /* Get user name */ void envUpdate(char *name, char *value); /* Update an environment string */ int mustFork(); /* Fork or abort. */ int rawKeyIn(); /* Read in an unbuffered, unechoed character from keyboard. */ time_t fileModTime(char *pathName); /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ boolean isPipe(int fd); /* determine in an open file is a pipe */ boolean maybeTouchFile(char *fileName); /* If file exists, set its access and mod times to now. If it doesn't exist, create it. * Return FALSE if we have a problem doing so. */ boolean isRegularFile(char *fileName); /* Return TRUE if fileName is a regular file. */ void makeSymLink(char *oldName, char *newName); /* Return a symbolic link from newName to oldName or die trying */ long long freeSpaceOnFileSystem(char *path); /* Given a path to a file or directory on a file system, return free space * in bytes. */ #endif /* PORTABLE_H */ rtracklayer/src/ucsc/portimpl.h0000644000175100017510000000253612612032142017657 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Implement portable stuff.... */ /* There is one of the following structures for each web server * we support. During run time looking at the environment variable * SERVER_SOFTWARE we decide which of these to use. */ struct webServerSpecific { char *name; /* Make a good name for a temp file. */ void (*makeTempName)(struct tempName *tn, char *base, char *suffix); /* Return directory to look for cgi in. */ char * (*cgiDir)(); #ifdef NEVER /* Return cgi suffix. */ char * (*cgiSuffix)(); #endif /* NEVER */ /* Return relative speed of CPU. (UCSC CSE 1999 FTP machine is 1.0) */ double (*speed)(); /* The relative path to trash directory for CGI binaries */ char * (*trashDir)(); }; extern struct webServerSpecific wssMicrosoftII, wssMicrosoftPWS, wssDefault, wssLinux, wssCommandLine, wssBrcMcw; char *rTempName(char *dir, char *base, char *suffix); /* Make a temp name that's almost certainly unique. */ rtracklayer/src/ucsc/rangeTree.c0000644000175100017510000002350112612032142017713 0ustar00biocbuildbiocbuild/* rangeTree - This module is a way of keeping track of * non-overlapping ranges (half-open intervals). It is * based on the self-balancing rbTree code. Use it in * place of a bitmap when the total number of ranges * is significantly smaller than the number of bits would * be. * Beware the several static/global variables which can be * changed by various function calls. */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "limits.h" #include "localmem.h" #include "obscure.h" #include "rbTree.h" #include "rangeTree.h" int rangeCmp(void *va, void *vb) /* Return -1 if a before b, 0 if a and b overlap, * and 1 if a after b. */ { struct range *a = va; struct range *b = vb; if (a->end <= b->start) return -1; else if (b->end <= a->start) return 1; else return 0; } static void *sumInt(void *a, void *b) /* Local function used by rangeTreeAddValCount, which sums two ints a and b, * referenced by void pointers, returning the result in a */ { int *i = a, *j = b; *i += *j; return a; } struct range *rangeTreeAddVal(struct rbTree *tree, int start, int end, void *val, void *(*mergeVals)(void *existingVal, void *newVal) ) /* Add range to tree, merging with existing ranges if need be. * If this is a new range, set the value to this val. * If there are existing items for this range, and if mergeVals function is not null, * apply mergeVals to the existing values and this new val, storing the result as the val * for this range (see rangeTreeAddValCount() and rangeTreeAddValList() below for examples). */ { struct range *r, *existing; r = lmAlloc(tree->lm, sizeof(*r)); /* alloc new zeroed range */ r->start = start; r->end = end; r->val = val; while ((existing = rbTreeRemove(tree, r)) != NULL) { r->start = min(r->start, existing->start); r->end = max(r->end, existing->end); if (mergeVals) r->val = mergeVals(existing->val, r->val); } rbTreeAdd(tree, r); return r; } struct range *rangeTreeAdd(struct rbTree *tree, int start, int end) /* Add range to tree, merging with existing ranges if need be. */ { return rangeTreeAddVal(tree, start, end, NULL, NULL); } struct range *rangeTreeAddValCount(struct rbTree *tree, int start, int end) /* Add range to tree, merging with existing ranges if need be. * Set range val to count of elements in the range. Counts are pointers to * ints allocated in tree localmem */ { int *a = lmAlloc(tree->lm, sizeof(*a)); /* keep the count in localmem */ *a = 1; return rangeTreeAddVal(tree, start, end, (void *)a, sumInt); } struct range *rangeTreeAddValList(struct rbTree *tree, int start, int end, void *val) /* Add range to tree, merging with existing ranges if need be. * Add val to the list of values (if any) in each range. * val must be valid argument to slCat (ie, be a struct with a 'next' pointer as its first member) */ { return rangeTreeAddVal(tree, start, end, val, slCat); } void rangeTreeAddToCoverageDepth(struct rbTree *tree, int start, int end) /* Add area from start to end to a tree that is being built up to store the * depth of coverage. Recover coverage back out by looking at ptToInt(range->val) * on tree elements. */ { struct range q; q.start = start; q.end = end; struct range *r, *existing = rbTreeFind(tree, &q); if (existing == NULL) { lmAllocVar(tree->lm, r); r->start = start; r->end = end; r->val = intToPt(1); rbTreeAdd(tree, r); } else { if (existing->start <= start && existing->end >= end) /* The existing one completely encompasses us */ { /* Make a new section for the bit before start. */ if (existing->start < start) { lmAllocVar(tree->lm, r); r->start = existing->start; r->end = start; r->val = existing->val; existing->start = start; rbTreeAdd(tree, r); } /* Make a new section for the bit after end. */ if (existing->end > end) { lmAllocVar(tree->lm, r); r->start = end; r->end = existing->end; r->val = existing->val; existing->end = end; rbTreeAdd(tree, r); } /* Increment existing section in overlapping area. */ existing->val = (char *)(existing->val) + 1; } else /* In general case fetch list of regions that overlap us. Remaining cases to handle are: r >> e rrrrrrrrrrrrrrrrrrrr eeeeeeeeee e < r rrrrrrrrrrrrrrr eeeeeeeeeeee r < e rrrrrrrrrrrr eeeeeeeeeeeee */ { struct range *existingList = rangeTreeAllOverlapping(tree, start, end); #ifdef DEBUG /* Make sure that list is really sorted for debugging... */ int lastStart = existingList->start; for (r = existingList; r != NULL; r = r->next) { int start = r->start; if (start < lastStart) internalErr(); } #endif /* DEBUG */ int s = start, e = end; for (existing = existingList; existing != NULL; existing = existing->next) { /* Deal with start of new range that comes before existing */ if (s < existing->start) { lmAllocVar(tree->lm, r); r->start = s; r->end = existing->start; r->val = intToPt(1); s = existing->start; rbTreeAdd(tree, r); } else if (s > existing->start) { lmAllocVar(tree->lm, r); r->start = existing->start; r->end = s; r->val = existing->val; existing->start = s; rbTreeAdd(tree, r); } existing->val = (char *)(existing->val) + 1; s = existing->end; } if (s < e) /* Deal with end of new range that doesn't overlap with anything. */ { lmAllocVar(tree->lm, r); r->start = s; r->end = e; r->val = intToPt(1); rbTreeAdd(tree, r); } } } } boolean rangeTreeOverlaps(struct rbTree *tree, int start, int end) /* Return TRUE if start-end overlaps anything in tree */ { struct range tempR; tempR.start = start; tempR.end = end; tempR.val = NULL; return rbTreeFind(tree, &tempR) != NULL; } static struct range *rangeList; static void rangeListAdd(void *v) /* Callback to add item to range list. */ { struct range *r = v; slAddHead(&rangeList, r); } struct range *rangeTreeList(struct rbTree *tree) /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ { rangeList = NULL; rbTreeTraverse(tree, rangeListAdd); slReverse(&rangeList); return rangeList; } struct range *rangeTreeFindEnclosing(struct rbTree *tree, int start, int end) /* Find item in range tree that encloses range between start and end * if there is any such item. */ { struct range tempR, *r; tempR.start = start; tempR.end = end; r = rbTreeFind(tree, &tempR); if (r != NULL && r->start <= start && r->end >= end) { r->next = NULL; /* this can be set by previous calls to the List functions */ return r; } return NULL; } struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end) /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangeTreeList. Not thread safe. */ { struct range tempR; tempR.start = start; tempR.end = end; rangeList = NULL; rbTreeTraverseRange(tree, &tempR, &tempR, rangeListAdd); slReverse(&rangeList); return rangeList; } struct range *rangeTreeMaxOverlapping(struct rbTree *tree, int start, int end) /* Return item that overlaps most with start-end. Not thread safe. Trashes list used * by rangeTreeAllOverlapping. */ { struct range *range, *best = NULL; int bestOverlap = 0; for (range = rangeTreeAllOverlapping(tree, start, end); range != NULL; range = range->next) { int overlap = rangeIntersection(range->start, range->end, start, end); if (overlap > bestOverlap) { bestOverlap = overlap; best = range; } } if (best) best->next = NULL; /* could be set by calls to List functions */ return best; } /* A couple of variables used to calculate total overlap. */ static int totalOverlap; static int overlapStart, overlapEnd; static void addOverlap(void *v) /* Callback to add item to range list. */ { struct range *r = v; totalOverlap += positiveRangeIntersection(r->start, r->end, overlapStart, overlapEnd); } int rangeTreeOverlapSize(struct rbTree *tree, int start, int end) /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { struct range tempR; tempR.start = overlapStart = start; tempR.end = overlapEnd = end; totalOverlap = 0; rbTreeTraverseRange(tree, &tempR, &tempR, addOverlap); return totalOverlap; } int rangeTreeOverlapTotalSize(struct rbTree *tree) /* Return the total size of all ranges in range tree. * Sadly not thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { return rangeTreeOverlapSize(tree, INT_MIN, INT_MAX); } void rangeTreeSumRangeCallback(void *item, void *context) /* This is a callback for rbTreeTraverse with context. It just adds up * end-start */ { struct range *range = item; long long *pSum = context; *pSum += range->end - range->start; } long long rangeTreeSumRanges(struct rbTree *tree) /* Return sum of end-start of all items. */ { long long sum = 0; rbTreeTraverseWithContext(tree, rangeTreeSumRangeCallback, &sum); return sum; } struct rbTree *rangeTreeNew() /* Create a new, empty, rangeTree. */ { return rbTreeNew(rangeCmp); } struct rbTree *rangeTreeNewDetailed(struct lm *lm, struct rbTreeNode *stack[128]) /* Allocate rangeTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ { return rbTreeNewDetailed(rangeCmp, lm, stack); } rtracklayer/src/ucsc/rangeTree.h0000644000175100017510000001057412612032142017726 0ustar00biocbuildbiocbuild/* rangeTree - This module is a way of keeping track of * non-overlapping ranges (half-open intervals). It is * based on the self-balancing rbTree code. Use it in * place of a bitmap when the total number of ranges * is significantly smaller than the number of bits would * be. */ #ifndef RANGETREE_H #define RANGETREE_H #ifndef RBTREE_H #include "rbTree.h" #endif struct range /* An interval in a list of intervals. */ { struct range *next; int start,end; /* Zero based half open interval. */ void *val; /* Some value associated with range. */ }; struct rbTree *rangeTreeNew(); /* Create a new, empty, rangeTree. Free with rbFreeTree. */ #define rangeTreeFree(a) rbTreeFree(a) /* Free up range tree. */ int rangeCmp(void *va, void *vb); /* Return -1 if a before b, 0 if a and b overlap, * and 1 if a after b. */ struct range *rangeTreeAddVal(struct rbTree *tree, int start, int end, void *val, void *(*mergeVals)(void *existingVal, void *newVal) ); /* Add range to tree, merging with existing ranges if need be. * If this is a new range, set the value to this val. * If there are existing items for this range, and if mergeVals function is not null, * apply mergeVals to the existing values and this new val, storing the result as the val * for this range (see rangeTreeAddValCount() and rangeTreeAddValList() below for examples). */ struct range *rangeTreeAdd(struct rbTree *tree, int start, int end); /* Add range to tree, merging with existing ranges if need be. */ struct range *rangeTreeAddValCount(struct rbTree *tree, int start, int end); /* Add range to tree, merging with existing ranges if need be. * Set range val to count of elements in the range. Counts are pointers to * ints allocated in tree localmem */ struct range *rangeTreeAddValList(struct rbTree *tree, int start, int end, void *val); /* Add range to tree, merging with existing ranges if need be. * Add val to the list of values (if any) in each range. * val must be valid argument to slCat (ie, be a struct with a 'next' pointer as its first member) */ void rangeTreeAddToCoverageDepth(struct rbTree *tree, int start, int end); /* Add area from start to end to a tree that is being built up to store the * depth of coverage. Recover coverage back out by looking at ptToInt(range->val) * on tree elements. */ boolean rangeTreeOverlaps(struct rbTree *tree, int start, int end); /* Return TRUE if start-end overlaps anything in tree */ int rangeTreeOverlapSize(struct rbTree *tree, int start, int end); /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ int rangeTreeOverlapTotalSize(struct rbTree *tree); /* Return the total size of all ranges in range tree. * Sadly not thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ struct range *rangeTreeFindEnclosing(struct rbTree *tree, int start, int end); /* Find item in range tree that encloses range between start and end * if there is any such item. */ struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end); /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangTreeList. Not thread safe. */ struct range *rangeTreeMaxOverlapping(struct rbTree *tree, int start, int end); /* Return item that overlaps most with start-end. Not thread safe. Trashes list used * by rangeTreeAllOverlapping. */ void rangeTreeSumRangeCallback(void *item, void *context); /* This is a callback for rbTreeTraverse with context. It just adds up * end-start */ long long rangeTreeSumRanges(struct rbTree *tree); /* Return sum of end-start of all items. */ struct range *rangeTreeList(struct rbTree *tree); /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ struct rbTree *rangeTreeNewDetailed(struct lm *lm, struct rbTreeNode *stack[128]); /* Allocate rangeTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ #endif /* RANGETREE_H */ rtracklayer/src/ucsc/rbTree.c0000644000175100017510000004220412612032142017223 0ustar00biocbuildbiocbuild/* rbTree - rbTreeRed-rbTreeBlack Tree - a type of binary tree which * automatically keeps relatively balanced during * inserts and deletions. * original author: Shane Saunders * adapted into local conventions: Jim Kent */ #include "common.h" #include "localmem.h" #include "rbTree.h" static struct rbTreeNode *restructure(struct rbTree *t, int tos, struct rbTreeNode *x, struct rbTreeNode *y, struct rbTreeNode *z) /* General restructuring function - checks for all * restructuring cases. Call when insert has messed up tree. * Sadly delete has to do even more work. */ { struct rbTreeNode *parent, *midNode; if(y == x->left) { if(z == y->left) { /* in-order: z, y, x */ midNode = y; y->left = z; x->left = y->right; y->right = x; } else { /* in-order: y, z, x */ midNode = z; y->right = z->left; z->left = y; x->left = z->right; z->right = x; } } else { if(z == y->left) { /* in-order: x, z, y */ midNode = z; x->right = z->left; z->left = x; y->left = z->right; z->right = y; } else { /* in-order: x, y, z */ midNode = y; x->right = y->left; y->left = x; y->right = z; } } if(tos != 0) { parent = t->stack[tos-1]; if(x == parent->left) parent->left = midNode; else parent->right = midNode; } else t->root = midNode; return midNode; } struct rbTree *rbTreeNewDetailed(int (*compare)(void *, void *), struct lm *lm, struct rbTreeNode *stack[128]) /* Allocate rbTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ { struct rbTree *t; AllocVar(t); t->root = NULL; t->compare = compare; t->lm = lm; t->stack = stack; t->n = 0; return t; } struct rbTree *rbTreeNew(int (*compare)(void *, void *)) /* rbTreeNew() - Allocates space for a red-black tree and returns a pointer * to it. The function compare compares they keys of two items, and returns a * negative, zero, or positive integer depending on whether the first item is * less than, equal to, or greater than the second. */ { /* The stack keeps us from having to keep explicit * parent, grandparent, greatgrandparent variables. * It needs to be big enough for the maximum depth * of tree. Since the whole point of rb trees is * that they are self-balancing, this is not all * that deep, just 2*log2(N). Therefore a stack of * 128 is good for up to 2^64 items in stack, which * should keep us for the next couple of decades... */ struct lm *lm = lmInit(0); struct rbTreeNode **stack = lmAlloc(lm, 128 * sizeof(stack[0])); return rbTreeNewDetailed(compare, lm, stack); } void rbTreeFree(struct rbTree **pTree) /* rbTreeFree() - Frees space used by the red-black tree pointed to by t. */ { struct rbTree *tree = *pTree; if (tree != NULL) { lmCleanup(&tree->lm); freez(pTree); } } void rbTreeFreeList(struct rbTree **pList) /* Free up a list of rbTrees. */ { struct rbTree *tree, *next; for (tree = *pList; tree != NULL; tree = next) { next = tree->next; rbTreeFree(&tree); } } void *rbTreeAdd(struct rbTree *t, void *item) /* rbTreeAdd() - Inserts an item into the red-black tree pointed to by t, * according the the value its key. The key of an item in the red-black * tree must be unique among items in the tree. If an item with the same key * already exists in the tree, a pointer to that item is returned. Otherwise, * NULL is returned, indicating insertion was successful. */ { struct rbTreeNode *x, *p, *q, *m, **attachX; int (* compare)(void *, void *); int cmpResult; rbTreeColor col; struct rbTreeNode **stack = NULL; int tos; tos = 0; if((p = t->root) != NULL) { compare = t->compare; stack = t->stack; /* Repeatedly explore either the left branch or the right branch * depending on the value of the key, until an empty branch is chosen. */ for(;;) { stack[tos++] = p; cmpResult = compare(item, p->item); if(cmpResult < 0) { p = p->left; if(!p) { p = stack[--tos]; attachX = &p->left; break; } } else if(cmpResult > 0) { p = p->right; if(!p) { p = stack[--tos]; attachX = &p->right; break; } } else { return p->item; } } col = rbTreeRed; } else { attachX = &t->root; col = rbTreeBlack; } /* Allocate new node and place it in tree. */ if ((x = t->freeList) != NULL) t->freeList = x->right; else lmAllocVar(t->lm, x); x->left = x->right = NULL; x->item = item; x->color = col; *attachX = x; t->n++; /* Restructuring or recolouring will be needed if node x and its parent, p, * are both red. */ if(tos > 0) { while(p->color == rbTreeRed) { /* Double red problem. */ /* Obtain a pointer to p's parent, m, and sibling, q. */ m = stack[--tos]; q = p == m->left ? m->right : m->left; /* Determine whether restructuring or recolouring is needed. */ if(!q || q->color == rbTreeBlack) { /* Sibling is black. ==> Perform restructuring. */ /* Restructure according to the left to right order, of nodes * m, p, and x. */ m = restructure(t, tos, m, p, x); m->color = rbTreeBlack; m->left->color = m->right->color = rbTreeRed; /* Restructuring eliminates the double red problem. */ break; } /* else just need to flip color */ /* Sibling is also red. ==> Perform recolouring. */ p->color = rbTreeBlack; q->color = rbTreeBlack; if(tos == 0) break; /* The root node always remains black. */ m->color = rbTreeRed; /* Continue, checking colouring higher up. */ x = m; p = stack[--tos]; } } return NULL; } void *rbTreeFind(struct rbTree *t, void *item) /* rbTreeFind() - Find an item in the red-black tree with the same key as the * item pointed to by `item'. Returns a pointer to the item found, or NULL * if no item was found. */ { struct rbTreeNode *p, *nextP; int (*compare)(void *, void *) = t->compare; int cmpResult; /* Repeatedly explore either the left or right branch, depending on the * value of the key, until the correct item is found. */ for (p = t->root; p != NULL; p = nextP) { cmpResult = compare(item, p->item); if(cmpResult < 0) nextP = p->left; else if(cmpResult > 0) nextP = p->right; else return p->item; } return NULL; } void *rbTreeRemove(struct rbTree *t, void *item) /* rbTreeRemove() - Delete an item in the red-black tree with the same key as * the item pointed to by `item'. Returns a pointer to the deleted item, * and NULL if no item was found. */ { struct rbTreeNode *p, *r, *x, *y, *z, *b, *newY; struct rbTreeNode *m; rbTreeColor removeCol; void *returnItem; int (* compare)(void *, void *); int cmpResult; struct rbTreeNode **stack; int i, tos; /* Attempt to locate the item to be deleted. */ if((p = t->root)) { compare = t->compare; stack = t->stack; tos = 0; for(;;) { stack[tos++] = p; cmpResult = compare(item, p->item); if(cmpResult < 0) p = p->left; else if(cmpResult > 0) p = p->right; else /* Item found. */ break; if(!p) return NULL; } } else return NULL; /* p points to the node to be deleted, and is currently on the top of the * stack. */ if(!p->left) { tos--; /* Adjust tos to remove p. */ /* Right child replaces p. */ if(tos == 0) { r = t->root = p->right; x = y = NULL; } else { x = stack[--tos]; if(p == x->left) { r = x->left = p->right; y = x->right; } else { r = x->right = p->right; y = x->left; } } removeCol = p->color; } else if(!p->right) { tos--; /* Adjust tos to remove p. */ /* Left child replaces p. */ if(tos == 0) { r = t->root = p->left; x = y = NULL; } else { x = stack[--tos]; if(p == x->left) { r = x->left = p->left; y = x->right; } else { r = x->right = p->left; y = x->left; } } removeCol = p->color; } else { /* Save p's stack position. */ i = tos-1; /* Minimum child, m, in the right subtree replaces p. */ m = p->right; do { stack[tos++] = m; m = m->left; } while(m); m = stack[--tos]; /* Update either the left or right child pointers of p's parent. */ if(i == 0) { t->root = m; } else { x = stack[i-1]; /* p's parent. */ if(p == x->left) { x->left = m; } else { x->right = m; } } /* Update the tree part m is removed from, and assign m the child * pointers of p (only if m is not the right child of p). */ stack[i] = m; /* Node m replaces node p on the stack. */ x = stack[--tos]; r = m->right; if(tos != i) { /* x is equal to the parent of m. */ y = x->right; x->left = r; m->right = p->right; } else { /* m was the right child of p, and x is equal to m. */ y = p->left; } m->left = p->left; /* We treat node m as the node which has been removed. */ removeCol = m->color; m->color = p->color; } /* Get return value and reuse the space used by node p. */ returnItem = p->item; p->right = t->freeList; t->freeList = p; t->n--; /* The pointers x, y, and r point to nodes which may be involved in * restructuring and recolouring. * x - the parent of the removed node. * y - the sibling of the removed node. * r - the node which replaced the removed node. * From the above code, the next entry off the stack will be the parent of * node x. */ /* The number of black nodes on paths to all external nodes (NULL child * pointers) must remain the same for all paths. Restructuring or * recolouring of nodes may be necessary to enforce this. */ if(removeCol == rbTreeBlack) { /* Removal of a black node requires some adjustment. */ if(!r || r->color == rbTreeBlack) { /* A black node replaced the deleted black node. Note that * external nodes (NULL child pointers) are always black, so * if r is NULL it is treated as a black node. */ /* This causes a double-black problem, since node r would need to * be coloured double-black in order for the black color on * paths through r to remain the same as for other paths. */ /* If r is the root node, the double-black color is not necessary * to maintain the color balance. Otherwise, some adjustment of * nearby nodes is needed in order to eliminate the double-black * problem. NOTE: x points to the parent of r. */ if(x) for(;;) { /* There are three adjustment cases: * 1. r's sibling, y, is black and has a red child, z. * 2. r's sibling, y, is black and has two black children. * 3. r's sibling, y, is red. */ if(y->color == rbTreeBlack) { /* Note the conditional evaluation for assigning z. */ if(((z = y->left) && z->color == rbTreeRed) || ((z = y->right) && z->color == rbTreeRed)) { /* Case 1: perform a restructuring of nodes x, y, and * z. */ b = restructure(t, tos, x, y, z); b->color = x->color; b->left->color = b->right->color = rbTreeBlack; break; } else { /* Case 2: recolour node y red. */ y->color = rbTreeRed; if(x->color == rbTreeRed) { x->color = rbTreeBlack; break; } /* else */ if(tos == 0) break; /* Root level reached. */ /* else */ r = x; x = stack[--tos]; /* x <- parent of x. */ y = x->left == r ? x->right : x->left; } } else { /* Case 3: Restructure nodes x, y, and z, where: * - If node y is the left child of x, then z is the left * child of y. Otherwise z is the right child of y. */ if(x->left == y) { newY = y->right; z = y->left; } else { newY = y->left; z = y->right; } restructure(t, tos, x, y, z); y->color = rbTreeBlack; x->color = rbTreeRed; /* Since x has moved down a place in the tree, and y is the * new the parent of x, the stack must be adjusted so that * the parent of x is correctly identified in the next call * to restructure(). */ stack[tos++] = y; /* After restructuring, node r has a black sibling, newY, * so either case 1 or case 2 applies. If case 2 applies * the double-black problem does not reappear. */ y = newY; /* Note the conditional evaluation for assigning z. */ if(((z = y->left) && z->color == rbTreeRed) || ((z = y->right) && z->color == rbTreeRed)) { /* Case 1: perform a restructuring of nodes x, y, and * z. */ b = restructure(t, tos, x, y, z); b->color = rbTreeRed; /* Since node x was red. */ b->left->color = b->right->color = rbTreeBlack; } else { /* Case 2: recolour node y red. */ /* Note that node y is black and node x is red. */ y->color = rbTreeRed; x->color = rbTreeBlack; } break; } } } else { /* A red node replaced the deleted black node. */ /* In this case we can simply color the red node black. */ r->color = rbTreeBlack; } } return returnItem; } /* Some variables to help recursively dump tree. */ static int dumpLevel; /* Indentation level. */ static FILE *dumpFile; /* Output file */ static void (*dumpIt)(void *item, FILE *f); /* Item dumper. */ static void rTreeDump(struct rbTreeNode *n) /* Recursively dump. */ { if (n == NULL) return; spaceOut(dumpFile, ++dumpLevel * 3); fprintf(dumpFile, "%c ", (n->color == rbTreeRed ? 'r' : 'b')); dumpIt(n->item, dumpFile); fprintf(dumpFile, "\n"); rTreeDump(n->left); rTreeDump(n->right); --dumpLevel; } void rbTreeDump(struct rbTree *tree, FILE *f, void (*dumpItem)(void *item, FILE *f)) /* Dump out rb tree to file, mostly for debugging. */ { dumpFile = f; dumpLevel = 0; dumpIt = dumpItem; fprintf(f, "rbTreeDump\n"); rTreeDump(tree->root); } /* Variables to help recursively traverse tree. */ static void (*doIt)(void *item); static void *minIt, *maxIt; static int (*compareIt)(void *, void *); static void rTreeTraverseRange(struct rbTreeNode *n) /* Recursively traverse tree in range applying doIt. */ { if (n != NULL) { int minCmp = compareIt(n->item, minIt); int maxCmp = compareIt(n->item, maxIt); if (minCmp >= 0) rTreeTraverseRange(n->left); if (minCmp >= 0 && maxCmp <= 0) doIt(n->item); if (maxCmp <= 0) rTreeTraverseRange(n->right); } } static void rTreeTraverse(struct rbTreeNode *n) /* Recursively traverse full tree applying doIt. */ { if (n != NULL) { rTreeTraverse(n->left); doIt(n->item); rTreeTraverse(n->right); } } void rbTreeTraverseRange(struct rbTree *tree, void *minItem, void *maxItem, void (*doItem)(void *item)) /* Apply doItem function to all items in tree such that * minItem <= item <= maxItem */ { doIt = doItem; minIt = minItem; maxIt = maxItem; compareIt = tree->compare; rTreeTraverseRange(tree->root); } void rbTreeTraverse(struct rbTree *tree, void (*doItem)(void *item)) /* Apply doItem function to all items in tree */ { doIt = doItem; rTreeTraverse(tree->root); } struct rTreeContext /* Context for traversing a tree when you want to be fully thread safe and reentrant. */ { void *context; /* Some context carried from user and passed to doIt. */ void (*doItem)(void *item, void *context); }; static void rTreeTraverseWithContext(struct rbTreeNode *n, struct rTreeContext *context) /* Traverse tree with a little context so don't need little static variables that * prevent reentrancy of callback functions. */ { if (n != NULL) { rTreeTraverseWithContext(n->left, context); context->doItem(n->item, context->context); rTreeTraverseWithContext(n->right, context); } } void rbTreeTraverseWithContext(struct rbTree *tree, void (*doItem)(void *item, void *context), void *context) /* Traverse tree calling doItem on every item with context pointer passed through to doItem. * This often avoids having to declare global or static variables for the doItem callback to use. */ { struct rTreeContext ctx; ctx.context = context; ctx.doItem = doItem; rTreeTraverseWithContext(tree->root, &ctx); } struct slRef *itList; /* List of items that rbTreeItemsInRange returns. */ static void addRef(void *item) /* Add item it itList. */ { refAdd(&itList, item); } struct slRef *rbTreeItemsInRange(struct rbTree *tree, void *minItem, void *maxItem) /* Return a sorted list of references to items in tree between range. * slFreeList this list when done. */ { itList = NULL; rbTreeTraverseRange(tree, minItem, maxItem, addRef); slReverse(&itList); return itList; } static void addRefWithContext(void *item, void *context) /* Add item it itList. */ { struct slRef **pList = context; refAdd(pList, item); } struct slRef *rbTreeItems(struct rbTree *tree) /* Return sorted list of items. slFreeList this when done.*/ { struct slRef *list = NULL; rbTreeTraverseWithContext(tree, addRefWithContext, &list); slReverse(&list); return list; } int rbTreeCmpString(void *a, void *b) /* Set up rbTree so as to work on strings. */ { return strcmp(a, b); } int rbTreeCmpWord(void *a, void *b) /* Set up rbTree so as to work on case-insensitive strings. */ { return differentWord(a,b); } rtracklayer/src/ucsc/rbTree.h0000644000175100017510000000773012612032142017235 0ustar00biocbuildbiocbuild/* rbTree - rbTreeRed-rbTreeBlack Tree - a type of binary tree which * automatically keeps relatively balanced during * inserts and deletions. * original author: Shane Saunders * adapted into local conventions: Jim Kent */ #ifndef RBTREE_H #define RBTREE_H typedef enum {rbTreeRed,rbTreeBlack} rbTreeColor; /* Structure type for nodes in the red-black tree. */ struct rbTreeNode { struct rbTreeNode *left, *right; /* Children. */ rbTreeColor color; /* Heart of algorithm. */ void *item; /* Item stored in tree */ }; /* Structure type for the red-black tree. */ struct rbTree { struct rbTree *next; /* Next tree in list. */ struct rbTreeNode *root; /* Root of tree */ int n; /* Number of items in tree. */ int (* compare)(void *, void *);/* Comparison function */ struct rbTreeNode **stack; /* Ancestor stack. */ struct lm *lm; /* Local memory pool. */ struct rbTreeNode *freeList; /* List of nodes to reuse. */ }; struct rbTree *rbTreeNew(int (*compare)(void *, void *)); /* Allocates space for a red-black tree and returns a pointer * to it. The function compare compares they keys of two items, and returns a * negative, zero, or positive integer depending on whether the first item is * less than, equal to, or greater than the second. */ void rbTreeFree(struct rbTree **pTree); /* Frees space used by the red-black tree pointed to by t. */ void rbTreeFreeList(struct rbTree **pList); /* Free up a list of rbTrees. */ struct rbTree *rbTreeNewDetailed(int (*compare)(void *, void *), struct lm *lm, struct rbTreeNode *stack[128]); /* Allocate rbTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ void *rbTreeAdd(struct rbTree *t, void *item); /* Inserts an item into the red-black tree pointed to by t, * according the the value its key. The key of an item in the red-black * tree must be unique among items in the tree. If an item with the same key * already exists in the tree, a pointer to that item is returned. Otherwise, * NULL is returned, indicating insertion was successful. */ void *rbTreeFind(struct rbTree *t, void *item); /* Find an item in the red-black tree with the same key as the * item pointed to by `item'. Returns a pointer to the item found, or NULL * if no item was found. */ void *rbTreeRemove(struct rbTree *t, void *item); /* rbTreeRemove() - Delete an item in the red-black tree with the same key as * the item pointed to by `item'. Returns a pointer to the deleted item, * and NULL if no item was found. */ void rbTreeTraverseRange(struct rbTree *tree, void *minItem, void *maxItem, void (*doItem)(void *item)); /* Apply doItem function to all items in tree such that * minItem <= item <= maxItem */ struct slRef *rbTreeItemsInRange(struct rbTree *tree, void *minItem, void *maxItem); /* Return a sorted list of references to items in tree between range. * slFreeList this list when done. */ void rbTreeTraverse(struct rbTree *tree, void (*doItem)(void *item)); /* Apply doItem function to all items in tree */ void rbTreeTraverseWithContext(struct rbTree *tree, void (*doItem)(void *item, void *context), void *context); /* Traverse tree calling doItem on every item with context pointer passed through to doItem. * This often avoids having to declare global or static variables for the doItem callback to use. */ struct slRef *rbTreeItems(struct rbTree *tree); /* Return sorted list of items. slFreeList this when done.*/ void rbTreeDump(struct rbTree *tree, FILE *f, void (*dumpItem)(void *item, FILE *f)); /* Dump out rb tree to file, mostly for debugging. */ int rbTreeCmpString(void *a, void *b); /* Set up rbTree so as to work on strings. */ int rbTreeCmpWord(void *a, void *b); /* Set up rbTree so as to work on case-insensitive strings. */ #endif /* RBTREE_H */ rtracklayer/src/ucsc/sig.h0000644000175100017510000000625212612032142016572 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Sig.h - signatures that start various binary files. */ #ifndef SIG_H #define SIG_H #define aliSig 0xCDAB8245 /* Binary alignment file. */ #define alxSig 0xA1B1C1D3 /* Index into binary alignment file, sorted by start base offset. */ #define pgoSig 0x690 /* Index into GDF file, sorted by start base offset. Signature is 32 bit. */ #define cdoSig 0xCD01 /* Index into c2g text file, sorted by start base offset. 32 bit signature. */ #define xaoSig 0xA0B0C0D0 /* Index into xeno alignment, sorted by start base offset. 32 bit signature. */ #define glSig 0xF1E2D3C4 /* Binary gene file, sorted by chromosome and then starting offset. */ /* IX sig is int ixSig[4] = {0x693F8ED1, 0x7EDA1C32, 0x4BA58983, 0x277CB89C,}; * These are made by snofMake, and are indexes sorted by name. */ /* XI - same as IX but on big-endian (or is it little-endian) archetectures. */ #define nt4Signature 0x12345678 /* Signature at the beginning of an nt4 file - 2 bit a nucleotide binary file. */ #define lm2Signature 0x12131416 /* Signature at the beginning of a lm2 file - a 2nd order markov model for nucleotides. */ #define oocSig 0x584155f2 /* Signature of file that contains over-represented oligomers for patSpace * algorithm. */ #define oocSigSwapped 0xf2554158 /* Signature of file that contains over-represented oligomers for patSpace * algorithm. */ #define fofSig 0x13410da8 /* Signature into fof type index file (that can index multiple external files). */ #define nibSig 0x6BE93D3A /* Signature into nib file (4 bits per nucleotide DNA file) */ #define qacSig 0x32b67998 /* Signature of qac file (compressed quality file) */ #define caqSig 0x9879b632 /* Signature of byte-swapped qac file. */ #define twoBitSig 0x1A412743 /* Signature into 2bit file (2 bits per nucleotide DNA file) plus * information on N and masked bases. */ #define twoBitSwapSig 0x4327411A /* Signature of byte-swapped two-bit file. */ #define chromGraphSig 0x4528421C /* Signature of chromGraph binary data file */ #define chromGraphSwapSig 0x1C422845 /* Signature of byte-swapped chromGraph binary data file */ #define genomeRangeTreeSig 0xf7fb8104 /* Signature of genomeRangeTree binary data file */ #define genomeRangeTreeSwapSig 0x0481fbf7 /* Signature of genomeRangeTree binary data file */ #define bptSig 0x78CA8C91 /* Signature of generic b+ tree index file. */ #define bptSwapped 0x918CCA78 /* Signature of generic b+ tree index file. */ #define cirTreeSig 0x2468ACE0 /* Signature of a chromosome id r-tree index file. */ #define crTreeSig 0x2369ADE1 /* Signature of a chromosome r-tree index file. */ #define bigWigSig 0x888FFC26 /* Signature for a big wig file. */ #define bigBedSig 0x8789F2EB /* Signature for a big bed file. */ #define udcBitmapSig 0x4187E2F6 /* Signature for a url data cache bitmap file. */ #endif /* SIG_H */ rtracklayer/src/ucsc/sqlNum.c0000644000175100017510000001504212612032142017257 0ustar00biocbuildbiocbuild/* sqlnum.c - Routines to convert from ascii to integer * representation of numbers. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "sqlNum.h" /* The sqlInList functions allow for fast thread-safe processing of dynamic arrays in sqlList */ unsigned sqlUnsigned(char *s) /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) */ { unsigned res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; /* test for invalid character or empty */ if ((c != '\0') || (p == s)) errAbort("invalid unsigned integer: \"%s\"", s); return res; } unsigned sqlUnsignedInList(char **pS) /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; unsigned res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; if (!(c == '\0' || c == ',') || (p == s)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid unsigned integer: \"%s\"", s); } *pS = p; return res; } unsigned long sqlUnsignedLong(char *s) /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) */ { unsigned long res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; if ((c != '\0') || (p == s)) errAbort("invalid unsigned long: \"%s\"", s); return res; } unsigned long sqlUnsignedLongInList(char **pS) /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; unsigned long res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; if (!(c == '\0' || c == ',') || (p == s)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid unsigned long: \"%s\"", s); } *pS = p; return res; } int sqlSigned(char *s) /* Convert string to signed integer. Unlike atol assumes * all of string is number. */ { int res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if ((*p != '\0') || (p == p0)) errAbort("invalid signed integer: \"%s\"", s); if (*s == '-') return -res; else return res; } int sqlSignedInList(char **pS) /* Convert string to signed integer. Unlike atol assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; int res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if (!(*p == '\0' || *p == ',') || (p == p0)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid signed integer: \"%s\"", s); } *pS = p; if (*s == '-') return -res; else return res; } long long sqlLongLong(char *s) /* Convert string to a long long. Unlike atol assumes all of string is * number. */ { long long res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if ((*p != '\0') || (p == p0)) errAbort("invalid signed long long: \"%s\"", s); if (*s == '-') return -res; else return res; } long long sqlLongLongInList(char **pS) /* Convert string to a long long. Unlike atol, assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; long long res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if (!(*p == '\0' || *p == ',') || (p == p0)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid signed long long: \"%s\"", s); } *pS = p; if (*s == '-') return -res; else return res; } float sqlFloat(char *s) /* Convert string to a float. Assumes all of string is number * and aborts on an error. */ { char* end; /* used to have an ifdef here to use strtof() but that doesn't * actually exist on all systems and since strtod() does, may as * well use it since it will do the job here. */ float val = (float) strtod(s, &end); if ((end == s) || (*end != '\0')) errAbort("invalid float: %s", s); return val; } float sqlFloatInList(char **pS) /* Convert string to a float. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; char* end; /* used to have an ifdef here to use strtof() but that doesn't * actually exist on all systems and since strtod() does, may as * well use it since it will do the job here. */ float val = (float) strtod(s, &end); if ((end == s) || !(*end == '\0' || *end == ',')) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid float: %s", s); } *pS = end; return val; } double sqlDouble(char *s) /* Convert string to a double. Assumes all of string is number * and aborts on an error. */ { char* end; double val = strtod(s, &end); if ((end == s) || (*end != '\0')) errAbort("invalid double: %s", s); return val; } double sqlDoubleInList(char **pS) /* Convert string to a double. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; char* end; double val = strtod(s, &end); if ((end == s) || !(*end == '\0' || *end == ',')) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid double: %s", s); } *pS = end; return val; } rtracklayer/src/ucsc/sqlNum.h0000644000175100017510000000611612612032142017266 0ustar00biocbuildbiocbuild/* sqlNum.h - routines to convert from ascii to * unsigned/integer a bit more quickly than atoi. * Called sqlNum because it was first developed for use with * SQL databases, which tend to require a lot of conversion from * string to binary representation of numbers. In particular the * code generator AutoSQL puts in lots of calls to these routines * into it's parsers. Other parser in the source tree have come * to use these too though since they are fast and have good error * checking. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef SQLNUM_H #define SQLNUM_H /* get off_t */ #include unsigned sqlUnsigned(char *s); /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) */ unsigned sqlUnsignedInList(char **pS); /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ unsigned long sqlUnsignedLong(char *s); /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) */ unsigned long sqlUnsignedLongInList(char **pS); /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ int sqlSigned(char *s); /* Convert string to signed integer. Unlike atol assumes * all of string is number. */ int sqlSignedInList(char **pS); /* Convert string to signed integer. Unlike atol assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ long long sqlLongLong(char *s); /* Convert string to a long long. Unlike atol assumes all of string is * number. */ long long sqlLongLongInList(char **pS); /* Convert string to a long long. Unlike atol, assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ float sqlFloat(char *s); /* Convert string to a float. Assumes all of string is number * and aborts on an error. */ float sqlFloatInList(char **pS); /* Convert string to a float. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ double sqlDouble(char *s); /* Convert string to a double. Assumes all of string is number * and aborts on an error. */ double sqlDoubleInList(char **pS); /* Convert string to a double. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ #endif /* SQLNUM_H */ rtracklayer/src/ucsc/twoBit.c0000644000175100017510000007304412612032142017256 0ustar00biocbuildbiocbuild/* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "dnaseq.h" #include "dnautil.h" #include "sig.h" #include "localmem.h" #include "linefile.h" #include "obscure.h" #include "bPlusTree.h" #include "twoBit.h" #include "udc.h" #include "net.h" #include "portable.h" #include /* following are the wrap functions for the UDC and stdio functoins * that read twoBit files. All of these are to get around the C compiler * complaining about the automatic cast of a void * to FILE * or * struct udcFile *. */ /* first the UDC wrappers */ static void udcSeekCurWrap(void *file, bits64 offset) { udcSeekCur((struct udcFile *)file, offset); } static void udcSeekWrap(void *file, bits64 offset) { udcSeek((struct udcFile *)file, offset); } static void udcMustReadWrap(void *file, void *buf, size_t size) { udcMustRead((struct udcFile *)file, buf, size); } static void udcFileCloseWrap(void *pFile) { udcFileClose((struct udcFile **)pFile); } static bits32 udcReadBits32Wrap(void *f, boolean isSwapped) { return udcReadBits32((struct udcFile *)f, isSwapped); } static boolean udcFastReadStringWrap(void *f, char buf[256]) { return udcFastReadString((struct udcFile *)f, buf); } /* now the stdio wrappers */ static void seekCurWrap(void *file, bits64 offset) { fseek((FILE *)file, offset, SEEK_CUR); } static void seekWrap(void *file, bits64 offset) { fseek((FILE *)file, offset, SEEK_SET); } static void mustReadWrap(void *file, void *buf, size_t size) { mustRead((FILE *)file, buf, size); } static void fileCloseWrap(void *pFile) { carefulClose((FILE **)pFile); } static bits32 readBits32Wrap(void *f, boolean isSwapped) { return readBits32((FILE *)f, isSwapped); } static boolean fastReadStringWrap(void *f, char buf[256]) { return fastReadString((FILE *)f, buf); } static void setFileFuncs( struct twoBitFile *tbf, boolean useUdc) /* choose the proper function pointers depending on whether * this open twoBit is using stdio or UDC */ { if (useUdc) { tbf->ourSeekCur = udcSeekCurWrap; tbf->ourSeek = udcSeekWrap; tbf->ourReadBits32 = udcReadBits32Wrap; tbf->ourFastReadString = udcFastReadStringWrap; tbf->ourClose = udcFileCloseWrap; tbf->ourMustRead = udcMustReadWrap; } else { tbf->ourSeekCur = seekCurWrap; tbf->ourSeek = seekWrap; tbf->ourReadBits32 = readBits32Wrap; tbf->ourFastReadString = fastReadStringWrap; tbf->ourClose = fileCloseWrap; tbf->ourMustRead = mustReadWrap; } } static int countBlocksOfN(char *s, int size) /* Count number of blocks of N's (or n's) in s. */ { int i; boolean isN, lastIsN = FALSE; char c; int blockCount = 0; for (i=0; i> 2); } struct twoBit *twoBitFromDnaSeq(struct dnaSeq *seq, boolean doMask) /* Convert dnaSeq representation in memory to twoBit representation. * If doMask is true interpret lower-case letters as masked. */ { int ubyteSize = packedSize(seq->size); UBYTE *pt; struct twoBit *twoBit; DNA last4[4]; /* Holds few bases. */ DNA *dna; int i, end; /* Allocate structure and fill in name. */ AllocVar(twoBit); pt = AllocArray(twoBit->data, ubyteSize); twoBit->name = cloneString(seq->name); twoBit->size = seq->size; /* Convert to 4-bases per byte representation. */ dna = seq->dna; end = seq->size - 4; for (i=0; isize-i); *pt = packDna4(last4); /* Deal with blocks of N. */ twoBit->nBlockCount = countBlocksOfN(dna, seq->size); if (twoBit->nBlockCount > 0) { AllocArray(twoBit->nStarts, twoBit->nBlockCount); AllocArray(twoBit->nSizes, twoBit->nBlockCount); storeBlocksOfN(dna, seq->size, twoBit->nStarts, twoBit->nSizes); } /* Deal with masking */ if (doMask) { twoBit->maskBlockCount = countBlocksOfLower(dna, seq->size); if (twoBit->maskBlockCount > 0) { AllocArray(twoBit->maskStarts, twoBit->maskBlockCount); AllocArray(twoBit->maskSizes, twoBit->maskBlockCount); storeBlocksOfLower(dna, seq->size, twoBit->maskStarts, twoBit->maskSizes); } } return twoBit; } static int twoBitSizeInFile(struct twoBit *twoBit) /* Figure out size structure will take in file. */ { return packedSize(twoBit->size) + sizeof(twoBit->size) + sizeof(twoBit->nBlockCount) + sizeof(twoBit->nStarts[0]) * twoBit->nBlockCount + sizeof(twoBit->nSizes[0]) * twoBit->nBlockCount + sizeof(twoBit->maskBlockCount) + sizeof(twoBit->maskStarts[0]) * twoBit->maskBlockCount + sizeof(twoBit->maskSizes[0]) * twoBit->maskBlockCount + sizeof(twoBit->reserved); } void twoBitWriteOne(struct twoBit *twoBit, FILE *f) /* Write out one twoBit sequence to binary file. * Note this does not include the name, which is * stored only in index. */ { writeOne(f, twoBit->size); writeOne(f, twoBit->nBlockCount); if (twoBit->nBlockCount > 0) { fwrite(twoBit->nStarts, sizeof(twoBit->nStarts[0]), twoBit->nBlockCount, f); fwrite(twoBit->nSizes, sizeof(twoBit->nSizes[0]), twoBit->nBlockCount, f); } writeOne(f, twoBit->maskBlockCount); if (twoBit->maskBlockCount > 0) { fwrite(twoBit->maskStarts, sizeof(twoBit->maskStarts[0]), twoBit->maskBlockCount, f); fwrite(twoBit->maskSizes, sizeof(twoBit->maskSizes[0]), twoBit->maskBlockCount, f); } writeOne(f, twoBit->reserved); mustWrite(f, twoBit->data, packedSize(twoBit->size)); } void twoBitWriteHeader(struct twoBit *twoBitList, FILE *f) /* Write out header portion of twoBit file, including initial * index */ { bits32 sig = twoBitSig; bits32 version = 0; bits32 seqCount = slCount(twoBitList); bits32 reserved = 0; bits32 offset = 0; struct twoBit *twoBit; long long counter = 0; /* check for 32 bit overflow */ /* Write out fixed parts of header. */ writeOne(f, sig); writeOne(f, version); writeOne(f, seqCount); writeOne(f, reserved); /* Figure out location of first byte past index. * Each index entry contains 4 bytes of offset information * and the name of the sequence, which is variable length. */ offset = sizeof(sig) + sizeof(version) + sizeof(seqCount) + sizeof(reserved); for (twoBit = twoBitList; twoBit != NULL; twoBit = twoBit->next) { int nameLen = strlen(twoBit->name); if (nameLen > 255) errAbort("name %s too long", twoBit->name); offset += nameLen + 1 + sizeof(bits32); } /* Write out index. */ for (twoBit = twoBitList; twoBit != NULL; twoBit = twoBit->next) { int size = twoBitSizeInFile(twoBit); writeString(f, twoBit->name); writeOne(f, offset); offset += size; counter += (long long)size; if (counter > UINT_MAX ) errAbort("Error in faToTwoBit, index overflow at %s. The 2bit format " "does not support indexes larger than %dGb, \n" "please split up into smaller files.\n", twoBit->name, UINT_MAX/1000000000); } } void twoBitClose(struct twoBitFile **pTbf) /* Free up resources associated with twoBitFile. */ { struct twoBitFile *tbf = *pTbf; if (tbf != NULL) { freez(&tbf->fileName); (*tbf->ourClose)(&tbf->f); hashFree(&tbf->hash); /* The indexList is allocated out of the hash's memory pool. */ bptFileClose(&tbf->bpt); freez(pTbf); } } boolean twoBitSigRead(struct twoBitFile *tbf, boolean *isSwapped) /* read twoBit signature, return FALSE if not good * set isSwapped to TRUE if twoBit file is byte swapped */ { bits32 sig; *isSwapped = FALSE; (*tbf->ourMustRead)(tbf->f, &sig, sizeof(sig)); if (sig == twoBitSwapSig) *isSwapped = TRUE; else if (sig != twoBitSig) return FALSE; return TRUE; } static struct twoBitFile *getTbfAndOpen(char *fileName, boolean useUdc) { struct twoBitFile *tbf; AllocVar(tbf); setFileFuncs(tbf, useUdc); if (useUdc) tbf->f = udcFileOpen(fileName, NULL); else tbf->f = mustOpen(fileName, "rb"); return tbf; } static struct twoBitFile *twoBitOpenReadHeader(char *fileName, boolean useUdc) /* Open file, read in header but not index. * Squawk and die if there is a problem. */ { struct twoBitFile *tbf; boolean isSwapped = FALSE; tbf = getTbfAndOpen(fileName, useUdc); /* Allocate header verify signature, and read in * the constant-length bits. */ if (!twoBitSigRead(tbf, &isSwapped)) errAbort("%s doesn't have a valid twoBitSig", fileName); tbf->isSwapped = isSwapped; tbf->fileName = cloneString(fileName); tbf->version = (*tbf->ourReadBits32)(tbf->f, isSwapped); if (tbf->version != 0) { errAbort("Can only handle version 0 of this file. This is version %d", (int)tbf->version); } tbf->seqCount = (*tbf->ourReadBits32)(tbf->f, isSwapped); tbf->reserved = (*tbf->ourReadBits32)(tbf->f, isSwapped); return tbf; } struct twoBitFile *twoBitOpen(char *fileName) /* Open file, read in header and index. * Squawk and die if there is a problem. */ { boolean useUdc = FALSE; if (hasProtocol(fileName)) useUdc = TRUE; struct twoBitFile *tbf = twoBitOpenReadHeader(fileName, useUdc); struct twoBitIndex *index; boolean isSwapped = tbf->isSwapped; int i; struct hash *hash; void *f = tbf->f; /* Read in index. */ hash = tbf->hash = hashNew(digitsBaseTwo(tbf->seqCount)); for (i=0; iseqCount; ++i) { char name[256]; if (!(*tbf->ourFastReadString)(f, name)) errAbort("%s is truncated", fileName); lmAllocVar(hash->lm, index); index->offset = (*tbf->ourReadBits32)(f, isSwapped); hashAddSaveName(hash, name, index, &index->name); slAddHead(&tbf->indexList, index); } slReverse(&tbf->indexList); return tbf; } struct twoBitFile *twoBitOpenExternalBptIndex(char *twoBitName, char *bptName) /* Open file, read in header, but not regular index. Instead use * bpt index. Beware if you use this the indexList field will be NULL * as will the hash. */ { struct twoBitFile *tbf = twoBitOpenReadHeader(twoBitName, FALSE); tbf->bpt = bptFileOpen(bptName); if (tbf->seqCount != tbf->bpt->itemCount) errAbort("%s and %s don't have same number of sequences!", twoBitName, bptName); return tbf; } static int findGreatestLowerBound(int blockCount, bits32 *pos, int val) /* Find index of greatest element in posArray that is less * than or equal to val using a binary search. */ { int startIx=0, endIx=blockCount-1, midIx; int posVal; for (;;) { if (startIx == endIx) { posVal = pos[startIx]; if (posVal <= val || startIx == 0) return startIx; else return startIx-1; } midIx = ((startIx + endIx)>>1); posVal = pos[midIx]; if (posVal < val) startIx = midIx+1; else endIx = midIx; } } static void twoBitSeekTo(struct twoBitFile *tbf, char *name) /* Seek to start of named record. Abort if can't find it. */ { if (tbf->bpt) { bits32 offset; if (!bptFileFind(tbf->bpt, name, strlen(name), &offset, sizeof(offset))) errAbort("%s is not in %s", name, tbf->bpt->fileName); (*tbf->ourSeek)(tbf->f, offset); } else { struct twoBitIndex *index = hashFindVal(tbf->hash, name); if (index == NULL) errAbort("%s is not in %s", name, tbf->fileName); (*tbf->ourSeek)(tbf->f, index->offset); } } static void readBlockCoords(struct twoBitFile *tbf, boolean isSwapped, bits32 *retBlockCount, bits32 **retBlockStarts, bits32 **retBlockSizes) /* Read in blockCount, starts and sizes from file. (Same structure used for * both blocks of N's and masked blocks.) */ { bits32 blkCount = (*tbf->ourReadBits32)(tbf->f, isSwapped); *retBlockCount = blkCount; if (blkCount == 0) { *retBlockStarts = NULL; *retBlockSizes = NULL; } else { bits32 *nStarts, *nSizes; AllocArray(nStarts, blkCount); AllocArray(nSizes, blkCount); (*tbf->ourMustRead)(tbf->f, nStarts, sizeof(nStarts[0]) * blkCount); (*tbf->ourMustRead)(tbf->f, nSizes, sizeof(nSizes[0]) * blkCount); if (isSwapped) { int i; for (i=0; iisSwapped; struct twoBit *twoBit; AllocVar(twoBit); twoBit->name = cloneString(name); void *f = tbf->f; /* Find offset in index and seek to it */ twoBitSeekTo(tbf, name); /* Read in seqSize. */ twoBit->size = (*tbf->ourReadBits32)(f, isSwapped); /* Read in blocks of N. */ readBlockCoords(tbf, isSwapped, &(twoBit->nBlockCount), &(twoBit->nStarts), &(twoBit->nSizes)); /* Read in masked blocks. */ readBlockCoords(tbf, isSwapped, &(twoBit->maskBlockCount), &(twoBit->maskStarts), &(twoBit->maskSizes)); /* Reserved word. */ twoBit->reserved = (*tbf->ourReadBits32)(f, isSwapped); /* Read in data. */ packByteCount = packedSize(twoBit->size); twoBit->data = needLargeMem(packByteCount); (*tbf->ourMustRead)(f, twoBit->data, packByteCount); return twoBit; } struct twoBit *twoBitFromFile(char *fileName) /* Get twoBit list of all sequences in twoBit file. */ { struct twoBitFile *tbf = twoBitOpen(fileName); struct twoBitIndex *index; struct twoBit *twoBitList = NULL; for (index = tbf->indexList; index != NULL; index = index->next) { struct twoBit *twoBit = twoBitOneFromFile(tbf, index->name); slAddHead(&twoBitList, twoBit); } twoBitClose(&tbf); slReverse(&twoBitList); return twoBitList; } void twoBitFree(struct twoBit **pTwoBit) /* Free up a two bit structure. */ { struct twoBit *twoBit = *pTwoBit; if (twoBit != NULL) { freeMem(twoBit->nStarts); freeMem(twoBit->nSizes); freeMem(twoBit->maskStarts); freeMem(twoBit->maskSizes); freeMem(twoBit->data); freez(pTwoBit); } } void twoBitFreeList(struct twoBit **pList) /* Free a list of dynamically allocated twoBit's */ { struct twoBit *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; twoBitFree(&el); } *pList = NULL; } struct dnaSeq *twoBitReadSeqFragExt(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd, boolean doMask, int *retFullSize) /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Sequence will be lower * case if doMask is false, mixed case (repeats in lower) * if doMask is true. */ { struct dnaSeq *seq; bits32 seqSize; bits32 nBlockCount, maskBlockCount; bits32 *nStarts = NULL, *nSizes = NULL; bits32 *maskStarts = NULL, *maskSizes = NULL; boolean isSwapped = tbf->isSwapped; void *f = tbf->f; int i; int packByteCount, packedStart, packedEnd, remainder, midStart, midEnd; int outSize; UBYTE *packed, *packedAlloc; DNA *dna; /* Find offset in index and seek to it */ dnaUtilOpen(); twoBitSeekTo(tbf, name); /* Read in seqSize. */ seqSize = (*tbf->ourReadBits32)(f, isSwapped); if (fragEnd == 0) fragEnd = seqSize; if (fragEnd > seqSize) errAbort("twoBitReadSeqFrag in %s end (%d) >= seqSize (%d)", name, fragEnd, seqSize); outSize = fragEnd - fragStart; if (outSize < 1) errAbort("twoBitReadSeqFrag in %s start (%d) >= end (%d)", name, fragStart, fragEnd); /* Read in blocks of N. */ readBlockCoords(tbf, isSwapped, &nBlockCount, &nStarts, &nSizes); /* Read in masked blocks. */ readBlockCoords(tbf, isSwapped, &maskBlockCount, &maskStarts, &maskSizes); /* Skip over reserved word. */ (*tbf->ourReadBits32)(f, isSwapped); /* Allocate dnaSeq, and fill in zero tag at end of sequence. */ AllocVar(seq); if (outSize == seqSize) seq->name = cloneString(name); else { char buf[256*2]; safef(buf, sizeof(buf), "%s:%d-%d", name, fragStart, fragEnd); seq->name = cloneString(buf); } seq->size = outSize; dna = seq->dna = needLargeMem(outSize+1); seq->dna[outSize] = 0; /* Skip to bits we need and read them in. */ packedStart = (fragStart>>2); packedEnd = ((fragEnd+3)>>2); packByteCount = packedEnd - packedStart; packed = packedAlloc = needLargeMem(packByteCount); (*tbf->ourSeekCur)(f, packedStart); (*tbf->ourMustRead)(f, packed, packByteCount); /* Handle case where everything is in one packed byte */ if (packByteCount == 1) { int pOff = (packedStart<<2); int pStart = fragStart - pOff; int pEnd = fragEnd - pOff; UBYTE partial = *packed; assert(pEnd <= 4); assert(pStart >= 0); for (i=pStart; i> (6-i-i)) & 3]; } else { /* Handle partial first packed byte. */ midStart = fragStart; remainder = (fragStart&3); if (remainder > 0) { UBYTE partial = *packed++; int partCount = 4 - remainder; for (i=partCount-1; i>=0; --i) { dna[i] = valToNt[partial&3]; partial >>= 2; } midStart += partCount; dna += partCount; } /* Handle middle bytes. */ remainder = fragEnd&3; midEnd = fragEnd - remainder; for (i=midStart; i>= 2; dna[2] = valToNt[b&3]; b >>= 2; dna[1] = valToNt[b&3]; b >>= 2; dna[0] = valToNt[b&3]; dna += 4; } if (remainder >0) { UBYTE part = *packed; part >>= (8-remainder-remainder); for (i=remainder-1; i>=0; --i) { dna[i] = valToNt[part&3]; part >>= 2; } } } freez(&packedAlloc); if (nBlockCount > 0) { int startIx = findGreatestLowerBound(nBlockCount, nStarts, fragStart); for (i=startIx; i= fragEnd) break; if (s < fragStart) s = fragStart; if (e > fragEnd) e = fragEnd; if (s < e) memset(seq->dna + s - fragStart, 'n', e - s); } } if (doMask) { toUpperN(seq->dna, seq->size); if (maskBlockCount > 0) { int startIx = findGreatestLowerBound(maskBlockCount, maskStarts, fragStart); for (i=startIx; i= fragEnd) break; if (s < fragStart) s = fragStart; if (e > fragEnd) e = fragEnd; if (s < e) toLowerN(seq->dna + s - fragStart, e - s); } } } freez(&nStarts); freez(&nSizes); freez(&maskStarts); freez(&maskSizes); if (retFullSize != NULL) *retFullSize = seqSize; return seq; } struct dnaSeq *twoBitReadSeqFrag(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd) /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Note that sequence will * be mixed case, with repeats in lower case and rest in * upper case. */ { return twoBitReadSeqFragExt(tbf, name, fragStart, fragEnd, TRUE, NULL); } struct dnaSeq *twoBitReadSeqFragLower(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd) /* Same as twoBitReadSeqFrag, but sequence is returned in lower case. */ { return twoBitReadSeqFragExt(tbf, name, fragStart, fragEnd, FALSE, NULL); } int twoBitSeqSize(struct twoBitFile *tbf, char *name) /* Return size of sequence in two bit file in bases. */ { twoBitSeekTo(tbf, name); return (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); } long long twoBitTotalSize(struct twoBitFile *tbf) /* Return total size of all sequences in two bit file. */ { struct twoBitIndex *index; long long totalSize = 0; for (index = tbf->indexList; index != NULL; index = index->next) { (*tbf->ourSeek)(tbf->f, index->offset); totalSize += (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); } return totalSize; } struct dnaSeq *twoBitLoadAll(char *spec) /* Return list of all sequences matching spec, which is in * the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end */ { struct twoBitSpec *tbs = twoBitSpecNew(spec); struct twoBitFile *tbf = twoBitOpen(tbs->fileName); struct dnaSeq *list = NULL; if (tbs->seqs != NULL) { struct twoBitSeqSpec *tbss; for (tbss = tbs->seqs; tbss != NULL; tbss = tbss->next) slSafeAddHead(&list, twoBitReadSeqFrag(tbf, tbss->name, tbss->start, tbss->end)); } else { struct twoBitIndex *index; for (index = tbf->indexList; index != NULL; index = index->next) slSafeAddHead(&list, twoBitReadSeqFrag(tbf, index->name, 0, 0)); } slReverse(&list); twoBitClose(&tbf); twoBitSpecFree(&tbs); return list; } struct slName *twoBitSeqNames(char *fileName) /* Get list of all sequences in twoBit file. */ { struct twoBitFile *tbf = twoBitOpen(fileName); struct twoBitIndex *index; struct slName *name, *list = NULL; for (index = tbf->indexList; index != NULL; index = index->next) { name = slNameNew(index->name); slAddHead(&list, name); } twoBitClose(&tbf); slReverse(&list); return list; } boolean twoBitIsFile(char *fileName) /* Return TRUE if file is in .2bit format. */ { boolean useUdc = FALSE; if (hasProtocol(fileName)) useUdc = TRUE; else if (!isRegularFile(fileName)) return FALSE; struct twoBitFile *tbf = getTbfAndOpen(fileName, useUdc); boolean isSwapped; boolean isTwoBit = twoBitSigRead(tbf, &isSwapped); (*tbf->ourClose)(&tbf->f); return isTwoBit; } boolean twoBitParseRange(char *rangeSpec, char **retFile, char **retSeq, int *retStart, int *retEnd) /* Parse out something in format * file/path/name:seqName:start-end * or * file/path/name:seqName * or * file/path/name:seqName1,seqName2,seqName3,... * This will destroy the input 'rangeSpec' in the process. Returns FALSE if * it doesn't fit this format, setting retFile to rangeSpec, and retSet to * null. If it is the shorter form then start and end will both be returned * as zero, which is ok by twoBitReadSeqFrag. Any of the return arguments * maybe NULL. */ { char *s, *e; int n; /* default returns */ if (retFile != NULL) *retFile = rangeSpec; if (retSeq != NULL) *retSeq = NULL; if (retStart != NULL) *retStart = 0; if (retEnd != NULL) *retEnd = 0; /* start with final name */ s = strrchr(rangeSpec, '/'); if (s == NULL) s = rangeSpec; else s++; /* Grab seqName, zero terminate fileName. */ s = strchr(s, ':'); if (s == NULL) return FALSE; *s++ = 0; if (retSeq != NULL) *retSeq = s; /* Grab start, zero terminate seqName. */ s = strchr(s, ':'); if (s == NULL) return TRUE; /* no range spec */ *s++ = 0; n = strtol(s, &e, 0); if (*e != '-') return FALSE; /* not a valid range */ if (retStart != NULL) *retStart = n; s = e+1; /* Grab end. */ n = strtol(s, &e, 0); if (*e != '\0') return FALSE; /* not a valid range */ if (retEnd != NULL) *retEnd = n; return TRUE; } boolean twoBitIsRange(char *rangeSpec) /* Return TRUE if it looks like a two bit range specifier. */ { char *dupe = cloneString(rangeSpec); char *file, *seq; int start, end; boolean isRange = twoBitParseRange(dupe, &file, &seq, &start, &end); if (isRange) isRange = twoBitIsFile(file); freeMem(dupe); return isRange; } boolean twoBitIsFileOrRange(char *spec) /* Return TRUE if it is a two bit file or subrange. */ { return twoBitIsFile(spec) || twoBitIsRange(spec); } static struct twoBitSeqSpec *parseSeqSpec(char *seqSpecStr) /* parse one sequence spec */ { boolean isOk = TRUE; char *s, *e; struct twoBitSeqSpec *seq; AllocVar(seq); seq->name = cloneString(seqSpecStr); /* Grab start */ s = strchr(seq->name, ':'); if (s == NULL) return seq; /* no range spec */ *s++ = 0; seq->start = strtol(s, &e, 0); if (*e != '-') isOk = FALSE; else { /* Grab end */ s = e+1; seq->end = strtol(s, &e, 0); if (*e != '\0') isOk = FALSE; } if (!isOk || (seq->end < seq->start)) errAbort("invalid twoBit sequence specification: \"%s\"", seqSpecStr); return seq; } boolean twoBitIsSpec(char *spec) /* Return TRUE spec is a valid 2bit spec (see twoBitSpecNew) */ { struct twoBitSpec *tbs = twoBitSpecNew(spec); boolean isSpec = (tbs != NULL); twoBitSpecFree(&tbs); return isSpec; } struct twoBitSpec *twoBitSpecNew(char *specStr) /* Parse a .2bit file and sequence spec into an object. * The spec is a string in the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end * * free result with twoBitSpecFree(). */ { char *s, *e; int i, numSeqs; char **seqSpecs; struct twoBitSpec *spec; AllocVar(spec); spec->fileName = cloneString(specStr); /* start with final file name */ s = strrchr(spec->fileName, '/'); if (s == NULL) s = spec->fileName; else s++; /* find end of file name and zero-terminate */ e = strchr(s, ':'); if (e == NULL) s = NULL; /* just file name */ else { *e++ = '\0'; s = e; } if (!twoBitIsFile(spec->fileName)) { twoBitSpecFree(&spec); return NULL; /* not a 2bit file */ } if (s != NULL) { /* chop seqs at commas and parse */ numSeqs = chopString(s, ",", NULL, 0); AllocArray(seqSpecs, numSeqs); chopString(s, ",", seqSpecs, numSeqs); for (i = 0; i< numSeqs; i++) slSafeAddHead(&spec->seqs, parseSeqSpec(seqSpecs[i])); slReverse(&spec->seqs); } return spec; } struct twoBitSpec *twoBitSpecNewFile(char *twoBitFile, char *specFile) /* parse a file containing a list of specifications for sequences in the * specified twoBit file. Specifications are one per line in forms: * seqName * or * seqName:start-end */ { struct lineFile *lf = lineFileOpen(specFile, TRUE); char *line; struct twoBitSpec *spec; AllocVar(spec); spec->fileName = cloneString(twoBitFile); while (lineFileNextReal(lf, &line)) slSafeAddHead(&spec->seqs, parseSeqSpec(trimSpaces(line))); slReverse(&spec->seqs); lineFileClose(&lf); return spec; } void twoBitSpecFree(struct twoBitSpec **specPtr) /* free a twoBitSpec object */ { struct twoBitSpec *spec = *specPtr; if (spec != NULL) { struct twoBitSeqSpec *seq; while ((seq = slPopHead(&spec->seqs)) != NULL) { freeMem(seq->name); freeMem(seq); } freeMem(spec->fileName); freeMem(spec); *specPtr = NULL; } } void twoBitOutNBeds(struct twoBitFile *tbf, char *seqName, FILE *outF) /* output a series of bed3's that enumerate the number of N's in a sequence*/ { int nBlockCount; twoBitSeekTo(tbf, seqName); (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); /* Read in blocks of N. */ nBlockCount = (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); if (nBlockCount > 0) { bits32 *nStarts = NULL, *nSizes = NULL; int i; AllocArray(nStarts, nBlockCount); AllocArray(nSizes, nBlockCount); (*tbf->ourMustRead)(tbf->f, nStarts, sizeof(nStarts[0]) * nBlockCount); (*tbf->ourMustRead)(tbf->f, nSizes, sizeof(nSizes[0]) * nBlockCount); if (tbf->isSwapped) { for (i=0; iourReadBits32)(tbf->f, tbf->isSwapped); /* Read in blocks of N. */ nBlockCount = (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); if (nBlockCount > 0) { bits32 *nStarts = NULL, *nSizes = NULL; int i; AllocArray(nStarts, nBlockCount); AllocArray(nSizes, nBlockCount); (*tbf->ourMustRead)(tbf->f, nStarts, sizeof(nStarts[0]) * nBlockCount); (*tbf->ourMustRead)(tbf->f, nSizes, sizeof(nSizes[0]) * nBlockCount); if (tbf->isSwapped) { for (i=0; iindexList; index != NULL; index = index->next) { int size = twoBitSeqSizeNoNs(tbf, index->name); totalSize += size; } return totalSize; } boolean twoBitIsSequence(struct twoBitFile *tbf, char *chromName) /* Return TRUE if chromName is in 2bit file. */ { return (hashFindVal(tbf->hash, chromName) != NULL); } rtracklayer/src/ucsc/twoBit.h0000644000175100017510000001632212612032142017257 0ustar00biocbuildbiocbuild/* twoBit - DNA sequence represented as two bits per pixel * with associated list of regions containing N's, and * masked regions. */ #ifndef TWOBIT_H #define TWOBIT_H struct twoBit /* Two bit representation of DNA. */ { struct twoBit *next; /* Next sequence in list */ char *name; /* Name of sequence. */ UBYTE *data; /* DNA at two bits per base. */ bits32 size; /* Size of this sequence. */ bits32 nBlockCount; /* Count of blocks of Ns. */ bits32 *nStarts; /* Starts of blocks of Ns. */ bits32 *nSizes; /* Sizes of blocks of Ns. */ bits32 maskBlockCount; /* Count of masked blocks. */ bits32 *maskStarts; /* Starts of masked regions. */ bits32 *maskSizes; /* Sizes of masked regions. */ bits32 reserved; /* Reserved for future expansion. */ }; struct twoBitIndex /* An entry in twoBit index. */ { struct twoBitIndex *next; /* Next in list. */ char *name; /* Name - allocated in hash */ bits32 offset; /* Offset in file. */ }; struct twoBitFile /* Holds header and index info from .2bit file. */ { struct twoBitFile *next; char *fileName; /* Name of this file, for error reporting. */ void *f; /* Open file. */ boolean isSwapped; /* Is byte-swapping needed. */ bits32 version; /* Version of .2bit file */ bits32 seqCount; /* Number of sequences. */ bits32 reserved; /* Reserved, always zero for now. */ struct twoBitIndex *indexList; /* List of sequence. */ struct hash *hash; /* Hash of sequences. */ struct bptFile *bpt; /* Alternative index. */ /* the routines we use to access the twoBit. * These may be UDC routines, or stdio */ void (*ourSeek)(void *file, bits64 offset); void (*ourSeekCur)(void *file, bits64 offset); bits32 (*ourReadBits32)(void *f, boolean isSwapped); void (*ourClose)(void *pFile); boolean (*ourFastReadString)(void *f, char buf[256]); void (*ourMustRead)(void *file, void *buf, size_t size); }; struct twoBitSpec /* parsed .2bit file and sequence specs */ { char *fileName; /* path to file */ struct twoBitSeqSpec *seqs; /* list of sequences and subsequences */ }; struct twoBitSeqSpec /* specification for a seq or subsequence in a .2bit file */ { struct twoBitSeqSpec *next; char *name; /* name of sequence */ bits32 start; /* start of subsequence 0 */ bits32 end; /* end of subsequence; * 0 if not a subsequence */ }; struct twoBitFile *twoBitOpen(char *fileName); /* Open file, read in header and index. * Squawk and die if there is a problem. */ struct twoBitFile *twoBitOpenExternalBptIndex(char *twoBitName, char *bptName); /* Open file, read in header, but not regular index. Instead use * bpt index. Beware if you use this the indexList field will be NULL * as will the hash. */ void twoBitClose(struct twoBitFile **pTbf); /* Free up resources associated with twoBitFile. */ int twoBitSeqSize(struct twoBitFile *tbf, char *name); /* Return size of sequence in two bit file in bases. */ long long twoBitTotalSize(struct twoBitFile *tbf); /* Return total size of all sequences in two bit file. */ struct dnaSeq *twoBitReadSeqFragExt(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd, boolean doMask, int *retFullSize); /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Sequence will be lower * case if doMask is false, mixed case (repeats in lower) * if doMask is true. */ struct dnaSeq *twoBitReadSeqFrag(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd); /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Note that sequence will * be mixed case, with repeats in lower case and rest in * upper case. */ struct dnaSeq *twoBitReadSeqFragLower(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd); /* Same as twoBitReadSeqFrag, but sequence is returned in lower case. */ struct dnaSeq *twoBitLoadAll(char *spec); /* Return list of all sequences matching spec, which is in * the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end */ struct slName *twoBitSeqNames(char *fileName); /* Get list of all sequences in twoBit file. */ struct twoBit *twoBitFromDnaSeq(struct dnaSeq *seq, boolean doMask); /* Convert dnaSeq representation in memory to twoBit representation. * If doMask is true interpret lower-case letters as masked. */ struct twoBit *twoBitFromFile(char *fileName); /* Get twoBit list of all sequences in twoBit file. */ struct twoBit *twoBitOneFromFile(struct twoBitFile *tbf, char *name); /* Get single sequence as two bit. */ void twoBitFree(struct twoBit **pTwoBit); /* Free up a two bit structure. */ void twoBitFreeList(struct twoBit **pList); /* Free a list of dynamically allocated twoBit's */ void twoBitWriteOne(struct twoBit *twoBit, FILE *f); /* Write out one twoBit sequence to binary file. * Note this does not include the name, which is * stored only in index. */ void twoBitWriteHeader(struct twoBit *twoBitList, FILE *f); /* Write out header portion of twoBit file, including initial * index */ boolean twoBitIsFile(char *fileName); /* Return TRUE if file is in .2bit format. */ boolean twoBitParseRange(char *rangeSpec, char **retFile, char **retSeq, int *retStart, int *retEnd); /* Parse out something in format * file/path/name:seqName:start-end * or * file/path/name:seqName * This will destroy the input 'rangeSpec' in the process. * Returns FALSE if it doesn't fit this format. * If it is the shorter form then start and end will both * be returned as zero, which is ok by twoBitReadSeqFrag. */ boolean twoBitIsRange(char *rangeSpec); /* Return TRUE if it looks like a two bit range specifier. */ boolean twoBitIsFileOrRange(char *spec); /* Return TRUE if it is a two bit file or subrange. */ boolean twoBitIsSpec(char *spec); /* Return TRUE spec is a valid 2bit spec (see twoBitSpecNew) */ struct twoBitSpec *twoBitSpecNew(char *specStr); /* Parse a .2bit file and sequence spec into an object. * The spec is a string in the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end * * free result with twoBitSpecFree(). */ struct twoBitSpec *twoBitSpecNewFile(char *twoBitFile, char *specFile); /* parse a file containing a list of specifications for sequences in the * specified twoBit file. Specifications are one per line in forms: * seqName * or * seqName:start-end */ void twoBitSpecFree(struct twoBitSpec **specPtr); /* free a twoBitSpec object */ void twoBitOutNBeds(struct twoBitFile *tbf, char *seqName, FILE *outF); /* output a series of bed3's that enumerate the number of N's in a sequence*/ int twoBitSeqSizeNoNs(struct twoBitFile *tbf, char *seqName); /* return the length of the sequence, not counting N's */ long long twoBitTotalSizeNoN(struct twoBitFile *tbf); /* return the size of the all the sequence in file, not counting N's*/ boolean twoBitIsSequence(struct twoBitFile *tbf, char *chromName); /* Return TRUE if chromName is in 2bit file. */ #endif /* TWOBIT_H */ rtracklayer/src/ucsc/udc.c0000644000175100017510000014301512612032142016555 0ustar00biocbuildbiocbuild/*** rtracklayer has #ifndef WIN32'd the http/ftp stuff here, as well as the entire net.c and internet.c files. ***/ /* udc - url data cache - a caching system that keeps blocks of data fetched from URLs in * sparse local files for quick use the next time the data is needed. * * This cache is enormously simplified by there being no local _write_ to the cache, * just reads. * * The overall strategy of the implementation is to have a root cache directory * with a subdir for each file being cached. The directory for a single cached file * contains two files - "bitmap" and "sparseData" that contains information on which * parts of the URL are cached and the actual cached data respectively. The subdirectory name * associated with the file is constructed from the URL in a straightforward manner. * http://genome.ucsc.edu/cgi-bin/hgGateway * gets mapped to: * rootCacheDir/http/genome.ucsc.edu/cgi-bin/hgGateway/ * The URL protocol is the first directory under the root, and the remainder of the * URL, with some necessary escaping, is used to define the rest of the cache directory * structure, with each '/' after the protocol line translating into another directory * level. * * The bitmap file contains time stamp and size data as well as an array with one bit * for each block of the file that has been fetched. Currently the block size is 8K. */ #define _XOPEN_SOURCE #ifdef __sun # define _XPG6 #endif #include #include "common.h" #include "hash.h" #include "obscure.h" #include "bits.h" #include "linefile.h" #include "portable.h" #include "sig.h" #include "net.h" #include "cheapcgi.h" #include "udc.h" #define udcBlockSize (8*1024) /* All fetch requests are rounded up to block size. */ #define udcMaxBytesPerRemoteFetch (udcBlockSize * 32) /* Very large remote reads are broken down into chunks this size. */ struct connInfo /* Socket descriptor and associated info, for keeping net connections open. */ { int socket; /* Socket descriptor for data connection (or 0). */ bits64 offset; /* Current file offset of socket. */ int ctrlSocket; /* (FTP only) Control socket descriptor or 0. */ }; typedef int (*UdcDataCallback)(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci); /* Type for callback function that fetches file data. */ struct udcRemoteFileInfo /* Information about a remote file. */ { bits64 updateTime; /* Last update in seconds since 1970 */ bits64 size; /* Remote file size */ struct connInfo ci; /* Connection info for open net connection */ }; typedef boolean (*UdcInfoCallback)(char *url, struct udcRemoteFileInfo *retInfo); /* Type for callback function that fetches file timestamp and size. */ struct udcProtocol /* Something to handle a communications protocol like http, https, ftp, local file i/o, etc. */ { struct udcProtocol *next; /* Next in list */ UdcDataCallback fetchData; /* Data fetcher */ UdcInfoCallback fetchInfo; /* Timestamp & size fetcher */ }; struct udcFile /* A file handle for our caching system. */ { struct udcFile *next; /* Next in list. */ char *url; /* Name of file - includes protocol */ char *protocol; /* The URL up to the first colon. http: etc. */ struct udcProtocol *prot; /* Protocol specific data and methods. */ time_t updateTime; /* Last modified timestamp. */ bits64 size; /* Size of file. */ bits64 offset; /* Current offset in file. */ char *cacheDir; /* Directory for cached file parts. */ char *bitmapFileName; /* Name of bitmap file. */ char *sparseFileName; /* Name of sparse data file. */ int fdSparse; /* File descriptor for sparse data file. */ boolean sparseReadAhead; /* Read-ahead has something in the buffer */ char *sparseReadAheadBuf; /* Read-ahead buffer, if any */ bits64 sparseRAOffset; /* Read-ahead buffer offset */ struct udcBitmap *bits; /* udcBitMap */ bits64 startData; /* Start of area in file we know to have data. */ bits64 endData; /* End of area in file we know to have data. */ bits32 bitmapVersion; /* Version of associated bitmap we were opened with. */ struct connInfo connInfo; /* Connection info for open net connection. */ }; struct udcBitmap /* The control structure including the bitmap of blocks that are cached. */ { struct udcBitmap *next; /* Next in list. */ bits32 blockSize; /* Number of bytes per block of file. */ bits64 remoteUpdate; /* Remote last update time. */ bits64 fileSize; /* File size */ bits32 version; /* Version - increments each time cache is stale. */ bits64 localUpdate; /* Time we last fetched new data into cache. */ bits64 localAccess; /* Time we last accessed data. */ boolean isSwapped; /* If true need to swap all bytes on read. */ int fd; /* File descriptor for file with current block. */ }; static char *bitmapName = "bitmap"; static char *sparseDataName = "sparseData"; #define udcBitmapHeaderSize (64) static int cacheTimeout = 0; #define MAX_SKIP_TO_SAVE_RECONNECT (udcMaxBytesPerRemoteFetch / 2) static void readAndIgnore(int sd, bits64 size) /* Read size bytes from sd and return. */ { static char *buf = NULL; if (buf == NULL) buf = needMem(udcBlockSize); bits64 remaining = size, total = 0; while (remaining > 0) { bits64 chunkSize = min(remaining, udcBlockSize); ssize_t rd = read(sd, buf, chunkSize); if (rd < 0) errnoAbort("readAndIgnore: error reading socket after %lld bytes", total); remaining -= rd; total += rd; } if (total < size) errAbort("readAndIgnore: got EOF at %lld bytes (wanted %lld)", total, size); } #ifndef WIN32 static int connInfoGetSocket(struct connInfo *ci, char *url, bits64 offset, int size) /* If ci has an open socket and the given offset matches ci's current offset, * reuse ci->socket. Otherwise close the socket, open a new one, and update ci, * or return -1 if there is an error opening a new one. */ { if (ci != NULL && ci->socket > 0 && ci->offset != offset) { bits64 skipSize = (offset - ci->offset); if (skipSize > 0 && skipSize <= MAX_SKIP_TO_SAVE_RECONNECT) { verbose(2, "!! skipping %lld bytes @%lld to avoid reconnect\n", skipSize, ci->offset); readAndIgnore(ci->socket, skipSize); ci->offset = offset; } else { verbose(2, "Offset mismatch (ci %lld != new %lld), reopening.\n", ci->offset, offset); mustCloseFd(&(ci->socket)); if (ci->ctrlSocket > 0) mustCloseFd(&(ci->ctrlSocket)); ZeroVar(ci); } } int sd; if (ci == NULL || ci->socket <= 0) { char rangeUrl[2048]; if (ci == NULL) { safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=%lld-%lld", url, offset, (offset + size - 1)); sd = netUrlOpen(rangeUrl); } else { safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=%lld-", url, offset); sd = ci->socket = netUrlOpenSockets(rangeUrl, &(ci->ctrlSocket)); ci->offset = offset; } if (sd < 0) return -1; if (startsWith("http", url)) { char *newUrl = NULL; int newSd = 0; if (!netSkipHttpHeaderLinesHandlingRedirect(sd, rangeUrl, &newSd, &newUrl)) return -1; if (newUrl) { freeMem(newUrl); sd = newSd; if (ci != NULL) ci->socket = newSd; } } } else sd = ci->socket; return sd; } #endif /********* Section for local file protocol **********/ static char *assertLocalUrl(char *url) /* Make sure that url is local and return bits past the protocol. */ { if (startsWith("local:", url)) url += 6; if (url[0] != '/') errAbort("Local urls must start at /"); if (stringIn("..", url) || stringIn("~", url) || stringIn("//", url) || stringIn("/./", url) || endsWith("/.", url)) { errAbort("relative paths not allowed in local urls (%s)", url); } return url; } static int udcDataViaLocal(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { /* Need to check time stamp here. */ verbose(2, "reading remote data - %d bytes at %lld - on %s\n", size, offset, url); url = assertLocalUrl(url); FILE *f = mustOpen(url, "rb"); fseek(f, offset, SEEK_SET); int sizeRead = fread(buffer, 1, size, f); if (ferror(f)) { warn("udcDataViaLocal failed to fetch %d bytes at %lld", size, offset); errnoAbort("file %s", url); } carefulClose(&f); return sizeRead; } static boolean udcInfoViaLocal(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retTime with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { verbose(2, "checking remote info on %s\n", url); url = assertLocalUrl(url); struct stat status; int ret = stat(url, &status); if (ret < 0) return FALSE; retInfo->updateTime = status.st_mtime; retInfo->size = status.st_size; return TRUE; } /********* Section for transparent file protocol **********/ static int udcDataViaTransparent(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { internalErr(); /* Should not get here. */ return size; } static boolean udcInfoViaTransparent(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retInfo with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { internalErr(); /* Should not get here. */ return FALSE; } /********* Section for slow local file protocol - simulates network... **********/ static int udcDataViaSlow(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { verbose(2, "slow reading remote data - %d bytes at %lld - on %s\n", size, offset, url); sleep1000(500); char *fileName = url + 5; /* skip over 'slow:' */ FILE *f = mustOpen(fileName, "rb"); fseek(f, offset, SEEK_SET); char *pt = buffer; int i, step=1024; int sizeRead = 0; for (i=0; i step) readChunk = step; int oneReadSize = fread(pt, 1, readChunk, f); verbose(2, "slowly read %d bytes\n", oneReadSize); if (ferror(f)) { warn("udcDataViaSlow failed to fetch %d bytes at %lld", size, offset); errnoAbort("file %s", fileName); } pt += step; sizeRead += oneReadSize; } carefulClose(&f); return sizeRead; } static boolean udcInfoViaSlow(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retTime with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { char *fileName = url + 5; /* skip over 'slow:' */ verbose(2, "slow checking remote info on %s\n", url); sleep1000(500); struct stat status; int ret = stat(fileName, &status); if (ret < 0) return FALSE; retInfo->updateTime = status.st_mtime; retInfo->size = status.st_size; return TRUE; } #ifndef WIN32 /********* Section for http protocol **********/ int udcDataViaHttpOrFtp(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using url's protocol, * which must be http, https or ftp. Returns number of bytes actually read. * Does an errAbort on error. * Typically will be called with size in the 8k-64k range. */ { if (startsWith("http://",url) || startsWith("https://",url) || startsWith("ftp://",url)) verbose(2, "reading http/https/ftp data - %d bytes at %lld - on %s\n", size, offset, url); else errAbort("Invalid protocol in url [%s] in udcDataViaFtp, only http, https, or ftp supported", url); int sd = connInfoGetSocket(ci, url, offset, size); if (sd < 0) errAbort("Can't get data socket for %s", url); int rd = 0, total = 0, remaining = size; char *buf = (char *)buffer; while ((remaining > 0) && ((rd = read(sd, buf, remaining)) > 0)) { total += rd; buf += rd; remaining -= rd; } if (rd == -1) errnoAbort("udcDataViaHttpOrFtp: error reading socket"); if (ci == NULL) mustCloseFd(&sd); else ci->offset += total; return total; } boolean udcInfoViaHttp(char *url, struct udcRemoteFileInfo *retInfo) /* Gets size and last modified time of URL * and returns status of HEAD GET. */ { verbose(2, "checking http remote info on %s\n", url); struct hash *hash = newHash(0); int status = netUrlHead(url, hash); if (status != 200) // && status != 302 && status != 301) return FALSE; char *sizeString = hashFindValUpperCase(hash, "Content-Length:"); if (sizeString == NULL) { /* try to get remote file size by an alternate method */ long long retSize = netUrlSizeByRangeResponse(url); if (retSize < 0) { hashFree(&hash); errAbort("No Content-Length: returned in header for %s, can't proceed, sorry", url); } retInfo->size = retSize; } else { retInfo->size = atoll(sizeString); } char *lastModString = hashFindValUpperCase(hash, "Last-Modified:"); if (lastModString == NULL) { // Date is a poor substitute! It will always appear that the cache is stale. // But at least we can read files from dropbox.com. lastModString = hashFindValUpperCase(hash, "Date:"); if (lastModString == NULL) { hashFree(&hash); errAbort("No Last-Modified: or Date: returned in header for %s, can't proceed, sorry", url); } } struct tm tm; time_t t; // Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT // This will always be GMT if (strptime(lastModString, "%a, %d %b %Y %H:%M:%S %Z", &tm) == NULL) { /* Handle error */; hashFree(&hash); errAbort("unable to parse last-modified string [%s]", lastModString); } t = mktimeFromUtc(&tm); if (t == -1) { /* Handle error */; hashFree(&hash); errAbort("mktimeFromUtc failed while converting last-modified string [%s] from UTC time", lastModString); } retInfo->updateTime = t; hashFree(&hash); return status; } /********* Section for ftp protocol **********/ // fetchData method: See udcDataViaHttpOrFtp above. boolean udcInfoViaFtp(char *url, struct udcRemoteFileInfo *retInfo) /* Gets size and last modified time of FTP URL */ { verbose(2, "checking ftp remote info on %s\n", url); long long size = 0; time_t t, tUtc; struct tm *tm = NULL; // TODO: would be nice to add int *retCtrlSocket to netGetFtpInfo so we can stash // in retInfo->connInfo and keep socket open. boolean ok = netGetFtpInfo(url, &size, &tUtc); if (!ok) return FALSE; // Convert UTC to localtime tm = localtime(&tUtc); t = mktimeFromUtc(tm); if (t == -1) { /* Handle error */; errAbort("mktimeFromUtc failed while converting FTP UTC last-modified time %ld to local time", (long) tUtc); } retInfo->size = size; retInfo->updateTime = t; return TRUE; } #endif /********* Non-protocol-specific bits **********/ boolean udcFastReadString(struct udcFile *f, char buf[256]) /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ { UBYTE bLen; int len; if (!udcReadOne(f, bLen)) return FALSE; if ((len = bLen)> 0) udcMustRead(f, buf, len); buf[len] = 0; return TRUE; } void msbFirstWriteBits64(FILE *f, bits64 x); static char *fileNameInCacheDir(struct udcFile *file, char *fileName) /* Return the name of a file in the cache dir, from the cache root directory on down. * Do a freeMem on this when done. */ { int dirLen = strlen(file->cacheDir); int nameLen = strlen(fileName); char *path = needMem(dirLen + nameLen + 2); memcpy(path, file->cacheDir, dirLen); path[dirLen] = '/'; memcpy(path+dirLen+1, fileName, nameLen); return path; } static void udcNewCreateBitmapAndSparse(struct udcFile *file, bits64 remoteUpdate, bits64 remoteSize, bits32 version) /* Create a new bitmap file around the given remoteUpdate time. */ { int fd = mustOpenFd(file->bitmapFileName, O_WRONLY | O_CREAT | O_TRUNC); bits32 sig = udcBitmapSig; bits32 blockSize = udcBlockSize; bits64 reserved64 = 0; bits32 reserved32 = 0; int blockCount = (remoteSize + udcBlockSize - 1)/udcBlockSize; int bitmapSize = bitToByteSize(blockCount); /* Write out fixed part of header. */ writeOneFd(fd, sig); writeOneFd(fd, blockSize); writeOneFd(fd, remoteUpdate); writeOneFd(fd, remoteSize); writeOneFd(fd, version); writeOneFd(fd, reserved32); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); long long offset = mustLseek(fd, 0, SEEK_CUR); if (offset != udcBitmapHeaderSize) errAbort("offset in fd=%d, f=%s is %lld, not expected udcBitmapHeaderSize %d", fd, file->bitmapFileName, offset, udcBitmapHeaderSize); /* Write out initial all-zero bitmap, using sparse-file method: write 0 to final address. */ unsigned char zero = 0; mustLseek(fd, bitmapSize-1, SEEK_CUR); mustWriteFd(fd, &zero, 1); /* Clean up bitmap file and name. */ mustCloseFd(&fd); /* Create an empty data file. */ fd = mustOpenFd(file->sparseFileName, O_WRONLY | O_CREAT | O_TRUNC); mustCloseFd(&fd); } static struct udcBitmap *udcBitmapOpen(char *fileName) /* Open up a bitmap file and read and verify header. Return NULL if file doesn't * exist, abort on error. */ { /* Open file, returning NULL if can't. */ int fd = open(fileName, O_RDWR); if (fd < 0) { if (errno == ENOENT) return NULL; else errnoAbort("Can't open(%s, O_RDWR)", fileName); } /* Get status info from file. */ struct stat status; fstat(fd, &status); if (status.st_size < udcBitmapHeaderSize) // check for truncated invalid bitmap files. { close(fd); return NULL; // returning NULL will cause the fresh creation of bitmap and sparseData files. } /* Read signature and decide if byte-swapping is needed. */ // TODO: maybe buffer the I/O for performance? Don't read past header - // fd offset needs to point to first data block when we return. bits32 magic; boolean isSwapped = FALSE; mustReadOneFd(fd, magic); if (magic != udcBitmapSig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != udcBitmapSig) errAbort("%s is not a udcBitmap file", fileName); } /* Allocate bitmap object, fill it in, and return it. */ bits32 reserved32; bits64 reserved64; struct udcBitmap *bits; AllocVar(bits); bits->blockSize = fdReadBits32(fd, isSwapped); bits->remoteUpdate = fdReadBits64(fd, isSwapped); bits->fileSize = fdReadBits64(fd, isSwapped); bits->version = fdReadBits32(fd, isSwapped); reserved32 = fdReadBits32(fd, isSwapped); reserved64 = fdReadBits64(fd, isSwapped); reserved64 = fdReadBits64(fd, isSwapped); reserved64 = fdReadBits64(fd, isSwapped); reserved64 = fdReadBits64(fd, isSwapped); bits->localUpdate = status.st_mtime; bits->localAccess = status.st_atime; bits->isSwapped = isSwapped; bits->fd = fd; return bits; } static void udcBitmapClose(struct udcBitmap **pBits) /* Free up resources associated with udcBitmap. */ { struct udcBitmap *bits = *pBits; if (bits != NULL) { mustCloseFd(&(bits->fd)); freez(pBits); } } static struct udcProtocol *udcProtocolNew(char *upToColon) /* Build up a new protocol around a string such as "http" or "local" */ { struct udcProtocol *prot; AllocVar(prot); if (sameString(upToColon, "local")) { prot->fetchData = udcDataViaLocal; prot->fetchInfo = udcInfoViaLocal; } else if (sameString(upToColon, "slow")) { prot->fetchData = udcDataViaSlow; prot->fetchInfo = udcInfoViaSlow; } #ifndef WIN32 else if (sameString(upToColon, "http") || sameString(upToColon, "https")) { prot->fetchData = udcDataViaHttpOrFtp; prot->fetchInfo = udcInfoViaHttp; } else if (sameString(upToColon, "ftp")) { prot->fetchData = udcDataViaHttpOrFtp; prot->fetchInfo = udcInfoViaFtp; } #endif else if (sameString(upToColon, "transparent")) { prot->fetchData = udcDataViaTransparent; prot->fetchInfo = udcInfoViaTransparent; } else { errAbort("Unrecognized protocol %s in udcProtNew", upToColon); } return prot; } static void udcProtocolFree(struct udcProtocol **pProt) /* Free up protocol resources. */ { freez(pProt); } static void setInitialCachedDataBounds(struct udcFile *file, boolean useCacheInfo) /* Open up bitmap file and read a little bit of it to see if cache is stale, * and if not to see if the initial part is cached. Sets the data members * startData, and endData. If the case is stale it makes fresh empty * cacheDir/sparseData and cacheDir/bitmap files. */ { bits32 version = 0; /* Get existing bitmap, and if it's stale clean up. */ struct udcBitmap *bits = udcBitmapOpen(file->bitmapFileName); if (bits != NULL) { if (useCacheInfo) { file->size = bits->fileSize; file->updateTime = bits->remoteUpdate; } version = bits->version; if (bits->remoteUpdate != file->updateTime || bits->fileSize != file->size || !fileExists(file->sparseFileName)) { verbose(2, "removing stale version (%lld! = %lld or %lld! = %lld or %s doesn't exist), " "new version %d\n", bits->remoteUpdate, (long long)file->updateTime, bits->fileSize, file->size, file->sparseFileName, version); udcBitmapClose(&bits); remove(file->bitmapFileName); remove(file->sparseFileName); ++version; } } else verbose(2, "bitmap file %s does not already exist, creating.\n", file->bitmapFileName); /* If no bitmap, then create one, and also an empty sparse data file. */ if (bits == NULL) { udcNewCreateBitmapAndSparse(file, file->updateTime, file->size, version); bits = udcBitmapOpen(file->bitmapFileName); if (bits == NULL) errAbort("Unable to open bitmap file %s", file->bitmapFileName); } file->bitmapVersion = bits->version; /* Read in a little bit from bitmap while we have it open to see if we have anything cached. */ if (file->size > 0) { Bits b; off_t wasAt = lseek(bits->fd, 0, SEEK_CUR); mustReadOneFd(bits->fd, b); int endBlock = (file->size + udcBlockSize - 1)/udcBlockSize; if (endBlock > 8) endBlock = 8; int initialCachedBlocks = bitFindClear(&b, 0, endBlock); file->endData = initialCachedBlocks * udcBlockSize; mustLseek(bits->fd, wasAt, SEEK_SET); } file->bits = bits; } static boolean qEscaped(char c) /* Returns TRUE if character needs to be escaped in q-encoding. */ { if (isalnum(c)) return c == 'Q'; else return c != '_' && c != '-' && c != '/' && c != '.'; } static char *qEncode(char *input) /* Do a simple encoding to convert input string into "normal" characters. * Abnormal letters, and '!' get converted into Q followed by two hexadecimal digits. */ { /* First go through and figure out encoded size. */ int size = 0; char *s, *d, c; s = input; while ((c = *s++) != 0) { if (qEscaped(c)) size += 3; else size += 1; } /* Allocate and fill in output. */ char *output = needMem(size+1); s = input; d = output; while ((c = *s++) != 0) { if (qEscaped(c)) { sprintf(d, "Q%02X", (unsigned)c); d += 3; } else *d++ = c; } return output; } void udcParseUrlFull(char *url, char **retProtocol, char **retAfterProtocol, char **retColon, char **retAuth) /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ { char *protocol, *afterProtocol; char *colon = strchr(url, ':'); if (!colon) { *retColon = NULL; return; } int colonPos = colon - url; protocol = cloneStringZ(url, colonPos); afterProtocol = url + colonPos + 1; while (afterProtocol[0] == '/') afterProtocol += 1; char *userPwd = strchr(afterProtocol, '@'); if (userPwd) { if (retAuth) { char auth[1024]; safencpy(auth, sizeof(auth), afterProtocol, userPwd+1-afterProtocol); *retAuth = qEncode(auth); } char *afterHost = strchr(afterProtocol, '/'); if (!afterHost) { afterHost = afterProtocol+strlen(afterProtocol); } if (userPwd < afterHost) afterProtocol = userPwd + 1; } else if (retAuth) *retAuth = NULL; afterProtocol = qEncode(afterProtocol); *retProtocol = protocol; *retAfterProtocol = afterProtocol; *retColon = colon; } void udcParseUrl(char *url, char **retProtocol, char **retAfterProtocol, char **retColon) /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free *retProtocol and *retAfterProtocol but not *retColon when done. */ { udcParseUrlFull(url, retProtocol, retAfterProtocol, retColon, NULL); } void udcPathAndFileNames(struct udcFile *file, char *cacheDir, char *protocol, char *afterProtocol) /* Initialize udcFile path and names */ { int len = strlen(cacheDir) + 1 + strlen(protocol) + 1 + strlen(afterProtocol) + 1; file->cacheDir = needMem(len); safef(file->cacheDir, len, "%s/%s/%s", cacheDir, protocol, afterProtocol); /* Create file names for bitmap and data portions. */ file->bitmapFileName = fileNameInCacheDir(file, bitmapName); file->sparseFileName = fileNameInCacheDir(file, sparseDataName); } static long long int udcSizeAndModTimeFromBitmap(char *bitmapFileName, time_t *retTime) /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. If retTime is non-null, store the remote update time in it. */ { long long int ret = -1; struct udcBitmap *bits = udcBitmapOpen(bitmapFileName); if (bits != NULL) { ret = bits->fileSize; if (retTime) *retTime = bits->remoteUpdate; } udcBitmapClose(&bits); return ret; } struct udcFile *udcFileMayOpen(char *url, char *cacheDir) /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Return NULL if file doesn't exist. */ { if (cacheDir == NULL) cacheDir = udcDefaultDir(); verbose(2, "udcfileOpen(%s, %s)\n", url, cacheDir); /* Parse out protocol. Make it "transparent" if none specified. */ char *protocol = NULL, *afterProtocol = NULL, *colon; boolean isTransparent = FALSE; udcParseUrl(url, &protocol, &afterProtocol, &colon); #ifndef WIN32 /* force WIN32 to use transparent (local file) loading */ if (!colon) #endif { freeMem(protocol); protocol = cloneString("transparent"); freeMem(afterProtocol); afterProtocol = cloneString(url); isTransparent = TRUE; } struct udcProtocol *prot; prot = udcProtocolNew(protocol); /* Figure out if anything exists. */ boolean useCacheInfo = FALSE; struct udcRemoteFileInfo info; ZeroVar(&info); if (!isTransparent) { useCacheInfo = (udcCacheAge(url, cacheDir) < udcCacheTimeout()); if (!useCacheInfo) { if (!prot->fetchInfo(url, &info)) { udcProtocolFree(&prot); freeMem(protocol); freeMem(afterProtocol); return NULL; } } } /* Allocate file object and start filling it in. */ struct udcFile *file; AllocVar(file); file->url = cloneString(url); file->protocol = protocol; file->prot = prot; if (isTransparent) { /* If transparent dummy up things so that the "sparse" file pointer is actually * the file itself, which appears to be completely loaded in cache. */ int flags = O_RDONLY; #ifdef WIN32 flags |= O_BINARY; #endif int fd = file->fdSparse = mustOpenFd(url, flags); struct stat status; fstat(fd, &status); file->startData = 0; file->endData = file->size = status.st_size; } else { udcPathAndFileNames(file, cacheDir, protocol, afterProtocol); if (!useCacheInfo) { file->updateTime = info.updateTime; file->size = info.size; memcpy(&(file->connInfo), &(info.ci), sizeof(struct connInfo)); // update cache file mod times, so if we're caching we won't do this again // until the timeout has expired again: #ifndef WIN32 if (udcCacheTimeout() > 0 && fileExists(file->bitmapFileName)) (void)maybeTouchFile(file->bitmapFileName); #endif } /* Make directory. */ makeDirsOnPath(file->cacheDir); /* Figure out a little bit about the extent of the good cached data if any. Open bits bitmap. */ setInitialCachedDataBounds(file, useCacheInfo); file->fdSparse = mustOpenFd(file->sparseFileName, O_RDWR); } freeMem(afterProtocol); return file; } struct udcFile *udcFileOpen(char *url, char *cacheDir) /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Abort if if file doesn't exist. */ { struct udcFile *udcFile = udcFileMayOpen(url, cacheDir); if (udcFile == NULL) errAbort("Couldn't open %s", url); return udcFile; } struct slName *udcFileCacheFiles(char *url, char *cacheDir) /* Return low-level list of files used in cache. */ { char *protocol, *afterProtocol, *colon; struct udcFile *file; udcParseUrl(url, &protocol, &afterProtocol, &colon); if (colon == NULL) return NULL; AllocVar(file); udcPathAndFileNames(file, cacheDir, protocol, afterProtocol); struct slName *list = NULL; slAddHead(&list, slNameNew(file->bitmapFileName)); slAddHead(&list, slNameNew(file->sparseFileName)); slReverse(&list); freeMem(file->cacheDir); freeMem(file->bitmapFileName); freeMem(file->sparseFileName); freeMem(file); freeMem(protocol); freeMem(afterProtocol); return list; } void udcFileClose(struct udcFile **pFile) /* Close down cached file. */ { struct udcFile *file = *pFile; if (file != NULL) { if (file->connInfo.socket != 0) mustCloseFd(&(file->connInfo.socket)); if (file->connInfo.ctrlSocket != 0) mustCloseFd(&(file->connInfo.ctrlSocket)); freeMem(file->url); freeMem(file->protocol); udcProtocolFree(&file->prot); freeMem(file->cacheDir); freeMem(file->bitmapFileName); freeMem(file->sparseFileName); freeMem(file->sparseReadAheadBuf); mustCloseFd(&(file->fdSparse)); udcBitmapClose(&file->bits); } freez(pFile); } static void qDecode(const char *input, char *buf, size_t size) /* Reverse the qEncode performed on afterProcotol above into buf or abort. */ { safecpy(buf, size, input); char c, *r = buf, *w = buf; while ((c = *r++) != '\0') { if (c == 'Q') { int q; if (sscanf(r, "%02X", &q)) { *w++ = (char)q; r += 2; } else errAbort("qDecode: input \"%s\" does not appear to be properly formatted " "starting at \"%s\"", input, r); } else *w++ = c; } *w = '\0'; } char *udcPathToUrl(const char *path, char *buf, size_t size, char *cacheDir) /* Translate path into an URL, store in buf, return pointer to buf if successful * and NULL if not. */ { if (cacheDir == NULL) cacheDir = udcDefaultDir(); int offset = 0; if (startsWith(cacheDir, (char *)path)) offset = strlen(cacheDir); if (path[offset] == '/') offset++; char protocol[16]; strncpy(protocol, path+offset, sizeof(protocol)); protocol[ArraySize(protocol)-1] = '\0'; char *p = strchr(protocol, '/'); if (p == NULL) { errAbort("unable to parse protocol (first non-'%s' directory) out of path '%s'\n", cacheDir, path); return NULL; } *p++ = '\0'; char afterProtocol[4096]; qDecode(path+1+strlen(protocol)+1, afterProtocol, sizeof(afterProtocol)); safef(buf, size, "%s://%s", protocol, afterProtocol); return buf; } long long int udcSizeFromCache(char *url, char *cacheDir) /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. */ { long long int ret = -1; if (cacheDir == NULL) cacheDir = udcDefaultDir(); struct slName *sl, *slList = udcFileCacheFiles(url, cacheDir); for (sl = slList; sl != NULL; sl = sl->next) if (endsWith(sl->name, bitmapName)) { ret = udcSizeAndModTimeFromBitmap(sl->name, NULL); break; } slNameFreeList(&slList); return ret; } unsigned long udcCacheAge(char *url, char *cacheDir) /* Return the age in seconds of the oldest cache file. If a cache file is * missing, return the current time (seconds since the epoch). */ { unsigned long now = clock1(), oldestTime = now; if (cacheDir == NULL) cacheDir = udcDefaultDir(); struct slName *sl, *slList = udcFileCacheFiles(url, cacheDir); if (slList == NULL) return now; for (sl = slList; sl != NULL; sl = sl->next) if (endsWith(sl->name, bitmapName)) { if (fileExists(sl->name)) oldestTime = min(fileModTime(sl->name), oldestTime); else return now; } return (now - oldestTime); } static void readBitsIntoBuf(int fd, int headerSize, int bitStart, int bitEnd, Bits **retBits, int *retPartOffset) /* Do some bit-to-byte offset conversions and read in all the bytes that * have information in the bits we're interested in. */ { int byteStart = bitStart/8; int byteEnd = bitToByteSize(bitEnd); int byteSize = byteEnd - byteStart; Bits *bits = needLargeMem(byteSize); mustLseek(fd, headerSize + byteStart, SEEK_SET); mustReadFd(fd, bits, byteSize); *retBits = bits; *retPartOffset = byteStart*8; } static boolean allBitsSetInFile(int bitStart, int bitEnd, int partOffset, Bits *bits) /* Return TRUE if all bits in file between start and end are set. */ { int partBitStart = bitStart - partOffset; int partBitEnd = bitEnd - partOffset; int nextClearBit = bitFindClear(bits, partBitStart, partBitEnd); boolean allSet = (nextClearBit >= partBitEnd); return allSet; } // For tests/udcTest.c debugging: not declared in udc.h, but not static either: boolean udcCheckCacheBits(struct udcFile *file, int startBlock, int endBlock) /* Warn and return TRUE if any bit in (startBlock,endBlock] is not set. */ { boolean gotUnset = FALSE; struct udcBitmap *bitmap = udcBitmapOpen(file->bitmapFileName); int partOffset; Bits *bits; readBitsIntoBuf(bitmap->fd, udcBitmapHeaderSize, startBlock, endBlock, &bits, &partOffset); int partBitStart = startBlock - partOffset; int partBitEnd = endBlock - partOffset; int nextClearBit = bitFindClear(bits, partBitStart, partBitEnd); while (nextClearBit < partBitEnd) { int clearBlock = nextClearBit + partOffset; warn("... udcFile 0x%04lx: bit for block %d (%lld..%lld] is not set", (unsigned long)file, clearBlock, ((long long)clearBlock * udcBlockSize), (((long long)clearBlock+1) * udcBlockSize)); gotUnset = TRUE; int nextSetBit = bitFindSet(bits, nextClearBit, partBitEnd); nextClearBit = bitFindClear(bits, nextSetBit, partBitEnd); } return gotUnset; } static void fetchMissingBlocks(struct udcFile *file, struct udcBitmap *bits, int startBlock, int blockCount, int blockSize) /* Fetch missing blocks from remote and put them into file. errAbort if trouble. */ { bits64 startPos = (bits64)startBlock * blockSize; bits64 endPos = startPos + (bits64)blockCount * blockSize; if (endPos > file->size) endPos = file->size; if (endPos > startPos) { bits64 readSize = endPos - startPos; void *buf = needLargeMem(readSize); int actualSize = file->prot->fetchData(file->url, startPos, readSize, buf, &(file->connInfo)); if (actualSize != readSize) errAbort("unable to fetch %lld bytes from %s @%lld (got %d bytes)", readSize, file->url, startPos, actualSize); mustLseek(file->fdSparse, startPos, SEEK_SET); mustWriteFd(file->fdSparse, buf, readSize); freez(&buf); } } static boolean fetchMissingBits(struct udcFile *file, struct udcBitmap *bits, bits64 start, bits64 end, bits64 *retFetchedStart, bits64 *retFetchedEnd) /* Scan through relevant parts of bitmap, fetching blocks we don't already have. */ { /* Fetch relevant part of bitmap into memory */ int partOffset; Bits *b; int startBlock = start / bits->blockSize; int endBlock = (end + bits->blockSize - 1) / bits->blockSize; readBitsIntoBuf(bits->fd, udcBitmapHeaderSize, startBlock, endBlock, &b, &partOffset); if (allBitsSetInFile(startBlock, endBlock, partOffset, b)) { // it is already in the cache freeMem(b); return TRUE; } /* Loop around first skipping set bits, then fetching clear bits. */ boolean dirty = FALSE; int s = startBlock - partOffset; int e = endBlock - partOffset; for (;;) { int nextClearBit = bitFindClear(b, s, e); if (nextClearBit >= e) break; int nextSetBit = bitFindSet(b, nextClearBit, e); int clearSize = nextSetBit - nextClearBit; fetchMissingBlocks(file, bits, nextClearBit + partOffset, clearSize, bits->blockSize); bitSetRange(b, nextClearBit, clearSize); dirty = TRUE; if (nextSetBit >= e) break; s = nextSetBit; } if (dirty) { /* Update bitmap on disk.... */ int byteStart = startBlock/8; int byteEnd = bitToByteSize(endBlock); int byteSize = byteEnd - byteStart; mustLseek(bits->fd, byteStart + udcBitmapHeaderSize, SEEK_SET); mustWriteFd(bits->fd, b, byteSize); } freeMem(b); *retFetchedStart = startBlock * bits->blockSize; *retFetchedEnd = endBlock * bits->blockSize; return FALSE; } static boolean rangeIntersectOrTouch64(bits64 start1, bits64 end1, bits64 start2, bits64 end2) /* Return true if two 64-bit ranges intersect or touch. */ { // cannot use the version of this function that is in common.c since it only handles integers. bits64 s = max(start1,start2); bits64 e = min(end1,end2); return e >= s; } static void udcFetchMissing(struct udcFile *file, struct udcBitmap *bits, bits64 start, bits64 end) /* Fetch missing pieces of data from file */ { /* Call lower level routine fetch remote data that is not already here. */ bits64 fetchedStart, fetchedEnd; if (fetchMissingBits(file, bits, start, end, &fetchedStart, &fetchedEnd)) return; /* Update file startData/endData members to include new data (and old as well if * the new data overlaps the old). */ if (rangeIntersectOrTouch64(file->startData, file->endData, fetchedStart, fetchedEnd)) { if (fetchedStart > file->startData) fetchedStart = file->startData; if (fetchedEnd < file->endData) fetchedEnd = file->endData; } file->startData = fetchedStart; file->endData = fetchedEnd; } static boolean udcCachePreload(struct udcFile *file, bits64 offset, bits64 size) /* Make sure that given data is in cache - fetching it remotely if need be. * Return TRUE on success. */ { boolean ok = TRUE; /* We'll break this operation into blocks of a reasonable size to allow * other processes to get cache access, since we have to lock the cache files. */ bits64 s,e, endPos=offset+size; for (s = offset; s < endPos; s = e) { /* Figure out bounds of this section. */ e = s + udcMaxBytesPerRemoteFetch; if (e > endPos) e = endPos; struct udcBitmap *bits = file->bits; if (bits->version == file->bitmapVersion) { udcFetchMissing(file, bits, s, e); } else { ok = FALSE; verbose(2, "udcCachePreload version check failed %d vs %d", bits->version, file->bitmapVersion); } if (!ok) break; } return ok; } #define READAHEADBUFSIZE 4096 bits64 udcRead(struct udcFile *file, void *buf, bits64 size) /* Read a block from file. Return amount actually read. */ { /* Figure out region of file we're going to read, and clip it against file size. */ bits64 start = file->offset; if (start > file->size) return 0; bits64 end = start + size; if (end > file->size) end = file->size; size = end - start; char *cbuf = buf; /* use read-ahead buffer if present */ bits64 bytesRead = 0; bits64 raStart; bits64 raEnd; while(TRUE) { if (file->sparseReadAhead) { raStart = file->sparseRAOffset; raEnd = raStart+READAHEADBUFSIZE; if (start >= raStart && start < raEnd) { // copy bytes out of rabuf bits64 endInBuf = min(raEnd, end); bits64 sizeInBuf = endInBuf - start; memcpy(cbuf, file->sparseReadAheadBuf + (start-raStart), sizeInBuf); cbuf += sizeInBuf; bytesRead += sizeInBuf; start = raEnd; size -= sizeInBuf; file->offset += sizeInBuf; if (size == 0) break; } file->sparseReadAhead = FALSE; mustLseek(file->fdSparse, start, SEEK_SET); } bits64 saveEnd = end; if (size < READAHEADBUFSIZE) { file->sparseReadAhead = TRUE; if (!file->sparseReadAheadBuf) file->sparseReadAheadBuf = needMem(READAHEADBUFSIZE); file->sparseRAOffset = start; size = READAHEADBUFSIZE; end = start + size; if (end > file->size) { end = file->size; size = end - start; } } /* If we're outside of the window of file we already know is good, then have to * consult cache on disk, and maybe even fetch data remotely! */ if (start < file->startData || end > file->endData) { if (!udcCachePreload(file, start, size)) { verbose(2, "udcCachePreload failed"); bytesRead = 0; break; } /* Currently only need fseek here. Would be safer, but possibly * slower to move fseek so it is always executed in front of read, in * case other code is moving around file pointer. */ mustLseek(file->fdSparse, start, SEEK_SET); } if (file->sparseReadAhead) { mustReadFd(file->fdSparse, file->sparseReadAheadBuf, size); end = saveEnd; size = end - start; } else { mustReadFd(file->fdSparse, cbuf, size); file->offset += size; bytesRead += size; break; } } return bytesRead; } void udcMustRead(struct udcFile *file, void *buf, bits64 size) /* Read a block from file. Abort if any problem, including EOF before size is read. */ { bits64 sizeRead = udcRead(file, buf, size); if (sizeRead < size) errAbort("udc couldn't read %llu bytes from %s, did read %llu", size, file->url, sizeRead); } int udcGetChar(struct udcFile *file) /* Get next character from file or die trying. */ { UBYTE b; udcMustRead(file, &b, 1); return b; } bits64 udcReadBits64(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap64(val); return val; } bits32 udcReadBits32(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap32(val); return val; } bits16 udcReadBits16(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap16(val); return val; } float udcReadFloat(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap floating point number. */ { float val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwapFloat(val); return val; } double udcReadDouble(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point number. */ { double val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwapDouble(val); return val; } char *udcReadLine(struct udcFile *file) /* Fetch next line from udc cache or NULL. */ { char shortBuf[2], *longBuf = NULL, *buf = shortBuf; int i, bufSize = sizeof(shortBuf); for (i=0; ; ++i) { /* See if need to expand buffer, which is initially on stack, but if it gets big goes into * heap. */ if (i >= bufSize) { int newBufSize = bufSize*2; char *newBuf = needLargeMem(newBufSize); memcpy(newBuf, buf, bufSize); freeMem(longBuf); buf = longBuf = newBuf; bufSize = newBufSize; } char c; bits64 sizeRead = udcRead(file, &c, 1); if (sizeRead == 0) return NULL; buf[i] = c; if (c == '\n') { buf[i] = 0; break; } } char *retString = cloneString(buf); freeMem(longBuf); return retString; } char *udcReadStringAndZero(struct udcFile *file) /* Read in zero terminated string from file. Do a freeMem of result when done. */ { char shortBuf[2], *longBuf = NULL, *buf = shortBuf; int i, bufSize = sizeof(shortBuf); for (i=0; ; ++i) { /* See if need to expand buffer, which is initially on stack, but if it gets big goes into * heap. */ if (i >= bufSize) { int newBufSize = bufSize*2; char *newBuf = needLargeMem(newBufSize); memcpy(newBuf, buf, bufSize); freeMem(longBuf); buf = longBuf = newBuf; bufSize = newBufSize; } char c = udcGetChar(file); buf[i] = c; if (c == 0) break; } char *retString = cloneString(buf); freeMem(longBuf); return retString; } char *udcFileReadAll(char *url, char *cacheDir, size_t maxSize, size_t *retSize) /* Read a complete file via UDC. The cacheDir may be null in which case udcDefaultDir() * will be used. If maxSize is non-zero, check size against maxSize * and abort if it's bigger. Returns file data (with an extra terminal for the * common case where it's treated as a C string). If retSize is non-NULL then * returns size of file in *retSize. Do a freeMem or freez of the returned buffer * when done. */ { struct udcFile *file = udcFileOpen(url, cacheDir); size_t size = file->size; if (maxSize != 0 && size > maxSize) errAbort("%s is %lld bytes, but maxSize to udcFileReadAll is %lld", url, (long long)size, (long long)maxSize); char *buf = needLargeMem(size+1); udcMustRead(file, buf, size); buf[size] = 0; // add trailing zero for string processing udcFileClose(&file); if (retSize != NULL) *retSize = size; return buf; } struct lineFile *udcWrapShortLineFile(char *url, char *cacheDir, size_t maxSize) /* Read in entire short (up to maxSize) url into memory and wrap a line file around it. * The cacheDir may be null in which case udcDefaultDir() will be used. If maxSize * is zero then a default value (currently 64 meg) will be used. */ { if (maxSize == 0) maxSize = 64 * 1024 * 1024; char *buf = udcFileReadAll(url, cacheDir, maxSize, NULL); return lineFileOnString(url, TRUE, buf); } void udcSeekCur(struct udcFile *file, bits64 offset) /* Seek to a particular position in file. */ { file->offset += offset; mustLseek(file->fdSparse, offset, SEEK_CUR); } void udcSeek(struct udcFile *file, bits64 offset) /* Seek to a particular position in file. */ { file->offset = offset; mustLseek(file->fdSparse, offset, SEEK_SET); } bits64 udcTell(struct udcFile *file) /* Return current file position. */ { return file->offset; } static long bitRealDataSize(char *fileName) /* Return number of real bytes indicated by bitmaps */ { struct udcBitmap *bits = udcBitmapOpen(fileName); int blockSize = bits->blockSize; long byteSize = 0; int blockCount = (bits->fileSize + blockSize - 1)/blockSize; if (blockCount > 0) { int bitmapSize = bitToByteSize(blockCount); Bits *b = needLargeMem(bitmapSize); mustReadFd(bits->fd, b, bitmapSize); int bitsSet = bitCountRange(b, 0, blockCount); byteSize = (long)bitsSet*blockSize; freez(&b); } udcBitmapClose(&bits); return byteSize; } static bits64 rCleanup(time_t deleteTime, boolean testOnly) /* Delete any bitmap or sparseData files last accessed before deleteTime */ { struct fileInfo *file, *fileList = listDirX(".", "*", FALSE); bits64 results = 0; for (file = fileList; file != NULL; file = file->next) { if (file->isDir) { setCurrentDir(file->name); bits64 oneResult = rCleanup(deleteTime, testOnly); setCurrentDir(".."); if (oneResult > 0) { if (!testOnly) remove(file->name); results += oneResult; results += file->size; } } else if (sameString(file->name, bitmapName)) { if (file->size > udcBitmapHeaderSize) /* prevent failure on bitmap files of size 0 or less than header size */ verbose(2, "%ld (%ld) %s/%s\n", bitRealDataSize(file->name), (long)file->size, getCurrentDir(), file->name); if (file->lastAccess < deleteTime) { /* Remove all files when get bitmap, so that can ensure they are deleted in * right order. */ results += file->size; if (!testOnly) { remove(bitmapName); remove(sparseDataName); } } } else if (sameString(file->name, sparseDataName)) { if (results > 0) results += file->size; } } return results; } bits64 udcCleanup(char *cacheDir, double maxDays, boolean testOnly) /* Remove cached files older than maxDays old. If testOnly is set * no clean up is done, but the size of the files that would be * cleaned up is still. */ { time_t maxSeconds = maxDays * 24 * 60 * 60; char *curPath = cloneString(getCurrentDir()); setCurrentDir(cacheDir); time_t deleteTime = time(NULL) - maxSeconds; bits64 result = rCleanup(deleteTime, testOnly); setCurrentDir(curPath); return result; } static char *defaultDir = "/tmp/udcCache"; char *udcDefaultDir() /* Get default directory for cache */ { return defaultDir; } void udcSetDefaultDir(char *path) /* Set default directory for cache */ { defaultDir = cloneString(path); } int udcCacheTimeout() /* Get cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ { return cacheTimeout; } void udcSetCacheTimeout(int timeout) /* Set cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ { cacheTimeout = timeout; } time_t udcUpdateTime(struct udcFile *udc) /* return udc->updateTime */ { if (sameString("transparent", udc->protocol)) { struct stat status; int ret = stat(udc->url, &status); if (ret < 0) return 0; else return status.st_mtime; } return udc->updateTime; } off_t udcFileSize(char *url) /* fetch file size from given URL or local path * returns -1 if not found. */ { if (udcIsLocal(url)) return fileSize(url); off_t ret = -1; #ifdef WIN32 errAbort("udc/udcFileSize: invalid protocol for url %s, only file:// URLs are supported on Windows", url); #else // don't go to the network if we can avoid it int cacheSize = udcSizeFromCache(url, NULL); if (cacheSize!=-1) return cacheSize; struct udcRemoteFileInfo info; if (startsWith("http://",url) || startsWith("https://",url)) { if (udcInfoViaHttp(url, &info)) ret = info.size; } else if (startsWith("ftp://",url)) { if (udcInfoViaFtp(url, &info)) ret = info.size; } else errAbort("udc/udcFileSize: invalid protocol for url %s, can only do http/https/ftp", url); #endif return ret; } boolean udcIsLocal(char *url) /* return true if file is not a http or ftp file, just a local file */ { // copied from above char *protocol = NULL, *afterProtocol = NULL, *colon; udcParseUrl(url, &protocol, &afterProtocol, &colon); freez(&protocol); freez(&afterProtocol); return colon==NULL; } boolean udcExists(char *url) /* return true if a local or remote file exists */ { return udcFileSize(url)!=-1; } rtracklayer/src/ucsc/udc.h0000644000175100017510000001615312612032142016564 0ustar00biocbuildbiocbuild/* udc - url data cache - a caching system that keeps blocks of data fetched from URLs in * sparse local files for quick use the next time the data is needed. * * This cache is enormously simplified by there being no local _write_ to the cache, * just reads. * * The overall strategy of the implementation is to have a root cache directory * with a subdir for each file being cached. The directory for a single cached file * contains two files - "bitmap" and "sparseData" that contains information on which * parts of the URL are cached and the actual cached data respectively. The subdirectory name * associated with the file is constructed from the URL in a straightforward manner. * http://genome.ucsc.edu/cgi-bin/hgGateway * gets mapped to: * rootCacheDir/http/genome.ucsc.edu/cgi-bin/hgGateway/ * The URL protocol is the first directory under the root, and the remainder of the * URL, with some necessary escaping, is used to define the rest of the cache directory * structure, with each '/' after the protocol line translating into another directory * level. * * The bitmap file contains time stamp and size data as well as an array with one bit * for each block of the file that has been fetched. Currently the block size is 8K. */ #ifndef UDC_H #define UDC_H struct udcFile; /* Handle to a cached file. Inside of structure mysterious unless you are udc.c. */ struct udcFile *udcFileMayOpen(char *url, char *cacheDir); /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Return NULL if file doesn't exist. */ struct udcFile *udcFileOpen(char *url, char *cacheDir); /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Abort if if file doesn't exist. */ void udcFileClose(struct udcFile **pFile); /* Close down cached file. */ bits64 udcRead(struct udcFile *file, void *buf, bits64 size); /* Read a block from file. Return amount actually read. */ #define udcReadOne(file, var) udcRead(file, &(var), sizeof(var)) /* Read one variable from file or die. */ void udcMustRead(struct udcFile *file, void *buf, bits64 size); /* Read a block from file. Abort if any problem, including EOF before size is read. */ #define udcMustReadOne(file, var) udcMustRead(file, &(var), sizeof(var)) /* Read one variable from file or die. */ bits64 udcReadBits64(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits32 udcReadBits32(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits16 udcReadBits16(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ float udcReadFloat(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap floating point number. */ double udcReadDouble(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point number. */ int udcGetChar(struct udcFile *file); /* Get next character from file or die trying. */ char *udcReadLine(struct udcFile *file); /* Fetch next line from udc cache. */ char *udcReadStringAndZero(struct udcFile *file); /* Read in zero terminated string from file. Do a freeMem of result when done. */ char *udcFileReadAll(char *url, char *cacheDir, size_t maxSize, size_t *retSize); /* Read a complete file via UDC. The cacheDir may be null in which case udcDefaultDir() * will be used. If maxSize is non-zero, check size against maxSize * and abort if it's bigger. Returns file data (with an extra terminal for the * common case where it's treated as a C string). If retSize is non-NULL then * returns size of file in *retSize. Do a freeMem or freez of the returned buffer * when done. */ struct lineFile *udcWrapShortLineFile(char *url, char *cacheDir, size_t maxSize); /* Read in entire short (up to maxSize) url into memory and wrap a line file around it. * The cacheDir may be null in which case udcDefaultDir() will be used. If maxSize * is zero then a default value (currently 64 meg) will be used. */ void udcSeek(struct udcFile *file, bits64 offset); /* Seek to a particular (absolute) position in file. */ void udcSeekCur(struct udcFile *file, bits64 offset); /* Seek to a particular (from current) position in file. */ bits64 udcTell(struct udcFile *file); /* Return current file position. */ bits64 udcCleanup(char *cacheDir, double maxDays, boolean testOnly); /* Remove cached files older than maxDays old. If testOnly is set * no clean up is done, but the size of the files that would be * cleaned up is still. */ void udcParseUrl(char *url, char **retProtocol, char **retAfterProtocol, char **retColon); /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ void udcParseUrlFull(char *url, char **retProtocol, char **retAfterProtocol, char **retColon, char **retAuth); /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ char *udcDefaultDir(); /* Get default directory for cache. Use this for the udcFileOpen call if you * don't have anything better.... */ void udcSetDefaultDir(char *path); /* Set default directory for cache */ #define udcDevicePrefix "udc:" /* Prefix used by convention to indicate a file should be accessed via udc. This is * followed by the local path name or a url, so in common practice you see things like: * udc:http://genome.ucsc.edu/goldenPath/hg18/tracks/someTrack.bb */ struct slName *udcFileCacheFiles(char *url, char *cacheDir); /* Return low-level list of files used in cache. */ char *udcPathToUrl(const char *path, char *buf, size_t size, char *cacheDir); /* Translate path into an URL, store in buf, return pointer to buf if successful * and NULL if not. */ long long int udcSizeFromCache(char *url, char *cacheDir); /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. */ unsigned long udcCacheAge(char *url, char *cacheDir); /* Return the age in seconds of the oldest cache file. If a cache file is * missing, return the current time (seconds since the epoch). */ int udcCacheTimeout(); /* Get cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ void udcSetCacheTimeout(int timeout); /* Set cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ time_t udcUpdateTime(struct udcFile *udc); /* return udc->updateTime */ boolean udcFastReadString(struct udcFile *f, char buf[256]); /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ off_t udcFileSize(char *url); /* fetch remote or loca file size from given URL or path */ boolean udcExists(char *url); /* return true if a remote or local file exists */ boolean udcIsLocal(char *url); /* return true if url is not a http or ftp file, just a normal local file path */ #endif /* UDC_H */ rtracklayer/src/ucsc/verbose.c0000644000175100017510000000660112612032142017446 0ustar00biocbuildbiocbuild/* verbose.c - write out status messages according to the * current verbosity level. These messages go to stderr. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "portable.h" #include "verbose.h" static int logVerbosity = 1; /* The level of log verbosity. 0 is silent. */ static FILE *logFile; /* File to log to. */ static boolean checkedDotsEnabled = FALSE; /* have we check for dot output * being enabled? */ static boolean dotsEnabled = FALSE; /* is dot output enabled? */ void verboseVa(int verbosity, char *format, va_list args) /* Log with at given verbosity vprintf formatted args. */ { if (verbosity <= logVerbosity) { if (logFile == NULL) logFile = stderr; vfprintf(logFile, format, args); fflush(logFile); } } void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stderr) if global verbose variable * is set to verbosity or higher. */ { va_list args; va_start(args, format); verboseVa(verbosity, format, args); va_end(args); } static long lastTime = -1; // previous call time. void verboseTimeInit(void) /* Initialize or reinitialize the previous time for use by verboseTime. */ { lastTime = clock1000(); } void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ { assert(label != NULL); // original version allowed this, but breaks some GCCs if (lastTime < 0) verboseTimeInit(); long time = clock1000(); va_list args; va_start(args, label); verboseVa(verbosity, label, args); verbose(verbosity, ": %ld millis\n", time - lastTime); lastTime = time; va_end(args); } boolean verboseDotsEnabled() /* check if outputting of happy dots are enabled. They will be enabled if the * verbosity is > 0, stderr is a tty and we don't appear to be running an * emacs shell. */ { if (!checkedDotsEnabled) { if (logFile == NULL) logFile = stderr; dotsEnabled = (logVerbosity > 0) && isatty(fileno(logFile)); if (dotsEnabled) { /* check for an possible emacs shell */ char *emacs = getenv("emacs"); char *term = getenv("TERM"); if ((emacs != NULL) && (emacs[0] == 't')) dotsEnabled = FALSE; else if ((term != NULL) && sameString(term, "dumb")) dotsEnabled = FALSE; } checkedDotsEnabled = TRUE; } return dotsEnabled; } void verboseDot() /* Write I'm alive dot (at verbosity level 1) */ { if (verboseDotsEnabled()) verbose(1, "."); } void verboseSetLevel(int verbosity) /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ { logVerbosity = verbosity; checkedDotsEnabled = FALSE; /* force rechecking of dots enabled */ } int verboseLevel(void) /* Get verbosity level. */ { return logVerbosity; } void verboseSetLogFile(char *name) /* Set logFile for verbose messages overrides stderr. */ { if (sameString(name, "stdout")) logFile = stdout; else if (sameString(name, "stderr")) logFile = stderr; else logFile = mustOpen(name, "w"); } FILE *verboseLogFile() /* Get the verbose log file. */ { if (logFile == NULL) logFile = stderr; return logFile; } rtracklayer/src/ucsc/verbose.h0000644000175100017510000000302012612032142017443 0ustar00biocbuildbiocbuild/* verbose.h - write out status messages according to the * current verbosity level. These messages go to stderr. */ #ifndef VERBOSE_H #define VERBOSE_H void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stderr) if global verbose variable * is set to verbosity or higher. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseVa(int verbosity, char *format, va_list args); /* Log with at given verbosity vprintf formatted args. */ void verboseTimeInit(void); /* Initialize or reinitialize the previous time for use by verboseTime. */ void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseDot(); /* Write I'm alive dot (at verbosity level 1) */ boolean verboseDotsEnabled(); /* check if outputting of happy dots are enabled. They will be enabled if the * verbosity is > 0, stderr is a tty and we don't appear to be running an * emacs shell. */ int verboseLevel(void); /* Get verbosity level. */ void verboseSetLevel(int verbosity); /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ void verboseSetLogFile(char *name); /* Set logFile for verbose messages overrides stderr. */ FILE *verboseLogFile(); /* Get the verbose log file. */ #endif /* VERBOSE_H */ rtracklayer/src/ucsc/wildcmp.c0000644000175100017510000000445612612032142017446 0ustar00biocbuildbiocbuild/* Wildcard matching. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" static int subMatch(const char *str, const char *wild, char single, char multi) /* Returns number of characters that match between str and wild up * to the next wildcard in wild (or up to end of string.). */ { int len = 0; for(;;) { if(toupper(*str++) != toupper(*wild++) ) return(0); ++len; char c = *wild; if (c == 0 || c == single || c == multi) return len; } } boolean anyWild(const char *string) /* Return TRUE if any wild card characters in string. */ { char c; while ((c = *string++) != 0) { if (c == '?' || c == '*') return TRUE; } return FALSE; } static boolean globMatch(const char *wildCard, const char *string, char single, char multi) /* does a case sensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ { boolean matchStar = 0; int starMatchSize; char c; for(;;) { NEXT_WILD: c = *wildCard; if (c == 0) { if(matchStar) { while(*string++) ; return TRUE; } else if(*string) return FALSE; else return TRUE; } else if (c == multi) { matchStar = TRUE; } else if (c == single) { if(*string == 0) return FALSE; /* out of string, no match for ? */ ++string; } else { if(matchStar) { for(;;) { if(*string == 0) /* if out of string no match */ return FALSE; /* note matchStar is re-used here for substring * after star match length */ if((starMatchSize = subMatch(string,wildCard,single,multi)) != 0) { string += starMatchSize; wildCard += starMatchSize; matchStar = FALSE; goto NEXT_WILD; } ++string; } } /* default: they must be equal or no match */ if(toupper(*string) != toupper(*wildCard)) return FALSE; ++string; } ++wildCard; } } boolean wildMatch(const char *wildCard, const char *string) /* Match using * and ? wildcards. */ { return globMatch(wildCard, string, '?', '*'); } boolean sqlMatchLike(char *wildCard, char *string) /* Match using % and _ wildcards. */ { return globMatch(wildCard, string, '_', '%'); } rtracklayer/src/ucsc/zlibFace.c0000644000175100017510000000551112612032142017517 0ustar00biocbuildbiocbuild/* Wrappers around zlib to make interfacing to it a bit easier. */ /* Copyright (C) 2009 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include static char *zlibErrorMessage(int err) /* Convert error code to errorMessage */ { switch (err) { case Z_STREAM_END: return "zlib stream end"; case Z_NEED_DICT: return "zlib need dictionary"; case Z_ERRNO: return "zlib errno"; case Z_STREAM_ERROR: return "zlib data error"; case Z_DATA_ERROR: return "zlib data error"; case Z_MEM_ERROR: return "zlib mem error"; case Z_BUF_ERROR: return "zlib buf error"; case Z_VERSION_ERROR: return "zlib version error"; case Z_OK: return NULL; default: { static char msg[128]; safef(msg, sizeof(msg), "zlib error code %d", err); return msg; } } } size_t zCompress( void *uncompressed, /* Start of area to compress. */ size_t uncompressedSize, /* Size of area to compress. */ void *compBuf, /* Where to put compressed bits */ size_t compBufSize) /* Size of compressed bits - calculate using zCompBufSize */ /* Compress data from memory to memory. Returns size after compression. */ { uLongf compSize = compBufSize; int err = compress((Bytef*)compBuf, &compSize, (Bytef*)uncompressed, (uLong)uncompressedSize); if (err != 0) errAbort("Couldn't zCompress %lld bytes: %s", (long long)uncompressedSize, zlibErrorMessage(err)); return compSize; } size_t zCompBufSize(size_t uncompressedSize) /* Return size of buffer needed to compress something of given size uncompressed. */ { return 1.001*uncompressedSize + 13; } size_t zUncompress( void *compressed, /* Compressed area */ size_t compressedSize, /* Size after compression */ void *uncompBuf, /* Where to put uncompressed bits */ size_t uncompBufSize) /* Max size of uncompressed bits. */ /* Uncompress data from memory to memory. Returns size after decompression. */ { uLongf uncSize = uncompBufSize; int err = uncompress(uncompBuf, &uncSize, compressed, compressedSize); if (err != 0) errAbort("Couldn't zUncompress %lld bytes: %s", (long long)compressedSize, zlibErrorMessage(err)); return uncSize; } void zSelfTest(int count) /* Run an internal diagnostic. */ { bits32 testData[count]; int uncSize = count*sizeof(bits32); int i; for (i=0; i 0)); } /* Utility for collapsing elements of a CharacterList */ /* Assumes that 'x' is a 'list' */ SEXP CharacterList_pasteCollapse(SEXP x, SEXP sep) { SEXP ans; if (TYPEOF(x) != VECSXP) error("CharacterList_collapse: expected a list"); PROTECT(ans = allocVector(STRSXP, length(x))); for (int i = 0; i < length(x); i++) SET_STRING_ELT(ans, i, _STRSXP_collapse(VECTOR_ELT(x, i), sep)); UNPROTECT(1); return ans; } rtracklayer/src/utils.h0000644000175100017510000000016712612032142016212 0ustar00biocbuildbiocbuild#ifndef UTILS_H #define UTILS_H #include "rtracklayer.h" SEXP CharacterList_pasteCollapse(SEXP x, SEXP sep); #endif rtracklayer/tests/0000755000175100017510000000000012607264731015267 5ustar00biocbuildbiocbuildrtracklayer/tests/rtracklayer_unit_tests.R0000644000175100017510000000013312607264731022213 0ustar00biocbuildbiocbuildrequire("rtracklayer") || stop("unable to load rtracklayer package") rtracklayer:::.test() rtracklayer/vignettes/0000755000175100017510000000000012612032142016116 5ustar00biocbuildbiocbuildrtracklayer/vignettes/example.bed0000644000175100017510000000131412607264731020243 0ustar00biocbuildbiocbuild##Example 5 from Custom Annotation Tracks User's Guide track name="ItemRGBDemo" description="Item RGB demonstration" visibility=2 itemRgb="On" priority=1 useScore="0" color="0,60,120" colorByStrand="0,0,255 255,0,0" group="user" offset=0 url="http://genome.ucsc.edu/" htmlUrl="http://genome.ucsc.edu/goldenPath/help/ct_description.txt" chr7 127471196 127472363 Pos1 0 + 127471196 127472363 255,0,0 3 300,200,100 0,500,1067 chr7 127472363 127473530 Pos2 2 + 127472363 127473530 255,0,0 2 250,500 0,667 chr7 127473530 127474697 Neg1 0 - 127473530 127474697 255,0,0 1 1167 0 chr16 127474697 127475864 Pos3 5 + 127474697 127475864 255,0,0 1 1167 0 chr16 127475864 127477031 Neg2 5 - 127475864 127477031 0,0,255 1 1167 0 rtracklayer/vignettes/rtracklayer.Rnw0000644000175100017510000006707512607264731021167 0ustar00biocbuildbiocbuild\documentclass{article} %\VignetteIndexEntry{rtracklayer} \usepackage[usenames,dvipsnames]{color} \usepackage[colorlinks=true, linkcolor=Blue, urlcolor=Blue, citecolor=Blue]{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\IRanges}{\Rpackage{IRanges}} \title{The \textbf{rtracklayer} package} \author{Michael Lawrence} \begin{document} \maketitle <>= options(width=70) @ \tableofcontents \section{Introduction} The \textbf{rtracklayer} package is an interface (or \emph{layer}) between \textbf{R} and genome browsers. Its main purpose is the visualization of genomic annotation \emph{tracks}, whether generated through experimental data analysis performed in R or loaded from an external data source. The features of \textbf{rtracklayer} may be divided into two categories: 1) the import/export of track data and 2) the control and querying of external genome browser sessions and views. There are two basic track data structures in Bioconductor: \Rclass{GRanges}, defined by the \Rpackage{GenomicRanges} package, and \Rclass{RangedData}, a more general data structure from the \Rpackage{IRanges} package. For most purposes, \Rclass{GRanges} is preferred in the context of \Rpackage{rtracklayer}; however, \Rclass{RangedData} has some particular use cases. \textbf{rtracklayer} supports the import and export of tracks from and to files in various formats, see Section~\ref{sec:import-export}. All positions in a \Rclass{GRanges} or \Rclass{RangedData} should be 1-based, as in R itself. The \textbf{rtracklayer} package currently interfaces with the \textbf{UCSC} web-based genome browser. Other packages may provide drivers for other genome browsers through a plugin system. With \textbf{rtracklayer}, the user may start a genome browser session, create and manipulate genomic views, and import/export tracks and sequences to and from a browser. Please note that not all features are necessarily supported by every browser interface. The rest of this vignette will consist of a number of case studies. First, we consider an experiment investigating microRNA regulation of gene expression, where the microRNA target sites are the primary genomic features of interest. \section{Gene expression and microRNA target sites} This section will demonstrate the features of \textbf{rtracklayer} on a microarray dataset from a larger experiment investigating the regulation of human stem cell differentiation by microRNAs. The transcriptome of the cells was measured before and after differentiation by HG-U133plus2 Affymetrix GeneChip arrays. We begin our demonstration by constructing an annotation dataset from the experimental data, and then illustrate the use of the genome browser interface to display interesting genomic regions in the UCSC browser. \subsection{Creating a target site track} For the analysis of the stem cell microarray data, we are interested in the genomic regions corresponding to differentially expressed genes that are known to be targeted by a microRNA. We will represent this information as an annotation track, so that we may view it in the UCSC genome browser. \subsubsection{Constructing the \Rclass{GRanges}} In preparation for creating the microRNA target track, we first used \textbf{limma} to detect the differentially expressed genes in the microarray experiment. The locations of the microRNA target sites were obtained from MiRBase. The code below stores information about the target sites on differentially expressed genes in the \textit{data.frame} called \texttt{targets}, which can also be obtained by entering \texttt{data(targets)} when \textbf{rtracklayer} is loaded. % <>= library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") @ % The following code creates the track from the \texttt{targets} dataset: % <>= library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) @ % The \Rfunction{GRangesForUCSCGenome} function constructs a \Rclass{GRanges} object for the named genome. The strand information, the name of the microRNA and the Ensembl ID of the targeted transcript are stored in the \Rclass{GRanges}. The chromosome for each site is passed as the \texttt{chrom} argument. The chromosome names and lengths for the genome are taken from the UCSC database and stored in the \Rclass{GRanges} along with the genome identifier. We can retrieve them as follows: <>= genome(targetTrack) head(seqlengths(targetTrack)) @ % While this extra information is not strictly needed to upload data to UCSC, calling \Rfunction{GRangesForUCSCGenome} is an easy way to formally associate interval data to a UCSC genome build. This ensures, for example, that the data will always be uploaded to the correct genome, regardless of browser state. It also immediately validates whether the intervals fall within the bounds of the genome. For cases where one is not interacting with the UCSC genome browser, and in particular when network access is unavailable, the \Rfunction{GRangesForBSGenome} function behaves the same, except it finds an installed \Rpackage{BSGenome} package and loads it to retrieve the chromosome information. \subsubsection{Accessing track information} The track information is now stored in the R session as a \Rclass{GRanges} object. It holds the chromosme, start, end and strand for each feature, along with any number of data columns. The primary feature attributes are the \texttt{start}, \texttt{end}, \texttt{seqnames} and \texttt{strand}. There are accessors for each of these, named accordingly. For example, the following code retrieves the chromosome names and then start positions for each feature in the track. % <>= head(seqnames(targetTrack)) head(start(targetTrack)) @ % \paragraph{Exercises} \begin{enumerate} \item Get the strand of each feature in the track \item Calculate the length of each feature \item Reconstruct (partially) the \texttt{targets} \Rclass{data.frame} \end{enumerate} <>= head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) @ \subsubsection{Subsetting a \textit{GRanges}} It is often helpful to extract subsets from \Rclass{GRanges} instances, especially when uploading to a genome browser. The data can be subset though a matrix-style syntax by feature and column. The conventional \texttt{[} method is employed for subsetting, where the first parameter, \textit{i}, indexes the features and \textit{j} indexes the data columns. Both \textit{i} and \textit{j} may contain numeric, logical and character indices, which behave as expected. % <>= ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] @ % \paragraph{Exercises} \begin{enumerate} \item Subset the track for all features on the negative strand of chromosome 2. \end{enumerate} <>= negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] @ \subsubsection{Exporting and importing tracks} \label{sec:import-export} Import and export of \Rclass{GRanges} and \Rclass{RangedData} instances is supported in the following formats: Browser Extended Display (BED), versions 1, 2 and 3 of the General Feature Format (GFF), and Wiggle (WIG). Support for additional formats may be provided by other packages through a plugin system. To save the microRNA target track created above in a format understood by other tools, we could export it as BED. This is done with the \texttt{export} function, which accepts a filename or any R connection object as its target. If a target is not given, the serialized string is returned. The desired format is derived, by default, from the extension of the filename. Use the \texttt{format} parameter to explicitly specify a format. <>= export(targetTrack, "targets.bed") @ To read the data back in a future session, we could use the \texttt{import} function. The source of the data may be given as a connection, a filename or a character vector containing the data. Like the \texttt{export} function, the format is determined from the filename, by default. <>= restoredTrack <- import("targets.bed") @ % The \Robject{restoredTrack} object is of class \Rclass{GRanges}. % \paragraph{Exercises} \begin{enumerate} \item Output the track to a file in the ``gff'' format. \item Read the track back into R. \item Export the track as a character vector. \end{enumerate} <>= export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") @ \subsection{Viewing the targets in a genome browser} For the next step in our example, we will load the track into a genome browser for visualization with other genomic annotations. The \textbf{rtracklayer} package is capable of interfacing with any genome browser for which a driver exists. In this case, we will interact with the web-based \textbf{UCSC} browser, but the same code should work for any browser. \subsubsection{Starting a session} The first step towards interfacing with a browser is to start a browser session, represented in R as a \textit{BrowserSession} object. A \textit{BrowserSession} is primarily a container of tracks and genomic views. The following code creates a \textit{BrowserSession} for the \textbf{UCSC} browser: <>= session <- browserSession("UCSC") @ Note that the name of any other supported browser could have been given here instead of ``UCSC''. To see the names of supported browsers, enter: <>= genomeBrowsers() @ \subsubsection{Laying the track} Before a track can be viewed on the genome, it must be loaded into the session using the \texttt{track<-} function, as demonstrated below: <>= track(session, "targets") <- targetTrack @ The \textit{name} argument should be a character vector that will help identify the track within \texttt{session}. Note that the invocation of \texttt{track<-} above does not specify an upload format. Thus, the default, ``auto'', is used. Since the track does not contain any data values, the track is uploaded as BED. To make this explicit, we could pass ``bed'' as the \textit{format} parameter. \paragraph{Exercises} \begin{enumerate} \item Lay a track with the first 100 features of \texttt{targetTrack} \end{enumerate} Here we use the short-cut \texttt{\$} syntax for storing the track. <>= session$target100 <- targetTrack[1:100] @ \subsubsection{Viewing the track} For \textbf{UCSC}, a view roughly corresponds to one tab or window in the web browser. The target sites are distributed throughout the genome, so we will only be able to view a few features at a time. In this case, we will view only the first feature in the track. A convenient way to focus a view on a particular set of features is to subset the track and pass the range of the subtrack to the constructor of the view. Below we take a track subset that contains only the first feature. <>= subTargetTrack <- targetTrack[1] # get first feature @ Now we call the \texttt{browserView} function to construct the view and pass the subtrack, zoomed out by a factor of 10, as the segment to view. By passing the name of the targets track in the \textit{pack} parameter, we instruct the browser to use the ``pack'' mode for viewing the track. This results in the name of the microRNA appearing next to the target site glyph. <>= view <- browserView(session, subTargetTrack * -10, pack = "targets") @ If multiple ranges are provided, multiple views are launched: <>= view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") @ \paragraph{Exercises} \begin{enumerate} \item Create a new view with the same region as \texttt{view}, except zoomed out 2X. \item Create a view with the ``targets'' track displayed in ``full'' mode, instead of ``packed''. \end{enumerate} <>= viewOut <- browserView(session, range(view) * -2) viewFull <- browserView(session, full = "targets") @ \subsubsection{A shortcut} There is also a shortcut to the above steps. The \texttt{browseGenome} function creates a session for a specified browser, loads one or more tracks into the session and creates a view of a given genome segment. In the following code, we create a new \textbf{UCSC} session, load the track and view the first two features, all in one call: <>= browseGenome(targetTrack, range = subTargetTrack * -10) @ It is even simpler to view the subtrack in \textbf{UCSC} by relying on parameter defaults: <>= browseGenome(subTargetTrack) @ \subsubsection{Downloading Tracks from your Web Browser} @ It is possible to query the browser to obtain the names of the loaded tracks and to download the tracks into R. To list the tracks loaded in the browser, enter the following: % <>= loaded_tracks <- trackNames(session) @ % One may download any of the tracks, such as the ``targets'' track that was loaded previously in this example. % <>= subTargetTrack <- track(session, "targets") @ % The returned object is a \Rclass{GRanges}, even if the data was originally uploaded as a \Rclass{RangedData} or other object. By default, the segment of the track downloaded is the current default genome segment associated with the session. One may download track data for any genome segment, such as those on a particular chromosome. Note that this does not distinguish by strand; we are only indicating a position on the genome. % <>= chr1Targets <- track(session, "targets", chr1Targets) @ \paragraph{Exercises} \begin{enumerate} \item Get the SNP under the first target, displayed in \texttt{view}. \item Get the UCSC gene for the same target. \end{enumerate} <>= region <- range(subTargetTrack) + 500 targetSNP <- track(session, "snp130", region) as.data.frame(targetSNP) targetGene <- track(session, "knownGene", region) as.data.frame(targetGene) @ \subsubsection{Accessing view state} The \texttt{view} variable is an instance of \textit{BrowserView}, which provides an interface for getting and setting view attributes. Note that for the UCSC browser, changing the view state opens a new view, as a new page must be opened in the web browser. To programmatically query the segment displayed by a view, use the \texttt{range} method for a \textit{BrowserView}. % <>= segment <- range(view) @ % Similarly, one may get and set the names of the visible tracks in the view. <>= visible_tracks <- trackNames(view) trackNames(view) <- visible_tracks @ The visibility mode (hide, dense, pack, squish, full) of the tracks may be retrieved with the \texttt{ucscTrackModes} method. % <>= modes <- ucscTrackModes(view) @ % The returned value, \texttt{modes}, is of class \textit{UCSCTrackModes}. The modes may be accessed using the \texttt{[} function. Here, we set the mode of our ``targets'' track to ``full'' visibility. <>= modes["targets"] modes["targets"] <- "full" ucscTrackModes(view) <- modes @ Existing browser views for a session may be retrieved by calling the \texttt{browserViews} method on the \textit{browserSession} instance. % <>= views <- browserViews(session) length(views) @ % \paragraph{Exercises} \begin{enumerate} \item Retrieve target currently visible in the view. \item Limit the view to display only the SNP, UCSC gene and target track. \item Hide the UCSC gene track. \end{enumerate} <>= viewTarget <- track(session, "targets", range(view)) trackNames(view) <- c("snp130", "knownGene", "targets") ucscTrackModes(view)["knownGene"] <- "hide" @ \section{CPNE1 expression and HapMap SNPs} Included with the \textbf{rtracklayer} package is a track object (created by the \textbf{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. We load the track presently. <>= library(rtracklayer) data(cpneTrack) @ \subsection{Loading and manipulating the track} The data values for a track are stored in the columns on the \textit{RangedData} instance. Often, a track contains a single column of numeric values, conventionally known as the \textit{score}. The \texttt{score} function retrieves the column named or \textit{score} or, if one does not exist, the first column in the \textit{RangedData}, as long as it is numeric. Otherwise, \texttt{NULL} is returned. <>= head(score(cpneTrack)) @ % Sometimes, it may be convenient to extract the track information as a % \textit{data.frame}. The \textit{trackData} function does this by % combining the \textit{featureData} matrix with the \textit{dataVals}. % It also adds a column named \textit{featMid}, which gives the % mid-points (the mean of the start and end positions) of each feature % in the track. Here is an example of using \textit{trackData} to plot % the test value for each SNP vs. its position. One use of extracting the data values is to plot the data. <>= plot(start(cpneTrack), score(cpneTrack)) @ \subsection{Browsing the SNPs} We now aim to view some of the SNPs in the UCSC browser. Unlike the microRNA target site example above, this track has quantitative information, which requires special consideration for visualization. \subsubsection{Laying a WIG track} To view the SNP locations as a track in a genome browser, we first need to upload the track to a fresh session. In the code below, we use the \texttt{[[<-} alias of \texttt{track<-}. <>= session <- browserSession() session$cpne <- cpneTrack @ % Note that because \texttt{cpneTrack} contains data values and its features do not overlap, it is uploaded to the browser in the WIG format. One limitation of the WIG format is that it is not possible to encode strand information. Thus, each strand needs to have its own track, and \textbf{rtracklayer} does this automatically, unless only one strand is represented in the track (as in this case). One could pass ``bed'' to the \textit{format} parameter of \texttt{track<-} to prevent the split, but tracks uploaded as BED are much more limited compared to WIG tracks in terms of visualization options. To form the labels for the WIG subtracks, `` p'' is concatenated onto the plus track and `` m'' onto the minus track. Features with missing track information are placed in a track named with the `` na'' postfix. It is important to note that the subtracks must be identified individually when, for example, downloading the track or changing track visibility. \subsubsection{Plotting the SNP track} To plot the data values for the SNP's in a track, we need to create a \textit{browserView}. We will view the region spanning the first 5 SNPs in the track, which will be displayed in the ``full'' mode. % <>= view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") @ % The UCSC browser will plot the data values as bars. There are several options available for tweaking the plot, as described in the help for the \textit{GraphTrackLine} class. These need to be specified laying the track, so we will lay a new track named ``cpne2''. First, we will turn the \textit{autoScale} option off, so that the bars will be scaled globally, rather than locally to the current view. Then we could turn on the \textit{yLineOnOff} option to add horizontal line that could represent some sort of cut-off. The position of the line is specified by \textit{yLineMark}. We set it arbitrarily to the 25\% quantile. % <>= track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") @ % \section{Binding sites for NRSF} \label{sec:binding} Another common type of genomic feature is transcription factor binding sites. Here we will use the \textbf{Biostrings} package to search for matches to the binding motif for NRSF, convert the result to a track, and display a portion of it in the \textbf{UCSC} browser. \subsection{Creating the binding site track} We will use the \textbf{Biostrings} package to search human chromosome 1 for NRSF binding sites. The binding sequence motif is assumed to be \textit{TCAGCACCATGGACAG}, though in reality it is more variable. To perform the search, we run \textit{matchPattern} on the positive strand of chromosome 1. % <>= library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits @ % We then convert the hits, stored as a \textit{Views} object (a particular type of \textit{IRanges} object), to a \textit{RangedData} instance. % <>= nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") @ % \Rfunction{GenomicData} is a convenience function that constructs a \Rclass{GRanges} object. \subsection{Browsing the binding sites} Now that the NRSF binding sites are stored as a track, we can upload them to the UCSC browser and view them. Below, load the track and we view the region around the first hit in a single call to \texttt{browseGenome}. % <>= session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) @ % We observe significant conservation across mammal species in the region of the motif. \section{Downloading tracks from UCSC} \Rclass{rtracklayer} can be used to download annotation tracks from the UCSC table browser, thus providing a convenient programmatic alternative to the web interface available at \url{http://genome.ucsc.edu/cgi-bin/hgTables}. \textbf{Note} that not all tables are output in parseable form, and that \textbf{UCSC will truncate responses} if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. \subsection{Example 1: the RepeatMasker Track} This simple example identifies repeat-masked regions in and around the transcription start site (TSS) of the human E2F3 gene, in hg19: <>= library (rtracklayer) mySession = browserSession("UCSC") genome(mySession) <- "hg19" e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) tbl.rmsk <- getTable( ucscTableQuery(mySession, track="rmsk", range=e2f3.tss.grange, table="rmsk")) @ There are several important points to understand about this example: \begin{enumerate} \item The \Rcode{ucscTableQuery} used above is a proxy for, and provides communication with, the remote UCSC table browser (see \url{http://genome.ucsc.edu/cgi-bin/hgTables}). \item You must know the name of the track and table (or sub-track) that you want. The way to do this is explained in detail below, in section 5.3. \item If the track contains multiple tables (which is the case for many ENCODE tracks, for instance), then you must also specify that table name. \item When the track contains a single table only, you may omit the \Rcode{table} parameter, or reuse the track name (as we did above). \item If you omit the range parameter, the full track table is returned, covering the entire genome. \item The amount of time required to download a track is roughly a function of the number of features in the track, which is in turn a function of the density of those features, and the length of the genomic range you request. To download the entire RepeatMasker track, for all of h19, would take a very long time, and is a task poorly suited to rtracklayer. By contrast, one full-genome DNaseI track takes less than a minute (see below). \end{enumerate} \subsection{Example 2: DNaseI hypersensitivity regions in the K562 Cell Line} The ENCODE project (\url{http://encodeproject.org/ENCODE}) provides many hundreds of annotation tracks to the UCSC table browser. One of these describes DNaseI hypersensitivity for K562 cells (an immortalized erythroleukemia line) measured at the University of Washington using 'Digital Genome Footprinting' (see \url{http://www.ncbi.nlm.nih.gov/pubmed?term=19305407}). Obtain DNaseI hypersensitive regions near the E2F3 TSS, and for all of hg19: <>= track.name <- "wgEncodeUwDgf" table.name <- "wgEncodeUwDgfK562Hotspots" e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) mySession <- browserSession () tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, range=e2f3.grange, table=table.name)) tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, table=table.name)) @ \subsection{Discovering Which Tracks and Tables are Available from UCSC} As the examples above demonstrate, you must know the exact UCSC-style name for the track and table you wish to download. You may browse these interactively at \url{http://genome.ucsc.edu/cgi-bin/hgTables?org=Human&db=hg19} or programmatically, as we demonstrate here. <>= mySession <- browserSession () genome(mySession) <- "hg19" # 177 tracks in October 2012 track.names <- trackNames(ucscTableQuery(mySession)) # chose a few tracks at random from this set, and discover how # many tables they hold tracks <- track.names [c (99, 81, 150, 96, 90)] sapply(tracks, function(track) { length(tableNames(ucscTableQuery(mySession, track=track))) }) @ \section{Conclusion} These case studies have demonstrated a few of the most important features of \textbf{rtracklayer}. Please see the package documentation for more details. The following is the session info that generated this vignette: <>= sessionInfo() @ \end{document}