Biostrings/.BBSoptions0000644000126300012640000000201412227063322016277 0ustar00biocbuildphs_compbio# Default value for 'UnsupportedPlatforms' is the empty string. # Examples: # - for a package that is supported on all platforms except on Windows: # UnsupportedPlatforms: win # - for a package that is supported on all platforms execept on Mac OS X and # Solaris: # UnsupportedPlatforms: mac, churchill #UnsupportedPlatforms: win, mac, churchill # 'Alert' can be TRUE or FALSE, default is FALSE. Alert: TRUE # Default value for 'AlertOn' is "ERROR". # Examples: # - to receive an alert in case of any warning on any platform: # AlertOn: WARNINGS # - to receive an alert in case of any error on any platform or any warning # on Windows: # AlertOn: ERROR, win.WARNINGS # - to receive an alert in case of any error on lamb1 or any warning on # Mac OS X # AlertOn: lamb1.ERROR, mac.WARNINGS AlertOn: ERROR, WARNINGS # Default value for 'AlertTo' is the email address of the Maintainer found in # the DESCRIPTION file of the package. AlertTo: hpages@fhcrc.org, herve.pages@laposte.net Biostrings/Biostrings1/0000755000126300012640000000000012227063311016461 5ustar00biocbuildphs_compbioBiostrings/Biostrings1/DESCRIPTION0000644000126300012640000000054312227063311020171 0ustar00biocbuildphs_compbioPackage: Biostrings Title: String objects representing biological sequences, and matching algorithms Version: 1.5.8 Author: Saikat DebRoy Description: Class definitions and generics for biological sequences along with pattern matching algorithms. Depends: R (>= 1.8.0), methods Maintainer: H. Pages License: LGPL SaveImage: yes Biostrings/Biostrings1/NAMESPACE0000644000126300012640000000127612227063311017706 0ustar00biocbuildphs_compbiouseDynLib(Biostrings) exportClasses(AminoAcidAlphabet, BioAlphabet, BioPatternAlphabet, BioString, LongestCommonPrefix, NucleotideAlphabet, simpleBioString, book) exportMethods(allSameLetter, anySameLetter, as.character, as.matrix, "[", "[[", BioStringNewValues, "gapletter<-", initialize, length, matchDNAPattern, nchar, show, substr, substring, needwunsQS) export(alphabetFrequency, DNAAlphabet, DNAPatternAlphabet, DNAString, DNASuffixArray, LongestCommonPrefix, NucleotideString, reverseComplement, RNAAlphabet, RNAPatternAlphabet, sortDNAString, alignScore, StandardPeptideAlphabet, AAString, rpeptide, testBiostrings) S3method(print, needwunsQS) S3method(alignScore, needwunsQS) Biostrings/Biostrings1/R/0000755000126300012640000000000012227063310016661 5ustar00biocbuildphs_compbioBiostrings/Biostrings1/R/String.R0000644000126300012640000003161212227063310020255 0ustar00biocbuildphs_compbio#Copyright (C) 2003-2004 by Saikat DebRoy setClassUnion("extOrChar", c("externalptr", "character")) # VJC setClass("BioString", representation(alphabet="BioAlphabet", offsets="matrix", values="extOrChar", # for simpleBioString, VJC initialized="logical")) setMethod("as.matrix", signature(x = "BioString"), function (x) x@offsets) setGeneric("BioStringNewValues", function(alphabet, length.string) standardGeneric("BioStringNewValues")) setMethod("BioStringNewValues", signature(alphabet="NucleotideAlphabet", length.string="numeric"), function (alphabet, length.string) { if (nchar(alphabet@letters) != 5) stop("incorrect nucleotide alphabet") if (length.string > .Machine$integer.max) stop("string too long") .Call("BioStringValues", 5, length.string, PACKAGE="Biostrings") }) setMethod("BioStringNewValues", signature(alphabet="AminoAcidAlphabet", length.string="numeric"), function (alphabet, length.string) { if (length.string > .Machine$integer.max) stop("string too long") .Call("BioStringValues", nchar(alphabet@letters), length.string, PACKAGE="Biostrings") }) setMethod("BioStringNewValues", signature(alphabet="BioPatternAlphabet", length.string="numeric"), function (alphabet, length.string) { alphabet <- alphabet@baseAlphabet callGeneric() }) setMethod("initialize", signature(.Object = "BioString"), function (.Object, alphabet, offsets = cbind(1, 0), values=BioStringNewValues(alphabet, end), initialized=!missing(values), ...) { if (!is.matrix(offsets) || ncol(offsets) != 2) stop("invalid offsets") storage.mode(offsets) <- "integer" start <- offsets[, 1] end <- offsets[, 2] offsets[, 1] <- start <- ifelse(start <= 0, 1, start) offsets[start > end, ] <- 1:0 storage.mode(offsets) <- "integer" .Object@alphabet <- alphabet .Object@offsets <- offsets .Object@values <- values .Object@initialized <- initialized .Object }) NucleotideString <- function(src, type=c("DNA", "RNA"), srctype=c("character", "connection"), alphabet=if (type == "DNA") DNAPatternAlphabet() else RNAPatternAlphabet(), gap=alphabet@gap) { srctype <- match.arg(srctype) if (srctype != "character") stop("source type not implemented") type <- match.arg(type) if (!is.character(src)) stop("src must be a character string") if (!is.character(gap) || length(gap) != 1 || nchar(gap) != 1) stop("gap must be a single character") if (gap != alphabet@gap) { savealph <- alphabet if (gap %in% names(alphabet@mapping)) { if (!is(alphabet, "BioPatternAlphabet") || gap %in% names(alphabet@baseAlphabet@mapping)) stop("gap character conflicts with other alphabet characters") gindex <- match(gap, names(alphabet@mapping)) names(alphabet@mapping)[gindex] <- '0' substr(alphabet@letters, gindex, gindex) <- '0' } alphgap <- alphabet@gap gapletter(alphabet) <- gap ans <- .Call("setBioString", new("BioString", alphabet), src, PACKAGE="Biostrings") ans@initialized <- TRUE ans@alphabet <- savealph } else { ans <- .Call("setBioString", new("BioString", alphabet), src, PACKAGE="Biostrings") ans@initialized <- TRUE } ans } DNAString <- function(src="", gap='-') { NucleotideString(src=src, gap=gap) } setMethod("length", signature(x = "BioString"), function (x) { nrow(x@offsets) }) setMethod("[", signature(x = "BioString"), function (x, i, j, ..., drop) { if (nargs() == 1 || nargs() == 2 && missing(i)) x else if (nargs() == 2 && !missing(i)) { x@offsets <- x@offsets[i, , drop = FALSE] x } else stop("invalid subsetting") }) setMethod("[[", signature(x = "BioString"), function (x, i, j, ..., drop) { if (nargs() != 2 && (nargs() != 3 || !missing(j))) stop("incorrect number of subscripts") if (missing(i)) stop("invalid subscript type") x@offsets <- cbind(x@offsets[[i, 1]], x@offsets[[i, 2]]) storage.mode(x@offsets) <- "integer" x }) setMethod("substr", signature(x = "BioString"), function (x, start, stop) { .Call("BioString_substring", x, start, stop, FALSE, PACKAGE="Biostrings") }) setMethod("substring", signature(text = "BioString"), function (text, first, last) { .Call("BioString_substring", text, first, last, TRUE, PACKAGE="Biostrings") }) setMethod("as.character", signature(x = "BioString"), function (x) { .Call("BioStringToRString", x, PACKAGE="Biostrings") }) ##FIXME: nchar now does more careful things with multibyte character ##strings. I think we can ignore this here - but just in case... setMethod("nchar", signature(x = "BioString", type="character"), function (x, type) { ans <- x@offsets[,2]-x@offsets[,1]+1 as.integer(ifelse(ans < 0, as.integer(0), ans)) }) setMethod("nchar", signature(x = "BioString", type="missing"), function (x, type) { ans <- x@offsets[,2]-x@offsets[,1]+1 as.integer(ifelse(ans < 0, as.integer(0), ans)) }) setMethod("show", signature(object = "BioString"), function (object) { cat(" Object of class BioString with\n") if (is(object@alphabet, "BioPatternAlphabet")) cat("Pattern alphabet: ") else cat("Alphabet: ") cat(object@alphabet@letters) nvec <- length(object) if (nvec == 0) { cat("\nLength: 0\n") } else { cat("\nValues:\n") printsome <- nvec > 30 i <- 1 while (i <= nvec) { if (printsome && i == 15) { cat("\n\n") i <- nvec-13 } if (i >= 10 || nvec < 10) cat(paste('[', i, ']', sep='')) else cat(paste(' [', i, ']', sep='')) cat(' ') tmp <- object[i] n <- nchar(tmp) if (n > 40) { cat(as.character(substr(tmp, 1, 18))) cat("....") cat(as.character(substr(tmp, n-17, n))) } else cat(as.character(tmp)) cat('\n') i <- i+1 } } }) setGeneric("matchDNAPattern", function(pattern, x, algorithm, mismatch) standardGeneric("matchDNAPattern")) setMethod("matchDNAPattern", signature(pattern="character"), function (pattern, x, algorithm, mismatch) { pattern <- NucleotideString(pattern, alphabet=DNAPatternAlphabet()) callGeneric() }) setMethod("matchDNAPattern", signature(x="character"), function (pattern, x, algorithm, mismatch) { x <- DNAString(x) callGeneric() }) setMethod("matchDNAPattern", signature(pattern="BioString", x="BioString"), function (pattern, x, algorithm, mismatch) { if (missing(mismatch)) mismatch <- 0 else if (mismatch < 0) stop("mismatch must be a non-negative integer") pattern <- NucleotideString(as.character(pattern), alphabet=pattern@alphabet) patalph <- pattern@alphabet if (is(patalph, "BioPatternAlphabet")) patalph <- patalph@baseAlphabet xalph <- x@alphabet if (is(xalph, "BioPatternAlphabet")) xalph <- xalph@baseAlphabet if (!identical(patalph, xalph)) stop("The pattern and the string are based on different alphabets") algorithm <- if (missing(algorithm)) { if (mismatch == 0 && nchar(pattern) > .Machine$sizeof.long*8) "boyer-moore" else "shift-or" } else match.arg(algorithm, c("boyer-moore", "forward-search", "shift-or")) if (mismatch > 0 && algorithm != "shift-or") stop("only mismatch algorithm is shift-or") switch(algorithm, "boyer-moore"=.Call("BoyerMoore_exactMatch", pattern, x, PACKAGE="Biostrings"), "forward-search"=.Call("ForwardSearch_exactMatch", pattern, x, PACKAGE="Biostrings"), "shift-or"=.Call('ShiftOr_inexactMatch', pattern, x, mismatch, mismatch, mismatch, mismatch, PACKAGE="Biostrings"), stop("Unknown algorithm")) }) reverseComplement <- function(x) { if (!is(x, "BioString")) stop("argument must be a BioString") .Call("reverseComplementBioString", x, PACKAGE="Biostrings") } setGeneric("allSameLetter", function(x, letter) standardGeneric("allSameLetter")) setMethod("allSameLetter", signature(x="BioString", letter="character"), function (x, letter) { callGeneric(x, NucleotideString(letter, alphabet=x@alphabet)) }) setMethod("allSameLetter", signature(x="character"), function (x, letter) { callGeneric(DNAString(x), letter) }) setMethod("allSameLetter", signature(x = "BioString", letter="BioString"), function (x, letter) { .Call("allSameLetter", x, letter, TRUE, PACKAGE="Biostrings") }) setGeneric("anySameLetter", function(x, letter) standardGeneric("anySameLetter")) setMethod("anySameLetter", signature(x="BioString", letter="character"), function (x, letter) { callGeneric(x, NucleotideString(letter, alphabet=x@alphabet)) }) setMethod("anySameLetter", signature(x="character"), function (x, letter) { callGeneric(DNAString(x), letter) }) setMethod("anySameLetter", signature(x = "BioString", letter="BioString"), function (x, letter) { .Call("allSameLetter", x, letter, FALSE, PACKAGE="Biostrings") }) alphabetFrequency <- function (x, baseOnly=TRUE) { xtable <- .Call('baseFrequency', x, PACKAGE='Biostrings') if (baseOnly && is(x@alphabet, "BioPatternAlphabet")) { baseLetters <- sort(names(x@alphabet@baseAlphabet@mapping)) xtable <- c(xtable[baseLetters], sum(xtable)-sum(xtable[baseLetters])) names(xtable) <- c(baseLetters, 'Other') } xtable } sortDNAString <- function(x, prefixLength = max(nchar(x))) { .Call('SortDNAString', x, prefixLength, PACKAGE="Biostrings") } DNASuffixArray <- function(x, prefixLength = max(nchar(x))) { .Call('DNASuffixArray', x, prefixLength, PACKAGE="Biostrings") } setClass("LongestCommonPrefix", representation(abovediag="integer")) LongestCommonPrefix <- function(x) { new("LongestCommonPrefix", abovediag=.Call('longestCommonPrefixSuffixArray', x, PACKAGE='Biostrings')) } setMethod("[", signature(x = "LongestCommonPrefix", i = "matrix", j = "missing", drop = "missing"), function (x, i, j, ..., drop) { if ((storage.mode(i) != "integer" && storage.mode(i) != "double") || ncol(i) != 2) stop("invalid matrix index") ans <- integer(nrow(i)) for (j in seq(along=ans)) { starti <- i[j, 1] endi <- i[j, 2] if (starti != endi) { if (starti > endi) { starti <- endi endi <- i[j, 1] } ans[j] <- as.integer(min(x@abovediag[starti:(endi-1)])) } } ans }) Biostrings/Biostrings1/man/0000755000126300012640000000000012227063311017234 5ustar00biocbuildphs_compbioBiostrings/Biostrings1/man/AminoAcidAlphabet-class.Rd0000644000126300012640000000233212227063311024113 0ustar00biocbuildphs_compbio\name{AminoAcidAlphabet-class} \docType{class} \alias{AminoAcidAlphabet-class} \alias{BioStringNewValues,AminoAcidAlphabet,numeric-method} \title{Class "NucleotideAlphabet" represents alphabets used in DNA or RNA} \description{ Each object of class "NucleotideAlphabet" represents an amino acid alphabet. This usually also contains the gap character represented by \sQuote{-}.} \section{Slots}{ \describe{ \item{\code{letters}:}{Object of class \code{"character"} representing the letters of the alphabet. Usually Roman upper case letters are used. The one exception is the gap character which is always \sQuote{-}} \item{\code{mapping}:}{Object of class \code{"integer"} representing the encoding used to represent these objects internally. } } } \section{Extends}{ Class \code{"BioAlphabet"}, directly. } \section{Methods}{ \describe{ \item{BioStringNewValues(alphabet, length.string)}{Given \code{alphabet} of class "AminoAcidAlphabet" return a new uninitialized BioString object for that alphabet with length \code{length.string}. See \code{\link{BioString-class}} for more details.} } } \author{ Saikat DebRoy } %\examples{ FIXME: add example %} \keyword{classes} Biostrings/Biostrings1/man/BioAlphabet-class.Rd0000644000126300012640000000341712227063311023005 0ustar00biocbuildphs_compbio\name{BioAlphabet-class} \docType{class} \alias{BioAlphabet-class} \alias{initialize,BioAlphabet-method} \alias{gapletter<-,BioAlphabet,character-method} \title{Class "BioAlphabet" represents alphabets used in biology } \description{ Each object of class "BioAlphabet" represents a particular alphabet used to represent some biological sequence.} \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{letters}:}{Object of class \code{"character"} representing the letters of the alphabet. Usually roman upper case letters are used. The one exception is the gap character which is always \sQuote{-}} \item{\code{mapping}:}{Object of class \code{"integer"} representing the encoding used to represent these objects internally. } \item{\code{gap}:}{Object of class \code{"character"}, the gap character in the alphabet. } } } \section{Methods}{ \describe{ \item{initialize(.Object, letters)}{Initialize an alphabet object. for the given letters. If one of the letters is not the gap character \sQuote{-}, then it is added as the first letter. An encoding also created which is stored in the \code{mapping} slot. } \item{gapletter(x) <- value}{Change the letter representing gaps in \code{x} of class "BioPatternAlphabet" to \code{value} which must be a single letter not in the base alphabet of \code{x}.} } } \author{ Saikat DebRoy } \seealso{ \code{\link{NucleotideAlphabet-class}} and \code{\link{AminoAcidAlphabet-class}}, for two subclasses of the \code{"BioAlphabet"} class. } \examples{ new("NucleotideAlphabet", letters=c('A', 'G', 'C', 'T')) new("NucleotideAlphabet", letters=c('-', 'A', 'G', 'C', 'T')) } \keyword{classes} Biostrings/Biostrings1/man/BioPatternAlphabet-class.Rd0000644000126300012640000000567312227063311024351 0ustar00biocbuildphs_compbio\name{BioPatternAlphabet-class} \docType{class} \alias{BioPatternAlphabet-class} \alias{BioStringNewValues,BioPatternAlphabet,numeric-method} \alias{gapletter<-,BioPatternAlphabet,character-method} \alias{initialize,BioPatternAlphabet-method} \title{Class representing alphabets used in patterns for matching biological sequences } \description{ Each object of class "BioPatternAlphabet" represents an alphabet for patterns that is used to match a specific type of biological sequence.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("BioPatternAlphabet", baseAlphabet, letters)} where \code{letters} is a named character vector with the names being single letters not in the base alphabet and the value corresponding to each name are strings made of letters from the base alphabet. Each such name value pair defines a new letter in the pattern alphabet which matches all the letters in its value string. } \section{Slots}{ \describe{ \item{\code{baseAlphabet}:}{Object of class \code{"BioAlphabet"}, the base alphabet that for the letters matched by members of this pattern alphabet. } \item{\code{letters}:}{Object of class \code{"character"} representing the letters of the alphabet. Usually roman upper case letters are used. The one exception is the gap character which is always \sQuote{-}.} \item{\code{mapping}:}{Object of class \code{"integer"} representing the encoding used to represent these objects internally. } \item{\code{gap}:}{Object of class \code{"character"}, the gap character in the alphabet. } } } \section{Extends}{ Class \code{"BioAlphabet"}, directly. } \section{Methods}{ \describe{ \item{BioStringNewValues(alphabet, length.string)}{Given \code{alphabet} of class "BioPatternAlphabet" return a new uninitialized "BioString" object for that alphabet with length \code{length.string}. See \code{\link{BioString-class}} for more details.} \item{gapletter(x) <- value}{Change the letter representing gaps in \code{x} of class "BioPatternAlphabet" to \code{value} which must be a single letter not in the base alphabet of \code{x}.} \item{initialize(.Object, ...)}{Method to initialize an object of class "BioPatternAlphabet". Usually used indirectly via a call to \code{\link[methods]{new}}} } } \author{ Saikat DebRoy } \seealso{ \code{\link{BioAlphabet-class}} } \examples{ dnaAlph <- new("BioPatternAlphabet", DNAAlphabet(), c(N="AGCT", B="CGT", D="AGT", H="ACT", K="GT", M="AC", R="AG", S="CG", V="ACG", W="AT", Y="CT")) dnaAlph } \keyword{classes} Biostrings/Biostrings1/man/BioString-class.Rd0000644000126300012640000001326412227063311022534 0ustar00biocbuildphs_compbio\name{BioString-class} \docType{class} \alias{BioString-class} \alias{[,BioString-method} \alias{[,BioString,ANY,ANY,ANY-method} \alias{[[,BioString-method} \alias{allSameLetter,BioString,character-method} \alias{allSameLetter,BioString,BioString-method} \alias{anySameLetter,BioString,character-method} \alias{anySameLetter,BioString,BioString-method} \alias{as.character,BioString-method} \alias{as.matrix,BioString-method} \alias{initialize,BioString-method} \alias{length,BioString-method} \alias{matchDNAPattern,BioString,BioString-method} \alias{nchar,BioString,character-method} \alias{nchar,BioString,missing-method} \alias{show,BioString-method} \alias{substr,BioString-method} \alias{substring,BioString-method} \title{Class "BioString", represents a biological sequence} \description{Class "BioString", contains an encoded string representing a biological sequence for a particular alphabet (RNA, DNA or amino acid). It represents zero or more substrings of the full string.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("BioString", alphabet, end, start, values, initialized, ...)}. However, it is recommended that users should not call this directly. For now, use the function \code{\link{NucleotideString}} to create objects of class "BioString" that uses a nucleotide alphabet (RNA or DNA) and the function \code{\link{DNAString}} for objects using DNA alphabet.} } \section{Slots}{ \describe{ \item{\code{alphabet}:}{Object of class \code{"BioAlphabet"}, the alphabet used in the sequence. } \item{\code{initialized}:}{Object of class \code{"logical"}, \code{TRUE} if the sequence initialized with values. Users should not modify this slot directly. } \item{\code{offsets}:}{Object of class \code{"matrix"} and storage mode "integer", this stores (in two columns) the start and end points of the substrings represented in \code{x}. Rows with the first value \code{1} and the second value{0} represent empty substrings.} \item{\code{values}:}{Object of class \code{"externalptr"}, this internally stores the actual encoded sequence as a vector. As objects of class "externalptr" are passed by value in R, this saves copying of long sequences. } } } \section{Methods}{ \describe{ \item{initialize(.Object, alphabet, offsets=cbind(1, 0), values=BioStringNewValues(alphabet, end), initialized=!missing(values))}{Construct an object of class "BioString". Usually not called directly by users. } \item{length(x)}{Return the number of substrings represented by \code{x}.} \item{x[i]}{Return the substrings in \code{x} corresponding to index \code{i}.} \item{x[[i]]}{Return the substring in \code{x} corresponding to the index \code{i}. The index \code{i} must be of length \code{1}.} \item{nchar(x, type)}{Return the number of characters in each substring represented in \code{x}. \code{type} is not used for now.} \item{show(object)}{Display \code{object} of class "BioString".} \item{as.character(x)}{Convert a "BioString" object to a character vector using its native alphabet.} \item{as.matrix(x)}{Return a two-column matrix of integers, the first column representing the start index and the scond column representing the end index of the substrings in the full string.} \item{substr(x, start, stop)}{Return another BioString object with value equivalent to \code{substr(as.character(x), start, stop)}.} \item{substring(text, first, last)}{Return another BioString object with value equivalent to \code{substring(as.character(text), first, last)}.} \item{matchDNAPattern(pattern, x, algorithm, mismatch)}{Match the DNA string \code{x} against \code{pattern} using \code{algorithm}. The pattern can use the letters A,C,G,T,- (the last being the gap character) and also the wildcards N (matching A,C,G,T), V (matching A,G,C), R (matching A,G) and Y (matching C,T).} \item{allSameLetter(x, letter)}{Return a logical vetor indicating which of the elements of \code{x} are entirely made up of the letter \code{letter}.} } } \author{Saikat DebRoy} \section{The structure of the values slot}{ The \code{values} slot of the "BioString" class is of class "externalptr". It always contains an R vector object in its tag field. The other fields are not used at present. The vector in the tag field is either a \code{CHARSXP} or an \code{INTSXP}. The exact type depends on the length of the alphabet. \code{INTSXP} is used if it is more than the number of bits in a C \code{char} type and \code{CHARSXP} is used otherwise. We use the \code{i}-th bit in the \code{char} or \code{int} (depending on whether the vector is of type CHARSXP or INTSXP) to represent the \code{i}-th letter in the alphabet where \code{i=0} represents the first bit. This effectively means that we can have at most \code{32} letters (including gap) in our alphabets for all standard computer architectures. } \seealso{ \code{\link{BioAlphabet-class}} and its subclasses for valid alphabet objects. \code{\link{DNAString}} for creating objects of class "BioString" representing DNA sequences. \code{\link{NucleotideString}} for creating objects of class "BioString" representing DNA or RNA sequences. } \examples{ new("BioString", DNAAlphabet()) # creates an empty DNA string x <- DNAString("AAGCTANA", gap="N") x as.character(x) substr(x, 2, 4) substring(x, 1, seq(length=nchar(x))) # all prefixes of x substring(x, seq(length=nchar(x)), nchar(x)) # all suffixes of x matchDNAPattern("GC", x) x <- substring(x, 1:3, 3:5) x[1:2] x[-3] # same as x[1:2] x[[3]] } \keyword{classes} Biostrings/Biostrings1/man/BioStringNewValues.Rd0000644000126300012640000000164712227063311023265 0ustar00biocbuildphs_compbio\name{BioStringNewValues} \alias{BioStringNewValues} \title{generic to do create an object suitable for the values slot of "BioStrings" class} \description{ This generic creates an external vector object that contains (in its tag field) an R vector (of type either \code{INTSXP} or \code{CHARSXP}) of the given length. The actual type is determined according to the size of the alphabet. } \usage{ BioStringNewValues(alphabet, length.string) } \arguments{ \item{alphabet}{ An object of class "BioAlphabet" } \item{length.string}{ An integer, the length of the storage in the result } } \value{ An external pointer. } \author{Saikat DebRoy} \seealso{\code{\link{BioString-class}} for the class which uses this generic during its initialization and \code{\link{BioAlphabet-class}} for the class of the \code{alphabet} parameter.} \examples{ BioStringNewValues(DNAAlphabet(), 0) } \keyword{classes} \keyword{internal} Biostrings/Biostrings1/man/DNAAlphabet.Rd0000644000126300012640000000154312227063311021571 0ustar00biocbuildphs_compbio\name{DNAAlphabet} \alias{DNAAlphabet} \alias{RNAAlphabet} \title{ functions to create DNA and RNA alphabets } \description{ The function \code{DNAAlphabet} returns an alphabet consisting of the letters \sQuote{A}, \sQuote{C}, \sQuote{G}, \sQuote{T} and \sQuote{-} (the last representing a gap). The function \code{RNAAlphabet} returns an alphabet consisting of the letters \sQuote{A}, \sQuote{C}, \sQuote{G}, \sQuote{U} and \sQuote{-} (the last representing a gap). } \usage{ DNAAlphabet() RNAAlphabet() } \value{ An object of class "NucleotideAlphabet". See \code{\link{NucleotideAlphabet-class}} for details. } \author{ Saikat DebRoy } \seealso{ \code{\link{DNAPatternAlphabet}} and \code{\link{RNAPatternAlphabet}} return alphabets for standrad patterns used in DNA and RNA sequences. } \examples{ DNAAlphabet() RNAAlphabet() } \keyword{classes} Biostrings/Biostrings1/man/DNAPatternAlphabet.Rd0000644000126300012640000000323012227063311023122 0ustar00biocbuildphs_compbio\name{DNAPatternAlphabet} \alias{DNAPatternAlphabet} \alias{RNAPatternAlphabet} \title{ functions to create DNA and RNA pattern alphabets } \description{ The function \code{DNAAlphabet} returns an alphabet consisting of standard patterns used in DNA sequences. The function \code{RNAAlphabet} returns an alphabet consisting of standard patterns used in RNA sequences. } \usage{ DNAPatternAlphabet() RNAPatternAlphabet() } \section{Memebers of the pattern alphabets}{ In the table below, we provide the letters from the base DNA alphabet that are matched by the added letters in the DNA pattern alphabet. The corresponding table for RNA is identical except for the substitution of \sQuote{U} for \sQuote{T}. \tabular{ll}{ \sQuote{N}\tab matches \sQuote{A}, \sQuote{C}, \sQuote{G}, \sQuote{T}\cr \sQuote{B}\tab matches \sQuote{C}, \sQuote{G}, \sQuote{T}\cr \sQuote{D}\tab matches \sQuote{A}, \sQuote{G}, \sQuote{T}\cr \sQuote{H}\tab matches \sQuote{A}, \sQuote{C}, \sQuote{T}\cr \sQuote{K}\tab matches \sQuote{G}, \sQuote{T}\cr \sQuote{M}\tab matches \sQuote{A}, \sQuote{C}\cr \sQuote{R}\tab matches \sQuote{A}, \sQuote{G}\cr \sQuote{S}\tab matches \sQuote{C}, \sQuote{G}\cr \sQuote{V}\tab matches \sQuote{A}, \sQuote{C}, \sQuote{G}\cr \sQuote{W}\tab matches \sQuote{A}, \sQuote{T}\cr \sQuote{Y}\tab matches \sQuote{C}, \sQuote{T}\cr \tab \cr } } \value{ An object of class "BioPatternAlphabet". See \code{\link{BioPatternAlphabet-class}} for details. } \author{ Saikat DebRoy } \seealso{ \code{\link{DNAAlphabet}}, \code{\link{RNAAlphabet}}} \examples{ DNAPatternAlphabet() RNAPatternAlphabet() } \keyword{classes} Biostrings/Biostrings1/man/DNASuffixArray.Rd0000644000126300012640000000240512227063311022312 0ustar00biocbuildphs_compbio\name{DNASuffixArray} \alias{DNASuffixArray} \title{ function to create a suffix array for a DNA string } \description{ This function creates a suffix array for the given DNA strings. The sorting of the suffix array can be done based on a given number of letters at the beginning of each suffix. } \usage{ DNASuffixArray(x, prefixLength = max(nchar(x))) } \arguments{ \item{x}{ an object of class "BioString" representing one or more DNA strings. If its length is more than one, suffix arrays for each of the string are created and merged. } \item{prefixLength}{ the number of letters at the beginning of each suffix that are used in sorting the suffix array. } } \value{ An object of class "BioString", with the suffixes from the argument sorted in increasing order. For the purpose of sorting, each string is assumed to be padded at the end with a letter lower in order than any letter in the alphabet of the string. } \references{ } \author{ Saikat DebRoy } \seealso{ \code{\link{sortDNAString}} for sorting the strings in an object of class "BioString". } \examples{ data('yeastSEQCHR1') yeast1 <- DNAString(yeastSEQCHR1) DNASuffixArray(substr(yeast1, 1, 30)) x <- substring(yeast1, c(1, 16), c(15, 30)) x DNASuffixArray(x) } \keyword{ utilities } Biostrings/Biostrings1/man/LongestCommonPrefix-class.Rd0000644000126300012640000000311012227063311024563 0ustar00biocbuildphs_compbio\name{LongestCommonPrefix-class} \docType{class} \alias{LongestCommonPrefix-class} \alias{[,LongestCommonPrefix,matrix,missing,missing-method} \title{Class of longest common prefix lengths for suffix array elemets} \description{This class represents a matrix of the length of the longest common prefixes between elements of a suffix array. The diagonal elements are all zero.} \section{Objects from the Class}{ Objects can be created by calling the function \code{\link{LongestCommonPrefix}} with the (only) argument a suffix array. } \section{Slots}{ \describe{ \item{\code{abovediag}:}{Object of class \code{"integer"}, represents the elements just above diagonal (ie. the elements of the matrix whose column numbers are one more than there row numbers). } } } \section{Methods}{ \describe{ \item{lcp[i]}{The only method for extracting elements from this class of objects. Here \code{lcp} is an object of class "LongestCommonPrefix" and \code{i} is a matrix of two columns, the columns representing the rwos and columns of the elements to be extracted. The result is an integer vector of the corresponding elements.} } } \references{Dan Gusfield (1997) \emph{Algorithms on strings, trees, and sequences}, Cambridge University Press, pp. 152} \author{Saikat DebRoy} \seealso{ \code{\link{LongestCommonPrefix}} } \examples{ data('yeastSEQCHR1') yeast1 <- DNAString(yeastSEQCHR1) x <- substring(yeast1, 1, 30) # very different from c(1,30) x suf <- DNASuffixArray(x) lcp <- LongestCommonPrefix(suf) lcp[cbind(1, 1:30)] } \keyword{classes} Biostrings/Biostrings1/man/LongestCommonPrefix.Rd0000644000126300012640000000203312227063311023463 0ustar00biocbuildphs_compbio\name{LongestCommonPrefix} \alias{LongestCommonPrefix} \title{Find the longest common prefixes for a suffix array} \description{ Given an object of class "BioString" representing a suffix array, this function returns an object (of class "LongestCommonPrefix") representing a matrix of the longest common prefixes between any two elements in the suffix array. } \usage{ LongestCommonPrefix(x) } \arguments{ \item{x}{ An object of class "BioString" representing a suffix array. } } \details{ The suffix array argument to the \code{LongestCommonPrefix} function is assumed to be created by the \code{DNASuffixArray} function. In other words, the suffixes are assumed to be sorted in increasing order. } \value{ An object of class "LongestCommonPrefix". } \author{Saikat DebRoy} \seealso{\code{\link{DNASuffixArray}}, \code{\link{LongestCommonPrefix-class}}} \examples{ data('yeastSEQCHR1') yeast1 <- DNAString(yeastSEQCHR1) x <- substring(yeast1, 1, 30) x suf <- DNASuffixArray(x) lcp <- LongestCommonPrefix(suf) } \keyword{internal} Biostrings/Biostrings1/man/NucleotideAlphabet-class.Rd0000644000126300012640000000372512227063311024371 0ustar00biocbuildphs_compbio\name{NucleotideAlphabet-class} \docType{class} \alias{NucleotideAlphabet-class} \alias{BioStringNewValues,NucleotideAlphabet,numeric-method} \alias{initialize,NucleotideAlphabet-method} \title{Class "NucleotideAlphabet" represents alphabets used in DNA or RNA} \description{ Each object of class "NucleotideAlphabet" represents a nucleotide alphabet. Usually this is the RNA or DNA alphabet and consists of \sQuote{A}, \sQuote{C}, \sQuote{G}, \sQuote{T} for DNA and \sQuote{A}, \sQuote{C}, \sQuote{G}, \sQuote{U} for RNA along with \sQuote{-} which represents a gap in the sequence.} \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{letters}:}{Object of class \code{"character"} representing the letters of the alphabet. Usually roman upper case letters are used. The one exception is the gap character which is always \sQuote{-}.} \item{\code{mapping}:}{Object of class \code{"integer"} representing the encoding used to represent these objects internally. } } } \section{Extends}{ Class \code{"BioAlphabet"}, directly. } \section{Methods}{ \describe{ \item{BioStringNewValues(alphabet, length.string)}{Given \code{alphabet} of class "NucleotideAlphabet" return a new uninitialized "BioString" object for that alphabet with length \code{length.string}. See \code{\link{BioString-class}} for more details.} \item{initialize(.Object, letters)}{Initialize an nucleotide alphabet object for the given letters. If one of the letters is not the gap character \sQuote{-}, then it is added as the first letter. With the gap character, the length of the alphabet should be five. An encoding also created which is stored in the \code{mapping} slot. } } } \author{ Saikat DebRoy } \examples{ myDNAAlph <- new("NucleotideAlphabet", letters=c('A', 'G', 'C', 'T')) myDNAAlph BioStringNewValues(myDNAAlph, 20) } \keyword{classes} Biostrings/Biostrings1/man/NucleotideString.Rd0000644000126300012640000000342012227063311023004 0ustar00biocbuildphs_compbio\name{NucleotideString} \alias{NucleotideString} \alias{DNAString} \title{Functions to convert a character string to a BioString object } \description{ The function \code{NucleotideString} expects a character string representing either an RNA or DNA sequence, and converts it to a BioString object with the appropriate alphabet. The function \code{DNAString} expects a character string representing either a DNA sequence, and converts it to a BioString object with the standard DNA alphabet. } \usage{ NucleotideString(src, type = c("DNA", "RNA"), srctype = c("character", "connection"), alphabet = if (type == "DNA") DNAPatternAlphabet() else RNAPatternAlphabet(), gap = alphabet@gap) DNAString(src, gap="-") } \arguments{ \item{src}{ A character string } \item{type}{ Either "DNA" (the default) or "RNA". } \item{srctype}{ Currently the only valid value (and the default) is "character". In future, we may allow "connection" as another valid value denoting that the \code{src} argument is a file name.} \item{alphabet}{Alphabet to be used for the string - usually one of DNAAlphabet() or RNAAlphabet(). } \item{gap}{The character in the input that represents a gap. All occurrences of this character in the input is converted to the gap character of the alphabet (which is usually \sQuote{-}).} } \value{ An object of class "BioString". } \author{Saikat DebRoy} \seealso{\code{\link{BioString-class}} for the class of the return value. \code{\link{DNAAlphabet}} and \code{\link{RNAAlphabet}} alphabet for creating the standard DNA and RNA alphabets. } \examples{ NucleotideString("ACTGAACT") DNAString("ACTGAACT-GC") DNAString("ACTGAACTNGC", gap="N") } \keyword{classes} Biostrings/Biostrings1/man/StandardPeptideAlphabet.Rd0000644000126300012640000000130312227063311024234 0ustar00biocbuildphs_compbio\name{StandardPeptideAlphabet} \alias{StandardPeptideAlphabet} \alias{AAString} \alias{rpeptide} \title{alphabet for proteins } \description{alphabet for proteins; generate random peptide strings } \usage{ StandardPeptideAlphabet() rpeptide(nchar, base) } \arguments{ \item{nchar}{ length of string } \item{base}{ character string giving codes that can be used } } \details{Has codes for amino acids; prepared by Saikay Debroy. } \value{ a \code{\link{BioAlphabet-class}} instance } %\references{ } \author{Vince Carey } %\note{ } %\seealso{ } \examples{ StandardPeptideAlphabet() AAString("AABB") rpeptide(12, StandardPeptideAlphabet()@letters) } \keyword{ models } Biostrings/Biostrings1/man/allSameLetter.Rd0000644000126300012640000000243212227063311022262 0ustar00biocbuildphs_compbio\name{allSameLetter} \alias{allSameLetter} \alias{allSameLetter,character,ANY-method} \title{ Generic to find the strings which are repeats of a single letter} \description{ This method finds all strings in a "BioString" object which consist of a particular letter repeating again and again. Note that this does not do a pattern matching. So, if the letter is "N" for a BioString object with DNA patterns, then it would only match strings which are repeats of "N" and not others. See the examples for an illustration. } \usage{ allSameLetter(x, letter) } \arguments{ \item{x}{ An object of class "BioString" or a character vector. In the later case it is converted to a BioString object.} \item{letter}{ A single letter. It should be part of the alphabet of \code{x}. } } \value{ A logical vector of same length as \code{x} with elements \code{TRUE} or \code{FALSE} accordingly as the corresponding element of \code{x} is a repeat of \code{letter} or not. } \author{ Saikat DebRoy } \seealso{\code{\link{BioString-class}}} \examples{ PpiI <- "GAACNNNNNCTC" D1 <- DNAString("tgctgatgcatagctagctgGAACtagctCTCtcgtagctggatgctgatNNNNNNNNNNNN") matches <- matchDNAPattern(PpiI, D1) matches allN <- allSameLetter(matches, 'N') allN matches[!allN] } \keyword{classes} \keyword{methods} Biostrings/Biostrings1/man/alphabetFrequency.Rd0000644000126300012640000000233512227063311023170 0ustar00biocbuildphs_compbio\name{alphabetFrequency} \alias{alphabetFrequency} \title{ function to calculate the frequency of letters in a biological sequence } \description{ Given an object of class "BioString" representing a biological sequence, this function calculates the frequency of each letter in the (base) alphabet for the "BioString" object. } \usage{ alphabetFrequency(x, baseOnly = TRUE) } \arguments{ \item{x}{ An object of class "BioString". } \item{baseOnly}{ A logical value. If \code{TRUE}, the frequency table only contains the letters in the base alphabet for \code{x}. } } \value{ An integer vector with names same as the letters in the alphabet. If the base alphabet is used for the frequency counts, there is an extra element with name 'Others' and it is the number of letters in the string which are not in the base alphabet. Usually, a non-zero entry here means that the string contains some letters from a pattern alphabet. } \author{ Saikat DebRoy } \seealso{ \code{\link{BioString-class}}, \code{\link{BioAlphabet-class}}, \code{\link{BioPatternAlphabet-class}} } \examples{ data(yeastSEQCHR1) yeast1 <- DNAString(yeastSEQCHR1) alphabetFrequency(yeast1) alphabetFrequency(yeast1, baseOnly=FALSE) } \keyword{category} Biostrings/Biostrings1/man/anySameLetter.Rd0000644000126300012640000000244312227063311022303 0ustar00biocbuildphs_compbio\name{anySameLetter} \alias{anySameLetter} \alias{anySameLetter,character,ANY-method} \title{ Generic to find the strings which contain a particular letter} \description{ This method finds all strings in a "BioString" object which contains at least one occurance of a particular letter. Note that this does not do a pattern matching. So, if the letter is "N" for a BioString object with DNA patterns, then it would only match strings which contain at least one instance of "N" and not others. See the examples for an illustration. } \usage{ anySameLetter(x, letter) } \arguments{ \item{x}{ An object of class "BioString" or a character vector. In the later case it is converted to a BioString object.} \item{letter}{ A single letter. It should be part of the alphabet of \code{x}. } } \value{ A logical vector of same length as \code{x} with elements \code{TRUE} or \code{FALSE} accordingly as the corresponding element of \code{x} contains \code{letter} or not. } \author{ Saikat DebRoy } \seealso{\code{\link{BioString-class}}} \examples{ PpiI <- "GAACNNNNNCTC" D1 <- DNAString("tgctgatgcatagctagctgGAACtagctCTCtcgtagctggatgctgatNNNNNNNNNNNN") matches <- matchDNAPattern(PpiI, D1) matches anyN <- anySameLetter(matches, 'N') anyN matches[!anyN] } \keyword{classes} \keyword{methods} Biostrings/Biostrings1/man/blosum50.Rd0000644000126300012640000000077112227063311021176 0ustar00biocbuildphs_compbio\name{blosum50} \alias{blosum50} \docType{data} \title{ scoring matrix for codon substitution in protein alignments} \description{ scoring matrix for codon substitution in protein alignments } \usage{data(blosum50)} \format{ A symmetric data frame with 24 rows and columns. } } \details{ taken from the web; many sources available } %\source{ %not %} %\references{ % ~~ possibly secondary sources and usages ~~ %} \examples{ data(blosum50) blosum50["A","A"] blosum50["A","B"] } \keyword{datasets} Biostrings/Biostrings1/man/gapletterReplace.Rd0000644000126300012640000000105012227063311023002 0ustar00biocbuildphs_compbio\name{gapletter<-} \alias{gapletter<-} \title{ function to modify the gap letter in an alphabet } \description{ This function modifies the gap letter in a "BioAlphabet" object. } \usage{ gapletter(x) <- value } \arguments{ \item{x}{ An object of class "BioAlphabet" } \item{value}{ A single letter. } } \value{ The modified object of class "BioAlphabet" } \author{ Saikat DebRoy } \seealso{\code{\link{BioAlphabet-class}} } \examples{ d <- DNAAlphabet() gapletter(d) <- 'N' d r <- RNAPatternAlphabet() gapletter(r) <- '*' r } \keyword{classes} Biostrings/Biostrings1/man/needwunsQS.Rd0000644000126300012640000000261612227063311021624 0ustar00biocbuildphs_compbio\name{needwunsQS} \alias{needwunsQS} \alias{needwunsQS,character,character,matrix,numeric-method} \alias{needwunsQS,character,character,matrix,missing-method} \alias{needwunsQS,BioString,BioString,matrix,missing-method} \alias{needwunsQS,BioString,BioString,matrix,numeric-method} \alias{print.needwunsQS} \alias{alignScore.needwunsQS} \alias{alignScore} \title{quadratic-space, simple gap implementation of Needleman-Wunsch global alignment algorithm } \description{quadratic-space, simple gap implementation of Needleman-Wunsch global alignment algorithm } \usage{ needwunsQS(s1, s2, substmat, gappen=8) } \arguments{ \item{s1}{ s1: first string, an R character vector of length 1 or a \code{\link{simpleBioString-class}} instance of length 1 } \item{s2}{ s2: second string, same data type as \code{s1}} \item{substmat}{ substmat: matrix of alignment score values} \item{gappen}{ gappen: penalty for introducing a gap in the alignment} } \details{ follows specification of Durbin, Eddy, Krogh, Mitchison (1998). } \value{ an instance of the S3 class ``needwunsQS'', for which there are print and alignScore methods. } \references{R. Durbin, S. Eddy, A. Krogh, G. Mitchison, Biological Sequence Analysis, Cambridge UP 1998, sec 2.3. } \author{Vince Carey } %\note{ } %\seealso{ } \examples{ data(blosum50) needwunsQS( "PAWHEAE", "HEAGAWGHEE", blosum50 ) } \keyword{ models } Biostrings/Biostrings1/man/reverseComplement.Rd0000644000126300012640000000131212227063311023217 0ustar00biocbuildphs_compbio\name{reverseComplement} \alias{reverseComplement} \title{ Function to reverse a DNA or RNA sequence and complement each base} \description{ Given an object of class "BioString", this function complements each base in the underlying string (replacing A with T or U, T or U with A, C with G and G with C) and reverses it. It also changes the substring indices so that they reflect the reversing. } \usage{ reverseComplement(x) } \arguments{ \item{x}{ an object of class "BioString" } } \value{ An object of class "BioString" containg the reversed and complemented underlying string and substring indices. } \author{ Saikat DebRoy } \examples{ reverseComplement(DNAString("ATCG-AA")) } \keyword{manip} Biostrings/Biostrings1/man/simpleBioString-class.Rd0000644000126300012640000000452412227063311023745 0ustar00biocbuildphs_compbio\name{simpleBioString-class} \docType{class} \alias{simpleBioString-class} \alias{[,simpleBioString-method} \alias{as.character,simpleBioString-method} \alias{coerce,simpleBioString,character-method} \alias{show,simpleBioString-method} \alias{substr,simpleBioString-method} \alias{expl} \alias{extOrChar-class} \title{Class "simpleBioString"} \description{Support the BioString class API for R character data} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("simpleBioString", alphabet, offsets, values, initialized, ...)}. At this time the offsets component is not meaningful; values slot holds the character vector of strings. } \section{Slots}{ \describe{ \item{\code{values}:}{Object of class \code{"character"}: the biostrings. } \item{\code{alphabet}:}{Object of class \code{"BioAlphabet"}: the alphabet from which the strings are built. } \item{\code{offsets}:}{Object of class \code{"matrix"}: currently ignored } \item{\code{initialized}:}{Object of class \code{"logical"}: currently ignored } } } \section{Extends}{ Class \code{"BioString"}, directly. } \section{Methods}{ \describe{ \item{[}{\code{signature(x = "simpleBioString")}: extract from the \code{values} vector; permits single subscripting only. } \item{as.character}{\code{signature(x = "simpleBioString")}: evaluates to the values slot. } \item{coerce}{\code{signature(from = "simpleBioString", to = "character")}: formal coercion to a character vector. } \item{show}{\code{signature(object = "simpleBioString")}: reporting method. } \item{substr}{\code{signature(x = "simpleBioString")}: applies base \code{substr} and returns a \code{simpleBioString}. } } } %\references{ ~put references to the literature/web site here ~ } \author{ VJ Carey } \note{The \code{extOrChar} class union allows \code{\link{BioString-class}} instances to have values that are either external pointer (references) or strings.} % ~Make other sections like Warning with \section{Warning }{....} ~ %\seealso{ % ~~objects to See Also as \code{\link{~~fun~~}}, ~~~ % or \code{\link{CLASSNAME-class}} for links to other classes %} \examples{ lit <- c("AABABCB","BBABCB") slit <- new("simpleBioString",values=lit, alphabet=StandardPeptideAlphabet()) slit sslit <- substr(slit,2,3) sslit as.character(sslit) } \keyword{classes} Biostrings/Biostrings1/man/sortDNAString.Rd0000644000126300012640000000226712227063311022233 0ustar00biocbuildphs_compbio\name{sortDNAString} \alias{sortDNAString} \title{ function to sort DNA strings } \description{ This function sorts a given object of class "BioString" representing a vector of DNA strings in increasing order. The sorting can be done based only on a given number of letters at the begining of each string. } \usage{ sortDNAString(x, prefixLength = max(nchar(x))) } \arguments{ \item{x}{ an object of class "BioString" representing one or more DNA strings. } \item{prefixLength}{ the number of letters at the begining of each string that are used in the sorting. } } \value{ An object of class "BioString", with the strings from the argument sorted in increasing order. For the purpose of sorting, each string is assumed to be padded at the end with a letter lower in order than any letter in the alphabet of the string. } \author{ Saikat DebRoy } \seealso{ \code{\link{DNASuffixArray}} } \examples{ data('yeastSEQCHR1') yeast1 <- DNAString(yeastSEQCHR1) x <- substring(yeast1, seq(1, by=10, length=30), seq(10, by=10, length=30)) x sortDNAString(x) x <- substr(yeast1, 1, 30) x sortDNAString(substring(x, 1:30, 30)) # suffix array for x } \keyword{ utilities } Biostrings/Biostrings1/man/yeastSEQCHR1.Rd0000644000126300012640000000137312227063311021643 0ustar00biocbuildphs_compbio\name{yeastSEQCHR1} \alias{yeastSEQCHR1} \title{An annotation data file for CHR1 in the yeastSEQ package} \description{ This is a single character string containing DNA sequence of yeast chromosome number 1. The data were obtained from the Saccharomyces Genome Database(url{ftp://genome-ftp.stanford.edu/pub/yeast/data\_download/sequence/genomic\_sequence/chromosomes/fasta/}). } \details{ Annotation based on data provided by Yeast Genome project. Source data built:Yeast Genome data are built at various time intervals. Sources used were downloaded Fri Nov 21 14:00:47 2003 Package built: Fri Nov 21 14:00:47 2003 } \references{ \url{http://www.yeastgenome.org/DownloadContents.shtml} } \examples{ data(yeastSEQCHR1) nchar(yeastSEQCHR1) } \keyword{datasets} Biostrings/CHANGES0000644000126300012640000001143112227063322015252 0ustar00biocbuildphs_compbioCHANGES SINCE Biostrings 1 (v 1.4.z) o The following bugs and design flaws found in Biostrings 1 have been addressed: a) matchDNAPattern() was broken in many ways: - The "offset problem": > d <- DNAString(c("AA","TTT")) > m <- matchDNAPattern("TT", d[2]) was returning wrong matches. This problem was in fact the consequence of a flaw in the design of the BioString class and was the first motivation for reworking the core Biostrings classes that are the fundations of Biostrings 2 (see the Biostrings2Classes vignette for an introduction to these new classes). - The "negative offset problem": > matchDNAPattern("AAA", "ACT", mismatch=2) was displaying a first empty match. - Problems with the "inexact matching" feature: Pb1: Inexact matching (mismatch != 0) was almost always returning a wrong result because of a bug in the implementation of the "shift-or" algorithm. Pb2: Only mismatch <= 3 was supported (now it's illimited even if it doesn't make sense to use mismatch >= length(subject)). Pb3: Some "of limits matches" (i.e. matches starting before the first letter of the subject or ending after its last letter) could be missing. And when they were found, the show() method was in general not able to display them properly. - This was provoking a bus-error bug on Solaris 2.9 and Mac OS X: > pattern <- DNAString("AAAA") > subject <- DNAString("AAAAC") > matchDNAPattern(pattern, subject, mis=2) b) Time of 'DNAString(src)' was quadratic in respect to 'length(src)' ('src' being a character vector). In Biostrings 2 this has been replaced by 'DNAStringSet(src)' which is much faster (linear in time). o Other bugs in Biostrings 1: - The Boyer-Moore algorithm was reported to be broken by Martin: > d <- DNAString("GACTGGTAAAAGTCGGCCGAGGAC") > matchDNAPattern("AA", d, algorithm="boyer-moore") Object of class BioString with Pattern alphabet: -TGCANBDHKMRSVWY Values: [1] AC [2] TA [3] AA [4] AA [5] AA [6] AG [7] GA The algorithm has not yet been ported to Biostrings 2 (but will be ASAP). - alphabetFrequency(x) was broken when x had "out of limits" offsets: > m <- matchDNAPattern("AAA", "ACT", mismatch=2) > alphabetFrequency(m) Error in alphabetFrequency(m) : found pattern (0) not in mapping (This still doesn't work in Biostrings 2, see TODO file.) o Changes in the API: - No more BioString class: it has been replaced by the BString, DNAString, RNAString, AAString, BStringSet, DNAStringSet, RNAStringSet, AAStringSet and XStringViews classes. - A BString object can be used to store a plain string and a DNAString (or RNAString) object can be used to store a DNA (or RNA) sequence. - No more NucleotideString() method: use the BString(), DNAString(), or RNAString() constructors instead. - The DNAString() constructor is _not_ vectorized anymore. You need to use the new DNAStringSet() constructor when the input is a character vector of length > 1. - New constructors BString() and RNAString() follow the DNAString() new behavior: they are _not_ vectorized. - The as.list() method for XStringViews objects. This allows constructions like 'for (b in as.list(v)) ...' and 'lapply(as.list(v), ...)'. - New generics: subBString(), subject(), start(), end(), width(), desc(), XStringViews(), reverse(), complement(), countPattern() and mismatch(). - New functions: letter(), BString(), RNAString(), views(), adjacentViews(). - Renamed functions: matchDNAPattern() has been replaced by matchPattern(). - Deprecated functions: matchDNAPattern(). o New features: - A new format for displaying BString, BStringSet or XStringViews objects. - New [, == and != operators for BString objects. - New [[, == and != operators for XStringViews objects. - XStringViews() (the replacement for the vectorized DNAString() found in Biostrings 1) has a 'sep' argument). - reverseComplement() was split in 2 separate functions reverse() and complement(). 'reverseComplement(x)' is now a shortcut for 'reverse(complement(x))'. - matchPattern() has a 'fixed' argument. - See man pages for all new generics and functions listed in previous section for all the details. o Changes in the semantic: - reverse() and reverseComplement() don't reverse the order of the views. o A few minor features have been temporarly removed (no listing provided). o Documentation: - The biostDemo.Rnw vignette has been replaced by 2 vignettes: matchPattern.Rnw and Alignments.Rnw - 2 new vignettes (work in progress): Biostrings2Classes.Rnw and DNAStringVectorization.Rnw. Biostrings/DESCRIPTION0000644000126300012640000000436012241047607015774 0ustar00biocbuildphs_compbioPackage: Biostrings Title: String objects representing biological sequences, and matching algorithms Description: Memory efficient string containers, string matching algorithms, and other utilities, for fast manipulation of large biological sequences or sets of sequences. Version: 2.30.1 Author: H. Pages, P. Aboyoun, R. Gentleman, and S. DebRoy Maintainer: H. Pages biocViews: SequenceMatching, Genetics, Sequencing, Infrastructure, DataImport, DataRepresentation Depends: R (>= 2.8.0), methods, BiocGenerics (>= 0.5.4), IRanges (>= 1.19.34), XVector (>= 0.1.3) Imports: graphics, methods, stats, utils, BiocGenerics, IRanges, XVector LinkingTo: IRanges, XVector Enhances: Rmpi Suggests: BSgenome (>= 1.13.14), BSgenome.Celegans.UCSC.ce2 (>= 1.3.11), BSgenome.Dmelanogaster.UCSC.dm3 (>= 1.3.11), BSgenome.Hsapiens.UCSC.hg18, drosophila2probe, hgu95av2probe, hgu133aprobe, GenomicFeatures (>= 1.3.14), hgu95av2cdf, affy, affydata (>= 1.11.5), RUnit License: Artistic-2.0 LazyLoad: yes Collate: 00datacache.R utils.R IUPAC_CODE_MAP.R AMINO_ACID_CODE.R GENETIC_CODE.R XStringCodec-class.R seqtype.R XString-class.R XStringSet-class.R XStringSet-comparison.R XStringViews-class.R MaskedXString-class.R XStringSetList-class.R xscat.R XStringSet-io.R letter.R getSeq.R dinucleotideFrequencyTest.R chartr.R reverseComplement.R translate.R toComplex.R replaceAt.R replaceLetterAt.R injectHardMask.R padAndClip.R misc.R SparseList-class.R MIndex-class.R lowlevel-matching.R match-utils.R matchPattern.R maskMotif.R matchPattern.BOC.R matchPattern.BOC2.R matchLRPatterns.R trimLRPatterns.R matchProbePair.R matchPWM.R findPalindromes.R PDict-class.R matchPDict.R XStringPartialMatches-class.R XStringQuality-class.R QualityScaledXStringSet.R letterFrequency.R InDel-class.R AlignedXStringSet-class.R PairwiseAlignments-class.R PairwiseAlignmentsSingleSubject-class.R PairwiseAlignments-io.R align-utils.R pmatchPattern.R pairwiseAlignment.R stringDist.R needwunsQS.R MultipleAlignment.R matchprobes.R debug.R test.R zzz.R Packaged: 2013-11-14 04:20:23 UTC; biocbuild Biostrings/NAMESPACE0000644000126300012640000002525212227063322015504 0ustar00biocbuildphs_compbiouseDynLib(Biostrings) import(methods) importFrom(graphics, axis, legend, lines, par, plot.new, plot.window, title ) importFrom(stats, chisq.test, complete.cases, diffinv, pchisq ) importFrom(utils, data ) import(BiocGenerics) import(IRanges) import(XVector) ### ========================================================================== ### BASIC CONTAINERS ### -------------------------------------------------------------------------- ### IUPAC_CODE_MAP.R ### AMINO_ACID_CODE.R ### GENETIC_CODE.R ### XStringCodec-class.R ### seqtype.R ### XString-class.R ### XStringSet-class.R ### XStringSet-comparison.R ### XStringViews-class.R ### MaskedXString-class.R ### XStringSetList-class.R ### xscat.R exportClasses( XString, BString, DNAString, RNAString, AAString, XStringSet, BStringSet, DNAStringSet, RNAStringSet, AAStringSet, XStringViews, MaskedXString, MaskedBString, MaskedDNAString, MaskedRNAString, MaskedAAString, XStringSetList, BStringSetList, DNAStringSetList, RNAStringSetList, AAStringSetList ) export( ## IUPAC_CODE_MAP.R + AMINO_ACID_CODE.R + GENETIC_CODE.R: IUPAC_CODE_MAP, mergeIUPACLetters, AMINO_ACID_CODE, GENETIC_CODE, RNA_GENETIC_CODE, ## XStringCodec-class.R: DNA_BASES, RNA_BASES, DNA_ALPHABET, RNA_ALPHABET, AA_ALPHABET, ## seqtype.R: seqtype, "seqtype<-", get_seqtype_conversion_lookup, alphabet, ## XString-class.R: BString, DNAString, RNAString, AAString, ## XStringSet-class.R: BStringSet, DNAStringSet, RNAStringSet, AAStringSet, ## MaskedXString-class.R: unmasked, ## XStringSetList-class.R: DNAStringSetList, AAStringSetList, ## xscat.R: xscat, ## Old stuff (Deprecated or Defunct): partitioning ) exportMethods( length, nchar, width, seqtype, "seqtype<-", updateObject, names, "names<-", "[", "[[", rep, append, show, splitAsListReturnedClass, union, intersect, setdiff, setequal, "%in%", match, compare, "==", "!=", match, coerce, as.character, unlist, as.matrix, as.list, toString, toComplex, narrow, subseq, threebands, "subseq<-", collapse, gaps, Views, unmasked, maskedwidth, maskedratio, masks, "masks<-" ) ### ========================================================================== ### UTILITIES ### -------------------------------------------------------------------------- ### XStringSet-io.R ### letter.R ### getSeq.R ### letterFrequency.R ### dinucleotideFrequencyTest.R ### chartr.R ### reverse.R ### translate.R ### toComplex.R ### replaceAt.R ### replaceLetterAt.R ### injectHardMask.R ### padAndClip.R ### misc.R export( ## XStringSet-io.R: readBStringSet, readDNAStringSet, readRNAStringSet, readAAStringSet, fasta.info, fastq.geometry, writeXStringSet, saveXStringSet, ## letter.R: letter, ## getSeq.R: getSeq, ## letterFrequency.R: letterFrequency, letterFrequencyInSlidingView, alphabetFrequency, hasOnlyBaseLetters, uniqueLetters, consensusMatrix, consensusString, mkAllStrings, oligonucleotideFrequency, dinucleotideFrequency, trinucleotideFrequency, nucleotideFrequencyAt, oligonucleotideTransitions, twoWayAlphabetFrequency, ## dinucleotideFrequencyTest.R dinucleotideFrequencyTest, ## reverse.R: complement, reverseComplement, ## translate.R: transcribe, cDNA, dna2rna, rna2dna, codons, translate, ## toComplex.R: toComplex, ## replaceAt.R: extractAt, replaceAt, ## replaceLetterAt.R: replaceLetterAt, .inplaceReplaceLetterAt, ## injectHardMask.R: injectHardMask, ## padAndClip.R: padAndClip, stackStrings, ## misc.R: N50 ) exportMethods( length, names, "[", "[[", rep, show, "==", "!=", duplicated, is.unsorted, order, sort, rank, coerce, as.character, as.matrix, as.list, toString, toComplex, letter, substr, substring, letterFrequency, letterFrequencyInSlidingView, alphabetFrequency, hasOnlyBaseLetters, uniqueLetters, consensusMatrix, consensusString, oligonucleotideFrequency, nucleotideFrequencyAt, dinucleotideFrequencyTest, chartr, reverse, complement, reverseComplement, codons, translate, extractAt, replaceAt, replaceLetterAt, injectHardMask ) ### ========================================================================== ### STRING MATCHING ### -------------------------------------------------------------------------- ### SparseList-class.R ### MIndex-class.R ### lowlevel-matching.R ### match-utils.R ### matchPattern.R ### matchPattern.BOC.R ### matchPattern.BOC2.R ### matchLRPatterns.R ### trimLRPatterns.R ### matchProbePair.R ### matchPWM.R ### findPalindromes.R ### PDict-class.R ### matchPDict.R exportClasses( #SparseList, MIndex, ByPos_MIndex, BOC_SubjectString, BOC2_SubjectString, PreprocessedTB, Twobit, ACtree2, PDict3Parts, PDict, TB_PDict, MTB_PDict, Expanded_TB_PDict ) export( ## MIndex-class.R width0, startIndex, endIndex, countIndex, extractAllMatches, ## lowlevel-matching.R neditStartingAt, neditEndingAt, neditAt, isMatchingStartingAt, isMatchingEndingAt, isMatchingAt, which.isMatchingStartingAt, which.isMatchingEndingAt, which.isMatchingAt, hasLetterAt, ## match-utils.R mismatch, nmatch, nmismatch, ## matchPattern.R gregexpr2, matchPattern, countPattern, vmatchPattern, vcountPattern, ## maskMotif.R maskMotif, mask, ## matchLRPatterns.R matchLRPatterns, ## trimLRPatterns.R trimLRPatterns, ## matchProbePair.R matchProbePair, ## matchPWM.R maxWeights, minWeights, maxScore, minScore, unitScale, PWM, PWMscoreStartingAt, matchPWM, countPWM, ## findPalindromes.R findPalindromes, findComplementedPalindromes, palindromeArmLength, complementedPalindromeArmLength, palindromeLeftArm, complementedPalindromeLeftArm, palindromeRightArm, complementedPalindromeRightArm, ## PDict-class.R + matchPDict.R tb, tb.width, nnodes, hasAllFlinks, computeAllFlinks, patternFrequency, PDict, matchPDict, countPDict, whichPDict, vmatchPDict, vcountPDict, vwhichPDict ) exportMethods( initialize, length, names, "names<-", show, "[[", startIndex, endIndex, countIndex, unlist, neditStartingAt, neditEndingAt, isMatchingStartingAt, isMatchingEndingAt, mismatch, nmatch, nmismatch, coverage, matchPattern, countPattern, vcountPattern, maskMotif, matchLRPatterns, trimLRPatterns, matchProbePair, maxWeights, minWeights, maxScore, minScore, PWM, matchPWM, countPWM, findPalindromes, findComplementedPalindromes, palindromeArmLength, complementedPalindromeArmLength, palindromeLeftArm, complementedPalindromeLeftArm, palindromeRightArm, complementedPalindromeRightArm, tb, tb.width, nnodes, hasAllFlinks, computeAllFlinks, head, tail, patternFrequency, PDict, matchPDict, countPDict, whichPDict, vmatchPDict, vcountPDict, vwhichPDict ) ### ========================================================================== ### STRING ALIGNMENT ### -------------------------------------------------------------------------- ### XStringPartialMatches-class.R ### XStringQuality-class.R ### QualityScaledXStringSet.R ### InDel-class.R ### AlignedXStringSet-class.R ### PairwiseAlignments-class.R ### PairwiseAlignmentsSingleSubject-class.R ### PairwiseAlignments-io.R ### align-utils.R ### pmatchPattern.R ### pairwiseAlignment.R ### stringDist.R ### needwunsQS.R ### MultipleAlignment.R exportClasses( XStringPartialMatches, XStringQuality, PhredQuality, SolexaQuality, IlluminaQuality, QualityScaledXStringSet, QualityScaledBStringSet, QualityScaledDNAStringSet, QualityScaledRNAStringSet, QualityScaledAAStringSet, InDel, AlignedXStringSet0, AlignedXStringSet, QualityAlignedXStringSet, PairwiseAlignments, PairwiseAlignmentsSingleSubject, PairwiseAlignmentsSingleSubjectSummary, MultipleAlignment, DNAMultipleAlignment, RNAMultipleAlignment, AAMultipleAlignment ) export( ## XStringPartialMatches-class.R: subpatterns, pattern, ## XStringQuality-class.R: PhredQuality, SolexaQuality, IlluminaQuality, ## QualityScaledXStringSet.R: quality, QualityScaledBStringSet, QualityScaledDNAStringSet, QualityScaledRNAStringSet, QualityScaledAAStringSet, ## InDel-class.R: insertion, deletion, ## AlignedXStringSet-class.R: unaligned, aligned, indel, nindel, ## PairwiseAlignments-class.R: PairwiseAlignments, type, pid, ## PairwiseAlignmentsSingleSubject-class.R: PairwiseAlignmentsSingleSubject, ## PairwiseAlignments-io.R: writePairwiseAlignments, ## align-utils.R: nedit, mismatchTable, mismatchSummary, compareStrings, ## pmatchPattern.R: lcprefix, lcsuffix, pmatchPattern, lcsubstr, ## pairwiseAlignment.R: nucleotideSubstitutionMatrix, errorSubstitutionMatrices, qualitySubstitutionMatrices, pairwiseAlignment, ## stringDist.R: stringDist, ## MultipleAlignment.R: DNAMultipleAlignment, RNAMultipleAlignment, AAMultipleAlignment, rowmask, "rowmask<-", colmask, "colmask<-", maskGaps, maskednrow, maskedncol, maskeddim, readDNAMultipleAlignment, readRNAMultipleAlignment, readAAMultipleAlignment, consensusViews, write.phylip, detail, ## Old stuff (Deprecated or Defunct): needwunsQS ) exportMethods( length, "[", rep, coerce, as.integer, as.numeric, as.character, as.matrix, toString, show, summary, start, end, width, Views, subpatterns, pattern, quality, encoding, insertion, deletion, unaligned, aligned, indel, nindel, type, score, pid, PairwiseAlignments, PairwiseAlignmentsSingleSubject, mismatch, nmatch, nmismatch, nedit, mismatchTable, mismatchSummary, coverage, compareStrings, lcprefix, lcsuffix, pmatchPattern, lcsubstr, pairwiseAlignment, stringDist, nchar, names, "names<-", "[[", narrow, consensusMatrix, consensusString, alphabetFrequency, as.list, rowmask, "rowmask<-", colmask, "colmask<-", maskGaps, maskednrow, maskedncol, maskeddim, consensusViews, ## Old stuff (Deprecated or Defunct): needwunsQS ) ### ========================================================================== ### STUFF THAT BELONGED ORIGINALLY TO OLD matchprobes PACKAGE AND IS NOW ### SUPERSEDED BY SOME NATIVE Biostrings FUNCTIONALITY ### -------------------------------------------------------------------------- ### matchprobes.R export( longestConsecutive, matchprobes ) Biostrings/NEWS0000644000126300012640000004170012227063322014760 0ustar00biocbuildphs_compbio************************************************** * 2.10 SERIES NEWS * ************************************************** BASIC CONTAINERS o Added a set of "coerce" methods for turning an arbitrary XStringSet object into a BStringSet, DNAStringSet, RNAStringSet or AAStringSet instance (via the as() function). o Added an "append" method for XStringSet objects. An important use case for this is to put together a set of short reads and their reverse complements in a single DNAStringSet object and then to turn this object into a single PDict object (dual PDict object). Then this dual PDict object can be used to walk each reference sequence only once (instead of twice) in order to get the hits in both strands (+ and -). o Removed the XStringList class and family. o Moved the IRanges, UnlockedIRanges, LockedIRanges, NormalIRanges, MaskCollection, Views, and XInteger classes and their methods to the new IRanges package. C-LEVEL FACILITIES UTILITIES o Added the codons() and translate() generic functions with methods for DNAString, RNAString, DNAStringSet, RNAStringSet, MaskedDNAString and MaskedRNAString objects. o Added the hasOnlyBaseLetters() and uniqueLetters() generic functions and methods. o Added fasta.info() for fast extraction of the descriptions and lengths of the sequences stored in a FASTA file. Also renamed the 'strip.desc' argument of readFASTA() -> 'strip.descs'. o Renamed replaceLetterAtLoc() -> replaceLetterAt() and renamed its 'loc' argument -> 'at'. Deprecated replaceLetterAtLoc(). o Added predefined 'RNA_GENETIC_CODE' object. o Moved the utility functions for importing a mask (read.agpMask(), read.gapMask(), read.liftMask(), read.rmMask() and read.trfMask() functions) to the new IRanges package. o Moved the generic functions for width(), shift(), restrict(), narrow(), reduce(), gaps(), reverse(), coverage(), subject(), views(), trim(), and subviews() to new IRanges package. STRING MATCHING o Added the vcountPDict() generic functions with a method for XStringSet objects. It is the vectorized version of countPDict() i.e. the subject must be an XStringSet object. o Added support for indels to matchPattern(), countPattern() and vcountPattern() (vmatchPattern() will follow as soon as MIndex objects support variable-width matches). o Added the vmatchPattern() and vcountPattern() generic functions with methods for XStringSet objects. They are the vectorized versions of matchPattern()/countPattern() i.e. the subject must be an XStringSet object (support for XStringViews objects will follow soon). o Added matchPWM() and countPWM() methods for XStringViews and MaskedDNAString objects. o Addition of the 'dups0' slot to the ByPos_MIndex class: this allows a more compact representation in memory of a ByPos_MIndex object that holds the hits of a set of patterns that has a lot of duplicates. The benefit is really noticeable when the patterns that are highly represented in the original dictionary have a lot of hits which seems to be typically the case when matching Solexa data against their reference genome. In this case, using the new 'dups0' slot can make the ByPos_MIndex object about 3 times smaller. Take advantage of this new 'dups0' slot to improve the way duplicated patterns are handle thru the "PDict -> matchPDict() -> MIndex" pipe. The new strategy is to "remove them as early as possible and put them back as late as possible". This leads to a gain in speed and also less memory is needed to store the hits in the temporary buffer. o Added the "whichPDict" generic function with a method for XString objects. o Major rework of the PDict class, subclasses and the PDict() constructor: - Merged the CWdna_PDict and TBdna_PDict classes into the TB_PDict class (subclass of the PDict VIRTUAL class), a new container for storing a Trusted Band PDict object. - There are now 2 types of preprocessing: the "ACtree" type (the default) and the "Twobit" type. - Added the MTB_PDict class (another subclass of the PDict VIRTUAL class), a container for storing a Multiple Trusted Band PDict object. - The methods defined for PDict objects are now: length, width, names, [[, head, tb, tb.width, tail, show, duplicated and patternFrequency. - Changed the signature of the PDict() constructor: no more 'drop.head' and 'drop.tail' args, and new 'tb.width' and 'type' args. See ?PDict for the details (especially for the limitations of each type of preprocessing). STRING ALIGNMENT o Added support for character vectors of any length and XStringSet objects to the pattern argument of the pairwiseAlignment function. o Added "subjectOverlap" and "patternOverlap" pairwise sequence alignments. o Added support for Solexa quality scores in pairwise sequence alignment calculations. o Added support for fuzzy mappings in quality-based pairwise sequence alignments. o Added a stringDist function to calculate the Levenshtein edit distance between elements of a character vector or XStringSet. o Added many methods for pairwise alignment objects including as.matrix, compareStrings, consensusMatrix, consensusString, coverage, mismatchSummary, mismatchTable, nindel, nmatch, nmismatch, pattern, pid, rep, subject, summary, toString, Views. o Removed the XStringAlign class and added classes PairwiseAlignment, PairwiseAlignmentSummary, AlignedXStringSet, QualityAlignedXStringSet, QualityScaledXStringSet, QualityScaledBStringSet, QualityScaledDNAStringSet, QualityScaledRNAStringSet, QualityScaledAAStringSet, XStringQuality, PhredQuality, and SolexaQuality. MISCELLANEOUS ************************************************** * 2.8 SERIES NEWS * ************************************************** BASIC CONTAINERS o Added 2 containers for handling masked sequences: - The MaskCollection container for storing a collection of masks that can be used to mask regions in a sequence. - The MaskedXString family of containers for storing masked sequences. o Added new containers for storing a big set of sequences: - The XStringSet family: BStringSet, DNAStringSet, RNAStringSet and AAStringSet (all direct XStringSet subtypes with no additional slots). - The XStringList family: BStringList, DNAStringList, RNAStringList and AAStringList (all direct XStringList subtypes with no additional slots). The 2 families are almost the same from a user point of view, but the internal representations and method implementations are very different. The XStringList family was a first attempt to address the problem of storing a big set of sequences in an efficient manner but its performance turned out to be disappointing. So the XStringSet family was introduced as a response to the poor performance of the XStringList container. The XStringList family might be removed soon. o Added the trim() function for trimming the "out of limits" views of an XStringViews object. o Added "restrict", "narrow", "reduce" and "gaps" generic functions with methods for IRanges and XStringViews objects. These functions provide basic transformations of an IRanges object into another IRanges object of the same class. Also added the toNormalIRanges() function for normalizing an IRanges object. o Added the "start<-", "width<-" and "end<-" generics with methods for UnlockedIRanges and Views objects. Also added the "update" method for UnlockedIRanges objects to provide a convenient way of combining multiple modifications of an UnlockedIRanges object into one single call. o Added the intToRanges() and intToAdjacentRanges() utility functions for creating an IRanges instance. o Added the IRanges, UnlockedIRanges, Views, LockedIRanges and NormalIRanges classes for representing a set of integer ranges + the "isNormal" and "whichFirstNotNormal" generic functions with methods for IRanges objects (see ?IRanges for the details). Changed the definition of the XStringViews class so now it derives from the Views class. o Versatile constructor RNAString() (resp. DNAString()) now converts from DNA to RNA (resp. RNA to DNA) by replacing T by U (resp. U by T) instead of trying to mimic transcription. This conversion is still performed without copying the sequence data and thus remains very fast. Also the semantic of comparing RNA with DNA has been changed to remain consistent with the new semantic of RNAString() and DNAString() e.g. RNAString("UUGAAAA-CUC-N") is considered equal to DNAString("TTGAAAA-CTC-N"). o Added support for empty XString objects. o Added the XString() versatile constructor (it's a generic function with methods for character and XString objects). The BString(), DNAString(), RNAString() and AAString() constructors are now based on it. o Renamed subBString() -> subXString() and deprecated subBString(). o Renamed the BStringViews class -> XStringViews. o Reorganized the hierarchy of the BString class and subclasses by adding the XString virtual class: now the BString, DNAString, RNAString and AAString classes are all direct XString subtypes with no additional slots. Most importantly, they are all at the same level in the new hierarchy i.e. DNAString, RNAString and AAString objects are NOT BString objects anymore. C-LEVEL FACILITIES o Started the Biostrings C interface (work-in-progress). See inst/include/Biostrings_interface.h for how to use it in your package. UTILITIES o Added "reverse" methods for IRanges, NormalIRanges, MaskCollection and MaskedXString objects, and "complement" and "reverseComplement" methods for MaskedDNAString and MaskedRNAString objects. o Added the coverage() generic function with methods for IRanges, MaskCollection, XStringViews, MaskedXString and MIndex objects. o Added the injectHardMask() generic function for "hard masking" a sequence. o Added the maskMotif() generic function for masking a sequence by content. o Added utility functions for importing a mask: - read.agpMask(): read mask from an NCBI "agp" file; - read.gapMask(): read mask from an UCSC "gap" file; - read.liftMask(): read mask from an UCSC "lift" file; - read.rmMask(): read mask from a RepeatMasker .out file; - read.trfMask(): read mask from a Tandem Repeats Finder .bed file. o Added the subseq() generic function with methods for XString and MaskedXString objects. o Added functions read.BStringSet(), read.DNAStringSet(), read.RNAStringSet(), read.AAStringSet() and write.XStringSet(). read.BStringSet() and family is now preferred over read.XStringViews() for loading a FASTA file into R. Renamed helper function BStringViewsToFASTArecords() -> XStringSetToFASTArecords(). o Added the replaceLetterAtLoc() generic function with a method for DNAString objects (methods for other types of objects might come later) for making a copy of a sequence where letters are replaced by new letters at some specified locations. o Added the chartr() generic function with methods for XString, XStringSet and XStringViews objects. o Made the "show" methods for XString, XStringViews and XStringAlign objects "getOption('width') aware" so that the user can control the width of the output they produce. o Added the dinucleotideFrequency(), trinucleotideFrequency(), oligonucleotideFrequency(), strrev() and mkAllStrings() functions. o Four changes in alphabetFrequency(): (1) when used with 'baseOnly=TRUE', the frequency of the gap letter ("-") is not returned anymore (now it's treated as any 'other' letter i.e. any non-base letter); (2) added the 'freq' argument; (3) added the 'collapse' argument; (4) made it 1000x faster on XStringSet and XStringViews objects. o Added "as.character" and "consmat" methods for XStringAlign objects. o Added the patternFrequency() generic function with a method for CWdna_PDict objects (will come later for TBdna_PDict objects). o Added a "duplicated" method for CWdna_PDict objects (will come later for TBdna_PDict objects). o Added "reverse" method for XStringSet objects, and "complement" and "reverseComplement" methods for DNAStringSet and RNAStringSet objects. They all preserve the names. o reverse(), complement() and reverseComplement() now preserve the names when applied to an XStringViews object. o By Robert: Added the dna2rna(), rna2dna(), transcribe() and cDNA() functions + a "reverseComplement" method for RNAString objects. o Added the mergeIUPACLetters() utility function. STRING MATCHING o matchPattern.Rnw vignette replaced by much improved GenomeSearching.Rnw vignette (still a work-in-progress). o Added "matchPDict" methods for XStringViews and MaskedXString objects (only for a DNA input sequence). o Added support in matchPDict() for IUPAC ambiguities in the subject i.e. it will treat them as wildcards when called with 'fixed=FALSE' on a Trusted Band dict or with 'fixed=c(pattern=TRUE, subject=FALSE)' on any dict. o Added support in matchPDict() for inexact matching of a dictionary with "trusted prefixes". See ?`matchPDict-inexact` for the details. o Implemented the "shortcut feature" to C function CWdna_exact_search(). With this patch, using matchPDict() to find all the matches of a 3.3M 32-mers dictionary in the full Human genome (+ and - strands of all chromosomes) is about 2.5x faster than before (will take between 20 minutes and 2 hours depending on your machine and the number of matches found). This puts matchPDict() at the same level as the Vmatch software (http://www.vmatch.de/) for a dictionary of this size. Memory footprint for matchPDict() is about 2GB for the Aho-Corasick tree built from the 3.3M 32-mers dictionary. Building this tree is still very fast (2 or 3 minutes) (Vmatch needs 60G of disk space to build all its suffix arrays, don't know how long it takes for this, don't know what's the memory footprint either when they are loaded into memory but it looks like it is several gigabytes). matchPDict() only works with a dictionary of DNA patterns where all the patterns have the same number of nucleotides and it does only exact matching for now (Vmatch doesn't have this kind of limitations). o matchPDict() now returns an MIndex object (new class) instead of a list of integer vectors. The user can then extract the starts or the ends of the matches with startIndex() or endIndex(), extract the number of matches per pattern with countIndex(), extract the matches for a given pattern with [[, put all the matches in a single IRanges object with unlist() or convert this MIndex object into a set of views on the original subject with extractAllMatches(). Other functions can be added later in order to provide a wider choice of extraction/conversion tools if necessary. WARNING: This is still a work-in-progress. Function names and semantics are not yet stabilized! o Added the matchPDict() and countPDict() functions for efficiently finding (or just counting) all occurrences in a text (the subject) of any pattern from a set of patterns (the dictionary). The types of pattern dictionaries currently supported are constant width DNA dictionaries (CWdna_PDict objects) and "Trusted Prefix" DNA dictionaries (a particular case of "Trusted Band" DNA dictionaries, represented by TBdna_PDict objects). See ?matchPDict for the details (especially the current limitations). o Added basic support for palindrome finding: it can be achieved with the new findPalindromes() and findComplementedPalindromes() functions. Also added related utility functions palindromeArmLength(), palindromeLeftArm(), palindromeRightArm(), complementedPalindromeArmLength(), complementedPalindromeLeftArm() and complementedPalindromeRightArm(). o Added basic support for Position Weight Matrix matching thru the new matchPWM() and countPWM() functions. Also added related utility functions maxWeights(), maxScore() and PWMscore(). o Added "matchLRPatterns" and "matchProbePair" methods for XStringViews objects. o Added the nmismatchStartingAt(), nmismatchEndingAt() and isMatching() functions. o Change in terminology to align with established practices: "fuzzy matching" is now called "inexact matching". This change mostly affects the documentation. The only place where it also affects the API is that now 'algo="naive-inexact"' must be used instead of 'algo="naive-fuzzy"' when calling the matchPattern() function or any other function that has the 'algo' argument. o Renamed the 'mismatch' arg -> 'max.mismatch' for the matchPattern(), matchLRPatterns() and matchPDict() functions. MISCELLANEOUS o Renamed some files in inst/extdata/ to use the same extension (.fa) for all FASTA files. o Renamed Exfiles/ folder as extdata/ and put back fastaEx in it (from Biostrings 1). o Changed license from LGPL to Artistic-2.0 ************************************************** * 2.6 SERIES NEWS * ************************************************** o Added the matchLRPatterns() function for finding in a sequence patterns that are defined by a left and a right part. See ?matchLRPatterns for the details. Biostrings/R/0000755000126300012640000000000012241013560014453 5ustar00biocbuildphs_compbioBiostrings/R/00datacache.R0000644000126300012640000000250012227063307016640 0ustar00biocbuildphs_compbio### ========================================================================= ### Environment for storing run-time objects ### RTobjs <- new.env(hash=TRUE, parent=emptyenv()) ### ========================================================================= ### Serialized objects ### SERIALIZED_OBJNAMES <- c( "BLOSUM45", "BLOSUM50", "BLOSUM62", "BLOSUM80", "BLOSUM100", "PAM30", "PAM40", "PAM70", "PAM120", "PAM250" ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Objects created "on-the-fly" (not serialized) ### ### WARNING: Improper calls to 'getdata' by the 'createObject' function can ### lead to infinite recursive loops! ### createObject <- function(objname) { # add more here... stop("don't know how to create object '", objname, "'") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "getdata" function (NOT exported) ### datacache <- new.env(hash=TRUE, parent=emptyenv()) getdata <- function(objname) { if (!exists(objname, envir=datacache)) { if (objname %in% SERIALIZED_OBJNAMES) { data(list=objname, package="Biostrings", envir=datacache) } else { assign(objname, createObject(objname), envir=datacache) } } get(objname, envir=datacache) } Biostrings/R/AMINO_ACID_CODE.R0000644000126300012640000000170612227063307017027 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The Single-Letter Amino Acid Code. ### AMINO_ACID_CODE <- c( A="Ala", # Alanine R="Arg", # Arginine N="Asn", # Asparagine D="Asp", # Aspartic Acid C="Cys", # Cysteine Q="Gln", # Glutamine E="Glu", # Glutamic Acid G="Gly", # Glycine H="His", # Histidine I="Ile", # Isoleucine L="Leu", # Leucine K="Lys", # Lysine M="Met", # Methionine F="Phe", # Phenylalanine P="Pro", # Proline S="Ser", # Serine T="Thr", # Threonine W="Trp", # Tryptophan Y="Tyr", # Tyrosine V="Val", # Valine ## Not coded for directly in the genetic code: U="Sec", # Selenocysteine ## Ambiguities: B="Asx", # Asparagine or Aspartic Acid Z="Glx", # Glutamine or Glutamic acid X="Xaa" # Any amino acid ) ### Amino Acid alphabet ("*" is a translation stop) AA_ALPHABET <- c(names(AMINO_ACID_CODE), "*", "-", "+") Biostrings/R/AlignedXStringSet-class.R0000644000126300012640000001540112227063307021250 0ustar00biocbuildphs_compbio### ========================================================================= ### AlignedXStringSet objects ### ------------------------------------------------------------------------- ### An AlignedXStringSet object contains an alignment. ### ### NOTE: Because the 'unaligned' slot of an AlignedXStringSet object ### must not be a QualityScaledXStringSet object (see Validity below), then ### the QualityAlignedXStringSet class cannot contain the AlignedXStringSet ### class. Otherwise, any QualityAlignedXStringSet object would be invalid! setClass("AlignedXStringSet0", representation( "VIRTUAL", unaligned="XStringSet", range="IRanges", mismatch="CompressedIntegerList", indel="CompressedIRangesList" ) ) setClass("AlignedXStringSet", contains="AlignedXStringSet0") setClass("QualityAlignedXStringSet", contains="AlignedXStringSet0", representation( unaligned="QualityScaledXStringSet" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.AlignedXStringSet0 <- function(object) { message <- NULL if (length(object@range) != length(mismatch(object))) message <- c(message, "length(range) != length(mismatch)") if (length(mismatch(object)) != length(indel(object))) message <- c(message, "length(mismatch) != length(indel)") if (!(length(object@unaligned) %in% c(1, length(object@range)))) message <- c(message, "length(unaligned) != 1 or length(range)") message } setValidity("AlignedXStringSet0", function(object) { problems <- .valid.AlignedXStringSet0(object) if (is.null(problems)) TRUE else problems } ) .valid.AlignedXStringSet <- function(object) { message <- NULL if (is(object@unaligned, "QualityScaledXStringSet")) message <- c(message, "'unaligned' must not be a QualityScaledXStringSet object") message } setValidity("AlignedXStringSet", function(object) { problems <- .valid.AlignedXStringSet(object) if (is.null(problems)) TRUE else problems } ) .valid.QualityAlignedXStringSet <- function(object) { message <- NULL ## FIXME: surely something different is meant here because the ## QualityAlignedXStringSet class has no 'quality' slot! #if (!(length(object@quality) %in% c(1, length(object@range)))) # message <- c(message, "length(quality) != 1 or length(range)") message } setValidity("QualityAlignedXStringSet", function(object) { problems <- .valid.QualityAlignedXStringSet(object) if (is.null(problems)) TRUE else problems } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor methods. ### setGeneric("unaligned", function(x) standardGeneric("unaligned")) setMethod("unaligned", "AlignedXStringSet0", function(x) x@unaligned) setGeneric("aligned", function(x, ...) standardGeneric("aligned")) setMethod("aligned", "AlignedXStringSet0", function(x, degap = FALSE) { if (degap) { if (length(unaligned(x)) == 1) { value <- Views(unaligned(x)[[1]], start=start(x@range), end=end(x@range)) } else { value <- narrow(as(unaligned(x), "XStringSet"), start=start(x@range), end=end(x@range)) } } else { codecX <- xscodec(x) if (is.null(codecX)) { gapCode <- charToRaw("-") } else { letters2codes <- codecX@codes names(letters2codes) <- codecX@letters gapCode <- as.raw(letters2codes[["-"]]) } value <- .Call2("AlignedXStringSet_align_aligned", x, gapCode, PACKAGE="Biostrings") } value }) setMethod("start", "AlignedXStringSet0", function(x) start(x@range)) setMethod("end", "AlignedXStringSet0", function(x) end(x@range)) setMethod("width", "AlignedXStringSet0", function(x) width(x@range)) setGeneric("indel", function(x) standardGeneric("indel")) setMethod("indel", "AlignedXStringSet0", function(x) x@indel) setGeneric("nindel", function(x) standardGeneric("nindel")) setMethod("nindel", "AlignedXStringSet0", function(x) summary(indel(x))) setMethod("length", "AlignedXStringSet0", function(x) length(x@range)) setMethod("nchar", "AlignedXStringSet0", function(x, type="chars", allowNA=FALSE) .Call2("AlignedXStringSet_nchar", x, PACKAGE="Biostrings")) setMethod("seqtype", "AlignedXStringSet0", function(x) seqtype(unaligned(x))) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### ### TODO: Make the "show" method to format the alignment in a SGD fashion ### i.e. split in 60-letter blocks and use the "|" character to highlight ### exact matches. setMethod("show", "AlignedXStringSet0", function(object) { if (length(object) == 0) cat("Empty ", class(object), "\n", sep = "") else { if (length(object) > 1) cat(class(object), " (1 of ", length(object), ")\n", sep = "") if (width(object)[1] == 0) cat("[1] \"\"\n") else cat(paste("[", start(object)[1], "]", sep = ""), toSeqSnippet(aligned(object)[[1]], getOption("width") - 8), "\n") } } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "as.character" method. ### setMethod("as.character", "AlignedXStringSet0", function(x) { as.character(aligned(x)) } ) setMethod("toString", "AlignedXStringSet0", function(x, ...) toString(as.character(x), ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting. ### setMethod("[", "AlignedXStringSet0", function(x, i, j, ..., drop) { if (!missing(j) || length(list(...)) > 0) stop("invalid subsetting") if (missing(i) || (is.logical(i) && all(i))) return(x) if (is.logical(i)) i <- which(i) if (!is.numeric(i) || any(is.na(i))) stop("invalid subsetting") if (any(i < 1) || any(i > length(x))) stop("subscript out of bounds") new(class(x), unaligned = .safe.subset.XStringSet(x@unaligned, i), range = x@range[i,,drop = FALSE], mismatch = x@mismatch[i], indel = x@indel[i]) } ) setReplaceMethod("[", "AlignedXStringSet0", function(x, i, j,..., value) { stop("attempt to modify the value of a ", class(x), " instance") } ) setMethod("rep", "AlignedXStringSet0", function(x, times) x[rep.int(seq_len(length(x)), times)] ) Biostrings/R/GENETIC_CODE.R0000644000126300012640000000225712227063307016464 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The Standard Genetic Code ### From the "coding DNA strand" (aka "sense DNA strand" or "non-template DNA ### strand"). GENETIC_CODE <- c( TTT="F", TTC="F", TTA="L", TTG="L", TCT="S", TCC="S", TCA="S", TCG="S", TAT="Y", TAC="Y", TAA="*", TAG="*", TGT="C", TGC="C", TGA="*", TGG="W", CTT="L", CTC="L", CTA="L", CTG="L", CCT="P", CCC="P", CCA="P", CCG="P", CAT="H", CAC="H", CAA="Q", CAG="Q", CGT="R", CGC="R", CGA="R", CGG="R", ATT="I", ATC="I", ATA="I", ATG="M", ACT="T", ACC="T", ACA="T", ACG="T", AAT="N", AAC="N", AAA="K", AAG="K", AGT="S", AGC="S", AGA="R", AGG="R", GTT="V", GTC="V", GTA="V", GTG="V", GCT="A", GCC="A", GCA="A", GCG="A", GAT="D", GAC="D", GAA="E", GAG="E", GGT="G", GGC="G", GGA="G", GGG="G" ) ### From the "RNA transcript". RNA_GENETIC_CODE <- GENETIC_CODE names(RNA_GENETIC_CODE) <- chartr("T", "U", names(GENETIC_CODE)) Biostrings/R/IUPAC_CODE_MAP.R0000644000126300012640000000202512227063307016735 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The IUPAC extended genetic alphabet. ### IUPAC_CODE_MAP <- c( A="A", C="C", G="G", T="T", M="AC", R="AG", W="AT", S="CG", Y="CT", K="GT", V="ACG", H="ACT", D="AGT", B="CGT", N="ACGT" ) mergeIUPACLetters <- function(x) { if (!is.character(x) || any(is.na(x)) || any(nchar(x) == 0)) stop("'x' must be a vector of non-empty character strings") if (length(x) == 0) return(character(0)) IUPAC_code_revmap <- names(IUPAC_CODE_MAP) names(IUPAC_code_revmap) <- IUPAC_CODE_MAP toAmbiguity <- function(xx) { all_bases <- unique(unlist(strsplit(IUPAC_CODE_MAP[xx], "", fixed=TRUE))) if (any(is.na(all_bases))) stop("some strings in 'x' contain non IUPAC letters") ans <- IUPAC_code_revmap[paste(sort(all_bases), collapse="")] names(ans) <- NULL ans } sapply(strsplit(toupper(x), "", fixed=TRUE), toAmbiguity) } Biostrings/R/InDel-class.R0000644000126300012640000000126312227063307016706 0ustar00biocbuildphs_compbio### ========================================================================== ### InDel objects ### -------------------------------------------------------------------------- ### An InDel object contains the insertion and deletion information. setClass("InDel", representation( insertion="ANY", deletion="ANY" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor methods. ### setGeneric("insertion", function(x) standardGeneric("insertion")) setMethod("insertion", "InDel", function(x) x@insertion) setGeneric("deletion", function(x) standardGeneric("deletion")) setMethod("deletion", "InDel", function(x) x@deletion) Biostrings/R/MIndex-class.R0000644000126300012640000002044112227063307017076 0ustar00biocbuildphs_compbio### ========================================================================= ### MIndex objects ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "MIndex" VIRTUAL class. ### ### This class serves as a base class for a family of match containers that ### can be manipulated thru a common API. This common API is the MIndex API ### defined in this section. ### Note that, in normal operations, the user should never need to create ### MIndex objects directly or to modify existing ones. Those objects are ### typically returned by a sequence matching/alignment function like ### vmatchPattern() or matchPDict(). ### setClass("MIndex", contains="IRangesList", representation( "VIRTUAL", width0="integer", NAMES="characterORNULL" ) ) setMethod("length", "MIndex", function(x) length(x@width0)) setGeneric("width0", function(x) standardGeneric("width0")) setMethod("width0", "MIndex", function(x) x@width0) setMethod("names", "MIndex", function(x) x@NAMES) setReplaceMethod("names", "MIndex", function(x, value) stop("attempt to modify the names of a ", class(x), " instance") ) setGeneric("startIndex", function(x) standardGeneric("startIndex")) setGeneric("endIndex", function(x) standardGeneric("endIndex")) setMethod("elementLengths", "MIndex", function(x) elementLengths(endIndex(x)) ) setGeneric("countIndex", function(x) standardGeneric("countIndex")) setMethod("countIndex", "MIndex", function(x) elementLengths(x)) setMethod("unlist", "MIndex", function(x, recursive=TRUE, use.names=TRUE) { use.names <- normargUseNames(use.names) start_index <- startIndex(x) ans_start <- unlist(start_index, recursive=FALSE, use.names=FALSE) if (is.null(ans_start)) ans_start <- integer(0) end_index <- endIndex(x) ans_end <- unlist(end_index, recursive=FALSE, use.names=FALSE) if (is.null(ans_end)) ans_end <- integer(0) if (use.names) { ans_names <- names(x) if (!is.null(ans_names)) ans_names <- rep.int(ans_names, times=sapply(end_index, length)) } else { ans_names <- NULL } ans_width <- ans_end - ans_start + 1L ans <- new2("IRanges", start=ans_start, width=ans_width, check=FALSE) names(ans) <- ans_names ans } ) .fromMIndexToCompressedIRangesList <- function(from) { ans <- relist(unlist(from, use.names=FALSE), from) names(ans) <- names(from) ans } setAs("MIndex", "CompressedIRangesList", .fromMIndexToCompressedIRangesList) extractAllMatches <- function(subject, mindex) { if (is(subject, "MaskedXString")) subject <- unmasked(subject) else if (!is(subject, "XString")) stop("'subject' must be an XString or MaskedXString object") if (!is(mindex, "MIndex")) stop("'mindex' must be an MIndex object") allviews <- unlist(mindex) ans <- unsafe.newXStringViews(subject, start(allviews), width(allviews)) names(ans) <- names(allviews) ans } setMethod("show", "MIndex", function(object) { cat("MIndex object of length ", length(object), "\n", sep="") irl <- as(object, "CompressedIRangesList") IRanges:::showRangesList(irl, with.header=FALSE) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "ByPos_MIndex" class. ### setClass("ByPos_MIndex", contains="MIndex", representation( dups0="Dups", ends="list" # same length as the "width0" slot ) ) setMethod("[[", "ByPos_MIndex", function(x, i, j, ...) { i <- IRanges:::normalizeDoubleBracketSubscript(i, x) if (length(x@dups0) != 0 && !is.na(i2 <- high2low(x@dups0)[i])) i <- i2 ans_end <- x@ends[[i]] if (is.null(ans_end)) ans_end <- integer(0) ans_width <- rep.int(x@width0[i], length(ans_end)) ans_start <- ans_end - x@width0[i] + 1L new2("IRanges", start=ans_start, width=ans_width, check=FALSE) } ) ### An example of a ByPos_MIndex object of length 5 where only the ### 2nd and 5th pattern have matches: ### > width0 <- c(9L, 10L, 8L, 4L, 10L) ### > dups0 <- Dups(c(NA, NA, NA, NA, 2)) ### > ends <- vector(mode="list", length=5) ### > ends[[2]] <- c(199L, 402L) ### > mindex <- new("ByPos_MIndex", width0=width0, NAMES=letters[1:5], dups0=dups0, ends=ends) ### > mindex[[1]] ### > mindex[[2]] ### > mindex[[6]] # Error in mindex[[6]] : subscript out of bounds ### > startIndex(mindex) ### > endIndex(mindex) ### > countIndex(mindex) ### setMethod("startIndex", "ByPos_MIndex", function(x) { .Call2("ByPos_MIndex_endIndex", high2low(x@dups0), x@ends, x@width0, PACKAGE="Biostrings") } ) setMethod("endIndex", "ByPos_MIndex", function(x) { .Call2("ByPos_MIndex_endIndex", high2low(x@dups0), x@ends, NULL, PACKAGE="Biostrings") } ) ByPos_MIndex.combine <- function(mi_list) { if (length(mi_list) == 0) stop("cannot combine an empty list of MIndex objects") ## 'mi_list[[i]]@width0' should be identical for any 'i'. We don't check ## this! ans_width0 <- mi_list[[1L]]@width0 ## 'names(mi_list[[i]])' should be identical for any 'i'. We don't check ## this! ans_names <- names(mi_list[[1L]]) ends_listlist <- lapply(mi_list, function(mi) mi@ends) #mergeEnds <- function(...) #{ # ans <- unlist(list(...), recursive=FALSE, use.names=FALSE) # if (is.null(ans)) # return(NULL) # sort(unique(ans)) #} #args <- c(list(FUN=mergeEnds), ends_listlist, list(SIMPLIFY=FALSE)) #ans_ends <- do.call(mapply, args) ans_ends <- .Call2("ByPos_MIndex_combine", ends_listlist, PACKAGE="Biostrings") new("ByPos_MIndex", width0=ans_width0, NAMES=ans_names, ends=ans_ends) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "SparseMIndex" class (DISABLED FOR NOW). ### ### Slot description: ### ### ends_envir: a key-value list (environment) where the values are integer ### vectors containing the ending positions of the pattern whose ### position in the original dictionary is given by the key (the keys are ### strings representing positive integers). ### if (FALSE) { setClass("SparseMIndex", contains="MIndex", representation( ends_envir="environment" ) ) setMethod("show", "SparseMIndex", function(object) { cat("Sparse MIndex object of length ", length(object), "\n", sep="") } ) setMethod("[[", "SparseMIndex", function(x, i, j, ...) { i <- IRanges:::normalizeDoubleBracketSubscript(i, x) ans_end <- x@ends_envir[[formatC(i, width=10, format="d", flag="0")]] if (is.null(ans_end)) ans_end <- integer(0) ans_width <- rep.int(x@width0[i], length(ans_end)) ans_start <- ans_end - x@width0[i] + 1L new2("IRanges", start=ans_start, width=ans_width, check=FALSE) } ) ### An example of a SparseMIndex object of length 5 where only the ### 2nd pattern has matches: ### > width0 <- c(9L, 10L, 8L, 4L, 10L) ### > ends_envir <- new.env(hash=TRUE, parent=emptyenv()) ### > ends_envir[['0000000002']] <- c(199L, 402L) ### > mindex <- new("SparseMIndex", width0=width0, NAMES=letters[1:5], ends_envir=ends_envir) ### > mindex[[1]] ### > mindex[[2]] ### > mindex[[6]] # Error in mindex[[6]] : subscript out of bounds ### > names(mindex) ### > mindex[["a"]] ### > mindex[["b"]] ### > mindex[["aa"]] # Error in mindex[["aa"]] : pattern name ‘aa’ not found ### > startIndex(mindex) ### > endIndex(mindex) ### > countIndex(mindex) ### setMethod("startIndex", "SparseMIndex", function(x) { all.names <- TRUE .Call2("SparseMIndex_endIndex", x@ends_envir, x@width0, x@NAMES, all.names, PACKAGE="Biostrings") } ) setMethod("endIndex", "SparseMIndex", function(x) { all.names <- TRUE .Call2("SparseMIndex_endIndex", x@ends_envir, NULL, x@NAMES, all.names, PACKAGE="Biostrings") } ) } Biostrings/R/MaskedXString-class.R0000644000126300012640000002532612227063307020444 0ustar00biocbuildphs_compbio### ========================================================================= ### MaskedXString objects ### ------------------------------------------------------------------------- ### ### Note that thinking of MaskedXString objects as particular XString objects ### might seem natural and therefore making the MaskedXString class an ### extension of the XString class is tempting... But in the end there would ### be no benefit in doing so because inheritance would not give us ### anything good out-of-the-box. This is because almost all XString methods ### are doing the wrong thing for MaskedXString objects and hence would need ### to be overwritten so it would not save us any work. Furthermore, some of ### the XString methods should be disabled for MaskedXString objects. But if ### MaskedXString objects are considered XString objects, then these methods ### need to be overwritten and call stop() so that they fail on MaskedXString ### objects. By not making the MaskedXString class an extension of the XString ### class, we avoid all this mess. ### ### Not good (MaskedXString extends XString). #setClass("MaskedXString", # contains="XString", # representation( # "VIRTUAL", # masks="MaskCollection" # ) #) ### 4 direct "MaskedXString" derivations (no additional slot) #setClass("MaskedBString", contains=c("MaskedXString", "BString")) #setClass("MaskedDNAString", contains=c("MaskedXString", "DNAString")) #setClass("MaskedRNAString", contains=c("MaskedXString", "RNAString")) #setClass("MaskedAAString", contains=c("MaskedXString", "AAString")) ### Better (MaskedXString does NOT extend XString). setClass("MaskedXString", representation( "VIRTUAL", unmasked="XString", masks="MaskCollection" ) ) setClass("MaskedBString", contains="MaskedXString", representation( unmasked="BString" ) ) setClass("MaskedDNAString", contains="MaskedXString", representation( unmasked="DNAString" ) ) setClass("MaskedRNAString", contains="MaskedXString", representation( unmasked="RNAString" ) ) setClass("MaskedAAString", contains="MaskedXString", representation( unmasked="AAString" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor-like methods. ### setGeneric("unmasked", function(x) standardGeneric("unmasked")) setMethod("unmasked", "MaskedXString", function(x) x@unmasked) setGeneric("masks", function(x) standardGeneric("masks")) setMethod("masks", "XString", function(x) NULL) setMethod("masks", "MaskedXString", function(x) x@masks) setMethod("length", "MaskedXString", function(x) length(unmasked(x))) setMethod("maskedwidth", "MaskedXString", function(x) maskedwidth(collapse(masks(x)))) setMethod("maskedratio", "MaskedXString", function(x) maskedratio(collapse(masks(x)))) setMethod("nchar", "MaskedXString", function(x, type="chars", allowNA=FALSE) { length(x) - maskedwidth(x) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.MaskedXString.unmasked <- function(object) { if (!is(unmasked(object), "XString")) return("the 'unmasked' slot must contain an XString object") if (!is(object, paste("Masked", xsbaseclass(object), sep=""))) return("bad XString base type for the unmasked sequence") if (length(object) != width(masks(object))) return("the length of the object and the width of the mask collection differ") NULL } .valid.MaskedXString.masks <- function(object) { masks <- masks(object) if (!is(masks, "MaskCollection")) return("the 'masks' slot must contain a MaskCollection object") if (width(masks) != length(object)) return("the length of the object and the width of the mask collection differ") NULL } .valid.MaskedXString <- function(object) { c(.valid.MaskedXString.unmasked(object), .valid.MaskedXString.masks(object)) } setValidity("MaskedXString", function(object) { problems <- .valid.MaskedXString(object) if (is.null(problems)) TRUE else problems } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "seqtype" and "seqtype<-" methods. ### setMethod("seqtype", "MaskedXString", function(x) seqtype(unmasked(x))) ### Downgrades 'x' to a MaskedB/DNA/RNA/AAString instance! setReplaceMethod("seqtype", "MaskedXString", function(x, value) { ## could be done with 'seqtype(unmasked(x)) <- value' ## if `unmasked<-` was available unmasked <- unmasked(x) seqtype(unmasked) <- value ans_class <- paste("Masked", value, "String", sep="") new(ans_class, unmasked=unmasked, masks=masks(x)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### ### From MaskedXString objects to MaskedXString objects. setAs("MaskedXString", "MaskedBString", function(from) {seqtype(from) <- "B"; from} ) setAs("MaskedXString", "MaskedDNAString", function(from) {seqtype(from) <- "DNA"; from} ) setAs("MaskedXString", "MaskedRNAString", function(from) {seqtype(from) <- "RNA"; from} ) setAs("MaskedXString", "MaskedAAString", function(from) {seqtype(from) <- "AA"; from} ) ### From XString objects to MaskedXString objects. setAs("BString", "MaskedBString", function(from) { masks <- new("MaskCollection", width=length(from)) new("MaskedBString", unmasked=from, masks=masks) } ) setAs("DNAString", "MaskedDNAString", function(from) { masks <- new("MaskCollection", width=length(from)) new("MaskedDNAString", unmasked=from, masks=masks) } ) setAs("RNAString", "MaskedRNAString", function(from) { masks <- new("MaskCollection", width=length(from)) new("MaskedRNAString", unmasked=from, masks=masks) } ) setAs("AAString", "MaskedAAString", function(from) { masks <- new("MaskCollection", width=length(from)) new("MaskedAAString", unmasked=from, masks=masks) } ) ### From MaskedXString objects to XString objects. setAs("MaskedBString", "BString", function(from) unmasked(from) ) setAs("MaskedDNAString", "DNAString", function(from) unmasked(from) ) setAs("MaskedRNAString", "RNAString", function(from) unmasked(from) ) setAs("MaskedAAString", "AAString", function(from) unmasked(from) ) ### Dispatch on 'x' (see generic in XString-class.R). setMethod("XString", "MaskedXString", function(seqtype, x, start=NA, end=NA, width=NA) XString(seqtype, unmasked(x), start=start, end=end, width=width) ) ### From a MaskedXString object to a MaskCollection object. setAs("MaskedXString", "MaskCollection", function(from) masks(from) ) ### From a MaskedXString object to a NormalIRanges object. setAs("MaskedXString", "NormalIRanges", function(from) as(masks(from), "NormalIRanges") ) ### From a MaskedXString object to an XStringViews object. setAs("MaskedXString", "XStringViews", function(from) { views <- gaps(collapse(masks(from)))[[1]] unsafe.newXStringViews(unmasked(from), start(views), width(views)) } ) setAs("MaskedXString", "Views", function(from) as(from, "XStringViews")) ### NOT exported. toXStringViewsOrXString <- function(x) { x0 <- unmasked(x) mask1 <- collapse(masks(x)) if (isEmpty(mask1)) return(x0) views <- gaps(mask1)[[1]] unsafe.newXStringViews(x0, start(views), width(views)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The transformation methods (endomorphisms) "collapse" and "gaps". ### setMethod("collapse", "MaskedXString", function(x) { x@masks <- collapse(masks(x)) x } ) ### 'start' and 'end' are ignored. setMethod("gaps", "MaskedXString", function(x, start=NA, end=NA) { x@masks <- gaps(collapse(masks(x))) x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "subseq" method for MaskedXString objects. ### ### This method is used by the toSeqSnippet() function when called ### on a MaskedXString object. ### setMethod("subseq", "MaskedXString", function(x, start=NA, end=NA, width=NA) { x@unmasked <- subseq(unmasked(x), start=start, end=end, width=width) x@masks <- narrow(masks(x), start=start, end=end, width=width) x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "as.character" and "toString" methods. ### ### This method is used by the toSeqSnippet() function when called ### on a MaskedXString object. setMethod("as.character", "MaskedXString", function(x) { ans <- as.character(unmasked(x)) nir0 <- as(x, "NormalIRanges") for (i in seq_len(length(nir0))) { strip <- paste(rep.int("#", width(nir0)[i]), collapse="") substr(ans, start(nir0)[i], end(nir0)[i]) <- strip } ans } ) setMethod("toString", "MaskedXString", function(x, ...) as.character(x)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### setMethod("show", "MaskedXString", function(object) { lo <- length(object) cat(" ", lo, "-letter \"", class(object), "\" instance (# for masking)\n", sep="") cat("seq:", toSeqSnippet(object, getOption("width") - 5)) cat("\n") MaskCollection.show_frame(masks(object)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "masks<-" replacement methods. ### setGeneric("masks<-", function(x, value) standardGeneric("masks<-")) ### Setting the masks of a MaskedXString object... setReplaceMethod("masks", signature(x="MaskedXString", value="NULL"), function(x, value) unmasked(x) ) setReplaceMethod("masks", signature(x="MaskedXString", value="MaskCollection"), function(x, value) { if (width(value) != length(x)) stop("the width of the mask collection must be equal ", "to the length of the sequence") x@masks <- value x } ) ### Setting the masks of an XString object... setReplaceMethod("masks", signature(x="XString", value="NULL"), function(x, value) x ) setReplaceMethod("masks", signature(x="XString", value="ANY"), function(x, value) { x <- as(x, paste("Masked", xsbaseclass(x), sep="")) masks(x) <- value x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "Views" method. ### setMethod("Views", "MaskedXString", function(subject, start=NULL, end=NULL, width=NULL, names=NULL) { if (any(active(masks(subject)))) warning("masks were dropped") Views(unmasked(subject), start=start, end=end, width=width, names=names) } ) Biostrings/R/MultipleAlignment.R0000644000126300012640000007036512241013560020243 0ustar00biocbuildphs_compbio### ========================================================================= ### MultipleAlignment objects ### ------------------------------------------------------------------------- ### ## virtual class for multiple alignments setClass("MultipleAlignment", representation("VIRTUAL", unmasked="XStringSet", rowmask="NormalIRanges", colmask="NormalIRanges") ) ## concrete classes for multiple alignments setClass("DNAMultipleAlignment", contains="MultipleAlignment", representation=representation(unmasked="DNAStringSet") ) setClass("RNAMultipleAlignment", contains="MultipleAlignment", representation=representation(unmasked="RNAStringSet") ) setClass("AAMultipleAlignment", contains="MultipleAlignment", representation=representation(unmasked="AAStringSet") ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.MultipleAlignment.unmasked <- function(object) { if (length(unique(nchar(object@unmasked))) > 1) "alignments have an unequal number of characters" else NULL } .valid.MultipleAlignment.rowmask <- function(object) { rng <- range(object@rowmask) if (length(rng) > 0 && (start(rng) < 1 || end(rng) > length(object@unmasked))) "'rowmask' contains values outside of [1, nrow]" else NULL } .valid.MultipleAlignment.colmask <- function(object) { rng <- range(object@colmask) if (length(rng) > 0 && (start(rng) < 1 || end(rng) > nchar(object@unmasked)[1L])) "'colmask' contains values outside of [1, ncol]" else NULL } setValidity("MultipleAlignment", function(object) { problems <- c(.valid.MultipleAlignment.unmasked(object), .valid.MultipleAlignment.rowmask(object), .valid.MultipleAlignment.colmask(object)) if (is.null(problems)) TRUE else problems } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor-like methods. ### setMethod("unmasked", "MultipleAlignment", function(x) x@unmasked) setMethod("rownames","MultipleAlignment", function(x) names(x@unmasked)) setReplaceMethod("rownames", "MultipleAlignment", function(x,value) { names(x@unmasked) <- value x } ) setGeneric("rowmask", signature="x", function(x) standardGeneric("rowmask")) setMethod("rowmask", "MultipleAlignment", function(x) x@rowmask) .appendMask <- function(mask, append, value){ append <- match.arg(append, choices=c("union", "replace", "intersect")) switch(append, "union" = return(union(mask, value)), "replace" = return(value), "intersect" = return(intersect(mask, value))) } .setMask <- function(mask, append, invert, length, value){ if (!isTRUEorFALSE(invert)) stop("'invert' must be TRUE or FALSE") if(invert==TRUE){ ## 1st invert value using gaps() value <- gaps(value, start=1, end=length) value <- .appendMask(mask=mask, append=append, value=value) } if(invert==FALSE){ value <- .appendMask(mask=mask, append=append, value=value) } value } setGeneric("rowmask<-", signature=c("x", "value"), function(x, append="union", invert=FALSE, value) standardGeneric("rowmask<-") ) setReplaceMethod("rowmask", signature(x="MultipleAlignment", value="NULL"), function(x, append="replace", invert=FALSE, value) callGeneric(x, append=append, invert=invert, value=new("NormalIRanges")) ) setReplaceMethod("rowmask", signature(x="MultipleAlignment", value="NormalIRanges"), function(x, append="union", invert=FALSE, value) { value <- .setMask(mask=rowmask(x), append=append, invert=invert, length=dim(x)[1], value=value) initialize(x, rowmask = value) } ) setReplaceMethod("rowmask", signature(x="MultipleAlignment", value="ANY"), function(x, append="union", invert=FALSE, value) callGeneric(x, append=append, invert=invert, value=as(value, "NormalIRanges")) ) setGeneric("colmask", signature="x", function(x) standardGeneric("colmask")) setMethod("colmask", "MultipleAlignment", function(x) x@colmask) setGeneric("colmask<-", signature=c("x", "value"), function(x, append="union", invert=FALSE, value) standardGeneric("colmask<-") ) setReplaceMethod("colmask", signature(x="MultipleAlignment", value="NULL"), function(x, append="replace", invert=FALSE, value) callGeneric(x, append=append, invert=invert, value=new("NormalIRanges")) ) setReplaceMethod("colmask", signature(x="MultipleAlignment", value="NormalIRanges"), function(x, append="union", invert=FALSE, value) { value <- .setMask(mask=colmask(x), append=append, invert=invert, length=dim(x)[2], value=value) initialize(x, colmask = value) } ) setReplaceMethod("colmask", signature(x="MultipleAlignment", value="ANY"), function(x, append="union",invert=FALSE, value) callGeneric(x, append=append, invert=invert, value=as(value, "NormalIRanges")) ) setMethod("maskMotif", signature(x="MultipleAlignment", motif="ANY"), function(x, motif, min.block.width=1, ...) { cmask <- colmask(x) if (length(colmask(x)) > 0) colmask(x) <- NULL string <- consensusString(x) if (length(string) == 1) { string <- gsub("#", "+", string) string <- as(string, xsbaseclass(unmasked(x))) maskedString <- callGeneric(string, motif, min.block.width=min.block.width, ...) newmask <- nir_list(masks(maskedString))[[1L]] colmask(x) <- union(newmask, cmask) } x } ) setGeneric("maskGaps", signature="x", function(x, ...) standardGeneric("maskGaps") ) setMethod("maskGaps", "MultipleAlignment", function(x, min.fraction=0.5, min.block.width=3) { if (!isSingleNumber(min.fraction) || min.fraction < 0 || min.fraction > 1) stop("'min.fraction' must be a number in [0, 1]") if (!isSingleNumber(min.block.width) || min.block.width <= 0) stop("'min.block.width' must be a positive integer") if (!is.integer(min.block.width)) min.block.width <- as.integer(min.block.width) cmask <- colmask(x) if (length(colmask(x)) > 0) colmask(x) <- NULL m <- consensusMatrix(x) newmask <- (m["-",] / colSums(m)) >= min.fraction newmask[is.na(newmask)] <- FALSE newmask <- as(newmask, "NormalIRanges") newmask <- newmask[width(newmask) >= min.block.width] colmask(x) <- union(newmask, cmask) x } ) setMethod("nrow","MultipleAlignment", function(x) length(x@unmasked)) setMethod("ncol","MultipleAlignment", function(x) {if (nrow(x) == 0L) 0L else nchar(x@unmasked[[1L]])} ) setMethod("dim","MultipleAlignment", function(x) c(nrow(x), ncol(x))) setGeneric("maskednrow", signature="x", function(x) standardGeneric("maskednrow") ) setMethod("maskednrow", "MultipleAlignment", function(x) sum(width(rowmask(x))) ) setGeneric("maskedncol", signature="x", function(x) standardGeneric("maskedncol") ) setMethod("maskedncol", "MultipleAlignment", function(x) sum(width(colmask(x))) ) setGeneric("maskeddim", signature="x", function(x) standardGeneric("maskeddim") ) setMethod("maskeddim", "MultipleAlignment", function(x) c(maskednrow(x), c(maskedncol(x))) ) setMethod("maskedratio", "MultipleAlignment", function(x) maskeddim(x) / dim(x) ) setMethod("nchar", "MultipleAlignment", function(x) ncol(x) - maskedncol(x) ) setMethod("seqtype", "MultipleAlignment", function(x) seqtype(unmasked(x)) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructors. ### .new_MultipleAlignment <- function(seqtype, x, start, end, width, use.names, rowmask, colmask) { ans_class <- paste0(seqtype, "MultipleAlignment") unmasked <- get(paste0(seqtype, "StringSet"))(x=x, start=start, end=end, width=width, use.names=use.names) if (is.null(rowmask)) rowmask <- new("NormalIRanges") if (is.null(colmask)) colmask <- new("NormalIRanges") new(ans_class, unmasked=unmasked, rowmask=rowmask, colmask=colmask) } DNAMultipleAlignment <- function(x=character(), start=NA, end=NA, width=NA, use.names=TRUE, rowmask=NULL, colmask=NULL) { .new_MultipleAlignment("DNA", x, start, end, width, use.names, rowmask, colmask) } RNAMultipleAlignment <- function(x=character(), start=NA, end=NA, width=NA, use.names=TRUE, rowmask=NULL, colmask=NULL) { .new_MultipleAlignment("RNA", x, start, end, width, use.names, rowmask, colmask) } AAMultipleAlignment <- function(x=character(), start=NA, end=NA, width=NA, use.names=TRUE, rowmask=NULL, colmask=NULL) { .new_MultipleAlignment("AA", x, start, end, width, use.names, rowmask, colmask) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Read function. ### ## markupPattern specifies which lines to skip .read.MultipleAlignment.splitRows <- function(rows, markupPattern) { markupLines <- grep(markupPattern, rows, perl=TRUE) alnLines <- gaps(as(markupLines, "IRanges"), start=1, end=length(rows)) nseq <- unique(width(alnLines)) if (length(nseq) != 1) stop("missing alignment rows") rows <- IRanges:::extractROWS(rows, alnLines) spaces <- regexpr("\\s+", rows) ids <- substr(rows, 1L, spaces - 1L) nsplits <- length(rows) %/% nseq if (!identical(ids, rep.int(head(ids, nseq), nsplits))) stop("alignment rows out of order") alns <- substr(rows, spaces + attr(spaces, "match.length"), nchar(rows)) structure(do.call(paste, c(split(alns, rep(seq_len(nsplits), each=nseq)), sep="")), names = head(ids, nseq)) } .read.Stockholm <- function(filepath) { rows <- scan(filepath, what = "", sep = "\n", strip.white = TRUE, quiet = TRUE, blank.lines.skip = FALSE) if (length(rows) < 3 || !identical(grep("^# STOCKHOLM", rows[1L]), 1L)) stop("invalid Stockholm file") chartr(".", "-", .read.MultipleAlignment.splitRows(rows, "(^\\s*|^#.*|^//\\s*)$")) } .read.ClustalAln <- function(filepath) { rows <- scan(filepath, what = "", sep = "\n", strip.white = TRUE, quiet = TRUE, blank.lines.skip = FALSE) if (length(rows) < 3 || !identical(grep("^CLUSTAL", rows[1L]), 1L) || !identical(rows[2:3], c("",""))) stop("invalid Clustal aln file") rows <- tail(rows, -3) rows <- sub("^(\\S+\\s+\\S+)\\s*\\d*$", "\\1", rows) .read.MultipleAlignment.splitRows(rows, "^(\\s|\\*|:|\\.)*$") } ## In order to recycle .read.MultipleAlignment.splitRows(). ## I need to have the names on each row. .read.PhylipAln <- function(filepath, maskGen=FALSE) { rows <- scan(filepath, what = "", sep = "\n", strip.white = TRUE, quiet = TRUE, blank.lines.skip = FALSE) if (length(rows) < 1 || !identical(grep("^\\d+?\\s\\d+?", rows[1L]), 1L)) stop("invalid Phylip file") ##(mask+num rows + blank line) nameLength <- as.numeric(sub("(\\d+).*$","\\1", rows[1])) +1 rows <- tail(rows, -1) names <- character() names[nameLength] <- "" ## an empty string is ALWAYS the last "name" offset <- 0L for(i in seq_len(length(rows))){ if(i 0){hasMask<-TRUE}else{hasMask <- FALSE} } if(hasMask){dims[1] <- dims[1]+1} ## Massage to character vector ch <- as.character(x) ch <- unlist(lapply(ch, .insertSpaces)) ## Convert mask to string format if(hasMask){ mskInd <- unlist(msk, use.names=FALSE) ## index that should be masked mskCh <- paste(as.character(replace(rep(1,dim(x)[2]), mskInd, 0)), collapse="") mskCh <- .insertSpaces(mskCh) } ## Split up the output into lines, but grouped into a list object names <- names(ch) ch <- sapply(ch, .strChop, chopsize=55, simplify=FALSE) ## Again consider mask, split, name & cat on (if needed) if(hasMask){ mskCh <- .strChop(mskCh, chopsize=55) ch <- c(list(Mask = mskCh), ch) } ## 1) precalculate the max length of the names and then maxLen <- max(nchar(names(ch))) ## 2) make a string of that many spaces into a row stockSpc <- paste(rep(" ", maxLen), collapse="") ## 3) will need to buffer all names() to be that length. bufferSpacing<-function(name){ spc <- paste(rep(" ", maxLen - nchar(name)), collapse="") paste(name, spc, sep="") } ## 4) append set of blank strings to list for "gapped-rows" later ch <- c(ch, list(rep("",length(ch[[1]])))) ## 5) Iterate so that all the rows are interleaved together output <- character(length(ch[[1]])*length(ch)) for(i in seq_len(length(ch[[1]]))){ for(j in seq_len(length(ch))){ if(i==1){ output[j] <- paste(unlist(lapply(names(ch[j]), bufferSpacing)), " ",ch[[j]][i],sep="") }else{ if(showRowNames){ output[(length(ch)*(i-1)) + j] <- paste(unlist(lapply(names(ch[j]), bufferSpacing)), " ",ch[[j]][i],sep="") }else{ output[(length(ch)*(i-1)) + j] <- paste(stockSpc, " ",ch[[j]][i],sep="") } } } } ## drop trailing spaces output <- gsub("\\s+$","", output) ## remove the extra end line output <- output[1:length(output)-1] ## finally attach the dims if(hasMask){ ##Honestly not sure if I need a "W" here or what it means? output <- c(paste("",paste(c(dims,""),collapse=" "),collapse=" "),output) }else{ output <- c(paste("",paste(dims,collapse=" "),collapse=" "),output) } writeLines(output, filepath) } } write.phylip <- function(x, filepath){ .write.MultAlign(x, filepath, invertColMask=TRUE, showRowNames=FALSE, hideMaskedCols=FALSE) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Show detailed pager view of unmasked sequences. ### detail <- function(x, ...) show(x) setGeneric("detail") setMethod("detail", "MultipleAlignment", function(x,invertColMask=FALSE,hideMaskedCols=TRUE){ ## We don't want a permanent file for this FH <- tempfile(pattern = "tmpFile", tmpdir = tempdir()) ## Then write out a temp file with the correct stuff in it .write.MultAlign(x, FH, invertColMask=invertColMask, showRowNames=TRUE, hideMaskedCols=hideMaskedCols) ## use file.show() to display file.show(FH) }) ## TODO: explore if we can make a textConnection() to save time writing to disk. ## page() allows this, but seems to be actually slower than what we do here, ## also, it looks considerably less nice than when it comes from a file... ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### setAs("MultipleAlignment", "DNAStringSet", function(from) DNAStringSet(as.character(from)) ) setAs("MultipleAlignment", "RNAStringSet", function(from) RNAStringSet(as.character(from)) ) setAs("MultipleAlignment", "AAStringSet", function(from) AAStringSet(as.character(from)) ) setAs("MultipleAlignment", "BStringSet", function(from) BStringSet(as.character(from)) ) setAs("character", "DNAMultipleAlignment", function(from) DNAMultipleAlignment(from) ) setAs("character", "RNAMultipleAlignment", function(from) RNAMultipleAlignment(from) ) setAs("character", "AAMultipleAlignment", function(from) AAMultipleAlignment(from) ) setMethod("as.character", "MultipleAlignment", function(x, use.names=TRUE) apply(as.matrix(x, use.names=use.names), 1, paste, collapse="") ) setMethod("as.matrix", "MultipleAlignment", function(x, use.names=TRUE) { if (nrow(x) == 0) { m <- matrix(character(0), nrow=0, ncol=0) } else { m <- as.matrix(unmasked(x), use.names=use.names) if (maskednrow(x) > 0) m <- m[- as.integer(rowmask(x)), , drop=FALSE] if (maskedncol(x) > 0) m <- m[, - as.integer(colmask(x)), drop=FALSE] } m } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities. ### setMethod("consensusMatrix","MultipleAlignment", function(x, as.prob=FALSE, baseOnly=FALSE) { strings <- unmasked(x) if (maskednrow(x) > 0) strings <- strings[- as.integer(rowmask(x))] m <- callGeneric(strings, as.prob=as.prob, baseOnly=baseOnly, width=ncol(x)) if (maskedncol(x) > 0) m[, as.integer(colmask(x))] <- NA m } ) setMethod("consensusString","MultipleAlignment", function(x, ambiguityMap, threshold, codes) { consensus <- rep.int("#", ncol(x)) if (ncol(x) > 0) { cmat <- consensusMatrix(x, width=ncol(x)) ngaps <- cmat["-",] cmat <- cmat[codes, , drop=FALSE] colsums <- colSums(cmat, na.rm=TRUE) nzsum <- which(colsums > 1e-6) if (length(nzsum) > 0) { colsums[- nzsum] <- 1 # to avoid division by 0 gaplocs <- which(as.logical(ngaps > colsums)) nzsum <- setdiff(nzsum, gaplocs) cmat <- cmat / rep(colsums, each=nrow(cmat)) consensus[gaplocs] <- "-" consensus[nzsum] <- safeExplode(consensusString(cmat[, nzsum, drop=FALSE], ambiguityMap=ambiguityMap, threshold=threshold)) } consensus <- paste(consensus, collapse="") } consensus } ) setMethod("consensusString","DNAMultipleAlignment", function(x, ambiguityMap=IUPAC_CODE_MAP, threshold=0.25) { callNextMethod(x, ambiguityMap=ambiguityMap, threshold=threshold, codes=names(IUPAC_CODE_MAP)) } ) setMethod("consensusString","RNAMultipleAlignment", function(x, ambiguityMap= structure(as.character(RNAStringSet(DNAStringSet(IUPAC_CODE_MAP))), names= as.character(RNAStringSet(DNAStringSet(names(IUPAC_CODE_MAP))))), threshold=0.25) { callNextMethod(x, ambiguityMap=ambiguityMap, threshold=threshold, codes= as.character(RNAStringSet(DNAStringSet(names(IUPAC_CODE_MAP))))) } ) setMethod("consensusString","AAMultipleAlignment", function(x, ambiguityMap="?", threshold=0.5) { callNextMethod(x, ambiguityMap=ambiguityMap, threshold=threshold, codes=names(AMINO_ACID_CODE)) } ) setGeneric("consensusViews", signature="x", function(x, ...) standardGeneric("consensusViews") ) setMethod("consensusViews","MultipleAlignment", function(x, ambiguityMap, threshold) { cmask <- colmask(x) if (length(cmask) > 0) colmask(x) <- NULL consensus <- consensusString(x, ambiguityMap=ambiguityMap, threshold=threshold) if (length(consensus) == 0) consensus <- "" Views(BString(consensus), gaps(cmask, start=1, end=ncol(x))) } ) setMethod("consensusViews","DNAMultipleAlignment", function(x, ambiguityMap=IUPAC_CODE_MAP, threshold=0.25) { callNextMethod(x, ambiguityMap=ambiguityMap, threshold=threshold) } ) setMethod("consensusViews","RNAMultipleAlignment", function(x, ambiguityMap=as.character(RNAStringSet(DNAStringSet(IUPAC_CODE_MAP))), threshold=0.25) { callNextMethod(x, ambiguityMap=ambiguityMap, threshold=threshold) } ) setMethod("consensusViews","AAMultipleAlignment", function(x, ambiguityMap="?", threshold=0.5) { callNextMethod(x, ambiguityMap=ambiguityMap, threshold=threshold) } ) setMethod("alphabetFrequency","MultipleAlignment", function(x, as.prob=FALSE, collapse=FALSE) { if (collapse) { strings <- as(x, sprintf("%sStringSet", seqtype(x))) m <- callGeneric(strings, as.prob=as.prob, collapse=TRUE) } else { rmask <- rowmask(x) if (length(rmask) > 0) rowmask(x) <- NULL strings <- as(x, sprintf("%sStringSet", seqtype(x))) m <- callGeneric(strings, as.prob=as.prob) if (length(rmask) > 0) m[as.integer(rmask),] <- NA } m } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### .MultipleAlignment.show_frame_header <- function (iW, with.names) { cat(format("", width = iW + 1), sep="") if (with.names) { cat(format(" aln", width = getOption("width") - iW - .namesW - 1), format("names", width=.namesW, justify="left"), sep="") } else { cat(" aln") } cat("\n") } .MultipleAlignment.show_frame_line <- function (x, i, iW) { snippetWidth <- getOption("width") - 2 - iW if (!is.null(names(x))) snippetWidth <- snippetWidth - .namesW - 1 seq_snippet <- toSeqSnippet(x[[i]], snippetWidth) if (!is.null(names(x))) seq_snippet <- format(seq_snippet, width=snippetWidth) cat(format(paste("[", i, "]", sep=""), width=iW, justify="right"), " ", seq_snippet, sep="") if (!is.null(names(x))) { snippet_name <- names(x)[i] if (is.na(snippet_name)) snippet_name <- "" else if (nchar(snippet_name) > .namesW) snippet_name <- paste(substr(snippet_name, 1, .namesW - 3), "...", sep="") cat(" ", snippet_name, sep="") } cat("\n") } .MultipleAlignment.show_frame <- function (x, half_nrow=9L) { lx <- length(x) iW <- nchar(as.character(lx)) + 2 .MultipleAlignment.show_frame_header(iW, !is.null(names(x))) if (lx <= 2 * half_nrow + 1) { for (i in seq_len(lx)) .MultipleAlignment.show_frame_line(x, i, iW) } else { for (i in 1:half_nrow) .MultipleAlignment.show_frame_line(x, i, iW) cat(format("...", width=iW, justify="right"), "...\n") for (i in (lx - half_nrow + 1L):lx) .MultipleAlignment.show_frame_line(x, i, iW) } } setMethod("show", "MultipleAlignment", function(object) { nr <- nrow(object) nc <- ncol(object) cat(class(object), " with ", nr, ifelse(nr == 1, " row and ", " rows and "), nc, ifelse(nc == 1, " column\n", " columns\n"), sep = "") if (nr != 0) { strings <- unmasked(object) mdim <- maskeddim(object) if (sum(mdim) > 0) { if (mdim[1] > 0) { strings <- BStringSet(strings) maskStrings <- rep(BStringSet(paste(rep.int("#", ncol(object)), collapse="")), mdim[1]) i <- as.integer(rowmask(object)) if (!is.null(rownames(object))) names(maskStrings) <- rownames(object)[i] strings[i] <- maskStrings } if (mdim[2] > 0) { strings <- as.matrix(strings) strings[, as.integer(colmask(object))] <- "#" strings <- BStringSet(apply(strings, 1, paste, collapse="")) } } .MultipleAlignment.show_frame(strings) } } ) Biostrings/R/PDict-class.R0000644000126300012640000004615412227063307016726 0ustar00biocbuildphs_compbio### ========================================================================= ### PDict objects ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "PreprocessedTB" VIRTUAL class. ### setClass("PreprocessedTB", representation( "VIRTUAL", tb="DNAStringSet", # always constant width exclude_dups0="logical", dups="Dups", base_codes="integer" ) ) setMethod("length", "PreprocessedTB", function(x) length(x@tb)) setMethod("width", "PreprocessedTB", function(x) width(x@tb)) setGeneric("tb", function(x) standardGeneric("tb")) setMethod("tb", "PreprocessedTB", function(x) x@tb) setGeneric("tb.width", function(x) standardGeneric("tb.width")) setMethod("tb.width", "PreprocessedTB", function(x) width(x@tb)[1]) setGeneric("dups", function(x) standardGeneric("dups")) setMethod("dups", "PreprocessedTB", function(x) x@dups) setGeneric("nnodes", function(x) standardGeneric("nnodes")) setGeneric("hasAllFlinks", function(x) standardGeneric("hasAllFlinks")) setGeneric("computeAllFlinks", function(x, ...) standardGeneric("computeAllFlinks")) setMethod("initialize", "PreprocessedTB", function(.Object, tb, pp_exclude, high2low, base_codes) { .Object@tb <- tb .Object@exclude_dups0 <- !is.null(pp_exclude) .Object@dups <- Dups(high2low) .Object@base_codes <- base_codes # should be 'xscodes(tb, baseOnly=TRUE)' .Object } ) .PreprocessedTB.showFirstLine <- function(x) { cat("Preprocessed Trusted Band\n") cat("| length x width = ", length(x), " x ", tb.width(x), "\n", sep="") cat("| algorithm = \"", class(x), "\"\n", sep="") } setMethod("togrouplength", "PreprocessedTB", function(x, j=NULL) togrouplength(dups(x), j=j) ) setMethod("duplicated", "PreprocessedTB", function(x, incomparables=FALSE, ...) duplicated(dups(x)) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "Twobit" class. ### ### A low-level container for storing the PreprocessedTB object (preprocessed ### Trusted Band) obtained with the "Twobit" algo. ### With this algo, the 2-bit-per-letter signatures of all ### the oligonucleotides in the Trusted Band are computed and the mapping ### from these signatures to the 1-based position of the corresponding ### oligonucleotide in the Trusted Band is stored in a way that allows very ### fast lookup. ### setClass("Twobit", contains="PreprocessedTB", representation( sign2pos="XInteger" # length(x@sign2pos) is tb.width(x)^4 ) ) setMethod("show", "Twobit", function(object) { .PreprocessedTB.showFirstLine(object) cat("| length of sign2pos lookup table = ", length(object@sign2pos), "\n", sep="") } ) setMethod("initialize", "Twobit", function(.Object, tb, pp_exclude) { base_codes <- xscodes(tb, baseOnly=TRUE) C_ans <- .Call2("build_Twobit", tb, pp_exclude, base_codes, PACKAGE="Biostrings") .Object <- callNextMethod(.Object, tb, pp_exclude, C_ans$high2low, base_codes) .Object@sign2pos <- C_ans$sign2pos .Object } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "ACtree2" class. ### ### A low-level container for storing the PreprocessedTB object (preprocessed ### Trusted Band) obtained with the "ACtree2" algo. ### ### Big Atomic Buffer of integers. setClass("IntegerBAB", representation(xp="externalptr")) setClass("ACtree2", contains="PreprocessedTB", representation( nodebuf_ptr="IntegerBAB", nodeextbuf_ptr="IntegerBAB" ) ) setMethod("nnodes", "ACtree2", function(x) .Call2("ACtree2_nnodes", x, PACKAGE="Biostrings") ) setMethod("hasAllFlinks", "ACtree2", function(x) .Call2("ACtree2_has_all_flinks", x, PACKAGE="Biostrings") ) setMethod("computeAllFlinks", "ACtree2", function(x) .Call2("ACtree2_compute_all_flinks", x, PACKAGE="Biostrings") ) setMethod("show", "ACtree2", function(object) { .PreprocessedTB.showFirstLine(object) invisible(.Call2("ACtree2_summary", object, PACKAGE="Biostrings")) } ) setMethod("initialize", "ACtree2", function(.Object, tb, pp_exclude) { nodebuf_max_nblock <- .Call2("ACtree2_nodebuf_max_nblock", PACKAGE="Biostrings") nodebuf_ptr <- .Call2("IntegerBAB_new", nodebuf_max_nblock, PACKAGE="Biostrings") nodeextbuf_max_nblock <- .Call2("ACtree2_nodeextbuf_max_nblock", PACKAGE="Biostrings") nodeextbuf_ptr <- .Call2("IntegerBAB_new", nodeextbuf_max_nblock, PACKAGE="Biostrings") base_codes <- xscodes(tb, baseOnly=TRUE) C_ans <- .Call2("ACtree2_build", tb, pp_exclude, base_codes, nodebuf_ptr, nodeextbuf_ptr, PACKAGE="Biostrings") .Object <- callNextMethod(.Object, tb, pp_exclude, C_ans$high2low, base_codes) .Object@nodebuf_ptr <- nodebuf_ptr .Object@nodeextbuf_ptr <- nodeextbuf_ptr .Object } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "PDict3Parts" class. ### setClass("PDict3Parts", representation( head="DNAStringSet", pptb="PreprocessedTB", tail="DNAStringSet" ) ) setMethod("length", "PDict3Parts", function(x) length(x@pptb)) setMethod("width", "PDict3Parts", function(x) { width(x@head) + width(x@pptb) + width(x@tail) } ) setMethod("head", "PDict3Parts", function(x, ...) { if (all(width(x@head) == 0L)) return(NULL) x@head } ) setMethod("tb", "PDict3Parts", function(x) tb(x@pptb)) setMethod("tb.width", "PDict3Parts", function(x) tb.width(x@pptb)) setMethod("tail", "PDict3Parts", function(x, ...) { if (all(width(x@tail) == 0L)) return(NULL) x@tail } ) .PDict3Parts <- function(x, tb.start, tb.end, tb.width, algo, pptb0) { threeparts <- threebands(x, start=tb.start, end=tb.end, width=tb.width) head <- threeparts$left tb <- threeparts$middle tail <- threeparts$right if (is.null(pptb0)) { pptb <- new(algo, tb, NULL) } else { use_pptb0 <- algo == class(pptb0) && all(width(head) == 0L) && all(width(tail) == 0L) if (use_pptb0) { ## We can avoid doing the expensive preprocessing again by ## making the 'pptb' that would be returned by ## 'new(algo, tb, high2low(dups(pptb0)))': pptb <- pptb0 pptb@dups <- Dups(rep.int(as.integer(NA), length(pptb))) pptb@exclude_dups0 <- TRUE } else { pptb <- new(algo, tb, high2low(dups(pptb0))) } } new("PDict3Parts", head=head, pptb=pptb, tail=tail) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "PDict" VIRTUAL class (top level). ### ### A (virtual) container for storing a preprocessed dictionary of DNA ### patterns that can later be passed to the matchPDict() function for fast ### matching. ### setClass("PDict", contains="List", representation( "VIRTUAL", dict0="DNAStringSet", constant_width="logical", dups0="Dups" ), prototype( elementType="DNAString" ) ) setMethod("length", "PDict", function(x) length(x@dict0)) setMethod("width", "PDict", function(x) width(x@dict0)) setMethod("names", "PDict", function(x) names(x@dict0)) setReplaceMethod("names", "PDict", function(x, value) stop("attempt to modify the names of a ", class(x), " instance") ) setMethod("dups", "PDict", function(x) if (length(x@dups0) == 0) NULL else x@dups0 ) ### Extract the i-th element of a PDict object as DNAString object. ### Note that only the "[[" operator is provided for now. Providing "[" sounds ### like a nice feature too but 'x[i]' would have to return a PDict object of ### the same PDict subtype as 'x' i.e. a preprocessed dictionary where the ### preprocessed data structure reflects the subsetted dictionary. ### For example if the preprocessed data structure is an Aho-Corasick tree, ### then this tree needs to be updated so that it stays in sync with ### 'x@dict0[i]'. This updating operation might be complex and expensive in ### terms of CPU cycles and/or memory usage. It could even be that its cost is ### in fact greater than preprocessing again 'x@dict0[i]' from scratch! ### So in the end, "[" would not have much value (other than providing some ### convenience) over the approach that consists to ask the user to do the ### subsetting upstream i.e. to subset the original dictionary before s/he ### passes it to PDict() again. setMethod("[[", "PDict", function(x, i, j, ...) { i <- IRanges:::normalizeDoubleBracketSubscript(i, x) x@dict0[[i]] } ) setMethod("togrouplength", "PDict", function(x, j=NULL) { if (is.null(dups(x))) stop("duplicates information not available for this object") togrouplength(dups(x), j=j) } ) setMethod("duplicated", "PDict", function(x, incomparables=FALSE, ...) { if (is.null(dups(x))) stop("duplicates information not available for this object") duplicated(dups(x)) } ) ### Just an alias for "togrouplength". setGeneric("patternFrequency", function(x) standardGeneric("patternFrequency")) setMethod("patternFrequency", "PDict", function(x) togrouplength(x)) .PDict.showFirstLine <- function(x, algo) { cat(class(x), " object of length ", length(x), sep="") if (x@constant_width) { width <- width(x@dict0)[1] width_info <- paste("width ", width, sep="") } else { width_info <- "variable width" } cat(" and ", width_info, sep="") if (!is.null(algo)) cat(" (preprocessing algo=\"", algo, "\")", sep="") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "TB_PDict" class. ### ### A container for storing a Trusted Band PDict object. ### setClass("TB_PDict", contains="PDict", representation( threeparts="PDict3Parts" ) ) setMethod("head", "TB_PDict", function(x, ...) head(x@threeparts)) setMethod("tb", "TB_PDict", function(x) tb(x@threeparts)) setMethod("tb.width", "TB_PDict", function(x) tb.width(x@threeparts)) setMethod("tail", "TB_PDict", function(x, ...) tail(x@threeparts)) setMethod("show", "TB_PDict", function(object) { algo <- class(object@threeparts@pptb) .PDict.showFirstLine(object, algo) head <- head(object) tail <- tail(object) if (is.null(head) && is.null(tail)) return(cat("\n", sep="")) cat(":\n") if (is.null(head)) { cat(" - with NO head") } else { cat(" - with a head of ") min_width <- min(width(head)) max_width <- max(width(head)) if (min_width == max_width) cat("width ", min_width, sep="") else cat("variable width (min=", min_width, " / max=", max_width, ")", sep="") } cat("\n") cat(" - with a Trusted Band of width ", tb.width(object), sep="") cat("\n") if (is.null(tail)) { cat(" - with NO tail") } else { cat(" - with a tail of ") min_width <- min(width(tail)) max_width <- max(width(tail)) if (min_width == max_width) cat("width ", min_width, sep="") else cat("variable width (min=", min_width, " / max=", max_width, ")", sep="") } cat("\n") } ) .TB_PDict <- function(x, tb.start, tb.end, tb.width, algo) { constant_width <- isConstant(width(x)) if (constant_width && hasOnlyBaseLetters(x)) pptb0 <- new("ACtree2", x, NULL) # because ACtree2 supports big input else pptb0 <- NULL threeparts <- .PDict3Parts(x, tb.start, tb.end, tb.width, algo, pptb0) ans <- new("TB_PDict", dict0=x, constant_width=constant_width, threeparts=threeparts) ## '!is.null(pptb0)' should be the same as 'threeparts@pptb@exclude_dups0' if (!is.null(pptb0)) ans@dups0 <- dups(pptb0) ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "MTB_PDict" class. ### ### A container for storing a Multiple Trusted Band PDict object. ### setClass("MTB_PDict", contains="PDict", representation( threeparts_list="list" ) ) setMethod("as.list", "MTB_PDict", function(x, ...) { lapply(x@threeparts_list, function(threeparts) new("TB_PDict", dict0=x@dict0, constant_width=x@constant_width, dups0=x@dups0, threeparts=threeparts) ) } ) setMethod("show", "MTB_PDict", function(object) { cat(" ") .PDict.showFirstLine(object, NULL) cat("\nComponents:\n") show(as.list(object)) } ) ### 'max.mismatch' is assumed to be an integer >= 1 .MTB_PDict <- function(x, max.mismatch, algo) { min.TBW <- 3L min_width <- min(width(x)) if (min_width < 2L * min.TBW) stop("'max.mismatch >= 1' is supported only if the width ", "of dictionary 'x' is >= ", 2L * min.TBW) constant_width <- isConstant(width(x)) NTB <- max.mismatch + 1L # nb of Trusted Bands TBW0 <- min_width %/% NTB if (TBW0 < min.TBW) { max.max.mismatch <- min_width %/% min.TBW - 1L stop("'max.mismatch' must be <= ", max.max.mismatch, " given the width of dictionary 'x'") } all_tbw0 <- rep.int(TBW0, NTB - min_width %% NTB) all_tbw1 <- rep.int(TBW0 + 1L, min_width %% NTB) all_tbw <- c(all_tbw0, all_tbw1) ## R1 is the average number of (perfect) matches that is expected ## to be found during stage1 each time the sliding window is moved ## to the next position. R1 <- length(x) * sum(1/4^all_tbw) if (R1 > 10) warning("given the characteristics of dictionary 'x', ", "this value of 'max.mismatch' will\n", " give poor performance when you call ", "matchPDict() on this MTB_PDict object\n", " (it will of course depend ultimately on the ", "length of the subject)") all_headw <- diffinv(all_tbw) if (constant_width) pptb0 <- new("ACtree2", x, NULL) # because ACtree2 supports big input else pptb0 <- NULL threeparts_list <- lapply(seq_len(NTB), function(i) .PDict3Parts(x, all_headw[i]+1L, all_headw[i+1L], NA, algo, pptb0) ) ans <- new("MTB_PDict", dict0=x, constant_width=constant_width, threeparts_list=threeparts_list) if (!is.null(pptb0)) ans@dups0 <- dups(pptb0) ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "Expanded_TB_PDict" class. ### setClass("Expanded_TB_PDict", contains="TB_PDict", representation( expanded_dict0="DNAStringSetList" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The PDict() constructor (user-friendly). ### .PDict <- function(x, max.mismatch, tb.start, tb.end, tb.width, algo, skip.invalid.patterns) { if (!is(x, "DNAStringSet")) x <- DNAStringSet(x) if (length(x) == 0) stop("'x' must contain at least one pattern") names <- names(x) if (!is.null(names)) { if (any(names %in% c("", NA))) stop("'x' has invalid names") if (any(duplicated(names))) stop("'x' has duplicated names") } if (!isSingleNumberOrNA(max.mismatch)) stop("'max.mismatch' must be a single integer or 'NA'") if (!is.integer(max.mismatch)) max.mismatch <- as.integer(max.mismatch) if (!isSingleNumberOrNA(tb.start)) stop("'tb.start' must be a single integer or 'NA'") if (!isSingleNumberOrNA(tb.end)) stop("'tb.end' must be a single integer or 'NA'") if (!isSingleNumberOrNA(tb.width)) stop("'tb.width' must be a single integer or 'NA'") if (!is.character(algo)) stop("'algorithm' must be a character vector") if ("ACtree" %in% algo) { warning("support for ACtree preprocessing algo has been ", "dropped, using ACtree2 algo") algo[!is.na(match(algo, "ACtree"))] <- "ACtree2" } if (!identical(skip.invalid.patterns, FALSE)) stop("'skip.invalid.patterns' must be FALSE for now, sorry") is_default_TB <- is.na(tb.start) && is.na(tb.end) && is.na(tb.width) if (!is.na(max.mismatch) && !is_default_TB) stop("'tb.start', 'tb.end' and 'tb.width' must be NAs ", "when 'max.mismatch' is not NA") if (is.na(max.mismatch) || max.mismatch == 0) { .TB_PDict(x, tb.start, tb.end, tb.width, algo) } else { if (max.mismatch < 0) stop("'max.mismatch' must be 'NA' or >= 0") .MTB_PDict(x, max.mismatch, algo) } } setGeneric("PDict", signature="x", function(x, max.mismatch=NA, tb.start=NA, tb.end=NA, tb.width=NA, algorithm="ACtree2", skip.invalid.patterns=FALSE) standardGeneric("PDict") ) setMethod("PDict", "character", function(x, max.mismatch=NA, tb.start=NA, tb.end=NA, tb.width=NA, algorithm="ACtree2", skip.invalid.patterns=FALSE) .PDict(x, max.mismatch, tb.start, tb.end, tb.width, algorithm, skip.invalid.patterns) ) setMethod("PDict", "DNAStringSet", function(x, max.mismatch=NA, tb.start=NA, tb.end=NA, tb.width=NA, algorithm="ACtree2", skip.invalid.patterns=FALSE) .PDict(x, max.mismatch, tb.start, tb.end, tb.width, algorithm, skip.invalid.patterns) ) setMethod("PDict", "XStringViews", function(x, max.mismatch=NA, tb.start=NA, tb.end=NA, tb.width=NA, algorithm="ACtree2", skip.invalid.patterns=FALSE) { if (!is(subject(x), "DNAString")) stop("'subject(x)' must be a DNAString object") .PDict(x, max.mismatch, tb.start, tb.end, tb.width, algorithm, skip.invalid.patterns) } ) ### 2 extra "PDict" methods to deal with the probe sequences stored ### in the *probe annotation packages (e.g. drosophila2probe). setMethod("PDict", "AsIs", function(x, max.mismatch=NA, tb.start=NA, tb.end=NA, tb.width=NA, algorithm="ACtree2", skip.invalid.patterns=FALSE) .PDict(x, max.mismatch, tb.start, tb.end, tb.width, algorithm, skip.invalid.patterns) ) setMethod("PDict", "probetable", function(x, max.mismatch=NA, tb.start=NA, tb.end=NA, tb.width=NA, algorithm="ACtree2", skip.invalid.patterns=FALSE) PDict(x$sequence, max.mismatch=max.mismatch, tb.start=tb.start, tb.end=tb.end, tb.width=tb.width, algorithm=algorithm, skip.invalid.patterns=skip.invalid.patterns) ) Biostrings/R/PairwiseAlignments-class.R0000644000126300012640000003702612227063307021526 0ustar00biocbuildphs_compbio### ========================================================================= ### PairwiseAlignments objects ### ------------------------------------------------------------------------- ### ### A PairwiseAlignments object contains two aligned XStringSet objects. ### setClass("PairwiseAlignments", representation( pattern="AlignedXStringSet0", subject="AlignedXStringSet0", type="character", score="numeric", gapOpening="numeric", gapExtension="numeric" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructors. ### newPairwiseAlignments <- function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, baseClass = "BString", pwaClass = "PairwiseAlignments") { seqtype <- substr(baseClass, 1, nchar(baseClass) - 6) # remove "String" suffix getMismatches <- function(x) { whichMismatches <- which(x[["values"]] == "?") if (length(whichMismatches) == 0) { value <- integer(0) } else { start <- cumsum(x[["lengths"]])[whichMismatches] end <- start + (x[["lengths"]][whichMismatches] - 1L) value <- eval(parse(text = paste("c(", paste(start, ":", end, sep = "", collapse = ", "), ")"))) } IntegerList(value) } getRange <- function(x) { if (!(x[["values"]][1] %in% c("-", "+"))) { start <- 1L } else if (length(x[["values"]]) == 1) { start <- integer(0) } else { start <- x[["lengths"]][1] + 1L } if (!(x[["values"]][length(x[["values"]])] %in% c("-", "+"))) { end <- sum(x[["lengths"]]) } else if (length(x[["values"]]) == 1) { end <- integer(0) } else { end <- sum(x[["lengths"]][-length(x[["lengths"]])]) } IRanges(start = start, end = end) } getIndels <- function(x, indelChar) { if (x[["values"]][1] %in% c("-", "+")) { x[["values"]] <- x[["values"]][-1] x[["lengths"]] <- x[["lengths"]][-1] } if (x[["values"]][length(x[["values"]])] %in% c("-", "+")) { x[["values"]] <- x[["values"]][-length(x[["values"]])] x[["lengths"]] <- x[["lengths"]][-length(x[["lengths"]])] } isIndels <- (x[["values"]] == indelChar) if (!any(isIndels)) IRangesList(IRanges(integer(0), integer(0))) else IRangesList(IRanges( cumsum(c(1L, ifelse(isIndels, 0L, x[["lengths"]])[-length(x[["lengths"]])]))[isIndels], width = x[["lengths"]][isIndels])) } if (length(pattern) != 1 || length(subject) != 1) stop("'pattern' and 'subject' must both be of length 1") if (nchar(pattern) != nchar(subject)) stop("'pattern' and 'subject' must have the same number of characters") type <- match.arg(type, c("global", "local", "overlap", "global-local", "local-global", "subjectOverlap", "patternOverlap")) if (type == "subjectOverlap") { warning("type = 'subjectOverlap' has been renamed type = 'global-local'") type <- "global-local" } if (type == "patternOverlap") { warning("type = 'patternOverlap' has been renamed type = 'local-global'") type <- "local-global" } gapOpening <- as.double(- abs(gapOpening)) if (length(gapOpening) != 1 || is.na(gapOpening)) stop("'gapOpening' must be a non-positive numeric vector of length 1") gapExtension <- as.double(- abs(gapExtension)) if (length(gapExtension) != 1 || is.na(gapExtension)) stop("'gapExtension' must be a non-positive numeric vector of length 1") explodedPattern <- safeExplode(pattern) explodedSubject <- safeExplode(subject) degappedPattern <- explodedPattern[explodedPattern != "-"] degappedSubject <- explodedSubject[explodedSubject != "-"] availableLetters <- sort(unique(c(unique(degappedPattern), unique(degappedSubject)))) if (is.null(substitutionMatrix)) { substitutionMatrix <- diag(length(availableLetters)) - 1 dimnames(substitutionMatrix) <- list(availableLetters, availableLetters) } else if (is.character(substitutionMatrix)) { if (length(substitutionMatrix) != 1) stop("'substitutionMatrix' is a character vector of length != 1") tempMatrix <- substitutionMatrix substitutionMatrix <- try(getdata(tempMatrix), silent = TRUE) if (is(substitutionMatrix, "try-error")) stop("unknown scoring matrix \"", tempMatrix, "\"") } if (!is.matrix(substitutionMatrix) || !is.numeric(substitutionMatrix)) stop("'substitutionMatrix' must be a numeric matrix") if (!identical(rownames(substitutionMatrix), colnames(substitutionMatrix))) stop("row and column names differ for matrix 'substitutionMatrix'") if (is.null(rownames(substitutionMatrix))) stop("matrix 'substitutionMatrix' must have row and column names") if (any(duplicated(rownames(substitutionMatrix)))) stop("matrix 'substitutionMatrix' has duplicated row names") availableLetters <- intersect(availableLetters, rownames(substitutionMatrix)) substitutionMatrix <- matrix(as.double(substitutionMatrix[availableLetters, availableLetters]), nrow = length(availableLetters), ncol = length(availableLetters), dimnames = list(availableLetters, availableLetters)) comparison <- rle(safeExplode(compareStrings(pattern, subject))) whichPattern <- which(comparison[["values"]] != "-") patternRle <- structure(list(lengths = comparison[["lengths"]][whichPattern], values = comparison[["values"]][whichPattern]), class = "rle") whichSubject <- which(comparison[["values"]] != "+") subjectRle <- structure(list(lengths = comparison[["lengths"]][whichSubject], values = comparison[["values"]][whichSubject]), class = "rle") substitutionIndices <- (explodedPattern != "-") & (explodedSubject != "-") new(pwaClass, pattern = new("AlignedXStringSet", unaligned = XStringSet(seqtype, paste(degappedPattern, collapse = "")), range = getRange(patternRle), mismatch = getMismatches(patternRle), indel = getIndels(comparison, "-")), subject = new("AlignedXStringSet", unaligned = XStringSet(seqtype, paste(degappedSubject, collapse = "")), range = getRange(subjectRle), mismatch = getMismatches(subjectRle), indel = getIndels(comparison, "+")), type = type, score = sum(substitutionMatrix[ match(explodedPattern[substitutionIndices], availableLetters) + length(availableLetters) * (match(explodedSubject[substitutionIndices], availableLetters) - 1)]) + gapOpening * sum(comparison[["values"]] %in% c("+", "-")) + gapExtension * sum(comparison[["lengths"]][comparison[["values"]] %in% c("+", "-")]), gapOpening = gapOpening, gapExtension = gapExtension) } setGeneric("PairwiseAlignments", function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, ...) standardGeneric("PairwiseAlignments")) setMethod("PairwiseAlignments", signature(pattern = "XString", subject = "XString"), function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1) { if (seqtype(pattern) != seqtype(subject)) stop("'pattern' and 'subject' must contain ", "sequences of the same type") PairwiseAlignments(as.character(pattern), as.character(subject), type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, baseClass = xsbaseclass(pattern)) } ) setMethod("PairwiseAlignments", signature(pattern = "XStringSet", subject = "missing"), function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1) { if (length(pattern) != 2) stop("'pattern' must be of length 2 when 'subject' is missing") if (diff(nchar(pattern)) != 0) stop("'pattern' elements must have the same number of characters") PairwiseAlignments(as.character(pattern[1]), as.character(pattern[2]), type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, baseClass = xsbaseclass(pattern)) } ) setMethod("PairwiseAlignments", signature(pattern = "character", subject = "missing"), function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, baseClass = "BString") { if (length(pattern) != 2) stop("'pattern' must be of length 2 when 'subject' is missing") if (diff(nchar(pattern)) != 0) stop("'pattern' elements must have the same number of characters") PairwiseAlignments(pattern[1], pattern[2], type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, baseClass = baseClass) } ) setMethod("PairwiseAlignments", signature(pattern = "character", subject = "character"), function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, baseClass = "BString") { newPairwiseAlignments(pattern = pattern, subject = subject, type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, baseClass = baseClass, pwaClass = "PairwiseAlignments") } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.PairwiseAlignments <- function(object) { message <- NULL if (!identical(class(unaligned(pattern(object))), class(unaligned(subject(object))))) message <- c(message, "'unaligned(pattern)' and 'unaligned(subject)' must be XString objects of the same base type") if (length(object@type) != 1 || !(object@type %in% c("global", "local", "overlap", "global-local", "local-global"))) message <- c(message, "'type' must be one of 'global', 'local', 'overlap', 'global-local', or 'local-global'") if (length(pattern) != length(subject)) message <- c(message, "'length(pattern)' must equal 'length(subject)'") if (!isSingleNumber(object@gapOpening) || object@gapOpening > 0) message <- c(message, "'gapOpening' must be a non-positive numeric vector of length 1") if (!isSingleNumber(object@gapExtension) || object@gapExtension > 0) message <- c(message, "'gapExtension' must be a non-positive numeric vector of length 1") message } setValidity("PairwiseAlignments", function(object) { problems <- .valid.PairwiseAlignments(object) if (is.null(problems)) TRUE else problems } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor methods. ### setMethod("pattern", "PairwiseAlignments", function(x) x@pattern) setMethod("subject", "PairwiseAlignments", function(x) x@subject) setGeneric("type", function(x) standardGeneric("type")) setMethod("type", "PairwiseAlignments", function(x) x@type) setMethod("score", "PairwiseAlignments", function(x) x@score) setMethod("insertion", "PairwiseAlignments", function(x) indel(subject(x))) setMethod("deletion", "PairwiseAlignments", function(x) indel(pattern(x))) setMethod("indel", "PairwiseAlignments", function(x) new("InDel", insertion = insertion(x), deletion = deletion(x))) setMethod("nindel", "PairwiseAlignments", function(x) new("InDel", insertion = nindel(subject(x)), deletion = nindel(pattern(x)))) setMethod("length", "PairwiseAlignments", function(x) length(score(x))) setMethod("nchar", "PairwiseAlignments", function(x, type="chars", allowNA=FALSE) nchar(subject(x))) setMethod("seqtype", "PairwiseAlignments", function(x) seqtype(subject(x))) setGeneric("pid", signature="x", function(x, type="PID1") standardGeneric("pid")) setMethod("pid", "PairwiseAlignments", function(x, type="PID1") { type <- match.arg(type, c("PID1", "PID2", "PID3", "PID4")) denom <- switch(type, "PID1" = nchar(x), "PID2" = nmatch(x) + nmismatch(x), "PID3" = pmin(nchar(unaligned(pattern(x))), nchar(unaligned(subject(x)))), "PID4" = (nchar(unaligned(pattern(x))) + nchar(unaligned(subject(x)))) / 2) 100 * nmatch(x)/denom }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### ### TODO: Make the "show" method to format the alignment in a SGD fashion ### i.e. split in 60-letter blocks and use the "|" character to highlight ### exact matches. setMethod("show", "PairwiseAlignments", function(object) { if (length(object) == 0) cat("Empty Pairwise Alignment\n") else { cat(switch(type(object), "global" = "Global", "overlap" = "Overlap", "local" = "Local", "global-local" = "Global-Local", "local-global" = "Local-Global"), " ", class(object), " (1 of ", length(object), ")\n", sep = "") if (width(pattern(object))[1] == 0 || width(subject(object))[1] == 0) { patternSpaces <- 0 subjectSpaces <- 0 } else { patternSpaces <- floor(log10(start(subject(object))[1])) - floor(log10(start(pattern(object))[1])) subjectSpaces <- max(0, - patternSpaces) patternSpaces <- max(0, patternSpaces) } cat(paste(c("pattern: ", rep(" ", patternSpaces)), collapse = "")) show(pattern(object)[1]) cat(paste(c("subject: ", rep(" ", subjectSpaces)), collapse = "")) show(subject(object)[1]) cat("score:", score(object)[1], "\n") } } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting. ### setMethod("[", "PairwiseAlignments", function(x, i, j, ..., drop) { if (!missing(j) || length(list(...)) > 0) stop("invalid subsetting") if (missing(i) || (is.logical(i) && all(i))) return(x) if (is.logical(i)) i <- which(i) if (!is.numeric(i) || any(is.na(i))) stop("invalid subsetting") if (any(i < 1) || any(i > length(x))) stop("subscript out of bounds") new(class(x), pattern = x@pattern[i], subject = x@subject[i], type = x@type, score = x@score[i], gapOpening = x@gapOpening, gapExtension = x@gapExtension) } ) setReplaceMethod("[", "PairwiseAlignments", function(x, i, j,..., value) { stop("attempt to modify the value of a ", class(x), " instance") } ) setMethod("rep", "PairwiseAlignments", function(x, times) x[rep.int(seq_len(length(x)), times)] ) Biostrings/R/PairwiseAlignments-io.R0000644000126300012640000003575412227063307021036 0ustar00biocbuildphs_compbio### ========================================================================= ### Input/output of PairwiseAlignments objects ### ------------------------------------------------------------------------- ### ### Only output is supported at the moment. ### .pre2postaligned <- function(pos, axset) { if (!is(axset, "AlignedXStringSet0") || length(axset) != 1L) stop("'axset' must be an AlignedXStringSet0 object of length 1") if (any(pos < start(axset@range)) || any(pos > end(axset@range))) stop("'pos' must be >= 'start(axset@range)' and <= 'end(axset@range)'") lkup <- integer(width(axset@range)) gap_ranges <- indel(axset)[[1L]] lkup[start(gap_ranges)] <- width(gap_ranges) lkup <- cumsum(lkup + 1L) lkup[pos - start(axset@range) + 1L] } .test.pre2postaligned <- function(axset) { if (!is(axset, "AlignedXStringSet0") || length(axset) != 1L) stop("'axset' must be an AlignedXStringSet0 object of length 1") target <- subseq(unaligned(axset)[[1L]], start(axset@range), end(axset@range)) pos <- as.integer(axset@range) current <- aligned(axset)[[1L]][.pre2postaligned(pos, axset)] identical(as.character(target), as.character(current)) } .postaligned_gap_ranges <- function(axset) { if (!is(axset, "AlignedXStringSet0") || length(axset) != 1L) stop("'axset' must be an AlignedXStringSet0 object of length 1") gap_ranges <- indel(axset)[[1L]] prealigned_gap_start <- start(gap_ranges) + start(axset@range) - 1L postaligned_gap_start <- .pre2postaligned(prealigned_gap_start, axset) - width(gap_ranges) #IRanges:::fancy_mseq(width(gap_ranges), postaligned_gap_start - 1L) IRanges(postaligned_gap_start, width=width(gap_ranges)) } .postaligned_match_ranges <- function(axset) { if (!is(axset, "AlignedXStringSet0") || length(axset) != 1L) stop("'axset' must be an AlignedXStringSet0 object of length 1") aligned_axset <- aligned(axset) postaligned_width <- width(aligned_axset) prealigned_mismatches <- mismatch(axset)[[1L]] is_in_range <- prealigned_mismatches >= start(axset@range) & prealigned_mismatches <= end(axset@range) prealigned_mismatches <- prealigned_mismatches[is_in_range] postaligned_mismatches <- .pre2postaligned(prealigned_mismatches, axset) postaligned_mismatch_ranges <- as(postaligned_mismatches, "IRanges") postaligned_gap_ranges <- .postaligned_gap_ranges(axset) postaligned_mismatches_or_indels <- union(postaligned_mismatch_ranges, postaligned_gap_ranges) setdiff(IRanges(1L, postaligned_width), postaligned_mismatches_or_indels) } .makePipes <- function(x) { if (!is(x, "PairwiseAlignments") || length(x) != 1L) stop("'x' must be a PairwiseAlignments object of length 1") x_pattern <- pattern(x) # QualityAlignedXStringSet object x_subject <- subject(x) # QualityAlignedXStringSet object postaligned_pattern <- aligned(x_pattern)[[1L]] postaligned_subject <- aligned(x_subject)[[1L]] postaligned_pattern_match_ranges <- .postaligned_match_ranges(x_pattern) postaligned_subject_match_ranges <- .postaligned_match_ranges(x_subject) postaligned_match_ranges <- intersect(postaligned_pattern_match_ranges, postaligned_subject_match_ranges) ## Sanity check: ii <- unlist(postaligned_match_ranges) if (!identical(as.character(postaligned_pattern[ii]), as.character(postaligned_subject[ii]))) stop("Biostrings internal error: mismatches and/or indels ", "reported in 'pattern(x)' and 'subject(x)' are inconsistent") tmp <- rep.int(" ", length(postaligned_pattern)) tmp[ii] <- "|" BString(paste(tmp, collapse="")) } .makeXStringSetFrom2XStrings <- function(x1=NULL, x2=NULL) { #if (is.null(x1) && is.null(x2)) # return(BStringSet(c("", ""))) if (is.null(x1)) { x1 <- XString(seqtype(x2), "-") x1 <- rep.int(x1, length(x2)) } if (is.null(x2)) { x2 <- XString(seqtype(x1), "-") x2 <- rep.int(x2, length(x1)) } c(as(x1, "XStringSet"), as(x2, "XStringSet")) } .makeXStringFromSpaces <- function(nspace) { rep.int(BString(" "), nspace) } .makePostalignedSeqs <- function(x, trim.global=FALSE) { if (!is(x, "PairwiseAlignments") || length(x) != 1L) stop("'x' must be a PairwiseAlignments object of length 1") x_pattern <- pattern(x) # QualityAlignedXStringSet object x_subject <- subject(x) # QualityAlignedXStringSet object postaligned_pattern <- aligned(x_pattern)[[1L]] postaligned_subject <- aligned(x_subject)[[1L]] ans_seqs <- c(as(postaligned_pattern, "XStringSet"), as(postaligned_subject, "XStringSet")) ## Sanity check: if (!isConstant(width(ans_seqs))) stop("Biostrings internal error: the 2 post-aligned sequences ", "must have the same length") unaligned_pattern <- unaligned(x_pattern) pattern_name <- names(unaligned(x_pattern)) if (is.null(pattern_name)) pattern_name <- "" unaligned_subject <- unaligned(x_subject) subject_name <- names(unaligned(x_subject)) if (is.null(subject_name)) subject_name <- "" ans_ranges <- c(x_pattern@range, x_subject@range) ans_pipes <- .makePipes(x) if (trim.global) { names(ans_seqs) <- c(pattern_name, subject_name) return(list(ans_seqs, ans_ranges, ans_pipes)) } x_type <- type(x) is_pattern_global <- x_type %in% c("global", "global-local") is_subject_global <- x_type %in% c("global", "local-global") if (is_pattern_global) { unaligned_pattern <- unaligned_pattern[[1L]] start1 <- start(ans_ranges)[1L] if (start1 > 1L) { prefix1 <- subseq(unaligned_pattern, end=start1 - 1L) prefixes <- .makeXStringSetFrom2XStrings(x1=prefix1) ans_seqs <- xscat(prefixes, ans_seqs) prefix <- .makeXStringFromSpaces(length(prefix1)) ans_pipes <- xscat(prefix, ans_pipes) start(ans_ranges)[1L] <- 1L } end1 <- end(ans_ranges)[1L] if (end1 < length(unaligned_pattern)) { suffix1 <- subseq(unaligned_pattern, start=end1 + 1L) suffixes <- .makeXStringSetFrom2XStrings(x1=suffix1) ans_seqs <- xscat(ans_seqs, suffixes) suffix <- .makeXStringFromSpaces(length(suffix1)) ans_pipes <- xscat(ans_pipes, suffix) end(ans_ranges)[1L] <- length(unaligned_pattern) } } if (is_subject_global) { unaligned_subject <- unaligned_subject[[1L]] start2 <- start(ans_ranges)[2L] if (start2 > 1L) { prefix2 <- subseq(unaligned_subject, end=start2 - 1L) prefixes <- .makeXStringSetFrom2XStrings(x2=prefix2) ans_seqs <- xscat(prefixes, ans_seqs) prefix <- .makeXStringFromSpaces(length(prefix2)) ans_pipes <- xscat(prefix, ans_pipes) start(ans_ranges)[2L] <- 1L } end2 <- end(ans_ranges)[2L] if (end2 < length(unaligned_subject)) { suffix2 <- subseq(unaligned_subject, start=end2 + 1L) suffixes <- .makeXStringSetFrom2XStrings(x2=suffix2) ans_seqs <- xscat(ans_seqs, suffixes) suffix <- .makeXStringFromSpaces(length(suffix2)) ans_pipes <- xscat(ans_pipes, suffix) end(ans_ranges)[2L] <- length(unaligned_subject) } } names(ans_seqs) <- c(pattern_name, subject_name) list(ans_seqs, ans_ranges, ans_pipes) } .writePairHeader <- function(x, alignment.length, Identity, Similarity, Gaps, pattern.name="P1", subject.name="S1", Matrix=NA, file="") { if (!is(x, "PairwiseAlignments") || length(x) != 1L) stop("'x' must be a PairwiseAlignments object of length 1") if (!isSingleNumber(alignment.length)) stop("'alignment.length' must be a single number") if (!is.integer(alignment.length)) alignment.length <- as.integer(alignment.length) if (!isSingleStringOrNA(Matrix)) stop("'Matrix' must be a single string or NA") Gap_penalty <- sprintf("%.1f", - (x@gapOpening + x@gapExtension)) Extend_penalty <- sprintf("%.1f", - x@gapExtension) prettyPercentage <- function(ratio) sprintf("%.1f%%", round(ratio * 100, digits=1L)) Identity_percentage <- prettyPercentage(Identity / alignment.length) Identity <- paste(format(Identity, width=7L), "/", alignment.length, " (", Identity_percentage, ")", sep="") Similarity_percentage <- prettyPercentage(Similarity / alignment.length) Similarity <- paste(format(Similarity, width=5L), "/", alignment.length, " (", Similarity_percentage, ")", sep="") Gaps_percentage <- prettyPercentage(Gaps / alignment.length) Gaps <- paste(format(Gaps, width=11L), "/", alignment.length, " (", Gaps_percentage, ")", sep="") Score <- x@score cat("#=======================================\n", file=file) cat("#\n", file=file) cat("# Aligned_sequences: 2\n", file=file) cat("# 1: ", pattern.name, "\n", sep="", file=file) cat("# 2: ", subject.name, "\n", sep="", file=file) cat("# Matrix: ", Matrix, "\n", sep="", file=file) cat("# Gap_penalty: ", Gap_penalty, "\n", sep="", file=file) cat("# Extend_penalty: ", Extend_penalty, "\n", sep="", file=file) cat("#\n", file=file) cat("# Length: ", alignment.length, "\n", sep="", file=file) cat("# Identity: ", Identity, "\n", sep="", file=file) cat("# Similarity: ", Similarity, "\n", sep="", file=file) cat("# Gaps: ", Gaps, "\n", sep="", file=file) cat("# Score: ", Score, "\n", sep="", file=file) cat("#\n#\n", file=file) cat("#=======================================\n", file=file) } .writePairSequences <- function(top.string, bottom.string, middle.string, top.name="P1", bottom.name="S1", top.start=1L, bottom.start=1L, block.width=50, file="") { if (!isSingleNumber(block.width)) stop("'block.width' must be a single number") if (!is.integer(block.width)) block.width <- as.integer(block.width) alignment_length <- length(top.string) start_width <- max(nchar(as.character(top.start + alignment_length)), nchar(as.character(bottom.start + alignment_length))) name_width <- max(20L - start_width - 1L, nchar(top.name), nchar(bottom.name)) nblock <- alignment_length %/% block.width if (alignment_length %% block.width != 0L) nblock <- nblock + 1L start1 <- top.start start3 <- bottom.start for (i in seq_len(nblock)) { to <- i * block.width from <- to - block.width + 1L if (to > alignment_length) to <- alignment_length string1 <- as.character(subseq(top.string, from, to)) string2 <- as.character(subseq(middle.string, from, to)) string3 <- as.character(subseq(bottom.string, from, to)) if (i != 1L) cat("\n", file=file) ## 1st line cat(format(top.name, width=name_width), " ", format(start1, justify="right", width=start_width), " ", string1, file=file, sep="") end1 <- start1 + to - from - countPattern("-", string1) cat(format(end1, justify="right", width=7L), "\n", sep="", file=file) ## 2nd line cat(format("", width=name_width), " ", format("", width=start_width), " ", string2, "\n", file=file, sep="") ## 2rd line cat(format(bottom.name, width=name_width), " ", format(start3, justify="right", width=start_width), " ", string3, file=file, sep="") end3 <- start3 + to - from - countPattern("-", string3) cat(format(end3, justify="right", width=7L), "\n", sep="", file=file) start1 <- end1 + 1L start3 <- end3 + 1L } } writePairwiseAlignments <- function(x, file="", Matrix=NA, block.width=50) { if (!is(x, "PairwiseAlignments")) stop("'x' must be a PairwiseAlignments object") if (isSingleString(file)) { if (file == "") { file <- stdout() } else if (substring(file, 1L, 1L) == "|") { file <- pipe(substring(file, 2L), "w") on.exit(close(file)) } else { file <- file(file, "w") on.exit(close(file)) } } else if (!is(file, "connection")) { stop("'file' must be a single string or a connection object") } pkgversion <- as.character(packageVersion("Biostrings")) Program <- paste("Biostrings (version ", pkgversion, "), ", "a Bioconductor package", sep="") cat("########################################\n", file=file) cat("# Program: ", Program, "\n", sep="", file=file) cat("# Rundate: ", date(), "\n", sep="", file=file) cat("########################################\n", file=file) x_len <- length(x) if (x_len == 0L) warning("'x' is an empty PairwiseAlignments object ", "-> nothing to write") #else if (x_len >= 2L) # warning("'x' contains more than 1 pairwise alignment") x_type <- type(x) is_pattern_global <- x_type %in% c("global", "global-local") is_subject_global <- x_type %in% c("global", "local-global") if (length(unaligned(subject(x))) != 1L) { bottom_name0 <- "" } else { bottom_name0 <- "S1" } for (i in seq_len(x_len)) { #if (i != 1L) # cat("\n\n", file=file) xi <- x[i] postaligned_seqs <- .makePostalignedSeqs(xi) seqs <- postaligned_seqs[[1L]] ranges <- postaligned_seqs[[2L]] pipes <- postaligned_seqs[[3L]] name1 <- names(seqs)[1L] if (name1 == "") name1 <- paste("P", i, sep="") name2 <- names(seqs)[2L] if (name2 == "") { if (bottom_name0 == "") { name2 <- paste("S", i, sep="") } else { name2 <- bottom_name0 } } Identity <- countPattern("|", pipes) Gaps <- sum(width(union(ranges(matchPattern("-", seqs[[1L]])), ranges(matchPattern("-", seqs[[2L]]))))) .writePairHeader(xi, length(seqs[[1L]]), Identity, NA, Gaps, pattern.name=name1, subject.name=name2, Matrix=Matrix, file=file) cat("\n", file=file) start1 <- start(ranges)[1L] start2 <- start(ranges[2L]) .writePairSequences(seqs[[1L]], seqs[[2L]], pipes, top.name=name1, bottom.name=name2, top.start=start1, bottom.start=start2, block.width=block.width, file=file) cat("\n\n", file=file) } cat("#---------------------------------------\n", file=file) cat("#---------------------------------------\n", file=file) invisible(NULL) } Biostrings/R/PairwiseAlignmentsSingleSubject-class.R0000644000126300012640000002420712227063307024205 0ustar00biocbuildphs_compbio### ========================================================================== ### PairwiseAlignmentsSingleSubject objects ### -------------------------------------------------------------------------- ### A PairwiseAlignmentsSingleSubject object contains the result of the ### pairwise alignment of many patterns to one subject. ### setClass("PairwiseAlignmentsSingleSubject", contains="PairwiseAlignments" ) setClass("PairwiseAlignmentsSingleSubjectSummary", representation( type="character", score="numeric", nmatch="numeric", nmismatch="numeric", ninsertion="matrix", ndeletion="matrix", coverage="Rle", mismatchSummary="list" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Constructors. ### setGeneric("PairwiseAlignmentsSingleSubject", function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, ...) standardGeneric("PairwiseAlignmentsSingleSubject")) setMethod("PairwiseAlignmentsSingleSubject", signature(pattern = "XString", subject = "XString"), function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1) { if (seqtype(pattern) != seqtype(subject)) stop("'pattern' and 'subject' must contain ", "sequences of the same type") PairwiseAlignmentsSingleSubject(as.character(pattern), as.character(subject), type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, baseClass = xsbaseclass(pattern)) } ) setMethod("PairwiseAlignmentsSingleSubject", signature(pattern = "XStringSet", subject = "missing"), function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1) { if (length(pattern) != 2) stop("'pattern' must be of length 2 when 'subject' is missing") if (diff(nchar(pattern)) != 0) stop("'pattern' elements must have the same number of characters") PairwiseAlignmentsSingleSubject(as.character(pattern[1]), as.character(pattern[2]), type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, baseClass = xsbaseclass(pattern)) } ) setMethod("PairwiseAlignmentsSingleSubject", signature(pattern = "character", subject = "missing"), function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, baseClass = "BString") { if (length(pattern) != 2) stop("'pattern' must be of length 2 when 'subject' is missing") if (diff(nchar(pattern)) != 0) stop("'pattern' elements must have the same number of characters") PairwiseAlignmentsSingleSubject(pattern[1], pattern[2], type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, baseClass = baseClass) } ) setMethod("PairwiseAlignmentsSingleSubject", signature(pattern = "character", subject = "character"), function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, baseClass = "BString") { newPairwiseAlignments(pattern = pattern, subject = subject, type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, baseClass = baseClass, pwaClass = "PairwiseAlignmentsSingleSubject") } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor methods. ### ### TODO: Support the 'width' argument. setMethod("Views", signature = c(subject = "PairwiseAlignmentsSingleSubject"), function(subject, start=NULL, end=NULL, width=NULL, names=NULL) { if (!is.null(width)) stop("\"Views\" method for PairwiseAlignmentsSingleSubject objects ", "does not support the 'width' argument yet, sorry!") if (is.null(start)) start <- NA if (all(is.na(start))) start <- start(subject(subject)) else if (!is.numeric(start) || length(start) > 1) stop("'start' must be either NA or an integer vector of length 1") else start <- as.integer(start) + start(subject(subject)) if (is.null(end)) end <- NA if (all(is.na(end))) end <- end(subject(subject)) else if (!is.numeric(end) || length(end) > 1) stop("'end' must be either NA or an integer vector of length 1") else end <- as.integer(end) + start(subject(subject)) tmp <- unaligned(subject(subject)) if (length(tmp) != 1L) stop("internal error: length(tmp) != 1") ans_subject <- tmp[[1L]] Views(ans_subject, start=start, end=end, names=names) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "summary" method. ### setMethod("summary", "PairwiseAlignmentsSingleSubject", function(object, weight=1L, ...) { if (!is.numeric(weight) || !(length(weight) %in% c(1, length(object)))) stop("'weight' must be an integer vector with length 1 or 'length(object)'") if (!is.integer(weight)) weight <- as.integer(weight) if (all(weight == 1)) new("PairwiseAlignmentsSingleSubjectSummary", type = type(object), score = score(object), nmatch = nmatch(object), nmismatch = nmismatch(object), ninsertion = nindel(subject(object)), ndeletion = nindel(pattern(object)), coverage = coverage(object), mismatchSummary = mismatchSummary(object)) else new("PairwiseAlignmentsSingleSubjectSummary", type = type(object), score = rep(score(object), weight), nmatch = rep(nmatch(object), weight), nmismatch = rep(nmismatch(object), weight), ninsertion = nindel(subject(object))[rep(seq_len(length(object)), weight), , drop = FALSE], ndeletion = nindel(pattern(object))[rep(seq_len(length(object)), weight), , drop = FALSE], coverage = coverage(object, weight = weight), mismatchSummary = mismatchSummary(object, weight = weight)) }) setMethod("show", "PairwiseAlignmentsSingleSubjectSummary", function(object) { cat(switch(type(object), "global" = "Global", "overlap" = "Overlap", "local" = "Local", "global-local" = "Global-Local", "local-global" = "Local-Global"), " Single Subject Pairwise Alignments\n", sep = "") cat("Number of Alignments: ", length(score(object)), "\n", sep = "") cat("\nScores:\n") print(summary(score(object))) cat("\nNumber of matches:\n") print(summary(nmatch(object))) n <- min(nrow(mismatchSummary(object)[["subject"]]), 10) cat(paste("\nTop", n, "Mismatch Counts:\n")) mmtable <- mismatchSummary(object)[["subject"]][ order(mismatchSummary(object)[["subject"]][["Count"]], mismatchSummary(object)[["subject"]][["Probability"]], decreasing = TRUE)[seq_len(n)],,drop=FALSE] rownames(mmtable) <- NULL print(mmtable) }) setMethod("type", "PairwiseAlignmentsSingleSubjectSummary", function(x) x@type) setMethod("score", "PairwiseAlignmentsSingleSubjectSummary", function(x) x@score) setMethod("nindel", "PairwiseAlignmentsSingleSubjectSummary", function(x) new("InDel", insertion = x@ninsertion, deletion = x@ndeletion)) setMethod("length", "PairwiseAlignmentsSingleSubjectSummary", function(x) length(score(x))) setMethod("nchar", "PairwiseAlignmentsSingleSubjectSummary", function(x, type="chars", allowNA=FALSE) unname(nmatch(x) + nmismatch(x) + x@ninsertion[,"WidthSum"] + x@ndeletion[,"WidthSum"])) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "as.character" method. ### setMethod("aligned", "PairwiseAlignmentsSingleSubject", function(x, degap=FALSE, gapCode="-", endgapCode="-") { if (degap) { value <- aligned(pattern(x), degap = degap) } else { codecX <- xscodec(x) if (is.null(codecX)) { gapCode <- charToRaw(gapCode) endgapCode <- charToRaw(endgapCode) } else { letters2codes <- codecX@codes names(letters2codes) <- codecX@letters gapCode <- as.raw(letters2codes[[gapCode]]) endgapCode <- as.raw(letters2codes[[endgapCode]]) } value <- .Call2("PairwiseAlignmentsSingleSubject_align_aligned", x, gapCode, endgapCode, PACKAGE="Biostrings") } value }) setMethod("as.character", "PairwiseAlignmentsSingleSubject", function(x) { as.character(aligned(x)) }) setMethod("toString", "PairwiseAlignmentsSingleSubject", function(x, ...) toString(as.character(x), ...)) setMethod("as.matrix", "PairwiseAlignmentsSingleSubject", function(x) { as.matrix(aligned(x)) }) Biostrings/R/QualityScaledXStringSet.R0000644000126300012640000001140112227063307021342 0ustar00biocbuildphs_compbio### ========================================================================= ### QualityScaledXStringSet objects ### ------------------------------------------------------------------------- ### setClass("QualityScaledXStringSet", contains="XStringSet", representation( "VIRTUAL", quality = "XStringQuality" ) ) ### QualityScaledXStringSet subclasses setClass("QualityScaledBStringSet", contains=c("BStringSet", "QualityScaledXStringSet") ) setClass("QualityScaledDNAStringSet", contains=c("DNAStringSet", "QualityScaledXStringSet") ) setClass("QualityScaledRNAStringSet", contains=c("RNAStringSet", "QualityScaledXStringSet") ) setClass("QualityScaledAAStringSet", contains=c("AAStringSet", "QualityScaledXStringSet") ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Validity. ### .valid.QualityScaledXStringSet <- function(object) { message <- NULL if (!(length(object@quality) %in% c(1, length(object)))) message <- c(message, "'length(quality)' != 1 or length of 'XStringSet'") if (!all(nchar(object@quality) == 1 | nchar(object@quality) == nchar(object))) message <- c(message, "'nchar(quality)' must equal 1 or nchar of 'XStringSet'") message } setValidity("QualityScaledXStringSet", function(object) { problems <- .valid.QualityScaledXStringSet(object) if (is.null(problems)) TRUE else problems } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor methods. ### setGeneric("quality", function(x) standardGeneric("quality"), useAsDefault = function(x) x@quality) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The user-friendly versatile constructors. ### QualityScaledXStringSet <- function(x, quality) { if (!is(x, "XStringSet")) stop("'x' must be of class 'XStringSet'") if (!is(quality, "XStringQuality")) stop("'quality' must be of class 'XStringQuality'") if (!(length(quality) %in% c(1, length(x)))) stop("'length(quality)' must equal 1 or 'length(x)'") if (!all(nchar(quality) == 1 | nchar(quality) == nchar(x))) stop("'nchar(quality)' must equal 1 or 'nchar(x)'") output <- as(x, paste("QualityScaled", class(x), sep="")) slot(output, "quality", check=FALSE) <- quality output } QualityScaledBStringSet <- function(x, quality) QualityScaledXStringSet(BStringSet(x), quality) QualityScaledDNAStringSet <- function(x, quality) QualityScaledXStringSet(DNAStringSet(x), quality) QualityScaledRNAStringSet <- function(x, quality) QualityScaledXStringSet(RNAStringSet(x), quality) QualityScaledAAStringSet <- function(x, quality) QualityScaledXStringSet(AAStringSet(x), quality) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Inherited methods. ### setMethod("narrow", "QualityScaledXStringSet", function(x, start=NA, end=NA, width=NA, use.names=TRUE) { x@ranges <- narrow(x@ranges, start=start, end=end, width=width, use.names=use.names) if (all(width(x@quality@ranges) > 1)) { x@quality@ranges <- narrow(x@quality@ranges, start=start, end=end, width=width, use.names=use.names) } x } ) setMethod("append", c("QualityScaledXStringSet", "QualityScaledXStringSet"), function(x, values, after=length(x)) { QualityScaledXStringSet(append(as(x, "XStringSet"), as(values, "XStringSet"), after=after), as(append(x@quality, values@quality, after=after), class(x@quality))) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### setMethod("show", "QualityScaledXStringSet", function(object) { cat(" A ", class(object), " instance containing:\n", sep="") cat("\n") selectMethod("show", "XStringSet")(as(object, "XStringSet")) cat("\n") show(quality(object)) cat("\n") } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting. ### .safe.subset.XStringSet <- function(x, i) { if (length(x) == 1) x else x[i] } setMethod("[", "QualityScaledXStringSet", function(x, i, j, ..., drop) { if (!missing(j) || length(list(...)) > 0) stop("invalid subsetting") if (missing(i) || (is.logical(i) && all(i))) return(x) if (is.logical(i)) i <- which(i) if (!is.numeric(i) || any(is.na(i))) stop("invalid subsetting") if (any(i < 1) || any(i > length(x))) stop("subscript out of bounds") slot(x, "quality", check=FALSE) <- .safe.subset.XStringSet(quality(x), i) callNextMethod(x, i) } ) Biostrings/R/SparseList-class.R0000644000126300012640000000433012227063307020002 0ustar00biocbuildphs_compbio### ========================================================================= ### SparseList objects ### ------------------------------------------------------------------------- ### setClass("SparseList", representation( length="integer", env="environment" ) ) ### Typical use: ### env <- new.env(hash=TRUE, parent=emptyenv()) ### key <- formatC(98L, width=10, format="d", flag="0") ### value <- 3:-2 ### assign(key, value, envir=env) ### x <- new("SparseList", length=100L, env=env) ### length(x) ### ls(x) ### ls(x, all.names=TRUE) ### as.list(x) ### as.list(x, all.names=TRUE) ### x[[1]] ### x[[98] ### x[[101]]] ### setMethod("length", "SparseList", function(x) x@length) ### 'pos', 'envir' and 'pattern' args are ignored setMethod("ls", signature(name="SparseList"), function(name, pos, envir, all.names=FALSE, pattern) { if (!all.names) return(ls(name@env, all.names=TRUE)) seq_len(length(name)) } ) setMethod("as.list", "SparseList", function(x, all.names=FALSE, ...) { if (!all.names) return(as.list(x@env, all.names=TRUE)) ans <- vector(mode="list", length=length(x)) symbols <- ls(x) for (symb in symbols) ans[[as.integer(symb)]] <- get(symb, envir=x@env) ans } ) ### Supported 'i' types: character or numeric vector of length 1. setMethod("[[", "SparseList", function(x, i, j, ...) { if (!missing(j) || length(list(...)) > 0) stop("invalid subsetting") if (missing(i)) stop("subscript is missing") if (!is.character(i) && !is.numeric(i)) stop("invalid subscript type") if (length(i) < 1L) stop("attempt to select less than one element") if (length(i) > 1L) stop("attempt to select more than one element") if (is.na(i)) stop("subscript cannot be NA") if (is.character(i)) return(get(i, envir=x@env)) if (!is.integer(i)) i <- as.integer(i) if (i < 1L || i > length(x)) stop("subscript out of bounds") i <- formatC(i, width=10, format="d", flag="0") get(i, envir=x@env) } ) Biostrings/R/XString-class.R0000644000126300012640000002454112227063307017315 0ustar00biocbuildphs_compbio### ========================================================================= ### XString objects ### ------------------------------------------------------------------------- ### ### The XString virtual class is a general container for storing an "external ### string". ### setClass("XString", contains="XRaw", representation("VIRTUAL")) ### XString subclasses (no additional slots) setClass("BString", contains="XString") setClass("DNAString", contains="XString") setClass("RNAString", contains="XString") setClass("AAString", contains="XString") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor-like methods. ### setMethod("nchar", "XString", function(x, type="chars", allowNA=FALSE) length(x)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "seqtype" and "seqtype<-" methods. ### setMethod("seqtype", "BString", function(x) "B") setMethod("seqtype", "DNAString", function(x) "DNA") setMethod("seqtype", "RNAString", function(x) "RNA") setMethod("seqtype", "AAString", function(x) "AA") ### Downgrades 'x' to a B/DNA/RNA/AAString instance! setReplaceMethod("seqtype", "XString", function(x, value) { from_seqtype <- seqtype(x) to_seqtype <- value ans_class <- paste(to_seqtype, "String", sep="") lkup <- get_seqtype_conversion_lookup(from_seqtype, to_seqtype) if (is.null(lkup)) return(new(ans_class, shared=x@shared, offset=x@offset, length=x@length)) shared <- .copySubSharedRaw(x@shared, start=x@offset+1L, nchar=x@length, lkup=lkup) new(ans_class, shared=shared, length=length(shared)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "XString.read", "XString.readCodes" and "XString.write" functions. ### NOT exported! ### XString.read <- function(x, i, imax=integer(0)) { SharedRaw.read(x@shared, x@offset + i, x@offset + imax, dec_lkup=xs_dec_lkup(x)) } XString.readCodes <- function(x, i, imax=integer(0)) { SharedRaw.readInts(x@shared, x@offset + i, x@offset + imax) } ### Only used at initialization time! (XString objects are immutable.) ### 'value' must be a character string (this is not checked). XString.write <- function(x, i, imax=integer(0), value) { if (missing(i) && missing(imax)) { nbytes <- nchar(value, type="bytes") if (nbytes == 0) return(x) ## Write data starting immediately after the last byte in SharedRaw object ## 'x@shared' that belongs to the sequence XString object 'x' is ## pointing at. ## This is safe because SharedRaw.write() is protected against subscripts ## 'i' and 'imax' being "out of bounds". i <- x@length + 1L imax <- x@length <- x@length + nbytes } #cat(x@offset + i, " -- ", x@offset + imax, "\n", sep="") SharedRaw.write(x@shared, x@offset + i, x@offset + imax, value=value, enc_lkup=xs_enc_lkup(x)) x } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The XString() constructor. NOT exported. ### ### This constructor and its helper functions use the uSEW (user-specified ### Start/End/Width) interface. ### .charToXString <- function(seqtype, x, start, end, width) { classname <- paste(seqtype, "String", sep="") solved_SEW <- solveUserSEW(width(x), start=start, end=end, width=width) .Call2("new_XString_from_CHARACTER", classname, x, start(solved_SEW), width(solved_SEW), get_seqtype_conversion_lookup("B", seqtype), PACKAGE="Biostrings") } .copySubSharedRaw <- function(x, start=1, nchar=NA, lkup=NULL) { ans <- SharedRaw(nchar) SharedVector.copy(ans, start, start + nchar - 1L, src=x, lkup=lkup) } setGeneric("XString", signature="x", function(seqtype, x, start=NA, end=NA, width=NA) standardGeneric("XString") ) setMethod("XString", "factor", function(seqtype, x, start=NA, end=NA, width=NA) { if (is.null(seqtype)) seqtype <- "B" .charToXString(seqtype, as.character(x), start, end, width) } ) setMethod("XString", "character", function(seqtype, x, start=NA, end=NA, width=NA) { if (is.null(seqtype)) seqtype <- "B" .charToXString(seqtype, x, start, end, width) } ) setMethod("XString", "XString", function(seqtype, x, start=NA, end=NA, width=NA) { ans <- subseq(x, start=start, end=end, width=width) ## `seqtype<-` must be called even when user supplied 'seqtype' is ## NULL because we want to enforce downgrade to a B/DNA/RNA/AAString ## instance if (is.null(seqtype)) seqtype <- seqtype(x) seqtype(ans) <- seqtype ans } ) ### Just because of the silly "AsIs" objects found in the probe packages ### (e.g. drosophila2probe$sequence) setMethod("XString", "AsIs", function(seqtype, x, start=NA, end=NA, width=NA) { if (!is.character(x)) stop("unsuported input type") class(x) <- "character" # keeps the names (unlike as.character()) XString(seqtype, x, start=start, end=end, width=width) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The user interfaces to the XString() constructor. ### BString <- function(x="", start=1, nchar=NA) XString("B", x, start=start, width=nchar) DNAString <- function(x="", start=1, nchar=NA) XString("DNA", x, start=start, width=nchar) RNAString <- function(x="", start=1, nchar=NA) XString("RNA", x, start=start, width=nchar) AAString <- function(x="", start=1, nchar=NA) XString("AA", x, start=start, width=nchar) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### setAs("XString", "BString", function(from) {seqtype(from) <- "B"; from} ) setAs("XString", "DNAString", function(from) {seqtype(from) <- "DNA"; from} ) setAs("XString", "RNAString", function(from) {seqtype(from) <- "RNA"; from} ) setAs("XString", "AAString", function(from) {seqtype(from) <- "AA"; from} ) setAs("character", "BString", function(from) BString(from)) setAs("character", "DNAString", function(from) DNAString(from)) setAs("character", "RNAString", function(from) RNAString(from)) setAs("character", "AAString", function(from) AAString(from)) setAs("character", "XString", function(from) BString(from)) setMethod("as.character", "XString", function(x) .Call2("new_CHARACTER_from_XString", x, xs_dec_lkup(x), PACKAGE="Biostrings") ) setMethod("toString", "XString", function(x, ...) as.character(x)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### ### 'x' must be an XString or MaskedXString object. toSeqSnippet <- function(x, width) { if (width < 7L) width <- 7L seqlen <- length(x) if (seqlen <= width) { as.character(x) } else { w1 <- (width - 2) %/% 2 w2 <- (width - 3) %/% 2 paste(as.character(subseq(x, start=1, width=w1)), "...", as.character(subseq(x, end=seqlen, width=w2)), sep="") } } setMethod("show", "XString", function(object) { lo <- object@length cat(" ", lo, "-letter \"", class(object), "\" instance\n", sep="") cat("seq:", toSeqSnippet(object, getOption("width") - 5)) cat("\n") } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Equality. ### ### We want: ### BString("ab") == "ab" # TRUE ### DNAString("TG") == RNAString("UG") # TRUE!!! ### library(BSgenome.Hsapiens.UCSC.hg18) ### dna <- Hsapiens$chr1 ### dna != Hsapiens$chr1 # FALSE ### dnav <- Views(dna, start=1:7, end=101:107) ### dnav[[1]] == dnav[[7]] # TRUE ### dnav <- Views(dna, start=1:7, end=(length(dna)-6):length(dna)) ### This is fast: ### dnav[[1]] == dnav[[7]] # FALSE ### But this would have killed your machine: ### s1 <- toString(dnav[[1]]) ### s7 <- toString(dnav[[7]]) ### s1 == s7 ### 'x' and 'y' must be XString objects .XString.equal <- function(x, y) { if (x@length != y@length) return(FALSE) ans <- !SharedVector.compare(x@shared, x@offset + 1L, y@shared, y@offset + 1L, x@length) as.logical(ans) } setMethod("==", signature(e1="XString", e2="XString"), function(e1, e2) { if (!comparable_seqtypes(seqtype(e1), seqtype(e2))) { class1 <- class(e1) class2 <- class(e2) stop("comparison between a \"", class1, "\" instance ", "and a \"", class2, "\" instance ", "is not supported") } .XString.equal(e1, e2) } ) setMethod("==", signature(e1="BString", e2="character"), function(e1, e2) { if (length(e2) != 1 || e2 %in% c("", NA)) stop("comparison between a \"BString\" object and a character vector ", "of length != 1 or an empty string or an NA ", "is not supported") .XString.equal(e1, BString(e2)) } ) setMethod("==", signature(e1="character", e2="BString"), function(e1, e2) e2 == e1 ) setMethod("!=", signature(e1="XString", e2="XString"), function(e1, e2) !(e1 == e2) ) setMethod("!=", signature(e1="BString", e2="character"), function(e1, e2) !(e1 == e2) ) setMethod("!=", signature(e1="character", e2="BString"), function(e1, e2) !(e1 == e2) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "substr" and "substring" methods. ### setMethod("substr", "XString", function(x, start, stop) subseq(x, start=start, end=stop) ) setMethod("substring", "XString", function(text, first, last=1000000L) subseq(text, start=first, end=last) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### updateObject() ### ### Update XString objects created before the big internal renaming I made ### in IRanges 1.3.76. setMethod("updateObject", "XString", function(object, ..., verbose=FALSE) { if (!is(try(object@shared, silent=TRUE), "try-error")) return(object) xdata <- object@xdata ans_shared <- new("SharedRaw") ans_shared@xp <- xdata@xp ans_shared@.link_to_cached_object=xdata@.link_to_cached_object new(class(object), shared=ans_shared, offset=object@offset, length=object@length) } ) Biostrings/R/XStringCodec-class.R0000644000126300012640000001570712227063307020257 0ustar00biocbuildphs_compbio### ========================================================================= ### XStringCodec objects ### -------------------- ### ### A XStringCodec object allows fast mapping between letters and codes. ### ### In addition to the slots 'letters' and 'codes', it has 2 extra slots ### 'enc_lkup' and 'dec_lkup' that are lookup tables. They allow fast ### translation from letters to codes and from codes to letters. ### Those lookup tables are used at the C level for fast encoding/decoding ### of the sequence contained in a DNAString or RNAString object. ### See the buildLookupTable() function for more details about lookup tables. ### ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helper functions. ### ### Could not find a simpler way to get the vector of ascii codes :-/ .letterAsByteVal <- function(letters) { if (!all(nchar(letters) == 1)) stop("strings in 'letters' must have one single letter") as.integer(charToRaw(paste(letters, collapse=""))) } ### Builds a lookup table that can be used for fast mapping from 'keys' ### (unique integers >= 0) to 'vals'. ### The returned value is a vector 'lkup' such that: ### lkup[keys + 1] is identical to vals ### Note that if 'x' and 'y' are both integer vectors of the same length, ### then lkupx2y <- buildLookupTable(x, y) and lkupy2x <- buildLookupTable(y, x) ### are reverse lookup tables. ### The key property of reverse lookup tables is: ### lkupy2x[lkupx2y[x + 1]] + 1 is identical to x ### More generally, if 'x', 'y1', 'y2', and 'z' verify: ### a) 'x' is a vector of unique non-negative integers ### b) 'y1' is a vector of non-negative integers with same length as 'x' ### c) 'y2' is a vector of unique non-negative integers ### d) 'z' is a vector of same length as 'y2' ### and if 'lkupx2y' and 'lkupy2z' are the lookup tables from 'x' to 'y1' ### and from 'y2' to 'z' (respectively), then this table: ### lkupx2z <- lkupy2z[lkupx2y + 1] ### is the lookup table from 'x' to the subset of 'z' defined by ### lkupx2z[x + 1] ### Note that 'lkupx2z[x + 1]' is exactly the same as 'lkupy2z[y1 + 1]'. buildLookupTable <- function(keys, vals) { ## Checking 'keys'. if (!is.integer(keys)) stop("'keys' must be a an integer vector") if (any(is.na(keys))) stop("'keys' cannot contain NAs") keys_len <- length(keys) if (keys_len != 0L && min(keys) < 0L) stop("'keys' cannot contain negative integers") if (any(duplicated(keys))) stop("'keys' cannot contain duplicates") ## Checking 'vals'. if (!is.atomic(vals) || length(vals) != keys_len) stop("'vals' must be a vector of the length of 'keys'") ## Build the lookup table ('ans') and return it. if (keys_len == 0L) { ans_len <- 0L # but could be anything as long as we fill with NAs } else { ans_len <- max(keys) + 1L } ans <- vector(mode=typeof(vals), length=ans_len) ans[] <- NA ans[keys + 1L] <- vals ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The XStringCodec class. ### setClass("XStringCodec", representation( letters="character", codes="integer", enc_lkup="integer", # Lookup table for fast encoding dec_lkup="integer" # Lookup table for fast decoding ) ) setMethod("initialize", "XStringCodec", function(.Object, letters, codes, extra_letters=NULL, extra_codes=NULL) { letter_byte_vals <- .letterAsByteVal(letters) codes <- as.integer(codes) .Object@letters <- letters .Object@codes <- codes .Object@dec_lkup <- buildLookupTable(codes, letter_byte_vals) if (!is.null(extra_letters)) { letter_byte_vals <- c(letter_byte_vals, .letterAsByteVal(extra_letters)) codes <- c(codes, as.integer(extra_codes)) } .Object@enc_lkup <- buildLookupTable(letter_byte_vals, codes) .Object } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The DNA and RNA alphabets and codecs. ### DNA_BASE_CODES <- c(A=1L, C=2L, G=4L, T=8L) RNA_BASE_CODES <- c(A=1L, C=2L, G=4L, U=8L) .IUPACcodes <- function(baseCodes) { baseIsU <- names(baseCodes) == "U" if (any(baseIsU)) names(baseCodes)[baseIsU] <- "T" code_list <- strsplit(IUPAC_CODE_MAP, "", fixed=TRUE) codes <- sapply(code_list, function(x) sum(baseCodes[x])) if (any(baseIsU)) names(codes)[names(codes) == "T"] <- "U" codes } .DNAorRNAcodes <- function(baseCodes, baseOnly) { if (!isTRUEorFALSE(baseOnly)) stop("'baseOnly' must be TRUE or FALSE") codes <- .IUPACcodes(baseCodes) if (baseOnly) codes[names(codes) %in% names(baseCodes)] else c(codes, `-`=16L, `+`=32L) } DNAcodes <- function(baseOnly) .DNAorRNAcodes(DNA_BASE_CODES, baseOnly) RNAcodes <- function(baseOnly) .DNAorRNAcodes(RNA_BASE_CODES, baseOnly) ### DNA and RNA alphabets. .DNA_CODES <- DNAcodes(FALSE) .RNA_CODES <- RNAcodes(FALSE) DNA_ALPHABET <- names(.DNA_CODES) RNA_ALPHABET <- names(.RNA_CODES) ### DNA_BASES could be defined more simply as being 'names(DNA_BASE_CODES)' ### but calling DNAcodes() gives us the guarantee that the order of the ### bases will be consistent with DNA_ALPHABET. DNA_BASES <- names(DNAcodes(TRUE)) RNA_BASES <- names(RNAcodes(TRUE)) ### DNA and RNA codecs. .XStringCodec.DNAorRNA <- function(codes) { letters <- names(codes) extra_letters <- setdiff(tolower(letters), letters) extra_codes <- codes[toupper(extra_letters)] new("XStringCodec", letters, codes, extra_letters, extra_codes) } DNA_STRING_CODEC <- .XStringCodec.DNAorRNA(.DNA_CODES) RNA_STRING_CODEC <- .XStringCodec.DNAorRNA(.RNA_CODES) ### Return the lookup table that transforms a DNA sequence into its ### complementary sequence. getDNAComplementLookup <- function() { complement_base_codes <- c(A=DNA_BASE_CODES["T"][[1]], C=DNA_BASE_CODES["G"][[1]], G=DNA_BASE_CODES["C"][[1]], T=DNA_BASE_CODES["A"][[1]]) complement_codes <- .DNAorRNAcodes(complement_base_codes, FALSE) complement_codec <- .XStringCodec.DNAorRNA(complement_codes) complement_codec@enc_lkup[DNA_STRING_CODEC@dec_lkup + 1] } ### Return the lookup table that transforms an RNA sequence into its ### complementary sequence. getRNAComplementLookup <- function() { complement_base_codes <- c(A=RNA_BASE_CODES["U"][[1]], C=RNA_BASE_CODES["G"][[1]], G=RNA_BASE_CODES["C"][[1]], U=RNA_BASE_CODES["A"][[1]]) complement_codes <- .DNAorRNAcodes(complement_base_codes, FALSE) complement_codec <- .XStringCodec.DNAorRNA(complement_codes) complement_codec@enc_lkup[RNA_STRING_CODEC@dec_lkup + 1] } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Add extra codecs below... Biostrings/R/XStringPartialMatches-class.R0000644000126300012640000000376212227063307022141 0ustar00biocbuildphs_compbio### ========================================================================= ### XStringPartialMatches objects ### ------------------------------------------------------------------------- ### A XStringPartialMatches object contains a set of partial matches ### on the same XString object, the subject string. setClass("XStringPartialMatches", contains="XStringViews", representation( subpatterns="XStringViews" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor methods setGeneric("subpatterns", function(x) standardGeneric("subpatterns")) setMethod("subpatterns", "XStringPartialMatches", function(x) x@subpatterns) setGeneric("pattern", function(x) standardGeneric("pattern")) setMethod("pattern", "XStringPartialMatches", function(x) x@subpatterns@subject) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method ### setMethod("show", "XStringPartialMatches", function(object) { subject <- subject(object) lsub <- length(subject) cat(" Views on a ", lsub, "-letter ", class(subject), " subject", sep="") #if (!is.null(subject@codec)) # cat(" with alphabet:", toString(subject@codec@letters)) cat("\nSubject:", toSeqSnippet(subject, 70)) XStringViews.show_vframe(object) pattern <- pattern(object) lpat <- length(pattern) cat(" Views on a ", lpat, "-letter ", class(pattern), " pattern", sep="") #if (!is.null(pattern@codec)) # cat(" with alphabet:", toString(pattern@codec@letters)) cat("\nPattern:", toSeqSnippet(pattern, 70)) XStringViews.show_vframe(subpatterns(object)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Subsetting ### setMethod("[", "XStringPartialMatches", function(x, i, j, ..., drop) { ans <- callNextMethod() ans@subpatterns <- ans@subpatterns[i] ans } ) Biostrings/R/XStringQuality-class.R0000644000126300012640000002072012227063307020661 0ustar00biocbuildphs_compbio### ========================================================================= ### XStringQuality objects ### ------------------------------------------------------------------------- ### An XStringQuality object contains quality information for an XString. setClass("XStringQuality", contains="BStringSet", representation("VIRTUAL") ) setClass("PhredQuality", contains="XStringQuality") setClass("SolexaQuality", contains="XStringQuality") setClass("IlluminaQuality", contains="XStringQuality") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Create a methodology for managing quality conversions. ### setGeneric("offset", function(x) standardGeneric("offset")) setMethod("offset", "PhredQuality", function(x) 33L) setMethod("offset", "SolexaQuality", function(x) 64L) setMethod("offset", "IlluminaQuality", function(x) 64L) setGeneric("minQuality", function(x) standardGeneric("minQuality")) setMethod("minQuality", "PhredQuality", function(x) 0L) setMethod("minQuality", "SolexaQuality", function(x) -5L) setMethod("minQuality", "IlluminaQuality", function(x) 0L) setGeneric("maxQuality", function(x) standardGeneric("maxQuality")) setMethod("maxQuality", "PhredQuality", function(x) 99L) setMethod("maxQuality", "SolexaQuality", function(x) 99L) setMethod("maxQuality", "IlluminaQuality", function(x) 99L) setGeneric("q2p", function(x) standardGeneric("q2p")) setMethod("q2p", "PhredQuality", function(x) function(q) 10^(-q/10)) setMethod("q2p", "SolexaQuality", function(x) function(q) 1 - 1/(1 + 10^(-q/10))) setMethod("q2p", "IlluminaQuality", function(x) function(q) 10^(-q/10)) setGeneric("p2q", function(x) standardGeneric("p2q")) setMethod("p2q", "PhredQuality", function(x) function(p) -10 * log10(p)) setMethod("p2q", "SolexaQuality", function(x) function(p) -10 * (log10(p) - log10(1 - p))) setMethod("p2q", "IlluminaQuality", function(x) function(p) -10 * log10(p)) qualityConverter <- function(x, qualityClass, outputType) { .BStringSet2integer <- function(x, scale) { if (length(x) == 0) value <- integer(0) else value <- as.integer(charToRaw(as.character(x))) - offset(scale) value } .integer2BStringSet <- function(x, scale) { if (length(x) == 0) value <- BStringSet() else value <- BStringSet(rawToChar(as.raw(pmax.int(minQuality(scale), pmin.int(maxQuality(scale), x)) + offset(scale)))) value } .numeric2BStringSet <- function(x, scale) { if (length(x) == 0) { value <- BStringSet() } else if (any(is.na(x)) || any(x < 0) || any(x > 1)) { stop("'x' must be numbers between 0 and 1 inclusive") } else { x <- pmax.int(x, 1e-16) x <- pmin.int(x, 1 - 1e-16) value <- .integer2BStringSet(as.integer(round(p2q(scale)(x))), scale) } value } scale <- new(qualityClass) outputType <- match.arg(outputType, c("BStringSet", "integer", "numeric")) transform <- paste(class(x), "2", outputType, sep = "") switch(transform, "BStringSet2BStringSet" =, "character2BStringSet" =, "integer2integer" =, "numeric2numeric" = x, "BStringSet2integer" =, "character2integer" = .BStringSet2integer(x, scale), "BStringSet2numeric" =, "character2numeric" = q2p(scale)(.BStringSet2integer(x, scale)), "integer2BStringSet" = .integer2BStringSet(x, scale), "numeric2BStringSet" = .numeric2BStringSet(x, scale), "integer2numeric" = q2p(scale)(x), "numeric2integer" = as.integer(p2q(scale)(x))) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### .characterToXStringQuality <- function(from, qualityClass) as(BStringSet(from), qualityClass) .BStringToXStringQuality <- function(from, qualityClass) as(BStringSet(from), qualityClass) .BStringSetToXStringQuality <- function(from, qualityClass) { ans <- new2(qualityClass, pool=from@pool, ranges=from@ranges, check=FALSE) names(ans) <- names(from) ans } .integerToXStringQuality <- function(from, qualityClass) as(qualityConverter(from, qualityClass, "BStringSet"), qualityClass) .numericToXStringQuality <- function(from, qualityClass) as(qualityConverter(from, qualityClass, "BStringSet"), qualityClass) .XStringQualityToInteger <- function(from, qualityClass) qualityConverter(BStringSet(from), qualityClass, "integer") .XStringQualityToNumeric <- function(from, qualityClass) qualityConverter(BStringSet(from), qualityClass, "numeric") .XStringQualityToIntegerMatrix <- function(x) { if (!isConstant(width(x))) stop("'x' must be rectangular (i.e. have a constant width)") ans <- matrix(as.integer(unlist(x)) - offset(x), nrow=length(x), byrow=TRUE) rownames(ans) <- names(x) ans } setAs("character", "PhredQuality", function(from) .characterToXStringQuality(from, "PhredQuality")) setAs("BString", "PhredQuality", function(from) .BStringToXStringQuality(from, "PhredQuality")) setAs("BStringSet", "PhredQuality", function(from) .BStringSetToXStringQuality(from, "PhredQuality")) setAs("integer", "PhredQuality", function(from) .integerToXStringQuality(from, "PhredQuality")) setAs("numeric", "PhredQuality", function(from) .numericToXStringQuality(from, "PhredQuality")) setAs("PhredQuality", "integer", function(from) .XStringQualityToInteger(from, "PhredQuality")) setMethod("as.integer", "PhredQuality", function(x) as(x, "integer")) setAs("PhredQuality", "numeric", function(from) .XStringQualityToNumeric(from, "PhredQuality")) setMethod("as.numeric", "PhredQuality", function(x) as(x, "numeric")) setAs("character", "SolexaQuality", function(from) .characterToXStringQuality(from, "SolexaQuality")) setAs("BString", "SolexaQuality", function(from) .BStringToXStringQuality(from, "SolexaQuality")) setAs("BStringSet", "SolexaQuality", function(from) .BStringSetToXStringQuality(from, "SolexaQuality")) setAs("integer", "SolexaQuality", function(from) .integerToXStringQuality(from, "SolexaQuality")) setAs("numeric", "SolexaQuality", function(from) .numericToXStringQuality(from, "SolexaQuality")) setAs("SolexaQuality", "integer", function(from) .XStringQualityToInteger(from, "SolexaQuality")) setMethod("as.integer", "SolexaQuality", function(x) as(x, "integer")) setAs("SolexaQuality", "numeric", function(from) .XStringQualityToNumeric(from, "SolexaQuality")) setMethod("as.numeric", "SolexaQuality", function(x) as(x, "numeric")) setAs("character", "IlluminaQuality", function(from) .characterToXStringQuality(from, "IlluminaQuality")) setAs("BString", "IlluminaQuality", function(from) .BStringToXStringQuality(from, "IlluminaQuality")) setAs("BStringSet", "IlluminaQuality", function(from) .BStringSetToXStringQuality(from, "IlluminaQuality")) setAs("integer", "IlluminaQuality", function(from) .integerToXStringQuality(from, "IlluminaQuality")) setAs("numeric", "IlluminaQuality", function(from) .numericToXStringQuality(from, "IlluminaQuality")) setAs("IlluminaQuality", "integer", function(from) .XStringQualityToInteger(from, "IlluminaQuality")) setMethod("as.integer", "IlluminaQuality", function(x) as(x, "integer")) setAs("IlluminaQuality", "numeric", function(from) .XStringQualityToNumeric(from, "IlluminaQuality")) setMethod("as.numeric", "IlluminaQuality", function(x) as(x, "numeric")) setMethod("as.matrix", "XStringQuality", function(x, ...) .XStringQualityToIntegerMatrix(x) ) setAs("XStringQuality", "matrix", function(from) as.matrix(from)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The user-friendly versatile constructors. PhredQuality <- function(x) as(x, "PhredQuality") SolexaQuality <- function(x) as(x, "SolexaQuality") IlluminaQuality <- function(x) as(x, "IlluminaQuality") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### alphabet and encoding ### setMethod("alphabet", "XStringQuality", function(x) { alf <- strsplit(rawToChar(as.raw(33:126)), "")[[1]] len <- maxQuality(x) - minQuality(x) + 1L alf[seq(offset(x) + minQuality(x) - 32L, length.out=len)] }) setMethod("encoding", "XStringQuality", function(x) { alf <- alphabet(x) setNames(seq(minQuality(x), length.out=length(alf)), alf) }) Biostrings/R/XStringSet-class.R0000644000126300012640000004327412227063307017775 0ustar00biocbuildphs_compbio### ========================================================================= ### XStringSet objects ### ------------------------------------------------------------------------- ### setClass("XStringSet", contains="XRawList", representation("VIRTUAL"), prototype(elementType="XString") ) ### The concrete XStringSet subclasses below have no additional slots. setClass("BStringSet", contains="XStringSet", representation(), prototype(elementType="BString") ) setClass("DNAStringSet", contains="XStringSet", representation(), prototype(elementType="DNAString") ) setClass("RNAStringSet", contains="XStringSet", representation(), prototype(elementType="RNAString") ) setClass("AAStringSet", contains="XStringSet", representation(), prototype(elementType="AAString") ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor-like methods. ### setMethod("width", "character", function(x) { if (any(is.na(x))) stop("NAs in 'x' are not supported") nchar(x, type="bytes") } ) setMethod("nchar", "XStringSet", function(x, type="chars", allowNA=FALSE) width(x) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "subseq" endomorphism and related transformations. ### ### Methods for XStringSet objects are inherited from the XVectorList class. ### setMethod("narrow", "character", function(x, start=NA, end=NA, width=NA, use.names=TRUE) { if (!normargUseNames(use.names)) names(x) <- NULL x_width <- width(x) solved_SEW <- solveUserSEW(x_width, start=start, end=end, width=width) substr(x, start=start(solved_SEW), stop=end(solved_SEW)) } ) setMethod("subseq", "character", function(x, start=NA, end=NA, width=NA) narrow(x, start=start, end=end, width=width) ) setMethod("threebands", "character", function(x, start=NA, end=NA, width=NA) { names(x) <- NULL x_width <- width(x) solved_SEW <- solveUserSEW(x_width, start=start, end=end, width=width) left <- substr(x, start=1L, stop=start(solved_SEW)-1L) middle <- substr(x, start=start(solved_SEW), stop=end(solved_SEW)) right <- substr(x, start=end(solved_SEW)+1L, stop=x_width) list(left=left, middle=middle, right=right) } ) setReplaceMethod("subseq", "character", function(x, start=NA, end=NA, width=NA, value) { bands <- threebands(x, start=start, end=end, width=width) paste(bands$left, value, bands$right, sep="") } ) ### TODO: Make this a method for XVectorList objects and move it to the ### IRanges package (this means the implementation cannot use xscat() anymore). setReplaceMethod("subseq", "XStringSet", function(x, start=NA, end=NA, width=NA, value) { bands <- threebands(x, start=start, end=end, width=width) if (is.null(value)) xscat(bands$left, bands$right) else xscat(bands$left, value, bands$right) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Unsafe constructor (not exported). Use only when 'ranges' is guaranteed ### to contain valid ranges on 'xvector' i.e. ranges that are within the ### limits of 'xvector'. ### unsafe.newXStringSet <- function(xvector, ranges, use.names=FALSE, names=NULL) { ans_class <- paste(class(xvector), "Set", sep="") ans <- XVector:::unsafe.newXVectorList1(ans_class, xvector, ranges) if (normargUseNames(use.names)) names(ans) <- names ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "seqtype" and "seqtype<-" methods. ### setMethod("seqtype", "XStringSet", function(x) seqtype(new(elementType(x))) ) ### NOT an endomorphism in general! (Because it downgrades 'x' to a ### B/DNA/RNA/AAStringSet instance.) setReplaceMethod("seqtype", "XStringSet", function(x, value) { ans_class <- paste(value, "StringSet", sep="") ## Don't try to replace the code below with 'as(x, ans_class)' because ## that would introduce a chicken-egg situation ('as(x, ans_class)' ## actually calls the seqtype() setter when 'x' is an XStringSet ## object). lkup <- get_seqtype_conversion_lookup(seqtype(x), value) if (!is.null(lkup)) x <- xvcopy(x, lkup=lkup) # temporarily breaks 'x'! new2(ans_class, pool=x@pool, ranges=x@ranges, check=FALSE) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The XStringSet() constructor. NOT exported. ### ### This constructor and its helper functions use the uSEW (user-specified ### Start/End/Width) interface. ### ### 'x' must be a character string or an XString object. .oneSeqToXStringSet <- function(seqtype, x, start, end, width, use.names) { ans_xvector <- XString(seqtype, x) ans_ranges <- solveUserSEW(length(ans_xvector), start=start, end=end, width=width, rep.refwidths=TRUE) ## We mimic how substring() replicates the name of a single string (try ## 'substring(c(A="abcdefghij"), 2, 6:2)'). if (!is(x, "XString") && normargUseNames(use.names)) { ans_names <- names(x) if (!is.null(ans_names)) ans_names <- rep.int(ans_names, length(ans_ranges)) } else { ans_names <- NULL } unsafe.newXStringSet(ans_xvector, ans_ranges, use.names=TRUE, names=ans_names) } .charToXStringSet <- function(seqtype, x, start, end, width, use.names) { if (length(x) == 1L) { ans <- .oneSeqToXStringSet(seqtype, x, start, end, width, use.names) return(ans) } use.names <- normargUseNames(use.names) ans_elementType <- paste(seqtype, "String", sep="") ans_class <- paste(ans_elementType, "Set", sep="") solved_SEW <- solveUserSEW(width(x), start=start, end=end, width=width) ans <- .Call2("new_XStringSet_from_CHARACTER", ans_class, ans_elementType, x, start(solved_SEW), width(solved_SEW), get_seqtype_conversion_lookup("B", seqtype), PACKAGE="Biostrings") if (use.names) names(ans) <- names(x) ans } setGeneric("XStringSet", signature="x", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) standardGeneric("XStringSet") ) setMethod("XStringSet", "character", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) { if (is.null(seqtype)) seqtype <- "B" .charToXStringSet(seqtype, x, start, end, width, use.names) } ) setMethod("XStringSet", "factor", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) { if (is.null(seqtype)) seqtype <- "B" if (length(x) < nlevels(x)) { ans <- .charToXStringSet(seqtype, as.character(x), start, end, width, use.names) return(ans) } ## If 'x' has less levels than elements, then it's cheaper to ## operate on its levels. In case of equality (i.e. if ## length(x) == nlevels(x)), the price is the same but the final ## XStringSet object obtained by operating on the levels might use ## less memory (if 'x' contains duplicated values). ans <- .charToXStringSet(seqtype, levels(x), start, end, width, use.names) ans[as.integer(x)] } ) setMethod("XStringSet", "XString", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) .oneSeqToXStringSet(seqtype, x, start, end, width, use.names) ) setMethod("XStringSet", "XStringSet", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) { ans <- narrow(x, start=start, end=end, width=width, use.names=use.names) ## `seqtype<-` must be called even when 'seqtype' is NULL ## because we want to enforce downgrade to a B/DNA/RNA/AAStringSet ## instance if (is.null(seqtype)) seqtype <- seqtype(x) seqtype(ans) <- seqtype ans } ) setMethod("XStringSet", "list", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) { x_len <- length(x) if (x_len == 0L) { tmp_elementType <- "BString" } else { tmp_elementType <- paste(seqtype(x[[1L]]), "String", sep="") } tmp_class <- paste(tmp_elementType, "Set", sep="") tmp <- XVector:::new_XVectorList_from_list_of_XVector(tmp_class, x) XStringSet(seqtype, tmp, start=start, end=end, width=width, use.names=use.names) } ) ### 2 extra "XStringSet" methods to deal with the probe sequences stored ### in the *probe annotation packages (e.g. drosophila2probe). setMethod("XStringSet", "AsIs", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) { if (!is.character(x)) stop("unsuported input type") class(x) <- "character" # keeps the names (unlike as.character()) .charToXStringSet(seqtype, x, start, end, width, use.names) } ) setMethod("XStringSet", "probetable", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) XStringSet(seqtype, x$sequence, start=start, end=end, width=width, use.names=use.names) ) ### Default method. setMethod("XStringSet", "ANY", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) XStringSet(seqtype, as.character(x), start=start, end=end, width=width, use.names=use.names) ) setMethod("XStringSet", "missing", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) XStringSet(seqtype, NULL) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The user interfaces to the XStringSet() constructor. ### BStringSet <- function(x=character(), start=NA, end=NA, width=NA, use.names=TRUE) XStringSet("B", x, start=start, end=end, width=width, use.names=use.names) DNAStringSet <- function(x=character(), start=NA, end=NA, width=NA, use.names=TRUE) XStringSet("DNA", x, start=start, end=end, width=width, use.names=use.names) RNAStringSet <- function(x=character(), start=NA, end=NA, width=NA, use.names=TRUE) XStringSet("RNA", x, start=start, end=end, width=width, use.names=use.names) AAStringSet <- function(x=character(), start=NA, end=NA, width=NA, use.names=TRUE) XStringSet("AA", x, start=start, end=end, width=width, use.names=use.names) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### setAs("ANY", "BStringSet", function(from) BStringSet(from)) setAs("ANY", "DNAStringSet", function(from) DNAStringSet(from)) setAs("ANY", "RNAStringSet", function(from) RNAStringSet(from)) setAs("ANY", "AAStringSet", function(from) AAStringSet(from)) setAs("ANY", "XStringSet", function(from) { from_seqtype <- try(seqtype(from), silent=TRUE) if (is(from_seqtype, "try-error")) from_seqtype <- "B" XStringSet(from_seqtype, from) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### .namesW <- 20 .XStringSet.show_frame_header <- function(iW, widthW, with.names) { cat(format("", width=iW+1), format("width", width=widthW, justify="right"), sep="") if (with.names) { cat(format(" seq", width=getOption("width")-iW-widthW-.namesW-1), format("names", width=.namesW, justify="left"), sep="") } else { cat(" seq") } cat("\n") } .XStringSet.show_frame_line <- function(x, i, iW, widthW) { width <- nchar(x)[i] snippetWidth <- getOption("width") - 2 - iW - widthW if (!is.null(names(x))) snippetWidth <- snippetWidth - .namesW - 1 seq_snippet <- toSeqSnippet(x[[i]], snippetWidth) if (!is.null(names(x))) seq_snippet <- format(seq_snippet, width=snippetWidth) cat(format(paste("[", i,"]", sep=""), width=iW, justify="right"), " ", format(width, width=widthW, justify="right"), " ", seq_snippet, sep="") if (!is.null(names(x))) { snippet_name <- names(x)[i] if (is.na(snippet_name)) snippet_name <- "" else if (nchar(snippet_name) > .namesW) snippet_name <- paste(substr(snippet_name, 1, .namesW-3), "...", sep="") cat(" ", snippet_name, sep="") } cat("\n") } ### 'half_nrow' must be >= 1 .XStringSet.show_frame <- function(x, half_nrow=5L) { if (is.null(head_nrow <- getOption("showHeadLines"))) head_nrow <- half_nrow if (is.null(tail_nrow <- getOption("showTailLines"))) tail_nrow <- half_nrow lx <- length(x) iW <- nchar(as.character(lx)) + 2 # 2 for the brackets ncharMax <- max(nchar(x)) widthW <- max(nchar(ncharMax), nchar("width")) .XStringSet.show_frame_header(iW, widthW, !is.null(names(x))) if (lx < (2*half_nrow+1L) | (lx < (head_nrow+tail_nrow+1L))) { for (i in seq_len(lx)) .XStringSet.show_frame_line(x, i, iW, widthW) } else { if (head_nrow > 0) for (i in 1:head_nrow) .XStringSet.show_frame_line(x, i, iW, widthW) cat(format("...", width=iW, justify="right"), format("...", width=widthW, justify="right"), "...\n") if (tail_nrow > 0) for (i in (lx-tail_nrow+1L):lx) .XStringSet.show_frame_line(x, i, iW, widthW) } } setMethod("show", "XStringSet", function(object) { cat(" A ", class(object), " instance of length ", length(object), "\n", sep="") if (length(object) != 0) .XStringSet.show_frame(object) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Splitting ### setMethod("splitAsListReturnedClass", "BStringSet", function(x) "BStringSetList" ) setMethod("splitAsListReturnedClass", "DNAStringSet", function(x) "DNAStringSetList" ) setMethod("splitAsListReturnedClass", "RNAStringSet", function(x) "RNAStringSetList" ) setMethod("splitAsListReturnedClass", "AAStringSet", function(x) "AAStringSetList" ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Set Operations ### .XStringSet.SetOperation <- function(x, y, FUN) { x_seqtype <- seqtype(x) if (seqtype(y) != x_seqtype) stop("'x' and 'y' must be XStringSet objects containing ", "sequences of the same type") XStringSet(x_seqtype, FUN(as.character(unique(x)), as.character(unique(y)))) } setMethod("union", c("XStringSet", "XStringSet"), function(x, y, ...) .XStringSet.SetOperation(x, y, FUN = union) ) setMethod("intersect", c("XStringSet", "XStringSet"), function(x, y, ...) .XStringSet.SetOperation(x, y, FUN = intersect) ) setMethod("setdiff", c("XStringSet", "XStringSet"), function(x, y, ...) .XStringSet.SetOperation(x, y, FUN = setdiff) ) setMethod("setequal", c("XStringSet", "XStringSet"), function(x, y) { x_seqtype <- seqtype(x) if (seqtype(y) != x_seqtype) stop("'x' and 'y' must be XStringSet objects containing ", "sequences of the same type") setequal(as.character(unique(x)), as.character(unique(y))) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Other coercion methods. ### ### 'unlist(x)' turns XStringSet object 'x' into an XString object. setMethod("unlist", "XStringSet", function(x, recursive=TRUE, use.names=TRUE) .Call2("XStringSet_unlist", x, PACKAGE="Biostrings") ) setMethod("as.character", "XStringSet", function(x, use.names=TRUE) { use.names <- normargUseNames(use.names) ans <- .Call2("new_CHARACTER_from_XStringSet", x, xs_dec_lkup(x), PACKAGE="Biostrings") if (use.names) names(ans) <- names(x) ans } ) setMethod("as.vector", "XStringSet", function(x, mode="any") { if (!isSingleString(mode)) stop("'mode' must be a single string") if (!(mode %in% c("any", "character"))) stop("'mode' can only be \"any\" or \"character\" ", "when 'x' is an XStringSet object") as.character(x) } ) setMethod("toString", "XStringSet", function(x, ...) toString(as.character(x), ...) ) setMethod("as.matrix", "XStringSet", function(x, use.names=TRUE) { use.names <- normargUseNames(use.names) nrow <- length(x) if (nrow == 0) stop("'x' must contain at least 1 string") widths <- width(x) ncol <- widths[1] if (!all(widths == ncol)) stop("'x' strings are not equal-width") y <- as.character(x, use.names=FALSE) y <- unlist(strsplit(y, NULL), recursive=FALSE, use.names=FALSE) m <- matrix(y, nrow=nrow, byrow=TRUE) if (use.names) rownames(m) <- names(x) m } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### updateObject() ### ### Update XStringSet objects created before the big change to the XStringSet ### internals ("super" slot replaced by "pool" slot). ### This change happened in Biostrings 2.13.43. setMethod("updateObject", "XStringSet", function(object, ..., verbose=FALSE) { if (!is(try(object@pool, silent=TRUE), "try-error")) return(object) ans_xvector <- updateObject(object@super) ans_ranges <- updateObject(object@ranges) unsafe.newXStringSet(ans_xvector, ans_ranges, use.names=TRUE, names=names(object)) } ) Biostrings/R/XStringSet-comparison.R0000644000126300012640000000514312227063307021033 0ustar00biocbuildphs_compbio### ========================================================================= ### Comparing and ordering the elements in one or more XStringSet objects ### ------------------------------------------------------------------------- ### ### Returns a character vector of length 2 containing the 2 XStringSet direct ### concrete subclasses that 'x' and 'y' need to be coerced to before they can ### actually be compared. .coerce_to <- function(x, y) { seqtype1 <- try(seqtype(x), silent=TRUE) if (is(seqtype1, "try-error")) seqtype1 <- "B" seqtype2 <- try(seqtype(y), silent=TRUE) if (is(seqtype2, "try-error")) seqtype2 <- "B" if (seqtype1 != seqtype2) { if ((seqtype1 != "B" && seqtype2 == "AA") || (seqtype2 != "B" && seqtype1 == "AA")) stop("comparison between a \"", class(x), "\" instance ", "and a \"", class(y), "\" instance\n", " is not supported") if (seqtype1 == "B" && seqtype2 != "AA") seqtype1 <- seqtype2 if (seqtype2 == "B" && seqtype1 != "AA") seqtype2 <- seqtype1 } class1 <- paste0(seqtype1, "StringSet") class2 <- paste0(seqtype2, "StringSet") c(class1, class2) } .coerce_and_call_next_method <- function(f, x, y, ...) { classes <- .coerce_to(x, y) class1 <- classes[[1L]] class2 <- classes[[2L]] if (!is(x, class1)) x <- as(x, class1) if (!is(y, class2)) y <- as(y, class2) ## We cannot use callNextMethod() in this context (only from within the ## body of a method definition), so we use getMethod() instead. XRawList_method <- getMethod(f, c("XRawList", "XRawList")) XRawList_method(x, y, ...) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### compare(). ### .XStringSet.compare <- function(x, y) .coerce_and_call_next_method("compare", x, y) setMethod("compare", c("XStringSet", "XStringSet"), .XStringSet.compare) setMethod("compare", c("XStringSet", "ANY"), .XStringSet.compare) setMethod("compare", c("ANY", "XStringSet"), .XStringSet.compare) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### match(). ### .XStringSet.match <- function(x, table, nomatch=NA_integer_, incomparables=NULL) { .coerce_and_call_next_method("match", x, table, nomatch=nomatch, incomparables=incomparables) } setMethod("match", c("XStringSet", "XStringSet"), .XStringSet.match) setMethod("match", c("XStringSet", "ANY"), .XStringSet.match) setMethod("match", c("ANY", "XStringSet"), .XStringSet.match) Biostrings/R/XStringSet-io.R0000644000126300012640000002601612227063307017272 0ustar00biocbuildphs_compbio### ========================================================================= ### Input/output of XStringSet objects ### ------------------------------------------------------------------------- .normargInputFilepath <- function(filepath) { if (!is.character(filepath) || any(is.na(filepath))) stop("'filepath' must be a character vector with no NAs") ## First pass: expand local paths and download any remote file. filepath2 <- character(length(filepath)) for (i in seq_len(length(filepath))) { fp <- filepath[i] con <- file(fp) con_class <- class(con)[1L] close(con) if (con_class == "url") { filepath2[i] <- tempfile() download.file(fp, filepath2[i]) } else { filepath2[i] <- path.expand(fp) } } ## Second pass: check the type of the local files (all files are ## now local). filetype <- character(length(filepath2)) for (i in seq_len(length(filepath2))) { fp <- filepath2[i] con <- file(fp) ## Ugly trick to get the type of 'con'. Is there a better way? filetype[i] <- showConnections(TRUE)[as.character(con), "class"] close(con) if (filetype[i] != "file") stop("file \"", filepath[i], "\" ", "has unsupported type: ", filetype[i]) } names(filepath2) <- filetype filepath2 } .ExternalFilePtr.close <- function(x) .Call2("ExternalFilePtr_close", x, PACKAGE="Biostrings") ### Returns a list of "external file pointers". .openInputFiles <- function(filepath) { filepath2 <- .normargInputFilepath(filepath) ans <- lapply(filepath2, function(fp) { efp <- .Call2("new_input_ExternalFilePtr", fp, PACKAGE="Biostrings") reg.finalizer(efp, .ExternalFilePtr.close, onexit=TRUE) efp }) names(ans) <- filepath ans } ### Returns a length-1 list of "external file pointers". .openOutputFile <- function(filepath, append) { if (!isSingleString(filepath)) stop("'filepath' must be a single string") if (!isTRUEorFALSE(append)) stop("'append' must be TRUE or FALSE") filepath2 <- path.expand(filepath) efp <- .Call2("new_output_ExternalFilePtr", filepath2, append, PACKAGE="Biostrings") reg.finalizer(efp, .ExternalFilePtr.close, onexit=TRUE) ans <- list(efp) names(ans) <- filepath ans } ### 'efp_list' must be a list of "external file pointers" returned by ### .openInputFiles() or .openOutputFiles(). .closeFiles <- function(efp_list) { for (efp in efp_list) .ExternalFilePtr.close(efp) } .normargNrec <- function(nrec) { if (!isSingleNumber(nrec)) stop("'nrec' must be a single integer value") if (!is.integer(nrec)) nrec <- as.integer(nrec) nrec } .normargSkip <- function(skip) { if (!isSingleNumber(skip)) stop("'skip' must be a single integer value") if (!is.integer(skip)) skip <- as.integer(skip) if (skip < 0L) stop("'skip' cannot be negative") skip } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### FASTA ### ### TODO (maybe): Rename this fasta.geometry() and deprecate fasta.info() fasta.info <- function(filepath, nrec=-1L, skip=0L, use.names=TRUE, seqtype="B") { efp_list <- .openInputFiles(filepath) on.exit(.closeFiles(efp_list)) nrec <- .normargNrec(nrec) skip <- .normargSkip(skip) use.names <- normargUseNames(use.names) seqtype <- match.arg(seqtype, c("B", "DNA", "RNA", "AA")) lkup <- get_seqtype_conversion_lookup("B", seqtype) .Call2("fasta_info", efp_list, nrec, skip, use.names, lkup, PACKAGE="Biostrings") } .read.fasta.in.XStringSet <- function(efp_list, nrec, skip, use.names, elementType, lkup) { .Call2("read_fasta_in_XStringSet", efp_list, nrec, skip, use.names, elementType, lkup, PACKAGE="Biostrings") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### FASTQ ### fastq.geometry <- function(filepath, nrec=-1L, skip=0L) { efp_list <- .openInputFiles(filepath) on.exit(.closeFiles(efp_list)) nrec <- .normargNrec(nrec) skip <- .normargSkip(skip) .Call2("fastq_geometry", efp_list, nrec, skip, PACKAGE="Biostrings") } .read.fastq.in.XStringSet <- function(efp_list, nrec, skip, use.names, elementType, lkup) { .Call2("read_fastq_in_XStringSet", efp_list, nrec, skip, use.names, elementType, lkup, PACKAGE="Biostrings") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The readBStringSet(), readDNAStringSet(), readRNAStringSet(), and ### readAAStringSet() functions. ### .readXStringSet <- function(filepath, format, nrec, skip, use.names, seqtype) { efp_list <- .openInputFiles(filepath) on.exit(.closeFiles(efp_list)) if (!isSingleString(format)) stop("'format' must be a single string") format <- match.arg(tolower(format), c("fasta", "fastq")) nrec <- .normargNrec(nrec) skip <- .normargSkip(skip) if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") elementType <- paste(seqtype, "String", sep="") lkup <- get_seqtype_conversion_lookup("B", seqtype) switch(format, "fasta"=.read.fasta.in.XStringSet(efp_list, nrec, skip, use.names, elementType, lkup), "fastq"=.read.fastq.in.XStringSet(efp_list, nrec, skip, use.names, elementType, lkup) ) } readBStringSet <- function(filepath, format="fasta", nrec=-1L, skip=0L, use.names=TRUE) .readXStringSet(filepath, format, nrec, skip, use.names, "B") readDNAStringSet <- function(filepath, format="fasta", nrec=-1L, skip=0L, use.names=TRUE) .readXStringSet(filepath, format, nrec, skip, use.names, "DNA") readRNAStringSet <- function(filepath, format="fasta", nrec=-1L, skip=0L, use.names=TRUE) .readXStringSet(filepath, format, nrec, skip, use.names, "RNA") readAAStringSet <- function(filepath, format="fasta", nrec=-1L, skip=0L, use.names=TRUE) .readXStringSet(filepath, format, nrec, skip, use.names, "AA") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### writeXStringSet() ### .write.XStringSet.to.fasta <- function(x, efp_list, width=80L) { if (!isSingleNumber(width)) stop("'width' must be a single integer") if (!is.integer(width)) width <- as.integer(width) if (width < 1L) stop("'width' must be an integer >= 1") lkup <- get_seqtype_conversion_lookup(seqtype(x), "B") .Call2("write_XStringSet_to_fasta", x, efp_list, width, lkup, PACKAGE="Biostrings") } .write.XStringSet.to.fastq <- function(x, efp_list, qualities=NULL) { if (!is.null(qualities)) { if (!is(qualities, "BStringSet")) stop("'qualities' must be NULL or a BStringSet object") if (length(qualities) != length(x)) stop("'x' and 'qualities' must have the same length") } lkup <- get_seqtype_conversion_lookup(seqtype(x), "B") .Call2("write_XStringSet_to_fastq", x, efp_list, qualities, lkup, PACKAGE="Biostrings") } writeXStringSet <- function(x, filepath, append=FALSE, format="fasta", ...) { if (!is(x, "XStringSet")) stop("'x' must be an XStringSet object") if (!isSingleString(format)) stop("'format' must be a single string") format <- match.arg(tolower(format), c("fasta", "fastq")) efp_list <- .openOutputFile(filepath, append) res <- try(switch(format, "fasta"=.write.XStringSet.to.fasta(x, efp_list, ...), "fastq"=.write.XStringSet.to.fastq(x, efp_list, ...) ), silent=FALSE) .closeFiles(efp_list) if (is(res, "try-error") && !append) { ## Get the expamded path and remove the file. expath <- attr(efp_list[[1L]], "expath") if (!file.remove(expath)) warning("cannot remove file '", expath, "'") } invisible(NULL) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Serialization of XStringSet objects. ### saveXStringSet <- function(x, objname, dirpath=".", save.dups=FALSE, verbose=TRUE) { if (!is(x, "XStringSet")) stop("'x' must be an XStringSet object") if (!isSingleString(objname)) stop("'objname' must be a single string") if (!isSingleString(dirpath)) stop("'dirpath' must be a single string") if (!isTRUEorFALSE(save.dups)) stop("'save.dups' must be TRUE or FALSE") if (!isTRUEorFALSE(verbose)) stop("'verbose' must be TRUE or FALSE") x_dups <- NULL ## Don't use 'is(x, "DNAStringSet")' here since we only want to use the ## "pre-compression trick" on a DNAStringSet *instance*. There is no ## guarantee that using this trick on an object deriving from the ## DNAStringSet class won't corrupt the data stored in the extra slots! if (class(x) == "DNAStringSet") { ## The "pre-compression trick" is based on the following property. ## If 'x_dup2unq' is an integer vector (of the same length as 'x') ## that maps from duplicated to unique elements in 'x', then ## 'x' and 'x[x_dup2unq]' contain exactly the same *values* i.e. ## 'all(x == x[x_dup2unq])' is TRUE. Note that other metadata ## attached to 'x' like the names etc could differ though! ## So by replacing 'x' with 'x[x_dup2unq]' below , we actually don't ## modify the sequences in 'x', but the internal representation of 'x' ## has changed. What has changed is that duplicated elements are not ## duplicated in memory anymore (i.e. they all point to the same place ## in memory) so calling compact() on 'x' will be much more efficient. ## Note that, for efficiency reasons, we use PDict() to extract the ## 'x_dup2unq' mapping. This means that the "pre-compression trick" ## works only if 'x' is a rectangular DNAStringSet instance with no ## IUPAC ambiguity codes. pdict <- try(PDict(x), silent=TRUE) if (!is(pdict, "try-error")) { x_dups <- pdict@dups0 x_names <- names(x) x_dup2unq <- togroup(x_dups) x <- x[x_dup2unq] names(x) <- x_names } } x <- compact(x) assign(objname, x) objfile <- paste(objname, ".rda", sep="") filepath <- file.path(dirpath, objfile) if (save.dups) { if (is.null(x_dups)) stop("could not determine 'x_dups'") objname2 <- paste(objname, "_dups", sep="") assign(objname2, x_dups) objname <- c(objname, objname2) } if (verbose) cat("Saving ", filepath, " ... ", sep="") save(list=objname, file=filepath) if (verbose) cat("OK\n") } Biostrings/R/XStringSetList-class.R0000644000126300012640000001116212227063307020620 0ustar00biocbuildphs_compbio### ========================================================================= ### XStringSetList objects ### ------------------------------------------------------------------------- ### setClass("XStringSetList", contains="CompressedList", representation( "VIRTUAL", unlistData="XStringSet" ), prototype( elementType="XStringSet" ) ) setClass("BStringSetList", contains="XStringSetList", representation( unlistData="BStringSet" ), prototype( elementType="BStringSet" ) ) setClass("DNAStringSetList", contains="XStringSetList", representation( unlistData="DNAStringSet" ), prototype( elementType="DNAStringSet" ) ) setClass("RNAStringSetList", contains="XStringSetList", representation( unlistData="RNAStringSet" ), prototype( elementType="RNAStringSet" ) ) setClass("AAStringSetList", contains="XStringSetList", representation( unlistData="AAStringSet" ), prototype( elementType="AAStringSet" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor-like methods. ### partitioning <- function(x) .Defunct("PartitioningByEnd") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The XStringSetList() constructor. NOT exported. ### .new_XStringSetList_from_list <- function(seqtype, x) { x_eltlens <- elementLengths(x) empty_idx <- which(x_eltlens == 0L) if (length(empty_idx) != 0L) { y <- x[-empty_idx] } else { y <- x } unlisted_y <- unlist(y, use.names=FALSE, recursive=FALSE) if (!is.list(unlisted_y) && length(unlisted_y) == sum(x_eltlens)) { unlisted_ans <- XStringSet(seqtype, unlisted_y) } else { ## In that case 'length(unlisted_y)' should be < 'sum(x_eltlens)' ## which means unlist() was not able to fully unlist 'y'. So let's ## try to turn each list element into an XStringSet object and then ## combine them together. This is of course much slower than if ## unlist() had succeeded. y <- lapply(unname(y), XStringSet, seqtype=seqtype) unlisted_ans <- do.call(c, y) } relist(unlisted_ans, x) } .new_XStringSetList_from_List <- function(seqtype, x) { unlisted_x <- unlist(x, use.names=FALSE) unlisted_ans <- XStringSet(seqtype, unlisted_x) ans <- relist(unlisted_ans, x) ## relist() puts the names back but not the metadata columns. mcols(ans) <- mcols(x) ans } XStringSetList <- function(seqtype, ..., use.names=TRUE) { if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") x <- list(...) if (length(x) == 1L) { x1 <- x[[1L]] if (is.list(x1) || (is(x1, "List") && !is(x1, "XStringSet"))) { x <- x1 if (is(x, "List")) { if (!use.names) names(x) <- NULL return(.new_XStringSetList_from_List(seqtype, x)) } } } if (!use.names) names(x) <- NULL .new_XStringSetList_from_list(seqtype, x) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "seqtype" and "seqtype<-" methods. ### setMethod("seqtype", "XStringSetList", function(x) seqtype(unlist(x, use.names=FALSE)) ) ### Downgrades 'x' to a B/DNA/RNA/AAStringSetList instance! setReplaceMethod("seqtype", "XStringSetList", function(x, value) { ## Could be done elegantly with 'seqtype(unlisted(x)) <- value' ## if `unlisted<-` was available. unlisted_ans <- unlist(x, use.names=FALSE) seqtype(unlisted_ans) <- value ans <- relist(unlisted_ans, x) ## relist() puts the names back but not the metadata columns. mcols(ans) <- mcols(x) ans } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### User interface to the XStringSetList() constructor ### DNAStringSetList <- function(..., use.names=TRUE) { XStringSetList("DNA", ..., use.names=use.names) } AAStringSetList <- function(..., use.names=TRUE) { XStringSetList("AA", ..., use.names=use.names) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### setMethod("show", "XStringSetList", function(object) { cat(class(object), " of length ", length(object), "\n", sep = "") IRanges:::.showAtomicList(object, minLines=10) } ) ### Display in a DataTable. showAsCell <- IRanges:::showAsCell setMethod("showAsCell", "XStringSetList", function(object) showAsCell(CharacterList(object)) ) Biostrings/R/XStringViews-class.R0000644000126300012640000003614712227063307020340 0ustar00biocbuildphs_compbio### ========================================================================= ### XStringViews objects ### ------------------------------------------------------------------------- ### ### The XStringViews class is the basic container for storing a set of views ### (start/end locations) on the same XString object, called the "subject" ### string. ### setClass("XStringViews", contains="Views", representation( subject="XString" ) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Unsafe constructor (not exported). Use only when 'start' and 'width' are ### guaranteed to be valid. ### unsafe.newXStringViews <- function(subject, start, width) new2("XStringViews", subject=subject, ranges=IRanges(start=start, width=width), check=FALSE) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### User-friendly constructor. ### setMethod("Views", "XString", function(subject, start=NULL, end=NULL, width=NULL, names=NULL) newViews(subject, start=start, end=end, width=width, names=names, Class="XStringViews") ) setMethod("Views", "character", function(subject, start=NULL, end=NULL, width=NULL, names=NULL) { xsubject <- XString(NULL, subject) Views(xsubject, start=start, end=end, width=width, names=names) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessor-like methods. ### setMethod("nchar", "XStringViews", function(x, type="chars", allowNA=FALSE) { if (length(x) == 0) return(integer(0)) start0 <- pmax.int(start(x), 1L) end0 <- pmin.int(end(x), nchar(subject(x))) ans <- end0 - start0 + 1L ans[ans < 0L] <- 0L ans } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "seqtype" and "seqtype<-" methods. ### setMethod("seqtype", "XStringViews", function(x) seqtype(subject(x))) ### Does NOT downgrade 'x' to an XStringViews instance! (endomorphism) setReplaceMethod("seqtype", "XStringViews", function(x, value) { ## could be done with 'seqtype(subject(x)) <- value' ## if `subject<-` was available subject <- subject(x) seqtype(subject) <- value x@subject <- subject x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion. ### ### From XStringViews to XStringSet. fromXStringViewsToStringSet <- function(x, out.of.limits=c("ok", "warning", "error"), use.names=FALSE) { out.of.limits <- match.arg(out.of.limits) ans_ranges <- restrict(as(x, "IRanges"), start=1L, end=nchar(subject(x)), keep.all.ranges=TRUE, use.names=use.names) if (out.of.limits != "ok" && any(width(ans_ranges) < width(x))) { if (out.of.limits == "warning") warning("trimming \"out of limits\" views") else stop("'x' has \"out of limits\" views") } unsafe.newXStringSet(subject(x), ans_ranges, use.names=TRUE, names=names(ans_ranges)) } ### We need this so that B/DNA/RNA/AAStringSet() used below work on an ### XStringViews object. setMethod("XStringSet", "XStringViews", function(seqtype, x, start=NA, end=NA, width=NA, use.names=TRUE) { y <- fromXStringViewsToStringSet(x, out.of.limits="warning", use.names=use.names) XStringSet(seqtype, y, start=start, end=end, width=width, use.names=TRUE) } ) setAs("XStringViews", "XStringSet", function(from) fromXStringViewsToStringSet(from, out.of.limits="warning", use.names=TRUE)) setAs("XStringViews", "BStringSet", function(from) BStringSet(from)) setAs("XStringViews", "DNAStringSet", function(from) DNAStringSet(from)) setAs("XStringViews", "RNAStringSet", function(from) RNAStringSet(from)) setAs("XStringViews", "AAStringSet", function(from) AAStringSet(from)) ### From XStringSet to XStringViews. .XStringSetAsViews <- function(from) successiveViews(unlist(from), width(from)) setAs("XStringSet", "Views", .XStringSetAsViews) setAs("XStringSet", "XStringViews", .XStringSetAsViews) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "show" method. ### ### The 2 helper functions below convert a given view on an XString object ### into a character-string. ### Both assume that 'start' <= 'end' (so they don't check it) and ### padd the result with spaces to produce the "margin effect" ### if 'start' or 'end' are out of limits. ### nchar(XStringViews.get_view(x, start, end)) is always end-start+1 XStringViews.get_view <- function(x, start, end) { lx <- length(x) if (end < 1 || start > lx) return(format("", width=end-start+1)) Lmargin <- "" if (start < 1) { Lmargin <- format("", width=1-start) start <- 1 } Rmargin <- "" if (end > lx) { Rmargin <- format("", width=end-lx) end <- lx } paste(Lmargin, XString.read(x, start, end), Rmargin, sep="") } ### nchar(XStringViews.get_snippet(x, start, end, snippetWidth)) is <= snippetWidth XStringViews.get_snippet <- function(x, start, end, snippetWidth) { if (snippetWidth < 7) snippetWidth <- 7 width <- end - start + 1 if (width <= snippetWidth) { XStringViews.get_view(x, start, end) } else { w1 <- (snippetWidth - 2) %/% 2 w2 <- (snippetWidth - 3) %/% 2 paste(XStringViews.get_view(x, start, start+w1-1), "...", XStringViews.get_view(x, end-w2+1, end), sep="") } } XStringViews.show_vframe_header <- function(iW, startW, endW, widthW) { cat(format("", width=iW+1), format("start", width=startW, justify="right"), " ", format("end", width=endW, justify="right"), " ", format("width", width=widthW, justify="right"), "\n", sep="") } XStringViews.show_vframe_line <- function(x, i, iW, startW, endW, widthW) { start <- start(x)[i] end <- end(x)[i] width <- end - start + 1 snippetWidth <- getOption("width") - 6 - iW - startW - endW - widthW cat(format(paste("[", i,"]", sep=""), width=iW, justify="right"), " ", format(start, width=startW, justify="right"), " ", format(end, width=endW, justify="right"), " ", format(width, width=widthW, justify="right"), " ", "[", XStringViews.get_snippet(subject(x), start, end, snippetWidth), "]\n", sep="") } XStringViews.show_vframe <- function(x) { nhead <- get_showHeadLines() ntail <- get_showTailLines() cat("\nviews:") lx <- length(x) if (lx == 0) cat(" NONE\n") else { cat("\n") iW <- nchar(as.character(lx)) + 2 # 2 for the brackets startMax <- max(start(x)) startW <- max(nchar(startMax), nchar("start")) endMax <- max(end(x)) endW <- max(nchar(endMax), nchar("end")) widthMax <- max(width(x)) widthW <- max(nchar(widthMax), nchar("width")) XStringViews.show_vframe_header(iW, startW, endW, widthW) if (lx <= nhead + ntail +1) { for (i in seq_len(lx)) XStringViews.show_vframe_line(x, i, iW, startW, endW, widthW) } else { if (nhead > 0) for (i in seq_len(nhead)) XStringViews.show_vframe_line(x, i, iW, startW, endW, widthW) cat(format("...", width=iW, justify="right"), " ", format("...", width=startW, justify="right"), " ", format("...", width=endW, justify="right"), " ", format("...", width=widthW, justify="right"), " ...\n", sep="") if (ntail > 0) for (i in (lx-ntail+1L):lx) XStringViews.show_vframe_line(x, i, iW, startW, endW, widthW) } } } setMethod("show", "XStringViews", function(object) { subject <- subject(object) lsub <- length(subject) cat(" Views on a ", lsub, "-letter ", class(subject), " subject", sep="") cat("\nsubject:", toSeqSnippet(subject, getOption("width") - 9)) XStringViews.show_vframe(object) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Equality. ### ### Assume that 'start1', 'end1', 'start2', 'end2' are single integers ### and that start1 <= end1 and start2 <= end2. XStringViews.view1_equal_view2 <- function(x1, start1, end1, x2, start2, end2) { one <- as.integer(1) w1 <- end1 - start1 + one w2 <- end2 - start2 + one if (w1 != w2) return(FALSE) lx1 <- length(x1) isBlank1 <- end1 < one || start1 > lx1 lx2 <- length(x2) isBlank2 <- end2 < one || start2 > lx2 if (isBlank1 && isBlank2) return(TRUE) if (isBlank1 || isBlank2) return(FALSE) # Left margin LmarginSize1 <- start1 < one LmarginSize2 <- start2 < one if (LmarginSize1 != LmarginSize2) return(FALSE) if (LmarginSize1) { # Both views have a left margin if (start1 != start2) return(FALSE) start1 <- one start2 <- one } # Right margin RmarginSize1 <- end1 > lx1 RmarginSize2 <- end2 > lx2 if (RmarginSize1 != RmarginSize2) return(FALSE) if (RmarginSize1) { # Both views have a right margin if (end1 - lx1 != end2 - lx2) return(FALSE) end1 <- lx1 end2 <- lx2 } # At this point, we can trust that 1 <= start1 <= end1 <= lx1 # and that 1 <= start2 <= end2 <= lx2. subseq(x1, start=start1, end=end1) == subseq(x2, start=start2, end=end2) } ### 'x' and 'y' must be XStringViews objects. ### Returns a logical vector of length max(length(x), length(y)). ### Recycle its arguments. XStringViews.equal <- function(x, y) { lx <- length(x) ly <- length(y) if (lx < ly) { tmp <- x x <- y y <- tmp tmp <- lx lx <- ly ly <- tmp } if (ly == 0) return(logical(0)) # Now we are sure that lx >= ly >= 1 ans <- logical(lx) j <- 1 for (i in seq_len(lx)) { ans[i] <- XStringViews.view1_equal_view2( subject(x), start(x)[i], end(x)[i], subject(y), start(y)[j], end(y)[j]) # Recycle if (j < ly) j <- j + 1 else j <- 1 } if (j != 1) warning(paste("longer object length", "is not a multiple of shorter object length")) ans } ### These methods are called if at least one side of the "==" (or "!=") ### operator is an XStringViews object. They have precedence over the ### corresponding methods defined for XString objects, i.e. they will ### be called if one side is an XStringViews object and the other side ### is an XString object. ### Typical use: ### v <- Views(DNAString("TAATAATG"), start=-2:9, end=0:11) ### v == v[4] ### v == v[1] ### v2 <- Views(DNAString("G"), start=1, end=3) ### v == v2 ### Also works if one side is an XString object: ### v == DNAString("ATG") ### RNAString("AUG") == v ### Whitespace matters: ### v == "TG" ### But this doesn't work neither ("TG " can't be converted to a DNAString ### object): ### v == "TG " setMethod("==", signature(e1="XStringViews", e2="XStringViews"), function(e1, e2) { if (!comparable_seqtypes(seqtype(e1), seqtype(e2))) { class1 <- class(subject(e1)) class2 <- class(subject(e2)) stop("comparison between XStringViews objects with subjects of ", "class \"", class1, "\" and \"", class2, "\" ", "is not supported") } XStringViews.equal(e1, e2) } ) setMethod("==", signature(e1="XStringViews", e2="XString"), function(e1, e2) { if (!comparable_seqtypes(seqtype(e1), seqtype(e2))) { class1 <- class(subject(e1)) class2 <- class(e2) stop("comparison between an XStringViews object with a subject of ", "class \"", class1, "\" and a \"", class2, "\" instance ", "is not supported") } XStringViews.equal(e1, as(e2, "Views")) } ) setMethod("==", signature(e1="XStringViews", e2="character"), function(e1, e2) { if (!is(subject(e1), "BString")) stop("comparison between an XStringViews object with a subject of ", "class \"", class(subject(e1)), "\" and a character vector ", "is not supported") if (length(e2) == 0 || any(e2 %in% c("", NA))) stop("comparison between an XStringViews object and a character ", "vector of length 0 or with empty strings or NAs ", "is not supported") XStringViews.equal(e1, as(BStringSet(e2), "Views")) } ) setMethod("==", signature(e1="XString", e2="XStringViews"), function(e1, e2) e2 == e1 ) setMethod("==", signature(e1="character", e2="XStringViews"), function(e1, e2) e2 == e1 ) setMethod("!=", signature(e1="XStringViews", e2="XStringViews"), function(e1, e2) !(e1 == e2) ) setMethod("!=", signature(e1="XStringViews", e2="XString"), function(e1, e2) !(e1 == e2) ) setMethod("!=", signature(e1="XStringViews", e2="character"), function(e1, e2) !(e1 == e2) ) setMethod("!=", signature(e1="XString", e2="XStringViews"), function(e1, e2) !(e1 == e2) ) setMethod("!=", signature(e1="character", e2="XStringViews"), function(e1, e2) !(e1 == e2) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Other methods. ### setMethod("as.character", "XStringViews", function(x, use.names=TRUE, check.limits=TRUE) { if (!isTRUEorFALSE(check.limits)) stop("'check.limits' must be TRUE or FALSE") if (check.limits) out.of.limits <- "error" else out.of.limits <- "warning" y <- fromXStringViewsToStringSet(x, out.of.limits=out.of.limits, use.names=use.names) as.character(y) } ) setMethod("as.matrix", "XStringViews", function(x, use.names=TRUE) { ## TODO: Supress this warning in BioC 2.12. msg <- c("as.matrix() on an XStringViews object 'x' has changed ", "behavior: now the\n views in 'x' must be of equal width ", "and each view is converted into a row of\n", " single characters. To achieve the old behavior, ", "do 'as.matrix(ranges(x))'.\n To supress this warning, do ", "'suppressWarnings(as.matrix(x))'.\n This warning will be ", "removed in BioC 2.12.") warning(msg) y <- fromXStringViewsToStringSet(x, out.of.limits="error", use.names=use.names) as.matrix(y) } ) setMethod("toString", "XStringViews", function(x, ...) { toString(as.character(x), ...) } ) Biostrings/R/align-utils.R0000644000126300012640000003504112227063307017041 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "mismatch", "nmatch" and "nmismatch" methods. ### setMethod("mismatch", c(pattern = "AlignedXStringSet0", x = "missing"), function(pattern, x, fixed) pattern@mismatch ) setMethod("nmatch", c(pattern = "PairwiseAlignments", x = "missing"), function(pattern, x, fixed) .Call2("PairwiseAlignments_nmatch", nchar(pattern), nmismatch(pattern), nindel(subject(pattern))[,"WidthSum"], nindel(pattern(pattern))[,"WidthSum"], PACKAGE="Biostrings") ) setMethod("nmatch", c(pattern = "PairwiseAlignmentsSingleSubjectSummary", x = "missing"), function(pattern, x, fixed) pattern@nmatch ) setMethod("nmismatch", c(pattern = "AlignedXStringSet0", x = "missing"), function(pattern, x, fixed) elementLengths(mismatch(pattern)) ) setMethod("nmismatch", c(pattern = "PairwiseAlignments", x = "missing"), function(pattern, x, fixed) nmismatch(pattern(pattern)) ) setMethod("nmismatch", c(pattern = "PairwiseAlignmentsSingleSubjectSummary", x = "missing"), function(pattern, x, fixed) pattern@nmismatch ) setGeneric("nedit", function(x) standardGeneric("nedit")) setMethod("nedit", "PairwiseAlignments", function(x) nmismatch(x) + unname(nindel(subject(x))[,"WidthSum"]) + unname(nindel(pattern(x))[,"WidthSum"]) ) setMethod("nedit", "PairwiseAlignmentsSingleSubjectSummary", function(x) nmismatch(x) + unname(insertion(nindel(x))[,"WidthSum"]) + unname(deletion(nindel(x))[,"WidthSum"]) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "mismatchTable" generic and methods. ### setGeneric("mismatchTable", signature = "x", function(x, shiftLeft = 0L, shiftRight = 0L, ...) standardGeneric("mismatchTable") ) setMethod("mismatchTable", "AlignedXStringSet0", function(x, shiftLeft = 0L, shiftRight = 0L, prefixColNames = "") { if (!isSingleNumber(shiftLeft) || shiftLeft > 0) stop("'shiftLeft' must be a non-positive integer") if (!isSingleNumber(shiftRight) || shiftRight < 0) stop("'shiftRight' must be a non-negative integer") shiftLeft <- as.integer(shiftLeft) shiftRight <- as.integer(shiftRight) nMismatch <- nmismatch(x) id <- rep.int(seq_len(length(nMismatch)), nMismatch) singleString <- (length(unaligned(x)) == 1) if (singleString) subset <- unaligned(x)[[1]] else subset <- unaligned(x)[id] position <- unlist(mismatch(x)) if (shiftLeft == 0L) start <- position else start <- pmax(position + shiftLeft, 1L) if (shiftRight == 0L) end <- position else end <- pmin(position + shiftRight, nchar(subset)) if (length(subset) == 0) substring <- character(0) else if (singleString) substring <- Views(subset, start=start, end=end) else substring <- narrow(subset, start=start, end=end) output <- data.frame("Id" = id, "Start" = start, "End" = end, "Substring" = as.character(substring)) if (any(nchar(prefixColNames) > 0)) names(output) <- paste(prefixColNames, names(output), sep = "") output } ) setMethod("mismatchTable", "QualityAlignedXStringSet", function(x, shiftLeft = 0L, shiftRight = 0L, prefixColNames = "") { output <- callNextMethod(x, shiftLeft = shiftLeft, shiftRight = shiftRight, prefixColNames = "") if (nrow(output) == 0) { output <- cbind(output, "Quality" = character(0)) } else { if (length(quality(unaligned(x))) == 1) { if (width(quality(unaligned(x))) == 1) quality <- Views(quality(unaligned(x))[[1]][rep.int(1L, max(output[["End"]]))], start = output[["Start"]], end = output[["End"]]) else quality <- Views(quality(unaligned(x))[[1]], start = output[["Start"]], end = output[["End"]]) } else quality <- narrow(quality(unaligned(x))[output[["Id"]]], start = output[["Start"]], end = output[["End"]]) output <- cbind(output, "Quality" = as.character(quality)) } if (any(nchar(prefixColNames) > 0)) names(output) <- paste(prefixColNames, names(output), sep = "") output } ) setMethod("mismatchTable", "PairwiseAlignments", function(x, shiftLeft = 0L, shiftRight = 0L) { cbind(mismatchTable(pattern(x), shiftLeft = shiftLeft, shiftRight = shiftRight, prefixColNames = "Pattern"), mismatchTable(subject(x), shiftLeft = shiftLeft, shiftRight = shiftRight, prefixColNames = "Subject")[,-1]) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "mismatchSummary" generic and methods. ### setGeneric("mismatchSummary", signature = "x", function(x, ...) standardGeneric("mismatchSummary") ) setMethod("mismatchSummary", "AlignedXStringSet0", function(x, weight=1L, .mismatchTable=mismatchTable(x)) { if (!is.numeric(weight) || !(length(weight) %in% c(1, length(x)))) stop("'weight' must be an integer vector with length 1 or 'length(x)'") if (!is.integer(weight)) weight <- as.integer(weight) coverageTable <- as.vector(coverage(x, weight = weight)) n <- length(coverageTable) if (length(weight) == 1) endTable <- weight * table(.mismatchTable[["End"]]) else endTable <- table(rep(.mismatchTable[["End"]], weight[.mismatchTable[["Id"]]])) countTable <- rep(0L, n) countTable[as.integer(names(endTable))] <- endTable list("position" = data.frame("Position" = seq_len(n), "Count" = countTable, "Probability" = countTable / coverageTable)) } ) setMethod("mismatchSummary", "QualityAlignedXStringSet", function(x, weight=1L, .mismatchTable=mismatchTable(x)) { if (!is.numeric(weight) || !(length(weight) %in% c(1, length(x)))) stop("'weight' must be an integer vector with length 1 or 'length(x)'") if (!is.integer(weight)) weight <- as.integer(weight) qualityValues <- (minQuality(quality(unaligned(x))) + offset(quality(unaligned(x)))): (maxQuality(quality(unaligned(x))) + offset(quality(unaligned(x)))) qualityZero <- offset(quality(unaligned(x))) if ((length(quality(unaligned(x))) == 1) && (nchar(quality(unaligned(x))) == 1)) qualityAll <- sum(as.numeric(weight) * width(x)) * alphabetFrequency(quality(unaligned(x)), collapse = TRUE)[qualityValues + 1] else { nonEmptyAlignment <- (width(x) > 0) if (length(weight) == 1) qualityAll <- as.numeric(weight) * alphabetFrequency(narrow(quality(unaligned(x))[nonEmptyAlignment], start = start(x)[nonEmptyAlignment], end = end(x)[nonEmptyAlignment]), collapse = TRUE)[qualityValues + 1] else qualityAll <- colSums(as.numeric(weight)[nonEmptyAlignment] * alphabetFrequency(narrow(quality(unaligned(x))[nonEmptyAlignment], start = start(x)[nonEmptyAlignment], end = end(x)[nonEmptyAlignment]) )[, qualityValues + 1, drop=FALSE]) } names(qualityAll) <- sapply(as.raw(qualityValues), rawToChar) qualityAll <- qualityAll[qualityAll > 0] if (length(weight) == 1) qualityTable <- weight * table(.mismatchTable[["Quality"]]) else qualityTable <- table(rep(.mismatchTable[["Quality"]], weight[.mismatchTable[["Id"]]])) qualityCounts <- rep(0L, length(qualityAll)) names(qualityCounts) <- names(qualityAll) qualityCounts[names(qualityTable)] <- qualityTable c(callNextMethod(x, weight = weight, .mismatchTable = .mismatchTable), list("quality" = data.frame("Quality" = unlist(lapply(names(qualityAll), utf8ToInt)) - qualityZero, "Count" = qualityCounts, "Probability" = qualityCounts / qualityAll))) } ) setMethod("mismatchSummary", "PairwiseAlignmentsSingleSubject", function(x, weight=1L) { if (!is.numeric(weight) || !(length(weight) %in% c(1, length(x)))) stop("'weight' must be an integer vector with length 1 or 'length(x)'") if (!is.integer(weight)) weight <- as.integer(weight) mismatchTable <- list("pattern" = mismatchTable(pattern(x)), "subject" = mismatchTable(subject(x))) combinedInfo <- paste(mismatchTable[["subject"]][["End"]], mismatchTable[["pattern"]][["Substring"]], sep = "\001") if (length(weight) == 1) subjectTable <- weight * table(combinedInfo) else subjectTable <- table(rep(combinedInfo, weight[mismatchTable[["pattern"]][["Id"]]])) if (length(subjectTable) == 0) { subjectTableLabels <- character(0) subjectPosition <- integer(0) } else { subjectTableLabels <- strsplit(names(subjectTable), split = "\001") subjectPosition <- as.integer(unlist(lapply(subjectTableLabels, "[", 1))) } output <- list("pattern" = mismatchSummary(pattern(x), weight = weight, .mismatchTable = mismatchTable[["pattern"]]), "subject" = data.frame("SubjectPosition" = subjectPosition, "Subject" = safeExplode(letter(unaligned(subject(x))[[1]], subjectPosition)), "Pattern" = unlist(lapply(subjectTableLabels, "[", 2)), "Count" = as.vector(subjectTable), "Probability" = as.vector(subjectTable) / coverage(subject(x), weight = weight)[subjectPosition, drop = TRUE])) output[["subject"]] <- output[["subject"]][order(output[["subject"]][[1]], output[["subject"]][[2]]),] rownames(output[["subject"]]) <- as.character(seq_len(nrow(output[["subject"]]))) output } ) setMethod("mismatchSummary", "PairwiseAlignmentsSingleSubjectSummary", function(x) x@mismatchSummary ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "coverage" methods. ### setMethod("coverage", "AlignedXStringSet0", function(x, shift=0L, width=NULL, weight=1L) { shift <- recycleIntegerArg(shift, "shift", length(x@range)) if (is.null(width)) width <- max(nchar(unaligned(x))) + max(shift) coverage(x@range, shift=shift, width=width, weight=weight) } ) setMethod("coverage", "PairwiseAlignmentsSingleSubject", function(x, shift=0L, width=NULL, weight=1L) coverage(subject(x), shift=shift, width=width, weight=weight) ) setMethod("coverage", "PairwiseAlignmentsSingleSubjectSummary", function(x, shift=0L, width=NULL, weight=1L) { if (shift != 0L) stop("'shift' argument is not supported for 'PairwiseAlignmentsSingleSubjectSummary' objects") if (weight != 1L) stop("'weight' argument is not supported for 'PairwiseAlignmentsSingleSubjectSummary' objects") window(x@coverage, width=width) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Compare strings ### setGeneric("compareStrings", signature = c("pattern", "subject"), function(pattern, subject) standardGeneric("compareStrings")) setMethod("compareStrings", signature = c(pattern = "character", subject = "character"), function(pattern, subject) { if (length(pattern) != length(subject)) stop("'pattern' and 'subject' must have the same length") ncharPattern <- nchar(pattern) if (any(ncharPattern != nchar(subject))) stop("'pattern' and 'subject' must have the same number of characters") .Call2("align_compareStrings", pattern, subject, max(ncharPattern), "+", "-", "?", PACKAGE="Biostrings") }) setMethod("compareStrings", signature = c(pattern = "XString", subject = "XString"), function(pattern, subject) { compareStrings(as.character(pattern), as.character(subject)) }) setMethod("compareStrings", signature = c(pattern = "XStringSet", subject = "XStringSet"), function(pattern, subject) { compareStrings(as.character(pattern), as.character(subject)) }) setMethod("compareStrings", signature = c(pattern = "AlignedXStringSet0", subject = "AlignedXStringSet0"), function(pattern, subject) { compareStrings(as.character(pattern), as.character(subject)) }) setMethod("compareStrings", signature = c(pattern = "PairwiseAlignments", subject = "missing"), function(pattern, subject) { compareStrings(pattern@pattern, pattern@subject) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### "consensusMatrix" method for PairwiseAlignmentsSingleSubject objects. ### setMethod("consensusMatrix", "PairwiseAlignmentsSingleSubject", function(x, as.prob=FALSE, shift=0L, width=NULL, baseOnly=FALSE, gapCode="-", endgapCode="-") { if (!identical(shift, 0L) || !identical(width, NULL)) stop("\"consensusMatrix\" method for PairwiseAlignmentsSingleSubject objects ", "doesn't support the 'shift' and 'width' arguments") consensusMatrix(aligned(x, gapCode=gapCode, endgapCode=endgapCode), as.prob=as.prob, baseOnly=baseOnly) }) Biostrings/R/chartr.R0000644000126300012640000000272712227063307016101 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "chartr" generic function and methods. ### .mkOldToNewLkup <- function(old, new, x) { x_seqtype <- seqtype(x) if (!is(old, "XString") || seqtype(old) != x_seqtype) old <- XString(x_seqtype, old) if (!is(new, "XString") || seqtype(new) != x_seqtype) new <- XString(x_seqtype, new) if (nchar(old) != nchar(new)) stop("'old' and 'new' must have the same length") old_codes <- XString.readCodes(old, 1, nchar(old)) new_codes <- XString.readCodes(new, 1, nchar(new)) lkup <- buildLookupTable(xscodes(x), xscodes(x)) lkup[1 + old_codes] <- new_codes lkup } setMethod("chartr", c(old="ANY", new="ANY", x="XString"), function(old, new, x) xvcopy(x, lkup=.mkOldToNewLkup(old, new, x)) ) setMethod("chartr", c(old="ANY", new="ANY", x="XStringSet"), function(old, new, x) xvcopy(x, lkup=.mkOldToNewLkup(old, new, x)) ) setMethod("chartr", c(old="ANY", new="ANY", x="XStringViews"), function(old, new, x) { x@subject <- chartr(old, new, subject(x)) x } ) setMethod("chartr", c(old="ANY", new="ANY", x="MaskedXString"), function(old, new, x) { if (any(active(masks(x)))) stop("\"chartr\" method for MaskedXString objects ", "with active masks not ready yet\n Please complain!") ans <- chartr(old, new, unmasked(x)) masks(ans) <- masks(x) ans } ) Biostrings/R/debug.R0000644000126300012640000000443112227063307015676 0ustar00biocbuildphs_compbio### debug_utils <- function() invisible(.Call2("debug_utils", PACKAGE="Biostrings")) debug_RoSeqs_utils <- function() invisible(.Call2("debug_RoSeqs_utils", PACKAGE="Biostrings")) debug_XString_class <- function() invisible(.Call2("debug_XString_class", PACKAGE="Biostrings")) debug_XStringSet_class <- function() invisible(.Call2("debug_XStringSet_class", PACKAGE="Biostrings")) debug_XStringSet_io <- function() invisible(.Call2("debug_XStringSet_io", PACKAGE="Biostrings")) debug_SparseList_utils <- function() invisible(.Call2("debug_SparseList_utils", PACKAGE="Biostrings")) debug_match_reporting <- function() invisible(.Call2("debug_match_reporting", PACKAGE="Biostrings")) debug_MIndex_class <- function() invisible(.Call2("debug_MIndex_class", PACKAGE="Biostrings")) debug_lowlevel_matching <- function() invisible(.Call2("debug_lowlevel_matching", PACKAGE="Biostrings")) debug_match_pattern_boyermoore <- function() invisible(.Call2("debug_match_pattern_boyermoore", PACKAGE="Biostrings")) debug_match_pattern_shiftor <- function() invisible(.Call2("debug_match_pattern_shiftor", PACKAGE="Biostrings")) debug_match_pattern_indels <- function() invisible(.Call2("debug_match_pattern_indels", PACKAGE="Biostrings")) debug_match_pattern <- function() invisible(.Call2("debug_match_pattern", PACKAGE="Biostrings")) debug_match_BOC <- function() invisible(.Call2("debug_match_BOC", PACKAGE="Biostrings")) debug_match_BOC2 <- function() invisible(.Call2("debug_match_BOC2", PACKAGE="Biostrings")) debug_find_palindromes <- function() invisible(.Call2("debug_find_palindromes", PACKAGE="Biostrings")) debug_BitMatrix <- function() invisible(.Call2("debug_BitMatrix", PACKAGE="Biostrings")) debug_PreprocessedTB_class <- function() invisible(.Call2("debug_PreprocessedTB_class", PACKAGE="Biostrings")) debug_match_pdict_utils <- function() invisible(.Call2("debug_match_pdict_utils", PACKAGE="Biostrings")) debug_match_pdict_Twobit <- function() invisible(.Call2("debug_match_pdict_Twobit", PACKAGE="Biostrings")) debug_match_pdict_ACtree2 <- function() invisible(.Call2("debug_match_pdict_ACtree2", PACKAGE="Biostrings")) debug_match_pdict <- function() invisible(.Call2("debug_match_pdict", PACKAGE="Biostrings")) Biostrings/R/dinucleotideFrequencyTest.R0000644000126300012640000001607612227063307022012 0ustar00biocbuildphs_compbio# Log-likelihood tests of independence & goodness of fit # Does Williams' and Yates' correction # does Monte Carlo simulation of p-values, via gtestsim.c # # G & q calculation from Sokal & Rohlf (1995) Biometry 3rd ed. # TOI Yates' correction taken from Mike Camann's 2x2 G-test fn. # GOF Yates' correction as described in Zar (2000) # more stuff taken from ctest's chisq.test() # # ToDo: # 1) Beautify # 2) Add warnings for violations # 3) Make appropriate corrections happen by default # # V3.3 Pete Hurd Sept 29 2001. phurd@ualberta.ca g.test <- function(x, y = NULL, correct="none", p = rep(1/length(x), length(x)), simulate.p.value = FALSE, B = 2000) { DNAME <- deparse(substitute(x)) if (is.data.frame(x)) x <- as.matrix(x) if (is.matrix(x)) { if (min(dim(x)) == 1) x <- as.vector(x) } if (!is.matrix(x) && !is.null(y)) { if (length(x) != length(y)) stop("x and y must have the same length") DNAME <- paste(DNAME, "and", deparse(substitute(y))) OK <- complete.cases(x, y) x <- as.factor(x[OK]) y <- as.factor(y[OK]) if ((nlevels(x) < 2) || (nlevels(y) < 2)) stop("x and y must have at least 2 levels") x <- table(x, y) } if (any(x < 0) || any(is.na(x))) stop("all entries of x must be nonnegative and finite") if ((n <- sum(x)) == 0) stop("at least one entry of x must be positive") #If x is matrix, do test of independence if (is.matrix(x)) { #Test of Independence nrows<-nrow(x) ncols<-ncol(x) if (correct=="yates"){ # Do Yates' correction? if(dim(x)[1]!=2 || dim(x)[2]!=2) # check for 2x2 matrix stop("Yates' correction requires a 2 x 2 matrix") if((x[1,1]*x[2,2])-(x[1,2]*x[2,1]) > 0) { x[1,1] <- x[1,1] - 0.5 x[2,2] <- x[2,2] - 0.5 x[1,2] <- x[1,2] + 0.5 x[2,1] <- x[2,1] + 0.5 } else { x[1,1] <- x[1,1] + 0.5 x[2,2] <- x[2,2] + 0.5 x[1,2] <- x[1,2] - 0.5 x[2,1] <- x[2,1] - 0.5 } } sr <- apply(x,1,sum) sc <- apply(x,2,sum) E <- outer(sr,sc, "*")/n # are we doing a monte-carlo? # no monte carlo GOF? if (simulate.p.value){ METHOD <- paste("Log likelihood ratio (G-test) test of independence\n\t with simulated p-value based on", B, "replicates") tmp <- .C("gtestsim", as.integer(nrows), as.integer(ncols), as.integer(sr), as.integer(sc), as.integer(n), as.integer(B), as.double(E), integer(nrows * ncols), double(n+1), integer(ncols), results=double(B), PACKAGE= "Biostrings") g <- 0 for (i in 1:nrows){ for (j in 1:ncols){ if (x[i,j] != 0) g <- g + x[i,j] * log(x[i,j]/E[i,j]) } } STATISTIC <- G <- 2 * g PARAMETER <- NA PVAL <- sum(tmp$results >= STATISTIC)/B } else { # no monte-carlo # calculate G g <- 0 for (i in 1:nrows){ for (j in 1:ncols){ if (x[i,j] != 0) g <- g + x[i,j] * log(x[i,j]/E[i,j]) } } q <- 1 if (correct=="williams"){ # Do Williams' correction row.tot <- col.tot <- 0 for (i in 1:nrows){ row.tot <- row.tot + 1/(sum(x[i,])) } for (j in 1:ncols){ col.tot <- col.tot + 1/(sum(x[,j])) } q <- 1+ ((n*row.tot-1)*(n*col.tot-1))/(6*n*(ncols-1)*(nrows-1)) } STATISTIC <- G <- 2 * g / q PARAMETER <- (nrow(x)-1)*(ncol(x)-1) PVAL <- 1-pchisq(STATISTIC,df=PARAMETER) if(correct=="none") METHOD <- "Log likelihood ratio (G-test) test of independence without correction" if(correct=="williams") METHOD <- "Log likelihood ratio (G-test) test of independence with Williams' correction" if(correct=="yates") METHOD <- "Log likelihood ratio (G-test) test of independence with Yates' correction" } } else { # x is not a matrix, so we do Goodness of Fit METHOD <- "Log likelihood ratio (G-test) goodness of fit test" if (length(x) == 1) stop("x must at least have 2 elements") if (length(x) != length(p)) stop("x and p must have the same number of elements") E <- n * p if (correct=="yates"){ # Do Yates' correction if(length(x)!=2) stop("Yates' correction requires 2 data values") if ( (x[1]-E[1]) > 0.25) { x[1] <- x[1]-0.5 x[2] <- x[2]+0.5 } else if ( (E[1]-x[1]) > 0.25){ x[1] <- x[1]+0.5 x[2] <- x[2]-0.5 } } names(E) <- names(x) g <- 0 for (i in 1:length(x)){ if (x[i] != 0) g <- g + x[i] * log(x[i]/E[i]) } q <- 1 if (correct=="williams"){ # Do Williams' correction q <- 1+(length(x)+1)/(6*n) } STATISTIC <- G <- 2*g/q PARAMETER <- length(x) - 1 PVAL <- pchisq(STATISTIC, PARAMETER, lower.tail = FALSE) } names(STATISTIC) <- "Log likelihood ratio statistic (G)" names(PARAMETER) <- "X-squared df" names(PVAL) <- "p.value" structure(list(statistic=STATISTIC,parameter=PARAMETER,p.value=PVAL, method=METHOD,data.name=DNAME, observed=x, expected=E), class="htest") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "dinucleotideFrequencyTest" generic and methods. ### .dinucleotideFrequencyTest.XStringSet <- function(x, i, j, test = c("chisq", "G", "adjG"), simulate.p.value = FALSE, B = 2000) { freqTable <- nucleotideFrequencyAt(x, c(i,j)) okRows <- rowSums(freqTable) > 0 okCols <- colSums(freqTable) > 0 freqTable <- freqTable[okRows, okCols] test <- match.arg(test) switch(test, chisq = { ans <- suppressWarnings(chisq.test(freqTable, correct = FALSE, simulate.p.value = simulate.p.value, B = B)) ans$method <- paste(ans$method, " of independence", sep = "") }, G = { ans <- suppressWarnings(g.test(freqTable, correct = "none", simulate.p.value = simulate.p.value, B = B)) }, adjG = { ans <- suppressWarnings(g.test(freqTable, correct = "williams", simulate.p.value = simulate.p.value, B = B)) }) ans$data.name <- paste("nucleotideFrequencyAt(", deparse(substitute(x)), ", c(", i, ", ", j, "))", sep = "") ans } setGeneric("dinucleotideFrequencyTest", signature="x", function(x, i, j, test = c("chisq", "G", "adjG"), simulate.p.value = FALSE, B = 2000) standardGeneric("dinucleotideFrequencyTest") ) setMethod("dinucleotideFrequencyTest", "DNAStringSet", .dinucleotideFrequencyTest.XStringSet ) setMethod("dinucleotideFrequencyTest", "RNAStringSet", .dinucleotideFrequencyTest.XStringSet ) Biostrings/R/findPalindromes.R0000644000126300012640000002630412227063307017731 0ustar00biocbuildphs_compbio### ========================================================================= ### The findPalindromes() generic & related functions ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "findPalindromes" and "findComplementedPalindromes" generics and ### methods. ### ### Return a list with the "start" and the "end" components. .find.palindromes <- function(subject, min.armlength, max.looplength, min.looplength, max.mismatch, L2R_lkup) { ## check min.armlength if (!isSingleNumber(min.armlength)) stop("'min.armlength' must be a single integer") min.armlength <- as.integer(min.armlength) if (min.armlength < 2) stop("'min.armlength' must be >= 2") ## check max.looplength if (!isSingleNumber(max.looplength)) stop("'max.looplength' must be a single integer") max.looplength <- as.integer(max.looplength) if (max.looplength < 0) stop("'max.looplength' must be a non-negative integer") ## check min.looplength if (!isSingleNumber(min.looplength)) stop("'min.looplength' must be a single integer") min.looplength <- as.integer(min.looplength) if (min.looplength > max.looplength) stop("'min.looplength' must be <= 'max.looplength'") if (min.looplength < 0) stop("'min.looplength' must be a non-negative integer") if (min.looplength >= 1) stop("'min.looplength' >= 1 not yet supported (will be very soon)") ## check max.mismatch max.mismatch <- normargMaxMismatch(max.mismatch) if (max.mismatch != 0) stop("'max.mismatch' != 0 not yet supported (will be very soon)") C_ans <- .Call2("find_palindromes", subject@shared@xp, subject@offset, subject@length, min.armlength, max.looplength, L2R_lkup, PACKAGE="Biostrings") ## sort matches from left to right and remove duplicates df <- unique(as.data.frame(C_ans[order(start(C_ans), end(C_ans))])) unsafe.newXStringViews(subject, df$start, df$width) } setGeneric("findPalindromes", signature="subject", function(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) standardGeneric("findPalindromes") ) setGeneric("findComplementedPalindromes", signature="subject", function(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) standardGeneric("findComplementedPalindromes") ) setMethod("findPalindromes", "XString", function(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) { .find.palindromes(subject, min.armlength, max.looplength, min.looplength, max.mismatch, NULL) } ) setMethod("findComplementedPalindromes", "DNAString", function(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) { .find.palindromes(subject, min.armlength, max.looplength, min.looplength, max.mismatch, getDNAComplementLookup()) } ) ### WARNING: Unlike with the "findPalindromes" method for XString objects, the ### XStringViews object returned by this method is not guaranteed to have its ### views ordered from left to right! One important particular case where this ### is guaranteed though is when 'isNormal(subject)' is TRUE (i.e. 'subject' is ### a normal XStringViews object). setMethod("findPalindromes", "XStringViews", function(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) { ans_start <- ans_width <- integer(0) for (i in seq_len(length(subject))) { pals <- findPalindromes(subject[[i]], min.armlength=min.armlength, max.looplength=max.looplength, min.looplength=min.looplength, max.mismatch=max.mismatch) offset <- start(subject)[i] - 1L ans_start <- c(ans_start, offset + start(pals)) ans_width <- c(ans_width, width(pals)) } unsafe.newXStringViews(subject(subject), ans_start, ans_width) } ) setMethod("findPalindromes", "MaskedXString", function(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) { findPalindromes(toXStringViewsOrXString(subject), min.armlength=min.armlength, max.looplength=max.looplength, min.looplength=min.looplength, max.mismatch=max.mismatch) } ) setMethod("findComplementedPalindromes", "XStringViews", function(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) { ans_start <- ans_width <- integer(0) for (i in seq_len(length(subject))) { pals <- findComplementedPalindromes(subject[[i]], min.armlength=min.armlength, max.looplength=max.looplength, min.looplength=min.looplength, max.mismatch=max.mismatch) offset <- start(subject)[i] - 1L ans_start <- c(ans_start, offset + start(pals)) ans_width <- c(ans_width, width(pals)) } unsafe.newXStringViews(subject(subject), ans_start, ans_width) } ) setMethod("findComplementedPalindromes", "MaskedXString", function(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) { findComplementedPalindromes(toXStringViewsOrXString(subject), min.armlength=min.armlength, max.looplength=max.looplength, min.looplength=min.looplength, max.mismatch=max.mismatch) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "palindromeArmLength" and "complementedPalindromeArmLength" generics ### and methods. ### setGeneric("palindromeArmLength", signature="x", function(x, max.mismatch=0, ...) standardGeneric("palindromeArmLength") ) setGeneric("complementedPalindromeArmLength", signature="x", function(x, max.mismatch=0, ...) standardGeneric("complementedPalindromeArmLength") ) setMethod("palindromeArmLength", "XString", function(x, max.mismatch=0, ...) { max.mismatch <- normargMaxMismatch(max.mismatch) revx <- reverse(x) armlength <- lcprefix(x, revx) if (armlength == 0L) stop("'x' is not a palindrome (no arms found)") armlength } ) setMethod("complementedPalindromeArmLength", "DNAString", function(x, max.mismatch=0, ...) { max.mismatch <- normargMaxMismatch(max.mismatch) revx <- reverseComplement(x) armlength <- lcprefix(x, revx) if (armlength == 0L) stop("'x' is not a complemented palindrome (no arms found)") armlength } ) setMethod("palindromeArmLength", "XStringViews", function(x, max.mismatch=0, ...) { if (length(x) == 0) return(integer(0)) sapply(seq_len(length(x)), function(i) palindromeArmLength(x[[i]], max.mismatch=max.mismatch, ...)) } ) setMethod("complementedPalindromeArmLength", "XStringViews", function(x, max.mismatch=0, ...) { if (length(x) == 0) return(integer(0)) sapply(seq_len(length(x)), function(i) complementedPalindromeArmLength(x[[i]], max.mismatch=max.mismatch, ...)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "palindromeLeftArm" and "complementedPalindromeLeftArm" generics and ### methods. ### setGeneric("palindromeLeftArm", signature="x", function(x, max.mismatch=0, ...) standardGeneric("palindromeLeftArm") ) setGeneric("complementedPalindromeLeftArm", signature="x", function(x, max.mismatch=0, ...) standardGeneric("complementedPalindromeLeftArm") ) setMethod("palindromeLeftArm", "XString", function(x, max.mismatch=0, ...) subseq(x, start=1L, end=palindromeArmLength(x, max.mismatch=max.mismatch, ...) ) ) setMethod("complementedPalindromeLeftArm", "DNAString", function(x, max.mismatch=0, ...) subseq(x, start=1L, end=complementedPalindromeArmLength(x, max.mismatch=max.mismatch, ...) ) ) setMethod("palindromeLeftArm", "XStringViews", function(x, max.mismatch=0, ...) { ans_start <- start(x) ans_width <- palindromeArmLength(x, max.mismatch=max.mismatch, ...) unsafe.newXStringViews(subject(x), ans_start, ans_width) } ) setMethod("complementedPalindromeLeftArm", "XStringViews", function(x, max.mismatch=0, ...) { ans_start <- start(x) ans_width <- complementedPalindromeArmLength(x, max.mismatch=max.mismatch, ...) unsafe.newXStringViews(subject(x), ans_start, ans_width) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "palindromeRightArm" and "complementedPalindromeRightArm" generics ### and methods. ### setGeneric("palindromeRightArm", signature="x", function(x, max.mismatch=0, ...) standardGeneric("palindromeRightArm") ) setGeneric("complementedPalindromeRightArm", signature="x", function(x, max.mismatch=0, ...) standardGeneric("complementedPalindromeRightArm") ) setMethod("palindromeRightArm", "XString", function(x, max.mismatch=0, ...) { start <- nchar(x) - palindromeArmLength(x, max.mismatch=max.mismatch, ...) + 1L subseq(x, start=start, end=nchar(x)) } ) setMethod("complementedPalindromeRightArm", "DNAString", function(x, max.mismatch=0, ...) { start <- nchar(x) - complementedPalindromeArmLength(x, max.mismatch=max.mismatch, ...) + 1L subseq(x, start=start, end=nchar(x)) } ) setMethod("palindromeRightArm", "XStringViews", function(x, max.mismatch=0, ...) { ans_width <- palindromeArmLength(x, max.mismatch=max.mismatch, ...) ans_start <- end(x) - ans_width + 1L unsafe.newXStringViews(subject(x), ans_start, ans_width) } ) setMethod("complementedPalindromeRightArm", "XStringViews", function(x, max.mismatch=0, ...) { ans_width <- complementedPalindromeArmLength(x, max.mismatch=max.mismatch, ...) ans_start <- end(x) - ans_width + 1L unsafe.newXStringViews(subject(x), ans_start, ans_width) } ) Biostrings/R/getSeq.R0000644000126300012640000000045512227063307016042 0ustar00biocbuildphs_compbio### ========================================================================= ### The getSeq() generic ### ------------------------------------------------------------------------- setGeneric("getSeq", function(x, ...) standardGeneric("getSeq")) ### Methods are defined in BSgenome and Rsamtools. Biostrings/R/injectHardMask.R0000644000126300012640000000252312227063307017477 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "injectHardMask" generic function and methods. ### setGeneric("injectHardMask", signature="x", function(x, letter="+") standardGeneric("injectHardMask") ) setMethod("injectHardMask", "XStringViews", function(x, letter="+") { x_seqtype <- seqtype(x) if (is(letter, "XString") && seqtype(letter) == x_seqtype) { if (length(letter) != 1) stop("'letter' must be a single letter") } else { if (!isSingleString(letter) || nchar(letter) != 1) stop("'letter' must be a single letter") letter <- XString(x_seqtype, letter) } code <- XString.readCodes(letter, 1L) y <- gaps(x) ## Because y is obtained with the "gaps" method for XStringViews ## objects, then the set of ranges defined by start(y) and width(y) ## is normal and is guaranteed to be within the limits of y. ## Hence start(y) and width(y) can be considered safe. .Call2("XString_inject_code", subject(y), start(y), width(y), code, PACKAGE="Biostrings") } ) setMethod("injectHardMask", "MaskedXString", function(x, letter="+") { y <- as(x, "XStringViews") injectHardMask(y, letter=letter) } ) Biostrings/R/letter.R0000644000126300012640000000432212227063307016106 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "letter" new generic. ### ### Return a character vector. setGeneric("letter", signature="x", function(x, i) standardGeneric("letter") ) ### Return a character vector of the same length as 'x' ### where all non-NA elements have length(i) characters. setMethod("letter", "character", function(x, i) { if (!is.numeric(i) || any(is.na(i))) stop("'i' must be an NA-free numeric vector") if (length(x) == 0) return(character(0)) if (length(i) == 0) return(character(length(x))) noNA_x <- x[!is.na(x)] imax <- min(nchar(noNA_x)) if (!all(i >= 1) || !all(i <= imax)) stop("subscript out of bounds") ## Which one is faster? Looping on i with substr or looping ## on noNA_x with substring? It depends... if (length(x) >= length(i)) { tmp <- lapply(i, function(i1) substr(noNA_x, i1, i1)) x[!is.na(x)] <- do.call(paste, c(tmp, sep="")) } else { x[!is.na(x)] <- sapply( noNA_x, function(x1) paste(substring(x1, i, i), collapse=""), USE.NAMES=FALSE ) } x } ) ### Return a character vector of length 1. setMethod("letter", "XString", function(x, i) { if (!is.numeric(i) || any(is.na(i))) stop("'i' must be an NA-free numeric vector") if (!all(i >= 1) || !all(i <= x@length)) stop("subscript out of bounds") XString.read(x, i) } ) ### Return a character vector of the same length as 'x'. setMethod("letter", "XStringViews", function(x, i) { if (!is.numeric(i) || any(is.na(i))) stop("'i' must be an NA-free numeric vector") if (length(x) == 0) return(character(0)) imax <- min(nchar(x)) if (!all(i >= 1) || !all(i <= imax)) stop("subscript out of bounds") sapply(seq_len(length(x)), function(n) XString.read(x[[n]], i)) } ) setMethod("letter", "MaskedXString", function(x, i) letter(unmasked(x), i) ) Biostrings/R/letterFrequency.R0000644000126300012640000010207212227063307017771 0ustar00biocbuildphs_compbio### ========================================================================= ### alphabetFrequency() ### hasOnlyBaseLetters() ### uniqueLetters() ### letterFrequencyInSlidingView() ### letterFrequency() ### mkAllStrings() ### oligonucleotideFrequency() ### dinucleotideFrequency() ### trinucleotideFrequency() ### oligonucleotideTransitions() ### nucleotideFrequencyAt() ### consensusMatrix() and consensusString() ### ------------------------------------------------------------------------- .normargWidth <- function(width, argname="width", min.width=1L) { if (!isSingleNumber(width)) stop("'", argname, "' must be a single integer") width <- as.integer(width) if (width < min.width) stop("'", argname, "' must be an integer >= ", min.width) width } .normargStep <- function(step) { if (!isSingleNumber(step)) stop("'step' must be a single integer") step <- as.integer(step) if (step <= 0L) stop("'step' must be a positive integer") step } .normargCollapse <- function(collapse) { if (!isTRUEorFALSE(collapse)) stop("'collapse' must be TRUE or FALSE") collapse } .normargAsArray <- function(as.array) { if (!isTRUEorFALSE(as.array)) stop("'as.array' must be TRUE or FALSE") as.array } .normargFastMovingSide <- function(fast.moving.side, as.array=FALSE) { if (as.array) return("left") if (!isSingleString(fast.moving.side)) stop("'fast.moving.side' must be a single string") match.arg(fast.moving.side, c("left", "right")) } .normargWithLabels <- function(with.labels) { if (!isTRUEorFALSE(with.labels)) stop("'with.labels' must be TRUE or FALSE") with.labels } .normargSimplifyAs <- function(simplify.as, as.array) { if (!isSingleString(simplify.as)) stop("'simplify.as' must be a single string") simplify.as <- match.arg(simplify.as, c("matrix", "list", "collapsed")) if (simplify.as == "matrix" && as.array) stop("'as.array' cannot be TRUE when 'simplify.as' is \"matrix\"") simplify.as } ### Author: HJ .normargLetters <- function(letters, alphabet) { if (!is.character(letters) || any(is.na(letters))) stop("'letters' must be a character vector with no NAs") if (any(nchar(letters) == 0L)) stop("'letters' cannot contain empty strings") single_letters <- unlist(strsplit(letters, NULL, fixed=TRUE)) if (any(duplicated(single_letters))) stop("letters in 'letters' must be unique") if (!is.null(alphabet)) { is_valid_letter <- single_letters %in% alphabet if (!all(is_valid_letter)) stop("invalid letter(s): ", paste(single_letters[!is_valid_letter], collapse=", ")) } single_letters } .normargOR <- function(OR) { if (!isSingleString(OR) && !(isSingleNumber(OR) && OR == 0)) stop("'OR' must be a single string or 0") OR } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "alphabetFrequency" generic and methods. ### ### sum(alphabetFrequency(x)) should always be exactly nchar(x) ### .XString.letter_frequency <- function(x, as.prob) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") ans <- .Call2("XString_letter_frequency", x, NULL, FALSE, PACKAGE="Biostrings") if (as.prob) ans <- ans / nchar(x) # nchar(x) is sum(ans) but faster ans } .XString.code_frequency <- function(x, as.prob, baseOnly) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") codes <- xscodes(x, baseOnly=baseOnly) ans <- .Call2("XString_letter_frequency", x, codes, baseOnly, PACKAGE="Biostrings") if (as.prob) ans <- ans / nchar(x) # nchar(x) is sum(ans) but faster ans } .XStringSet.letter_frequency <- function(x, as.prob, collapse) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") collapse <- .normargCollapse(collapse) ans <- .Call2("XStringSet_letter_frequency", x, collapse, NULL, FALSE, PACKAGE="Biostrings") if (as.prob) { if (collapse) ans <- ans / sum(ans) else ans <- ans / nchar(x) } ans } .XStringSet.code_frequency <- function(x, as.prob, collapse, baseOnly) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") collapse <- .normargCollapse(collapse) codes <- xscodes(x, baseOnly=baseOnly) ans <- .Call2("XStringSet_letter_frequency", x, collapse, codes, baseOnly, PACKAGE="Biostrings") if (as.prob) { if (collapse) ans <- ans / sum(ans) else ans <- ans / nchar(x) } ans } setGeneric("alphabetFrequency", signature="x", function(x, as.prob=FALSE, ...) standardGeneric("alphabetFrequency") ) setMethod("alphabetFrequency", "XString", function(x, as.prob=FALSE) .XString.letter_frequency(x, as.prob) ) setMethod("alphabetFrequency", "DNAString", function(x, as.prob=FALSE, baseOnly=FALSE) .XString.code_frequency(x, as.prob, baseOnly) ) setMethod("alphabetFrequency", "RNAString", function(x, as.prob=FALSE, baseOnly=FALSE) .XString.code_frequency(x, as.prob, baseOnly) ) setMethod("alphabetFrequency", "XStringSet", function(x, as.prob=FALSE, collapse=FALSE) .XStringSet.letter_frequency(x, as.prob, collapse) ) setMethod("alphabetFrequency", "DNAStringSet", function(x, as.prob=FALSE, collapse=FALSE, baseOnly=FALSE) .XStringSet.code_frequency(x, as.prob, collapse, baseOnly) ) setMethod("alphabetFrequency", "RNAStringSet", function(x, as.prob=FALSE, collapse=FALSE, baseOnly=FALSE) .XStringSet.code_frequency(x, as.prob, collapse, baseOnly) ) ### library(drosophila2probe) ### dict0 <- drosophila2probe$sequence ### x <- DNAStringSet(dict0[1:2000]) ### alphabetFrequency(x, baseOnly=TRUE) ### y <- as(x, "Views") ### alphabetFrequency(y, baseOnly=TRUE) setMethod("alphabetFrequency", "XStringViews", function(x, as.prob=FALSE, ...) { y <- fromXStringViewsToStringSet(x) alphabetFrequency(y, as.prob=as.prob, ...) } ) setMethod("alphabetFrequency", "MaskedXString", function(x, as.prob=FALSE, ...) { y <- as(x, "XStringViews") alphabetFrequency(y, as.prob=as.prob, collapse=TRUE, ...) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "hasOnlyBaseLetters" generic and methods. ### setGeneric("hasOnlyBaseLetters", function(x) standardGeneric("hasOnlyBaseLetters")) setMethod("hasOnlyBaseLetters", "DNAString", function(x) alphabetFrequency(x, baseOnly=TRUE)[["other"]] == 0L ) setMethod("hasOnlyBaseLetters", "RNAString", function(x) hasOnlyBaseLetters(DNAString(x)) ) setMethod("hasOnlyBaseLetters", "DNAStringSet", function(x) alphabetFrequency(x, collapse=TRUE, baseOnly=TRUE)[["other"]] == 0L ) setMethod("hasOnlyBaseLetters", "RNAStringSet", function(x) hasOnlyBaseLetters(DNAStringSet(x)) ) setMethod("hasOnlyBaseLetters", "XStringViews", function(x) { y <- fromXStringViewsToStringSet(x) hasOnlyBaseLetters(y) } ) setMethod("hasOnlyBaseLetters", "MaskedXString", function(x) { y <- as(x, "XStringViews") hasOnlyBaseLetters(y) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "uniqueLetters" generic and methods. ### .alphabetFrequencyToUniqueLetters <- function(x_af, x_codes) { if (!is.null(names(x_af))) return(names(x_af)[x_af != 0]) if (!identical(x_codes, 0:255)) stop("Biostrings internal anomaly: cannot infer names of ", "vector returned by 'alphabetFrequency(x)'") x_codes <- x_codes[x_af != 0] if (length(x_codes) != 0 && min(x_codes) == 0) warning("'x' contains embedded nuls") intToUtf8(x_codes, multiple=TRUE) } setGeneric("uniqueLetters", function(x) standardGeneric("uniqueLetters")) setMethod("uniqueLetters", "XString", function(x) { x_af <- alphabetFrequency(x) .alphabetFrequencyToUniqueLetters(x_af, xscodes(x)) } ) setMethod("uniqueLetters", "XStringSet", function(x) { x_af <- alphabetFrequency(x, collapse=TRUE) .alphabetFrequencyToUniqueLetters(x_af, xscodes(x)) } ) setMethod("uniqueLetters", "XStringViews", function(x) { y <- fromXStringViewsToStringSet(x) uniqueLetters(y) } ) setMethod("uniqueLetters", "MaskedXString", function(x) { y <- as(x, "XStringViews") uniqueLetters(y) } ) ### We need to be able to map *any* character whose UTF8 code is between 0 and ### 255 to its code, even the nul character. ### 'x' represents the set of characters to map: it must be a vector of ### 1-letter or empty strings, the empty string being used to represent the nul ### character. Typically, 'x' will be what was returned by uniqueLetters(). ### For internal use only (not exported). safeLettersToInt <- function(x, letters.as.names=FALSE) { ii <- which(x == "") ans <- utf8ToInt(paste(x, collapse="")) for (i in ii) ans <- append(ans, 0, after=i-1) if (letters.as.names) names(ans) <- x ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "letterFrequency" and "letterFrequencyInSlidingView" ### generics and methods. ### Author: HJ ### ### joint C interface ### The value is a matrix for letterFrequencyInSlidingView ### and a matrix for letterFrequency unless collapse=TRUE. .letterFrequency <- function(x, view.width, letters, OR, collapse=FALSE) { ## letterFrequency / letterFrequencyInSlidingView switch is_sliding <- !is.na(view.width) single_letters <- .normargLetters(letters, alphabet(x)) OR <- .normargOR(OR) codes <- xscodes(x) if (is.null(names(codes))) single_codes <- as.integer(BString(paste(single_letters, collapse=""))) else single_codes <- codes[single_letters] ## Unless 'OR == 0', letters in multi-character elements of ## 'letters' are to be grouped (i.e. tabulated in common). ## We send a vector indicating the column (1-based) into which each ## letter in 'letters' should be tabulated. For example, for ## 'letters = c("CG", "AT")' and 'OR != 0', we send 'c(1,1,2,2)'. ## The columns of the result are named accordingly using the OR symbol. nc <- nchar(letters) if (all(nc == 1L) || OR == 0) { colmap <- NULL colnames <- single_letters } else { colmap <- rep.int(seq_len(length(letters)), nc) colnames <- sapply(strsplit(letters, NULL, fixed=TRUE), function(z) paste(z, collapse=OR)) } if (is_sliding) .Call2("XString_letterFrequencyInSlidingView", x, view.width, single_codes, colmap, colnames, PACKAGE="Biostrings") else .Call2("XStringSet_letterFrequency", x, single_codes, colmap, colnames, collapse, PACKAGE="Biostrings") } ### letterFrequencyInSlidingView setGeneric("letterFrequencyInSlidingView", signature="x", function(x, view.width, letters, OR="|", as.prob=FALSE) standardGeneric("letterFrequencyInSlidingView") ) ### Ensure 'view.width' is not NA setMethod("letterFrequencyInSlidingView", "XString", function(x, view.width, letters, OR="|", as.prob=FALSE) { view.width <- .normargWidth(view.width, "view.width") if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") ans <- .letterFrequency(x, view.width, letters=letters, OR=OR) if (as.prob) ans <- ans / view.width ans } ) ### letterFrequency setGeneric("letterFrequency", signature="x", function(x, letters, OR="|", as.prob=FALSE, ...) standardGeneric("letterFrequency") ) setMethod("letterFrequency", "XStringSet", function(x, letters, OR="|", as.prob=FALSE, collapse=FALSE) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") if (!isTRUEorFALSE(collapse)) stop("'collapse' must be TRUE or FALSE") ans <- .letterFrequency(x, NA, letters=letters, OR=OR, collapse=collapse) if (as.prob) { nc <- nchar(x) if (collapse) nc <- sum(nc) ans <- ans / nc } ans } ) setMethod("letterFrequency", "XString", function(x, letters, OR="|", as.prob=FALSE) letterFrequency(as(x, "XStringSet"), letters=letters, OR=OR, as.prob=as.prob, collapse=TRUE) ) setMethod("letterFrequency", "XStringViews", function(x, letters, OR="|", as.prob=FALSE, ...) letterFrequency(as(x, "XStringSet"), letters=letters, OR=OR, as.prob=as.prob, ...) ) setMethod("letterFrequency", "MaskedXString", function(x, letters, OR="|", as.prob=FALSE) letterFrequency(as(x, "XStringViews"), letters=letters, OR=OR, as.prob=as.prob, collapse=TRUE) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "mkAllStrings" function. ### .mkAllStringsR <- function(alphabet, width) { if (width == 0L) return("") ansR <- .mkAllStringsR(alphabet, width - 1L) unlist(lapply(alphabet, function(l) paste(l, ansR, sep=""))) } .mkAllStringsL <- function(alphabet, width) { if (width == 0L) return("") ansL <- .mkAllStringsL(alphabet, width - 1L) unlist(lapply(alphabet, function(l) paste(ansL, l, sep=""))) } .mkAllStrings <- function(alphabet, width, fast.moving.side) { if (length(alphabet) == 0L && width != 0L) return(character(0)) if (fast.moving.side == "right") .mkAllStringsR(alphabet, width) else .mkAllStringsL(alphabet, width) } mkAllStrings <- function(alphabet, width, fast.moving.side="right") { if (!is.character(alphabet)) stop("'alphabet' must be a character vector") .mkAllStrings(alphabet, .normargWidth(width, min.width=0L), .normargFastMovingSide(fast.moving.side)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "oligonucleotideFrequency" generic and methods. ### ### Except for the 'other' element, oligonucleotideFrequency(x, 1L) ### should be the same as alphabetFrequency(x, baseOnly=TRUE). ### ### Something else worth checking: ### library(BSgenome.Dmelanogaster.UCSC.dm3) ### chr3R <- Dmelanogaster$chr3R ### width <- 12 ### dict0 <- mkAllStrings(names(Biostrings:::DNAcodes(TRUE)), width) ### names(dict0) <- dict0 ### pdict <- PDict(dict0) ### system.time(c1 <- countPDict(pdict, chr3R)) ### system.time(c2 <- oligonucleotideFrequency(chr3R, width, with.labels=FALSE)) ### identical(c1, c2) # must be TRUE ### Then try for other values of 'width' (1 <= width <= 12). ### Of course oligonucleotideFrequency() is much better: it is >10x faster, does ### not require preprocessing, and uses much less memory. ### setGeneric("oligonucleotideFrequency", signature="x", function(x, width, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE, ...) standardGeneric("oligonucleotideFrequency") ) setMethod("oligonucleotideFrequency", "XString", function(x, width, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE) { if (!(seqtype(x) %in% c("DNA", "RNA"))) stop("'x' must contain sequences of type DNA or RNA") width <- .normargWidth(width) step <- .normargStep(step) if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") as.array <- .normargAsArray(as.array) fast.moving.side <- .normargFastMovingSide(fast.moving.side, as.array) with.labels <- .normargWithLabels(with.labels) base_codes <- xscodes(x, baseOnly=TRUE) .Call2("XString_oligo_frequency", x, width, step, as.prob, as.array, fast.moving.side, with.labels, base_codes, PACKAGE="Biostrings") } ) setMethod("oligonucleotideFrequency", "XStringSet", function(x, width, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE, simplify.as="matrix") { if (!(seqtype(x) %in% c("DNA", "RNA"))) stop("'x' must contain sequences of type DNA or RNA") width <- .normargWidth(width) step <- .normargStep(step) if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") as.array <- .normargAsArray(as.array) fast.moving.side <- .normargFastMovingSide(fast.moving.side, as.array) with.labels <- .normargWithLabels(with.labels) simplify.as <- .normargSimplifyAs(simplify.as, as.array) base_codes <- xscodes(x, baseOnly=TRUE) .Call2("XStringSet_oligo_frequency", x, width, step, as.prob, as.array, fast.moving.side, with.labels, simplify.as, base_codes, PACKAGE="Biostrings") } ) setMethod("oligonucleotideFrequency", "XStringViews", function(x, width, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE, ...) { y <- fromXStringViewsToStringSet(x) oligonucleotideFrequency(y, width, step=step, as.prob=as.prob, as.array=as.array, fast.moving.side=fast.moving.side, with.labels=with.labels, ...) } ) setMethod("oligonucleotideFrequency", "MaskedXString", function(x, width, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE) { y <- as(x, "XStringViews") oligonucleotideFrequency(y, width, step=step, as.prob=as.prob, as.array=as.array, fast.moving.side=fast.moving.side, with.labels=with.labels, simplify.as="collapsed") } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "dinucleotideFrequency", "trinucleotideFrequency", and ### "oligonucleotideTransitions" convenience wrappers. ### dinucleotideFrequency <- function(x, step=1, as.prob=FALSE, as.matrix=FALSE, fast.moving.side="right", with.labels=TRUE, ...) { oligonucleotideFrequency(x, 2L, step=step, as.prob=as.prob, as.array=as.matrix, fast.moving.side=fast.moving.side, with.labels=with.labels, ...) } trinucleotideFrequency <- function(x, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE, ...) { oligonucleotideFrequency(x, 3L, step=step, as.prob=as.prob, as.array=as.array, fast.moving.side=fast.moving.side, with.labels=with.labels, ...) } oligonucleotideTransitions <- function(x, left=1, right=1, as.prob=FALSE) { if (!isSingleNumber(left)) stop("'left' must be a single integer value") if (!is.integer(left)) left <- as.integer(left) if (left < 1L) stop("'left' must be >= 1") if (!isSingleNumber(right)) stop("'right' must be a single integer value") if (!is.integer(right)) right <- as.integer(right) if (right < 1L) stop("'right' must be >= 1") if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") if (is(x, "XStringSet") || is(x, "XStringViews")) { freqs <- oligonucleotideFrequency(x, width=left+right, as.prob=FALSE, simplify.as="collapsed") } else { freqs <- oligonucleotideFrequency(x, width=left+right, as.prob=FALSE) } ans_rownames <- mkAllStrings(DNA_BASES, left) ans_colnames <- mkAllStrings(DNA_BASES, right) ## A sanity check expected_freqs_names <- paste(rep(ans_rownames, each=length(ans_colnames)), ans_colnames, sep="") if (!identical(names(freqs), expected_freqs_names)) stop("Biostrings internal error in oligonucleotideTransitions(): ", "'freqs' has unexpected or missing names") ans <- matrix(freqs, ncol=length(ans_colnames), byrow=TRUE, dimnames=list(ans_rownames, ans_colnames)) if (as.prob) ans <- ans / rowSums(ans) ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "nucleotideFrequencyAt" generic and methods. ### setGeneric("nucleotideFrequencyAt", signature="x", function(x, at, as.prob=FALSE, as.array=TRUE, fast.moving.side="right", with.labels=TRUE, ...) standardGeneric("nucleotideFrequencyAt") ) setMethod("nucleotideFrequencyAt", "XStringSet", function(x, at, as.prob=FALSE, as.array=TRUE, fast.moving.side="right", with.labels=TRUE) { if (!(seqtype(x) %in% c("DNA", "RNA"))) stop("'x' must contain sequences of type DNA or RNA") if (!is.numeric(at)) stop("'at' must be a vector of integers") if (!is.integer(at)) at <- as.integer(at) if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") as.array <- .normargAsArray(as.array) fast.moving.side <- .normargFastMovingSide(fast.moving.side, as.array) with.labels <- .normargWithLabels(with.labels) base_codes <- xscodes(x, baseOnly=TRUE) .Call2("XStringSet_nucleotide_frequency_at", x, at, as.prob, as.array, fast.moving.side, with.labels, base_codes, PACKAGE="Biostrings") } ) setMethod("nucleotideFrequencyAt", "XStringViews", function(x, at, as.prob=FALSE, as.array=TRUE, fast.moving.side="right", with.labels=TRUE, ...) { y <- fromXStringViewsToStringSet(x) if (any(width(y) < width(x))) stop("x contains \"out of limits\" views") nucleotideFrequencyAt(y, at, as.prob=as.prob, as.array=as.array, fast.moving.side=fast.moving.side, with.labels=with.labels, ...) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### consensusMatrix() and consensusString(). ### setGeneric("consensusMatrix", signature="x", function(x, as.prob=FALSE, shift=0L, width=NULL, ...) standardGeneric("consensusMatrix")) setMethod("consensusMatrix", "character", function(x, as.prob=FALSE, shift=0L, width=NULL) consensusMatrix(BStringSet(x), as.prob=as.prob, shift=shift, width=width) ) setMethod("consensusMatrix", "matrix", function(x, as.prob=FALSE, shift=0L, width=NULL) consensusMatrix(BStringSet(apply(x, 1, paste, collapse="")), as.prob=as.prob, shift=shift, width=width) ) setMethod("consensusMatrix", "XStringSet", function(x, as.prob=FALSE, shift=0L, width=NULL, baseOnly=FALSE) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") if (!is.integer(shift)) shift <- as.integer(shift) if (length(x) != 0 && length(shift) > length(x)) stop("'shift' has more elements than 'x'") if (!is.null(width)) { if (!isSingleNumber(width) || width < 0L) stop("'width' must be NULL or a single non-negative integer") if (!is.integer(width)) width <- as.integer(width) } codes <- xscodes(x, baseOnly=baseOnly) if (is.null(names(codes))) { names(codes) <- intToUtf8(codes, multiple = TRUE) removeUnused <- TRUE } else { removeUnused <- FALSE } ans <- .Call2("XStringSet_consensus_matrix", x, shift, width, baseOnly, codes, PACKAGE="Biostrings") if (removeUnused) { ans <- ans[rowSums(ans) > 0, , drop=FALSE] } if (as.prob) { col_sums <- colSums(ans) col_sums[col_sums == 0] <- 1 # to avoid division by 0 ans <- ans / rep(col_sums, each=nrow(ans)) } ans } ) setMethod("consensusMatrix", "XStringViews", function(x, as.prob=FALSE, shift=0L, width=NULL, ...) { y <- fromXStringViewsToStringSet(x) consensusMatrix(y, as.prob=as.prob, shift=shift, width=width, ...) } ) setGeneric("consensusString", function(x, ...) standardGeneric("consensusString")) setMethod("consensusString", "matrix", function(x, ambiguityMap="?", threshold=0.5) { x <- x[rowSums(x, na.rm=TRUE) > 0, , drop=FALSE] k <- nrow(x) if (k == 0) return(character()) err_msg <- c("Please make sure 'x' was obtained by a ", "call to consensusMatrix(..., as.prob=TRUE)") all_letters <- rownames(x) if (is.null(all_letters)) stop("invalid consensus matrix 'x' (has no row names).\n", " ", err_msg) if (!all(nchar(all_letters) == 1)) stop("invalid consensus matrix 'x' (row names must be single letters).\n", " ", err_msg) if (is.integer(x)) { col_sums <- colSums(x) col_sums[col_sums == 0] <- 1 # to avoid division by 0 x <- x / rep(col_sums, each=k) } if (any(is.na(x) | x < 0 | x > 1)) stop("invalid consensus matrix 'x' ", "(contains NAs/NaNs or values outside [0, 1]).\n", " ", err_msg) if (any(abs(colSums(x) - 1) > .Machine$double.eps ^ 0.5)) stop("invalid consensus matrix 'x' ", "(some columns do not sum to 1).\n", " ", err_msg) if (isSingleString(ambiguityMap)) { if (nchar(ambiguityMap) != 1) stop("'ambiguityMap' must be a single character or a map ", "(e.g. IUPAC_CODE_MAP)") if (!isSingleNumber(threshold) || threshold <= 0 || threshold > 1) stop("'threshold' must be a numeric in (0, 1]") consensusLetter <- function(col) { i <- which(col >= threshold) if (length(i) == 1 && col[i] >= threshold) all_letters[i] else ambiguityMap } } else { if (!is.character(ambiguityMap) || is.null(names(ambiguityMap))) stop("'ambiguityMap' must be a named character vector") if (!all(rownames(x) %in% names(ambiguityMap))) stop("'ambiguityMap' does not contain the complete alphabet") alphabet <- unname(ambiguityMap[nchar(ambiguityMap) == 1]) if (!isSingleNumber(threshold) || threshold <= 0 || (threshold - .Machine$double.eps ^ 0.5) > 1/length(alphabet)) stop("'threshold' must be a numeric in ", "(0, 1/sum(nchar(ambiguityMap) == 1)]") P <- sapply(strsplit(ambiguityMap[rownames(x)], ""), function(y) {z <- alphabet %in% y;z/sum(z)}) x <- P %*% x consensusLetter <- function(col) { i <- paste(alphabet[col >= threshold], collapse = "") ans <- names(ambiguityMap[ambiguityMap == i]) if (length(ans) == 0) stop("'ambiguityMap' is missing some combinations of row names") ans } } paste(apply(x, 2, consensusLetter), collapse="") } ) setMethod("consensusString", "BStringSet", function(x, ambiguityMap="?", threshold=0.5, shift=0L, width=NULL) consensusString(consensusMatrix(x, as.prob=TRUE, shift=shift, width=width), ambiguityMap=ambiguityMap, threshold=threshold) ) setMethod("consensusString", "DNAStringSet", function(x, ambiguityMap=IUPAC_CODE_MAP, threshold=0.25, shift=0L, width=NULL) consensusString(consensusMatrix(x, as.prob=TRUE, shift=shift, width=width), ambiguityMap=ambiguityMap, threshold=threshold) ) setMethod("consensusString", "RNAStringSet", function(x, ambiguityMap= structure(as.character(RNAStringSet(DNAStringSet(IUPAC_CODE_MAP))), names= as.character(RNAStringSet(DNAStringSet(names(IUPAC_CODE_MAP))))), threshold=0.25, shift=0L, width=NULL) consensusString(consensusMatrix(x, as.prob=TRUE, shift=shift, width=width), ambiguityMap=ambiguityMap, threshold=threshold) ) setMethod("consensusString", "XStringViews", function(x, ambiguityMap, threshold, shift=0L, width=NULL) { x <- as(x, "XStringSet") callGeneric() } ) setMethod("consensusString", "ANY", function(x, ambiguityMap="?", threshold=0.5) consensusString(consensusMatrix(x, as.prob=TRUE), ambiguityMap=ambiguityMap, threshold=threshold) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "twoWayAlphabetFrequency" generic and methods. ### ### Calculates two-way table of letter frequencies for two same-length inputs ### .XString.two_way_code_frequency <- function(x, y, as.prob, baseOnly) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") x.codes <- xscodes(x, baseOnly=baseOnly) y.codes <- xscodes(y, baseOnly=baseOnly) ans <- .Call2("XString_two_way_letter_frequency", x, y, x.codes, y.codes, baseOnly, PACKAGE="Biostrings") if (as.prob) ans <- ans / nchar(x) # nchar(x) is sum(ans) but faster ans } .XStringSet.two_way_code_frequency <- function(x, y, as.prob, collapse, baseOnly) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") collapse <- .normargCollapse(collapse) x.codes <- xscodes(x, baseOnly=baseOnly) y.codes <- xscodes(y, baseOnly=baseOnly) ans <- .Call2("XStringSet_two_way_letter_frequency", x, y, collapse, x.codes, y.codes, baseOnly, PACKAGE="Biostrings") if (as.prob) { if (collapse) ans <- ans / sum(as.numeric(ans)) else ans <- ans / rep(nchar(x), each = prod(dim(ans)[1:2])) } ans } setGeneric("twoWayAlphabetFrequency", signature=c("x", "y"), function(x, y, as.prob=FALSE, ...) standardGeneric("twoWayAlphabetFrequency") ) setMethod("twoWayAlphabetFrequency", c("XString", "XString"), function(x, y, as.prob=FALSE, baseOnly=FALSE) .XString.two_way_code_frequency(x, y, as.prob, baseOnly) ) setMethod("twoWayAlphabetFrequency", c("XString", "XStringSet"), function(x, y, as.prob=FALSE, collapse=FALSE, baseOnly=FALSE) { x <- rep(as(x, "XStringSet"), length(y)) .XStringSet.two_way_code_frequency(x, y, as.prob, collapse, baseOnly) } ) setMethod("twoWayAlphabetFrequency", c("XStringSet", "XString"), function(x, y, as.prob=FALSE, collapse=FALSE, baseOnly=FALSE) { y <- rep(as(y, "XStringSet"), length(x)) .XStringSet.two_way_code_frequency(x, y, as.prob, collapse, baseOnly) } ) setMethod("twoWayAlphabetFrequency", c("XStringSet", "XStringSet"), function(x, y, as.prob=FALSE, collapse=FALSE, baseOnly=FALSE) .XStringSet.two_way_code_frequency(x, y, as.prob, collapse, baseOnly) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "twoWayAlphabetFrequencyByQuality" generic and methods. ### ### Not sure about this yet. We may want a threeWayAlphabetFrequency, ### where the qualities are combined apriori. ### .XStringSet.two_way_code_frequency_by_quality <- function(x, y, x.quality, y.quality, as.prob, baseOnly) { if (!isTRUEorFALSE(as.prob)) stop("'as.prob' must be TRUE or FALSE") codes <- xscodes(x, baseOnly=baseOnly) ans <- .Call2("XStringSet_two_way_letter_frequency_by_quality", x, y, x.quality, y.quality, collapse, codes, baseOnly, PACKAGE="Biostrings") if (as.prob) { ans <- ans / rep(nchar(x), each = prod(dim(ans)[1:2])) } ans } setGeneric("twoWayAlphabetFrequencyByQuality", signature=c("x", "y"), function(x, y, as.prob=FALSE, ...) standardGeneric("twoWayAlphabetFrequencyByQuality") ) setMethod("twoWayAlphabetFrequencyByQuality", "QualityScaledXStringSet", function(x, y, as.prob=FALSE, baseOnly=FALSE) .XStringSet.two_way_code_frequency_by_quality(x, y, quality(x), quality(y), as.prob, baseOnly) ) Biostrings/R/lowlevel-matching.R0000644000126300012640000004333412227063307020236 0ustar00biocbuildphs_compbio### ========================================================================= ### Low-level matching functions ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helper functions (not exported) used by matching functions from other ### files (like matchPattern(), matchPDict(), etc...) to check and normalize ### their arguments. ### normargSubject <- function(subject, argname="subject") { if (is(subject, "XString") || is(subject, "XStringSet")) return(subject) if (!is.character(subject)) stop("'", argname, "' must be a character vector, ", "or an XString or XStringSet object") if (length(subject) == 1L) subject <- as(subject, "XString") else subject <- as(subject, "XStringSet") subject } normargPattern <- function(pattern, subject, argname="pattern") { subject_baseclass <- xsbaseclass(subject) if (is(pattern, "XString")) { if (xsbaseclass(pattern) == subject_baseclass) return(pattern) } else if (!isSingleString(pattern)) stop("'", argname, "' must be a single string or an XString object") pattern <- try(XString(seqtype(subject), pattern)) if (is(pattern, "try-error")) stop("could not turn '", argname, "' into a ", subject_baseclass, " instance") pattern } normargMaxMismatch <- function(max.mismatch, argname="max.mismatch") { if (!isSingleNumber(max.mismatch)) stop("'", argname, "' must be a single integer") max.mismatch <- as.integer(max.mismatch) if (max.mismatch < 0L) stop("'", argname, "' must be a non-negative integer") max.mismatch } normargMinMismatch <- function(min.mismatch, max.mismatch, argname="min.mismatch") { if (!isSingleNumber(min.mismatch)) stop("'", argname, "' must be a single integer") min.mismatch <- as.integer(min.mismatch) if (min.mismatch < 0L) stop("'", argname, "' must be a non-negative integer") if (min.mismatch > max.mismatch) stop("'", argname, "' must be <= 'max.mismatch'") min.mismatch } normargWithIndels <- function(with.indels, argname="with.indels") { if (!isTRUEorFALSE(with.indels)) stop("'", argname, "' must be TRUE or FALSE") with.indels } ### Return a logical vector of length 2. normargFixed <- function(fixed, subject, argname="fixed") { if (!is.logical(fixed) && !is.character(fixed)) stop("'", argname, "' not a logical or character vector") if (is.logical(fixed)) { if (any(is.na(fixed))) stop("'", argname, "' has NAs") fixed_names <- names(fixed) if (is.null(fixed_names)) { if (!(length(fixed) %in% 1:2)) stop("when an unnamed logical vector, '", argname, "' fixed must be of length 1 or 2") if (length(fixed) == 1) fixed <- c(fixed, fixed) } else { if (length(fixed) != 2) stop("when a named logical vector, '", argname, "' must be of length 2") if (!setequal(fixed_names, c("pattern", "subject"))) stop("'", argname, "' names must be \"pattern\" and \"subject\"") fixed <- c(fixed["pattern"], fixed["subject"]) } } else if (is.character(fixed)) { if (any(duplicated(fixed)) || !all(fixed %in% c("pattern", "subject"))) stop("when a character vector, '", argname, "' must be ", "a subset of 'c(\"pattern\", \"subject\")' ", "with no duplicated") fixed <- c("pattern" %in% fixed, "subject" %in% fixed) } if (!all(fixed) && !(seqtype(subject) %in% c("DNA", "RNA"))) stop("'", argname, "' value only supported for a DNA or RNA subject ", "(you can only use 'fixed=TRUE' with your subject)") fixed } normargCollapse <- function(collapse) { if (identical(collapse, FALSE)) return(0L) if (!isSingleNumber(collapse) || !(collapse %in% 0:2)) stop("'collapse' must be FALSE, 1 or 2") as.integer(collapse) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### .matchPatternAt() ### ### This is the horse-power behind the neditStartingAt(), neditEndingAt(), ### isMatchingStartingAt(), isMatchingEndingAt(), which.isMatchingStartingAt() ### and which.isMatchingEndingAt() low-level matching functions defined later ### in this file. ### If 'at.type == 0' then 'at' contains starting positions, otherwise it ### contains ending positions. ### .matchPatternAt <- function(pattern, subject, at, at.type, max.mismatch, min.mismatch, with.indels, fixed, ans.type, auto.reduce.pattern=FALSE) { subject <- normargSubject(subject) pattern <- normargPattern(pattern, subject) if (!is.numeric(at)) { what <- if (at.type == 0L) "starting.at" else "ending.at" stop("'", what, "' must be a vector of integers") } if (!is.integer(at)) at <- as.integer(at) if (auto.reduce.pattern) { at.length <- length(at) P <- nchar(pattern) if (at.length == 1) at <- rep.int(at, P) else if (at.length != P || length(unique(at)) > 1) stop("With 'auto.reduce.pattern', 'at' must be a single integer") } if (ans.type == 0L) { max.mismatch <- length(pattern) } else { if (!is.numeric(max.mismatch)) stop("'max.mismatch' must be a vector of integers") if (!is.integer(max.mismatch)) max.mismatch <- as.integer(max.mismatch) if (!is.numeric(min.mismatch)) stop("'min.mismatch' must be a vector of integers") if (!is.integer(min.mismatch)) min.mismatch <- as.integer(min.mismatch) } with.indels <- normargWithIndels(with.indels) fixed <- normargFixed(fixed, subject) if (is(subject, "XString")) .Call2("XString_match_pattern_at", pattern, subject, at, at.type, max.mismatch, min.mismatch, with.indels, fixed, ans.type, auto.reduce.pattern, PACKAGE="Biostrings") else .Call2("XStringSet_vmatch_pattern_at", pattern, subject, at, at.type, max.mismatch, min.mismatch, with.indels, fixed, ans.type, auto.reduce.pattern, PACKAGE="Biostrings") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### neditStartingAt(), neditEndingAt() and neditAt(). ### ### 'starting.at' (or 'ending.at') must be integer vectors containing the ### starting (or ending) positions of the pattern relatively to the subject. ### These functions return an integer vector of the same length as ### 'starting.at' (or 'ending.at'). ### setGeneric("neditStartingAt", signature="subject", function(pattern, subject, starting.at=1, with.indels=FALSE, fixed=TRUE) standardGeneric("neditStartingAt") ) setGeneric("neditEndingAt", signature="subject", function(pattern, subject, ending.at=1, with.indels=FALSE, fixed=TRUE) standardGeneric("neditEndingAt") ) neditAt <- function(pattern, subject, at=1, with.indels=FALSE, fixed=TRUE) { if (!is.numeric(at)) stop("'at' must be a vector of integers") neditStartingAt(pattern, subject, starting.at=at, with.indels=with.indels, fixed=fixed) } ### Dispatch on 'subject' (see signature of generic). setMethod("neditStartingAt", "character", function(pattern, subject, starting.at=1, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, starting.at, 0L, NA, NA, with.indels, fixed, 0L) ) setMethod("neditStartingAt", "XString", function(pattern, subject, starting.at=1, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, starting.at, 0L, NA, NA, with.indels, fixed, 0L) ) setMethod("neditStartingAt", "XStringSet", function(pattern, subject, starting.at=1, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, starting.at, 0L, NA, NA, with.indels, fixed, 0L) ) setMethod("neditEndingAt", "character", function(pattern, subject, ending.at=1, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, ending.at, 1L, NA, NA, with.indels, fixed, 0L) ) setMethod("neditEndingAt", "XString", function(pattern, subject, ending.at=1, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, ending.at, 1L, NA, NA, with.indels, fixed, 0L) ) setMethod("neditEndingAt", "XStringSet", function(pattern, subject, ending.at=1, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, ending.at, 1L, NA, NA, with.indels, fixed, 0L) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### isMatchingStartingAt(), isMatchingEndingAt() and isMatchingAt(). ### ### 'starting.at' (or 'ending.at') must be integer vectors containing the ### starting (or ending) positions of the pattern relatively to the subject. ### These functions return a logical vector of the same length as ### 'starting.at' (or 'ending.at'). ### setGeneric("isMatchingStartingAt", signature="subject", function(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) standardGeneric("isMatchingStartingAt") ) setGeneric("isMatchingEndingAt", signature="subject", function(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) standardGeneric("isMatchingEndingAt") ) isMatchingAt <- function(pattern, subject, at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) { if (!is.numeric(at)) stop("'at' must be a vector of integers") isMatchingStartingAt(pattern, subject, starting.at=at, max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed) } ### Dispatch on 'subject' (see signature of generic). setMethod("isMatchingStartingAt", "character", function(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, starting.at, 0L, max.mismatch, min.mismatch, with.indels, fixed, 1L) ) setMethod("isMatchingStartingAt", "XString", function(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, starting.at, 0L, max.mismatch, min.mismatch, with.indels, fixed, 1L) ) setMethod("isMatchingStartingAt", "XStringSet", function(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, starting.at, 0L, max.mismatch, min.mismatch, with.indels, fixed, 1L) ) setMethod("isMatchingEndingAt", "character", function(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, ending.at, 1L, max.mismatch, min.mismatch, with.indels, fixed, 1L) ) setMethod("isMatchingEndingAt", "XString", function(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, ending.at, 1L, max.mismatch, min.mismatch, with.indels, fixed, 1L) ) setMethod("isMatchingEndingAt", "XStringSet", function(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) .matchPatternAt(pattern, subject, ending.at, 1L, max.mismatch, min.mismatch, with.indels, fixed, 1L) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### which.isMatchingStartingAt(), which.isMatchingEndingAt() and ### which.isMatchingAt(). ### ### 'starting.at' (or 'ending.at') must be integer vectors containing the ### starting (or ending) positions of the pattern relatively to the subject. ### These functions return the lowest *index* in 'starting.at' (or 'ending.at') ### for which a match occurred (or NA if no match occurred). ### setGeneric("which.isMatchingStartingAt", signature="subject", function(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) standardGeneric("which.isMatchingStartingAt") ) setGeneric("which.isMatchingEndingAt", signature="subject", function(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) standardGeneric("which.isMatchingEndingAt") ) which.isMatchingAt <- function(pattern, subject, at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) { if (!is.numeric(at)) stop("'at' must be a vector of integers") which.isMatchingStartingAt(pattern, subject, starting.at=at, max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, follow.index=follow.index, auto.reduce.pattern=auto.reduce.pattern) } .to.ans.type <- function(follow.index) { if (!isTRUEorFALSE(follow.index)) stop("'follow.index' must be TRUE or FALSE") if (follow.index) return(3L) return(2L) } ### Dispatch on 'subject' (see signature of generic). setMethod("which.isMatchingStartingAt", "character", function(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) .matchPatternAt(pattern, subject, starting.at, 0L, max.mismatch, min.mismatch, with.indels, fixed, .to.ans.type(follow.index), auto.reduce.pattern) ) setMethod("which.isMatchingStartingAt", "XString", function(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) .matchPatternAt(pattern, subject, starting.at, 0L, max.mismatch, min.mismatch, with.indels, fixed, .to.ans.type(follow.index), auto.reduce.pattern) ) setMethod("which.isMatchingStartingAt", "XStringSet", function(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) .matchPatternAt(pattern, subject, starting.at, 0L, max.mismatch, min.mismatch, with.indels, fixed, .to.ans.type(follow.index), auto.reduce.pattern) ) setMethod("which.isMatchingEndingAt", "character", function(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) .matchPatternAt(pattern, subject, ending.at, 1L, max.mismatch, min.mismatch, with.indels, fixed, .to.ans.type(follow.index), auto.reduce.pattern) ) setMethod("which.isMatchingEndingAt", "XString", function(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) .matchPatternAt(pattern, subject, ending.at, 1L, max.mismatch, min.mismatch, with.indels, fixed, .to.ans.type(follow.index), auto.reduce.pattern) ) setMethod("which.isMatchingEndingAt", "XStringSet", function(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) .matchPatternAt(pattern, subject, ending.at, 1L, max.mismatch, min.mismatch, with.indels, fixed, .to.ans.type(follow.index), auto.reduce.pattern) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### hasLetterAt() ### hasLetterAt <- function(x, letter, at, fixed=TRUE) { if (!is(x, "XStringSet")) { if (!is.character(x) && !is(x, "XString")) stop("'x' must be a character vector, or an XString or XStringSet object") x <- as(x, "XStringSet") } if (!is(letter, "XString")) { if (!isSingleString(letter)) stop("'letter' must be a character string or an XString object") letter <- XString(seqtype(x), letter) } else { if (seqtype(letter) != seqtype(x)) stop("'x' and 'letter' must have the same sequence type") } if (!is.numeric(at)) stop("'at' must be a vector of integers") if (length(at) != length(letter)) stop("'letter' and 'at' must have the same length") if (!is.integer(at)) at <- as.integer(at) if (any(is.na(at))) stop("'at' cannot contain NAs") fixed <- normargFixed(fixed, x) .hasLetterAt1 <- function(x, l1, at1) { ans <- .Call2("XStringSet_vmatch_pattern_at", l1, x, at1, 0L, 0L, 0L, FALSE, fixed, 1L, FALSE, PACKAGE="Biostrings") ans[at1 < 1 | at1 > width(x)] <- NA ans } sapply(seq_len(length(letter)), function(i) .hasLetterAt1(x, subseq(letter, start=i, width=1L), at[i])) } Biostrings/R/maskMotif.R0000644000126300012640000000523312227063307016543 0ustar00biocbuildphs_compbio### ========================================================================= ### The maskMotif() generic & methods ### ------------------------------------------------------------------------- setGeneric("maskMotif", signature=c("x", "motif"), function(x, motif, min.block.width=1, ...) standardGeneric("maskMotif") ) setMethod("maskMotif", signature(x="MaskedXString", motif="XString"), function(x, motif, min.block.width=1, ...) { if (!isSingleNumber(min.block.width)) stop("'min.block.width' must be a single integer") if (!is.integer(min.block.width)) min.block.width <- as.integer(min.block.width) nir1 <- as(matchPattern(motif, x, ...), "NormalIRanges") desc1 <- paste(as.character(motif), "-blocks", sep="") if (min.block.width > length(motif)) { nir1 <- nir1[width(nir1) >= min.block.width] desc1 <- paste(desc1, " [width>=", min.block.width, "]", sep="") } mask1 <- new2("MaskCollection", nir_list=list(nir1), width=length(x), active=TRUE, desc=desc1, check=FALSE) masks(x) <- append(masks(x), mask1) x } ) setMethod("maskMotif", signature(x="MaskedXString", motif="character"), function(x, motif, min.block.width=1, ...) { motif <- XString(seqtype(x), motif) maskMotif(x, motif, min.block.width=min.block.width, ...) } ) setMethod("maskMotif", signature(x="XString", motif="ANY"), function(x, motif, min.block.width=1, ...) { x <- as(x, paste("Masked", xsbaseclass(x), sep="")) maskMotif(x, motif, min.block.width=min.block.width, ...) } ) ### Used in Robert's book! ### mask() was introduced at the time where only XStringViews objects were ### available in Biostrings so it returns one instead of a MaskedXString ### object. ### Deprecate in Biostrings 2.9! mask <- function(x, start=NA, end=NA, pattern) { if (!is(x, "XString")) x <- XString(NULL, x) if (missing(pattern)) { if (isNumericOrNAs(start)) { if (length(start) == 1L && is.na(start)) start <- 1L if (length(end) == 1L && is.na(end)) end <- length(x) return(gaps(Views(x, start=start, end=end))) } if (!missing(end)) stop("invalid 'start' argument") pattern <- start } else { if (!missing(start) || !missing(end)) stop("can't give 'start' (or 'end') when 'pattern' is given") } as(maskMotif(x, pattern), "XStringViews") } Biostrings/R/match-utils.R0000644000126300012640000001355312227063307017047 0ustar00biocbuildphs_compbio### ========================================================================= ### Miscellaneous helper/utility functions related to string matching. ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Some helper functions used by matchPattern(), matchPDict(), etc... ### .CHARACTER.ALGOS <- c("gregexpr", "gregexpr2") isCharacterAlgo <- function(algo) {algo %in% .CHARACTER.ALGOS} .ALL.ALGOS <- c( "auto", "naive-exact", "naive-inexact", "boyer-moore", "shift-or", "indels", .CHARACTER.ALGOS ) normargAlgorithm <- function(algorithm) { if (!isSingleString(algorithm)) stop("'algorithm' must be a single string") match.arg(algorithm, .ALL.ALGOS) } ### Return a character vector containing the valid algos (best suited first) ### for the given search criteria (the search criteria is described by the ### values of 'pattern', 'max.mismatch', 'with.indels' and 'fixed'). ### Raise an error if the problem "doesn't make sense". ### All its arguments must have been normalized (thru the normarg*() functions) ### before they are passed to .valid.algos(). .valid.algos <- function(pattern, max.mismatch, min.mismatch, with.indels, fixed) { if (is(pattern, "XString")) { pattern_min_length <- pattern_max_length <- length(pattern) } else if (is(pattern, "XStringSet")) { pattern_min_length <- min(width(pattern)) pattern_max_length <- max(width(pattern)) } else { stop("'pattern' not an XString or XStringSet object") } if (pattern_min_length == 0L) stop("empty patterns are not supported") ## Some arbitrary limit just to limit the size of the dynamic buffers ## used by the Boyer Moore algo to preprocess the pattern. if (pattern_max_length > 20000L) stop("patterns with more than 20000 letters are not supported") if (max.mismatch != 0L && with.indels) { if (min.mismatch != 0L) stop("'min.mismatch' must be 0 when 'with.indels' is TRUE") return("indels") } algos <- character(0) if (max.mismatch == 0L && all(fixed)) { algos <- c(algos, "boyer-moore") if (pattern_max_length <= .Clongint.nbits()) algos <- c(algos, "shift-or") algos <- c(algos, "naive-exact") } else { if (min.mismatch == 0L && fixed[1] == fixed[2] && pattern_max_length <= .Clongint.nbits()) algos <- c(algos, "shift-or") } c(algos, "naive-inexact") # "naive-inexact" is universal but slow } selectAlgo <- function(algo, pattern, max.mismatch, min.mismatch, with.indels, fixed) { algos <- .valid.algos(pattern, max.mismatch, min.mismatch, with.indels, fixed) if (algo == "auto") return(algos[1]) if (!(algo %in% algos)) stop("valid algos for your string matching problem (best suited first): ", paste(paste("\"", algos, "\"", sep=""), collapse=", ")) algo } ### ========================================================================= ### Some utility functions for operating on the matches returned by a ### high-level matching function like matchPattern(), matchPDict(), etc... ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### mismatch() ### ### Returns a vector of the positions of mismatches of 'pattern' ### in a view on 'subject' starting at 'start' and whose width is ### length(pattern). .bsMismatch <- function(pattern, subject, start, fixed) { mm <- integer(0) j0 <- start - as.integer(1) for (i in seq_len(length(pattern))) { j <- j0 + i if (j < 1 || j > length(subject)) { mm <- c(mm, i) } else { l <- subseq(pattern, start=i, end=i) cp <- isMatchingAt(l, subject, at=j, fixed=fixed) if (cp == 0) mm <- c(mm, i) } } mm } .mismatch <- function(pattern, x, fixed) { if (length(x) == 0) return(list()) if (any(width(x) != length(pattern))) warning("some views in 'x' have a width that differs from 'length(pattern)'") lapply(1:length(x), function(i) .bsMismatch(pattern, subject(x), start(x)[i], fixed)) } setGeneric("mismatch", signature=c("pattern", "x"), function(pattern, x, fixed=TRUE) standardGeneric("mismatch") ) ### Typical use: ### mp <- matchPattern("TGA", DNAString("GTGACGTGCAT"), max.mismatch=2) ### mismatch("TGA", mp) ### Dispatch on 'x' (see signature of generic). setMethod("mismatch", c(pattern="ANY", x="XStringViews"), function(pattern, x, fixed) { pattern <- normargPattern(pattern, x) .mismatch(pattern, x, fixed) } ) setGeneric("nmatch", signature=c("pattern", "x"), function(pattern, x, fixed=TRUE) standardGeneric("nmatch") ) setMethod("nmatch", c(pattern="ANY", x="XStringViews"), function(pattern, x, fixed) { funCall <- match.call() funCall[[1]] <- as.name("nmismatch") nchar(pattern) - eval(funCall, sys.parent()) } ) setGeneric("nmismatch", signature=c("pattern", "x"), function(pattern, x, fixed=TRUE) standardGeneric("nmismatch") ) setMethod("nmismatch", c(pattern="ANY", x="XStringViews"), function(pattern, x, fixed) { funCall <- match.call() funCall[[1]] <- as.name("mismatch") mismatches <- eval(funCall, sys.parent()) elementLengths(mismatches) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "coverage" methods. ### setMethod("coverage", "MaskedXString", function(x, shift=0L, width=NULL, weight=1L) coverage(masks(x), shift=shift, width=width, weight=weight) ) setMethod("coverage", "MIndex", function(x, shift=0L, width=NULL, weight=1L) coverage(unlist(x), shift=shift, width=width, weight=weight) ) Biostrings/R/matchLRPatterns.R0000644000126300012640000001142512227063307017664 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "matchLRPatterns" new generic. ### setGeneric("matchLRPatterns", signature="subject", function(Lpattern, Rpattern, max.gaplength, subject, max.Lmismatch=0, max.Rmismatch=0, with.Lindels=FALSE, with.Rindels=FALSE, Lfixed=TRUE, Rfixed=TRUE) standardGeneric("matchLRPatterns") ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchLRPatterns", "XString", function(Lpattern, Rpattern, max.gaplength, subject, max.Lmismatch=0, max.Rmismatch=0, with.Lindels=FALSE, with.Rindels=FALSE, Lfixed=TRUE, Rfixed=TRUE) { ans_start <- ans_end <- integer(0) Lmatches <- matchPattern(Lpattern, subject, max.mismatch=max.Lmismatch, with.indels=with.Lindels, fixed=Lfixed) if (length(Lmatches) != 0L) { Rmatches <- matchPattern(Rpattern, subject, max.mismatch=max.Rmismatch, with.indels=with.Rindels, fixed=Rfixed) if (length(Rmatches) != 0L) { for (i in seq_len(length(Lmatches))) { gaplength <- start(Rmatches) - end(Lmatches)[i] - 1L jj <- which(0L <= gaplength & gaplength <= max.gaplength) ans_start <- c(ans_start, rep.int(start(Lmatches)[i], length(jj))) ans_end <- c(ans_end, end(Rmatches)[jj]) } } } ans_width <- ans_end - ans_start + 1L unsafe.newXStringViews(subject, ans_start, ans_width) } ) ### Dispatch on 'subject' (see signature of generic). ### WARNING: Unlike the other "matchLRPatterns" methods, the XStringViews object ### returned by this method is not guaranteed to have its views ordered from ### left to right in general! One important particular case where this is ### guaranteed though is when 'isNormal(subject)' is TRUE (i.e. 'subject' is ### a normal XStringViews object) and 'max.mismatch=0' and 'max.Rmismatch=0' ### (so there are no "out of limits" matches). setMethod("matchLRPatterns", "XStringViews", function(Lpattern, Rpattern, max.gaplength, subject, max.Lmismatch=0, max.Rmismatch=0, with.Lindels=FALSE, with.Rindels=FALSE, Lfixed=TRUE, Rfixed=TRUE) { ans_start <- ans_width <- integer(0) subject <- trim(subject) Lcounts <- vcountPattern(Lpattern, subject, max.mismatch = max.Lmismatch, with.indels = with.Lindels, fixed = Lfixed) candidates <- which(Lcounts > 0L) if (length(candidates) != 0L) { subject <- subject[candidates] Lcounts <- Lcounts[candidates] Lmatches <- matchPattern(Lpattern, subject, max.mismatch = max.Lmismatch, with.indels = with.Lindels, fixed = Lfixed) Rranges <- IRanges(start = end(Lmatches) + 1L, width = max.gaplength + nchar(Rpattern)) Rranges <- pintersect(Rranges, rep(as(subject, "IRanges"), Lcounts)) Rsubject <- as(Views(subject(subject), Rranges), "XStringSet") Rmatches <- vmatchPattern(Rpattern, Rsubject, max.mismatch = max.Rmismatch, with.indels = with.Rindels, fixed = Rfixed) Rcounts <- countIndex(Rmatches) Roffset <- unlist(endIndex(Rmatches), use.names=FALSE) if (length(Roffset) != 0L) { ans_start <- rep.int(start(Lmatches), Rcounts) ans_width <- rep.int(width(Lmatches), Rcounts) + Roffset } } unsafe.newXStringViews(subject(subject), ans_start, ans_width) } ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchLRPatterns", "MaskedXString", function(Lpattern, Rpattern, max.gaplength, subject, max.Lmismatch=0, max.Rmismatch=0, with.Lindels=FALSE, with.Rindels=FALSE, Lfixed=TRUE, Rfixed=TRUE) matchLRPatterns(Lpattern, Rpattern, max.gaplength, toXStringViewsOrXString(subject), max.Lmismatch=max.Lmismatch, max.Rmismatch=max.Rmismatch, with.Lindels=with.Lindels, with.Rindels=with.Rindels, Lfixed=Lfixed, Rfixed=Rfixed) ) Biostrings/R/matchPDict.R0000644000126300012640000010675512227063307016644 0ustar00biocbuildphs_compbio### ========================================================================= ### The matchPDict() generic & related functions ### ------------------------------------------------------------------------- ### ### Some examples below with a PDict object of type "ACtree". ### TODO: Update the timings obtained when using the ACtree2 algo. All these ### examples need to go somewhere else! ### ### I. A real use-case ### ------------------ ### > library(hgu95av2probe) ### > dict <- DNAStringSet(hgu95av2probe$sequence) # the original dict ### > pdict <- PDict(dict) ### > pdict ### > library(BSgenome.Hsapiens.UCSC.hg18) ### > chr1 <- Hsapiens$chr1 ### > system.time(end_index <- endIndex(matchPDict(pdict, chr1))) ### user system elapsed ### 50.663 0.000 50.763 ### > count_index <- sapply(end_index, length) ### > table(count_index) ### > id0 <- which(count_index == max(count_index)) ### > p0 <- pdict[[id0]] ### > p0 ### 25-letter "DNAString" instance ### Value: CTGTAATCCCAGCACTTTGGGAGGC ### > subseq(chr1, start=end_index[[id0]][1]-24, end=end_index[[id0]][1]) == p0 ### [1] TRUE ### For a more extensive validation: ### > pidOK <- sapply(seq_len(length(end_index)), ### function(pid) ### identical(end_index[[pid]], ### end(matchPattern(pdict[[pid]], chr1)))) ### > all(pidOK) ### but be aware that THIS WILL TAKE THE WHOLE DAY!!! (20-24 hours) ### ### II. With a big random dictionary, on george1 ### -------------------------------------------- ### 1. Trying to simulate Solexa data: ### > library(Biostrings) ### > dict_length <- 10^6 ### > s <- DNAString(paste(sample(DNA_BASES, 36*dict_length, ### replace=TRUE), collapse="")) ### > views_start <- (0:(dict_length-1)) * 36 + 1 ### > dict <- Views(s, start=views_start, end=views_start + 35) # the original dict ### ### 2. Building the Aho-Corasick 4-ary tree from the original dictionary: ### > pdict <- PDict(dict) ### ### 3. Using pdict on Human chr1: ### > library(BSgenome.Hsapiens.UCSC.hg18) ### > chr1 <- DNAString(Hsapiens$chr1) ### > system.time(end_index <- endIndex(matchPDict(pdict, chr1))) ### user system elapsed ### 105.239 0.188 105.429 ### > count_index <- sapply(end_index, length) ### > sum(count_index) # most likely no match were found ### ### Results obtained with some random dictionaries on george1: ### ### dict dict preprocess pdict searching searching total nb ### length width time size chr1 time again of matches ### ------ ----- ---------- ----- --------- --------- ---------- ### 1M 36 2.5 sec 717M 106 sec 103 sec 0 ### 10M 36 56 sec 6724M 351 sec 200 sec 0 ### 10M 12 7.5 sec 340M 227 sec 216 sec 100M ### 30M 12 27 sec 523M 491 sec ? ### ### III. Inexact matching ### --------------------- ### pdict <- PDict(c("acgt", "gt", "cgt", "ac"), tb.end=2) ### endIndex(matchPDict(pdict, DNAString("acggaccg"), max.mismatch=0)) ### endIndex(matchPDict(pdict, DNAString("acggaccg"), max.mismatch=1)) ### endIndex(matchPDict(pdict, DNAString("acggaccg"), max.mismatch=2)) ### ### TODO: Rerun the benchmarks below on the entire dict0. ### > library(drosophila2probe) ### > dict0 <- DNAStringSet(drosophila2probe$sequence) ### > system.time(pdict0 <- PDict(dict0[1:40000])) ### user system elapsed ### 0.040 0.032 0.072 ### > system.time(pdict <- PDict(dict0[1:40000], tb.end=10)) ### user system elapsed ### 38.158 0.052 38.217 ### ### > library(BSgenome.Dmelanogaster.UCSC.dm3) ### > chr3R <- Dmelanogaster$chr3R ### > system.time(mindex0 <- matchPDict(pdict0, chr3R)) ### user system elapsed ### 1.352 0.000 1.352 ### > system.time(mindex <- matchPDict(pdict, chr3R)) ### user system elapsed ### 1.332 0.008 1.338 ### > identical(countIndex(mindex0), countIndex(mindex)) ### [1] TRUE ### ### Allowing mismatches is fast: ### > system.time(mindex_mm6 <- matchPDict(pdict, chr3R, max.mismatch=4)) ### user system elapsed ### 1.377 0.000 1.375 ### > mindex_mm6[[103]] ### start end width ### 1 9381276 9381285 10 ### 2 16070100 16070109 10 ### > v <- Views(chr3R, start=start(mindex_mm6[[103]]), end=end(mindex_mm6[[103]])+15) ### > mismatch(dict0[[103]], v) ### [[1]] ### [1] 14 15 19 23 24 25 ### ### [[2]] ### integer(0) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Checking the user-supplied arguments. ### .checkUserArgsWhenTrustedBandIsFull <- function(max.mismatch, fixed) { if (max.mismatch != 0L) stop("'max.mismatch' must be 0 when there is no head and no tail") if (!fixed[1L]) warning("the value you specified for 'fixed' means that IUPAC\n", "extended letters in the patterns should be treated as\n", "ambiguities, but this has no effect because the patterns\n", "don't contain such letters") } .checkMaxMismatch <- function(max.mismatch, NTB) { max.mismatch0 <- NTB - 1L if (max.mismatch > max.mismatch0) stop("cannot use vmatchPDict()/vcountPDict()/vwhichPDict() ", "with an MTB_PDict object that was preprocessed to be used ", "with 'max.mismatch' <= ", max.mismatch0) if (max.mismatch < max.mismatch0) cat("WARNING: using 'max.mismatch=", max.mismatch, "' with an ", "MTB_PDict object that was preprocessed for allowing up to ", max.mismatch0, " mismatching letter(s) per match is not optimal\n", sep="") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Convenience wrappers to .Call2(). ### ### 'threeparts' is a PDict3Parts object. .match.PDict3Parts.XString <- function(threeparts, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, matches.as, envir) { fixed <- normargFixed(fixed, subject) with.indels <- normargWithIndels(with.indels) if (with.indels) stop("at the moment, matchPDict() and family only support indels ", "on a non-preprocessed pattern dictionary, sorry") if (!identical(algorithm, "auto")) warning("'algorithm' is ignored when 'pdict' is a PDict object") if (is.null(head(threeparts)) && is.null(tail(threeparts))) .checkUserArgsWhenTrustedBandIsFull(max.mismatch, fixed) .Call2("match_PDict3Parts_XString", threeparts@pptb, head(threeparts), tail(threeparts), subject, max.mismatch, min.mismatch, fixed, matches.as, envir, PACKAGE="Biostrings") } ### 'pattern' is an XStringSet object. .match.XStringSet.XString <- function(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, matches.as, envir) { fixed <- normargFixed(fixed, subject) with.indels <- normargWithIndels(with.indels) if (with.indels && !(matches.as %in% c("MATCHES_AS_WHICH", "MATCHES_AS_COUNTS"))) stop("at the moment, within the matchPDict family, only ", "countPDict(), whichPDict(), vcountPDict() and vwhichPDict() ", "support indels") algo <- normargAlgorithm(algorithm) algo <- selectAlgo(algo, pattern, max.mismatch, min.mismatch, with.indels, fixed) .Call2("match_XStringSet_XString", pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algo, matches.as, envir, PACKAGE="Biostrings") } ### 'threeparts' is a PDict3Parts object. .match.PDict3Parts.XStringViews <- function(threeparts, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, matches.as, envir) { fixed <- normargFixed(fixed, subject) with.indels <- normargWithIndels(with.indels) if (with.indels) stop("at the moment, matchPDict() and family only support indels ", "on a non-preprocessed pattern dictionary, sorry") if (!identical(algorithm, "auto")) warning("'algorithm' is ignored when 'pdict' is a PDict object") if (is.null(head(threeparts)) && is.null(tail(threeparts))) .checkUserArgsWhenTrustedBandIsFull(max.mismatch, fixed) .Call2("match_PDict3Parts_XStringViews", threeparts@pptb, head(threeparts), tail(threeparts), subject(subject), start(subject), width(subject), max.mismatch, min.mismatch, fixed, matches.as, envir, PACKAGE="Biostrings") } ### 'pattern' is an XStringSet object. .match.XStringSet.XStringViews <- function(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, matches.as, envir) { fixed <- normargFixed(fixed, subject) with.indels <- normargWithIndels(with.indels) if (with.indels && !(matches.as %in% c("MATCHES_AS_WHICH", "MATCHES_AS_COUNTS"))) stop("at the moment, within the matchPDict family, only ", "countPDict(), whichPDict(), vcountPDict() and vwhichPDict() ", "support indels") algo <- normargAlgorithm(algorithm) algo <- selectAlgo(algo, pattern, max.mismatch, min.mismatch, with.indels, fixed) .Call2("match_XStringSet_XStringViews", pattern, subject(subject), start(subject), width(subject), max.mismatch, min.mismatch, with.indels, fixed, algo, matches.as, envir, PACKAGE="Biostrings") } ### 'threeparts' is a PDict3Parts object. .vmatch.PDict3Parts.XStringSet <- function(threeparts, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, matches.as, envir) { fixed <- normargFixed(fixed, subject) with.indels <- normargWithIndels(with.indels) if (with.indels) stop("at the moment, matchPDict() and family only support indels ", "on a non-preprocessed pattern dictionary, sorry") if (!identical(algorithm, "auto")) warning("'algorithm' is ignored when 'pdict' is a PDict object") if (is.null(head(threeparts)) && is.null(tail(threeparts))) .checkUserArgsWhenTrustedBandIsFull(max.mismatch, fixed) .Call2("vmatch_PDict3Parts_XStringSet", threeparts@pptb, head(threeparts), tail(threeparts), subject, max.mismatch, min.mismatch, fixed, collapse, weight, matches.as, envir, PACKAGE="Biostrings") } ### 'pattern' is an XStringSet object. .vmatch.XStringSet.XStringSet <- function(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, matches.as, envir) { fixed <- normargFixed(fixed, subject) with.indels <- normargWithIndels(with.indels) if (with.indels && !(matches.as %in% c("MATCHES_AS_WHICH", "MATCHES_AS_COUNTS"))) stop("at the moment, within the matchPDict family, only ", "countPDict(), whichPDict(), vcountPDict() and vwhichPDict() ", "support indels") algo <- normargAlgorithm(algorithm) algo <- selectAlgo(algo, pattern, max.mismatch, min.mismatch, with.indels, fixed) .Call2("vmatch_XStringSet_XStringSet", pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algo, collapse, weight, matches.as, envir, PACKAGE="Biostrings") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Combining the results obtained for each component of an MTB_PDict object. ### .combine.which.compons <- function(ans_compons) unique(sort(unlist(ans_compons))) .combine.vwhich.compons <- function(ans_compons) { lapply(seq_len(length(ans_compons[[1L]])), function(i) { ans_compons_elts <- lapply(ans_compons, "[[", i) .combine.which.compons(ans_compons_elts) } ) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### .matchPDict() ### ### 'pdict' is a TB_PDict object. .match.TB_PDict <- function(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as) { if (is(subject, "DNAString")) C_ans <- .match.PDict3Parts.XString(pdict@threeparts, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, matches.as, NULL) else if (is(subject, "XStringViews") && is(subject(subject), "DNAString")) C_ans <- .match.PDict3Parts.XStringViews(pdict@threeparts, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, matches.as, NULL) else stop("'subject' must be a DNAString object,\n", " a MaskedDNAString object,\n", " or an XStringViews object with a DNAString subject") if (matches.as != "MATCHES_AS_ENDS") return(C_ans) # matchPDict() new("ByPos_MIndex", width0=width(pdict), NAMES=names(pdict), ends=C_ans) } ### 'pdict' is an MTB_PDict object. .match.MTB_PDict <- function(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as) { tb_pdicts <- as.list(pdict) NTB <- length(tb_pdicts) .checkMaxMismatch(max.mismatch, NTB) if (matches.as == "MATCHES_AS_COUNTS") matches.as2 <- "MATCHES_AS_ENDS" else matches.as2 <- matches.as ans_compons <- lapply(seq_len(NTB), function(i) { if (verbose) cat("Getting results for TB_PDict component ", i, "/", NTB, " ...\n", sep="") tb_pdict <- tb_pdicts[[i]] st <- system.time({ ans_compon <- .match.TB_PDict(tb_pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as2) }, gcFirst=TRUE) if (verbose) { print(st) cat(sum(countIndex(ans_compon)), " match(es) found\n", sep="") } ans_compon } ) if (verbose) cat("Combining the results obtained for ", "each TB_PDict component...\n", sep="") if (matches.as == "MATCHES_AS_WHICH") return(.combine.which.compons(ans_compons)) st <- system.time(ans <- ByPos_MIndex.combine(ans_compons), gcFirst=TRUE) if (verbose) print(st) if (matches.as == "MATCHES_AS_COUNTS") return(countIndex(ans)) return(ans) } ### 'pattern' is an XStringSet object. .match.XStringSet <- function(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as) { if (is(subject, "XString")) C_ans <- .match.XStringSet.XString(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, matches.as, NULL) else if (is(subject, "XStringViews")) C_ans <- .match.XStringSet.XStringViews(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, matches.as, NULL) else stop("unsupported 'subject' type") if (matches.as != "MATCHES_AS_ENDS") return(C_ans) # matchPDict() new("ByPos_MIndex", width0=width(pattern), NAMES=names(pattern), ends=C_ans) } .matchPDict <- function(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as="MATCHES_AS_ENDS") { which_pp_excluded <- NULL if (is(pdict, "PDict")) { if (seqtype(subject) != "DNA") stop("'subject' must be DNA") dups0 <- dups(pdict) if (!is.null(dups0)) which_pp_excluded <- which(duplicated(dups0)) } else if (is(pdict, "XStringSet")) { if (seqtype(pdict) != seqtype(subject)) stop("'pdict' and 'subject' must contain ", "sequences of the same type") } else { stop("'pdict' must be a PDict or XStringSet object") } max.mismatch <- normargMaxMismatch(max.mismatch) min.mismatch <- normargMinMismatch(min.mismatch, max.mismatch) if (!isTRUEorFALSE(verbose)) stop("'verbose' must be TRUE or FALSE") ## We are doing our own dispatch here, based on the type of 'pdict'. ## TODO: Revisit this. Would probably be a better design to use a ## generic/methods approach and rely on the standard dispatch mechanism. ## Those low-level generic/methods wouldn't need to be exported. if (is(pdict, "TB_PDict")) ans <- .match.TB_PDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as) else if (is(pdict, "MTB_PDict")) ans <- .match.MTB_PDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as) else ans <- .match.XStringSet(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as) if (is.null(which_pp_excluded)) return(ans) if (matches.as == "MATCHES_AS_WHICH") return(members(dups0, ans)) if (matches.as == "MATCHES_AS_COUNTS") { ans[which_pp_excluded] <- ans[togroup(dups0, which_pp_excluded)] return(ans) } if (is(ans, "ByPos_MIndex")) { ans@dups0 <- dups0 } else { stop("don't know how to store the dup info in a ", class(ans), " object") } return(ans) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### .vmatchPDict() ### ### 'pdict' is an TB_PDict object. .vmatch.TB_PDict <- function(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as) { .vmatch.PDict3Parts.XStringSet(pdict@threeparts, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, matches.as, NULL) } ### 'pdict' is an MTB_PDict object. .vmatch.MTB_PDict <- function(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as) { tb_pdicts <- as.list(pdict) NTB <- length(tb_pdicts) .checkMaxMismatch(max.mismatch, NTB) if (matches.as != "MATCHES_AS_WHICH") stop("MTB_PDict objects are not supported yet, sorry") ans_compons <- lapply(seq_len(NTB), function(i) { if (verbose) cat("Getting results for TB_PDict component ", i, "/", NTB, " ...\n", sep="") tb_pdict <- tb_pdicts[[i]] .vmatch.TB_PDict(tb_pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as) } ) if (verbose) cat("Combining the results obtained for ", "each TB_PDict component...\n", sep="") .combine.vwhich.compons(ans_compons) } ### 'pattern' is an XStringSet object. .vmatch.XStringSet <- function(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as) { .vmatch.XStringSet.XStringSet(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, matches.as, NULL) } .vmatchPDict <- function(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as="MATCHES_AS_ENDS") { which_pp_excluded <- NULL if (is(pdict, "PDict")) { if (seqtype(subject) != "DNA") stop("'subject' must be DNA") dups0 <- dups(pdict) if (!is.null(dups0)) which_pp_excluded <- which(duplicated(dups0)) } else if (is(pdict, "XStringSet")) { if (seqtype(pdict) != seqtype(subject)) stop("'pdict' and 'subject' must contain ", "sequences of the same type") } else { stop("'pdict' must be a PDict or XStringSet object") } max.mismatch <- normargMaxMismatch(max.mismatch) min.mismatch <- normargMinMismatch(min.mismatch, max.mismatch) if (!isTRUEorFALSE(verbose)) stop("'verbose' must be TRUE or FALSE") if (matches.as == "MATCHES_AS_WHICH") { ## vwhichPDict() } else if (matches.as == "MATCHES_AS_COUNTS") { ## vcountPDict() collapse <- normargCollapse(collapse) if (collapse) { if (collapse == 1L) { weight <- recycleNumericArg(weight, "weight", length(subject)) } else { weight <- recycleNumericArg(weight, "weight", length(pdict)) if (!is.null(which_pp_excluded)) { ## Collapse weights of duplicates. ## TODO: Implement this in C. which_is_not_unique <- which(!sapply(low2high(dups0), is.null)) if (length(which_is_not_unique) != 0L) { weight[which_is_not_unique] <- weight[which_is_not_unique] + sapply(which_is_not_unique, function(i) sum(weight[low2high(dups0)[[i]]])) } } } } else { if (!identical(weight, 1L)) warning("'weight' is ignored when 'collapse=FALSE'") } } else { ## vmatchPDict() stop("vmatchPDict() is not supported yet, sorry") } ## We are doing our own dispatch here, based on the type of 'pdict'. ## TODO: Revisit this. Would probably be a better design to use a ## generic/methods approach and rely on the standard dispatch mechanism. ## Those low-level generic/methods wouldn't need to be exported. if (is(pdict, "TB_PDict")) ans <- .vmatch.TB_PDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as) else if (is(pdict, "MTB_PDict")) ans <- .vmatch.MTB_PDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as) else ans <- .vmatch.XStringSet(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as) if (is.null(which_pp_excluded)) return(ans) if (matches.as == "MATCHES_AS_WHICH") { ## vwhichPDict() return(vmembers(dups0, ans)) } if (matches.as == "MATCHES_AS_COUNTS") { ## vcountPDict() if (collapse == 0L) { ans[which_pp_excluded, ] <- ans[togroup(dups0, which_pp_excluded), ] } else if (collapse == 1L) { ans[which_pp_excluded] <- ans[togroup(dups0, which_pp_excluded)] } return(ans) } ## vmatchPDict() stop("vmatchPDict() is not supported yet, sorry") return(ans) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "matchPDict" generic and methods. ### setGeneric("matchPDict", signature="subject", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) standardGeneric("matchPDict") ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPDict", "XString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) .matchPDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose) ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPDict", "XStringSet", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) stop("please use vmatchPDict() when 'subject' is an XStringSet ", "object (multiple sequence)") ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPDict", "XStringViews", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) .matchPDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose) ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPDict", "MaskedXString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) matchPDict(pdict, toXStringViewsOrXString(subject), max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, algorithm=algorithm, verbose=verbose) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "countPDict" generic and methods. ### setGeneric("countPDict", signature="subject", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) standardGeneric("countPDict") ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPDict", "XString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) .matchPDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as="MATCHES_AS_COUNTS") ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPDict", "XStringSet", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) stop("please use vcountPDict() when 'subject' is an XStringSet ", "object (multiple sequence)") ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPDict", "XStringViews", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) .matchPDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as="MATCHES_AS_COUNTS") ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPDict", "MaskedXString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) countPDict(pdict, toXStringViewsOrXString(subject), max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, algorithm=algorithm, verbose=verbose) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "whichPDict" generic and methods. ### setGeneric("whichPDict", signature="subject", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) standardGeneric("whichPDict") ) ### Dispatch on 'subject' (see signature of generic). setMethod("whichPDict", "XString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) .matchPDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as="MATCHES_AS_WHICH") ) ### Dispatch on 'subject' (see signature of generic). setMethod("whichPDict", "XStringSet", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) stop("please use vwhichPDict() when 'subject' is an XStringSet ", "object (multiple sequence)") ) ### Dispatch on 'subject' (see signature of generic). setMethod("whichPDict", "XStringViews", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) .matchPDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, verbose, matches.as="MATCHES_AS_WHICH") ) ### Dispatch on 'subject' (see signature of generic). setMethod("whichPDict", "MaskedXString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) whichPDict(pdict, toXStringViewsOrXString(subject), max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, algorithm=algorithm, verbose=verbose) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "vmatchPDict", "vcountPDict" and "vwhichPDict" generic and methods. ### ### These are vectorized versions of matchPDict(), countPDict() and ### whichPDict(). If M denotes the number of patterns in 'pdict' and N the ### number of sequences in 'subject', then: ### o vwhichPDict(): 'vwhichPDict(pdict, subject, ...)' is equivalent to ### 'lapply(subject, function(s) whichPDict(pdict, s, ...))'. ### The returned object is a list of length N. ### o vcountPDict(): returns an M x N matrix of integers. ### o vmatchPDict(): not supported yet! (first we need a container to ### store the results) ### setGeneric("vmatchPDict", signature="subject", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE, ...) standardGeneric("vmatchPDict") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vmatchPDict", "ANY", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) stop("vmatchPDict() is not ready yet, sorry") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vmatchPDict", "XString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) stop("please use matchPDict() when 'subject' is an XString ", "object (single sequence)") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vmatchPDict", "MaskedXString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) stop("please use matchPDict() when 'subject' is a MaskedXString ", "object (single sequence)") ) setGeneric("vcountPDict", signature="subject", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", collapse=FALSE, weight=1L, verbose=FALSE, ...) standardGeneric("vcountPDict") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vcountPDict", "XString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", collapse=FALSE, weight=1L, verbose=FALSE) stop("please use countPDict() when 'subject' is an XString ", "object (single sequence)") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vcountPDict", "XStringSet", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", collapse=FALSE, weight=1L, verbose=FALSE) .vmatchPDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, collapse, weight, verbose, matches.as="MATCHES_AS_COUNTS") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vcountPDict", "XStringViews", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", collapse=FALSE, weight=1L, verbose=FALSE) vcountPDict(pdict, fromXStringViewsToStringSet(subject), max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, algorithm=algorithm, collapse=collapse, weight=weight, verbose=verbose) ) ### Dispatch on 'subject' (see signature of generic). setMethod("vcountPDict", "MaskedXString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", collapse=FALSE, weight=1L, verbose=FALSE) stop("please use countPDict() when 'subject' is a MaskedXString ", "object (single sequence)") ) setGeneric("vwhichPDict", signature="subject", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) standardGeneric("vwhichPDict") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vwhichPDict", "XString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) stop("please use whichPDict() when 'subject' is an XString ", "object (single sequence)") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vwhichPDict", "XStringSet", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) .vmatchPDict(pdict, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, 0L, 1L, verbose, matches.as="MATCHES_AS_WHICH") ) ### Dispatch on 'subject' (see signature of generic). setMethod("vwhichPDict", "XStringViews", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) vwhichPDict(pdict, fromXStringViewsToStringSet(subject), max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, algorithm=algorithm, verbose=verbose) ) ### Dispatch on 'subject' (see signature of generic). setMethod("vwhichPDict", "MaskedXString", function(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) stop("please use whichPDict() when 'subject' is a MaskedXString ", "object (single sequence)") ) Biostrings/R/matchPWM.R0000644000126300012640000003340612227063307016274 0ustar00biocbuildphs_compbio### ========================================================================= ### Position Weight Matrix (PWM) functions ### ------------------------------------------------------------------------- ### A Position Weight Matrix (PWM) is represented as an ordinary matrix. ### We don't use an S4 class for this, not even an S3 class. .normargPwm <- function(pwm, argname="pwm") { if (!is.matrix(pwm) || !is.numeric(pwm)) stop("'", argname, "' must be a numeric matrix") if (!identical(rownames(pwm), DNA_BASES)) stop("'rownames(", argname, ")' must be the 4 DNA bases ('DNA_BASES')") if (!is.double(pwm)) storage.mode(pwm) <- "double" if (any(is.na(pwm))) stop("'", argname, "' contains NAs") pwm } ### A Position Frequency Matrix (PFM) is also represented as an ordinary ### matrix. Unlike a PWM, it must be of type integer (it will typically be ### the result of consensusMatrix()). .normargPfm <- function(x) { if (!is.matrix(x) || !is.integer(x)) stop("invalid PFM 'x': not an integer matrix") ## Check the row names. if (is.null(rownames(x))) stop("invalid PFM 'x': no row names") if (!all(rownames(x) %in% DNA_ALPHABET)) stop("invalid PFM 'x': row names must be in 'DNA_ALPHABET'") if (!all(DNA_BASES %in% rownames(x))) stop("invalid PFM 'x': row names must contain A, C, G and T") if (any(duplicated(rownames(x)))) stop("invalid PFM 'x': duplicated row names") ## Check the nb of cols. if (ncol(x) == 0L) stop("invalid PFM 'x': no columns") ## Check the values. if (any(is.na(x)) || any(x < 0L)) stop("invalid PFM 'x': values cannot be NA or negative") if (any(x[!(rownames(x) %in% DNA_BASES), ] != 0L)) stop("invalid PFM 'x': IUPAC ambiguity letters are represented") x <- x[DNA_BASES, , drop=FALSE] if (!isConstant(colSums(x))) stop("invalid PFM 'x': all columns in 'x' must sum to the same ", "value.\n If the PFM was obtained by calling consensusMatrix() ", "on a DNAStringSet\n object, please make sure that this object ", "is rectangular (i.e. has a\n constant width).") x } ### Typical 'prior.params' vector: c(A=0.25, C=0.25, G=0.25, T=0.25) .normargPriorParams <- function(prior.params) { if (!is.numeric(prior.params)) stop("'prior.params' must be a numeric vector") if (length(prior.params) != length(DNA_BASES) || !setequal(names(prior.params), DNA_BASES)) stop("'prior.params' elements must be named A, C, G and T") ## Re-order the elements. prior.params <- prior.params[DNA_BASES] if (any(is.na(prior.params)) || any(prior.params < 0)) stop("'prior.params' contains NAs and/or negative values") prior.params } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Some utilities to operate on a PWM. ### ### Extracts the max weight for each position (i.e. column) in a PWM. setGeneric("maxWeights", function(x) standardGeneric("maxWeights")) setMethod("maxWeights", "matrix", function(x) { x <- .normargPwm(x, argname="x") #sapply(seq_len(ncol(x)), function(i) max(x[ , i])) ## This will be faster than the above on large matrices do.call(pmax, lapply(seq_len(nrow(x)), function(i) x[i, ])) }) ### Extracts the min weight for each position (i.e. column) in a PWM. setGeneric("minWeights", function(x) standardGeneric("minWeights")) setMethod("minWeights", "matrix", function(x) { x <- .normargPwm(x, argname="x") #sapply(seq_len(ncol(x)), function(i) max(x[ , i])) ## This will be faster than the above on large matrices do.call(pmin, lapply(seq_len(nrow(x)), function(i) x[i, ])) }) ### Computes the highest possible score that can be obtained with a PWM. setGeneric("maxScore", function(x) standardGeneric("maxScore")) setMethod("maxScore", "ANY", function(x) sum(maxWeights(x))) ### Computes the lowest possible score that can be obtained with a PWM. setGeneric("minScore", function(x) standardGeneric("minScore")) setMethod("minScore", "ANY", function(x) sum(minWeights(x))) ### TODO: There is no reason to treat this differently than the above ### utilities. So either this should be implemented as a generic+method ### or the above utilities should be implemented as ordinary functions. unitScale <- function(x) { minS <- minScore(x) (x - minS/ncol(x)) / (maxScore(x) - minS) } ### Method needed for searching the minus strand of a chromosome like ### this: ### > matchPWM(reverseComplement(pwm), chr1) ### Note that the generic function is defined in Biostrings. setMethod("reverseComplement", "matrix", function(x, ...) { ans <- rev(x) attributes(ans) <- attributes(x) ans } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "PWM" generic and methods. ### setGeneric("PWM", signature="x", function(x, type = c("log2probratio", "prob"), prior.params = c(A=0.25, C=0.25, G=0.25, T=0.25)) standardGeneric("PWM") ) setMethod("PWM", "character", function(x, type = c("log2probratio", "prob"), prior.params = c(A=0.25, C=0.25, G=0.25, T=0.25)) { dnaset <- DNAStringSet(x) PWM(dnaset, type = type, prior.params = prior.params) } ) setMethod("PWM", "DNAStringSet", function(x, type = c("log2probratio", "prob"), prior.params = c(A=0.25, C=0.25, G=0.25, T=0.25)) { if (!isConstant(width(x))) stop("'x' must be rectangular (i.e. have a constant width)") pfm <- consensusMatrix(x) PWM(pfm, type = type, prior.params = prior.params) } ) ### Assumes 'x' is a Position *Frequency* Matrix (PFM) and computes the ### corresponding Position *Weight* Matrix (PWM). setMethod("PWM", "matrix", function(x, type = c("log2probratio", "prob"), prior.params = c(A=0.25, C=0.25, G=0.25, T=0.25)) { x <- .normargPfm(x) ## From here 'x' is guaranteed to have at least 1 column and to have ## all its columns sum to the same value. nseq <- sum(x[ , 1L]) type <- match.arg(type) prior.params <- .normargPriorParams(prior.params) priorN <- sum(prior.params) ## NOTE (H.P.): What's the purpose of dividing by nseq + priorN here? ## It won't have any impact on the final result (because of the ## unitScale final step). postProbs <- (x + prior.params) / (nseq + priorN) if (type == "log2probratio") { if (any(prior.params == 0)) stop("infinite values in PWM due to 0's in 'prior.params'") prior.probs <- prior.params / priorN ans <- log2(postProbs / prior.probs) } else { ans <- postProbs } unitScale(ans) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "PWMscoreStartingAt" function. ### .normargSubject <- function(subject) { if (is.character(subject)) { subject <- DNAString(subject) } else if (is(subject, "MaskedDNAString")) { if (any(active(masks(subject)))) stop("active masks are not supported yet, please complain!") subject <- unmasked(subject) } else if (is(subject, "XStringViews")) { subject <- subject(subject) } if (!is(subject, "DNAString")) stop("'subject' must be a single character string, ", "or a DNAString object, or a MaskedDNAString object with ", "no active masks, or a Views object on a DNAString subject") subject } ### TODO: There is no reason to treat this differently than anything else ### in this file. So maybe this should be implemented as a generic+method ### too (or matchPWM/countPWM shouldn't). PWMscoreStartingAt <- function(pwm, subject, starting.at=1) { ## checking 'pwm' pwm <- .normargPwm(pwm) ## checking 'subject' subject <- .normargSubject(subject) ## checking 'starting.at' if (!is.numeric(starting.at)) stop("'starting.at' must be a vector of integers") if (!is.integer(starting.at)) starting.at <- as.integer(starting.at) base_codes <- xscodes(subject, baseOnly=TRUE) .Call2("PWM_score_starting_at", pwm, subject, starting.at, base_codes, PACKAGE="Biostrings") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "matchPWM" generic and methods. ### .normargMinScore <- function(min.score, pwm) { if (!isSingleNumber(min.score) && !isSingleString(min.score)) stop("'min.score' must be a single number or string") if (is.numeric(min.score)) { if (!is.double(min.score)) storage.mode(min.score) <- "double" return(min.score) } nc <- nchar(min.score) if (substr(min.score, nc, nc) == "%") min.score <- substr(min.score, 1L, nc-1L) maxScore(pwm) * as.double(min.score) / 100.00 } ### pwm: the Position Weight Matrix (numeric matrix with row names A, C, G ### and T); ### subject: a DNAString object containing the subject sequence; ### min.score: given as a percentage (e.g. "90%") of the highest possible ### score or as a single number. .XString.matchPWM <- function(pwm, subject, min.score, with.score=FALSE, count.only=FALSE) { ## checking 'pwm' pwm <- .normargPwm(pwm) ## checking 'min.score' min.score <- .normargMinScore(min.score, pwm) ## checking 'with.score' if (!isTRUEorFALSE(with.score)) stop("'with.score' must be TRUE or FALSE") ## no need to check 'count.only' (not a user controlled argument) base_codes <- xscodes(subject, baseOnly=TRUE) C_ans <- .Call2("XString_match_PWM", pwm, subject, min.score, count.only, base_codes, PACKAGE="Biostrings") if (count.only) return(C_ans) ans_start <- start(C_ans) ans_width <- width(C_ans) ans <- unsafe.newXStringViews(subject, ans_start, ans_width) if (with.score) { score <- PWMscoreStartingAt(pwm, subject, starting.at=ans_start) mcols(ans) <- DataFrame(score=score) } ans } .XStringViews.matchPWM <- function(pwm, subject, min.score, with.score=FALSE, count.only=FALSE) { ## checking 'pwm' pwm <- .normargPwm(pwm) ## checking 'min.score' min.score <- .normargMinScore(min.score, pwm) ## checking 'with.score' if (!isTRUEorFALSE(with.score)) stop("'with.score' must be TRUE or FALSE") ## no need to check 'count.only' (not a user controlled argument) subject0 <- subject(subject) base_codes <- xscodes(subject0, baseOnly=TRUE) C_ans <- .Call2("XStringViews_match_PWM", pwm, subject0, start(subject), width(subject), min.score, count.only, base_codes, PACKAGE="Biostrings") if (count.only) return(C_ans) ans_start <- start(C_ans) ans_width <- width(C_ans) ans <- unsafe.newXStringViews(subject0, ans_start, ans_width) if (with.score) { score <- PWMscoreStartingAt(pwm, subject0, starting.at=ans_start) mcols(ans) <- DataFrame(score=score) } ans } ### Note the dispatch on 'subject'. setGeneric("matchPWM", signature="subject", function(pwm, subject, min.score="80%", with.score=FALSE, ...) standardGeneric("matchPWM") ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPWM", "character", function(pwm, subject, min.score="80%", with.score=FALSE) matchPWM(pwm, DNAString(subject), min.score=min.score, with.score=with.score) ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPWM", "DNAString", function(pwm, subject, min.score="80%", with.score=FALSE) .XString.matchPWM(pwm, subject, min.score, with.score=with.score) ) ### Dispatch on 'subject' (see signature of generic). ### WARNING: Unlike the other "matchPWM" methods, the XStringViews object ### returned by this method is not guaranteed to have its views ordered from ### left to right in general! One important particular case where this is ### guaranteed though is when 'isNormal(subject)' is TRUE (i.e. 'subject' is ### a normal XStringViews object). ### matchPWM does not support "out of limits" matches. setMethod("matchPWM", "XStringViews", function(pwm, subject, min.score="80%", with.score=FALSE) .XStringViews.matchPWM(pwm, subject, min.score, with.score=with.score) ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPWM", "MaskedDNAString", function(pwm, subject, min.score="80%", with.score=FALSE) matchPWM(pwm, toXStringViewsOrXString(subject), min.score=min.score, with.score=with.score) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "countPWM" generic and methods. ### ### Note the dispatch on 'subject'. setGeneric("countPWM", signature="subject", function(pwm, subject, min.score="80%", ...) standardGeneric("countPWM") ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPWM", "character", function(pwm, subject, min.score="80%") countPWM(pwm, DNAString(subject), min.score) ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPWM", "DNAString", function(pwm, subject, min.score="80%") .XString.matchPWM(pwm, subject, min.score, count.only=TRUE) ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPWM", "XStringViews", function(pwm, subject, min.score="80%") .XStringViews.matchPWM(pwm, subject, min.score, count.only=TRUE) ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPWM", "MaskedDNAString", function(pwm, subject, min.score="80%") countPWM(pwm, toXStringViewsOrXString(subject), min.score) ) Biostrings/R/matchPattern.BOC.R0000644000126300012640000001537112227063307017651 0ustar00biocbuildphs_compbio### ========================================================================= ### Preprocessed Subject Strings of type BOC ### ------------------------------------------------------------ ### Note that 'base1_code', 'base2_code' and 'base3_code' must be distinct setClass("BOC_SubjectString", representation( subject="DNAString", # TODO: support "RNAString" too pattern_length="integer", # A single integer e.g. 36 base1_code="integer", # integer belonging to DNA_BASE_CODES base2_code="integer", base3_code="integer", base4_code="integer", base1_OCbuffer="SharedRaw", # all buffers must be of length nchar(subject) - pattern_length + 1 base2_OCbuffer="SharedRaw", base3_OCbuffer="SharedRaw", pre4buffer="SharedRaw", ## The "stats" slot is a named list with the following elements: ## means: vector of 4 doubles ## table1, table2, table3, table4: vectors of (pattern_length + 1) integers stats="list" ) ) ### Typical use: ### library(BSgenome.Hsapiens.UCSC.hg18) ### chr1 <- Hsapiens$chr1 ### chr1boc <- new("BOC_SubjectString", chr1, 36, c("A", "C", "G")) # 3-4 seconds on lamb1 setMethod("initialize", "BOC_SubjectString", function(.Object, subject, pattern_length, base_letters) { .Object@subject <- subject if (!isSingleNumber(pattern_length)) stop("'pattern_length' must be a single integer") pattern_length <- as.integer(pattern_length) if (pattern_length < 4L || 254L < pattern_length) stop("'pattern_length' must be >= 4 and <= 254") if (pattern_length > nchar(subject)) stop("'pattern_length' must be <= 'nchar(subject)'") .Object@pattern_length <- pattern_length if (!is.character(base_letters) || length(base_letters) != 3 || !all(base_letters %in% names(DNA_BASE_CODES)) || any(duplicated(base_letters))) stop("'base_letters' must contain 3 distinct DNA base-letters") buf_length <- nchar(subject) - pattern_length + 1 code1 <- DNA_BASE_CODES[base_letters[1]] code2 <- DNA_BASE_CODES[base_letters[2]] code3 <- DNA_BASE_CODES[base_letters[3]] code4 <- DNA_BASE_CODES[setdiff(names(DNA_BASE_CODES), base_letters)] buf1 <- SharedRaw(buf_length) buf2 <- SharedRaw(buf_length) buf3 <- SharedRaw(buf_length) pre4buf <- SharedRaw(buf_length) stats <- .Call2("match_BOC_preprocess", subject@shared@xp, subject@offset, subject@length, pattern_length, code1, code2, code3, code4, buf1@shared@xp, buf2@shared@xp, buf3@shared@xp, pre4buf@shared@xp, PACKAGE="Biostrings") .Object@base1_code <- code1 .Object@base2_code <- code2 .Object@base3_code <- code3 .Object@base4_code <- code4 .Object@base1_OCbuffer <- buf1 .Object@base2_OCbuffer <- buf2 .Object@base3_OCbuffer <- buf3 .Object@pre4buffer <- pre4buf .Object@stats <- stats .Object } ) ### Typical use: ### Biostrings:::plotBOC(chr1boc, "Human chr1") plotBOC <- function(x, main) { XLAB <- "Base Occurrence Count" TITLE <- paste(XLAB, " for the ", x@pattern_length, "-mers in ", main, sep="") YLAB <- paste("number of ", x@pattern_length, "-mers", sep="") YMAX <- max(c(x@stats$table1, x@stats$table2, x@stats$table3, x@stats$table4)) plot.new() plot.window(c(0, x@pattern_length), c(0, YMAX)) title(TITLE, xlab=XLAB, ylab=YLAB, col.main="black") axis(1) axis(2) axis(4) par(fg="red") lines(0:x@pattern_length, x@stats$table1, type="l") par(fg="blue") lines(0:x@pattern_length, x@stats$table2, type="l") par(fg="green") lines(0:x@pattern_length, x@stats$table3, type="p") par(fg="black") lines(0:x@pattern_length, x@stats$table4, type="p") LEGEND <- c(names(x@base1_code), names(x@base2_code), names(x@base3_code), names(x@base4_code)) LEGEND <- paste(LEGEND, "-count", sep="") COLORS <- c("red", "blue", "green", "black") legend(x=x@pattern_length, y=YMAX, legend=LEGEND, col=COLORS, lty="solid", lwd=3, xjust=1.0, yjust=1.0) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "matchPattern" method for BOC_SubjectString objects. ### ### Typical use: ### library(BSgenome.Hsapiens.UCSC.hg18) ### chr1 <- Hsapiens$chr1 ### chr1boc <- new("BOC_SubjectString", chr1, 36, c("A", "C", "G")) ### matchPattern(chr1[1:36], chr1boc) ### ### Performance (kind of disappointing so far): ### for (i in 41:60) matchPattern(chr1[1:36+1000000*i], chr1boc) ### #--> takes about 11 seconds on lamb1 ### for (i in 41:60) matchPattern(chr1[1:36+1000000*i], chr1, algo="boyer-moore") ### #--> takes about 7.6 seconds on lamb1 ### for (i in 41:60) matchPattern(chr1[1:36+1000000*i], chr1, algo="naive-exact") ### #--> takes about 111 seconds on lamb1 ### .match.BOC.exact <- function(pattern, boc_subject, count.only) { .Call2("match_BOC_exact", pattern@shared@xp, pattern@offset, pattern@length, boc_subject@subject@shared@xp, boc_subject@subject@offset, boc_subject@subject@length, boc_subject@base1_code, boc_subject@base2_code, boc_subject@base3_code, boc_subject@base4_code, boc_subject@base1_OCbuffer@shared@xp, boc_subject@base2_OCbuffer@shared@xp, boc_subject@base3_OCbuffer@shared@xp, boc_subject@pre4buffer@shared@xp, boc_subject@stats, count.only, PACKAGE="Biostrings") } .match.BOC.inexact <- function(pattern, boc_subject, max.mismatch, count.only) { stop("NOT READY YET!") } ### Dispatch on 'subject' (see signature of generic). ### 'algorithm' is ignored. setMethod("matchPattern", "BOC_SubjectString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") { pattern <- normargPattern(pattern, subject@subject) pattern_length <- nchar(pattern) if (pattern_length != subject@pattern_length) stop("subject was preprocessed for patterns of length ", subject@pattern_length) max.mismatch <- normargMaxMismatch(max.mismatch) if (!missing(fixed)) { fixed <- normargFixed(fixed, subject@subject) if (!all(fixed)) stop("only 'fixed=TRUE' can be used with a subject of class ", class(subject)) } if (max.mismatch == 0) C_ans <- .match.BOC.exact(pattern, subject, count.only=FALSE) else C_ans <- .match.BOC.inexact(pattern, subject, max.mismatch, count.only=FALSE) unsafe.newXStringViews(subject@subject, start(C_ans), width(C_ans)) } ) Biostrings/R/matchPattern.BOC2.R0000644000126300012640000002366412227063307017737 0ustar00biocbuildphs_compbio### ========================================================================= ### Preprocessed Subject Strings of type BOC2 ### ------------------------------------------------------------------------- ### Note that 'base1_code', 'base2_code' and 'base3_code' must be distinct setClass("BOC2_SubjectString", representation( subject="DNAString", # TODO: support "RNAString" too pattern_length="integer", # A single integer e.g. 36 base1_code="integer", # integer belonging to DNA_BASE_CODES base2_code="integer", base3_code="integer", base4_code="integer", buffer="XInteger", # must be of length nchar(subject) - pattern_length + 1 ## The "stats" slot is a named list with the following elements: ## means: vector of 4 doubles ## table1, table2, table3, table4: vectors of (pattern_length + 1) integers stats="list" ) ) ### Typical use: ### library(BSgenome.Hsapiens.UCSC.hg18) ### chr1 <- Hsapiens$chr1 ### chr1boc <- new("BOC2_SubjectString", chr1, 36, c("A", "C", "G")) # 3-4 seconds on lamb1 setMethod("initialize", "BOC2_SubjectString", function(.Object, subject, pattern_length, base_letters) { .Object@subject <- subject if (!isSingleNumber(pattern_length)) stop("'pattern_length' must be a single integer") pattern_length <- as.integer(pattern_length) if (pattern_length < 4L || 254L < pattern_length) stop("'pattern_length' must be >= 4 and <= 254") if (pattern_length > nchar(subject)) stop("'pattern_length' must be <= 'nchar(subject)'") .Object@pattern_length <- pattern_length if (!is.character(base_letters) || length(base_letters) != 3 || !all(base_letters %in% names(DNA_BASE_CODES)) || any(duplicated(base_letters))) stop("'base_letters' must contain 3 distinct DNA base-letters") buf_length <- nchar(subject) - pattern_length + 1 code1 <- DNA_BASE_CODES[base_letters[1]] code2 <- DNA_BASE_CODES[base_letters[2]] code3 <- DNA_BASE_CODES[base_letters[3]] code4 <- DNA_BASE_CODES[setdiff(names(DNA_BASE_CODES), base_letters)] buf <- XInteger(buf_length) stats <- .Call2("match_BOC2_preprocess", subject@shared@xp, subject@offset, subject@length, pattern_length, code1, code2, code3, code4, buf@shared@xp, PACKAGE="Biostrings") .Object@base1_code <- code1 .Object@base2_code <- code2 .Object@base3_code <- code3 .Object@base4_code <- code4 .Object@buffer <- buf .Object@stats <- stats .Object } ) ### Typical use: ### Biostrings:::plotBOC2(chr1boc, "Human chr1") plotBOC2 <- function(x, main) { XLAB <- "Base Occurrence Count" TITLE <- paste(XLAB, " for the ", x@pattern_length, "-mers in ", main, sep="") YLAB <- paste("number of ", x@pattern_length, "-mers", sep="") YMAX <- max(c(x@stats$table1, x@stats$table2, x@stats$table3, x@stats$table4)) plot.new() plot.window(c(0, x@pattern_length), c(0, YMAX)) title(TITLE, xlab=XLAB, ylab=YLAB, col.main="black") axis(1) axis(2) axis(4) par(fg="red") lines(0:x@pattern_length, x@stats$table1, type="l") par(fg="blue") lines(0:x@pattern_length, x@stats$table2, type="l") par(fg="green") lines(0:x@pattern_length, x@stats$table3, type="p") par(fg="black") lines(0:x@pattern_length, x@stats$table4, type="p") LEGEND <- c(names(x@base1_code), names(x@base2_code), names(x@base3_code), names(x@base4_code)) LEGEND <- paste(LEGEND, "-count", sep="") COLORS <- c("red", "blue", "green", "black") legend(x=x@pattern_length, y=YMAX, legend=LEGEND, col=COLORS, lty="solid", lwd=3, xjust=1.0, yjust=1.0) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "matchPattern" method for BOC2_SubjectString objects. ### ### Typical use: ### library(BSgenome.Hsapiens.UCSC.hg18) ### chr1 <- Hsapiens$chr1 ### chr1boc <- new("BOC2_SubjectString", chr1, 36, c("A", "C", "G")) ### matchPattern(chr1[1:36], chr1boc) ### ### Performance (a little bit better than with the first BOC algo): ### for (i in 41:80) matchPattern(chr1[1:36+1000000*i], chr1boc) ### #--> takes about 12.8 seconds on lamb1 ### for (i in 41:80) matchPattern(chr1[1:36+1000000*i], chr1, algo="boyer-moore") ### #--> takes 14.77 seconds on lamb1 ### ### See next section below for detailed benchmarks. ### .match.BOC2.exact <- function(pattern, boc_subject, count.only) { .Call2("match_BOC2_exact", pattern@shared@xp, pattern@offset, pattern@length, boc_subject@subject@shared@xp, boc_subject@subject@offset, boc_subject@subject@length, boc_subject@base1_code, boc_subject@base2_code, boc_subject@base3_code, boc_subject@base4_code, boc_subject@buffer@shared@xp, boc_subject@stats, count.only, PACKAGE="Biostrings") } .match.BOC2.inexact <- function(pattern, boc_subject, max.mismatch, count.only) { stop("NOT READY YET!") } .matchPattern.BOC2 <- function(pattern, boc_subject, max.mismatch, fixed, count.only=FALSE) { pattern <- normargPattern(pattern, boc_subject@subject) pattern_length <- nchar(pattern) if (pattern_length != boc_subject@pattern_length) stop("subject was preprocessed for patterns of length ", boc_subject@pattern_length) max.mismatch <- normargMaxMismatch(max.mismatch) fixed <- normargFixed(fixed, boc_subject@subject) if (!all(fixed)) stop("only 'fixed=TRUE' can be used with a subject of class ", class(boc_subject)) if (max.mismatch == 0) C_ans <- .match.BOC2.exact(pattern, boc_subject, count.only) else C_ans <- .match.BOC2.inexact(pattern, boc_subject, max.mismatch, count.only) if (count.only) return(C_ans) unsafe.newXStringViews(boc_subject@subject, start(C_ans), width(C_ans)) } ### Dispatch on 'subject' (see signature of generic). ### 'algorithm' is ignored. setMethod("matchPattern", "BOC2_SubjectString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") { .matchPattern.BOC2(pattern, subject, max.mismatch, fixed) } ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPattern", "BOC2_SubjectString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") { .matchPattern.BOC2(pattern, subject, max.mismatch, fixed, count.only=TRUE) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Benchmarks. ### ### Running the cmp_BOC2vsBoyerMoore_exactmatching() function with different ### values of 'pattern_length' gives the following results: ### ### pattern_length boyer-moore BOC2 ### -------------- ----------- --------- ### 12 11.432 6.419 ### 20 8.691 6.393 ### 36 7.539 6.386 ### 48 6.754 6.387 ### 60 5.893 6.394 ### 92 5.509 6.368 ### 132 4.867 6.384 ### 180 5.326 6.371 ### 236 4.448 6.390 ### 254 4.539 6.368 ### ### Note: the BOC2 algo only supports pattern lengths <= 254 (no such limit ### for Boyer-Moore). ### ### Search for 20 patterns in Human chromosome 1 #(commented for now because it generates 'R CMD check' WARNINGs) #cmp_BOC2vsBoyerMoore_exactmatching <- function(pattern_length) #{ # library(BSgenome.Hsapiens.UCSC.hg18) # chr1 <- Hsapiens$chr1 # chr1boc <- new("BOC2_SubjectString", chr1, pattern_length, c("A", "C", "G")) # dt0 <- system.time(for (i in 41:60) matchPattern(chr1[seq_len(pattern_length)+1000000*i], chr1, algo="boyer-moore")) # dt1 <- system.time(for (i in 41:60) matchPattern(chr1[seq_len(pattern_length)+1000000*i], chr1boc)) # c('boyer-moore'=dt0[['elapsed']], 'BOC2'=dt1[['elapsed']]) #} ### A note about [40-120]mers in Human genome with a surprisingly high number ### of occurrences. ### ### TODO: Move this to a more appropiate place (vignette?) ### ### In Human chr1, the 50999961-51000124 region is rich in substring of 40-80 ### letters that have a lot of occurrences (a few dozens) in the whole ### chromosome sequence. More remarkably, these substrings also have a similar ### number of occurrences in the minus strand _and_ in the plus and minus ### strands of other chromosomes (checked with chr2 and chr3 only, need to do ### more checking). ### ### For example, this: ### ### library(BSgenome.Hsapiens.UCSC.hg18) ### chr1 <- Hsapiens$chr1 ### chr1boc <- new("BOC2_SubjectString", chr1, 120, c("A", "C", "G")) ### chr2 <- Hsapiens$chr2 ### chr2boc <- new("BOC2_SubjectString", chr2, 120, c("A", "C", "G")) ### chr3 <- Hsapiens$chr3 ### chr3boc <- new("BOC2_SubjectString", chr3, 120, c("A", "C", "G")) ### Biostrings:::scan123(chr1[seq_len(120)+51000000-17], chr1boc, chr2boc, chr3boc) ### ### gives the following: ### ### cp1p cp1m cp2p cp2m cp3p cp3m ### 14 21 13 16 12 18 ### ### The same with a pattern length of 40 instead of 120 gives: ### ### cp1p cp1m cp2p cp2m cp3p cp3m ### 212 212 239 242 243 231 ### scan123 <- function(pattern, subject1, subject2, subject3, min.sum=-1) { rc_pattern <- reverseComplement(pattern) cp1p <- countPattern(pattern, subject1) cp1m <- countPattern(rc_pattern, subject1) cp2p <- countPattern(pattern, subject2) cp2m <- countPattern(rc_pattern, subject2) cp3p <- countPattern(pattern, subject3) cp3m <- countPattern(rc_pattern, subject3) ans <- c('cp1p'=cp1p, 'cp1m'=cp1m, 'cp2p'=cp2p, 'cp2m'=cp2m, 'cp3p'=cp3p, 'cp3m'=cp3m) if (min.sum >= 0 && sum(ans) >= min.sum) cat(paste(ans, collapse=" "), "\n", sep="") ans } Biostrings/R/matchPattern.R0000644000126300012640000004366112227063307017252 0ustar00biocbuildphs_compbio### ========================================================================= ### The matchPattern() generic & related functions ### ------------------------------------------------------------------------- .Clongint.nbits <- function() { .Call2("bits_per_long", PACKAGE="Biostrings") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### matchPattern algos for standard character vectors. ### ### Note that these algos are not documented. ### ### This matchPattern algo can miss matches (see below why). .matchPattern.gregexpr <- function(pattern, subject) { matches <- gregexpr(pattern, subject, fixed=TRUE)[[1]] if (length(matches) == 1 && matches == -1) matches <- integer(0) else attr(matches, "match.length") <- NULL matches } ### Standard R gregexpr() misses matches when they are overlapping: ### > gregexpr("aa", c("XaaaYaa", "a"), fixed=TRUE) ### [[1]] ### [1] 2 6 ### attr(,"match.length") ### [1] 2 2 ### ### [[2]] ### [1] -1 ### attr(,"match.length") ### [1] -1 ### ### gregexpr2() is a modified version of gregexpr() that returns _all_ ### matches but it only works in 'fixed=TRUE' mode (i.e. for exact matching, ### no regular expression): ### > gregexpr2("aa", c("XaaaYaa", "a")) ### [[1]] ### [1] 2 3 6 ### ### [[2]] ### [1] -1 ### ### Note that, unlike gregexpr(), gregexpr2() doesn't attach a "match.length" ### attribute to each element of the returned list because, since it only works ### in 'fixed=TRUE' mode, then all the matches have the length of the pattern. ### Another difference with gregexpr() is that with gregexpr2(), the 'pattern' ### argument must be a single (non-NA, non-empty) string. gregexpr2 <- function(pattern, text) { if (!is.character(pattern) || length(pattern) != 1 || is.na(pattern) || nchar(pattern) == 0) stop("invalid pattern") matches <- gregexpr(pattern, text, fixed=TRUE) nP <- nchar(pattern) for (i in 1:length(text)) { mi <- matches[[i]] if (length(mi) == 1 && mi == -1) { attr(matches[[i]], "match.length") <- NULL } else { subtexts <- substring(text[i], mi + 1, mi + 2*nP - 2) missing_matches <- gregexpr2(pattern, subtexts) for (j in 1:length(mi)) { mj <- missing_matches[[j]] if (length(mj) != 1 || mj != -1) matches[[i]] <- c(matches[[i]], mi[j] + mj) } matches[[i]] <- sort(matches[[i]]) } } matches } .matchPattern.gregexpr2 <- function(pattern, subject) { matches <- gregexpr2(pattern, subject)[[1]] if (length(matches) == 1 && matches == -1) matches <- integer(0) matches } .character.matchPattern <- function(pattern, subject, max.mismatch, fixed, algo, count.only) { if (!isSingleString(pattern) || nchar(pattern) == 0) stop("'pattern' must be a single (non-empty) string ", "for this algorithm") if (!isSingleString(subject) || nchar(subject) == 0) stop("'subject' must be a single (non-empty) string ", "for this algorithm") max.mismatch <- normargMaxMismatch(max.mismatch) ## we cheat on normargFixed() to keep it quiet fixed <- normargFixed(fixed, DNAString()) if (!(max.mismatch == 0L && all(fixed))) stop("this algorithm only supports exact matching ", "(i.e. 'max.mismatch=0' and 'fixed=TRUE')") if (!isTRUEorFALSE(count.only)) stop("'count.only' must be TRUE or FALSE") matches <- switch(algo, "gregexpr"=.matchPattern.gregexpr(pattern, subject), "gregexpr2"=.matchPattern.gregexpr2(pattern, subject)) if (count.only) length(matches) else matches } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### .XString.matchPattern() and .XStringViews.matchPattern() ### .XString.matchPattern <- function(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, count.only=FALSE) { algo <- normargAlgorithm(algorithm) if (isCharacterAlgo(algo)) return(.character.matchPattern(pattern, subject, max.mismatch, fixed, algo, count.only)) if (!is(subject, "XString")) subject <- XString(NULL, subject) pattern <- normargPattern(pattern, subject) max.mismatch <- normargMaxMismatch(max.mismatch) min.mismatch <- normargMinMismatch(min.mismatch, max.mismatch) with.indels <- normargWithIndels(with.indels) fixed <- normargFixed(fixed, subject) if (!isTRUEorFALSE(count.only)) stop("'count.only' must be TRUE or FALSE") algo <- selectAlgo(algo, pattern, max.mismatch, min.mismatch, with.indels, fixed) C_ans <- .Call2("XString_match_pattern", pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algo, count.only, PACKAGE="Biostrings") if (count.only) return(C_ans) unsafe.newXStringViews(subject, start(C_ans), width(C_ans)) } .XStringViews.matchPattern <- function(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, count.only=FALSE) { algo <- normargAlgorithm(algorithm) if (isCharacterAlgo(algo)) stop("'subject' must be a single (non-empty) string ", "for this algorithm") pattern <- normargPattern(pattern, subject) max.mismatch <- normargMaxMismatch(max.mismatch) min.mismatch <- normargMinMismatch(min.mismatch, max.mismatch) with.indels <- normargWithIndels(with.indels) fixed <- normargFixed(fixed, subject) if (!isTRUEorFALSE(count.only)) stop("'count.only' must be TRUE or FALSE") algo <- selectAlgo(algo, pattern, max.mismatch, min.mismatch, with.indels, fixed) C_ans <- .Call2("XStringViews_match_pattern", pattern, subject(subject), start(subject), width(subject), max.mismatch, min.mismatch, with.indels, fixed, algo, count.only, PACKAGE="Biostrings") if (count.only) return(C_ans) unsafe.newXStringViews(subject(subject), start(C_ans), width(C_ans)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "matchPattern" generic and methods. ### ### Typical use: ### matchPattern("TG", DNAString("GTGACGTGCAT")) ### matchPattern("TG", DNAString("GTGACGTGCAT"), algo="shift", max.mismatch=1) ### Edge cases: ### matchPattern("---", DNAString("ACGTGCA"), max.mismatch=3) ### matchPattern("---", DNAString("A")) ### setGeneric("matchPattern", signature="subject", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") standardGeneric("matchPattern") ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPattern", "character", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XString.matchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm) ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPattern", "XString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XString.matchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm) ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPattern", "XStringSet", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") stop("please use vmatchPattern() when 'subject' is an XStringSet object (multiple sequence)") ) ### Dispatch on 'subject' (see signature of generic). ### WARNING: Unlike the other "matchPattern" methods, the XStringViews object ### returned by this method is not guaranteed to have its views ordered from ### left to right in general! One important particular case where this is ### guaranteed though is when 'isNormal(subject)' is TRUE (i.e. 'subject' is ### a normal XStringViews object) and 'max.mismatch=0' (no "out of limits" ### matches). setMethod("matchPattern", "XStringViews", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XStringViews.matchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm) ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchPattern", "MaskedXString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") matchPattern(pattern, toXStringViewsOrXString(subject), max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, algorithm=algorithm) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "countPattern" generic and methods. ### ### countPattern() is equivalent to length(matchPattern()) but should be ### slightly faster, especially when there is a high number of matches. ### ### Typical use: ### countPattern("TG", DNAString("GTGACGTGCAT")) ### countPattern("TG", DNAString("GTGACGTGCAT"), max.mismatch=1) ### Edge cases: ### countPattern("---", DNAString("ACGTGCA"), max.mismatch=3) ### countPattern("---", DNAString("A")) ### setGeneric("countPattern", signature="subject", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") standardGeneric("countPattern") ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPattern", "character", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XString.matchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, count.only=TRUE) ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPattern", "XString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XString.matchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, count.only=TRUE) ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPattern", "XStringSet", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") stop("please use vcountPattern() when 'subject' is an XStringSet object (multiple sequence)") ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPattern", "XStringViews", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XStringViews.matchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, count.only=TRUE) ) ### Dispatch on 'subject' (see signature of generic). setMethod("countPattern", "MaskedXString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") countPattern(pattern, toXStringViewsOrXString(subject), max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, algorithm=algorithm) ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "vmatchPattern" and "vcountPattern" generic and methods. ### ### These are vectorized versions of matchPattern() and countPattern(). ### vmatchPattern() returns an MIndex object and vcountPattern() an integer ### vector (like matchPDict() and countPDict(), respectively). ### .XStringSet.vmatchPattern <- function(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, count.only=FALSE) { if (!is(subject, "XStringSet")) subject <- XStringSet(NULL, subject) algo <- normargAlgorithm(algorithm) if (isCharacterAlgo(algo)) stop("'subject' must be a single (non-empty) string ", "for this algorithm") pattern <- normargPattern(pattern, subject) max.mismatch <- normargMaxMismatch(max.mismatch) min.mismatch <- normargMinMismatch(min.mismatch, max.mismatch) with.indels <- normargWithIndels(with.indels) fixed <- normargFixed(fixed, subject) if (!isTRUEorFALSE(count.only)) stop("'count.only' must be TRUE or FALSE") algo <- selectAlgo(algo, pattern, max.mismatch, min.mismatch, with.indels, fixed) # because MIndex objects do not support variable-width matches yet if (algo == "indels" && !count.only) stop("vmatchPattern() does not support indels yet") C_ans <- .Call2("XStringSet_vmatch_pattern", pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algo, count.only, PACKAGE = "Biostrings") if (count.only) return(C_ans) ans_width0 <- rep.int(length(pattern), length(subject)) new("ByPos_MIndex", width0=ans_width0, NAMES=names(subject), ends=C_ans) } setGeneric("vmatchPattern", signature="subject", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", ...) standardGeneric("vmatchPattern") ) setMethod("vmatchPattern", "character", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XStringSet.vmatchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm) ) setMethod("vmatchPattern", "XString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") stop("please use matchPattern() when 'subject' is an XString object (single sequence)") ) setMethod("vmatchPattern", "XStringSet", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XStringSet.vmatchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm) ) # TODO: Add a "vmatchPattern" method for XStringViews objects. # Note that the start/end of the matches need to be returned as relative # to subject(subject). setMethod("vmatchPattern", "XStringViews", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") stop("XStringViews objects are not supported yet, sorry") ) setMethod("vmatchPattern", "MaskedXString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") stop("please use matchPattern() when 'subject' is a MaskedXString object (single sequence)") ) setGeneric("vcountPattern", signature="subject", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", ...) standardGeneric("vcountPattern") ) setMethod("vcountPattern", "character", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XStringSet.vmatchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, count.only=TRUE) ) setMethod("vcountPattern", "XString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") stop("please use countPattern() when 'subject' is an XString object (single sequence)") ) setMethod("vcountPattern", "XStringSet", function(pattern, subject, max.mismatch=0L, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") .XStringSet.vmatchPattern(pattern, subject, max.mismatch, min.mismatch, with.indels, fixed, algorithm, count.only=TRUE) ) setMethod("vcountPattern", "XStringViews", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") vcountPattern(pattern, fromXStringViewsToStringSet(subject), max.mismatch=max.mismatch, min.mismatch=min.mismatch, with.indels=with.indels, fixed=fixed, algorithm=algorithm) ) setMethod("vcountPattern", "MaskedXString", function(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") stop("please use countPattern() when 'subject' is a MaskedXString object (single sequence)") ) Biostrings/R/matchProbePair.R0000644000126300012640000001127412227063307017513 0ustar00biocbuildphs_compbio### ========================================================================= ### matchProbePair() ### ---------------- ### ### ------------------------------------------------------------------------- # NOT USED, NOT EXPORTED # 'x' and 'y' must be numerics # Return the _list_ of all (x0, y0) pairs such that # d(x0,y0) == min{d(xx,yy), xx in x, yy in y} closestValues <- function(x, y) { sux <- sort(unique(x)) suy <- sort(unique(y)) lsux <- length(sux) lsuy <- length(suy) x0 <- sux[1] y0 <- suy[1] d0 <- abs(x0 - y0) i <- j <- 1 repeat { if (sux[i] <= suy[j]) i <- i + 1 else j <- j + 1 if (i > lsux || j > lsuy) break xx <- sux[i] yy <- suy[j] d <- abs(xx - yy) if (d < d0) { x0 <- xx y0 <- yy d0 <- d } else if (d == d0) { x0 <- append(x0, xx) y0 <- append(y0, yy) } } ans <- list() for (k in 1:length(x0)) ans[[k]] <- c(x0[k], y0[k]) ans } reduceProbePairMatches <- function(start, end) { start <- sort(unique(start)) end <- sort(unique(end)) nstart <- length(start) nend <- length(end) i <- j <- 1 start0 <- end0 <- integer(0) while (i <= nstart && j <= nend) { if (end[j] < start[i]) { j <- j + 1 next } while (i < nstart && start[i + 1] <= end[j]) i <- i + 1 start0 <- c(start0, start[i]) end0 <- c(end0, end[j]) i <- i + 1 j <- j + 1 } data.frame(start=start0, end=end0) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "matchProbePair" new generic. ### ### Simulates a PCR experiment by finding the "theoretical amplicons" mapped ### to a given probe pair. ### setGeneric("matchProbePair", signature="subject", function(Fprobe, Rprobe, subject, algorithm="auto", logfile=NULL, verbose=FALSE) standardGeneric("matchProbePair") ) ### Dispatch on 'subject' (see signature of generic). setMethod("matchProbePair", "DNAString", function(Fprobe, Rprobe, subject, algorithm="auto", logfile=NULL, verbose=FALSE) { ## This won't copy the data if Fprobe and Rprobe are already DNAString objects F <- DNAString(Fprobe) R <- DNAString(Rprobe) ## F and R hits on the + strand Fp_hits <- start(matchPattern(F, subject, algorithm=algorithm)) Rp_hits <- start(matchPattern(R, subject, algorithm=algorithm)) ## F and R hits on the - strand Fm_hits <- end(matchPattern(reverseComplement(F), subject, algorithm=algorithm)) Rm_hits <- end(matchPattern(reverseComplement(R), subject, algorithm=algorithm)) if (verbose) { cat("Fp_hits:", Fp_hits, " Rp_hits:", Rp_hits, " Fm_hits:", Fm_hits, " Rm_hits:", Rm_hits, "\n") } matches0 <- reduceProbePairMatches(c(Fp_hits, Rp_hits), c(Fm_hits, Rm_hits)) ans <- Views(subject, start=matches0$start, end=matches0$end) if (!is.null(logfile)) { nFp <- length(Fp_hits) nRp <- length(Rp_hits) nFm <- length(Fm_hits) nRm <- length(Rm_hits) nmatches0 <- length(ans) ## cat("", ..., sep="\t") is a trick to get an extra tab cat("", nFp, nRp, nFm, nRm, nmatches0, file=logfile, sep="\t") } ans } ) ### Dispatch on 'subject' (see signature of generic). ### WARNING: Unlike the other "matchProbePair" methods, the XStringViews object ### returned by this method is not guaranteed to have its views ordered from ### left to right in general! One important particular case where this is ### guaranteed though is when 'isNormal(subject)' is TRUE (i.e. 'subject' is ### a normal XStringViews object). setMethod("matchProbePair", "XStringViews", function(Fprobe, Rprobe, subject, algorithm="auto", logfile=NULL, verbose=FALSE) { ans_start <- ans_width <- integer(0) for (i in seq_len(length(subject))) { pm <- matchProbePair(Fprobe, Rprobe, subject[[i]], algorithm=algorithm, logfile=logfile, verbose=verbose) offset <- start(subject)[i] - 1L ans_start <- c(ans_start, offset + start(pm)) ans_width <- c(ans_width, width(pm)) } unsafe.newXStringViews(subject(subject), ans_start, ans_width) } ) setMethod("matchProbePair", "MaskedDNAString", function(Fprobe, Rprobe, subject, algorithm="auto", logfile=NULL, verbose=FALSE) matchProbePair(Fprobe, Rprobe, toXStringViewsOrXString(subject), algorithm=algorithm, logfile=logfile, verbose=verbose) ) Biostrings/R/matchprobes.R0000644000126300012640000000041212227063307017112 0ustar00biocbuildphs_compbiomatchprobes <- function(query, records, probepos=FALSE) .Call2("MP_matchprobes", toupper(query), toupper(records), probepos, PACKAGE="Biostrings") longestConsecutive <- function(seq, letter) .Call2("MP_longestConsecutive", seq, letter, PACKAGE="Biostrings") Biostrings/R/misc.R0000644000126300012640000000065312227063307015545 0ustar00biocbuildphs_compbio### Some miscellaneous stuff N50 <- function(csizes) { if (!is.numeric(csizes)) stop("'csizes' must be a vector containing the contig sizes") if (!is.integer(csizes)) csizes <- as.integer(csizes) decreasing_csizes <- sort(csizes, decreasing=TRUE) tmp <- cumsum(decreasing_csizes) total_size <- tmp[length(tmp)] N50 <- decreasing_csizes[which(tmp >= total_size/2)[1]] return(N50) } Biostrings/R/needwunsQS.R0000644000126300012640000001451412227063307016707 0ustar00biocbuildphs_compbio### ========================================================================= ### The needwunsQS() generic & related functions ### -------------------------------------------- ### ### Needleman-Wunsch global alignment following Durbin et al ### QS = quadratic space requirement, simple gap penalty ### ### ------------------------------------------------------------------------- ### NOT USED ANYMORE! ### R-implementation of the Needleman-Wunsch algo originally written by VJC ### for Biostrings 1 and adapted for Biostrings 2 by H. Pages. ### 's1' and 's2' must be character vectors of length 1. .needwunsQS <- function(s1, s2, substmat, gappen) { if (length(s1) != 1 || length(s2) != 1) stop("currently requires s1, s2 each to be vectors of length 1") es1 <- safeExplode(s1) es2 <- safeExplode(s2) allco <- unique(c(es1, es2)) allscoco <- colnames(substmat) if (!all(allco %in% allscoco)) { print("not all symbols used in strings are present in scoring matrix; discrepancies:") print(setdiff(allco, allscoco)) stop("fatal error") } n1 <- length(es1) n2 <- length(es2) ## we are going to create matrices to hold score and traceback info sco <- tra <- matrix(0, nrow=n1+1, ncol=n2+1) sco[1,] <- -1*(0:n2)*gappen sco[,1] <- -1*(0:n1)*gappen for (i in seq_len(n1)) for (j in seq_len(n2)) { ## traceback is 1 if we have a match, 2 (3) indicates gap ## in aligned string 2 (1) tmp <- c(sco[i ,j ] + substmat[es1[i], es2[j]], sco[i ,j+1] - gappen, sco[i+1,j ] - gappen) tra[i+1,j+1] <- which.max(tmp) sco[i+1,j+1] <- max(tmp) } reval1 <- reval2 <- NULL fcol <- n2+1 frow <- n1+1 while (max(c(fcol, frow)) > 1) { crit <- tra[frow, fcol] if (crit > 0) { tmp1 <- es1[frow-1] reval1 <- c(switch(crit, tmp1, tmp1, "-"), reval1) tmp2 <- es2[fcol-1] reval2 <- c(switch(crit, tmp2, "-", tmp2), reval2) frow <- switch(crit, frow-1, frow-1, frow) fcol <- switch(crit, fcol-1, fcol, fcol-1) } else if (fcol > 1) { reval2 <- c(es2[fcol-1], reval2) reval1 <- c("-", reval1) fcol <- fcol - 1 } else if (frow > 1) { reval1 <- c(es1[frow-1], reval1) reval2 <- c("-", reval2) frow <- frow - 1 } } ans <- c(al1=paste(reval1, collapse=""), al2=paste(reval2, collapse="")) attr(ans,"scomat") <- sco attr(ans,"score") <- sco[n1+1, n2+1] attr(ans,"tramat") <- tra ## we will use S3 class concepts here until we come ## up with a consensus approach to class architecture class(ans) <- "needwunsQS" ans } print.needwunsQS <- function(x, ...) { print(matrix(c(x["al1"], x["al2"]),ncol=1)) cat(paste("Score: ", score(x), collapse=""),"\n") invisible(x) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### C-implementation of the Needleman-Wunsch algo. ### ### The various "needwunsQS" methods below don't call ### .Call2("align_needwunsQS", ...) directly but call XString.needwunsQS() ### instead which itself calls .Call2("align_needwunsQS", ...). ### Some quick testing shows that, depending on the size of the strings to ### align, this C version is 100 to 1000 times faster than the above ### .needwunsQS(). ### 's1' and 's2' must be XString objects of same sequence type. ### Return a PairwiseAlignments object where the "al1" and "al2" slots ### contain the aligned versions of 's1' and 's2'. XString.needwunsQS <- function(s1, s2, substmat, gappen) { .Deprecated("pairwiseAlignment") if (class(s1) != class(s2)) stop("'s1' and 's2' are not of the same class") if (is.character(substmat)) { if (length(substmat) != 1) stop("'substmat' is a character vector of length != 1") matname <- substmat substmat <- try(getdata(matname), silent=TRUE) if (is(substmat, "try-error")) stop("unknown scoring matrix \"", matname, "\"") } if (!is.matrix(substmat) || !is.integer(substmat)) stop("'substmat' must be a matrix of integers") if (!identical(rownames(substmat), colnames(substmat))) stop("row and column names differ for matrix 'substmat'") if (is.null(rownames(substmat))) stop("matrix 'substmat' must have row and column names") if (any(duplicated(rownames(substmat)))) stop("matrix 'substmat' has duplicated row names") if (is.null(xscodec(s1))) { codes <- as.integer(charToRaw(paste(rownames(substmat), collapse=""))) gap_code <- charToRaw("-") } else { if (!all(rownames(substmat) %in% alphabet(s1))) stop("matrix 'substmat' is incompatible with 's1' alphabet") letters2codes <- xscodec(s1)@codes names(letters2codes) <- xscodec(s1)@letters codes <- letters2codes[rownames(substmat)] gap_code <- as.raw(letters2codes[["-"]]) } lkup <- buildLookupTable(codes, 0:(nrow(substmat)-1)) C_ans <- .Call2("align_needwunsQS", s1, s2, substmat, nrow(substmat), lkup, as.integer(gappen), gap_code, PACKAGE="Biostrings") PairwiseAlignments(new(class(s1), shared = C_ans$al1, length = length(C_ans$al1)), new(class(s2), shared = C_ans$al2, length = length(C_ans$al2)), type = "global", substitutionMatrix = substmat, gapOpening = 0, gapExtension = gappen) } setGeneric("needwunsQS", signature=c("s1", "s2"), function(s1, s2, substmat, gappen=8) standardGeneric("needwunsQS") ) setMethod("needwunsQS", signature(s1="character", s2="character"), function(s1, s2, substmat, gappen) XString.needwunsQS(BString(s1), BString(s2), substmat, gappen) ) setMethod("needwunsQS", signature(s1="character", s2="XString"), function(s1, s2, substmat, gappen) XString.needwunsQS(XString(seqtype(s2), s1), s2, substmat, gappen) ) setMethod("needwunsQS", signature(s1="XString", s2="character"), function(s1, s2, substmat, gappen) XString.needwunsQS(s1, XString(seqtype(s1), s2), substmat, gappen) ) setMethod("needwunsQS", signature(s1="XString", s2="XString"), function(s1, s2, substmat, gappen) XString.needwunsQS(s1, s2, substmat, gappen) ) Biostrings/R/padAndClip.R0000644000126300012640000001223412227063307016607 0ustar00biocbuildphs_compbio### ========================================================================= ### padAndClip() and stackStrings() ### ------------------------------------------------------------------------- ### Return an XString object of length 1. .normarg_padding.letter <- function(padding.letter, seqtype, what) { if (seqtype != "B" && identical(padding.letter, " ")) stop("'", what, "' must be supplied if 'x' is not ", "a BStringSet object") class <- paste0(seqtype, "String") if (isSingleString(padding.letter) && nchar(padding.letter) == 1L) return(as(padding.letter, class)) if (is(padding.letter, "XString") && length(padding.letter) == 1L) return(as(padding.letter, class)) if (is(padding.letter, "XStringSet") && length(padding.letter) == 1L && width(padding.letter) == 1L) return(as(padding.letter[[1L]], class)) stop("'", what, "' must be a single letter") } ### 'filler_width' must be an integer vector, and 'letter' an XString object ### of length 1. .make_sequence_fillers_from_widths <- function(filler_width, letter) { if (length(filler_width) == 0L) { max_width <- 0L at <- IRanges() } else { max_width <- max(filler_width) at <- IRanges(1L, filler_width) } biggest_filler <- rep.int(letter, max_width) extractAt(biggest_filler, at) } padAndClip <- function(x, views, Lpadding.letter=" ", Rpadding.letter=" ", remove.out.of.view.strings=FALSE) { if (!is(x, "XStringSet")) stop("'x' must be an XStringSet object") x_width <- width(x) x_names <- names(x) x_mcols <- mcols(x) if (!is(views, "Ranges")) stop("'views' must be a Ranges object") ## .V_recycle() is currently defined in replaceAt.R but it needs to move ## to a place more appropriate for sharing (see TODO note in replaceAt.R). views_start <- .V_recycle(start(views), x, "views", "'length(x)'") ## We don't want to generate the same warning twice. views_width <- suppressWarnings(.V_recycle(width(views), x, "views", "'length(x)'")) x_seqtype <- seqtype(x) Lpadding.letter <- .normarg_padding.letter(Lpadding.letter, x_seqtype, "Lpadding.letter") Rpadding.letter <- .normarg_padding.letter(Rpadding.letter, x_seqtype, "Rpadding.letter") if (!isTRUEorFALSE(remove.out.of.view.strings)) stop("'remove.out.of.view.strings' must be TRUE or FALSE") ## Left and right margins. Lmargin <- 1L - views_start Rmargin <- views_width - x_width - Lmargin ## Clip. Eventhough padAndClip() conceptually pads first (with an ## infinite number of padding letters on the left and right) and then ## clips, in practice we clip first and then pad. Lclipping <- pmin(pmax(-Lmargin, 0L), x_width) Rclipping <- pmin(pmax(-Rmargin, 0L), x_width) clipped_x <- narrow(x, start=1L+Lclipping, end=x_width-Rclipping, use.names=FALSE) ## Left and right padding. Lpad_width <- pmin(pmax(Lmargin, 0L), views_width) Rpad_width <- pmin(pmax(Rmargin, 0L), views_width) if (remove.out.of.view.strings) { idx <- which(Lpad_width == views_width | Rpad_width == views_width) if (length(idx) != 0L) { idx <- -idx x_names <- x_names[idx] x_mcols <- x_mcols[idx] clipped_x <- clipped_x[idx] Lpad_width <- Lpad_width[idx] Rpad_width <- Rpad_width[idx] } } Lpad <- .make_sequence_fillers_from_widths(Lpad_width, Lpadding.letter) Rpad <- .make_sequence_fillers_from_widths(Rpad_width, Rpadding.letter) ans <- xscat(Lpad, clipped_x, Rpad) names(ans) <- x_names mcols(ans) <- x_mcols ans } ### Convenience wrapper to padAndClip(). Returned object is always rectangular ### (i.e. constant-width). stackStrings <- function(x, from, to, shift=0L, Lpadding.letter=" ", Rpadding.letter=" ", remove.out.of.view.strings=FALSE) { if (!is(x, "XStringSet")) stop("'x' must be an XStringSet object") ## Normalize 'from'. if (!isSingleNumber(from)) stop("'from' must be a single integer") if (!is.integer(from)) from <- as.integer(from) ## Normalize 'to'. if (!isSingleNumber(to)) stop("'to' must be a single integer") if (!is.integer(to)) to <- as.integer(to) if (to < from - 1L) stop("'to' must be >= 'from - 1L'") ## Normalize 'shift'. if (!is.numeric(shift)) stop("'shift' must be a vector of integers") if (!is.integer(shift)) shift <- as.integer(shift) ## .V_recycle() is currently defined in replaceAt.R but it needs to move ## to a place more appropriate for sharing (see TODO note in replaceAt.R). shift <- .V_recycle(shift, x, "shift", "'length(x)'") views <- IRanges(from - shift, to - shift) padAndClip(x, views, Lpadding.letter=Lpadding.letter, Rpadding.letter=Rpadding.letter, remove.out.of.view.strings=remove.out.of.view.strings) } Biostrings/R/pairwiseAlignment.R0000644000126300012640000006503612227063307020302 0ustar00biocbuildphs_compbio### ========================================================================= ### The pairwiseAlignment() generic & related functions ### ------------------------------------------------------------------------- ### ### The pairwiseAligment() function provides optimal pairwise alignment of ### the following types: ### - Global alignment ### - Local alignment ### - Overlap alignment ### - Pattern Overlap alignment ### - Subject Overlap alignment ### ### ------------------------------------------------------------------------- nucleotideSubstitutionMatrix <- function(match = 1, mismatch = 0, baseOnly = FALSE, type = "DNA") { "%safemult%" <- function(x, y) ifelse(is.infinite(x) & y == 0, 0, x * y) type <- match.arg(type, c("DNA", "RNA")) if (!isSingleNumber(match) || !isSingleNumber(mismatch)) stop("'match' and 'mismatch' must be non-missing numbers") if (baseOnly) letters <- IUPAC_CODE_MAP[DNA_BASES] else letters <- IUPAC_CODE_MAP if (type == "RNA") names(letters) <- chartr("T", "U", names(letters)) nLetters <- length(letters) splitLetters <- strsplit(letters,split="") submat <- matrix(0, nrow = nLetters, ncol = nLetters, dimnames = list(names(letters), names(letters))) for(i in 1:nLetters) for(j in i:nLetters) submat[i,j] <- submat[j,i] <- mean(outer(splitLetters[[i]], splitLetters[[j]], "==")) abs(match) * submat - abs(mismatch) %safemult% (1 - submat) } errorSubstitutionMatrices <- function(errorProbability, fuzzyMatch = c(0, 1), alphabetLength = 4L, bitScale = 1) { if (!is.numeric(errorProbability) || !all(!is.na(errorProbability) & errorProbability >= 0 & errorProbability <= 1)) stop("'errorProbability' must be a numeric vector with values between 0 and 1 inclusive") if (!is.numeric(fuzzyMatch) || !all(!is.na(fuzzyMatch) & fuzzyMatch >= 0 & fuzzyMatch <= 1)) stop("'fuzzyMatch' must be a numeric vector with values between 0 and 1 inclusive") errorMatrix <- outer(errorProbability, errorProbability, function(e1,e2,n) e1 + e2 - (n/(n - 1)) * e1 * e2, n = alphabetLength) adjMatchProbs <- lapply(list(match = (1 - errorMatrix) * alphabetLength, mismatch = errorMatrix * (alphabetLength / (alphabetLength - 1))), function(x) {dimnames(x) <- list(names(errorProbability), names(errorProbability)); x}) output <- array(NA_real_, dim = c(length(errorProbability), length(errorProbability), length(fuzzyMatch)), dimnames = list(names(errorProbability), names(errorProbability), as.character(fuzzyMatch))) for (i in seq_len(length(fuzzyMatch))) { output[,,i] <- bitScale * log2(fuzzyMatch[i] * adjMatchProbs[["match"]] + (1 - fuzzyMatch[i]) * adjMatchProbs[["mismatch"]]) } output } qualitySubstitutionMatrices <- function(fuzzyMatch = c(0, 1), alphabetLength = 4L, qualityClass = "PhredQuality", bitScale = 1) { if (!is.numeric(fuzzyMatch) || !all(!is.na(fuzzyMatch) & fuzzyMatch >= 0 & fuzzyMatch <= 1)) stop("'fuzzyMatch' must be a numeric vector with values between 0 and 1 inclusive") if (!is(new(qualityClass), "XStringQuality")) stop("'qualityClass' must be one of the 'XStringQuality' classes") qualityIntegers <- minQuality(new(qualityClass)):maxQuality(new(qualityClass)) errorProbability <- qualityConverter(qualityIntegers, qualityClass, "numeric") names(errorProbability) <- as.character(qualityIntegers) errorSubstitutionMatrices(errorProbability, fuzzyMatch, alphabetLength = alphabetLength, bitScale = bitScale) } XStringSet.pairwiseAlignment <- function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = -10, gapExtension = -4, scoreOnly = FALSE) { ## Check arguments if (seqtype(pattern) != seqtype(subject)) stop("'pattern' and 'subject' must contain ", "sequences of the same type") if (!(length(subject) %in% c(1, length(pattern)))) stop("'length(subject)' must equal 1 or 'length(pattern)'") type <- match.arg(type, c("global", "local", "overlap", "global-local", "local-global", "subjectOverlap", "patternOverlap")) if (type == "subjectOverlap") { warning("type = 'subjectOverlap' has been renamed type = 'global-local'") type <- "global-local" } if (type == "patternOverlap") { warning("type = 'patternOverlap' has been renamed type = 'local-global'") type <- "local-global" } typeCode <- c("global" = 1L, "local" = 2L, "overlap" = 3L, "global-local" = 4L, "local-global" = 5L)[[type]] gapOpening <- as.double(- abs(gapOpening)) if (length(gapOpening) != 1 || is.na(gapOpening)) stop("'gapOpening' must be a non-positive numeric vector of length 1") gapExtension <- as.double(- abs(gapExtension)) if (length(gapExtension) != 1 || is.na(gapExtension)) stop("'gapExtension' must be a non-positive numeric vector of length 1") scoreOnly <- as.logical(scoreOnly) if (length(scoreOnly) != 1 || any(is.na(scoreOnly))) stop("'scoreOnly' must be a non-missing logical value") ## Process string information if (is.null(xscodec(pattern))) { unique_letters <- unique(c(uniqueLetters(pattern), uniqueLetters(subject))) #Even if safeLettersToInt() will deal properly with embedded nuls, I #suspect bad things would probably happen downstream in case there are any. alphabetToCodes <- safeLettersToInt(unique_letters, letters.as.names=TRUE) } else { alphabetToCodes <- xscodes(pattern) } useQuality <- FALSE if (is.character(substitutionMatrix)) { if (length(substitutionMatrix) != 1) stop("'substitutionMatrix' is a character vector of length != 1") tempMatrix <- substitutionMatrix substitutionMatrix <- try(getdata(tempMatrix), silent = TRUE) if (is(substitutionMatrix, "try-error")) stop("unknown scoring matrix \"", tempMatrix, "\"") } if (!is.matrix(substitutionMatrix) || !is.numeric(substitutionMatrix)) stop("'substitutionMatrix' must be a numeric matrix") if (!identical(rownames(substitutionMatrix), colnames(substitutionMatrix))) stop("row and column names differ for matrix 'substitutionMatrix'") if (is.null(rownames(substitutionMatrix))) stop("matrix 'substitutionMatrix' must have row and column names") if (any(duplicated(rownames(substitutionMatrix)))) stop("matrix 'substitutionMatrix' has duplicated row names") availableLetters <- intersect(names(alphabetToCodes), rownames(substitutionMatrix)) substitutionMatrix <- matrix(as.double(substitutionMatrix[availableLetters, availableLetters]), nrow = length(availableLetters), ncol = length(availableLetters), dimnames = list(availableLetters, availableLetters)) substitutionArray <- array(unlist(substitutionMatrix, substitutionMatrix), dim = c(dim(substitutionMatrix), 2), dimnames = list(availableLetters, availableLetters, c("0", "1"))) substitutionLookupTable <- buildLookupTable(alphabetToCodes[availableLetters], 0:(length(availableLetters) - 1)) fuzzyMatrix <- matrix(0L, length(availableLetters), length(availableLetters), dimnames = list(availableLetters, availableLetters)) diag(fuzzyMatrix) <- 1L fuzzyLookupTable <- buildLookupTable(alphabetToCodes[availableLetters], 0:(length(availableLetters) - 1)) .Call2("XStringSet_align_pairwiseAlignment", pattern, subject, type, typeCode, scoreOnly, gapOpening, gapExtension, useQuality, substitutionArray, dim(substitutionArray), substitutionLookupTable, fuzzyMatrix, dim(fuzzyMatrix), fuzzyLookupTable, PACKAGE="Biostrings") } .normargFuzzyMatrix <- function(fuzzyMatrix, rownames) { if (is.null(fuzzyMatrix)) { fuzzyMatrix <- diag(length(rownames)) dimnames(fuzzyMatrix) <- list(rownames, rownames) return(fuzzyMatrix) } if (!is.matrix(fuzzyMatrix) || !is.numeric(fuzzyMatrix) || any(is.na(fuzzyMatrix)) || any(fuzzyMatrix < 0) || any(fuzzyMatrix > 1)) stop("'fuzzyMatrix' must be a numeric matrix with values ", "between 0 and 1 inclusive") if (!identical(rownames(fuzzyMatrix), colnames(fuzzyMatrix))) stop("row and column names differ for matrix 'fuzzyMatrix'") if (is.null(rownames(fuzzyMatrix))) stop("matrix 'fuzzyMatrix' must have row and column names") if (any(duplicated(rownames(fuzzyMatrix)))) stop("matrix 'fuzzyMatrix' has duplicated row names") availableLetters <- intersect(rownames, rownames(fuzzyMatrix)) fuzzyMatrix[availableLetters, availableLetters, drop = FALSE] } .makeSubstitutionLookupTable <- function(qpattern) { keys <- (minQuality(qpattern) + offset(qpattern)): (maxQuality(qpattern) + offset(qpattern)) vals <- 0:(maxQuality(qpattern) - minQuality(qpattern)) buildLookupTable(keys, vals) } QualityScaledXStringSet.pairwiseAlignment <- function(pattern, subject, type = "global", fuzzyMatrix = NULL, gapOpening = -10, gapExtension = -4, scoreOnly = FALSE) { ## Check arguments if (class(pattern) != class(subject)) stop("'pattern' and 'subject' must be of the same class") if (!(length(subject) %in% c(1L, length(pattern)))) stop("'length(subject)' must equal 1 or 'length(pattern)'") type <- match.arg(type, c("global", "local", "overlap", "global-local", "local-global", "subjectOverlap", "patternOverlap")) if (type == "subjectOverlap") { warning("type \"subjectOverlap\" has been renamed \"global-local\"") type <- "global-local" } if (type == "patternOverlap") { warning("type \"patternOverlap\" has been renamed \"local-global\"") type <- "local-global" } typeCode <- c("global" = 1L, "local" = 2L, "overlap" = 3L, "global-local" = 4L, "local-global" = 5L)[[type]] gapOpening <- as.double(- abs(gapOpening)) if (length(gapOpening) != 1L || is.na(gapOpening)) stop("'gapOpening' must be a non-positive numeric vector of length 1") gapExtension <- as.double(- abs(gapExtension)) if (length(gapExtension) != 1L || is.na(gapExtension)) stop("'gapExtension' must be a non-positive numeric vector of length 1") scoreOnly <- as.logical(scoreOnly) if (length(scoreOnly) != 1L || any(is.na(scoreOnly))) stop("'scoreOnly' must be a non-missing logical value") if (class(quality(pattern)) != class(quality(subject))) stop("'quality(pattern)' and 'quality(subject)' must be ", "of the same class") ## Process string information if (is.null(xscodec(pattern))) { unique_letters <- unique(c(uniqueLetters(pattern), uniqueLetters(subject))) #Even if safeLettersToInt() will deal properly with embedded nuls, I #suspect bad things will happen downstream in case there are any. alphabetToCodes <- safeLettersToInt(unique_letters, letters.as.names=TRUE) } else { alphabetToCodes <- xscodes(pattern) } useQuality <- TRUE fuzzyMatrix <- .normargFuzzyMatrix(fuzzyMatrix, names(alphabetToCodes)) uniqueFuzzyValues <- sort(unique(fuzzyMatrix)) fuzzyReferenceMatrix <- matrix(match(fuzzyMatrix, uniqueFuzzyValues) - 1L, nrow = nrow(fuzzyMatrix), ncol = ncol(fuzzyMatrix), dimnames = dimnames(fuzzyMatrix)) fuzzyLookupTable <- buildLookupTable(alphabetToCodes[rownames(fuzzyMatrix)], seq_len(nrow(fuzzyMatrix)) - 1L) alphabetLength <- switch(class(pattern), QualityScaledDNAStringSet =, QualityScaledRNAStringSet = 4L, QualityScaledAAStringSet = 20L, length(alphabetToCodes)) substitutionArray <- qualitySubstitutionMatrices(fuzzyMatch = uniqueFuzzyValues, alphabetLength = alphabetLength, qualityClass = class(quality(pattern))) substitutionLookupTable <- .makeSubstitutionLookupTable(quality(pattern)) .Call2("XStringSet_align_pairwiseAlignment", pattern, subject, type, typeCode, scoreOnly, gapOpening, gapExtension, useQuality, substitutionArray, dim(substitutionArray), substitutionLookupTable, fuzzyReferenceMatrix, dim(fuzzyReferenceMatrix), fuzzyLookupTable, PACKAGE="Biostrings") } mpi.collate.pairwiseAlignment <- function(mpiOutput, pattern, subject) { value <- mpiOutput[[1]] value@score <- unlist(lapply(mpiOutput, score)) value@pattern@unaligned <- pattern value@pattern@range <- do.call(c, lapply(mpiOutput, function(x) x@pattern@range)) value@pattern@mismatch <- do.call(c, lapply(mpiOutput, function(x) x@pattern@mismatch)) value@pattern@indel <- do.call(c, lapply(mpiOutput, function(x) x@pattern@indel)) value@subject@unaligned <- subject value@subject@range <- do.call(c, lapply(mpiOutput, function(x) x@subject@range)) value@subject@mismatch <- do.call(c, lapply(mpiOutput, function(x) x@subject@mismatch)) value@subject@indel <- do.call(c, lapply(mpiOutput, function(x) x@subject@indel)) value } mpi.XStringSet.pairwiseAlignment <- function(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = -10, gapExtension = -4, scoreOnly = FALSE) { n <- length(pattern) if (n > 1 && is.loaded("mpi_comm_size")) { ## 'get()' are to quieten R CMD check, and for no other reason mpi.comm.size <- get("mpi.comm.size", mode="function") mpi.remote.exec <- get("mpi.remote.exec", mode="function") mpi.parLapply <- get("mpi.parLapply", mode="function") k <- min(mpi.comm.size() - 1, n) useMpi <- (k > 1) } else { useMpi <- FALSE } if (useMpi) { perNode <- n %/% k subsets <- vector("list", k) for (i in seq_len(k)) { indices <- ((i-1)*perNode+1):ifelse(i < k, i*perNode, n) if (length(subject) == 1) { subsets[[i]] <- list(pattern = XStringSet(seqtype(pattern), as.character(pattern[indices])), subject = subject) } else { subsets[[i]] <- list(pattern = XStringSet(seqtype(pattern), as.character(pattern[indices])), subject = XStringSet(seqtype(subject), as.character(subject[indices]))) } } mpi.remote.exec(library(Biostrings), ret = FALSE) mpiOutput <- mpi.parLapply(subsets, function(x, type = "global", substitutionMatrix = NULL, gapOpening = -10, gapExtension = -4, scoreOnly = FALSE) { output <- XStringSet.pairwiseAlignment(pattern = x$pattern, subject = x$subject, type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, scoreOnly = scoreOnly) if (!scoreOnly) { output@pattern@unaligned <- BStringSet("") output@subject@unaligned <- BStringSet("") } output }, type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, scoreOnly = scoreOnly) if (scoreOnly) { value <- unlist(mpiOutput) } else { value <- mpi.collate.pairwiseAlignment(mpiOutput, pattern, subject) } } else { value <- XStringSet.pairwiseAlignment(pattern = pattern, subject = subject, type = type, substitutionMatrix = substitutionMatrix, gapOpening = gapOpening, gapExtension = gapExtension, scoreOnly = scoreOnly) } value } mpi.QualityScaledXStringSet.pairwiseAlignment <- function(pattern, subject, type = "global", fuzzyMatrix = NULL, gapOpening = -10, gapExtension = -4, scoreOnly = FALSE) { n <- length(pattern) if (n > 1 && is.loaded("mpi_comm_size")) { ## 'get()' are to quieten R CMD check, and for no other reason mpi.comm.size <- get("mpi.comm.size", mode="function") mpi.remote.exec <- get("mpi.remote.exec", mode="function") mpi.parLapply <- get("mpi.parLapply", mode="function") k <- min(mpi.comm.size() - 1, n) useMpi <- (k > 1) } else { useMpi <- FALSE } if (useMpi) { perNode <- n %/% k subsets <- vector("list", k) for (i in seq_len(k)) { indices <- ((i-1)*perNode+1):ifelse(i < k, i*perNode, n) if (length(subject) == 1) { subsets[[i]] <- list(pattern = QualityScaledXStringSet(XStringSet(seqtype(pattern), as.character(pattern[indices])), do.call(class(quality(pattern)), list(as.character(quality(pattern[indices]))))), subject = subject) } else { subsets[[i]] <- list(pattern = QualityScaledXStringSet(XStringSet(seqtype(pattern), as.character(pattern[indices])), do.call(class(quality(pattern)), list(as.character(quality(pattern[indices]))))), subject = QualityScaledXStringSet(XStringSet(seqtype(subject), as.character(subject[indices])), do.call(class(quality(subject)), list(as.character(quality(subject[indices])))))) } } mpi.remote.exec(library(Biostrings), ret = FALSE) mpiOutput <- mpi.parLapply(subsets, function(x, type = "global", fuzzyMatrix = NULL, gapOpening = -10, gapExtension = -4, scoreOnly = FALSE) { output <- QualityScaledXStringSet.pairwiseAlignment(pattern = x$pattern, subject = x$subject, type = type, fuzzyMatrix = fuzzyMatrix, gapOpening = gapOpening, gapExtension = gapExtension, scoreOnly = scoreOnly) if (!scoreOnly) { output@pattern@unaligned <- BStringSet("") output@subject@unaligned <- BStringSet("") } output }, type = type, fuzzyMatrix = fuzzyMatrix, gapOpening = gapOpening, gapExtension = gapExtension, scoreOnly = scoreOnly) if (scoreOnly) { value <- unlist(mpiOutput) } else { value <- mpi.collate.pairwiseAlignment(mpiOutput, pattern, subject) } } else { value <- QualityScaledXStringSet.pairwiseAlignment(pattern = pattern, subject = subject, type = type, fuzzyMatrix = fuzzyMatrix, gapOpening = gapOpening, gapExtension = gapExtension, scoreOnly = scoreOnly) } value } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### pairwiseAlignment() generic and methods. ### ### We want pairwiseAlignment() to work when 'pattern' and 'subject' are any ### of the 4 following objects: character vector, XString, XStringSet, and ### QualityScaledXStringSet. With the 4 methods defined below, we cover the 16 ### type pairs we want to support (and more). ### TODO: Maybe consider making pairwiseAlignment() just an ordinary function? ### setGeneric("pairwiseAlignment", function(pattern, subject, ...) standardGeneric("pairwiseAlignment") ) setMethod("pairwiseAlignment", c("ANY", "ANY"), function(pattern, subject, patternQuality=PhredQuality(22L), subjectQuality=PhredQuality(22L), type="global", substitutionMatrix=NULL, fuzzyMatrix=NULL, gapOpening=-10, gapExtension=-4, scoreOnly=FALSE) { ## Turn each of 'pattern' and 'subject' into an instance of one of ## the 4 direct concrete subclasses of the XStringSet virtual class. pattern_seqtype <- try(seqtype(pattern), silent=TRUE) if (is(pattern_seqtype, "try-error")) pattern_seqtype <- "B" subject_seqtype <- try(seqtype(subject), silent=TRUE) if (is(subject_seqtype, "try-error")) subject_seqtype <- "B" if (pattern_seqtype == "B") pattern_seqtype <- subject_seqtype if (subject_seqtype == "B") subject_seqtype <- pattern_seqtype pattern <- XStringSet(pattern_seqtype, pattern) subject <- XStringSet(subject_seqtype, subject) if (!is.null(substitutionMatrix)) { mpi.XStringSet.pairwiseAlignment(pattern, subject, type=type, substitutionMatrix=substitutionMatrix, gapOpening=gapOpening, gapExtension=gapExtension, scoreOnly=scoreOnly) } else { pattern <- QualityScaledXStringSet(pattern, patternQuality) subject <- QualityScaledXStringSet(subject, subjectQuality) mpi.QualityScaledXStringSet.pairwiseAlignment(pattern, subject, type=type, fuzzyMatrix=fuzzyMatrix, gapOpening=gapOpening, gapExtension=gapExtension, scoreOnly=scoreOnly) } } ) setMethod("pairwiseAlignment", c("ANY", "QualityScaledXStringSet"), function(pattern, subject, patternQuality=PhredQuality(22L), type="global", substitutionMatrix=NULL, fuzzyMatrix=NULL, gapOpening=-10, gapExtension=-4, scoreOnly=FALSE) { if (is.character(pattern)) { pattern <- XStringSet(seqtype(subject), pattern) } else { pattern <- as(pattern, "XStringSet") } if (!is.null(substitutionMatrix)) { subject <- as(subject, "XStringSet") mpi.XStringSet.pairwiseAlignment(pattern, subject, type=type, substitutionMatrix=substitutionMatrix, gapOpening=gapOpening, gapExtension=gapExtension, scoreOnly=scoreOnly) } else { pattern <- QualityScaledXStringSet(pattern, patternQuality) mpi.QualityScaledXStringSet.pairwiseAlignment(pattern, subject, type=type, fuzzyMatrix=fuzzyMatrix, gapOpening=gapOpening, gapExtension=gapExtension, scoreOnly=scoreOnly) } } ) setMethod("pairwiseAlignment", c("QualityScaledXStringSet", "ANY"), function(pattern, subject, subjectQuality=PhredQuality(22L), type="global", substitutionMatrix=NULL, fuzzyMatrix=NULL, gapOpening=-10, gapExtension=-4, scoreOnly=FALSE) { if (is.character(subject)) { subject <- XStringSet(seqtype(pattern), subject) } else { subject <- as(subject, "XStringSet") } if (!is.null(substitutionMatrix)) { pattern <- as(pattern, "XStringSet") mpi.XStringSet.pairwiseAlignment(pattern, subject, type=type, substitutionMatrix=substitutionMatrix, gapOpening=gapOpening, gapExtension=gapExtension, scoreOnly=scoreOnly) } else { subject <- QualityScaledXStringSet(subject, subjectQuality) mpi.QualityScaledXStringSet.pairwiseAlignment(pattern, subject, type=type, fuzzyMatrix=fuzzyMatrix, gapOpening=gapOpening, gapExtension=gapExtension, scoreOnly=scoreOnly) } } ) setMethod("pairwiseAlignment", c("QualityScaledXStringSet", "QualityScaledXStringSet"), function(pattern, subject, type="global", substitutionMatrix=NULL, fuzzyMatrix=NULL, gapOpening=-10, gapExtension=-4, scoreOnly=FALSE) { if (!is.null(substitutionMatrix)) { pattern <- as(pattern, "XStringSet") subject <- as(subject, "XStringSet") mpi.XStringSet.pairwiseAlignment(pattern, subject, type=type, substitutionMatrix=substitutionMatrix, gapOpening=gapOpening, gapExtension=gapExtension, scoreOnly=scoreOnly) } else { mpi.QualityScaledXStringSet.pairwiseAlignment(pattern, subject, type=type, fuzzyMatrix=fuzzyMatrix, gapOpening=gapOpening, gapExtension=gapExtension, scoreOnly=scoreOnly) } } ) Biostrings/R/pmatchPattern.R0000644000126300012640000002253412227063307017426 0ustar00biocbuildphs_compbio### ========================================================================= ### The "pmatchPattern" generic ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Longest Common Prefix: the "lcprefix" new generic ### ### 's1' and 's2' must be XString objects containing sequences of the same ### type. Return the length (integer) of the Longest Common Prefix. XString.lcprefix <- function(s1, s2) { .Call2("lcprefix", s1@shared@xp, s1@offset, s1@length, s2@shared@xp, s2@offset, s2@length, PACKAGE="Biostrings") } setGeneric("lcprefix", signature=c("s1", "s2"), function(s1, s2) standardGeneric("lcprefix") ) setMethod("lcprefix", signature(s1="character", s2="character"), function(s1, s2) XString.lcprefix(BString(s1), BString(s2)) ) setMethod("lcprefix", signature(s1="character", s2="XString"), function(s1, s2) XString.lcprefix(XString(seqtype(s2), s1), s2) ) setMethod("lcprefix", signature(s1="XString", s2="character"), function(s1, s2) XString.lcprefix(s1, XString(seqtype(s1), s2)) ) setMethod("lcprefix", signature(s1="XString", s2="XString"), function(s1, s2) { if (seqtype(s1) != seqtype(s2)) stop("'s1' and 's2' must be XString objects containing ", "sequences of the same type") XString.lcprefix(s1, s2) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Longest Common Suffix: the "lcsuffix" new generic ### ### 's1' and 's2' must be XString objects containing sequences of the same ### type. Return the length (integer) of the Longest Common Suffix. XString.lcsuffix <- function(s1, s2) { .Call2("lcsuffix", s1@shared@xp, s1@offset, s1@length, s2@shared@xp, s2@offset, s2@length, PACKAGE="Biostrings") } setGeneric("lcsuffix", signature=c("s1", "s2"), function(s1, s2) standardGeneric("lcsuffix") ) setMethod("lcsuffix", signature(s1="character", s2="character"), function(s1, s2) XString.lcsuffix(BString(s1), BString(s2)) ) setMethod("lcsuffix", signature(s1="character", s2="XString"), function(s1, s2) XString.lcsuffix(XString(seqtype(s2), s1), s2) ) setMethod("lcsuffix", signature(s1="XString", s2="character"), function(s1, s2) XString.lcsuffix(s1, XString(seqtype(s1), s2)) ) setMethod("lcsuffix", signature(s1="XString", s2="XString"), function(s1, s2) { if (seqtype(s1) != seqtype(s2)) stop("'s1' and 's2' must be XString objects containing ", "sequences of the same type") XString.lcsuffix(s1, s2) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "pmatchPattern" generic ### ### 'subject' must be an XString object. ### Return an XStringPartialMatches object. ### Speed (on my Thinkpad): ### > library(BSgenome.Scerevisiae.UCSC.sacCer1) ### > Scerevisiae$chr1 ### > file <- system.file("extdata", "someORF.fa", package="Biostrings") ### > orf <- readDNAStringSet(file) ### > system.time(pmatchPattern(orf[[2]], Scerevisiae$chr1, max=1)) ### user system elapsed ### 0.900 0.012 0.913 ### > system.time(pmatchPattern(orf[[2]], Scerevisiae$chr1, max=6)) ### user system elapsed ### 102.910 2.460 105.689 .pmatchPattern.rec <- function(pattern, subject, maxlength.out) { pattern <- normargPattern(pattern, subject) if (nchar(pattern) <= 20000) { sv <- matchPattern(pattern, subject) if (length(sv) >= maxlength.out || nchar(pattern) < 2L) { pv <- unsafe.newXStringViews(pattern, rep.int(1L, length(sv)), rep.int(nchar(pattern), length(sv))) ans <- new("XStringPartialMatches", sv, subpatterns=pv) return(ans) } } ## Split 'pattern' in 2 parts Lnc <- nchar(pattern) %/% 2L Lpattern <- subseq(pattern, start=1L, end=Lnc) Rpattern <- subseq(pattern, start=Lnc+1L, end=nchar(pattern)) ## Recursive call on the left part Lpm <- .pmatchPattern.rec(Lpattern, subject, maxlength.out) Lpm_start <- start(Lpm) Lpm_end <- end(Lpm) Lpv <- subpatterns(Lpm) Lpv_end <- end(Lpv) Lindex <- which((Lpv_end == nchar(Lpattern)) & (Lpm_end < nchar(subject))) Loverlapping <- integer(0) for (i in Lindex) { overlap <- XString.lcprefix(Rpattern, subseq(subject, start=Lpm_end[i]+1L, end=nchar(subject))) if (overlap == 0L) next Loverlapping <- c(Loverlapping, i) Lpv_end[i] <- Lpv_end[i] + overlap Lpm_end[i] <- Lpm_end[i] + overlap } Lpv_start <- start(Lpv) ## Recursive call on the right part Rpm <- .pmatchPattern.rec(Rpattern, subject, maxlength.out) Rpm_start <- start(Rpm) Rpm_end <- end(Rpm) Rpv <- subpatterns(Rpm) Rpv_start <- start(Rpv) Rindex <- which((Rpv_start == 1L) & (Rpm_start > 1L)) Roverlapping <- integer(0) for (i in Rindex) { overlap <- XString.lcsuffix(Lpattern, subseq(subject, start=1L, end=Rpm_start[i]-1L)) if (overlap == 0L) next Roverlapping <- c(Roverlapping, i) Rpv_start[i] <- Rpv_start[i] - overlap Rpm_start[i] <- Rpm_start[i] - overlap } Rpv_start <- Rpv_start + Lnc Rpv_end <- end(Rpv) + Lnc ## Remove duplicates (using a data frame might not be the most efficient ## way to achieve this) if (length(Loverlapping) != 0 && length(Roverlapping) != 0) { Loverlaps <- data.frame(start=Lpm_start[Loverlapping], end=Lpm_end[Loverlapping], spstart=Lpv_start[Loverlapping], spend=Lpv_end[Loverlapping]) Roverlaps <- data.frame(start=Rpm_start[Roverlapping], end=Rpm_end[Roverlapping], spstart=Rpv_start[Roverlapping], spend=Rpv_end[Roverlapping]) overlaps <- rbind(Loverlaps, Roverlaps) dup <- duplicated(overlaps) if (any(dup)) { which_dup <- Roverlapping[which(dup) - nrow(Loverlaps)] Rpm_start <- Rpm_start[-which_dup] Rpm_end <- Rpm_end[-which_dup] Rpv_start <- Rpv_start[-which_dup] Rpv_end <- Rpv_end[-which_dup] } } ## Merge left results with right results sv_start <- c(Lpm_start, Rpm_start) sv_width <- c(Lpm_end, Rpm_end) - sv_start + 1L sv <- unsafe.newXStringViews(subject, sv_start, sv_width) pv_start <- c(Lpv_start, Rpv_start) pv_width <- c(Lpv_end, Rpv_end) - pv_start + 1L pv <- unsafe.newXStringViews(pattern, pv_start, pv_width) ans <- new("XStringPartialMatches", sv, subpatterns=pv) ii <- order(width(ans), -start(ans), decreasing=TRUE) minwidth <- width(ans)[ii[1]] %/% 2 ii <- ii[(width(ans)[ii] >= minwidth) | (seq_along(ii) <= maxlength.out)] ans[ii] } ### 'subject' must be an XString object. ### Return an XStringPartialMatches object. .pmatchPattern <- function(pattern, subject, maxlength.out) { ans <- .pmatchPattern.rec(pattern, subject, maxlength.out) if (length(ans) > maxlength.out) ans <- ans[seq_len(maxlength.out)] ans } setGeneric("pmatchPattern", signature="subject", function(pattern, subject, maxlength.out=1L) standardGeneric("pmatchPattern") ) ### Dispatch on 'subject' (see signature of generic). setMethod("pmatchPattern", "character", function(pattern, subject, maxlength.out) { .pmatchPattern(pattern, BString(subject), maxlength.out) } ) ### Dispatch on 'subject' (see signature of generic). setMethod("pmatchPattern", "XString", function(pattern, subject, maxlength.out) { .pmatchPattern(pattern, subject, maxlength.out) } ) ### Dispatch on 'subject' (see signature of generic). setMethod("pmatchPattern", "XStringViews", function(pattern, subject, maxlength.out) { if (length(subject) != 1) stop("'subject' must have a single view") .pmatchPattern(pattern, subject[[1]], maxlength.out) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Longest Common Substring: the "lcsubstr" new generic ### ### 's1' and 's2' must be XString objects containing sequences of the same ### type. Implementation taken from ### http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_substring XString.lcsubstr <- function(s1, s2) { stop("coming soon...") } setGeneric("lcsubstr", signature=c("s1", "s2"), function(s1, s2) standardGeneric("lcsubstr") ) setMethod("lcsubstr", signature(s1="character", s2="character"), function(s1, s2) XString.lcsubstr(BString(s1), BString(s2)) ) setMethod("lcsubstr", signature(s1="character", s2="XString"), function(s1, s2) XString.lcsubstr(XString(seqtype(s2), s1), s2) ) setMethod("lcsubstr", signature(s1="XString", s2="character"), function(s1, s2) XString.lcsubstr(s1, XString(seqtype(s1), s2)) ) setMethod("lcsubstr", signature(s1="XString", s2="XString"), function(s1, s2) { if (seqtype(s1) != seqtype(s2)) stop("'s1' and 's2' must be XString objects containing ", "sequences of the same type") XString.lcsubstr(s1, s2) } ) Biostrings/R/replaceAt.R0000644000126300012640000004572412227063307016522 0ustar00biocbuildphs_compbio### ========================================================================= ### extractAt() & replaceAt() ### ------------------------------------------------------------------------- ### Extracts multiple subsequences from XString object 'x', or from the ### sequences of XStringSet object 'x', at the ranges of positions specified ### thru 'at'. setGeneric("extractAt", signature="x", function(x, at) standardGeneric("extractAt") ) ### Performs multiple subsequence replacements (a.k.a. substitutions) in ### XString object 'x', or in the sequences of XStringSet object 'x', at the ### ranges of positions specified thru 'at'. setGeneric("replaceAt", signature="x", function(x, at, value="") standardGeneric("replaceAt") ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helper functions for checking that the ranges in a Ranges or RangesList ### object are within specified limits. ### ### Checks that the ranges in 'at' are within the limits specified by single ### integer values 'min_start' and 'max_end'. .is_within_limits1 <- function(at, min_start, max_end) { stopifnot(is(at, "Ranges")) stopifnot(isSingleInteger(min_start)) stopifnot(isSingleInteger(max_end)) at_len <- length(at) if (at_len == 0L) return(TRUE) at_min_start <- min(start(at)) at_max_end <- max(end(at)) at_min_start >= min_start && at_max_end <= max_end } ### For all valid 'i', checks that the ranges in 'at[[i]]' are within the ### limits specified by 'limits[i]'. .is_within_limits2 <- function(at, limits) { stopifnot(is(at, "RangesList")) stopifnot(is(limits, "Ranges")) stopifnot(length(at) == length(limits)) unlisted_at <- unlist(at, use.names=FALSE) tmp <- rep.int(limits, elementLengths(at)) min_starts <- start(tmp) max_ends <- end(tmp) all(start(unlisted_at) >= min_starts) && all(end(unlisted_at) <= max_ends) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helper functions for "vertical" and "horizontal" recycling. ### ### TODO: This stuff is very generic. Move it to IRanges so it can be shared ### and re-used across the IRanges/GenomicRanges/XVector/Biostrings ### infrastructure. ### .wrap_msg <- function(...) paste0(strwrap(paste0(...)), collapse="\n ") ### Vertical recycling (of any vector-like object). .V_recycle <- function(x, skeleton, x_what, skeleton_what) { x_len <- length(x) skeleton_len <- length(skeleton) if (x_len == skeleton_len) return(x) if (x_len > skeleton_len && x_len != 1L) stop(.wrap_msg( "'", x_what, "' cannot be longer than ", skeleton_what )) if (x_len == 0L) stop(.wrap_msg( "'", x_what, "' is a zero-length object but ", skeleton_what, " is not zero" )) if (skeleton_len %% x_len != 0L) warning(.wrap_msg( skeleton_what, " is not a multiple of 'length(", x_what, ")'" )) rep(x, length.out=skeleton_len) } ### Horizontal recycling (of a list-like object only). .H_recycle <- function(x, skeleton, x_what, skeleton_what, more_blahblah=NA) { ## TODO: Remove this when utils::relist() is fixed. ## See https://stat.ethz.ch/pipermail/r-devel/2013-June/066780.html for ## the original bug report. if (is.list(skeleton)) stop(.wrap_msg( "because of a bug in utils::relist(), 'skeleton' cannot be ", "a list at the moment. Please use a List object instead ", "(e.g. by passing 'as(skeleton, \"List\")' instead of 'skeleton')." )) stopifnot(is.list(x) || is(x, "List")) stopifnot(is.list(skeleton) || is(skeleton, "List")) x_len <- length(x) skeleton_len <- length(skeleton) stopifnot(x_len == skeleton_len) x_what2 <- paste0("some list elements in '", x_what, "'") if (!is.na(more_blahblah)) x_what2 <- paste0(x_what2, " (", more_blahblah, ")") x_eltlens <- unname(elementLengths(x)) skeleton_eltlens <- unname(elementLengths(skeleton)) idx <- which(x_eltlens != skeleton_eltlens) if (length(idx) == 0L) return(x) longer_idx <- which(x_eltlens > skeleton_eltlens) shorter_idx <- which(x_eltlens < skeleton_eltlens) if (length(longer_idx) == 0L && length(shorter_idx) == 0L) return(x) if (length(longer_idx) != 0L) { if (max(x_eltlens[longer_idx]) >= 2L) stop(.wrap_msg( x_what2, " are longer than their corresponding ", "list element in '", skeleton_what, "'" )) } if (length(shorter_idx) != 0L) { tmp <- x_eltlens[shorter_idx] if (min(tmp) == 0L) stop(.wrap_msg( x_what2, " are of length 0, but their corresponding ", "list element in '", skeleton_what, "' is not" )) if (max(tmp) >= 2L) stop(.wrap_msg( x_what2, " are shorter than their corresponding ", "list element in '", skeleton_what, "', but have ", "a length >= 2. \"Horizontal\" recycling only supports ", "list elements of length 1 at the moment." )) } ## From here 'x[idx]' is guaranteed to contain list elements of length 1. ## We use an "unlist => stretch => relist" algo to perform the horizontal ## recycling. Because of this, the returned value is not necessary of the ## same class as 'x' (e.g. can be an IntegerList if 'x' is an ordinary ## list of integers and 'skeleton' a List object). unlisted_x <- unlist(x, use.names=FALSE) times <- rep.int(1L, length(unlisted_x)) idx2 <- cumsum(x_eltlens)[idx] times[idx2] <- skeleton_eltlens[idx] unlisted_ans <- rep.int(unlisted_x, times) ans <- relist(unlisted_ans, skeleton) names(ans) <- names(x) ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helper functions for normalizing the 'at' argument. ### ### The integers in 'at' are interpreted as the start positions of zero-width ### ranges. .make_Ranges_from_numeric <- function(at) IRanges(at, width=0L) .make_RangesList_from_IntegerList <- function(at) { relist(.make_Ranges_from_numeric(unlist(at, use.names=FALSE)), at) } .make_Ranges_from_at <- function(at) { if (is.numeric(at)) at <- .make_Ranges_from_numeric(at) if (!is(at, "Ranges")) stop(.wrap_msg( "'at' must be a Ranges object (or a numeric vector containing ", "the start positions of zero-width ranges)" )) at } .make_RangesList_from_at <- function(at) { if (is.numeric(at)) at <- .make_Ranges_from_numeric(at) if (is(at, "Ranges")) at <- IRangesList(at) if (is.list(at)) at <- IntegerList(at) if (is(at, "IntegerList")) at <- .make_RangesList_from_IntegerList(at) if (!is(at, "RangesList")) stop(.wrap_msg( "'at' must be a RangesList object (or an IntegerList object ", "or a list of numeric vectors, containing the start positions ", "of zero-width ranges). ", "Also it can be a Ranges object (or a numeric vector containing ", "the start positions of zero-width ranges) and in that case ", "is interpreted as a RangesList object of length 1." )) at } .normarg_at1 <- function(at, x) { at <- .make_Ranges_from_at(at) if (!.is_within_limits1(at, 1L, length(x))) stop("some ranges in 'at' are off-limits with respect to sequence 'x'") at } ### Returns a RangesList object of the same length as 'x'. .normarg_at2 <- function(at, x) { at <- .make_RangesList_from_at(at) if (!is.null(names(at))) { names(at) <- NULL warning("'at' names were ignored") } at <- .V_recycle(at, x, "at", "'length(x)'") if (!.is_within_limits2(at, IRanges(1L, width(x)))) stop(.wrap_msg( "some ranges in 'at' are off-limits with respect to ", "their corresponding sequence in 'x'" )) at } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helper functions for normalizing the 'value' argument. ### .make_XStringSet_from_value <- function(value, x_seqtype) { if (!is(value, "XStringSet")) { value_class <- paste0(x_seqtype, "StringSet") value <- try(as(value, value_class), silent=TRUE) if (is(value, "try-error")) stop("failed to coerce 'value' to a ", value_class, " object") } else if (seqtype(value) != x_seqtype) { seqtype(value) <- x_seqtype } value } .make_XStringSetList_from_value <- function(value, x_seqtype) { if (is.character(value)) { value_class <- paste0(x_seqtype, "StringSet") value <- as(value, value_class) } if (is(value, "XStringSet")) value <- relist(value, list(seq_along(value))) if (is.list(value)) value <- CharacterList(value) if (is(value, "CharacterList")) { unlisted_value <- unlist(value, use.names=FALSE) unlisted_value <- .make_XStringSet_from_value(unlisted_value, x_seqtype) value <- relist(unlisted_value, value) } if (!is(value, "XStringSetList")) stop("invalid type of 'value'") if (seqtype(value) != x_seqtype) seqtype(value) <- x_seqtype value } .normarg_value1 <- function(value, at, x_seqtype) { value <- .make_XStringSet_from_value(value, x_seqtype) .V_recycle(value, at, "value", "the number of replacements") } ### 'at' is assumed to be normalized so it has the length of 'x'. .normarg_value2 <- function(value, at, x_seqtype) { value <- .make_XStringSetList_from_value(value, x_seqtype) value <- .V_recycle(value, at, "value", "'length(x)'") .H_recycle(value, at, "value", "at", "after recycling of 'at' and 'value' to the length of 'x'") } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### One more helper function. ### .unlist_and_shift_at <- function(at, x) { unlisted_at <- unlist(at, use.names=FALSE) x_len <- length(x) x_width <- width(x) at_eltlens <- elementLengths(at) offsets <- cumsum(c(0L, x_width[-x_len])) offsets <- rep.int(offsets, at_eltlens) shift(unlisted_at, shift=offsets) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### extractAt() ### setMethod("extractAt", "XString", function(x, at) { at <- .normarg_at1(at, x) ## This call to unsafe.newXStringSet() is safe because .normarg_at1() ## already checked that all the ranges in 'at' are within the limits ## of sequence 'x'. Calling 'as(Views(x, at), "XStringSet")' would ## check this again and thus be much slower (between 5x and 10x). unsafe.newXStringSet(x, at) } ) setMethod("extractAt", "XStringSet", function(x, at) { at <- .normarg_at2(at, x) at_eltlens <- elementLengths(at) x2 <- rep.int(unname(x), at_eltlens) unlisted_at <- unlist(at, use.names=FALSE) unlisted_ans <- subseq(x2, start=start(unlisted_at), width=width(unlisted_at)) ans <- relist(unlisted_ans, at) names(ans) <- names(x) ans } ) if (FALSE) { # <<<--- begin testing extractAt() --->>> library(Biostrings) ### From an XStringSet object ### ========================= ### Only compare the classes, the shapes (i.e. lengths + elementLengths + ### names), the inner names, and the sequence contents. Doesn't look at ### the metadata or the metadata columns (outer or inner). identical_XStringSetList <- function(target, current) { ok1 <- identical(class(target), class(current)) ok2 <- identical(elementLengths(target), elementLengths(current)) unlisted_target <- unlist(target, use.names=FALSE) unlisted_current <- unlist(current, use.names=FALSE) ok3 <- identical(names(unlisted_target), names(unlisted_current)) ok4 <- all(unlisted_target == unlisted_current) ok1 && ok2 && ok3 && ok4 } x <- BStringSet(c(seq1="ABCD", seq2="abcdefghijk", seq3="XYZ")) at <- IRangesList(IRanges(c(2, 1), c(3, 0)), IRanges(c(7, 2, 12, 7), c(6, 5, 11, 8)), IRanges(2, 2)) ### Set inner names on 'at'. unlisted_at <- unlist(at) names(unlisted_at) <- paste0("rg", sprintf("%02d", seq_along(unlisted_at))) at <- relist(unlisted_at, at) res1a <- extractAt(x, at) res1b <- as(mapply(extractAt, x, at), "List") stopifnot(identical_XStringSetList(res1a, res1b)) res2a <- extractAt(x, at[3]) res2b <- as(mapply(extractAt, x, at[3]), "List") stopifnot(identical_XStringSetList(res2a, res2b)) res2c <- extractAt(x, at[[3]]) stopifnot(identical_XStringSetList(res2a, res2c)) ### Testing performance with 2 millions small extractions at random ### locations in Celegans upstream5000: library(BSgenome.Celegans.UCSC.ce2) genome <- BSgenome.Celegans.UCSC.ce2 upstream5000 <- genome$upstream5000 set.seed(33) NE <- 2000000L # total number of extractions sample_size <- NE * 1.1 some_ranges <- IRanges(sample(5001L, sample_size, replace=TRUE), width=sample(0:75, sample_size, replace=TRUE)) some_ranges <- head(some_ranges[end(some_ranges) <= 5000L], n=NE) split_factor <- factor(sample(length(upstream5000), NE, replace=TRUE), levels=seq_along(upstream5000)) at <- unname(split(some_ranges, split_factor)) ### Timings: 1.899s 1.159 0.610s (old 2.576s 1.568s 1.114s) system.time(res3a <- extractAt(upstream5000, at)) ### This is about 20x slower than the above on my machine. system.time(res3b <- as(mapply(extractAt, upstream5000, at), "List")) stopifnot(identical_XStringSetList(res3a, res3b)) } # <<<--- end testing extractAt() --->>> ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### replaceAt() ### setMethod("replaceAt", "XString", function(x, at, value="") { if (length(at) == 0L && length(value) == 0L) return(x) at <- .normarg_at1(at, x) value <- .normarg_value1(value, at, seqtype(x)) NR <- length(at) # same as length(value) -- nb of replacements if (NR == 0L) return(x) oo <- order(at) start2 <- start(at)[oo] end2 <- end(at)[oo] if (any(start2[-1L] <= end2[-NR])) stop("'at' must contain disjoint ranges (see '?isDisjoint')") value2 <- value[oo] ## The regions of 'x' that are preserved are the regions between the ## ranges in 'at'. preserved <- IRanges(c(1L, end2 + 1L), c(start2 - 1L, length(x))) x_preserved <- as(Views(x, preserved), "XStringSet") last_value2 <- as("", class(value2)) unlist(xscat(x_preserved, c(value2, last_value2))) } ) setMethod("replaceAt", "XStringSet", function(x, at, value="") { if (length(at) == 0L && length(value) == 0L) return(x) at <- .normarg_at2(at, x) value <- .normarg_value2(value, at, seqtype(x)) unlisted_x <- unlist(x, use.names=FALSE) unlisted_at <- .unlist_and_shift_at(at, x) unlisted_value <- unlist(value, use.names=FALSE) unlisted_ans <- replaceAt(unlisted_x, unlisted_at, value=unlisted_value) delta_width <- width(unlisted_value) - width(unlisted_at) ans_width <- width(x) + sum(relist(delta_width, PartitioningByEnd(at))) ans <- as(successiveViews(unlisted_ans, ans_width), "XStringSet") names(ans) <- names(x) mcols(ans) <- mcols(x) ans } ) if (FALSE) { # <<<--- begin testing replaceAt() --->>> library(Biostrings) ### On an XString object ### ==================== ### Testing performance with half-million small substitutions at random ### locations in Celegans chrI: library(BSgenome.Celegans.UCSC.ce2) genome <- BSgenome.Celegans.UCSC.ce2 chrI <- genome$chrI ### A very amateurish random disjoint ranges generator. Not for serious use! randomDisjointRanges <- function(min_start, max_end, min_width, max_width, n) { set.seed(33) offset <- min_start - 1L n1 <- n * (1.1 + max_width/(max_end-offset+1L)) # very approximative some_starts <- sample(max_end-offset+1L, n1, replace=TRUE) + offset some_widths <- sample(min_width:max_width, n1, replace=TRUE) some_ranges <- IRanges(some_starts, width=some_widths) some_ranges <- some_ranges[end(some_ranges) <= max_end] ans <- disjoin(some_ranges) if (min_width == 0L) { is_empty <- width(some_ranges) == 0L some_empty_ranges <- some_ranges[is_empty] ans <- sample(c(ans, some_empty_ranges)) } if (length(ans) < n) stop("internal error, sorry") head(ans, n=n) } at4 <- randomDisjointRanges(1L, nchar(chrI), 0L, 20L, 500000L) ### Takes < 2s on my machine (64-bit Ubuntu). system.time(current <- replaceAt(chrI, at4, Views(chrI, at4))) stopifnot(current == chrI) ### Testing performance with half-million single-letter insertions at random ### locations in Celegans chrI: at5 <- randomDisjointRanges(1L, nchar(chrI), 0L, 0L, 500000L) ### Takes < 2s on my machine (64-bit Ubuntu). system.time(current <- replaceAt(chrI, at5, value="-")) m <- matchPattern("-", current) stopifnot(identical(sort(start(at5)), start(m) - seq_along(at5) + 1L)) system.time(current2 <- replaceAt(chrI, start(at5), value="-")) stopifnot(identical(current, current2)) matchPattern("---", current) ### On an XStringSet object ### ======================= ### Only compare the classes, lengths, names, and sequence contents. ### Doesn't look at the metadata or the metadata columns. identical_XStringSet <- function(target, current) { ok1 <- identical(class(target), class(current)) ok2 <- identical(names(target), names(current)) ok3 <- all(target == current) ok1 && ok2 && ok3 } x <- BStringSet(c(seq1="ABCD", seq2="abcdefghijk", seq3="XYZ")) at <- IRangesList(IRanges(c(2, 1), c(3, 0)), IRanges(c(7, 2, 12, 7), c(6, 5, 11, 8)), IRanges(2, 2)) ### Set inner names on 'at'. unlisted_at <- unlist(at) names(unlisted_at) <- paste0("rg", sprintf("%02d", seq_along(unlisted_at))) at <- relist(unlisted_at, at) current <- replaceAt(x, at, value=extractAt(x, at)) # no-op stopifnot(identical_XStringSet(x, current)) res1a <- replaceAt(x, at) # deletions res1b <- mendoapply(replaceAt, x, at) stopifnot(identical_XStringSet(res1a, res1b)) ### Testing performance with half-million single-letter insertions at random ### locations in Celegans upstream1000: upstream1000 <- genome$upstream1000 set.seed(33) split_factor <- factor(sample(length(upstream1000), 500000L, replace=TRUE), levels=seq_along(upstream1000)) at5 <- unname(split(sample(1001L, 500000L, replace=TRUE), split_factor)) ### Takes < 2s on my machine. system.time(res5a <- replaceAt(upstream1000, at5, value="-")) ### This is about 40x slower than the above on my machine. system.time(res5b <- mendoapply(replaceAt, upstream1000, as(at5, "List"), as("-", "List"))) stopifnot(identical_XStringSet(res5a, res5b)) } # <<<--- end testing replaceAt() --->>> Biostrings/R/replaceLetterAt.R0000644000126300012640000000703512227063307017673 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "replaceLetterAt" generic function and methods. ### setGeneric("replaceLetterAt", signature="x", function(x, at, letter, if.not.extending="replace", verbose=FALSE) standardGeneric("replaceLetterAt") ) setMethod("replaceLetterAt", "DNAString", function(x, at, letter, if.not.extending="replace", verbose=FALSE) { if (is(at, "Rle")) at <- as.vector(at) if (is.logical(at)) { if (length(at) != length(x)) stop("when 'at' is a logical sequence, it must have the ", "same length as 'x'") at <- which(at) } else { if (!is.numeric(at)) stop("'at' must be a vector of integers") if (!is.integer(at)) at <- as.integer(at) } if (is(letter, "DNAString")) letter <- as.character(letter) else if (!is.character(letter)) stop("'letter' must be a DNAString object or a character vector") lkup <- get_seqtype_conversion_lookup("B", seqtype(x)) if (!isSingleString(if.not.extending)) stop("'if.not.extending' must be a single string") if.not.extending <- match.arg(if.not.extending, c("replace", "skip", "merge", "error")) if (!isTRUEorFALSE(verbose)) stop("'verbose' must be TRUE or FALSE") .Call2("XString_replace_letter_at", x, at, letter, lkup, if.not.extending, verbose, PACKAGE="Biostrings") } ) ## Current restrictions: 'x' and 'at' must be rectangular i.e. 'x' must have ## a constant width and 'at' must be a logical matrix. ## TODO: Extend replaceLetterAt(). setMethod("replaceLetterAt", "DNAStringSet", function(x, at, letter, if.not.extending="replace", verbose=FALSE) { if (length(x) == 0L) stop("'x' has no element") x_width <- width(x) if (!isConstant(x_width)) stop("'x' must be rectangular (i.e. have a constant width)") if (!is.logical(at) || !is.matrix(at)) stop("'at' must be a matrix of logicals") if (nrow(at) != length(x) || ncol(at) != x_width[1]) stop("'x' and 'at' must have the same dimensions") if (is(letter, "DNAStringSet")) letter <- as.character(letter) else if (!is.character(letter)) stop("'letter' must be a DNAStringSet object or a character vector") if (length(letter) != length(x)) stop("'x' and 'letter' must have the same length") if (!all(width(letter) == rowSums(at))) stop("width(letter) and rowSums(at) must be the same") ans_super <- replaceLetterAt(unlist(x), as.vector(t(at)), letter, if.not.extending=if.not.extending, verbose=verbose) ans_ranges <- successiveIRanges(width(x)) unsafe.newXStringSet(ans_super, ans_ranges, use.names=TRUE, names=names(x)) } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The ".inplaceReplaceLetterAt" function. ### ### The user should NEVER use this function! ### This function is used by the BSgenome package for injecting SNPs into the ### sequences of a BSgenome object at sequence-load time. ### .inplaceReplaceLetterAt <- function(x, at, letter) { lkup <- get_seqtype_conversion_lookup("B", seqtype(x)) .Call2("XString_inplace_replace_letter_at", x, at, letter, lkup, PACKAGE="Biostrings") } Biostrings/R/reverseComplement.R0000644000126300012640000000631012227063307020305 0ustar00biocbuildphs_compbio### ========================================================================= ### Sequence reversing and complementing ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "reverse" methods. ### setMethod("reverse", "MaskedXString", function(x, ...) { x@unmasked <- reverse(unmasked(x)) x@masks <- reverse(masks(x)) x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "complement" generic and methods. ### setGeneric("complement", signature="x", function(x, ...) standardGeneric("complement") ) setMethod("complement", "DNAString", function(x, ...) xvcopy(x, lkup=getDNAComplementLookup()) ) setMethod("complement", "RNAString", function(x, ...) xvcopy(x, lkup=getRNAComplementLookup()) ) setMethod("complement", "DNAStringSet", function(x, ...) xvcopy(x, lkup=getDNAComplementLookup()) ) setMethod("complement", "RNAStringSet", function(x, ...) xvcopy(x, lkup=getRNAComplementLookup()) ) setMethod("complement", "XStringViews", function(x, ...) { x@subject <- complement(subject(x)) x } ) setMethod("complement", "MaskedDNAString", function(x, ...) { x@unmasked <- complement(unmasked(x)) x } ) setMethod("complement", "MaskedRNAString", function(x, ...) { x@unmasked <- complement(unmasked(x)) x } ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "reverseComplement" generic and methods. ### ### We could just do this: ### reverseComplement <- function(x) reverse(complement(x)) ### But we want to perform only 1 copy of the sequence data! ### With the above implementation, reverseComplement(x) would copy the ### sequence data in 'x' twice: a first (temporary) copy to get the ### complement, followed by a second (final) copy to reverse it. Remember ### that the sequence data can be very big e.g. 250MB for Human chr1! ### setGeneric("reverseComplement", signature="x", function(x, ...) standardGeneric("reverseComplement") ) setMethod("reverseComplement", "DNAString", function(x, ...) xvcopy(x, lkup=getDNAComplementLookup(), reverse=TRUE) ) setMethod("reverseComplement", "RNAString", function(x, ...) xvcopy(x, lkup=getRNAComplementLookup(), reverse=TRUE) ) setMethod("reverseComplement", "DNAStringSet", function(x, ...) xvcopy(x, lkup=getDNAComplementLookup(), reverse=TRUE) ) setMethod("reverseComplement", "RNAStringSet", function(x, ...) xvcopy(x, lkup=getRNAComplementLookup(), reverse=TRUE) ) setMethod("reverseComplement", "XStringViews", function(x, ...) { x@subject <- reverseComplement(subject(x)) x@ranges <- reverse(ranges(x), start=1L, end=length(subject(x))) x } ) setMethod("reverseComplement", "MaskedDNAString", function(x, ...) { x@unmasked <- reverseComplement(unmasked(x)) x@masks <- reverse(masks(x)) x } ) setMethod("reverseComplement", "MaskedRNAString", function(x, ...) { x@unmasked <- reverseComplement(unmasked(x)) x@masks <- reverse(masks(x)) x } ) Biostrings/R/seqtype.R0000644000126300012640000001133112227063307016277 0ustar00biocbuildphs_compbio### ========================================================================= ### The seqtype() generic & related functions ### ------------------------------------------------------------------------- ### ### Most sequence containers in Biostrings have a "sequence type" that ### indicates the nature of the sequence(s) that the container can store: ### ### sequence | | | ### type | description | alphabet | encoded ### ----------|---------------------------|--------------|-------- ### "B" | general purpose string(s) | bytes 0-255 | no ### "DNA" | DNA sequence(s) | DNA_ALPHABET | yes ### "RNA" | RNA sequence(s) | RNA_ALPHABET | yes ### "AA" | amino acid sequence(s) | AA_ALPHABET | no ### ### seqtype() returns that sequence type. For example 'seqtype(AAString())' ### returns "AA". ### Unless specified otherwise, things in this file are not exported. ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "seqtype" and "seqtype<-" generics. ### ### seqtype() and `seqtype<-`() have methods defined for the 4 basic ### string containers: XString (single sequence), XStringSet (multiple ### sequences), XStringViews (multiple sequences) and MaskedXString (single ### sequence). ### ### Exported. setGeneric("seqtype", function(x) standardGeneric("seqtype")) ### Exported. setGeneric("seqtype<-", signature="x", function(x, value) standardGeneric("seqtype<-") ) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Helper functions for which the returned value depends on 'seqtype(x)', ### not on what particular data are in 'x'. Not exported. ### xsbaseclass <- function(x) paste(seqtype(x), "String", sep="") xscodes <- function(x, baseOnly=FALSE) { switch(seqtype(x), DNA=DNAcodes(baseOnly), RNA=RNAcodes(baseOnly), 0:255 ) } xscodec <- function(x) { switch(seqtype(x), DNA=DNA_STRING_CODEC, RNA=RNA_STRING_CODEC, NULL ) } xs_enc_lkup <- function(x) { codec <- xscodec(x) if (is.null(codec)) NULL else codec@enc_lkup } xs_dec_lkup <- function(x) { codec <- xscodec(x) if (is.null(codec)) NULL else codec@dec_lkup } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Some restrictions apply for converting from a sequence type to another or ### for comparing XString objects of different sequence types. This is ### due to the fact that XString objects with different sequence types can use ### different encodings for their sequence data (or no encoding at all) or ### simply to the fact that the conversion or comparison doesn't make sense ### from a biological perspective. ### The helper functions below are used internally (they are NOT exported) to ### determine those restrictions. ### compatible_seqtypes <- function(seqtype1, seqtype2) { if (seqtype1 %in% c("DNA", "RNA")) return(seqtype2 != "AA") if (seqtype1 == "AA") return(!(seqtype2 %in% c("DNA", "RNA"))) TRUE } ### Exported. get_seqtype_conversion_lookup <- function(from_seqtype, to_seqtype) { if (!compatible_seqtypes(from_seqtype, to_seqtype)) stop("incompatible sequence types \"", from_seqtype, "\" and \"", to_seqtype, "\"") from_nucleo <- from_seqtype %in% c("DNA", "RNA") to_nucleo <- to_seqtype %in% c("DNA", "RNA") if (from_nucleo == to_nucleo) return(NULL) if (to_seqtype == "DNA") return(DNA_STRING_CODEC@enc_lkup) if (to_seqtype == "RNA") return(RNA_STRING_CODEC@enc_lkup) if (from_seqtype == "DNA") return(DNA_STRING_CODEC@dec_lkup) if (from_seqtype == "RNA") return(RNA_STRING_CODEC@dec_lkup) stop("Biostrings internal error, please report") # should never happen } comparable_seqtypes <- function(seqtype1, seqtype2) { is_nucleo1 <- seqtype1 %in% c("DNA", "RNA") is_nucleo2 <- seqtype2 %in% c("DNA", "RNA") is_nucleo1 == is_nucleo2 } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### alphabet() ### ### Exported. ### Could be made just a regular function but that would cause problems to ### people wanting to redefine alphabet() for their own objects (this is the ### case at least in the ShortRead package). setGeneric("alphabet", function(x, ...) standardGeneric("alphabet")) setMethod("alphabet", "ANY", function(x, baseOnly=FALSE) { if (!isTRUEorFALSE(baseOnly)) stop("'baseOnly' must be TRUE or FALSE") switch(seqtype(x), DNA=if (baseOnly) DNA_BASES else DNA_ALPHABET, RNA=if (baseOnly) RNA_BASES else RNA_ALPHABET, AA=AA_ALPHABET, NULL ) } ) Biostrings/R/stringDist.R0000644000126300012640000003237512227063307016752 0ustar00biocbuildphs_compbio### ========================================================================= ### The stringDist() generic ### ------------------------------------------------------------------------- XStringSet.stringDist <- function(x, method = "levenshtein", ignoreCase = FALSE, diag = FALSE, upper = FALSE, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1) { ## Check arguments method <- match.arg(method, c("levenshtein", "hamming", "quality", "substitutionMatrix")) if (method == "hamming") { if (ignoreCase) stop("'ignoreCase != TRUE' when 'type =\"hamming\"") answer <- .Call2("XStringSet_dist_hamming", x, PACKAGE="Biostrings") } else { ## Process string information if (is.null(xscodec(x))) { unique_letters <- uniqueLetters(x) #Even if safeLettersToInt() will deal properly with embedded NULLs, I #suspect bad things will happen downstream in case there are any. alphabetToCodes <- safeLettersToInt(unique_letters, letters.as.names=TRUE) } else { alphabetToCodes <- xscodes(x) } ## Set parameters when method == "levenshtein" if (method == "levenshtein") { type <- "global" typeCode <- 1L gapOpening <- 0 gapExtension <- -1 if (ignoreCase) caseAdjustedAlphabet <- tolower(names(alphabetToCodes)) else caseAdjustedAlphabet <- names(alphabetToCodes) substitutionMatrix <- outer(caseAdjustedAlphabet, caseAdjustedAlphabet, function(x,y) -as.numeric(x!=y)) dimnames(substitutionMatrix) <- list(names(alphabetToCodes), names(alphabetToCodes)) } else { type <- match.arg(type, c("global", "local", "overlap")) typeCode <- c("global" = 1L, "local" = 2L, "overlap" = 3L)[[type]] gapOpening <- as.double(- abs(gapOpening)) if (length(gapOpening) != 1 || is.na(gapOpening)) stop("'gapOpening' must be a non-positive numeric vector of length 1") gapExtension <- as.double(- abs(gapExtension)) if (length(gapExtension) != 1 || is.na(gapExtension)) stop("'gapExtension' must be a non-positive numeric vector of length 1") } useQuality <- FALSE if (is.character(substitutionMatrix)) { if (length(substitutionMatrix) != 1) stop("'substitutionMatrix' is a character vector of length != 1") tempMatrix <- substitutionMatrix substitutionMatrix <- try(getdata(tempMatrix), silent = TRUE) if (is(substitutionMatrix, "try-error")) stop("unknown scoring matrix \"", tempMatrix, "\"") } if (!is.matrix(substitutionMatrix) || !is.numeric(substitutionMatrix)) stop("'substitutionMatrix' must be a numeric matrix") if (!identical(rownames(substitutionMatrix), colnames(substitutionMatrix))) stop("row and column names differ for matrix 'substitutionMatrix'") if (is.null(rownames(substitutionMatrix))) stop("matrix 'substitutionMatrix' must have row and column names") if (any(duplicated(rownames(substitutionMatrix)))) stop("matrix 'substitutionMatrix' has duplicated row names") if (!isSymmetric(substitutionMatrix)) stop("'substitutionMatrix' must be a symmetric matrix") availableLetters <- intersect(names(alphabetToCodes), rownames(substitutionMatrix)) substitutionMatrix <- matrix(as.double(substitutionMatrix[availableLetters, availableLetters]), nrow = length(availableLetters), ncol = length(availableLetters), dimnames = list(availableLetters, availableLetters)) substitutionArray <- array(unlist(substitutionMatrix, substitutionMatrix), dim = c(dim(substitutionMatrix), 2), dimnames = list(availableLetters, availableLetters, c("0", "1"))) substitutionLookupTable <- buildLookupTable(alphabetToCodes[availableLetters], 0:(length(availableLetters) - 1)) fuzzyMatrix <- matrix(0L, length(availableLetters), length(availableLetters), dimnames = list(availableLetters, availableLetters)) diag(fuzzyMatrix) <- 1L fuzzyLookupTable <- buildLookupTable(alphabetToCodes[availableLetters], 0:(length(availableLetters) - 1)) answer <- .Call2("XStringSet_align_distance", x, type, typeCode, gapOpening, gapExtension, useQuality, substitutionArray, dim(substitutionArray), substitutionLookupTable, fuzzyMatrix, dim(fuzzyMatrix), fuzzyLookupTable, PACKAGE="Biostrings") if (method == "levenshtein") answer <- -answer } attr(answer, "Size") <- length(x) attr(answer, "Labels") <- names(x) attr(answer, "Diag") <- diag attr(answer, "Upper") <- upper attr(answer, "method") <- method class(answer) <- "dist" return(answer) } QualityScaledXStringSet.stringDist <- function(x, ignoreCase = FALSE, diag = FALSE, upper = FALSE, type = "global", fuzzyMatrix = NULL, gapOpening = 0, gapExtension = -1) { ## Check arguments type <- match.arg(type, c("global", "local", "overlap")) typeCode <- c("global" = 1L, "local" = 2L, "overlap" = 3L)[[type]] gapOpening <- as.double(- abs(gapOpening)) if (length(gapOpening) != 1 || is.na(gapOpening)) stop("'gapOpening' must be a non-positive numeric vector of length 1") gapExtension <- as.double(- abs(gapExtension)) if (length(gapExtension) != 1 || is.na(gapExtension)) stop("'gapExtension' must be a non-positive numeric vector of length 1") ## Process string information if (is.null(xscodec(x))) { unique_letters <- uniqueLetters(x) #Even if safeLettersToInt() will deal properly with embedded nuls, I #suspect bad things will happen downstream in case there are any. alphabetToCodes <- safeLettersToInt(unique_letters, letters.as.names=TRUE) } else { alphabetToCodes <- xscodes(x) } useQuality <- TRUE if (is.null(fuzzyMatrix)) { fuzzyMatrix <- diag(length(alphabetToCodes)) dimnames(fuzzyMatrix) <- list(names(alphabetToCodes), names(alphabetToCodes)) } else { if (!is.matrix(fuzzyMatrix) || !is.numeric(fuzzyMatrix) || any(is.na(fuzzyMatrix)) || any(fuzzyMatrix < 0) || any(fuzzyMatrix > 1)) stop("'fuzzyMatrix' must be a numeric matrix with values between 0 and 1 inclusive") if (!identical(rownames(fuzzyMatrix), colnames(fuzzyMatrix))) stop("row and column names differ for matrix 'fuzzyMatrix'") if (is.null(rownames(fuzzyMatrix))) stop("matrix 'fuzzyMatrix' must have row and column names") if (any(duplicated(rownames(fuzzyMatrix)))) stop("matrix 'fuzzyMatrix' has duplicated row names") } availableLetters <- intersect(names(alphabetToCodes), rownames(fuzzyMatrix)) fuzzyMatrix <- fuzzyMatrix[availableLetters, availableLetters] uniqueFuzzyValues <- sort(unique(fuzzyMatrix)) fuzzyReferenceMatrix <- matrix(match(fuzzyMatrix, uniqueFuzzyValues) - 1L, nrow = nrow(fuzzyMatrix), ncol = ncol(fuzzyMatrix), dimnames = dimnames(fuzzyMatrix)) fuzzyLookupTable <- buildLookupTable(alphabetToCodes[availableLetters], 0:(length(availableLetters) - 1)) alphabetLength <- switch(class(x), QualityScaledDNAStringSet =, QualityScaledRNAStringSet = 4L, QualityScaledAAStringSet = 20L, 256L) substitutionArray <- qualitySubstitutionMatrices(fuzzyMatch = uniqueFuzzyValues, alphabetLength = alphabetLength, qualityClass = class(quality(x))) substitutionLookupTable <- buildLookupTable((minQuality(quality(x)) + offset(quality(x))): (maxQuality(quality(x)) + offset(quality(x))), 0:(maxQuality(quality(x)) - minQuality(quality(x)))) answer <- .Call2("XStringSet_align_distance", x, type, typeCode, gapOpening, gapExtension, useQuality, substitutionArray, dim(substitutionArray), substitutionLookupTable, fuzzyReferenceMatrix, dim(fuzzyReferenceMatrix), fuzzyLookupTable, PACKAGE="Biostrings") attr(answer, "Size") <- length(x) attr(answer, "Labels") <- names(x) attr(answer, "Diag") <- diag attr(answer, "Upper") <- upper attr(answer, "method") <- "quality" class(answer) <- "dist" return(answer) } setGeneric("stringDist", signature = "x", function(x, method = "levenshtein", ignoreCase = FALSE, diag = FALSE, upper = FALSE, ...) standardGeneric("stringDist")) setMethod("stringDist", signature(x = "character"), function(x, method = "levenshtein", ignoreCase = FALSE, diag = FALSE, upper = FALSE, type = "global", quality = PhredQuality(22L), substitutionMatrix = NULL, fuzzyMatrix = NULL, gapOpening = 0, gapExtension = -1) { if (method != "quality") { XStringSet.stringDist(x = BStringSet(x), method = method, ignoreCase = ignoreCase, diag = diag, upper = upper, type = type, substitutionMatrix = substitutionMatrix, gapExtension = gapExtension, gapOpening = gapOpening) } else { QualityScaledXStringSet.stringDist(x = QualityScaledBStringSet(x, quality), ignoreCase = ignoreCase, diag = diag, upper = upper, type = type, fuzzyMatrix = fuzzyMatrix, gapExtension = gapExtension, gapOpening = gapOpening) }}) setMethod("stringDist", signature(x = "XStringSet"), function(x, method = "levenshtein", ignoreCase = FALSE, diag = FALSE, upper = FALSE, type = "global", quality = PhredQuality(22L), substitutionMatrix = NULL, fuzzyMatrix = NULL, gapOpening = 0, gapExtension = -1) { if (method != "quality") { XStringSet.stringDist(x = x, method = method, ignoreCase = ignoreCase, diag = diag, upper = upper, type = type, substitutionMatrix = substitutionMatrix, gapExtension = gapExtension, gapOpening = gapOpening) } else { QualityScaledXStringSet.stringDist(x = QualityScaledXStringSet(x, quality), ignoreCase = ignoreCase, diag = diag, upper = upper, type = type, fuzzyMatrix = fuzzyMatrix, gapExtension = gapExtension, gapOpening = gapOpening) }}) setMethod("stringDist", signature(x = "QualityScaledXStringSet"), function(x, method = "quality", ignoreCase = FALSE, diag = FALSE, upper = FALSE, type = "global", substitutionMatrix = NULL, fuzzyMatrix = NULL, gapOpening = 0, gapExtension = -1) { if (method != "quality") { XStringSet.stringDist(x = as(x, "XStringSet"), method = method, ignoreCase = ignoreCase, diag = diag, upper = upper, type = type, substitutionMatrix = substitutionMatrix, gapExtension = gapExtension, gapOpening = gapOpening) } else { QualityScaledXStringSet.stringDist(x = x, ignoreCase = ignoreCase, diag = diag, upper = upper, type = type, fuzzyMatrix = fuzzyMatrix, gapExtension = gapExtension, gapOpening = gapOpening) }}) Biostrings/R/test.R0000644000126300012640000000065212227063307015570 0ustar00biocbuildphs_compbiotestBiostrings <- function() { require("RUnit", quietly=TRUE) || stop("RUnit package not found") dirs <- system.file("UnitTests", package="Biostrings") testFileRegexp <- "^runit.+\\.[rR]$" testsuite <- defineTestSuite("Biotrings Test Suite", dirs, testFileRegexp=testFileRegexp) testresult <- runTestSuite(testsuite) printTextProtocol(testresult, showDetails=FALSE) } Biostrings/R/toComplex.R0000644000126300012640000000205612227063307016563 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "toComplex" new generic. ### setGeneric("toComplex", function(x, baseValues) standardGeneric("toComplex") ) ### 'baseValues' must be a named complex vector containing the values ### associated to each base e.g. ### baseValues=c(A=1+0i, G=0+1i, T=-1+0i, C=0-1i) setMethod("toComplex", "DNAString", function(x, baseValues) { if (is.null(names(baseValues))) stop("'baseValues' must have names") if (any(duplicated(names(baseValues)))) stop("'baseValues' must have unique names") base_codes <- xscodes(x) if (!all(names(baseValues) %in% names(base_codes))) stop("'baseValues' names must be valid DNA letters") if (!is.complex(baseValues)) class(baseValues) <- "complex" # as.complex() would drop the names! lkup <- buildLookupTable(base_codes[names(baseValues)], baseValues) SharedRaw.readComplexes(x@shared, x@offset + 1L, x@offset + x@length, lkup) } ) Biostrings/R/translate.R0000644000126300012640000001014412227063307016603 0ustar00biocbuildphs_compbio### ========================================================================= ### DNA/RNA transcription/translation & related functions ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Some simple functions for different kinds of DNA <-> RNA transformations. ### transcribe <- function(x) { if (!is(x, "DNAString")) stop("transcribe() only works on DNA input") RNAString(complement(x)) } cDNA <- function(x) { if (!is(x, "RNAString")) stop("cDNA() only works on RNA input") DNAString(complement(x)) } dna2rna <- function(x) { if (!is(x, "DNAString")) stop("dna2rna() only works on DNA input") RNAString(x) } rna2dna <- function(x) { if (!is(x, "RNAString")) stop("rna2dna() only works on RNA input") DNAString(x) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "codons" generic and methods. ### setGeneric("codons", signature="x", function(x) standardGeneric("codons") ) ### 'x' must be a DNAString or RNAString object .XString.codons <- function(x) { if (length(x) %% 3L != 0L) warning("the number of nucleotides in 'x' is not a multiple of 3") ans <- successiveViews(x, rep.int(3L, length(x) %/% 3L)) if (alphabetFrequency(ans, baseOnly=TRUE, collapse=TRUE)[["other"]] != 0) stop("some trinucleotides in 'x' contain non-base letters") ans } ### 'x' is assumed to in the coding strand of the DNA setMethod("codons", "DNAString", function(x) .XString.codons(x)) setMethod("codons", "RNAString", function(x) .XString.codons(x)) ### 'x' must be a MaskedDNAString or MaskedRNAString object. ### Return 1 view per codon. Each view is guaranteed to contain exactly ### 3 base letters plus eventually some '+' letters (removed during ### translation). .MaskedXString.codons <- function(x) { if (nchar(x) %% 3L != 0L) warning("the number of unmasked nucleotides in 'x' is not a multiple of 3") if (alphabetFrequency(x, baseOnly=TRUE)[["other"]] != 0) stop("some trinucleotides in 'x' contain non-base letters") ans_length <- nchar(x) %/% 3L ans_start <- integer(ans_length) ans_end <- integer(ans_length) x0 <- injectHardMask(x) codon_start <- 1L for (i in seq_len(ans_length)) { while (letter(x0, codon_start) == '+') codon_start <- codon_start + 1L codon_end <- codon_start codon_nchar <- 1L while (codon_nchar < 3L) { codon_end <- codon_end + 1L if (letter(x0, codon_end) != '+') codon_nchar <- codon_nchar + 1L } ans_start[i] <- codon_start ans_end[i] <- codon_end codon_start <- codon_end + 1L } Views(x0, start=ans_start, end=ans_end) } setMethod("codons", "MaskedDNAString", function(x) .MaskedXString.codons(x)) setMethod("codons", "MaskedRNAString", function(x) .MaskedXString.codons(x)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "translate" generic and methods. ### setGeneric("translate", function(x) standardGeneric("translate")) .mkTranslationLkup <- function() { as.integer(charToRaw( paste(GENETIC_CODE[mkAllStrings(DNA_BASES, 3)], collapse=""))) } setMethod("translate", "DNAString", function(x) translate(DNAStringSet(x))[[1L]] ) setMethod("translate", "RNAString", function(x) translate(DNAString(x)) ) setMethod("translate", "DNAStringSet", function(x) { lkup <- .mkTranslationLkup() skipcode <- DNAcodes(FALSE)[["+"]] .Call2("DNAStringSet_translate", x, DNA_BASE_CODES, lkup, skipcode, PACKAGE="Biostrings") } ) setMethod("translate", "RNAStringSet", function(x) translate(DNAStringSet(x))) setMethod("translate", "MaskedDNAString", function(x) translate(injectHardMask(x)) ) setMethod("translate", "MaskedRNAString", function(x) { ## FIXME: Workaround until as(x, "MaskedDNAString") is available y <- new("MaskedDNAString", unmasked=DNAString(unmasked(x)), masks=masks(x)) translate(y) } ) Biostrings/R/trimLRPatterns.R0000644000126300012640000001667412227063307017556 0ustar00biocbuildphs_compbio### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "trimLRPatterns" generic. ### setGeneric("trimLRPatterns", signature = "subject", function(Lpattern = "", Rpattern = "", subject, max.Lmismatch = 0, max.Rmismatch = 0, with.Lindels = FALSE, with.Rindels = FALSE, Lfixed = TRUE, Rfixed = TRUE, ranges = FALSE) standardGeneric("trimLRPatterns") ) ### 'subject' must be an XStringSet object of length != 0. ### Returns an integer vector of the same length as 'subject' where the i-th ### value is guaranteed to be >= 1 and <= width(subject)[i] + 1. .computeTrimStart <- function(Lpattern, subject, max.Lmismatch, with.Lindels, Lfixed) { Lpattern <- normargPattern(Lpattern, subject, argname="Lpattern") pattern_length <- length(Lpattern) if (pattern_length == 0L) return(rep.int(1L, length(subject))) if (length(max.Lmismatch) == 1L && max.Lmismatch >= 0 && max.Lmismatch < 1) max.Lmismatch <- max.Lmismatch * seq_len(pattern_length) max.Lmismatch <- as.integer(max.Lmismatch) if (length(max.Lmismatch) < pattern_length) max.Lmismatch <- c(rep.int(-1L, pattern_length - length(max.Lmismatch)), max.Lmismatch) if (any(is.na(max.Lmismatch)) || length(max.Lmismatch) != pattern_length) stop("'max.Lmismatch' must be a vector of length 'nchar(Lpattern)'") ## Test the pattern "from the inside out" (moving it to the left). max.Lmismatch <- rev(max.Lmismatch) ii <- which.isMatchingStartingAt(Lpattern, subject, starting.at = 1L, max.mismatch = max.Lmismatch, with.indels = with.Lindels, fixed = Lfixed, auto.reduce.pattern = TRUE) ii[is.na(ii)] <- pattern_length + 1L start <- pattern_length + 2L - ii if (length(start) == 0L) return(start) ## For elements in 'subject' shorter than 'Lpattern', 'start' can be ## > width(subject) + 1L. pmin(start, width(subject) + 1L) } ### 'subject' must be an XStringSet object of length != 0. ### Returns an integer vector of the same length as 'subject' where the i-th ### value is guaranteed to be >= 0 and <= width(subject)[i]. .computeTrimEnd <- function(Rpattern, subject, max.Rmismatch, with.Rindels, Rfixed) { Rpattern <- normargPattern(Rpattern, subject, argname="Rpattern") pattern_length <- length(Rpattern) if (pattern_length == 0L) return(width(subject)) ## Because we want to use which.isMatchingEndingAt() with ## 'auto.reduce.pattern=TRUE', the 'ending.at' arg will need to be a ## single value. But that won't be possible if 'subject' is not ## rectangular hence the ugly trick. if (!isConstant(width(subject))) { tmp <- .computeTrimStart(reverse(Rpattern), reverse(subject), max.Rmismatch, with.Rindels, Rfixed) return(width(subject) - tmp + 1L) } if (length(max.Rmismatch) == 1L && max.Rmismatch >= 0 && max.Rmismatch < 1) max.Rmismatch <- max.Rmismatch * seq_len(pattern_length) max.Rmismatch <- as.integer(max.Rmismatch) if (length(max.Rmismatch) < pattern_length) max.Rmismatch <- c(rep.int(-1L, pattern_length - length(max.Rmismatch)), max.Rmismatch) if (any(is.na(max.Rmismatch)) || length(max.Rmismatch) != pattern_length) stop("'max.Rmismatch' must be a vector of length 'nchar(Rpattern)'") ## Test the pattern "from the inside out" (moving it to the right). max.Rmismatch <- rev(max.Rmismatch) subject_width <- width(subject)[1L] ii <- which.isMatchingEndingAt(pattern=Rpattern, subject=subject, ending.at=subject_width, max.mismatch=max.Rmismatch, with.indels=with.Rindels, fixed=Rfixed, auto.reduce.pattern=TRUE) ii[is.na(ii)] <- pattern_length + 1L end <- subject_width - pattern_length - 1L + ii if (length(end) == 0L) return(end) ## For elements in 'subject' shorter than 'Lpattern', 'end' can be < 0L. pmax(end, 0L) } .XStringSet.trimLRPatterns <- function(Lpattern, Rpattern, subject, max.Lmismatch, max.Rmismatch, with.Lindels, with.Rindels, Lfixed, Rfixed, ranges) { if (!isTRUEorFALSE(ranges)) stop("'ranges' must be TRUE or FALSE") if (length(subject) == 0L) { if (ranges) return(IRanges()) return(subject) } start <- .computeTrimStart(Lpattern, subject, max.Lmismatch, with.Lindels, Lfixed) end <- .computeTrimEnd(Rpattern, subject, max.Rmismatch, with.Rindels, Rfixed) ## For those invalid ranges where 'start > end + 1L', we arbitrarily ## decide to set the 'start' to 'end + 1' (another reasonable choice ## would have been to set the 'end' to 'start - 1'). idx <- which(start > end + 1L) start[idx] <- end[idx] + 1L if (ranges) return(IRanges(start=start, end=end)) return(narrow(subject, start=start, end=end)) } ### Dispatch on 'subject' (see signature of generic). setMethod("trimLRPatterns", "XString", function(Lpattern = "", Rpattern = "", subject, max.Lmismatch = 0, max.Rmismatch = 0, with.Lindels = FALSE, with.Rindels = FALSE, Lfixed = TRUE, Rfixed = TRUE, ranges = FALSE) { subject <- as(subject, "XStringSet") ans <- .XStringSet.trimLRPatterns(Lpattern, Rpattern, subject, max.Lmismatch, max.Rmismatch, with.Lindels, with.Rindels, Lfixed, Rfixed, ranges) if (is(ans, "XStringSet")) ans <- ans[[1L]] ans } ) ### Dispatch on 'subject' (see signature of generic). setMethod("trimLRPatterns", "XStringSet", function(Lpattern = "", Rpattern = "", subject, max.Lmismatch = 0, max.Rmismatch = 0, with.Lindels = FALSE, with.Rindels = FALSE, Lfixed = TRUE, Rfixed = TRUE, ranges = FALSE) { .XStringSet.trimLRPatterns(Lpattern, Rpattern, subject, max.Lmismatch, max.Rmismatch, with.Lindels, with.Rindels, Lfixed, Rfixed, ranges) } ) ### Dispatch on 'subject' (see signature of generic). setMethod("trimLRPatterns", "character", function(Lpattern = "", Rpattern = "", subject, max.Lmismatch = 0, max.Rmismatch = 0, with.Lindels = FALSE, with.Rindels = FALSE, Lfixed = TRUE, Rfixed = TRUE, ranges = FALSE) { subject <- as(subject, "XStringSet") ans <- .XStringSet.trimLRPatterns(Lpattern, Rpattern, subject, max.Lmismatch, max.Rmismatch, with.Lindels, with.Rindels, Lfixed, Rfixed, ranges) if (is(ans, "XStringSet")) ans <- as.character(ans) ans } ) Biostrings/R/utils.R0000644000126300012640000000164212227063307015751 0ustar00biocbuildphs_compbio### ### We register the old-style (a.k.a. S3) class below as a formally defined ### class (a.k.a. S4) because we are using it in some method signatures. ### Note that dispatch still works without this registration but causes ### 'R CMD INSTALL' to (gently) complain. ### setOldClass("probetable") ### ### Some low-level (not exported) helper functions. ### isNumericOrNAs <- function(x) { is.numeric(x) || (is.atomic(x) && is.vector(x) && all(is.na(x))) } normargUseNames <- function(use.names) { if (is.null(use.names)) return(TRUE) if (!isTRUEorFALSE(use.names)) stop("'use.names' must be TRUE or FALSE") use.names } ### Returns an integer vector. pow.int <- function(x, y) { if (!is.numeric(x)) stop("'x' must be a numeric vector") if (!is.integer(x)) x <- as.integer(x) ans <- rep.int(1L, length(x)) for (i in seq_len(y)) ans <- ans * x ans } Biostrings/R/xscat.R0000644000126300012640000000464712227063307015743 0ustar00biocbuildphs_compbio### ========================================================================= ### The xscat() function ### ------------------------------------------------------------------------- ### ### Check the types of the arguments and determine the cardinality of the ### answer: ### if 0 => empty XStringSet ### if 1 => XString ### if >= 2 => XStringSet .get_xscat_ans_cardinality <- function(...) { get_arg_cardinality <- function(arg) { if (is.character(arg)) return(length(arg)) if (is(arg, "XString")) return(1L) if (is(arg, "XStringSet") || is(arg, "XStringViews")) { if (length(arg) == 0L) return(0L) return(2L) # yes return 2, even if length(arg) == 1 } stop("xscat() arguments must be character vectors (with no NAs) ", "or XString/XStringSet/XStringViews objects") } arg_cards <- sapply(list(...), get_arg_cardinality) if (all(arg_cards == 0L)) return(0L) if (any(arg_cards == 0L)) stop("xscat() cannot mix arguments made of 0 sequence with arguments ", "made of 1 or more sequences") if (all(arg_cards == 1L)) return(1L) return(2L) } .get_xscat_ans_seqtype <- function(...) { get_arg_seqtype <- function(arg) { if (is.character(arg)) "B" else seqtype(arg) } arg_seqtypes <- unique(sapply(list(...), get_arg_seqtype)) ans_seqtype <- setdiff(arg_seqtypes, "B") if (length(ans_seqtype) >= 2L) stop("xscat() cannot mix ", ans_seqtype[1L], " and ", ans_seqtype[2L], " input") if (length(ans_seqtype) == 0L) ans_seqtype <- "B" ans_seqtype } xscat <- function(...) { if (length(list(...)) == 0) stop("no input") ans_card <- .get_xscat_ans_cardinality(...) ans_seqtype <- .get_xscat_ans_seqtype(...) if (ans_card == 1L) { ans_class <- paste(ans_seqtype, "String", sep="") } else { ans_class <- paste(ans_seqtype, "StringSet", sep="") if (ans_card == 0L) return(as(character(0), ans_class)) } args <- lapply(list(...), function(arg) { if (is(arg, ans_class)) arg else as(arg, ans_class) }) if (ans_card == 1L) { .Call2("XString_xscat", args, PACKAGE="Biostrings") } else { .Call2("XStringSet_xscat", args, PACKAGE="Biostrings") } } Biostrings/R/zzz.R0000644000126300012640000000056212227063307015446 0ustar00biocbuildphs_compbio### .onLoad <- function(libname, pkgname) { .Call2("init_DNAlkups", DNA_STRING_CODEC@enc_lkup, DNA_STRING_CODEC@dec_lkup, PACKAGE=pkgname) .Call2("init_RNAlkups", RNA_STRING_CODEC@enc_lkup, RNA_STRING_CODEC@dec_lkup, PACKAGE=pkgname) } .onUnload <- function(libpath) { library.dynam.unload("Biostrings", libpath) } Biostrings/TODO0000644000126300012640000003310212227063322014746 0ustar00biocbuildphs_compbioSome R problems that maybe worth reporting ------------------------------------------ - Loading a serialized XStringViews object without prior loading the Biostrings package seems to have problems: the object loads, but, when I try to display it, then nothing is printed and the prompt doesn't come back either (unless I CTRL C). - rowSums() and colSums() should return integer vectors when applied on an integer matrix. Immediate TODO list ------------------- BASIC CONTAINERS - Improve the MIndex container. It needs to support storage of the nb of mismatches for each hit. No need to store the locations of those mismatches though: this would require a huge amount of memory and there are other ways to retrieve these locations on user demand so maybe it's not worth it. - XStringSet objects: o Modify the internals of the XStringSet containers to support efficient replacement of elements (without reallocation and data copy). See long comment at the beginning of R/XStringSet-class.R for the details. o Support this: DNAStringSet(x, start=c(1,5), end=c(3,7)) when x is a single string (character or XString). The result should be a DNAStringSet object of the length of 'start' (or 'end'). o Fix validObject() for XStringSet objects (currently broken). o DNAStringSet(x) should not do anything when x is already a DNAStringSet _instance_ (class(x) == "DNAStringSet"). o Add methods for XStringSet objects everywhere there are methods defined for XStringViews objects (matchPattern, countPattern, etc...). Make them work in a vectorized fashion for XStringSet objects. o Add "==" method for XStringSet objects. o Try to speed up "show" method for XStringSet objects. - Define a DNAorRNA class (or NucleotideString) that is the union of the DNAString and RNAString classes (use a union class for this or "do it by hand" by defining this as a virtual class and by having the DNAString and RNAString classes derived from it). Then use it to simplify code like: setMethod("alphabetFrequency", "DNAString", ...) setMethod("alphabetFrequency", "RNAString", ...) These 2 methods can be replaced by a single method: setMethod("alphabetFrequency", "NucleotideString", ...) Also this: if (is(x@subject, "DNAString") || is(x@subject, "RNAString")) ... can be replaced by: if (is(x@subject, "NucleotideString")) ... Etc... C-LEVEL FACILITIES UTILITIES - Improve support for AAString/AAStringSet objects: (1) constructors need to check the validity of the input letters, (2) alphabetFrequency() needs to format its output in the same way it does on DNA input. - Replace current quick and dirty (and very inefficient) implementation of set operations on XStringSet objects ("union", "intersect", "setdiff" and "setequal") by something more efficient. - Move lcprefix()/lcsuffix() out of pmatchPattern.R to a file of their own. (This stuff needs to belong to the UTILITIES component of the package, not to the STRING ALIGNMENT component.) - Add "order", "sort", "duplicated", "unique" and "patternFrequency" methods for XStringSet and XStringViews objects. Also, for completeness, the "<=", ">=", "<" and ">" operators between XString objects should be provided. Note that Martin's srsort() from the ShortRead package is much faster than sortDNAString() from the old Biostrings 1 package: library(drosophila2probe) dict0 <- DNAString(drosophila2probe$sequence[1:100000]) On george1: sortDNAString(dict0) # 1.053 sec. (R-2.7.1 + Biostrings 1.4.0) srsort(dict0) # 0.097 sec. (R-2.8 + Biostrings 2.9 + ShortRead 0.1) srsort() uses standard C qsort() internally. It might be possible to be even faster by building a prefix tree (like for the Aho-Corasick algo) but that will probably be at the cost of using much more memory. Also it might be relatively easy do reuse the current Aho-Corasick code for a DNAStringSet object but it will require much more work to do this for a BStringSet or AAStringSet object. - Add an xsmatch() function that would behave like standard base::match() but on XString objects (2nd arg 'table' must be an XStringSet object). When 'x' is a single string, 'xsmatch(x, table)' would return: ii <- nchar(x) == width(table) & isMatchingAt(x, Biostrings:::super(table), start(table)) which(ii)[1] although this is not optimal because isMatchingAt() is doing too many comparisons when it could in fact bail out early. - Add a new generic that combines a subject and an IRanges (or IRanges-like) object to return an XStringViews object. The IRanges-like object could be MIndex object and the method for it would do as if it had received unlist(MIndex). Currently my problem is that I can't come up with a good name for such generic :-/ Maybe I could just use views(subject, x) for this (dispatch would be on x, not subject). And the current views function could be renamed (or maybe it's not needed at all, maybe a fancy new("IRanges", ...) could replace it). STRING MATCHING - Revisit matchLRPatterns() semantic and improve its performance. The current behaviour is to return *all* L/R match pairs that satisfy the search criteria. This leads to poor performance, and, maybe more importantly, it tends to return redundant match pairs (e.g. 2 match pairs can overlap, or one can be within the limits of the other). Maybe, by default, a better semantic would be one similar to what matchProbePair() does, that is, only match pairs that don't contain another match pair are returned (the assumption here is that those are the most relevant match pairs). Also, should L/R match pairs where the left and right matches overlap be accepted? - Add a Biostrings.Rnw vignette with a short overview of the string matching/aligning capabilities and a "how to choose the right string matching/aligning function" diagram. - Add a no.match.length argument to gregexpr2() that is FALSE by default so gregexpr(pattern, text, fixed=TRUE) is more interchangeable with gregexpr2(pattern, text) and use no.match.length=TRUE in matchPattern's internal code. - When algo="auto", use "naive_inexact" instead of "shift-or" when max.mismatch is high (e.g. >= 8, finding the exact cut-value requires some testing). Correct Robert's RBioinf book reporting that the performance decrease significantly when max.mismatch becomes to large. Should not be the case anymore. - Add some convenience function (e.g. a wrapper to .valid.algos()) to let the curious user know which algos are available/used for a given search problem. - Rework findPalindromes() (and findComplementedPalindromes()) so that they return maximum palindromes only. - PDict()/matchPDict()/countPDict()/whichPDict(): o PDict(), matchPDict(): Support fuzzy matching with variable width dictionaries. The trick used internally that consists in splitting the patterns into N+1 Trusted Bands (where N is max.mismatch) could be restricted to a "not really trusted band" specified by the user (not necessarily a prefix), and then brute force could be used on the head and tail of this "not really trusted band". The user would also need a way to specify 2 max.mismatch values: one for the "not really trusted band" and one for the head/tail. From a user point of view, it could look something like this: # Right now the following is not allowed (you cannnot specify both # 'max.mismatch' and 'tb.end'). Also the names of the # tb.start/tb.end/tb.width args would need to change because it's # not about the Trusted Band anymore (strictly speaking): pdict <- PDict(dict, max.mismatch=2, tb.end=min(width(dict))) # Then to allow up to 2 mismatches on the "not really trusted band" # and up to 1 mismatch on the tail ('pdict' has no head): mi <- matchPDict(pdict, subject, max.mismatch=c(2, 1)) The notion of Trusted Band as it is defined right now would not need to be exposed anymore and would become an entirely internal thing. From a user point of view it would be replaced by this more general kind of constant-width band where a small number of mismatches is allowed. I need a better name than "not really trusted band" for it. o Document the "allow mismacthes anywhere in the patterns" feature (activated via the 'max.mismatch' argument of PDict()). o Support IUPAC ambiguity letters in the DNAStringSet object passed to PDict(). o Harris suggestion: treat a max.mismatch value that is strictly between 0 and 1 like an error rate (so that the actual max number of mismatches adjust to the length of each pattern). o Patrick's suggestion: give the user the option to make matchPDict() return directly the coverage of the hits (apparently a common use case). That would avoid the overhead of storing the hits in the (generally big) MIndex object first. Maybe put this in a separate function e.g. coveragePDict(). o _match_tbACtree2() doesn't need to walk until the end of the subject: it could stop when the number of remaining chars to read is < to the difference between the depth of the AC tree (i.e. the width of the Trusted Band) and the current depth. This should speed up matchPDict() (and family) substantially when the length of the subject is very small. A typical use case where this could be of great benefit is when finding the neighbors of a given pattern with e.g. whichPDict(pdict, pdict[[99]], max.mismatch=2). o Implement the skip.invalid.patterns arg in PDict() (so the user can build a PDict object from Solexa data that would contain Ns if he wants, reads with an N would just be skipped). o Implement "duplicated" and "patternFrequency" methods for PDict objects with a head or a tail. Add 'as.prob' arg (default FALSE) to patternFrequency() like for alphabetFrequency(). o extractAllMatches() fails on a very big MIndex object (can't allocate vector of size 5.2Gb). o C code improvement: no need to use temporary storage for 'dups_buf' and 'match_count' in match_pdict.c, store directly in the returned INTEGER vector. o MIndex objects: at some point the user will want to be able to combine "compatible" MIndex objects. 2 MIndex objects are "compatible" if they are describing 2 set of matches coming from the same original dict and on the same target (subject). In practice, it will be enough that they have the same index i.e. they have the same pids() or, if the pids() is NULL, they have the same length. Then methods like "union", "rangesect", "setdiff", "setequal", etc... could be defined. The set operation would be performed between the 2 subsets of matches of each input pattern. Of course, 2 matches are considered equal if their start/end are the same. o Make reverseComplement() work on a PDict object. o Compare with other software for fast alignment and assembly: Vmatch (http://www.vmatch.de/) Maq (http://maq.sourceforge.net/) MUMmer (http://mummer.sourceforge.net/) STRING ALIGNMENT MISCELLANEOUS - Port DNASuffixArray() and related functions from Biostrings 1. - Robert wants the dependencies to be reduced to 1 BSgenome pkg only (not 2), or, even better, to 0 BSgenome pkg. The examples would then use a single sequence stored in the data folder. - Remove the Biostrings 1 subdir. But first compare NAMESPACE + list of aliases in Rd files from Biostrings 1 and 2 make sure no important feature has been lost. - Update the CHANGES file. 2.21 series (BioC 2.9) ---------------------- - Deprecate old matchprobes functions: matchprobes(), longestConsecutive(). Long term TODO list ------------------- - Look at apse.c in R/src/main for Levenshtein. It's coming from http://search.cpan.org/dist/String-Approx/ and is what Perl and Python are using. It should stop and return an error code after some max.distance has been reached. We definitely want to be able to do this if we're going to use it on the millions of elements of the head and tail of a TB_PDict object. - Maybe: add a specific containers for results returned by matchPattern (and family). Would derive from the XStringViews class with at least one additional slot, the @call slot (of type "language"), that would contain the value of match.call(), so that one knows what parameters were supplied for a given matching task. - Merge ~rgentlem/tmp/EMBOSS-3.0.0/emboss/matcher.c (Huang & Miller alignment algo) into Biostrings. - An old Robert request: "have a look at GeneR, and see if there are any other packages that do sequence matching, and describe, in one page or so, what the differences are between the packages (also some notion of speed and size, how well do they work on different inputs)". - Extend pairwiseAlignment to return the set of maximum alignments, rather than just one element from that set. - Why doesn't sapply or lapply work for an XStringViews object (it didn't work either for BioString objects). Isn't it enough that these objects are subsettable? - Restore the test units. - Fix pb with length(x) <- 2 screwing up x if it's an XString or XStringViews object (prevent people of doing this by defining the replacement version of the length method and issuing an error). - Still have to think about it (Robert suggestion): make [[ work on "out of limits" views with a warning (we keep issuing an error only when the view is all blank). - Start adding suffix tree capabilities: maybe merge SuffixTree package from Robert? Unsorted incoming TODO items ---------------------------- - Unify the way to get strings length (strlen() in R, length or width with Biostrings data structures. -Laurent Biostrings/build/0000755000126300012640000000000012241047607015362 5ustar00biocbuildphs_compbioBiostrings/build/vignette.rds0000644000126300012640000000070512241047607017723 0ustar00biocbuildphs_compbio‹íTÍOÂ0 0D#†Ä衉w$-©ýö¸"|EI˜QéÝ/=IX±a2k 7Æ”‡T”£ ,íyÀý©öšçfYHÌ}.QÀ‰PW±¤>C¾‹äœ )ÔFö–2rˆKqe(¥ŒÚÐIæ,ŽA Z¡ A ”§†Î ôLÞ—„Ù%:ç·˜9ž2âXMÊ\Ÿ/bÞÈ{฻òžª”å=ƒ–ä=EsyŽóÜŽËzBc蔕°²¢k¬“+y”úØñ–€±c‚í” ˜Ï–—x5ˆ-ëÃ}8´“ÈkØu×ZnF²ƒ%.°/æðÁq’ˆMhƒ_¹%‚!þË%–+ðøn>¢.¢Çm1ì­ªRÕŒJáú^j9¢ø­¿P™lÌñp¤Å ôÝÞ„9ÀªyGÖ¡Ï¢£÷Ã>8ëDÿç§š6›ÍW‘Qüó"iGÝÔw¹º¯vß?Mŧ(Biostrings/data/0000755000126300012640000000000012227063315015172 5ustar00biocbuildphs_compbioBiostrings/data/BLOSUM100.rda0000644000126300012640000000131012227063315017077 0ustar00biocbuildphs_compbio‹å–ËrÓ@EeÙIl‡P¡Øð ¬_!@( ÃŽ*X°þ]–F–‡ûçJU,Y᪱¯zú1}»{䫳Åãùb^EY”ûé{œà¤L_£¢8ž¥ßÙéÅÛë—NNÒîQZO’pcìÒZ¥Õ¦µÖʲ(9 ùF/;–N0Û•ù¨²~Ò›ë9ëÔé¹Ðs}“qe¿N«ÑsÐ~”¼"^²=ÔyZí¯%/dßHÞâO{ùS#O¢=˳’¼Ý’¸É£–ßR±;Éêv>*Å̹ï+.òµéçý»Ò]bcœ×V äð ã¯2à¤W%yÁ·dÔeXï]G•öá:Û/7 ¸å*Sq‹Aø¯½&és`üGó³ò^È ­½¥×P—9—ð¿é'­S FððÑ€_çb77²idþé?â¯qžAq,vc16õÈÓl\yÿ‡Ø¯{Õc*<¶™ Î­üÆþךËhü”VKÎTó•Ù{}9×Ú¸¦8ƒ÷…Ï鈻!ýÞÑYZÓ¥䵊ýùu~8_íñdÔ ‡Æ?=9‰·óE æ·µå3Ê=† ýÓ(r§¦èc_©:»3wóûóé3ÒÊf¦¾jÌo4[æËïúÎVk2~Éw¥>˜™|wæß¹¯L·6Læ}Ƚqû*ÞÞ‹Áêë=OOsߎŒOê9Ô·T=8 >¨¯çÐÅ~­óù&̃õ¶¿«ˆ3ý¹f~sÎ{ùÝ }ŸÞu´»tÀ÷’3þåýÍg­Xæƒ÷/vô7µÜõ¦faßê‹Îð?ÏÞr9}b¿ÏüýûÏÖö^éýAÿy“¯|µÄƒíê©L“ʯo7?~'|_zÇÒÍû£§€+ÀÀàà=à9à%àð px ¸¼¼\>>¾>N_ ÀÃÿ ¿<ë?PHê"? Biostrings/data/BLOSUM45.rda0000644000126300012640000000117312227063315017036 0ustar00biocbuildphs_compbio‹åVMOÜ0µ“l€UQ‘zê_è±*? @èÇnK·½!Á¡*!~þ®=u²ó¬ç‰ÅS-eýbOæãÍx¼‹“ÕÛùjîœk\Ó§ß6Á®I?Þ¹ƒ½4ï]~Yþ¸zw˜6÷ÓóÖf"e;0#í9»Ær[½Y&*¶c­{;´ø[ƒâ–l°më㨃lŒþ¦ÑñC/ ¯ßöYåàˆdf$›ãP;§;ØW{B:ð]Ðw!=l£¯Å.tï…¾Û'Òa‡ôÃc ½œ;øixW–Žƒó€àŸ/››oÚÞ#_ký ÇÞ¨^ùLò9¶½bë”— ­Mj—õÊtØ^ ®7ö͈q>6ú`­Ösß’òü¼ÄÙ ˜¢±Á>[ÞöÏñÓjñ”mÐ;Ÿ©¢¯«Ôeî9Ä1p>§2­«qßQ¯¥Zpd‹ýÉ÷¥ÔïÁÚe{IæVë§#î<É ÙCO«õO¾Õ9#nùþ€OöŽâû#:º?äùÇú¹Ÿ-GżööÏ}šö•ö×Û§ü˜DþÞÜß=&üJåTvØ÷ïŸN޾|88øp ppp ð` ðà'À/€k€#€O¿Voþ§@‡bÿº ›l Biostrings/data/BLOSUM50.rda0000644000126300012640000000116412227063315017032 0ustar00biocbuildphs_compbio‹åVMo1µw7DЍąßЪÄJù--mÀ Ê…Ÿ¿vóžóvº=rª¥Í¾Øã7ã73N.O6G«Í*„Єfž?Û »&Äå÷òøôüêóÙógyqŸynffÉvƒïÛ‘×Â=k[¬GØ”ïÉÙ—Ñc~!ƒîÃ{na³¥õ'~ƒð3ÖE97ã±oøØEñŸCçøl‹ŽKòÀÇ€‡¸Ÿˆ“1Ì“ÆOÿe}-çç“DbúS~s{G¤8£jE}xFê¡ñ×<€¦ÓøEë6…gnwóå#^Ñ?¢&où]xÛ¥hQshûü×5£†¬OÖ ÏȺ(k+‰_õоØâì¬ _ŸƒÆ%x°}M¨vì)_÷p‘ßó%7GÎp‹³*O¿Ÿg~[Õ|Q4Þb~.ùÐúÑœ©ÖÔGkÚçÍà¯ÅÚB|Ö»Æõº ¿æ¾?µd/ó·Þ¬yÕ™ñk,Ú—>´PW&{´o¹·§VR“æß¢¿×uUëÂ×ç—Æ?5ϼÌD§àø¦ôWÍüWWl¯s9×cö‡kžØdNkš}YãFˆøÔ»ÝlœƒzÿØÝÖž »ßŒhû;®òÈ~ƒVSýkà`ÖÁ~ú âWõö¿/ðëýÌéË÷/c÷ý[ëXr^ùÝH÷`oÃsW}&Fÿ?Ÿ]Oþµ?ßä×Ç|º{Æ¡²ÉŸ7¿þfüv°-ëñ%Á%ÁG‚‚WŸ^¼%xGðžà”àÁÁ‚ ‚+‚k‚¯ß¾|'Ø>€ó•6HÿÜÙ$~> Biostrings/data/BLOSUM62.rda0000644000126300012640000000115412227063315017034 0ustar00biocbuildphs_compbio‹åVËN1´gv‡G„„ĉ_àÈ!÷ð ¯% ä±pCJ@Šòûc¶ËÔÔnœbivÊãvw»»º½×GËýÍå¦s®qM—Û gMþñÎmoä÷úÁå—›‹ûyq+?´qxòÜÙ<Ži:¢­{“ ´Wå{“Óz ½Qt4¶/ˆ.Ì| _{ÌóèÝfƒ‡·½ý°}ð¥'ÿf$›h òÙ€Ïð³'(–Ð?`Ãcb™ ÒYô‘~䃿GŠ]7òá³3·sh>8Ç|è/y'.ÁFcg¸88¬Ø@Î#å´Øþ¨|g¸O”W:8ÀßÉLüI‰xekë²?VÞà5ø¤¼J¤#ȼǹIǨîH~ˆ]k2­œ ¾„WæÁò3ƒ¿¥î-þ´±ò”_øìw-‡ˆU©ô2”/ZÏ­qß âׯr%Tæ…Ûé…]šöˆ–âPjHâ¯uÊß•WCÌ×Ä× òe q#¾pMrG™'ã›OÓ|Œú.ëÕøÊùô;üšW|àÁ}k¹ä[0òã9>yþõ#:’ÌY|UŽÀÿ6ãÓP~´Lz»Ä½°E½ïGõ`¶qw4•s å#.@‡ú£÷©ÞQÚ¯jüä^ÒR/z«— §Õz‰#ß©v”˜+·YÞÉõΣïgUC£ÿxíï‡ÇüÚ²°ï®žñßÀ,òtÿøç_Æ;&·m²Ãºÿp pppð àà3À)ÀÀ%ÀÀàà+À Àw€_·?Îî–{ÿÓAÒÇg© ½µ Biostrings/data/BLOSUM80.rda0000644000126300012640000000121012227063315017025 0ustar00biocbuildphs_compbio‹å–KoÕ0…äÞÐUªÄŠ¿À ±bK)ï–GËã ,Š„ø÷¹IŒÝÎç)»®°”›ãÌxÆsf<¾§G›{›½BÚ>ýv ®ÚôÓ„p°›Þ;‡ÇoÎ>œ<¼Ÿ„ûéù•¾­cŒ³c0Yoó,óZl‰Œ[tœ·®ø°=õf[åÄ2šoüè‰|2µèªÙâîM?š?âÎß¶²gÇ ûÈ>¶ÂÅàbÍ:»bSí)GS¬ý(O£è’»h~z¸‡?ã¦nfY3á>s±¹8ྱ8[ãm›£ðç}”œ›œ]ø”÷Rgáê^*9“3F<¹öoÅ:¯Å‡Ô¡ö›*–lsáœëý ^ɾ|ä¯Üab+.ø÷üÃÏ¿îÁëz ýª£?HOXêW-ú.Ž®ýfeûÑûÃ÷CGM¢Oß)>nx 7ý\ž¡ê?^÷íÇyzííw/Ÿúo`Rùùõüûï„ï˜Þéfyóp x 8<¼<<<¼^NOog€÷€O€Ï€€CÀKÀÀpï 4„ù¢ˆÊ Biostrings/data/HNF4alpha.rda0000644000126300012640000001066512227063315017377 0ustar00biocbuildphs_compbio‹íKpGuw4’V²-; „ü “¤ä*gKä@°¶;YV¬Ø8à´fZÚIfg63³RœPTR&æ“"@*EB’¢Š8pàÀ….8páÀ Šâdyý›yÓÛóY“¢ª§™éÏëׯß{ýúu÷ž^~ôcóηZ-«eÁÚ‚WÛ‚íVkß<çî_=~ =ÒjO]¯eî¢íÓ0}äâ€Âç>\oyõÈzûá–VÇDQ`À5ûôàBà')¼^#’[×¼p]«5õrÛît¬vÛ¶Ûð°áO|A*ÿßfO† øêXû²xŽmÙð_|@+h‹Ž³Û"-ûèðG'+&)Èm…ËæéœÛê(<œ@E[N4™Smón!r$¡ðèÚÕ¶>ÚYçø#ËRXgÛbM¶³žò †Ž±Oö‡€zd" $9¶j´-¨uÚ’6'§ƒr:ÉÄŽ2a΋ي‰64<$–ú€bœqŒ³ŒÎYŒ§p.Úœæ¬smA(âËϵcw8ÍF›±,ãh³7#ÔìcIB;¶%¹'d§O‡KA&™ŒZÙ©qìä£Ý±«êLÞl;Ã&;'šæ"Är¬|´y íÂøäRÅeÉ® P’}ظ@ÛÁâÂ5Obl·sîhš|c7ðÃ'/¤Ñ—¸=ê]ˆ6ž nªk·ÝúóŸòi)ÃЧi/òfTf>Ö½s©»$MCöaùŽ @Ï4 ·ý§áão­ÖügîôhLÇ1\)ZÞÝõC?=ACû.äuév¯{г^ÿ¥eMu»]‘̱Ϡ¬ö³‚C…DëÐ25ëÝ6 †ÔPto’’Ð#±—Ç‹` >Ïh÷Ià?ƒÙ3Ö¦¿iHmßbHœó=˜+|—†Ìi7 I"2®ûÐH¼/ŒZE~Ëü}£üý*õžèncºz4ŽÅP3ª¡Aæ}µÆ•w÷˜‰gçÏ‹ÔëTÅ="—ƒD|½ÆÜIcƒÖí·›øê'ݘ2ú$u{*sO÷(I|÷šT ÿáÆԙ€†[)F®êê-é`ÎŇ܉ËêlÑ4¥O§Jþ¤ìr#q¼ï' TsÄ}’lQ' ¢ÔYÜŸpüÐöȉ6.tέû“[EUÔ7#‡xõZÝ%‹­Bó@™$¥ Ö3^Ô'~oÌñj©ÅÿL’h’؆:‘·Ót‡¹7•¶“4äé·)J0sÏä†Á¶ÙmPÏ!%ÜõÃ$¥Äc©iBù§†~ åó"&¨U΋W;ndPZë Ól|ö #¢ñjŒU ç&[¶¥¦}›—ϧ€´?08ËÓLžY§5Ή0+ËŸ…Ù0r+Dðl¥1¦ª %õÆ9ńȄ\Û;M1MÀì“p‹¢wJi®r"vŠËn“Ðï¾nLaÄ]? kÂǘ×ÇÁ“uc†y@ãÔçl’¹K#CÉÝÉ æóÌß-Ë*ÿ¤r&¾j]úkH¸tßçÑM2 R\¦d¢¾Ã4a,pqdÖ™ Vb(Ñ!A€ò•˜Ä1ò÷x$%k$NåžJq®¢¯‡ðê>ÕtwLÒØYäÀ!,s?nBï4N¨ÌÒ;jðfî3U»¦Ëùº<΂£²ø'KøøQ„Î8| fdtŸMóh>8È' »AàÃDÁø³yœŠ"å´’8!Lìœ6g±?LRgƒ:ÄÙ`Þ‹DÅ MžLr£þ†h¤ÉÔÄœÊÉ¡l2 Z&.ÌÑòÔÔ´„ZÞt¿É¨ç>ø¢!ÑúÂÌrŸÖiÜÔ-2ïpÉáùˆIìgÏ>pú‘3GVªÑÀ©Í(ÖXk¹Bd¨<6°¸X¦¦uÊ.5Yöʨ9ÛÏNj¾Y­ÈŸZ¤È³iÂÙ!‰³ CþÇ·´×Ih€ºþ&¬žx•¢w•“Ž5ñŠävwÚó¥æy¹ã¸«º¶Xc­S†:e«š1q¬æ£:þ†ôµåÓÅ.ab›®5çBº“­æe¡µQb ѲB¨,}[#⊭>¬“hèi&Û4 Æê ~rVPd°N•i Âvk&<Ôb òÍÖ !u,Û6*…›©“ýÌøßã ù²ŽK}L /•ó„Þ¹F®} oÁ’Ö@zk bæ(7¦”2LÛ5$Ú"ÒV\1ÈqUˆ¢Ñ¹šëý¦2­;Þé]*õ‘Jf¤Z û xÄ›ï¦LZ©»‰„‰·ä–þ2¼~ŸyúÂôŠÈ®•¿2c23P‹<«šËÊž-5Îeƒ`-ÉçÃösiÀ˜Ò—à+z;`yLÉÀºÙ Ú’aÁ¦QNJƒˆ” 8PÜÞù\ tþ´ÞîáU\¬²5ð6šÎ*»zÄ0#_‹ª¬élʸîåõTs¦¹¥BwÏ7´yªür‰T<ŒÊ~V·§uº0;ˆJ¦Õ±.Ïd%kŒ„Å%â9“”Í“4ýaªJ~®Žè‚}>Ÿ'>nг ·T™B#†ôîáyØP·‰U6iEe[&m¹RƒýE°ÉJ=T‘ùÅÙpÇO{*ƒGs .ðAFˆû " ™|kLPl\†”­MÑǦ=ŸÈÆO0Ê~\71 ì{‡¹µdÿ·Ãój2·é“Ľ¦Ù Ê°ˆØæîÙÈòéåÛ~ž™ûþ }ê "µWq¸Å+(íÆªO·ÂœDõV5\u‹V´s—hØêã™ç¬½ \ ]ÃáÅ1ÖÞ빇s²¢¿¹1æhQ-l¶7+0ô±Äæèi•Q»*mo8@Äa7- Tƒ.̘NAåýñ5É›Ä#ßÏ'4Ç0qþ¤j›ÛnØ@1 wÇ hÁEaÀd-ÂêÏa‰ç§Ô;àe»”kŸˆ9 UV [²zDµ•Gøêz¾ÒÔ’M(mÔGªÁÚ³WâWá66JÊmôzz»“ŒàA4h2¬ÀÆ`ªqù‹¬€QmÌÏšÙ é:ü÷É4R­Ë3.†«r)3ëE]X2 [qVy`ªÉ¬9éLY½,Qk‹Bhõ~}ˆªlå·GÝ'Ç×6Æ Ô¼Ÿ<ºþq€ê×p"4PÓ@ï–¤ãÈšÉ|«hÓ͆îâ^¨õóͨü-¨ü.oiA¢MÁ}¬Õæï£ÐÀßâá·4bû(…Ðó b!7©á÷[¸#î·«]–IvWÞ1®BÜÔÈÜÔ”8–+r寔)ø­¦áKrwÆ8¬ Én¶éȺ0Xn4 <>Zý k “÷8ð¦,†9Ä:›ÃÐåsg†uñË#Û‘ï9i A8ºÕÒÇÞŸlhXZ`bU­Ñk0Y¼s™™8Ð׉¦®©ïuëË*QsÐûØKWG­ZE|¹I‹y²É¸ ªŒOSó)MÁŒä2ëEÜî¸ø~É =&mÜCä¾ÇÙ¸¼hšf¼‡‡>$D4⯤sÌ&iÉÕ¬+qËGÐûãx´›®MíX}çùžÌ¯ Ý£óSù¢³Fů“ $Éh¼Þ êåË˰Ÿçžk™¯V;.ªãé-7QÓë¾<^¤‹Eƒb?MËí&[l* »m²2eÇ=Œþ½ß÷‘ KXd 5ÚIv$qI'ªääH®Ei|qUEÓYÎŽ¬™êì± ‘qº3#¡ALÌòCEUF¼x0,Ió“FûbAfŸ¤±ÿ´â.‰crQ?±å+bše±ÂôYýŒ*¿MÝ”1G³Ä¹Ñ± ñûâ°´<¿Ö#1qaþTùnÔTÑ7ë‡)ÝÊr§b²£\Yú4‹«$<¦‚}!·jVß ·†üì›p¼ùyö(dö4K‚…X’`ªæ¬õ»²·«VÄÁ:Åäxè¦Ã˜V2W``á|’L¼‹‹‰=›E•6Õ;ŽÎp´;=?ÈZŒé€Õ~^EŠÂ 2¾yJfšh:.¿µþÓPÊfºêÈy™“V‡¡³]Óλ%6•®ƒ’kÿ/0ØíÊ€ô@Q¼Y•sº4äw&Œg1ç+$B´žÀdÅö²bÿ2P:Û=ÉË·Ú³Sº¥$Þ¢é{¥ ( ðÞâmž½¥.œÐ.›4Àk¤mŸ¦å,ؘDu+gAŠ€.e¾ÆÕ¦‰x6¤;]`4ÒRï¤9hgdþÞ&–m—ä³8D¸nGu>£ÕÙ[Rg|T<ÛŠã³—š˜˜™D tÑYXU›ùzê†YÑÒ„Ï0Hä¼ÐUG…ò2D“„ËÍ:ÄÎxU`ÁCw¹)›w±3³÷á–úšWz¾!ŸÝÆ#Èu0€†`“ÂUlzÌ`Æ_œd¥jÚUxlTÓXQåÕŠª‰j~»B5Mq<˜StÍÓÓÑ5Õö)˜SóìŒÆªÞ’ÏEŒëœŸ—Pã»5#?^pï8c^ÂŒ1ÜŤ¼„Þ¨§™.`–tƒV÷Rɸ/è4à:=!®b°†$¨Y[»§KW~èKtÔÐsÉÄ_-Âò}6\v’>—é VjÕÆÙŠ6ªƒ^rK )£ áÌ…O]!¯ÕðeÃÜöù|¹B_p=L ‡óQ=Ó|:f k¬‹ŽÓÄÈ— t}Ç–ÑßO Õ­­¯¹$dñs¶wSríÖÅÈ"ÛéA©^Då~—qÀ ݿוtâƒ\ŒÉ·ŒÉ (íœ^¯ÿS&C2ï »B£.陜Z®_Ÿc™p¯")Ù«À|ed í­&{“Ü÷1©­‰Í/ê*VÃj£j6eì?7ù8CÅe(¶c\êœÑ—BÌp[M„½½,Í—g›~œ¤ø}ýÞ¦6_Wmtd£ßÈæ'òºk^fGcA#×eŽáÑÖ;º×øjD»3D…µ‡:ªøÚ­ íÝ%B7~,œµsÿžˆê÷·*úÝd[çô®¸×ј¼fÀkºcö£’®Tçvᢕ‘†ÊõˆªoäþWÈý²Õ-¾ˆ‘°WÝä*,‹Þ@Àžoê\ÂÚÒ*ïéë†Iõu„›uï£\]û!Âk!x¿¨M⯎ôÍ~¨Éи&BqÖpEç×cg˜¨ŸýÑIú±Î]€*XR&ß÷M?9¢ÒŒ!e±Ý¦²s1'ñÖPD¢t&Γ 8™‹Ð8ŒÃvÉb+Ù·†CVôym6@Qð÷N`߬*‹³ÎJÆñøÅ5’ÞÞå"#ÏÖ{$¦Þi²saýx` ã8MÂ-Z¶ñ0‹\élÅ?OÍ\ù­|®~Æ@ûšTÛÄŒ[¸€íæÞ pàÀclQÊÂ4_ø&À+?øÀ¯~ðG€¿üÐM\ p3ÀA€OXx ð Àó/¼ðS€_üà÷ø+À¿A¨€hëZ€Û–<pVÖS_ø:À÷ÞøÀ¯~ ð€?üÌ8ýžºà£w1;° p 0ø2Àeq;¾ÇK1nÏûPEÆ­9yߺᗆöÊ1LÄã‘LUijÙþzq6êgU+ç›…ÌZP/³6£Ÿrº~>ªihwö ªë´lf›?êG /S˜/þ ShI×UBiostrings/data/PAM120.rda0000644000126300012640000000124112227063315016520 0ustar00biocbuildphs_compbio‹å–MoÔ0†dwÙVTªÄ…ßÀ ú (”/AQ)nHpàP.üù|8ìî<›7Q¯œˆäÍk{<ïŒ'{}±;;Þ‡êPoòo“áªÎ?U§Gù½¹:¿|rö8oäñ4¯4f6æaÅås'q¯q?ò¼óµà:xÚr®XQô‚ÑY»Ü :’Ë âƒù»E¨„éç|÷w­>c½îot™âk#1´prËh뫟k$ÞQ|ŽÎǨzðßýlÄü\÷‘Ÿï|=º k½(¶áaô=ζΠ\Tnc㼌’ÿ$þöŽÉw/þ—gu?•ëê„+bwwäýÍBeóÚ‚sp4ØœKêþ{‰1‰]|¯Ñïq˜ã{b3©}Ÿ2GWeóúL YFtjSjRs‚ïÍžÖÏ¡†ÄÏAt®‰MôGÑ_këëµpÙI Ç]^ûžæ×ÜÁ¦š…“Väð§_Ìé5Ü·í¶Ùtð_ó ÜKîOgóšÆosZOæ5É=ï·Â‹ò 5†¯ÊÕ 97ñKÏ$Õ/wÝ&uF¾~gµØÕ;n¢_×µÏüØTs&œÔÎK¿à‘³…ÿNòÒÚtÁô,åNn{O>ߦ|jî4¿É¦<,t%Ùê³ð²•9¹o%ö»†~3èS•ìÁ+}f-gMô'é{½ÓH½ë·’þGƒïC,aú¿y®B˜úóÊm%ѯ= Þ˜ë]!çª_k6.Φ>Ô¢ÈÁ·>äûŸý™ý;j~üºÉ¯óá~ÌD¶Yä÷÷›Ÿ2~àr§.[ö«sÀ5à=àðððð ððððp x ¸|||||<|ìþƒøÊ5H^< Biostrings/data/PAM250.rda0000644000126300012640000000117312227063315016530 0ustar00biocbuildphs_compbio‹å–Ío1ÅÝtK#*qáoà„*q§P¾TŠJA¸!ÁC¹ðÏ'ÝãUÞÏyk­NXröűß̼™ñæú|}ºZ¯BU¨šôY'¸¬ÒÇ"„“£ôl®Î.O?J?§ùdÜc‚†ãñTÜÁp¿cÜÍôýVk“‘Ö6âkô}ñöØ®µ¯3ލ=>ׯÌUì3ßBÁ¿0Øc܃xX߸£” ¶ÂµÅ?àóÈ-=¢Å°Å†ÎÕøÏYÍ‘ûîøÔì5q²Þƒ~Ûîì,ú G%Ká(_ˆ¼´¦q4›ƒx²ÿ¦ëè³´Êš ·«Î÷ÆÕÛÙ¸-‡=þ[·36ÑŸÜVf«ÆïôlLŸP`FŽÍtÎüœ™™½Î„}â‡×:¾/í,üð Ám©‰8ùIî½¶°å뮵¤íÂâE“^q¸¿hí¾pÖù3g }¼žÛ9Î}°M_ÒLÏus­ÿ´vh¶Ú¸ï;îb¢<~b!®Vq ½MXðOìX?0¼¿¸Ÿ½–¼oà¡¿J_'}Rä:Û Öó¶ægFýoÃþþÞj­ÞZÎsÍš&hu¯Ð‰’½‘ù¨%Ÿdæñì@~抷’ÌL{¹Õ¿Ó{F=ËB²^+Ÿ©â¨ô./yåÂV.ÛûÊÜ/õ™¯H¸¬[kv¸çJ16û•â¨-¶›|tZÔ§•ÜBu,´_rçÒõ:’k!Œ* \o­>ËØ#Þ7›ð›¢g¨Q-»p-î—ú_ËÏTòØ€¯w¨:õÞ5YçüœYý‰9D½½°âæH1W¦W›¿…ÍŽu­l&´ŠÉû‚•ò³Ž; ½_™ Û}?¸ÛÜì—Ê%(þtowu^šn.Ýô6ðOª=FŸN{­x@Ú½là£GÊ0ô/³–˜…x€.ýï<[×JyuÆ]ìÓÿèù|ªU·ÉÖÌ„KÔ‘<‚Õ£±ó:lò…XÏölõìYô1úøÈÃÀ÷™ÝÉ•0³ƒy'èë<ú9 Ãü-LÜs»•­2 <&Ÿ%÷t¿¹Õ§Ñ¼®¶dñA¬ÚuÃп½é!G}–ùZŸf[µêt>Q¦:ëgî‹þ*¬! 3>˜|xÜ…lÁ“Bþw™ö}…kÈræß[Ï£µØç–ü#¸›‡M¯û•:m}?nû¹ºíµú¦nüÀÛùþó2Ñ]?Sî¯Ö†È4ŠüúvùãOÄ÷$w$Ùt>:œÞNOïÏ//¯oo§€ç€3ÀÀGÀgÀÀ'ÀÀkÀWÀàÁÿ”hâý?èy1{ Biostrings/data/PAM40.rda0000644000126300012640000000134012227063315016441 0ustar00biocbuildphs_compbio‹å–ÍnA„×1$NP¤H\xNñŸ (8„ Oîxmïw›§>oÙwN¬4žÚ™îžîêž^_ž]=>º:*Šb¯ØÛO¿ãï쥟QQœ¦ùîÅéù“Giç8§ia?"š4: p·O~_¥Ñ®óF¡'ÁRk½éæyšu’ÈDúKtÓSi„öªì¤ô*³ÓJ]üke“îAZrtzÙ\ÉB6*é’«‰K|¸ÿy^® Mg(Ölw¼ÃÙ\6òù3Ùì´–ßØ—ŸøßH6ë•iïPg”ò³–ìÌÖçÆwžoŒ“¹éâŸùŒ‰|hÄñ÷\xe6òµG+ÙïÉ£8)«ÎlTäAþµ¶7Õ~#]·Ú÷Š\%î–ÆeCÝ8w­Å…ýF¾S{µÕL¥|`nï&†šÄVaö‰‘Ø[ËéRgLðUºäµ!gÚ£nZ³·Ôà ßÍ×P>ˆ­7®ð‰³*[ãþŽ,¦Ò8D®áî„d¼,b¸ïäÑùéÂî€q¹^S›)Ž{&O¨Ïˆ¡Î°_ÛÙ3Éú¡&à¹SΩ§µ=qï>Ö1Ô'µPÇp/á_©bš˜.÷šy”fNÓø_˜Ù˜F´ýuÀiÎÉóˆÒèÝþªòHÏmƒ•+ÞæuÉî„k³-|ô%~kÄóº'Øx¬q#ãÌRÖn[æ`Øg˜ÆÆš ïz±!/š‡a™ÕeÎ<ÌÄ.ûí$‡FüD<{‰á‘ó+øðð¿¿-¹ƒM#ï;á>FÌyظ^âÜÃ>FÜ+uŒ²>`tÌ- åj~Ú(÷¼EÙ_/¸…ïˆûó‡=i ©¯~"âôÔ qÍ‘GæêS»úaNÔh]3nÌXO³¢ãQümÅ6ر¾ÉOúT\+&ÿ-æf¸Ïen+¾¨ÏFöëÅïRr4áýÏúI«óª™hEO#ü/©=á‹ü{+uöyÔµj©G5ê¶žÄÈßKµלœôੳÒkäÊ ï:ð²ˆpŸ´ÝÅަ¡¸gÕƒ‡”ßvâ#JŒÆDkôÏþç:ö`°¢÷…ð²ãN471ÊžÈsÿ&÷(üð<ÐsD9`=Zéõï:ÜĤ޼•ó—Ütiù©•~çyÐH Ö)XùötˆÉºã¾üöàh%Ï´e ³RSµáÙ1âÛB]’oåc—¯ôieÇ=hð³@æŒýÌóÇJiÿSÓÔ1Ï[Æa =§Ø¯|G_sY«gÉ ëáwú½eü’×·’S¼õ¬åYÀgÖšqÆ|£îòÚÞõØŸuGðfßÞf¹£½ìÇ‘ÉI2ùõíöÇŸ„ïÃî ¶y¾:'¸!¸"¸ xFðžà9ÁK‚W¯ Þ¼%¸$xApMðà#Ág‚/Ÿž¼!øJ°!xø?%šØøþ=µë Biostrings/data/phiX174Phage.rda0000644000126300012640000001445512227063315020004 0ustar00biocbuildphs_compbio‹í]ÿoÇu¿ŽÈõÕväÆqÒœ]È• ™ ãn])©$ÊŠcI¦EKvê´ÊònI®uÜ=ïî‘VE[8@¡ÆHÔhƒ I¢¿·Y,‚æ:óÞ›Ýٹٽ¥*;v=„Ï·Üùöæ}Ÿ¥n®½ù•å7—{½ïqùÅä¥àò¬×;yX~ïÄo>÷ÂW×wÂí¨Çž°ÚD£h7JŠ×ï#ùëI£éðÚ‹E'ÛÖ1NÓ‘c®¥wÇwFq^ÈËÇðvïqùù­ü|¾×ûáyÁD XÀÎY ˜¼d‚©Æ8“·e£`²¼ÍÃeù#uSþ¢† ¸ÇÕjB59ãx“1%Ù Z…Póªû‚á·êÀ¹šS:¸º§†qµP#°—ê­æL­§VúÔïLÝ‚H’Œ³¨E-r  O.¡úp†„Ͱ_بdâêÄT#S©•p{‚ÚÕš²…ÃöÀ-9ƒ¢Lm7R9P+§‘SÁ¶a^†À@¡Ø®x  N‰EíXÀæåž5y€J8 ¥K£Tu` C9C)}vâ@¥\Ð5 ¤¬R=1ŠOÍ o£(®q²Ðú€Ì 4w‘$â© ñ£ì8Ú5:”›Z4EIÀÐ~4A®¹ŽJf £Á‚ASh”Œ¶ÆÁñ wj8è#XW€Š©ì- m‰£z€–Š ¤ ‘‘傜 • ‘#@iéïÈ 0"€wÐzÈe0´/ð‡ª °”ì’¡ÇÓ„©PA– ¢ƒí‘†W€:N&€í*öã*è#ÑsqmÓ¨¸å U Ð'j/ÈоÉIœ° Üd‚ø¯F1tþ | 8*¤—|œZG€—σæ ‚OfÚ€¹p°ðÔ Õ,…¢I  ${áèåÑò`]à(%h4ÎÚÃ`›Š( ˜E“£¶•ô0T,e;Ê•’DeCåewˆeJ@æ©„nÈ.† €n t#¹—%Á) 2j L ça°;ôèÔì„®Ý$F9PK57® <€ùÁ{i¸oTï@kGCÀІ‘fäìh&š X,JS ½Òö8yqÕ(§Bᆣ§F%9aZõ„aÆý¡š‘ ” qD¸¢S O)É£Ãd%äk@À™¡Q ÌthÅ¡'Äíâ‚‘•£[C$¯­ýj@ÜFn‰@ë7õ†þBë#.ÃÊèÐ]±ÊÎ`jtÂøƒ^„¡“ÛEF¢~AogZ#PgAka$Ónqí»0/¨_B»=7:B¢œ¢1J,g h:ŽÚJB@½/ŽzD ‹Ë‘8É `–PfÉŽÞ¨+8]^yb^™2%ƒà>Ádµ ä¤Énªü µƒüúÎ)™RJ ·Öá" ÷InT ¹ Ãá˜1F!@PüÈ’'˜Þ¢•£ë'¹$!ídÚ,˜æE8ʃ5ÑS눋AºÌ*Ëpúxô{‰‘VC÷›Ï9ESte‚ À´%éIÈÏ¢û+¬Ï1Ñ`䟴åsôT¤•‚òføLjf­èL«ÜU›2ýˆ F aLP® ÿs¡À£yÈQ³µûÖFéªÀ,·TdK†ÉƒÚ` G™ëd? í€Ç0F¥(Õs,ì@•¯f(€Â§¬ ÒHûÖO }¥°raÕlZÄÓ‘ ½®Á¨Â0€Q3Ž~|/8Õ9 šuD`Ä3¤\ð2?§¤R˜".t”R C:öè GÉ? Ómø•ÀÑUpt3‚,zWE)æÝj}.C iÔ5\U²b¨á¨<˜5PPÄvÒaN^ÉtÞ£. g@© C' †f«c3&yÄ#mËNh)‡(“kÜnR¢@»vr¥Ã7k€I”Ξ±d#C• „“U^ZUÿXÅS`Xp]}C±ÃÊ:öƒÅƒ \zèj(`zï+:X¢®¾ V@NéÐ'J‚ŠxFé7RߘÙÂV¸4J‚y+° ¨C0ÌcÄ’žÎ@¡T±LÈ™¡gÀ˜HÜ&%Äœêꀑ촕£ÓÓ1ù ,­Ÿ Ò Êä-ÓºÒ¤: Nä‚R4@@©¢„aP:Šºˆi_”æcƒÁ„ôˆ¯Ôkd]«P¥+@Rײ¨Ç„RPÜ`˜ä)aazEJYº Ôè–5žÀh  Ê<7ìS*Ð)áž *¡[$õ£b)(ËTA@2•SöŠŽ•u'îŠ!™ aTt=ŒÐ*‰©¼d;ÍCEH™åQ&kHy¸2K¡è‰aQƨøÆ*º m89z ú•1íÄ0Ä2˜ö€É;¡j˜r먥)e˜5“Ù¡:á1ò]4ÁªLqX¹”ºöGŒôˆ¼ ʇ"¢ °FÞK`¸"‡0Ô%‚¹ \rôx¤Ô:…¤µ _ªP19N­È #ðH¨GB †y0$”}&‘Ð2ñôH¨GB=ê‘P”„GB1ÉôH¨GBŠÎûá!¡4yY…õHhà‘PÍ„z$Ô#¡ õH(ÉÚ#¡ õH¨GBÑ^=ê‘P„z$Ô#¡ õH¨GBµ>y$Ô#¡ õH¨GB™GB=x$”¬Ü#¡ õH¨GB=úÙ@B?›oÇ{$Ô#¡ E ¥J–â‘P„ Å ÿðÀ#¡H(Òì‘Pžx$”´Ï#¡:—öH¨GB™GBÿß!¡Ì#¡„„™ EUd õH¨GB?aH(óH¨GB=ê‘P„z$Ô#¡ õH¨GB?MH(2Ë#¡A<ê‘P„êÀ#¡A™Dé Ôµ,ê?$” õH¨GB= <ê‘ÐÀ#¡d Ÿ2$T# e õHh c²GBç ¡è¼ <ê‘P&Ô#¡L£™ õHè§  õH¨GBùGŠ„ZÿÔü“+£8¹{§Hï ÂÁN4¼“n¾ ûŸŸ=ü±¿ÿ›¾¹þ—ëw£b'æê_½—ŸÅ¯¬<·º²Jÿv½šìKtm|jôŠ’½8“7É_þ«×[žšû;QÍÎð ŸÚÊGWâ$.®FI”ÅÙ¶ ·0µú,­¼ ì‘—¿±šVVVð6̾h4±ï#‡j7ùùgén¹»½p4‰]OäE˜ ÃlX]N]–íq8Š¿g²gfÍxËq—=å¸y8FI‘£ñÐ`æ96<:­/ö{S¼>>íÕùMí'§Õõ#úº$p°7;Ó£ÓÙY#Ó94PÛçŒõ ¹Âv/»xöÖ[x÷ózà1l…Mü„Ås“Îù3ϸøç+IèjØ ‹ÁŽE‡n<¶r)ÌãÁe%“(oÿ… Ž»‹£(Ù.ÌÉõX{£ ¬¸¸fIœl;š‚í¨(¢w ­¤»à$^Úó\ëÃÁÝp;ê磴èŸ9ŸíÇIýQ?ÝêƒÒõŸ>?Ý?£»ÆÉVÚ‡ÃhxÖ±êê¶!'t Ê¥)5³^¦»aœÈ«eu÷¯zðãÒD—Æv´‰jµ,*&YâÐ{Wo‘鸺ÿ𓹷*ÇÐGßÜÇ5¢a?lànœäEÕÝb'’ýߙęì_uq©è8”£šyQãj0HG£pœGµü\¿›|NO±x5ÿ¶Å&Akéðc¼åélÿ*»ã[xÂiJŸsÓ›åDRHkj_’Ѱ˜€^&FÙ]³´H‹{ãÈÔ$vãÖµkv´dˆ‰‡qq¯×{ÎŽm‹á`åMtáßw ‘¡ªul¢ÉUrP뽜O6¥ór-¾¼eyœ&¯D’ðÞã½SÍ£p g9¥”ˆ›„<ËÝŒÆY”K·rnìúµi#ÍmIÄ‘i=c9êRú™¤o%‹¤Äñ(ZÇcÙ–ƒHÉv‚±,Å<޲"6QëêÔÑóh>‘«x@íG©¯ÎOZ#ñ#”s¬ÊeÛüÉa´NF…Ù§!P?ë ÇA•wVŠ•;záhd´op‰3ä†E¸fÅå*S©ÇªæóÚ9Õ¡•59ÉA»m$p†6¥_4®O9ªÊ&#JÁ.9²™+®a­_×fYp‰ºÿiÿИÎNþNFd)ôX…y#œƒ@!Õn<Še PüÑ<+°Ë9 +y?‘hëŸÙäE3ê‡ýM•½Ðdi&oË£[ƒtw×3:FùYc'sZƒC“—´I]Tþbµéдj¬|Ô°ý.R¯rð3Ž›ü?p+ÈkÓæROQÛ…ɘç÷]j¿tû囯ߺx­}g¸°•fkù`dLä<# Y\¬E®:刖AÙ|mÚíšg×­Ül®Ê¿z#%•Wa¢¿æý­t’ åÿ³>xÚZê„–0Žñ–¬ž`H=»ªH7-ñôöh±çÚÌ«~/™[µ­ÝÁ—j½êÓTǪ̃c‹˜/Ùów¤§n-VßàªIl×Zópí—ÕO÷_kЊ׌¾nûÓy¶°4NÂêÌ–Ëžs ,Lê%â.-[‹"‹7'…îùóˆ®ùç·ª›ßuØÙ‹[ºOmÇööÿÒ˜ç5ÇØ.^Ùe­k¹¬åAö¥OÖæ¡!D•—à~\ìè@sk)ð¹¾”ä xÏpù„5æ6)S†BÕŽ.ô±ëÎäã í?ˆ‹[&kìûˆ¹µêÿÃȼºÄ6;H|Ý ÚB„¤oÛ™ õÅîÏ⪱Êýóè;á(ÕÏ*.t øšqïÉ©1N~Z<ÀucÜ k®yE«ñä.·f›gvŽY'¤råѺ /Îd²öÞ¨2œë-û­œ1LkŒ2ÝöVË ;±¡ã^߾׊ڵ‘(†“±Aœi⮲@/¸Ù’ÂÌ(à‚\£y?±¥yÉÈ7éûmkŽË&Íöƒz¨=ðÝØ00ŒÁ$ˤ¢î¡7’.댬þâD–xq ÏöCí»tjŸcLŽªìez²ÚôÕ¼BøæíüZWOv@m;eKªCí¹ÓW™kl6ô -éíØëD‚ç ¡¬ d0I´Ü°ýŒê`!ªù9't­Ãÿï9y‡EjÐ:qqD¬ÖRfi˜®Èhä ³ö(Ž7S]¢æA#e{Y¢k‹´úM[Dm¾òØ`'Ü­mœ Ôrœ¿¹ñ¼@íÎáDâ Þ¼÷²qý­†û&²ærßmú²c»æ.týéìÔÚHuhN]i®|Ѹþ®)í®µ©Ø—ÕwÕ>¤ö6èÞ8?Uµ&k4~·L’OgÇ=Ûa\U^&»Uë]Ø@íºÚc†öÊ]Ì4PÛ§ãE¶ÚðhTß§«ÜîòˆMð{./ÓtÜÙ߈Óqrº>Ù¤EN¨Qäå‘ÄU›¨†“#•Ù½MW-û4²°ÙÃȸEÝ­)ZR³óÓêPQ›¯ Ë‹ê¤ÑIœÉÜ ‹,~Ws7̲ðž}bk0º†aV ìÏ@@×wñÆ·uÿ½hP¨#t4 ÏÎ<˜À_“É.–¦ók;adüÔíƒtw<Š4}KqRDÛeëBîëT6zWá*9`*fn€z«Ã°þ}&Û8û†‰7œgOåOË[²Ë’p4.ôr|ã«åÕózY¼­š·õ 'µik/›t˜×IÛIÓZ‰v&Q¿•sœTÀV‡¦\ãQW ^J¢ýÉhó;©=F‚v‹ÚOtI°Dºù¶Ï1V§T:Ùù‘3“–®LʶÞÓDHß³’0}JÙ~™¦é¼eýWŠ"Ø ˜Ä‹]§1³Gé«é8¾™Vù_OewµrÏ2•Þõ¿ù˜Öù[{ž‡btŸJ)îEÊêÔ¹mò”]éÒGÕjxï÷ڬƅ¤—Ò¥ˆ8ÔpDwÞ{`óžûܧïphÌõŒ1æÛÖ˜ cf+ úÙVŸ½ßÅÅ,æÐqÑfaÛh•ëé7Ìêž&ùžÊ°åÇ]¦ 4|Põ -Mx¿Û†Ô¯–YLѽߕÍGÔ™Ù+æ K»æÕ@ÏßÓ÷Jg ª¢N Ð6é¹ÚÀ¦ï8ÜøÏR©ºž*|g:g±ºÉ늪‹iþC‹iºp ÌÊ"ã5Ï¡=]Wk_1µjÞ7§áíä+›‹«ÚcüãQ/øú,c>0ãx[Ô$åcÒ'í{®0ú‚5ö~ƒÜÛtÌuó€sÕÁš07V ÑÖ{Z²t…C_6Ò1‡žû.þZË?Y´™}²ç&»1Z¯q»evЋÉ 6ÑdÌY)Ÿ~…|Ž¢è…ßwĶŸÒ÷Ï[ìÅg84Ûq®x:ã çx{N#?pÐõSǽ’þŽ|ê¬HÆØ¹Øúú L~®žÝ4¼vÛ—ÅÈõ¤Ç¸;L#zÞº‚¼Œ÷ïm#=ðA®Èä'dòcãÞö¸†ùßq9’åádtd´_kPºÙcájÛæßÑûþI˾»<Öù‚q­¸ ™üÊ1¯ë³mØJ»<÷j/Z9ih­Gôx'÷ý€ÜoªnÍJNè7¹jeѯ PßÿfsÉ´–^óN?tÕ¹ÕöþyÚ0WËÖþŘ×)!y}Ï â¿œÚ#àP“cqK…̉˅[6ï|=vQY€þ³?6Iÿn³ÀV –Ô”)šo5ºþ䈾焔ñq›n®Ô<̶'ˆD·™¸ŽF×K°Èø3øÓêv­|ç­#b¨ºþÈŠ þÉö]5Tá¬KÄ8À/kÑô®Ÿßñ“"'ÏŽoì„Y4¼îßYOÓQã^¾&ÛQÓƒ‡Å [Le;Ká<õ±Jõ]ë/°xdÑtêH¯÷G§z½o|¹×{ýl¯?oÚ‡ðg‘hЩe÷§>èÆÅëW6h³‹z³W£d3Lîê>7_zaµ|F»±ñÂëëK“òíÂÕ?y¡œóÊ¥U›º²Iƒ ‡€é?èÂgx]>£¬[ôn9´Õf_U†¥Ä Ðÿ˜VtýçtÎBG×n\Ü(²8ÙÞˆš¼Ãò¥8Í¡OÍæþe†#)¿ÍBiostrings/data/srPhiX174.rda0000644000126300012640000011156712227063315017346 0ustar00biocbuildphs_compbio‹ì½g€#Ç•&ˆK$Hi$4N£1-C‰”¨)oH©’‘@"‘ÈD HPUì.v—X]Õ¬ª¦‘÷–å5»{{;³3{{Þìž÷Þ{oö¼÷·ç÷ævz¿÷Âdd"3ÔÌìÎFwT¡‰0/Þ÷\¼ˆœVï¸kuW§ÓévºøÕ½ ow»ø±Óé¼òNü¾ó©ñÕÃÕï}Wgç¶×T.¾ôàèàÚÁñùâ¹ëøó•Ö¥;秇ÇW*ߨ½~rrTSÓÏ^ìèðìo_-?îüÊï¡üR§óo]çkýÊs*•WŸ®åmWó—·è™^× )]¢?†ÿ+HZj(-¬+µ¤[.sÕv )‹‘æ™gùÄÚ&ØÐo™g«(‰À`…dÅ¿" "D$‚Q*¢ –«™ãÜÀÌÌf¦†‘ÐÅ`Œw¾êK-û«—…³²äÍhHK‘k~Yçõ3h°C“#ïOÍtîÇyHXÃ1U )~3ÈŸ< ƒ$›-’ïE˜€8ƒ Åk D „ü²%9ˆÓbž¼].S±´(G}Z–¡D½6i«£šiºñ¬º»Ôõ Šå8¢ K­úÔ¤3W²Òoý—ndMõnÖ2eéƪÃË—zR6¯5Ó*€,t_Åœgcnø%Ï+ÝU=Á˜,8ÚXZýÑÐhªzD iÍòe¡¯”†Œ™4^èKõÕ&ˆù#câ¼bø1§> ’êÄ•y?cºyÏs]oÊÎø3b6pX’tÉ—é<ל)ébD¡Ôü˜€h¢årU€°-àçÆjX/šF6e„Ƚ©ênn$™ÝQúAß]A¤¬ð ñ3c#DœBóˆ4i"ð*h·a¾€†„ɱ-Ö‘2‚X߀ñ‘ð- š )§m¸–›šÑ,¦bj[jò&’:ÜNʰ^.#ÃO l’p‡–ËyžÍ½Üè5Òº¾ )ÆïrKÖåöT'¶Xæ¨5U“6Æ$§V!dRÆò:‹÷ÒXÄQšMfiOf‘€2ŸÄ†p%e“)êæé–a‘±*·ç 1ݵÆl(Çó3c­f‹oiõ,dïk4unÝãi¶,¬Ä›´y^X‡•WRÒöõ÷°*·Ìo¾Å'§ Èi¨ìº&U3ã™(Ë…Ú;™íé5Y­Ä*KxÆ‚4IR1„ ±¢‰Äb`ÄÓwÄÙd(DêÅI"F‰X—_ö`óÀ£®,Ì¥rW4üR›ë¥ÔÉLó^kÑL†µ¯îšYFuèUˆÃús¬ÝkzVOf ó¢2›B•Í-Ϩú ó%Ë—žq û‚wõhE˜„º/TØÈò2žÀ(ŽÉ…*èZ?‹Ë¦DÍcHs‰ÿØ£Àƒ•û‰?£Œ»Qƒ?ŸÄY4¾Ç/Z¢AŒ½BÖ»!çSªpPên™,ܰB¬pAÛ —%?¼ÅR˨:&'¬ÒYœgÔ& ;Oc”4ÀÃqzþNÃ*òг\–äKµ¿)‰Ì·ý`—t¬Š#ú«’R©ò:“,äá€\ÝÌèu ~aÞ0 ¸%Ž'ø$Ö¦TU©Ú0!‚g8Ì’ˆ§<~g¾—©Њdè“,Ÿ¯-û&—&›7ìê#gôJ²átLƒ¤ð9a$ ¸Á@ÊqpÕ„eE t3Ó‘ØHG™ï§™†0Fƒ,ÓA\ÈÓ²æ0„2N Ú-'ÒJ b‚éLÓtdqœLÒÁp:Ã$*Xr½°'b¾Çrwž[üb\†øb¾ç3ê” óâÊ$@;z4O!Ü}ê%©3=Ãp4E·C¸»©ˆ'dœD…´¬Èo‘³zó3”g’/˜ÜKl,oÉô=Y ñ”•ªE„¬#€Gðö"鑬Ùe[,&J'ùÜ]ð}n¢ ŒŒ dÄ~òÃ¥þO¯æDº\.½~¥b.½å…Þ‹¹jçɈé2·68*WZ5F^qC®æ!#‘Á±ä˜î*B4kÍéÎ1¶—l4“‹2åL'“‰²Ð‡ !T º!…8‡ý øÇÉ ›$Q ¦šzÓÁ(ÅñÈïVw9Ê#í¦?k¥{íµ †¾—­¦‘¨!õƒLü$–V¿HCRŸ£u!™ñ#¢ÙOÈy$è1Ë â*R¾‚Ñæi6¥ˆsÄ~’*è ¯ kÃŽ†ÃY†,3ex¬VÉtÅ^D÷AÀ? úɲ®?ÒÔ5Á‡Ì¬(šºÂ¨Ria+>†€§6ÒÐ"ßFq—')FEÁp&’ èîæ‘E¥¸¢Çñ¥*tžRŠçGqÁN pâ‚ 1ª9•_dZ/þ à÷åÄ$Sßóü¹HG´RB¶³ñö)úŒÐ÷þ4Š¢i”ŒlîVö,®‚°Åü·i[ÔÔÌǽ¾”.‹Š):e;Õ›ËÈH(![µ¤’Tª¿15êëõFKSk©+TØÏR¸ÒiºJ“xGðcÓ`„W4Á ˆƒ½~ »ýÊË[Ö`>W{y”0 Èá0d©ð.­ Í–»?÷E] eqgKi¾Ô†ýŽ<ŠHŽ"xÀ£}šH>Tk:Q`°ÚVŠñ²UC| †Ã þˆ3II»šÞ˜»ÇZ¢t-ÔKÔÌ–Ž(›»”ÁjÍWaR¶839 Œ€4Haf§ã,,„%S'+¦1P^÷¬äøWÕ0yÿBg‹¾»Ö¦Hý’šg}C €$Z)xœEä)¦£á,Œ"ZÂ6|—¯UâŠZ|Ó‡ÏBUÛ5Ìg.¨Z²ãHQ%|1Œ^2 †"ðFüýÂÖ]òê’‚p˜dõΗÆÅÍYµƒ‰¤#à{%eS~©Ãcò’Åöã(™Áh/iyø³_CªKÃYÛ¨bœ‹Ìj‰O›J[%2…ƒå<…“¼0Qi(”–("¹&À| Uë§*}‹âÙ´žê“·Ù§™ŒÇù¿ú{Qß6êªÖ‰ h[J›‡&:N¯QfY8¹š{æ£@¨WÌ «=LlÛ8_ÎçÙržÍ3oœçÙ >}ÃTLfy‘‚—[*‡k7rSÓÃáË7:XãÍ#ò÷2ÁÑR– jð1e‚¤)¤Â~)†­j'2.áLåy‰nÒ(²0’d0›,ô=ô…¾„ÇÁ£=¯@£´ïçƒÒš“Ȧ´âID:“¼Ô̧x^î/lÕ0I µÃ$J¢h*£¤ÁxÿGý¨hG M¦T€Ž™æÒY.,ý\(éò€é*f‚.ØI›P D#DI’zžYkj*Ô‹,ÕO‘˜ª¹H´ÃVAŸ"9"…‘ü€r•rÛÛ(f ÍÆ)-¿¥y–‹˜Ì®™-£ÔºoHÖ.lÞ˜%E9>8¡’D$ОÅO\lGL1 G(sé.›ž°2†›oó¼ð”2ª˜M_:Õ%àh®\ÌŽ?Ô_¿°L˜`ÐÐq:cRÃI˜Æ1üa9Qcnl¬,pO™J©ÙåTË1CÖó Òn¾” æKsŽ~DK™÷&"7[ê§„#Ài ìÃcÆU°^ÌÑÈ¡Äâqy~â…!¸r5œ¤_®DS‘ÉuOr…v…y;I Rò‚I˜öc÷Â÷ËÃ\³¥ràMîU!ŸTr‹YŒÉ ²” Ñ…6*hui¼ðE%õ&d*£Þõ@Pлz|9$ ò†ëBOç2Ÿ'CpŽå]¦#ë–Ú;ZB.…çcâ•B+@߈UB›_LðJ¦i6¥i[QÞçe­^ŠÉZA™LG^<'ýÙ(/¸»jïg¼ EQ×BÌ-Œå0‹a¼k³Ã9'r-KæeÃ8õ O).ËžMY¾ÔP @AЉbƒi8gн@$ýQXÍk½;NöÊ“äÝEP¶ñ86ÔÆ4erolªu©°èTkS‘O¬ÔDÍ•×æ5:”£qeò ¼ëÞ‹O‰q‘(†%A[¬¾éWRh#«!5ò8¥0³¼äÍž°ÏÌ ¬sÛ™#q”‘žðäšé¢Ð4øc,UÄk,¹Î0Á\VOZ¯1£$ŽñèrÝ[ÊdÈxÚ¤¬ÆišLãl4WpÖ1+Ì QœL‚8˜Æ³h4Òͬm½™·‚l™Â)/ˆÅ?¥^™±Ilâ‡të©>ßÄhñDhìTº È…³æÝÚžj›¾‰n ÔY›/„¡Èû#уDôý(gŽ’ÈLcá†ÛÈÞJ‚…1cÕmf5ÑS‹ÂÅk±ÖZ”ÃâÜ—ùÜ,1M/Ë6¾Šs*k<×Ód¿|ÒÔ[¡MJ\ÉS!}FIþæÔ¢Ñ(Èâ¾ç‰("¿Qó\uštRÉ"7³XŠ…y'l–Ì•RºLGðaVÄb“5,d¨šÖ{’ÝJ(Ù'Ž¢Q0Œú{†ökRvä–^¡—§B¥„¤Ô3Neœ£Â’5VP$ÏÐÂË4ä ’Kf2mzœŒÐ)ÊŽƒø¡ 4åà M`ù{¬6Qʨ%]ÁY(ø¥Z¡QÆNK—Ö¨Èk‚¡Üœkbuëµ5éb¡´J.kr™´Ðmxreˆã4úµ6s“1³Ld]äî‚´ÍeO‰ ¼ Ì`Œ$2/Òã,²‘Ý•,HÇ/è‹>¡ÑL1%BîÌ ,*ÎЂÁjÅ„œi„K™‰ U’Z%ÁxˆS?ÆQ’‰Ñ¯¹4ÐEér µHÛÞ2 ¦–y¹æ‰ê¢*7^sÒ÷y¥Ð×)xÒP¢ªHP.e•‹ ˆìKݪ'¡Â˧–5'ey°™*´@K€"­++(3ßxšðràÄ‹„Ƴuƒj¢2#òÐv¥•Áœð;^Ø`䘅ðcØ'bsçÒaM¢DPÀ4¡„:±!œ ‹ÆýiFáÛ8aÊûIù&Å8@/FƒA:Š Yhˉå;±qðqˆ2Ó2à|O‘r-¤m½(v¹J¯bìyþtj›æk+\Ä™ ã<Ò/˜É)\†@%iðîÃ(braÓn¦ú*«‰A»5í 5Ü­Œ7ùŽÕ–kë˜tCfùl±˜Qw§Þ|Ï¥$b…lÉ'b{sdd»G#8æê}O¦öN$w’Ÿ9H´«†“nt,\A!ÕéÝ„ÿ`?€Ö4Ç3Úd°§ånQQVÈ„aÌR3μÏ"nýÔ£ F"b—®ýž´tYI0#È$RÈ=/€†~h–«ðeÊ«ü wŠ;±\®•0Zr"AšÎaèÏé`èœ Ê ™äú¼ž’®Q{˜|†libDƒ¥Ï8ª!waj ¿}ÝÔã¡qbP ß×ÜT4‘Dö1a›–›]¾¯|rµM ¤_1o4H£4öÉ ,ÀòDyfÈêŒÃ*¼àR4±‹.õðã¼<ŠpŠgK%Âs,­…T¶` Ðåž‹]  »KÃØ÷øp (b(µYYª¯õ4Dc®Uî§b el6þ°Ó52‡¼#Ý©’_¦Z¢À²hir¡¢2e͸=•շ̵\·Mâòkì‹B.oØdr¹[87F±Ð˰2ƒt-„ >â¶hË~S4 <÷ ÜKQû«a‹i(ÃT$”ŒJ‰È,b¹tD¹Ï&ŽaU’åÖ¯,$L|^§ox;¬Q6ëÒ=å-$ÖjŒœFŽÖ™ÄM±sÄe-·ËZ©21€3s8/@Æm-ÖZ¸äÊK(fmĶ„Ê4+^zSnôñdk<ã$kÓŒ—ŒӼ < q G´¯~’BVEƒÈÐ^VÂC.\ž‰ÐIyŽÈxY,Æ3ã¦e:H…‚S™‡ ±ÖNVnH'6ÍΖ\sÛz3„"Gš7,·R7oát¬b–yá%/ÖV¸Ž‚}^ìÃXõË=X¼Œ—©—.—ƒh>HÇÓqªÔfIQH¢HÓnœ–â7:5&×é¬#}¡®"‘–ŸBÓ˜D¦Ù+Tpƒ—9åÙ ‰´`)S-ZJñx©JZÚüÓ«õ3ïê4aªÏázþÖ¹%5ÕÈ)Y1HŽ#N˜òîêlÂ! ´Âçé-ÖU”Ðé²7¾¥Ì° cå™6äÍ ÏÜ·«‘¤UR¦` î+XJö£H÷rŽÎe‡w».Ⱦ\, #Bî' í]ض‹ZzmØÞÅÂ+ÉžÚ‚Qd$ýq&ýµœ·'‹#uJêæ}æ÷4¸÷‘/LF²% 5´ùOñÂ7xdI’z›8y”[µÈ»5äÉ͋ڵÜt&ìÕýuåµHd¬XáÚ¨òk)CÖ² s‡¤?Cà1ÿêCͨ­"¤êábŽ ¨$ž‹{¤«ÊÁ½²hQ¯é1¼rBd2Ê’ NFQ2JcXC“À‹FÓ`ÔEÑoúº†B)%r‘œûÌ&zÑÌZØäãqÅÒ¥ãáð*öÂ\ãwSöÎMs›ë,qX¼da“ú<Ã2®5lH›¯ç†l:õ*Tß^¬-È—ŽUéSÅg43Q'øÊ$àûD{€=¥GÓˆÓJƒþ³£ñ/öROøƒêI…F.èÓKhÂfý\§ºX#ž–áHĤø<1“÷gª«)õÄGûCAQ‡h8 Ý8b”$Æ~,°6æw¡‡U‘›ã"™Â§Tíï©Gž¨8¸µ~TbÖ¢ n$9{1¯“hƒK…W´ š™È©n¥&d‘écAŠj¬‹>¥ Æcˆ‘edÛ÷Y*ðU,½#kG'w¨Ñ¬å9·j ÅÈòxZ¢‡ –r‚$-™‰±ðÆ))Á–«ä]ËP-^2YÛ“[ 6ĆLHHÉUÊóÁ|)³˜OöÂ6õS° ù…'hNµ CûiOü`žo #tÂ×ã(‹ÁÇt¼Ñ( =!W¹Y§hµ…ÏÕve k˜>L¥¥ …™>UÁ8â“¶40 ºÍ4‘µòSv‡:MRçåó御ÑïùSÚMŸ­’dEãå#س&b˜‰ …¡0Cm¦ªá$*ž-ÏSQ ¿|²í"‚C:Ÿ“W:ŸÇó9š€ê ⹯‡bÝDLá:¨Ì ïs´Lˆtlºw:DW¼4ô‡±ð|Q{ ^Ûâ!Ñ¢èJJ&ú¢ÃØŠG‰ŸŠ˜–°}a¡YFS±)ŒƒÚŠ-)Ž‘ H|@ŸìyÞ`PöÕè'[ ©Ìí¢u’ñrY0¦&œ,üXйÎfZгÜd†sˆ+c=Â'Ò&´©G;‘c8|p[|O¯7&Úà[ºýò¿üLÍíí’û_ä×‹ÔØ)OÒ,WgYÍ}¿ˆÉùÒN 8{s&h')3”‘«„µ…>¡2K^ØD¿íÛè_/E¹Ö¿…[Äžéw±§³2Æoäó[Þ¼h™@–"Œ›´`(ÌjÝ”²í™`aQ·DÛ±C‘vØ€†J–Â" áN xµp32’¾éq¬:VûœtD‰ìÛ‰'hç–ˆìõQžh9Ù~nÑÅ6âµÛÂMÒKý)ÇVÆÓ­êL)†—ñªá‘t~H{¾³ÑD Y4@õY¢Œ4ì/*‘ŸvÌ8Âî ²ŠôN VÔT.uê&%7‹}4s?/¶(ÊÆ+SÛô¢™Q™îF­O’ÒÝ5ÂA¿ÊVJ14‘ʇ•ôÏòÜÄ2´õR¬ãÂÇíçÞ¸XÌ*MÐRò’ú€·r†¼›r¸ÒŒÖ3âl6µÅÊ16§>ó.Ô³¹MŒiËlYÂÑ–Dub”ýr’ûKKšVµt"'̳\‰2ó²s8#wI¹ìfºµ fÚô9¡Rc‹¼ºáž7ÚËý¹é‰JÆÐSœs6·Na·¨Œr…˜ó'cŸN€!—Í UJ¦“å†þòÎÂÚŠèXt9Ͷx·ã2»?  Sc ”MœDÊù¹Ùc@?)͉—†£NïUT (g•L‹xO„”¯¦0ğ˳"⽄3~Çy˜Íó‚gÍÖÙcêI0fÔªI³Z…d ÓÎ7ˆœ•ŠYÅðƒÃT®£øTùQà­ îÍshk$^$£KFL­7'ÞrVÞq²®òZÄ3I¾NhÏAÀ„ס€…<‡PÛÅkrÀ­IÒ¿§^1…L“ˆV`OѾð¬»4N}X³“Œ&e· _Ær+tœÇ¡µ?¯±ÝÝ0¢“+´ªF2Ñ=ÈdX–HUtE ËAuЙbS֕ئ¾Í–Rs«’e,Þ2rWN€¢ç¸t"ƒ–:ZWû"Œu°Ðx[ µšÝsuæùó©ßgó“ôU¤ó¥™Äð SJ4jj¡¬ %¸yQÒ£t3¿È%¦™dO¬¤µrx•)¡ ?f¯$£3&¨¡@f¯ÙÌG=Á˜vZÂ@AfBȃ+µ­PGž-?ÔIJ:#‚É¢,Bá|meP-‰Ã–ù|™ÍáWâeO癎,”—•ç|ŠæŒBåM=Kmr3EŸ|#•Nì s:é$ʬ¼Aã–K¨i8öyð¼†_šÅ¾ì…ŸkGL2XÎ1<…¢D§´Á —Úµ|!Òb?o!X¼—«A©×”²—üRh‰€Ï ódÇŸª¥7yu-ém´ðã‰G9+´lº4lY4cqƒÇ¼+O]•ˆÊ×%-Ç3·çx­seþ;|‡c%&ÈfLg}2Zè2 FV°ieæ•+Sg©r”€ÏXJ‡´µ @…“HxA¢æ‡;.E:åÌí•ûË«Ê àa\±‚ì!-õÙxQ ‡g27&×l‡I\Ñ¡t ûæ^”%|xùÓ!¼ÏˆVù"•O›²àÑq4­?È(>¦å}Ï~&ȆM&ä,ìM‰ŒB ù‹½|6“£ö‹)ÜT°PÂ¥]6òm¦Ó&Ì\ ½àkf¼ò’ÀÓ]-]â :ÅÒ9ºŠ \Ë—,ÑÛùôUiάúg2ñ•ϲY³©Áõ‘Ká’é ¦ý2©§Ï7å Ñj$øð.Zãóˆù„/©µ$›\ÊÏšËÚÞæC±‘Q6»HI¯Œ¥l‘E%s»E˜ù2AÀ£óÔI¨U¡j¿23IÄâã\ê<ÓRÛý\ñ¨å”r>UXdé3ë.Õ4ÍV~Mû2{Ѳf‹‹ò¸|Á'®Ѝs+8s¿çzK¥ïËÈpćgÈó3(Éc†³`G ûEaeÈhæ{s:7Ïæ¹âeü¬Ë ½3÷q΄‚(Aî^T‹Ôk­ªbeCÓÖQÚÝ’„l N‹ýI'­ÃÔK€Æ@¯G¨ž$fé”Ðâ $]$Ë yV"GM¦‹™ã€CÕ£¡ÌÓ£fó…^²…¯œÇµ%NٜƯ…Èg2NàE:Iñ\ùÜÅ+fC ß)Ï^³ô§¶· «Á8Pé·à®bVšÆ39Õ3½Õ•vcZ–T$lOñÀÚŵÒçAèŸ:Ô¹b†!Ow˜ “ 8õ"HÌÇ{ÿs3kí!ÑXiåÅ`¬¾P O½Í£"RakµÌ ¯YÇàÖçz¨õOÊ=—É”ñƒgb’OÒ8@oƒLn)õ(·£¥ã\c'—Æå|"/ò˜rÃæêa´MKn åÚ‘/¼”SF(k9ÃDº˜IA|ÕmÍ›zZo÷.ì`ÓUzEP{þ2Mýx©Ï^äU[Œ‚F”lIÛQ(„±à% ¬òhFˆ'ñ:©?Xñ3=–¶‰¢ÔLñ.s¹ì/_‘íTÊb¥OrxÂzãBÕ“°«ªRt6šB!Ã:ɦÓQB©[0öžç‰¡'­°dWJjѨBøŸEeu*æži¤ñ ïË1–“КÄ^nÌŠäW#?¥#q²(LÌé. 葯PÓèhQ‡¥©–Ôƒ‘Sl1“ö±äFÖq¾÷B¦ŠÜæ¼¼äOÃBGT`¯¹ÍR&šSÔŽ, †œ®T®öH„b4šB“™4œˆá >ØŸ³«¼6O¬V+Î0Mhá"%+qD‡… N8Ãt/е0H°ûËî–1Þ+rÌÖÚÊá—´G¦ôL3´l)-„R=V‰<‘̓Q—Añùì« +­^Ù«©3{‡ !4ÏåÑQþ\Ȩñ óµ½òÌi·lŠRCzVäóIdŽÖjƬ^Ò!1{µ³4à$» )&iyŽ:7+ãÓ-”åhxžöyÖ˜¨&˜3Èg×7Ä!Ô¯8{ª²ýBQÌNEqøÜ›C”½[H õËôŽðÊ°í ‘í¢qŸf¹<‹Jî«e~)hG«oÆrAž‘Ÿ'|¸¡4‚†|ÒaÖï{Ù$qnh X7Ò¹x‘P |Þ0¦#'æA:"žñæs/×és†1+¹j‹\ðmXA«‰Y¦\áD?ÁÑ6ssÉ(™”½‘0+Ëjš-ÚSÊ>º²˜éàJ¡P2õÔ„ªñ<¡¨k|¬rƒ¼‚º NwUv¼Håv»4†Ž eE” úöV¸­ÐO³ŠœÍq‰4´ø©ÎN\è}-TIlöd _p®ÔˆE:ûE&¬Š[Ô©}¾/|zrÜŠ¾±ckü'n-ŸÖ][31VP¡­N©0ä-„‡t_ÕCÆcmàè®fgv%þRóB®ÍHºA/;Ðk2…›kf§j{«îFv¼®4(EãYn˜ÎA$x8Cd†û#3é͸ͺåQ2r¬·¢­7éÆIòY´lH²Lö8S)z½‚™6N±§ŸÇá<œkÚÓ+Ûè(§&ÈÄ15‘²á˜ª°þHF#ÚH,—ÉeÁ„ìÌéP èþép (NSžÆR^¥6‹…gh¦ÙAÒwƒuX¡)»š/¤¿É‚œMÙ~)éˆêk2ðépý'?ê re1Öi‹ž d®2õl€•Üi ó(jJ'Ž ÄpÄÇ»èg”È8A’Š͆ƒQJÏâê%=Õh¤„gzD>h >À*•T¦ Œ²L1…ãB9‰¹1éL]Ù ˜%ñ@žÔÒzеÍ0åùÔlY#ë컌á©[füLZe–èÔJ¬t²ˆX‰¤¯Ž_‰â$N Ž¼‘‚òZ˜›ÌE:ÝK?ºèj:»ƒ= p{ñÒò±ì‰LäìŒ9=Z÷Øü&•'n ³h)WXú< *óÇÛÆ¬0G1çy¶ät†%»•+rÑh’½L”N2 íQƒDŸ8AÈ­ê| 7Ñ+†6ž:I7Š’Q€ÿ~Da…^ä…ô€Ø\ã~n/ÈPþ†:%—.%ï(d¾ÜráÍèlAXvóyÙ‚ßDXh…fqŒ ÑÓkÌ‘6}S©Ž¥þ!ÄriöS±j¤·sμ–¹zèk³©a—,Q^()=u‹ðâñJoK†ûùø—B6ë§/ÕTQžªôíÕPeo…Å…±+=Îæôú´ò‘0 E¸Šùy³YC*ᑦÍÉh0 ZnÅ5¼Ìc¹ÖNö®<4%A:x‚ŸxÐú'WcHk*’Yû*‘͘VSc½:χdp_W`?ñäex˜÷UÅ"C˜‡ÙÐ !¾ý8 †ƒÀ3N‹…4¹ÜnI}Ù,CñæÛvH÷eÂqH¼íÒÜKüŒ‚"6¬êŪ¥x*ó$¹]^²‘‹jÄꄊuʳÕjTžàç™åƒ|†T^vÄx¿2¾½´-EIË8©q*±Šéñ›Ã £c)å/Ù›ÑòRø¦ü[gîcД+âËçFÆ jzò(? F®'†0M qÉh2ÒÑc–xüžï‘8õæ’æäÿX >½?•iᤳB¤'ÚT<ZÀôJ碭˄áKž/ùd2ÉW” G¤ØfÙϱ>=+Æ‹“)þÕ('KbÙ^ÌòsÚÎI..=¨Oå£ÖYFÏšŒñ0òÅñ#¹ÚvÄa-!¸fR¶’T+ Í~îÃHa ®b¡ƒ$ÓÁIÃeG×#ÒÄïøÜ[N«œA¥aùéÅ2šçÅ2y†Œ­Ü§¸Ó¢°Úô0Ñ>b†÷vM=¿ÄÝë¼¼ÃLÁr-[6_©Ha/E —§wË,Õ‚‡ ž+›çV4hm¡ôà”ÎÈÃ³ÍÆRG™J®ž$|ðp@º‘£Í°Ÿ"¹?f;è;òRØ¿¤HŒí'ÅfÀGlŠyc:C‡&ošžÚéxïð]°x0=ÔÑÂ<ô“A~¬LÆbLŠÒâ‚ăWô´z:®ÇÅÅ4jú„È£T‰_¬¾®y=˜Ä¥1¥Q”úƒè’]MšÊä ΖƤ㻹öF⇞~'¼TxÂ,¸[¼k @¢†E¯ú-äÒ5j¡“éq"7×ñ>‘y¾ 3œû„UyaœçF¶¬UÝ*+F“ö¨0ùÞ|£lq N‡kâO5ñs®z=€rcLgžï›ä.‹g4ç«ðã|¹È%ÒIæCôÀš¡'E錎}£¡¬y ‡ZQÉdÄøSöV pä)Œäå'c­£å4Ùž‚>X’­Kú§÷ñ »ü›“]£€Ök•DÕ'Bª”Ì+AŠZFÏ­ýýÌ»ñX>>Cžªª]ÛÆô壑Ç)ò(*FuÔµÿ€®W¾la–YH÷H›d¬I_\®Ë^ËGRxòð¯ñXèåM-èŠ9Wôó¤^Ò{8$k•œ=^å ÿ‰¶”¨Gƒ1õ"êŒû8R“¼†SÕþpÄpÚ£YDÏ$&_‘d+_\‘xа`oOx”@õ ýH)oƒ4ÑÃz†ðú&’#^_Z…äQðÓ2o /Ñ <8Ÿ/Ì„~Þg…þé$®`{¤a–&´¼B-ê§þa,¥ó°òâhÚTH6då‰QL¼Lòi`)ü´`ï²NZ vZª˜8‚˜PRQ`BûÑÈ=ÚK ¬¢šGõ¥ÙZ3Õúؾ<×Éç1o¸â#+§tÜÇ8äG±çö™ñòÅùÏ3ÒÅVÚg…O¤½MÁ†Õ”ÿÑ’‹н=˜ö•ô+’]TF$|"AÏÇ ÓuL¬HIúÌ É„weý,J(òô®{Ú$§£¡6š’Ü<‘¶ìX>WÁÚl,ÕÒ æöFm­£}µsqB¹³:À²(yi.8?L2ÏÆþ0ÚôÓ>³™?zÉgosˈù‰tYƧéÒVŸ1¤TîÛ])6¬é.ÁBï©ÆÖöЀŽRÓ¹ýE4š_ÙÚ H0J”YæFBiŽ’)ÔžXŠØYamöägjKçØ§D¯Ng·Ûétv:Wމ߯½xtxüäcç']Ú¿tõàòc'âàÒùcG‡gç¸üjykg·#_ÕßIýîªêî¸vp~õäòÞÒŸ·¿ãâ÷_¼ï~OUö«ê½UJýyÉÁñÓ‡§øð%øã/v:wÝ´/>sõàô`³†Ÿ¶”Z~ÙÅÃãÃsÿàøàôð®Ý†!ܬÜsÇÅ“o·ré¶‹/ʹöÛ­K;Ÿ’*}Ø}ðmêS3º§÷nÔÜúгóýãËû§—Mçø–WZ·ÜE}?Ü?:ü¤Mž6Ÿ¨ùtçu5ÞyxùàøüðÒþQÍÅ—\:Ú?;“^u³ÜØ/Þ”ï_~³S¦·ºþÊ›ÅûŸÕïM/=½YÓ«nnÖRóÍGÔµŸ³Ú·æ•‡Û¯£Ù£ÊOIñgäU.ªâ×Tˆ`²¶Áî›ÞTG×ó‹Çûu®íŸ_ºZ釾ø3Þ?;¼Ô§998k›þ‡ªùôö£ƒã+çvåú»Õ6 ° â3û§Ç‡ÇWj.õ®œŸ<{®ùOñ. ‰áµÃ³3|íÂõýKOî_9¸pvtr~áž»Ïî½px|AÊ£ 'O\`¦»ðú»Ï^á}ëáñ'ö/_>¸|oM«/U· TX?QuœR‚õí—O®íãÝ]ôéç;üªãÄ:ŽÝEk§ç7Nkø¾îîݳó“ëÅçoÐ=±‰›‚á‚”Íd—/ì7P÷ðøìü`ÿ2}z~õ÷?uãð÷·Ô±èõ}|«™%ªö.í_?;¨ô¶{ß…íæçî›53R¡ÕýÚŠÒM»ª-­~ª ï®››÷*àüÚõÎÎm¯©ª4âç3õÎ&%ŽÏÁ`M×ï€6<¿ÁRø.E¨ê-w^?=9?9îúÍI;Q†;ÕÖ b/ž?×é¥VÎ.C±sß.ÜsíÆÙù…Ç.ì_xœ¬UÙÉ)>P"O}téäÚã²=ëÆƒ³{­‘XÄiUMør#A›Ø…ì—Ê5­šî·Z~™…ýmf½°Áï©ù°ûéO×3È#•AÛM½N]{¨aŠÕªç×êØþŽl<_¤^Ø^M­xÛ'§Òv/YÕ|yc2à\ êü”—ê90—Ûۓ]ÓlZ±Íœ,?‹NË“š¸ðÌþÙ…'Nn_ÆÏÓ ,iK¦“DÂõƒK‡OÀ{⯔­«¢ë6*¾}ÙùÕÃ3 ó⾡=Ô*ÚkHSÇZ³šï4y5ìØ2ÍWëß²?e´ì•x¿ÝÙm}Í;ž1Þ¼º)¾ÙRq¥¢®PKúJ'~j©?éàørEd×MHí×_~x–Ij ¬YR¬Ú^ïBÂäÚÉéø›ü†ãƒ ×Oà¶=~t ˜›à@¼o„ÿ.Ü`·Ž¹þt×Nå— ¢:¸­L{}_gsÚÜëˆÆÐfÌ\ö`ÝÌì\ªùpWFÚʃjу-¬Xk\½äØm75¡nn½ïW‡Ôh#5h$§„ `?qtx霸ŵ›3qKRö†%x¯‘ÕQuLªn;ù¯I˜Ü~];yÝv*kyvÿÜ9¨a¬ûÕï¤E~  o¨¯lí@4rL©†tw\QaÁ¢ÔVyª¬a‘†*|«Š‘õ~+›k ÌÏ«íØ#üYf+ãÓHkc[­òÒ«û5ù¬¯ÄU2ª_.¾§›«Ó--Ø}tK™§ï4pEbÝ»®ÊSî¸~Ò V7†|»¹Ó °ý㲋¸¬ã²»öÏÏO¿q®ïü¨«Ó%ùühñáÇkpöX…ZúžR#5 T‡ÿ1«ž¤æ»ÛHå:T´¶U‡–ŸV`2YÃC‡É.6à3‡çWõŽæ–Làû.`†ØVŸY"_ÅϬØ$L†sòë¢ÛŽüEÉø1Z~üTT|¦b‰|ÈÔº¿fþÿ ,¯mt[UI|¨N´ ŠA6_¯Z6êþIõþÃâbaûŸ<õØþщ^«xh‹‡Ög¯½i}¿/µH€©õ½¨R—ËiµVîÎ*µ¹ã™[ë¬W€¹Îb;¼¸aÀ÷……3mo!Œ¹Zë[¶Ø~¢¥†«Vg÷k>»Pý¬5j×ÖÅÝË7®[³!^çèo1a6ð6´Ñ<žÃ 罋üqõû•:ú6íë/VB=Ͳ[6¬Æ¥§§`´£ç¤4‚ȺÞßá1\¼ÃóƒË÷^Ø×²K›ögR'@P™»lIVªÞêu·ˆð¹Fn+É^$·ý|u¦¶ð=¯6ØUv7Ü»_™½«Õv_Ì ÞgMš +ÐÜ8Öó&¯ßC7T"ª[ÓÓ¡ ¶õÃÿ6ù”Bë*Ç¥Fcµº2w\>¹訦›¥¥¸ns`j­ùb5e»[¢}‹RhuT¢6Yù3—®\zrÓ·© BÝux¶ï´P×”8®é½ýÙØz4|nGÖêÄ·Ž6ýzÍpíQhÿy£ÏÖý¯³îíû»• ‘)öh>µ×Qޝpøíü„ÖQJ¡7² ÷q…Ü·^oa9}|Âv»^ey1«+h˜n«x[!ó+ÛvN…嚦\›1M}Ýôæ>æpÿ5¡ÈMK‘˜ÑƒkЪ˜¬K'7Ž.ól]{üðÊ“g÷~àþ>?§êÉ…gž¸q|‰u§©õž{éÚþÓ'‡—/œŸžÜs\lç>zÿä–ò‡>;ª#•Sèm¡,þð2·_¯ª~b]H·nì.ÿ²Õ.Xï7èèsjÕ)×W‘ûÇÏ× ·ëmÂg[óá #BŒ<{ù„åÎ¥Ø~g×OŽ/·±…ÈþÀ…»-*ßS§n¿œÜ8±“„ö+ÿiG2éÞ›•‰D¿ÒnÙ³ÞÜžím}ÓÝgà}×/«ëm¡{+ªpjmÒèøõYK%g77¿÷¶-¾W¸—Ç׊«ËmÈ ®koç’õËÕ–·i†¯Ò‹ªlÓ=8*³ÎÝÞf‰M‡aŸ®“2MéµöÍî݇Çw—+»Ñ@¢ÚPãî™II¼¿Ú©†Ì‘Eç§ÏE:šNWžQß<¯’§[¯ô.½)DlöàÍ"©¨Mˆ—ÃÎ΋L£WÊŠe7¯íŸŸ>«©»zºÿ\5cëÒQ(Õ,}ñÂF‚}^”ëûŸ>¸tN)*5Kæn,LÈ?o\“ÉÒ*íêþéþ%èO}ýÒɵëGºwŸ\1Wo;ÝF›²ÏR\åŒc*¶m ùV«aý÷Ñþñ•œû& oÎg?9&yj>‚#vz¼tý\7×ï2ïÞ©[‘‰ušÈ§7.ß8=h%®¬Â-v&™|/=û”‰*=¡ßQ6º•Ã!«}æêá‘iñôàúÁ¾ç«(V-á[Œ¡‘a^BMC™üÖùË[rÙíuÊy“‘檡÷t™M{­Ø¦Õ4¢Ò°Mâ¯V©Oؽ¨£=eö¦¯,«ÜP왨ÍżóìðÊñ¾dí-30é¶WÐm¿[ÓÓ;.NùþÎηU™è|ÿôÊÁù•!X…?Z´-._ÑNJÕ–6›lQomß^)§i`b€[wQïÊy¹b*;4Ù¯ªSÄw(îÙ¯pÂ Û ˆr¼Zj±§î…mÉüRÊ™}Äΰ¬ú¼:ÐómõûâÖ3HN&°&ؤëj 6}¤FŒÿðÅxªu« ¹éh¬ yíQmÍï·@³..P³N¬mž—«Õm‹öÛ S‹ËÏØÕtÛ—ä cÌwh‰ñc‡Ä(Ò >´I˜ŸØ„©Ù-jwå'V¥¯­~V·³¡C¿\ùîó óþòêkꚿȺÊÁšý3«õíÊ>-¸®œôUt8úó|}+–?Vé›}ï‹snlPë6²–6Úƒ^jIÖbÀý¦>Yu̧·;E7üBnûúý'ZðbÏîàeûºõ½:}º! Ò¥Zg!RÓ¯Ô|fú¿%¶f$ë»ÎØz|iÿ˜âç´vÓ°íöœ‘{h¥ÇúôòÉZïc^‘ ^Öþû*H_t"׋˜“ïm1'ß±>[V¿×PÿSu‚ä®Ë7®Ñ½I¯ÎøpRý5E-/r­â¬a­ÂàŸ¼YÓµßÛfMâÅì÷©ƒm™X…˜ƒÔµÐÜ–°÷Ë|LP¹ŠVŒËL]úy«B›àud­ëØ,I ÷ì‰ÃÓ³óÅáµê¾Íоn[è0³¿•Ì?SÛ]‹{ž©`+ÓåNª§âïT­Æßܦ¢—™ŠJ¾‡NUü­›–XcѾ»é6Ó©Ì>ODû{-ãÞfYç—­÷Ú€ûmkN~«¦Þº=fºa(íóùti£UmZýýýZêÿÎOIý&ïÖÞˆ`ºð ½“«äýŽÅôûÏT©d£¥Ó<Òß®Qª¿mÕMÃûã7êjÚŸ²ê­!¼®¢Äófu1‚“šj¯°]±i¸eðµÛco'ècª]ú³UT¨…$%f:¼lïj¬;rDVR–ËmúrÁæû§WnÈHôË«D¼kÿèhj‚EÖñ§—ªÛB³çmˈ!ÝúµŠ6°¢àtûu…¾JqÖ;á8~ñêNß¶ü5^)ª¥ÙËÅÕýÓƒËóýg‹ONŽš7žï_9hZx¸ýT^­9LåÊé çSÔßÍ;…®¾Un•[åV¹Un•[åV¹Un•[åV¹Un•[åV¹U~êR9Íö\nÿ´0oDñQ(ãÛ('Ê¿…òãòkPDy å‹(åŸGù;îËQ@Y <ƒòÇQþ”ÿ¬Ó¹í6”7¡ŒQŽP^@ùs(ÿÊÿ‹¶_‹ò!ÊÊDù2ÊŸEùQþgôñ•(ïDÉPžCùëPþ1”ÿ¢Ó¹ý%(÷ LPŽQ¾‡òw£ü{(ÿ_§sǯ¢ìQ¢7ÊWQþ&”åítz¯By7Ê åS(=Ê?ò_u:wÞò”)íˆCùÊß‹ò üÿÎ]¿Žò0å…£|åoAùWQþb§óÒŸCy/Êå3(¿‰òO¡ü7ÎË@ô—݇2C9EùÊßò¡ü¦áu(”+(ßDùÛPþu”ÿ£Óyù/ ¼å#(ŸCùÓ(ÿ Ê×é¼â¥(Q:å'(ÿ Ê,#u¯|Êååy”¿åßDù¿:Ÿý%”¢| å (¿ƒòÏ¡üΫÀ¯ºE <òÇPþa”ÿ´Óy5éÕw£ŒPžDùÊß…òo£ü?ÎÏý2ÊC(GùÊ߀ò/ üOÎÏ¿å()ʳ(åEùÏ;_ØEy3J€r å»(åßEùKÎ/þ ʇQGù Ê߈ò/¡ü/Î/ý,Ê»P–(ŸDù“(ÿ8ÊÙ鼿v”{QB””ï£ü=(ÿ>Êïv:¿ük(Êe”¯¡üÍ(ÿ ÊÿÖé¼öÕ(ïAF^ûi”?…òO¢ü×ίôPÞŠ¡<…òC”¿å?DùËί^@é£<ò ”¿å_Cùß;_ûy”÷¡<ŠòY”ßBù§QþÛNç×ïByJŒr†òc”å/ÈÜÅ ¯Gyå*Ê·Pþv”åÿìt^÷‹(@ù(ÊçQ~åŸEùï;׿ åí(s”(¿ò¡ü'΀ÿ7ÿoþßü¿øðÿàÿ Àÿÿ7ÿoþßü¿ø#ðÿFàÿnàÿnàÿnàÿnàÿnàÿnàÿnàÿMÀ?’ÿ&àÿMÀÿ›€ÿ7ÿoþßü¿ø3ðÿfàÿÍÀÿ›ÿ7ÿoþïßüßüßüßüßüßüß üß üß üß üß üß üß üß ü¿ø ðÿàÿ-Àÿ[€ÿ·ÿoþß ü¿ø+ðÿVàÿ­Àÿ[ÿ·ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿoþßü¿ øðÿ6àÿmÀÿÛ€ÿ‹ÀÿEàÿ"ðø¿ü_þ/ÿoþßü¿ø;ðÿvàÿíÀÿÛÿ·ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿ÷ÿÿÿÿÿÿÿÿïþßü¿øðÿàÿÀÿ;€Ú¾óNàÿÀÿ;ÿwÿïþß ü¿øðÿ.àÿ]Àÿ»€ÿwÿïþßü¿ø7ðÿnàÿÝÀÿ»ÿwÿïþßü¿øðÿàÿ=Àÿ{€ÿ÷ÿïþß ü¿ø/ðÿ^àÿ½Àÿ{ÿ÷ÿïþßü¿øðÿ>àÿ}Àÿû€ÿ÷ÿïþßü¿ø?ðÿ~àÿýÀÿûÿÿþ?üøÿðÿàÿÀÿÿÿþ?üøÿ ðÿAàÿAàÿAàÿAàÿAàÿAàÿAàÿAàÿAàÿ!àÿ!àÿ!àÿ!àÿ!àÿ!àÿ!àÿCÀÿ‡€ÿÿþ?üøÿðÿaàÿÃÀÿ‡ÿÿþ? üøÿ0ð¿üïÿ{Àÿð¿üïÿ{À¿ü{À¿ü{À¿ü{À¿ü? ü? ü? ü? ü? ü? ü?üäù>ðßþûÀøïÿ}à¿ü€ÿð?þÀÿøÿàÿàÿàÿàÿàÿàÿàÿàüÿ!ð?þ‡ÀÿøÿCàßþ}àßþ}àßþ}àßþGÀÿøÿ#àü€ÿð?þÇÀÿøÿcà üÿ1ðÿðÿðÿðÿà&žÿàüO€ÿ ðÿ!ðÿ!ðÿ!ðÿ!ð?þ§ÀÿøŸÿSà üOÿø€ÿø€ÿø€ÿøŸÿ3àüÏ€ÿð?þgÀÿ øÿøÿøÿøÿøO€ÿøO€ÿøO€ÿøŸÿsàüÏÿ9ð?þçÀÿøÀ¿þð/€ü à_ÿ àü/€ÿð¿þÀÿøOÿøOÿøOÿøO­“ÿðŸÿðŸÿðŸÿKà ü/ÿ%ð¿þ—Àÿø_ÿ+àü¯€ÿð¿þWÀüçÀüçÀüçÀüçÀÿø_ÿkà ü¯ÿ5ð¿þþþþþþþþ?üøÿðÿàÿ#ÀÿG€ÿÿþ? üøÿ(ðÿQàÿ£ÀÿGÿÿþ?ü øÿðÿ1àÿcÀÿÇ€ÿÇ€ÿÇ€ÿÇ€ÿÇ€ÿÇ€ÿÇ€ÿÇ€ÿÇ€ÿÿþ?üøÿ8ðÿqàÿãÀÿ>ð¿üïÿûÀÿ>ð¿üïÿÿÿÿÿÿÿÿÿ—€ÿKÀÿ%àÿð ø¿ü_þ/ÿ—ÿËÀÿeàÿ2ðø¿ üÿÀ?=[€ÖV€ÿàÿø?þŸþŸþŸþŸþŸþŸþŸþ¯ÿW€ÿ+Àÿàÿ ðø¿ü_þ¯ÿWÿ«ÀÿUàÿ*ðø?þÿCàÿø?þÿCàÿøÿðÿ àÿÀÿ'€ÿOÿŸþ?ü? ü? ü? ü? ü? ü? ü? üÿGÀÿðO;W€ÿ#àÿø?þ¯ÿ×€ÿkÀÿ5àÿð ø¿üÿÇÀÿ1™ÎM8þÿcàÿø?þO€ÚtvüŸÿ'Àÿ ðø¿ü_þ¯ÿ×ÿëÀÿuàÿ)àÿ)àÿ)àÿ)àÿ)àÿ)àÿ)àÿø?þOÿSàÿø?þOÿSàÿ ø?þé™'gÀÿðüŸÿçÀÿ9ðüŸÿçÀÿ9ðüßþoÿ7€ÿÀÿ àÿðø¿ü? ü? ü? ü? ü? ü? ü? ü?ü?ü?ü?ü?ü?ü?ü? ü? ü? ü? ü? ü? ü? üÓQÏÿÏÿÏÿÏÿÏÿÏÿÏÿŸþ? üøÿ$ðÿIàÿ“Àÿ'ÿOÿŸþ?ü øÿðÿ)àÿSÀÿ§ÿOÿŸþ? üøÿ4ðÿiàÿÓÀÿg€ÿÏÿŸþ?üøÿ ðÿàÿ³ÀÿgÿÏÿŸþ? üøÿ,ðÿ9àÿsÀÿç€ÿÏÿŸþ?üøÿðÿyàÿóÀÿçÿÏÿŸþ?üøÿðÿàÿ Àÿ€ÿ/ÿ_þ¿üøÿ"ðÿEàÿ‹Àÿÿ/ÿ_þ¿ü øÿðÿ%àÿKÀÿ—€ÿ/ÿ_þ¿ üøÿ2ðÿeàÿËÀÿ—ÿ/ÿ_þ¿üøÿ ðÿàÿ+ÀÿW€ÿ¯ÿ_þ¿ üøÿ*ðÿUàÿ«ÀÿWÿ¯ÿ_þ¿ü øÿðÿ5àÿkÀÿ×ÿ¯ÿ_þ¿üøÿ:ðÿuàÿëÀÿ7€ÿoÿßþ¿üøÿðÿ àÿ›Àÿ7ÿoÿßþ¿ üøÿ&ðÿ-àÿ[Àÿ·€ÿoÿßþ¿ü øøøøøøøøøÿ6ðÿmàÿÛÀÿ·ÿoÿßþ¿ üøÿðÿàÿ;Àÿw€ÿïÿßþ_þ_þ_þ_þ_þ_þ_þ_þ¿ üøÿ.ðÿ]àÿ»Àÿwÿïÿßþ¿üøÿ˜ù{Àÿ÷€ÿïÿßþ¿üøÿ>ðÿ}àÿûÀÿ÷ÿïÿ?þüÿøÿðÿàÿÀÿ€ÿÿ?þüÿøÿ!ðÿCàÿ‡Àÿ€ÿÿ?þüÿøÿðÿ#àÿGÀÿÿÿ?þ üÿøÿ1ðÿcàÿ'ÀÿO€ÿŸÿ?þüÿøÿ ðÿwV0Ï^æÇuéÌn•[åV¹Un•[åV¹Un•[åV¹Un•[åV¹Un•ßo)`"oúˆ¨y‚ò+ÔÁ7ÓƒóýË|B‹¾¥»±ÿÉœXÞewÍ|µuÝË}ÚupÙì¢z›¬þÜÍ¢_þ¦£¡»秇ÇWÄAÓ~½»><9ã{š6sÝyv_=\=ðÞwuÌ~® ‚Ü9ˆ<Ù”¼á¶›ÅÍ»º—”j¤ŸþüKÎo¼u·×Û¡ÿ;Ýîn¯»³³»»ÓííÒ?üÆüÚÅ®ÛÚ¾Þëv{=üÂ[ܵ»‹Ûzø*{ü“*ÇwñÛ¼éñ§¨µÈÊñžþlýºü–j¯ÛÒdÍ·ªm9›éö‡j5ÝÚP—j'ÕU[syPíðWÚº©*Ûb¢]FMî:v\ŒÀ¤rÎ@ûô0™¬° /ô¶ÀÈ„qt•n߆£œõì¸ÁèäÔêbjl ĺY“aÂx"€ã†.Ý$+ìñ··áo7woGç]=·<Ü‚¼ŽzRŒ¹¥¦s–œóôÞBÄ8)³îÝ<ÕÎÙÜm·ÀìmA¹-’c©Wnö߆rî)ên1?[)—è¦îºEæܲ…ZsN@o›–Ü* ·ÅN‘ÚíºõÞÎVFNK==©&¶PGnÑàÖ{»nô¶PÓ[(ò-‰›þîZv\¦ŸäEgSù¾ñýn½¹…hpÛí¤¥oA¹-äe·J®ÚzlçR»®¾ 'ÛÈL·]á”QÜJ+iQG+g÷ä=nkÖmáì:çq^ØÂ~ÜÂôî¹ÕžòL˜zõì.ºeªÃUè©æê%Še„º´# xÇl€¤î [Ìâå0 { †õNÙ°v2ƒCÛwÚ^ÞQ§æ*whšE€f’°:Úmõ”GÞBýžÍN…ÕÆ =Õ7Fzn g×m/ô&µ”†1¶…‚ímaÁ;1..ùÝsÛ dÁ»”§E=§É „]ÍÕÛòpª£:lt7x|‹øWû p×¶ÐíSè4¥”éP± ´ë•¦Ë­kv[gÑD_\BÈgÙ™f«¤«ïrÉ"ìNqZ5V¯^`êwêœj§?ÝÝq[­µ¨a×_/¾Î¾lŠh—uʼlVh:<ìò>·qzni¸ÛˆÆ^1ÌV«Œ“Å;¨˜[ÕHº[8YÊ‚¬í­îsÄDÔµ'Ò!8Ð6c­à‡ìpz½Mï¿·yo“*…‹¢áEåÛ¨FWxÀiI¹êÙ&pâðz»š¼Ö˜º›cr©rù¾Õê9ñ̼náµl¥'œôw¶R#jB?[ÍsSWµíÐncÊ»¶° ºÞáçʾ¸4Óêèn»­mÀF~·ry·F™´ÚRÒHÚbª]is-{Ƶ¬¹¡[Ì6ÉuÓžÛÜí¹Üd˜jæ©¢B’¼•(Äî;v\vTÏ®PZÓUuûaÍÑ(ùÅåïµÉ˜îNÃØÚsǹî£üÜæ)³ÙPKa 7†}­àm‹SoštLbo‹õé _¨Fã;ç™­ôžc!{Ô*·u[® G‹³¦¥ÍØBÀ+5ÐÊ–²ÏnÓ»ÛxµptKwkçÛ8é5™Þ] Óë„(§5Û&™wÔBI»Ïh3ØQØm¢ªb[`o# wŽ„ír¡ˆ]¶†6SÎ2»\ vkKŠÎæHqQ+[*wÚ)™[„©ñ¥ššèƒrK2§KØÛÂ>ﺢ¥ ¯Ö9ìi¹]˜YŸí4yÄíVGWmŽYÚq¹ÝéÝ3’Þí(¸$Y«5óÝ®DýνËk¬©öÊ·¹Ü–nÓ´hsA¶áv'o³ÚvÌ뜃߇Ñ\Ç €ž;Û¥3´KÔ]¼-Õ³¹,âQ=Ûî*Mê’º›tÙШU˵i½¤Í’rêé'Èlaæ·¦§³Î˜SezvêÃ)]jÃE°…‡Ô²(ªéà¯oFN6î4fI5²ÜÙa‹¼”]îloGæ°f]¡Šm–Ó‰Ÿ½ž v¶aRÚÕíÎVËö-K´úF—êÜ1&º¢ÆN”Ù&Fé Xw[üm•¸ƒô½&Åk5ç²;$S4󾬪MyîJaW;Ó»[dPÞŒÕÝ«®MO´NØõ\uè6›GWŠÊH­m¢â|µ)X½Vî¶t*ZuùN KiÔ»'K œVm¿Ee¯™1 7Õeî:?¥…ï6›Ûd‹ê;t[¯ïËìèr„»½:1ÙjÖ“×áŠ1¶œ*«ùžž‘­Ò])œ-L†–[v5‡VˆÕ­ 6ê É”íä—QêP6CGÕáV­ÙXýdõ¬ö[•ˆl£Q$u]`ÇS¥È‡kw+º±[¯]ëm1‚žV=Nžwº¹½6ÊuµuÞãÑ_ªVЫ’¯EOô]œ–ŸCQ’½àʤ9ð¼Ó­e¼êÈ\b¦×k5òùëR¥´1r¬1ÔÍÈ6P‹jì,¢&-Ô•Jb³•j»i½Ó¢hËx¸4-ÁwEJWôE:÷­žg¯-]jWÊ‘–‚®á¬ÚntËd‹Q¡üNg²1‡¡ÚÍ“nÝ 7КhV5ÔîtÛëã6å–]"¸½ÿnë,óÅÍØÄ&]Ö# \—슺×h¢KÌ9c”íq-þVk8OÖµ…@VšÃlr[Äí1Ù÷bŠ;^Zkúm1mŒ ’VݺÛxGE ´³\·ÛšÑÓUr¬ÛÊ Š..ÏfCÄìÔtÈQÕ«WÁÝJL¯FS—àåZl”SéBnǵ–]Ë­vÀ·ˆ5Õ̉ÛiÙÆ²vÅE*‚¹!F²‰Åjsn¹ë zóŒšÞì4Å-Z¥.)¤ºïU6É6;ÚÖ¢ÃáZÊ×Ù­ûÝÚÓÁ *FÓ¢gv•qx²½¥¦e²CpìÔZÞ›<î4<\r™3WZ5–”\ü®µ¶f‹Ï€¥žl%ÑÐ5ÕÁöðn­5¾w<£oµŸÚ`¶&u©ë èÉ~·Evš^²ÿ¶XLog©]•uÒn6§¿ôŠ9u.;°ß0‹]}w[hF3P]wJƒt‡¶zNG­-‡©(Ó+œ`WˆLZ™îÍ -&îš(;Íõ¹…P髽z¦iìIÏzšâ%š’Çl£ÉᨩIoÖ|;,šÛT£L¹o¯¥+kŽ9jDš=R—Ôk#çµE”uõL4ÝÓ3€u/CµáÙìÊj·š«A‡ú0Žk¯}o§Ñ‚·Qí¤™Ùjs›àOSgf«Ó Õqµ¬&¸írNrº{²/­‚J.[¶4Økõ ¬­P—v7UV ýÕ–—ý.­@ÇŠL];•ï55Ñ5|Ð’fÐ5c¬‹ÅØÂ¡n‡Û×ZZµÍU;138³²…ÑŠ#9˜¶àË® ÑltqÃ_vj˜ÎŽ0(ÓÍ­bÝò½ÛØæî®c¥ sìœ9Õ0ZíÊ­{é­Ý¦“^÷2ÊèÜufµ–Õn½°\p$ˆQßÜg/´ú=eü¹#ÉN¯Ñ¡hT´½™4]E…¦Z¬…èuÏug·;œlÓ|l Æiʹ@Òmð½BÓìtÝ=rŽ™»äÎkFªqijœê—šÓ–¿Û«J+—c/9Êår¸¤÷N«|QÙM¦g)ÓgIÖÚa¶œáÝF¶gÑÑmª68_åÞ¶OÑ®Cñí4ù"ª­ö ôÕZå©Q”5lWu·Xª^ên‚v ÁÐ")mO ÅÙàÊÚ,Ýâ„Ì:ªYó[qÝj9£©»¥&¸ùf³ä4&d[ÈDMn›üÕQ§æ =’f­göä¶úÀ².wŒÒ`§§ZËîFÛ ÁqÅ2{[x?íaK‡[É8 ;¦²+DSŠK5Ýß.áù[.ÓiÖq’Ó ¨I›¼ð¡ì[jÓšuZáÝ´iz0rZ˜Î­çü¶p¬ò]³¸ëHXëI¡×`¢Z£n5pzÒés``§ºªŸ õJƵ«¡žÃµdUlsJ¹p$WÁ[hÏ·ºs¬wݳØ$s{]œ6òNc:`·AN=²ÛrÒÑí¤“ÑõÚK%³ÝMºzÅWöQX¬ss­^hEß4&lÔRIW}Õmú5ú–Îw»íÊ]ú×mm!5Ó.·L`Zļ³Ó't‡7Îk®YsjìªuhA›lî¹é0wåt·8—[ˆ÷s«ä«¹¥{‹nì©8rÏi›´n+×âÁIº^k¤­6¨ÍZõ0¶Hj+YMõ3Ðîít›RªJCkwî‹Ytø–˰ÑW.Ç]ÝÔu¸irÝëÆ Ö©­®·¿Ôö¥¼&ÝÂuÚv;6»­|ÀrÃÒãhÓh:õtøÜéN8âÝ&Æ´4Ÿ„l›òìöj#' ä^“ï:£<52³·Ahgô¥[+y{åZÚDœ:aQ½¿•l®mJÉï6‡‘éínˆ¨Z«³ö¶­>eÝ$vÜÂÆ¤¹¢ª¢Ã;õ°¿²S6ÇüÐÏ’‡Þdñ6®§éA•Þ׋ù6ûS/ »PÒë9%C£i(ÃáÝv+IvÕêcíÑWn÷¨Å 0Èu8>¬“œY½Z\ŽÓ8|i×5ÒmGkûâöºú”p‡óÙíÚ1»z"µ,hözšê ž’V“AVܺÐ"Մ˪u>«Qgp«õí¤Õo•(ûRõ×z–¯ë\êµÄ1weêhrÃS¨w;®t¦Úü4iA¶tT~¥ÖN®Ì‘£»n«m—kC£q³j¼¦²•〵s1‹úÛü” EygêsÏg[f›ÕXÛLîH5ÞÔÓj½÷l²Ö}½œy]'¼{šg¥?íÖ5­«P½ß«ø¶¨•¬‹þÝ&V³8À£^ Òz¥î×µTrœ\Tù+íy€EvØ{F#i,÷.ËîšµWB q«UB !·@$$„Ä-7ˆûr;v.ÇIl¯×¹œ8Îé#‰s;qâœvçpî8qg7¿ïëî¯_õWõ^)þwv÷íŒfª«««Þï]Uýå¤ëÔ¬ó¤Ï¿L|€ É´ùË6ùÉ9¹¥(eVÈV“ øÓ)X]ò3àMÇÕi"Ø+Š´™ì?£å·Ic”!Fm¤3øÇÐ ­Í°6Ó„KáÁøxmÔÎ ™ð´T=óoš%¢Qz2ŽóL§¬÷(t®¿Iï4í¢Š9 F¯ñÔ…5kiÔ7Íãt£yÖkÄ#µÓÄ]&:ý6œMõ[ ¶ºLÕÆHÍb§Rc™ã×h²úˆÝŠJKnOµ;VÉU˜–ºØa% êŒ4#²snÝ(J=‰uj÷´ô‰m2«0;Ì„»ˆ7ªN“Áì=Öi#ýolb"(ìŠvªª$Œ±ÛfTØã9¨]ϰªjºWwYGF«ájé†y"½F“#§ŸtÐ";5C åýQgö6IBš©a¤¦¤?JÚf]-‡>Cßll˜±LöÅNÄ&ÔRiãô<¹ñŽc¿S«”Jµû‘LõæÙØ ¨5ÊæRsÓÓÍ ÉÍõÉû©©e­æ–¶d$bÓýy™Œ†=š/Z§<:̦lû·Œ$C¶‘¢Göí…wœ·‹ú³¶æq'ó¬B*V³òí¬ŒÃ¨KµÆÎ<|k†Jº¬6Žª ZjÈí/'3ü„¢·í›ÞɈO¨ž’5N4꤇}Ã]y=ª«£¤„W캤7êÔÊÚj±©ßº›žžîê6ÉÉ›Vo2ÕÖ~¬ðqZ×ÊZǵ§™j¢­ØÂ˜E ›<ÊœÜ)5…1«*ïÈ¡HõŸîkßxc.EçÄZ$žjctÕŽØ&ÆØn™j:=ÑXVõ<æ%¦Gá£á4·=ê¾],ÛLÇc°*¢Ô&_îÛŸ~YC¯~MLZŸ—ÝΛ¥šbm§Vqkºb«9ݘËé”Ê5.btÐCÞHqelÓÚªM©ý¥}SÝŒS{À¦\O*X Í6×Á_2mÔiZÍ ›ñ˜“uºf÷ÜIÚÕ.‘EÏúõ>ÅÈ‹µò€ðVìW0†‰±ÄÔx›ÉþZ[¡yœÄ~”ŒŒÜhj\b§†/Ô :Ô·‰ÆA·×§ÂÐÐ`ëº;Ù¸{uöÞœþÔ¬MŒÐŽbG4arÌX©ÀtÆÊ¥k,mþ¸{W2¶oUÌÐ0™õRÓÙ i9€ºÔ_Éi±’f™Á¶Rªõžž¶îÓþÇ.{'?Mrh+[s§¥ø¦(¦&‹bÎwŠ¢8™(йߩv_'Ϭvæ<¾ž¾e÷öƒ;wlÞ~tÛ¦ýû÷Ö­V ®”­æ®ß¼}ß®‡øöÛµ šýÈwЉYç×ßÿèà’/ðý½õe32#32#32#32#32#32#32#32#3òÛ“AÍåÇú5—H…<†¼‹|ù»Èÿà×ç#×!ÛãÈ@~ù÷E1y:² ñÈQäw"ùçE1k²YìEÞG¾…ü=ä7¹÷W‘íÈ«È!ùE1ûLäJä.ääw#ùÕ¢˜3YŒÜŠìC>DþòKÈÿ.й߅¬FA^G~ùä?ÅôÙÈ ää9äû‘¿€üË¢˜7¹Ù€@>Fþò‘ß*ŠS¾Ž¬Av"o"ùÈ)ŠSÏE®BîC^@~ùKÈ¿.ŠÓæ!KÛ‘ƒÈ§ÈŸBþòm–á{µÈ.ämäG¿…ü·¢8ýKÈÕÈVäò{‘ŸAþMQœq*rrrùùÓÈ?©+pgÎGÖ!{È!ù¢8ëËȵȃÈËÈïG~ùwEq6zqöåÈä)äw ?…ü³¢8Ý9g!r3ò8òòãÈ/"ÿ³(Îý r=òò ò‘¿‚üzQ|ñ ä äNäiäw!?üJQ|i ¹¹yùù äï#ÿ«(Îûr#ò0òò‡¿†üÇ¢øòYÈränäYäû?ü‹¢8rr²ùùãÈ?@þOQ|å¤Dv o ùëÈ.Нžƒ¬D`ä«Ï#¿ù‹È¿*НM#— ‘'‘O?‰ü2ò‹â»¾qÈ£È[ÈEþ&ò_‹â‚/"«û‘‘Dþ2òkEñõSK‘MÈ!ä3ä'‘ŒÀìw¹ Ù¼ƒü(ò·‘ÿ^ßsr òòòûŸEþmQ|ã4d)²9‚|/ògZóá>üχÿùð?þçÃÿ|øŸÿ àü/€ÿð¿þÀÿø_ÿ á!ü/„ÿ…ð¿þÂÿ"ø_ÿ‹àü/‚ÿEð¿þÁÿ…ð!ü_ÿÂÿ…ð!ü_ÿ‹QàÅð¿þÃÿbø_ ÿ‹áÿ"ø¿þ/‚ÿ‹àÿ"ø¿þ/‚ÿ‹àÿbø¿þ/†ÿ‹áÿbø¿þ/†ÿKàÿø¿þ/ÿKàÿø¿þ—Àÿø_ÿKà ü/ÿ%ð¿þ/…ÿKáÿRø¿þ/…ÿKáÿRø¿ þ/ƒÿËàÿ2ø¿ þ/ƒÿËà)ü/…ÿ¥ð¿þ—ÂÿRø_ ÿKáÿrø¿þ/‡ÿËáÿrø¿þ/‡ÿeð¿ þ—Áÿ2ø_ÿËàü_ÿWÀÿðü_ÿWÀÿðÏÔWÂÿ•ð%ü_ ÿWÂÿ•ð%ü/‡ÿåð¿þ—Ãÿrø_ÿËáü¯€ÿð¿þWÀÿ ø_ÿ+á%ü¯„ÿ•ð¿þWÂÿJø_ ÿWÁÿUðü_ÿWÁÿUðü¯‚ÿUð¿ þWÁÿ*ø_ÿ«àÿjø¿þ¯†ÿ«áÿjø¿þ¯†ÿ«áÿø¿þ¯ÿkàÿø¿þ¯ÿkáÿZø¿þ¯…ÿkáÿZø¿þ¯ƒÿëàÿ:ø¿þ¯ƒÿëàÿ:ø¿þ¯‡ÿëáÿzø¿þ¯‡ÿëáÿzø¿þo€ÿàÿø¿þo€ÿàÿFø¿þo„ÿáÿFø¿þo„ÿá5ü¯†ÿÕð¿þWÃÿjø_ ÿ%ü—ð_ ÿ%ü—ð_Âÿø_ÿkà ü¯ÿ5ð¿þ×À¿ƒÿþü;øwðïà-ü¯…ÿµð¿þ×ÂÿZø_ ÿ7ÁÿMðüßÿ7ÁÿMðü¯ƒÿuð¿þ×Áÿ:ø_ÿëàüWð_ÁÿüWð_Áÿ7ÃÿÍð3üß ÿ7ÃÿÍð3ü¯‡ÿõð¿þ×Ãÿzø_ÿëá=üßÿ·Àÿ-ð üßÿ·Àÿ-ð+üߊß ÿ·Âÿ­ð+üß ÿ·Áÿmðüßÿ·Áÿmðüßÿàüo€ÿ ð¿þ7Àÿøßÿá#üo„ÿð¿þ7Âÿíð;üßÿ·Ãÿíð;üßÿ·Ãÿ&øßÿ›àüo‚ÿMð¿ þï€ÿ;àÿø¿þï€ÿ;àÿøß ÿ›á3üo†ÿÍð¿þ7Ãÿføßÿ[à üoÿ-ð¿þ·À¿‡ÿþ=ü{ø÷ðïáÿNø¿þï„ÿ;áÿNø¿þ­¸ þï‚ÿ»àÿ.ø¿ þï‚ÿ»àÿnø¿þï†ÿ»áÿnø¿þï†ÿ{àÿø¿þïÿ{àÿø¿þï…ÿ{áÿ^ø¿þï…ÿ{áÿ^ø¿þïƒÿûàÿ>ø¿þïƒÿûàÿ>ø¿þï‡ÿûáÿ~ø¿þï‡ÿûá+üo…ÿ­ð¿þ·ÂÿVøß ÿ[áÿøþ€ÿàÿøþ€ÿáÿAøþ„ÿáÿAøþ·Áÿ6øßÿÛàüoƒÿmð¿ þ‚ÿ‡àÿ!øþ‚ÿ‡àÿ!øßÿÛá;üo‡ÿíð¿þ·ÃÿÃðÿ0ü? ÿÃÿÃðÿ0ü? ÿÃÿ#ðÿü?ÿÀÿ#ðÿü?ÿ;àüï€ÿð¿þwÀÿøß ÿ;á'üöLwÂÿNøß ÿ;áÿQøþ…ÿGáÿQøþ…ÿ]ð¿ þwÁÿ.øßÿ»àüï†ÿÝð¿þwÃÿnøß ÿ»áüïÿ=ð¿þ÷Àÿøßÿ{àÿ1ø þƒÿÇàÿ1ø þƒÿÇáÿqøþ‡ÿÇáÿqøþ÷Âÿ^øß ÿ{á/üï…ÿ½ð¿þŸ€ÿ'àÿ øþŸ€ÿ'àÿ øßÿûàмþ÷Áÿ>øßÿûá?üï‡ÿýð¿þ÷Ãÿ~øßÿàÿü€ÿðþÀÿøþŸ„ÿ'áÿIøþŸ„ÿ'áÿ ü„ÿƒðþÂÿAø?ÿáÿü‚ÿCðþÁÿ!ø?ÿ‡áÿ0ü†ÿÃðþÃÿaø?ÿGàÿüÿ#ðþÀÿø þŸ‚ÿ§àÿ)ø þŸ‚ÿ§àÿ(ü…ÿ£ðþÂÿQø? ÿOÃÿÓðÿ4ü? ÿOÃÿÓðÿ4ü3eÅ3ðÿ ü?ÿÏÀÿ3ðÿ ü?ÿÏÂÿ³ðÿ,ü? ÿÏÂÿ³ðÿ,ü?ÿÏÁÿsðÿü?ÿÏÁÿsðÿ<ü?ÿÏÃÿóðÿ<ü?ÿÏÃÿóðÿü¿ÿ/Àÿ ðÿü¿ÿ/Àÿ‹ðÿ"ü¿ÿ/Âÿ‹ðÿ"ü¿ÿÇàÿüƒÿcð þÁÿ1ø?ÿ/ÁÿKðÿü¿ÿ/ÁÿKðÿü¿ ÿ/ÃÿËðÿ2ü¿ ÿ/ÃÿËðþÃÿqø?ÿÇáÿ8ü‡ÿãðÿ ü¿ÿ¯Àÿ+ðÿ ü¿ÿ¯Àÿ«ðÿ*ü¿ ÿ¯Âÿ«ðÿ*ü¿ ÿ¯Áÿkðÿü¿ÿ¯Áÿkðÿü¿ÿ¯Ãÿëðÿ:ü¿ÿ¯Ãÿëðÿ:ü¿ÿoÀÿðÿü¿ÿoÀÿðÿ&ü¿ ÿoÂÿ›ðÿ&ü¿ ÿoÂÿ›ðÿü¿ÿoÁÿ[ðÿü¿ÿoÁÿÛðÿ6ü¿ ÿoÃÿÛðÿ6ü¿ ÿïÀÿ;ðÿü¿ÿïÀÿ;ðÿüŸ€ÿðþOÀÿ ø?ÿ'àÿü¿ ÿïÂÿ»ðÿ.ü¿ ÿïÂÿ»ðÿü¿ÿïÁÿ{ðÿü¿ÿïÁÿûðÿ>ü¿ÿïÃÿûðÿ>ü¿ÿïÃÿðÿüÿÀÿðÿüÿÂÿ‡ðÿ!üˆ2ÿÂÿ‡ðÿüÿÁÿGðÿüÿÁÿGðÿ1ü ÿÃÿÇðÿ1ü ÿÃÿ'ðÿ üÿŸÀÿ'ðÿ üÿŸÂÿ§ðÿ)ü ÿŸÂÿ§ðÿ)ü ÿŸÁÿgðÿüÿŸÁÿgðÿüÿŸÃÿçðÿ9üÿŸÃÿçðÿ½óêšË7eÍeþŒÌÈŒÌÈŒÌÈŒÌÈŒÌÈŒÌÈŒÌÈŒÌÈŒüvePsùñïŲæ¦o‰ï'Ç^SÚ³ïðÎ];Ö¿þ‰öý§"õîSupÿ‘;wŒ^n:‰wŸä8̶vc¹åðÁ=ûvmÙy8q›SÖìÙhئw§Q‹yGoÚ½çžeW-§û¦58¾3ñKü{p´çùz_¸(fý ßïçû_á«ãâY|ýUä§›c>ùݯóu ²”ïŠ6¿Ì÷ïòýòµB.æ²­ƒyâûÝÈo!oð³Õ|=€,àûŸ¤=ó=yr=2Q÷;ñÍ}øÄ7ùþ-ÈÏ"«øÙoòõDó³oñïß@¾¯ž’I®™|«¾~ØçZäçš#J\3k0gðýY÷)¾ÆW&mr}\À¿gÖ¡~ö ž¹ø _kžkCÝÿ`>Š ýZÓ~ðýõóóõØ`ÙšŸ/D.+†e¿Éóëñ¯´aŽ&^¯çpжø°Wq¼¹þBdm¾Ÿ¯_¯Ç5®ŸX×\sA7†a¿™Û´k~fóóyÍ¿}Ÿ_¯Íð߬G±iûd¬ÅÂæ{æ§8µù¾‘‰|ý2òò%äÜæëbäç›vs»y*öˆññ<Å5c[„¼Ýü|As¯iÑöbŒm_«šgkŸiv3¾9½vYÝü|e3¾vþ&›¯í5ƒ±~q€rMólí³·}žÑŒíq_9ÇÓ͘&Å}ór–ÓìæžíNi~vzÓæKÍïg i¯k¯].Öñ Í×9Íïg5s1K¬Ÿ\9?ržŽãܦßA?çõæuJ\J³Þsš¶ò~ò™Ú±ŸÖÌ]{o9w³šùoufnoÚ~¿Ðü{Zü|i3ŽÓšyiçöԦϯöÆ5»iwF1b4zϹb-Ï+B~æ4Ï?-žáñ»iÑV®AûìsEíxg7c’cýrï¾­íYÜ̯\©ÞýÚ>&ÅïÛõk:«wMÛîìÞœÈßÅ®ŸÕ»__ß&{}Éëçˆ9ý·ö`v¯ÿÖ^´:1Õ|ÛÌ¡ìç”ÞzJ^'Å÷R¿ûsÚþN>_{ÓšO‹ëåuýëûó/ç¶ý:¿ÔÓþõƒ¯ç‰ûÍnžõ\ñûÙ‘ûôŸ³ßwk×^ Æ6h{º˜W9?ƒïÏJŒ5&ƒkN-B֦Žûs~®¸W«›íïÎýœy¾VOæô®“º|j1>îS‹q½Žq#õ[>Ǭ"Ôµ>«}Núö§/©uš*B_3¯÷œ³ÅÏû?kmL»Æs#÷jù›×»6¥Ë}Û£éAߦ·2/r9fcœV„¼Ê¯Ònµãl9‘íæôÚËùmuJúîXÛKS¢¯Ô<ÅæeVï¾rœm¿©ùMñݶÔ}Rãé÷qªrMl<9¶AêÀ¼H±ù‹ÙS‹¡T›ÖƤÆ%ý¶Œ%­{ôu¥ßg¬Ÿœy‹ÙâØxµ¾bLkó¤é^¿]¿ïØu±¹éßwNâ÷ý±ÄllŽîióÔ·=ýk¥k×2å+bqFÿSë¥^.l¥æ¼Ã©‰º¸þªúÐÅ™%šwì{cµÙö™“%Í›©Ú>ˆ]Ò^£ ¼¡eÞ}¾;ö'‘qf(DõÑ.R ·a-­Ì8­ÜÌœ¬Neí¦õM¼·"Í2išá€Á»Do×Õ±úÊúìò§±‹¡*2Õçµ—Ã!‘‘Åù@²5KVsmñAÆi~d^`Ø+™hѨ«[wK`¡.£…*ã“›Õÿɰ¯n,Ý1U++(­ûÎ4³zõ½*Y´]xeõdJŠy¾ ÌŒ”£ìÕˆ¬jŽÐ3‰’&Ã2ñ¦uñÝ´XAéÐô‚Ò²ÑËÚ” ;l– ²Á€ä¦•é`¤j'žÊµÓ–8<%[ŒT5o"tæM òÛ¹ÓüVh3³+ORµÓ Ú4SA@´¬ÓÂJÞ,[ ½T5…ÊŠ]¸qiÕ«óÃÇܽc™o9y—Üd5C2‘ž[1±°„º½òÂf™A>?&ÌLÏkœ<™ÄŽîÞÛéÆP&·ÄíûË^SÔÆ†9I1ŸDø˜UX÷!Üfbæ D¼iQ¦Mí‚ZP Ð-\pÔ@4«"Î;‰¡04;ð††1Î(Ñø±M¤¡KíD¥ü嘷Ó-s?ÖwíEì’ÖØÒË}CÝ»N,ìxTæä¼-ES5ÎÎæXÕi_5W0Ü5Ê„[:Îd5»î ójy8¹f”SÊ^â[§êÒÊè-Ù«ßãŒ÷éÄr뉋$¦²%4Kû"ÐKØŠjœ-K¯äc ¢Ú¬j¹•ñ;[‚q?.GËl#e`}¿Z®Dx'á8ËЪ¸ÔÏ&ü–‘éN´UWPŠú‚*ª_y±KPJH¥†.b³Œ¨Ô¹ÀqY”Ф‰-{çÞôÜ4P—tà<\ &Ô"ç‚KmJƒz–}”+·”à}p”ËØÜ‘åz#;Ï2\~5§·½¤ìÈ,NÅ%¬»˜.‘H»Ø³™:àG“ zµ,|·ZF)%ز±¼¬ˆˆ4ƒé¥‡ÑuEꀙFGí@™±°„Z”)#xû,[)VKMc]†7ô#*4KOxƒ‚š~0&ˆ2ÒTÉÐ"Fcâªí5Õ6+Dr¦?Ìpœ® wÍÆ{,,ªÝ\în”é 2£Œvm»±¦Íf“F™>¶›\ác­2ÓºÈZ±}Ü$3…(ƒóÚýÇwɳå–Éñ«ŽUЖ×Ò^ñp©W<ú“r?áØäjdÆY²FdŠ%T&Ö‡EU+Ê’«,QHÙ«j]ZV7cÓªj+¦uq£ùÍ«¹½“®”ŽO˜é6º³ÝX‡ö·fŽcqǺάÝ&‹Êð†Þ÷Žr™v ó…/gÀÚ;va¬mT(:gd…ÅöÛ 7Ð'kâÛ Ál–1+«êkè9;g¤ÚìRZ´—w=Cdn†Ê=£hÀ$‡‘vÇc…n<¡4šúv¬®YUtÃ"é·«±LÞÀI¼:cfÎ {"ô0šÁ”™¼ITôÖe`Ĥ$¢þY2cº¤1Y™¡Ú­uËß`“%E+zËŽà¥ßJZ«QùÇt~´Ò£Ç²½Q×ÔLãr½f´f[Vö;&¢šåŽëâ—bàûéd7s¹:ûª–(¤}µC‡n ì ·•Iw½š;9M«°éؤ»1—$f@="¡«ËZ>¶ÿèã%fÑkжJ×’–Õ›7=ݕٱ¦¨ý`ßò°eöžQ)¶—,}©±‹ÓckŸ9g׬­+HK˜,ù„E* ‚à ¨ápëµßáÅŠõ‰j¹–ÀøÞ¼šD¸¹¢”Ê]ö;&R {TJÓ¸¶3aø¶ Ÿ—œ» Îiªø2<¹È@2«Õ¡Ú©œÈ5OœhÛË[-/߈ܽꩂjŠ} 46kh¤º(››½ÌȪ¾ÊÉÒ+9ÞË2]JªÚ~fœÑs# —Öel˜.ž˜(Á£ Ïæ˜/¥U²” ‡¥rkAŸXFš½NËÞ\KbEèTÛ:Zž}@LXm»J'wLÒZ5üåI¼:“y–ÌÉøÕ¶™b ”L%7Ì‹ ½YvÁÕ]˜“vÈõÔækCónœÖZÀÎÌòjšáXËD¡ ¹À”j Ñbsœ|“t‹HÇBUx`Üܹ pè#ȉˆjû._$µêTÝ ™|ÒÉ—‘Èé~+b5œ\µÎÇ"-'ÙİÖY9[£û‰#? oXßÃE½¡î`‡¿š¥WàƒÊ“¶]Ä.Vr^æN–<ïbÄy2*ŽÅ`½é!Y϶”ýa¨ñ@à`º¦Z)ahã‚khG[ƑɌôÜý~ªpyKUhG­-'¢BËd´.ÑËשã³åÆUÛŽròƺcÝ¿‡cÕS˜ ÌI/—ïUô ƒ)Ã^æÍ 4OâóÞr^ýöeèÕUÕ{öüV$sAžŽ4ÇLažÉæU 4k¼ºÉ2Ð>‰ÏN2_ù”õŸ®×øœPk#¯%í«±±z§ßÅ6£Ô 4Ì#:wlžvÈSí*Píx@Ð]˜b=$Í*Tú¦DÐÁÒ×^¥õÚ;QÖ5ò\e0)ÝL[ع ½áª¼Ð¡òÒÛ;aùgž‚ÏͱJZBµSNÛÕ'Ç“Ó2Ù¿¶=cWUZ©¯ñ‘ú±°q6Jõ±¾¯¦3ꎽd¸¸r˜ VaU7¥eXu0â/ß=7t ص‘¥n²ôø¬—ß«¦i4S&Þ…›i\ý˜!²%Xæ-’oYY\•ýñUrÀÀUVËõðÑËŒ3žÅ‰û¤2y†è" æŒùßDÙc|N]¿mgˆôtÃå}þ@£AH¦nçó– 4ðVfä­°°I•”u­¶Ì|S:#s§]3ð>aà“¥”ÑÓ+9±®½ÊX-  Í‚–°„êAYyj¬¸¢ v˜3l(¡¹•û™<¢ÚTs´âkÕ+ÕŽ=ÊX*Óùp7R9–ãƒOµC"Œá7sß/ŽIšá›r6glà ÓT>U®¯bãÈž,“-Yýá£n³OâE}—™BgôèuX!PæÕõÆž‡áð)(£‹ä«´æ›ÀÐJ…Û0,£T;:Í`õ*6f»±ªÆ­ªâûÜeü²¼…u™›Í dÃíJżÇ‚ÜÐôñYGŽšˆ¤›3ÎÎ(aF[IÕvc§â¬îásÞßò=ëÝù­¤asýâŸn‡ä ˜Þ°Ì²¯eX#J¤8±WiÕ\³ž1YÚƒ9WéJf<ºX/Z™h‘¥ýVoF–=t¨2’p#Hɵû&C-§º°–¡ú¡~Y9†|´N]\b©ÆÓÈ^7nŒätC¨|¶‡ë¯„n³¼ì<5Ö Ó Çššýr¼þÚ+qÄ4Ò|¬jü±Rظº¤°©‰ð0Éi£Dv¯£ju·°éÀ±ybi&ÌfÙ/Ѩ5§ºoè%ƒW?žžÛœÉ^«dÒ¯¤®—D©xûÀXY¿»¸ÑâÙK0,ÏÈ%0ÝR–hÌRm´®(ÁŠ%Ð|¯ ž³YÞ-Ž«—½ÊªÀ ÏmU>º¦‰Êx-ÃòšUÎí¾Ù_‘¦y†C7D9Ì^‚àý­de_Ý *Žïá8jjÚ8ce»%0‘é–@Ï Ä />ܶ3j4¦7lÔÅg‡¾ Ø2VËRñ[©x@ØÇμE³!nuÁSÊú¶±:Ö2˜Á \¯©ÈË:­nÁ %´ªÅ¾Z1¼ð0ééòá©;=îšêõDg#"é¹õ ÇyµRÚ«AÛöÕ÷ã«úë•Ohôc 'ÕŘ­d¯ˆôª™âze}j²Üøu™lÆÑW/«<««¦e¹•Òau üP×Àlº±þsÌ[mŽ”·ÄǼHô±\tÞDÓÔËm×1'_Æ'N$£.ʸшaY”Êß”ñAéh|œÝ®i÷³R?›£å9½ú€ådþ]ìœ&˜ÑÌʺ‹=ûਬx–R¯¿š‡»í@od‘Ìyíö­„ß²^{UƒRÕW#‡ ó‚äü—ýèMY,ïú5Ñ(æÈ÷ õŒ¯²B2?ÊNíYò¸Õ0 6Ò®ÿFs®õêŸmìW뺅Õ,¼óyM}/Ø¿j5ʼn6^Ô”„ÍÒûL\E0Z×3oZ—¥ st¶|p´Û®ÑtJ8æäJ~&R猒û/í#tÆh˜´Ú±·½²ÌÛpæ”On¯RéyÒ³ŽOjèâ‚`?:óUÔqÚõ_sÛ®«O„ÕÅÉ€Äþd‰îR ÷ÕÖᣡÃè «hèÐ>mNznæ;›+¾) _=üà]ˆdøèÂìØð¯²¬™÷fŸW(¡•J癌!¾ñ¸˜Þdj–™¼‘òJ£šÌ¡S̶ڕ|ÍÇØ‹”Ÿl¡oº¼”w0&—ûÖ­÷™€àÃh5*ß‹³ôÈÁUáñ¨”Ê”.|$ú8eìG:pjç@ É\_k¤)v™…õ¤oõÛ髵w*§3‚ÂΪ»Vr lÅÊ8j02¤‚Øôá¬^«º/•Ð8 (ã,= &­òüJ¨ãF¨i`,c(Œ¦e2š¶§»%[ê‚¿Å8x`ÍÆ - —ÛÔeÙWß_Ø4ÿu@–üœ§± óé„o¼cé·Ô$ÿÝ2ËjûF…ÐÌÄ09ýÝ´ÕŽM”Õ¬ç7âY ˜„‡ñýäTþ¶Š+y¦%ôAø˜rp­ï26„}̼Ã*£k–ãcë^æÚá0’57Oýuœ “7‚*üH¨T%­™”C5Q¢âØ©ù\ë"KÍÍ’ãtñ+FcÕ>K´wúS áë”Rø §È²uŽ3rÏpÊr¼a“ÑæÁíƒØÅÎÍ2=×Ó¬®¥è¾›´!ôõņ“ï” xñ9]D"M3É-Ñé¹^ŸpU˜ =ÊÈ}ûÞKuIùŠH˜“º¿ÐÃÑ $}Ш_ûøæŠ‘Gç} ÇÐÙ…õî5 ÍRk4¥‹º¸8<òx”VÇŒ^1Å®wiÂs{MŒÇ’oÛYñ«üÔnͺ„N>Ú­‹UM †®3#tð-âj§þ:t½åUf¿BTH¬^N–Zû+Có–lÜœÑÏðܾɣºx Ò]øŽ¦Pí1gègX…õ,ÛÇgJðŽÓ'§Vý¢7{]EºWýÈn¤a¼¤ÀØØðòOwFGàÅŒ¦Ý¬†/¦Hú‚R×oÓÇú1«ÂíƒðQkÔOúí3rÆ|4|”ݹØÌ% |Ìj°ŠÃhv¡.I¿é¼ ²ú®7'P³Ó²ÊÍ·œtòMƒ¾ÛµE«÷8›0:þvhä m¡v-Ũ”W¬ËøžP·Zú‰êšåœ\/‰5ã é/Õ*QeÕ‹çÌ!Ö‡aùøøÊÔq-9®ª 3Râ¶rp°R~jÌàdéŒÐÁõrn»ö'ëYÖæ†°.©ǹ°L§/T/“·6¢ìÊS—qu½FÔÚ#0§K¢Œ2]g)ç#{u]U‡3+|ìøùäp8‰ ÔEÀÕ‰ j:y–0˜½ôDDª¨?i¨ó0º½ðÁvè.ãÏ ¹Q§z>jŠÍâgƹ®ó˜7ìçå=o˜ØÏp%´Œv‹’>NÌ€±'}ïFj³äz‹é·œtÇJnêzñ€ZŸ âX+ßUTÛ5³!go UoÝò½ÀÅiº^§:c–hFý•fe_-Ñx™ô›Úz ŸšW¹&èùä^œb]ÏkÇè\h2Ò¡þ˜!Šœ{ÑK°·¡Å.Œˆ”d£_¦Ó–µy¸Î¼šû# Y1¡Ï:­ìG –Y×|µírŽ 4#thãì0tHÙÕºÄWú Ê0üqg2’\¹~å)•9t(ˆØ%Yu)Ãú€‘>¸2ë#¡ÚiPcÂڹń©h SïÎd¨ÆU¥ÖRñ'ó‰¢ú1I±¾÷q–‰¦© æMÕ˜üô +OêcüÑÂ÷'ÔˆÈE1´«sœZ¨éÏmM•u®»ÉËH—e"‚72c©ÚÁÈâ'´¯eÚÈ”9ÇMZ+æÕˆ÷õÏ÷³fÅíKÙÔ=äXÕ´$ó\± ÊVVâ­¼—Ê`-¬_Xo5††# ϽÙá~¹R`˜ž§2¨:¨!Yu©š }ÔƒŽÔÅ(–û¼Ê}Ï%h\±üÀŽD!OHuKÐoâúÃÑ[rj}¸Å¨%f.TB3/J¢èvAäM?y+Û•9V¥L4M&;õ¤7T2£f¼òœfb¸¾®jÞºBJ@ž¨’ÞÐ*Á«ïBô>±¶Ó,…5rfß*:ë‚ç‘ߺ¾6õÓ3Û€w?¥ß6E%±æ˜Q%…Öß’¢ }'‘­€›–õ ê §:/üs¢Í”Ù•Å›â#Ò.Cÿ9Bs£ÈR²Ö=€¶ÉÚêRÍ˰Êd½!§¹=¶õªw¯¥Mc ;hPPÆ HíEî6sÒg‰ó‘¸«d‘áý𘕇õÚäzÈnî‰ÜfAÜ„uІEϸXá¶·ý±æQG1ÞÀ•#!óFSbåŽ^KvÄ2uÔ÷­—ÿTQ˜N}G ¥aÃQß$ ïˆÄ®_éˆá×/ 2”ÃläHŠH¥n­jO DíÙƒÿH`âya¯ç¿4è4l~d6œ‘[2¤³$‹ßaÙ6—êbn7Å×]Ò¾q÷V¢@ÊÅ"Bd&i›6^âýQi+ÆÑ|ÍF‰ö¥fÑ“˜Ä.VýÊ&[e“Ê´I”ƬÄ#ƒ‡o‰©¼)î…¸ÍnW„É £%ßFR¤£˜â,H%_í·£<ݳô\'œ••`ÀÕØûÞš“$M^/cãÂ%Ûä‰5J¢›è(MJ´k í¨‰ 2ÕìôH xhH¥ —JVX@þ‰.S6/‡}Hå.„!öâVþÌe?s€|eª• Xù4K*Õäx8ªgkÈ^2hµ(X)(ß©¤‡Ö5•zШ*y`C«ØÐ`uc¥M1´O„‹K^àC±/Ù¥,#+HU¶ou:å0Fž¼«l޶+æZJð5s¶rÍÏÂi±jšä’Ëv ›8‹PÂÙXXÌYh. J;ÁÈUÁ·ýÛýN˜P&²úR% 7Bª|®¯)£HàBd#¬arhnµ(…&b#aåÆÙ;7ª6¹Ùm| wÖ} 쫘µŒw"Òý}!.ÌlœðCœdw“Ï#Õ®Šjø¶ X'ÉËAQß6²CóÙ¦ñ G–îÞš¨ÖÚä‡B˜TM ­ånÃ¥âÃQ¤m¡„Å£³?@Þ@èW˜‚¢MŸ®úª¶ª“µZ©©T§–êAXF^šæâ‡ÐE^É©cBU+4J`a ›_±µ¯xA^èCAdåâEMìd \R»ðDµAˆÚ$š(†)Ô†Þã@ÝiS[q¦Í;M÷JȬƚtÞ.« f3Må6˜Ÿ7°’CÚ<ú¹JAB?§ W8V“J,ÔG¢ÞÛÐ߬L[»è\Ò\˜"&hð¿ü@I}ÿñ¦¨ÓP™Õ8«ÔÕ`v ?u¾Hd85ó ì»ñ¡4K—²eG}n%lGÉ»G‚(Xn)Ø+u,¦r½wAQ1 & “ŠO²QØ=$n¦bIy%eu=«­h­¤3 ذÀT…‘¤‚·,æŽ"©M‹+¦‹UY劈4õp‘’ZÝ´qñZð\¢VæµNôØØ‡ICË3¥`-™ÝñŒ¬êqHÖi©É0³•Ž;·‡/èj‹L@šN£´D¾ÖÍ_9I'Ï\Ëk‘Àõâ”—qÒ©h6ÌÐÓ=n\)€Gêmíë›V“tØBIû^SíÐÇÂÂÑÂF‹kFJ°Äí¾¨ùu9ë¶t9”VòR…™¯ÖªWšW~W¸¥åÊWöH4ØûTãª2Œd»’t.U ðÁcçV}Œo}•Šd㬵µtzRv(Ïè_ÛÎKPiW†?UÖÕ½½|“ÒA>“äVöˆÊ)ÌÐA™¤­œÏšA&B&üĤôÉ¿T‹„ì27´ª´X#uò¾åœ%œ½'½Ø@efÒä|‘LZjÇ•‰Wàö‚ŠVØäéÊf[k†±Îp‡ãnî…`w6z~“¦Xy¨ÈaÊÍŒ X/yç„BÚ™Çô'¡–‚¸²-syÐ KïèÕ³¸x¬bžÌúrJÏÈ2eÛ+cf‘]býpÔªa°{Q¹¶¨Ðz5@›lýŠ<ð€œZlrRóP4vâmªÀX§A“:,Ñ×µm;l)‰^õ ÿ(¥ŒºC ´T„wô¾Ô .ƒƒ‘dhl*EU Vk†pV ü«ì´:t G»ë,76ï½ærü'ü’£u¾ÁKf‘»uÄ8È0jÃîÊÜÓ\™o˜îêg) N?€¥U7Xëd­Çs]Î/·¸‘¿ Rê ó61j­à(ç8.$o.†…†£aUˆ<þ!Z×…)1Ž,[†,)BN)À?ú‘H%?ò•Ž"¨×è‡qg Bá1ŒEeIšÛNÏÚ[ÒOØ×ÑßK¦¾yŒ!Z[;sñ[ˆªÖd¥PŒ™¼X/'±1QÓá9û½€²‰]ÛŒNg\ý‰Ÿ¶ëPJzãm aêt(O!úÓ3é0œ¿ aðü¦ž-[à-Lná%[Ý1ù²-w”µ¬-ju&'ßÝ®…¹YÛõú¯«ä¨ÙimˆÃ,WÊÌTýÚ;§3QQ&ÿòúý„â†rŽèÎ?|}ý×ÿ:þ?zýß:þÿÕëÿéãÿíëù=þþ“ëÓuÅú¾¾b"QN¨&ì -B×c¼þ™¸JŒåöå]$ÔÂ$·s [«CÕö"Ï‘Í&ìGrw½%õ§I¢*ËÔ_ÿz·Pÿè§û—Ÿn^ì<÷›ÎüædÓP$›×ó@ÒÑú…dˆð»`Ÿæªƒ@¢M i£µLºu^×J*9+¦èÔrÊ¥Ã}»²Ì/w<9Ì8±WH¾;¶¡§µ”:êÙù¹*éW&ˆÎwD‰v¦ÉFN¤ˆ8ªÍe«?D\ð^¶;¤&øÊ¥`YÃ?r7 ] “Àn„Ê%Éý;*½V¯Ç"‘r´;ž’Áˆv@…C5hlÏ Sk_8²1ÖàQÛÊÃYÙÉþmUº÷×^‹Ê8ùo2Ú60êÖÿî@`d÷®>"µ·îýᯱà˜ÿ•öó`‹1Æ› ´çV7G9^79C+«M¥Èá{k¨ªBáÊrHÀbšºZýH‰ÞÆô©7·!@x±Dïb®e¼ÇÍí¦¤»òÒ-Ói4É•æD(ícàtOà@ ñlÊmŸìô1õEqtàÑ |^ ÜíÁÿ~{¡*ϧ<<&‚]h³œºfBNBfœºj'jf¦Øß‰FJøbkD`Cµ“5ýBóïä- qóÏêüN·ÒG›ë«Fäs¬@Zà YMB’ÓNx‘Ð82¢mi”‘‰Eh} L$õV}Kö1>®êú=7œ’迌Ơ†Šbœ8BÛ@‰DꊂÃU8KôËk%™ËîÙÔRÎ;³²NT(ùý#ÜïÚPÓ(ÐÉv^×ÊÃs|¢”WR¥Ñ md0äà>¢l3ÑÅÙ #Ê€³:«!Éä£b)$B·¯ö®ÚŽ"ÚËe“ºuQ÷ÊÉ»õÁú; ”©²´ˆu.ß)ã“áËüØ}#á?1…‘¯VÉ{­žÍ…’j¸^ô%)Ôè-aSªÈ"ï::†Qkw`¥ì¶}V™¶;l)±ÑÇШ7⢠Ô^ñäWE›è‰É‡†W.Ç ¥ÕLjôE•,_Ywµ­ˆ±'ßÿ˜°Ä™‰i:qVH¬àA–jö“!³­Ó™‘=ò‚HesÈ~‰³ù ˆìÿNš Yõm4†@Ä™þ÷FœVD¹/…¢XXÎ?H'~r1hÅ(ñ3W8x(>¹ˆ`7I˾ü9ñ ŽÑòEöKg¨_ß0Nùqr8ò €l‰ÇÉ9&|éû5žAQ¥#XÇ[SìmÁÕ‰>1¹#å[¼ô¯dL+q²ªíwܼ/Mñµ"ÄD,Óœ×DsÚÓ‚ßñœˆ°¤¸÷$\¤+J8A qO•€kéÈ­ݛ¿ª¨)rpn¿A°W¹àW.3øø¶å¡—=õ›ÌÛÊõ¼‹Ws:#á\Çsx²[B,‘¨¨ˆì(ǾypcÅ´Ýç°pþú¥äè[û  ZQ&&Ѧ £KW¼¢öãý‹ \aAYm4°±`d’*R¼­ïZ—¬U›OðÅÊ_å‰wû¡k„g}º)oËcÞ †Þ_ “¹ëmö›ÖýPõñÕ§²P¼µk–@s0¥‹ù¾Á¿ððmЋ„ómŽVÏH'­ú>M€!"P&=â×Þ±F 7´C™Å6K¤€Ê–ìÇ€ò‰$×¶©ƒáøSz±á›Wa«bÀIý3{öpG»Ä4ú—7ò>Ýcë®Úr‘<ûÄÁRÂ^õÐ´Ï B¸6–ÑV¸œ@U}R64£üIú3 ~G !©O_çEin©WµíøylˆŠF(ßGã9—ËCEåXb!·Ð¦gn¬y'ƒ sã|¦@¤Y»îÊ 4æ*BT¾©¸£Ì\±1Ùþ # ’dZEŠ·…ÚÏá­|%DZ“9¬6ùìM_õÕ[LR`Nß`²6mqÄ_²xÂgŠm%™0ø2×û=x1;ZŃ·rïo E1ó™#`©¦O´Ik&£ƒlt®õ# ÌêqÄA8ñîâÜ@àrF€š~"ÂWh‘¶{î´}°aòqƒŠÐöáÌ\fÄ0g§Ó’±ôUR5c3¼@Üš27J¿Ù$eRVð™i+DXœÎÁ¯º}œVäýn†úŸNkÂVß–Me¦²}dé”ñ ÙiuôOüÊþÒ(Ò»KÑR°×Ö4ÁcªTn‹Ñ2ÑÆŽ8ÅFªü]ѱ•%lôµ3Ï‚º®ð•Í<¤† ÁØl›l‰T8Ьª)„œŸ¯¶‰Nꑼ7ÆÍHƒ…y¨‘tFÀ }Áx-kô÷T=ÇœÜýí2zЫÖþXè¢r¬-î—åm÷Õ—¢Ô§ÅWÜEì“°³qÞ„Ø»M›Æ ­‰¼*Âã(Á›2`5S÷ ü°Íj4³ÞéT+)Ö·©kïÒÎ5²öq¬, ì¦Á 7'çÇ"¾QSX¤(Zå/M(Ò~J`}Ø£bõ¬£daRÑKPÕ©+P»þºg((¹×bcpw\AX  ¨*š|Jû‘už±^ò^½Tt‚‹¨DÝ@Š3»oá¹æQ4êÊ1•}*­¬ñ`Âs#ç‘Ásüc¥\sÍ·Ó7ã>õåÎÞß‘Œ)ù°a]ô´,¯_²÷)"UlLŠÈ¥é¿eO:z–ȉc­‹²!©<fV‘ŽØ?»‘ùúhc}P‚Þýn.{P((¥ù“À[6) XPNâ¦YÁÁËìS\þÃa@1 ™ ÅØ“£à•Õdf˜M.g®â¢*MkjªÂX]ÔH¢N#³Ó!í[6Õ¶ø ¨UºÕEÑÛ•;N7˜ˆX[ÍTüƒ—=·5dõF±’ÇöYy£ºî_æfÜŽNˆ8Ò ©›âmB(àš¢<6(vQ Îç"Êñ.ç7öL†Ä0µÂóÊï zž4x‹Á8ëdöC6]Û9¦Jy•ä¨t 'Gv‹^‹§ÄU`§ÊO‡ã³€œHi „ÈñM€ž°^©žbÝ‹„lÈ+RĎܨՒ¢pôy:>¥ ‘«LÃÝ($brƒãž Y&ÓÖÒEOSbÕŽKÀX¤%x_Ñ9ÊÆ ø–_áQ£q¹æLàSÚ+™ø7~eíî?¿°ºTüæIÇ´ôíY!UϪÿÔY&¦ãùG¬:D>Ù;;öšpÚ¸ƒÏþõ•I‹ªîÙnàe îa ©Ûˇ|<Ã-Ãî÷ôO-bƒ²oãñiÙÔ—S„ •¢êPž®ÞÄe{ì/ô‰&UFƒbÇ8O|FŠ“]‰XÖ‹D:ÖolßÛ¥–EzfÞUéETŒÌâ)>UœÅÂÿØÁøîP"—¶4'H_$`dö¿ª(f<«WUá˜(eHx-)ªOZXJ™†²›=ÒSGÈ É™ù«º¡ãõvP†œ$ yNEf„O¢ŒUã­â Ù\%ü}‹§qÕ1~F ¿£Ó–å&ÛßþÆÝ,ÇW~×<8—MjÓømCp'rü-«Ÿ¦Ž]–éÍZ3ÇÝM&;ù%ª5']£µê® OƒÐáÓ÷€‰ä~Ð:S òDáÈîð+ÏMe2‰ŠíS 8]EðÒ`2xðô©ù¦². êûes,*™øVUzßÚž­Ã$é(#¨í­<,Ío#•Iƒ|Šÿ’Ý.;ÍdÐÙÓ­þ;¶$67k©êBáäЋÜ1òêú &µlù¿UúR¬¨fN¤yGHÇkI¡®²º2‘7J­¼^ñ`U=H¼bx¿›ÌX¢q£m*ѸEKâ z.ë"ÎiXS P¢Ì·ò /8ÒQµÃ¢†&Pw~y*ÕñX ^Ò¾”Pp >n^¥;ôÀ¸¿5 ¸,C»Z¬È|,cn ÍÊ3³$ˆ1ÖäSö2~u)š^iqKÙÚ\6– uq7º"áæÌé0‰r2rå)üÛÿXĶñï”âÉR”OƒZÃÅxÊõ£§u%ÿ礙À#Ï LMàŽ(¼œÁmcÅbÑ[/c¾(TLôK³¨®”ÅšŸ€Û% ·2rS·ã M ý0ìÄvÓ襼Ï݉ÏX"  mLøªztî…꺖B,fú ¢8KóRK; …VH1›NÇŽ—)¸ß eyt¥sù ZòÚ$¸gðà“yÛ ºv7a_ì͘»ƒøY>Cd$¯ú'‹?Túi¥vƒ€FÖÊ,´öY…‡pËÇ’mÉi´èÿ¡R¡hß- Kfðí&Ȭ¾x²TeL·fuµ@-|x 6Ú*ǃiOk˜Z€ÀãY+ô=â êªå¤` Ñ:ι½¢G: ¦ ”9ôº‰ÂU,ç¦% TÛï¶ÉŸ4½ð$Ûz ðƒçûñ–¹ªËRwWŒ†ˆ°‡v̲¥]¾P¬. ²Nüï\›ÊÒXæC»œµàrÓ–bW09-SiKÇ$ÖêÞ·—Àú# úÇÿ0®¶BLŠJ¼½ D”‹µ‹ùÕi´ÿ%¢=Œáºc}sfhûŇ(GÔó}°£{~ëÄ5³IÿO,W4Bx¥$±}¦#§m¬a|ÁÚ.}»…ÌÄŸ”$îõíS Ƹ– ”læ±þñ?ÿpÝóxç ª,yÛOñ}±:1VV˜…bÒ1z‹¡·›Ñ Z¹ý û$k×!hŽ0Ψs hðûÍŸL~AN¦JFEªb¾Ž ôŽñ0ÚøÀ+_¿¨)¶3óHaŠë BnIIÍÔãu{<ž©Á¶î¯sÉGñDüÀ~—sfÖ«+-|ˆ'‹ýâฆ ½ô?õ€:6êä¶@ÜÁ¢±wÖ¾ÇÿY'÷y"ÞšŸ‘.D¨øÕDÇ[#šÑ§ØD?8èõ656º-ؼ2A¿Žç”*eïòíeN³ˆ•Îò±€s})3ÅVÀ ÑÛžãä³KBã&#"^qlGD’“C»ÉÜŸ3Ÿ#ìž§¯ÕϪ5aàš÷süMSÔ‰…–MZ^€ØñüXê-Æ„"ã8™ß\)ô¿{#ø¡#ਆ„Ò8o»×t)¢†ÑDDIÏ‚,šŠÃi<‘YWV¯½Ì‘e/M¾çm6e×íRʃ@ãgÔ ãr®í(ܡÎH1$¹2R…“­IÓPDðÉ*à 6ŸÛÊmŒ›(j¯ÙpS+ád| ˆ,j)ëÈtìÍ K±W ›Õ7»4‘vU©«¢{ˆ:`§ä M)ž0u5¥g`Í(™/$ª;l•Ôñ¤‰¨tbS§‰N¶d²p‰éÙ‰œü6ÁÏB)`öëºT…_²æ¨¬àôú!H?¢f„Nf-õ6ÖäߎøNn8Iª)—R Þ2UruAt6ké©ó/#IÈwÖZaðçðƒÇ*ý¤o×Zý‚ }ͳjL¶u Þ´Oºù&`Z0›Š·>ŠæbHm/¦[RC›–ƒÍ$¢º;ÿ’sáígrV;‡¦ ý§PQÃAy)Ñ£x ;.L$Ò1>zµÏI©±Qñ_Sÿ•JÒ™ÕJŽù®œÐœ1Bìà,¡²v¸×@ú3KÕ †hREAÈÇk\a§1Q‰¼ Ê~œŽð°TtÈIò çÞ¹o¤L BƒJ‡áÑYXQʼ¶‰7hðÑ8Ký­ÓÿßãÙWúUŽ öCÙpÎEMÊRôfÚš£Aö^$r `uDg”:,=< ÒÑ~Š"“Scý6›;ô‰ìa)¬åð¾ˆçIC/¬Îà¿à$äÞæ5ÛäFyf#ŸSç®<¶ÏMc­,ŸOÁ³Iï™ðe[|0Jˆœ¸ÂHŠr€ônð@ºc¸·KN¡;¤±F­@*¨»´¨{õâ+H´VgËI zÒ´¬<4µ÷ÕÃ![ 5Xƒ,ˆu©Pýê½»5 @,ª¨Ÿdó°Ò¬ U«²eÍì¢ynÝ:ÙÊ{^gëÐð)O|jM[cñ°¦'²@åj)‡4ÁÔ1ïLt‘ò¡Ð¼pD®åG9Óç{NWa ñ¯¿& ‰7 /Pd'ziø†±^P¢ç7y™¢w|%#±'„qhìÓßüì}ÀÅ0'&¿jè•ar1Öù´Pop,.ü&[ÀjšÉ¬ ¬ž ”ê—†}¯w”ãZ.zÀ¾t¯ùÕgSŸþuÒ|)XVe¸S¤h!›T1ßêã5âý[¤W&VjV‡öÙ*U?U¼‰Ù|eŽì/¤ÍC,Êܺ„q…dVuRÙ¢4ŸŽ4aÞ“ÁW7ù5 ѳ£Ï ôj|ZøÄ°†±j‡À‚F¼à5ZA9Uã^?ª®ôï ÜGóÍ}½d©‰–ãw×îqžD ±tØÇŒ>% L^꣊$²ëH¢Ñ·bˆQ©bkMñℤ!æ>2„þ,Ž*]E=…Ñ@Êæõ–ìEâbw}j£ÉÌé>öšEÄ $#0¨>åÿbãú› Vb¦½MôcÌÊLx#ý/^„]·FJ³"Ù¦G¥àøýêÐ2KÿºÑ‘åÕ…«"A+¾ô'}*¢@$ãí½ ys/#« –_j³0ðW”«FŸ|<Ž<”" ü8N鵪-U€RŤ ÎkŸ‰eóÅ9«[v'èá+r‰ŽºíPw°¯Õ•6C±ü‘È–Èk³µ\ÅAKŸKű,ÊyΘ2_uZ,Ó•b/ˆAøN’²Nõ‚H¢>N0î“.]­ÌcQÑZòÞÁŽØ@„°éºvDÄ#ƒr]z=&T¤u’!nê\ÉýQñ^É éƒìïòHZ”Y¨‚(U>Sñʱ€+±/5fó§ W^%Ó©‰Ïp0)ОÛúE™]“¢tKäÕ1I¸Ò3[TÆ¥·Á¯Uù·K xƒÄjÛʘÇãã¡ÇÅãñ…q’ð¬ *Å5#ô$Ö'UÖ*†ù¸¦Ç¯úÇÊu ­udL»§¯›~É{WëëW[W8Oƒ/sš¡Ù²,¢—å­ÍÂyúƸOѶ‘ËP´ZõJCï Á¿ü#Ê 6}"J,0yT‰ee‡GLDð¢:N(UôŸkXVYZ«¤¢˜3^*E…Ä'odLád›³Ñ¹ _hYÑêã9»êÔk×+QãBßè`*¯\ ˆƒH”Û ¸Ëù ã“Ø+¥Í\é‘™:•ÔŒÑ Ê©Þl›M"n좞‰c&tnF¹¾ ³fñF·«yåœN2r®¢ªÃq*Ûy PnÞ{U;égRè†Ä•t¨À¡3«†4ù^EÝX© JS½VàYÍ ræÈ7E<ýÃRŠV7ÔY‡/am ê^Œè«…Þ–/?ߎX0Ù.¼Ü:f+ù— ¼ÉBÊC4R$xÎ굑:_Q6MüЩu·Q3[•J.øV1ŸgO©q¸´oâl’¥ûtIVÜj°gÊnÀo·ÑÄ ”iòÂχˆ’Ò7/i/*„Ïø‘jJD6ÄÃRÞJØ–ÓU×ÚÚôß °Tt«C™PSA~ IK@ùÄCŒØô]rÛ­YôMeÏ +^V·p‡‹@æËZsi“2! O}ò TL^VÊÃ&ˆa{'ÁìÂÐJ6®k;§(;QÚBå÷]º4Ë2sF9µŽ=5À*5ØI³©Ì ·3M\6SΑÃ1Ðc‡ÒŸ[šYÚjQ¸Ø¥góË–XŠ€Z@ÐnFV¨Üj$âµä§#áËÿ…¸×]äÓ YŒ‹Ž¡'Î%ãN”š.ï2iðG:@œ¡£á¡šLudÕ:ÊÔPsjù£OHŒÒʼnwê~E£#¶ÃM€\8:¡,ÎöЉ'/å‹õñŽUqâíKÎ[x¢’@æuÔù0)å&Dzu>D–„0–âIöt¬=ffÃÖ‰þìŸE÷-0rJ(#F­êÀ¦Vû…,ê¾£ bŒ`ÙøVk`È¥J›wgÂ{’û/&XOrç]^ŸK\¥PŒ/P‹Äb£WŽá¬è2‚—’‰Vza¼•“”ÒÎÝ8¼ùë¸cTUY‡8þ“ E¦² ò×Àoj•®:x6„q#½œ¨ºÒ9o2Z› ޾á64…Ê$¼­¶-rE3AÁ:Ù/… @v˜¹Ÿ&Ua&e·@)ó¥èÆ ¦¾ƒ\ö„Qxö«-"`µ¼We:ÚÐûÃÄ}™íó4ü ü+¿NbÑT”`dF‡µ^oö'-9ÿ*+)¶Í50¯ïª€¤I ™C”ûI¢2õ~µ‹"¢CjBNÆú°jB6\ ÉÎùV¨^p I!¤ZµÿWœÙt4ðÁÒž`dUÔotŸY㌂±¿sâ!ŽÖí£¯:y&‡ V_%tþ[¡Žú óV7:”}~áöQ|IvÇ~Yøß\5ÅÝ•`­ZP(è&uk•Æßéo¸x„«aŽã³ú}±…Vaê©of§¢¾½ºùÖ CÓT¡ŽMvû`Gv}Y±ßžÚ±‡—íNhÀw0ÌMü>±K•Ý)²Qùí½‹yÕÏѼrU•[‚ #´ J»[µÃÄQn¤!Ì·pû¼ (÷ƒ=7p#9[Тw¾‡k_£iÔ? †1€šÖÐNÔJsñÏVß"˘ AN5 {1vodü˜xÂû¦º‘ 4çz!rÔzßú>û@޾BÕî "§kÛð(Ÿ’.®1YÆÅÏqò¾ #–#ÏéGä6‡å$»‹ ‹±CN&½¬íŸ:bKGêãr-ä›ü ¢Iê)Ç3ñ»Ïa_Î'”±é25™`ÅÅi¢‰¹ŽÅý_ ã“°Ë[!ŽɆÀ^ŽZã´4UŠ1 ;ó+1ãšÉºÈpo?ÚÚè¨×(:9\WŒ9¥v†‡*‚P,/ XŠŽ ²2œ5Ç£ÌIÝEµÄô‘žuÃAVĶ#ÃÓ¥2ö­îôL™ GÔ+\£ŒZí.DŽü–nˆ&G{6®5Ãfà­Ð—"q¹3\JÙbDx“¡Ô1bÁ£I±~‰Ó!Téý* k½Îô'Z3oéÅ ¡ê]næG¿V.nó<5Á–;:д4æ\VTG±ê Qi¤dLyœ™ûF pmÈäÓ|ï¬U}ñ”j8óÁô aZˆ"çÐ-frw‰àšû¸‹ˆXž—·Š1)‚ýô@§;¡Š# Gô gÝHEðåmh×öÑO€€B‹b˜PìíEé.'áM<¯3r,×Ü/E3œÜžÉ·`¶w«ìf »3s'”Wÿà$Ñ£‡ðVu·Ê’Š}t¶ujb޽ªÂÔG÷èÀ¨ÀZk¼Â1 ~®TTÛkc³ï޲í¯%÷|œú?œãu¸üžJ”NÏl 4ÚNXé>ˆ’‰ƒûg•t4W©m_-”²,ϹZË‘±÷vëÀDb9M’z¾{#o½Q¶êèó\üTåŒçQD)┇†Ç@ÈÚ…ÄGè jq˜Ôš½6u-RCDP«™î¨î*ÑÄó:…s+/ó 0K‰/8¤L€Ž¡HÄh¤Ì"ì—‰´ªBáõaÝVD€Ù$£d<8áfçJ›Ë+ÀÃܨÖ=ÚÝ(÷å9&ü°UæÉXP²5P\è7s§±°“‘\¯Ð«2vqXaOÿâ]ŸÊosðÙgßmÎ~9eÿ@ÄyØŸºÙjù›¾³ IÊI–UŽ^ç<èëoCÎ<ç"'K5.j/ŒuÊ ßÈ·äØc$õ[.gt¾ó‚DU¶¢€ˆ"ÙV1¦ð7K·×Öy1ø4ç=ë‰c3 =mêSûÎ-²d&ã÷ŒnTôôKÈI™,^ZÕÕÆ)ÁM¬6µbf‹¡Ï4%¸˜0P‚•Ô)¶”ïzEÙjq·ªCôQÐv$ËV’Ê ¿µL*ÊKÇíÒxákö eü{«NøKª‘m¸<ÈRpäˆB`@iGä’ Jî-ÙÖ\o¾/CµÃ‚ÙêèåMŒÃ ´@UX`Åa¡ ¤2Ú€ë ó/.Úç 5Ø®ðH«×‘RV¡5ÊX¥V¶2×GKd›J Ik…µ»1 ½n:œ¢_Ÿt8 ²n.MŸ„]è8æ`ÒÝyŸJÃré}Ì5ðø€Üc'Ïvn6B[¡zÈÇ’­¥R%&JŸ7×UŠ\ ~J‚| Tݾ‡þg_S0ñdšA„4¤Çý#%vfo9pj:¼ú48 `Ž>dã/‘! yV¼ªJëÈ€ÎÈJ ayÚÆGµQEf#ïZùÄ9@ym[¿ˆlÃÌ¡Žv½±Ý[}Ió6Y¦ÍõÅ©ŽƒR´[œ.C©æ¹úüôBZC g³XU‚ᚨ]ÈmC¥¤°ðŒ¶ÑP-g¢••½Î{‘·yûƒŠŒ@"q*ü¼:”ð>- È,–Ö"ÔŽGPŠ`:£¦HG5‚…ºê®`ÇÒ£<½rÃ0™Ú®í=ê'û¨ `/”­SÔ"N®êšKå¢p)RÒÒ#ÞIÛâÄc(hÑxÔº¯QYè¢:lt”ýOÒå«/ó¼m£[Ob”·©Iµr!*±:åÛs£wNª†MA£Xà˜¬.™ÂÔ gHÞŸŠÞùG¹§·°XoT7¦m!½"²Ê§/m;#®•í‰t"Õ™[žÍØ`B2h9û.(8-ˆÀ_¡+µY¾GÔè`ËFâw$éݨeV^HíÕ‡PsöñŒ:E1ÝÛœ«t1Í Lß ‚ê…¢„‡äßùHXx¿³©mè>8ZUôªIdv *»"=ß»ÃM|‚aGjœtªÚKü7tO£lî&Ò¹õ«s§ ]iDßôwZq``–øjãKPÁY²–)mζ Ê’pÍñŽ^T:Îuå7ݪ8k“ˆ£“°›HŠŽÐÊ,C½&;Ê4{cw X­­)›­Ð%»ŽGycImZÆ”¶nïú”K:Ò¥šüZrɼ´Ëmf.bdª& =… •’åúâÞ5[b‚]hæJ¥VæDvÿ*`y ‰ò•Žñ ¥"ÔB/ò‚/Ù 3ç+´ERЙ5öZUŸÝ—½# l–2ç \4-ÅÎä2ñ¼ÊïŒn¨½sgΉ\÷`œ:aîŠt¥ v¾)+Œþô²1h?2}½w©¶ó~1™½x%ü§Rhñ>öjHm¼ó·A!iÚ’¶§%cå•1ŸBÍ EœŠr/ b‡½pÂwk6ìÊ¢È.fBûT2)•g27‰£r”¼­U«Ãòë³ÅÙقϰ”µi‰…½L4Tð¥ÕClªªÉߤšÍ¾¢|Q’8ö˜ÏNÛ:*È?dÂÆMw)ÛžÇÒ+\8Äa íR]—ür‡Æƒ¼x,ãëh$ïèntw^>:j²+Õh1À§¬Êª‚«iuN$Áë/z} ¦–=–JÕ'éu¶"¶’S2š×i<0¡Õ­Üµt/nd‘–ãújuE£ ÛÆ"2æ²$™€Û8åXÓ ¹·+ˆÀìÜñÀn( M‡üÅ!,\š ¾—Z¯¨ËŸ(ŠôÞ1OåÑñð&ü¬äþ´àIAbaè šáÅ[àvÑ¿°"qÆçòTàÏ7€FÙ&ú‚¾î‰*{÷áPg¾o9±2ük‘ÁÖRHI¶—Ýñ,Ð’Ž–a¤Ù§þ­9‹å®¸=‰u·žX&3l,ÐêKåàÀÕd…ÕÑÔ~™!Î8¥Ž§öâ°6Á»7Þr’JtDº¼uŒ,ž„»o ÖRšnªúzx`ì-舆ë4Ô†(OLñeÃ:€,ü£¥ ™,¸y@ÉÇ+EHºZ NsÑ?jÊÙ¿Í”=ó¢¹ׄ¨'Êš…ê0\áÚëŽÔ2ܵȽ¨ 3þM}¡LÒæ÷ ¨CøkA“PYØ+•¯‰$û),cÊÛCb¢(”E„¤Rêí~±I™¦fò<©Áü1Zð€f*œ“ѰJ¬ j.“ù»9›è½±³z ÝŠ·ã£TæˆÆ`ý¥’ZJŸ!ÉÎïÓNš²I¸•ažcB)æáG5¾\Ýs7TÉtº6CæÙáÙ{̱ Yb¤M±£R‚žQÿ)IņV”R¤ßD)˜@,½“J€Ç˃®¤’ #ZB«OÜw;ƒtï÷¸R'vÌ !Rú¶ÈÉa˜Ã~*ñ(îŒã¯èÒô,O´°ê”’]%‚WŽHY½;1î(à”ëæGËi‰–ƒ»¹.ï“V*E¾ŒÁ±Ñ.Q%œ±`+‚¡È2ÕÖ È¯À`ê)RR‘mJX3¹Ð ÒÉà‡¥î• ?)‹Ý¸u+¦e…8`¹UheHÏ{ b³-žé¡ÅˆFBÜ+Išš_‘Ý#þ¸œ³@)ñËéÞj¸Û¹…ŽPO,Ÿ»‹pñWæH]‹Ý®O×DÞ)GŽrwãlXjs9ƒdVŒN·'wAnaœ»›¯mT9椼êhõöÄè É–½ÏÕaù õ¨(c%,ÅÛíàÍ+€É‚®§ÈÖèQ»Ø‚¥¼8ÛÛ&¯$ÊÍK-=ÏÇÎ ÜØÁ“ k´¹ô‘RÁ2:T6: •«õƒ‡‘ÄWÛ©_²&”©#ÕÍ݇£ý~®‰ HR•”Ù•é‹1o^™ŒÛÑå“4T–@iGÐa­6L° ÊB É?‰¼­«šWf©„˜Y–a+³ý£:½‰W<Ýò  >¼’ñ§Nµ1*0 —0ÂàOøŒNÌ:ÜÌ›éóZ“¡‹üc»uš ue§EæÃ[š±¢p’S-bæ×±zVž^B˜ÊOV¥ˆØv=/R!èJÈ€P—ñ â&È¡qÎDÝt†Nï"‚@‹¹pV±„“\ã‚:nWÌ šïÝâ±}pÿÄ]#@EÙe“¤W ±îA-Q¦šØÅ•ˆiÍ'€=46€ø%Å$&¹·5%“>âÓÛAPè©‹ix41v†ìyÐpyQëU¼x÷x*~iµÛ°ÈÚ–ÔÜš>‚³MÁ Z·ð¤Ž”rƒÀŽ»WÛ”rŠä\' JùS‚¨g³áדÁºñòç¸ áódåªëg=lG©Fa"@´þ1“IdL‚º]ð¢G+òN¼ðΣà^š`©Òáâüco¬lÕº ôCR¾ò1JFë%­“1ê†!I!†Å¨TäNEOöŒ!JŦƶcWþs_tiRmcB!Šˆ? › ´}ü.àbr©sd«ê’h\íÐS9|•ÓI^F'ÀÌf!£(¿¹,fk1ÎA.ÏœL,e²¿”,_ç*.ïƒ[$BwÆŒG‰üi»Ë˜û¤C©Ám¤›¶±‹ç7ÃB½†)ÔÔS³‹ïjl2ºXúSqFé& 4›éÌ5Dܼi)ûÁãPäuMJ´è°Ú'2Ífz†kMADvóàlšµ&«À® 5ì{"^J×@Ñ¥$® 3”è_÷W%;sH#!“¨¼¢^í¦0/úñf< ýöÍØ”…§l0ˆÒ×AÊEq1V&n푪±Dc9Ø IÿìX8ÊJÔÖÇÅÀJ ùLp]À+¨*o+1†57&ˆg…Ü&$$ß© Eè0ØñÃÆÛF(`â$³.Ñ…^¶Q>×n¬à ág)ö¯dCåBy»ãûÙ|'š•ĘÇi·ZE±'ØŸšøÎax¶¬¡ç«;ú:}3Ú Ö›x—ãú€_ÑÒ‰,?LÿÁpGÕãâ§€Eþ®TBê¸TQWg'4…›4ˆ¥ï‰BÚΘû¶ZlüªHx_éŠlò%Ý î9ö ee¤êønʆQi$T:cÒøAüÉh—´D…\MxAüÓñÇ'x´‚¡µh‚Q ÇTf‰>ÁfܪªŒ¶®6+ÔDá¸Y Z@øg÷¯'<5*é+‰Ñ´UH­Ã)iÞEÈñ…䨴v5gè·]˜ÉGRF™f4g˜·†«xëEkjy|ºÔIs#lGý·Å@iuÕ€æß¬'m°ð1µ Æ]Nˆ¢SðFO½êu±/p0ˆl”O—KpÂǬŒ˜IØÖ¶‚È·rJ%“3)åéfÔÀ›G£F»·Qp3Ôà2Ћ5—€y:‘¢C1”ĵhm`×€^r/UˆŒ>ö¥‹+œˆeä¢P ìi-$™ÐÛ2eWfT³È לgÙ Œj»–°yéfJd²¡þ¤ÕÈg]¥k–·)v2f¯‘×_À–²¬Æ–HŸÆÀÛ ø¾R5!ÜtÅnÁV+|½-ì‘4IÌ]³’tK0œí¿>Y•¾ëz¼ðJ@£Ýö>)Y€³ ÀûªOD³çÖ ÿ¿TP¬vÈ÷°˜¬jy‡¯ÑU„I#ì¯nH…ÉðE×0ðÏá‚ñ5UV»-­§™<1 mÃxüT¸Eÿ8(ºé•s¿:•i5ýôKÞ¼t'óSï˜ :´ÿ–FR1¨6æÐ$˜? CåtRmTÀgn0Eµr3³€Ú›Î4¬YwÀZÀn4å­l4Ëɶ;›qrQ°eîd‚óõ±4q;q1&-fV× ¦«]E^³ÛF¨ŽF/mwt+À‘E)íÀ‚`Y’ÃëWˆ5"+W±ˆ‚¢U (ú¼ÂÛéH lÀ;;{9­‹£Å" ‰µÞwE{ÑqÒyþ A´™%E,ýÅä#ÌïA¼}å¡Mu`²±8Y*eb)¨OZ©3æê¹Ý­Âjcd º¦¾xP!CÍ•—Óü ÃJ1MA‡b§µ%e…´1õ†«¾Ç¦ÐÖõC…SÐ!2GìÃDŠQJû$´[Pñj(–e)=ÈWìÎVCc % ÑÙæ¸ÖÍ,Å$5\}Ñ­2t¹áœ1¬:þu*6¼}´!Z©p,oÎþ’Ty¹ 9d|׫‡¥TbŽ, @í¦óUÕ^\D:vGEüðÓ‰• ÈQ‡…ï@°¼¬Ë»Ü ƒµä2bnWk²»Ç9¨Æ3ÖNæÝ+2T–¨6‹ÈvIåJ¿Ùä[ð2œì…#Ԝȥ2×ø}*„fÝ‹Õt3*¸¸²N›Ò¡4œ­»#¶&ƒ—]·Õ¨³`Æ¥‘¼’"1¶6í§Jh¯1–ƒÂ•e­²ö ö+Û*)ÉŸ€@»‰Zìòrh+î ¼#GF¹-ÉùAvh„/JPÕ‘¤Òýʃ$Ò÷KsÅ¥«UBáâØ±4¼2êéwßàå­øn´äS®_íÜ€ñµÉÖïëQ2GfØ–q {sž2­•.ùÝ©Õ}@ÿš$¾rž@n’Й\1huD7n0†ÄŒrÙ|¢ž2Ç&/…öÇ`yl«qaêëW,Œ”º‘Ôe,îëÏÊ›Q |kt³Ä—cÓ,‡¥Ž4"!ÖņLͲŠj¯¶¯­Ì¥0PS2#2S“h¾Fï]0üøÎŠK°…^&KTP±€RîTžÓá;­y”»WÔ»ÝäIU‰Ãº[ÑûÛX2‹c{‘Ï`y:ï:F.LŠ@"¼×,§2ãB°:)°zZŒ ©Å>bSqó€3—)¥øg*•5#õ<¼QH©j¹Ê.#Ù*«]ÛkJÌÙî§²N©â–FB›’˜±MÞ·8<Á!-’ƪð:ÈÚ·ø[¿O×ø ¤­È&Õ\NHaºŒïØŒ`RY@±2õÊL¬°×)¾=+]Âã‹é^qa¼ŸÑ$9Y=à%¸¥•7Äs~“D£—‚8ÅÄwŒEª—¢ÿ)"owzóh~’Ž—àê=XšV³Šîbix7+òM·j¯/Ÿ„Ö#?iâmÜ)i·Z+ÇsØ)žžÍám¼ü•ñcì·jV™ßz¼„ 8æ­jœdÓ×Sù2t¨#º:hKîWyAÜOóX €¯tLF8ZA‘CÝð¼N ÝpLî¼M»·Ø?ç6žÈ nOÔ×´hÌX~ÿcÝ6×éps\C«6Hrúæ*‚u=*=")k†/V¡w™‰%:²Vz–7–I•u®IJÀæžÐñJ¨â®}f]Š@æ<© ÖU¹WA¿×¥yÚÑdSÿ¥y;êÓsòÚØüö'ÕgåœyÕµ¦ß= DÖJ@{"ÄÌ/1‰ö°:Õs­F¯óoTy{‹ßy]¦4Rl¯àMÄ«òäÏö 4,Ò ·¯æÉyZe¶pàÖu¹«ìr´‡³¨ÊÁÞN×ôù’®Ô8¢ÕN1Ùùºe»Ÿ![Mæ×«KŒÖ‰f ýaУTÔ€ '°dhr¡ë/(ÔÈãl†Ä T GiÙ±v›„£Ã‚È4E›A9Cs¢çz1VjÁ&Œ‹«ý+F]‡EóÁLY¦n…d4QQc¢´2Ýù¥tòoå[¯‘jîhÔê”Y:*¡]dBÁBÿöQ`®b4%¨¨n¿Vv*Oœ¤ý\7(…•GO§aìåƒëE­]—_¬sI¨û*ØÂVAæs Göõ*²}UjÕœÉùh‡Ýù›•Sýw$¿¤òz$û/Èýû×FJº™óóã-ÉMR v4ãÕåpª:xõåÐVF×¶DÙqoTÙȦËQËR~óŽJÍ GùËÑr[Oàæ>‚Ü{tÎ×m*“æÊˆ'´ 8¬$ä½tëõTÉ¤ÞævÌã SzÝ8’jO]ÌRÿ¶T?®U³uìU>ìC}"Üg Ïa4=Ý›ÔËÞ’[§MeøØÊC^d´ç*?~¨Î ´vRµ'oÙß»Cµe5^€Ûð¾Æ)®b¢pQ½×Õµ]"L«IЏ‡ñ¥`´ õéØÈûý½= UH)¶‰“º#ôËÅ›:O¥bˆRHcR´f¡ͽ…ØLÞöW(r’–¶6,¡ÆÁƒ½TUi0=æzKþ`}u\LÞAöŠb¼¾O,ç|€áú0 íD¨¥ƒa3qÁð ê„÷"@DP¤»£…:2¸I0ê‹arU³N`Lâ4Ów 2è;,«yÎÜjÚ&ûkÍijy6J(#Ñó8ò7ì'iêÊ4‹6éñä±%ØÐøÐ¬Æi«+?ñÔcñëTÔtlúøN¯)ßCQ, Yvšh‹±gªPŠåhÙUAÑÖàIøV%ø–,öi¯ß‚0½ÃËŒÏN7ó¤Ó›h'aÆ{ô(ŒŸW8¸xÜ"Ð+IHÜsÀ‡UÂ$÷@}¶øö╜p‹"24·ã¡¸Âc­J0 l¶}å^Ÿ,물ÊOP/ ¶óæõëF¿ …Ù3Ô2¡œE$NËÕkPN<@ì‹^žvv~.^/óòTžÛ…2¬K‚7δ´Ô©1a°é#ÛwyD»£„®9æ\””r{HÜ‘p]‰LLJöiçy¬µ(¬ùÛn4áK¤+†×ØI@ív5nÞÜøý°YÚYÀnÑcĤqÜlF`ˆ bå•u¸;Ÿ¹4áôŠœ{ô¶2¿ø®½å0/ðêfâŽÁÍžyÕè‰t¸5û(CP6Ú!RN?@ÆÈÆ’0¶ªB‹ÃS¾ øsÜC>\ÂÃU-b¶5˜v¯Û,sÙIÜiËmEüx½Š,WRS·™»˜ ¢êÉüð ò'¼¯ÄÓ ˜ И`oÄÛò°ªÍaÄlΪa¸âÂù§|Ž)¢v‰K2p`é¥ìu"WRGQY¦+ šÄ^‚]gäßy7Œ'­IÝtz¡µGÂxCo2&:š|è }·Ìé é{›^JO¬¢–YGdǃºv2Èg8’É›¡ÚÒ<Õ:bWôI;Žj.Ýí])¿)ØÐš¤õð·M,ÆÒˆx¤r‡Á>ŒÑJ²tM!yËᓎ70s!è«ó‘}u¤i}Î_Ñ3ku/Ñ÷+Ûç%(ËØmUNeÄ*mÔ!ð¿(@ç@*¸ ã·¿ý-…¤R7D™‰ –Z‘6È8£Ï¤_‡Ê¿U{0!X0:ÑQpø`‰LKó¡ù̵³L`q†½û—Ê1NSo†tË*¯v\ØXXœ•ÿ”¢X}h3Mz3ú¥†Ž’c™¨D\ç¦¾Ž¸Ér8á'ܯ¾Ýü~ƺA¸Wâ5 ß>BHI*'2!¾/iF$½f»ˆ,êâ8§Âdȶ¨ãëyCù*‹Þ„zÇPõv`ÔËûغ¢0êÿž­SÚhMbÿ’¸&øÓ¢gÏ„š¤ma×nLáÜ  TVÖ¶ åà†'"D ¡K›ªžèº]ˆ5az€Àû+‰D8h|¦ IŒã`ަ«¤ÒL¬ñ7¿ËáqË&Ëp&¨ÒVÔ>”xGª`©È¶¶&¯®Ò:?ŽÞ×õ¾Ùu'ª#Î# ½uì îÞ«n¡=ЂßÊòPpþú×rtA4êž—cÈKŽø@BÕ%¼5ꙹjÑëzÂ5*«aå»n"ZE»ì”<ºox¼ic舙u¨ÔùÙ¢•{šÛH‡‘Fbã”f0MŠ!KŠºøß_ãÄ}…!J¬õí„|w©¢ˆ^nYòg„lq(øä¤I×á8Cßy ¼aí‰jFýƒÍœ’M‚ >XÆH5â²l¤†cR–äÕŠú|pÉ×Öy} ѯ¦e™t%«)…fU»y¦DFõÂ#ÌLQu¢–S«ÕõÛ4Êúµ¶S{½<ÊHé+Æ>ò7²B-aµŸ/D@”•K/¼¬ý?œWâá´·27ç7¡7éýÖ‡,Ü¿NÚþœæ¨T°ìëp|9cf\D½UŠÊ1¡â¬Q¾÷µü<{¡(aÃü<‘‘f‹6],©ô)?Š® ðwð_ñóXx_2ið×MöÚ ‹µ­ ½ñÙ@•5Ìb ¬½'ö§ŠugN,nSÒ<Åð5¥ŸP~Æ©ÝîEƒ¢ ;UÇ1íÃØ­²ÙÜ Ó®PdmðRBÄRŠ«8js3QÀ¨[ØAVô“N ŒÒ)TkSò}67©ÂÉÓÝà9­²ânkºM¯Ç¾ƒ)+âmˆ2Uᚉý§\IchkÙG}¦Ö¬itê`˜:œ aùžˆòNû|¬ðn7\d (ŸúŠ(3¦ø… Ä-àeÆ,bîEe ëé­ê2 ÷½=´z"‚ZÄl;dò-Î7Tì¤t:[v£µ:‚2¦6‚ÚÀ;ÊÊ^bi‘XOÝ* Yi§´v³•OX¼:øn±j‚Úg¾f1¼žH [_?ý ŒÏª¬É'ì;‘ó¶wô’¿Îî¢óÛT¥ÁÂ/ök­ô‹0ÐÀ¸@Uá(Üas±ºr‡‘d±GL¬™£^Játô®ƒ®^ˆ—Q›j2&"—ΆåDc¥å`*:.Ü€ÓWä"A­)l¿ú§´s6fe{kÌmˆ@YáÊf“ÿB‡l<27ò:•P\*Ciòÿ"¸¥‹àN}âàVTë²Á¤¸­›ëä¹2Òˆ)¿F [LÝ&©„@ lPê]$_B…·ÐÁÅKÛcXi«ZiA¢Í—=L?¹l LÃË%Èßo1µòÔÿaÜýhA+6¬SÌ5^üšq5ûX úGš}Ù™XtPlY((B>d†30—¶˜^¿ÜEiç"&F0CÞä‚:x½ðÐ:ÑK a#¢ÙŽ[…÷ÓÚ4²”[¹„³ãÓ8w ž(¼åóÍl`¡y S¹Møâ¾ŒˆUQ§ó$¥‘4¼ ³/úC‘âóQ™Ô vk‡®Ï“з*pê³Tï\ @»¿þ^½ŽGôT@ù–Æ>bÏÖµb[ÐuôŠ6¹¸î˜"ç×él4ˆÝ°oÛ·XB¥ x÷ùÞ£7 ÔÓô+¶ —û~¬ kMè°ît•/'½Øú³­µãûRgØö°fvV;ñ-w§JÿX!F6•ÕimͲAz©„¾^m¤ÇuÛzUç’ô~eêt~«aÓ%W_¾‘îÄpxPþ¨ Ê™ÜÜÕNS©B¥Í7[ÃÖÒÈ:: ‘¢ì#joIýüÐ]îq–[ú ¤°ƒ‘< Q«x Ž6ÖüFô…;­rÌaO2g!áÅÄK´¨OOäôF5´COJ‡CôÉDî½ãÿ ÍP9©aÄÒ•S  ŒBƒÒH¶·+p‘Ñ©¸ N‹ÁT°¶eɉ±ÛÄDdzÓt˜Î‚1·ÙÙÌÓøF¼ž5„Eáeábÿh„󋓇ºGHÊ3auâr~UAmEMÄàs&¾¥Å,Û•X~gž÷€¤Š´^K9ôÈ~‚Û»¶ÜÁNHøqÕ™ubsmT7Û´õÖ~@ظTÖù±¢RÕÑ1wò»µŽÍýz.sŸê:ÁØP't^ŽV¢Ïy Uø¤½z¨P‰ ˜øáJ¢åš›ÏÒ«ŽPÙ‚ȸšÀ„¶Oe]:ɲÁ“½Ãʲ!pxèp’¦ø»ºWTh]ɲ´B­‚ë:"Æ4HlÕÝdsz¥Å¢9{gß/q÷DO@È–³ŽÌ?øä€G×*}£"óKë±ÞªjE‰c0$À&˜ú>LÈSrÎÄ@)R«Ì»õ;]p…~y¦.wª#ðUj=¯äçR„AtŒ ¯[·JOݨ3•6ÿÕ„‘'SYHKéè=­ìGßt\³ ª ö‘Lq¡ÖÉJÅYOhs­Ià÷Mll§Öß¡ ¯ÃnGþ“ c åF$@#Eü\|eésƲh— ŒEUø÷ât …eãË8Iuí¼lkÌø×2¶Ëê°.fÐàõ™ 8¥ð8³ <•$8(\)ÒJ ðª'Bc¸^æ·Ö)ß>j!=ŒÖ-Õþ¥fåEþ*¶¥¿Õš‘,T¤h'¶ý>w$gL/˜…Ͻ°Ag ê\pÔ"¯}¯K¬¬È‚ˆÔ•9¶§Âœ)#Oʼn2ôðTàWxœ·Ûá+²%;á†ò·ø_µ-ú F¡“¬éæ„ÂL›§$®`€0·VóC‹®V2CßXŠ)-RÚÒ‘½¥ª"Ì"RèÍ«ï'u ®Ù…â»I ½V}Ç +>Ù•&ýéûL˜Ó³BŒÂ^{¥Jq87©äDjí]ÔĸÒÈY¶‰¿†è(¾t¢wsšµ­Èl)k¯jw"\¯‚FQx¼ˆä?±Û™ Ž‹b%Ôzɺ?íE4­ /¤¼Á¨P&«¨ö¾7cÏ'è_âEªâ#E¨C«µVv*Oۻϑåyç¨_· &Á: uËg¤Ìܱ౔1¢»%‚ì•‘Ùë N¦ÑÝ}¯Ög,zÒmèt⮪Î}0eB+håj{½…®ŠÆ‚/ȾëA4±ïèq×ã¦#êFç£CmÄ87«=MŽ’ÿ ¤bPÏ"ÉÝ¥vÚ€uIÑA¦4á‡ã„PÓBƒèÑ’¦EC R–ñ„T©è”Öß²™ƒÏ&7{)@*f#Lu¡óÅwV2žã[yœ ý^qèÕ>‹ö^‡Õ'y"ƒé:l0þÙã¥'£z?!³}Ñ‘ !Ë”ÔÅr«ÔELƒ`õµ :Jµ²Ê¯eØRO@Gƒæ‰VëM,¹™¤g¨hºa«x 0)ኌŒG@-—KÝq(!G•08ËfQ­ ™£(î7X¶³A%ã­-à H²>C|*J”©¬Ts7»òó$2²êcZZ…©©z%ƒÏBPµöa9Èüî1]ýT5 cÙÌ›’ɺƒ…¹ÀoA ìlí„m« îXNÔQ†öø,b}> i¾ªÒÖV7J¦-h ÞÏ!‘ø!ò*ÜG´k§seÏìQÅ7e~½1le ´15嘪Ugq l\Sy š‡À½"u„„4Ðmß÷¹ÑHÖ¾Å;)nú¤¦‚ƒCÚ¥ø[„’u^KÄ~HÑ¡yb @"³Y+{r»í:«.¾C#i̘2Äp·Èì©ÙÒ&«—Û8>W¦bìdd®¯)ÒËzco êd%\ —aÑD¹(û‰‘‹J7‚ Ð`fM¢u~´'\§ˆüº˜Ûံmˆàsõ%bW"ß•h†o´`ˆïK_ç$[€#î¥oE –lñCisJtÙï¾ôifAL‚޼bÌŽSWMj®e¼¨x–àŽù@ɰ¢È\¤TuÇäaX«j•0̉‰ø’ùòí«¥šQVˆeîÝ KΠ¡°…ÁŸØ$é[¨¨Æ1-ÌiGf¬P3ÓiÙÙŠ‚ å¤~N§¬a[ï .c×IG¢ BLÿiP¬±[R¿=˜m¨†Öb&ƒ¨‡Ñ¯ x^kR½ppÉ´ööš¨ÕŠ¢fAË3yˆ ¦JB¹ÜËk¥Ã\éÒ5GZÚü‚ƒ™ºµíU‹Ïj´WFôfÒ1Ò¢° 6R*^P:¢fj™9dWÖ@ ú™Jšªn­¦À'HÚäðh¬•Pü·›º>פŽûË­Ü›õòTŽ’îŒŸsä¤F½3'}ŸÒÔžášYŠùJÚ½ˆOž$Ÿ²þt¼ SÞ1Éèâçœbl󥀦Qg¨®hÒRÄ;ƒÈ9ä/mLJöwL\¼¾ì£Éç#¤*ŒKc‡àìŒÁЙa­Ælcl¨4¶àhª;P¤Í]§sxy!Д æ3ʇ敒h7N}C¿phCt5ê;ÿ'{ç’$¹‘kѵÁ0À°ÿµ´™ŸsÁH©ßì »T*UfF0Hw|ûþ^J¸>Š›ÞØ¯X}e³Ë¢ö8ÙËåÇ!gôöÜH·QEV'Cx8Gæºc-q`Àôøž.ÿ%ëg`N0Œô¡€$Ì, ±Ô•MʇdBÀä8C(¸¡wÀ‰áZLE¬s¬ÉûïÆN©˜YÑï BÅýX@3#+TˆO‹,ÂÚî4ߎ(@Š»ä³ z … ˆDJ²È…q|ly-íþÐz´Ø…ùw_Ö‘múù$šªÐ”o÷3œ+_U7ÜƷvaÿK÷?æ-«òØ[j¤fZ[Ê‹²Ç_Ií´9:'l;¼s‚ºbå+è œÁÆ4þ¶9æTÑ:€åš :¯^ÒÌ—)Š xÙñ¢ ß%i¤0«Må~Љ€ë‚Aù׎@µ­çð*Sšñ704l*ž’( ¾D¥ÌåPé[M§ýb'ÞMáÒ°:úKeŸ&³À¨y#”ÍR³û¦4£Ÿ±”‰×¤ú“ØèO¨°•W´ÎFE<-FUß5L¸»st}÷[dR·S6Ä­-:HŒCdꦜèhzH¾éÀ^æ0œ!A QÞ îœÀf1qK?Lkçà^ré™}¸TBôÊìß,ÀÙŸ¦ZfàˆB_æ ѵGXN Ý‚S-/seÑù2þ\‰H‹×¨÷)n ‘ó›ØÝô¹qã28Ø¿½p±Z•}êC‘&VÙ‘ÓsCyi°j®1­XÃ,¬~d[ºÂúÞÑÄùÒF**GA›OEi­­ã’ZòsD¼b•`ļN }c£}˜*&r«>¨¯?:¢.buš°ÏrÃòl4¡d¦ÕXóV¯ žåJ\Ûp»ƒPK+J(ë">ƒú{pÔå=Ùáð‘;9}bZ¢²%7´MU¤)…¿Î)”dz¶¢Gònaòjª!-uC~ç ‡<ª,D«%æ-c@ôšŠÂ7EJ~ý‚¡`×X]]m¶òH.Út¦âBí(Œñ½"°ÚS‡ )NŠ9òÒ*m†p#«¦%mW‹«J-’‚[)<'`r»0ôw„DD3s3'ì ¨@•÷P¡ ¶ÃÌ 2)ªºxÉÀ˜"Ú®Ó§oÕi‘ÞˆqI…–dò&ÓM);¹æÕìÒ§àcn©züÈ=Y ««ˆ¥?¤æ±6V+|ù%ç_>E¢cˆÅžN$bÓQEQݽ0)ƒ‚ƒ^*éèïÉ}:®"W?òžyöoÇ«pG‘”ÇÞ¾åܼ >¦ßȃJË^ìîÅèg¿ê3QÍ*²mœjÇ%–Ë%ÁOö¨ “?Ð\Câðô¦¤µ@Õe]îºb³×¶Vô#oH¬¬ˆXôeFýÒl êã&:™À›Š)E¶‹Ç`©™ Ud‘¯Oœ³=¿Y¡¢Ë…?B”`Æ{ô{×Gf} !·è5\°O ÿa-ò–ú3T¦Ž¸•8 H²u-Î?g¾+FP'1¼û´ ÉDôÓ#J}Yf%‰Âÿ]V$Þ6UT?æP©íuóêfâ %¾§…Gu÷”¾¨ÞÓ¥ZQ6‘ˆ £Ê{Á §E½ÅÉ$¤é`·Õ~PóÂ…› Qdl«JÒ¥¼KÅù /„¶ ¤reHøáe8”ûúgèÆÁ3¸c \ƒ,p(a¢”ƒìÞ BöùhDíž"¾ÒrvWùÔ\îÄátdc"Ý’èݸ!cÂût£( 瓾0¢0§ôµŸÏˆ#‡°]S:­ûª)ôâ6¨êè^¹„ÁX¸¬#"¼«8IÂþa÷­,ÊÞMŒ®¥•ÿ©­Vž0"ÜÈ-ЪчÄ*ÌÓž<êR7ŸÒ#íSw\J6p%M¿¨p·ó\òçÞ§ÿýjwnqQ›"©ã îŸ_‘%õd(áEÒ¾ e&˜ˆëqi7)y @€½‚ ïŸho"â”[ †ûë–R•Õ¤;,GƒZ¡S ™"–¬ú^ªwy8ôc“»©jwÇ‘Hr®uÏNpLœo\³Îå¡"Úvt*¿³u¬Pôú¢Ý¥ Ö¨`é-˜Œu7átˆÜ˜Ü2hR9±d”§ª*—Ùèä•| É«Ë\œŠ Ö)#•­:F»{PGæ,ÅÐÊÔ¶ñ‰³Ì¾ª€¨5a ë™Q§£@´š‹Fe ª²ƒ}eµ+áÀ£­ìM÷î£dVނРJw]¡+Wö„ÐÉq¼Å5WýŒÍcx^‰8¯Nxu³'­zÂéµ&x§¡{+±ˆrå…BEúžrŒ$ÝHCn d¡¢‹| <£ÅQm—4” ÁAÜ€™b9A§­ŠÍ©f¯”T(5wK…'—³©ÄÿúuóšÝNÔ•F)‰¢Þ¨‚xF{>9WíõµUê¬ÁÊjsö»ÂdÅc˜ÑŸ³SåâHdPªn¾ŒÉäwƒ«W´µy –º(]ë­)<ôVÎúQ·¹†¯è þ,µù}‰2qMŠ2T9êŠ8ìÎY‘('£–À×”i-EÇM1;Ó§Z¤Þ.@q]ò )+$x}íIær»ÝïãõE | $l0¬X¡PÈÛ<ÓŒñô¾q‚GŠZxêCë 1pÒàÆRjµ"w˜­H]é üŒ¢¼ËQûf‰¥,vêÆ îUô¬ Ä…¬eœ[µËÆc“*_­Ñ•MwìI¶^q•ÎoÉÊ×®·*µá ||[±Ä'k­£²24/r¤d—.ˆuåj¬×&¼q2h¢ ¥¨¬÷¯xoåÈ œ œçsvŽèÊÂV‡Å‹èDønn6­¬å]`¨$£ù$p©pÕŸ©ó´îݬæ#8“†îvì妶–ÿ† ,õ·í–ó“ÙSa/mÓî”bú«Rvk\‰„ç ”©¯+Þ‡YŒ*E¯dP$óP«¯Û懷àŽÂhc×g'­ÿV€ »«ó¶ÿùb[—dOé;„¢ Òd{;ØfUȇñNœ{ªkuêñ^{f0’—ãõ]uxn’*îcTfe!¾“Ñâ¹oSl£”Qd‹âKÛ3>lé`/…V#ª­ÿš}s­Œ€º czU8Ùb °>”ó’õ€ËühùdÁkÑv¢ ƨKE¢®J9¹hëB¼6·ÝIN°sÕŠ²ÜM0ë™ÁÆ)Èe)ȉêmc»w¼í•Óò?Aø€ yucH¡~;6×öW C`´*ø&óûÄ—UI¤êŒ6Œ]t€Beentù¡v´ÓšøNÖœáS*…Kt`VQ6ѼؔN“Žh àY–•÷Yç;"ÛÈ@f/”Ëò%þÈ%þ;ÑÜ_ Œ±_XEñ±,åBan½Q ÙÚŠ¤´—ì<"Àx;»,}×õÑÈ<‰‘‹ò}žŸýëX.KN—ò_ÿ6bè´àibÏ *틯š,?Ÿ¾Èuù ã:µ@UÜÜPÍ”Ü&ˆšµÂÑØ®kÈßzŽgx®Cå… 3þPê@Ž%´Èmu0Ü÷+––KìA©rE.êTÅíÜÌû¡ˆ‰icIâ]–½ÌêÂÐ}\"Ç%O%~Gp5¨c æ xÎFÖ1C7ðަN9Kƒóõ§™›„üinƒ˜QÉ&•Ð' ’ÐÓfNo²”N4ó¡Ÿüª¹, ëdÁ‘Cò&MÌ¡zù$Ð÷ÓFô2î—á²¹°…jÞ0C)ôÏ©§1ΰÇ䪢ã¯õÖí–yQú”âm©ã8û¦7–(|©#èsÙ÷ 2kzßp]ƒ­ÊD¿‚%¦—еRWkE~ká¦ü•ÈJŒâ¸Ô*>rîp¡µ?O$Ï € l[ÉÝVlg‹>ïÓžT*èîz • [ëtÁ¸/òø+7¦ ®ŒEå3CºÂUÛfm™¡(uúÛvˆæ^`¿:ˆ+BÆ…*næ@e4Òn^u3ê_«¿_Ñê*æ–ózXíÝÏœIF•5ŒÒ:‘P‰©‚xÑ•.g΀L=‹Ë»“ÎÏ6ÎëgÝÍ_I2´êØZžÙRå´•- ¥ˆÕÇ.12’ØS§£wê¿ÌßÊO=N^ßWÏcLŒÚܾN®Ÿæî̀̈́k4‘`¢ìÌ™àF¬êz™·Âaƒ†oq½úÅë"㳈ûz}/îÞø„}Jî˜Õ:@ƒ ;¬;…¾< AŽU{º]v”iZ@;= õ &Õ“)€¬I$” ‚ÌÿÈÈ–ï]†o‰È‹…!ø€W<(V´)?š‡[e}µnp СӉS‘ÐÑÂ_òéq¼GèÂÈ+¹Õf­×~ª{Ó«*‚×aüS] 6ó÷έÆ[s|4!ê"Wy Ì¡ ø ´ÑÇ»î½HšˆZpä±_Ž©*‡v SyÁ 4=›ˆB^peÆpÍÚ¦t«õ%DÉ_Ä>;PZ‚Å.òìSŠam¼ÄΨ@§KdB±ÎUxõ¯ùûü†ÌÎX±GÕK•“±ö5láÚ:‚¢¹GÉ9U?Zˆ‹°l%_l/rÅ>S T ™†‚V‹­µW Pqe䋿Â%ïé›ÉbKg̼3H¼D§?·NL[Ð —Î]Vc lúÿZó±T/9ЉÎ’úôxÅkŠø:4 ï!àMâíÈ<8ÚŠ4êùúÕ­RìL»˜¶ÈrwÞÃ$ÿ{?úGð ¤SAcŸ­‹ ã;:Q`žéS$ûD¯·rãzu€+É=.Œ"^É‚Ý,TÙLð‡(#]BŠJ縔Âqºçn‡^1 ‰Œæ¥\>šRny×^è‰)õܸ-’”«>Þê9Jo»7ÊMáušü3Ô:[–üe± ‹ñ„Ä9,Õ¥w#ÜÓ>µ{|>ÞŒô ±s\ „ñºòC1ß$ŒÖ®7±.·2¡TØÚZ¸ãºRp¼RAñ¦oך>½ß50QH\/ç„oMÀ;Ïtº-l˜áו;‡šôtðREêb`Ë6XwÓa?•Ã+´ž1Z¢C:¥XÇiֺˆ˜Ï  ´é&ѰE¥^´àá„B Ñø"ƒœ:YG~„Ñw= PÐÝI£ª:Ì'h‚f@‹$9(¿Ê,`n³Ô/Oס?`&ª'—_–¾Š¥C¼µ¼SQll!ù)€ƒŽ^Êê§@ .”×ç ë±öU…rl£ª¬sJ©/^ã%U,¢SÉ(2…ˆësëwnëS§«¨²çÕœ.Ÿ‚»Lø|@< ’ÞäÒ©ÈWšYÀŠð-ÔI`Ã.Œ¶A ïh} 3IQÊWùICD&láÑÑþÊz[µÁyê4ÉvH·u`VoÛØµ·~B)EªL¼Äª™›þ².e¤¤ø$n gÌôûÚÏ 6ÊÄ_8û*"’“í|Îê`w^ý(hÎø¥Üíªu¥ #B ÅcÃaEW%©È\š¶Ø(-Œw«àWᕤ‹Oe^žò‡>Þ©~»òi¹ÄŠËVåšH›$˜B/ ºÂB½öR×UÆÑå?¶ù¾Öú•n;)…“T]VÕœ/F ƒSÁû‚½‚©•‡•µÞ‚ÐH-e¡P¬YÝ¡ôM”2‡_º1b¼e¤G†åŠúî¦ÚÙO¹lÔ©¶É¨AmbÃBáQYÛ:Ui¥Œs–™Ð[6¯:`Ý5èeÂV$È–ÏO]}L¿£ÃpFïÌqú®Œ€å`‰U#ÌÈÇqi:Ð!"N²;ká:}eoÍèFÊ8 ‡²³Ñ¡(\È6^ƒrÙ„þ‹´©X«xæ”ëlJ'9ö!³2Œý‹L‡-üó¡þÜW›%)5ÕZq#…¯b7A·:º­$j%ŽÁ¿ëÓ’ };¼¯cô§ŽîÙ]G}ìX²®Qt„Àªí™ÞÁ‘ûG‘5TøýR§+¼´à$íË(„®Ü·¼öWÊNJßœµx:K#”£ËË€â=A]Û²ø 29*ïäî@¡YÑ©jî c}”»«…1‡2iö«º¶ê÷XvœÅSÄa(ºX²× 2À»ö†É+ Pþr¼:;Þ½:IJz²ÅŠßöƒ5 uÊòPO'qî€Xú  W§¼Ä7g*†H4×%DÂIN{UíQÐÇ,d§“΋ã#ÃDg«"‚ãq´:ƒ·*¼’l2ŽRãôÁGÇ E»î 4KÃQ §p)A ‚´¾î*¶…wd9¼ãÀ ¨ÈÅ¡ÔçRÉbðñ{ä`òAsÜ‹G‡z•ûù_-€h‘:‹bújò)Nh+âhlëÇzzž±êšßAMLÌ„1!Þ)3¢ÔaEí<¡U±çai±-¡‹¯5?°rb«„¿ÎíNÛh!*,K¼+uº”ãÔc[Od>LnÁÖrâÉtÊB¾SÎÞ^Cùúö'Ü!ØMÆœôÆ] ˆ S–¼¹Ôz‹ø1Ãh›˜BC·ßÀE®~ú#%³Bz]|¨˜Ff1ú°±ˆ$íÚ‘ØT$ö +•€#1€rh’­ %é &å6¸TN…u°;zÜ[*]NСƒ-xÁ¨ì ¸o¼Ë<"§ð3$}Ù7ÀÈ ú×ÏŠ4ã°x-ùxì¨ÚÚ òÍÝé’g+ÜdȈ’VЮ̙*§`×4Ðâô#[$IQ5cÀºÌdžÑ§,ÄÑ&þ~´\ç ÀRJŸ6?+$jd䬟{÷› Ѷ’ôI1+Ñäºa0)õèFv4:­âñ ŸRù›šp_$Ú=¡lra‹í6ôTEƒÎ YxÓôÖÌ)uHTeÒñJõËè8=G ýÛ…(VYùññ›¬¢ ì×Ö ~‘ ¬” ëë˜ÜRÊr‘B¥´îgîí)¬ÒyÖדÿ¦&ž°š ÃågtŒ Mãnôv@($©`=4ô•–Ÿ¹¹ƒV bàŒá•iÜaSTJ·jòÊ߉“!L@‰ŠÖ+aЬ°J¼]¡z™ߨÄ")VZªøJ¨_S§iuÅÓ¥Zq*ÅpÎC5•TWÔŽïýóÏ͸O™ ÜNãצ•#©DlÂÒ©(Ó­ö®±@î*ËñváŸÈ×åÙ¬OÒ¡âc×~˘®ÿ%ân0¢ ÿL¤8]}Ö’l'¿[`E×%]ßÑhàr¡D÷œo¦œÀ>jÊØ!ji%Þµ@SÀëŽSЛ–È9!Ô‘”]woÝÀfެዼÈ‚í×v4¡[êËp¶'Ü¡™a ¤MCÏ,îîçÒˆKiJ´ÂÛÄÕ¨*q´Õ[>o;R·“P£Á(ÿöL01<àëOÄ%‡½Ò\ÊMÑÙÔKC+ÑCÓk‡¡`j”y;vö¬í8/عÖq¢ÕUå4ôf3bÅ—œlóIqpJNn˜o¬/-2ðT{¨06ÖÄ,Tga¨§dŒ^Þ¹q8mO‹%Ù¯ÈçGðæJ­ÎÔB´dv#²QKÁjn.Þ®^™¾Ùħs©Hë¨!†^ÇzJï¸ì• mZZ()†¯\Dñ¥åhнš á/ºù¶ za{ „½¯# •Å!v5 â{ƤE'ÂUþ¬+¸PÊŠ_ótÚ>štQ¼Zn;c3W7Žz‡)n‹'³â8_©ŠÑÅl(ˆ|Ý « áW‘»V7€ت̯„_aj©¬$ÇGVJ ÀÖµ_û®(]åx‚¤Ù¤ò¹ït&‰ÂsböɪFïœéÀëºQâDi”†´K‡2™£D1ûX0©Y§øÄ+LŠp}ÿF¥ç±«]ÿó©lµW.˜')ny@$~! .¾;™ö™"Éñ’6¥òÄ5*­°…—ïNÚ »ºz¸“Î œÒlj'hH‚µÙ(_Ü¥~ÈÉuâ2õB“JØ[Ö WŽ]Ö#B*Ëà0’jzç~&k/Q‹¸Ç¬ÃÏ{Ja¦†En®Ü+Ð-'›½WÙØ Þã–Lú:¶ê²¨•¨Æ"gÔGr*icûX¾†Ë.—©aÒ&Š­ÖŒáÍ@ƒ–»Ú­‚kePLŸÚ R—β©ç-øÇzàÚHÀëukÃÑ3®º䋹{FÅ4;XT…÷unuBÂQyH4„9bΚÁÉW²œLðଲðì­Ó¨&-Ø]+ª1Á—ûõ‰OwuÛ¨`T ªR;xÓ¢4ÖD?3•F(¬9ªÇ`þÔìÝÓE•0¹p#$EÓ5–…MÿtSÖ2æ1 ªC …@\'JÊ ¦Û|Йn¸Q÷¦>ÝŸ¥‚/ ¦ÿ¯~άb°†1’vÈhi×ßûð­R²WÄ_¹Ûc“É'A¤O9DRa`¼ÖÉz¶ö>r˜¡UAiNÉäÞömNš¼j +”uÅW­8Ta9Ž Bî+(*QŽ]­Ö²O€ªq»Ê2ÁpᦎvT˧{bVŸ%ì çkhÞùÇFÆžß{Ù¿ÿPZ‚жF‘cmy˜ö†áÞM³°+« ôÒ-<ÖÑú·±n1«6b(…GÑÜER·£o6ËØ™óädÚµ0cYÃäPN€…¯Ú«Ëgl (f0ƒšŒš#I×7û# †¹ð*&"^9»µ<™QM…Ûž¨Y ©ì_[ÀO§ÚKjvÛÛžÒ™npJ±¯W$òXéæ½5·À&*|Q”;“MÍlJ³g3n‘‹YItjƒ¥£ :½e%´i>Z×§³Pç¸ì”Öz öZYYë'L'~:õ§YVž`£µ±?á>T~}ŠM ¦åg<ìØ­£Áß`•MçŽÁy®ÅÐR­2¤¨oDA‡àà\X‘F`…TæüJÕ~«­ 9tbÐøDÍ „Ô.B§x”^L kŽýõë@V·7ä?J rg´ÍlȹI›LKlª"„Õâ “(°ÊØRêX’Ûž¢ƒ¬ä‘êK_ð…äàÔ¡ò_  ¥EmÙ 'ÑU¬+¢ã¢3Ç‘¤ÔPßéÉ É}E”ÙëŽÐ0f„rlIJR”iý†PçÜV2ÀÏ»t¤¤H¢ÐùÙ£•ˆÙ@%:$ĺÐsÙýu¥)¸{ÂaZÄiÝ™w‘§O¡÷”ãÕÖ[^fõjÜRt©7£õ2òµ¾H3ñôãø¬þÓ´ÑÄD묕µÌ¡Òˆe¹®¡ˆ]'ÙôM‘áÂy ìh£òXä»#§ÉMdƒ±¨CªO;,?6:ôªúµR÷¥ ÊÈ«nÛŒö23›†²úIô„0umP ü¼ó“ñtt˜}³©Te1‡H.,„•"‚Õu2¦(Ô´÷rq%"-³­¤©-…`2¡–/Š´À‰©E€#"S±¡) ðÔ/: F‡s=@Y(c@ÕaÛ*tnÇæØåªYî\%abèT®’Ê^ û¼ø0fU7?U3$²ÑA/І|UFq•nS; ¼É(ÂÂè3ç²Î‡Uh!È„r²3¶m’jM¾ï­m1 @êŽ,mLIªs¬vÒV˜('€ä¤ú4TzFËZ!x@[m`{UFX± ÝmšÎ¨-`ÂR^nÞ)(b….CO¤†wÅ ·tÄÂŽùi†aÒÎ¾Š€È°"¥Ø™‚ W[¬ -lMþÜAÖ®œ™oˆ$éÃø™ø7´7Ú5×%‹B˜éÑlg{±ÌLXÕùXnŸ œÖe1”:X¹ö¸²…4NwUð:÷ÖO‘¯•ö– ÑŠœ˜àSÚ “òM¬sú˜\y•ü‰âP<9«òØÇK¾¬¶¡$ˆ•<ü/P¥…\ñ\(Q’ÜC¶q]½ÑÐÔ—´$`rQõUH<§c5F÷xøWN À#ÊáÉ–!?ü”¯H@uœ0™l´ê"ÉA›¨ËuYôRÒ«ÎOûˆs7Oͯµ©Hé8ª4/Âx´ÿL¥¡5¥ÔxÃ$)ŠÅi,ødpœ¨°{è¾O¼/ÛwF”ËKw £Û³…Ñz(‘í£¯Ã…¢3^׿yŠÅ¤{Î ™‰­£{|¥ Š…EVtÔZŠ€I0NϤ)¦Ú„yôl¨B@â¸É¿3#‹ì)Ù«ÐÖ!˜.ÿ^?Š™1׿ÑÉQV¨sdOx÷ÌvÐPyVÑ^¾l"Ж³V‡’Q /K.ʼnã›ÐIfÕ I0 ­Â±ûœÑ-½x´zkYw©t5)ó#€‘iNÆÄÕèÊÍf¼ ‹õÑa«Žá¨7®tbDÀ>Ãp¢`Ì‘=SB€sœ8_ÞTð&s:'Ò÷²ïõ_UA”&¾äÞ‰3¹Ñž¥}'-`w4í†`exØbji>Ãùûí̲‡—ŸNëwchjŸ!j'÷/(Üë4ÙCÕƒÔ÷a¶”ØPN7j3|Z‘,#d\g‡AI}©ìfµ=¡8–QÌzãÙ½296m²3×¹Aœ¥P¤Êd[u7ZL ájÆ~J7M±®[ZÖ*àK¬ºŒµ-ƒ¿¾¥Ñ&A©D3‡þŽXó0Poõ«Ê^ F}ä¾H¿ÁØciš¶„ã¦k6Ü».aëÉFÙ4Ž`K‹"Ùüj®·mŒm&…ÎOCSU9 ŸME¤T`cÂíD„h¸à#ahqQ[:½!M ˆ€SiNF*ýÂÈýÊvVuk7Å–vYí*wÔ €’‡TH!´×rߎ烇Nr-*w­P¼’„~x•J8P€O7y!ÛqZ…;ˆq˜f0eùa+1ôÀh…È…odÉ~=˜mýênÙ*e/qäVF1Þò©I=ÈÔÆYÙ"ž• –QЏ)vkþ¦ñ¤è 9{‰Ÿ×çÌÚShÃçSÝŠ#œµ÷BࢠhVæf2ò:©"p£"Ë^µ\ݶí›ÅbfMX(æN&œ ËÌB¨íNU^,{«û)Ò²qŬ}&d[Wí«9'` ,´¹&õÔ-λй‚gØ<7r™ø¨¸.”$BÐ8‚OWÔ„wŒÉt\ïŸ?~~xБ’…EûÕËàž¡Q†Ù"ß²ƒäs§ÙÆ5µÊ=ÇCª/^¡G†C‚¤]j Ä ;+Q·„ÒjØ|Ö*‚P³îd'òÍ\‡=oBɳñTÖøÏÏὌåí\V¿d&‘@PjÚ6Ô‘?q`¸`0U3§A…O§o[oßÑÔÓú>Úü©LÔ-cXÚ¹¯È¶vzg®Ív¦vÊ“?:!lÝÍœ>á­ÜFà(ª¨u~WD ÌšAåi)© ¨Q2gÅPýÅw‰rüF H¤‰±„Õ‰±‰4†+¼; &Vþ¶:=p–øËpÒ×o¶ ñ{@tT¢Ž¯}øÝÂê0+Œmç±!oA÷¯X½"?‹É¼ŒjPÒ$×´ïùðÓ ^²cpëg·¯NB9.!c ˜ÉˆòN¢ÓÝЉKÊ}v;•aÝÙNA­Äµ›´g6À(`ë­·UÁö9:wN|±¸Ê9~MjÝ”ÖD‘L5?°—*˪&\Ø?Ë¿ƒ.öâDk¨‚L?@&+ “çK+DœßÝ$Œ–’µzÇ¢Ùašp÷¥‰»ˆ'Cr ¡`ŒÄº‹Û'vdÛžÒp¡š¼µdöu·ÒáláàH‰›žu Q…vhÉÓütÜœXYm6BJÇámLN~:9r@,:.¸æ}3eší\äR[#³è½‚"^åÈMAÜ å+Çç"-ZYp*Y5½[ ûÛàÝZù:ª’zQù;;;ŠW{âûã Ii}‚Ü÷ÍŒC€%ÒWÔ2s{ ³âo¯[vî:ð’T#{V.ônÁQÒš0Ø@ìüü­~Î{1§Ç2µë¢>¼œï‹;/æÛFun7lÕ+ÿ.G/"œ|ôäGTF%¢Ž$ ¢^2 zŒ9ëê1U|)`}.{ØŽÔ$ÖKŸ΄vÛº:êQ¥™c’Q(‡:Ž~Ÿâ(dkUÌ“E¸w¹Ùþ6‰•'Oø(rbœ£¢™ø0øúnfÊh¨¾tgÒó89riy·œköHÓl/Û‰“žºQ­Îô®¬ †Wjlº<-NïÒ‚|húFg"„BöŽlÍìËwÒ·1øŒÖìçdÚ >Þ‚³pQê&¶Ë e½€¦ÉÚih2z·]¥ÛØ>ÒSzg€bØÛ娈ÁÔÙL ÓfÕ&›Ó²žÓoÑ–Sø±lj´ÒÊûƒ"„Hü|é#X¥AÔ6Ú3È[ñà0Y€™ŒQ§Ã¥§œÈ(©wôŠHÔ½=÷ŠüZöÈ5áû´ß þÐ9<˜“QÈÓa#”]Ošáb:O*·_Jüˆ¨Þþ‘Í<wR x]ÎÎ6m@iÕv`ïVíÞ4ן|г7s'Eûç /8®…:0Â>k€~ì+¸ÏIZªâ«9 3Ê$,ì8iƒ™Êrf±5: d¹´u&`a‡ËC:%L%ÿ3?UÙ«“ÞSMžh°ˆ5ä»C"±­‡%×á°©CÊ>ò5’ Rà©[¾)#†* Ì-ÀÈÛD7oWbï¤]‡ÿ§n댣 b_ñU9βçoçöý {Esqè´Ãš<»  ‹—yQ7órÛ++Ö´w%‘ŸÏ¢—-?BŽ£EBØëÄ-Ë\ àõŽg‹òBÿíÌ#)p"[‚‘¦ÎœŠPù_ÓXsú¢‹v/&®?¡o$”pÖÒ¹)7‚ZJz)ì.Gš@ŠÓ,!m+Ç5µ'æ5ÚÎ¤ß ¥î„n5r hC%Í‚àçõmø ¦Ùš "E·®Ìþüî|çŒÛÈÄ~ÿ]“žx¯oq[œßF^¶heò‚GŠš'\Ö?³«bçFÛrs(ÒšÐAGš&æâ pZo§Élªá7ÎóœŠ ÀI cO\hò_Púvß©NK£e{À ¿ß›)@¤i´ ©] *!¹Q§Hv`dE÷ݘ×c"Õ5PÂê{¢<€ápý½ÕBæðWq®OÂÛ‘Xk_T¾Ì4Pw ³´6UŽ:žô €:Í­s4Él¹‹QN7œN9r¤7G"‡•:RÆuëýa¤ýާÜù¸F­´L]ƒ³_UÞ(zåÚÓÂÃDÕ ÕztWïÖ›êLÔ »(»F6‡dhß4„ýªT휑n2j5óƒê>WÉB#n¤+ŒbA¤.‚†ôÄÄr ¿ß;GË'wT©²Œ@³~Þ[Z´ta›# Ùê à§Î8ÚÇ"&”’N2ÊŠ[)Í&¤1³ÚxuF§ul|15›«pn£"‰Òû­^¥Ú¤áa.¾¾\q£ÉÓ;~‰ )ýŸl‘æ$ïPgˆf„kF++¶ulEó Dé7ç†47¬KŠÃ8Ö`«ÀšÍó|ïzÇdŽšstE.¯EŒ"ºz 1çz—5—ð:††“ÜÚê2™1ù®…x‘êr~넃†Km\˜³å#È—nÊÚ…Ú£Ä:–¢jŽáFPËmÙzd!¶>“™ÎÝ„¹+/Ÿà¿š¶‘q£Ÿr?Ç&i7é†C§°ö:ƒUi¤„…¼Ö²'å;+hÌcÊE{•ÍwHî˜51ì=7µ©¥xÉ1ƒD,NKp‚ÔÑù|/uõAÐD’Bi¸”;ÈxD¡qdMµœîžltnÙè3äôd Zº¥ƒPèƒ]ÅQjvЇnh\*…ü`Ÿ·ÐK»bµÓ¿²„¥7ÒÞhìöP¾µ ©‹)è6~ÿºŒèÝWãÊD†`¹ Ðó0öºkÔRjS9ÍZ!M›–uÔ}©¶‚CM%äE„Õ…Zc/èãÔ#$©s¤C!w©f1¾þ Õ÷ñ4ŸR…ÁªØ¨[FŒ[®•ÑŸ)¥±0ã˜Ò®>VúÙ|u…Á¾*¬Ú:w®ÛzF(é Œ†9oâÉM°ŸîVªkI£º¼ø”ÿó!/©k­¬k %iK£†ø©Ž•ËÜS$íyÚL×—èhÁÍ—”Í­ÐÆP=NÞ°1kÜ)4Òqz-Q»§…2WA½ë•pt ™$µÈH}.EC1¯œÙ£kMj×"ŽäPáu7J…¬¾}Ø»¿Ðõn ÛMrãdm¦-8Ô׬m(;Žó°û‰|PªCÛõV_j"!wR5œ¦-×~Ý>BÞg&é· ”3™Ä·tIpEÉT˜š´IÂæ€`o¼R½p_®[RÛxÓá$˜:›!i™á€8Iµ‘=Œq–ó•!a¸tÜÏ ûˆ< þ›Jãʼn‰pcƒÆå:q‚¨,4FËjÁ¤ §ÁŽ~ŽB¦Ñ&_-ˆþ¢¶j­^5³´‚ ô«ŒœP,ÚVKÍØmàÖC~\ÅFþñŠ! ‡RÍí“tÜ߈LÐß‘f6lˆŠ\/Äs‰ ž” ³Â‰ûÄÊ¥qFÞáè ÓxW%!áÛaÑ6ÈôGk%ݘ%G=}jCzfx\ðÐÆ²]Æ[€È •!½x4– A™SuœR(óÕ!ßM,‡|ÁUE݈º9s°Ó9‡—·¶Ù•·vfŸêŦ›.d­ Cr´*û"ö)U‹Š,GYɦqQ¤›ˆ•êB5çXt\SäŽDÄÚxÕNÆÌ5¢KºQå0¶™ƒŸ Ú gÐJ¥ÒbïP÷Ê&C…v$Rh!JvHÆë |95½Vü¯¶Ìð¬ Ã",Þz ï5†dŠ•8Š¥È¦F1œpD6z°ÐÄ\⎗-]2³1ð²½b†Hþ4ï·ÉàÔ§Z«³£ânf…Žs8®P\$kßsLh›z;Bãw¸[p^1¸l|\ŠlyݵJ (w+àÃ|íÿ ÁÕÀÓmØUœž45!Žìë õW‚ÈA˜ã„à‚GAP‚š‘×ÎZô6¥²Øwz ‰Í2?Ød½ëî{pá7>"‹hïíéÎo»ñÏçíA©S(}ª !w¼ÝN°Ù‚m§IØNƒxY…‚j.%«ÂØ"±ÀnJ[þ|k±´E̲vïüMÞNðn"¨”u% ìÉ‚åEÀŸJm3°l34 ’²*ĶY#\å0?¢¦#AJ™n(Í>ípÃHCŽL"”ÈM+A%;£7+Iûõ¨È^ç7µ ÙÖ 8‡yªôTÀN^d1Ùô•øu† Ë…ÓlH‚a{LLNœµM+\Í™I!‘¼ÕîÛ¢ü#îú†ã JÙ­`úœÑuzeÇAI&HDO9Pºm,ËsŠ LkîÔ“üb¤Â‘ÜJ“¤"á‰Àt ûӹŇG'd¨6¿ìn%óãñA0íkï dÑï?a—ˆßÊ!8:,}817Ÿñ¢P û´Xô¸.‹ò‡ KßY—™ÃªÜ­åV•y²ßïÇ=ÿûýÒÇnH•ص4eÀ÷ëiÙǪÑ O'!I>Õ¼óßïMlÄtM…UlI‡|QJ¶Cº”Ãó.ôA:CWÚ ,íÄÛï´+€ÄOéðŽ÷M¸´õ ÒµhS™tÕï¨æø@.åퟘC;oAÚû’íX¥öÑDïÊ`ðÞŽZàQU<6£T¥T¶¢˜]}<‘«32êÝ0šè{ïêü¹¶£D¦¬xÂÃï/ÌJaÖ“AÚ¨P†‡5•>3·ï †¬Þ-ò¯ad£b¨µíÝ5¢\³\\‡ôb¾ZxÉ&>l¯T€cPóÚÖ 3Æv½¨/´‰LDˆ_b÷å¬Ü5®".V¦Atž¡”AU‰ÏÐédDΪrÇ1.Îü–_JÜoT¬å+¤O€)I+½; ªÂ¬™œÙèMÀ'kÊÉ€„F· D½;dJDÎ_W¶å­ô˜ö0é{Åemœr!ûgæ». o/'D;[ ¿n¦'½\Ú®ò¡r/‘"æi¥®ÑT›“"gŒ­¦s¨¾nEÃb¶Ã®‹£.=ö'Jñ³Ÿ^E¤Y:dgtèU•üV0<é @Žl 2¡YǾ‰èLùH#BU8Ã01AÊÚnÄ:ˆF¬÷n`¾Û!øõÚ‡I-pàTš'â2{mSÃ$Z‰F4‘“¤¬åJ׬ž‰"p³ oÀ±7,§ÉÇŒœ+¨ÀõŽ?Öjù= G*ÉžvneÉhR¶bû6/µœãvùÓUä`ž«cˆ°7ÒJÄP®‘-±Œ0'¤3áðŸ“YgV-©9Pó]‰A{tºÀ4:ŠÊF/>˜CY“ÞÆÎv>ãUp…Érº^]¡áÊ’xfûÓï_ÉÕ¬õïE-’Ó|8[î62âè:'[9©Á.ŽÙ¾1æ °©kTÐæùü”MšiÒ%KRPF§„œý§N|{d¥h@õ7kÉ­³}aBsæ*ØI¯ì8GiàÔç@ Î…ÁÆé¼µÍ8Äž A‘áñöͰZD™Â0¹4¤õδÔývÑÆ97L‚©K©÷²Ì§+0œ3 v‰ò `QÞáQHK?áïÒöÅDbk›× uäe®‰Êök/ºmô@lÙƒ q[™tß!B`Ÿ™ÇQü¶R¸Jµ?µŒKªœµªS6z²›e¯îä ä³²õë—}}§"‰æ@óΟ[ž M–ŸoR(ßÑ&ƒ…ï4{t­ÊðïÑ µHË„æ/´#ôŒŠü M7’òȰU$ /WÊéHÝ-D¢u@h3î9ßr<BKV (W±2p¹É~=oÖs²˜sÙ¾‘!Љ~·:Ü*¿”©€ú7‰ÀŸøY%„dá-¤EE7 TªüššSqO-8q"d‰ Ì8°;éX}yÉšŒ­wz@Ï´J„ës•®5É$ZCG–/ùÔ  ÕÖ6õQMé”C:hÞÕª¬C%%©è%‘æó¶ÓÓiÐÒ"é¢v¾]!5šAäŒñœþ‘@X¯9%±ÜÖ³)"˜øY‡µ É&ú-"Üš…'Óçt¿Ž%¡R夾};³`uœZ;‚G6v‚\!ƒ¨ô–Ý7¯ÓIBUEEÛé2ý°êµÏ,€²¤¡¹*ÞêšÁD;6rÇÞHfºß Á©“³2žƒA¦Çš+½ÞnL†Q·âƒQÐ,e]–ÖÂZnÁΕn8Ëyq®¿x £LDÍ92æ&åúPÿtë¹®¢óûZ„»"µ)Ò¦£Hsà¥wð2ò •ЈšŸùsêÇg•Ƈ6[vÀËfSç vno¼%¼ÐR;¤Ü±V›C+ªþ5@e$·J‹í.R@L°‰Ã4)éÊGq}ôØ3 Åô˜‚Û W¼5Ÿ®M8¾¼³[ÈVlŒÙGˆó¡]×ïèhVát).¼8áFÔ«MO£„Å•B)ÒDÕnU/h®R Ó" ûܳw&‹¾š†‰ßPûúz£rNNÁ‹°Ú4Yb•X‰A8UoÆ ˆƒ>„áË”uXóN$C%÷÷CˆÁ9£¯Žw”‘3]u‘Øèd™ê÷ŠaB¯!Ê‚¦·”8€¬5½\Kµ‹\ñû%00"öråvŠ ÏŽØ£!ô>]Š Ñ@äoıúLUVkp{ 4ÿ” )N‚ k9L¹?ÂïÀP ÆR^ªŒ°' v§;4&c€…½šq8CMÂÁÿ¯ŠpFmÒ†ºÛ“Ä»ö8Æ)l%›ç«ÃƒšÚ(z û¯ƒ£sðß;“¢iÐw`ÅÜÓ zoÀÍ·S°Äã{ªó²(/%RµA•RçѼqdIìÝ©5ø#T¶ÌþV"§®ªXiT™×:ž A&ä„չΘzª§Åò¦e*ê%ôÐ}ߨm6y›­¿¿œw,rÛ‰TY¸õf&\};v«cvœËÄø9™¥â8Ç›ÁÝ9£Qà;ª ªÈsÃÛªÁvºÌh“L.þf©rV@x­{Ó¯¤tÔ€>« 3û6J[Ìž0Ó¤Ÿ¯ ÂyEb*?²ðÁ;èþ̃PUãËÓÌ3ºV[‘Án-ɳO©Ù@#Û5RXÏuà‰¸ÏxRòLm5ólð·ÛÅiŸELy;v i÷<ˆ=§Ôo“Ù¯í÷¦´Fî†`¯^mzJ 8dÓû8T®oàãc£nÞÿB>Åù=¶$Í­T5¦¡¯¬ù`ÝÄèN&¦OógtÜ,#"«Ø~ûCD²äø}™¥ý£E‰“Œ”¦¦)¦ÛÏÞ É†È¸å•x{Så­íR”S4_ô|_MkI_«'Æ[˜òv„NÓ¡µôQŽ–~7ÁÓè€8‘1ç­çöX†:'ÊŸd„7ô¿|ùHÜeígLP KœE$+(6Øem­çTÉœEJ…±3ˆ‹H™øÁÓd¬T8|fTÛÔ¨`“Ê] ÃÒ]‘Lò}>—žQê]–î¥î)\ðM+}ŸK^¬;w˜tsËU .NxÕZä*›„Ÿm£O‰rê¡Múxܬ¢ÝÕ¾WLzJtmn#3)ÓõôÙ¼ð•²Kðq›YE»£”0êø8îôo3œâጋôrÒG%PãÌÕdG±´é,FŸZ=’ÃåøÇB›Aì¼à(2 ý¦ ëXïK¤ìòK/=WróaYkþdoVŽÿÓ INÖSÎXÙ,‹†õÅæ½Ê«VÉaƒµ(`AÉɠ܂ҢkE®¿¢þ7$“·éµÑÕÞÑ¥Oln:øÇB —0=r…Z” ³ä!¶ÿűí¨!Âq~æ4D5ÌG—€ Ö›Sw…:ËC‹MÞ…*X -G`uýùä›FSë‰Íh¿{Ž$^í¤‰˜Ëq©D WÅ’ðR…vg\-¡U<ˆ,·i7HgŸ&¶b4‹aƒ6Bdçzr‹ð˜ˆMÉ0¾Ý~'BºÑÐè.Õ«A•)û®B˜ä<éý–ÔõöÁ¶÷â\È6 ´Æ¾Âk_šÕ1çR7—¹Þ™Ÿ-^ä94®*=Ò0gå+!ÎäB6¯Ú–௾¿äÏ>ò!s+¾<Æ ¨~µT„rÚs:2 I=TÖÀZ!º@¸•jéDtZo]»<Ü Ï"’´‰ŠLiÎÏñFذ—uS2òäŒÜ‘+.y"µiZ*Ë;zâáÚxK݇¼"Þ½uÁÚw”Ü\m»¬ †Á2‡ÇOöÃîõ&|vXw¿ŽÏe2gy–ç&‘LWZbä‰ÓòG×Z¾Òr/ ,¥óÒ®’È”Š@º€uêïQ/ƒ·Rü÷[»'V‰Ôö38Ôe˜)zÛüóK6°âþÜ¢Ág wDo£ŸÈO‡Û€Ç6ä{LŸGôIe¬¿ÉWQ6{Et*”e‹Öh}Ê}ç‘”%ñ¬.ÞÏ\œÀFõKS¾œY@`D]Ûå:áM ®œöPmüªÍ-&.]"JK=çí¥½“ÍœX\ïxe„½TÎM­ }Ýüâˆ}¹%fÿb¾3AíX¬ÄQk©“Må±Yî9Z Aª‘©ØbŸ4{™ôfRú><Sl²Ý‚aâË­jâÀ˜‚ë0¹ü”`Í жNOXMœ$ÞHIA‘4–éûú‡nÑKm;.Cñ‰ ÌLòÂé@g_%KÈçÅá뉰ípÌ(PFŒÀ¼³½ÚºXt˜×N×õ”ᯕý*e-Ï/X´(²]Û”OJkZÏuõNÅVºµÓ(·© €Û 55‘[8õI„»[&ßHÂÒ°ÖM”ž"€ÂûP9ÂÐæ6s”d!IÌ'("?©†$Íß*(¦~‰ÒLµ¦ÅTp‚,¿$ý¹+íš&áYoŠáaµjM¾ØÕ}•¤Ä"PÓï÷6™P…ȼ#"ý  qwZhÏMRŠ5‡}üéfÆÉjnH/^!pÆ ›2“1•5m9ó‰)¬7iê¤ì…7‘‰§F_ÅóªÏ*¯¦ÿ÷îzv™øÖ Ôבa¿ù@Š6mëì¶7Š>¥l¹YÜI׎F3'¢dXša •I9ÖÃÛœºŠeTeFçs'èÒh©¼¢ŒÊ\yÕ’EN·©'Ýò¦ ƒ1%g%¬çŠ˜„F”r©º—³:Ai0â›§À¦wp(d ‘ýé¸]™Šy &ûŠœEÈsyC’ø–T„Ü峨`vyD·ˆ„¸3âø6ìüˆðÍTÍBÅÌ¿ǘøYØ: ƒl‘^”c(Æ|¶uDâ@IrV<ÏÒP×U²‡ëü&¡J—þ MUvZ¸B»ôç?U‘y„5'0Z.ðÆIå‡`ðöê‚ÙŒŠVèýW¬q{w›à*'ˆ ò ÇÄû&Èx‘c8È&ò,¾)³åi& ‹êÅ샑>é :‚„݆ƒ½Æû Ñ댴õ![%{Ìã*õÏÌ~‰‰ 79'†.æD)u3*›T>ÊØï“~”F&Ú‚L…t®í¬©4>kÈËëLJ3éìΣ *»“¬&ÇWów±½£¦RšÖ^á jÍQ0 «yXV{AaOÅN¡ˆþ¶G&¥ã5™BFÕíq67-Òžªë{í†XööÍ­»Äs*>ƒUcy^*pÍ¡M{. 4Êñ+ÙÇó>éë #Kž?­æu, ™Ò¤„„ ´EÂLpJúˈ¼;ujEa£)Ð,¥È’v¿S~¿Å‡BО3¤/Ó›ÆÏ˜V¯Y'×Z¥ b<9ƒP–9iT¶ t`µ×•wVêõe6Ê U¬´o,U‡µcÚS±;iØ3׿m26‰‰ ØÂPÊe;-DeiÛÂ* ¨£:ÐvÑÝV¸áÈO8ïq`NažvÊÓÅí*߯êDƒ— ¹ÇÔ2>§¾·ÖVF‹ìº³‘elÁU\\n\Û·ÄE¨•œžU—ÅhaWå€{>w²qQµi=ü vîÔPønß‚Ó}ƒOPCíÜ68;þŸ®YBT a“îÐòÖ\¬rb“Õz5‰@€%gö{.DÙ´Ë5šñÌãÙ>yÅžC] @Qø<’Spþ;ë¥{­'ÂÛƒ¤Ö­#ÿ'Ö{–f¼ J(ô)а‰D›ˆVTÏ[óø‚ ÉAÕ­ñ"¾¶E¿¶ò£ùi”ô§ÊL|ê,„ o@ Ö†@ÍÞ#A.1ÓnØ·*ƒNSWœK†Èˆ…¹E²>ñúI£«ì¤iŠ] QÖ¡8 ÕÛ§ãuMä5JÆVx²CîËë‚Lê"Óù×ɵL+ð¹˜+q‚;çÊP”Ÿ€ù×6W"…v¡äÕ¤¹T`ÏUò-öMä'`#AUûÉdÖN´Š6ˈrLüct>6.AÎJÊ£ÚùŽåÙÍsDT ­žJõ¸¬pn?þÔ{`·ƒ<:%‰´«èkáHõcŠ3p“¬׌d…^‹Ÿ Ï$k9á3HÒ»ÁÌ0·ÍtÏ|áÚcÔepJFUÒÅÇ–7¢š«G ¿¾œ!<3ú<·˜I32ôiob›+ë]_×þ(U·BZÀäæ§oVh£P‰9¼BLŽ™}dö¬ã¡AŠS>q€v!ñ(}Œ>-¨5Bº°œŠó6u"‰MHÑ­l¡¶î÷o·BƒþÉj¯þ(J_‘íz½-: Ïœd€aâ‘«kGW¤ÉD¨žÐ¥f°†(VZ„]{Ó:tŃzqÓ·oJ©¯’‹6OãRQ[ø ’/Èhöø8Ä(Åц"ñkA™Ù5»¿Tx‹ª_þªn©ÖAòö$,4»©&⑞c/NÑWu)VΙ;Â]øu…c­cÒY)JO‡l’më@aÝDžÙú1“:æcˆM‡í•Ž WÈ^µsÊ{/Tg”§"#Æ!Þ«e{'5;ÅHëô-ÝEºc 4­ȃ4¾Æ€òOˉ*¬hÚu2G$XÞ´­Ÿ÷ÔÃÉE Ÿ*ˆƒÖrŸ¥(9RÁƒá®cD,ªŠÀ¡Ò>GiN^LcÓh(á80îRå µ¹óѦc|¯ÍÝv´%q‚WF$¾j«HQ¥àV ç!¢m`p—o¥ ËiFC-¦XÕ+ºû¦ÎëÇá`§ôçÙ±lª-!±"Þ:Ú}‰EEŠ…¥¹¨$eo×›˜D;¤1Q|eAñ¯d\yœïÝ2‰Pt{zËv¢›PLÁçÁQÛÊTP†á_i(쎫QÒà*Qꦙ»Ò+íMÓË­ŸÅùRu Ï€ï«ÒÁìÇl¼ÙÈ3=pôCìg§Iã@Åa{8]%e#±Zòô¢A¥%˰àÛq zs§ “j„ioÏWï–Ñ’;¯»ïч ÌŠ²ˆ^M ýú¸¾09Çcœèl¿‚ÇÌM8­ô»£vÈ"ÑdâŸð8xJV—)U²hލ¨ªéæhèÖíe¥ ,9IyC,oùÀ­bÙš¨ŒÉaÖk÷¦œ± âãÜ*–†éwÜëȽkÁ(Ax‡á<2UÖ 5gØ™HiCI”’ë?¦M·G‘ÃAT‰š[‰­ áUtNœû¯À5Dùžø"–PõÖ1m œŸô"ËñäuéëLõß|T¥EP »¿I†Reõæä„oªe–™*>°ÄЄS³wR£1#`è<å|v" ®9*¡b\5‡x¯$Á£îº_X¶e¯Q磻À¢x®¹Gªlül={ÐvÑJ¹K<ª8Õdøv² \+W³ç›œ GW"Ø%ÌÕ-ºb€>f‘ø¾öÐ~:¤áô–Vó˜CkKËùQœCÂ&†lÄ be:Õ;t¤§™Éæ¹HÒÆje:ëÔÞw¦YZ¢vEÃ63ˆHž¿p‚›ØâÚþZWq$:€_Å¡¢ø©Р‚b)p‘hƒL5Ô(«ìÿ(¿)G+„aà½cPÃÓï¹ûª¥¤•¬¥¥Dë \Lu#æg°/¢½É´ŠAâG«œƒSèà©÷ ó)ŒpbjH[<ÁÚ|¤1U3©¨ÿ¶V´u²³KÀÙÈGà;^}àç¶Qõæv‡ó&@ëÊA—Tl‡12°òt²Ö`sÞ»/ê°,޶æëèsw̆¶svg€ܯóÖ!Ýà·›s@¸¢,KO8ñJR#7nYõ;]_æîK™uׯ÷ ñ) ì·I#££#ì5”ƒ 9ZtŠÃdê\…>o§ÁúÖ#ŽwáÅÜ’Qó§TR"Ç핟ÍDé:|ÉŸxñÇÆZ5%Ê\Ø<²RFJ´9ê«l„Q¥¤.Æ!÷òH•PÐE꣘›¸`‹Ÿ’ŽÍ„œ‰×ɨ>ñIê ³NúJo(D¼ù™#PþIxÂÄN2ªÙ}Smqknþƒt°û©KÃ8i¦Áyå=¾2  ¯ÿHjð§ý ©o 9“âOƒ¼?f_ßF¶¾èL<_ôöÂ>˜Š_âUåùà—ÄTDc°YCÑG+1 ­_oͼ~•zï¡a‚» ¸Ùg!@’Êÿšc%A;óéåÑwðgÄ]ôqe.“á…§Õ…X­Å.?koÔ{£v¿„I}…²¼ßtàåô$s34ÚÿE“:ÀFäÊ€óÃa*Uϲx3‹-ͪÿiºÿ_š.Û-;,ËK8@‰Ò×§ÆWM C'ª•_øélœFΆê`â´˜–šë•>N ît.ÛÉxõÖC hE ¼v'J£½¤äwVåý4‰Øaö‘×{rÏ=ä„/c=wl/èm“eçWÑ!eSw ¶¯«áøÆªXã“ÒçA¿”ÃW`$C‘`e˜½ŸIÒÝÍy§þùì"(ø»ìš6C èæˆX®Ä¬„µrRŠ©Ð¯NؤLz‹{´WŒZ«Žž²X¨ZŒ†ònnOxUå•‹IA–cçmæ„ÖÇ‹õ%2/²¬Ò7¸“³ÜÚ8RóȽkìThêy¤¢w^ãdÕÞTµ»ÉÝà7šðA9_6¹´ª§å÷1ŒÍ`NÈÏJ†Àa;éìøó‚ ¶­NÙ¥¸´ÔV±?ÎÑ‘Û0´˜©;×âó9â$aª(:+nIu<øì汦d¬~ž½>1Z:8¶²L©pxVUÔTW#•47çE±òù¤”@ç—Iïï|mç ¤" ç[!3í!µ­ìÉï…;™&{ù9ð“cQ6Ðm•ONò·«¸Ô"¼£ùÿ$á5{£i°0_³òë=E¼xl¹$—/-¬ÍLÕkµ¤$ð EÕØ6F“$—ªÍtÚ AókùJ…rf`Ì„²œáÒHG¨¥ò‘’Ôˆ5zÂHWêKZ0V7œìàQÅ> '¡hÏl!VxÍŒóZÑ©å»ÃM\ß‚%“!!»ÊŽoú}°sÁIÉêÌ•ë~õv9A¿u´„+ —r^•S5Np*i‹oV„M%±ÑheqžLƒ‚$ÞÞÈú49çÓè' l%Æ.Ót«q‚ƒWÖ±ÇñשØì_ã+¯å]§ƒ@K›d‡ƒ¹TxžâaöU.àöSŽ[ö5Â}½Õ°˜zîq88ÕÈ­ÙÍ 7G΄†‚†ðru5Dªù-úµ©'mA`7CAC?lŸÆŸïœy ºå~þ.3ˆà—·~g4AºsV=Æ”>ïªL‚ú¯Cç´¨Å$0í´ f%LäãÕ­2£åäÓê/íª®ºüØU¾jðÐb+Â}©ÎŒ¿}”!\vÁP9Þ8‚9… ±uz: Ü Sí‘QĈŒ–ŠãxÖ Ý2iP¥n&YË(9ôKAdþaÕK®²{–rK•ì&Jd÷òm¼+|†ÇÞh.N+ðÃ)6‘g EJ™[;)Œ,g%…S—çÁ©ÌEmÌ4Ê=ºš•y/’ܺþ¤ DöŒ{ˆ†ÐÁ=y ¥Šýg]´nQ³ ¹˜_9óÚßÉWú9ÔϾ±Ã!å:ŽÄ;µ³±LÜ"„°`°”TÒE£jlNzÂåÖÀdRƒUS¢?„Û1Ù xÄ…–Ó4>Z—‘ ÒôE"K77g íÈúóy`ÛWOÛÈ § l®£q67|©NÊ,#l»ŠÑJýÏ *«ºý-%»c pnŽ˜Õd ¢B.(«A¨Ðå½ÂÊ_Ö¨ì]ɵ ¡=v——%l/èõæ˜äð iÆ„¿JÓfò¼ As+™WW<›ÚŸªÑ@ŸÍ³Ü×B›qQ¬SeðƒÅüWªŽ:_Ú±-¯åàC—V=þ¨¿–ÙVäÄ?kö!Ãqð¹Ò/YÏžà¨kèeò™/Rþ³'9S£g@Y;ÍHº·¹_E¼Z¼ŠÂµQEÜHÁè0ù÷µðûn} tèÅц㵇ÝËd(I%Y^¢‹ì„Ĉíim’»7z>=¡úrü½FŠ#ª„¹ÊÎï½8´’>¹à!•RÎV–çºBÛó)^KsE5†N¶žDת³ {^žlw€pZ“̸†kç·!>5 gGdP(Æ÷Cú{”HaÁ ¦ƒ¼åîÓ&(–9ޏÏDÿAèUQ 0F+²¾§¼†²àôM…æú…q\{þ_ /¾^Yͤ" ¹s«>>ælU~A_í pùr8ßJ++^‡hŽaÒcÀÑKnTzÓ¢U‚g!ˆ%ó»V£Ü‚ï×üüyÔ5U9O9vKKõU‡+´Ñ›BR¥¦T1)¹+.¦7o‚¨uɬa¬Ž"/IT!—ÍÆ)êR¥¦Ü–OŸÓ\ï•«C+·Ñ±§£±`’ÈÑ\-ÌÇ4,…֛޵ÆL‰=LЪ¬Þ^%ç ö…\E‘¬|³?ÕÍ߈ª–ð²Û'¨¼± §TÍÙSz˜ýÍûl,)ÎQT¦?*aLw£®\ª~ÆÌìÊ›í²‡n2‡¾Å&^a{‹5a’ù¯w÷o“‚ò'pŒ6óÔ—Qv ”\™ã`É 7@**”ªÁ5v:vQöÕœn2„¤__7Ð8½?¨1 ½ŒÚ³_lƒ}* |­Ãëk,ËVû`iRøt™Šöà•ö÷2pÎóü¨•â0ÎéŒj#` ”pFiM“¦ì°vDx E¾÷}ÄŠ£î@*9s·S3óëEtºí:Zó¹Þ¥~%*.pš>¾F $#ZúÁŽ›oΡjù+{5’,$Ãx-Tˆ‰|ÙÑÆËÆÀXmHºŠÑ’˜©…U•Užý5UÆ)^èºï›K¥2Ý!„h/rŽ/XÒi,RhPs= Nöá¾Ý·t'V¨h­×@ÑPS‘Ô¹NP•Z ÕcC’¼mò)š¤—ÿ^¿¨$›N¼ó m¤p “§ C*ÓnW0Zº.N›Ìµ?»˜Ò©Þõ®Ìc d*,ˉ¶;1~ú{"ÉÙÍhúÓ'Èv¦Á|N$mô-ÜQ潚¡?,‰ÌßÑ W´{œQCˆ£Ö3]óUâIë}8oy*˜W¼ú (NX*)+¿,™ËÇV›d”åÃíj(œkéŸ^Rój¦Ï”<´ …–o…"Û9¤Ò­×A¬Ôø‹QYÏðCÑ>ë'X`϶¢ „§Œ?½‹ê¾Ü€F-ÚÐGi£+yN‡£¾lVbŸßüGÛèi–§ ÛÊe«¿îÌPGi¬´Wñœ‰PŰT>Eæ²H)¾¶jä72†pô›i‘9a'O9VܦRSŠ10û?µø¨7üéAgUõt þÛ…ã‹ï¸cìþhzÁƒ‰ˆaÁ,pòèjZ=sº¼(u¨KðwG¢Ð:£”¯ì»”^†BNkBêÀCÁi¸æÖˆ½’Ž´_)RË,f£Âl\©¯Ó27¢ïH$Mu ÊV´ó”Á6œ”è 2¹/¹ÍnŠÄÃ@ûÈ:îæRANKn¶¢>+šJaÚ¬w¦¸Ø =‚˜‰w”>Ä`™&ÿi™¼pº®™KA½ÑXHí œÊ¼aÓ%c®`NV1EB«r²Þ£HhG“™y'E‡¢DùÆN>:\Æ[ Ín‘{l7Ù¹X°¡.¬Z?Ë#ЀÖ(õb%½˜<@JÌî Kç}µŒV)]¥±GëãîTu£v æ:#Ú[ùªg\"¿J×>…Ú4þiÃ/xÂî ÇÖ=ydšæ `W­ÝåÈ 3c ”ÈÌI:¸—¤EÔëC]ᢑÔ-KÜÜe§vXRš–Eg™2¢"¹¢ï)x!Ìv*hw(|ø"¹ECˆ¸’tƒ ¦îíJí!Ò#iƒÊw•ø”€¨ÅgÙp¨‘XõçöÔéJUŠð£ Z©íœ¦„سÙk:¶©ãŒÝÜ[À›ï]‹­6Â-Ä¥Ó–>&#õ¢AŽ\}:A zlç…´©À9ï̾YËõ1(5êðgö[KåŬEU:TN#C*ÄÕ!¬BQjBŽ¥ §f ž)]Õè4¨‚Øõº{;¨ï4·uÝ6, ‘@…“e:¥TBƒE¥l/œ,,Ê;—¼Ôò‡—+ZÚ[kaÜ‘ª¥Ð¢IÇŠ¨ëààFlüÌeH ö)” %pÌM¶º½z‰~B‡‡òYê9ñÊ´”lÙvUŽ˜þãÍ/õÃE% e «ÔåNÁ¹d¦†:~¤z™R=(‚ 0ÈLì üTsÔ[dWn'JµÝ °gL„Eþ¢ô{¢ô% EŸ¶j]ÆÑ›¨¬Ê=ÈËí䟭.œS?”­h;;WéP,¯¥ŸôUZš3úà€XÆwÿ5»LVQ™ó•ÔãWU7óÑ^œŒå@àÐ'Ó¨V2”#гÃräOE#J ð…¯°=ìÍhÏ*AÓ÷êL©¹ÌˆçSiu_ý@0±ì ‘N¦ÔãÿÌÈu°Š^…ê¤dvE4Y0j/Ù¤‡Ùh®%͵ xWÇR>L]âKØ1Ò¡Ê’–B¥ß¶‹lEUØu¹ß³:Qš:}íX­¨©õñ wEeí¿š›§JJC&ë`.iÛÇÔ!HD”Þ…®XÐ5 X«!»gT×ሊX›‚qz”s)5±N,wÝa6j fƒþÂKŠ,¼`‚¶³d ¥ÍpÒÊ?êv‡!ÀJ|„rÀ¯z°ûŸöÎ-I’$·²ÜØö¿”‘Ñs.̳ºšl>fæg’ÕÉÌŠw3UèÅ}À¼|è?/´åAtàØy8Oáz÷ÍÍIia_´!XííäœwxîÕ:W˜b9\TÑä@韀uñYT!:fNf6Ißcíã”VËM¾9˽™ðˆî×ÐLáË v#Í%°&9 ·}™Ýjcš^ß=áòʧ;25¡pº•ÙŠíG¿!ÚÜM‚')‰!åìƒFɇåè‚ÖÏÇéìÝ–ÎRA.œ÷ÒŸA$±kC;×G•OU©ñÞP˜•IÅ’xF=º?QSe×4b,­¾¾^æ†GóÐàѸM_¢¿)®„á@‰éx‘~ùh‚“n½¤ê°Œ*R¾„…ÇØö€g*9Ææ± ÿ‡0–°ô7oúWÆšL<YSÆÌ–1½÷öÇe[Ó Lmü:á¿ÓÊÈsìÚej1ÚØ{—oNÏ&” ð&ÃÈLÞ0«æ^*g<™˜™‘°ÒœÞrÃGáEóîoà…óY¾2D}ËÎm’“8òU ;š]檄Œ`i™ÝŽ4æ™_š~ ”—¹ÖÐHŽ^SçvÚÆsK›Ò”]‚âc)L 2„²œœÓN‘ë”åZ«ÿ„Lí4¡ ‰;}XËI“RhØh)NÕÀô¥tûà(u©~V,Jñ[Ÿõ"€UYMf]+Bb¿Õ‚]ÂJ{ˆú/>`˜ÞM@”æÄ-Z…·„2ñg»0={ŽQ?HÍêÖqÎ4íë^uM:‰ÚÖ)¬·!ÎÁ—.B¸Q%*Tßq(8\ÀEí9ƒ1¼õ:ƒ‹ÿ+ÙºÌÌà»fèÛtàlþ…œÌÄO)®ç8£¾=–K +¢D‡‰]Ð5ú>}¹9o»7ÑO ÿÏr~xrÜòã—Nð_^£—5Ž=B7go74ðhǽVáû‘2O1ÆöŽ„ýí(¢)”Q°øh6­?‹5yë ãg%d¶Ó µo­Wý$šÝ‰Z))<‹U ’èb°Um°ÊCôpÁdŽ¿(/Q B~…<16>Óùf|:1ýbS”m(X§óDÝŽ}¤¥ü^ë!çß­×ÑfÀ´èè G…ÔÍj "¾Sù›b @F†-Œ#hð#ûÿ Lhü²ˆŽfY`›40|„|œ_ÍRXó1Š»=Œ¢UG–É?0Š•Q Úÿ¢Yhd-Ï? ƒáÓ*ŸÛZz7¢<ùÊÇf÷Nl*ß7ÄûÐã|ª’otŒ ÐáH÷Rzðâã~ª½:ƒ’ÀÆ¢‡[uWJ‹}ë#1‚G\qÉ)8‹oý‡ù[ðØ_ðè<æ<:rÄЄ}iT¶Ûg¨Š›™ÇÏð(u¤m@çTmi8œv3IÔš¯4ØQe ZW!¿ŽoeªçBaìÌ›¬,ó»HÔ¿àÇx„ð#ߟö%G_Åú'žu¬ýHkþ?è aÿà‡að¤EÅ2äs@tŸtÁ§’±±¬!€ÑÒEWá(7³%“$aÈ[¡/²Ãxez¨àmüg§˜ ^¼–™© (xŒyõ_'#2žŸV5Nëe&=!{–?”çß Ž¹·ÖÜý˜XEMof°tïu˜6͊—çB¶(bÑGNgFÛ”_ÄÒ®I3•HÉqôïk&4’Ðß ¦ê’=ÙU®*‚|¸ç;àqil£³Vò' Ü”ÏVz\ޱûÌZ½ÿ¿Ÿ$Û4Ÿ7 Þ™ â&b¡öM©É aq¯õõm»ÌÖ ùk¡}×Ò§òüþ­Ïmû3‹X);™ É6бú‹"ÛuQ„Xˆ«D“í? mÑ ò÷ÊŸÅôƒ‰°œmM¸:®q÷â4ÃOñ5<ý+Q}ë}wL–ÏþäCã¢PðïP˜"né^šç±†4ú|í&PSɯó%Gî´n(š©“BLõâzšÙÎ?¬RÝóƒ%q©\Ñïï‚Ñ»­g®2©Òãç.½õÈcͤ]¾-“—åg´9¦9ñµ6ÇÚ´ZáQĿŖ¦Aýñ7?+T.àÛW1:B*.™0žD8©…nÀ›Y„Jõ}ç;rIgÔjâ~]Dvo¢áXûÁ„ôÞk»¯CË­0!CK·\ÿM“xZkÞpyBSÜcÉÛÎ$i¬½Þà« Ÿ›¢þÛØå’:VËÓ|ð³˜ç䛌`J<¹ÁíI¶Û€FO­8Õ†Sî«»jmSÓyµ´O61 µ’5DèyhÊ㌳a1r¯TÙhOÅfçiw>‡~NѾ¿¸ÚW”c¼ãBA”+Py[7]À,¬Ü´{ã–ÛÍ€ £º°îõÁd<ÖƒC&g,w0ƒaþO\ºÅ¯î¼Ò6¥í¬Á6sœ Q}³rrÁ-Åz`¤=làåæ––¯ÆNÇ.ÈÃ1ta™}1®§ù·!`«¥:ºýRCú½¨cÃSâ=RÈbA™®ÌvrèR~ïŠù3;E«ÝØõ#XçMe×z4¯ƒósjÏïLaOÖ¦öe˜éÖðÄ0©;u-LK%WPÅÝ¡®G·zò²X±8¢'Þ×dÄ´ÓÚ>Ô_N³u.áYº[†w¤«¡+ÍŠal4ÿV+ÑÏàÔ$”P›ó"Çl-x<â—NÉ<Žv<îW©PŒRurØÓÝý)áŠ1Vï¾\+tNiÁjÒá% Ü ²Ò}Þü&Ø!p:DõÎÍhtü†µilr7QdØ+ÎEð{¢’ ¦PA*ºTD4¾j'_S ±ÞR|D$\[Où3L½ŽqZ~bO5¶·ÝÔpwŠTŒçˆgQËÖèe³k³¥Â0Í%Ú{™xUÀ&³x}9ì£Æ%$†£üŸü'O;¦¥ð±ÁIs“¢ ³é]Ó:Ú£ òjèI1[|€ÙVRÊÎŒÔðQ›Oˆ\]þþô ÛÑѽbK¢y¨Ûúã×þ¼B§Âð=–¾¤¬Ó‹ˆ¦“RS}\Ú•qr “èì^SðNšˆrä%Um-÷×@{ p©yçrv]zÓÎz4nÚÒ…3ÃZõ…u{øÙÇïÓ–’ôÁ*ÂõËwñÞ+SôXÏ@¤ÄjJY+«“$·&†7…^(.$ÿƒÜºïÊú˜ÎÄýÀë²kÝ¥rÃtu&2N"ׯ‡˜Ôà(‡t|¬Üö2öG‹BŽ,”TndVŠ×É“x¬7N´®$êz}¿ÅUíÖ­`&ãhêê “ÞÏ+îNñ‡_Íá,ž×Ùi# @æ.¸)NOkò&üÔŒ9ÔfޝÕz•½‹D°ºSuR'];'Íw&ƒã^'¦Y±'šlnH+ŸS¡Ã;×ð®`°Û#uâé6õ…G¸šŽµ—GÄ>Âe€m'ÕfßFp7Åu¿÷‘”cÖðjM˜ºÆé”Až3µ,9ŠÞ ¹ÍAf^—ÐÊNV¶•¶ë¦ÍåñPL€2Ú»è¿ã³ôþüy®’ß_÷O^ê¾ó÷Œ~áܘÃy2åÖCûÇ5ÑQk$”`ð|•ÇF|&¹I®òš£¬B³È©`3c¼ÉÕS’¶·)zeÇÂ…$ µa` ò¨uÉ—ûSÒøÍ©€] 6öß³­£ßìGbŸ˜Ò¾ÒÇLÄaž5T€`kÝ« ¦IÓ7yèW©¨¶eÀÓߊÜ9óåÊ{Òþ$çu°®°› Ñð#Z¡ï‹‡'Õ×ÿÅNp MšœÒðz¼ü\¯÷ÁïS(Ùš^q@eÓXy» ™/Ñ®’hà#Ô[·Â#+,ÈÄ:rñÞ½½2¬1:°µÅ<,·cÖÁð5"<8Šw8‰²Ö>9þk{­ãŠEŠñ¨C›k»tFÚù ÚÁâX„«ÓZºø†ÁmùOfë½ÍÒæ%_ÑÐp{&–AÆCè‰kAàØ;¿ v¬b±]j9 +YMëÐlô;!±aÛ˜f¥1ú K€@ Ѭ«7·ƒ³É¸óä‹Îhs]VK' FbÓZé0†zßᛉàMáèb%,ƒ{P(2&'‰f.Jj_¯EŠœòU†z¹',Ôq \QiT¬g>™¡}œZ%‰F§;9ÚR—vEs†{d%j!.‘Ãâ L=0ÏÀ _.Z9Díi/oœñÂw$°>ƒqbuà·©‡o“]}—•í©´àeõ G­HËÚ@¦áÎg¤Ú Ç Öëüv #ÊŽ@êzvŒžÕÄ衪Þañx z==1ñ*"^/a^ÚgÞו9y%²TļEW·Š{7†¨ŽùjK-­38B=Õ7¬-qK1gİÏÅUñh÷qX’[P·mȈ›ŠÚ‘[z>c2ê@éecH%R}¯âV‘HR½Cý­/f0;ÄÕζ†fš¼'¹·M Ø@‡½¯š—´&‚ái9ز¡ŒèÍ/ ß­8I…)O‘2×uIiöTèŒÁ\˜•¥oZ¦'„ጚ`@‰UÄö“zo^r¼UÕ1¦"îã8Ú‘Caxk÷ÅM™þiŠzüõ²íÌf䨂˜«Ø2‹…¨uª^?¤2KaÞFãàv¢ç@}šë%+¢æðìƒ5¼]Ÿîv&x~ú\ЉRj‘g6ºÅ Gb£¹ƒ?S¦­“¬2¥ ;/‰c_Ækª°š6lwf͠O»)ñiU|cüyV¹¯©ÅtԪ뛹¦7_jÊLn\ˆßGfrhbįG0s­ÞŠ‹—ö ?^ÇE¢%íÜ›ù ±Ÿ–†æ¨œB™Øƒ›€½d!QW?q½äæGI“É™DF§}Zñ"ø"æ9j.Ÿ4MßXÐIEÙÇËemJp]— êzzóŽ7¡(IXÁ`ÅRì ƒQ—9›ç®î.iÎlðãéÞ-QœY.'~f Ã9 E”Ú¡j0 ‡Ã±š8ãÉ›ÀàbÛÓº'@:²=ìv;r¤Ã©YL?ñº›ôéÈ.¡?0¨òïbÿ£Ò]…6Aæ@p™YâdõÊCÜ#7{*‡¾¾4;ÆÆßMx>u|i$W™nkÉ11z#ºVܤnóøˆ\Ýοáà}’¾&#S™]Õ2ý¦-Œ‘î‰*Ò·ÕµSa¥/‰Fi„¢^“ u]Á™Mêø×p_«`§È¼v5'ç®ÎÆ‹Ðfâßô¯­\à±Ñ3žÌ5 ;TkZp¢â*‡ ׿7êÃÔ KD®î·ù¥ßÛgö›`¼c$¯µ-¬¥—׋>æ[»ÒLQ)£I Эªõ$pÛžã© ì~WOq¸‹Þ©Zðèêz‹Û:ªœ÷ û¢;Š)I—-²ñ€øÎk$ýÇ9¨¦9’ï\,Ýw„›ûef&¨©í4 ¤ÒÍ–'$^ÄÃíü5‹u vA†Ò"À·Fž Ž*sܾ{0¡­¤'Í“m.¥Ð{”K[а¥­âȨ÷ÝÕÎÚšÞ÷2º“'%¦ƒÿ2ú$aQ¶_”e¥9Á½%gä&sM .VÑá¶|UÛÖÀ)Ñ[Ãí €ÖÑ$UûÃÎQñÜf&ê¨^´x„œŒmþPr”ôXPÈÃ=Ög¿åüÂúSÇ-¼†ŠK šxÖÜyË-7v @•±˜T£ûÅÑ•N;?j­O­9«ñœäÜXšÂþb:î7àГáÇ®§2 Žš©&f wÞ2¡¦œ÷‡.ÕUÿš…_mtßHK{ŠAþŠ´Žé¶÷ dë=kBd=¶iqÔx êC˜¨ðŽœ°Ám|VÙ¶ìÍl#”—£/ÇÙtxæ¤ÿ,œÅk`ßË©Þ×!&f!H1b¾R·±lXâ=£ó7®e÷‹+ô½å‹u¥Š…qì«âuy$ë«F C ž7œ“ÚÃj£ßî¨p¦[ùºRklEâ´² Ñ„«y— SŠT¾Ÿê¶ä›XSÑ+;áȶtØèœB¢Òiê‡4lr¬Û*&Cżh£¯õGîÊÚFôŽ— Hƒ{Œs_§Ú~p?¹ñzx*sKëq9Q(š¿/¼Ø£®$W£h^™h€T.ì<î )T}´Y¹×~”/|Ö­_-{¹/“¢¦ŽŸm̦‚Âñªqþ£*cÖŽçìÉè/MnšN."±°˜$eüEiúíb¨ ± ×O˜`ëD1¬ æmÙã á ÷Ñü{N‘ØÈ?@HRõßñ¡~FèAîÕ‹®ÍÀ 4+Ò1q‰¨_â0Ì×£^xä>™ÔìÐÀ·è©$œÐŠ•qA¼FüF™Íy1Ueenˆ3ÁRÄ»¦ÝÞ®ãV:HÔ[ÎlêhÊÒ– ‰ˆB“€8a¥O:IçÏ•.ùSz·ôÜfãëy;U)q+„Öêøh»|޹â$¼”µ‚ÂÌ’7¸L›2ö‰‘/šÊý@îR:ÄR™Ùsê†KÚ6ÕUŒa*5Àð:nÇÆ3ã3˜JoX:÷o °„W+ÔØ*~x<±Qýµ<ÕD @c|mêdé¦[JÛ’ß¹?CÃ19ÿ7N‚à´ŒAÔ÷¤º\.øµ$®uaÊ xºB6¤Ø½pۊᖾƧ†‹WûUÅV†f3åeT.£r¡¼÷î¿u·ÎLd5ðJï2ú?ºŒ¹ËèŸË°Pþÿeüýe”YÊé¿¿–èÿÌeôâ2þÙIùËeÔæ2þÅý¿wÿOWã¨6ú/ãÿt‰þ÷QTÁëŒTÑκ?`¾?`þ—˘¿» Èf´ò—‘øþË軌§ûï^Æ!Æßô´½­è?·ýŸ\ý2öŸ¬ÆþÝjüí¦ü:,³ ÿåÚø×W£.c$"d¾GÔì°·)ÿ¸ûÖÆ¿\¢ÿ ßø¿S¢¿«ñ·ÖÐïj@åÿ_›MùÒhkC¸@¨DÝ3ï_£Dú`êFFÚù'Ÿ>C”ù¼×ûŽvºn`¸Ù‘UÇóùþêRÇÎüù«¹ÜŸßì_Ý —Î~éO>]¤¿Ç2áœ](*8ö*/È üà£<.?ùªQú9ÑQ´?ï¥õiR¿_›”kœ¨4ŸŠ•òG ÝXòœ\/Ìp_ÑBÂÃÀüzW¯ÂC•\$;Þ~‹>Ó£IVT~ÎxÛbÞw¢veíϯð^0)7÷ã¹Z\^¾ónÁÜàiç,Ú‚´fÞp–¨mo‹õÇ2–˵gTÌÞb™Tnas §õ.#‹Œî[¶ž ¾y Ýö®nòÔ¨Ú''+Œ[´F$c•šÁšâròV£É‚\ê˜ÿp-Ëc2!žà¡øŒÂZϽ÷¥ù¾4Z†÷¥ùóK¸›ô³¿qcÓλDJcŸôë/L¦ž4/]w_õ­!Ëߛ怜£êÇÝ ýñ1Ò¨*1Õà‘©Qä0£ÕXW\¸3>9’á²s‹U9dZû«½¢BB,g(ñ`˜‘ã_ so@Ç”á%^ô½CìÞÇ*M$.ÿ°$lI9°DpºÈ~{ã'2çä`˜ŒË«YOΓ€ êœ!—ó0|/‰5ý€§/5P¿-Ù3xBò]=°é«µõP.w ‘ìм¯Y¥öÛš‰VOßÿèôIrAB¥”à7kÌZ@íò%­È¯Éx¿KÉBp[”Ò†Mö5™}“7øÃËí]\¬Ód Ë}¾nÆ^mr°Ç¹½ÇOˆW\{µõÆ'Xz›nsÔé*\}Lâ–Ü||²6íXa_¦âܤ**¡æš[δÎ;3t°èÀŒrBÅý«óç»ûm#ŽÚdªÐB'5@öˆöà„·ã¶¼ ¾¶\%ÿ¡£Ê–á\Ê›˜.âmÏbQ)ýú·x>ß3†fBIwýºS©ê3n±¢Hat ]‚·Yç…ØO>3J_Å3bô]Óˆ¡MùJ©‹È2^ë¦,ÈÀÞ­ÌGh(óŒüj²¢ÊìÈðãlRÁTlp>1Áç¥yiÏíkÏ›ñò¹¶ ®¾¯RýÁpéh'üF(( æÖÊL^þi[‡³øÎõÎ&Šù%D"àóP«méQn'‰…CêJ5ïP¶ó"h™~ÔÇ$ ˜I{¥•{FÖJMwÁdÄr•l!¬Å6е#¬ãÿl,gœcùðEáJ,國TrÈÎP÷ð™~(Ô€Ëk¹yµ~½=‘°æ:"-a¯|?­~/ºÑ1=œ¤P“@œ_sâCVÖê æ‘×õ™IyÔSODö‰[Nàµ2¯º£àé.ïPðð‘;õD¥5@ÇÖ'†3 _®¨”ïé„"œ~?³ ˜¶’~ÐÌ|Øðv^¼¬ö ÃùíLÝ,jèÀËÇ>i“¬ñŸÍ ¯Gr§A¢&/ÜлùÚ ü®UÛÒÈÑ>À±nÌ»V‰U×ÿlT!'ËÒ»è›]QÿÚNØÜE˜®gÞë}Æ`ÿ×U`&-ö”1ÇK g©¼ÛâAëÍ”ìÝ­ ‰h;= ïÌ%}ñÝÿÍûÓ`ßl- q=yzépâ´¾ù¹ÝT 2'¨L¦’„¹+¬çêjó-S£”à8È&‡€lM‹ëHñ¨‚>?i¢•e)Ô¿ƒÖZ_ô™ÒÒ7«whà •|œ½§ZÅHׄô€mÝG Ð#±µ&cX{sÜwá+\µOLV”»ÉÆa8>bÏîŒl¨:iÙÄ羟s!cb†*)€›w_%Ïœøì³™ÓÂÅóÉVsøÙbDÈÝCˆÎÕd’DÃRØ?Sy¿mxM[Jø^½¹¢Ä¸­HV‡m´– sg=bi<šµ**-´Iµ Íÿ¹ €œ Áb¤—:@ǃ•ÐÙ)\%Ùâå8ª‘Ïö¤QœJž8Q†ÿuZ^ÓŒþÁ¼ŠÞáÿßs<"Ùʤióºâwt1¢²­ŠO²ÕðÞ€ðë9N¥.“…ð …[n…“µºÇ5ßÏuµÂô±_#«Ò¥§°ÑÖv/cT¶¬©j$ä¸i;×:I8RHYl¼wšW©­MlXálíèaÞUšésÍÞË@µìn—ñeŒ—SÚsÅÑÙžô¨ßN6pƒÇl¸ƒ.ˆ4? þÉߥ.XŠ–[—¼¦$)›˜¤•úNoõ†çŠänbêDŒŒ€T”˜Å}»–ÿø†«ÐÂOF7̚ſrkéÐ Ñö>¾É ÞïìГÃ%@®¯“ÿŒÅ¼ hNêßã’Öòärêh6fºOó@ÆŽqg&¯k7çOˆI‡Þн†J U´7@qœ¯ØÙÐ`ñF2–‹ta©×ôEnµ~pl82¹–m}—rOcŠç3ñð]^özÂ_¾¢=)¬ÕÜÔ3¥jÆhŠ•áϲ>ôn(Œô½ëù- HP,Í£^ì,håjÿ 5²Ê Zšè¨#H´7.€,ÕUBÔÄûU7ÅDÛ˜r±c¢;—0+'äDµ0M*D¨>¹ñÒùq'B¤Y2BcvIñÇíù®eÎÚùÙßú%nþkádáôÔ—ÅZN˪·+FJKëv.4Pù¿të°ÌB™¼ÿÕë÷ÕËøöú¸lrÍiÝewfµ vñI‰h~ð‘ØK›I¹¦@íùnu. î©Š ³t›^;ú þ‹Ç£ùµBM×ÒTZHê~\ÆEßG!d[A¬šMµÕn³Í÷/ÞQèùµŽõ¬¸÷”"MïÊ\›Ñv¶šLG7 öøô;ÜkU%0( ª*‰¿l.xSû½nØð:°£ùñ½ÍÁ\{“gÁ4ä»ÝR{ ¹y¦sîÝrZ-$ýUS“?ö÷} ´” aŸ57åëK@µ™­„)Ö:éú;h‘™”8¥ÝN؇%v²ÍÄàÆ˜ÑÆ›Ž8x5å#p2ðïãhaç…¶ÓÊ+dÿÍ×½x³8ñžB™àÑÅ´ðÌüë:”ËhºŸµÊí?k•ÉoZ‘„|e,9N jMÿ̰ ExÈå>¥œb÷5Ì8!,¯suôyü }‹"Ä‘Qóu"ïÒ§aŸñ<×ò]“Ýqââ:>ç$~€‰ûÜ*grÆ7ìZuã®Î«™+þæ,lÃÆ¾NóǸI(Ö‚`–›È[Ôo¥+ [7¿ð=K/+{hÐWܦ,i”u0ŽÀjjj®«C]J\Ê—L$Ôž5̤Œã­ïßc“+U¥¶­]y9M·R=ŽU¼™60ÑÃðV3.ã;9³7â¡8èÈü ŽÔgt™QñÏhŠ´Äú­³>ñ~>ÊdcÕinŸð«¿︓x6ZŒ.þbæÛî)Wž/9Þ9ã@惣iåh²ËŒç¸ãú! ÇÚýµŠð 6okG<Ãs;mã”ÎHâªLlï@|Ýs022ýÆ?¦[+­6Ĭ&ÙrZé`Ú x/ñVÍ2êûè}cr»ŽÙw±tm• Oó† çõÇHëýà}žÒX¤å[ªÚ «¼àÝi*éåúGsòïh™ç½§I¼k½Xc<6Ì–`NÑn»\GÉ·¾¿œŠÉÇ‹ûï|T4QÇȰ?ÆØòž†<û±z ÿZ¹ú{åÄVUõ!Û„«¡{ÎGd9òì0mÜ».U° šd/u(˜8ðb© ̆¯?ba¤Åh7ó-e«ÓEôzÒÎ+i†lc _”Çj|´ª’l¿QÈNtÑëêk0jÈwþ_Ýj˜xÊU'z’¾ã¡h£‚âøªV«*½ú1œ¿Ø>æpFa?¢ñ»ê A·~”Ò¾âñóÄ•EAó*÷(쫜¬Ug4‘¶›¹%l˜(‘YÌ÷ñÆ…®TѶÚ&ZN‚»ÆÔ7|€8bö°gy+Ÿc¢é¼~Ö¸üh¸Ê“ô ¼€[9h’1ïs"¹,3§CðQÆòšÌ;`‹ Ï}‡•µuaç'1{bÞw¤fÇRwcʬÖBï¤ì:)ïç3ê£×+=,UÜaøèjXÃa²™ŒîŒM_ ¥Ô&7pUÊ?4¢ïØh¸æL„;UâwÈ $N¤òÀ ³m±Þp‹\ŸVuoçsD_߃˜zoQ÷Ði<ðÝ€‡¦év©ë!L"„T['ì÷0ñ¿y"ÁÖ¯ýÛ#ößZåÌÅ„>냮u4~ ÀX1†ô‘Åwe ³ÒVÇÀŸH0rÓä i¦ëþå!ƒÇ ƺáÞ£µõSÆ÷ö#­$Etõö}Úùh“øQ$;½’ {Yï ¿ sõú­Ä>Þ‰Œ,¤&p’‰L…äRƒ‰98Y#[°×•C{Ÿ–T÷¡}k«i(bßÉl%‘r¹¢"h6m£»çô§„Ä Ô>àš±ÇR,ÕX\øñ†zwú]륿9ÓÇ`xww;ÐúðT¨Ì!æ»üAŠ¥ßÐDpÆ0–ç „ ³ä´:Þ€tÔúãÔÛ$¿â2Qü~,Yq»qtZêT–˜vãŒãÔAÒ¼í|xC{µz5R¤U2<Ýòòm¹bÝÞ’ Ž¾×€¿¿Bæud ì¦þ_u-7Ni(t/5hãx&ÁT8­ü€‹X`ùÛ?ÉÈp ^\qÄ¥0ï £Ûù(Æ'Í,‚bŸ7”¶Áúi—åG‘ßçI2ÚÏ]:Ÿ]Üg¯cááü6¡?Ò­ñ€°x`ÆŒ¨ÜQ¡C?a7&Á sɦÓÊßÅ1‰ÔŽÃE6ñéQjŠu¹Ø¨¶óÅüùÄ>òóøV^¾ŽóC´ÁÜ 4”¯6%EÁõ„>ð­B€6L¥ñ-q^i.¯îc쫳™ìÌ®ð™'¯X3…V.ÚDÅ šÖêÔ©@ëïxuÔGŒ!²Ê1|¢)«âê6§Õh v| Z§“º$•ûëðâ‰j±8ÄbfÓñ°ðܹ_[áÈôqdª×^g½4É*r'œ³ÝºÐ5Rh”9h<ƒŽX¨Æ4P·Ž=d*F µ 4h ÇBØqvÕS2ëäöKmž™ÜDÑ1í·­¶IÆsUû,%Ï5pýòÚ}›Ç'â•@¿­ºEi"|È${ÉÏÚ“ÒAj´ÿ¬'œ3´¬œ±‘…² qg¿¢ÁܱDRÒÑÔmü'èÑÝ‚2xRéðÚšX¨UWùâò“Oipšq8êÜÇf¦ê‹³ZB¿²´ÊÐÝnfuG„‚ïØ’³#R@ñé)åÓmïN‰D9 @9ê,‘°—ÈûðÛ9êƒÊ²œ<€“`Š·­•Ûq]öDByÀ#K—‰…^§¤&u‚øúàZ¨‘+Û°"öâ•øÈüÚ8šóýyO:WØÿ(íWEïÛ”iS÷gþ3ÉÅ“>v¶òV»V좗„€Ø9Tó-6ÖÜyt'´+çûC”ÉÚ3•íªŽ–›!Ÿ8¦RKn_¿a¾©Ûޱ¯x½H9š»R'Ppæp~ÅìsõÓŽ òö‹Z!%ãÆóŽ_QyUôãÁVæw“¤ 34aön¦ùÎ[Ðä]FA(ìH}»nõF1ôÇ{éþÓ÷½iPݤ"ªôn@Læ¬~ª¹÷-ÓÚ}á"Ú bkÑšÕæd“²×ÚQNa "a/üÂ^ª [·àLg"š#cüPè2–9H%6sé<"Íi8“ÑÕìñTîùš85Þ&aØø~u,#º2lÝó-i?¶¬ –a,Ù=ã·>I2 Ñfsí— T«êÖ€Dç'ÔåN}òFùâàöa©&Èò©‘c'Ô§?q7škê1îjc¿¡AãlßÜÀþ8ø°˜RÞªrì\¦Íµy(IÛ:»$Ž.GßÞÄ©ô¡÷JŸONæ„fúôDÒ,Þ/Ø×Š/½)…ÿ¢õÔe—Ty(y?ΩïB‹ƒ0)öQÂàk¯Î|öýƃ‹z›{²âTcWjå¨7öûŸ%°,1µ[">Çì2¨äèÞƒÕË ˆhñ’)d h.M.^~k›NThÒj:_ÐY@!#¬ßx¾,ZûC0‚G)Üí ABÊÔÆŠ[ •p–Æ#sí\ %ʺIqsj  e=‡Œ÷k_0Tßy¥Wcô¡`•áïBGe$jìZt»qIeÀ„![êxœ* ñ%9FTÀnâJœW*A×½–2õ\×X}¾vhcçú,ê!eßál#ÆLZE™çŒW5U¾­ëšU ­(öâygì¢Òîæ²ð°`ί­cßL†ñ°:¤œ–‚¸ºÊðBí‘òÅž\ƒªè’Ïh¬8CþHDZŸxM˜UጨÛKÓšKÚ–6 è‰Ý”dŸ¾cX¬4³à†PŽ•(zØUÙ!ú; »1УÿmÛâ9•8Š&xY:=Ô¸áâ‚gr ÇCÛá+I §!=³i¯ÕÀbÂ'È€– p×ß~ƒ—ˆT'ÑÃ'o%P%R^rsÙÏZ±°„fSUú¾\ÅÞKG˲®:â6ä¼4&dïþÇÅŸÛD7£ ÏZ9昚ê(ZÌúrÍøÑ˜€pý¬‰½Ð~‚­zv¡Š×Ë)1e’ ÌH¾ÖÐ$õGŸ`ùó—Õk`\lÇåœÒJ¶L±öà ÆlY%Êõå–!BsOÛœÌYé<>vmºD4ø Q4,‹"߆ñ°”lâ:³'½½ëUA©´õÒæ‚‹£~xÔ'(¿ÙMýKÄ“íb_x©7NýÀ‡û§³ž’ó{×é°†p¾+\§ÛrÄ.œcó|\ôkó7jnêೕèßo¼W|•þèiV­ˆqáìÑŠdàß³#oc»7d™ŠÔªÎÂ$cvè¢ýÄ:è'vpݘ€°01¤Û¤…•!&äˆ$´j$šcôŒš±Ì}y«õK~€[+Q}k,­“»”%‘æVbMƒž A“-¯"AYùë}Y÷I_ ê0óæžr)Z!ÓÜŽŒMC²©Ââlê8 Œ8šÞ uC÷)/É^¬RíÓ§è"ºeSÊD×^$bMÎ%Åz­¦·F(ì:ösdíÜÝQS°VÕ¶ï)C˜A! šx|Ò™`Ú;÷¥Ç ±A§àhùrì¸ãŽ–š1³6Ë[;š-çÐGL^m0Qñ¯t­„¨we¿±v¾ wå½»^}ˆëÄ©w?#l2[ä†lYt×=¯éM¿ù…›Ïül.:(”\Û$¬2ï7©y¼—úÜ¢–Žïñ¨ C†úe3—윑SY™r²Z¿.©ó*Ü.­¡³G•ÑÛEhšœZX´Asyh鈜&‡ç–C{ilË4ñÓ-áä¬XB €Ü¢“—qgwOö‘±‘K”˜¤-§r&X²ãÇb‘a! í¤I3À¬ëyüö•cÛµ'¬)uY%à Óëö)$Vì”&U¦E=X‰XF¥Æé$%ÓâÅ5U0®gLèÿ¥&Îב¿u·ZF ¨p-ò9²kJB³ç,¿¸þd뺂<‹yÅyàÀûx/£×XîåÃ?œ oÅ%pªÊ‚MÈ™–Ñû†¹eƒƒÓÁœ¹áˆñ!ó¬ØÅ–è¾+Ó™˜³¹Ò‚¨<K HH܇°† zEw\Ùä¯Ûîê¬sœ^T¢= nchar(pattern). So you get a match ## whatever the relative position of the pattern is! ## However, a reasonable expectation is to have ## matchDNAPattern only return the following matches: expected_roffsets <- rbind(c(-2, 1), c(-1, 2), c( 0, 3), c( 1, 4), c( 2, 5), c( 3, 6), c( 4, 7), c( 5, 8)) matches <- matchDNAPattern(pattern, subject, mis=4) checkBioStringMatches(subject, expected_roffsets, matches) } ## ========== Tests that should PASS on 64-bit platform (fixed bugs) ========= ## ================= and FAIL on 32-bit platform (not a bug) ================= ## This test uses a big subject (10 millions of characters) ## in order to test the speed of the ShiftOr algorithm. test_ShiftOr_matchInternal_C1 <- function() { f <- file(system.file("extdata", "bigrandomTGCA.txt", package="Biostrings")) big <- scan(file=f, what="") subject <- DNAString(big) ## Simple pattern, mis=5 pattern <- DNAString("TTTTTTTTTTTTTTTTTTTTT") expected_roffsets <- rbind(c(2725443, 2725463), c(6535062, 6535082), c(6535064, 6535084), c(7765179, 7765199), c(8491897, 8491917), c(8491898, 8491918), c(8491899, 8491919), c(9233437, 9233457)) matches <- matchDNAPattern(pattern, subject, mis=5) checkBioStringMatches(subject, expected_roffsets, matches) ## With a 32 char long pattern, mis=10 pattern32 <- DNAString(substr(big, 1, 32)) #substr(subject, 1, 32) expected_roffsets <- rbind(c(1,32), c(3807182, 3807213), c(9926155, 9926186)) matches <- matchDNAPattern(pattern32, subject, mis=10) checkBioStringMatches(subject, expected_roffsets, matches) ## With a 64 char long pattern (works on 64-bit platforms only) pattern64 <- DNAString(substr(big, 1, 64)) #substr(subject, 1, 64) expected_roffsets <- rbind(c(1,64), c(1049302, 1049365)) matches <- matchDNAPattern(pattern64, subject, mis=24) checkBioStringMatches(subject, expected_roffsets, matches) } ## =================== Tests that should FAIL (open bugs) ==================== ## =========================================================================== test_openbug1 <- function() { pattern <- DNAString("CAG") subject <- DNAString("GTTCA") matches <- matchDNAPattern(pattern, subject, mis=2) multi <- DNAString(c("TTT", "GTTCA", "TT")) subject2 <- multi[2] matches2 <- matchDNAPattern(pattern, subject2, mis=2) checkEquals(as.character(matches), as.character(matches2)) } # TODO: Move this test to another file. Has nothing to do # with testing the matchDNAPattern() function... # Not sure this one is a bug. Are we supposed to always # be allowed to change a value in a matrix? What "says" R? test_openbug2 <- function() { s <- DNAString("ACGT") s@offsets[1,1] <- 2 ## Provoques an error show(s) } Biostrings/inst/UnitTests/runit-matchPDict.R0000644000126300012640000001047312227063321022504 0ustar00biocbuildphs_compbio # --- to be included in an upcoming biocDatasets package randomDNASequences <- function(n, w) { alphabet <- DNA_BASES w <- rep(w, length=n) sequences <- sapply(seq(1, n, length=n), function(x) { s <- sample(alphabet, w[x], replace=TRUE) s <- paste(s, collapse="") return(s) }) return(Biostrings::DNAStringSet(sequences)) } msubseq <- function(x, ir) { ## differs from subseq in the sense that several subsequences ## from the same sequence are extracted ## x: XString ## ir: IRanges res <- vector("character", length = length(ir)) for (i in seq(along=res)) { res[i] <- as.character(subseq(x, start=ir@start[i], width=width(ir)[i])) ## forced cast: chain of tools for DNAString seems interupted for ## some use cases (or I missed something) } res <- DNAStringSet(res) return(res) } # --- test_pdictConstantWidth <- function() { set.seed(1) l <- 150 target <- randomDNASequences(1, l)[[1]] W <- 20 L <- 6 ir <- successiveIRanges(rep(W, L), gapwidth = 1) short_sequences <- msubseq(target, ir) # shuffle the sequences (they are not in consecutive order) o <- sample(seq(along=short_sequences)) dna_short <- DNAStringSet(short_sequences[o]) pdict <- PDict(dna_short) checkEquals(L, length(pdict)) checkEquals(rep(W, L), width(pdict)) checkEquals(NULL, head(pdict)) checkEquals(W, tb.width(pdict)) checkEquals(NULL, tail(pdict)) } test_pdictVariableWidth <- function() { set.seed(1) l <- 150 target <- randomDNASequences(1, l)[[1]] W <- 20 L <- 6 n_cut <- sample(0:5, L, replace=TRUE) ir <- successiveIRanges(rep(W, L) - n_cut, gapwidth = 1 + n_cut[-length(n_cut)]) short_sequences <- msubseq(target, ir) # shuffle the sequences (they are not in consecutive order) o <- sample(seq(along=short_sequences)) dna_var_short <- DNAStringSet(short_sequences[o]) pdict <- PDict(dna_var_short, tb.start=1, # can't this be tb.width=min(width(short_sequences)) # the default for # variable width ? ) checkEquals(L, length(pdict)) checkEquals( (rep(W, L) - n_cut)[o], width(pdict)) checkEquals(NULL, head(pdict)) shortest_seq_width <- min(width(dna_var_short)) checkEquals(shortest_seq_width, tb.width(pdict)) # mostly a sanity check checkEquals(substring(short_sequences, shortest_seq_width+1)[o], as.character(tail(pdict))) } test_matchConstantWidth <- function() { set.seed(1) l <- 150 dna_target <- randomDNASequences(1, l)[[1]] W <- 20 L <- 6 ir <- successiveIRanges(rep(W, L), gapwidth = 1) short_sequences <- msubseq(dna_target, ir) # shuffle the sequences (so they are not in consecutive order) o <- sample(seq(along=short_sequences)) dna_short <- DNAStringSet(short_sequences[o]) pdict <- PDict(dna_short) res <- matchPDict(pdict, dna_target) # mostly a sanity check checkEquals(L, length(res)) for (i in seq(along=res)) { m_start <- ir[o][i]@start checkEquals(m_start, start(res[[i]])) checkEquals(W, width(res[[i]])) checkEquals(m_start + W - 1, end(res[[i]])) # mostly a sanity check } } test_matchVariableWidth <- function() { set.seed(1) l <- 150 dna_target <- randomDNASequences(1, l)[[1]] W <- 20 L <- 6 n_cut <- sample(0:5, L, replace=TRUE) ir <- successiveIRanges(rep(W, L) - n_cut, gapwidth = 1 + n_cut[-length(n_cut)]) short_sequences <- msubseq(dna_target, ir) # shuffle the sequences (they are not in consecutive order) o <- sample(seq(along=short_sequences)) dna_var_short <- DNAStringSet(short_sequences[o]) pdict <- PDict(dna_var_short, tb.start=1, # can't this be tb.width=min(width(dna_var_short)) # the default for # variable width ? ) res <- matchPDict(pdict, dna_target) # mostly a sanity check checkEquals(L, length(res)) iro <- ir[o] for (i in seq(along=res)) { checkEquals(start(iro)[i], start(res[[i]])) checkEquals(width(iro)[i], width(res[[i]])) checkEquals(end(iro)[i], end(res[[i]])) # mostly a sanity check } } Biostrings/inst/UnitTests/runit-pairwiseAlignment.R0000644000126300012640000002413612227063321024147 0ustar00biocbuildphs_compbiotest_pairwiseAlignment_emptyString <- function() { string1 <- DNAStringSet("") string2 <- DNAStringSet("ACGT") ## Empty pattern. alignment <- pairwiseAlignment(string1, string2) checkEquals(as.character(aligned(pattern(alignment))), "") checkEquals(as.character(aligned(subject(alignment))), "") checkEquals(score(alignment), -26) checkEquals(pairwiseAlignment(string1, string2, scoreOnly = TRUE), -26) ## Empty subject. alignment <- pairwiseAlignment(string2, string1) checkEquals(as.character(aligned(pattern(alignment))), "") checkEquals(as.character(aligned(subject(alignment))), "") checkEquals(score(alignment), -26) checkEquals(pairwiseAlignment(string2, string1, scoreOnly = TRUE), -26) ## Empty pattern and subject. alignment <- pairwiseAlignment(string1, string1) checkEquals(as.character(aligned(pattern(alignment))), "") checkEquals(score(alignment), 0) checkEquals(pairwiseAlignment(string1, string1, scoreOnly = TRUE), 0) } test_pairwiseAlignment_emptyLocalAlign <- function() { string1 <- DNAString("A") string2 <- DNAString("T") alignment <- pairwiseAlignment(string1, string2, type = "local") checkEquals(as.character(aligned(pattern(alignment))), "") checkEquals(as.character(aligned(subject(alignment))), "") checkEquals(score(alignment), 0) checkEquals(pairwiseAlignment(string1, string2, type = "local", scoreOnly = TRUE), 0) } test_pairwiseAlignment_gappedLocalAlign <- function() { string1 <- DNAString("TCAGTTGCCAAACCCGCT") string2 <- DNAString("AGGGTTGACATCCGTTTT") sigma <- nucleotideSubstitutionMatrix(match = 10, mismatch = -10, baseOnly = TRUE) alignment <- pairwiseAlignment(string1, string2, substitutionMatrix = sigma, gapOpening = -12, gapExtension = -3, type="local") checkEquals(as.character(aligned(pattern(alignment))), "GTTGCCAAACCCG") checkEquals(as.character(aligned(subject(alignment))), "GTTGACAT--CCG") checkEquals(score(alignment), 52) } test_pairwiseAlignment_backToBackIndel <- function() { mat <- nucleotideSubstitutionMatrix(match = 1, mismatch = -10, baseOnly = TRUE) string1 <- DNAString("AC") string2 <- DNAString("AT") alignment <- pairwiseAlignment(string1, string2, gapOpening = 0, substitutionMatrix = mat) alignmentScore <- pairwiseAlignment(string1, string2, gapOpening = 0, substitutionMatrix = mat, scoreOnly = TRUE) checkEquals(as.character(aligned(pattern(alignment))), "A-") checkEquals(as.character(aligned(subject(alignment))), "AT") checkEquals(score(alignment), -7) checkEquals(alignmentScore, -7) } test_pairwiseAlignment_editDistance <- function() { string1 <- DNAString("ACTTCACCAGCTCCCTGGCGGTAAGTTGATCAAAGGAAACGCAAAGTTTTCAAG") string2 <- DNAString("GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") mat <- nucleotideSubstitutionMatrix(match = 0, mismatch = -1, baseOnly = TRUE) globalAlign <- pairwiseAlignment(string1, string2, substitutionMatrix = mat, gapOpening = 0, gapExtension = -1) globalAlignScore <- pairwiseAlignment(string1, string2, substitutionMatrix = mat, gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) checkEquals(as.character(pattern(globalAlign)), "ACTTCACCAGCTCCCTGGCGG-TAAGTTGATC-A-AAGGA-A-ACGCA-A-AGTTTTCAAG") checkEquals(as.character(subject(globalAlign)), "GTTTCACTA-CTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") checkEquals(compareStrings(globalAlign), "??TTCAC?A+CT?CCT??CGG-TAAGT??AT?-A-AA??A-A-A???A-A-A?TTTTCA??") checkEquals(score(globalAlign), -25) checkEquals(globalAlignScore, -25) } test_pairwiseAlignment_zeroOpening <- function() { string1 <- DNAString("ACTTCACCAGCTCCCTGGCGGTAAGTTGATCAAAGGAAACGCAAAGTTTTCAAG") string2 <- DNAString("GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") mat <- nucleotideSubstitutionMatrix(match = 1, mismatch = -3, baseOnly = TRUE) globalAlign <- pairwiseAlignment(string1, string2, substitutionMatrix = mat, gapOpening = 0, gapExtension = -5) globalAlignScore <- pairwiseAlignment(string1, string2, substitutionMatrix = mat, gapOpening = 0, gapExtension = -5, scoreOnly = TRUE) overlapAlign <- pairwiseAlignment(string1, string2, type = "overlap", substitutionMatrix = mat, gapOpening = 0, gapExtension = -5) overlapAlignScore <- pairwiseAlignment(string1, string2, type = "overlap", substitutionMatrix = mat, gapOpening = 0, gapExtension = -5, scoreOnly = TRUE) localAlign <- pairwiseAlignment(string1, string2, type = "local", substitutionMatrix = mat, gapOpening = 0, gapExtension = -5) localAlignScore <- pairwiseAlignment(string1, string2, type = "local", substitutionMatrix = mat, gapOpening = 0, gapExtension = -5, scoreOnly = TRUE) checkEquals(as.character(pattern(globalAlign)), "ACTTCACCAGCTCCCTGGCGG-TAAGTTGATC-A-AAGGA-A-ACGCA-A-AGTTTTCAAG") checkEquals(as.character(subject(globalAlign)), "GTTTCACTA-CTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") checkEquals(compareStrings(globalAlign), "??TTCAC?A+CT?CCT??CGG-TAAGT??AT?-A-AA??A-A-A???A-A-A?TTTTCA??") checkEquals(score(globalAlign), -55) checkEquals(globalAlignScore, -55) checkEquals(as.character(pattern(overlapAlign)), "G") checkEquals(as.character(subject(overlapAlign)), "G") checkEquals(score(overlapAlign), 1) checkEquals(overlapAlignScore, 1) checkEquals(as.character(pattern(localAlign)), "GGTAAGT") checkEquals(as.character(subject(localAlign)), "GGTAAGT") checkEquals(score(localAlign), 7) checkEquals(localAlignScore, 7) } test_pairwiseAlignment_fixedSubstitutionMatrix <- function() { string1 <- DNAString("ACTTCACCAGCTCCCTGGCGGTAAGTTGATCAAAGGAAACGCAAAGTTTTCAAG") string2 <- DNAString("GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") mat <- nucleotideSubstitutionMatrix(match = 1, mismatch = -3, baseOnly = TRUE) globalAlign <- pairwiseAlignment(string1, string2, substitutionMatrix = mat, gapOpening = -5, gapExtension = -2) globalAlignScore <- pairwiseAlignment(string1, string2, substitutionMatrix = mat, gapOpening = -5, gapExtension = -2, scoreOnly = TRUE) overlapAlign <- pairwiseAlignment(string1, string2, type = "overlap", substitutionMatrix = mat, gapOpening = -5, gapExtension = -2) overlapAlignScore <- pairwiseAlignment(string1, string2, type = "overlap", substitutionMatrix = mat, gapOpening = -5, gapExtension = -2, scoreOnly = TRUE) localAlign <- pairwiseAlignment(string1, string2, type = "local", substitutionMatrix = mat, gapOpening = -5, gapExtension = -2) localAlignScore <- pairwiseAlignment(string1, string2, type = "local", substitutionMatrix = mat, gapOpening = -5, gapExtension = -2, scoreOnly = TRUE) checkEquals(as.character(pattern(globalAlign)), "ACTTCACCAGCTCCCTGGCGGTAAGTTGATC---AAAGG---AAACGCAAAGTTTTCAAG") checkEquals(as.character(subject(globalAlign)), "GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") checkEquals(compareStrings(globalAlign), "??TTCAC?A??TCC?T???GGTAAGT??AT?---AAA??---AAA???A?A?TTTTCA??") checkEquals(score(globalAlign), -52) checkEquals(globalAlignScore, -52) checkEquals(as.character(pattern(overlapAlign)), "G") checkEquals(as.character(subject(overlapAlign)), "G") checkEquals(score(overlapAlign), 1) checkEquals(overlapAlignScore, 1) checkEquals(as.character(pattern(localAlign)), "GGTAAGT") checkEquals(as.character(subject(localAlign)), "GGTAAGT") checkEquals(score(localAlign), 7) checkEquals(localAlignScore, 7) } test_pairwiseAlignment_qualityScoring <- function() { string1 <- DNAString("ACTTCACCAGCTCCCTGGCGGTAAGTTGATCAAAGGAAACGCAAAGTTTTCAAG") string2 <- DNAString("GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") classes <- c("PhredQuality", "SolexaQuality", "IlluminaQuality") for (qualityClass in classes) { scoring <- qualitySubstitutionMatrices(qualityClass = qualityClass)["22", "22", c("1", "0")] stringQuality <- do.call(qualityClass, list(22L)) globalAlign <- pairwiseAlignment(string1, string2, patternQuality = stringQuality, subjectQuality = stringQuality) globalAlignScore <- pairwiseAlignment(string1, string2, scoreOnly = TRUE, patternQuality = stringQuality, subjectQuality = stringQuality) overlapAlign <- pairwiseAlignment(string1, string2, type = "overlap", patternQuality = stringQuality, subjectQuality = stringQuality) overlapAlignScore <- pairwiseAlignment(string1, string2, type = "overlap", scoreOnly = TRUE, patternQuality = stringQuality, subjectQuality = stringQuality) localAlign <- pairwiseAlignment(string1, string2, type = "local", patternQuality = stringQuality, subjectQuality = stringQuality) localAlignScore <- pairwiseAlignment(string1, string2, type = "local", scoreOnly = TRUE, patternQuality = stringQuality, subjectQuality = stringQuality) checkEquals(as.character(pattern(globalAlign)), "ACTTCACCAGCTCCCTGGCGGTAAGTTGATC---AAAGG---AAACGCAAAGTTTTCAAG") checkEquals(as.character(subject(globalAlign)), "GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") checkEquals(compareStrings(globalAlign), "??TTCAC?A??TCC?T???GGTAAGT??AT?---AAA??---AAA???A?A?TTTTCA??") checkEquals(score(globalAlign), sum(c(33, 21) * scoring) - 44, tolerance = 1e-6) checkEquals(globalAlignScore, sum(c(33, 21) * scoring) - 44, tolerance = 1e-6) checkEquals(as.character(pattern(overlapAlign)), "G") checkEquals(as.character(subject(overlapAlign)), "G") checkEquals(score(overlapAlign), scoring[[1]], tolerance = 1e-6) checkEquals(overlapAlignScore, scoring[[1]], tolerance = 1e-6) checkEquals(as.character(pattern(localAlign)), "GGTAAGT") checkEquals(as.character(subject(localAlign)), "GGTAAGT") checkEquals(score(localAlign), 7 * scoring[[1]], tolerance = 1e-6) checkEquals(localAlignScore, 7 * scoring[[1]], tolerance = 1e-6) } TRUE } Biostrings/inst/UnitTests/runit-twoWayAlphabetFrequency.R0000644000126300012640000001240512227063321025276 0ustar00biocbuildphs_compbiotest_twoWayAlphabetFrequency <- function() { ## Equivalence classes: ## ## x, y: ## - length [Set]: (different length), zero, length one, length > one ## - string length: (inconsistent lengths), zero, same, [Set] varying ## - content: some matches, every cell ## - types: XString, DNAString, XStringSet, DNAStringSet, (different) ## ## as.prob: TRUE, FALSE, (NA), (not logical) ## baseOnly [DNA]: TRUE, FALSE, (NA), (not logical) ## collapse [Set]: TRUE, FALSE, (NA), (not logical) library(Biostrings) library(RUnit) testMatrix <- function(x, y, v, as.prob = FALSE, baseOnly = FALSE, collapse = FALSE) { x.alphabet <- Biostrings:::xscodes(x, baseOnly=baseOnly) y.alphabet <- Biostrings:::xscodes(y, baseOnly=baseOnly) dim <- c(length(x.alphabet), length(y.alphabet)) dimnames <- list(names(x.alphabet), names(y.alphabet)) if (baseOnly) { if (!is.null(dimnames[[1]])) dimnames[[1]] <- c(dimnames[[1]], "other") if (!is.null(dimnames[[2]])) dimnames[[2]] <- c(dimnames[[2]], "other") dim <- dim + 1L } mode(v) <- "integer" if (as.prob) { if (collapse) v <- v / sum(v) else v <- v / rep(nchar(x), each = prod(dim(v))) } if (is(x, "XStringSet") || is(y, "XStringSet")) { dimnames <- c(dimnames, list(NULL)) dim <- c(dim, nchar(x)) } a <- array(0L, dim = dim, dimnames = dimnames) if (is.null(rownames(a))) { x.ind <- as.integer(sapply(rownames(v), charToRaw)) + 1L } else { x.ind <- rownames(v) } if (is.null(colnames(a))) { y.ind <- as.integer(sapply(rownames(v), charToRaw)) + 1L } else { y.ind <- rownames(v) } if (length(dim(a)) == 3) a[x.ind,y.ind,] <- v else a[x.ind,y.ind] <- v a } some.a <- "ACGTACGTACGT" some.b <- "ACGTTGCAGGGA" some.mat <- rbind(A = c(1, 0, 1, 1), C = c(0, 1, 2, 0), G = c(0, 1, 2, 0), T = c(2, 0, 0, 1)) ## CASE: different nchar, DNAString checkException(twoWayAlphabetFrequency(DNAString("ACGT"), DNAString("ACG")), silent = TRUE) ## CASE: zero, DNAString x <- y <- DNAString("") checkIdentical(testMatrix(x, y, 0L), twoWayAlphabetFrequency(x, y)) ## CASE: some, XString, FALSE x <- BString(some.a) y <- BString(some.b) truth <- testMatrix(x, y, some.mat) checkIdentical(truth, twoWayAlphabetFrequency(x, y)) ## CASE: some, XString, TRUE truth <- truth / sum(truth) checkIdentical(truth, twoWayAlphabetFrequency(x, y, as.prob = TRUE)) ## CASE: XString, DNAString x <- BString(some.a) y <- DNAString(some.b) truth <- testMatrix(x, y, some.mat) checkIdentical(truth, twoWayAlphabetFrequency(x, y)) ## CASE: XString, DNAString, baseOnly = TRUE truth <- testMatrix(x, y, some.mat, baseOnly = TRUE) checkIdentical(truth, twoWayAlphabetFrequency(x, y, baseOnly = TRUE)) ## CASE: some, DNAString, NA, FALSE x <- DNAString(some.a) y <- DNAString(some.b) checkException(twoWayAlphabetFrequency(x, y, as.prob = NA), silent = TRUE) ## CASE: some, DNAString, "foo", FALSE checkException(twoWayAlphabetFrequency(x, y, as.prob = "foo"), silent = TRUE) ## CASE: some, DNAString, FALSE, NA checkException(twoWayAlphabetFrequency(x, y, baseOnly = NA), silent = TRUE) ## CASE: some, DNAString, FALSE, "foo" checkException(twoWayAlphabetFrequency(x, y, baseOnly = "foo"), silent = TRUE) ## CASE: some, DNAString, TRUE, FALSE truth <- testMatrix(x, y, some.mat, as.prob = TRUE) checkIdentical(truth, twoWayAlphabetFrequency(x, y, as.prob = TRUE)) ## CASE: some, DNAString, FALSE, TRUE truth <- testMatrix(x, y, some.mat, baseOnly = TRUE) checkIdentical(truth, twoWayAlphabetFrequency(x, y, baseOnly = TRUE)) ## CASE: some, DNAString, TRUE, TRUE ## CASE: every, DNAString, FALSE, FALSE ## CASE: DNAStringSet, DNAString ## CASE: different length, DNAStringSet ## CASE: different length, XStringSet ## CASE: different widths, DNAStringSet ## CASE: different widths, XStringSet ## CASE: length==0, DNAString, FALSE, FALSE, FALSE ## CASE: length==0, DNAString, FALSE, FALSE, TRUE ## CASE: length==1, some, DNAStringSet, FALSE, FALSE, FALSE ## CASE: length==1, some, DNAStringSet, FALSE, FALSE, TRUE ## CASE: length >1, some, XStringSet, FALSE, , FALSE ## CASE: length >1, some, XStringSet, TRUE, , FALSE ## CASE: length >1, some, XStringSet, FALSE, , TRUE ## CASE: length >1, some, XStringSet, TRUE, , TRUE ## CASE: length >1, some, DNAStringSet, FALSE, FALSE, NA ## CASE: length >1, some, DNAStringSet, FALSE, FALSE, "foo" ## CASE: length >1, some, DNAStringSet, FALSE, FALSE, FALSE ## CASE: length >1, some, DNAStringSet, TRUE, FALSE, FALSE ## CASE: length >1, some, DNAStringSet, FALSE, FALSE, TRUE ## CASE: length >1, some, DNAStringSet, TRUE, FALSE, TRUE ## CASE: length >1, some, DNAStringSet, FALSE, TRUE, FALSE ## CASE: length >1, some, DNAStringSet, TRUE, TRUE, FALSE ## CASE: length >1, some, DNAStringSet, FALSE, TRUE, TRUE ## CASE: length >1, some, DNAStringSet, TRUE, TRUE, TRUE ## CASE: XString, DNAStringSet ## CASE: XStringSet, DNAString } Biostrings/inst/doc/0000755000126300012640000000000012241047607016005 5ustar00biocbuildphs_compbioBiostrings/inst/doc/Biostrings2Classes.R0000644000126300012640000000703612241047511021653 0ustar00biocbuildphs_compbio### R code from vignette source 'Biostrings2Classes.Rnw' ################################################### ### code chunk number 1: a1 ################################################### library(Biostrings) b <- BString("I am a BString object") b length(b) ################################################### ### code chunk number 2: a2 ################################################### d <- DNAString("TTGAAAA-CTC-N") d length(d) ################################################### ### code chunk number 3: a3 ################################################### d[3] d[7:12] d[] b[length(b):1] ################################################### ### code chunk number 4: a4 ################################################### bb <- subseq(b, 3, 6) dd1 <- subseq(d, end=7) dd2 <- subseq(d, start=8) ################################################### ### code chunk number 5: a5 ################################################### toString(dd2) ################################################### ### code chunk number 6: b1 ################################################### bb == "am a" dd2 != DNAString("TG") ################################################### ### code chunk number 7: b2 ################################################### cat('> bb == ""') cat('> d == bb') ################################################### ### code chunk number 8: b3 ################################################### r <- RNAString(d) r r == d ################################################### ### code chunk number 9: c1 ################################################### v4 <- Views(dd2, start=3:0, end=5:8) v4 length(v4) ################################################### ### code chunk number 10: c3 ################################################### v4[4:2] ################################################### ### code chunk number 11: c4 ################################################### v4[[2]] ################################################### ### code chunk number 12: c6 ################################################### cat('> v4[[3]]') cat(try(v4[[3]], silent=TRUE)) ################################################### ### code chunk number 13: c7 ################################################### v4[-3] v4[c(TRUE, FALSE)] ################################################### ### code chunk number 14: d1 ################################################### v12 <- Views(DNAString("TAATAATG"), start=-2:9, end=0:11) ################################################### ### code chunk number 15: d2 ################################################### as(d, "Views") ################################################### ### code chunk number 16: d3 ################################################### as(d, "Views")[[1]] ################################################### ### code chunk number 17: d4 ################################################### v12[0] v12[FALSE] Views(d) ################################################### ### code chunk number 18: e1 ################################################### v12 == DNAString("TAA") ################################################### ### code chunk number 19: e2 ################################################### v12[v12 == v12[4]] v12[v12 == v12[1]] ################################################### ### code chunk number 20: e2 ################################################### v12[3] == Views(RNAString("AU"), start=0, end=2) ################################################### ### code chunk number 21: f1 ################################################### start(v4) end(v4) width(v4) Biostrings/inst/doc/Biostrings2Classes.Rnw0000644000126300012640000002050212227063322022213 0ustar00biocbuildphs_compbio%\VignetteIndexEntry{A short presentation of the basic classes defined in Biostrings 2} %\VignetteKeywords{DNA, RNA, Sequence, Biostrings, Sequence alignment} %\VignettePackage{Biostrings} % % NOTE -- ONLY EDIT THE .Rnw FILE!!! The .tex file is % likely to be overwritten. % \documentclass[11pt]{article} %\usepackage[authoryear,round]{natbib} %\usepackage{hyperref} \textwidth=6.2in \textheight=8.5in %\parskip=.3cm \oddsidemargin=.1in \evensidemargin=.1in \headheight=-.3in \newcommand{\scscst}{\scriptscriptstyle} \newcommand{\scst}{\scriptstyle} \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}}} \textwidth=6.2in \bibliographystyle{plainnat} \begin{document} %\setkeys{Gin}{width=0.55\textwidth} \title{The \Rpackage{Biostrings}~2 classes (work in progress)} \author{Herv\'e Pag\`es} \maketitle \tableofcontents % --------------------------------------------------------------------------- \section{Introduction} This document briefly presents the new set of classes implemented in the \Rpackage{Biostrings}~2 package. Like the \Rpackage{Biostrings}~1 classes (found in \Rpackage{Biostrings} v~1.4.x), they were designed to make manipulation of big strings (like DNA or RNA sequences) easy and fast. This is achieved by keeping the 3 following ideas from the \Rpackage{Biostrings}~1 package: (1) use R external pointers to store the string data, (2) use bit patterns to encode the string data, (3) provide the user with a convenient class of objects where each instance can store a set of views {\it on the same} big string (these views being typically the matches returned by a search algorithm). However, there is a flaw in the \Rclass{BioString} class design that prevents the search algorithms to return correct information about the matches (i.e. the views) that they found. The new classes address this issue by replacing the \Rclass{BioString} class (implemented in \Rpackage{Biostrings}~1) by 2 new classes: (1) the \Rclass{XString} class used to represent a {\it single} string, and (2) the \Rclass{XStringViews} class used to represent a set of views {\it on the same} \Rclass{XString} object, and by introducing new implementations and new interfaces for these 2 classes. % --------------------------------------------------------------------------- \section{The \Rclass{XString} class and its subsetting operator~\Rmethod{[}} The \Rclass{XString} is in fact a virtual class and therefore cannot be instanciated. Only subclasses (or subtypes) \Rclass{BString}, \Rclass{DNAString}, \Rclass{RNAString} and \Rclass{AAString} can. These classes are direct extensions of the \Rclass{XString} class (no additional slot). A first \Rclass{BString} object: <>= library(Biostrings) b <- BString("I am a BString object") b length(b) @ A \Rclass{DNAString} object: <>= d <- DNAString("TTGAAAA-CTC-N") d length(d) @ The differences with a \Rclass{BString} object are: (1) only letters from the {\it IUPAC extended genetic alphabet} + the gap letter ({\tt -}) are allowed and (2) each letter in the argument passed to the \Rfunction{DNAString} function is encoded in a special way before it's stored in the \Rclass{DNAString} object. Access to the individual letters: <>= d[3] d[7:12] d[] b[length(b):1] @ Only {\it in bounds} positive numeric subscripts are supported. In fact the subsetting operator for \Rclass{XString} objects is not efficient and one should always use the \Rmethod{subseq} method to extract a substring from a big string: <>= bb <- subseq(b, 3, 6) dd1 <- subseq(d, end=7) dd2 <- subseq(d, start=8) @ To {\it dump} an \Rclass{XString} object as a character vector (of length 1), use the \Rmethod{toString} method: <>= toString(dd2) @ Note that \Robject{length(dd2)} is equivalent to \Robject{nchar(toString(dd2))} but the latter would be very inefficient on a big \Rclass{DNAString} object. {\it [TODO: Make a generic of the substr() function to work with XString objects. It will be essentially doing toString(subseq()).]} % --------------------------------------------------------------------------- \section{The \Rmethod{==} binary operator for \Rclass{XString} objects} The 2 following comparisons are \Robject{TRUE}: <>= bb == "am a" dd2 != DNAString("TG") @ When the 2 sides of \Rmethod{==} don't belong to the same class then the side belonging to the ``lowest'' class is first converted to an object belonging to the class of the other side (the ``highest'' class). The class (pseudo-)order is \Rclass{character} < \Rclass{BString} < \Rclass{DNAString}. When both sides are \Rclass{XString} objects of the same subtype (e.g. both are \Rclass{DNAString} objects) then the comparison is very fast because it only has to call the C standard function {\tt memcmp()} and no memory allocation or string encoding/decoding is required. The 2 following expressions provoke an error because the right member can't be ``upgraded'' (converted) to an object of the same class than the left member: <>= cat('> bb == ""') cat('> d == bb') @ When comparing an \Rclass{RNAString} object with a \Rclass{DNAString} object, U and T are considered equals: <>= r <- RNAString(d) r r == d @ % --------------------------------------------------------------------------- \section{The \Rclass{XStringViews} class and its subsetting operators~\Rmethod{[} and~\Rmethod{[[}} An \Rclass{XStringViews} object contains a set of views {\it on the same} \Rclass{XString} object called the {\it subject} string. Here is an \Rclass{XStringViews} object with 4 views: <>= v4 <- Views(dd2, start=3:0, end=5:8) v4 length(v4) @ Note that the 2 last views are {\it out of limits}. You can select a subset of views from an \Rclass{XStringViews} object: <>= v4[4:2] @ The returned object is still an \Rclass{XStringViews} object, even if we select only one element. You need to use double-brackets to extract a given view as an \Rclass{XString} object: <>= v4[[2]] @ You can't extract a view that is {\it out of limits}: <>= cat('> v4[[3]]') cat(try(v4[[3]], silent=TRUE)) @ Note that, when \Robject{start} and \Robject{end} are numeric vectors and \Robject{i} is a {\it single} integer, \Robject{Views(b, start, end)[[i]]} is equivalent to \Robject{subseq(b, start[i], end[i])}. Subsetting also works with negative or logical values with the expected semantic (the same as for R built-in vectors): <>= v4[-3] v4[c(TRUE, FALSE)] @ Note that the logical vector is recycled to the length of \Robject{v4}. % --------------------------------------------------------------------------- \section{A few more \Rclass{XStringViews} objects} 12 views (all of the same width): <>= v12 <- Views(DNAString("TAATAATG"), start=-2:9, end=0:11) @ This is the same as doing \Robject{Views(d, start=1, end=length(d))}: <>= as(d, "Views") @ Hence the following will always return the \Robject{d} object itself: <>= as(d, "Views")[[1]] @ 3 \Rclass{XStringViews} objects with no view: <>= v12[0] v12[FALSE] Views(d) @ % --------------------------------------------------------------------------- \section{The \Rmethod{==} binary operator for \Rclass{XStringViews} objects} This operator is the vectorized version of the \Rmethod{==} operator defined previously for \Rclass{XString} objects: <>= v12 == DNAString("TAA") @ To display all the views in \Robject{v12} that are equals to a given view, you can type R cuties like: <>= v12[v12 == v12[4]] v12[v12 == v12[1]] @ This is \Robject{TRUE}: <>= v12[3] == Views(RNAString("AU"), start=0, end=2) @ % --------------------------------------------------------------------------- \section{The \Rmethod{start}, \Rmethod{end} and \Rmethod{width} methods} <>= start(v4) end(v4) width(v4) @ Note that \Robject{start(v4)[i]} is equivalent to \Robject{start(v4[i])}, except that the former will not issue an error if \Robject{i} is out of bounds (same for \Rmethod{end} and \Rmethod{width} methods). Also, when \Robject{i} is a {\it single} integer, \Robject{width(v4)[i]} is equivalent to \Robject{length(v4[[i]])} except that the former will not issue an error if \Robject{i} is out of bounds or if view \Robject{v4[i]} is {\it out of limits}. \end{document} Biostrings/inst/doc/Biostrings2Classes.pdf0000644000126300012640000052063712241047511022232 0ustar00biocbuildphs_compbio%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 2095 /Filter /FlateDecode >> stream xÚÝYK#5¾ï¯È±#mŒ_mw#q`yBF 8ô&LØIzH÷L˜O½ÜLgÐ.{â°ÛmW•¿úÊUö¾¹yõÉ×®\˜¨¬Éýâf»0¹Q!øEðFé7›ÅoÙÍÒd·ð¯^þqóÝ'_{?^á¬òÎ-4O}³oÚîs÷Ç]ËÓ§ ›§Ùv¹rZgë;XPµð§­[ú]çú¼´1kNïxdŸÜ¼GÍþœjZ³ +³faŒ*óÜ¢²\Å¢X¬\P6ä¬ò›?.m:¬[ú`a_+góìGÔWíä“…O.«i‹î 7‹•õÊç%‹ú¡Á©¸ª™ì½]®lÈ@I4Æ_sÛBSøãE€Å+úÑRP’ ¿Xù œc¿hhÓÎd]Ý·V€ÓhUêÒàz=5Í,W%èüVØŒüÑ tÙZðoÝíÁ¶e3B¯RôÞA!Þ‡¯#½@“2ÄäÏ_†yú@ L¶›³×„§¬ ï ›U¸jÃí}'ƒ-šý¦tÝ >ãnîi‹õ©êh¿hiz¬ÙVÓö·9ëLˆªÐq )qÀ{­Œ+¦ ¹Y¦*§ }Ó>›Õš«`zLÞR!.æÓ‹Û„o.ÛNw=õ“Ñ¥*MÙ; æõ¾úwG¥e ù`!óg½^¸ZçLj@ö}œ’Ñ$ý‚úL˜±´Ð*ÆQ|ž|lFµó”Šp¨å/RªTEÙÏ{fDn¦ ƒ$sEœhƒBÿ?sÿó#€ mð@šõFáUpöãycŽ7Ö«Á<>^C®¼¶SÓÃÿ(´þ+ZÐñ€GeˆS´â{£ÕŠ••¸¶›³Ì*/z*¼ž“U#dF-;ÞÌ 3ÊÙø¾QpÚmÄÞÛ9ÑP†Ä~Å¡îI{Ä·èÁçÉ7 †VÆ +¥j æÐ>ñ"L"ïa=É¡$ÑäÏÓ±sâ››[Ù=±È6 ªtîÃn‡#±“ˆSÿ®M.…E÷â&*yê#VÈëz§S÷ˆ"ÏÜnkÛlyà²Ø‚¡=U/@üTñØÚ sŽ—ÚØu“»¼P¦gÃÙwC\“ºp‚)h¹¯Çqmˆ»®ÖhÊ»•œqPÝÁnÀeNå^Lµ«Õr•ÃìïQÙ;\Pl54ã#áý í+s×HE,ô· fšã†÷g¦•‚Ú}ƒY‘Q0Ý«¿á/ÕÇ\‰€ 9ï‰gSùzø³Á~‹ÚwÇž1ë$žbIl©g>’IS·(ÀQÌ=@øpØ ‘ò‚)™|KæÍˬäš]Ë“Ì;ï ¾„þŸ‹ÌÿþÄ 7óFÚ:EaBSkòÚw*ò4¶äN4¹©jÄ ¸o¢5¢˜¾×t»¨7isÐyJõ5â#Å=ﺕ^÷¤…vÄú¶Íl¾AUg††¿ÑÙX3ûhýVðk#y×Ö”˜{ì‡ò.7a¨ Ï)äÝ2œ0ð)`XºäDÃà£ñ0Üþ‰ê¿å §«Ú±ºÃá€ÉžN‰µí°Ë&%H¯,ÞüÆt$_6Bs ?ÁŒíöù­Æ]¶!ÆV9¶´É|ËæÛHÕ&y®§qÇ"ï߇­´ƒâ†×ôœäŒ°›6HnÇØØº¤âÂ@— d+NÄ™ÇQ¹5V6sâÎyß§[êWc 'L×ÍQîÀæ á¿$•3“cJzøÐ@‰“ûìO\@Ù´åñóm‚«æš3À-÷öŒ#˜F§ËZ&!„Õ‘ÛGã@Åšé$³’ ”úÜÎf3(©­*3Ôà7¤ 6Ðê0„Ö4<‚V…›»‘…à '©M¥ÃEj‡ U9TÜéÉhLó›séáa|‰qè`<|îEÓºJ‡ÈKI€í©?È(‡Áð©õ'M|y‹SEPÅêa*ªE¼Û5§>6@ãaHIŠön‚*ÝÅοáƒ.¥§ÇqžÂD–›¾É×Ö+þÁªbAüYÊ_( L^÷ñÙ‘øs7õÙ³ãî_ílÊ|_pàµ)×­¨•>ðÃV¢I*°vb.µ)N§8ã–Q¡@ 9´éb¡-' (åó²àäßÉãÐI0*¡B%iÄ5ÚX>èBt:L3:̯˜†Tðt<4®MAS¿fÊ´²¯–UsÚ n´ï2N¢µÏà#ÕXg-<‡>™ûp”ÃOß$©G¾Ïo5‡ÞF¤(­Œ&RMC{Zö˜i†xñšcXÞUëRƒ¨YZZm\b>„–ºˆWhizÜ_¼xs½p5:B¸|`Í×¶Q)-.„Æh¥÷7c•Ófê¢czÑpùðŒ(qE‡÷åEÑáàxã2ªXŒ^>†[ü,´p¡ÎýhÁ N¨î¤pƒ&»ÿò2ÇߪYˆ-øÐøñÍ]Œ Íæ§ážÔ—f 絨JÏbО–6ÉÞ«UciTÐåô…èԛįt ½âw¸ˆà[@q5ÞÀuÖJu¸ÁŽIâ8A7\ˆÇWhœYñ,~Øã!LøøûØ›6›ðMè~”ð½+‡ŠÜ’ó±—‚_ÿ-øŒ*½ JÕ#'*¥2…];оÄ{l¥®<=`…˜^ðûltt‚Aè”ÖåXºáßKò¯ÇOéGl’óùäì(¸ÜÔʸÛj=*¶tóŠŠ¡V±,à2:9õ[`¶‡CmUDÒ8ÑG¼úêæÕ?4E³ endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 1 0 obj << /Font << /F39 4 0 R /F44 5 0 R /F21 6 0 R /F49 7 0 R /F54 8 0 R /F58 9 0 R /F60 10 0 R /F15 11 0 R /F65 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 16 0 obj << /Length 1348 /Filter /FlateDecode >> stream xÚåW[oãD~﯈ú‚-ð¬gÆÛ!¥…]-AJœØM³Jã§ìößsncÇ]GMV•@âÁ‰=sæ\¾s‹ÙÙ›·I1щ²‰3“Ùí$+”™¸¶2î”ýõ 8M_R7Í•5ÖŸ)Qz5†ZIG7=JáXÙ¬CbA¼Ñ¿IáN¨×ìriÙò E,®–[Ù®|lâ&Ä-9ÜÆò"z¼þ$qUû [5ÉkƒæÿÞ+s«œÓÇ'›V©.úBCaÙË“¤Tà•²òÆìð‡”£L­Ú5§Œ(+²Tǹ2ýÀÒ©— D†óiÄ ¨G¦8)~Á¦8ïÝ@Ò¥IðA ×Á·Röô ¦FY ΀(ɬã£ßÃIc)WW”½X35Uß-e¶ö]I#uz'$}‘çuŸ¤ Ü ‘4ç¿ï€2â׋ý–ñŒ¡È>‡ç=S£f÷þõ…ó´ÝˆY$âBz~Œ®ì¬xF­Ub-5†Ôå¾Kê@“E\öj‘á£|ËüÎÆCÖž3™_êê¯|/|÷eE T:eZ‘õùŸ½.d#!aØ ¦zÏ,ÊäÞ™ó=àŸƒûŒáµàzÃŒæ‘tÐN0K ÎNÇ2 pËurzUÏTÞ·‹#Ó-wÊÅf4ݪϒ€TÁVp\2Ìäy'Gö ÂKÙ¿”ï«ã¾:6àÑ)ö¸€?Ʋ/ |¯üH䟎ÏkEwõÅÑ͘ŽDŸ?V ¦ÐÈ:×u]h1¶Þzͯ–)>"ëß)`:š1äʼn (IÌŒ`A¤ú#.<8š¡mêªë'þ„P-"à ¼mî™ððP ³L9¨…¢Ñ{ üý—0sàrk/yBEÖŸ¼ŒMU‡© dV^zðjß÷2Ø„dÃ+QㇻrŽê¾<~6æ§EÒ×8( â¾$vÁ²|àÅõ ¶¼K „Qž©¢1£Ñz¥²~eÌQŠ kð²¦1&„Áúc(ÓuÅBe¸ìÐé9ÔåéïDkTv¨uŠU”ídW1Sôç¯÷œ:/'DöД"uÇ“˜íÜ=À¼á”Éž]&^®5c`¥0Ky°0Ú7¾°ËøG“ߪåÿšvº•`úÕ•ìËÝÍR—Å¿vp{Y¬öÆHB½ÄŸ'^˜wtý5ÍrEDE¾êçU_›­`æé6/Íͦˆ•q¯Þýd¶ÐïLúlÖŸ.¤uêïú9ÛGH‡ž¯ftÏ­öï¸Ö¨ã­·›ÆZ¯¦Âk©ðžÐîþ«­îÝñ­ËÛžÑin>æÜ¿ÃáYw¼³Ÿ ÍÍÿ|f¾1±J2‹M®Žþ®„g?ÎÎþñµ” endstream endobj 15 0 obj << /Type /Page /Contents 16 0 R /Resources 14 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 14 0 obj << /Font << /F49 7 0 R /F58 9 0 R /F70 17 0 R /F15 11 0 R /F65 12 0 R /F71 18 0 R /F60 10 0 R >> /ProcSet [ /PDF /Text ] >> endobj 21 0 obj << /Length 2232 /Filter /FlateDecode >> stream xÚ¥XYoãF~Ÿ_áø%2õ°›lƒ$@&Ç" lLl€I(‘¶”±D)gÖÿ>uõA©5oH6û¬®®úê«~}ýâ啾Йj²F_\ß\T2e]¨Zç×ÝÅÛÅ×WKkòÅêJ/ÞÂsOÏž[xðlàù=³|V\Ôðy~ÿ¸úãúß/(³x­U‘çKS¨¢nx%#–Ñ2y°<²$—P| Ï/Ò4³$ºän®j’n­ü¯i6ébé„й²–e˜d­÷´šèàéÅŸ²Å›neέˆq±^ssËŸ­NÅYÚÆºÈæjø'Åý?ŠâfM©š¼€1Ô—7¹ÌmbY³°¢›RËÊLéFÞ_-M¹¦­ˆß¿®LÛ\æ¹Y¡Œ³íHõ[RµLX»BE­êï¤hjnÇ>êw/ë8íô¼«ß¢@¢þB6ÿ#î¦*7¨³õœõüè‘ôû[npÉŠ-¦ÅFXÜÏ å„RuÙ¨B{­þF¦5ʤ)UjÕT¾û°‚Ã-âŠk§ Xo늖ŒdÝôä"º\o½+¸ÒØbÏN6²w{¶d—:ݻСÅòÝâë‘Ö#ÕS«ÜعnqôD‡“G*M8g^)Ûän{¸ôƒØ}p„V`XµsÞ»è8:6Š;ŠÐÿ/r`>k4nœüŠÞÅÙ¿©Orv³«mhŸNpá <»ee•E 4Z•Õ Ü­¸ø%AÓª˜ßÜ3ÅÒA"žL6CY¬£#Eð{æ‚]XÅa2V}O•XÕÂѲæ,£«óq\¾Ž–?¶VÍ´~}Uç`I×tÕ!¦¤&5àÁµ·>p£Ô\Veõ³¼¼(õ/_æèv“|ñS@ÂkÓ²=ãäµ°Ë_ØÖSí U¢Íá†}d½eç¤J-Áô ^Á»0!ôJú¯ÉYëÊIÎ>w.`¦#EžÙ󞌡1åNEV)E|²åÜØ>.ÄÌ´Ø&cû™oOâ¥ÌÿÖÓ Ï@| ϵ|ñÿ'b³Æ(ÿ4z›ÒC%Ä’„0V+!§«'ØQzwsyÊJ™,üÄrôïÅ+9T[Ëø?‹ E'$­j¥Ã©:*´‰œW¤üê#¯kUú¥U"i7=—ïÚ#¶‡»¦ð6 |P¹"R!,Ô¯Œ©fÀÊÞ6‰¢ AòÏ#ïûHÔö©X’‚À²jÜV¾CËúuuˆbTB¶Rµ=KTj©¥¶%Äa3Çn4÷k¤ˆ¸ôÏÌRÁïÿiß±ÉY‰Û(²š«ww§¸æþˆ:ø=lz.cþ!²:WêuC“` 'C½Ñ,¯ø(Ö;–âqË ·üv¬$–b%¤ºGöJÓN¤e©5°e4žxK°´¾±†ø®#òâñ¢zÙ‡‹_{¸•9Ð,l¹èÏáï0ürpdwYúi8„¥ß©‡?*$< ˆ.T^”F@+/”Æ£Eéò+È>Œ%ˆr ^eñ°m<†Eq51¯Éân«íÞ9óc`ùf_h)úˆo©¼GNlëxb áÏdµ–1 E¹DeˆèÇ L¤JãÌ=™›,M­UM Œc™8Êiïî„…G´p==h©OÃÞå%Œçè®U—¹÷N<’7ðü Ï÷IªaTÐ, u)û±ä3õQ«%z#‰£«óE!nŸ…y¾“H÷ÍÓð})ò_Rþ¶æbúÙj)÷4E'høkøC¹eÇ~H€9 õ7pæÚ$ ýHðí·#ðùœÂ–B'}wƒ˜„“ iKQ ‰ŽÜîägFÕNAÔCj‡=/åö•^×Êlõ06 jwÔDF,ã)i¹@3Våe=;ü¹Œuæ¸!ªrÔ*¤jL"!JNíN6Ýâ’e<^‹j¡:Ú"Íy¬‰†G3y5¡,ï$sßȲî°ŽFþÃm»ÐŠv™ÉPq1ç[ª¥QëZ$„5‘U*ûñ¸›Š†`Eéœãž`1¿–ᇱ±ïÖåÛ'$I “hÀ8-àfF¼kU0ÿ297L]ø¤äuˆªQs4©VY¸Ûø„I?ÔÊh/.í¢Ð3l@-±õ >§q¸@§Ç3hž –AZglHÙâøœŠ#¨Ž.•’4µáֳ̫û%¨öÈ€m|q@z¤Ü“™'ucé1èßÂömÝof8¿;£!y(Ëçë½VyÈuOwÇtm¶³}r§„»yÀ¤~.í¨ý¥ ¨ýQî–ÊFU Ú™Šé¾¡'/sGÏqööa’åJ¾“.„•wBSàÃØFÝÜ×LÙˆúa7Ÿ.@ù[þ´{´'ÚGÇÕLTJ„«¦rå ʹ·ý°Å¤G|ß0gz錹lšèöÁ˱—ÐÄ»a [–}1vµsA/·+My”ËÕYdþÓ;n.‰ºÇé—…×!YÓ6p$²Ô8Íq\Ç0“l;‡RSÁO h>ÀùˆX±nñÞï~dÿ׌ލa—{ºÜókxGá‹Û8ReÍF¹ÛÅŠ£Ö­»$Áú2Æ œöaÍ®ßá_,³­é??„¹ÉçuÁ!èE¼ÛÎ]h_žOCÄpÖ¥›'¡ØåVGw£íž¿'—N¹ –t߸»vÆ+(…¨ëû´ûè'pjº<¸—„æSe¼:wûò Vëil|¿âyìñžç‰[š Í ªxwï@À{…1gî›FÕ!#C¤ù4’ž$ñ…µç/µ¤¼.Ô!§O,]BZbÚs®*SŸE}º!Ì!kq›f2Èò¹jt¼G€?Én ØÕâ›ZÙ#äñ¸@¸5%Óž¤mŒ'×Ëo>=Kéž¾ÆÓ9ZÆ<Àà9×.醞/¾¿~ñ7~ê±X endstream endobj 20 0 obj << /Type /Page /Contents 21 0 R /Resources 19 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 19 0 obj << /Font << /F71 18 0 R /F60 10 0 R /F15 11 0 R /F65 12 0 R /F49 7 0 R /F70 17 0 R /F58 9 0 R /F62 22 0 R >> /ProcSet [ /PDF /Text ] >> endobj 25 0 obj << /Length 1233 /Filter /FlateDecode >> stream xÚÝXKoG ¾çW9I@w²óÞ1êi-rð¡Uƒ®kIvÔÚÚVZKí¿/‡ä¬vå‘íÀŠö@i$‡Cr>RúvúâÕ{WŽd)Bähz5 ¥pZ\eD%õh:åDŽ5Pt´j™âx=)¬Òã—0üè è5Ð̲Z­€®^{ZÚ0[Íój½˜~R ÆR k³áCÿ:!M?Á0Òw|pŸ¢Íoxÿ ÏÏ¢öWï½ì_¼Êã$ó ©æ«‚Ô) ç$<ôZ&ÙsàŽ>» ‰)û%šðޤá2Òmœbim„¬<‰› \\Y”û´ [õ¬…a9äÿ¹ïëÎÑ£×;tpæLYÂXÙ¤cãZo»P¶¤hÌãÔ´ûõÍÝeŠ@——«kbj`òǤа·æh¶qmÍÇû²¼Òò¬;þtnçý ÀåZL côø{D¤xO­p':Vëq tåEiͳmC8ê#0a·œ$·àÜ9Û%¿¢Ýæ$G…´²ÀOAÖ&daTŠÉ`hø5b?¦é –ã_K[ÂלI}EÜ}Ø]óø”þ¨Ü³.SæÌb™¥¢$‚u9 ÎÀÒ b&hïÁæ}ûQEƒ§ã°¦/÷x-zûhêœÐå kè²pXl&k]9J%gzXr}´Í “a¤”¨œ»_ø†;Nw¬sÞeÞ$§°W¦”“"Içcx»yÔx~p•‹ÜUÎ9¹’.źÏí^×}×è´{•º§R²JÏs¿W™÷8nµÖôT—¬ºâyHªˆgÔ“úc­Äà%¤dM]PBJ~¡[6)½§c†Ì¶& àNí¶œ5-€ dAÍHÕR¿cE,Ôðþ¶CéëcH/eWº›;JWm=Õ3ëÆ71Io9YÛ,¶Ú z¢®þNdè[”©™òˤÒñ´rV¯h°Y$—'(®ÉìMz¿TdaJ7ä"‹ Wñ†ÍíCDí‡ýB%„á^uP•†‰äê`3˜+»,?éÞæc8,ÿ @ÜÇÃÿ)?2@ª¾êgÂþ`kJ-%´¾h9öq²ZÏãæa}cêãv Ü’ÚVÜ>òª-4¿º×î\=íUûR˜`¾j謌¶˜2Û‰òœ;hd<äŠlÛÑVg;!%924«¸òwšì½DœØñw¿3‚ê |ÊÀ‚¢C±¡ç¢ÐþÝmöµ#&usw™Þ~qÉÁ¨gÑäßã‘‹65ß*þD±¨ù¯„5_¤Í×Ë-Š’7°Oî ™lçU¹[&JF «>z5É*< ½ûg÷ÐkŸö7ËÛão–,’zT)H|oDUUé à|ñnúâ†! endstream endobj 24 0 obj << /Type /Page /Contents 25 0 R /Resources 23 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 23 0 obj << /Font << /F60 10 0 R /F71 18 0 R /F49 7 0 R /F58 9 0 R /F70 17 0 R /F15 11 0 R /F65 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 1453 /Filter /FlateDecode >> stream xÚíXÝ“Û4ï_‘é É ÖéÃòG˜)Ѓa:}hs܃›ørW|gšä.ô¿gwµ’åD¾†7xP,YÒz÷·ßùzùìì\Ù™’¢–µš-¯fu!”)gE•‹J™Ùr=»˜ÿ²¨Ì¼¿_dÆèùª¹[¨ùg{·jaþŒý~šÎÜFƒ3¸WxèàÖ{˜^7|÷v‹Ëågçň e­(*5“îûðiG×–óþ ŸÅ¼ÃË·0ð¹g*cQl%TUy"/øC2>’i#E% ˜HQh–÷«Ef5ð”s< ŒK@ ÈÂe¡Mî-žžD¹»sÓ #¼fÆw¼ÆÛïßòóŽ÷~•V2ÊŸDy*`êTîí‹A€uç¦È%ë—WnÚñ½ï §1ª5ˈ7ýž>™åR:u£eì˹*xçLh¤2`wAiŸ†‘ݧ¸0ZÔy¸Bæ¹N‘ÖJÔºöç<ÄëI8já'¹$º[è’`»E[„gåvº"ª+ä¸ß:¤qgš%fWÙÀÓMd)de†#Ù”ë ç`Ï~d‚h|]›DOy“'÷l7›vKªK0ojQ×áæO#cs¦Í¦ûÞS˜!ߢ(êY¦Œ°vJÉÁ¼%±yÞx{ãI³BÖùfàÇ{¾þ°€@Òtí 3…%R_Jà²ÒŒ°½gév,øÇc¡IŠ”€± aãmÙ®ÝÕ]‹1ª Ëîˆ×X GÄv ¯•_1R Ê•óa2ˆ·îÕ{o7ÓÍ8ºS¢#ñ=ÎûÙb9ó”*Vžä”“O¦œ,¤œTàP"7fyO=0vNA{L½‹2’÷wÎ[ßÂô Œ—0ÞñöÖg5Þ²½|` +§Xæ2xúŠòy yûÆ’Ÿ1ÃI7¦õˆ9„öLkQÅé—Çnxäv´<0Íu0%Eµ¤HC`œªmeÊ–jn‡5R¼8å2ŤtDJ3©‚×v uŠÌɘ=Ñ”L³âuíi>z¦d^z<µàÈú¼¢!R} ãG.v8䳉½f3{5ÄùÿÍþ?höŠI•¼.Rö‰ÛÉ@N”¥¡ qeiÈø×­›wœ°p»s¯0½Ä•]Ô½=ªñƧ•·¯5SîÇ_d¼ Þm8ïáYhmRUkQ 9”­Î¿RÕgç 2…EB¡]·SV"/ J7FÔ¦”¶`ó™)sJ|íÁÍo©“á²ÑV1-ß Lý»KðrÌö04cn”„VS†Â¶'çÈ =ÿà Nv™V•CP2•»«´OÂ쇃”£OÓuâ…CIÀ3*DÖ^Uÿ,{+²hZ~AVJÓGŠã§CN8úœÍÿ%ãùw|†9¤úü’H“€ RA² Åc’(“Õ¨ï£Fzyú\ÒO4=rd’õ`¸Óóu?€lž¬P*ÿ Èúi4Ô4]Ôo¢’2"ΈObSA‹ªÍÑ_c“Ê Xt]æIËj&åA}§$þ7Uõ}‹â­ÚSÿ¸ê;¡Ç8xˆr!*‹ÖÞ¿¨‹ î¡ÁŸOG!’Á»ßuó`©Ø'sQ–¡ÃI¶ê5”ˆzˆ 6÷dˆÓôFÛÑ_. Ù:a[þÛø«z¬cé„?nR ~ íz/EŒmhñ]È l$¾SÔÂÖSxmQ5¥¦»ž3a3!ôÝhQSÿ¦)9W’eëÄùT©øØý'ÂÁ”oh`=/ öÑ¢R$œ|öjùìO$»' endstream endobj 27 0 obj << /Type /Page /Contents 28 0 R /Resources 26 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 26 0 obj << /Font << /F15 11 0 R /F65 12 0 R /F60 10 0 R /F71 18 0 R /F49 7 0 R /F58 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 1505 /Filter /FlateDecode >> stream xÚíXKo7¾çW=­€ˆá›Ü à¢I¢È!QƒNr$[Ne­+)v’_ß™!w¹\qc»HQè»| ‡9OòÇù£'/u=š)måd~>q5“ë5óBMæËÉie§3!¤©æSQ­WÓ÷ó_ž¼t¼?Ç8&¤›ð@ÿ èž²œµä}²³Ëí(wP¾LgÊ骹†¿¨VØ…C‡†ÆaÌTçP Mbl|Ÿ±Ð‚Iî[οÝœô—ðÙB¹x ŸËÕ-|÷%p‚[&¸jy4gÓ™•ÕG _Aùpˆ“„JVóZङ’šk&3ø+åÃÜù—¢…fRIÚ—´q_ªÙ… v¯i1jÞL¥ z`ø‡—8.â8vï‘I³+‡áÄ@[Þ-yÍ´Òq囊ն#ÝÄ×yÇ…ŽÝB¼FÊÕM<ŠæbÝaã´óÀ"àË×ÕêIšo’/J85gZÔ}Á]}ìoÿ4ª¬È$§áœDÉqf°'?‡¹RUZ@‘¡Nˆª?Aõ”“¾ŠÅ-’–AyÇ ‡ßPæ‘ô$¶aH”Db˜ (&j œF ïÃÂ/#—_ãÂ/Ú-¸v„ç5”ßþߣ»¤¨`ý2?½ùÔ+ð`Ÿ¶Z’™]ÃgCŽE:r80²ØP'Õ{¨€¢ÕÛè0¨/¹ >!=³¦ólI} `AÝœ-i»*XT@´KPƒÿ„ò‰`îÌ&Œ/Âïa° 4öÇê nŒ>àŠÛ–!Ìühß.¬mAÄ4 ?Zvé$6±ëZ¶l`ÂZ¦¸½ÃÀ)ú¸Á )5™–’86•kÂÛú(KäÛ,©º?=³¨$«hÚ‡XßÝ×ú‰l§å J@ˆ0ÃÁD”à_ Ä B9>ETO×¾/Ö&Î<çys´sä…„R2oí1‚C ¼;ªÓª«¸µehÞFžËidhK%†=&­¨¡>ƉJŶ OÛyßߊI¬d•ެì=X õ’Gõ0ßI!Åÿ ùTH^:[5‰5)tßGë±gsµ,«•˵±Ÿ9*¥bµ XÊ0¯lEò \ :x¦%/ûkg˜… 6¸kùMëP)/éYÆÛ‚xc.ôúaiÓIÜK—2Qk59W Ax"I †d–wåI?HVA–ëcâîxÓ!4åPâ®,œz—˜>.ñ«™7 ù²xsrÌpÑÒ-zt9;%˜Ð?² 2Œu‰©–LêÞJî°ÆÜ‚WË}QE$×ÌiŸßvžK&Šô&Æí±ìwà’™o´¥è‰Eøño¹v›ëëÕSq~6ü\ë¬ïkŽ]Öw¦2|X}_ßóª9ÄܳÖ×âP¼«@¶]ç&p±Çq9q†NBµSðÖeÀ!Å51c‡<ÒÎCBÚ”p:ϸ‘À™öã´œ£M&×Èjõƒ#êÙ5RÝñ…Æ:ë9]å¯bÇžÛËâ7¡ªÚÄÀ,½cÎ"3…gä 7iÊäUPôÝ.ÞÌU|^89¯êtÚ…Öà&ê¡<`ºÇ|mÀ¾3z ‘í2‘ÆãE¨‹«UèËnýGw(o]æ ÉHFîP¾í¢G7xéd+}w8L†¬8EÑ=z\µyúE¸÷Ðî¢>³(#¾Pä":¡ [ƒW¯šW·ëըʼnþAxs$Wƒ"žN`éîç˜+¯®SŽ­fl*Ë$“—È{†‚¾"Zsæ( ½mÉÌ A†·ºÝÞL„q¥þiwã ®ÞCEÑ#ÔL&m8vÓwšo?}ÎãTMzëm7a\ب×ç^ťʿÆ3á;x­;9.ñe˜q®Ût{ôbþè/Ie< endstream endobj 30 0 obj << /Type /Page /Contents 31 0 R /Resources 29 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 29 0 obj << /Font << /F49 7 0 R /F70 17 0 R /F58 9 0 R /F15 11 0 R /F60 10 0 R /F65 12 0 R /F71 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 32 0 obj [777.8] endobj 33 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 34 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 35 0 obj [408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 36 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4] endobj 37 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 38 0 obj [650 796.1 880.8 865.5 1160 865.5 865.5 708.9 356.1 620.6 356.1 591.1 355.6 355.6 591.1 532.2 532.2 591.1 532.2 400 532.2 591.1 355.6 355.6 532.2 296.7 944.4 650 591.1 591.1 532.2 501.7 486.9 385 620.5 532.2 767.8] endobj 39 0 obj [319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.5 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 40 0 obj [312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] endobj 41 0 obj [489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8] endobj 42 0 obj [688.4 700 738.4 663.4 638.4 756.7 726.9 376.9 513.4 751.9 613.4 876.9 726.9 750 663.4 750 713.4 550 700 726.9 726.9 976.9 726.9 726.9 600 300 500 300 500 300 300 500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 412.5 400 325] endobj 43 0 obj [354.1 354.1 458.6 719.8 249.6 301.9 249.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 249.6 249.6 249.6 719.8 432.5 432.5 719.8 693.3 654.3 667.6 706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6] endobj 44 0 obj << /Length1 1867 /Length2 13369 /Length3 0 /Length 14534 /Filter /FlateDecode >> stream xÚ·Pœi.Œ%xp‚Ó¸»;ÁÝ-x 4îî,¸»»[pÁÝàîAr™ÙÙÙýÿª{««º¿çøóžsÞ¯š‚DI•ᓉ­HÂÖÆ‰…‘™ */¢Å `ffcdffE  P;Yþ-G Ð98‚mmxÿa!ê:½ÉÄ€No†ò¶6g+ €…“—…‹—™ÀÊÌÌóoC[^€ÐlgÈØÚ€(DmíÜÀfæNoyþý 6¦°ððpÑÿéød rmò@'sõ[Fc @ÕÖ rrÿ¯ÔüæNNv¼LL®®®Œ@kGF[3Az€+ØÉ r9¸€LP(­AQcD ¨™ƒÿ¥Pµ5ur:€o+°1ÈÆñÍÅÙÆäxËP•–(Úlþe,÷/zÀ_‡`adùO¸¿¼ÿ¶ùÓhllkm´qÛ˜LÁV €¢„£“›=hcò‡!ÐÊÑöÍè[Þ þ,ø¤ ¾1ü‹Ÿ£±ØÎÉ‘ÑlõG¦?¼³¸‰¨­µ5ÈÆÉáúÄÀ ã·swgú«¹–6¶®6žÿF¦`Ó?h˜8Û1©Û€íAÒbÙ¼‰þ–™œÌÌÌ\œÜ=äflÎôG5w;ПJ–?Äo¼=ílí¦o4@Þ`SÐÛ‚§#Ðprpy{þSñß…`6vÌÀ6GƒLÿ…ßúïvè0¿ €ùÏžôÞ&ÌÄÖÆÊýoó?[Ì$¦*¯.+E÷åÿ(EDlÝž œVf ';€ëíÁû¿ãüçþÍþO©üWuÿˆ(mcj àù‰·Óû7—¿&ƒú¯µ¡üwÛ·y¨ÿ]ffã·/–ÿç%øÓåÿoöÿˆòÿÿ­HÂÙÊêO=õ¿ þ?z 5ØÊý/‹·yvvzÛ yÛ· ±ù_SMпZÄÖÊäuÒNÀ· ùdcfõŸc;J€Ý@&J`'có Ñ¿»ðÜ lR²uÿqáX˜™ÿG÷¶sÆ–o—Šã[¯þTÞVê¿SŠÛÛšü±{¬o}:8ÝÞZÿ†8ž,oKjrûs¶LŒ6¶No.€7rÞS[„?:ÊÉ`úô‡èOÄÅ`’þâf0©ýñp˜€#n“Ñ߈ÀdüÄþæ÷v)Xÿmý3&“@èÀdúÈñV„)Øåo=Çj[g‡8¼™˜ý¾%4ÿ|ãþä0Yü¾UnõøVºõßðmŸ˜lþß µý›Ø›íÛÿõ[evÿ€ouü£J–·:ÿfñ¹€þŽÎñfîø¶ü;¼Uêô·ú-·“¹èñVœ“«í?ÞzâüøVŸëßõ-€ûŸð¿FÆØÙÁáí:ýs©ßæéßøÏ»r#,ÍÛóYÔµ?Ô|Âweؘ¡ØÕL¡að\rèpþõ6‘¦:#`ÝáîSâPêê¶8õ­ð2ñ‹çqKì—Öxå¶'¯gƒX•©Ý6„ÅIìþ‰‚ãOõ}„ð jÂ{^/ö^þ–Ð-]29öÎÜ”ò0\{%ÝêûÊVFCæw•÷ª9eŸË¦¾ªGêúÏRäeÎá¾wb „£E¿pC™½½›AÏžøM,K‡à}ò•­ÐS{ƒ5êqÎc­BÕ±—W‡ú}tŠÒSä Iæã‚gIQäºÀBWXôàrPoÜœ¬.©ŽCP)ƒ@ºŸ\yw¶«qºƒ•†ñ„€’ЏÎ3˜¢DÒ4¾Šl¨Ä “ìûøBF¨§iB×ñ¨ûäL½‹Ö+.‡—åëþ¸5ÑÆVg¦çóã{¦rà”¤Ü»DSˆŸdË ŠØÓcª¹Þâ*CŽ_ äÔÌ(NàåQÞ¥NçËR¨ER”%fâþ…Kz7…Z*õi™«s^H´<+?ó£ÓIÒ+íÔn¨b¢„²ˆæÎ/–`U"’×>¨VÚÆü÷³c†ø‘ܼZ1­þWVêåx°ÍAÒy7B:®åPx[£Æð”Úû†Å¸S¥Ù?kM¤@EÉTØÍ´Ž{ÈÓ“þj&<³"À‚Ô€àe¨Q`,y’YKÛ³) ¬îA",ó!<×)PeB:íYî£Ù‰µëOÖ6²6›‡Mr¯ˆßSjè§r° ñz“žåZņ¿±÷1J&ºb4Uì¬x)=°Š™­6¸^YvKÔd!"ú+T›ZðE™‘ÅX‘Òqž”ö˜AíE{>Þ¢Ñ>þ<;MÆBÄ WUÞùÀZÔ–÷TAIUbS‰«kX§§È{ðak­¥‡Ó ׆و'ÄZ¯ýâ’þ˜i¹¤P÷39'ž¿ºx8Ys¤|®â 5òD£Øó¦\õVŽî-í¦ðƒUqåd"gQÐkòêûð.ŠwtÔ‰7i–~†u8bë¯LuƒP‰–ÔèCqQÑ–)¨vÕœ ïôE~üú‚³5W«+åïsôÃà®t$®á î Ø¢Ň“dAÆeÁñŠwÊý¼ëÞä†çvgzÕ¸ãx<š|P*ü¥2û€}ª0ÊðTyÊ:®´´$'íõ']B_/ŽDùâfÒúÚÎj”.“å#þšÈñD±¨Èzú6¹kS º„Ø“áÎŽ®È»ãì¡LR7æž{s2èòugáeï̓%Òù@„!éXqZxz€EמÞ^Ÿ ãw'·8¬Røó8Kñòª‹¼M¾02€d÷ënEca}‹ˆKe·±Å-lª¥IÝ1µ¾à#­Š5y=P¶ç†þ¸µ<g¶÷, B`b¸ÕDµ8÷á…LÕÆ èSÏ5Z3=ºŸw?#û¶!KÍ åõó[•öŸO4y¨ŠJ}3®•ûZ “™4êÔ×M¬ µª7©•3he6 =Üa§÷™fÆaéö7Õy«àú—TvN›!dol»/Uo šBëVÓtT}¶äÐ|5Ta´¶Oºè~2B„:# ²x„hÛ&[ö;ïysMRoñ–8FlÉ£¿è³ŽÛè˜[•M¨=Y#™¸•õü ¹Àt Þ¥ ’5\ÊÊíE]zÁÿí}hÆ7Þ[‡R/\Ð)8/UíWñýøéñ¼tÅÚ†g”%õ×ûÝœ'¬RÔ8(ÈŠÓ>äHûN\ˆpl}òkî[EA{ô›BÚß„÷~©`*‰€¯w& ÏOV\B5$æt?™[ÖÚ¦4U½Û@Íà†!~• s~Nû¾«Ÿ0LAOÙ¥˜‡Ê£íwû½µ? À†›†P,óhÝHo`) ö7ÿù˜:µÙîíâãOêCEÖ䈖—œ#¶wÌÛˆ#· 8j5žíÕðRç1ú_t:AV"[[ÈÉQ„Ïì‘ —Á€î_¡Ø-‚‚] ìb6åøI†4*f÷©õÓRœì(²[8M3ÜúZ(>—îS0ºÓGÕ*.Û×â¨ãí¸‹­0KPzæ½tTÒ6k9ü¥¿b•e:|»ErC5¯2w'Ù¶ÔQ¬âú"ø f>T‹¿Å\³=ò¿Š¢®BÒ4qT—~8×û5“Š*ï5ó.-ÖDæA÷s™Ê‡rIw?”oì&Ô¨ë ÑÛÍž¤ØVºá=ËÁ*n „ÔÈó‹Oç·}ß;Ú]k·[jÐ}Á•€nÿp ÉãkΑ¦,#n¿É–)-äùTùÒšŽ†ÈJôÅâ-t0‚]ÔFJÍ€Ãy)RŽÏÎËubÏBt,?Ÿ¯ }µþ gá®i&½R·Ýx‰×E•e» w+Wã ‘ 1ô}hS- ßTŸ‘©0G ÜVcŽ~iX­#"ñ¥ó'½Ŭµ:AFûFƒȯ–¼†ØÆÖm“M€zÛs­AÞ©“§ó=ò%8ÅT—ý5âk]®ò{‹–ë¸_Aõ±áïÍÚ¾›%¯Ûþ\E&¡ TÇÃìn7+,m[¥žÍ°Þ´,d×wÕæÓ66R;qt&CãÆ t…¢4Føƒ™øZ¾"5’î©TZ¯õTe§ÓTÝ•b¦‹Gé: j² }Ÿ™Š³M(œÄ€pßž[¢ ¿Ðí^6ó?Œœ²ˆÛÛ/%Ýp³ëÏO o¡tM‰e7Ÿy¸¶ š»'=+‡ŠÓÑ˵I –­–¢iÏÛì!Òq²v–ZÃs`äD!ͦxmŒdàCɵöÚGã% 8ì[pè÷ò@—)¨hÔË ìWr°6®blê(N6'j0>÷'::Íû&­À„~dïoŽØæ·'ÕtÑåËýTòðNï9?ÿQÝ-¾)Ϋ»»—f®çQˆº6¿U×(ðUþ’ð] D§Ú™ãÊBËâŠÁT{ïÓøœ ÄxDor¸Kœò—! ”ìW4<¨¸_U™œXYÆ~Ðd>1ˆÉá#Š{ï¡APÓa±_¨€Kª,iW /€½ DgdG}0)ÎáQ°{ƒk }Bc ¼èEaœÏ–Jœa;=þ‹i ÝÒ`…¬åWdeŽaÃÒe#Ïâ!—Fj4g(Õ(9¤_Cê]×\žê7½È?2²ÅÓ Ï8 ­ €B'ì Œú¶tà¿ò|øTþcC›ÿÑ…®lø}µœèN[â8] á 7T4fÁ£{£›èôR6e@—zI¢÷’®ô.^¨qæð¯á2føH™Ý›¼{+bB8x¥Ã€8Xêô+<´ïŒI'„_µT ™V~u”xÂòVqo`¡DGlõ.K ‹QÊŒz̽2UäĹ6Tw“ù¸Ô)F-ù ·åDD Ïœ, ¼áÅ{vQýtC¥TûÇH%RNµPk¾x­ºOœ;ûì*£™—[v¹°kÀÎä@b¢Ëj¶Žgr_–$øö°aDA>¡Í}~Ö_Œe8UX¢öN!ôFœ‹g¼ŽÕ—c ¦ƒð ]‹…Êñ|F3´¡Ù+ggç ¨c‚n|?? !û„f3åHL”ÓERˆX61pM"ag©¦±ž¿„Ð^ö‰' ØÚñu…εM0í¡Eµré” É¡ÎŸ¡Ú6Çÿ¦†tµ Wš+–P'(ÐŽz¹È}ÑN“•m²AIÆL@B€Ó7¢Kü3ÆÃUü÷õCEõÒ gk¹æÂWÄ enxäÓz~$ 7+Jüb„ù›JÔ3ó- ‰†¼uRVÝ=úß™ZauÉ+‰}Ú¾ðÏ\ÏK_— kíT…(šÁ^#N^:p÷ØFüø\òÓ\‡&mñ&Q›¦Ê\YÙ¢.w›0‰ùèÐT?š±ç²¼¬IRB0Ù)öP $.ñU¶;Åï!C&óBFâØ!a>öx»Ê§a¡1AxÂNTøå33•&o[hoG óGì!ܽz¸Ï[ÍÒü~!­¬\ÜÊæbLlv¯©[ÛN§žÁ-±@C%{Óøenï{Äoðâò£ÕÞŸß®I<ÃçØö\ô¢–fíHÊ¡¸«-s]ñ‹¯œo½vÛ‡iúˆ6ä=ZƽØm3šPüBÚcü]Ä·ŽÑýíùÎ¥þ8TŽ ýç FB‰§Õ„È´l ÈÉ[1-:é)!ΰÕ)ÇU+ʘQŽRñ#ËST+ÇÌ:u·›{žÂSצ`è̹¿`’ 7Åþf÷~G×7:t“›rn"::ŸËwwL$ÙÛY“ïWÐß§Mö©!'·´þ|d/Þ"ˆÕ¥"Wðê'»(Lîµ$¦Y™1sä¤Pÿ^2‘–YövÇÿ°÷eµÿ÷ t•Ì¡¼é49Ç/îKƒN³rQGVÑF.zÙÌl”¹,!¸ñ¶ñ šœ½ÄPöŸH¿>¬²Aöض–'µ|ûˆ%M¬eœ©t¿èö¼ ØÑ/ìcÁâ$œI ± T,ZbzÈú¶î/_õsʧ)y0Ö“ÃnáöÊ)òºøù]·J,…Æ¡W^-„+”¼,ï°}Ùó%^OB½iµ^~,ÊY§^Ûéùú¤rów oÇ|OakÊ·hÙeÍü@‘ÉÃ¥0~Aîá£ßó=JÐZÂ6Ͻ{ØqýwÜ8pæý±ú3£ÐØ<Äœö¨3ýæ†'àÆÝ‡[86ómÕ“õô}%¬ 4±á¾8·÷4Üp3'½pñóÉ=»1Êzü³¶½£¦“>ó¦éöß0ezË+ÄH´W:çdÅð‡¦¿ßQïòçiá Äà0fOJ¶ ³Ia‡@—ÊDßö@+q=Ä%’E«Ð5«o–ª©mBRgÑ7=‹ËꛬP4t“^½ªF0Êö•eSzqÙq“|Á]Lÿ•E¾¡6¥Û¹øje=ÍiϪ+⻑Ùº 1ÖuR@* d£éEÈA„Tà:áª'†™Ýdá*Ý—mð çÃYÃA3´¥p$ÂR¢¤Àþèþých™–f²¼ÆR·héØ#ñØH¦Y×A©)%ý îâüùõ¿.Sï‰ßJƒVV¥gœíÄÙMIƒ×Ÿ~9ÏóÖñ„wµm' V$Ô3K™Iç*O³bsíYz _ ïw”®Mi¨N\žÙÃ'Ê¿‹ËhøŽëðtYòA…ž8Ä|p€"ù :;ákpÓŸ> \ULM=¬ˆµàÒ,:"K¯ŸŽ{?›°0\?4Ð*¢!Ií»Þù¨³#]¬ù‰_¸ù`;] †óN¨ãÐ -’YmX²ô=ןYÁQŽãv bü0VŽøÚ9œ! ’sÞÌÀå‚Üžm¡xusž4Mƒ, ›Öå¸k:"„œòý.ºçý÷§qP#þq¿.\ñ§ìO)ß© ØäQ†0¼Öê¶×@¥v7µŽXúܲ,)Oî´fL ç½%Ë\Gª$~0¦ŽÅ`‚q‹l!<îàJ¥›–V?”´m0WbT÷Ý*ÚÜ&b‰Œñï*QW`Û{j@ò°x†ôdÐQ2¹zeK/Ãòú´GµAîÜýä§Á«ÅÃHŠÊBÿù6àj´eÎé[ù÷éf°ßWÝ ·ÊæÓcÅôØbr¨J!“Éf£|Ô¡DZ¨ÀÙ»1îCÊÁ}wÅÇŸnÒBŒ ó£n}«ÿÓÕ!·°»»²ê±ó0Úy„–Çk–õá›ÛÂMX–äk¥£sÄdœIDý’€Žh­–еU{`⨆¯¦‰ûÚ ‡ JLýÔåê1óñÔ¢jk›¹êšlËÎWšf¬w~D~ ¿Êð­š6/ðk^=!y¥= )ªv¯s³Huy)±UŸšC ò”ÞOŽPWÆLIyó°\7l>/ó¡´$…?ý’…O2‹êQˆµ9J†a‡¨ãF¥éV+ƒï3†èF_+IQQm™ã=¶dÏ¿Æ\U…Kò^âcãOZ9nä?J¨ªëCGDÛÚÝ 6ü6%åþŸ·widy©Gpש9O«¡M$_é´˜õMý‰8õ1ø.¸‹´Ìþƒ~­ÑüEMçúÒ <íö³/îë‰ÃýÉÒ¥W/ï7Tw 1"ŠßÕ=> ­J]%«Å¤>TŸ’s’³;ɵ7¢VËA6"´KŸ)HãˆÎgØ7eSÑèû+‘ýDãܬḨ²¬Mã)l‡Yú6Kyƒ÷À¯ÓÁ¥h»Î„uÈÖß×@ ~Ù©PÂ,|‘§¬3omêÜÙøJlÝ‚¦a;p†e7Ö®OîЋu]zñÞrÌpö¶›2 §€Ô›¥ó \ö5 QÿR¹ý'·1GƒÒ \j]ÖámíNmÆ™UI¡ûµ-|ÿ#^fdƒsS÷!2 Û†]Ò37š˜=}|'åÊ›<Òͦãû^§y&Œ‰²ïÍjH|ûgqOM(¢|X zbbµÎÌkP°ùHsÊÏ:~¯Ã…J¹´²¢êöq–9 Ûd˜Bû–-5ˆÈ4òð—§O’*D5šÒÈĤ*Ÿ¹.Š5_ÛV§!fŽæûkŽÃÎS·™é„ÇëçÔÖÔ„n>F¬œùÛdÊÝÜ}Z¸qíó¼[…8Îkp“ëÐ8¾(˜ðg’EUOnª—ËÏRsO"¥‰w)K¡ï¾Gubì1åÜÇ;™Ïý¡Ž9ú“­ W˜¯ßê냊#º­÷r½SâGÌ:ý‘ÔR´dÛ t[B†{êåÇËè«çMW‘Ž1*K`$Ö¼)¤ÖPX D"zÞ¦gWåôr0ºDÞ üp ³dfFwèæb~­"o³Ñ\kP`£.ÛjVQ–5w/¯¡›»†69~vìÓ{˜µp3‰Ù¦ýÕô€K#)eJÌÉR¢K’:[¿µtDRjvëË(X|+×»‚Ê0+âÁš|0‡·}tLDY¦•Y^üüIw/„´à`ëmØ‘ò4Ìžj}ró™•´º$¨,È cÖ>Ü@ݓ±î7*Â0³mô¼¹Ê»PâÓI.’Ö |?lаR¾q³Õ1ÇGêxËÚ™ÌgÊ×TÙ,±Û~ìe)²7búå¿:öË$Š ¶Ü…=Äñ Cls“sÔLªžàx>‹85«ªCq¯¶0µAä6„èùl}(ÎE+•VØ8°KÙH›6ŒÜ=£$›™º@y‹gJx™nÔm~ ›àÁK\•Kbˆ/ÙWíùY¼C©‚…Ü8,®ÎjíIâæ ÛÕ"æO ÕÁË/y„¡êú`3ŠÞ@[ÃYUµ*#dïᘩs,ú\Ýÿ`–SÔà`Â6`@ØmF¼ý­iQ6=I€äšô3Û¯ã„$Sˆ’o€U’Ÿ°êg{·íUª7‹’ãžÔ ?}îWmÉ_¼ýqn™‰[ø¯DÛEök/og¿x`æ¢DF¾–ùÑkL'îÀÔÕ³Œ!yç1”ý´Ü 6!é&v'' Û0Ñú*»!ËÃ|°ìjî—éÁkšÈí=À‹h tažTæ ³¤ñVätZ¦ð5x?€.±Â&û‰NÜ¿걤cµÖzÛ¹„…Ê›MTà@åwÖÜÅôñ7éãöuÛWnmj^eö*Þ¡‘ìëÚ£wî£Ih€šÐ$TG·z>ò  Œì8HYÎúAŠÅ”fXÒ¶oöAŽKRžúÚµcȱT&À§Põ)8·i‹¦ƒžÆ›¢¡“-4Þ¸€JS ;5Ô-;ü³zK±Ü¸³¯æÒw,E¿š{~mË¡ŽkiõÓ1'ë8™l}· *ižp6¤FÐu‰ëÛc›ÁKˆòGÌÔL( –{ˆïà?­)^_#¸à;ì½àQþsГ²é%ª.ØdwyMóƒ=ã¬5I ½~Ÿc*yÒüÒÍE4žÙ:t!šL½ýw,UFË|œA³tD\´¡ƒ¢”1ö€«Êh¼mÁ,r _rø&"@n²y©0ÈLñœ®Hž%ËÁ¾%@ 1rŽû3žy K Å=L;>MôQº¹õeg ü*¡÷¯5›^Y’FŒê+Aò¾ùÜá£Æ×[‘ý‘^Ò­c†ÐLŸ§Ë¶•Ëtñôu’²=€iİ‘”u©ïMr œgÔL—T\¶8WIp%ZßiØ ‹N—±ôkùðE—9•ƒžg›¯B$gW‘¯“¹­XÅ•DÊ7 zÒΦ÷ ÂÊ„Tüa8%vN’É$¹nœ*Ú²,a}v3ûrrõƤñé ÂúJ¯; »=ý†©´÷K>ͬ¾„wîè±6A§^‘Vžbš’k.›s Çg•~Ø_ûr{ÇæÐ‚Ãy˜˜©ddJ7Z ‹ÝýÛÅøµLX•ZŽxØo\狀±Mñ„|» ‚¼¶·VXSo]:2O)¨ùúá*¶¼í}ÙîZJuêUÁ7™'dÌ3q„Ä­…´Þæ±ïÓ²$IX—Q ‰¦ux»êu_~â9Ÿ`rãÜô/¦¸JêL)ÀXnùµ8Î’¯ÏÏÓXÜYĪh6­·Ý¾Âú…hÞó9V63UÌTa§{ÙižCåýû¢ö¯¸IBR7§‰`¼Šê‹‚ùã*Aò=Lê¾f†Ÿÿ€6Ñ1~Ø-XÎwVÝŸJùòxð”ÇP‚„ã„Üž«žêCua½9{@ÿ‘9ò5ijÚÿ‘ìÄ!´ÆCSòEê縆0„ëèÀþƒª"Oj];žÑ¤õ9ÂïeôüΜů­[ò¬'‚ My%¹~ð #6‰/:àï´ëE@ê=]˜³wªÂ ØQc«U•§G/A†m$±LÔþ¿”9Ølö×x^Uœ|_µ >{úXÂÔ1$¾æ¿k=ÜD˜´A›(r¾óÑàV2ó‹kŸí;Hkʽˆ3G›™Ì¬¢ð ÂŒúzä.:—\›dgXöþÃLÇœõÔ¸ûyeiÒ=‘ ÆÚäA,$í©3Š#Œ 0«ã™bôkØM ìÇè—÷§±Wº¢xLµâAˆ&!L”º~êF5)*HZÔ¸4è;75U°wwÁîÝ ³¹·ê¼;-jÔa„çøZóZUW†'Øø ‰ag‘ìg/n"âÉ: †í€äk |,¤ñ—Ù‚óÉ·y~à¿L¡‰H™ ZÓà\ÌÛb¬ h¾†N>î-úÌ\j8†íùµŽ/€°³ö_®öüÀÊ4O ®ì¾(Hè>\‘få.ð¥†ùºèhÛ$CkçÏõ#2ªY¶G—þ r€…}leÁóZ±{ÛkÑB·ü΄’¬Ì¹OñïáÜÍýÎr„-ŽB Ã÷žº!w,Pe‰U7~Üeª˜xØ+ãN//.hl1ÂÐÑ«R+­ø»6×r~iñÀÖ~"Á¶©Ûå[G þhÙ‚ vt¶æ^´ŸEc>CNc'-<ʼâT> ‰õм £§T&Z÷fìÏ«Úq¼¿Lýè ÷‚[ƒ`Fž¯nüsªÆ\©˜7mÝËú’ÍèÌG¹¿ƒ1-úGœ>\Ò‡§WŽ5ÏÁ±iR¢¯J¿î•Ôt…6S›w KÝÚ˜JdÆ_º#±ZÛMIêï8N¼ÇD§O05:7€„—ÂEz &Þæ©Te¿º+&7r`·F_ b»YûfHˆ&¦#¯bÝ·A«U(ž±©LÃÑäÑ5ù´_¤±ûy ¬÷"=‹uòëKôÖø\»]üUQ‘÷>_{œ,ßúžú%6ö¤Ý²åͰFîñEslQ„ªs&n~ãÆ8võš×B‰™Áõë`‹ƒM³"Xìê¾~ò³>úÙ€³ ¸/bš­/—ê°]–q?é[™«óÌ”R?ÛìýB5.‰qãx6Xøå› /o«ìJ~÷löèÊYú÷¯i+ ‘ÍžÞaiFçÞ(jÂ>¹¢>7Öº%>rÃï`™Ÿ’ýh§Üa+ˆcRÉ겯 Ћb¹jIo”ãÞ9>[Êê6ž:wœ2¸¼C^ÕñÄ»ªE!ƒ;œ/"S€ãZÀìgtÂrr‰?M!I'ª¹J¬x˜æê5]<(yê™´¥î0Dׯ[ëigíˆOÔ±@¥Ç~¼D¶ÑbNù²3ç6|D×"41ù#¤3l\ºÇÑDæ4ez¾¾Ò²,zÊ[Ù g ÊC2ežÂ°%Z-2ý;Ëc€ðÆÊKQÙŒº5CJÚ#ÂVÑ'cóüágGò{Ú[›0\K°Ã™sP(ƒ¾Ç[+]4¯Ãí,j€Ð6L9áFOàM4J÷gQªP~ð[C/£º5¥+Ƈç/C^zš…ïcô½ì]ï â?ãŒóÒ"ìÓ }f\d õ¿[kú*ó E—Ä׈qТcKÄ¢ËÛhMvòdT[r D,žTö4‚Ro¡-*Ëù~y)Îu´dª×Œ2`3]DPy&2xDÝ $S§Ì¼!&ÄT>nÐ<cŠ7åÇ\Ä%Z‘?{W7mJNꣶ°À’îER{ÊÇ×o•vʰÖsw§»pâü“ŸÇ׫¦ò̕Þîï\pªg³žbY6$¹½ˆkõ¤ né—PÓ@Òv´€fW›£V±— ¶Q¸3òÌK“ž1|U1Xñ#º2ç1“Âʬvé¢ÎöK¼œF½!rÃf­úGRq,ÂtùêÓ¥òºü^4XÍöÞØa8å¹°L7f ÿË Y<ì'¥{J¼°=ßÚ¥õ'ÞüwÊAËRÙ[sô!P¯iäa¿¾‘}炆ūl~íÂ>eËv2»Ë¾D°½WÍœfé*oZ.ûö£èˤ)À{Ô>´sÚ 4a:Û©®%`•Ý2ˆnáH[¡‘»@?ÙU°È¨˜…˜^* ÝWJ¿·Ÿ?¾8þ”aräÜ›ç«K¤œ¤ßä䚸kzñW?“ã‰û*‹çà9U²®ß+]C¥é“GÔ&ò½LÈ8| 8º~eoçêº[ûž ”´ýã7áïeK‘åÜv&mƒÓýy[­ d#ÄÝýB ïL¶âšpëÊG~JmË8:`Äœá ^Ù?Y’Q±kº0Úkgß-ùÐø^ê@ý†À7œÒñ™ rMZH¡¹Ïh쯦2uºù Ÿ½>÷{ŸD_ÏzJÜ+ÅgÇCÉúLP†›T²6x¢5d™‹P ç±àvå£S4ÂFÿrêñ%BŽÌc«)˜Í‹}jèŠæÀ–Ðjibñ¹ø"•¡ÊP]qMúaÚUß/ÜB}[cõQ7ŽZ»×g Y竎|H©©Ï«Á{]c¼,­úÐæ{Â<8ESÌ}jþ +}<º<”‘OYí œë÷(%ò¶bàQ¶õwù¥3jžuÁš…bTÝPå[`ʼ íu@EMåÎtHºÔ ’›“ÀÈ€::E—æZ\…; ÌֻΛŒõ6©Ô6Q‚Α‡\Õ¡ƒB ÏÑj¾¤:ñ®fò@žuÁ3î$8í–ãH›}pÎËX@—LãÂ3"2ÕqË“~ð³òÕ;呱n÷ÉŸù×4 •knZµb#°Õ sÀ#ø»v³–õ¢õlŒA±1kêMûj8‘h.ãÉìë¬JsËê*mÎgúZº‚i˜yÀ/SæËlìåf£rCXpU+>iXl¯2܆ë-ä&Ç#ì^m®Ñf£zsŠ®ü‹  ªÜÒ_Ü/~N¿ÉÂ>i¾>qÄÝ#½Ø¿Æ­+3h½{òíÐâü6ئ¶`“ÏñR™ˆ:ÄÌ«OÆ¡Þ<•Õ_Ã[èÆêJÞñ+­-_é ½6'Nc: ¾àʸ…äðÕºQ'ÒC)+ªr7ñ°v‘Ddå;ÅX(?²[ÕvÇZ޲¤v™)¢·—3¬ÚÀ—'!‹MŽçüò“Ï$,¢£6BdÆ…¿O;»Z¥YûZTÑ»Ýí7‘lµTJ¦ûj(é¡l¤`j/„ƒ¬¬N¤‚,É70s&ÎNítg÷ŠeéªVà3éàæqþ€ èN¬½÷LB§\3‘ªÿÞiŒ¼dò1EÙ?jdÞsʳQþœ»ÆWì­Æ{kà ø+¹Q¿²QÙ\”VàfÐqì=lÇŸ °çx´*Rl¥4Ûk‘ö ¹ Y7[~;¸”÷ó›¢áC¸iiìxÍéuÆH),R=á–‰R8¿Ps­amÛ’µ÷,ŽGU#1yšœâ¯X^)FÜPaÃVBn©¬z¨ºt–†Å/Û·Ç‚V~‡µçúÊÓàì Õ}-N%ä1ékX|€µâVÿ°ï9”õA0"¹M¥ÁL„¾¢Þÿ,­®½÷OßíÙ ml(ì•ó{®vdf´ÂàÛ7±`¾ Bô?>«êAu¶³!RQlóϘ?±Îçd—ß,”îÞù6)µyß1S1×é½CoTÄØ‘n¾¢O›ëºZCF¹VkNKŒl÷ u—äfëÅ„iKæ?,m¬Äc#©l6†ˆ©žk#…m ãZ-îà„X,ÑK6Þ:/p_ÛÙiå€|‡³%û°/s'fbPžDS”T㚥ǥf‰ýˆu»G»¯¡ïfl ó<-ÇpEºF¯TĤյìÔ^ÑÖ‘Ïø“êÈ¡±I3P.¤°ôÆ¿©ŠØïî±"ž³n3ÕF9ƒèŽ .B+rŠªyÊ0ÅÛž“’+Y:ž•¹ÊÊcµ&àá©\ã¬Ò)⦀‹0G¾ºèU•B£üJ%hˆ–䫯}M -f•|¬5GfŒ¦ï­¾J(†±N'‡s)á Ãïmš„³‘qÛǧ0âS¬ŠU|kKí"F¶¡IúÒ¢³åZHØñTbÖ·‡Ã”lBÅ ˜úÌ2ýŽl#–*ï.žwJ–5¼¢{'âY2⿵AË{´ŸÞ‚fˆ‹+פ0 “Ä'Üã\sUŠ·\Ç“^}•[™iÅÆëÁ?ýe†®„Øž•u]õS5²‡_ùF]2Ÿ²n„K²îyúJ¿ÎNŸ5¿æ¦t"F‚ÁZn=Ô·×òWòß/ìð§à ê©@­'#ÙI“Ý(pÄ·±š;R÷÷YÄ\yYÖ,æžÒr‘0+æ¹l¶Gdé¢+¸±.ý€Q¶Ö?B¬ëØý-¨ óÉwœâhõÞ;„+°¸?‰x»d¤çÞƒe)"¶¸ÆðÊa°m!✼=B§ÊÚ"•NÃô?ïYøv¨n(U«»›óQFî•‚‹¾¸K’÷ì‡<#§~Ö™^:1×õ—0õÕhS‰ñ¢ÆâÚÏ4KÏ%eOIÙ”.™C‘ú“Û¯œ üÃd7ñûšê#FêrSCõýw [I9®QaxÃä÷A Þ‰!Ч]îδ”,E·{2‰ÏÍ€Ll…W Íî}eƒß&홺¼?ÀÒâÚe¨b…«bOõ…ú¸“¡Î6ò Ø?{ÛÒi³ËÒÞû2X3,øµDõf[!)Ñ7 × Ô^ä! ”¼HnÚS‰ßÞÒÃW³Ï9sr™ŽÄ“v³8öš¹&ûZñ·D€ü!f-êí÷ÏßÙV2¦hññ؄ء[+ÏF\„¡ß¢g&æ·Ò* +Í §HŽŒËç¾øŽ²,õÒjЮãw_vFؼ]ôÀ}`êËÔÀMiÿ¿^Òó”X§IjJGçÅÝFÏL¥õïvÆÛšÁ¤X…°r¹˜ìd«UÒ«õįˆ? 1T“š¡¦Q˜5€{m‹Š8¥ç|zé[ù±ÊØJÆZO‰ª0Ñ»gwn­òz¢Íܘðˆ‚Ηð^„ñ„¢Ž‡4`ºÊЃ´‚…lVŽ-¯îóŽÂ…FŠž´¼¹‡#kÔ÷€I%pÍÜÕ¹ù­`bNÂý'~<ôK¨»A0•”G¬÷€0X,ßw‹}רe¹æÇ;yå¼ Ò£p½«Ò>!äx°d¾g·žùºw~ÒÌ'-êÅÒ§kÍE^PÜ}†æd÷žZµñÂD•ð/2r—¶>‹åþç}„Xç“S6yw¥“ù ¸xÝ‘ž{üâQ]a8ò1z…oÍ ¬¹H‹[eÖ˜¦³-âìÑ…B?ùt©Î3ó´B× ûÇ’û@gAäá5eb"Þ[eŒ`Û§ý…ºÙ;'‚©è“Wê¡É™Nëœå+ýßÖ]£ŽÛ°”ñ³ÔkúÖ^¢3ˆó 9:T¯DƒÇ°³Ú{ 1£œ§Áòî‘°´­¼˜ØxʼYEŒ8'@H3ÿÿôE  endstream endobj 45 0 obj << /Type /FontDescriptor /FontName /DSMUKH+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/A/I/T/a/b/c/comma/d/e/f/five/four/g/h/i/j/l/m/n/o/one/p/r/s/seven/six/t/three/two/u/w/y) /FontFile 44 0 R >> endobj 46 0 obj << /Length1 1881 /Length2 11449 /Length3 0 /Length 12618 /Filter /FlateDecode >> stream xÚ¶PØ- Aƒ»KãîîÁ]‚7Ð@c Cp ,‚%X×à@p î.‚kGfæÎ̽ÿW½WTA¯½×–uÎÞ§a ÑÒå±X!.<œÜ¢9uY#^77'77/ƒØÃ ô;ƒê†¸ˆþ‹!=žlò@'¢:Ä âéàáðŠò‰rsx¹¹EþC„@Eò@/° @ q¹£1ÈA\}¡`;{§:ÿù`¶fðˆˆ±ÿqAÁÖ@€:ÐÃäüTÑèÐ…XƒA¾ÿ•‚YÜÞÃÃU”‹ËÛÛ›èìÎ ÚI²°¼Áö;ê²ü– Ð:ƒþ’ƉÆÐ³»ÿéÐ…Øzx¡ À“Á l rq ñt±AOÕºÊjMWËŸdµ? 쀿ÀÃÉówº¿¢'»ü ´¶†8»]|Á.v[° ©¨ÆéáãÁºØü&Ü!Oñ@/ Ø hõDø£u @QF|Rø—>wk(ØÕÃÓìô[#×ï4OǬàb#qv¹x¸£ýîO Y?»/×_—ëèñvñÿ²»ØØþ–aãéÊ¥ïvó)ËÿÅy2¡ýc³y¸¹¹…E 7ÈÇÚžëw=_WÐNžßæ' þ®W€í“ PØôôÍßèx@=Aþÿvü7BãáØ€­=V ;° Ú?ÙŸÌ Û?ñÓýCÁ>î§ñãpÿþùû“ÙÓ„Ù@\œ|ÿ¡ÿqÅ\zºÆ:ÆZlIþÛ)+ ñøsð8xx<<|"!n@Àçùûþ£þ«üWwÜÿdTv±…Dþñtzÿâõ×d0ÿµ6,€ÿ® yšg€ùŸñ7åà¶~úÅóÿ¼„üÿÍþï,ÿ×ñÿߎ=œþð3ÿIøÿøÎ`'ß¿Oóìéñ´ê§ qù_ª!èÏ…–…8Ùü¯OÙø´!2.vN#Ø]ì²Ñ{XÛÿ9Dÿ¹…§äN`ÄüûÁpðpsÿïi笟÷§»úÃzZ©ÿ.©àb ±ù½{¼‚  ôEã~0^€?ÏÓ’Ú€|þ˜m§ Äã)ð$.` ¢ý¾QA—ÌoÓŸHÀ%÷7âp)ÿ„ùŸïo$òÄþƒ„\Vÿ —õ߈ÿ)îé‰pþ‡ý['—Í¿ € ô/È à²ý>M3—-Øë¿Ào7Äú¯€'ŠÝ¿àSAûÁ'…àAA—ÿàSçNÿ‚O­;ÿyžuù|jò°'îÓ‹ÿ/÷Sg®ÿ‚O}ü«Kž§>ÜÿQñ¼@ÿdx¢»?=ÿ=®¬øÓtýÿñ’ƒ@> k´¹iˆµX¸ÃçðÖë*roŽ­‰ï [†i,þsÐ6Ï[,”–ʬÐè¥LJÿœÅ æ éyê{ÿý¦Z”¨ædí–_¯î,’tÆ·ZÐfLjzG?íËÔ|¥|NÁ¡'½ýêÞí•Aˆ#B|‡ CŽ›§0–Vþµw’OÍ×’…¡Èé-ííJAUô»’ Ž8ý7¦!…“ ¹V¦Hh‘=8(QYñŽ}°'/.¿ãe>R«$±¡ÄñÁüWyão¦ü–ÊôxÝ;IéII(.ð†ÆýewSUˆgü‹ T"c l)ͧ$Û°nüÕ4sâ%ƒ£kƒ${!r%Øã‘ ÖÚë ²ý{NºÙí$x95B…÷<ùhîÚí;÷D~±å“YÐ0©^GC-Þ¨ôî·NTáÌRÈí»Q»©3‚³¤y½_E'˜jß>I'ÍòZåz˜tù}0ÛŸ ]ŸŒŽ*¹ ~49×{y(©7GÑOà±§ÉC¶<ühø­·ïÑQž¼8nü™ªÃPõŠJ‡Öc·ÆÇ}ë0©ysñíiŒg«3nz[žá³6%& ñø Q•.ÄAÕ_1t¼ºyU&ïö¿~µÂ“*S‡…„ª,?¥Fç1‘5FÙ^iQŠŽÔŽO¼Fß³©”µyûj\¹dìgÄ sï×êØ¥£ :yù#ž¥|†ÉùÑœCcg*œD‚3“”âiz¤êý´u’áPfÒ2Ð>©ëat™’ Æ]—öyýuliúÞ•'hwµô‰›Ýcë¦k†œr0fƒ Ó#ímŠœ¶/|¸XH“2R§N8î]Åê‘Z W%èíñ¾¶º¾EkÓV«¸ÃÝ–"ž”®ñ½—Zëß«4<¡Ó,jžöÅñS¡ßäGær›»´&cÍ H©‘:;'Ñ69ŠFüôY‡¨øÊv/7^À¼‰Ãü¶´EŸMõ£´PcM¯ s¾'´öi.!Ê÷"y_BÆœŠ'n,#8›! º0™QÿÍïW©-—ž¥3ú²,9Ft¦’ ß:žH³8WHÙ`*äiz+Çð±)SÇ ³.K¤ÉØ8“Òù•51$<ª:1¤?TÙÔ9R.2Ð%ýÝ­CŒËRnSÒ{[5ŒL(âì4bJkˆfÏc êüÒða|fy'6<‚|8óÓü6uÈû.Ûê0Ì;.˜µáû0ù´¾{Ò"aø°[^fSì¢ðæü<Äž¹‰ŽŒ;z×cüdš1ZÊÅ3‘š7: !ãÓ€â¬ÅD3¶}?P‰ŠIúÀs2dç:ŽvÖ•ÎUþú¹wòÆ•©]铆󪩮u•?óësõ<¯`ÇÓšû5<„Ie47!ÀLF!þOa;Hoö':¾¢°K4³ –([oó}å«$ívüŠn`tˆìÔB¸#゚¸Ìت m¸ÔèìÜì=Î-4I§ζ[N§;ÜËýRçÝ´€V¨%œ‰æ“lÖ|úv»ZÞ>¸ú`ƒ7£nù¼h5ŸÆVÄBRëGeªâ§âËrI¤Ùí4ü”ú4”-TþäVJa?Ð3}T6’C¤RG\R qIöæ¥ßàõ%+qñ–YEˆS•²9,ÂÙF'£ßó^·&:g€·oF>ðÀA«SŠοJ—þZ–^×2†wÞMD¦sÉkg½l&Ozw#Rà%a¯ÐiaÄÜ뛩q†Â,BV¸Cl#0-ž·lÄ_‚Ô"€O“pŒa$—‰\¥@¥r_ÚÞ€c:;if”K@ÒœJU[‘y7çÄÚ89D.ú’¢ŽC’µ_è2¥Q­ùWm߬ñÇ>¹Àš>§‹›‹²¼›tžOâ\!·;v‚>´¶Å€¸\,í¶c>@{ŠvœÓô¾RE]ý:¦õ3x_7¶µíÒÌ •Ú” ™}$äçÛ^W\б©ù¬0cJ-þ*Ûi6MW#‹×T“czqû¹eï´6ê“_üZ2øï¼í­:‚^ÜðÂCëL°aÎ~W):„×ô”ßïLrøýñ#z\ýt¸ oö°8ž·„-”‘¶ë’í“K@¶§L­Á;&n™ …¨œ¦å¸=)ôó®(ÚK¶ØeÆŸ{sвñ×Ð/Ã$'š>¥IÐU€¤UY Ÿµ*DWz Zôs¨´½ëC·¢ÉÊ?3¶I8.¶JMü›Ð#é£qXœ·ìº‘àŽPð¡II-xNf/y–ýwþ}?§èY'ܼШ± ›©3Ú5… é/A’/ޤøñÓÎ!"´ÈKù‰.“¶cÀ®½ ·¿ ¶µ¸Är…W@æ¶œlu‚5æ•»ÌÌû[Õ^¶óršò¸Âd]—›O_7éâ‚,pY#Í(?Ö™‚ioT†ÁYnƒiÎ*Õ€m[Îk_VÝx¬€Ëh°’ 7°žxÞùs¤—8ŽŸ±6¹¹ÚÔ·Æ·ŒKšV¡~O5ÍÖ « áÀŸwK*ÏïåB•¥ÄN`Hèz~î…µ‡žj–©ê³Á%í´BUÛ¿£#ü¼Úi9ÝŒ\öÕÄúŸž&~z•ãeÉBõ…S>’‚‚/wn;E•>…” ÷yz+€/èsFêÄ’{÷yâ–Õï:Ñɰ/z˜õÁCÖÕ(¥¼Ia !w¾ò¦êµ¸º"/fµãZ§>@mÏ• ÍïL¢Rè6æ¼M"^ŽÖ²î©nêÂÌ)j]šÒËÕÉŒ~± 3æ 1{mèÞ/¥ ›{pâ…ÌúŽvuô¢ž•ñ7j«ú³ÌI ÃEÊ·ÚH¶@È@?æ3]çRÈÀá li­·jV ¯Ê.é\‘h;Tã°Ô¨µŒWü¬° ²#­'®CYˆÕfUm5y±—*BÖWÌ“µú‰•µ Ç6hPö›SO Ò&ß7zŽND’ÍL«Ÿ_~ÇXåxÇrÓñ˳­Ó“À©Öæb“¿n¯Ñ¯ØZÍ=*™èZOÙD©Ìk„ì.bû”a´Æu¬:!k3f•øè§ší™­â$W¡z>ÜÐ;ÎÈp˜&gs]ö‡‡Ù…_¨iq&RÙò;®t(ÿ§ýÝ}"õÛ¢T¢)¸ÌEï oG ¦x³Ó ZãN­a*×oðñ33õÐJ©oZ‰Àð~ìµd&ò¯h£Ö„¸%±‹W|J0=xÒ¦ŒùÜ—Nºoæ’Ï&r¦™r82ƒ—ƒ¯Û½Õ5õ+åÝUҵɛko»ÂüQžÿ iÓ[no8ç­0 MªÐp_™ˆÿuŠÔÎ 6oÿætžb†}íL2{;Šì ²§ú~žöŇÑJ¬Iì@c)ïˆ,N‘þ°“J5sýQ e_æøi¹5–òRâÚ§SŽö$¼C¿"ƒCv‘V-ÏÏ?+ÞþŠjÃàeu6gÕ†ð¦Þ>[vÚE.¾ÀüžJ±_—©By\B]僎†à˜íU—T Ùz i—møGAî½/ö:Š"UÙzÓþ‰ÌyŒiÇô+‰A¢ƒçödW ê;(EÙ³ä ‰ŠÏˆ Âç_+­ójE–²Ô]ÝU¹êôÕ÷c_­‹d–½É\yeâòí}}ùyßò³ø}T‚ï«íkÓaÂ?èo;èhA¨cxSŽ”è”'¶Ë¶á¹© o²Ñ+ðŠCk1´¼ÉêD /Fé5ZÂçÅóî‹_Ó:!µ¹#Ü«CÉf(TÖ|˜R»£Ý¥9`µ%aˤח‰Nx†Á.Ň׹á#”z"HGÞñ¤9‹‘x½A÷ ÿ×=zJ¿'Œ8Ö*¯‘+yE©£f‘ðBëÊ´ØÔÒjmcŠþ*ÑÎ2,•ÈU@v%/ž Á—ÕÇù±?'TÁ™#P¼A"[¿¡£ H¯‰iI hð7)}pyì¶ ÷ËÜÒS$R#ÞpŒyZ#ã*[—^˜Udl*šu½¤'òÁ{õÞ;¾t÷6Ͼ Eâ0¸¬fš"€n¢¯¿›1ÇÍ£‰ny›?Iã/.úGälm(eOD•þ,Ú›ëTvûÕ¸-¼;×®ÔI¸Hûö­¹£“Üç#_ìæEŠj–1—zÃ)Å,M.8uœtßò ~‚ÉÀ3c·¶Ãâyj°r^D}A¶Ü ^&«OXÉW³_%;©,çÔàlxx~ãÌT¸I3ç­èƒïpIóš¿’C‚+.ZYìàÀMh§ ÏTô{sLl«ôŒ„&¹8É"¬£ˆbCPõ_³_Ù  «çñþ xî·+"º1T³æðà õºÈÔ:§Ã”|›ƒjìsÚ²aqÕR0¨ÖÝØ“î[Y’Vu>*€=®#Íåo»¯-wPj3Љúmæ2pvZ³GS‰ÀßrŸ=žxÑòÆV+ÒpÜ¡þÍœ‰= ë§ ׂ¡¿ýìpÿQ?WôxÆ!‡Ý€‰‡C•(?ôq÷Ș©ú͘µiâçEË5~™jþn2¦p:öô,±¢~º*jK¾æ{Þõ½¥¬ƒO쥠b™Ð S5F!¼ÕâFJEVÑ" d– Ygì†-{u­›?Ò¢†!µ³´E ìKØ#hL„5pf?3Äñ ­O{!ó,ÚyIíó Ö…¼¸L"Ú§y8«Ó8¿ïrÈ[×ä§,j#˜k·ZzÜúÔï‘«xê{º]³uqÂxäæ­mÂf£ò6Ï­­iMýhÃÙ…}ÅAÝEÁVýHG‰²R±¼ö%V¥ð—Œkâ¢üǪ81¢äf=ŸdiJ¾kH«Æí0ÍÈp^:vú‹k}ûò^j‹žË*oƒÁZ§6$rÍ¥•‘5lã4#W„€@8†zQÛÓBïà žz jÆŸ¬H O挅žÊ¯.nÂÙ§¹‹ëhÑEÑámˆuQŽËK¿Vè{_hÒ*Ìü ¢;>Ý—PLèï¥ÎÁ7¡ðá&€ÃݸGO¿0ö÷ë>_¦æ 'Á8ìcª7~^Û5ld°³Á l J´ÚØU5œ,Ý×Ïñ‹<…¿Ì‹Ðø™wÉ® ý?ßyæ$Y·S¾f½‘Ù‰ÄÆå$›3H€àqűƒÞ®”eHˆohÝMÃß‹ˆ&~#ôÅ€Ý&Þ”^¬ ÌƒBO§“@]¸Kþ ¨qL-Ûý¥´|-?úu˜¼?°ØÔA¬Þ†c3Í4<¬ª€‘Êäš¼…üNu¹h!‡K Ï3mƒ…u7pTPÀZä§í(7ùÑ_€$,Ä0Ûœ¾ìÈÅ«\ïÍT^è`%>$›‚wùªOìåzzE‡S§¢ÿl ;áeÖ6L Ÿ‰]2ÌiŸ"ߨÍMºÊ’(š„@.¶ê';– éü«S}ÒÝÏ&¼}Åþ×C[Ûþç51OÃíô¡Õ¤“ù"mQ¡l#"1‹±V•†“Ûc¥ –ˆc{|15y&”‚ï4î’¡î½e$ž…þª³ã:·ñxÙ›„—®e@ôÕàX«àrî ÿ‹›*ؤ#ô$P9N!æ|>y’áU]iÅþÅ$ç$4díÎË醴U(…qC'Ó-5ß ¨%LFH.!ЈÍb;­]‡NiSÆ ÇÃ,F~Ù³½–æù4wð:kˆç Ò‚ß¹Õ&qUhZù~)ôåøaÁg˜ªìz†³qR;T¸ÓodúFŒöïg5ÛwÎnW' Gx«ÍçI®á±ü”*ï`œ‰‘Òû{_Û6 ÝGÚ9É_œv–—d²‚J;h÷ßöeS¨î¾ÙýL¬#¸ˆo2R€«Î:ŒˆØâµXìf;9iã Þ#ƒ!Eá!oÅkÉø&ÓÖ5ˆ–µ‘ͽGH–Âb»ý3Ê߈æ9J°£÷ÈO2(d‹ª”_ÁRв§æ3+mU‹ÁŽ>0@ÂO¿.çºFúw¾Û¹š@çCG4|XPôåEõ¾{ê|ôüqáVY '¢ÙC—qž8M=¡=Ë ûU¦­É §ÅH¾…“•(¿^¬¯\䣰—÷…-©ì»6ãQ¦g‚¸´ÃÊÉÙÎÝ&2…/ÂpJS&8øX¶µ…¾ÒÁBF&98±ð({6x†L‚-*2E¿”.T¸ŽÐéå(ãij×r07‚ÕUkÐeŒE/sHÛ»0“’ CŠÚ¹Ë¢±ºoˆ’´ìuQˆF¶ç½šî3ôóÁ5ðÂ¥$óGµ‚fæW‡º[Ë’Ã<±#X3tÄ»VN×ëiD9öGÒ¯QËEÎÕé=§F®!R£(ÁiærÝÎD¶0×¢=¢u |„Š”Ø7Ž~Û¦\Ïwi›`@W _ôI[÷ôjÐh[ ¹ÜЧšX„~)o~ðŽŒÖ7éR·Ù9Ü×nOX¶­F«ó]Z¢Äb4ÛUoËdmLº¸[7Wÿ2áûKɦéB¢Pæ3•ê²ëj{Ɔ‹k•Z ¡<Û+÷C%ÁŠÏ¾<(V¥(FüHªJ°Ït=?…Æwø¦8 D88Iü´.˜#2©*gsxäÈ)kÔ„bœð òªSðƒ‹Pã‚1±|o+Ÿ³Ö}¢0š»ð/†\Î)_:zÉß+¬¶òxÈ{™¡ñŪO³™ ^ÍŽ^ÙüÚNS«¤¼ª¦×X@zËëÊaŠR2YÉYƒøÚ̪ *Ö¶&}^½Þì—HÞ¼§¹™U×äŒÓ:¶Ï—íÆÌ¦IÉ‹^tþ&<}æœe?ÓŒàW´;fj¬@"<6‹š•SH†º¹‰acððÛˆnà&Q;"5r~O×ö‚1J¿÷Ó­ltE:ó»z]/í”Ó¯æ2Î%»À-†Š#³Ê&3ˆoÓGõ‰˜†"®vÝfÎj9Œ÷eµ‡p°©[þ"·àÁ3xŒ.óÈ÷ÊQh+vn5wC¿MÃ>ŠØèé[Á°–t÷¢µ#ä(b–e”+%\ðaX¤’Kòœ«5ý»æ '(ÒÜN–˜Ý«9ÏÚB»OTu?½˜^*?ÂJm’‘h/˜S´ýæ±0x倜c=°y¼¹YB Clò<½c”o«V“îb ¾írOæP…öµxBÏ\ È%¬C:9ç.™†vñ¡ÛŽîšæ­°ÂÛr×Çæ—7½@;ÒO:0¡ L§lŒ¤º—úX»¸«œ:9ûyx“íÇœÍ ñžâÂ×i¶öõŒTJóðËÚ¨}F–5b€8ÕÇã}12+¡}!ØX”ž ªZ“ų>ÌD+t„ #º‡ÐBÐI$ #L‚Fá!m!™”j\½5p|«\¸þ¥›r”ofÔº^âkâ¼`–éa±Ë ¬j…Û]w¾Dl8®Z÷cU—Õ +Êå€;1ß½:Léƒ÷êùÁz\<Úû¥O»~Ã6nЀõ¨â~ûëv|çîá²™‰K·¹lª~‚HDU;F1º×¹¤¿n¶Âái¡ë±c&±['c$×°«Où¬hïùåþ…dÃÑ Û"•ƒlû…%Iîå½VØ«¨Ð%¡6¬6ÿY½¯%.–:óŸ~Ö¾“:T¸û•ÔJ`øÅ¢Fêõu9Á†TÀBÚàòˆøv¸ë-àmšìFPÿêOf2Ž„Ka¡¢É Ðeö+ÖÌi!ûR2™¯å!C/Ñæ×åìÖkâ¡¶R,™ì;°šž€»á›bnuç+øIŸéL’ð¥bL´ËÞ«KÙc©Be’‹Ño ×Zº\ˆë'&qˆÕÞn‘“ñ¤FøTC•×0[ kcqúþçÏ]â«5—ÉÚ|š¯X™1AºÛZ#Œ°ñºô‡cíiö2ËŠŒ™ï"»ÄâFºÃw˜{òÇWöpЉîÇ5 Å^±ÁªYÀ·ã"³?š8¿“v‡cìëS…g\¨’Ýs§<œíiŽî$ÖoÕzshÑà³NÖ(—¹ßò>¢Æê&_qq†F ðݵP™9jªãÕ3KdQ|¾ºÆp6L­5z»?@ÆòÞ¿»ë\"ËâlbDÙGŽfSH¿3WTŒ ÖÖü0£4<æYéĚ܈ÎÁ4wü{ÙaZªÀ¡7OÊÉ8¦‚Ws5†{'Có‘Áô¾pbÐH`t£õX>«LψÆfÇéñì’ú»?³|ЂãG©Pä¡ycaÜô¦âÂhTÖ'7ľ»ì¢×/8T|ea‚#©õ|Ž_qïÀÓt÷‹ª!.Ù×Âs}Ëâ¾,9Á×VF! Ÿhí¦T'…¡™oô9¾NBSÅŒ<ç1;¹Æ½$)‰+žúgVjõŸŸm ðróº{ÄœVε)Ñ |zŸ9%vî Šf¨ùóoö¯•ã’bD,¼áÆ@B#3 Iºþî”ÌöUn!Oº€^Êæ»öÌKƒ²äøì´Õ@Ýv6s®˜ˆ}õ뇊€e`@Ü‚½àŒ3þçCÊñùÈgR…—™?‚!õv?ôÛ_É"Ê–p(ºPQÔt(Î|u ¤Ý¯lgÚ¸VÓÈOKž¤âÎçìÜ¥%Œ® _?ÄM“t¼.ˆ§Î'õ,km3÷{b Éí›ßݾ=Éh솼&3ñSÆ’é$<©ð;É9p¢E`Ëíb©pi·(sþ¤@¿ë¹/rlÔ{\ÒEÛ”VH ɽ:A-fõb53Äû9GõÃk9Ö#]Çÿmé²e¨/b!;Uò¾ÔãˆézÍœ:”‚ü°Œ¾bŽüéŸDy+ïÌ=7²6Þr™ä;09VÌ ÍG•s”å?ò,"àdÊÏ*&v;U‡¯9Õ#ëL«(ZQÉ“#Í6•É÷éÉ\Nv£ÆÃ0ß=gËtf] –ø °“cÇkª´ªGúQ~ž:¯3÷õɳ}{Þ$é|ÒþAö6*ZR‚aü/£üËp}LïuÉû’½JglNNSy3R§>_ÛU"ïËØCávPG˜R3Ž4ôsËj‚Zû&[ª¡)Vpï³=Üú7Ó[=ÜýtbL…'ìò©h’\JD•óËî%V,‹~Öy5µÞ{8¦§®Rm޹¥%OjUOM}ªðQXȦ˻SH ªfàE+~Ž©déÙáË cÏk…íuŸ=Ïà nëwb,·)ëïʤ-?¤öUᮺ— 0̳bè] ØGÔ»rK«÷¼Ö>¹ß.£×ï¡Ä]¯)'æGÊ]¤ë¹{è¾ãŸVÁ£ç†1§{Ð=7#˲œ˜S`_V‰-Z”…ý4"äºjò9ùÕ3ª—/«ÐÉ_ͫѾ¼÷Òõk=¸˜à¦ÿDÉ‹;Pv[Îù˜ò‹ÉkiçsŠ5ÆÇ+ûË_™–¨¹ ?Oú$œÙF>#{ef }Ðm½Ðt˜PCé ›! PŠ;ˆ€¸sPÞû¶l<ˆn7V?/@ãdD„ûÐü‹|í, ªl‚qÖñ=ubôWü½+•¯ÚÔ' õFâlã­ëUi­röÙ’oÅWEi²õÍ“‡Ê@4ÿú ì<ª*ѵA95‘™Í¯ïU˜«8‚ŸWä{¼3Ǭ­ =Œ^(Çx‰wÖÖ<¦ÞùÖÑÁvÄå«›'žvSCð)¶ùQª»273†=µn·¸"çIp®\|µS+6]áa1ùöî1îÅ CnK8´ÊK<#C[¼ldÅçÝ–[Æç^i‰D»¡Z(_Õ>W¥»æI` ìkëë%›6ë QìM,Üpæ¸~|@>%@Gæ]¢!¨m{úáã½:vKÙí3wBZö·ßÈQ…ÚÁÃo»²Zþzp("Vv‡o ÀÍô‘Ôo³$†åÎO‡°Ë)¸ä/Z^î(EÜj,ÿàƒSO8÷û$˜Jåë|.ŸïLÉ~¦`dénñ&0P|á £bo÷æ{™ì óÊiÇ*9¶s8ÜW:©_2 œhCv8š89Ãl‚òlZ(þU8Žè¢•;ª¬NJ§«1- 8v­\óvx¾‰w­/:·æÃ_ÁÒ((Ú´˜‰©H׬†ûá K$“ð:„n¨lÜ—ÐŒXÎ âºõ¤§³ûåD0ü‘.÷šzß[,r8¥êÎæÕn¿oL‰8(ý²ú×b»fé_#2u¢üÂsŸó V½·t.0&ÊÞÚvÕKµv…»¡Eµ­}fdï!£©–[qwHðC`y æa§ì/ÁŽÔs"{´Â‰BV›%éÛ’ɬ\Ù#t T3v¸©«KÉ6ݘ{áEÂÖ†)hÞ1©ÛnYg¾1ÄøÌ²_§D/wÐ'.=1>\Š‘Èî•éèëj·°Ô7J-S.Ã÷–ºÁQ—î$0<l°•YìÁäËäÖ]?œQ|gÈ"°*äLBRçùÛeÞ€‘îTMêW: ¿!1â§3ga¹?f–V ­½ÞÔAL‰d¨µ12ÉðÌõJóV4´| ,Šñ!ñÝEØ¡G† Z©ñœq úúS,BÞÑW¡f£Ï¾˜ó+¶ÚªBúÈŸÅr[Ž=;Ÿ¶9´oxŒ/¼1¤žÖ«d*íË\âí„ Š©ÍË„!ÈÚ#Üí±ç» ÝZàøZBr»ÇÈjÐÖW=›ÍúÇâog]LñÂÚŠ§ht?[õì¡o”.;£4ŠE ô÷<' B«™ùïá>o2^«Î—*Ë¢bŸ¬h+; ô¨©àÑ|édË_*×ñE_ñ²€Cíy©Š×Gò…¬;|¾9ç‘dÍ"Q1–QÌg p# Ôsœ‚[fÁ ü¤®§±ŽõÝ…ÖævòÀ\õÒ^¢8-J=Ý“t´«!Wô&H›K`ƒFºØ¤–Ãfi? Á0n‘^¬™Àiq§ÃG³µœË”/‚òò÷æò“—I•#qhñíó„·¶nGYØeÑW>æ»?õÖL¤=÷lYV¹÷ðOxøÐ0¦¯2 u…¶gM(›³f?VãÀ°ÅéÎúÜrUô?ò€¾¦ðàÝEr®ûJÎc¿ÐÏXõGûºy¶öß×3› ÷Æ@q…7˜JÚc„ߦÓE­X´Dzf°ëPï{,ƒD`bWáp„¦ïã. swà F/Æøš°ÐŒ“t=Ó7¤Ì_¯Ç餼 ¤"dÈXKmzB ÅȘ˜LòjàÕÞ5Â%Žß/^yñò¹‘*ðt_„¡[ðï/‰¿\~ž| „[0ÌpUó¬¡Nù&*‘÷…þGçÖÞÁSŒCnS¹¦`¿Ñs²6}Ñ…f5É# àÿ$§ÏA-)!_7ìÃFšxŃý£fí¦Zw0=/•;¨å:â-µ\m+޳guEòÈWLÒþØšÓO7–`…rN\}R‘°¨Fqþ:ã’µW6]ÖLxâçQ„úüvÍ·Á…7ó7\û<ΛÛ¸B,;ÅÎԘ!;¸d^öûæý'R–³õo}W›«¥äåõ?Ô'¿xhCÌtÒaxo¢[m¾^gÑJOîœLS¢Ñù'Biö¬ø¦?€Ý/ýÝ3uäÄrÜQc†QäÈ üìžêUù!¯tX+ËÌ×ö¿.›Æè‹ªåñ‚—óiÙ[› îÐ1šàHe›‡?æ X’Ècf bð%†‘ !¸‹=($+38#馒f0ÙÚ£Ï õt¦™½+ç ¥1ïåÔ+¯9~i½BÎ÷uáɦÂêô ’£ä€MÂjȶZD†Ou"ñ(è,ã“ÓbeéN5xÖ7¡bAQÌ•$û’× >€¹™¬t­Âã2W%h‡]¥0#ûšÈƒƒ€s‡LGlo³a— Á³¹ÊBÁ›ìŽÄ÷1d¦‰k¦Ûb-ì+ɸku¿a(ov„ÆhÕ«kœhÑW€®qY–ßÁñ£^–T 1}÷›«*øÁ2¡ŽtúzÛÞÇ&’ÁÛ99L.ñÚ g¦ŠÂÆð–£.o$üÅ»”øRå´½†j‚@ n'yÕ Î9“´ öt_{˜q¦&f}˜yÝz’¯5ÏmÂÒ8'™°<ùͦ‚u0É륆¹<îpƒeLtßâè÷þ·ÁL&KR¨ÚÊ h6Ná\„ÛÓàçnóé€A³Iõ×”òˆ(Tc¸ï’ç^4dâÛ*Ñ8³‘Y¢ß;¦å;ZÌø¨W¼crâ.o\ëÿtÚçSw ™^›úæÿE¿Ì”1<µÌmJz4õ²Ø¿™FA%†UwcØï¢45À8púZ:xþНòÅ.ÛÙ;Ñ9©;jp^g¹–¸+¥/> endobj 48 0 obj << /Length1 1560 /Length2 8133 /Length3 0 /Length 9150 /Filter /FlateDecode >> stream xÚwuT”Ý.Ý! ‚0Ò *9¤t#H 0€30 "Ý‚´H(ÒÝÝ!ÝÝ”‚äE¿þÝûÇ]³ÖÌûìýì½Ï>çÙg½ÃòP]‹[ÊnÃaHn> ¯@æ™´¾¶"/€——ÈË Âcaц"í!ÿxðXt!'(&ö/Ž b†¼³Éš!ï¨Ïà0€’³=€À'$Æ',ÆË ñòŠþE„#IJf.PKÀ3 @ ƒ8á±ÈÀÜPkä]¥¿lì>QQa®ßá©—Ô xf†´¼¼«hafЂ[@!H÷ÿ¤`“°A"Äxx\]]f/€p„õv.€+iЄ8A.KÀ¯¶ªf/!7ÄchÛ@þpiÁ­®fàÎ`µ€Àœî‚œa–à®>@KQ æýAVùƒÀøs{|@¾¿Óýý+ö;ØÌÂþÒÁ æ…Y¬ ö€XˆtCrÌ`–¿ˆföNð»x33¨½™ùá÷âÍ`) €Ù]vèd€: €NPû_]òüJs·Ñr0KøË—Ò ï×úd¡ˆÅÝλóü}Äv0¸+Ìól…YZýjÅÒÙGut†(Êþɺ3áýc³† ‚¼¼¼ÂÂ|ˆ#âfaÃ󫈶»ä·ó·ù®oO¸Àꮈ7Ô r÷ƒçédæ ÎoÏ;þ‹ðøø–P $Àb …áý“ýÎ ±úß©uñÞ‰Àûëó÷“ñÎ,á0{÷迚G ¬¨¥bÀùwÓ»¥¥ánOn(€$È à „ÞÿÍô÷üÕÿo«ºôÏõý+£"Ì ý£»ýû«—?õÁöçø°þ[A~§k€íŸ1xÎ+Èkq÷Å÷ÿ= ¿Cþ_3ð+ËÿÇüïšÀÎöö¿lQþ/†ÙK¨½ûŸœ;e;#ï¦äünV`ÿKÕƒü1ÜÒp{Ëÿõ)"ÍîfE f}§wn> ¯Àv¨ê±T‡"-lþÐÓ_ÇqWÁ ƒ¨Ã ¿n »(^ÞÿñÝ …ÝÝ-ãtwh¿]» ûo]9˜Üò×(‚…f„™;Þî À“ïnf-!n¿eàÂàÈ»À]‡Þ+8ï×ÑŠðß)ë—é$àÑý‰xôÿF|wåü ÞEZÿ x ÿÀ;òÀþ<ˆÁ;²Ó¿à]Yä¿ (€Çõ7üO«ÎÄÝ­ð[•wûðþ}A n ¼é ¸…x€mi@ýy±­+÷úWaçqØ)ŽÞš˦†ŸŒÄÏþOáSRÍcá?—HwA9·Uvú”¼v&‹^ïÂÅ(§Ëë1­ÌW¹¼†H_ì:©8ƒ6”›š Mùa–֔ߪ5»]O%GÙ©¸ÖÇS¶å%UžØ|Ãf­Ü } Ǧá'@ hJi(”.‘kTdv:–üºû¼ýó]GHp¥s& ºüŽvg‡ÐAù4eçIÒV«Ð}eÓ!À(ËZ«õe4›ßi}€/›¹S¿z|òVòÔe—;åñÔ;¥~ùŠ ïAHQ5s2>ÕMq„b%œLH½2£I™LPçhHxUBçTQX>´}›ŽÅr5à£6½¦@› ‹¤¾ñ5o»ÒùÈ"OjÄx츳Ä1u¦ÕsÝ[²*Ýê±u6·2m—Õá•wÂIËì_dÓ ïẲۗ0ÿÿ ŒäÊóCƒ'™-s "3#¡`(ÝA¸ÆRIg¼QK=ËYΉ!IoÒÏY¹%.m­<‚Ç@éŠ:¬£úV¹ú <ññÙÐhxó{T¥³o…„@†)÷…ë|²ï†Á¯p[pÄÖǺ’GuS™NŸ¥½¿¥Fp»2”Hþ\—Ö*Ú$ÛòZšÂ§Å#¬S3}ð¾ˆôBÇ7ú,³Û®!ÎvËw/œl"âóë µÐBèâ9?³ac…—³h7jݦ™ÐˆSNõìýã•ÏÜZZb¡NqÌ-·ÍQž·–Ð Ýä¢oö£’ÏžÐ:½B’é¯^ð\ +¬ØÆìófV½â%´ó†dÆã èÑ3#|úµÉ½0ÅPQ_òêÊì‚›ðSô æÓ¦Ú0ºŠŸó*-qsu“N ¿¦n_¶]Ý;)õˆ´$Ý •ÃlKvN ©ø&9‰›Rv$¹‹ëGbÈãçNáî¾FG¡¢nz¹F’"õyvT«EÖ5½™=˜é}›‡ô°»0QÇ>ïfÒI ¥¸ò»¸“ùätˆx-áP-Œ…:sŸR7¢üb>aßUŠ'úS<¥R^êN÷“y\ÚWk g¶qNBdód­5Í£zl¡Dâeê @ȸ©1ÞS)§#xÈÈ~x¡œYÂ|Ng.RZí¾ôúýtÎ$¹R®/p_‰»`HôAË5°+™Ÿv_‚RRĉqX›4v=E3—=R{ˆVºV!¾%."ik‹™VÅÌ9ê;€ |Ó¹*/‹°i xº[·L³Sbä@As˜ÑÒ½Ø)ž³}TÝ”P¦]õÙÙu|râVŸØ¯É”Læ¾6çÎÃCp?+õâK°±ÿ4z]“äèºÆƒ§T|ªEm7-¯à%— îi‡K~þÄ$ëƒÀR26±ò,²dÑâ›BjT0ÊáiQ‹på œ&‹ q,]˜¸}^bOå¼sÁ÷D†¼ºý°ïkÌè}äó‰js¼Y¬Yh}ç`( œM¸+®)Y9`»ÊòÔzbLÒ“dh*ñ„ê )³îT=8±K®*jd˜¥‡nduáÐÉ:‘ÿ>é"0Èórq%7Ð¥î`Y²øú[JÒ2Â(­ýfMƒCMƒ„‰MV'†Øk–|¿(Ì»ºžÆšÛg‰ <âRº2ûŒ¢yS8¶µÑÍîæùø€Ã7%ÈÃ!—Ù-+ Ï¤G‡ãÛ½²V(Ãø*ÊR!õˆbžùÓþ1=:JáLfi6F5 ñ°,ù•€Ûç{<_2˜GÙÎDžEû¶”ÇrX3,iH2VmÚ'È0 Õ Ã%îðw`‰èµ—äŠí (­ü)›nA x4‚ˬÆjÃn_ѱsæèKc´õÈø2©Ø30&.)Áë0m>,{»­ü ŒUVÞ¡Ðs#%ñ£­É´ N·7ÆâqáÄñ\Tø_Pèb¤ÆIýÀÕ¹i‰µiQæÐéŸO<ñDñyTumAKªo¹¡¶23ÖiDâ®/Y(Y¯A6ÃÝOvéc¹°—ÌjT£+ú!¿ *­âåBì4ð^W¢d¤6&Uw«ÁvFTüSÐ{ý§‡ú{ƒífª™{d?I¦ù­9\¨Ñ3•S;Óy_:o«¦›½x×ùf?ìš`$%žº£–î³³]Y§ òÆqøY&/‘¡µîè*»|^À#¶cªè-7-lIÐ†ßøH‘Û;—Ðk¯¦ýÑr;竨WŽÍmÁ?pÛuÕvÉ¡_7ã$“£|šFd³hпu(”|²•¢!­Z> ËíeC„{”+°]숚Ydäk7Dõî{ qvD/Š#Q¤v¡pëöÈ ªK®—_}<Í@>íi*IÊA;'ä›ÃÞW–ž=`õi.Àޝû¼”µN^µÖUlèf\"Gc¯Â´œ°iŠ G9?¸˜Ø{Xßõlêaî'Öóû€´jˆd•†Ð“÷3ÑqíÆhbu5vÄH1¤—*»1fû ™æ½*‹y`ϺªT… _œ5ÂÀzºä™„º¹ â¼1eög cüq&éü£`ÜO¹Q€Ês¹‡XÚ'Œ«‰‰>+¤VîŸówï11ɂ͵XV­Í0w' çK}f(6âD3Å“¥ïÕÿ{¯‰#¸…[ܺ6¾â„Ç )úà%¨C]\ëÕŠË%ppgΪËùÌ•× Gžï¢A½ýÜö¾´Mߨ-HûzNrˆ¾n1’†–LqK„F§ú€¼D2B ù@ü¹›“†A-N÷Ú6dûÇô_äfxÛ ƒçXwƒS‡ÔKóºo…QÓ+eA(_ Êq¡ïçcÚ×»Í#ÞÌ‚ÛD¯{ú‹Æå}™;•±gZRr™ºö \¡ Êœ"i…‹Ì¸3 ?@ªG9®ÙJ³Þ½ãšÕ*¥I¥¨VsM±«FZÙáž›èçm½ö&صÑ=p挭* ÖÖÁýD–k¼óÇF?@9O4ì|¶=JROÇÖDa)ü³Ý3‚ #çÙ hŸ&!™PkxÒR’JÒŒL>T:“qüHÇlËÍÂøL^¯ÁÊL­ÄäPF#ŠMÊ·Ñloq""˜]ü“’.‰‹.·Ëâl¹¥}*c§ ÷DOëÞÃVc@i=p$‘Þúªn.À²F7”nåÝ›6aa|ž¦?1«Z¾¿–Ï£ØÍÔq¥¤&~ÁÚ¯GaK"ž{šI ÉX;èÊ“®TXgLþ²Ã6û‡ZN&€ kJÐÑiwiÔk÷sèÜcuÄ»ddÖQ§Knx™Œõ¨J˜:(gêrvT¢ºdÒë¡£ÎI¾£!*.j6™²ê[±Üg·Å¶t|íè¦i” Lóè÷“í¥#„ªÛ.t™‡³OÙ{”YW¾d£ñàˆå·c©ò-¨`;­žD…õ~wÍ;Èl»b½dzâ}ø8‹ÓJAkÛº¹œ÷‹ºÚu» }³¼Ý é¡ê[mß8jj²ˆ«BÓ8b4ž·,"¸§¦q“IÑÂ&ž«€Üõ5·ÿéÚ ÓS53®Fç—`!Iˆ—†ÈCx©‚È^·Ø¸™|t-dq‡½üs‰X Ž@Ñ8ú[¬­ãé’硬¼gç1!<Þ°¯GÞI)…¾Ÿç€qa×ÜCo]¸ã}U»ÐeGåmM(† =ÿÐuÌÖxûT ísÛÄÒ,r*Ž¿f3C•ûYrÖÈþêHPñ`fÍGQ†¹¯®\_Ü¡5¬øÁ1’¢RØízú<·4dгz™´mæ+2}<°ÓiÎ6±ÍÄ è®»ä<YÑ%€qBË µìªÒý9Ú:Œ7æƒ85\qÅ-˜÷¢cu\ëׯۚšF‡wí[vèŒ65À¨lÕ_¶½n’#z/D÷ö3Ž~Ü[õ‡Mïá‹f$áÏI×iÌÌðÑÈ(žöÏ.Ç6°[G/ƒ©‚{NŠä—_ÏOXÒE”:‹×œ'd}Œ„=R>Í>ŒŽu|Ÿf¸Rüà´Ü#¤w![Σ#LÓ~]¾¡d¯æÅ³>“·\Ç™yš—cqV¹iÄö†ÈOI–Ëuå_FÝ^œÀ‘ÜÊåë\µóèâ·äBi›9æ ¶OQý/éIU*²+—æ7*¿µ¥X©…9Qp¶dƤQE4v÷ª5¤ú^I'îJŸòUC¡à¤Y÷õ3ÉÅ&Í8r¯²H©Èb£"!« šCr²¢:)IÎ[ü= ©ŒwÍ »¦£3XJíl •Ÿ ÙÄK`ÝsªŸB¨råþp85e³`é;¼ô¦\âž}.°°H‚ÒʬQ…ÈZˆÔæp=ZÂLvc Ô¦=¼ ôâp=Zãå¥zÊ[ª5«xïòyÒ‡h•ÂÑ 7go\P,KŸù:É¿»û}ˆùnƒ•ˆ¼vq=vDiþÈ Ó{퇅n\ÈÚöÒ€šxU܇§ êg‰VÞǻƼ.lªÄnæ #¤ÙõI†qz‚¥½\0ºíܲ¼ÈlF¡ôÔ`äÇ÷Q+ßcEå‚VŽtY´l¥=쬄¨r®‰.- ž¤“U£ßª{Uï®OóI½–ajÏ|#ãi|0êGÅVM¡^¢ ùȦý@ÇŒ ™xH ÍŽÃt î‚}+zÿTåvnm†Ÿ„Ûxê$žÃøÓ›àæïÝdR’ÇëJ±4:‡£ÊR뉃õ”½_<@ëÏN?;ƒS ébêcCÉO-}8Ú±‡üU²{i…BCN¿¤z¡‹_Qôjñ;ßoêþd´¹ÿ}¥ÆqмÈnŸ—¡3ãœÝ¾âB`˜“ycž¶òš"5˜ØÍOpø‡ð)ÑV‚·+Næû›V?ûK¡wòNgbâÙu¸ùf|±Ÿ²J -$^½‡kø+³ùm¶×ómÊ õõ¥Jå>wý9’.)¢‡†¾iBÌ1“¨£QúŒM Ügñe wT/•;Ï>õU y¿Òj®ô% x5(¥÷• b¾ìJ~Ý%Y,ÔœT2Kh«Ê¼üV¶P°4=‰jëmì¸DÑã½Þœf”vMr/òa;ÿ³Gœ_k:óvåŽ]ÚI@»Â$ÁLùš3Ó ~v…AËŸàD`j= Ê3AìQÂÀïÑ¥>IãR³4à§ß ¿†Jy±ÖzÕÔí3z†n¦øÏt¸m‘´±!M%*È)½pu%=1 Ußn1‹4ù8ʲÚ^JrR‘©Ñi.˜6 ¹áX±aú¾Q ¤=ïô³a&F›‡MÉH lÐ)=r¨Á¬-ª2iѾºh®•øéSÞª«ä,u•ù ðŠ¼™ÆŠ ;s{B¢‰ÁK…t®ÅÏzéµÇd*ôÄ®púQê÷ùRn®@Q1‹y’ñ·+ñÞ´Ø\æ­ðoéžÒ‹¤T§µ–ĵå!ü¹·âk׉VÒÚ*³«’ÑÔŽîɼ¯‹c‰lòeÓ åJvç0ðT²¢¡:ŒÖ·/8eóâwo|£¿&kòÂÕ‰„oQU½ó“ÏfD;Ïà™ÂcT€]CYX>¼ãgètÕR1¬þ’Zk€3?ï8éoÌô}»¾Ó•®xŽÑÖØÛi´è¯W¹öýÌ__ƒ9¤"^%g2M_Ja{_UÙiÇDeïÿ蓸!ºQgìfÔƒŸœs¿†Lk^ùvõ&Ñ÷$)F¯èô—C¯ca+¡ÃB+÷^^4íêÔ^N®|n',Î…'Ü_ ÃÆ[Šžg«ýÚõ|™“èª)²^íñ™¢õ)[Àð©ö‡ðî ¶/~­-Öf£œóà`³2[¾4ô݈E»tfÈŒš‚ýVßzÚ®’g‡‚T£(iâJWHÓvÑœ/oÉÃø¤$(>^cP)†´~›Ù½ä×z´xçšE«ê5Å5%ÏåÚ¸€Á§£ÔºO°¶•È‹ð{_}ô`ÒùŒ^E׃n²¼X]ê@¸ôø=ªöò|ÜQðVÙ¨ÓVp¹P2F6^€»D'©Ž«­x‘ì½@\÷²Ö“4 ÕZ…¹+äíµ\¬ÎÄXñ'ízÕþGŸKÖ㫜 ë`¥ˆ"Sza“N¾ÄQËc=²‡•øæ(~ù±äó~4"ž'9>“Á¶ÉÞÏ=ÂóêRu8¿ÊGÊ¢­\Ê ;Åq²÷çÙ<0«ŽMÓ¨Sö•[Ê,'Ð Ü×ÊvèôLoX¤SW~¢ýÈâÞÜö…4Þ°LC§vÖ½é`4\*™þäº}oSwÚµÛ0ºtZÔM¹wlå2`±¼ñã I'Ûµ'§öˆÀ9å´ç4ezá™=‰1dÝŽâ´<ø«Bç3Ø(áÎEó‡þ’[͹yÛ·r‡¥W G¬måÌÒ×.<ªfœ:‡>ÉëØµ’—KnxÛ›-\¤ABˆu¶8j­¬¦lÞOÜ"$´Þ2{ _)l±ÉÑZºýiLª`™Âêô4ãÏ9ü;yùtË!Žo½ˆY*Â4V¬-kG2ë?ãÀ|w¼ÙUë}×d“¸éŸçÜÒ›²]D‚9T[ËT¿Ÿ× ÇmSŠ…¹Shʼ˜"*–\–_üÀ#çLØ“lá×)0Å-M¸k7mCŸ’CL_S(›)À•YůvïÍ3Ãõç 㽫'4‚¥é¬ZðwÙŽç±ë*ÁÍ_Öó–·ìg&Þ‰ÜÇbU›¯Œúƒü"µ4Û–nàÔ)HÚ‰……¡/³x¤Sý ²˜ª«1ËF÷cýäóI”Ó,çn·Ôx|Bm[gI†ÿ–’L–9x> ÎV³Îâ/°LPY$H¡¾»¢ë “,ñgï÷_æž7eaÜ$ýlx˜—ûB8‚å'!ÛûM“2Ô¦ /]Åé/¯R\Äé|%ÃË qÂkNÂŒ“€är¨ï5'8µø¸ÃhÜÈÇq.ü´¨ŠuN}¯Û<:‡üä\¶+E¨Dëã"‡œ{ÃÏ­§x0*-mnV¡µ‹Ç{lç£ÕM MGiWâ|¼â{‰Ã哽´ ™¯yïn¤Â²ó16/¹*˜·¼|†~Ïg¾¶«xÄÈQÝGÊÒ50iªVT ‰tÜäóЕh9`åÄ ‰pßݸv-„²ˆ·<À€¯&EÖ2°|5‰†A àô¾/]ÿËLõ ›PZøàéÉ’îÏëE¡ê0‰¸fµX‚$|ó/-àÖ» OÙù"ík>OÓ›ú”ÓPz&ô•EÔ už¤Û×í)ä)ÊRÞªŸqÜEi(†âË1}®¢®] *WoEc»¤]°ïü ªÐ<ÚÇ ÿ.Xùª¾„ Ókã*ÑÊ0~½êàWWߟSK«˜ <µ–Ž´/#×XÑì-,ÐÉj¨l]ö¾-o¼ü4Šo¸s¤?ð.¹ÅV™”E> nÓ£óÎÕ&ôº“Yö”‡ÿ`*Ph{Þf#oá^áÁ”QhƒˆÄÖÒùªVV(c4«©L1ªhîiÓ%ñHY³a¤…x@ï‚8Š>2%êÁi¶Î¤·€Î5ÃiÇèÔXàqy^Ôœ›"h}¤û´AÛ¨Â&u£íÛx7FM¢ZL ™ÁõA\O÷ÜÚ¡´ØÁ‘Çž$ƺ—² l%òypé úxYo›2ªL£«éb¯ðÎú9ªN&Ll{À ªS sžÜ÷ §*2[,(_ýèœý¹FLÄFÀìfŠ<>±Æç’çj;J3sÎø5lñÓÍ«A<Ýêb ]dؘ‹íXMsG"ß„sŸDÊ(¼Èoß&¾ðÔ^†ýØÛâÖŽ«¿§ \pJY_äÀ<Ÿ£ÃçÜë/~ ;:Vt|uK¯Ù:ý%Ì,áçšÐËïXΘæcÓYrN›Ãtgi•X˜bdc½—Ú“ÏÞ¾¸˜N¡EÅ~ ‚A_®ûœ1:LVc½ðJò<$£j÷pš(XÿáùÊÊ™wgñùýðˆÔcU¾M|ÆTlÏ©¸Þ¥ªV-û„Ö¸¤ ë-ýÒÉò“Q§éæµ'de„!{QúäS–²2¸ÀÁN ‡þ3WBqüÌ7Õç÷¨’Q©ülM„‘S·?ʧ·¶Ìèǯv+Öˆ€Ö¸•i”&K'¾ÓBÛ%¿ª’Ye×%=•B®# „OÈiNO~â?õYˆžXÞàƒ묳GŠ„Þgã’úiüf~À_‹oÚÎxݸ!¬âA†zAñV0Øç{çä%°ˆÅ~穌ÏzBŒÚ÷zÔ6eÊf“!Áåt;Z4Ùžô²êì~\b½(~,¤õ`'Í< }Có¾´c R ˜ÓR'M…-În±ÃRñr§Ï‰Åg(ómˆ0ST “H1{5¢Ó6BËæ«¯·_‚ô¡2¥LýÙöÕ56ø„Sÿ)zPy`²¦œ’Öd z™Wñýe¢Ê£¨$Ú46»KQÏ7$ŸGƒÉf³ãš‰Ä ©Äc{F:Ò±q×Cày=þ0N}I6—ª·ú œk w›ÜLÌÂày(òTÚàA‘ؘõŠ`µ$®P•.qò¾„ÛìLeɼ  Ào-“éÙ.2žõ³“ÏõÛ nŽ{pÕÛ&™(ýä [âÖ‹ÆW }qEî”M qNZ¤óêÚü«g~xݽŸQ|ìï ž¿®zÀÖ•+G‰ÞsGÀ¯ Aèïi€|U¶ÌÝÊùTÑ¡éf¤ö\'C§¶Ò›^[|ˆ,èŒòzæYGôù¦9ñÛýX“Ö|2–­Ÿ›8ü×L¤ÊÌå~§vk¶®õšz¯‰žÅ"³÷HƒÞ|T2¡7¶}Ùºhä˦“‰)TÐwú”¸ïG—QÒþH-ì&œÕ C¥O£•KæÄˆï¤_`A“rº½Ä;|0”üoú‚™Ø÷õ QÆu54šÇdóø‡ÚyY–ggWß-⹚t1›éü4˜ê[ ¶£(nŒÑ3ŠBBÔ5W‚ÛøCmþ{?P´/¾}ÔŸåÙÕ_¤$fžsŸ];ê^´Ønð¬ËÚÔ|û±ÑPS(y,ÌBÙ&¡ ʶ¢ô‘ÍåmhlYäCÂÛQÇxEùøoˆ±q:ê×?3¦¥_x7;&Ѝw’ó ô>®êÁŸ8 ÙÙÆÌëdy6ýÄÛácÞ&2GDsƵt‘|’.1µÈ¹ U´§4œÆ9Ö•C|“n“G•`5cív$»«D ÜÿAãÂL ÓØ­þxê軯’KŽaµJ/!Rª³*ò5ÿ­«rÑÿÎçÅ" endstream endobj 49 0 obj << /Type /FontDescriptor /FontName /SFISLY+CMBXTI10 /Flags 4 /FontBBox [-29 -250 1274 754] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle -14 /StemV 107 /XHeight 444 /CharSet (/S/V/X/e/g/i/n/r/s/t/w) /FontFile 48 0 R >> endobj 50 0 obj << /Length1 1418 /Length2 5940 /Length3 0 /Length 6901 /Filter /FlateDecode >> stream xÚwT“ÛÒ6Ò„ RD¤8tšôÞ«@‘š„¡$!‰t¤7¥÷&]¥w¦TQŠ(H•"EAéEà‹åÜ{Ïýÿµ¾oe­dï™gfö³ç™w½áæ¼m"¤l†!4Ð(¼X$TÕ×׃€ ˜0$ àæ† ñ®ˆ¿ín3‡D£dþ¡ŠE@ñ›Oê£Q@{®@°,)¾%EA é¿h¬ P ê´ê uÐ(À­ŠÆxc‘ŽNxB¿—@^8,-}KðW8PÙ E¡( >ï„p#T„C]&h8÷þG ^9'<##"âéé) uà £±Ž |‚@O$Þ hŒÀ!°{àOÊ@¨â5a7â„Äýv˜ ðžP,H0¸"áŽreÀ Õ&Úz@C õ¬÷ üs9@°0ø_éþDÿL„Dý †Âáh7 åD9® ¡†ž0Þ /„¢ì¡®84!êEºBaÀ¯£CÊF@(á~88‰Áã„qHןE~¦!\³:Ê^íæ†@áq€ŸçSCbp½{‹üi® í‰òý{ç€DÙ;ü¤a#bŠBºßCh«ýÁL€Ûx Hê–˜”áDxÁD~€xc¿œàŸf_ t Ð@ø#„€/êâ±÷þ¾ÿéøçí‘p<†pD¢ÿÎN0#~ï ýÇ"½€– ‚üÀ@ÐÏÏ¿VÖ…Ù£Q®Þÿ†ÿj±ˆ±žÄØ\àå9UTÐ^@_!1Q ¨‰KoþÿÌó¯ø›ý/ëm(òÏéþ#£6Ê üYâ' ÂõýÍÄã4xÿÌ ðŸ% ÐA#€¼ÿÖ¿H'|ÿÏSð+äÿ'þŸYþWýÿ÷‰4þòóþü?~¨ÒÕû‚ è{xÂpè£ #‚úo¨9â÷Dë#ì‘÷ÜþÛ«‡†DåHºX\$þÛŽÄi ½ö·‘x¸Óo1ýÝ B W$ qCþ|ð¢@ ÿòfîBx¸à=ûí‚⃈ÿÕÞŸ{aÔþyumÿs&E%$P,ê H‚°“ú‚ Ãkðú¥y ˆ0 '„ œýh,àg£%A@ן VÀ?2Ãïa±„Ò¿$A(û÷þ×è#^8`r — q® i=¬RfñZ–#ÛJ;¼#*4\hCïQµ]H0ÉΚÒ}ª1Ù Ö°qî0Pq?Ì™}¿ã»TËQç-¾/Ä¡±êÈ‹›8ß¿0žè{Àzc‚º‰è±yŠ »L ¶‡è6[4M'¥¢½c 7µß_5]=yèK5né„¶´wV•fé1°J›}ùdŒo†õC–%vÿÊýäö(x1Æ*2Õ ã†®\û Á³’f¾o š¶›íEtŽÇƒåo\axZuÙ~V5ñ‹•fÓùW~ä–xldÐùÂ4¯*mØ÷<›ãK9¬1ØvZÚÞ°æäMê¼åd—äþâsÄF‹™¦WIÃæ¬DÙÌ ç iìSH<À™u¥#µ^ΖbsÑ Õõžï™ÿqO7UÛòMo¯ ~‚üYÙÒÿzî¶X‡0â–¿ªRh—Ô²øÖý‚ó{¹\³§÷yCÇÍE-¥ÒœZ! ÅÓÒ!-whÅÄ.{ Ó*L¯ˆÔî»Xd±ïë#~–¿ÓÞ®Â3å^Š¥‹ñ™¯öË(||¼yUO¯ŽQõñt[Ø÷«ôZ°ÖësCù—û´ºI|Oû0-äÈy²ÞË(Üy£üãbwÄ{qœ=Q©AÞ³ãÝ †×½èV"1€GiPÌñ†ÏéqЀ©ó!{zûš¬Ùh‡£d_~±Â¤àùw…–TÃ@q7eÐЩ±XÃD3?}¿o»@>CË4íB(òÞòý¤%C%j'¡«y^~@oÔ¼–ð(¦Uy~·97šo¬šeüë¥ÖRù aé'Ÿ³6vÅY˜w²ä¯pX¶ÛrœÃÎѶ׾©°šÎ÷>¼Ø°m~ƒã+ñRCvæËyèöú®Î0ž/$©{Ë^t»Ù3Æàyù˜–žšÿÞ7ŠÙñ=ÉWZ¿ÖUƒïV;–^!ïÃÚ›³tžBýìÚbK`÷ù^xZoÁ-y@ÎIßjîÝò>t\Msb2i Íç!»ïO‡9]w˜°BO&l=,®â>fk;«(ãù6ÛX„Re-?±_J|²9R¸Qzˆïa_z¦J˜ÉÃ9œØ›G\òmb` ß|›) Tƒ¡â¶*ä‹ëWÉè¦Oz‡Á[#S´c¨¿˜×׈`ÐYj'YÏ"IÚ½ÞkÕ[rXCÔ÷_8g÷GˆœP--1¬3Òhf\¥–|îL'`jvs3³µ8ͦƒì8eíÅó EÔ“2‚‹Çô7áºø§'d|Þ\»x'¦’Îç² ðz¡ÑØœgÔ½&¹ ŽÕ>nÖ¥á UD¼}w/±îÐÜ ÷ÍY÷ÇÃ1.—&×ýYnÛ]7.kštéE¡îà¼åë.P½ÁûÌÓGi7·Á¾oƒ®2Ó£ò"¾Ëјò…AÚ†ZÈÃ>}Í+÷ÔÝà‰èì ÜÉ–^(ž?>جŸSP º:µTÉûÐÞ4öÌ[„³g"š·"Û”‘-«l¬/¼O¾6]ñÉ Ç¯LÝÉn¹q+pÛ2ïpìßI·2’ÄW&EjbI\Åí¦Dt‰I\ß;Hz¹Ïç±Qzj<ý«hi‰Ôòs„%»$Vþ°¨öF{½mp®ØLõ*¨1iK#±ò®çC]WlÉ1[} ÓÀÄ~D.ÀÑÏâ ͳdð™rH«¤K}ï Í?céÀ$O¬OÇ 6ÆÇÝúýIM¢ûÓŠC^²+¡»œ1Lì9:]->V¬Ñ~\=›‘Ä~Á}#LÏ_DaXÂ…î 㼑g¾áÙ-‰7Yd’ß æ›Ú2èÝVŒ¯ï¸n Z±b¢¿ÿ¹õîò”BòÚÞ7Ë—–¿‹ñ¿w¾iÞ•­¶.µ͵=æ·ÃÙ¨570ÕtƼ6¥—(k{`o”¢£ÍÕÐ’ÒeÑÏû‘ÁÍØ}õêAŽ%cB€Ã ‰´`Ê3ÉÚO×mÁÇcž@ªçOXMÉÁƒ)¨v&”Ç{æ¼]y,ê]h~ƒžÇA²eG·ùe•²“é™›Ò(?ÃI„^:î£z3q‘¹¡£ÐTÊÄ‹ê*­5Ì ã¨9û +ŸÂÓ—4"£cì!êÎfd¾ÙàÈðP0¤:ÙLïtTÂÛ\×Ï'ptg1õ›ßTþb¡³ŠýZ¨™|…ϤØT'dB' uŲ¦½þì˜Ý©GÞ… 6½¤ofþ4s_øóU !üjzÚZUy¨Oö»ïñ!EDá9I<¸Þµ{Æî9,c%Š(·…H{ƒa„Í–/ûnúθ-‚FýŠ þr‘)\âËkÕ¥èè š>/=µ×ÊiQ ÷O{ ŠÙÞSõ¢¿f9ôz­ˆªñ¦<BåÕLMd}DNÇ>}3ò$w¹k²56øÓ±0v–¢Š„}GÝò‰IÙiã—½+«Á¥A>m)˰dÔëó£\E*O©ôˆE¢â>Ë4©0ì'fßój²äŒƒïI‚¬qvA€„Ýd¿Œ–DÞjñܹÞµo*5§B´.­Ï›szS\ŠvOžë²W¸EÏ(ÍÚ*ÿµò¾ónËX'… —1‚Òm\Í’¤<¶30ø­â[$ùéDåS)7eŸÉ½ÏY¤öí²7–ÒÉGJÛ1s­û©×š˜T5‹¯&¼Í­zØ=ç' Ô½¸)IÓ©Àê%^KuýâÖÀ{º@maø|€Ò‰è^¼”NR&÷¸’¥}ýÍ©ßKaßTxU¸ë!èaAo ÃÔ}UŠ4Í׬M¬“w›Î0\@žï4Ðê:.õ§ Z±nD|s×g ÅÈÊðsÆËÈLW.·— ç©jºL ôÚgÛa¡çþ.z#JŸ¿–½¼<¨)ßmóÌéÃ:ŸKef3’R 6¨„³¹~è¥y.FA½Áhx–q7zÓ¹rQƒ2Ýúö² t+˜ÙøcÕ1Î!©® ðƒ•[ ÜŒ®X¹O>´2GøB}=¶-¨Zá¾ÓÅvzçê†vAfïx)¶ÍêcÃ˯Î?#Ðv -XûëÅ/oÆ+*³Þ©_#¯~2ÑlN¶ ßq!ÏîWÎã á´Ö_bzOKMIC¿?gT>òÎ0¹ÚuæÍ[oyÖÝR õ˜ &®³ƒð¯³ A“(Ì£6åoÄN%XUh[„™ÎëÄ3—èÖæ!Mu§qžUÅkÁ¡À‚«ó,vÉÙ‹JÒÑœih+%½D($ÕÚOõ…Ú§£ò/fþ¦²aBê#ÌË¡‰èçا™‰¥ÊÆŽm¢Ií Ͼèz¹‹uÍ¿²Å—°•g®Å½õ1Ï*’_QWªlIÞµ™ÇÖÉäò²i)”!V§nÍÔŽËV|è{ÿ8ÄßÍKuÝŒžu²Ò´ƒ]؇²Kf4rñÎn÷Û˜Š]­tϨßÛZÜQ%»ñìÜ£#ºiÏùŒ–(V1-÷xzP™m¬qEB¸'ÓnÝÇ"«%ZÚV£èÚQW§§[:#º]t°Ë‰ (ø¸.„?ü Â,Ò“ KNœ>u9Yö#_IBgç] yôº—dñK‘”&7m$f¸õÕFo£þw™±äcÔéK.¸Ià‹çÓ„œPrÔ§)¥PΔ†€%5ʱ›R²—î?Þ®;ßÁ‘²åÚ¬WÉ;ª~˯ šQö/*ù]¡,Òšoèý«,š7}àé㻕o„øÄßÝÌ&æxËô2RÍ£Ÿ\8ÃË‹TSwð€5 þêÖß[ÅÏ•˜p³òè7yÇX¨&QÂŽ›Šc(•=¯éÚ€¬åñY”ê’Kl®æØp9rñ³Cý[fkHDzÀ_i•l'ŠFÞçùз9… I÷_P¥ù UÁõhHCvë ¤´¹›>ý´´ÄYç,zÇÌa·Æ‹Ê5îvæªÄTÏEu¬Ë7Qðó An=“ ¸w3mt¾·Ã5ù¥ǵŽšž¶&'“Æây¬ù¼Î±ç°e~y?| ‹ |4D×rmܪª{“3kñ$*ë&<æàçx¤Á¼*TÚõ±öˆö¾Z"¸¿húY­} úýÄ“ž.úÈ{K ïë5 +‚êf„Þ-N™Ø©^"zpËÉ(d(‘ƒQa0øšÆÙÑ*<ÄÜÐ.Œuô›¸°¡—W‚×gÚïï41å• :JéjÒÛn‚j9ƒ&л>ÅæÁ߆‘2}äæ­Û¤©ºµ­?& ¤žŸŸàÜÃ!eíN$±SëÛz‰<2æQÝ­éñÀEǧ…õzö 1‘áĺ3/+ˆ½³Ú41‘z\Àð—#éZñ…©â,ßÒ¸1Œ{äd Ó˜¶ª%yy±»/€/Ò0ðìIßO‰×"7ü\ÒKyL\"Œ³:ÏÚ5©šæÙûö^ä°‚ô÷Ð70#5îîíå BÆy¼ EüÃÇ”£¥_úE%"œZW·Zü´…%î½°3º]p0ñ€Ïîû“T#£¾†5ÞÄ%“kmJ‚gCÐëÏU¢#Ø($4ùí_kè—^žï <{7䏸pÓé05GŒ"9#j—èSÛ—6ÇÕíÞ ³Ôx7¹SÖ©t6pu)ýÅ1 ¹Æi¾1Ž;V¿ÖЫݼ%y(x¢ yÁ{6ì9¾™xA+ƒl^97ƒ;åX3ºò|œ{¬Ñ5#Óü’ưpëf§šL)Q4-Q(7ñEz(ãb¦¾Wâiß [½ÔcEÖ—ötüÇ2á -Që[^¼_ZÄ1T·¥ZùY…I=$Ørpƒ0¹½‡µÖzFa -þÃݯÉï•ÂBSè§cVÏT™*˜¨IS÷ºÐlõŽX0 \ãòèB§¨¥O9†ÍQœy­ç­B9".}V3@aWù·†ö+|ò*œƒ'-ƒxŠ{xÂ;ÏWƸ WD²u̼- ¿Þ=\´Ñçšdæ%¶É~ziŸ[æÃL3ñ«“CËĽ3iC„\GzúÝÖw}M•ZžÉóYÿ~´&Ü㢯ï÷”eÌbŽPš@n30Z‰u*Cïaåp€Zëæ+žO97eû⽆úܬQ%bñ1ôKYwé:ýàB>°üŠ™Ïm€ÿ«d— g)Jg}>j±ì´^¿i{’÷“õÚÁMfUIΗJ¨À@> endobj 52 0 obj << /Length1 2343 /Length2 19654 /Length3 0 /Length 21017 /Filter /FlateDecode >> stream xÚŒöpìÚ Ç Û+nlÛ¶Í5¶Ñ°Ac»±£±m³±m''}7ÚýýÿÌ9“™d]7®ÛÏ ‘‚2­ ‰­PÌÖÆ‰–‘Ž ,«ÄÈ```¦c``‚%#S±p²þ[ K¦tp´°µáúË@Øhèô.1tz·“µµH9[™Œl\Œì\ &ÎÿÚ:pD ],L²t)[ #,™°­»ƒ…™¹Ó{˜ÿ||2¦0rr²Óüã´:XÚd ÌÖï ­Ê¶Æ@'÷ÿ¡øÄcîädÇEOïêêJghíHgë`ÆGIpµp2(.@Àï‚r†ÖÀUFKP1·pü—\ÙÖÔÉÕÐxXYmß=œmL€€÷àeI€¼Ðæ_Æ2ÿ2 ü»7F:ÆÿÒýÛû7‘…Í?Î†ÆÆ¶Öv†6î6fS + @^L†ÎÉ͉`hcòÛÐÐÊÑöÝßÐÅÐÂÊÐèÝàŸÌ b‚ŠÃ÷ÿ]ž£±ƒ…“#£…ÕïéÓ¼wYÔÆDØÖÚhãäû;?  ñ{ÛÝéÿ5ÙÏ6¶®6žÿ¦6&¦¿‹0q¶£Wµ±°wJŠüÛä]ûGft°200°s2€ö ›±9ýozw;à?JÆßâ÷ ¼=ílí¦ïE½-Lï`= ]€'g ·çߊÿE°ŒŒ c'€ÐÌÂöû»hú/ü>| 7€6Ãûî1~ÿü÷“îûz™ØÚX¹ÿ1ÿg¾ôвZ2jÔÿªø¿:!![7€'- €–‰•Àø{ÉØß?xÿ/ÍðŸâÿ‘*Zü;¹¿%mLmœÿªá½yÿ©Ãåßkñéß'C øßr¶ï» |ú³ú: ¬ Æï¿ÿ?À?.ÿÿöþ7ËÿÛêÿ߄Ĝ­¬þQúGÿÿ£6´¶°rÿ·Áû*;;½Ÿ…¬íûqØü_Suà¿NYhbálýµ’N†ïç!hcfõß6Z8ŠY¸M,œŒÍÿµCÿ™Â;½•… PÁÖÑâ÷c }Øÿѽœñç÷Åñ}Vÿ¨€ï÷ô¿!EmŒmM~+ÀÐÁÁÐö}ôïˆàÉø~¡&@·V@Ogcëôîx/Ï`jëû{¢l¬zÁߢ!v½ðÄ ù/bgÐKüAÌzÉ?ˆ @/ó½ûÉýAœzùÿ"Žw¥?èEùbЫüAþAÿAÿEœï:Ã?è=ºÑôniü_Äú®3¶µzoö$,,¿%ÖÖüOÞä/È þß 0ýß•¦A–ßÐâþmü²2ÿ†.±ýXýÑÿ6·uvø+Ú»Ù_ðßüOîï2w·3Úüeñ.û+>Ãû`,ÿ‚ïúü|o‡Õ_ð½WÖ•öÞ‡¿˜—jû'ö»íûWÝ_ê÷Üíþ¨ß}íÞ¿nl¬€¦N¤Œÿ–þëQø¯ø=I»÷§ÀöO×YÞë¶³rvü‹ÿ]bÿg¬ïÑìm€&FVÿ‚™åâ£0sþ[ó¿bÆß3û«ãŒï ü–õ]éøþ<ÿ7¯÷:Z:šÿåðžýº÷ŽÞÉÜø§3ï—Kïäjû—Ã;‡ó_ð}.Á÷4]ÿZ wo·¿à;½û_ð½ ÿÀÿyŒÞ›ìôϳýþbüÿóÕ ºaçl¹-«[î+q]iwÆx§ÉvÔ“)i=Z>$PV¤Ys¸LìBZÙýt#°Døâyô³öCHSœbó“׳~ŒÒäN3ìÂFßxÞ‘`M/> ­ŠÀ®×‹½—šÿgðŸ íRdÙöÎ ßQï]{ÄÝjzK–G‚çvw+ؤážK¦h#U#tü gÈrŒ2f±ˆ¡œhñ¡©PÎÝgnn§Q²Æß¥b¨a½#™ó=µÖ™¾=Ìz¬–©09v`“bkaáƒß ŒL’{ í'JaÎ{å¯ô-¸ýäÉ'Ì‚§IZ¡E¢ÛgJ«°P ·iè®rYlcÜÎNRàö¡nÇU7 é;Ë£W4뇣:U1âï·™ ­¶ÜªušZ&á-qNÕ¼fà5Íü;=ŸjíW‡úhï‚“šî†¶:½Õ ù{ùñÌ\©D͵ÃV–¹Òð“ KœFÁ:Ô’hH4K. φA<ž_.„q7ó´8 »AGðNY³½.¾y—×˵­Ï Ï[¹¢è¼°É½µ'Ÿça›3‹¤ÊIíüšó+ŠB‘»X7PB¾^ŽA'RìN(»ÉºpÑOšÏ")Þ½3ÿc0Lç‹»åg.Ý©Z¹js4k®"Ñöq8íè~ÿ€P@Pç­Éþæmi©ú­ÚÃy¹k¨Ðà· öÀœ¯mJ~YŽò)â‚á`w[³Ý0F$'*B.DÖ Qˆê*¼[£Ï®4%’"dù‹²½Ò5ÚÛ\\¦å¦G†À#aT#ïGê_h7$íi*¬%$žÙ K€ï¾ü !Lš"¸›IžaZ-雤)©ÕÓÁcY#mæºvÖÑ pt0ü¾[zdžœ‰Ì,Þ¨Â#äNj;…ÆÙÖG¶Œ©Ëã—slJvÈ Uj3U|o|éägûXÑO®t<†1%ÖðøÝ†Î¹Y–S99ñÖ·ñžë'(•#×Ö¸ÝÒl9áÆ´¼±%ùÛ¹q|u&7Â}{"“©[¸¶G>ÛŒjôB¼U×'D ±š9¶¤'wý~d=å퓃访6˜tmKº×?ô_ø%͇÷s„¬OÅ 0¹ê M ‹ÜÙî¾t,ýà‹ÁbÉØ°*_º’ÓMWVdŠ{ÜqbñPÄnyi‘|6—{¬óÜ–G $3‚˸ÏZ£CZÔtËZ÷4¨Ï—cå•[¯‘1,&CR=¤}èɉ[‹£7½éΰj%SeÊá"P¤T’¡ßå)Á8eE-ÎÌ]»Ë°âþá9Ü÷‰¤iAÒF *–:$$ÃSiÁ6¹³GóÓ¶¾ú9˜‘૯´—­,œ>êÜt’:òÚ+^L+¼û¶ìþ›_iv•^ë¡S&!´€<ãQ}ˆØa|=³;IÊ–1¢¬ìü„x¯Ö˪6¸uÙ[“Çx„˜/ ŠUÉC)q—ß Ä‚šP”ºž÷že4ÄŠòÀ²6MΙÿ¯Â3%ŒFŒüÖf±È~ð’V… ºýVˆI?·{ˆ,}í1 µPdÌþ«kÅì x…·—€ìXàM¬ÝëN€ƒ¯yÜccœ3ÆEt`„µ•'ôPñn.Z_À“GbMÁÐeÒ[u]¿2k­O«”‘€ªd»?¥"J–ºßÈÎ/˜ÛsµdÆ¿\‘c_M{!§e4tå‡<|æºM GéAÀqwpY¯ﺱØú£´Ø½JŽÑSrL›šÿ7«OVf?:3–Œ¦Ê#W‰÷Kfg‡u6^ Y1+G|¥œ›öjù…#ù€XG½Ï'ßM¾¥Ù xÄtB(ÏÝËãšÃ“ÉôÀÖý†|^â–ÿ½$ÀEN¤-\Vœ“TRÆâ•Ú ŽÓi³ä*/0¹ÆSœŠóNå€8Xæx"#Õ«p½Ä)D>Û¥ÜÔìv:y®nØ(š›â°z«¬¢?FWöãÐQð²ôW~&Š×Ýmœø}"ühÕ€:yÊh°ÂáLwåL}ºµHüxÅÇ}Nãë1X;IkÛ\±–í>ÀìøynEQÌmütf?i `öjYç¦æ~S·„<™A¬KâვThçrÙ Ÿ“r»Ð[Dç Äù•ݦQS¸\˜ñ±Ç©ÄD€ä®ˆdâ³\ÈL¸t%hö4wnÇáLœ•¿Øã'(¸…¹«°Pîõ|“ײ®§ÐØr¤ç5ª–0ž¾‚œ„­^Ô@ÔpÇŽNž:ñ(xaQƒ µƒïæë­ƒ=dèŠqcbù¶ ­=›“Ⱦ¤%Ñ­Ä“ÌÌ-w œóœÇZ‘Žœ! [åðÇKê\rñùÇŽÓ7ýñ „P¦ÓõðÕWƒÈ™X\QŠ­<àvIg˜ÔÏP«]WƒúŽå9Þrwˆå ²P‡FÕ»©ÄPtWé ÜK"«`BãuºpŨJV,T0."÷õä·&ú¹²yÁÊd*5rMÒìQÐÔJ)sÇÚùiÏš7½¨'šö@ï–ª¼ùáw š! ×°cb ª¢ß¯^#Χ¥:f%"(ªëø@µÆ%×Èr·ßÓ;´‹(Ù{ÈÛž³ÍÇl2>VahRÌ,vÕ«t_Ph8øÎ¬¥ÐÛèÛ$€KÉä`ÀAJ€­ÞËžH…-¯“Ã÷”«[[>×ûœfô«ËæÐãÄ@¦"WzÙ0O5ôg¯çs(ŠËæ™ÌÚJÓîw–¸kÆdR_TkÁ·SÇ´®¾«K­5pª”fÞâ»!Ç›sÛ44#Ï÷98h"aaÂpOLch:u_­úã3‚]L¸u#» 3G…dRÚIÛŠ±™4r»v”FD+Ô^?}Òj9öé{ë©MÇú=Ü‹\7ô«…<~ …d_3ñ»Ì´@C^µÜ̇tk€æq`ÏæYÃ&.‡`™¹.}€…¾g߃ÑpWÖõ¹ÊK)°²š;(‹ƒ!LÌp!bxØo‹ÿòquíñ´XtÍP;ô‹é½‚‹ŸDP6º×áõçZîeq‚94$MTbf¡kÖÅ«çÝû âéRm¨{ÆÄ±”cV¹{Î;>&v©f¡—«:GzðÓ°z³O×ÅnèŠ4N|Ú?69FãÄ{ý¹•H9uÙÐÈC­ÝPZÔa‡¹ Xvݪ…Ëô( éá+ Zµ¹ÕègÏkfpU³ÊV@¬íž.£…}@ýÖ\ŽX‡ë[ôDo™´Þ»˜CäýË þôH„\Ïo d{NQã')”ÄZá∓d^y ŒïÀ,Ý¢&Þ…À‚ z©C"’þõ±ÍŠ4|›üó–“ $­ ¼Mbx?¤þ/ =ý e3´Ø:ŸLŒ¾(îH‚ʉ“"i¡_çlÀžúΊ˜FX¾ø}«vE»˜`œÒï¾Ó”Áõuù—ô‘Ü”±)>êý¼áÚv‚ª²8Ds+­ ýÄ >Ä=Ö„¾¬hö­¸?þ³ ÅÏóL$îLžh{\›…mg'+aÆ8ë(N¬}Ì|ýT¾?ÿvø„£°2u^®c·pL™i޹T*Qvi(0ÁêÓÅt)4ApPq‡ÞÚNŽUšTýæEÙ½¼ðË0L"±|]ëçt‹s¤ªw{oÏ^÷uš*`’h8Q3áøähTzFs§h: [šlß8_´¢ñ˜à)WhqDR×OŠñ@r5Ý„lŽ0¢­,c^¢I»óÅGÙáÕÝ « )^<;ÁMÀ ‰§ Q<‰© ‚$À껺6ù ö>=†.£; aPDÂ2ä;Ò–#ºú·•DØ]º.¾¥‰¹ŠŠœñÏI?–¬z¸É+Hxö–R+/Ñ”¦“Ûbi ý üß·$A”%ÈyÞ [bO!€.6 ¨þb_ðt¶ÔªJ˜{¯ ˉÜÝ[¶¸.¦©Ñ2‰rÝÎ!¿˾Î}Ý 7õf^KL;.èß"/ND.ߣ0•uœü0C¨¡®úâý|[×ШÙS©ç73Of9ÚO$Ñv./ñ=8úPÿ¡>œ{?¤zìÒ7fSªÑ%¡Ú_w…–tñC â2…°9¿?k O 2Ö ~óÉpeç…@\9VLªaY­-ZŠ ¯qXð•­:h­ì§Ë((†B’eƒù MOËef/+0üM’VÙ/¾ëUD;µÏ97Ó ]CÇžñß¡D+’ÏxÇì ÷õàüÌä?ƒd4œ¦mÙÝ?~,çpv_!u¸L\½Jp†5õ6¶ï¦fít÷!zYÕÍxĽï8FP¥)msÊ¦Üµà’¸Ìn“êYþôC(ï€/¦Ööj?…ÁW漿ÞC+κqÑã”&¡¥C¥zâ²ÐB?á±¥‡µ>,éNæ'§²ÙXÏÌ‹õCãh¿ÅM*öƒvš9ðßbk^B`%Úßt<àås£ÝQÚÍ‹ …_¿5 ŨòV—HóÈ¢•û3!{Æ÷š7sÂ5å½Öuzõâάúâiîë žè#fà^×#G6Ïa×Y¾V1–Û„ê?‰ðyÛAQïš–˜qš“â?õ‚ê œÉ>,èMý—¾åf-…Êsí?j†Ø–t°?,b6ü²¦‰lá\æ×µºÝ}Ù:yv<…¢é€t€/rs˹dBðA)|'è„üñˆ¶$šr³É°$o°É|sœS{¦Ðù Zy‹S:;¹GEºØPƒtÛÕl0®^>@{Ì-×¾? ×BòSâ[‹%«La‰d‡q·—9AiŒ‡È&ªêxW´k³f$uëK™רÙ^Ïx^o:cûe•ï"°·ÔÀù^ Ç ¢ì˜}n%t¿6µOo‰ ÷”>Ó}òÉÀð<¥`>L»b, É`ªmD43·Ë§òØ÷cŽÇ®Å¥Œa &Š·åPåÞ ÀSnØŽw¯¯âî™z=䇔›ÇoÉ 6TžVüZÅWá C(á|{'„v´2“ä¹OàgÒ|ƒÚ"².ƒÄ匿탎%üM.ÃÍ}z:Ï_©bÑç^‡6ŠäŒLƒ¨—[Ú~fÚÃD.ªÂ´xL^™šn‹v®ËžLáéFÕxt_m,)›{¤j0»}cá×`ÒíŠf)’Hýž6™ª×9a/´­NOV=¹òùx—;ÁÎwLÙ—w•"a ÖTT.ÈN|à)¬ÄCÏäô"ÛÛýà¸Sà÷ô™SRã:Ö4·8}|ómüå‰u±@Cô¸0i€îpƒ¨c¢›˜JjY™¡cI“ oòÌrŸ|jQp_ê#uénhûÏfh”%Þ›D¹œR6—jeMä¯$ËX?d’ÞXÆ O÷øÓ@Æ)nïº|Å0MÔÄeæh¨÷0ÑËÄ_óÖõè‹ík»!oAÍ#zË´Ê<EŠ>2ßQRÓ²öeø,)yÔÍ ¶e[BùÞæ¿¾ùl×OÔD¤f½’šš4½' …Â0ûTöáL±^À’scã¼¹!ȧ[¤o§IÆbT²Äîuöp^îôfâÀñqÀá¸S`:¼•":=_à%œgØÞ{_&’)2™Œ¸ÝH¿2_*p•X!Ÿ,“5:IÅ| çÊ‘;MÇwPûåß…í¦[ùª…ró,«³N×Ï*ãœÕ¶ I{/gBŒ‰F޼ˆÕ¢8L§JN±SòRbfôz‚°ƒ_…ëD`Aì sOî Fç*COe³ùºú”+‹éO1‘ó¨eº…0J=eÈIZ‚ Wï¸P-¹FQô aÐëŠ;8M¸H%H`G×Ìí9sË”lý‚ÓÉë«æ«A¦˜~š[gd¸j¦W8…Fl]H ¸¢ê›$œaJàÞÊ-ß3× šþØ ßl'•$ƒ7Æt±ç:ô³ê’GßÅ ó¶Xº)øÈb^ÐÂZÑ¥ht(â—gÕüôGWÊçf¨aÃèö3\ë&–$ù?+VÐCÍ?Ø÷Ãå§·8ÚÂÓþˆ…•gÚ".÷RœÛ-yÜh]z8z}ñÎí‘™­UF Ëçò3-™µn)ìd>‹š;W†cêáÅŽ™Ó®1iXˆ{–J×Y©Á (Ç»Ä0>^Âò{~@ô‚vj³dœìKÜsx CÿÑ1ùã{DÊ¥‹FšÐ æ²6hDn¯ Ù;FòýÔã$ùø>Ae<£}$±]Ç9ynmÒpƒ©WY•¬Ô»ß50q² >5F—*êЃ‰¥Øøî¶_†…ô‚iY¬ ªôÈ•gÁ`³h¡¬T¿{ñ#C6šäÄÕÙ‚V@³•éÏäŠUÖ¶³uý§S5^ø¡òܨÜW´Íjfµ´7ô9M°ð-Ñ]Nãv·µ§÷ÿlÏöÜc‘Ö>Öòygö4[#Z{Ê÷ÈçVlÎ뀭,žM{'A¹8š“ÓÙȇGw …á­¹lTs9fÂíjo–Œ†³ˆ]âåƒÚ•1XkŠÈª€ÇùMu \Ÿv~öiùf@6À5`´‚-tÇÙÄѪÀUc‘Ú_(¾eHbÜÙhv.½9ïÃ`½X+?/© µ¬^^ –’{-ÂÉNQsÔÓ}§Ÿjtø|cR¶Ey¢UêEõ¤ÏÿfªÍ­¾ y…šë¢G¥bÅÌ¥ì¾áê ±Ú¾ó~£Íá-u¤Ü7áúÚRtg’zYú†Âÿ4 ¾Z ݃2i—™ŽDÍÀ˜ìöß "ºSHªÜ‰ªõìzâ…ˆ•›9ñ-¾'Dº²cŠÚ|õõ¬þF.´Ã@vh —é€#“QǬ%´Ö vžR"9»$v_03UßJ´·çhVúÌ +ï@ǹOFè2iþb¿ÛÑí”ëߊèh e¦2Kf5K“‘„4ëaeÃÍÜd‡#bFlßç‚LÍ@æØôŠRYlŒsŒïÜ|¼]ý*yqE>sÉÕ×ølà»”ÞÉ×^C!Ähy’Õ )4h‘J†=›††§ï‰¯‰ûÍWó˜×ÒÂðmzCû;œ@éÌl¢ #×,g™$3d/Yö¬^äJòE(\Å e~®Ö[©ü‚Ý’mæ®E¶ÊbÊ\º¯úºB’#-—?$(tèB9ÌËÄ™ºeZ¥†Aá/,RúÖÃK/±{Ï"Ll}î4 ò´Õü^å-²†ÖV˜Ëà õ"‘xÇÃV78KX‚=ìTóËÜú!¦ó€aWê@8B¥áeÎúƒuv;5èÙø^M‡ŒÆ`jxI˜OÊ«–—…Ta‹Þ®ç ýÑß,{,?³jó›ŠD¿.íŽaý½;r½i¤cb™ EHqzçbŸ¤¿ÑÉ»íç]«s+ÕŠ¾Ç@>A¥Hh*5Ë©s`EÈ?Ïٌϳ›g€H2—n”íÜÎä"8„†ÍÈPöë÷:ïPÀ?³pÂQׯ;V Rª‹_Wóö€¿˜p¶ÂÐݬfFÃójÿ àûä·Ë .äåy‘Ûí»CéÚûlßE5§åÙ¤OÇß7ŠŒœ~Šº’¢—Ђš=(vB39‹G!ñ¥=vŒÎçƒjÿé”g|&²ÿvý¾·Î%hŒ/üÜ®#ÁïÖ”Üy×Â^\ø,$öyÝ}-žq!ÌÖj4'jµØÀÏÇñ‚Ò]8Ê"'!5†ámM -p«™Š“¾SÐò‡Â!B{I£×ÝMù䟮0Û-˜7ý([Üì";ä‚J-Mº JÂÊu ꣊ œô©‹NÂAÆй©+u»¿h ??ûÍ¥hà4y£2þ”üJREÆk «4úó¸\œkïØt[å46@ @U£Ã TóÆL’èñfj|®ú2Ï@­Êù™H+õk@\1¿IºÈú*§î¨(–P2MÓ¨Øqx¥ï3¿(à²= ÜxqZåÑð#-´áGÐV³Cuá÷‹CÈ=ŽôMsUÕ—.¤äɶ8åtPy„û+ÑL ¡$w·¤3+tÏú•Ëtouîšh™O _ΑÂëî—A»§6£,ä]¿¨å~3܏ލ¢èÔ9´˜”|üê–ªáhUS+\ÙIÃ@|°ìdÛYÍ͹1œU'Ìži¥‹7cÃð RÎ<ظl"Ŧó3Ã*Íœ†’Õ­~»0–’}t¡Ê3Æî šñ@òœÖ” ¹ŒB2ÆÇ>Ü,àŽîó ö-ÿ%ù«›Wä"Çø’óUyN Ü9Biìp™VDóp®:È8,Ë…1cíÎ+‹«®’IÞÈçsŸ¸èrá0⢛ ˜9!±ŽB¦Cp‰½QŠ^A]qœÆ…WªÊ‘IÝû´àº½iÐÑÉù<¤S‰Þ2̲ßôˆ…§Á®îN´P´2·³ƒŸœ±ú1ÜIÞbÅpúÌ1]õš³¢7³A€ˆlìÎ/‰eµ™…os&×÷ù;¼·ÛâZó®š3#4‰ü×_¯YIV>Û[#p˜îGõ¥¢`šF¦Mn]ã€ýèㄯót?œ#kzO¦ ãÒ Ä~æó)”*8Tp·Ììþé_óÚ²µ@@Óãê Mšæºü$²è¿ðªoÞNsœ¹……·_‚eÂ?ž•ÐGÊ›£u!T€ MÔ’8âO²É·1žì­$üØîU:i#à~öˆáfT2©üÃ7ÌW­ˆ¦£ÑRØdïö€ >LGØ/¢cY&\2D1qÀ—4'”™ Ùöë—" }äà07 *Êüù+¥`èV"·4ΡFzÞUƒîzÁiiéBà \>¬ªýâ˜myÜiK*øüüÎVè0„q×É×{€g“¼$á¦-ÄÛÝùèqµ‰ðkxwÞ+4¬„àËm_*†,;î ˜Ó¦ H†êrΰh]ܘ_µl«åÑ+4`-Ž£ÛßãEiX,u×âWpä»:%#÷†›îF?{2çüzr£§ñÿRÁP­î•ÄÞš“..]å@æÆ² Ë„—8Ê|†´úô€ÔÉ´½·¢Jn–Æ.LNˆ®7 ÿ°Aí{^e_Ùv"žµ/”ƒ[ ù(( Ù§›pÒÓYðà€Ä¸Ò„ÈŒò¶O¾P¦OðÙ.[תÅ\8µÔ9¡ ¯†Qox&؇‘cŒÝ­zªìV­–—0Ùà ®—Çá)…¥‘DžGÌRª{”/ôðÊÄ*­êœ–r™7(¹²ý«Ü¨±Nßà"·-S]ˇP,ÂKAͽózQžG]•'pÈ]}(ƒÄøý»§üˆŸ)¾C}ëþ¼,¶c'—G¦Ñã.÷±Beª&{8Ä–ª©êTÁhUwÝþ:,˜Q·Ö_¦hàËgjÔç³tq< y͉cOØežír}IEžûéCÕ*KD~zÍO\àºsoA¨m*F(ƒØïŽn*˜Œ\àÆõ‹ 0E¶µâûÚ(·£sxÅ'5k?[Qbô²!I¨â£½É)l‰>jÞàöêá›KåxŽ]Òr~‰)cè“8ÄnArt·&(6Q17˜×GjDá*Ãë©“ò|ùÌ?ÞIé×uæÞÓazqÕ©”¸ZÅÅkg¦¹É¥ƦÆ|byâ:ɺÏÏ<êê¨*ÏJ Î9i¦ïŽdBãCÆTð&n$8ZÓ¶…óÈ{ßÐ:•–è@«X¬PH+ž.1wŸ§Óÿñ²‘tûµI… J¨sul©#\ÐînÀª—ÇD Ïø+ï/3Àl¡†O:ÝëçîŠ%º¼«µbÇ~Ò:2b+ß_äÚŒ|ìýMÚ àÕë$Õ¶üàDË]îSˆ^”^’Õ‘ôc(á­FP.ô;EcÑÀML¶ºPsG­é?R5Ãk¿]÷_$ž«[t†“a¨òwpLl‹«Ü)r«¡þ°Õ..ú¡€'±VLäÒ§oZôÒÒŸ ù×õ9^XŒ6&„MGßR hP–§Î¦ª dKô}ª(ù”!=€1ñC¡÷Aù4*Ñ™ÐûkªH…ž´&ì•Ù÷†Ù\„E}Ë•öõ…¬õáEºW‘D»‡BOåC”Vé¹{z]"mð,:š2ù{Kù‚ŽytÓAç^p¢DErmÛ†Ua˜õ°@ö6²ãÄìïHM®95ÚgËÖ4þ)0ýÔûƒ­ç_Ý€o t½„°QZn8禺©ƒDí…µ›ÎiOê•ßµö3Õ­TuÛ·*uxh¶H^+§4@¦I´}t]{’4*y!æL‘ý©ûÓ&ó :î@/èMA@aÑzÔY¹æÒœßœ¤¨g€·˜˜D ðš^Õ<Žªví« Ú»ÌËRZr2§(‡î Ý•5ï±ÞEèiy£|é^»‰¬‘.¿Kª.@¬† jVáºdý v»ìÔw¹àØå ‚;Èj¾¿ÒÿF—@æPfäWV­Þoq ÜÞVƒ3ö0Õ¦e?ŠÛ¯¥)›Ó¥ñ†F/ÙÜûÛÒX21Ómûì(7‡ ŒbNŠaÉ.+÷¾ذ0ñ^ž“_ýÞô“+‘ ¶OwôïkÛ´\–®@”u…ï³&I’2êéVE§Û¸”Ñ?D£N3ú]ËWο9ƒØîÝÆ[þò¯ê§1úɽ–V`'î1 íÁîz–5x¾Ø õ ÞâgSˆ9ŽZØg©PYœ, MöG·íVµ¬! ¥®OüíŸq†±gÕ!:°ô_¢ØV<%Bý± ëo XÝGÌ 2>Á.–Ñ ƒ¬íÔ°KéZ}0¢ƒ3½æª*p§nì óð‚ú_{²¿+ÈFc†72ª zIlkô-åJûàI]lbÓËÉÿUìήÓѵÿˆT”="öð–&a&›U?}ÁC[2cOöƒ'Jõ§Ñur—PØo®5kDZmšl1欜_%FcèbM)ŸÇÆC0qœØªžYl8)±› î/¡ By4ã°Ý4Æ{Åâ ŽxKÖžèù ¹„ij¯¤Å\ûc)Õ+ó]³¯9³ón¤ˆHä³¾8ó+¥øÚ†ýE?è«5:„vº¢úO/)ÕÀ¬o@nËiåî8GÂ÷¬s!ÒòùÎÌǯµ®.Òñ¶‹’äD^_OÆ< Ãâ:çÝÞ&ÑbÉ—`1Ãx)‘ÝÒúQ'|Qåï¼I*—»?ãäºmZ.ÛÈ&9Ñ.¬ÿ<˜±oJõSú+Û"7LZÍŠRvâ<˜úôD§e¯“ÉÈšHùÅK•5køb Æ„³ëyY=ØDÉVȪªNl^¿ßd¿®=Îöå§aõê–Y)3*?¼d0Õ™NÄX=ê­/°.òKH%jâðÍ¥ÍÿÇ4ùÅn]¬ç=¿áK¨Aß9ƒÇtw»ö»žÚ**áñËþZCºWÖÏ>Ý„Bލçà¦Ás장«!Þk-ufÎ&¤±¨Ô»ó*R¸¯/=R§„êJÑÐ9JmBc3˜áü¹kg5JTÙT‹¸»zÍò¶T=éÜß¼FT|ks‡]wÄϼäå2î/ˆxÒµã;Ûó·æNc+¾G ø8š È^aúÉîÌ8#D› ,-Á@ßÕÂb™1y(×§šQK·ÛÐÿ,÷RÏÅêb¶vØ¿šœ¶d$/©~ë³í»ü¼ëÎf¹x’?Œ‹ä¯yIù½ 4¿‚iåƒú{—ÙA=¦ü\÷QA?lª2>¾%û› ÏùAࣵ k[â%¡ÅcÁœw|MÏ­ãsÚQÍ¥S›8Æ5 SnS†÷ÇŸ-ÞèS’èB³§ž{ ¾ÎÑõ˯õ!znæw4Ïe÷™úß·T~â÷Fö¾sÍÄO&Œ~àŸzì …ÚÑ´ª· ?!Äœ»6Ìù„D¹@͹WxäuJl–[›ÐÔå§.>ãÙÄÁ­F>íEC—ƒÍŠLÔYšQ_ü…JÒÛhhJ›ÁƘ˦ÑÅóÑÑÓŽ»í….¢Pó¹Ñ3"dà”žËØÓHãû±›¥ƒ ã=ðuëÅæ{å«yÃæuÐvxÖ`ÖÄ.x¡iÃ¥µ~}k¾)ôf)ìLÎ,órEs~t4ƒŸ[HsG¦ê˧ÛÒÑžQº(œÚVDø)]kRB]¬9¥Ý¼£ûägámŽ4iZ'ÄÀ{ä±Õ¨œÌƒ»ÏáÄÄ#9÷ÈY¿n©¿ó)Ë-+?[’tÊì¬jéZ<¾/õ5z´¤ˆ/—¾ÄÉšÆÇvZš?—QŸBµM­ÕÞš¯© ¿tGþraÛ^e®éwh¨'µÇ)ÃÕSB7nQÀ‡÷“!ÕƒÁE^L5ßL\åâ;Ò”#³#?õ”øá´$Ä¿š_Üóô ·nïk.Aõ™ç0Û Å!9wè6ýgDý–ºµÙ±¸ø a»íGBe,*M¨]ú—\¨flQ“äJaˆå0š1Ÿ‘DXÅ8Û1²y+?t%‹hØæÖ@–»K³Û0å›Eu^í7y†±²F´²º9’"¡ fpñp„²ãÔ3z”MS‡›zæ3Éš L}ðy öY'ìð½_¹Véb‚»Ûèh4Æ‚„p †a!Â=ü²(ƒXÖ žŽT Xc#ã H#î¥W0NWïª@fð†‚†J¡QwæIKà07¢Wå¾Î•vÆ^rx"Ùu)ÞSÊÚ°ËÕŸpî´í“H†´(X4ÖyHo‘~#Œ©,‡¦Ñ­Ñª› Gýet’ÐÖi³k¾ŽZßÑO¶Çh‰Ú7„Â{ËØÛÕOxÅQ¾«áØåÿÚr(Q.‹ò¨FVÑÌ6ê©L¼…ecosÙ6{Ø'c×3áÇ)$®ÀbS†4u# z%Ž@é©ÉÝÔeК‚›Y·Ôm˜©µÎGáðßΧ#/¾¨•¦+‰ìL£Í©ž.ÇæÕ#P òë~ÕÚän‚ÿEôþ> #ÑCÖ‡Ò‚x•Ò)ýK´X´— ž³ÞIÃ_zÎøçKé©6dO‹™#„oLò·2'eL@6§Î…eËàák…"RtTU° ÿšú€OЕ»­2' ˆPœ)ÃŒU)W;â“¦Öø¬Õ0ݬ%Žê=µXå±ËçivѲ#Rk’†jQv) éí¢Kþ àHv&qàO£˜h•žáÇhw)M®¹•8ù$V,ÞÑÊÚ—cÖ)¦÷DÕÍhcùq¼)TÑ£‹íI1‹HéÂô4Q˜î,:˜ˆèÁL¾E®å/ç×k5ˆ!©¨Þ”Ùú£:ÝÓऊg8^øHÔ\Cîq4ã,†o¤Ð¶é`~ß±±/ôÒ ôÍ7Ëtt*^?g&õêƒx†’ÓÆ×~Ü'„$)¼8²n8DpÜ÷ûB˜ã\uYPÎuAè§÷&|™1kÐ\vàò¼J-bÍþ,ÆÿùŸ¶®é9maúÜœÑP)~Ï'Ø ,Ö˜‡EŠxbe?4:P‹® ¬Y»xfÂ–Ž± ÑF)OÅ„L|Å ÍÚd•-n穃‹Çl ,z ‡CçÊšeïmþ@ùm45æ·¾z/VMÖÁGüâЀ+àe~ñÇÏ”^bF¨'•{¡ñÏŒPf¸*”ÐŸÛ Â†&l!râ&zF…$§s=ܾ~ìËú.¯3!}„³ÆìgÚ[óLíôæÂ“Ú퉢#;¿Ó ÂTOã\2›•)G¬ï²<òö9ööS‚ ¼v:ðmвޠJ0ñF·©¼¢žE÷Àìˆ-Cp°ö¾æ Œ{ÆŸ³‰:ÖFùyXgŸ8:!> ð~C ÜjW"‹”0§{ÃYÿ8ý”„´çW½ýÌ\«ƒ_=w¢xÿUŸTÒÞ70KK± qO+6b²owýÎæG¨HnÏÆH y.×±/p›»žPOò|ü¥@ŸbJÿ$6ög$uIWR/V_¬w½™Ì 4ãÎù­¬L«¿V}ù²&³hDö|†ØÇZëONôáˆmkÆ4Šì5œ„˱½!À¯Ê†8…cézl}Ã¥Zîâê…‚[&½0´Ç 2¨3Ùm@ó$¬gìc;ëqÄÃu²xR,§¾Ì¶_f’HÒ7 rÕ‹úA ë"_¸à†;•dHâï/ÐŒÔí•´{Úw‰-Wú»C!°)~§t^“ ÁÊ5fð“Å’«9ÿ©êý3+KÔºöLbòÕF7S¢GíFó‹1` (òõ´0zëd²HBd~„C}õ¨dHõŒýEnI7tÞ/¡&§÷Î?Fˆ8ð#»`´ÈRƒÖj› ­>sz4Ÿ¤X#É…ÈØDd9_î“©ò`¾mOÕSJì‰Qò\0Šjܸr»=þ=DÕ‘ÄÞ§g2ØS/çü¦.9NÃH•EÛˆ]d¿åÅݹIy¼_Ǩ(5@7}0´?ƒ¿¶¶ZÞ$«¢¹óK‹Y-kR¨G›‡ØKÍ{¤/eþÔ’`ˆóÿÏ Y_ÿ¦3ÌÙ$D­õmN*ýËëÒWíäÎlÑ,pÓ(ì"çM¦ ²MKÐ'ù¨¨óc5œž¡áã|jflq—}!Ò¸îÍ:,ÐkE‹4öV7Cx…]Yc3Cã_‹^-«\t&§ i»šfg½O¢OŸpÖ“\ÓáâE†8 NÁ'”#bø=Äy3ø#¾V vÄUϦÒñÑÑ@ü|j &Œqï™xh0·Æ—©‘*'•¡ofÓ2]]ËÔSÌ 1øa½¬–˜¾‡RF¯Kº²ÖxÄ]д8Оë‡UrNÝ+Ó¸Ò˜c™Î>r«ã:ÎÝ `¯Úµò¼o2C³[|€>ìëýýRíÁPgY‡uD´ -Ìý¾Vî…ùLR…»BìÉ¡jÏÔáÇó‚ÉYrZ½òà ›³uüŠ– ÅNk(ªOxö~YJ×·¥¨¾âJ£ Sâã¼×§Wá„·Ù0ú<«1µûÃ'ô35•'«W ³ÙgÞ6x»±BDõ›eÒ õµ>¼u@³O:fJM0û;¤#ˆLZE½ã°dBðš»X”g/Œcì‹_Hïvõ^;ô¶\àe’Á.1¡F\ü¾"[˜<rò’6>DÙ½š´Xf0Ñ!å‚|­ÌøÒ&fêñó}™¡-Û[Ëfä[pjƒ¬×+°Èi6_&ZöLJ&‚c¹Æ·¼$VÊÅM«lžÉXI%óÝ……>@•Þ,Í…F¨Àv…@8²4#¨Nåò†j…'Leð:tï`jÆ •”¶t¯±Wª?:~è“@QÞÌÙDRã[xÞI¦rr娑µÜQù«>¼‹&BµÑCŸŽ·îFó8 s’ÉÔ“fÒô»7YýÑ~+ªäòìÐPùP™ŒÂhž3:J.ØòÖölŽÜdNy Ãwš<µêY§~â!ØÉ+a´Ñmé6wÍÝÖÏæöúPÐR n _‰”áfÀ/æõ$n£–žø<É·öؼgÂæp— £¡Z¢%9R¡ß%{ÝkÝ’ ]çhoÔ Ün~­„fKØ=¼Ñí=y? ˆE+Žg¾~þµúɽ;.è¥Þ]­$ÆMÐiŠÉàK{tŽpæ*ßÓO–\Y Æ ×Ò]h+•àh˜W˜ 4§Wô¯BA\z ¸ÞúÑ÷<—èñ öÓù™=*¿°Ñ(ìef³Â £—!:Ö†Ÿ q{d€’R{uÝká‰ä!O^=¾{=‹ç¢ï]!ŸÛ¬õqÍžìW¤èL³»=„ Û{´;\7寞uBÐ'‰w~mê«Xô^2#e€Ô¢kg8Íò`s‘é%y}º±ÀÙ8¹ö¾Ë”ÿÕVÄC~´V¨‰>¾úubÇœ5–üb~moL™3©/Dò2Ñ_ïq§9A8êWõQ†×S³«Àö‘kä¹Íx’¸~›¡ÜÓ“/gRCó÷ ë¸DÅ!¨§"i[‡'mZÉ ­Kš­-£?’a‘¼?ކrq¾‘/±gÖˋëI&o¾éÉ-àËF¦z^;àŸç}Qs7†h-@ªpËZ…ÀÿÚëï’%;þ¸4!.<heÞi˜‘Óë¹±öŒºD•®Sér9Jpò!‰—k¬ZÑEÇÒ»™Ê>xc£Y‡°š·½ÜKKõD;iïþÆN˜,¡b›p“‡á“liš f¡‘1¢¡>÷ʼ„K PQÏ!¡_" Þ üÀZýxˆSʲé@Â~²œz^;æl²É^p4|¢«d9™n_9ÅNCÖuÓQåÎÑe—Úì ËtÚåw,¤}ˆ½}ÞwÅhäò9;g#/75¸ ³‘ö…4ÖFBåÂw1 /hj?’=FÜ2“<8Þ÷ðèÁæ·ð%QÖ­Sǡ𖈿Ò6ÛjJîHØ¡?mqE6KUh|Xÿ¡Í¥ZLNG|†EÂ>@Ù}s1$ÂU›ËÄ1¨ÌQüEÉaÁ›V¯`¾*1Uÿ…tОõÕ#6ºÚƒÛ~{ ºæ­™zÙãÛ•.û¡üÎĹœ#h«ò t$âÅ-Ô‰Ðy5(‡ÂÅIörÜ–Õûþ…“”nt®Åóùösßê\”ïY ’ QGD‹ILWÊ}YK%ž¦»Vó&¥Ên$‘O àûNsáßkI'=·¾ÚænzHŽEØ*Ç`7»ð¥¼jgïÝÁàõ$¨¾€¸¸ç+8‚iÿ ÌÇ~>! ÿ!Åš܃ãa¡.Ý‚iM»)2N'MÎÌ ¶ˆÕy»/Œ¦ü@UÍ.Šp¸Öjj‘Ï62ihÙÝIÇnN´o1¥h17ÙÃίÌz Á¼ÝñÜY¿rß9v Â}9K§“\õ,•ïÂ4mâÃAk®˜ç,È1”¨¹)zÁ¡ÚhÊñ<~à»Çíõ”%ÙÐÁ^ö*ر“ª³´—¨Ÿ”5lîðBÚ'nÊ›ó½œ@ŠòÈׂ½»C™ø)‡ç}kçÆ‡ Ts­|°Š1Õ=ÓuP'ãmŧ²QWñ0Èuj(´·š`À®i›]Løº¤vàH®¤ž^nãõ“÷€X®ËïúÕ­f¹œŒÅ“SÒÇp’ì—¾Zàˆ{zX¯Ó¤‚DïX뿳`mrB0Ç:òœ Æ?§Åòÿ“?݇?9—¶%£ ÉW%ÿÒó²-èƒ'&N%¸G“!v]³äËÏNtÍxÉ…²öå˜MëAmeGGÏã¼›|÷Ç!M©3Ìæ"о–Æ×­JïYK¥ž€Ö^}½ÿa”ω$€/·@ÿ§H¯Ç;ÊÍ™eað$Jr¶ÜN°Ÿ6U(ï?qz¬ÏcúšoaR¸zˆìú#?‘&jÁÈ‚·¿yõ _>Ë2?$g?h!úòckúDN+§wD@¡:ÚzÀ¹sâó¢:./I'Û*PgõôH„½ûÂÜ&/¡AîÄ(ã]Ó*ÝsÒÃ=z®/½óqhAQ¢‘¡,t³ÜnÉࡘ.ÔRý×À>ˆ Bò ÄÑõÀîá3J¶EA¹…¡©{'ËðúÉ$Yù¨d?}sqmd̯¿+º]λ†ˆ oÅJÐûܳRàÃ6à0“:ïG±¯J…]¥Jw™ðèÿ¾”ÛN}J°VÁˆI‘¾Þˆè\u"8e4…„]{´b›·AÁO»Wcÿ„è¦K^½ûŸ2Å}q7uXûÜPC9šl(TAþ3_“¿¯tiÇjXrï·+Ü"@ÆÕ>&Äðö°hâ2 áÝJwVŒMg^½o¶¥å¯Ô:ŠgCz„“ù.‚ý®ßI¦œS¿-Cîµ|Ï«‚Ô:£&nqkn®¨~s½ÿpÛ'Û½x3îè¢z©›“šà"b'ú‰=OЇyÇ>:ñ'/eVØÔ§˜¹òŒ²S˜®œ – È—G§7¯uÄ@3zù®$dª¾Ãa/ l¿ùÆŠBXµvË­!›Jsb-ìø„LÒR­ú=„'‘YÀÖ§·ê&h*ÏÞ2Y‚˜¢ŒË#ÃÔû¼¨[UŽíÖ=ýN¨)§Wü|túéÙë4žŠœ¸7ÿ%.Ä‚1û[4Ü Ü@›´X6‹[‡ï? qé ôXQß+ñ»^h!ñ$Hë4—e–p{Ū0g¬-¾Sö–|Áôœuü{nðÊÅk`Jc‰_•sn5µìхᨦ×Û¼QZ¥fèîµ%ŠÛÇcf'"#ïÁ–¿{ؾÅKa¢ÓvF”àKMxVzjËA’^p/¶C/uZ¯¸#žPyÂè[‡Ñ·ðF7÷£ûv•À… 3 éÂ_Ðà<™w_øOí«ŒÙâ® Ù8’ÍyÓd`U×#ŠÄW#ê¤ÐX"+€P,”Ìܱ““«¾ú/º¯ðNO‘zÿ‡ÑàMàrªÑ7TUPy¯Kþ‹Â=¢úš­å‚•$ Ï(6òo<:ÑvÓHç³·«µï›øKÍ|xáþ³So-ØI ÏeœR6>`њ؀¿j5ñÿqƒƒ‹sº} 90ÿÐpÝÑ7Šý«ráĆ2ÃP Yz/OR§±fX=ƒÎÅï]ëÌe”ºUÿ t÷èßc‰ð€Ì’Un”ò,ºP_k;»-’8Õ'10cm+D±ŽË<ýå\Ó‰6þH_D1㡇»&¥Ô>jeSB‚E*]¼sRÖ•äEAkë‘04̤—]ìÕÜì™ÝŠ2œ+H,!Eò[“§ ÍJ7`tö\*ȧÇÜ®XW6uwê•%í™çQW~”È ­çbYÜqE½÷´LhÁ÷ƒ·¿ßpziàñÿBÍÚQtý÷< ýãMJàŒ•ÞNÖlëX8hB´Ä5õ4Š•—g«d´"k¤\‡Î2cœ‡XÈ™JÆ!½¾£‚Z©ñhB6ãV}ü8GÁJàŽ&óýÜI9‡ÔmTì}œ+ÖÈ*ÇsùÃ/(Ãõ ù37ÕeÚæî,G¥TPªñº°X!ŒÆ¬Äðÿºíƒ{Ýóu®œ>ûL6Þ p¼®IϺnWŠ•ðgÔ k[ /eøMµ³•á,³;ûþÒ—y7©sñ¯{]—Ñ*–\œ¤@äžïB¡osÈæ7’÷ŽR`°y6þ|H¸É”HüpŠÍȆXïdð„‰\žž1´2ø2»yÙ¾..í ÚÇÜÇ6¼žuóô¬pZfHöoðŒº¸Ê:þiR“áñÎ_^â³»Æ`VŽ›©5@FîÃ9lÅ”I…¿X-›–h²@ÍÓX†aÃä¡ÿj\ÑælSiÐHŽ•GJ~¿ FŸu#|PÖ¦Mj¦G뽞 á²ÏX[¿yhüìD‡ÂÁò¨$I½´D@픣-ÔN("΃@>Õ“— 愇)™ÛN€fÖþýê­×ç«KK Ô4uupWæd¶bùÎè­yúrÍodôZÏ’¡üjýã虩ÐTþÿâ#lKKú2(¢©eË|_Á„øò4´]æH c6¥Ï[OU¬KgHÂ+ýµ—ã5ß¿[Ç…€§ïy;æ‘Ãd±³j§.`'úóôˆê6G-ÑÌÙƒS©¶¦Ã\@ñ~´éu«¡:$ÄÞQw <{à;É€YÙ¹¯|‹‰K• ³Ù$s µ$°ÓQ×Ôß^Vóûá,܃lDÌf²>à!Ožt‰Úøv-í·!½i/ò Ú lë•.¤ˆ—s+(-Z%ÔMI*CÛ'$v)ÕÓ|Dvbo鈂¤ xå’k–(IçÞØ•d/2<{5’jYO“Ç! mÒw†6£!?…O¨nˆSäaã\¼G?•.N\CÁ9o Ɇ Rv{=õ†§¿J‚&}QþU¢`Û F‚Tø{H—‰É´ÇQxX¬ˆöü´ßj#ô·— ßßý$äzã 9y7vv•òÚ…âÅm© ´Œÿ€¼¡ÌŸ´Á`Ðw‡ˆ{QqÿF÷yn7áª-sóVý?åOD|/!yúO_—Zí:7tvæÂռǖрÛã P9Þ5½–7›Évè/~4JqQð~«M·(Ç?4-á/tyêÒŽ:õ8œ $[2PÂp¸(Y¼÷‡ºþnºÄÚù9¥Ëƒ ¶åö?Ûü:z5DšÙJp…Ä£¥8Îs~TÒ^yÈâÎï£æ +Út¹63ÎÑõxãä¢Ñ“¤×)÷ùU8ÝM‰Ê3J!PP|a4µ<4Ì{üü Y†…’v6ìì•öÔ>#¨OcÞƒh8¶ë7¬®L2!2&hèQ¼ìÐ1T´ß ¤±ÉžsHl«/ô–u^ªQÇ à.`/ß “D7mïZ‘o9±-: Ž’ëtž¨¶¾$F9ðzÖ2´û^“¦Ž ¯°)¬p$VÞÙAº[ä-x•#»:Rêò6… …>Nň6Ò$«ïb½]¶V¤d–HÞ‹ÇHs#V¢: /ƒ£JiuSwõGW¤"˜WmisÁa½J~þî!=^ÑD#lB‹€5 F ùþ¤¿wɺ}"x½70¯ÅÝ}î’žð| D¨ç>ÁwbÞ£mmwsõ’ŠìŒ6(òTQYIk3óŠÓЕ›ök%¾šë‚‹ ´Ç¸z`¸šw¼íˆkÓ¬Íy§;Ø;'.p¡Üž·Z¤gŒo´ÒAÿóT•~u²V,ÛtÑsjÕg&6zóXÍàÁjŠJ` MI¨ÍŠ $1oùÞuýNn3ßljixGÝËx²xCûd¨lIiFg endstream endobj 53 0 obj << /Type /FontDescriptor /FontName /QMZLHV+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/C/D/H/I/L/N/O/R/S/T/U/W/Y/a/b/c/colon/comma/d/e/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/period/plus/q/quotedblleft/quotedblright/quoteright/r/s/six/slash/t/three/two/u/v/w/x/y/z) /FontFile 52 0 R >> endobj 54 0 obj << /Length1 1666 /Length2 9144 /Length3 0 /Length 10224 /Filter /FlateDecode >> stream xÚ´TØ-ŒS¤¸k ¸w+N‹[[¤Bpw§Hq·âîV\ ¥¸·B ÅÝ™;3÷þÿZï­¬•dzöwöwé4´9eÌíLÁ vP8'P «ªÅà ù¸€@^LFFÜü—“Q s„ØAEÿ ƒà69ü1NÕ Pq²ððxEy„D@/(òŸ@;˜(@ä 1¨rTì `GLFY;{7ÄÒ þØæ?,f¬!Ž?Ò2¶`Ä ¨‚àV`ÛÇŽf €¶ wû¯,âVp¸½(7·‹‹ ÈÖ‘Ëf)ÉÊpÀ­Z`G0ÌløM ²ÿÉŒ “ cqüÓ®mgwÁÀ€Gƒ Ä u|Ìp‚šƒa€Çæmå—u{0ôÏà—pþ𠀇‹çïreÿ.þ‘ 23³³µAÝ PK€Ä PWxÉw…s@Póß G»Ç|3b2} øãä €‚Œ&ôHð/zŽf0ˆ=Ü‘Ëbó›"÷ï2S–‡šËÚÙÚ‚¡pGÌß瓃ÀÀfcwãþóf­¡v.P¿€jnñ›„¹“=·.âàV–û+äÑ„ùÍ @!~Øv5³âþ]^ÇÍü‡“ç·ù‘—‡½=Àâ‘Ø b~üÁôp9ƒp˜ØËãߎÿF˜<<sˆ` ¶„@1ÿ©þh[ü‰/qµÇþþüýÏèQ^ævP·Âÿ¸_n%íW Z¯Ùÿdü·ïùs;W€'?€“W€ ", ¼þ»ÊßüÿÃý«ò×Ù€ÿT†ZØDþ¤ð8»ÿÐpþK,m +à¿;¨Ù=J `ùGù†@ ÙãÏÿ³þÿHùÿ“ýï*ÿ7åÿïœllþp³üáÿÿ¸A¶·¿•ìÜ U»ÇÝ€þo¨>øÏMV›Cœlÿ׫ =n‡ ÔÒæï1B ®`s ÜÌêO ýçËÛ@ ` ;GÈï·ÀÉþïqß̬ßÇÇ»úÃ~\§ÿn)5³3ÿ½w¼‚ rÃ>Ê‹W@àÁó¸ æ`×?” àæ‚ÚÁSô¼v0Ìß7*Äû(¦ß¦?‘0€[ío$ pküD„Ü ¿È#2{Ô?þÇ\Ó¿??€ûñQ°ýWÆ£¦¹Áÿ‚|nËàc¶%ì÷NýðØÂöø¸JÜvÿÔt>¾´ÿr?6„ý ¸ÿ†ºã†[ÁÀÿÄ?Γîb÷¯„Ç8ÿSþ¹ƒaúÿkàfN0ØãCôÇJ<ÞÆð¯ì 6ÜŸ±3 |WØvY%Cé¹õEb’qK?™•ÓcÖîtƒžÀZ™î¿;—IêÆ[Üg9“^ ½óøÙ\‡Ò¯Ùzãyû6Vk|«sî+IÿXþO™Ú>j *NémÏ;O=?käfÄÆl'a\ÂK—^E×Ú¾’o#Á3[šÛ•‚/°nK&8£t# ý §sL3¦ÉèÑàœÔOØ]q§ÎÎ' ²ÆhUbÙ1½ö¢ø <Þ¬òF_M»/•éð:v’3¿!£F>#gòx¾“¨B:ëQT°Iš&i]³ýÀc³Ãâ¾¥¦u Û=6fbe!'ãF&RŽˆ\iQг-¤‹CãÏ8\TYqU>j6uäPƒ<¨ÛÕ ha‰lu]gպ×¼b Ѳ"N¨¥…ö„P#fÕ2á„æmYÜF‘.˜- /Õ7‰à˜ÈS7·û®[¦×¸øí.éÐ -º*O©¸O„:ïn°Ùžš¥Ùõwl:šÛ’#&0Ö×ûKìTµ$dÉa±SFÔfP;‹4S¢RD=KHOÍnæ«×ÀxkT³õ‹5­r§µÏó2´ïÇQ‰nɃLey¶p:~>†úûè«F¤µQ'ůk¢rË!k*¡Ñ÷,Á¹'úåÝ'£ŸNŒò8â\%–ÚÏq±Õl>¾ÉTyy0™-@i,R×Ct/Zø¢… Õó—¦àƒGO`!Ä·dFžc…<óÆ¡ ‰T²ýÐ8Éõgbfß=ó«žÝ}ŸÝ °69ö¹Û›!3xÊF.‰äCõÜ¢ýw?m½*D¯÷¢;—K@'æ@«ÞYq[´i^—ý‘¬Äë`â K~odÿÄÁÌ«*JE+ßHï±ý“)Vq>íq²§Aæ¥H*=3¤/iØ"Î:)ƒ6Ä]˜y²ýNŒÕäœó"3ñÒ¹{ë´¡m®o~åÇ‘¸O¦ÝpehGÄ«žÒ²jŒüå|§1iåûLœGù™úÛ-Ç¥üÖÞA… K§ªž}ÓÕwߨáhÁ—ñq9‡7O³l5JY]™¯7Þ3ñ z˜Ø[ÌXᆑ^ŒÝâ¡GAPî,¨UKÇ [ÕÐËNpŽhª¥ôR‹&H]'Ò^™QÚC>¿ÀîJÁÝMZì–ÒLf"IãGê}Ó;ÅštŸÏNf«ÙËL("¸6§,„– Þb–KG§§}Ì;nJ½bÿ1f¾dô|7‘hâ©Ô@œe!È­á@æc͸ñfc‰ Úû3’T®]H{@ä'T×JlÑ®¼íűƒ×^ZßÇ,¶D¼+¿îÂwmt¯‰ÝéJŒ˜C`R7Rl´+—ž1Óçã,¹ò§Š]ýÒ¨­ØøPë4o÷ðþBx_žú¹dÏò†Jfd­Lkæ—äÒƒ^ ´Ö2¢Tjݰ‰;T·ƒ(23bû‡MZYºMÇ„LÀ¶–"ÂæDÎÕ´âa„q¸òƒŒ+ÛHÃÝ¢%­2™’¯6U©˜V—¾îªïžÍÇ(Õù²q^KBõo\DA:½Bñd× .cñ>¬RÍȲOV²õL‰„Œ×­Ó2‹ÏTÄÊÌžbªu~`;y:¥HÕù1uÞ3-nª‡&T7ÿÁl´b%wg¨ÈfÊg-^pÂ*UÕƒw~¥þkV í›UgÝÓÔu›6 OFV½&ÛÖÙÒ j ¦6æ÷2’S•èÇäÀ·Ôy#5q)¨nÑ>óžZþ¹Q‚½u™ÃIÏ“Þ ½S¾ @÷# ñLæM¢¸«…Ý2b?$K ñcI? ÿàg‰£jã’@ü¥5Éœ°b¶/›Ø`wMp}å\#1‚¯8Ç/G-šäoÜð¾>g2+†©™ÿÈ~¶îu»&F¦É~ol…›f-}¤ýv$z‹VÖÆØmÄk¡ÓADºe|ü°Œ!]Ýzÿ=»Ñ3ÜE5oF$²¢A̲™)n-ÜŠ^)–P"4 ÄŸ×ÈŸ¤µ DÖ*ð©|ÒmfK·žx–CÊs”m1 2™°,D»e†C ¦ýՀީ•0†j«ÁÇsú–IR§}̺jíÉ.Ì)¨êµ´*4¼Ñ鋾 £®¦0õ©‹"Ÿ%µï½X–yZӢͰÆ(E3ïv¼îÚÉ™S§àz²ìL#Eßk3f­ÓÈŠwYv3<Ôª%P¯—÷ïÙãEÕïë¹GL.¤¾OfMFo#ñ7Eוª`â>ÇŽd(} š®R"Ɖõ±’(k~ ?_CKºqößDŸRœß”†G9¼ Ž”\zo¯LZÎXÅBóêÔ9ax[È‹§NѦT¦òÅB…/"­`þ“ÄD£ø.<öÔëÕj›ØÓ·‚Ä'̉ä?¿ò-šX³é`7°Teöà hÍqt±È—ïɨÐñ9Š¢‚Ùdr,æ`£¾¹/”w¬S´­3ûZrÄÅõíJ;¤;tò8]R³#„©™2qÀµbëçH³;4§#4ØZ¶¨ÊÂAŸs>á.@Ð!Ì-ÙžëÜòÍ›lœòý)>QÞøüѼ¥B ‹ø¹íÎ~U«—ê$ŽYñšXª zmW!åÜKøZí »JRÿF%aŸ S6Ã^ÚMŒ8–Ágö¸cUÈPŠ€ÓwU\:› Xg!d;L¥ø!Â[SYîÕ}Šv¡"#SôƤåW¾Zxù„®!žoèŒûp?¹Èƒf-ª'~ 5BlÒ£øù)¹M+Ôö˜)RΑ_|ëæÛjÇ?:Þ­ö+U·S‘HI­m“4.$qΚŒqc£DgV¶…7MVˆš«=;HòÏûðr’r¤åšÝCtkN×®……ø!Í'4µží(ͯcSd;›T»¢OΜÐz®‡"Δ¡êZïh ¸ÄžÈïe%Ž]VR …õ*•+p¨7¢ 2¯¯áÛäÖÒ§a>«©ÿ [xæ BÀV×É|¢·ÅÙÊÒH§Rßøæ“Û«Œö":£J÷ÙEéY®ßâ+blý0„1Î÷ñr/ëÞÂæ•¶vË,ý +¹i`ß ýñv,G+5ã#\eæ?:;]³§dîÌ~ö%·ŒåäÞ¾6_b dͼ´‹27 ÍÍ•Q½Ö0 Œ æ„æÇ†ìVÂQ⌞Õ„õÛX2 M‚‹’ÊqwMÌ ÇÙÔå1bžVëêX]“/Ù8wˆ´R¾eE¼š"a°—MKíÿIÇ>ÂÒ¤1ݶ q£§nŸ3<7“5i™Î^¦E÷ÖøV ”½–aécÞ åQIÅbŦ¨$ü0)1 •’·Ž^9àç†V^ý`fýü–žú“׋×9•ìõæ3’ÆfËz‚ý@ù7ýpŽÁ;"BrÖ2È92Ø N[[>™%ÅÿH ~.p϶Ý˜äº m—¦í’¿A’ÓxlÉ3)Ÿ}Û3n‚Îw‚°^—H_æäZ?[­p‘ê²ïY«{ï¹[ƒ×gPë¤{Ëh›ì5‡ÕxÜšcÇmpÄOH±Ï5͇Ë~Ãuo>ƒâ{ ìµöt+:^ERq0Mû-ìRÒVRô—Ç,n~Íåyù¼ªtŒà™Êf býaçÉ}ÏQµ=))x@„ðåU ~ì ¡7/åèAy §ÛÊ,dÊûÐTu-À…Iñ¼Ô²Ng”£å†?Ä%‡u”¦ÐvÐùÅ !-£úÒy!6(uôuÆÎËëòÚjAÄ1>vÃø@$ÀŸ}t4ëq;¨­áÚéLúÄz”3hßÞ><-ÁYí-¬çNJÑ7Ãô{ºÅ?'å+\KÉÝ2ƒ¦×²QYx:_ØÜsìçŸÇf¬àEAûL [ƒr;ºÉ—íöÀ;‘¶ÇûÝá‡ô¸' ÎTzýÚ°‡s\xè†Ì¯sÏû£Oßø‡gFQ‡…Îxnˆ0¡§·÷á,[À„p×|5Û¼¡œ€—aš[ûÜáHíTdñþ¾êZNàBÒ[É-ÅÞ1¬w„ëÊwŸ+9Þé÷û@¢µPá$Tçðt¯õò­ fpx*_Ýâ!¹,.ð'EcÏÄ©W˜®F€¢Ö ¥èJW7åV}XÌÛë[nþ¥¹d`ø Å“aœ‘Ä«§´–-ŸÐQmtoíœ î³Øñké5Ý%zŠtĉUµ“·ëGBœm—7kIÏ®zZ³j'ˆŒÊ$4d½oßò.LYß2ýìGÂÚW+ ÍÆ¡('^F¶5-º¸[bÏ1ÂohÉWÒ2ÁtÚëž¼Ññ _Å¢fb Ä¾|¢gŠïbB.X½­RGæU™e" ¿iIÊRµ¬¨{]›¿|îÔÄâ’<ØÇ˜VTaÃ=˜ú¤ô$Ú‘uí·ë(€¨Eú¾V“NŽüI”|aQÙ»¹tÀ»\•ß ™å£3R庆òEì nÜô­Ì°öž½oÏs±§/{wT%ƒr]ŽñÅD[˰á5 N5ׄ‹Ú*élu¬õ–a©÷²“Ò³]aœ15¡Z€3î ·2) –¥ØN*@ÛE jï%W ÜG¿þyêv¶ ²Èð-J—á“’?æÒÂËzŽƒ¸‚ºå—„j6¦ë©~\ÄÞ¬KÍP—˜ ‹© „ÆÜÕ}0IÈãX]ãž:4†‰ HQˆ ÏâJj¦«Í*¾ ”­\¤ÇZ&ÛKxO¾ÅLN)J²|®sÒoŸ,p÷LÓ©ÛÐSVݨ´`[É ì&F1û^±`,ž”®%0êÌéRÁ¶¥Š;÷>ôê$‘Ç_/÷#6$Dj3×_å¹EP6yÆOj­HèM¥guüVX,AˆÙ”–}Þm˜ÂŸ8g¢gµI_²xí¥‘Ý†m“褣é`©&¥j”Wû›ØO…昸GzÜ3§¥‡ºb‡³§Æa~&ÿ%ŸQKïY±QV¢Î^rÌè‘8pãV¬ žûäó¨|))f‹š­ê(~iÒØåÈffy&=çmkmá\$+¼4<@üô©ˆŽýé÷Æø#ýÈ…Ù!ûÆRކ͗¥µB5ùöOIÌ¥¿³ju=XI-ØÙK=ÛsÍKr ¸lKÙ¹×§5.>Q^wR{®„˼‡X{MÚ§§_BI÷Jp œúªõ„ÛÇËñÒm4#uŸå›—OØ~;°sÓq>9´í 5lû”ô{•ã@žâS·PÃ|RÙc„lV?¦•N[Õ0FJ”ì‘ôTC™Ž®¯#ÇBö²eÙy/ Tž7ÏÎñÏÒ´¼¯òlÅ¢Ë1œ5ÖY +o7¶4Èqk,Œß«Ãý|Þ7omÙX´ÉX£¯çHÍd­ÕÓz5H‡¾k¬Ùx@->Ñ'bú^ÄŠúìêˬoUjäÌ {)ÃP ï6ämJñó wg”*#ÙÝ#3ö_¿ñÈ–À:T¶€á«úŠ-UJ`s[ðEάáèà=š]?í·“èÛ=ÌbŽƒ¶´¼ùPàs,záÓ|ã öl®]øÛú fßݬ '_ 3al“øküúAö³ ÙXTºÔœ‘ EãþÏÃ(OY‘Á Ù)¹˜ õO‡0ódÔœåµ/|»È“=- k?¸O<'Tµ®9M")W+±‹Å·U¯=û²z,½}/^œJ ªmŽYìÚæЦü,)Rläq÷\⛺fÙ}#}ìOÍj_Ù½—{åDK”›©ˆÕLcÊ«Š.ºÆž½\h}{å*Ü,³“$Õ&H0Ô"ÎAËvK’Ÿ\ÃõKëFNé |7v«#ÂCv _«l˜?5Òñìw¦¸¯ê«†k—¨Š‰G>R".QLX§]¥Ý÷F=OEqìDõN_ÒÊäÍ(dÌY×q›žmìÔ8+/]l!5b!çh,œd ÊUOý8¹±¾tL̵’lH5 ŠÍEkT±x¿cÔ¨n’ÄŬWÔ·Ixé7.…”’²Yxõñe)¶˜©+ÜÊé ©F1˜/Ò?jŠñ:ZÄÌP›^‘…~»o½äêî¬>xmu¨³‹(aÁ=…*2+‰>~Ó—²‰h¡) Do])<%îl¼>ŠGq!ëBÉ5|ý5nÛ®NÍèDé¢c g½v$Zi—lmM¶ƒ(¦?²ˆˆ+Ø ÍHkÒÃ]¶9¤EÊM½E{†k›}Uç™É­ ýÀ£ß:6ÝšW&Mr‹‰*À¸fi‡\Ë}\Â?l7‘õÒòÌR<³kˆés sñÊã‰hŽI:Üžçé-Û9,ºØj6ñŠjní¤Án$ Õ¯WÔß´øÖ®exÙÕÌÒ¯;#(bÈŸÅpáæ|™|£¦æ/GI½ÑýÖŠŒ82Ï“–àðÅwI‰.–k×Ä“’ìèÁìü­nÓÒEÄ˨Ñ_ŸOÿ2xMÛÔöá £ŒšÓä?2!ìCìÑh,]A!§gñ™–ž*LÜÿ]ÔE©K˜"«¥H*Í„ÛkØ;nÔ™aª¿’C—«¶\`?O êùŒ³xßfó~ Ú:‰)/…]g¾# =ª:¡ÆßšÚÓÄC‘ÈÛDˆÝ!ZÉЯ§D&ö ‰µ•ÕkkÔ„ßSndT„¿Y)!ÀןZçùY“Ÿvp[Vœø xlî©ÝæÖµœ/ {Z\Q*‘ ZBGÛ fÑYͧHºÙj–U 콈 ¾{aŽñf}Á–3\êИ»¦¾ý4[ÿ]F’F_¬¢½vîÒ(]ñMôϾšùWÆa¥/Í—_Ä?I æ’@^›D=šÎä¼;êØ;ÒâÓQæ F˜ZHQ_›:ûH©;÷… ‰ˆ¾_‡·/mלþK†3ê!Ö-Gó“'ŽˆøÅîÑŒ?ß²Éâ]xÿvÙwBKïÞ@Ÿ´{‡-y¿È$h!{±¾ íÔªXÀŸPœF §KÀz>36ápØ 0±}lÄÖçû(þy½îPUÿõÜ@ÿUiB3g½½É”hwïí —=üäWe{:U¶©¬f7ïŽò‹³ªÐ‘gkú¦"1{g×éÙC±!›¨eÒùü¹&œóK´1`tFlñ.Þ[dU?ë …e–Nî-~!Ç…²=‘‰U©¼º¥nïøöÄ/[À2E ~Dëaí´e?bN—Í }žB וœ/ýÁ ˜ö\êÝ}7ß4òÕ’¹BX¸”÷¹“ fàä† VSíŸÈꉼQ&.ds­” F3ð¢ÏšQBå£ÇJÆqpä{\gðjÖ¨®áäeúxÁÖÒ<…èE‰OÖ Ÿ,Él[çÆ9§[sP¥Rd‹+³9AeÓk] ñ8â7¦«÷>ƒô²äVÏMj¶aš ìÿìœ2a¦ï")¯™#̰´nv ˆ”>=uúXUfèÄÙ¯;MÕ/%ÛgaòÅþœÖÉ‹ Óí‰%9z~°û9×n›Uoާý"†ƒõy ™F‹D0Õ¼h¼K^yƒ糸֘./·VÇ‚?Üy ^ïvö§;}¡Ù¥‰¢#±P a©.˜ûÞ¤k¹—pNêB¡)Lw;+lÅõÆÙðÙriVÝ?ÈL“ `¤ƒÔs¤žáV ¹°¼/J³‰'‘×óR%ò ef c8!JSî}á”*[Îê:»l?ó'ÇA ”-û g §qþe'ãÌ¥'¶Q€P[^åÌ Öòý‚ÛCJ.‘ò1{Ftö©«_y/óëІñµs Ã~À^þÈ"îï^ÿ®ôN‘Ž–µª¾ØÆ ÀH{ºQ- ÜÙ )Ó³@ó‰~rêB€/yº¦æ^À ÏUùúq¹3ç Hòßà.z¼±·Ñü%÷ãà¼ÂÎÈ}Û ³ vAØÜDŠ„ý¥…"!U©ìøpáFŒ½ ´lêIBxa¿`ñG]#:£Ü¤…æ'ÂÇc›E:çx 5Ú簶¾‰ÀnÇb›+JM`LsÆù‚™_—G¹Ã—´õ´‚ì蜞ô™t­"}­é Ô BÒJü+n•ÆíùÇø¾ÞŽÓj`¸_èJ&õnÆôO”ë;Ξ¯·>Wßîžè•ô ’i/Ú¦¨£³[‡”kö Jaãñö'vÈh+‡ü¡Ç =Zøë3H,7EÇÝô^a*uêâ É‹[¦§h·Y×)ZÆܦ²îÄ~øw„Sãà…ävçkè1uI3ÎÃÚñ.¢ŽñZz  ÔjÕ‚cEjMb§u{¾íÊh³)(Š>?½žÿEûŠÆ» çÞ³#¼{«_¸¿xPŒ°Y÷ ßÓo${Ðø•\O‹¼Ï<4θQk&»N!-±F÷³à$íj®a½á ÌLþ-Ý:MÅ Á ôQÒomî—]G5Šl»ýNzüþ~¬£¶‰*ýÝhö´Ë FOøå3EêëÃõ½¶KÊóν¤/LÉù<ݾè1Úç'Ô1NŸ¨-ŸK@ºÝuŒõ±M°Îî¸C’³1ðpØwâ`åuXôCLV,žÖ´/»9ÄVKÞ-1,˜T}YU2}Æø3—Þ"ÙÄ%Å’Dq­·þ‚8·³|c‚ bœ»“nGzñÚ<ý]É%æ”9}tOþÐù÷³éVw®‘RÞŸ¡ Û—´íûF™«€9‰ë·?²%a\FÁŽ)ôÀÝ^õ(9&ÖÌ~©óâ§2ªUòÒ‰ñaþ¼Ö U¿ûüŒ‘·\µÏ¬ß,Öö;h†oxâ:yøI×gG—ò¥eA£:ÕWþPÇW›(>krkñè¶(Á׺ծéÎZpçÙâͧõêgN|Y©ØÌë`yi ˜ëš ²Ac:ã 1Oí;Úä‡íƘ$ŒÝ&W-Èú$ØnžWÓg•<˾…´¢ÚzV6Ã^씆ºlòe_7C-:3TixïòR¼h–ƪ¶YqŒf>µ k´µž°ÊD ô5 hÂ)P_‡¨„ä0:0}BC²Û´çײãI„[ÿPÊaÃ'}EX˜ðYŸ¿ÜûÆHàžÁ¥§¡“Ùmíëeðv˱ªàÈ Å‡.þ˜wC†Ë63¶`92¬Â篹Çñ7oº¤Ý® ç ƒ*bsf?¾¼¸›TÓn¿ÊG5±Ÿ’lzF×¶œ?äf¥2n„ÓÛít9ø6 òYA\lÒmf²³{ÐÛÙUu•³¢(M²(%J¼"<Î4Û³ºomÆKêL—¹ZUvQw²ßÔø(:–|å!Ö)dVÕJ+Ù8÷ƒá#n³Ë)â¼·Èf²…Ž>TÖ•â`½zÛ’ë7ý,†ºÅ}$ÙzBS¡9RrÓ»:lúD¿QÓwcx/ˆ™pã ØÇ=Aàܰ3[\Š"€"«ò“"©T»Í•XÌýa1T…ršžàu‚Ó/§]®cëwF’iÑ´M (ÚK‰¶qpí-ÆGÏU"û1–ˆ"ŽÅ÷é>ä?ÌP8V4²gS¦Ï)HsªÐ?(Úƒ£­…‰=”Ά‚-W%œ)Ká¿N”ù³pæ~êí±´â´¿¦/M|[C+½ë=‘ÛQ ô—By(§«WŒèëÇ 5”iHäcZnµ2i*„`Ê•åm÷š½”cRÃoU:,?#­±ÿìÝëpV"Ôò Åöæ©ý,Öi.¡Ë `N…¯J ;lûm1~ÙB7MSqÙ¦%I¤žNç‹• e¯eDðôá\õϳŠÔ÷&\8ÜA„Xî_î÷,jƒÎ‡Ax½÷6J¸vGB U|ñþÂ6[Ý èTÈ}·7ÍY¸…4Ñ—™Žÿ¾¨3t¥0(—1ú‰tkYlâ´Zˆ\ö¥Ò†ünQ÷¹][C͵5Œ¯öt~ÿã8=²¿ ?Ö”¢*SÈå׌W3ï’?.Ẹ̀ؾÁ}Ç%ðs7Ê›UŒyKÆ8Žœ9@£ŒçùQ1·<°ép¨Á±Jáǧ%ïò¡pMJ,ÑÍänä-Ç™ò¶ Ç ?2ùfÄ:↺Ժ•;x8~4Í`¤å¯mSÿ^²xA¨þkÍTc'Að‚U|›â: 3ÊEÔÑD´|ßÛ#‘M,0û„kÖ5 –N©Ó¹!œ³úRôE!Agþ•M„3Åtm¶J; ‹6l@Ÿ*suÓ©1vþöÄñ€¡ˆkqß4ÂäìÐ#°\ßßZdÎÆC©cSù4ý¸Ê*Ó`¼&¿Ã{–,,óU{}ZÌíp%®Ñ4 j&Ä¥róú@ài ²Ú²æ§ýöìÄ~{âWh¦ÚKѾÓB¡b- E£ô¼Ùµ&Ãô*c÷â÷ôûŠXG- ÈÖÈŠ¸á&…S‹ÈêÏõ0Y1Š·NBHÖÉw²ôÕ¨¼;0{9ò§‘G5×hš <›ý× Ø8†ýÙ-’ÃÌéøoùêŽÎê¿·ÖûfÃ?ÝŒ.y›ã\•O¦4Í5ðÚÙÕs±Ù¢¤Ñ+r“ÕD尘͋:ˆ-ýÄÇÛwÙöK¹mWn÷’ÊEÔƒÀ°"˜>ÿ—§îQ÷i‘ØK)T‘¬ê,žøÎ9t‘6opÊëXoÁòsÄZƒ`§j¼"t„T–Ëuß^èe¿6Y•È`ôtÊÓbÖëÉÏX°¾í¹Š@”@Ï1@ªV_¥Cñ;~à –A—•…í$¯j)37 Ÿ¡J6À2ø.†ë9PI=²ZÆõIbÅ‚·Vî UBÌPôÑ£š!ê´g£,ƒ— 2ØŸ1_u"]ÆÉ./Ó!#ùt¯—j¦=ë¬(ôk!œï\À;Ó×NÞS¸¯TˆHüGv¹ÒÜjtí(›V¦uŸŠ‡Åîk•—xæ1üÎýÿßKÂ! endstream endobj 55 0 obj << /Type /FontDescriptor /FontName /HSXFRY+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/H/N/P/a/acute/b/comma/e/g/grave/m/o/one/r/s/three/two/v/zero) /FontFile 54 0 R >> endobj 56 0 obj << /Length1 1653 /Length2 9097 /Length3 0 /Length 10162 /Filter /FlateDecode >> stream xÚ¶PØ-J‚<¸4îÁÝÝÝ 4Ò»»wwîî .Á%‚w“™;3÷þ_õ^uÝkëYû¬} %UaSÈG ìÈÀÂÈÌ•Waá03³123³"RP¨­™)4€ö ˜ç_¢ö@cÇ›˜±ãKœ< q²°°X>ð°pò03X™™¹ÿ±çˆ;ƒLòŒè€H! ±u³™[8¾´ùÏOµ €…››“þw:@Øh21ä-€6/MŒ­ªÐÑí¿JPóY8:Úò01¹¸¸0Û80BìÍhè. G € Ðhï 4üA `lü“#"@Íäð§]bæèbl¼¬A&@°ÃK†ØhxiP•–(ÚÁËý@øk6F–¿Ëý•ýG!øw²±‰ ÄÆÖì›Ì@Ö@€¢„££«#=ÀlúG ±µä%ߨÙdmüñ%à÷ÉÂÊã‚Ñs0±Ù::0:€¬ÿ ÈôG™—)‹ƒME!66@°£âçÙM^ÆîÆôçÍZ!.`¿€ljö S'[&u0ÈÎ (-öWÈ‹ ñ›9ÐÀÁÌÌÌÉÍÚ€®&L”Ws³þv²üa~aàåa ±˜½zÌ€/_ˆÆÎ@€£½ÐËãߎÿFˆ,,S‰#à#ÐFü§ú‹hö'~¹|{+@—ùE{,æ?>ÿÒ‘—)líöOøïûeÒДÒÔ§û“ñß>ˆ+Àƒ ÀÀÊÁ àfçp²s¼þ»ÊßüÿÃý·UÉô×Ù˜ÿ)( 6ƒ¸ÿ¤ð2»ÿÐpþKÔm à¿;(@^¤ Pÿ£|=ff“—?,ÿÏúÿòÿ'û?ªüß”ÿ¿’p²¶þí¦þíÿÿ¸m@Ön¼(ÙÉñe+ä!/»þßPMàŸ›,49Ùü¯WÚÑøe;„ÁæÖä rš*M,þ”Ðn᥼5 T‚8€þxk ,ÌÌÿã{Ù7«—÷Äáå®~»€/ëôß-ÅÁ&Ó?öŽ•ãÀØÞÞØ ‘ùE^¬–—5ºþV6€‰ q|I¼Ðó˜Aìÿ¸Q.v“ڦ߈›Àdüâ0™üX^4Éüd0™ÿ ¾²øä0þ_ [ý r˜¬ÿ,Ì&ð¿àK#È¿ +€ÉöoÈþkûòŽ­fŽÿXYþ²þ)·r_Neÿ/ør*‡¿áËL™]þÝé…°Ëoø_36q²©ìø{ ^.à?ø÷CºM—æ!&¼–µí7ÕÂø. »ü3»š)4 KöNwÈð‰4UþëöW‰_zQW¶Å©/…–‰=~¶ÔÇ´Æ+·Ý{>ƪLí¶!.~Åœ,ø)\7@ø†€AMè»ç£§†ŸtË«.Š;'.d¥<Œ—~I׺²ocÁó»Êß«>È"=”M3D©GêùÏRä~ÌœÃ!…sd D E?uE™½¼šAÏž|&–‰¥Cô:Œb+ôÐÙ`ýt;ç¾Z¡ÆêÐKŽ«ƒC}‰>6Eé!²Ÿ$ƒ½àQRÚÌ8Êš÷(“©†¸(CBm°ëÛça9!Û/vxµNé îý~íë‡pê.Ñ.Zñ]3H[Òµ‡¿ÕF™’ðÑä5ªÎU—ç͜ӑÌTqè£ï»1æÎµ–ðOïí“1©y4t²Êb¼è\U z:OÍóÄÂìû¸D´Ñ´‘Ö•f%—órPa¿)¥rv¢¬¦÷|O0Š0D8koÃEâE¶ñ绉œ—P“ߺŸÔ(,‘—z½I¶³0å¦#Ù‘`ò+’D­Zk3ùÚËÜÊŽ;S ûðVì¥Gå#“°GèÀM°JÐÑ-fR/å¶æÜÁ%»ßþ­ë–Åtû:{H¡´K’í»‘8¾,1®ùSm6 ì}ç´¡©ÏÒDŒA¯«¡êµúò}ôëC­š‘¿èÕêæˆ?!­1ލ™Áá¸C£6½#Vá†â£)›È¢$èVŒ¿ö­§Ë67žXV9&ç;µ‘ôͤñ!˜Ù¬CÁ«è5†‚Çp­ê1Š›žM×籠)9ìñBÛ˜×Tµg /»Š«F§&\t{呛Ǚµ(€‘Ó·Œ‹p-ôÚ½¬j?(Švƒž ré-¯šáõÏL˜y¯Ûo¾›ïu(RB&#š½ýÎÂùÝKõ‰+¡Wç¬Ïcõ‘ ãc=Â%‡¯GÂoQø—¾¼ãÆDz@÷j†0AMÕ×—Á[ÇýÔQÏÿ†1ç×¢ ètHê]ñe+–BOˆñ¥¸©ÙIHDxžNæœØê$ƒ‡›A¢r+f¶  ±¯KŒ$²¸ÏÆ[žŽýLDO<žnƒ•÷—î†Ò.9#‹f¾B÷ß7|}*(ø’£5«$:ôƒ¥«'/ðo? MEL8¸L&Há +ÒrËL“¾®ÉuÁˆ¼ü<°)@cVœÖ÷2ŠY®Ã=u€³Ùæ1¤,y"„U½Þïù”æá¼jC÷àJ6¦˜¬0”­6\bF0†ÍãÍÐß6ˆêŰÊû¤^çÉQ 1ŒZurw?!_ìÀEÞÊâÉöéð;Œ1" Dc-âUzkbKÿ%äé(‹7MðÕQÓªG](+‹ÓŒÍVO^ìyRœX÷ÙÊ¥¬†AgÂæ§¨‹¾„¢Ò¹•~MÓñ4sÒèòr·Ê<ÆÛ-Ã…žˆØ9IᎫcd”ØüÂ/m‰%.ÅšÚj½kƒ۾ǎ$gž³Ãtð´ôS‹Ü(Znå>&l…hiGøkœ–ôŠ®3!M—+)jN¡Í˲}Êʉ^TçZÒê…PÑ¶ÞØ%ï|ãæ{J§[!mW¶+“øò~Î ÷ಕÁ¹CÍÓv;¬zX†ÙÈŠeì-'·À¡ô ŸÑø_z¢ ÈéjÂãª^ +Þ·×*„óËRûzž1G˜[øëÒ¾!ß]Ú¼ÁÍ fÙQ±`µÔr¤ºå@ɯ£ç+js'É;V7pœ }³ ¹EOÝÐO Šfé"45ÐêS¢fâ\Œuï¤5™=Ö¶†$g‹Žƒöß4`ˆÔ\‡‰`¨àÚ’Y´­Â¡!tmÉ®‡\vÉ_\-yª‹…¯¥–ÏEÐŽÑ,öL+¹ÚtfUۼߌàšdÒQÃ}ÏÙ¡(Âä„ùÖåF‹ÕïÚ[sD#¢Ð`pm!:8«ïéf«ñ–èîç³tÍm KwÊb(³üª¾‡Yóÿئq =: RÙkT ¿·–ùYãv¯ÐˆƒIÀ½ñ#çRÖ#•åž4.}9h²Ï~?µÝÛɸ<3ÆZ@#¤Y™O¥ ^¾DÁ;~¾DÇÌ/NSFK£”¼¤›oÎo]O;¯º u~;äÒž¡‡g­¬9ëFû¤¤C±‚îYÒå ½~ÉÉÜëu@¼E-e-ŽV½S[3¦c6l°mG$æ”.Œc–ª…a*üÐèY|…ó‘ßz :@1 LÊ'7Rqô ˜@0¤šÄù§–çňõåE>â9“†[-Â&¾›ׯ]­gÑ´ìfùã-¹mÒnÒ”Õ\h& ÐØp#¼¼ ‡¡ö”¿]ABñ­ {­+Èòc«ÊTÛ¤QNr9é„—>N 1Z\`¸kA·*Õ«[ö æéeD?x™u×±ÝÖ÷L¹Xuþè¨þÅĉLèlßê™´—\wt˜ªngå…lÚú~| ;µ\?áqÂAeD2F6cq)6's¶u²¥Ædhët-PúžÞu¤GÓ§ï›FŠë”Õæ„˜ y¿aûU”KˆŒphckC*ñ4@ðË$ß­ ³—î*gúL.OÕ¦^K½ °¸?ñÜ…mJ-gS}“UfÆgtXzXÑîR; q©rÅ(é†y*Í/#•³ðƒ!«<¿&6¥¬¹ç×*†¶ñ¥²c¨ •ˆ#Ú›S‰¥-,ÝNS#L+_MV'žòOÄEæÞ‹Pþ>é¯eº-ê6‡¬;%×ΑL·±ºZÉáÁ?R¥•ãSÑò ö»iÚãùõÌ•2 *š~¹Ñ6 b¿i¤}*¨ÛiÞEñ5þ[iØ`Ùûm¸õÄ·Jw9Œ” ž{‡b“Žq¸Ýdþ7DO(gE\ºÏc;´¢À¼4C²,'¯în‹ÍRnåô¬—7üLžö$'-¼ZïºQ^é¸'šºóÃJã!UUÚèê^`„uêWŸ#ÂM.ëFÀnˆWœáéV6N¨ö}ç™{|¦Çù›zˆ/ºÿÑ vòí’ãnÏkÔY3<ü9<¸æ –bDh?ÿ¼%ŠM¢lÍXÛPtf[DÓ9r¡4ÒO<´ŠÑÌ?d€Ë%ñMþ½= ™ÊøVåÁZÙ¾Ö­WÚn‚™%£Kòe˜¸Î ÛËUÒÀÂi|xh¿¦dAÁz·QÖå’º¤™ã¢¼äÝ>¹%peް‡Ô ÊÓ…èˆqÓÁkjåçÝf“·Íi&cb!ÜÒm0"3y׺L¢±×–节ä$錆ªn;ú§Õ,ë|$·,±¯Î¡­\$ämÝyf¬Ó»ï—u>ºñ’0C¹Ii® ¨4G¡ Îr F\^ÍÍwn±& Œ=œ.£¨ËLß¹,yæ1æÏtÙ–©OY‡›” è]11Ý­mº‚« •ÐäûÆù]гõd¥:&E.:ABÏn¯î@×(W„X Ã.XE²1[éWøäp©ÄÊ£‚àÁÐ*ABCèFÝ9çw·&.j¼ãî–ãZ¡ sZI,âã€÷MûàˆV¸PPkûiŠU¥z½N“1Ì:(µ•µ5îèS•m[S“mÃJEê¬Qz,ÑRåO~˜)ÙíÍfôó¸J0·|ÿÌ÷´ãBÓ7óý ?bí÷µªKܸoÉ2^MíÛ„Áá×VˆË k‹sD+}Ù UÔP>T"+kŸÐ ™:QINdóœ޲}ùtÐÃÉ·ƒ4G4<°D÷IYBKᨮՉ)_\¬Æ ÷jQÞ—®£'‡$˜À|®l„»€F®èŸKFTyŸæ=ÌÝ,ªÚ&ß]Óz¹Ç¸Œ¼ +#…™Œ9<Ň'©¨ÎniZÙ^gÊõEŒ`WOiÔÓTζœ¬Ô˜<¬Ë™|ýšÕ¼¼l R¥–£ÆÚ. ¯•¸ÿ2ò$Ppnvavóµdz“hë §eÅ&„òÍbJÐW§ƒÏïHl ³zLœµ|éߌ{[†Örˆ ‡øŠBç1è± Gõ©{¦^ˆT ©Š¸¬ûóƒ%·|^S?¦bv{ò݃íËµŽ‚³4ÊÕ'ÄBÖrUkDk»¶~èyõ¬#ºÂ¡Và§å’áÉ2sa\¤]पðæ8H”‹!÷ì¹e»ßJrã_¿îˆÎ{pÖ‰W„†k ûb¾ùJçŠYäs­)Ö­ÏLvÜVõµ‡@|jS—ZAe“àr±f_cªó­ž·ªïB±™/2J¦àDZ6¼ßúQ‹F4˜Jðñ ÊÇnî_z¶#qª9˜}Ô, 75Ù.~ð />ú~øN©™1adöºjUR4§Ë:?S¹…ÞšY^#ä1Li” •z¡á1åÓá˜d•éÕÛ­îe¹ó1XÓ±@–`…žìJœë·×˜ê° lúOòPo“¡2R~yj“6À¼ù)ýꜞìb.\Neƒ©¨8Ñ2–qµá$ðnɶ/=Úu}˵\5ÊÆeÂò¨d›Ò‡~Õ¢¡’Ð/àÖT¯¯s‚–C£ß@m,}‹2n ,ßû¦fÑoæAÙ -è­·\ò—‡ïŸ²›„F¯dœ/ébÝuÓä†s®-ŸTÝ™wÈ]’Å£ÊÂ1µ7‘­%¡Þä¥&{oYD‘FìÅÕvi|– ÐSWç½,SúÀòf»%?×yoc¤‰=ž¸Ó–ÔI–lááD½LÃø(gt’+J:,à›·}“-™„Ž¿=®zu^ÆAU‚5qšè­'ÎLÓHc[§ÌXUÿB07º°t(?ž°ØÁ§STvŒAÀUÑFºJùn¨‡!È,Øp"0‡Sb×SI'˧ðÞ"û1ðú§â鑾HiŸ^ë§4ƒ¡‹n]$£u‘Èrìäd›3<€H¨d0n=šÜnXüíà4Ü=}ÍG^ãªK\œÈZ®Nð¨MfDkí—çÛdˆ6k¸D—+±°R»¬T2¦ï¸KC=3ñ'µÛ»7!'=~È)ÿK0 =é_ïÆ2ìM¤#¨ã¿Vix„·ÁnÏÞ@­=c _VV|ü0ã•n“Ž–vxü.päTQx%mÕœWÅZUp^Ï,°vt{%ƒ£ð*ZÈÊ:\<¬‡&ëz–»xNèz]u Flu×óÊÚŽÎSÔÝ©?“™ŸkѤéeoäôÆÝ_šð –ÇS/¥7¡aÞ ¥Ë{?¶~››æý~£*õŒÏ4þe×ŲÞNÙŬÄ6©C¢ì[ómµL”´××^þc"£‡_4GùfÏ~ŠL›"ç°s˰úZ0ÏWà¬Â›åãÊÆ×†l3a~¢éUÈn»‚ăªdÈSMo|Uµy"ó½A? ¤,'5¢ˆr©kÏîò¬%Bˆéz5¬xÆ8Óšzrxµ3‡^3‰\ñÖ†¦7ÝÙl–8óãÛ¦î\ ‹#Õjx€x1­9"äZG1Þ°dˆò1T…¯#$p¸oV#)YLƒÉÒ±IÂWDøáj.ž·–ô±BxF`%¹Àwõbv [?áäó1Êf•e>¢N¤}6PKŸixÛgivö¸¦M~YÜAÅr,GЇÊkJ·N.«e¸š ÏÊœÙ#ôwͽǖêÄ£‡­ìÅ §)h¤>ÈÖUÖô“.é¶©gª3¾g‹³5z Òžt;ç|£1RrüÅÁ¥~º&rŽ\£ÍÂ݇’=wçìƒâéiS¾V{{7iaz!´VvÅ}}¥ðŸERE£ ÍI.å‰ .æŒýÙ葺!ܧj£Y÷=ÙWŸƒ4âÑ^Üyi7”쎚`ÙâWnF¿Z·µªŒVc+wj¡L˜wò»Hè/»áRº7«|3ÜáeZÿ#ï¬*;å÷'Žv\þJmÝN¿.eVÝÆªâ†ô©‡ÓþŒ¥Ç ã¾²áð0þŸ³ïè2ýçrÁ\ʯ>s¹)ÁöŒßýB!·ÝE²htÊ';]©Ïr¦Åä¡ZËÏ®…è/IÅ·XÚ‰Uo' f‰ÂcÓ7Û?|Ïù#n²•-ÀNþL «Wo…(W¿–(S„?:ùªËùúÎÂüÕVÊÃi­ê;?ý¶„Íqt#îáFá b9!ür2ƉÀCãƒÖ¼ ’âW]0¹§Ìe É®\±X™)D¶çqò¤GЪ2v8g6 šÕ)BdS‹±O:AîJ˜Âe0ÁÙ»ƒúõî^fª 2ôé³GíÏcÍ:²fq¸kÝ¢(ĹñÐiЇ`>ýb3)¡#™É®qÑþ«.âNöÂoOñN¹·â³N—ÒSD‹óËï‰eƒŸO‚&âÊ‘‚Û°F{ @ïâ.äÆ¿M3)b}­×F‡zNûÎêV¢Îް àÒI·`áùýoe" L5ÖG¿ï¦@”]Dqû= `á~u…儨b8ÒF’Qñcô³hwÊë•+à7‰²o.6úU³dSÑùàðË×¥E[ „½òýšÊ6ΨíÅ3šwdþy’àñtôQK›“Y Ê/ßå%ô Æ•g©TQÒëN )N»‡’NžÃ›9Á³i&ÃŒa6ÝÐ7¿,gö"Ã[»×ÝP·ïÅ;h±¥ð%’1 9®Œ‘ë ¤zžjÒ:ë©IŽšóØ7¸à®ÑK°“Å$`–'žil×óÜ«Y³5Ü(ý6ÇñËâ!Õí øW’áï&ÔiT?}8êº>1i33|yý¹8ˆ&ó^ÏéÕÿ×ï7nV>'7Cg”Ù²e³¿üìU‘#Ùû?©"L6_¯òÔ(±ÛUùIà.G£+ðßÜZzvè ›ñ2­×/¦èÓ]VLÍ{Ä ï¼‘OD¡ÅÆÕL˜é&%ƒRE¸¢ÆÏTG‡¼ï Ÿ2”0çܱjh µl†ÂÕ¯¸¢–@ìÖZp»7ä‘iäX¤*Ƶö…\ç ¢L´ `VöLOÀw„8“lmWÙ íócšù^ :pÞž¯vQçàÇpX)ÍÞP¼[Ú]R# o}P=) ÉM‘ò["÷eÍ ßñ£{^® ²†O~³|L‹ý³Æ ‹9ô;;«y¿]¥c›`½cÍ´'……oò¹/ûÆÏ7ϧoÖ½ÄðÝ7:iÙ,W_{®«˜£¥¬d&ÎMËÉZQ ª39×öÇÊóssFˆ‰N£\e_ÕHØ&¡Ø¼px" 1 ¤æ€žÉUMîÊiý„"ùIäÞô‚šÇá‡ÔÛ@ð¢WÛ¾óa¤¡Ÿæ§ÔÆ"Š`BvVÔ&¯MÓønõpmï¨á+ôˆ;üDWäFB%ÃÖ ”¦\43‰’4ÝŠ#³ùê\˜+4¦b'«3’p4Û*M“nS~Nþìj¾oMó!?• †²*3i¥ëé‰öO3ª›áÓ §“OÁ´ ÚŠå!ÆÜ¥Eßã`"_u’[ú¡]czá?:*)ìÀá*¥l-KÂ~–²xE.¼míÓÉIò5Õ˜©å0‘Fçä3ì[•‰¡ÈdªNB š<๬[ ½ígOư[Tx<õ-j×jl:X•Y^CÞ‡-C*FýÅÏîüI‡‚… SíJ¤¾ãmÚŠ •˜Æå¢Ît„v­RƒŸqüõ]ÊáÓó0[žýTHðM:Å‚ŒNýLUuOHÎqÔD挗l]•#PÑ Umíç)íÝ{OìŠ÷ý‹\½V2F9â#š uÍEúˆü+`Ø¢¨Øâ.ÖûyåÈÐ<‚•æˆÊ7¬NFÕ9­Du?ÝB'­‡ƒ$H û^&vjµk+ÙqËÏ¥WY!¼À›€gnIì“Ù@hEé h>×õŠ`*4U›Ù1›\l\Ü[ÎÍFA£ü<U™ƒÞw {ð-¸÷%‡„r¹>/ g “;]¯ûœÎE¹ €Q5àïÈy5Iagï7¿Ê_ì¶í›X~¾À ïW¼=g&4%Ã|£÷A_†°²àxÝ‚á,lÕåijZ$bF‰”yØxðæ2!»@#hâê Û«+ÚZÚãâ|ÿI@g(ç"oŽj$‚Ð'CñP±W›JqNÍ™`‡#ºŸ’‰eÉÖÁElÇ¥ jSMÕùÝÝFåZ´»/¦®«ÔÖs3 ø,—+1X+®ê˜b·€ŒT§Q¿Uq™¡Ã ‘É‘~s¸*¸dmO¸kM"°ÐS?¨ÆÎ]ãÿôǪùYïCÞٺʤz¯‰w`:V'!¦9î÷D¹Ž¤¥MB=V7W|À‘¸‘å<`…¸`ê„×êËúÑ4ö &ü)Ô­µk¹T¼·Ž&¥êýýñ܇úF”ØÕ*ãêgÂŽÅävöpv~V_5P¶„§Ëg–[ˆd¸´ ð&á÷a æµÃ1È>¼£szûv¨¯‡êv«$…Õv;0ï±×åëÈtõÏÓ¯ó»fÌXïá]F6„œð®®=g5åE¨X+š›¾k{ô¼©?Åäy‡þ@—ƒìð‹¥Në,¼gmPÖA…‰´3(í(×­!¥a«°¯n)øÍ„•ôb™ví=fðPÕWúVÛ뽚ɹ}’ºË/×lZnFÈqÑu$”°\¹Îж<-Ï>Ûd§ô=Ù‡~xeòX¸jo± ™é¤}Š(s»'bÀ*þRÃéeÙk¨…þ3U¹‰Ë÷Ô ð«®òqÆw$Œ?°š ãI;ZïjEjMÕwšt¯»EÃ̱U•«ÂRôŽ,—³u…Y»ôÉC“¼ÕG·P2Øž&º¾X‘;Ï®<ãRÖ/yâC‹óa”55ñ‘Í•§u"ÛãÉÍ[SØ×úއ0jK‰fJÕÖà /Ñ)tʧ³…k•U|Á‡ûrŽÑ̪&Ñn’m­ßÌÙ³ 1ÀÁØn(i »øC\†N!šªÖ ’§Áœõ"ôz§6ë9­ŸûžÝM3W9cyEÅdneqvÂÔç wÐÅ7è<±v{>Û§¯žÍæÁEs"ú“Á3+ô–!r³!±È»;ÄΧIÂb†™ ”s?Ë¡‚ÞÊ$¿«@Š•7gë'‚é1ÂÕ)Õ‚‡}_%”l3¬]1ºˆá*D>Û`†g“œÁu–™µ6uýfØëôûèlE{í›Æë_¸74Xꮢ=­ü oÉn3äÔn–ð^qqÚ”Þ9u3m¼Cîq„ºÉ—t£¨ZŠŒfv¯Lvà™Áùkt~Øüsµ1° ¿o]áµ­\‚#lgh\³#JÿÏÜaéÌä÷p5è DBÑ‚&Z™4}ÉÒ¾ £þè™_ \Ø‹’MúјkᣧrêX]„ ÆàÄFb+¤"Šwgøuš^ØqÌ3<mrÊ Ô9uÏXÑÏ4žœZ`YØjQQYË­vBHÇ+!¸Í `0ýåózÅ/Ç­h"ÉXŠ&]_ò*µŠØÒK™îŽŠÏ[yTc!±y][m:L›ÿ1]P1€ZWÄÙx× ˆëìõÁýy›'eÀ÷ÅÚI¨‚…ž/Ç:b³Íc§r Ñ—šÖäÃbÆÕL=_*h¨AÚB1Baõ)aʽ5§_Š\ÊÞâ6ÃT®äåÑxÊq2竪%„:Öš™tQ|~Ÿµo¹`i«þv\M—qB…˜o À3$-*Ø+ç“ÖH¶ôË7©w•ÒI²Â#¸q²ÎV6C)¸ú¶ÚX–cؾΎ…‰…1—IKd¨4¬Ø"ÆËܨVCö"'?U-Xk¯uçùÜ×ùÅäÅGYÇ<üH¢Ãskjƒ;$ÙÕ%·XãÙ›üÊR&‚”úpŽÎsƒVñûji¿µÊ‡ëbËpQã}æ‘NŒ‹Ã]lö=´fà¡æRXZá…îÑ÷ˆm÷­w̯¸Ê:j0Mžg kå¯Ñ‘šWGâïø¿W®›‡ûSb1‡Gð‡6›¥ÍÇtËÜC©ðË1D.éú+}ŽÞ™ÊzÕ•ÅéC–”­êŒFÊ·õØÁüqä3ŠÎAk\| º&pì=—¸¦±¢çøÚík©ÄŃö¸%Â…v]9ç;¦8Y¡ª·R²ßz¼„¨2íÃ?Íî§íöÆÒØ—âº*²úá±ÁhíoFÊx…Û닼c͵cس,nIS¹.äqÞ?Vç55ê¡}•ê”Q©¡—¥–¿ñÏÎhÚ+•óÔ„G;¡žJI¨ÛFGó@§„œ—Q,¯ä¡ÛÁ  ’> endobj 58 0 obj << /Length1 2333 /Length2 14410 /Length3 0 /Length 15786 /Filter /FlateDecode >> stream xÚ·eTØ.Š÷àÚ¸CãîîîÚ@#ÁÝÝ=¸’àÁ=H܃kp œÛ™9g2ç¾÷ã.Ö‚þÊ¿]U{74jš,â–Næ`'GwvV @RYSIK‹9Y@d-[w{ð 2ØÕÍÖÉQà_6’®`;D&r‡˜*;9<ììœvv^ Àòÿ×ÐÉU ò´µ(³œÁnÈ4’NÎ>®¶Ö6îLÿý ·`°óóó2ÿåw»ÚZ€Ê w°$£È éda v÷ùŸôB6îîÎll^^^¬ 7V'Wkf€—­» @ìvõ[~Ó¨€ÀÿcE¦hÙØºý­Òt²r÷¹‚½­ØÑ âäáh v@ò4啪Î`Ç¿•þ6`üçxì¬ìÿ„û÷ï@¶Ž9ƒ,,œœAŽ>¶ŽÖ+[{0@UF‰ÕÝÛr´üm²ws‚øƒÈ@ȨqpsüØ!+k öþkÊl¬ŽNî„aÀÊÉùwky¸lâ¿E#›ÄÄ `“üƒølR?€MúÄ °ÉüAì6Ù?ˆÀ&ÿA2(ýA˜*ÿ >›ÆñÓüƒ¸lZ¤jí?SçÄ©ôA2˜ÿAÊÌ]Av`ÈÃ`åþGÎùüïÁýG¡iñ↳p²‡ôê¿.®ß‡? 7‘Íò_’ü'¤Tðÿdàù­wñ€lÀ%fƒtÌäðÇ "²²õüWÈQY9y¸þ+ÄÄúOTˆÞú÷ƒþ· ¤X›?¥CÎÐÆÇÙìø/ ˆÌö_Rí›Aý?eò@xÚÿÍ?zÈaý©™rE±ý‰Í i‹#d¤ÿ¥‡0wúSÄÙé_j.ˆ·3äsüŸFq±ÿGú¿mb‡¼×l.NBÔÅÃÉlinÿ/ˆô_§Ááú§xîßìù¯Ãà†˜»A.é?Óø“r§±¹Û¸‚ÿÕHÅî^Nÿr€Pöø„Ÿç¿ „°×ȉçó‡'ÄÖìúw°ÿYx W}÷¿îfÈmð_ü×; {ƒ-ç,ÃßÔ‡wÜÖŠ{±ìŒsöòhß¼xs!'ØCo³Â|U!°+'æ*¼æKÏ“R±©6„U†…Ž|K,ÀëeÇ/ÑÉŠ€ý:F.†è˜µAHEõ'"ýä9°—(9ž óý¤Ï€ÜEå>ˆä¶f¤né­ÁÞ¾‹*<1Yeñ'$Õýy~¼ûÐSU9û@uøÙo]RÀ7¡Q™( ÝÍSwt (ÍÇ¿^êÄ6››ï“@ãš”Ev¯ÿiN¬_Î+Ð5ÖÍqoÓ©(Öý…ùclÝÞ%óÇo¿•`S©¨…]yÕñ>Ç<¾¦•HÉÌŸŒq´_Ë'¨;{‰LÌ2† Ì£f½A²ò 9úh#wšè›Ï[~ô-˜gFŽþì=öt·íô¨ÕÜ{•8!¼ÈByê(ÉÝØ ë¹ñ¶–c›ûäždÓFB$ýǹ´A÷ tä¡`-Ê=¬03Ê+WXU©ž3Ea1ɉ?Ó$}ÎȾâæp"Õ(™UÈL¢»wÓp–Ët´ †8FD–«O1˜za™|fã@=âò%àÖMBö¢—Ëú+ž?]òÉ2ôG™س ¼*D4ô&V‚W»Ó¯Ñ|µü)j«¼2É;ÃX?R4Ñ‘,Gû7î`òcö £S@&šì‹ñÀÄó༾’P$õB±Ð®ôIvœœ'4U% æ^×ZÄ>ÛÞ•/¬_š‘ð à3FÞ‰ÅQuhléZ™|¥s•«†~W-o|è$œŽiñEûšÍxfvˆ•†@“ÕrÖÞmP‰:««+‡ ø|ÆKAV9Â}]É‚½³ákýÚƒ“û¬ƒÒš‹ÈY0E;…ص7Øâ¦þ2h'³¾Ô–›©ºåøŠM¶?]ÀÀ€Në^ÝXR™½À>7ó#œê»\^gÛ·n#ˆôíèðv­âDd Ê¬èÆ·= ú&3´oÖ½«±g<̪HþÂõÜîè7”p+í ýÞÛÀÚ6ñ@J.Z}aBvÏÄÍÒ: Nçé µx¦ïMñø²Š‡Í%Ë•YÖA'ÄètzÖ“F‚%M-TÁ:•7…Åß5ÚÞFî+Tö2‹˜9=ËXöé¼&ƒ÷}¬³/—¼’”è žŽoPìJcµM*EÉÖ 9Ûm~sRZþr©ÒÙÖA’+Úü\ÑÃXïF•å*ÌVmdÕé0j‡îj86c¹úÝñc4úõe}C£0!œŸ™ñ$‚œXA ä|,œ¹T„HãF£Ç ou|t£~1u]BäÔÚÍz¾g·©A”à›ÔÑ}Èx"1¦õ£>¶QE#«ê1ñrßRž#q?ÞÚËÖtQM\½ÍE<[D‡Óªó ûÓ`*Õ­ oBé:HžZT[ÒG8 £§î ßBV‰]÷ŠÒ¤¨”á†êÐC?LFßå¼Öu|±¤×OÈÿ¼~;и™¥ºò9»Ô›0;—š¥x‰‹qdJÿ׫¯8#ÑL!LÐÛûO ½ý¤;5líÄ V2O-Ã/»g òjEçëôÅ jÖä¢KOe[«6 2\Çõ:p.¨G™ê×Xy*-ï¾?x“M‘=?4íørÁ?ýâW–(r1Áú¿16â+™ñ´Éd|ÃÅçÍgHwRóµrí&è®è†zùõÔßÞ¹‹$:…ÀG%t9#°'Ç+½ÓS ýyÄâ 9#ÛHýÝJ6¢Ì£¡a(QȾ‹Ió[zvló’§1S©ŒºCIJO1uìëŸ!Ó’›•,ºay  “™À.Â9m‚–ºd•ÜŽWú:%~a…–áT¦e²–E¼UhbpÙ{_ÖÊü"y1y8“©ú.ÓÏeîMD\u²nä[aJÏ’Uü©‡G\¬'¥ŸN÷->ˆ÷PóO½×HöŒM^•îì±DRà ëÀ{_ÜÒn3Ã#D:ÚºŒ½1 l¹{„é÷Çs爥!2rÌV”¡ÛÓåzËýYÍ‚—à ê=Ù=Q®RÌØ.îërM ŸÔ§EýÒ‹h¼¡2äîóå>bÞÐÁ³Pj éÂsHõ㉊d ýŒÃ‡™»Q(¨¯9u@ß‹³S±S=†¶uÈZXë[? àš~ÝOðzw'×E~ ­œËßz™OÓx67 a¿ËšÙ3ÇÔÂÕ7FûúçK§g;Ç—9!ä&’e*ó‘G]ÐÏy;ÕèÖ‰ƒ4¥o*øÆÒ™þi‡Fý³r¤Û´ÔFL8æ³'Mwg0‹$;œipkÍ?L€ž ¨é<½Ÿ4î8Ñj˜q^ñ™jc¶üp«EÏ=z8J£RD^ÔûL9ox÷ÈsS²”˜/ùô0~p6^1O\P„]ÂòUV57rxÍ…n]¶¢ÄtI¶iÎ3SO×¼³‰Ê©fI‡=uyŸ¨¥/2ÔÿkýЉ3ÂÊ/‡ðõÙó&QÁý¦å5ýIm_6â]uÑ$b½€vÌEÕÇ­ÃÖˆËüÌrÔyÔN+1ª%MˆÖÐwÍX´þLqÞw!Ò—#=Ÿb‘¿à6(”]ó‡TÅ?Ì-5õ¹ž«ïê5ùNùæB/¨Nd‘÷3æuåæ%^ŠP¦­ËI Wstï›ók3/H‡Pl~Q­„×87!á_ÙOyÝÒ1Ç0TtAáÖ.[ào\dÊ`‹t®‹Y<”ÞlÆ(ÄÔÃ* !+JµZi€É= ZÈ×åyÇ9cR–Px¢Üf+‡sH @g6&Ф$ÜO©À솟aål¤ƒ¹$^ƒßÄ8óo;Ã2[l6#j‘™É¶¼`3¼š8ÓŠ*A x2J:~ê‚|§‘iß|tE1S€¥T©RðÔÍl‰ñY؈åmȮڜ[asokD«]=vbÜ'\þa¬éÎlÙµðvÅs[òí;Ê!Okëá«u›€|Ým…üÒ‚šœw½ÍFô-Á–)Q3UF?pÃg&íùaš9òý˜ ±ô¾áðg†%“=îaØjÇ“[ñ.ßÓFùÂÅÚäoÀMmhfËÿD.jÏŠ‹²þjÚÿužÜ\wºúÊÙCÂqà$KÞ5²CCXûCt¦9S®±ÊNØÁzf›âoiÞKœ¡‰©‘ yå‡îŒ6™´«Uâ·?¾Mp½ÅR@¥@[r-ÿQ©–m^®Áq*x”WÙӚDŽÄEž¿X;·jˆÅÉFðæW¥š#SñÖýô‚ºž…²;Jf¬h²51/'/².g2LÐzgx¯ôíö"ÆrFXÚ´2[‚+&mfœ'Ä ÀåJ¬o•¾Èt©<¹S^Ð/‹"ÕL¨{ëfþ•{M–<ô³þ̃6Ë:ì¯É.¶Œƒn,ÆbÕc{­×ׯ¾<¿Ž6¦e ±øöl~SêNÚ‹‚ÚWŠP\cz+P'sx¼B’ýƒÿMˆ˜Z¼QœyOÓzIäTZnºN‘i¾ ´+™"gºæWðõ‹‡¼|ëxx¡%µœ'ª”´w¿YMý¦ZD¿µë€Ïf✠UúáËÑ+ÑØ ž†¥…Tù‰ï}{«!šß¨gÒ)ivÉ3ÔÎÓªˆ³Æž . ÃÄ|‹íÑ-»Ú¬FŠ2ÏË9†t:7NU}4‚\w,Ê7JEå^.q¢X^ÏÂG'Bs>` ¼ÙÎ=Áé¿I>Ù)þ0#+Ðñ‘Y°š¯Î`‹Á´ ®Ûd¾é±Žäà” áìÿÒA…;@®³,7Wñ«yõ úˆ(Áé³ë9öØêeKqÊ%m‹Sû­‡íÒÄ~M /ç»õÎÊ9žXýÓfèNN0É«¾ÎH²Ê’ Ãc¸H½<«­kiãJóç0úwñ¬W•,F–›ç3[¥^Y \ÈðÉKa,„†¦Ïͼ¸Þóù—õ{†íÉ—ù[`xö¹ù•oòAÞ‚3,)ë*‰¬ºG¦ÁÅ?ÓÀÔÇÏÑI"hèžÓÃBZÏø³öÏã’åû’_€Œ]*ÏO#'Gù/:}…è“8§V4tÍuw—<ž0$c=®¡(¶É—‘…è7*¤Ë¬P¿¯ ÖØ¬§ëƒ>&~óØØ ÔHÌhƒnS?>?qâýîpÙ± “0ïæ„OŸ²Þ ²Bë[üjs»ÀψQïœßå2J©×ëÊEü;©Qî‚Ï®CÍ ã<¥qáQ›Ä+&p»17È—QQªZ‘ª‘Ðõ¥¡¡ÐÊeNuWú­Ñ+U·®”ãÅa?#—Ÿ³ã)®’,užù|ûèç©LÄÊ70žŠ ·¢—âöÙë)•duM ®.ôÊê]PC€Âùp[îÓß‘¢YäUôËS²íંÍàv¨VM/{Û^j H澇e±H-L­Ï¨ÊŽ gkSÁ-ŒÃEŸ`[ò·6$ õš‰¹læ£Å¶tëÇÖï>ófÜA ½káì<‰˜b#—ˆÍ…kÀÇVûÑã.>Ù¨æìÆ?IAÚënAw7ÞߤQZ[´x|€lí_k”Ñà3_êY½ºÉ€ µŽk»tDåÇ|¥ ×MÁ¿¸€ø ¾*ï@ÄËO·e‘ð,çUÙ¾‘˘¥ÇïmmXÍf<ÛÀo¾ÌJKD¨õQbí6¶óúø—;î7vv’™*ÚÞq£+âl|öu½û0²¼³{Ÿ óÏퟳ*¢OCì9ڌ⽠Ô**¥ÁW(þOD{+Îß—áA s×¼@"BJxä­ IiE‡Ùœ˜.™>À˜wä~ø¼'ß‘`·f¶_ÂAʆÍ$C݇v –ZsA9Æ BƒÆ’=ž–܉¸q¾Ö²-®§Àg¾¬¹Òž¾¯Lk -MNQ+/Æyv‹,–*xïY:ÇýlÄå…kFŠ•å~Òò³ˆØŸ+zÎÈ5½¯ý(*¾ÎFµ §6¨;gDðÏa?5×¢óqxÀÒÅž·|äÏKÖ, \ÔW·TáîaÏYã1AY|ƒí˜F$_‹ yïV2FûâˆÏù¸Å\ÝÖÅÝ|¢ÒV¨7½@ÑZq”º~HäX;5ýSzgþ÷ ^¼óˆX†,•tÞš‘º¶â–‚¸‚X#ê¼PÑŸ ߇; 6:qÊDD>"ç“ã]¾Ôo^{L~z!~à¢T ^範a¨Ê©úz°´ï- ¨Ý¶ƒr¡tŸÌsô](¯!T„FmI†žgŽs⃃}LžEÉ"ÊôF‚Bþ†ˆ»bTì éÀÁøða#ÿá¦Ä/|ffÁ/°7(ü¦˜º}ëe%%â!yÖ¤‡`ÓávùL÷–_†‘µoevŸï΄¬“|ˆLݸ ãD + ×"òüÎÚn †¶½Vº$…×l’\ýNíAïZ?_>{FLL&Y”Ò§ç^8#Š$^WP™™ÞÓ{┟“ÜÉVBÈl&pì+iüç®OŠRà8ȉ*QȈó4¹ŽíäÜxó²Æ-ˆží¸•$©ÿÇ)‚ß[ÔbĹõ•‘%–×þ(ÛÙ–lÑWîèk–bxy-¿6T¬Ï¦zÈQ—¾Õ"ýDØ8­š«sÒÍ&ñB†qÈú!hZìÁéÛ'ôü+w'_Ækä­æ”O%˜šâ »8¥Z¤‚ɰ:^(•‰5ðœz½F)zl!]=1é»KŸ¢øýød îûW’VyiPÙC¹M¾Åx„l)™¹hæC¾]V†©ïŽ ç‘xýT‡^¯fÙë~MƒÐånÆÛèÍÇðD{LÅ̓…o‰G&ÚFiZIJé…»!Î ÛiV#_wµ¤óƒHf7KŠ cy+¡®,âÔõdµ#J‹T’~{'#¨d,ô‰]͘üþb~íÍ…R+ …n‘Ù¤D‚SƒE¢œvоø©Nšés Jç4Ú\i´7V?]ဆ‡ƒ&Cßàó'wçrbêTVÔU—O­¡³„û¾j+V¢Ûþ:[Ùn»koÞ9Z:¢³ózþyŒÀ~N£Ê•ôÅÐxRð´0d@g4ç3Fƒ¸¹E/H-ÈøíÖc£b4ÍÑø½ó¨FáŽÁúcÏ÷ŠJü)5ˆGàe%9Ì8öÚÜm¿Z(ãYÔÐPÓ ¦DÖM±Š`Š'd„ +Ä8ÜÜHȃâ¾ß>~AzÄ™[E»ÔüÌ—sÆÄÙ žÂ5Fhm^ç“T©9Î,Žì60y¯ƒ„úP.ù«jébVånYjW`¤=øKf…De©úÑùЧ:íݘöý™ñiÌPkMGü»·\G>iK“‚Ô‰Ð?ÂP?8MÖu±ã –iˆÙvȲi{Ôñ[ ŸÔ•W”³}¶0« õõøôÙè9L¾ßÔG1Ýœù.8{âÀòÍÖÖzÈ–7uzµåö÷KxÎϯõaPW–2-¯{RC/ZßÌ«3A/Çd§‘WlYèËg¢ë6GçM!Ü„.®è˜òÍÈJAá\¢• Ù£µ§6ÄO6h[­mPV™*éæcg¿k¯…ñÁ×È–AX­Äa_ŸKá‚Htpâ‰->¦×öÏR|¤¡åû¡´Y˜Ï𪡷Üæ;†ˆ3¿‰òЃ+;ÍJ¹U¨}G‡ê×–¨g¹0¹U€±§SšÃgÎ+ý8÷Í‹s{*ùã¦ôÇ¢>é|˜D¢fÁšs‰›ž‘aÞ"šý}e/Õhv)¹#,þùÄŠý-¼H7(’ÜÓkN…ÅØÆõm*#Ãþe«¾ß#0˜ÌtÒAújæqÑ·MX áse“µb±ŠŠi—I2ÎüðÝ¡ÏWÁ—þ(Õào÷öäÛìLyîÁ¥“Ž…t››@¼£h©éÖÌKXrŸ±ŠÏ„k½Ðï/øÑøa3ÎgºœÒª°– Ú;Ûó;¯ÖtÊ([Ä\ém„V‰ò'›Eªé¯™«âæʼn£’‡fÜ*ÔNSIuùsA T*ûc'2b;h]ÆÅ ÎpG¶"Ôò,Ó’xN‰ëÍTáÇh_1Š WnNQMA©×ÂEiÖ‚jÃ_ȱ±ÚuÐÑìQβ.cOlWZ¾Ä¸®Ô㔨Yæ‘N= 'C$WC-”NîSêbô3ÓÚûíéÁĺ+~ˆú:[ª*_wÙÚ‰ÑÓ¹õDhû-}ïÑ0iJEw½ïvûó<è©ÌÃfµ}_‹åcȟ㢠pÔŽò·}ð¤ÇÀr1w“@Ûð«ê›úTí§š–¸øì£ʺ3·­¿7¹/ïa¾ =Ú¯YwÀƒ;ÓIEû耷ÿ=!¬èÄž"z9Þ[Fë´åËb![£Å¹Š ¼ÚLªÙŠpîRΓwu¯ý£Éþf®>ÒKF01ÔSݸ¿˜ÖèêÖò\’ó^m )aׯ§Ì„±Õ²qÕ‚$WVžnN@ÆÈÛåuz[õŽ–ÇO‹µ’óT§^jp±Ž²¨‡î¡‚É ŒF\19Öp}—Ýãï'.‡7n7roµc=ìlNŒ[©0BœêÔ’ª)± ‚3MÉÚ× Võçà}4Í×qsÛ4îì3¿Tµµr'{„!´ÚvŽ|¥3×~TÌòú}馡•EÞ×ÓÓdbN‡yó:ÍèÄúlzx­öÚÉJþ™äC™ù߈Ê.ÆYtû±|<ò÷yAMu²øàèê+;lÚXhÈߤ*XR×vÈu<ŸÇ±à¶·áÒl³VÌ®I„f„žy\&ÄJȃƒâ#9122oiŽØSzcdíRô˜3 YÉ‘÷ÙßM;ïËÊðЋ6ÒOÅÚe®û­&·2rO˜²}›ÍL"ß4^œGŸÆMW{£vÞ䑈ðhbZžH]½M“Y‡I—«¦ÈZ{|óóæAjùr+EŠÃpâ+Ÿ{¹xÎêÉôÁ>HÙ)ôû¹û*N·0ë•þûv…øà(d@@¯¡¦®¨Ü‚_E·l²$·¿i‘HÞ¬ H©Ó¸ðQ•Ûâ~,®)6~}åŠãÚ’£È‰ x·ðÁNä£>THz?sŽóSH<&ðÆR#ÆÑróø´Ý˜j©®1,=Õz öá ã&LÊÐÕK™R#[á\*ãžr÷ª«ðA¹„µ ´xñ@rÎlãáž’›2vae€ ‘à9•Vþ kA×|ÐÀjF¢ÆJ˜Ø›ZÙ†möÝê£èâ'ÅX»\&£….ÿˆ0…ôÓ@ý‹jã‚­(: £ïõã¬Ö(_ È—m¬Þ&0Œûœ;þLm‘­`#Ù×he?y ¾#ìÞ÷2€’—;×åSdqSùÌr 9;1h$²_†šÊÕD4wí#eÔOqÇöAæDr ‰>àUQÂÄל÷ÌÑßùˆ Á:‚èÖæó:œå¸I>fq¯’ ÈPÌ¡^%]û7³šDްvtOÚ™þrÉõ¡…¿6˜tŸš# 9©Ìå‰Õ.‡§q-p‹p ÞL¿ãØšëûíØvWIœ»h_J 6÷¥Òöò\šÂ‹x‘·_7¶ÞyTPwïÇ®œ¨¥}4´ËiHÇ÷’Fa|üx¼ËæEwó{D£WPn¶Y•F3Ö)hÕI ±pŸX±Mi™ÞH5ƒ*QåQíFè©:Ð'gaDâÇ_½Yÿ&éâËê—FÑ™5l¤D  lXÚö}3‡GÕÒT3w°%¼Uùɤyz³§1otóÝ{íiD|„6~&A:œžôþP —Pò²ì¢obÖoòÉÚ;Šh¸‘ <ݬÍÛìï$^ƒ“_eµö?dÁUÙøìÏn÷—˜Ðy¯|1bÝðÿIæÊ»’òÓ²GFŠ~ ë#g(°qf8nnÁÅ•¯>2ÞW6 UóÑ·ö\úùÌÎ!_Csò^n:$‘GÜ}ÉéK¢Ø¶©«ø­$ÅÛ/B–1LIŸÚ· t¢ˆ/í¿J1mcä}Þˆ1Å7ÈÝ€‚Bþ5œú@êøb©-X€ÅóX†ƒQ¯ü óz¹‹´,Y”éª%uá½'<Öø7 ¢³^%¹Ââ„ í ­J¢ÿ§=Íg:„äP‰ÞÈ5€Y÷¬šËaÐndþh®]…MLw÷ýJ„ÿ8m¤‘¥Sõ@m±¿¨:÷Èæ¼¹œI'Vâš"n»]¼C5%3#fKQöºXg © G;u!ž´ñµilÇ[b-¿¯‡»üË!ŒâÐÕQTÛCG|Ô¦ÀZp­–e;|Fy³Qmbýümå´ W?×쯃 ¦÷uÐ p5ÖŸM’óXæS’h2{W8¼óaŽ×–cOA¡ñ˜<1Ó‡I¸¬w®ÓFß‘x¢ÇI1’; >Ö´¶®›b1^t=Óå"ÒŠh»,ˆöïi༠oc‘0§/EÈÇ ëèݦŽÐ ,÷¢y +ANˆ`e¯ˆ:ƒáˆ#’ù©^É–žH‚¥[ …s‰Š‹nÌüsöùì/Ç»Oo¨‹›Fågø„Ã}a“îF©•í0  Œ‡ßTô¢5nchŽ—{º²®Ù2·(™©ˆ‘ýBá‹ÎaŸK¥gšÈ¤à÷DW•9…~9§c\‡Ÿ¨oì²|7 ê¯}5{›g8' FÛû¤]ò™JjÅ6ê³B âÉŽ3'Œ}Ýw9ô¼œõÄî«1øaÃFžzÑξV+0ÿÝú᜙ݚ3“Ÿ…oÌÆZ÷øÅ°.ºûáä9¯rªhïioé2Ê M…$êâ—z†xL¼''»ÎKçN-Ç"öm¥lÚt8­°èüZrK×ûÝ—ó2^P{ÏÒ’Qˆ»RAñfàë’ã¢(Ç´’ÙÌkuâÞØ<—U­hîõ}  Øûžå·šžÕk0^ðÐ-½ nÂË_ˆ0pì^ÞÉŽt€Ç/§œƒµŠéf LÕ®x&Y 2˹=á±ÊãJúDƒcÖ)N\}*æ,1r¦¡Zã{Bí¹2•¸WFˆñ‡‹é[íŒbAø¹‘Ü<ÐÌÉô·¹XgSd)N½šŽf!¶|ðC=Í£xOHåš¼©Õ¶&†ë 5qꚢÙì…; cQùCtÏϾ ؼ¡ ©DºIdie%'\û.KS#‡‘´÷)ç÷äB%Û@íAÍÞ×nv7‰Áûòh‡ª¤¾ÙÌC!üÕOº¯2Íó¢gJÖ| ·©5fQ¯BqúѬªÅ_{制„f;ç|­½ÑGIÔ¬!¯Ö|Ž|¼!;ªÞ×jȾ‘@i<{²ÛëÓ¹åÊ¥N³œñ÷¨£#ÕØ·‰+ןnÊÔ½>wPa×DBKÚ¯e±ÆnÚ·â¥nÀ2e›O;|«bNÜóËÃG¸î" }OB©‰ëŒ'PPž ßkø;¥2¦Wj—NóHõgºn±Qu@ŠÁ3sUôÏ~§QyU¯÷ß{¸ÍÖïu¨feʃ¹f,ÜLáûý+üߣè\ûYy´ŽÌ?[=³•o#R®V4°N Ó¥ÕÙ æy:@32Ç©¯užqåç1d#“ Èbé™ÍRE¿vY<·5"÷š¼rWò·¬¾sé^ô6õüŸ”÷¥|ÝÑŸµíŒÇ•YâT¡½Ô3õ-ƒÍ8 ³ø ƒWê¾Sµ¹I8B+MÓ¯- ©9\­ÌŸt„„ ‰Je¨ÓÆÈ÷/ðQƒfÑ î)ªò®û‰\[÷ÏÇ.:_ƒîãÍÙYc i³ÎI9Œ%Ø” Ç>¥Ù”ãÇc_Ôu œ®pî#šªUN‡_…í—š¦Ç’rL èrÌz'†·aáv)Jd½+ÒB&Œò±4ÔË^N|q5cEkP[.‹¨§ÈªóÇyTm"FÙ,6{UÔÖ$ÂV3Â+ú3p)‡Œ<¹†åGHÄ.%“Šñ¦rì½{X¢“4©¢ÍÄq*'ó½+hZp²ÿ‚"á¯C1Óè£5Íø nÆY]l ¥S¤¬#ýCÑŠù+J¡‘µ¹f‰=‘¡Øÿ²<ÌOPÙúМrãdi„ÃyÆäË­Gü7§A:MíÂ× Û˜òuÕ»_Ø×Léjt ã{ú‚É`¹¦šg¬¨”£éìW'\r…G¨{-Mô­t⣬ƻLdW„Îcj«’»å`ç·uMk½eÔëü`¶26Q¸Pe©]n¼óX¤CˆO_ t:ñà6sè0îo ^2n}4ξÌìŠQÆg“–Â×Ù¼lÑ0â\©èF2tóQ,.Ô÷wQ¹"[0NײIÌJ J_.uJá½ð/º¾râüð>ú›½"[ÊíÕ’QOc¡ ‚¶p¡·Bs t_ÞH´ t¯›„ݮѢ¾|I‰Øí/á…÷Qä÷SN¡‚6¼ºY®öñzsø5ðâ¸xs º\À¾(0ið¡¾Ggt=5^78Ë?:Ïbâˆ&0±T¯?…½~:¤K“~GÊ“ýDŸx÷‚}&ìcÔ~ïä S²™’˜z}ß,”ñ6Ûœ†Ã+ÓŸåYA‰TÀ'eÙ'£ÎÀüáãèKŸ«±6“0eô,FHÖ“Ÿh¨$Ý«ZÝelœÉGB†•ÝÚ /ž # É)®â©¤½åŠlŽrîÉ$ÌS_›Ga¤IK=XLUx¬C9² ×¢ì[×Òõ‹xw¡ï«x‚ê’Ùw³JP}¢¯¿gB&/1e§±”^Z$ú•„±ïˆþBìà;êwhB$üöoÓ€TmP†2 "z,n˜â³¯þƒöÊîýQlª!± ¯a`Ú»"¬Á¦¤õ@7;JsÄ3cÌNŸk{±ì±,‡pß®»‰c–7›äϪ©(à7µ8tvÏäÕƒ`4]Á[¬ìÆøö=3Ã(>U}܆ð¨PJ¢äh"Ó8Ö¾f;‘CLƒ1º6Ь·ùO€ALËVÚXÏÈþПçø'Œ¨OxÁ :¿ÏÔ,é¸m4ð±i{£ØýWÅëm‰SzÎ]½ ïmRËTo#Ì´râÆ­”¥z˜Vh³†ÖØòzî´C 0¼mk¹øÄ§ >TyÂÈÞ¹;ÊôuT öâ!{ïʺ7ËØï]p+ÙL}àÉо\•ÚeuîP°ùnO¨°tß]./Kë’…Qöu©úá½ßìnàOfʵa’/(÷rÅ1•s±x©ÕnpóŒXúq'<Ó)ZâfTÊL£ÅÁÐ-7\š<]”ˆ(EwÏPöÖäGZë0j/aXäç/ÉFmªÍá\v—›¾C\‹©gZ2L9v‰áTëìz2ºÕßÏCùd„ߥˆ°§±'劮B)Yæî¿9§ª°ÞÊŠiBú%²¡®f­»¤Å2‰SÈۜXõþjÝ CÁ¸óè&?±NKkˆP-Ê_Åm›À*äW2òZÕõž§ÙÒM†>L á] Lnäj̵¨E ß¡_MÊ•6®ÓçCæ~ˆ²¶×„zQ_r6Xhº5Ø-öcä?³ ›ˆ_5 u!ÎÂî9漂Nÿ ë *výª¨µÌ c®Ùežjfûðyg;µÔl\e¢gaç-êóœ‰üT “c‹|p…)fÍ{eñZåë)Ï„o¤Š;‰A qB?à’5žÎZ½Ð2¿².ÚgÁÛç®ñ™B–­;æéw\ûÍlâ€.Y~^Õ÷¥t§Nï:„Ö¿Ýeö)àËÀÊð ¾hEL{Æ™ü²¡8lN¯¾éu´6Ýã\:‘@`8/˜'§I"ΡÓã™dxc¥L^"›÷˜cýßâšñË­… ÑyBæ‡ìg‡Ü[ÿ´òŸiwÊæliu¶Ýì×½ræ”ÙþödqTð|0¥[Ö.¸· Óò?uš í[Þï_㣳f¹RÅQµ—Î÷ULÎ|ß/$‡ñÔà;v.ö°Ý/›Ûø•vž1šç™f3òŒº ³XÆî…‡¤$k̰ù¿'¯ØøÛá6õT …¯ñéUô7Íï=¿3ÌRÀèc8ç~³¡wbžÌ³‰{Ü¡ëlHÞn/Âú×Ì×_—|”Ñ9˜Qﳿ7n«^h‚ÒÓæWçGèØ›âõÅ.¯ê`À¬·¸fÑÕ°¹˜•žÆ†Î΃+R ¯5-’þIzZg®~3ó¡¡ v#<¤~I¡.ÿ}L¾ŽL¯äóp–Wª7¬Þö¡ôÍ2Q6[«à[ì.¹§U‘ Ûò_ÂñŒcw?#(xˆ<”šqÇóŸv"ëBÇ`C»©»ðÛ0HaÅ•„å·PN«S—³Ö¨B‰vdv†$=Ñ_BÊO„ñÓõ•ÐmÑÃ*>©¦G`êB>º6ÝË}®`›k_ë›6$ì±ì™­g.6™¦tA×Ë€k^ýô8—Lw¨ðy<†×zs}I¯˜}ê¹ìúÚ˜Óå›Ì×÷p;HÇÐ`›mþAoÁCV*‹)5ÆÅÒ…Eß³·)ÀÈ&·ÎÅ&Ò ´ÛU’ºÎÓUæQ%ˈCƽ×Ù‹<´\³¯4`žç»$h5‡$Á¯.‡Ú\Ìe0­!ÿã®ö›¶w~”èñ¬(ñ3]ó¯LáBu{d‚EUÒ/ï™ÆÉ&)äý¤1t…:I¿Q”z™Ð4¾ížFîñgZ?;zä‹ñóƒà´’<Ó’à÷Ïå߉aõƒ¿,º•1Lˆ[´ñßÛ·õšÄ•*d|Å4«ýZŃ{w϶dÕ¶Y—Š×Õê(ïÜ9•–è 4„9ÏPPÏélP­™Q½@R”R ºM#54×¥À #ôALyô.ŒsѶL,D¦ñSS!@ÙÿfÍ+ZÙ²× x»p ¿ ³1D QÐ:Æ$ûmëðê0Ì'K£G kÿJ¾~3Ú=w@A%ÞUT¯‰ÚšïÄfðÎÉxZϼÝý EqøÇ’_èB kÆ@Õ±a¼ù+C¥®í‚4Ò•ý²¶>¾P®Ôlçüh´bbç9ÝBrÉe õÃcZùX@!FJ#Ù.»¦â _úBÙµjdŽ•}Tç^ISÓ{ÛX„¯¦+“¿X¢ -Uʤ1ª‡ÚJ‹ƒÂ±Uã˜&%'ÞDu&è›V…k‰Ñ¹îÆyÕìΈÏau_Õ8î¾. ÉáýlÀ:oXžpÞâŒ4]ãü*Õ /¸^u1ïç“¢6l(ß¹õÜÆ¼Â%¨ÀÊü)Ò£3:ÅQx®FKgNíÁg EXy*Z¯ Ûk… ;ƒ‰éìõt56؃l'ALPÏþD¦Œu^û=äáQ¦¥h…±Mv4é 2A„ªÇ­ê`tŽJˆ§ÔÞéiþ"(u|ñl~Q:Ål‰lIžÌx¡Yëêœ;¡#7‰%?+áWN& t/øbo“1Ç¿Êz½/tçuûhy¨nAsc¥^ÖŸ£æ[Íz :·‰¦ Éu=! ô—ˆÀ—-È¿þÑûb@Óè|Ã~‚”žã Ìôƒ=?¸ÛÒ™¥¶‰Ÿ¿äæw”t)éãL•£>}10VÒǽŸP¤÷y›ºšt±ãåÒFþõUC+ iNK1T§qÚKè&è‚ÑÎAT‹[Êк*‘)=·¦{µ7ê"({ã,ú&¿ëq$æ|i—Êí½G0òô;Ì«yŸ€£ ü¢p~ôöæuŸ7—¹áeú¤ÊÌD¥¤e¾zðM¢{Àëµ#R¨}Ao«üOîf‡B“üu¦‘Äõ vÜ‘7‡h6åøïž=o}”s;x;Özu¿í0¸±e¯t§ôXܨþülû€ŽaŃrù(lǼ™Álj9[¯-×ú¨I“]Sj¥ž&3ÌIqsœx¥HK1¾©ý0zHýtÚ3\‰¬½ ÛlôÞhh^¥íPg¡…¾ì£ú{âªÐòXþä«ê˜Ñ4óiùÏ÷HµœÒEì˜Û$¡.¯ÕÕ›f–á¯ùF˜ðfë(Ob¨Bˆõ> ‡Vs¶HŸH÷v0)ã|PQ‰ýÖ[,6ì´Óض${t1¥&ÜnÐswöè3Iê¯@¶Çh=*Ý3èp?¨ã,]\¼¶2gKI…xйæR%?MAÇ. Lˆfo–#A6@ÝðŸP mèè¶”OÔ~¾bmDl*{bÜp½EoÇŒ« yË% =ĺRf%+—âxwÉ(Iqîçß½;,h]#`£‡8ù£ñçYi ¢œ§§þ¾P¸ŽÛ;,¢p]qGï襼rãIñ–ÆËÛ†¤ÑI¢‚Ò6Úp§öÖ•gÎP…¬•9¼ØÊ{ΘsqŒ‰aZ¢ÚÔrKCP}€eÿ.æ§QJ¶Ôâ=o¤cl^s^­—ªÏý$c°’ÃÔ~¿`,O[èŸw äh‰o.ÃÓM‚ƒ«A”ô|¯  iQ~²¥œG8qÉŸœ¥éXfûH:¤¨É8Q®öl Á¶˜àŸ £}5kÝ#:{^aHóÒxXÜ Î\3Î4{ÞÍh|þdQÑÿì,iŒE`‚j%œØ4}L†mgÃÔ3óœî/@Ç0&i(¬tCOBʶÒ¶üÚÒóðn§Óá¨/áûM», q¦¹¶”»éoƵïeâÜŠ[>7d÷6O…ö‡Këé炦wÓ?8®ü§ðDàÇ<Ø›é±Ë) Ÿ7‡Ø"“Ò7 ¿l-JdÕËœ’0bΓ2 ›\eÕe¿fØüŒë5ßÄM”‚9³4I€Æˆ©®µX?q¨¼²9e[í°. ÕñÔüØPÉGòXWÐw –„VL¿Tûh9…ºùÆ£|Oæçš3þµŽ–û~¾×ùº¿›ÊÄ,…Õ¶ =KkÅì›êi=Û's ƒó*|»Cºëž2¢J€×|^<¶Âþ€áübï,å Ûëëø‡ûkÜå–¤©™F^¬BmNKÚ¢¬"d¯yj@œŸ:©×+ …… G¹ ÔÞb¿kƒU ÒЀ_jÚ£X’Õ@„ïómv7»…äÄP©­Ó†Cdû6ŽLïº lÚóø"±ºušsr¢„ÒxÙH_3Ôð`ï?—¾4‘är¼Yla Ðý4Í­²ìÝ’ÓÙoìÿc!Ë)!¼ÍÕ¯`¥ÄÑO›Êûœ•ÉzxÆâ:^ú^k~Û§)Oëæâ몥ä mBŸ3V¾iJiŒIûÌñz¦œRâЇêP3Écٶ׳X¯[â®ôk [~úWØoæÒ‰.)žx¨z®Þ¤;jeÚß~QÅ„öDZΦÿRˆwÎVh ²WÔ-Tö7}®­2õã5yŸ&Gc0M;¿œÝ$ëÜCîM¿G¹3ŒâF =îͽ* Û¼*ÙÁ蟢K !€îpì]ùZÊFŸdXâ„êˆdØ $dĽQ$Èp¹Ö×щé)Ðà‰Úhò1¦Œ…ÓŠ‘˳AÇ”:anÿ"mÖÈß|dÙLAJÛ=K2ñÇÔ¦X±X›5ëuý\a>~Ü „6¸ë\[… 5æðÙ>AÄ4È?G‰1ùôtŒÚoÝ| 5V=÷Ah ½µÌ^NÛfUÿjq‘N=µâ0‹ÍÊ%ùÙ-¼ ó.ý3ËB½3£m„wØ )l#›lOÑmðH^af‚ ÎŽÒg¾’ ¸yãëÙ•o6IRU·Z þ­­¢Êïª|²»¤UKq—DÃu˜Mñk½–^’Ýå> endobj 60 0 obj << /Length1 2082 /Length2 16046 /Length3 0 /Length 17305 /Filter /FlateDecode >> stream xÚŒ÷P]ÛÒ† ãܰpwwwwBpX¸³p—à4¸»Cpwî4ÜÝ.[ÎÙû|ÿ_uoQóéîÑ£ß1ºç,(H”ÕDLí’öv Ff^€˜‚º 3€™™‘™™ž‚BÝdüžBèälioÇû¯1' èÝ&nzT°·ȺØXØ,œ¼,\¼ÌÌVffžÿÚ;ñÄ\-M ŒY{; 3<…˜½ƒ‡“¥¹è}Ÿÿ<¨Mh,<<\ô.ˆØ,MŒì F  íûŽ&F65{K ÈãRPó[€@¼LLnnnŒF¶ÎŒöNæ‚4ô7K@è tršþ P4²þ-ž naéü—CÍÞ äfä¼l,M€vÎïK\ìLN€÷Ýj2ò% Ý_ÁòÐþ> #ËÓý½úD–v.621±·u0²ó°´3˜YÚJ’òŒ w=ÀÈÎô@#gû÷õF®F–6FÆï–nQ½+ü[Ÿ³‰“¥È™ÑÙÒæL¤y?f ;S1{[[ ÈþúÄ-€&ïçîÁô÷åZÛÙ»Ùyý‡Ì,íLÍþaêâÀ¤agéè”ÿ;æÝÿÍp033s³r€Ž »‰Ó¨{8ÿt²üa~×àãå`ï0{—ô±4¾ÿ÷r6r@N.@¯;þ—àYX¦–& €1ÐÜÒþŸìïf Ù_ü~ÿN–î€ÏÌïíÇ`þãç¿OzïfjogãñOøŸW̤¤¢&ª¥N÷·äÿ:EEíÝ^ lVf +;€ëýÁçóü÷þ£þO«²‘åßÕý+£Œ™=€ç/ï§÷!®wõßcCøßíßû þ§ýu™9˜MÞ±ü‚?—üÿëý?²ü¿¶ÿÿ­HÒÅÆæO?õ_ÿ?~#[K¿#ÞûÙô> öïb÷Cµ€ ´ÐÔÒÅöÿze@Fï3"bgþÞç ,ìŒÌìÙ-%-ݦʖ ‹¿zé?—ñ¾‡¥PÙÞÙò÷Îû*fæÿã{=ë÷w‹óû•ýé¾OÖÿî+agboúDzrpŒœœŒ<àß;à8^,ï³j tÿ³ÅLŒvö ÷%€w>3{'ø?.–“À$ò‡é/â0‰þC\&±ˆÀ$þ_âb0ÉüCï‘ ÿÐ{¤â?ÄóÞ·ÿ%nf“ò?Ä `Rý‡ÞsªýCì&õè½Nè½NÍè}?íÿÏ{-FÿÐ»Ïøby''#kàû×À ôí¿ö¿Úö¿Ž÷âMþKïÉLìmÞïê?–?®ŒÉô_ø¾ð_ø®Ïì_ø¾ù¿ð]¡Å¿ð]¢å¿ð]£Õ¿ð]–õ¿ð½›á{¶ÿàûËé_E¾¿Ž˜ìÿ…ïU9üÙßcÞ¿vÿs"ì,[ÿ÷<Øß‹rx^ûi~ÿD29þ ßU9ý ßU9ÿ ߀þ…ïª\þ…ï2ÜþAÖ÷ÒÜÿ…ï5yü‰ÿ3&.Nïu‚þ|W½ÏÇøÏOè4_^°7á ¶ª n¿¯!pcø5ÁÊŽ4xq §µ+纯(ÆÿpÅ–¹$Ò=·ù°‰~ÄZòÖd­Íl­¿áÉ‹½ü½ÚÌx‡Þ{ ]àñÈYÞ…uO®«KÇÍÎÔû¬YuØíZx–‡Þñâ×|Æ?esÕ]¥Å,Uã1#"ÄDt$,.77"Dp‡HFG•h­Èì\§ ¹ó¥ðÄI‘äÁCêÀ(+ÇöàJ=¸åV*Áá!’ƒÜuÆ¡à·ß½œør†S€YŠÝ^ ܧ8êÀëöàjcç15!2¾L™Ý©KéËÝhUófé¡MÈH±Í8ÒóÍ"ÙîÆTÛú|´]â%­ËIê…žlTe½ååR’ú—>HN×1f£ÉyË׎LÇë«;'eΦÒ¦c4*«]y-²L›| rб¤í ÚñS ËŠ†µZ´1XœÕj´÷¡H#P D\<}<" Ô, ôæœ<“â±ÌÅJ{bj§bjFg:«=Åê3}̱_`¹ì×4 ë_€ï Ϫ5Bt•'u0‚T{Lf()ÆÍ3ßo õ]¶m {áQ&•N}š½É4 —ò^ÍsF›¶4›}iÙ! Õ{ ®ç‡Ãõ|®=¶|KO¶É<×JyûB¤Q;fö5¡Üg2×1Zß„þ‹pE’WXý(g¯ïÙ†P„¬ZW]Y½ë ybýµe=)ùER|^q¶æ²ÊW¡#°õßp¬`—ålœe.à%£†>èu.¾ùuí`Û+wò“ynº~õÕ’+”Àš1£_Ηïàûµ!I}œEl:*=Þ È#•#Î'@_yÌ.Kɤê*ÖÓvþ>WÉY=¡…Ääë—bLJAÅDÇcÖ¡&Ÿ8˜×vŧՊrŽ>R†z]¶«ú`¡ýªÁ‡_È8`DÌ¥=4Ãáå «ê¹/=ˆÐ¥¾…’tcU”$äÓÿD´•£?/oQYUô$ÂöA%NÃî`RvîÓ‹(7Þ£¨Þœ+zðüy¶v¦ö‹™¡F¨¸“šðG%¬lø*ZTFP0Ÿ®„ŠWþÚ¤ q<½X±CäûÊtq«ÝS’¡Ö †è¦cZcÉvÖ«™ºGJGNÍ1ì͘¨zwc¸$õ¹Ë}r‰PÇ™²qˆ בŽV`±ñš"á%Î3>_–MR„âH8Î:'f†xójƔɢ\/Ëüª? uôv¨ˆ_÷)œb#ÁnR‹:“ÃE{ƒræ§i¾Ì‡3­švP¹^ʃtç!+ñ „ñåAi´&2Dôš¯¿ÒMiUÒoÊD׋Mmg)ÒúŠ}”¯ƒã)¤Ó§müo 1š\\èUd9Id©°ê““¹ D(y1ðæ™s­ªª/ly«> &>†½—É_ ^R¥J«u™,¦íœôÜëyÈÀ3-q¬|¾N ?dïö# uÝš–NinéU5–æ*<§-ŽŠgŸH‡µ0ä5'P1O+Ø7‚)n&ó¶‚‹Ó^•µg o{xèæJx”À $P½Ì~›Ó7W´Ñä½8 –FX{¤.À|$ž¶"gŒ{øŠ!¶Š3"8soê´‹Öý)׳—-q\_Ÿ”˜úi½Ì#¾T¨¬zõѹ,ÄY<TÅþ‘ƒVŽðþ~îÙѤ0¯X³ð[Ó‘ÏÏ¡~åÕQªWU ‹µÖ!ȧ„mþàv$§ù>–m]Q6ŽÒTñ‚¬7ÈÉ]pu+"J“6 Á¬å€ê²„GÄÏm£iÎÝÄöyˆÀZŸÄA—OF»rDþ~)¼>˨¢{…UÌUl”W®_ØUx]†ä¾¹u\ÓÙ‰ÍùºvÝ.€ìÁ²êySŒêé‘<‰uañ>árŸvÈœÕõœONVcû☎vcµíu(°û!#N}øuW@°Ûï`Ú6Ü|Ù3W‘ã9ì:~"òÌý(9+é  æ•™_q6g.1*Åãuîe«Òœ NØxbÛ3¬ôG¸Q 1b¤qçd¹¦¹7ñ€ÊËÝŠ@U6œ¬GSA’O«1Gz-èš¾ßh—·(5hÖ%Z¬ R”¿¢AÖEtšüä¥êæÅòGK./P×&ž9õ’/äîβ¯äw»î1;¸,x¬ˆ,?dˆÿ2! å¶&d¼?µ9©îEñ¶ñFCûŠXZÏT~¿–ÆG•Jͪ¬ÇÿaËîn¶vîÞF·_ìyÉ“7?i+*ƒÊ›aÖ9Ðã Ö8pgT¼8‘ˆö$>9^Ƕ’‚\X”G˜tßϜǑdGÜZêïZ)KKb @‚vh¤c…óÝ<›ìr¡á“åkI›Û”em8œñÐcdy€Û£æEQ1ïïƒé–¢+t€x cÌ»7KÒÙ:%²-`וÒb‚@Úr.ªòÄ9Ð ¨G£%…¢sìà¿ bÆ”mQ3û-Â6»¯]Ÿ+y~4ÿ|PT-u nƒ£`–Ãß<bÜi96æîWÏKóŠ WÆr9áA€¢ …ïLgAï_jE»Ö”Ó@“Yõl)É^Þ5{تsÞÇë¢*M•´t“¢dýa\ˆ'ί‹r3%=q×é:7x‰ ¨Âr‰K00G¹E ÒsíÔ`»qÌméZoêÄd}ð;o±•¶ gñq|i+7PfÅö^7â>.ñ ³®SÞºe·(28ÚE=&Üø…†ýá*µÐ5}îkèU4êUùÈÆê8÷½ÇçƒYäC„žišƒk Œ€í­Ç¼o/Í,sѨÆMHâE£’†¡ ]•Ìw&ûM»vyªkAÝ2·aß=,Õ„Æ<9 õj¦Ž—oÀkˈ7$•LYMΘ­‚TA{Ð3%ëÅÅQv{“ŽÖ$ùk—‚ ¯òdûX·îi÷„[ÑmÓ•«°U³ÀÄÛ¦|’pHá]™[ŸâL3L°äš©6\Ë×§n‘C{g­F %&}9~GLy§„ÆÆýäè°ÒÓY–›™¡©Æ£öBC‘ÂÛýÆ”GY´gŠ¡r‹ÞG€«Ð§ÕÂÈK4ª+)Ì ·o¼xŠØ"BNJD±9eÅ£ùN ÄxÄ ¢[úþå®Óü5?= áå-ø°“¤Îü;’?•YŸc½[[8h1C.Ogþ twC = ‘CÏOöB³ýé½ç·‡ÏÈ©®hhؽ¢j ’¤°¡œÆšú-R—Ég@¢íµ‘ªKÉÆŽÓós †°X(5‚~f¨qëMUŸ¹($r\„~æ5ß…b.ZÿD:¿Q|w&nvO²¹!à_ª²¹Ãû|‘@ÝõásDŸo‰Z´³ëG+¿Ô ÖåÊæ„;Lç¸õ0 (W·qz`s{’<‰ÕÏèÉ5K§yЬÆOWu6®cßP‰Þü08¶;7šŠAÁó£*ŽcU'Ë©3RÖ&·[§^™¼‹U[ ^äÁQ~ã êaºŠ‰Xü&D¡æÈõàä>áæ¶?Da½/@®)ÏUû¡4Œ(â*$™’˜³Ñ6±ÓòUÓÚYÀÆÕøçd>8÷ˆwÝpŸn‡…×ùLI½ %¥'¡ ,VÆM ²Ö£f‡Ú£¥†Hô™f>Ý:Øl<ù°¸O·r„×»Ò9¼ìÓš2ÏáöÙâMìÉCOàüäºu¼‰€çÐùÑá¼!9Nò-{?Ú# üdä&ºô²”~NëMëeúÇóþ„ !­ñ$,.ϳâödôwʹjŸ•&²LZ¸5ø®ÇýP&ïDZBmÖ ÿ¹Q-ìn7‘”cëá*u~aµéÀàèªken3¼òA¡òßW•_Æ¿ÔÁXý嘶ö»äºt‘7ˆ¢ÉSæ–G"—NjåÕ‘8z%~Ò„’-rƒ½G–ÆæÌk“` «T š1nÖxñsK2‹¡3Vu5Dž»b Mù… p~|_¯:‡ßÒ æSÈù9Áá z…P°=Kn°|í [\ªÕ;r³´íùÝ'?Zœ{»eR¤Ð4c-/-S €,v&4¨®5x:ütÆT€¹&}N!= gž çg€ŽHúe |#ŽŽGbjU½v¬yxOìûyŒRËçúyŒªÙ{¤Ë0óPþsáÍzVyöAý.ÈÎùb;ýhîML¶/Ýçåß¶o‹ø=šÜL=«7…æR»¿8;­šL·bî©ÖM`½CçQ´³ÛSÇJ=‹ÉB’;›$éK\𪯅`ú¾›¯°§íO@y®£3Œå¶KQ€Ã*X®ÞT!Ê×ø…Î{é¾ã'?ŠƒãfvP» Z¶DàV«ýqjŸ ílÎÄ`ô‘ªýïðÜÑÕÏ2¨–¬ß{W.6ê¾Ì†súJÅ«ï“äÁˆô8ÊŽ@U¯ìÒÛÝÄ´ççžà•yïïncÝhõÉ`k£ÎrMjøvTÞô@«žQ ^B¬IT¸HæIŸÉNš¾A¯Ô;âí}ö­§—NW~­†tö:ö½¸0`R>lžä}“+_#kÓ$Ô*z¾á¦ê A 3'\s‚E 9ºýâ©Öny¸–òÅã&ZCéƒNŽ”P¦-ät…üÐéÛþ⌲muZ#ÌÙj™ƒ°½‡_/!ûö¸s1øÞwÅô†Lœƒ 9m#V²Gx¸Huãó •+t£îûÎXáïÅmdÁ¶Á•Œ{zÉŸvWzfÒ/ú|ŠÈÒñÐLëd¤4çß@Í0gŒ¥£þ¥Ý$“é–náîY‰xD^~‡ˆb×ëˆbÆÞ‘S¸•¨Mm©|µ;I\Ö= ‰»™orGj,—ßvex<×µºóG'MÅk á´¥Ñ3tMW3ã­:ýhØÜ×(ì^¨l`X~rJÅÕ¶ª˜ºë2–XJ¾‚SæÂŸV9v“èð§{y^¶››˜G¾×CYs #?‡W ~¹­¡GvLéMXƒ? o9`W-s»ìÞñ¡Lyê9T´ '’Æ$3 õŽÅOWÏ1­Ù¬}¶Y§ÌØÇÄGWõÕr%É¿Ž¿{²Ó䦓ápû¤'튱V×Á§A:ôø:h3J·g ½åœý2=drv¦ÿFÀK'óXƒ3ÖžNžb|]à¥æEÙVï:„æâSîè\Ø]B¯²]#Y-¤Ú)ek”Ýu¿f¹‰ÿ+KÈÑãùÈ8È}ÊLG>.V Må®@%Dc³ ¸z°ÜÒJ'ƒ]?˜:'Ñ2Ãs1* Œ‰¶->c)”3o!•r;OÂ6åÊ*šQUjçm\$XW 64PpÀšªEä /Ç—R [: ¨B„tûþDò€•3„ˆ„ 0.r“:ÇW}·4áƒlü¶Ã†Ô™ÇĺæLC£Q²uky[šü32ƒKu`é@=‰;°îw@m•û%k2$Šu*T8$Ú5ß[ûlÝöøG†©Züq•ß äœ:± bâÓkN’aÑ›6öÝÂFÉÇc€ø^5.¤;Gþ+—=z¨¹ÂudG“`ãþ+'÷RPêP†ÁERXÞ‹ º=uâ›`ñjoæS 2wJHÎYÃLÀQ¼Þ+K:ä7´Ãn­´èg‰³¶ {ÏÛY ²;¯¤¥§ü^ã<…=ÿ¾T?qqÎ<Wl‘´“ šBÈïiªà›hóâ·$Ù–^(—ëi‹Â¿'Ôx¡©»1ò»"TÔ|b®@Rtº^ ààN&oÅÁ²…“¿²VgÛ(ˆÓq¨·èIu€µ˜_øs»Õëb9¾öÔèL H&ÑÉÄðP˜¤ŸÉAá/:Qbw{U’|üq‚6ó‚MFã,-ÈB¿Òc“cV.“ÿó§!t¶â×L†Ákzù>µM ß߯÷sϪ€ß6úøH¬ó•²23?¤éE9\íq]ô7½§²€j9±ã”š±îߤQ~ã·ÆñZ·éœ»†rˆ* Á®í!<[Q B4 ›"Lm„.Ô,¶î™ÆJÞzm€cÀü±ÐᆌÕI^øóTg/ ÁQ8&Nó"žf1§sà‰®à!.âçCÙ„×¢µ€,¹"ïļsø=%اä"æ4“ÎV”; ‘GYĈÎöªPdnmæêüЇ[J¡S¤dëŽe‘f£œQªù­´LB×ާmCQÅâ›ñ´^"š ‡XÍV¯¦GÝž_–2WDÊn 1ý&T=ÆîG+b¤æMìÓ^ ìЧò«M•øàÇò,™•Á…ó M6 ƒ½­G½svÎlq!Z÷øóš¦gÄö¼±ÂÏ%ä×½Rwã|E1/\S8 B+׫¯ýr Ôùºžóì±°Õ wyÞtÑ2ŠŠ¹’#G„º©äÐölÇ?íi8u´$À飔ño‰å?Ÿéh“b½lõ>Uk·…U¥®e_Ÿ áåH·xn­<Q2óò íÈ6(\ËÕùªo9K1ûQM˜F‚c®EJ]ûçÝï;oZñ=óo3$ÒúZBÓ!êë•ÃëÈqnd¿«#ÝO9Pù±SŠÊOÞò°ù6²õ¿EÅâeûÚÔ²¥¹XªêùNG¬›æ—œEQÚ‰lÙ{@%0a˜ÞbH#êCBºðž—9 *n¼jý”kÌœ#ú=ê•r ²8"ž,¶?82 7#î§´ÜÍJi¹O²›ÈÖÕ8² »¤k…}9¶òà‘¿î,ÍÚFšlôÁŽ¿ÿ’ŒY h…°´ŸÌ"“]ó¹Þq¨„| á’Wóéét%H糑×>†tAi=º­O/N†WØ„õpJÖ lâAÎÖ·wêµHltîhä9@TûÓ~Q#yÊr¡“@(:n×^{b|mÒŽÀ@­²¿ê䮘aðʸÈv½–M¡«iv!x*Tž!•šbX\/#Á…Å* ›òk°»<ļ_é×z~øÅʽaœp¤.TLoDá1Ð/<Ö àˆ7µüSÏ‚ü\E 8ÕŒ$«çn¬¢’ï’u쾈¡ôtNãœ;£N‡ÂtY}×´ Ûýªy:¡ùlï˜÷:&lë”»‡Ä”GEÞSô"~¢ún `ÐÃÞe kᆟN[=ÿx¶#ÈÓü³å8WÊÊ-'…*ðŠV—kµ!›Qb TÚ0pp +|Tƒ¢ßžH4vÈE'Ü8ü:Äj5¤ÁÛpJÊ¡`=Û X W(:¿~ø8T‘8#ö:jNíÚ:l2——ê S7“ás~þü ‘xþƯ>¥$‘úñ»Kùë“Ƚ§Ñø}³ [‡É>œs{Ù³o.™ä/òz˯þö[0߬í/¡Œ¬S6?Gâ ¿Uç›Û´iª}–SùØÖç§í\°Óxó)!®`žê¦N¾Ø —ž µ†²d³5òWÖØÞ^ó•.;ç·:”š$7€§¼!jŒTßžáÝÊ—ÛÐCrP=“£Æ¤¥qÚqä 4º½ï1F†<)­Dú`“ Ⱦ›4 3ê34•0’ØËÌóg³4}1k…;“èÜÃMÂ×IR?˜,#6%¤:àdùη= å£ò·zäTÊ#þ1«ø¯°±]"w‚”ÑņI,Á¼Ì yÆ9ÃJ!“†PÈÂɾW9Tì/«OªÖÝ­Mž¿ªÄ‡Œ–]kTP¿%®0˜BÉ}î´×(èÆBÀäµõgô³‰AšbóÛÁ²&õéƒEœ~0 DÅËã)0Þ¾¤;õÈb}¨âiPVç.uˆÚÝ©1b(ÌãžJ›ÿÇ çûº¦a¥äU6Å=JZ]qøÝJýÀ£ìR Ù0r6uæa¨éçVŸ³®Š—ST¥í ÜJ¬.Í-4:˜âe£Gkæ’˜-¯¹Çµ¶ÚEJ…[<˜Úô†¼¶|H›»OX±·®ò‡•9µ³Ãtg7a”Ómƪ({†¹MÆjFˆÅ3~žÙ©7ÈË•e¯¯fÑíWÍâr½§ÀÌÎ%NªêZÀ²ºÃÍxB¹³HK§Z-M‘ê]Ïo¨´M’°‘{\;^1XÆŸSGk¾…ä¶ïOš-y1–ÿº®7WÖbòK[-ö®n;qÉÕD±Ôüt2ÝéÌTŠhÛ5¿ízøÔuéDJ4QDô0!B<’~.›ô0…6\È}Zo¢"%£¼™*m“3öñÁeë*–_‡ï;3À²k®Þ¦ JÀíH5)“çþ4Áê!åÊET/[ñòŽU­f1Ý(:¬±ÀŽŽ>ŠÅܸÚpü1¹jðëå¬FV<õ=ɪrËãk ¦Ymó‰ÙîÍéN·}Cß‹²£•4 8€ &vµc;¡ð9wÂuêàýË19¯êÖÝ>}byÅ ‚凰Y¨ª3ñ/œÈÁÇ{í~ öäkv¬‹¦pSì¼î<Á ùxf1TþìZ§/RuÂ0Òú™ßÌ."âò0lQÛò,Z.蚨üÄcþ-aç.Œº¼#ãàqSÌ–ík9r±ýOäÎðÁ:¼Š¬Æ—<ËÒ~a9øíV¹Í\(¦B¬ÞßÄÄÃìƒÔ|6Á­cå- ºVk}3KdøæÁÍË q~×’¢È{9šãIá·ûÒ#ë ){Ëo¸‰u°¿:§&›i‡EPâmNóQ -àlLñÀJ_Ÿ6²ó!¶h Å /°õ1²-z²™Œ‘M^É-v20ćêPû(mn‚Ý$qb*Û1æ÷ý¯%Ÿ¤š4¿[0"?ÈÙÓKŸY*ÝñpôÌã?Hè²|ÀYÖLÒäåo“þoQ™¤Ù‡¹œ¡qbE?QªC­t›N"³Wp„·ÕAö¨Ñ‘ž%Üc¶»Yâ·BŒ*î£éûÁ¡mœ7p®æ}=ï•}.jDYxr{î|'Ý<jÒdÕc9#D[]»)íf›×kf|%‘MA+!ïmõ_§ŽÆ<€fÒæ('£V…š¥úpÐ"PÒåB›|§OÑ9ýsAÈ«dLkÂiãô‹w?3c#Z-Ï}¯þ»%È$¢P}Ž*<^zp£!²¢Ò¤ÞáèÇ«\ö.Þv-ÜýÐ-ߨCN²ÊSÏ|p ñÇ(äOÁÞ6_\·|ž¢†u©Ä_É?IQ †sâʬüë¤ ;ª˜™äí¾ü>¾÷¢Ñ©>0Ùôhg/æÏÔÍyé•–Ä9ȼ¹ —Ùøò‰+Q÷ÕÝì·›úñ†ÚñQf®jÁ>ô_Ãm­º¼ìúf·¶€x¯ÉžÚœ™¬ÃFFk\ÓÞŒr™¹§¤$^çy‡ž½—(RL¹mmâòQ»ZY1añ×Ï¡ÂHëj2'á3ÉŽ<–;Öfa†FÏÖ—ŸÛk?{”½”-qšDÂû©Ä uNèÂS Ä L%»n’R 2,VÒ#šê›LÈÕÖ‰ ëvja“³Œ¹‰Ç‰Z*ÙÌü~c°Ô‰º=Øòã¶ë#ê/ÙžŠâH®ò6©áƒàcØ_PC•¥ÉI¸# á…Ï”Á34¼®ŽåÁ³õ_/±5öWÇñ­y3Rg™zà\·¿Dè'&Ö`ÂLΉü‚ú&#¿ï-˜áº-ÿësëµ'ÜÚ ®c7ÞÞˆPË'©”‹‡‹Ð CCWœÍ*S«à.LäDÝŸ­ÀÛ7Ùço™½=ßj´{:™_ø°Ï®ÛÜc¿Etàó%+íÍ_ünLÿÑp” ß¥UäªXŒ Ñ’I@8m)b`´'Oµ¾Rj×UmêÕpýÔ.ã1m ;®¸˜Ýs¡Çi©éëó3»‹î‚¥êUl.xæfW©¸ú"­“!À宼™ƒµ³!¼Þ”¥}㔞éB¦"‘·Ïuàþà«R%ž ca!^é¡YÝ*ªÚÇ$‰é‘{1'Y?‘™ Ö’Û@ÄqOÀã8R¦îºÎñ!–lºD˜ãt&—$YRCøµn³Vê7´)*ͰZ¨]§ç)Y ‘îe3*ˆîÚ«îû˜?ûŒN‹f8m[æ5Ã*¢Ñ©[ eŸÓ®Iò„{OŘ1HÏ&°RdÄ\ˆ¼¶¦[)6ÞÝ“ÿŠqBm§?$T÷¤(hRúŰºäÓf& u0ˆ6o¼E‰X°Üôe‡Yœöž¤Y‰†(Zª+Ò²){>Y!]§ë!(…þšB=.Î䆃_™3K“àbûIôÑ+Ò”Ìõ΋ìÿ£9_º©mÚ¶¦´Qeèñ¥¢Ñ ؉ÕAÂ…gÎòöÚr<êÆ0â{Ÿ?~=Qµ[šëIÄ7!,ŠKj¾¯¬1>c³æ¶ù}ÒŒeáÙ£ùŸ°F¦äÃf$ú‰":!H•ÑD˜Ÿ…·«‘v?<Ñ—Õl—.ôÅP5ìØt··»K2‚iHíõŽ¥vU#—@Ѳµ·;Áæà¦DJ:¨Ii.…€\=ÀEÞ:ùEŸä>ò7ã ãG2ç#ÞGÖ~ñÉ<œ{ù{?5ù ›äϬŒÈËõ—‚lëØ¬SBÞž˜’£ðg\‚¯˜AóZ´O¦5‹¶»ß.™}NYÇ!Œý¥ðé"w“2 iq}3Tñu‚§]«»T”~»·µ™Xâcä|ç*@a^¨@ ÏÓáq}ÅÎýŒ®.#^í­›ö3Ô}’üƧKí"^ÉJ­Kë vNG{dí”ÿ]OxF½ dô40-Ð<ç–:ûSæ2#XO´g°s€îòÊ!0Mu%x'BX¢ßü¬©36E#ÇŽµê[q‡‚Çc·ñÐ]ê…+õVðb±*YÙL=+8bÃéJ^¶t0%h¬RàÂÞÂ-q¼¿ŽÔ߸àV ·uКl0Ò ‹oˆa­B„^ã5¥886Hóã™äÒÉ–L¶’ä¥I >¸/Ÿ£oF rPÈ5²‡¸MVÔl5Ñ=™¯füaذYbsÃò?Ÿ¨¯ªîÓhU’¦ÞðkhsÕ²“ʱ‹~†ÚƘ9yü‘x­}ËHÄAÄøfÔ çœ¶Ey…P÷ÆÜV¤ÚÔih#çgØôëó}ÿHÈkäè¹´Ôzª@òô+“¨4?7˜=²DÔ*P|W0§·¤ðtûÇB>³q¼ì‹OŒ'a3¬(=A/Ђìg½› /m„y)" –ÖxˇgÞÅ~YŒ9Å‚QîäñzùW½õl/w >@§¹-øšQ¨¸»A»ÝL7I‹F~WÒ +¿4´¢Ô<)ûA;[Ë8¹5<-®ŸüW¬ŒKXH°À,Óãž—Q„0P9tIùºg|Ÿïôäu¢UŸš>3ªÖð…Z{ºÁX¥Z,Ñ™GÉÚÒÃæÄº±¹’S²ñ ›Qê^S.i»§ ©|‡gâ aÉQ‘BÕæºúG¦5TR—1lڄᨇý(áDõø†èj‚Ãê•>§äáúd'ŠèÚòO…÷b(T@tSv#‹ŽÆzNy½Åb(¬,¸kÁ§]=ß¹ŸMŽŽ9¡°8…½;Ó¤ëZ¬§Q¢‘SZªˆ\_dõ‰)ñ_µòF‹4°ëþµ#Äû¬D"EˆNˆF•šfn0A ­“7 9gÚ…£Ú¯å'K‡Xú c[¼†{"xŽ^E¸¯³”õ ÄÈ:¦OÃcAS»T4ƨlè2~À¤WùÌAVÆÊi•©Äñ2ã˜7ÿ*ÕR±VÁLëWJœšœt™¢èrJ-V‡!ÏTðK²}óåúí| _‰Y„9 ™Å˜ÃÐõÁøÓD÷¨ù´ ZÙTíBy×Àý¹H r¿·Ù›¯»Œ¥¿Y¼» ¡íãEGÇzï Ýžt9ü¢é7Å$—¡ëu&¯µzó+/›%QXV4nGÌì-ýDd†©®Àþ¥T+FÉþo½jŒ '½- íÛNs©–'²Ž#cèºÔo¥>š;êiุ`Bƒ7‚>ÛR­¾LÕŸlÒœ—Qî쎸^R»åiSè©ã>²ÓEØæu7Ö‰œ ¯"9˜¡¤}€¹Ù)ƒH$Ý‘U擞 ¦þ®ÊÝ›¶ãm8=æ)ÎÚë k91irž(M4óýöjzB™KÁô²ë|ØãY4·ÌÉy~§EÑÕpA„nÔÅ£è Vw/{CYdi…ý~j!¶Ö}ùÕ‘ô/ Þ4è.×¹b˜{ie’ÜÙôð_s¾jX:Ã…)qÒµ¶…Ÿê±’7¨¼SIïÆÛßû¨ñI+̈ÖÉŠ/VAFðï¾ Rv‚›²àª¹q>]N;ÝߤÍ(bÝ"—ê€~pÑ{ BàM¦âSÝ„³Éæa#xã–G¤ðE•ã³ÉwN. ëu`,šôní´È7Žb¿à;ç@mbÚutQŒ=†+…]&ß÷nfÚí ÉaQ’>;’Ði•¶U…±¬.Å8Mźow7¶!†˜òu¨.1h‹ÌŠèq9þ²ëH}•4:ÙiS?¬·¶¯°ƒ"ff8Ov6Aÿ,ggŒçf?_|LßB§±@ gkóë%¬ú•/éŒA4¦\œQŽÇ»ãδU%1>baýA0ÀZ¸¿2ÖB)ó…E:Ý·ÀÕ¯1ô›J*`¤ÜÝRŸë*b>ö ÷_‚JpHL³åQÀ‡žþ¨~F3Ú6˜–DËŽÅ£0 Å2·Èvlï>CÙîÖO/¥¨§ºQº¼ô&}Z¿¿ìÀÍ•vüPb@âÜO"*`2«Ë…ê6 R0‡ìö‘K*Ñ06˜VJj«Ò²%XاøËŒû6Ÿ?Lú‹=i›óQRAÅçXÙ©Å›?ÿü$Ô„‡Î{¤µFÛ à—Ž€DG­ÎU&–òÙ2ùÓHzÞs;45žas;é'%“z¿N­X·˜3O†ÊÒÞdTñé ­Û˜¥ÀGl (ÕiaËÇÒØ˜!D/™_ê(Í JëÅf»“˜º~Á¦x‚7·éLb#0’Oq%i.Z@.);Ê›™è»MAÛ7ØÒYZuÌäXÈ,Yía&×’/{CÙÐ’rãædÖøÝCÃDœ®¢ªÏŒn1šqýŒSÇ‘» ÷ÿFªÇõ6|$Wù_ã‹Ý8CK¼#Ó íçܬËÃAãýºh~EfOq÷âºóM¯7I? %£Êz½1XUäX‚PÏ]iµr„‹*e'l¡ðŒWˆÔˆh(WÐÐ;^M »$á¸û¸ÙF˜)÷ô¡¸¾N?«ºuj’{Ý’Ë&Ñö\7Üø%?$³«*Ò8„Xú꿞 ]ø.À£†P;~@r Öê‘=IÑ„6êoú6‘1Ž„5( ª™Ff¤@ÁuTšÔì –€ŽY‚n3’—cДþI¬ÍÑ-ÖÖeX&f†Û°™#¸ìج›°US&1,6«û戦tý’#³pÐ#<^þ”ðÚ•†k§ã–ÑÓÿš½OŸ\Ùï<îæ6x°0J–ëÁôD©›þ}­JBž·VÁÕò…mr'…þ¹b ¦,bÚ5_ì{¼_gí„ZÿÖ$eÖ‡úV ¥âKeú7*ã‹nbN¯g¯ßŠþ8‚‰®ñù0IÞÏœHw.ö]u&ñ—¼¨†Öæ+ïénº\ícuuØJsâóêhð¥P%ÁŽ[vMÝN³k ”ëžÇõx᦬4er´a‰ÎRΙeµÛ~.)TºF§vÛõM…ºÐñT—V:láÇf7Ä>z©øÓr–ß*„ûi&»üdÃ;/Þov¾î0™tѵäÙÿü¦™(Êcëõ³­uµÂÛ¦ù¤<É –¤¼KÉêÇÕ.¼ˆ¶ÕTÚš^KÒ„u¦˜ãdH±8«nÉ#´n yã§Áá²\ø¶·C™Aɰfâp¶˜ýa ¯Iƒ<ÀSÎ!ei¤Ø¸Êõð)à,yulÊŽUñhŠè¨2±á8;eG³çPj›îÀ¥L}dîlüØ´†êâôܰ¬aÞØ$M)tùtJ¡BM¦v§êúzs1¨¸K6ZöȈ¨rYô=÷º“´RZ3”M¸Gô}[_–dÄ^‹?oMÅÞ»ž‡ìÏ’1×ÛÄHü›‘n8ðþ]ÛÒ$3íoV)7 ’«q\w\cøQe1óÜ®˜4ÛÊâFßÎO^´Ý k–[<±GûŸ=­Ý‰H)Z*Aœ«‰n9¡Ë¹UÕïD m‚INKHæô®«¤Â…Ú*`I*M½ù§ñaÀIV„2»á‰7Égû>!ó˜TâDÛ#8wGX°ÀÄ[æ´|_Ýò3žî8éδÈ׸éâÚRo1-Z›õ)¼@)2 3?…ã‘MZJ·ÓÜ,ÃÇZÕ½œöŒ„l æ%ïhòÇðooÌwNèþüP%¦1ª¡~ûýÏÂíÜe’²(1A8føPá•¿ÞÒ› ëÌÎý_ëÊàšVöˆVWK+d·ÞòX„æJ&†~8U(Ê 2¦ö!úœß¦D')êYˆ©šâ$¨i"E‚q¶6"iðöOÖ^84ÅØ]°žˆl±¹óÆ)$´{¸º,Z7iÄ`ÊžâÞ&l¶Åˆ¥ÐHDfªùÁ!•l~$ÎRü.îã ¹Õ· 3¹bâä³ðy*£o×á`Ûv^ÇYëàé ÀõC蟤¬ËçsO,”ÀûÍøâ£ã¦Ðÿä™]¸á£q8°Jù5_„ø‡$ó¸Nu€w+RxÌ–èá'žÃ’ô@Â9ýö¥ä]ÛßDåé;UlëáFÉ.Aü¶G§ø[ÙêLOÙ ~°^éñùýs(ÃK½*õÂV iVÖ¯*´± úc ÛW=ìá»dtS^h‚*€¬›©QC*þÇaÚ3k6¦÷]ÒWÆØÄ‘ Ó´søV ¨àsŸ)Wñï›|ÍÇEFP÷~:V î÷`gÔõó¾Ó‘òÚdQaÒPŸÇ‘t¨¤¢\Ô$Tï€"<6ígé&‘ظì"…©«.Q&X5ïø dd?¥cΕâlÚºAœÚÌ×2“ÔN@\ /ÙÕ;=¡>1­ Ë߯vÚõ¢ åG‚ÄK­ìXM;ú¹4™ÿ…«´i¼=áÇ?6xRE¾F| I¤Ñ>7q—”ÇßFf-NÔy°9V‘îûQ%Rç& äb^:ÛøR±íí–Æ@Xi‚yT^¢…æ'ò8‘évôvì?c ¦‹‰¨ÇXË;˜e£†H^Õ'5pl¬¸" õk“šá›vf&}}§YïäxΩU .mz+ä±ô)Æ>þ†©bþ1k‚ÊÃ3¶T¾”VáÃFñ¥Åõ¼§o®[| XÓî.$—CL"¢"_´Åî; .:½N1çÝ~±+™×Ï Xìè‚OæEþñfåf_y ¶wè² õ›owÆÒ¿æ†ù*´›'´¶çEëV÷ˆöÐçål†ßp¦#‹}ÓN:c‡Úš©uki­ûp?Þõ¦qŸ´k²Õ`&‡Å×ç2Tï@;ŠãGƒÎ`ô‰’s‡<"ûÕ ¡Þ‘£r·‚dóIz×Õ‰N/…GqÃÂøV³ŸýXlÂ@þCKH }¦¢hõD!¹´Û‚ÅJO1£!¯Ãڞ˥qõF"Ó­gg?÷3Î÷DS.$#ƒ²êyV¾ïI»[ÄåcFC½á‹M²a_‡lª:\YÇ¡¾ÖRІچóSUušRóÐZò>™YÄúK “nº QûYyb ‘µÿh2ÖÛÔCrÛfúEŸòûƒÄ…ZïAë …® ÿ]Wþlg”‚µ˜*݀—® ä[õ˜Áâ µq–ƒ”&0®ÙóA;Ô©½ŽKcB° rE™¥áÜ»vÆÏÞÆZ_ðB_7[mÿ€Tµñyƒˆ® û$€—E¼Þݰï‚f#[¾f¦ÿòAòtj%*`ôÉú2v ¹€e³æ„¶’y³ÀC dOWá;w«?Gj Ó—¢)2)FÆ^ò¼z3ÕÐìü§ËHèPPe˜*sUÌ›‘EÉuÍ£[’»Šñ§_U-6ñÜ/`ïÑääÖÀ/9mës‚Ýx·H´Ø@2°u~n|?ÒÈN>â^4ƒ·äj¥ü %¦wm.¤ 7Öø˜«yæsƒ™~9IŽÓN½sè)pšZRÚÕÑTò/Óq¨¼c4®‘îª6Ûçë]²8á‹ÈDÍ7ßõ¡ó= xdíäÊ ]ËûtÆûóÞ‘‰ßÏ2TÓ ¼ÛôÑðÃSœe§UNâ%ÒØÕÙ5l¯€Åò 2jw¡³®ß/¯S#P†˜ËT]ŸEu {ÃVæPv¦ zxPßÒEÒû“o¾@ÄC·èÔ‡0¾ ÃíÎh/Ü÷(J·«x;ªfÞO] i³–ªÂ]"_â˜B%V¼ñàã‚53qÏJõËŒà\>@R€­¸ûÈ"õ5o'˜Â„Ëìéÿ àýZ¾Î²-†¡ÎÊÉÄÁÞsâå+”ȇc™ÊÉÿÀCdÈn*§LŸSÌÞcIˆÉX¤>Ĩ"šo{ã«&ÜŽBËx«ÿÄÜîÎöý¨ïs9ú6¥$9éãBXn,j²dPŒ·°(CE6|ÓµsÅ–#8 8…7‰,9×›ùÓÉ`xÈŠå°Zh´z÷žÃÏ*«YŸØ±M¹ÿÐ@j¶Þ¿²ŒfA#Þúí‘ëm)n W5í[¦%o³žìhæßY•%]$ ÝiØ/ºçÊë1‘eW^xSÄ ù0ˆõO3”€9öMØ£ûfV5I!T¸feoƒÄ–ƒU÷0Ô]•z 䈑%|q¯ˆmtèîx¨CÁò=a¢äܵý§F­n¡Hã$¾ÊÓ˃Ð$¯w{¹`` ~ÝéÆ|)v®EÞƒ¢å|:y}ݦÙÀKÖ—¹ç›…ËtŠ-öÙr±èÞþÜIÝG09O:Oõëܪg¢óÞ´¾˜Aém&¿5ØYLg)ZB¤‡òšÔ ùœrÛ îöj”;l‚#t³4öÜEœjwV´‡4D›Ç!MÅ!“À36#ýŸRF]µöhŒ,ySºïÝ£ë<.•΀ ÍÖC«@Q¨€©íÜ»ñ!´gìíÒrRÙå`K刲%Ir/—ú2è¥4›hŠd‡tµ‘úy1æ¼ÚÇ3Zã) endstream endobj 61 0 obj << /Type /FontDescriptor /FontName /OQSBWT+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/B/C/D/I/M/N/O/P/R/S/T/U/V/X/a/b/bracketleft/bracketright/c/colon/d/e/f/g/h/i/j/k/l/m/n/o/p/parenleft/parenright/period/q/r/s/t/u/w/x/y) /FontFile 60 0 R >> endobj 62 0 obj << /Length1 1503 /Length2 7225 /Length3 0 /Length 8230 /Filter /FlateDecode >> stream xÚuT”k×6 ÒÝ1tHÌÐ) Ò­4 0À3À ÒÒH)‚t Ò Â€tƒ„Ò©t‡zÎyÏ9ïÿ¯õ}kÖšyöÞ×Þû¾î}ígØ™u øäíà68 ÉâJµ Õ@‚ PˆÄeg7„"] ùqÙA<P8LòEyëS#oZp@ÝÓ€D%Ab’@ @”ø ÷(½ v-~€:Aà²+ÂÝ|= ŽÈÛ>=¸l¹ 1ÞßéyWˆÔ h‘Ž×ÛŽ¶`€Ü Aúþ«—´#é&) àííÍvEðÃ=pó¼¡HG€>ñð‚Ø~Qhƒ]!RãÇe:B àöHo°pëpÚB`ˆÛO˜ÄpÛ` ¦ ÐqƒÀþkþàüy9?è?åþÌþU û ¶µ…»ºa¾P˜Àêè¨hò#}¼0Ìîì‚€ßæƒ½ÀP°Í-à÷ÑÁy=ø–áŸü¶P7$‚uùÅQàW™ÛkV†Ù)Â]]!0$÷×ù” ÛÛ{÷øs¸Î0¸7Ìÿ/Ë ³³ÿEÃÎÓMÀu÷„¨)ý‰¹uáþís€ "@ P\Pq@|l~50ôuƒü‚~¹o9ú»ÁÝö·4 P{Èí®?ì =A ÄD€€À×ùÏ üÅþ·W ýótÀ¿+ªÁìá‰?HÜÞÞ_D¼þTןkà øwmø­ž!®¿åoÚÞ~þÏKð;åÿ§ý_UþWùÿ÷‰T<]\~ǹþü?q°+ÔÅ÷OÄ­ž=‘·»¡¿ÝØCCþXh-ˆÔÓõ¿£jHðíŽÈÃnuÎæ ÿá‡"T >;](ÒÖñ-ý5ŒÛ.PDŽ€þzïÜfÿ»]=[çÛw âvd¿CÛÍúw_e˜-Üî× ŠˆÀ`_\à­ÎEDþ Û]µƒøü–8@€GÞ¦n9ìḿ+* PøåúmýŽ€Ã?L€ôoÀþa‚ð˜Â˜·¹ˆ˜·¿ÍßÖÓÃãvÅ í–Ü_öï÷ â±Å™„ÛJ…;Õ„·œUÉÓyó­ tÄá<^Q¦ñZ× U”>?Ê–ÿ0¾{þt[°øgƒ³1%ÐÙòk@F¬$åL] –½Í2oÀ0©ÌÅ6BÓSpM£½ÝÔZfç@¹û^¿ÇûHnŒ›Š×}u"kSUšã}Åi¹ãî]Îú~|ŒÁøØ»ÔââBøá­òY­ Õòcãmjlˆ¹Áï) *›ç]}‚"KÝ_JxÑ¡‹t[[nGY[Ò7:Di5¬‡cì+ÊԗϸBZÂC¸lýÒïõõù5SžØ5oy­¨= u{($~?nýÅ~ò™YØ,Xqi0·»RÄíH4zNÊé›R3šgªÅ¼u˜é°‡Vª1Y刑հ½„Øä á-äyøå}¸¶hIfkø©€vã‚ìÔ‚KÏx¢äÇ}ùŸžó» ®›\÷^,Go‰·¿#·Í£Zô‰9OéeðzìK3ÉçXmñ³X†.¼¹«D ñî*ßVbHœÓïæ«•ŒÊ:¦#03JŸ§‡l8n~‘º—Wgø°uGçî#á˜9ÿ1W9æ7Óùêl[òlýJRkËèkwŒpÞŒ¤ÌÓä–?HŽw°Ö¨_ Hçù†Óé›ìðœÚ‹êwJØàád{Žp2c[˘¾@ÖiÕŒ|e ´ƒƒïm™Ããj+تÈ|o\¶Óª²!©´ '7¸ÕÅãÈwªWÙ$²H¦yA6Ù å8„m™û¹àmá\ƬAbÓú%F«,-Þ}:Ûe¹pûxBŒUê„)ôZêìÌ8™Ù!W ýÆ×êFØÄ—²5Ä¡×öä*1zv¶Ø{s-$ÃßC{¢a6x’Ï—÷J•¶ÏÄ+ò´ð”•V…Ñ-W"ÂwóÂè„Ü ‹– ÔQáåñuR9¦f±Óë æ×Ô\ñküIfÆÍè[Ÿ|vqß“æyØ…v>Éb_I¡nëùÓš ³Lœw}$$ëçuh¯¥‹[wÅBÌr3•Ãê€ÍSÜ{6 Ä0™ú”Iù ?÷žÄˆ†ÅŽß¯Ä—‹ å]5»¶¡@~]GèÓz†ÿ@Ýy½j•Ýêa±êû²pä׺o´¸GJqzNE&³c N™‚Š—[QaŸ‹š&va÷gÒ{ëô„å+af,Ï„‹’d(¦0‹ÇZlÕ;ðÚRËÏtÐgÁ¿É&þ}ÕÜæôñ\V*¤N­Œ*W^µøÙ’‰n»†EoÑÌÏÆÎ …„ÕJðÈc‰vù§•J‚jÊ_w®ŸhhçTóAåÙ‘¡¡„oñ0ñJ;ùá>ø‹¬=èMŽJh,‡¥"þ0ÚîØ“âhv)~Éè™Ê@ ù”ÄðÍ‹†r#(þ™ÌÓ“ë~É¥Io/¬ÝŸ¢xÒ!Ѱóeò ÙGcÃ÷ƒ·z£â^”}O:ªÒÇ[öÀ¨ qEx@Ÿ' ÷£Sž©/c ÑÕ£_þLK• Ù+{XÍ]¢Ú/d(?$d+-åÌ´0¿bÉìÞkzB[Ã"™;ÙŒùXA¬ÄßÄÔ3üÁ;‹n™4ÇÙúÐwÙ4•¬ísSï’ûvµ‹P2ƒâ4Ζ¦ƒ¡v$¹5>-˜ëÁ8 ¦‡Œ{Ä[øx_?ÀQ€9¼¬{ø– Ä©‚ÉÎ,íÕìÚ‡¯BjYþÌŠ`T›É±*t±˜±Ù¤¨ ºWQD½ÜQeÀÔ§M´c<órH ο üˆÛ29×>ÿ;HºÿóVî”ó`øÎ½:µ›íh¹ŽæœT)ÒFíU7N öÄ¡zií ÅPŒð<غ3­ý#hä‹Þ|ãògAƒ¦áõfÄ´.Œï¾K{½Í›¸H5Rã¢ÀÏL¥„vþ2•¡"ì´CeŒN6;øµŽâ+ì„`×÷„-·Ô§Ýgý»ÊÝößXŠPÞ]gôΨ»º iˆÃ„Ãse*)µ…ÑCjü`?¹5ÆYšHýúÆBùåòÉ•V֜ԒþǤ?h…vwHc…[¨Rªˆpœ¢ (h›Úg9ïø“o˜yõ®‡=(t7/þYw‰8ΠsÀã5<Ô¸¦4^D£>˜²p€ëïy%¡«õBÝŠ[Œ…­pOä·E¹?[U'‘®¢Ï+p¸Ö<2:®™•Q/zI#ÑèçŒÄ‹Ãœ:BƒF hß÷¤à\´ ó`3œÆ«äŸ'3¯Pª;>Xà~©6^e–dÁR}§çú!Ál­"Å0z¦¡å®´õÙÈÔãÚ]F£K7¦«ÁãABÏî>¼&çþ%˜°¢¨ í;œ”ŽŽ@Q 6íó”3‡+ž²ZdKΔy‘ÀS':á-·úhÎU”‚mÇ9WL…¦þcsþ"Î…UË£ó9‡LoÝÊ~>¡Ž¼ž¥ËŽ/«8ÜB‘NObþÉGùGGn~9‡‹½ª¤jÁì¦Æ¶ê¸Ûå >Ýd?.L´__yØ×ÙzÓ®½(o S(‘ÅQx]ŒÍÁ)œ†Y¾/͉u½Ø®#+PB#ºVáPï?ð`€\¼dß±¥€R,ïâ.E”ŠŒ`†¥îIŸftÄç)É*9_>ßÇ!üð¼Ð¼W¥tò5vÛÍŠ_s·ÙýÒE‚Ya,‹F™Š°È»sÜÊÖyiƒ}¯Öã‹MÔ˜ÕO ía’Ôó-&º^8ÂÔX;bX6c"¼B¼f¾t·xªœªjKñ‘»ôk §A¹c.yUëá •Ïš~«¨ì€•=ƒû>6X¡ËZˆPîÉþ©;ä¹qÄ*Ú„­ÝÑF…yõ‘w]qkW’+rÒì[\ÍõrŒZgÄ<}Їz”ŒwpØGå\æÊñ-f-¸Aa9N.7xp(s€còñP­€0ž‰¥Îel'qû¾5 £­àÁ2Lÿ¹²U¼‹(±ÊΩ ¬ÖàÁî&6†}6ØÊðÁH)~¥à2ÕÃtB`“·4¼“Kû cyîaÇl"ÿSÅ„)­§0î‚“¯?aÔè‰1Û?=,ñèMwž²Û³gÒ~öcr»ó´ÞüÞÇ÷\t¥]ísñ«¾·9†"*skÉ}÷‚Énqïò4’'ˆ»Ôb×4± M"¥Ö0¹«dú‹Ôë¥Üo/Ÿ@BBÃdbXõ»Ë„*8l|¯iqö¥ëè°pwØ<æ]ò&£ÃÙú›`F.Ûô%†ëÕ¼PÜD÷zªÝŠ÷wæóåÝíÂò=»Ö3úD*ö¿w‘|XÊ@•ªƒG¸)GÛ¿Þ“Y1㌰'x«˜½fq)¡½ÔšKé—821ÅÍúèÞз×­*$ÛÃé wàpørÝ 9žœí8A—»¨„Q‚ _?ÀT»|a®§äÝçüL”øyÜ%aö×ò¢LÏ—áß„9‘í±BË5lîP–—ÇãÊR´jÃßúës¸ ~ÌZì.'v ĪúÜYÛÊmÉâ±U<úýóÅÒÀŠì‘–£DKÖÛ›˜×ÏÀ©œ®ÙE­ü»½ŒË&Õ›³Ï‡0‚Òù  W1©Ç<÷·íÚƒCŒ©ôÃûèÕLqBãŠ> ©¨ioܸ…(rƒxÎwôÕà:¹²?=©Ucð“âôÒ¦5Œ&é…º1Nã»OQ"îK ²LÛ¶÷˜Ô?Ȥâ¬Ô– Fd£H&ŠF it¯¢GÜ#Mq²ú˜ˆŽÖÕ©|ö%ž8b:=7 Éö^`ll‹õCóKò¸ è.Qp}ó«“<7#Uv¬µ&ÞÏ«×*_¾¯*Ã×4›ù©½8 Òª9dQޏuW^7Aäýî„ÓhåMÔ.‘-˜JKæõ2ò–ð¿f[7ØGîÉ8©L[Ñ »)£-­ù -x„V(œÂQ‡Úï Q˜¼¾–ÖÓò6ú=w¡fEYT_%B·KÁ+‚lö+$'ÑÆòâ8¯]j$ßÂe4}e½ç1Ç&ûû•$cb}Z‘h…ñ·L?ïRµ2|ˆ sWÈKÈB‹›*¯+øHË¥,IÊq«Sÿùøzh'iÿò‘qŠœŽíä¬un^1GR·•v9-òêU¬N¢ƒþ ,‰oß&±ÅÍ{¿×ÃÈõKg:ì"wô—o¼Ÿ*9¨Ë4cr²ñŒpbäíybe$àh}äTwEJ:6Y|h‰‘p¬ßh6J%Þ×Þ2§í¿›,­’[D†ÓÁ16„Ïúie]Šó^±Qš`%™ÝŸ#ÕÙyY+Òp-3MÍ5‚?Œ=M/º¤x—<ñ“ÊG¬Ã(œõ«ÃÃFõ”ÐI<ë4ù΢"@Ú ð’t¬W¡Ö‘¾gC˜´ :c <ª&ågõË)7ÚºòbMFÍD­Í(:.''Ù'{u¯Rê£,uCJ’ÃQ¢®¼ÈË~…îôÏVWBPk¼â7J_o z^{<½ž¬Rå|Ó²¯—ÅÁzUÞªôɳ!=RC~©_÷xÙ凮þ…m ö•Ö¡©¬&ôj#Ú¹õ\Çï{$Ô”Èäá Φê_öýÓ¦›Z’¯oŸ¬ r·\‚¬ý*>r£º©œ§ÚËæã/AžËP™ì l†{ÿ˜.eE5ìŽàxïœK%&£è)²CàwEõ\”"‚ÁnËfí¯ñmwÙvl°Jâuj»b „Úç;  ñïlî,‹º£ÑƒÄ™6/á÷'ž ܨÄ%"¼øÆ–å¶Ì…g–k»êrã¯ÇŸTÑ~ÏkÒü$pÀŠTØî¨BC ‘¢haÌå,@ÛÓ7}€S" VcÕ‹é«!­ Ÿn¥±l‹×÷ôr^m<ãÃöÏÕ^Þ; |^!…´#¨å³Äíú=AskQÜè,Usc+h²¶á¿Ç÷ÇžuR0L`ª‘0JÈÚ.G69¾J- RÕ·yÏ(n-Æÿ\w1¼Ë‚Ó@£tŸWCSôé€zäÆ`;>§L«ÇšS˸¡gƒR[¸j8ß +ôæö?–“lTS‡»6SqçÓú%lîB :)5Ruhàøñxµ> §¬>X s ™÷*w¿øxª¶ÐM÷A‰çJìqñìŠHˆ_‘jþ—ÄÛé}÷Ÿ«8æÆb^®ù®wžsk;ç¡U=Ü¢=Þ"#Æì—¼04?jPÁ '-Šß9ŸèþµÝNGȆ:¥SÇ} £mš…‹[/Ë`ÙA‡î™ÎÎ «Û1c.&}›Ý@]ÙĉZË Æq\%…ο$™<×à&öu´¯u(pœ-<Õ•' Ÿµål1`2¢âÃL x¡ZûQ¼'%@ ›…±ùƒƒFy¼óG5Fjí¨eðˆ¿“’ô¼”[h]}D§ß“|/k’OQ•ÔÖF@ù«utgµçJvTž¼ò–jF ý+žðªo¸cÄ×ÜÁ@áq§èêðTT6·‚¼KÇ÷C91…³¢lGFßX8šB—}÷R£ùÚÖ3qªªD¯„’?f•÷%ÆGŸh/¼³3æ­ó§– ã0zËÿ¢páx¥Ûª7;Y¦çï:ÅyõÔö 3´’f‘ÝAëAE&:ÔÄZuÈL‘“:aä…Ë¿É'Ûü8‚a FÙνÉýÑ›ŽúåüövóÕ p!—Ù¸«ØÓ‹†„wJDWý·9V°ï&zÚE ôû´0Nµ«·¦Rh9‡ zÿ¸°Ü*(¡s×›§Kçfn´½ë.¯LÓýâ¹6ÏÏ!FdßfÎ-òc½bI‚¤íì êd±©Y´Í¤k³#,Q„^&ﺖõ°` 0AQ-é¬Ò db®I$äPúW#ĘQ´NÜÎ'¬#Í~ã‚=Òïß”Èiö÷‰lÄ+H(†Î¶PFòž`Š m¾²)?2–l`"ø˜°Ï`…þ‘1ŽA‡8 †8³Ùü„k¸O ^=á²Â‘ï•ãÊŽÐ :dnúÚa,/#Ýé†A”WFmžRÑÏ$™X.Kƒýþªä3-Ý KÂÒU¬Ãf_²Ë¾D}í·Ô@ù«ší¿´$å±ë¯'g›¯³R¿äqu;nÏéSóó³äúÉ`8Ögž^ÉöÖúmóîã)=< OBPgÆN6—Ä,ˆñ¦Ïª¨žçÚR̰E\_X-Ÿ›-Ô1.qƒ²ÅõSê40†_ÕäfÚ]UniÆ^ ýÒ¶µƒ²³µ!™3ûz\P OrVô·ÒÄ$u 5ó±±`bݰÊäÇæëÄh§×ôeÉ)­.¾~é!ý6¤Þ몴QKmn_Â0¯Æb+6AË—…©Ýk÷V«ëLÔÁï©îÐËY2EÚŠÕ•'Òé·‘êTu'£Z8ßÓLB}ïž±Gc´ÒÛ¥./î×:ùÅW⫼ð] ÿª*A…–š¨û¬Á»6öÇGÈw·AC²ì3‘ÈÎë쯵<Šw¿®ûiPŽ„Ç?|仚ü±¿Jª4îtÒg& • ·%Ы ÁRŠùŽ!œ¾Àoôógr ô)ÐöSÃý¥{¾Qge9O¾}éiZît§¯ÁHÎ,dVcñ’\+aáFð‘U ó¨y—"ÇãOcCɨ¶ µ¾¶‹0†ÃmÜ6Œ3ŽB×FÆô¡ÃY*ÄÝØÆ©i^f \—(¦N‡=ÆÝ¯Gù ñR-F-¤=ÀO9HÑ;»!<þ”RdÕpT0ʆ‰^¿Bí tt™h¦[7rg(Κ_D·:ÒÖ>|¾Œ"YÍÇtæÒ ¶}qªSÔÞ"A@ì'èËÃ0z6ðM!º%HìâŒqº«Ió’¬âpg-ïõÒYyFã¾\A|ÎXÑ÷æ×(I«^4ò—¬ÔDLéI Ø´ù C™ä»Í¬äA|3ËÐ {‹‡87JzMJ¢:Ê´‡âLñgüaäÏr/ê!WyÕlÏ=>ï¸n °}ÓöçÉ^™ phL;Ü4sÙb? NøÁ€ZN äx™¢Yn¨¥¨Ó\¼4kñ´Jø}˽MD(ú‰¾¢H‹ó{£ŒÓÍÀBšRg r,øbºï;øÞ8#[gHÙ«:‡—øY´Û-$¨ÂÑI” ÀdWLÒZáƒ\0s'.‹7Ì4‰g4Ä ¬ÓN£–MÀ“&Ñx»^NEjðiÇ• t!¥ýÎÙ$Yv+þéêÆpËÆÕLjI=—÷2†ú Œ¸Pû²á Ýuº÷ÓÌGYŲG‚ ÒæJ:O»E%¥ŠMJrOÚœô®Ã;q ’öA”¯“AàˆlØî£†©ˆ˜yrO/ "79À³8>œÙ±>â~x‘y•bXì0à=žõMjeFEª,k¡è»'Ê©zO.3?‘µÉµÎ…%jøUQ˜W:6¶Žë‘Pøµì~öàñf4Üdˆ|pxEídÁ쎛e]cßSÄ®A85çì|ØÅ0]ÛD~Ý`]ñýº$B/ý"ºga¢´C˜$îë[™W“RbnÅšÖoÍš$óÌmW (™ž·WE]ÖΠ¤„";x†:•ýtÔ‰L×6p±Öm¶ó·©Ûß<¯fñ_Wÿ\Der¹¯=¼gÅ®zøÁmSUËŠ+è½a+:z8.ïDVÚj©D^1ù4v<4Y–S_¾o§2´ÈPáuhÁ%›Ów‚9¦½)úÖè9Ç”ö÷­&”kk³•¤÷kýHíå¾ÒX Ññ›ás„,f¤ã+Šèq¬L¸ÉÄJÆÔ qÆkn„²m~ñEÔjt‰’âkÇ0ÉÕŸü~|Û²oßt„Žä›*$(^É#w0¿¬0~¥_ëÇ۱ǶŒ¥$Ò, ø–3&_ }KáÄ«Þ ¬Ãjâ<- "©ˆˆ,Ôm áÿ +²©:u(»3Ækxo…%W˜ìÍÛÙóÉKKâÑò…xÒ´4¯Ž€¤ùyMØ ÇA¢@þg²yd}[møn3UcC‹ŠkªO+Z€@VõòÙ¢ÿ‚¾ÌlȬ}ߣžµ&·Xçµ Çg\gÞÀ༃ßÙ#¸±w¬ÉðRZ¥»cÒ™äh§Ë (w%ú ·K7·Ù0ÕqÐgÛذ&<0`~ì:ÔÍ#ì½VJDr|YÆ|òv\åufWØ`YÊ„‰õ 5#å±ÀÑìåI‡0¸ôÙ(@ cÝ6^É}rµ6nй'»‘«tæ[‰35†ÂMtF3nͶ »Ì¦1Þk{ó²9 —½‹Ê)•ÏA«hÄi(ëSÿù†uÒ?|+ë`'C¼#ÔÁ‚`]Ël<¡á³()gÑPyMµ•&|ÂøÔÉJl'1N¯Ý@ãÉm®&}m² x¤é9è°Ó«JI׉% G2žP¯Â<0uh@rh9à ¶]ÊøÆá=Òå«×’’YäoBÝÜ‘¾ Å Q¦IŠç/‚@}µÓβ²)•?U[1–vŸè0BåËípÑI›Ç‰z±p_߇gB¢Rî$?±²2ê%‘ $BQ©äîEË¥ž½"ί!óÆî‚ í¾ºO34W~€¸´ôsèíXg”>–EïMÖ'k7?$¶:áî‹á{¤¬l›|‡KÖÕmeàHPßu endstream endobj 63 0 obj << /Type /FontDescriptor /FontName /TPPKQG+CMTI12 /Flags 4 /FontBBox [-36 -251 1103 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 63 /XHeight 431 /CharSet (/B/g/i/n/o/r/s/t) /FontFile 62 0 R >> endobj 64 0 obj << /Length1 2325 /Length2 15896 /Length3 0 /Length 17268 /Filter /FlateDecode >> stream xÚŒötZ× Gmg'mÛ¶Ó8;¶mÛnlÛ¶m4hœ´Aã7ç¼èy¿ÿãÞ±ÇÈÞÏô3ç\k…ŒXQ…NÈÄÎ(ngëLÇDÏÈ ‘SUeb02²Ð322Ã’‘©Z8[ÿ#‡%S::YØÙrÿÃBÄhèü!5tþ0”³³H»X˜XLìÜLÜŒŒfFF®ÿÚ9rD ]-Lrôi;[ ,™ˆ½‡£…™¹óGžÿüPS˜¸¸8hÿvÙ-Œ mr†Îæ@›ŒÆ†Ö;c  ³Çÿ„ ä5wv¶çf`pss£7´q¢·s4ã§¢¸Y8›”N@GW  à/ÊyCà¿©ÑÃ’TÍ-œþ¥P±3uv3t>ÖÆ@[§[ #à#;@EJ `´ý—±ì¿ hÿn€‰žé¿áþíýW Û¿ ílì m=,lͦÖ@€‚¸,½³»3-ÀÐÖä/CCk'»CWC kC£ƒ¿K7ˆ ) ?þ›Ÿ“±£…½³½“…õ_þ óÑf1[; ­³ì_õ‰Z8?úîÁðïáZÙÚ¹Ùzý™ZØš˜þEÃÄÅžAÍÖÂÁ(%úo›ì™ÐÀÆÈÈÈÉ :€îÆæ %Põ°þ­dúKüÁÁÇËÞÎ`úAèca üø‚õr2tœ]€>^ÿTü/‚eb˜X;Œ€f¶°¢ˆ¦ÿÂów´pè0~¬€ñ¯Ïé~l˜‰­µÇó¿GÌ -§¬ +KóoÊÿU Û¹¼èXtÌ,,6;;Àç£ü—ÿ¸ÿ-U4´øwmÿˆ'ekjàú…Þý‡†ë¿÷‚ò߇† ð¿äí>¶ ü³ü_Ù?þ0ý>»üÿÛü¿¢ü¿.ÿÿ­HÜÅÚúo=å¿ þô†6Öÿ¶øØfç“!g÷q>lÿ¯©ð_ÇYhbábóµRΆ'DÈÖÌú¿´p·pš(Z8›ÿ½1ÿÃGtk [ ¢“Å_÷ €Ž‰‘ñÿè>Žœ±ÕÇâô1¬¿UÀõ¿ÅlíLþ:zÌlìCGGCXÆýbfcx1}œQ ûß« ` ·µsþp|°ó˜Ú9Âþ5Rv6ƒÐ_¢!vƒðÄ`ùƒ8 ¢€A쿈ƒÀ þ1$þ ƒÔô‘Aöúˆ)ÿ_ÄÉ `Pþƒ>üTþ VƒêôQµÚôSý¿ˆë£jÃ?è#ƒÑôQ™‘£¡±ðã0uþ#gù¯ü_ û_ÅMãÿ"¶`ÆvÖ³ú„•õ/‰ÍŸ„ ‘Áäð#%ðO„Rÿ“ý/½ƒËÇæÿqùèƒé—ÚL-\ÿã/µ‹ã?>LÌþDüЛýõ6ÿiòQ¨ùŸ²?úgîao´ý‡Å‡Ìâð£RËÀêÿ,ñ£/6àÇ%Äð'ÛÇl?¶÷ú’v²8Ûýú£bû?ê`ö•íÿŒˆ•éßÒÿëG™ö÷ˆÝ?ZþñV38ü²|0wp±sšýƒÓ‡ôíaú ïô‡À_èúî°}˜;}\Ó>òþ©âãbcp6wþcH$œÝìþáðÑ—À~ºþ~´Äídþðþ“ŒõÃÖèø¯`ÿsú]?:âü÷ýq5üÿý î@cØõ;cž`ˆà®Ç:!<7ºÃ¾E²Ct*:¯uÇn—gD¨ªÚìÀÇ{¡”ñä­ïb”w‚D¯^çíMPaIJ¿½_ô”ç;a׿0Gf‹Î…‡ `ðéT¼_¼Õ¬ÀÛA{¥Éò\8 Ð݆$܇+6§BW•ŽjÙeà^*èbÔ¢¿”.‘å}]Æ&t¦#€¦F½rGZº»_DÍ}'’N õ¹ˆa)öÒÞeŽ}ZöÜ®RevêÃ!ÅÑÆ&¿Cš'÷>I•ÆZõ*+‰Þá[Ía¤¢Ù™&òžì%þÁ­#+…ŠÅhí¸Î%1EêÓÙÈ 9“}¨b`OÝ`ޏŠMcêæ&.Q ÐV2¤w4óîHc"ç%ïáu´·q§u~'sþ£aVÇsBÇtvc«Ux[ô5ÌÁ]ÿöˆ³Ï»È2«œ´ÞkÐröÂ~ÑýÈ]¥{¤Rì§ ",TQJ2ZQf ÙxÂ]=ë˜Z®N#˜/ýT:ã8âj›ô×Go¬?ò§´Ó9e~{º¹á7{X'Ï–H±¡¶Y'üÐÆ¨C̈¤MâÈ-Z¯©ç~ü,(½iR#8ß)~:-vüЯ_‘ÿÛå³MÃó9_ë ÿy$Ä’ö×0C¿¶Ö4 üHù;ôHI6-†ï¼Ú #E'EùaÃI ˜xbÓÅ:“3äy1Rp¬'Ë÷Ñ©HØæöV¦­áò:ÕÙd˜Â/ã7µâfÊ2åºÓñ¼*‹Šm}ïHqUÅ|wû:SøƒIëºuŸ}Ó§´ûµ×<&ÜÇj£ÂêG4ÈEuOA²ÈQ›;–yH¸ð;C}ž|zvzç ïV,éõ_gbò6&%‰š·mbôÎGÜâÆåZ©ÝmÚ–1´jÒЧø/¶èѪâíM½Eû¼Ù+sO¿òèž1Ôö˜{ÏÎÑ?–* A|¯“Y·É¶¾×Û"רòÇŠÚõ"l-¸zµÂݾ¬$øÚ”Ö‹·±œ1Î/.ã+…ZÌ!ˆ©Ê!´%÷[A1’ž'v;>Zr‚Æ"T³>‡Ç§!ñ1ýÈrXKóNlÕ¥’¨«m´Ó~3^Xª«d/?R€ùRžÇa¯ÔÃÊh *™±´Ìzå¢sà¦Õ=˜š™sø•¹KÇyna|"u£0º)[Àü6#²Í({ïzŒÔÖd¤Ø ’ ’Á€L˜w]N[î­69R~mŠùT‰&Ú\äüˆ¼d’6PšÇW••Í6ý«Ë¯¥è§%G?Ù¹…à{æ>Ú è|ø¤*ÈœC8®ÚÖœøiýC|;S²³ØlàBëv Â|?Î`aƒ¸ž²@*Ý×”¯7%˜ÁPzÙÄ¿£Á¨™ÌÜŽ™ûòYJòrÛXz+÷¿ÔqxnzžÍ3áŸRE´Òïf\ý ˆsÔ¢è«x8c 7öã³µìaÞï^†\1F?‰wc‚yyœ:añ7Ê•Ò ËŽì÷hkàŽ:@0]É/ß:‹J:<».ù]fjvAÖkŸÿ›×âšH’«øéA /÷æ·u aE™ÛÔº|šýt©Auõí~¦W=ä>º´Ù‚‘ñ~üT—ÓPÀ„êB2Hµh¸Qà8·†±®ŸÅH¾[g’ÁûIQ9T4Åá€Á®¹伪jœT¥­dÐú ¥¥{:ñ&öa0Ïuû~å{@ºÿýê6€¢ŒÐ>|‘’¢R‹©ýè¾2"O­w¾ªŒáBáù“*,™ù¾W0%¶Ì07½È…Å´ WA¯»ä0šë¾ØË«»>aøa\ÞzÇKdæímN©É¾5…ѤѶmªä==@!©î„sxF^ÞöA{Hâæ”ƒË4aëhýŠ\2XÏm¿ÙïÓ%p0z(»¾ÔCÝ©¨{=H½@tûÇÉfX¦Ÿ >vHþ2 ”©—^B¸sNrß (ð9Í“>8ÈÞ¨7Ù¨ ¨ez ¥”¿7˜z]så@5_Ö„,ã‰Õ!~Y±ñgiå_X®»ý ôÆ*Ãþê*R¥ôü.Qÿ-æÔ@¨S‘¡¡îXMl±_d¨Ú½ˆØú°ò·j¿;ŽÕyu:bõ«i¿s‰Uä®,IÔì¹$°rmðïØá8ôL3íùž"ºï§Æ©„xg›r­V ôi^Ó»Œ »›J‰½Ð»iðüɰ£íƒÁ*–µ²’iö‚â2…63{¡µ>õ®$ïÂó_ÀF”3¤.\"½ èuý¼ÕÂÁ¡va|ê7=ØU BÑ †fÛ&4—1Ãy\¢ñm¤ò ªlý]} ¾<]Þ’†ë}‰•%ÊC‰r~àmg¡,a /’¤ÚsbÑNa@?Ù»ÊXû ßS¸è(H°UÛ_ˆh»çiWаèžzˆg$ÌO2ƒ‘ú>¥Õrù3{+âTµÄL¸Ém=†KíUüLºV€UÇ^wnãÓ„ýŒyôZÞL_bÙu¨§ÿìr’gþñ·ÙPFÿg°$¬nB™(žš»ç|w²)Íäà;Òµ0n,£q.ûïMâz&™Â3„+ÒÊ” ì:tªÔ?X‰³cæ=´@ (äš_)Á᪡kLÈ¡U* }1MðW%1Å&>¤½i–’'*÷ ‰žÃé–1ËúŸ…°CÀ_ ˜Sq’Oa0"›ݧ&cu0†7_9#·ÊñGk2‚zv3í²“b´úüÐàÝa²<´Øç`?~%ía­‚Ö55ŽËei]gòU]”NìÚ¹·oø®}šÅš&Ë(¿«LLN3Ò'õÖÆ2}£‚3ùôùׄä4O§¿¢.j÷xóu;¦2hï[ÊËIJ‡8m2ɘ@Öפ€ûïF¹³3c/«œÞ[›³9ß¶/¿ðtHÂÃÚŽìA3‡ïÔºiÎ@¢ç1 pïbì¡´§"c:&ÜÅ kŸH1 ŽTéêxfæ§AB|;æTiÏ¢ðà–tÏ!ÐÁC Áì®wž.Eñ‚FA0QÃ0îMÆ#ÛŽ›¨äŽ}ÇøˆRg¨q8qíúü(ÐL*g*&ŸnA°µH†P TßÍa¯rŠÄüÙ›‚¢ ÷¨Œª;'.U£jå~•eif”#™dMOÉ Û¿Y™O=–FVdïÐ[qËéWůwêéN»á¥—8m¬ë˜µÏnWÓÚÜ~—?ö­ÊY2IuKäuv¢À3ç° ËùDŠîÑÖ*n'ëˆàïÅgÚ×REJö¡¾ "{¢ŽBD}®xv6q*ÀÌ•÷4néÌ,ýÈ&á;í·6Жœ1G,™T⣂F~×5rò¤èã>œ5ÔjªÈàgŦ}+asÙá“&T½y®N’ Çå,ÓÚkÅ´mC››õz©§ @êz|†Îq~_ðQ|¹HvÂ((•voLá\[TÆßÜ£Çúâ5aà²ý®ƒŽGÔ\zKvÚÎÒ÷Â1ðeÙÑ60T^š¨ùì-jö&ã5O¼Úªª®ñÓM‚eoZ7nÍÎÆM”wyΩ\nY=-Šªâ1=õWÿ.T…ôµ–úõdgÓESÿ+¤ÉgiY&L4¹¦14’á,£Ò)¥~DüËžvSãÖ¹Å\ǦîZ8^3kߘ˴6­Z™Y¾•ÃkÝsXÁð"}(¶eI§ÝÀßw[#g 7ûQSVêøÛ.Gf~ɯùQ+?‘}(X­Sæ’Ÿj{õ¤vÚ9p²f¼âõ <=èL§±ÝLñò»§ˆžQ9¤wæW®ƒWûšT¾–§ÈÅÅóôÂi?7j.^4¶R4‚ö Yƒe̯|,™öÄû.µXMŒ Ô¥\AºH[LXvÁw" Rt±@.–ÉÙߘ1ú"ã¦ö}Áš¶¶1D›½kQ¦e°ÓN \ÓÕ¢‰q¸•K(¢nýêÛ×ç¹ÕÁûÍ#@íHdN04M«0/WT·crÇÆåkè ûo…S1zU£fm”åvßL}–Hõ‚¦Ÿ8yMx¬Ê§$q˜E sÍgW{ˆˆåv¡Òi±ýä½íÞÚ”OÁgs’²0ã‚Ga3& ƒ…GÁQ¡† 78µ[ÕX9ÜNXdP®„Ô$r¼S„é§«û–\òR_>¥°Å˜/o#Ñ}IŠ|:%4ZÂè§­5S°¥àÄ«¨®!ÆÂ[ ¥à!x a„}Ížð£Àùe¨=°>Æ/[¬ºçx"ÉŸ1òW]L%QÂKv³Ÿ±ÌÂHZ6×dzh䡸+›ûÔ¤Wâ€Ä;KyùË﹟M¢.ȉ¬o8£‡G¤c’Fc]©JâEhÁ^§ïꨮ°‰Y o ™zœXa´cÆáÞ™_'?ÿcdQYàÆLä'ºR@%úg{X-)(À§ápڞšôKeÅ)"(E+ Þ UÐä¢x„Ýsƒpç…ðDÅ‘L멸{U/ê/ŒªpÓ„dc‡yòyð Ÿ“ÓìqÞ¼É^5%k6Õ#l|{M6”‡<ä7 @uìb]MZÄy2é©HëO>v­eCo;ëÈfb ‰š*Ó´ó)Z€½;Unj&p¼e.ÍÙØDùgnòˆU×Êž éfKzW«$ ÔÕ‡µ>ßõBõ–^=N4•×õuŽ UX#Þ5à=e|Œ=”Ý«°#b>E]‹~ö÷³€úC k©š!§C@n@Öû`ªæ«¦Ï„†çV΂™bd-™å–t.½]i–èÓ8'3å3S ­ zí”=^~7Z­ËK¨,óT¤Vš,OSYU>4¡&:¶–ÿµg„f9VŽæÖí¢?\ ŽÏ¸ƒÍR¬ßk3ÈÎp²ã§t}Ûèbz»_{M!#Qй/0Žæ`YqA;{ž¹Ø@“Ó’/„::O0çX°ßYÎN.9—,µbãøÉ{ñõ—ÄwØ´ã[ ï7ÊJ3 ½¡¦FßZwÅSH=™ýoK8Xý»ZÏZ!¢“I$mɤ覭„i™;>(퉚“v'áÇ,/Ùû4ª!@oŽ;ß\÷G.ñžÄȉ$@ º ìÔez²ÅwhsX.yg‚Ä®ÀN ã#§éi7Xcmï–~ôO¤"c:ó„‘«À« ¸’ß »=#<¸,ÞB žâ{Z¬÷Pk*ø’éÒ{¥9§T¾ïèdÙ¥F:½( ƒ×Ã<¹Êna;í£bÕl…$9‡Þþ<Ë5Rì?cÀ’5Á(¾˜DžÈ<Ý:ù0Gãx) Q¹áJŸ9CiîÆbX°¸D+£²€©f9°%yúž?'òž2ÿîãÀ1ò ÈÍÀ-–Õ\R`?þÍ€LfÀM4»tÝ ÖÔÛ”PFØŠqÍi-Jz'A›ò>%gàá#qV’5!@eœ¸õéÛ¯ÔÌwŽ=8bNá‰îXkÐqú-x0»;ÂYÌæe—pWX™Ö`iFmÞ ‚®9½;1°½•Ëd^ÍpC  ‚žïèn«? 1bÏ.¯D»kŒ‡#i !ÓiÉ/ÕÀ™*©x'”qa)ÕÖèå%×ÔuàIs>Œr§•«5©wµÅãƒýU7¬’;ȼ£ÝwÉg¥ðÆ WÏëã¬á +`øú5kœAÙè°Üè!½C R¢ÖÐý ƒ~€zof4´Ó7JîPDä¶ ¢&ùŽqÄ1Ï)kFE¤æŒo`Ácþ·ÎÒï%=^bº&Ò:6Ùäor((Rtüo˜ËÉR?A˜ÂL>g£Jsý$ÏŠù\˜6‹Ýi1¦îF¥)«ÆØ×°5 •ó™UÖrÉ0Ro ¬vÍ<6Ð7“³bÓ¶²ÛF?À/Ëm Z0Í ÷ÅÚù!1À¿ô²Ö|>N›‹œW•þÝÌj\LŒ­U<=wÍÀ0\žÁÀ²éxfÿ”™Ù¼ìÙy†’AgHð»7HɈ®¡#û÷eÍ;„`6Z°.‘¨HÌû¥‹-ƒ²ci}áÚ]BóÒ%‡ëS4Nxbžqú›ÙQ¼^ê¡^Y¹‡ªÑËã,£Þä9œ4C/#;™,©#Ûyµ`»6<·e3‚–Äþåï唫JŠçr¤#P•ç;©õ/CP›º+ªfcQ1:ú;ÚÍú–¡ø5…oÉlEµeòœnHrádP4bܮѰ‘$Áàm‹—å~{I†%î˜<³Zð±6ðõ3#À˜›ËËr#§] ~Ú!\mÛ ‚Á²,–£hàÜeq½ÙÈšÝïŒ.é…òSë{nóÛVÕó§Ú\ ð}incË –’@SfXùÄfn‘xä W^?̱F!.¾Þ¥0ÃÄEì1/ôçg¹ÉÎÈ–{rÙ#[—¯%~ØÅ¬›¹ê:S»4ôú!Fge¤Î÷•ñLgô->ã+£‹ýÆó/µ^•¼¼Y®[m;˜Sž+·a¼ÏpÓ ×©cs…Û \SŽß°›H²[2&ÒI=Nç*VòÕ/º©Ø+ Kü…ÛßÁsPîüˆ‹„[5¨ ´EÆG²"rÎTüaÎOý— ã°:gVú: U‚ëÙfRè|8"¡—F0×éú³¨±Ú¤Dj⼘ÆÚC…"Ów´‡ jp(% ápmÓQÙ¿¡wÅpY|gÛ1B}•h "¤p“@@=¤Em°$I9Ñpmô›12uÍj/zÂ'§]•„ª Bžoé’Ð 4 ù1„AžT®ØçÞÖD.…Š™ñ~^gÁG‰4™–wâɨãÈ$={æ_˜×mÊ?–²v­ñP¼]1‰^Ô!tFéðœw;à™71.æJ­=Õ„Wá¼@õúš€¸üU«JšÕ éýŠ‚Ô‘&Ë9ó5숃*˜jdž,R–ÜÄ} 7~í%®MV:8|q3E D/:K»;ú¯Ž#àçA%Äψ<œsÛøm½ §Žqî\½49¯A.±¤áVôy|°)ÎùmáïμŸÏ5œ6aX}Ž|ugå…^ç݉Kà˜&_‘½-d >Ö¹ ¬ã#ø_„ŸN6Ò®õ*­|nÒ¬ŠªÌý_)ŠNXƒˆ…çƒÈ|9Ö8gf AΟ†ê~¡Á†ÎEfVFo-Ã" éˆú)®z C ·Ã÷%ð'@»†V¶¸¿xaôº!z×RJu…¹ä‘¡¥vzºŒ ?6æêuÞ%ƒhŒé[Åx),‰_.¹SU£êSœh e\ðµ­0‰6àkSýV8"m-Œß< ô÷M<‘LƒÁ –°gyùÐRߘ¢VŠ5sÄ(BvP´ò»º+×àûÄ·€6'~a)3ËöÂç…,~ÜéÚ6F¡æ¹ÀÏxé?¡ó^çwZRåâÉÆ=âÒ8õbj|ˆKŸ„^Š`@Ñi°ñ÷oŽo€I¸*k¾un¦7ž±€}¹Á·=%“g5A/‡Ì¡Ùe>HH¶wC[@K=’w •¬ÜÆCaì Wù•Ÿ­¹ ÷Ó#sJw°£›Zš¶ ±Ô£Å ÚÆD´&xh£J¡Mhmq·uͧà†tüV,‡ÖS ¨g¶ÓENî–úvô Py»‘Kðµ9¨t©ôÖêEM)µÂfÁ;í‹ÔYˆPTPŠÄ×a¦`ç«£÷ÞäVµxo*¾!ÂÃKG=5o^‘ ±Wouˆv«ÓÅêáùª">\¸CbµõF©û8Ìp9j | ×€é 7*t.Iµw&oèL}ü¬–yåñÏóº[ÊÚspôH†‰n¼³‘8«èv–m«l5/³ôÓ‡¤£qB$ÐèBÉËé"4:ÉŒÑÀ*¦HâSîYQªì<4€d`…é’ ¶Ãd-qøçœŒOoe>ôÄ-8aøŠd^îwœEn5¯•Íd>Õ-uç²þœnyŽªƒ6<Äs­º#$‹ƒo“ìy–¹’`Ia«‘‰]gÚP„ÚQ³´â5>ƒ¨.»±9loÈFô=˜G² ÏÃÓ%î>Ó¨Ÿ·‰+F?ËÍùÉ[é»QM']‡€d^ÆÊpëRî4¿‹ÏwSŠ™$Y»š°þ^Q•Ðé“åò²ÉÓÈ·Û‹A­?˜7nkó¿SƬ_Í?eÛ2o&6|â Þ“™ZŠMºhºñº8Æ&a娮YÜè»IVw“'̧tNåž-zÐД¡p 2+É»3DÎJª›;,--ìë·_ÙÄßÇþz›j$Jÿªåe6àÍÇæ[é±Mœ=¬IÞÛøe“j1 á¡k­’Ëqæ®K‘®=*; ßÒQ™ýñ3è(íægÖšÃC†×Rš|Y:4kbÍßøCZq›œÜÊsºÞõâ²5žÙ MVÀïy%$GDZ³o-¹ô˜Í˜ö$¶Ž&ÝÐ#Ȯ¬^X‹LARÏÚ„¼OžW§Ž¾Ÿ!s%= Zæ¦åÒ–Sâ§ÆR.\÷µ^ЬßÄFÜêåå’ÜéõÖ¹GEÎoˆ„‹2ZÒ‰5NÈñ\Ãæ!ÑÂ}ùö¤ û»Uèlh–ªsÀ[ï}<ç«-ýèLâþ¥ÌȈ\GgÕö€‰ƒ ¶qrðˆ8’êê‘uÛЄeé•qsR–Å!ŒÉ¡Ò¬5I‚Ó£uw6+™K'+Â¶æ ™­ø½Îdyú39*ãü[6r6ÔÛà»Ö¬l(fEJóB¼ñrYoiÌÊ&ÅÙP£Y ʹ¯Z5âöµ„uÛdóÏ}‘YºÏt "Þkz²n Úßñ¥]øbºw¨%$Ò±F”:úÌ*qËêŸî[EWrh"¼q× ]V"ü³¤G½GÒš°¡EÚJC¬Qœle4½¹©çk¹*Ðźš^–­ªZÎÒ^µš5ÚiÉŽ§èŸ ×¹õrMµ‹K«3rí 9l>£ÇYP@CBîµ_£ž ÄÂDŠÐÕÔ×ðQ=H×éªvK› Ãn ,7[xÓÞêtð±½^ó=Éî–èÜØÀË9jˆ•xW@®”ƒ2Q¬&÷º+~R‹Õ¸rptRrC”~¥KiÓ=œ–ŒEG÷íûq×_ÆöØ ©¿_»[ETgwCa«×¿g0wz]êÒ‚îî-hRFXAžuë‘W ~x#…7ù–EnOψÎ5˜k5{UÕu £uZ•C3¨4®Žl&STÓR[dXžúhÅuÙWt;ðÈâö²&hHEá­™dĤs<09 Tg{Ö]jƒ©ý^œÌ*±Ë"Õ($?-÷FPlûµðõéËt„ÝiômMñ ®þxÞÄ'A‡BÏÏKzQýJuÙ°ùÓ̇ÌݹúoÈ÷ |á˜=QÓht Á®ñrF ‚§‚fZ•Ç$ª6W¸”™ú­°<¹_1µÞO ÜæDûÝA‰KÒ5SõŒzNCÔý’Iv”Ë9ß)Ñ-ë©UŠ»ˆ{Œ~Œô+šÒj­ú嵃îž‚kEž–c8û@{4ª{žÌfÄLQÿì’¦®£kj6ïØ«W•½¹*¸D¦… jп,XˆG½Ø®Õ,/ê˜è’­$[]Œôf.Ä«ý‚žó„óûj\{2¸ªì\(QKŒ‡–ÒfQ&`ŠÜÆV[ :Œ¿œøè~}Ø_Z- ôÅ?=.H„ˆ?𢒼¶Y¤6V&.š„Ô¡Ý#Ä#`Òé VVvM[ma"c³ZÒ7¢¯ 1 ŽÄd®8Á(©{´;rœaWDŒ[2UÀ0<n<ØHûϹ<ާßb­ îÃÞ”öì+?ÐF-Ô>½B>Kû”ç… ýÎK®™y}_s>Ê¿‹mõ$âNóTÍ0»^™§©\êD÷ò–KŸÝ}éùš©ÉuÛ…Ìj£ølpælêÙeù%ÚÛ©Ü3œú ;Þ½þÞN8T3a-Ü$\‹c¯ãùÕ„(»„HÖ<Ùî¶bmÈfåZ.áZ¦ùMͤ•Æ‘÷å¯Ì®Ã Ú• Ù”4¢(¸>_Bdèöî’Óë$£ˆŽnXSõ~|éLŒ4 ®k"oÈ ÃF_ ôÓú'\E¦ej(>zþ´ºixC2RWcò_µøÉ„ÀâU¡–‡o²#mçQå–,íÛccë{¹zd ªd†E¢®Èn¿ö©Ùlde|õ’"Qn›ß^+,2@¥8O^œ2Â\³H\z¤ñë§ñIòh z‰ô<£œìkZŃã`îßLV‰Œ1šp.m!ŸÃëùE,I§;(5èP,Öe;ËóüÓcŽÇ)®”„: ­7‹Ÿs"Jž$+²»–ö†ŒWAmE]ˆÓ‰²™ÀªÒb5á9C—>áåÉjË scIÔ:^DhèÄŸž¹|å&NYŽÝ2<žÉ.øî¤=,÷ã·Sá«9q>³Ð½LK0vr^mþD:,`I’ªŠÈ’ïskA¾y©t>8,ºL³y_PÄI‡-0ջθ2国ä&¦›ØI$qáί/‡wŸX-ƒ¦Hg/B'r—i=.“5H5MÑ•t$Ÿ`AÀ1ÛÀ$ÖÛÐF6ð«ÜoÅdQX÷Gä%шÀ'Y¹øb 9Ö· ݦUq§Tt=§ŒúûÞ¼*¼&ެïZQÊò Û„Á%*™È9¬…ÑøõkåÏŠMÇoî1)8a..w©_ˆ¿C¶x­jàCæX$‰ÇKÍom!X!MÃdX4…é¤i?YŽ5ÐV ‘@&[ɺþ°z™x‚f)©¤ÝDéþ,)ö# >hªÖ¾s¶RÝØ˜€µšÇøa;U& R³ôNmó¾w4Ã÷›² `b¼óúíBó9‹Eÿ†] *Ì.Lok³¿rö0ï û@A5í‹:¡3ÐW/º?qB,Ã8ç‹Ùƒkq¬lx÷o5÷CáÐÏ‘;Åõ›­]ÚW 6"]5½.±7AoõÌ"‘‘îØö:ZBˆäÇ™÷J¿'Qô$.ù¥GŒ0 úÐÞ~²Ðd×óä÷êPÇúÊóÂíƒ;_ª+‚M.!I­M²Ã•Ô¸¦eŽD®,›®—HÀj­ÖÉG~6j-¼áZÀèç’ujÎãÏ6ø«¨»ØK^Ñpݹ”®ûÄkôÅ»Ð;S”Úbþ®%vC¬ÎGN<+5¨FÀ½£Ø©'d_À°SR74²ñU´br7ÙKÿõ 44Û/¯û‘³·Õ’KKÒm€n=·ƒq!.ì¢RÒ…•ÖÌ„ô-@H‘ë5e¾úüÎéggÐÑÓ·ýèðÎÁS%§‘ïAF×ñÒ|¤£Py?j{ )uš'Ò4]ÂsTÿ6O–Ÿ®É©Í ~mð~ ´b×Ïاõ`xlóÖ¾ü¶Ïd\°X˜†ãµÖFp»ÑÜ¡Ãèp-ð·'çÌ2 &ÚÈ}½“o±i‹0C¯/X•dósf È(¸ÊLÝy™u”­Ð}èɳîM‘Söú¼²1¥LΖ)-Òc]å%!Øõòuâ<,J„;T‡¦Ô›gŸêe]ÕSU­µÕרžÁ†Òä&—.Ì‚²ýñ¥Ó¶X 4àÃ!1¯ùÅ'OK+²¿OÑÖFŒT£è1/¶V, §`Õ3Ê‘ö7¥?©§tl£†œ¥õtte5ÂÅ +)EP{\ TÛÊApQK¸cà¢Lä4@ÇÞY~~é6ˆñ4­Ä …úy:ÉÈèxʉûô{5´çhª>é=Þè])ÖGïsmÿÑHûÕ0os%ÄÒ£ÀnØÖåù'J0yԽȘ'äÛ¡›[ˆW”(‡¯‰q\˜1íR¨žk<}h.Û?Xõ‰v·‚1Y£zºqËÇpQÒk$À‰5ü0ø_ƒ†Â‹âK»ñ˜{VÏûÜí><óUèS°ºñÆÚB¼EÍÄ1êwãÚ~ s¦Ð¤€3«Øïsõ¡|¼»ûÒÅy§)ÁñWŸÇ lÒz¼SpfvkÌ0ÄM<1X%ÎMÐ,™—”(ôÇqc³ Â”h䄵|‘\Í„•¥„d¡Ö÷ýsàL¬íS1·Ê éÞ.œÂ’Ú"[E-iÛrÈ2§KÏnï^ãoùê§'AïxýžlD¬l%4£ºvh8øg¨•«bISBOÞET&‡Ú!3^èõžÖ¯/Æ÷¾'˜½|=cáçï8É¿„/òªÇ£ðøV ÈÌPÊO¿“eÈC̺d§SJXÊ\?{ЗùDµ€=)½ Ê[)ñd§$†\›ˆÂÑvq–,_ !C f—˜¨OÑ+I~ ðߟÉ;É^R}ÑÛÆÃ3u%‰-/F®/?“«g´ŸŠY—©ä‹¦aË€?÷GÉ«O#áÔ̽Iyµ/qáp©- ¤Âz.0;À®¼h× V&Èì5&çÂk¼“MõÐiíß«¾Ão#ÏEÌ‘8vcb >XÙçÕ5dóBph67æWò-¤«bì£ßòCòt×®äê»@ØÃå1º¯j#è$—ôãOéZ~‡€¥ßGä\ûªpF[ÁÔUˆS™FbÃw=÷ÀŸNpž9jjÞ'?’\Ÿ%+¶µº^">Ô„Zº•qQ  «VîzAßM[÷4ø´wq¢§pZþë}üüû LY[Û7V6Pz´k´<¯¹\ù^ë´š¶]è,‘Å Rì½+ÌÇÁw&U² ±oÍ~Ö'ûLÂ1ßׇéW­Ñ8J´:ÐÐëâfËéP¡¥¶£ ,§š4šÉ R@ö#ûp¯|㻣aeMWÑmÙ!Ý*}që†Ép" _¿ Lí}Ž ŠúÆBm?Ú£ÇÖ€²ñ•ô:®‹ m÷;RÈá.ü7dÃo6p)¢Ó!­ûOCÙâd¬ÞmgSå9ˆŒrh©Ê×õ¡+|–ÚqÐËÍoŽW!,*fm¤–…(GïÇÛBðDF6­ù!‚÷„k-‚\ómL†¶¥åûzíCAY0["L¿XªŽ,UÙê[X¥šRWšóÙ¸>_V²kiIáiŽÉEÇi|’¯Ø´Ù<]—^µ®i |ó+‡$ýnžã§¼{4V€}™–¶qgY¹€<ª}z@àÉhŽî˦‰™«Ð™VBÃßu‡ƒ>¦õl{el `Ê2[Û3Œ¾q>pÀ76z…SZû,”=šÞYhDMaˆù¿?=ìÓç3%bt›k«òùÀB§®Õçxȼøh£|ÌóÛè, ÿ®)‘o®½¤©¨7cxµ#‘áZ9DDðÆ\G­Ò‚T#?äz†¤¶ÔA#˜rØ„FfÈžÄYmë]@_ç 3êO¿ß¢-‘@å˜ÃyöRÍ:WKb¦Å Czïmý¢­w(¾hÑj’ä°>¤ë1Ýà“jDAŽöóû„óéi¦˜×½Ã{Rî­zé%™Ñ ûîÂÁ€QÇ7 †%-%¼•­!pŠML‚ÉÊ{ ˜1 zÖ RoŸM¼‘*PL!õƒƒ]î<\à×Ou²ì}L±E1¯gO§r0 Çjf1ûŒç(Õ}¾×î/¯f‰,ÐñAo(‡®H>¼¸/J[@’ØíŽEyML{²Õïˈüö„^‡†çé_ÊíÀÙàW^vŸ} ø)õiP¦Ž]òÚ”U*2”«£ÿJjµR£ŽQ­Y6_Üdc3ÈÆ {²ðôd6´UPk–ÉÑ OË×Ìh0áöó§¡>¾+ª¶w×pµŒéð“)šl>åYX,½ªî•Ì ¡ ÁyWÞ6éÜä£f¤Â5Ü0ÇÏÎ"˜µf®Ÿ¦üžò¦Ð;pmÇÄÍW¡~Ýg•Q>|Q‡–_„õ¸äC_3qoÖ³dQ.HŠ‹` d8xèŸI&%¹ƒìp?Ì\,žŠuKÏZ‚'÷s)ƒg×*«]6|h(??±¹ QmˆV§re8‘·„ݪ$gõ^ž8äÑX±ÁsQgñ—ÌR*Š–o,ò÷¤ÕrH“£ØÊ¨ÔRNNM›ru½ž™ ™á£çË}Cšµ+4ÍÙë´3‹\zÓUüÔVü;-·à_ww0ÃQê$°0`Y™b¤^Ø”„›4‘›ât{!I]ƒ@—è9wq™q<É ìýr|Poð AcT>2/`Ph:id¿D¥'žFt—ö3u]ŒQ²Þ! £¬äëc¨Ã¦éa]4h,ŸïBù'BVYÈl&E2z¬mÁ)Gl®ÛIcáÆRã3ÂÍRÏ9‘~fS\¢lÌ$A­ ÂÓMh_'!Ü|2d°i|J‡ÇŒÍ È¥>lK‘lä¬ß㇫;•ût$ H/—L¾­5u>àŽÕÍ8gsõ¶Xå‡Ïæ“T3g·/¤vá‰ÞîœUþÇ?¹Ÿ¶C@!±üê\/r³LS²ŠÈªïÔƒP—š‹Õö›#óÏ ’yº  ±oìjj¡•>XÕ#ûIó釯%?IÒãÇHö3«¯ªrWK»=(Š¿ƒ:P´Ó!aˆ§J«ûiV¼ŠÕðì¸êbïJ)W¦{ô[…¦è.j’M¶´A%p{c‡÷\Ãßõûu£Ÿª±ê¬Î¾Â° »Á¾1ú9¢M»ý¥à;gW¼WÿIB½ˆ”ŸVçÔÑoxÙ~0±¢¡.˜ÑlôwíW¹3^3_aÙ‰0ñÚŠõ_ŒHkÞ"Ç+Ê2ð›—ã¥óOá„ytBrõ·Àr§Aõ‹æŠi~Žå¯Õþ±“Ë]9X¯Ÿ0U‰bfÝ¿˜©L{Õîëô±|ÑG”ô½ÐÒ¹7[v2òf1çVâEË/ªšúu|ɬ9š¨zz$RÎÜŸ_Dü$×sjñÚ@\>¼gunÒ‰ "Ôw)6Ò!?® ¤ß"`“Ñ_5­?§D|œ; ÛÕšŸYίŒXø}i Þ5-—êVðB¦ný|Z;¨ ¢ò€ñÍÁåƒ¢Ê5ùÓ^^”…y¤JÚu”Ýì‘‹Ÿâ] Üc>øð+ÃJÍI7 ¢ñyÅV1í¸Ù R‘Ÿõ!Ö¢$ -š¶ Êü›m¹ JkA°NXÄ`Ãpre¶ì2Ft’¤Á ê)žáöƒíî²`ÔÒ²•O~X8mjj\J æ¥zVb5ó!³QîT¯Êœ¸ …ûs6…XÚK!È}õ´ôtÈâÔÂ…Øûzjœ ݱVUFv;_)K–m°î"Ï‚"?ÀdU壢]hŠ3|_`Ëaû…Q6\ˆ­Õ?ñX¯–y;{x¼¹ ´HÖ 63¯‰¨lf f7h¹ið&þ|SM#ÒeÒ/ 5=;~;ûÕ ú9£ŠÅ,FLîš¹¢d Wum¹µHPXëE•˜Ø|Ue°ìýf>ˆœ;‰ g‡ÑY,¿5´vmå'á–&]ùß0§Ï˜o-¦º¢âm‹Û]R¯B‹ZQk©ž7k¾“%¶ž o㮺ØÔK`~‡¨+ýíŠÉ/Ìù>鋊z8Ú-²éåÈX¢èÌnÂ=t²n á÷1ëFЋ‰8;^z¾º àXüøœ5Â(ÿgÔKÉïPK$e-ä0¯ÖiÞ9Iá¹-.±}<¾Û¶ja‡Ñ™2+åÎ`ñýäæëÖ>„5¢›Sa¼ŠÈàkGô?²g¤4û†ašµÙù[B¬¡Ö%Œ„Àú›úº´}¶›EР³—EŒÀÇ…*ìÅ ƒNh:–~göýmµÝw°ôÀÎ[_7ñH¦Ý|ž©¤š-¸iÌzí™’ikKb•Îk^hƒP5åx¸]ÿÝ8¡Pø Mž\¢® ‰²R¤‚„œ|ÉÈ—~äšãO]‘59¶^ë&¤³$ŒkŽÝ"7«sމõŒ¯HgTáÇRia‚oM÷ñmÚòÙa˜<–î›GF¥ŽµÅ PŒ'áK£ýK‡Kˆ¢‡ H-FrS6_Y[~¡'áFݬê]~¹’c½#ÏF'Íg{ Ïp(FÉ=²ß#Æ›¸Ëø®S&—I¸`¼¡j„þ”«édžnݘ(tètiãê8‰‰ ¹Ib¨ZÐ;£þq,³ ‚köV± 5“çâRÇëoƒ­)ÞórÞO€m÷óE*ðé4xz÷_‹uçéú¾‚´h]×àÇ};z‡[ø¦Á$èUÙìŒr@ÜjQ¬—‰ zs¸ŠFÞÁ#Í!xÞÊ‚©&‡åï|ø%–ί¦Ó[#øZv CÖmuÈæßâ”eÐf^Þ!"÷K7Ãw:"ó3ªbP³¼‘`ÅÊgÖȬÄ-ÛQ¶ƒ.Ô|U“%B˜ö¢¨üì^ë,Ó«=AÝ}ÂôF“ÊA6Åâ8qc†â¥âõJu•Ïw7ŽºÓˆ5Ug|¤Ë)Ž{I1ŽÚæéL€Fh'5}Qü…³ÞI'z¯gó. 3ù¼™¸•R}ã5€×égd‘ Æþ7JÝë]Ÿ[ÓÒtPç«‘ë7Õ˜â_#¾¦õ‰Åx~85Ú¿k‚[2 'µ#jé'šj· !l|Áˆb!'S›„¤t7«îTÿeGIƼ( ªB•t³^Éçô¹#bˆxïÔ›ÏC!Y( Õ@Aõe§Åœpdw_|¥æ;ã gÖÙ¨~‚Pí^÷8à`«#Ÿê5,UâévYæ>Z©pE˜tˆ÷­¼Ð4†u¦øRV±é‹\c\ÅÏj"ños=|<Á· ­öî]b÷5²=»9—LKøŽTý“¶%¼! _Oê*3Y[´‚•ÞÅœ`Üø h)¾Ì!®3òâëÑÊé,o—ÇÄŠÔEÕt!Úd¡ ½'iº-»>‹ÊDÖ>îƒ â׿ÞB”3¼˜¤gyé¶!p̉ØfïàluOÙGª@hYM6}C¹…ènËj¨*—’ܯÊ%[§õñ¬¨E7CSØ?5’Ps[ÖHõØM2síkür'Êé1CÃÂPª÷õÿ Õ*þÞlE.ÃjKíbnKzŽO®^6Ý'¿»åf®¬èú¡"Ò[ˆÁQ…ׂÜi"#Ôf>ã(\.Eö^¹ª› ªX4–™°˜ë†×²Nd_¢è<´LÆ1y]…©Úf˜÷‹ð6C¥Ä³…Ïc¸/ tø@–xh2úÅ\£$¶&+ëÜß@•€l ïX¢=–TµÛv]TCöa¸bl¤ÿÑù,·H©è7ax™“Ë\Û§-Ku~Fí h?Jð®jWOƒ(Ñ9Â&²RBžz6é]G`M–¾wAG )A ¤eÖÛbþ”GÕÉ.ûiu4GSRgxŒu³žÑ˜ð> Þ–@lÆŸFç 6JÛÕ{¢Ä|…•v¥ƒÜ- âø‘h›‰pêv C¦¤IƳJx¾`QdïÔSðõÙΧœ¤“IßxZnÐ… ÆXÒÄœñ,Ô#M€1ßHßäêSc÷<¾¤îuûy9ÔMV2×4F–¸åhäx›?Õ·£»„î{­‹f\ ({ÛªGt(÷baÓÕ©Ýz͘P¸þ]sÄÛ€‰OÙ­iÓlK?2¿0lt&k!¾E‰ÜQ¤-=ÄÃêÐENŠÇ¯ïÙÉÚÖ endstream endobj 65 0 obj << /Type /FontDescriptor /FontName /ZMROLL+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/I/L/N/R/S/T/U/V/a/b/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/f/five/four/g/greater/h/hyphen/i/j/l/m/n/nine/o/one/p/parenleft/parenright/period/q/quotedbl/r/s/seven/six/t/three/two/u/v/w/x/zero) /FontFile 64 0 R >> endobj 66 0 obj << /Length1 1567 /Length2 2851 /Length3 0 /Length 3830 /Filter /FlateDecode >> stream xÚU 8”kû’š’)©xKÖÆlŒ½û¾ç•1󎙌f†ád_²EÉš}I$¢“¤ŽÐ¢’´ÙJö}‰ï%mçÿ¿®ï»æºÌüîûwßÏó»—‡Ä~ k9‘î êÑi,94¥ h›ÚØ 1 %@¡00  ‹ ~·Ã$lA“B§©þÂÐf€xdÓÁ³ ¢)yR´<€VTE+©¢P…RùN¤3T¼…˜"#: dÂ$´éî> Š ™óý' MÐ**JðÕpç2(< 0ųȠt"O¬é Èòù-…´:™ÅrWE"Ùl6ïÆDÐ.Gdà›Â"V dxD`E2`†wפ!`€ ™Âüæ°¦“Xl< •BiL(Ä“Ft:`mh˜»ƒ´od“o8°V@ÿH·½’ˆB[ Æt7w<͇BsH*˜ë™ XÞ,8€§Wˆx*“Åã½ð*Þ"¬^èá,<¤pM“À ¸³˜&…º¢¹’*³.¨Mwsi,&lå~:H€êîƒ\k®+ΦþŽH‘´"ƒèéŽk hš=YÐf˜Ò¡ý ý›ú'ømMA"ÅÓíß^CÚÍ…ú£¦Å$ZPXòêÄ|o”J¡t&eå½äÐ(Ô¿|ÐÊ\¡7… 5kÕBõû‰º4¸²z¬"€g0ð>04_,8†v”z¯Ž6€DÐè,(€Ôù$:¶ÒR%‰_1}ChéÌÀ\Aè•$±~ØWn†$þ!ø*® O¨y? ’ü ÄHÊOˆ†²Ñ~™ñ „ÈÌ_ "€üå&hÉ^…¿ÕàÉ`@OÄê¨BEúŽWß#ô °¶×t‚Zè©¿C«>—áö°åúŸaøg¢8›þìÓÝí5h¬­>?+ŸýWûr z¾ûQLáò-W»(×ï}/F«îl+¯â!9÷Â}Ÿÿqxa”iâ‰0®©±w’§]vNVZ=ds4[evÁ=¦û_¥ë«KV^ûTBžä•ªClå~Í+¬¬,¿•;ô.ýÞ5­ë¸Ö—Õ†™3šÏÆã÷é Ï_lhÂ`{Û‹à\”÷ŒŒð¹sÒGޤ Õ)Š;=Z%úêt…¿œ—æT…I;3ŸXœÏW!ÙÌÜÍ÷4?Ĩÿ»Ï ùj1¦÷…ÇÆjL)TÖÅ!®Áßn¢µéÚ¦bÓy é*õcrºÏýµ\®=Ë×?ÆÔÌ6柅–qæãŒxíãÙ_ÞI¿ðîáq>–‚"Mгû”›Û™ƒ´—-»lWîØ:¦.å-¬÷lï˜$11ãu°‡ã€lŠ9ûðÙ“êQ¥V;Ðõ[ ¦ØuÝZ‰)–+g»d¿Ðg[ùô‹#kS3Ø qÓ¯ü®rM'»*Ïœ(n•¨,á»ýWg"gý Víãè¡Í´Ø9KøáÚÛýœÄÖv‘ë·F8Û«#&×ï7¨XÈè)K³+ÝÞ,ܱÙ#<‰ü—‡ý©|Á,Çڞ׸Í[r{c‡É;»è(äÃyމOֱ쀳fŠÔÀDò륖#e⸃Æh .ÖeÆlX()5ÔcKàBD®õ;•!~Uû9©´Û­ÛZïwl¬6¸ù•S`ËøØÙï¹éµˆI–ŠC§ßžbéÍ’±Œ[&ç‚8å^j_?\ªôà ¢±ƒl¬aër[&d™‹’otËõv/…ë³à)¹¥jÞÉŒòÌ`Œí:v7áœ~ß u¡kóæÉÈùF÷†žì G±ý¸†Ä€Éd‘ MÕwI’ïUM°—®7 ŒßÓïvÇ›= *˜[gXŽŽß÷6K£Ð‚.qÖÿ·¯&‹=­”>´­ßYGZô Õ×ykR}Ï:ôÊQ´˜p4 ŠÛf£ñ¢›oé8Ë} }“=üº]+9*åpÉsF æ‹ì”Ò2;ΩÌ="‡¸šû3ê#›à$UG j:ñš?Ýx|ûs'M¸¹tÏzÁ “„`/)M'äo…yQÉ©ý‡Ýon ’òSÚö~\bÞjéÝУÐ}"=˜}ú.®H¬ýB„ÏõL¦§& Ÿ:gq¤8b¨œÓ9`i™ØÓS‹ÌÑp«.-mb›'§V[zdœëªy}ç}gÜXÕ ½ÒÖÌw/ìU}sœñ-‚%áMƒ ǎǼHݽí·èˆ¾äm+ ·Uz2öXæÝÉð6…3×±¯”ôã2,H<]ãêª.4›HëõŸÓ2¶] y¹ÂlGÍ)G(ÏþrŒ§èÈ.+«—ä'Ÿ˜³ûJm¤—ÝÒô­oJùÍ÷6Ý‹õj µ;é7«.tgr§mW_BVßõóøï¬ç¸IN†þVyR•a§Œê²‘CÜ‘!n8ƒ&g^ÅKuù x:Ùö/‘cFz÷ÇÏ·­;¿„!'ejJ,ÊÜÏÈñÚ?*²¤Èå~WÒ¶ÊŠ7v¶àUd²Ì k1®ÿã¼$Óñ¬¢!¾¥pìI·T©YTñ'3ô„rYMˆ©w¾›»ën×/û¶là!&~É¿¬„·ß~]oàuc%º’·*‘ºT®<¡bf`v•Í1¬,ÆyÆÞÙLF-Á_Gc>zØ.0ƒ“~ ø$KŽ@`8ðØç,vèDœ´t Š5 Nak‹®tåÝí©j²X"_¤Gõ Ýn—¨(·ŠØÚÉ0N}™^Òo,Mù»½¼2î ð¤Ôå/ñ„p¡KûÙ˜ŽSÐ?”ò³ø>)Ùõ1õ‘ï´ÏõH„ÈEnøs2ÙéÓq¶^feGDELV+©¢”k.S1$6ç¶Š…’{îšüäxª³!e›¤pçyú~µ½2Vôíg´MêBÿJóŸhHLè{š^Rl`iìÚ9ÓÚH,±¶xjó÷¾Ia~þÌ{õ6bi¥~ÿ,ÝCn·üKv²¿6€¿DÍtwoæŽ+…fÞÖÚpç°÷F™4à:MöŠÿ`êTˆRш‚—È—°x°í\‚ç¾i«×zpI„“ÿ|.£Æ>$ Ìùšt­Oz{•¯3‹øhzJ)–s;EóRRL§¤ôK{ò€‡Z·áÇ}K(Ôy‹êX‘:¡Å3Z)9;j¤€Q­ feÓ¾‚mí!‰8ÌÔƒo·îÔœ\UE/JؽOƒQ™O;|Èès ’Æù”\«‹›÷¼¼P%ór,ºP§IG‡T^_&wÓ79–`röïôÀ¤ôÉËvä G'U6d³8bÈ2è ê6¶6è¼~ðR÷ —ÜeƒéN÷ýÖ#¬6b`¨k±wÛî|97<ÍD~”3‹]´Ü*¦~×úÝl¦Ór13䬿#S‹s]ãŸ58vÜ¼Ùæq/r}ÂÏ¢ªlz½²¤ù²}¿jÜxvd>2#"¯[uF1¢üH·³PÚ¢ñÜ•â°@ãúç&ÃKÛ™q5µ ´ã SÄfHž,× ¼;JücäžMbÿ„hÝ6µ˜o†›œí&Þª.GO©£G´ÜýÅÊËgÅOf?hS]Ö]e«S¹nFÙ_jñÛÉû vA-öèiEÆOÝŠo)º¼Õxüø Gi«8SÌb»S´Ùí-†êÙË90ù™]¨ÕN‹ð$ÑØá-ûÄÐm¿'ÇÃ’ž×ˆRŽë¯³uÌ:š s…>”ì†ÔÙ0y¬$=?ï𙨅 ›ùö+Uqª.=—7ÁgdšOÅ Í';Ùì-¦ û©—öõo4<)üORÃNŒ—_¿XÇgÀ4"ïE¤E=ò .ÿè’¤w´mAž ›ÛÍÿ™Ç_º¦}þ«máÀ-?¡ÉXfܵnË•Ýúožñª,„ :àj]šJ¿ŒÝ<[v'áb­9†Sž³˜ÌÖ[T!ñ1íòƒíâ‰E[ºÏ,— d}¾Ì߬W8.–5b:µáq—ö€Þ}´hY^YY´øbõ™³ÅºA·Ôw‹%é‰ód„ÆN>ìJn×¹—•§»Ž”Qby,[ëÕ³ŠÌåK«·F6·Ë‹gÁíµ·÷Ín„OeËIl(,[xÙ2\NØ0<Í]ˆG¸<:¥ ÖãXŸEŸ(ÅÇ®o– ¸Ánnv´*ż{6ƒÑz/ÕE嚉¶¯Æ,.W„ªJ%™Øð óÁ?¼ç÷sþš1í"ôiÔ'[62)‘p±I¨¨î°öfÑÏ¢A*NoÎwxÑ(˜í”›JìÈÍ@Šu{«4Iž3lkþª¸l‚9¾Ýg§Sp?ÇÖ!2‰)r¡‡ðp‘÷þƒ _»ø­´lËÛæFû­ÖéNë'?ƒÅ5ÆëßÂîT|ÙR±ñr­™ endstream endobj 67 0 obj << /Type /FontDescriptor /FontName /BGLPLY+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/a/bracketleft/d/e/equal/h/i/n/r/s/t/w) /FontFile 66 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DSMUKH+CMBX10 /FontDescriptor 45 0 R /FirstChar 44 /LastChar 121 /Widths 39 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TSZRZP+CMBX12 /FontDescriptor 47 0 R /FirstChar 44 /LastChar 121 /Widths 40 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SFISLY+CMBXTI10 /FontDescriptor 49 0 R /FirstChar 83 /LastChar 119 /Widths 38 0 R >> endobj 22 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RLYTRW+CMMI10 /FontDescriptor 51 0 R /FirstChar 60 /LastChar 60 /Widths 32 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QMZLHV+CMR10 /FontDescriptor 53 0 R /FirstChar 11 /LastChar 122 /Widths 36 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HSXFRY+CMR12 /FontDescriptor 55 0 R /FirstChar 18 /LastChar 118 /Widths 41 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VWHWVM+CMR17 /FontDescriptor 57 0 R /FirstChar 40 /LastChar 119 /Widths 43 0 R >> endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JAYLBW+CMSLTT10 /FontDescriptor 59 0 R /FirstChar 33 /LastChar 121 /Widths 33 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OQSBWT+CMTI10 /FontDescriptor 61 0 R /FirstChar 40 /LastChar 121 /Widths 35 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TPPKQG+CMTI12 /FontDescriptor 63 0 R /FirstChar 66 /LastChar 116 /Widths 42 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZMROLL+CMTT10 /FontDescriptor 65 0 R /FirstChar 34 /LastChar 120 /Widths 37 0 R >> endobj 17 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BGLPLY+CMTT12 /FontDescriptor 67 0 R /FirstChar 61 /LastChar 119 /Widths 34 0 R >> endobj 13 0 obj << /Type /Pages /Count 6 /Kids [2 0 R 15 0 R 20 0 R 24 0 R 27 0 R 30 0 R] >> endobj 68 0 obj << /Type /Catalog /Pages 13 0 R >> endobj 69 0 obj << /Producer (pdfTeX-1.40.10) /Creator (TeX) /CreationDate (D:20131113201920-08'00') /ModDate (D:20131113201920-08'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 70 0000000000 65535 f 0000002294 00000 n 0000002189 00000 n 0000000015 00000 n 0000169634 00000 n 0000170057 00000 n 0000169495 00000 n 0000168933 00000 n 0000168793 00000 n 0000169073 00000 n 0000170197 00000 n 0000169355 00000 n 0000169916 00000 n 0000170479 00000 n 0000003989 00000 n 0000003881 00000 n 0000002453 00000 n 0000170338 00000 n 0000169773 00000 n 0000006549 00000 n 0000006441 00000 n 0000004129 00000 n 0000169215 00000 n 0000008122 00000 n 0000008014 00000 n 0000006701 00000 n 0000009903 00000 n 0000009795 00000 n 0000008262 00000 n 0000011724 00000 n 0000011616 00000 n 0000010031 00000 n 0000011864 00000 n 0000011888 00000 n 0000012262 00000 n 0000012634 00000 n 0000013126 00000 n 0000013748 00000 n 0000014114 00000 n 0000014345 00000 n 0000014795 00000 n 0000015253 00000 n 0000015808 00000 n 0000016070 00000 n 0000016564 00000 n 0000031218 00000 n 0000031523 00000 n 0000044261 00000 n 0000044568 00000 n 0000053837 00000 n 0000054080 00000 n 0000061100 00000 n 0000061323 00000 n 0000082460 00000 n 0000082892 00000 n 0000093235 00000 n 0000093510 00000 n 0000103791 00000 n 0000104060 00000 n 0000119966 00000 n 0000120406 00000 n 0000137831 00000 n 0000138186 00000 n 0000146535 00000 n 0000146769 00000 n 0000164157 00000 n 0000164592 00000 n 0000168541 00000 n 0000170572 00000 n 0000170623 00000 n trailer << /Size 70 /Root 68 0 R /Info 69 0 R /ID [ ] >> startxref 170889 %%EOF Biostrings/inst/doc/BiostringsQuickOverview.Rnw0000644000126300012640000002175412227063322023351 0ustar00biocbuildphs_compbio%\VignetteIndexEntry{Biostrings Quick Overview} %\VignetteKeywords{DNA, RNA, Sequence, Biostrings, Sequence alignment} %\VignettePackage{Biostrings} % % NOTE -- ONLY EDIT THE .Rnw FILE!!! The .tex file is % likely to be overwritten. % \documentclass[10pt]{article} \usepackage{times} \usepackage{hyperref} \usepackage[margin=0.65in]{geometry} \newcommand{\scscst}{\scriptscriptstyle} \newcommand{\scst}{\scriptstyle} \newcommand{\R}{{\textsf{R}}} \newcommand{\code}[1]{{\texttt{#1}}} \newcommand{\term}[1]{{\emph{#1}}} \newcommand{\Rpackage}[1]{\textsf{#1}} \newcommand{\Rfunction}[1]{\texttt{#1}} \newcommand{\Robject}[1]{\texttt{#1}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\textit{#1}}} \newcommand{\Rfunarg}[1]{{\textit{#1}}} \bibliographystyle{plainnat} \begin{document} %\setkeys{Gin}{width=0.55\textwidth} \title{Biostrings Quick Overview} \author{Herv\'e Pag\`es \\ Fred Hutchinson Cancer Research Center \\ Seattle, WA} \date{\today} \maketitle %\tableofcontents Please note that \emph{most} but \emph{not all} the functionalities provided by the \Rpackage{Biostrings} package are listed in this document. %----------------------------------------------------------------------------- \begin{table}[ht] \begin{center} \begin{tabular}{p{2.5in}|p{4in}} {\bf Function} & {\bf Description} \\ \hline \Rfunction{length} & Return the number of sequences in an object. \\ \hline \Rfunction{names} & Return the names of the sequences in an object. \\ \hline \Rfunction{[} & Extract sequences from an object. \\ \hline \Rfunction{head}, \Rfunction{tail} & Extract the first or last sequences from an object. \\ \hline \Rfunction{rev} & Reverse the order of the sequences in an object. \\ \hline \Rfunction{c} & Put in a single object the sequences from 2 or more objects. \\ \hline \Rfunction{width}, \Rfunction{nchar} & Return the sizes (i.e. number of letters) of all the sequences in an object.\\ \hline \Rfunction{==}, \Rfunction{!=} & Element-wise comparison of the sequences in 2 objects. \\ \hline \Rfunction{match}, \Rfunction{\%in\%} & Analog to \Rfunction{match} and \Rfunction{\%in\%} on character vectors. \\ \hline \Rfunction{duplicated}, \Rfunction{unique} & Analog to \Rfunction{duplicated} and \Rfunction{unique} on character vectors. \\ \hline \Rfunction{sort}, \Rfunction{order} & Analog to \Rfunction{sort} and \Rfunction{order} on character vectors, except that the ordering of DNA or Amino Acid sequences doesn't depend on the locale. \\ \hline \Rfunction{split}, \Rfunction{relist} & Analog to \Rfunction{split} and \Rfunction{relist} on character vectors, except that the result is a \Rclass{DNAStringSetList} or \Rclass{AAStringSetList} object. \\ \hline \end{tabular} \end{center} \caption{\bf Low-level manipulation of \Rclass{DNAStringSet} or \Rclass{AAStringSet} objects.} \label{table:Low_level_manipulation} \end{table} %----------------------------------------------------------------------------- \begin{table}[ht] \begin{center} \begin{tabular}{p{2.5in}|p{4in}} {\bf Function} & {\bf Description} \\ \hline \Rfunction{reverse}\par \Rfunction{complement}\par \Rfunction{reverseComplement} & Compute the reverse, complement, or reverse-complement, of a set of DNA sequences. \\ \hline \Rfunction{translate} & Translate a set of DNA sequences into a set of Amino Acid sequences. \\ \hline \Rfunction{chartr} & Translate the letters in a set of sequences. \\ \hline \Rfunction{subseq}, \Rfunction{subseq<-}\par \Rfunction{extractAt}, \Rfunction{replaceAt} & Extract/replace arbitrary substrings from/in a string or set of strings. \\ \hline \Rfunction{replaceLetterAt} & Replace the letters specified by a set of positions by new letters. \\ \hline \Rfunction{padAndClip}, \Rfunction{stackStrings} & Pad and clip strings. \\ \hline \end{tabular} \end{center} \caption{\bf Sequence editing.} \label{table:Sequence_editing} \end{table} %----------------------------------------------------------------------------- \begin{table}[ht] \begin{center} \begin{tabular}{p{2.5in}|p{4in}} {\bf Function} & {\bf Description} \\ \hline \Rfunction{alphabetFrequency}\par \Rfunction{letterFrequency} & Tabulate the letters (all the letters in the alphabet for \Rfunction{alphabetFrequency}, only the specified letters for \Rfunction{letterFrequency}) of a sequence or set of sequences. \\ \hline \Rfunction{letterFrequencyInSlidingView} & Specialized version of \Rfunction{letterFrequency} that tallies the requested letter frequencies for a fixed-width view that is conceptually slid along the input sequence. \\ \hline \Rfunction{consensusMatrix} & Computes the consensus matrix of a set of sequences. \\ \hline \Rfunction{dinucleotideFrequency}\par \Rfunction{trinucleotideFrequency}\par \Rfunction{oligonucleotideFrequency} & Fast 2-mer, 3-mer, and k-mer counting for DNA or RNA. \\ \hline \Rfunction{nucleotideFrequencyAt} & Tallies the short sequences formed by extracting the nucleotides found at a set of fixed positions from each sequence of a set of DNA or RNA sequences. \\ \hline \end{tabular} \end{center} \caption{\bf Counting / tabulating.} \label{table:Counting_tabulating} \end{table} %----------------------------------------------------------------------------- \begin{table}[ht] \begin{center} \begin{tabular}{p{2.5in}|p{4in}} {\bf Function} & {\bf Description} \\ \hline \Rfunction{matchPattern}\par \Rfunction{countPattern} & Find/count all the occurrences of a given pattern (typically short) in a reference sequence (typically long). Support mismatches and indels. \\ \hline \Rfunction{vmatchPattern}\par \Rfunction{vcountPattern} & Find/count all the occurrences of a given pattern (typically short) in a set of reference sequences. Support mismatches and indels. \\ \hline \Rfunction{matchPDict}\par \Rfunction{countPDict}\par \Rfunction{whichPDict} & Find/count all the occurrences of a set of patterns in a reference sequence. (\Rfunction{whichPDict} only identifies which patterns in the set have at least one match.) Support a small number of mismatches. \\ \hline \Rfunction{vmatchPDict}\par \Rfunction{vcountPDict}\par \Rfunction{vwhichPDict} & [Note: \Rfunction{vmatchPDict} not implemented yet.] Find/count all the occurrences of a set of patterns in a set of reference sequences. (\Rfunction{whichPDict} only identifies for each reference sequence which patterns in the set have at least one match.) Support a small number of mismatches. \\ \hline \Rfunction{pairwiseAlignment} & Solve (Needleman-Wunsch) global alignment, (Smith-Waterman) local alignment, and (ends-free) overlap alignment problems. \\ \hline \Rfunction{matchPWM}\par \Rfunction{countPWM} & Find/count all the occurrences of a Position Weight Matrix in a reference sequence. \\ \hline \Rfunction{trimLRPatterns} & Trim left and/or right flanking patterns from sequences. \\ \hline \Rfunction{matchLRPatterns} & Find all paired matches in a reference sequence i.e. matches specified by a left and a right pattern, and a maximum distance between them. \\ \hline \Rfunction{matchProbePair} & Find all the amplicons that match a pair of probes in a reference sequence. \\ \hline \Rfunction{findPalindromes}\par \Rfunction{findComplementedPalindromes} & Find palindromic or complemented palindromic regions in a sequence. \\ \hline \end{tabular} \end{center} \caption{\bf String matching / alignments.} \label{table:String_matching_alignments} \end{table} %----------------------------------------------------------------------------- \begin{table}[ht] \begin{center} \begin{tabular}{p{2.5in}|p{4in}} {\bf Function} & {\bf Description} \\ \hline \Rfunction{readBStringSet}\par \Rfunction{readDNAStringSet}\par \Rfunction{readRNAStringSet}\par \Rfunction{readAAStringSet} & Read ordinary/DNA/RNA/Amino Acid sequences from files (FASTA or FASTQ format). \\ \hline \Rfunction{writeXStringSet} & Write sequences to a file (FASTA or FASTQ format). \\ \hline \Rfunction{writePairwiseAlignments} & Write pairwise alignments (as produced by \Rfunction{pairwiseAlignment}) to a file (``pair'' format). \\ \hline \Rfunction{readDNAMultipleAlignment}\par \Rfunction{readRNAMultipleAlignment}\par \Rfunction{readAAMultipleAlignment}& Read multiple alignments from a file (FASTA, ``stockholm'', or ``clustal'' format). \\ \hline \Rfunction{write.phylip} & Write multiple alignments to a file (Phylip format). \\ \hline \end{tabular} \end{center} \caption{\bf I/O functions.} \label{table:I_O_functions} \end{table} %----------------------------------------------------------------------------- \begin{table}[ht] \begin{center} \begin{tabular}{p{2.5in}|p{4in}} {\bf Function} & {\bf Description} \\ \hline \Rfunction{stringDist} & Computes the matrix of Levenshtein edit distances, or Hamming distances, or pairwise alignment scores, for a set of strings. \\ \hline \end{tabular} \end{center} \caption{\bf Miscellaneous.} \label{table:Miscellaneous} \end{table} \end{document} Biostrings/inst/doc/BiostringsQuickOverview.pdf0000644000126300012640000035013612241047511023351 0ustar00biocbuildphs_compbio%PDF-1.4 %ÐÔÅØ 1 0 obj << /S /GoTo /D [2 0 R /Fit ] >> endobj 4 0 obj << /Length 2657 /Filter /FlateDecode >> stream xÚµZKsÛF¾ëW`©«Ìñ¼lm²×®TÊ•u"UíÁ΢ [1IÈ%ÙùõÛ=Ó H€¤ä À zº¿~ÏàÕåÙË·J'"cR\Þ$R(Vd6±…bª0Éåuò!}u;i Ívƒ—køûÔÌæŠóô×{¸Á‡‹™´éÿð¿pÿ0“YZmp¸‚³ß/~ùV‰¬0Fâr–3còd.s–Ò¯öSµñ¯çéG.ÕL[™V@Wšô=Ò,?Ñ„!•V Næ™f ˆÏQ{Rog¹L‘Zuí ü„Ün=·Yú™XGyšÚ]¸Y¯Kz¸VÜ“ßP‚¦Âç›îm?¹Z#?Hf#+ÀI!'™çä‡KZ|»Ä;ø{áIüo&xžž{9@¹ ( #üRãQxm…wW³9ª#'9\ øSò<)Xa¥EÀç¢0Ì(àNY·Ž£ÿ&/‘rÙ8¤3'}ídò÷x‰p•[OS«ˆ( $Ü[á«uoy©Y;ï ¦Ü‘9¹ÓÖÀÆ\Xz9›ÃÏrŸª’LÛ–n`•8¿¹ÊÜ’ºëu¹¤Ëð¨jüä;Tp8?ÐÈuk=p ¸Çk›nýž{so“Ün^…EÁw‚¹}jöeÐ`¾¶} ù(•}™ &O”›N0'CCBxmz»&ö\Œ»v<‡«â±êŒ–‘ 6¶¥%Ë!"Ì¥dÒdÁ› ›ÞwPz·ÏÞ\ž}=ÀüΓkø9áQòäÑM[áT’erqöëÙ+ŒE=&`]E9Ðóä ÿñÊ\$Bœ¶cŒ@pá äEæEÀ ¾ñbDÄ‹µ âMb´`YpšàÄ.’>À¡À¤Á™ŸG>„FÌ‚ KÛ{ŠJ¨z¥zö·NÑ÷mÈ𣆒i}ãç  ÕWôG'Ð"xLq¿%ýÖ@Ęôœ² ©Ù8ö*séd ìeÁ4§ÀŽ˜—.z4#¸KÃr)&Á=^þ4ÜÅUE.<ØÒÏ«üuãQÇ·|¾é¦ßv”{Øëô*¸ààAr ¨M`¬˜÷ Ê#°Á;³•³I—{ïkSHÄ€ ¡ç«¸eÀs$¼·w™ÊV™î×Ô›j\Í}@ò0@'ëÃfÌBçàzŒÊã¶ðÙÖBWp4ªµe»C$t. kÜHÆ‹#™z'è˜Âcyö3º6=§[§ö?ƒ«ÀƒÜpÂác6›ëœSÅåû´,îÓàçZûâqŠw,šðƒaR¹\ú‹]FFB' ÝvÜ—®$4æäNÐ'äBmtå“äB­¡›UTµþ«þ¸o/‚3­ÅÉYðÊ€¨‚ez’ì×cüMh“W¾î§¾xþ:1rõ…Ë]®‡s]JS¯ãhüœPŽdÀæ°£§É‚ j–u-~Ùî¤Láý?D[1?ŒhUfÀù$Je9w…ú²þÔ%Êz€[ òä6Þã8ô ­ü庫üzdEÁ”ÉFQØÛ=E&£j·²ÊM¹è"Šs»hÞR\ip(S¼¢˜&s‹šJ¥×dÝw®Z {…|ÕpM a^rsr4›ÜÐþôfd×ñiýU tMøT"*ƒZ?S‡íH–[{ÔŽ"Y"3´Òí  e,mì<&=˜»0Gm@ Í! vì„3©Ll(Èà =­]ó†”I«odøÕ/ŸìYËø&X,Ô4PãI(|qc‰ Dzã·=§Àb(§’*sû‡¿œÓ³v¾ “k?pŽŒÜ^ûѱVIÇ›ªUƒ¯ÿ“*Q\éç÷K®ýp_˜mÙíÕºêjÜŸÐÍa<ÕŸT$¹íL*IÛ¿œàCã(¶Že4ÓVOPâ÷dŠã³ãñÙ@/cß:Dá:¬b±Ðæ({±X˼Œ…ˆ}Œ6b( :7k‹{ñ\Hñ;´RÁ; €ô L *˜žƒmÂöûý²ëro»Šµ8΄ÇE›ðÈEzáÏCÂîù…kÀÞÀ"W¶;,6C'GJ˜6w?k™ SkËîÚ%4[iŸ\l÷Z Â&ÎÊŠËY¸^‘­P‡!þ5pjãŠýÖrß9ûõ<Î]Ûò€×6”¹LWÎLoï¨ X–ÑŽ›€—7dÅ<æP)¦;-xm^PDï#í;Ü}6³ ü¥è'š…LÝzjò‰ËØÞ)".ª´Té/RÖ²^„°Ì¤O>é’y€ÈINºd!ÁUògŸt!/RM²é/³‚Ykv7=C1ཧŸ½lØ©óÕÈ*ŠœUtT³n·›öÆWéëS‰(: qìhâ´2­ÊëÚ1sßêsÅE×Ùs/@åãq+ †b‰Ý¿ÜŠÑÇÒW›ŒÐ˜wû »À'Pú·e´ÒWØ“h+#ܫړ|Ò½iM¤†øÂEwб¡fhMÒ/{ÍѰơ“ÍM1AýÐãÆbÇŽãe鿆pš×&C µÉ½†¶þB«m¡mÇ÷ËIœî«P´ƒ:" ¨§g‰ÞNÁŠDÛ‚g5Õ|HÏ{kÊe¡äØVBÝÃç=ýýÝ͇•]ºá“™÷X8 Ås’mÚS’à0]9´¨ŸRDdV|Ø¡£ÌTÞ±÷.võë@±)˜’êä6y˜ªHÿ[¢”\3¦ûA'}‹òxImÞŸdP?]"?ÊVH#wQ°Xгóñ4!XQØ)‚F ýÞ‘©H_nB›ë؃à:7,is}”´q¥ýw?Ô8˜›½ò§Ááø¸ô%íãÓÒÿ´oE 1>ÇÆ1¾à:õÍP^nÚEéÛ¥C&, Ίb’ ‘Kh~ŠãZ}G¿ÛhÏlsDÛÐ7çZM]zlºc¤»V¯»{ý#áDQ›¾ÎY ÒtŽî>ì‚W¯0¿?tü–CÝÄ·ÕëfŸšBõE¹`[zP2 gõ$»;ôÌF_½Ñ¦Ó9™ë5U¡Q¾ûË[ÅÁ#‚ }¡.¢gæÔ]Œ|W$€{OrÑà=fÿòºýêÁïщÒÒwlþÐhÙCênŸþý[ÿàA2#4tÐ`„¸0ؘÊÑÆ´=Ù»:‡>L¡­ƒDÛ¸½cû-‚iü4QÀ…ÒÔ%‹ ýÿ>tI endstream endobj 2 0 obj << /Type /Page /Contents 4 0 R /Resources 3 0 R /MediaBox [0 0 612 792] /Parent 17 0 R >> endobj 5 0 obj << /D [2 0 R /XYZ 45.8 783.062 null] >> endobj 6 0 obj << /D [2 0 R /XYZ 46.8 745.2 null] >> endobj 14 0 obj << /D [2 0 R /XYZ 159.89 338.185 null] >> endobj 16 0 obj << /D [2 0 R /XYZ 282.055 150.21 null] >> endobj 3 0 obj << /Font << /F34 7 0 R /F19 8 0 R /F8 9 0 R /F43 10 0 R /F45 11 0 R /F46 12 0 R /F51 13 0 R /F50 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 20 0 obj << /Length 2819 /Filter /FlateDecode >> stream xÚåZKsÛ8¾ûWè(WE ñ Î-“ÙTíÔN*;qm™™¶U#JQŠãýõÛÝh€€DÒvÌ9m¹d’4úñõüùêâõ;ÏʤÌe>»º™åy’J9+Ò4)…œ]]Ï>Ïß]–ùü¸¹óåþ­¶ðosùåê׋\]üu!f)ü‰™Ìä,/‹DÉl¶l.>Ig×Ðñë,MTif÷ôZƒ¯Š¤Ì²Ùzöñâß?Ÿ‘ ³") Óð ¬Y·HÂ~ÿwð; ’§Iª3¢EÀ”#´èHÁa-™8gGnL’eÆ’RÁªk¦á~øüÉCšà÷~{~þ ~G¾'Âï)†5ÌštLpàûýS'ë‘C.’4ãrPYbò<Ü»éC´÷«K£æîöˆW–Ô…Òz~¸s÷Y¼·•Ööý‘f)]©éÀœ<íÑÚ%V´ñ¾!4ÛŽ¤ñõr!óy}°Cn i»G&HVjàÈ Oê‚„¶p£"Ù=IF1suž”F¹Å_].tVη&âž•÷ˆíÎî §DNü‘ Ë\ÛnâšWf8v ²@(0Rÿ—«`¼½Â$*-ÜÄ q¤¨ùöÆ’T17s™h#bn¶~ZdÉBÆÑ{¼JûÆÁÞãŒØ‡ÐPŸŒÂ¶dàjr9 S2­¸bó±gk bÇ3ý®ìØÖ1áºÏ7ÑÛÛÍ­µ´yáÑ©æîØeŸ "hkª9…! ¸*K5훉kuiY xý‘þÀê…›ù>`S°J«çF6½6PùvÛt̳ÑÃd+ÃÖ)O{d]…®†ÜpG|„ŠUŽ`:uúHê?"$ؾÔz!¥*É‹Üî?D·#³-3Å¡`ý£ÁU(Þ¿u¡m€Û·þM¶à¹^fEž Mõ¡`Þ]ðÓ-k\4.ªxe[Ô¢!pæÇjc#T·?)^ó¦f‡½Üi#Ò@Ðî]½{ãœ:øïßÄŽþ÷÷o†52+²dÔÈò"Ñ.јN\bþ†Æõ‹M"›Blù6@_zHNF—Q4 íu:ÚÔÐAQ×{µA'¯µÐœüƒ½¯¿Z-£Ð_øukûê‡w‰µÛˆ©mŸEÑÒGV.§sòp,Wö±­ù™BKh@ÇI@h#ì²!˖‘C“X CÈ=ÓCM›@:ïx…sß]ÛZÒ‘"<Ê25=›Ðqéç2*P!žÝF $KHÖÕ,…T§Þºó?ê'_Ey:i鬷l'ÖÒŒ³t#ç¯íå`³Gœ¿ ^áHr‚T&üì¢LŒž]€€hl¦˜¤¡ešèLýpiÉÇiy*DéÔ$ÂÒ1Ë’múCІ͛H ó80:2Z›àœËÊ€pR5z;{çáàµw…•Rw%çÿoÉÄqgË#“¾` ÇPè×Ê^nWßÐ#Õ\T€–]íŸ[¹`qÀ—Xô«¥Ï,qžR¾ÛÃxW¾È)ÊÇ 9çY=¸¨<88Ãlîˆ):b°? éqêµ¹["ík‘iE9Üqç9çp†ÆÕu™H´…á`óR«×YêŽ×§Z…*Dbsó¡ÛÆ7øRûÈrÊšGíC*Üä#æmñÿÅ@Æ3¢»Çh¢*P×cµÂÐý#Sw¢û0i¨ûKÜÈ]ÝåX]p+­¿êT}DÏAÒ2›DÏu‘d²Çÿ_¸ óÔH‡ôzx ‹åžWY=¶b!€ ÆOD<5„Ru†Pª®˜÷lC&Pj«d¥Õ?xô¥Æ kGJÕ“²«O»ñ™Ïnêxµ>ùôWMEQX ;¯e2Q©/a?YL1ƒAMsåÃ8[ƒ~°öB¡yÝñ¶«;ûä@Ïï»59h†Æs"¾½á×™Gxe$ž×¶®QA©L¬‡¶~‹p‰Ñ&žlÀ­ú|•¶Q‡’С%\‘>u‡“{ž ÀŸÆk´û ¦Á>kØÇU—†Ò6nY'#h!JÀy1 ZÏd®÷Š"Ƙ7|5¾Q}ú‡‘CfÀ,‡x§(‡Ž!Ÿ1£Ä³þ©Ç¤”¢!ép/^<Û,Ý<ȸ-¦†¥¡1ÍÎåWMd^î8§DGŠ®÷@ÎKÌ¿\.JUZÜsè÷tYxÜà :ë"‹*óDåæ´\eáÅ»wõŒ.ù„y èBS–[tˆˆ÷®ë,,àÁ‰ÓHåGî{Á‘ß= €jÚ:*p+ÙKÁ1K¤1gà¨Rcëñ½àè"‡´äòÜDel8 ýã.1TtÀqgp‹nù˜ìB@âzVµHÌäÉÔ;,Ñ•iðÞ{=¸¿sˆkæÜ[qÏšöÔò“G\˜vq•á ÌÁm·PeÇÚl½¶T3Œà–Ï–z«¯7Q,÷tðE¬É³I¾™HRçå;†ŽÛÖ½s ,ñ7'åâ ÃMí±¶!bÊt1AvQ‹®p»v’Ö™týûšpÉâniƒÕÝOX(r^¡õ’fAÃè[JA¿VkûXùÒ6k[¶emübW¦ÃÙŸ¨ íu·¡Pü,ßÓ*ö×Áª5¥nÕÓÐ)¨]TÙâíÁ]í·E^¾³‡=˯Úñdý‹Ñ°¿º’r3¦Ž _¥'©I™'…O>ÑAØ3 E~@j¢«Uf Õ ( ÷µì¾%Áû0¨”ò,ï=wqÒn4}ü€bÛ¶« ê¿Åcã}‹T²&1ß±€±ù·*>E¤FíJÉß<œ°x¨4p@7¢30kªÊIt&•‰.ÄùÑ*пà÷ûhA¹Ú«¢4‰1zŠÔˆDªXw4’%®_]8oUÇÝ÷‘ô¬í‹Œ°àÏàøgêÏdpˆ?6¯< I Ù‘›Iê¢L!Fê/‘²ã_É<5ƒ¨ L}Öeì«LÎaÖÜ{æË±9ïÂ[²‚–xRñ7=!~,‘0+¡ ¬Öžý²èóB.?¾ÆGú£2¼¯ðk'5o®£~Rf¯žØÑa¿BRò³±MõÝ›‚OU©‡ŽÚÝ,•c öøOæ`Á{÷ùN½:J'xmF4?ë’“ä²ÅB¨ÆØžý”û^ïCvõkµ2 ¤…ø©ˆÂH«‹ UÈîûHl÷ Eòî0»è5 ±aLFÑv¤½8¡·(îÅFbXaòtÎDÜP=AIjPîÀT!&ù¢NH<\Ôݰûlà:ïú¤Ýé ¡”ÃAoƒA»àÌ?ŽÃ]jþÌÅ{Oè$}¬"ú4Å Y*ž. !¬"ú¬§²Y#Û©ýÚ Þ[nƒRD²º:¼¹óù¹l¿m| J¯Ý®ø%š×æýöhÜà)}/R>]³ÙóÏŒ"¶‰âI33Ñ 1rÖ­Ϻý—²˜)ÙO®‚ómg«Š çGßÕ:Jô€×E|”pRyP‰0³EnY–vYéøó?é% endstream endobj 19 0 obj << /Type /Page /Contents 20 0 R /Resources 18 0 R /MediaBox [0 0 612 792] /Parent 17 0 R >> endobj 21 0 obj << /D [19 0 R /XYZ 45.8 783.062 null] >> endobj 22 0 obj << /D [19 0 R /XYZ 268.865 523.078 null] >> endobj 23 0 obj << /D [19 0 R /XYZ 250.329 97.166 null] >> endobj 18 0 obj << /Font << /F46 12 0 R /F51 13 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 26 0 obj << /Length 1127 /Filter /FlateDecode >> stream xÚ­WÛnÛF}×Wy¢€x½w.û&75’ i[@Äy`t‰…P’#Juó÷™]ŠdEQVM+^vwöÌåÌ ¯ÆƒËkm£”¥VÚh<¬e\ÊÈJÍŒRÑx}‰¯‡©w«¡ˆ'[ø[¬áo5ü:~;øc<ø9‡Ÿˆ¤Á}œ¥ p²|ùÊ£)L¼8S©‹iÙ— –åÑíàãàê‚4 K×Äð Μa³€ÿÛc@,g\Â’è¤ ‹N n«a1¢ÅB2‘¤Ê¡ÀÈ`La\Á¸E<0pnA¨Dü=¼ŸÑ „s.‚î­‚PÇ?aŒúxÓ·ÀÑ9£Ã$’%2éŽ0'EÝ#®-8ê¹!ŒÓá…“I¼ÞLKTâûã’L;º¼1Z–ˆ×¸ÁÅ£ ®§Ý6.f?ái‡zPÀ£ä ž£´õÒ?Üq¡ó mÑfº;n8Ì]…ñèvP@{jË«04>ö˜«+ÝÏ/Áh©Ï†áÌjiã˜-yOíBö­©·ùÍçüÆçJ™Ñ²Lúo.aù_°Ü"»@öúg–/0,ø$VÁVLC'}î÷™Ÿ[-zù>“Â0)Ýÿþ>C,,Ñ}$—Ì%!F‹#}ê«ZÁ>’ND„TMÑïkÌ(»’ÏØ•poïCŸ÷>|Évÿø7빿¾›ýQO mq_ö93¯­˜M÷É‚ž§{-³ª ¦DšP+‹k^gKÄ´ðÆi)d$³4e¶š”þ}Ùl‰}†Ð«fè€ôµæ(Pˆ¶•LOdº I ð_ô ­QîÜ[ŠÀÇÉŽîJ=—ìBE¤Œ—ű•ëö4×ß—&Ìòœ¬ŠÛ×e-b‡ ¢PÌ©£ák×… ¦J}ÿðçù© endstream endobj 25 0 obj << /Type /Page /Contents 26 0 R /Resources 24 0 R /MediaBox [0 0 612 792] /Parent 17 0 R >> endobj 27 0 obj << /D [25 0 R /XYZ 45.8 783.062 null] >> endobj 28 0 obj << /D [25 0 R /XYZ 290.185 470.61 null] >> endobj 29 0 obj << /D [25 0 R /XYZ 289.672 171.054 null] >> endobj 24 0 obj << /Font << /F46 12 0 R /F51 13 0 R /F8 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 30 0 obj [865.5 816.7 826.7 875.5 756.7 727.2 895.3 896.1 471.7 610.6 895 697.8 1072.8 896.1 855 787.2 855 859.4 650 796.1 880.8 865.5 1160 865.5 865.5 708.9 356.1 620.6 356.1 591.1 355.6 355.6 591.1 532.2 532.2 591.1 532.2 400 532.2 591.1 355.6 355.6 532.2 296.7 944.4 650 591.1 591.1 532.2 501.7 486.9 385] endobj 31 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 32 0 obj [383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6] endobj 33 0 obj [666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.5 666.7 666.7 611.1 288.9 500 288.9 500 277.8 277.8 480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 238.9 794.4 516.7 500 516.7 516.7 341.7 383.3 361.1] endobj 34 0 obj [743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2] endobj 35 0 obj [555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4] endobj 36 0 obj [489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8] endobj 37 0 obj [654.3 667.6 706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6] endobj 38 0 obj << /Length1 1872 /Length2 13202 /Length3 0 /Length 14364 /Filter /FlateDecode >> stream xÚ÷PÜéò ãNðÁwwwww`pwww—à‚k°àÁ Ü஗ݳgwÏÿûªî­©šù=ÝOëÛýÎ 9±’*½°©½1HÂÞÎ…ž™‰ */¢ÅÌ`bbe`bbA 'W³t±ýWŽ@®rr¶´·ãùCÔ ty—‰]Þ‰òövW3+€™ƒ‡™“‡‰ ÀÂÄÄý_¢½@ èfi gÈØÛœÈEí<,Í-\Þãü÷@eB `æææ¤ûÓ l r²4Úä. Û÷ˆ&@€ª½‰%ÈÅó\PñY¸¸8ð02º»»3mį̀éî–.3ÈÉ d ø£d€ÐôWi ä5 Kçÿ(TíÍ\ÜN À»ÀÆÒdçünâjg r¼G¨JË@vÿ!Ëý‡@ø«9fæ¿Ýýeý‡#K»?&&ö¶@;OK;s€™¥  (!ÇàâáBÚ™þAÚ8Û¿ÛÝ€–6@ãwŸ©ÂÊà{…ÕçlâdéàâÌàlióGŒ¸yo³¸©¨½­-ÈÎÅáüÄ,@&ï}÷düëp­íìÝí¼ÿ‹Ì,íLÍþ(ÃÔÕQÝÎÒÑ$-öç]„ðÌä`gbbâäà€  Æ?¨y:€þT2ÿ!~¯Á×ÛÁÞ`ö^È×Ò ôþàí t\œ\A¾ÞÿVü/B`f˜Zš¸ŒAæ–vÿxƒÌþƒßÏßÉÒ Ëô>~̦?^?é¿O˜©½ç?ô?˜QT[^ER‘ö¯’ÿVŠˆØ{¼éÙ9ô,ìLff6çûƒïÿúù»ÿ­þO©Ðò¯ìþåQÚÎÌÀýŸ"Þ»÷ßBÜþš ª¿Ö†ð¿ìßç úgüõ˜Ø™LÞߘÿ?/ÁŸ&ÿÿfÿ/ÿ¯ãÿ3’pµ±ùSOõÂÿhkiãùã}ž]]ÞwCÞþ}Cìþ/UôŸ…±·1ý¿:iàû†Û™ÛüÝFKg K©’¥‹‰Å†è¿§ðîÜÆÒ¤dïlùÇ… gfbú?º÷3±~¿TœßÏêOè}¥þ7¤¸‰½é»Çò~î@'' 'ÂûÑ¿#v€7óû’š‚<þœm#ƒ½Ë» à½8_€™½Â'ÊÁù>Nˆþƒ¸Œb#N&£Ä?ˆÀ(ýâ0ÊýƒÞ½Èÿƒ¸ŒŠ#®w;Õ¿÷;øzgüz·3ùýÑ FÓAf#è_Àhö/øÅü_ Àhñ7dcGžïWÜ?Œw™å¿à{=Vÿ‚ï‰Ùü ¾gfû|_:ƹz_sFûÁ÷Ìþ‰ýîØá}ÎíÿUÊû· £ã¿à{²Nÿ‚ï™9ÿcÿÞ0g ³Å¿ï.]þß®ÿ‚ï©»ý ¾§îþ'üŸ¹1qurz¿SÿÜì÷¡ú/þó<@&‹óö&¼!Võ!÷_…ñÜéw'øgÉw53¨é½¾¹>~€M¥®ÍZwºNéC]Ù§ºZ"zñ>nk„ oOVîxòy6LT™Þí@ø5õqp²øX¸a€Ÿ^MhÏçÅÑG#в ¼[†<ßÑ•ëƒR!ƽ{¿¤GÃ@ÅòXØü®ò^-‡,âsÅ }¬zŒ^`éOòãœ9z8ôs”Ÿ7·³èy“oD2‰´¾'±¬%Þ:,qs^«Uj,Î=¸d¸:87ècÓÞ"i2Ø Þe_bÖùr9#㇗Bú“æd5pIü”pœBÊéù³äº1ÈzòÜM²œl4L&”D pÞ¡äe’fÉ5¤#e†9ø–þ/¤ªIZ঴ßz {NNÕ»i|’âqx˜c÷'l où1¶ºrü8ž`+Ó’rЩf`k¤K ŠgÆU |ÅUFœc‹½uÞ ¾ÜÑ[AZ…û|q±Õ[ãéGôàÂVšx2VjûýRÒ`1¢Ûôó+x Õ°‹;b{Ê…å•5¹™ó"„Nš[äÃïÊ®a™Œu¦9L[g|uÍ)åGS­büéÁ³/9]¿+—•OÑOØ~ƒT¢¥bõg£2ü §Æñ³w¸NsyìyZÔ?¹‹%ëèÚf0›fWöüçÙÒášl®Ù†“æ>îºÈñùQi~­r—r›£+Áõ:Zl*|žÈÿØcåV3Mz¦ï\ç¨Bò2U;Júœ:í!hI}xÖ‘õW’:Ot’Èâ»—)¬úÌ‹·1Í àw\ 1ûÕNN†ÖpÎj¶q ÁåUÛMv±èHÏ.Sî\Ù1ŽO#IZx>ôÓÑ7°Öp’âHB¬…[’T££äAÈÍ:jÄ¥•AßÇ«²[§Ð2‹7W¡IQ–ˆ‘ë—änµ\Jx‰³k^P€¤2·(Ûå$mÄ—fz7†±QBYDsç‘9T•øu¢˜…¦éæç¸^ VB{à¥zå'ØÖéÂkA]÷JˆO[c&ð:ûF¥¸Óåy]k_‘œM¥@_Ò)?¶Ò8ï ÏLª™rÿnG£….éÆÉÒÌë™;žÍP`õRa™á9U& Ш>?Ëa[¡‘þ ¶u_cé í°ûá´Iæý6­†þ[6%YÊ»R«Ôèí‘m€A2Õ£¹jgÙGéžEäÈ|¥ÑýÊØºGâk."b BU©™oœ© i‚ -ÇI%AŸ9Ä^¼÷à ÍÃÚéïtÜiD :Uå,_: Ÿª((ËìªqõŒêõ•£C‚y>l­¶õqØàÚ1s‡Ùêwž_Ð3.••èi“q|Ò¥ T"l‘/P<¡Bž¬g{Þ”«ÝªÀÑ»¡Ùº÷b¥,ýB1•Êñ%äœ%}&ª›š–*õú³u€Q=ŽØú+cý0Dª5úHR\¼uªCí£[ƒC‘ïá8[suzR~GÚ†·å?’_±àž0LÈ{Pü¨0‰—dÜœ? øf q;λïMmxoçs„¡×L8O$£É‡dÂßS(ÓwÚ§Œ¤ˆÊ”§¨çlDkCKsÑY‚Òs"ð÷aO•/me'i¢éªEé&8Y:âû3‘*Ó@×!wefE›’x2Úõ­ûøíqÞH‰Sß)d庫®Ð’ïæÁ"É|0ˆ©t¢8 <Àª{OoÀ¡×Å£ «þ,ÉZ¼WÛ¦°ö‹¯i8=Hq¿aèF4!Öÿ ?Q¹ìöÇ&1d+»ZiOL­p<¤±fŸ{ŠÎ‚ˆï7Ö–9}‹'¨`˜_cŽÛ\ûñ¾„M×% è2Ï4Úœs¼zRŸw…Mý;% g‘ ùLlÊÏ&› ½TE¥ZL!ëäbË8 rÒÆ\zˆô Vô§´ò‡mÌBŽ~³NÒצž‡rZ¼æ¢#ö-Ćåãõ7¥«5˜å(Ù5Ë¡Sêq˜(ó9¯±îTájçlº&°DŒ€‰h® ºC²sf ñ…:¾Z äÕêŠH„w­ÑÉ‘ÿ´UÇÏî<ÀhtÒ}%²³÷Ød• Þô]iuéêöƼ„f˜©óâ²½FÇÖçâ*ÃXµ]%=†4$FÁ˜w„™§¯Û¯­ “¨Âìé´ˆ,)ïX¡ú™`¹9h[Èkè® .,¥l6nd~SÄÑŠHš0ÔŒÓtùÁ7ÊÈÛ‹ÔD²§‚_m»ÚW“—E]s[Ž™%§ç4¬ÉŒÔ;;dŸR2…æ¹=¹H-2u®×%´dx3)#h wt\L ¹æb3˜ŸÝBéžËkÆ>ss"m·öLyW”f¡Wê7Ñ;-Ù,ÆÓœu8‚eáäîà/¶ÿŠ*pA‚’7ŸAà±3–x”kïwŒÿ”2ä´oÅnÐÏ Y¡ ¢Ñ ƒ²_Í ÂÚ¸L°«'?ÙœüŠ¡=˜ê:ì2ïŸF¸ Í6ؽÍçH¢é"¢Ç[ \v­ÿ\TMXƒg†3âîéé#…Yà}¦î÷‘Ϧ{ ø*AÖ€vê¼¼ÐökÅpº³ÿibN@b"º?=Ê-I9|Ä %ïíDÒcMy®I$iñ_SbzÔÅ=hdHÄLdb8%pQ•ùóå$(°×'èŠìl`I‚sxêÙèž@—Òì/z^’ä·¥2˜dÔI‡÷bEL»8\%k‹¬ÌŽ™=*\aõãY<ìÂXú¥%Ÿ$6¬A ÉýpÕí©aÓ‡ ›í(™FhÖYpÁò>bÒ¬Ñx`KÏ >–ûƒpå÷ ¾7ÚŠQ˜Z9ÑŽÔ Ú2‚e.ˆxÌ4üÏhÑ™ÅÁ<Š nõ²TßE=éÝOND9££Ø2æxH9=›<{Ëb‚8ŸÊGI°TY—ŸÐzÒNØcµTŒ—¿•yÃrÕpm`¡ÄGoõ/I ‹QÈùν2ŒTå'¹6TwÓy9ÕÉǬy!·åDDŒN]¬‹}áÅûvQšô"¤TÇI$2~k¡~ ÷YñœØHìÓ Dis>/Æ.ý2*F¬sP$oµôùýà⦠w÷јïSžÿ!{†ÛydÊ®éSÐjót…; ÛêBh)£ñ©˜Ÿ.uí¬9[iëÁ˪$£ƒBp9J*Á"ou§Kò2x:x ŽÃÁÒæCŸ¯»üg,4F0oø’ɪ€"&ãòôm+bí8!¾èâ=ä ÛW/Ïy›ŸÔo/$õ€åóÙŒÉíàžUu[û™ÌS¸E–b0ˆt_ꀜí}¯ä \>´º»³›å‰"ø|û¾ó`ÔòÜI9ÏQµ%ÎK>ñå³­×ÇHM?ÑÆÂ[mÜ+þ}Ð6ƒ)ù#Ò“ÀÛÞuŒîø–² ƒ ˆ|:íl‰§•”bðÏyäà)’ß±Û1­ºè(ÀN?ªSL¨VU0¡eâÅTf¨V›wém·ö=Ee¯NCÑZp1„c”6 &¾±ùBÓŒ\dœ™ŠŽÍðÞJöw}- (Ð!nLÂ)(o8›A9Š·  @t«ÈUÀ½Èþ"óYӬΌž½fTRh€1˜Je¥a’½Ù <ìYl¡ö…¬‘9”7'™!cäº0ì2¯ufm⤓ÍÉC™Ë„›è˜˜¤ÎßK`[Czü°ÂL Þgß^™ÖÖ‚%M¤e’£t÷Ë/²…Pt¼ Ú1(`{Áá ˜M¡¶"Pü²Äô‘ ì=_b ò+g(¸1ÖÓ#oàö‡*É »ùøÜ·Êø­S& —_­„ª”|ð­o?ú³I¼ž„9ûÒh½|ÿ%ûŪ4óÊÄAßß/“‹¯Gh;¡7ƒµ¹Èªm—%'<ˆ<œ›SaâœÌË/Á ¯7 BÀVÂ6÷gäqC/nØ ¸@ 3I¤þL-Æ 8>6ÏÝ™SkƦrËRq7­ÕÖ6† çNJˆb¨â…§3æJí¸¹á xĸýpÇj±­z²žµ¯„µ&6:äCÍ7{Ò—L>ŸÞ·› ¬Ï÷Ó¾Ìl*ÚoÞ,‹ß1û[ ¦Le•±Îrל¬ÞÈŒIïÝÕ._¡ÎPCÎÑ”Ôa2«ÔLj!°Ðr™ø›>H%Îû¤TÒ„ñ*´­&ꛕjj›àT¹ÔDÍÏⲦËä=$—¯ªÑ ²y>œŽáîs’/¸¿²sÉ64"§ º~½ÚØÎp8²èI‡ùo¤Ç´¯€wŸ“DY©ûòÁ8d8ˆ ~n2s–ïÎË6zшóâ¬?ŒŽã Ù“;bŒ¨RÄöìÅŽ¨ÐÒL—×Xüê+Z>þ@4þ#Ǽû ÜŒ‚nXï×üÙÕŸcÿIÀr£V!Vµ G’ýäé÷MIÃ×µ€üçyÛód‚ÛºŽbªÙÅœ´3•§Ÿbs¹úôáàw;JWfÔ”'nÏlQ“•½â2þºÜݶ%¼'N œ ˆcA'ã'¼3§Á+ Ác™‡U‰Vœš_ŽH³f’`faSFF†ÚE4$©ü7,w°uw¤K5…ù„Z¶³ø¿rÜ Öbšƒ¡Å!«J–£2)8˱ß,‚M&Ê]¹FÑÇsÌ›º=B ÈíÙ—ˆ×¶úIS7ʳj]L¸CG“S¾ÛE÷¾ëÍp™¥0àÝš êÑÕ ç gôR‚±Ê£Œ`ø¬Öo¯‚ŠË®ëœ±0 ¸d™3žEzíò–~¶õÕï>ÕF¹3Ï“5ÃW«û* Í|gۀ˱¶98'Æ–Ê^ì,sØÞO‚í5Ù":¬„>{LvU)dRÙ<l] ¤…*œ½k“¤|\èK^¾,Ó6"T¨ïõë[ƒÂ‹”‡´ø\BžžÊªÇ®£hg)“Z^¯¹¶‡‹¬ ב–²Ä±ÕήÑSI¦Ñ ‹üN8¢uZ‚W6Á©cþš¦ž«Ëì2( ÓÖ+ÇLÇÓ÷ˆªíª«²m;±Ô­XЄ Ÿ"S›lZ7Ïñ¾¾zƒóH{7QT^ç~"Õƒf$Öh¯™—B p—ßMPWœÆÍˆƒyаÜ7ì>-ñ¢´¥…„eá? šÇõA)$:†¥C±Õs¡R÷Ç«•ŒÃ˜€õ ¯–e¨¨¶MÊŽŽó[³]a®¨Â¥ù.ò²ò¥-6ñ¥TÕ &¢ãí®QßÌHØ…„£á ÷.Œ1Àõño»4çi4ã å«]–æéTÏÍ á õ›ò™B£jŽè%Gµæî½h%}’à Ì “œôÅ%—׎ËÙqæ ¥¶ðsúMòvEoépnT_ÅꯗäŒ+Ñü£L·ÎUªy—%³2ß5ÔP6_= –«ßZÌ‹lý6>Õë°ÄlNEøDCOyï˘¤+«Ü#9Ú™R­¡,g{f^¶ÜÚ‹©UȈÆC­\I…{©W®‡f ”žë_ŠRPŽ"G=³E…:^c’å&øtãc™&Ë^@C¼:jG×ñ´¡å*º…Ö÷æ“¥±o˜XÁÓØ)@èÐn’ ÇuÆóç_»Ö‡ái¶Ÿýq_OœîN/|jxxZP5 D{Õ½>Œ¬HŸ%kŤ>Ôþ&ã cs‘ëlB­•1oBè”>UÆÏvl2Èf¢Ñ V# ˆ&y"ؤÂqRæÚš%#R4Ú2l–ó„îY¾Î„–£íºÔ#Ûö®‚&Àó2!„˜y""O'X§¾:T?±ñ”0X{ÀÌ"wàŒ*®mÝŸåÄ4º67s"£°n8¤=s¡‰9Ò%vQܯ¢è²Ê#]o:Ãô»Ì3bLVô¶ª!ñîŸ&=5£ˆòb¥è‹‰Õ¹2­BÀ!Í+?ëò{¼Ž–(ÐÈŠª;&Y烥o“Nb î[·}ED¦–‡¿øý$‰¯BøuHS™ˆDE›ó¼Tóµcelöh~ðëqäYæ6­ÐDÜڪ‚Úà5vLñòi °C¦ÒÃÓ¯ wØÕ¡©Ð¹]ýì+î™.µó‹‚)_i\íÔÆ¡z¥üO*®)dÂLcñnåc)ô]T†>3ŽýO'óßÕ1ÇÖX+pùEíþ~¨8¢Ûú/W;eD,3Ø$vpà¢eÛ†Û2\Ó/ß_ÆFX¼¯»¿èš ¢1Ç` Á›kD¶¥¢nzwWH/…¢KÖ1Iæd÷Dl(Õ) ò´ϵ‡7Iಮä~É5¤âÊåá1òðÔÐ!ÃËK|‚Z2—øÙ¼¿’ta,¥¬[9UNxA\o°š…HFÅf{ñ‹wùjW@jY<(Tó€êðf€–‘0׬:ׇ/íö…€Æ2ÔvöÇÙgÌïÞjró9Õ4zÄÁ¨ÌÈôã¶~U\@P`6îšÃ“‰^ %A¤ù6zá\õmÑ7³)Nâöl¼€ä‘弿+ã ÎTaÉNÖu³9ßO•¯À)ó˜¶Øð+†2d¯Åª *¿íWH”¦€my y‰ã„٤竘Ö<Áqk‹8 ¶ªªCp­´1v€4†éûm}(-@+•VØ8pÈØø‰Å¢äd«õ`€ñd†•±,™ª2q¾§2‹ þê°Ã>‡Ž” øü¶bkÙ©Û³ õ´¹æ|A{9€«a aœäý `YW/‡ØêÖÞ=#â—y¨ÐYüyœBX¨™5‹jNžðÍ»ã¾+Ѿ/§1ü‹¥Ôo—Î_,|â[ˆ!s\¤fc妿\\ž×Í -vÂôT…YPð±vhräJµ¶5rj=7WñÊNj‹l³ê%ú¢úõgä GLª8%ælåŒ_pŸ€½bëâû’#&úßrñ!Õ«ãåN²› äÕ™cƒÒóÅkBmç.Ib:Z_Ç,:Ù\çHTA¶ä•s{kŽûTáŽqÄ•eǃÑ/e­š¯£rBâNY—¹€éÛu] Ž¶&EÍ´Ü(]¸É½„ÝùgúbËJQ4 j;Ò¿ŽÓ˜ÆÖÄdÕÛ-y0<ýM/:/Ã$Ò|ÄnÕÖºqš¹þÐËåÇ\„fF뱉öV!ÞSú¶Vð4h (;a ‰= !è4upÝÜ.–B?† 0Ê”äW"õÈHã*òH¯p³¥¶{[®'Âú -\Çí…{ûiæ`OJø#Oæ.+Gr7×[6š¼ë~«éíšz Y×7ë`6XÖª\`!õ´SÃÍÄ+ËÀØQjð»Æï,\/Eö“"ª"D(ݽùqD…š”å¨ëQ¦¢Ê¼— :”oy¯¨èµAô2wÖ$¿ÈUé°-ÖT]`eASþù²;‹€*1Õò<¤2$Î!`„á6ïvÎoöÎa¦9MñALêôa˜¬Á·ãΜ<Š6bSEXo>›mÞLð`¡”X´Ìò˜Õ°ýë‘=I„ —nÙµ_’H¾P£þ¢a?çÀƺ{âò´ŽAV5¸-‡UML—¿Ì8à„ =ÂÈo7±h-œOóïÎB¡_oV_Î8:ÿ¦UgH;ÚðúõUøŒtQ~4HÕw+ÛÀ þ„g辿ˆ±¢jeÂÁgãâ( Cn@üÅ ÇÑKø…ˆAάS ‚OäÄïÇÁ-i ïEÎ^pJÙêœh\65Lú,½(¿\ Â\žÚbžOîç"E]ègÖ{΄“Šà³)”Ï£­Œ£-ø±ºÅ»Jz,Ñ…Ò < QQöM9ZKHÜUk›’¯¾0•E²ù1¡ý~Ìïо&`D6Ïý¹­#¬¶”?ŸŽoUqvÆ1¤›§f âõ‹™ õ·W´«bÄ;*¢\ù~|Pû‘ÒC²òÍ®,ŽÒt¹KA±ì¢(ÒÕ]ƒ·}iµYn¸¬—Ü®UžàV£7‘P< jG¨ðhi%,‘X#í…Ÿÿ·¹·*¬ J–ïçC.ªÏÛ.•Æ¥Pê(:y“+¥u6©g)':&Ÿ¹óî `» ŠniTÑ“Ük÷…7êv EyPîйZKö©â(ú¨5_¥JôÄ?„ÉRhÑé˜ÚAK!IÄkƒ³µÑkk" ¥ï‚è™.ζžœ§=ûÁƒd9Žr?Ûl !ýã9›ÏíÈ©ð÷;¢eKÕ°óT¦6@€£võ•5xR+uПÜ~Xéʪô&‚D.Î<)«¡.9Äñ1]èÙ^F•“濾—›–);R)[÷©dWÖª:çǪÓxÂŒ©ý>oº`hØ;1rÃ@×xY5¾îÐÆsñè%mÇCœp ÝKV媲Z&\ÑÞéÈ}´ˆ] dÀí }Ýpyç2yüÜcÓݬù¬x¶Í»„–9Ë«òç\Ö6¹ËyÓŒnÉæÏž ÷ä‚sôº5_ˆ5¸§»z/zµ8%7bEù—¯ýÀÅ\¨_( ¡#›†¥ ¯T•î+3ö1ÂßmS±TRç?^Ö××O°ZôÛŸN¬:R69æN$‡ª–\ ×”€i¥1a§_½¨~¦?µ ŠI||ò•ڳĞR Ò†&Äjdt¾O—Œ>r _Â&@öUp…NÙÙòšPÚ^`Ô|l÷‚d åþm•ØLªp?ëžLîÒ¨PíW€{aI|“¬0¹+.PÑ—yªh¶5‹×üt_ÅÞÚò{˜QÐ^ïÛͬ,œKWèÆ]dv8yÇ+Ð~ŸjØ,RjTxÿË øå¨]²”µÂ.Ö¤J~Õ(ßâ7e|NàÛçæz(Ͳr`ý«“F¬ÄÂzè Ç¥>ÓË‚î[¦ÄÌr€EzÓñ:î{ï‘Ñu_±œ&…)‡É¨·M™F‰OØ•hO4áx𝣸ÁSåö™|iÇžß'ÎRcmôöýÛb.ÓŒ•ɺÈÑŸÉÊ.¦ˆT~*a›;Á ˆFP“Hjt3I*Äc¦k†c£½“ýɯwŠú!®¿Ö3CárøK¾fpƒ€Dô²NA-ÅÖê‰2SùÛ3²íÓƒ˜ÉíQ±•QP«yAŽpÏKoS8q·©„éÝöæò¡›©=TžcËÔd>3K”È3Ú_Zô¥9Aê¶ðM•ÐÄ| êÖ+D€µ©Ý-̇<{F/ä24í%±m]"Q79É…ˆK’AÞGõÓ#a}¿7C vì›80ÑJ°(ä]V½¥nãÐÖàP¾6MÕå^ÖÜm‘‰7Ûà¿Ýd4¥í‹sv–Í3ˆ?¦Þ_Þͼ…!¾ÿZ‚PÔÂ<˜±Û3 í\w‰öªäÏCK´„Ìˈ<êÍÓèÎD1˃HÊRFÕ„ŒS¦òMã8g=rk½Ò«k!¦{<Ð6Ø|v(HX €æ›”ìqäH:l‚ð18‘™ •üíq¹Œ¿ kˆ= ÄâD‘^K2@UÕ$þQ(I¼³¾VóMåÁë„ýÖjäymˆâÎLƒ½l— ‡¹¨N2NðtÊ ÁÆüIƒ¢ŒÇ²Y˜¸¾Ÿ§\kÌ‘‰ S«ÈLJ{ÃN/JQc•²\QÇêeÌý(äÃy}Ø©GËšÇ=–ª*L }éŒ%y§¡l¸I¶ýóRSK^õ– ¯ë« n>1kAÝŽ‚Ú,×1¦×l£<¥ÜFw]×o:b5my¤þa¿ƒ»ÿs­Ø1õWÉ"-¸T~ß…åv9“}4öÜÒÞ+v[ö¤‘<¹Ô«©ÒòÚ*¬9D„p=ÊÅüxX«ºÆ«pªM\¤¦ÆÖd_þ£l‘å.騀 A:;µ¯›Uˆ"Æ„)¨]Ü(½­qŸˆÄÊê…íñ?ôÌþì:P*Ðö8>; m/°F¸Ãû:¤6n,égUòLã,ë®Î¯Ç”b® ®EPy½_éÌî°ãŒò/ôhVdùnõ£ã?3˜QÝÃÑðŽ 0J‹ª+z[H{9®4ZÈj©eβ*M°œâò %qEÔ›EZ©÷‚n‘ŠÊä¼ø²¢ìŽB«ÆÈú{)`¹ ‹ÆŠFT|F«´µ6?“L»i.ݲõäå¤ag†^ÆWÚ´]e ±4„AÙ¯`iÈfM륥­f0TøÖI í@PMj¹k©äÊlÛ€cP¤TôœßÍ ^°pŒÇ:>ì«•œ¢Î½¶<âäÏâž> ÿZoß@}½˜B'ÿx³Ìässs(¥âOÄÞá³òÊI£‹  ]Þ*%'&BúmvÏá\ ¾ìÉÙœÍ"žî!ð]xjÐAÍãgS,u{"¸'ã¶–0OPlxFP1½ÅèÛèI8Ûœ„ B?¦wñ åø~ãȶ¡ZªQ¶|R¼bZµ*>}–ªœÐmÛZr¥*àS¨®Ë`bÖˆe»Sž¡×ð;1[«übú2”d=>%¨Y¶2ËŽD¥Ü;Ù®âÑn0ÖDvp0Ô¾%½[>|Ð-¤G78¢†áÒMØ¥ßÌ.·‰…¹öñ2TiÆ|÷Þ¦¢ûúçéÁöQKK+½ü2‘ŠÓ[CoÜ:G^sK¡·Ú¥Ôê²:[û–µ©'!Íóá±CfVšEñtÑÉüß'DÙ’RÜœ2Ä$zK¦K#ÍFxö61|ßöXÆ–£‘*]Kbu.Ñt¾ÿñ:e›ªéJø)F‚}zÔPÖ$`ö©He¶Ú.þRÇDX)ÁîNy& Êß÷ehuçòDF®ò”\_ªËkÓ×åÒa*å<¼øºàõÆ•¬ã;÷Çžûp«Ç n#ãaBä$X8vÅá´p G^-wûíW©Šv_~âÎYn²_A~<6¾õCîÇé‚'ÇŽq 4¨X¿,©¡—œ¬ÞÓÆ²Ø$L•0-êŽ_{'Ÿa!Åq•¿Ñ¡1§eÅŒäÀùÞªªŠGu}«v±5Á3ßtÓÖï5 ­af1™£<Û”å÷LÐt±óÈ£“ïÝGi̾xæ6¦X‰€¸O kï{Û8ªmÀÂ}y§™’Ä6²U`>çÄàþ¦‘î^\êžâÒø±Ý2ñÇÞ“¦p­÷OÎ,a!ËŠAìÌ÷¦«ØGZ®<ã“cc1<»ó-ÎcxÃíán1¦v„`õ1Ì»šc®û—øÆ/dǪrºÕ¤ûÛ¬"÷y7Ö¦°šnɾckøÇuyM™ ˆ`þE×-qnQ²Œ·ý£+UÝ9÷ HWr¥÷0ã\ “˜`íHÆÕ!ÇÙì ÇïÎ~bmÊ!.EøO|X[gôº2’?¢cIÖÑé¸]@Ø÷ÐÌ’Ùo¤\Ýf«óÆá®ñé’à„ïË ´ÎfÅAº¸&]Hµ—!tˆW=(õú¿)½f Àdå–é!nè6”YéÆÎµ4¶d›}õ½ÛÆåÖÓ¸À)2AiéçŒL`&‘h8Ù=ÝMƒ‡Ã̓Ë¥âÍR×cù²ß²O›qŸÍníÕÛN÷ ®ûoH¿<ý_ßðŽöôð‰Så!®rwÈt”½ž–?6_ªæ¢aç÷ôfˆ?¦á‡ë¼b*ï;rurV1N߀Ÿ‡åµ™¶­…{xÖ­x´7xAÖ ã[¼±üBzýÕ.•ŠÐRÖÕ"8³PÂ?ù)ëa S Þ+ Q1Ó†×Fd¸y1Ж%üS¹á«‡è:ÛIîÔÛÞÅÓTSàæx–hG\[{>Õ‰!næëJúa}½!è åÓxì |®Û›°Å"gzSï8¸ÃZü¶e.o|X\x¨Ø­CÍ,Ó#–îê3ú­jôȼðXIôKšLÄ¡}ॗ b¶n4­ž× Ý}äøÖ=êò©L-—ð _&¿Êj'ýœGha6‚ÕçŒ)›>ƒP¼6”tBÁÝócè¸Äq}Úw‹ãGbÉ ÉÕRyøÏš‡U4·rTAÝ¿3¨÷k·¨È6îá­þX2“Ë7\¹rb%¿Ëò±QÐ߀s bá¤y£Ö‡=L|f0p1B•¿<î?ÿ¸Tïr9WPb>QÆA|¸ƒÑ ,ñkð@cüv®u0+ÀÓNî­;Õö>ßT·V”Š5QGškn­Göà ‡ì{üXN©ø…m0ä™ÀÇÆA/„ù¯î%ùÄQÉ 9Ü!qÄÉÏŽ*´|/ý’•fÊMmßô±<¤(Ǩ MS‚ŒT<Š—0Ñ›©š”š4'íDfp…ÖB5‹R¼ãÛ¬øó|ø ­ÕðÒ) 8dç½ †Tð#²kE_X+t¶Ê’pé æž%ÄU“ /¡‰,xÏ$ÁB|¹,ìå¬L§1„_˜Pñœ<Ù®T!D£ÌµÖM^HæÂM¿íóx,“¿Z.¥à‡”ÂrÀ-Ô<‡øÐyΠÐXÓãÑ.pÚ+¯‘pžQÑóóg›ø'®0-±³RPÆ+t ŸÂJÙCI†úýÝdÔò,zãª±Ê a Jë›]®ßÎó<¼£aÇ¥\Є¦‹;@G>ܧì|éÉÒI; }ÿ³J•ú•îuO#N¾£lK1F•òÇs ï ¡ÑžIÕ"J Sê@ÛGÍö2Y§/ºÙLfQO¡‚~¿I°\8*Ý85½ æè 0?ˆ§é x¾ú¦êÙÝûbé 0<á_ísÐ<+CªW§on@? ùÅñ–í¨Q…Åj¨QæœÆˆ`ÔýÈ­Ø…ô™†ôQêfvå°qU<+™H[šYÐÈ3äyì€Må¡m%5ú0<(NA$g¦’÷-}­S'¢¤.J!Ç‚ÝÿyU¥ü“3އÇBžPvØK¾©n¼”XäfÛ–:ê}vôC1·oƱ¸áF iúƒ4Ín2¨…C¢HÇ~{gmøÑŠì¢}íKG!M–¤¨ÄÑ("ƉX8–K*™#y~§!°¼‘Šò~ƒÄ˜/СJ´˜°ßôÊ•R€p_º„ƒbx/wn³ËˆÛŒZjm•l‡å2ó0:z%ã7º'¦Ÿê?âè3=6«)9†5Ž4£(¢¤4c¹uÝVÝ1|ï8TØR÷?£5^Õ|1–bË.é$ZKu–?¾êXCd1"½Жv† \¨9Ä™e¤&+ÛïògwìßÛäù¼o ¡-7¹T¸8xŽ,¤vüö¢`äªëÒ ¥‚¸Úps[MµýK³A8«G|7.€O·ijÆSúH±ÉÂ$xc5H¶ß(Ÿ³î?°4Ëô">w»w(’Ëz?üÇbtËþçþ¬­W\L¸ÂŒ“´"zTJpC’Ƈ5ÝØŠ¦ËÞŸ>n¿Iù,ùÚÂÁÑt=b;"Ë3¸Ã÷¿q$>î< ÄZ€j:[}À¬C /ÌõA¦•ØõDlv> endobj 40 0 obj << /Length1 1544 /Length2 7746 /Length3 0 /Length 8757 /Filter /FlateDecode >> stream xÚwuTÔß-]ÒÔÐÝCw·(5ÀÀ8ÃÐ !) JJ‡tw—„ÒÝ‚”‚€ðÐoÿÞûã­Ykæ³ÏÙçÜϾwŸ»Ö°0èðÈÛÁl@Ê0(‚G€—_  45Tàðó ñòó â°°‚Ð?cÜ ƒJþ‹£Y#îcŠÖˆ{ª Pw‡„¢’b’üüA~~‰¿ˆ0¸$@ÑÚlÐâ¨Ã  7˜‹7ìàˆ¸_é¯G»-@@BBŒûw9@þ¶µ†´¬Ž g÷+ÚZC0[0áýŸìÒŽ„‹$Ÿ§§'¯õ37^ÜA†ƒà F8ôAn ¸ÈðK6@Ûúèoq¼8,CG°Û)˜=ÂÓÜ `[Ôí¾Èj‚îרit\@Ð?Èš¸n@€WàïvVÿj†þ.¶¶µ…=s±†zƒ¡{0ÐQÖäEx!¸ÖP»_Dkˆì¾ÞÚà ±¶¹'ü~yk€²¼Àú^㟠Ýlá`„¯òK%߯6÷­µS€={‚"Üp~½Ÿ"²½ßyo¾¿Ø ó„úþƒíÁP;û_RìÜ]øŒ `WwšâŸ¬ûÎ?1 ÂÏÏ/&&¹@^¶Ž|¿1ôvýNþßëð÷u¹ì鹿üÁö û_7kwùûþ;ñ_„# °Û"6 0çŸî÷aýøÞp°À‚ÿÞ„þ_Ÿ¿Ÿ,ï}fƒB¼ÿ¡ÿ>h>mcS#U®¿Eÿa^_A  ?@@PL &" ðÿo§¿÷à/ý¿£ºÖà?ßï_Õ ö0€Ä2î÷ï/)úƒýÏñáüwmؽ¯AöÆà1¿¿íý—Àÿ÷0ü.ùÍÀ¯.ÿcð¿ï¤ìüf°ÿEù¿ÖÏÀï?9÷ÎvGÜO‰ì~V ÿK5ý1Ü@ÄîsjëûY‘‡:ÜûG@˜—_ø8ØMì²Ó#lÿðÓ_Çq¿ éÂÜÀ¿n û*~þÿÉÝ ­óý-ãvh¿S û ûïºJP[˜Ý¯QXÃáÖÞ8÷¸G"_û™µyý¶9€ CÜ—îúìapœ_G+*à“ÿú‰øÿFb÷Hûo$.à3ø ÜÛ•ô/xŸuø¼o þÞÛ•ú/( àƒÿ Šø¿á¤ÙºÃá÷·ÀoÞëþ ÿ¾r@ /-ÎÜ4ÌV*Ä©*¤å²BžÚ“gë“ 0^ßéËs,“M%*½`égB9Q³ò“ÛQ?V‰ ïêMÉùŸ¬ø½‹’$Ÿ«iA··Ùàö%~tuà¦é.¸­ÑÞnn%µs ÿÚ ?ày.7ÁAÁíz²5•¶§"ÍÚPvQêø“­î /.ʧ˜(LJqq!\”Vù´Ö2`¥üÄd›³Û©Ü§ÃZå½ïz‡EÖû拹‘Ákï¨÷÷ñ\4ÎÓöeÞîv‰>Ô°L°lv)Q^DZŸ·„±Û¸ ë¾)ÕØM™½î÷&?}§>¬R›íÿ4 !¡cC" ½#W«ƒ+ãQ®Ïë“§à6»Z†âÝTÒ¸Õ–ÕŒî]%db°ÜŒ†èŒ3ÆmªR'#èÄnƒlºoE²8Iߊ¶¡=rÝ_剞½0øøs°rC)®Ëg÷b¤x}Î9¯×/¿øŒ‹²ˆùE¹c«©OpäúÁPÒÒ7¡£j¢ß÷­¾$¶ÔÌðÜPb´¤ÒÑL]ÞM–:Ëí&¢¸®.49ò7O†¹êv¥äâ4ÆqèÉ=‘ÇŒ´_k ÏÝ(OgiNDu¤"«_Dì-Ãë奟 Àõ^þYB²ÿÍ<<ð;-gBK‚'iì…ÕÜEÆó©;J8'}͈Üñ- AùÉ®ßêìj¼fõ‘I+ÚÔrâ+£ ¸‹ÜçÖD§-Œ /Q$ÓÑÓ:‘ûxà•mR!fóbÆZ?w‰äækÑq·Â†…‡§ë<’‘n‰Ì¸Yv{6–H!»*éDo‹Pw†¿R((/â]„P»YÌK¿únùbµ¹]nbKïˆÞ÷Eì›tÛ¦Z¡&~$umž9—[;!¡Fø mh »dMIŠDÁm%r€2Ò.®ùyy§XÝS¬vÛ°) c¨¤œÆ$ùcÝ’{é·dúâæÃ—ß6™Q‡H—’uùóØòP†.•Á,0v±þÄö½z»ssðy„%ÑÇ·æV Ñ22ÄÌÆ³-ÊÉeÜJõ±ãc,IaVaöW.}lÓ%©o¯BÃ|¯WÖ‹B=š>3ËUü<”—³MF0 _mêqêèq¢c’4K¿tÈ¥®ˆñole° ã<%X¹Õo¬ ôoË&w·8¼^Ä<:âôÇN óq)böÊ zòшó+aõ{{¤18liµŒr\­ØFvxÒD¯Y•\,—ÈΨƒÆ"õ2O¥l=äîñ¾ÂÙÌìpw|ßòC'òS%Œy–^³‘  ›á jÄK2$Ní+óUž¨wÊÒq›ÏHÕzT‘ºÐ¢…Òv¼ÂpùôÂk,ì'›^Þ=§a«à*4¢uTaÒ„Ð3&¯ªÃšÑ߯ù{­ÇKÐÐØ'3ñ"& ¦ÜTè™&íiKÀáÆJä»j0{qEfŒ–ž(ÿÛè¶3Á±SƒÓhx)éó™/RkýO[jbS»mõùÉ> "oS¹2¹=’yža’k—x»å/…álÆ ‘ïKJ‡(2†Èž-'Ìñö'ËÅ¢S t™íeǾ‘L5•=6ýò¹'ÄT?OHòƒØböXÈÓƒ5×Ò]#ݲ/“?ð³ûžv¦õÓw}¯_¾Ò‰!ÇÑu50Öº8PtÛ&m›‚]äòã›;OŒ"s¨‡°²ŸR´‚ïx¨¡«"ŽB–'j<þEx~_{X× 9¸žÇ>wíèÿŽÝc¬s@ þ´“(—›Ðá6®˜G…úµ\µ2ÇIžŠ¸~íìeÑ ;<ʧF•—íˆägVoìü £@9²ÿ­IôÅ –H¤JéAæ¦lüQÞPɰUs“užíUh¯|[(Žr‰Ç³ˆy¨\8b è(Å|Ó\°Ï«è²á`¬Ö:À¸JŠÂQn7íØ-…tyt5ý…¡¥_k–¡(‡íò!`;£$W¯':ÎÀóÊ:€^bʰ-Ž@SW‡>^¤È¯€O:ѦPCý7Ñ lêõè0±©•EÁ6¨2ˆŽ&e>©yñŠ xRƒC‹~ÒV(ñIv¦Ð€7ñ‚¯F?Dó±†áãFrrÀ:ñ´½wAÉ!“¢²ˆñ5úþñtÙRUÀ<™Ëv¢D®T °å»ò˜ÿ¦Â…G¬Ó«»íèVÔ›)Qµœ$]°‡ÇJ‹NE4öüåQC€ÆVÙøã«°×—øs·ÎËÀ ßN‰Wc@påtÙ td\z€ Ÿ¸pv„¹€ PQïÎŒyX§a÷¶âð¤ièÓ¢lg1åE¶ƒðôÐQݪâ;ÑPäÌ:EÁ^$Î ÄÈÔ¥xµ¤ž­›èW ÊÝ??—O©´1îÓÀp ïL+bê?Äõ//kp‰g”­0cÏÓ›}Ô>)ôÌW_ðìÒoЬz[…l¿Øž°aaÅ黃zÙ=y‚Ù÷Æœ½[¯ÇÖõù0™å'Îå#‹ï‚…2z¸€ÓGuyÙÉM hšÐÂÀö£Ü“pó˜%öRjÙä0r#_FÚÛÊÌ#‹'9fuî$œß3Ñ»‹òÐ ð£Zôؘ)Õ™^„TSI`ó$nw@lÏÄEò+~ãÁä°Q•ع:ï¨eÅ¡d¤¾¨ý¼„˜:ôH]G®DÀÝOº6Âì‚ÈÊ­U»Å„sOXg*ÓYׯ=ÚA ¶ «'+ØšTmãSÅkâ"_tt¢ãsÉ:….¤ŠTA6,Pÿ0©2eyãF\I%F9‚ˆ`õh”4“.‚ôJHœ/A5@TôBT‹K'°q†J$ÒÝaìžÎU>Žd㿸Œàc}Åb¹so¥4ºa¾#Æå“-±ÞÔúa^}ÍבhštB£?Ãv§zf㑨G™»§W³‰B;Ùª(ld¼åQøXОúKè”%¯ƒ4o¢èZRS6š6p¸pL߈ñÖfû3V#wbE':ár\‚‘gËÖÏîv«¸¨þC»^£‰öV(…“î³îÀv%üTQš×X¦‰¯uY>4Ï~û`Øl`6?/@¥ v>¼°–ÐÊá·¦Lþà¦FÚvýé.Ã’)®ÞW±é>­`!æ“Vp²À—àšša¾^A{^ã1¸œ¯äÓûR²¥ÒZù¥ñ©ÖГ×ܧ¹Å!úד‰öx¨$¿Œ’ž­Âךk>Lx==ƒ!x4jÆ6¸›–P¥^)eT@ÇEæ0öœØágtDm øu¡j•€¥íZƯÝiö:/]Cñɸ:sã3(¢Û_ô䇞“€çB `°òÛï÷-ó)OlC;°”žçS$ÄÆ€6’ôGi ]òbûȉ.;_ø˜SX°.‰yf¢ÒÛÉïïŽÖœ‹:¾‘Æ tk™E©÷äy<;k¿l4¶úªFšRÄ[V.MnLÒ¦ÉÁËV†0äô9ˆ7Ó™óó/OÓIÁL8©-£5V[Èï(6íßøgé©QêÄâ_]¼ò@²«Ò r»Pywÿ?Ì€þn Ÿ´ie+a\}éÄ…Ëó»™qbÄæÞꈙŽT}â{YÁ­d{ÿÓK~vmZÉÛ%ó8q~Ë[ó,¬á@?´ˆ°—pž‰ãŽšîˆÈJ]ÿ– ~¬Öº~bÌæbàôq¶¥( ù‰mW*“IÒ€z§ë×p°5' (?:ÎÔ“ûJÁב—v"˜‚½L·RUŽÕ±çH•Ï·ƒ`TņÅt$åy“ ñð\ónqs^ˆˆÇröì §AÎ+ZåŽo$òr§[ê TFÇò[ÉŸ[È?-Ãùx ÈÜ~ôª…§3%u'GSÎí„9{0G_¬hæR‹FFœH÷C•º!4rØ>c±søm½Ñu–´Üù ›¾/û’R{%<ƅǼ½D]÷“,=œÀ+Xoì»Ø9þn’¿'VnêmW0äZôJ6íÙÊ|ü›c#ù LY6yÑåä›T˜Þ öàž%Ñ¡¡tù¢Çž?Æ3åÄMPPwžpÎ'kÆëUi±K*Ù~˜Åž0‰F¦ç)†¤?µVßhÆ. Â7ÂÒŸ{À—ªoT¶»l…—ááÖ•œ$Në(¨ñ Û`nļŽ*dwh+ã@Ý·WU¾M‚8y½?¢}¯|1ˆ¿’áÍÛ·à8ÕŒaUh@Ónk”@jœKýò ÝÆŠÆÊÇJ=ܼá眔.Æ2{ê¤åŸgù0 ÖÓ|D}²¶ÒPå‚·úè5¶éúrÊUäNâÏId­L.Þ:UŠ½Ï‹JÔØT;ò4Å™ ùY“/q,²ƒ&sÄëŸJ FÓ“9†-Ú앪[oêÝÊš¡Uðh|+:±'}Év§&$ ul¶ƒ}J¶I—‚}¨Ä}Ï CfÂRüûD7§qF}R‰;VDY¿V"0sKäâ.v¤µnHÈÐkÖRZ+¬%Ñ?4ÈwéóÍl]¡ÑÕ1dµ%\Ü»âŒ)´ö&bÎ…£`S( §4ú[y‹SoÞ½¤É¤FÞQ:öÆÔ¨æ-&P±|´-ÇÇâæTh¦#so‡.jd<¦ª6‰Êý˜O’=à*EýÞG¨>r)›¬íæ^¾TzýBn·£¨xïNé¸júfù„ ´ç¡‘[UéÙCQÊŒÕì2$÷3a“VîzÕ go§“›8L¾¯ËžHi×*̔ϟÃ3"n{%MTKí¯ðE0HSrf¢‰æp"\¡¬!3ò Pˆl¿¸„f-ÂÅõµKíK½u»ÆÐñÜÓ–ì#hо?‡ö#“oúÊD^¦—…wtVìW1Ê\Ú]5§'Úß.Q÷È%_z“é+< í[SYyϧäŽ÷1Å::¸Ox–ˆwà<çH—VH@×X¦˜«Â[/¤CHHµÌLÿ³ ÌòKˆ½ •H}.¯I8êY¾ëeÂVˆfxLJ­âµÝÈüŒË;ñ‡lÚó’Ku±ŸâäWº3ÍÜúDˆû00ÐLVNŒ¾áÆTP´b´åSgµÌœÀÑebݸòxä§Þ$5u÷Uf¿øÎR™Ë²®+¡ÂúÀf=‚«×Wñš+X#¨Ú2PÛ”K’ücð[Ö‡ÅÇíyh·o´2=‹fùÇžºð¤¹ýÊÏXmîÃó4ß}mÜÊ’º"Nâ~ý”ƒ7±ùµ3;ÒÔf¯7Ž?ÖAªÝˤ©ÞeP‘e"Ý%Ê“ 2#5»nŒY—èxÜ™_Ò7€•ÝöîOiÍÒì283]šV {3\L®RPF¡„ÊÞQ(Œø‘4<Ëíâˆl­EL´íèžZ¡-±?â®ëx:¶=|v%23Øñ¼0¤i@™ç=¶¬@I'MØðê¢çÜ2gŸõ}Oó~ZJY Åi`ÎÑzs5'n?—2¢¿ú’é)×4GdöÝYÿ4K2§r§F¦ã!`ų¿]Ĭ±ßÕ¢E¡Cf` R§ÀÁ†”0sŠLïñ˜@(†x^YÇ$ø¥;ˆ~ŒhÁ\oÅØ%Mתg«wÚë|¸†Æ~1#a)°Sbl¡¬ëÿD®Å¬%fÍìN0D¢~^(ÿ•F‘b_U–®¬OBš.ïå¦äZœ°¢<¨þŒ8íö™ÓOHèÃ¥GÞ6¡ï2pgöâ]²ÈǦToë“X}›þN¼¥éíÂL!†mߎì_×ïeÅÚép>Œ©-»Ã{ˆŽÛæ¹Hˆ„á?Eó…×x) ŸTpH®Ç%a8fU­=¥å½8î@˜ ÂòÅqE10ždºÓöwóšøì²‚»QÞ÷V>S,´ÊŸž©i¼bLì¼\ÍC´¬âÚ&³Á2Èè4‚xDÎ&¢'t“i‰*¢Mi)ؤ¿q]CMŠ(0e¦»^S*ˆ@g &L˜/)Í ¾¢‹ã}к ÀÈŸðÎÙìÉãêI˜‘ é2¼p%:9>òù>ÐŽÖD%h6(I?ÐqlõTöÊ÷[úiC÷¢÷wTK†‰ºÄÃ"4á ¤A'÷Y¹Ýàp9×víê)ó|Y õ  ô[q=œ§âGw±Oñã«}¦Á’ó¸£PùþåóÝÊÊÀŸS  %yŽtvÓí„(CÂ5lvFŽ$9âÇ c˜¯##ܲLã ŸWqÒÃ1³Ø ÙF¢VÍ=Xž®-Ä›#Ú­2b.L¶Ö“šˆSFâÑ_ïî\š0"Ìí&‡7 ~¢Іí¡Vx¡BT¼?_{Ѷ~ù½N•Uu"(D'âJEx¶ò!û4³ÂÎÚbéNùéL,}ݦwŒI1žú²‰ÙˆQýÔ‹œØ/î%•þø•ZչЉ1¶‰ÖöÕÆ¯’-òĘ}µX—=ÎmE;ÈH’3ž"?߇ôKØUûÄÅñ'è,÷VÀ]g3 Y.ÇÔ¢LçÖ˜_мF~càøù¤ONr“!>ÕëSë׿KÖqva ßG5v3‡rv„üï\eñÔ<ÑŸCbÔm9–²"”éà„[*M7kÉ‘N‘ßP¯”e†Ö¥OWçðé—P«†sV›ì" bÅÒùLÉÛч)Dí•räŸ>õ9éð«;hÉ”zq°O¼ Œ›ÑNÈÍ* kA ÞÀhéO†êFÖ^ˆ:7|ïÙœÿ|%Žú½jùù„^)nÉž¸Î,¿ë¯WV–FqÙS¢îâDLŒÁÝþFÅ-Ü…,ÌÕ5µz=ѧ3Aîµsˆ«oŽúCÀ|7éìff™M@lqº¹TBFXtýµLI@ÃÀ`¼Â††¦Ñçt×w](ûŽ_9šºIç½LªÆ¤,9òðæ¾ï¤V|Ãåxá—ÝLóß3VHBUЊ|.˜O¯i)<Î+£‹r4J(uȵK™ˆyÕÛ)Í»h?O‰âÆê:Žö~æ+‘wÔjk@ľûPRX¼Âùå³ÓR> aÎ Öêá{'4ù°®;D=ð1åm¡íÕvH¬¼– ‹i.w\kKº_úNžûÞ¾’©)ù°ÒzƒÿæÝ“‰¤“3j¶ëXw…6ùøŽÜ¸Ï§tÙ0&ÊÚr+ ¤W½Ïˆ?ëÒéùt>ÔÒÕELÍmû"lÇ5O<6®Ð¨D ÅÛ !ÔÓyxÈ3PMÿH+hó‰6Kz&š„N{ÒìøÄ[3\Ø z2ù€ëÅ+ïÖedõ×Oy(Œ*²ÍV§Ê‹vgb½ô²Ï‹$ÎJ^ä¼–¤î@iÇú¡á6ðÛ쵿é¨`+ÒäWæaÓºË3=¹k¤“¡ê/“V¼tÅ.øš|¡ÎZZZ_àÿìiÝüc·5%³„‚¥…c±™¬ €ÁU$ï‚x µðþkヶèªíú%ÌŒ§X'ÑüÕÊ›‹¦ ® =£*#Ÿ>‘^í.¹Éu½Á¹xâ1EÙ­c˾éÉ­s;ñ×yÄÍ¢_]­ÞP•èíXL{t© ñzGv…´æF©®÷ï±cÙÐNb6b™½K]ŠœtZˆÐc•ôÍV;èÄö”-×~hÊŸ4fÓ‘•W›9rø“¬”ɯYE3H7è\Ò#—Ê`•"< 2ÖUÏ>§X<ó(íP-ü?áÌ c endstream endobj 41 0 obj << /Type /FontDescriptor /FontName /NWVXUH+CMBXTI10 /Flags 4 /FontBBox [-29 -250 1274 754] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle -14 /StemV 107 /XHeight 444 /CharSet (/A/D/N/S/e/g/i/n/r/t) /FontFile 40 0 R >> endobj 42 0 obj << /Length1 2358 /Length2 19208 /Length3 0 /Length 20574 /Filter /FlateDecode >> stream xÚŒ÷P\ÝÖŠ"ÁƒKpwwwww§±à4.Á!‚{pw w'¸»»w.Ÿœ“œÿ½ª{««è=¦Œ¹¦­M“+©Ò ›Ù›%ìí@ôÌ L<Qyf&+ <9¹šÈø¯ž\èäleoÇó‡¨Ðô&3½ÙÉÛÛd\l̬ffN&& ÷ íxbÆ®Vfy€Œ½Ðž\ÔÞÁÃÉÊÂôæ?*Sj377'Ýßîa[ “•©±@Þd ´}‹hjlPµ7µ‚<þ‡‚ŠÏràadtssc0¶uf°w² ¦¸Y,*@g “+Ð ðWÂc[à?™1À“Ô,­œÿ‘«Ú›ƒÜŒ€€7•)ÐÎùÍÃÅÎ èx P•–(:íþ1–ûÇ€ðomÌ Ìÿ¥û×û/"+»¿MMímŒí<¬ì,æV6@€¢„ÈD0¶3ûËÐØÆÙþÍßØÕØÊÆØäÍàï“$„•Æo þ›ž³©“•È™ÁÙÊæ¯ÿ¢y«²¸™¨½­-Ðä ÿ×ùĬœ€¦oe÷`ü§³íìÝì¼þæVvfæ%aæâÀ¨ngåè”û×äMÿ[fØ™˜˜8¹Y@GÐÝÔ’ñ/z5àßJæ¿Äoøx9Ø;Ìß’úX™߾ཛྷ]“ ÐÇëOÅÿ"xff€™•)`´°²ƒÿÍþ&šÿƒßšïdåÐez›=fÓ_Ÿÿ>é¿—™½Çoó¿û˨(ª(©¬LûOÆÿÕ‰ˆØ»¼èÙ˜ô,ìL濆ŒóíÁçiþ[€ÿ$ÿ·TÉØêßÃýÁ(mgnàþ'‡·âý'×Ç‚êß•¡üoû·Y¨~¾;“éÛæÿÏ ð·Ëÿ¿¹ÿ‹åÿmôÿï$\llþVSý­ÿÿQÛZÙxükð6Ê. ·µ·[»ÿkª üg•åfV.¶ÿW+ 2~[a; ›ÿ–ÑÊYÂÊh¦d2µüg†þÓ…7z+; ’½³Õ_— €þ­aÿG÷¶p¦ß.ç·^ý­¾íÓÿ†·3µ7ûkñXØ9ÆNNÆðo­Cì/æ· 5ºÿ=ÚF;{Л à-=€¹½ü_å`0 ÿ%úqE#.£ØoÄ `ÿ/âd0JüF,F©ßˆÀ(÷½qÊÿFoœ ÿE\o,J¿3€Qù7zãTùXŒª¿€Qí7z‹ ù_Äý†Œ£·x&¿Ñ['cÓÀ·7€9è·œõ¿òæõ¿Š·¤Mÿ‹ØßÈLímÞzõ Û_[Ûßÿj"£Ùð-$ðø–•ùoø²úÍÏútýÃü/Íoý_æö.NнXüߎcùûpo½µôp°Úýañ&³ú¾µÊúøV»À·|mþ€oŰý ß®Æ?˜ßî:Fûß±ßlß^…¨ßÎîð[ýæëðö:²ûŸ6°1ÿ+ýß&°½Òáíª°ÿ£¬UÆñw›ÞÈ]ìA@3›ÿadeû­ø_RVî5ÿ+ff~óø£ÀÌoõrþÝ€7¥óÛmýß“½ÕËÙÆØÙò‡·Ãþ¦{»ðA–NÀß…x[dF›ýo.À·š»þߎéöǼ¼y»ÿßè=þ€oeðüþÏaêâôVSÐß·øÛòü÷›tšÂ/ÌÚ›òY×µÜU ã¹ÑïŒòO‘ïh&SÓ{-8µº< Á$PW~ XsºNìBYÞ§ºZ$zö:j¬… mŠSn~ô~2ŒQ™Øi†ŸÇêË;þÞK‡O¯&´ëýìè­áÿ²¼]†<ËÑ… I)ýέGÒý{oÉÒpÈìŽòn%‡,ÂSÉ$}¤ú=ÿÂiòl“ôlh=, Ú¹;òôõÍZæØ+‘L -¼Ïq$k¾—Î:Ë×ûÏ•25ç2lÈk´á /‘ýD™s^EùË}óî|ùD™ˆtIËô( û,i•V*võÝծà mÌÛY € J¼>ôí¸êâz C'EÌÊfÃtP5ëG Á~›¹ÈJËF§¹uþ"÷ä÷WÀ4¢¶å‘_C§×c­ãÊàPýmHRÓÝ`ýÐV§f¡`¯ ¾…3¸¥nøòOAT h¢C(B·èšÀõeÌçðKä—y3‰I‡ ª|ÿ”=Ëû×WŸòºs…¶õiÔ974ýÀ×@…W“ö¤óó<KVq£o!TÙi⟳W£(•yk€uÓ%ŒçëåX bÅDr±›ìó¿úÉòÙ¤%»wæ*Ãõ<¬ï¹sN5ÊÕ›£Ùs•‰·#èGöëüDƒ{¸oÌö7oJKE 0ì5îÏËÝÂD¿n¨qenSñËìpVL‘Ž€(¸Ýšé†3!=Qq%¶­BÖTãØé(xr£+‘#§Ì_ï•=à õ^ПËïÆ©òÂú|]ïÇRÓªxGöþÊÊWòo»K¤†­ƒõ¿^pEðTÕîrH=×Áºç&G¶ˆNl‘yÙ”ë²õ4xÙ¿¤@ÚÄPÏmù¥^®ñS} 1oXUw®]įN›î® ¿!…ieeÂ=–äS~[•˧Åx˰ÞôLz Šjà¯pÖ«YŸæ .å×ëÐ'[ S?„ß}âHÈœt—ÌV¶ë/ÅK ÇÙ¶ª$ŸÏ ž›€—cûP­›‘Šzµ•ÿ‰šø‹y°V¬é>j,Øß %Æ@MTâ/t%Vñlâ zžjTJÔõ—qa$äJ¨…žQ™Q0P E·'t4G5<©¿Æx÷xÇÑÌ¬Ô ^Üecñ’Äœ…‰{|”Û/Õ02ïÊW{e¾Ñ½Ñ$„ #ß|é„ÌLÅÞ°)¯|Ͷgµõ÷óßV-ÏW³‚ÖÊü`ëꪪÒqŒ/9° ‡³ tÚ.¹Ü•øØ˜g.ùAcwR`‹Èˆ¼) >N².̬©ê¢`PV©XµR òš‰)ŸlÂÙ_SBr½5Ç3?½¦¦]6E6WbÝ4Ã[馜ª³ï•O˜}»¦¸Lk¥ò2÷ò™ÚLeÃQ®^kØñ³zwݧLÇÁTVþ[ÈøtµImY†eYìÃAêNº’C²^Æa¢:"’­ð„KTHá²”!Ý,ŠLSIÒJdd6e ôqÖu;°¦#ƒwý¸°8²Ãs,äñ&•ž¡·2Ã8)t.ö¾òe,=Øž«.±)Y¡Ó4©Í4ˆ½]ˆ¥¯Üí£Ek‚=¹²ñX¦ÔØ?Çn7ôÎ-2Aå‚Å[_Çz®í ÕŽÜZãv[ȲÌôDÒòFofÇ„ò5Y܉ö¹‰åÌ&+¶ðì|·™5¿ ˆð U_=œ3ÅvjgÛ{Þ“Üßöû‘÷”·O bºm¬n°èÛ—t¯* Ÿ¥-"»ìg‹ØžJ@à©cF‚O4ƒ-ðภèX\H aËÙ±«^¸QÓMUUfHzÞqbóPÆnS ?·H?Y*<ÔÎzm+¢’™!å\Mgl1¡¬ê :(Häm{„ê5gBʱóÊm—MÈ™’¡hŒR`z²ãÖâͯ»ÓmZÉ•ÄY²y5„©UEäwùJ°NÙÑKD3„s×nÓmx+¼~v P‘6ÍkAÙI@Ç’ÀF€%ƒqy©ÌÛÇ¢vö¨} Ú6Ô<‡0~ù$ëm/`ˆ>;•¤‰ºö‚ÓŠè±-¿ÿÊáWšUmÐzk Ê ‚Rd>ÊfL“øEÿƒÕƒ4eËY^~n\²WçyEÒ¶ìµÉsì‹Ä'h84›’ûR’. à»y ‘(M|Ÿ= êèw˪KV8tÙgþ«…g*hX Xù­Í‘ý%­Jé û­rï&üÜïÞ`êŽji„¡~迼RΪDTSz½v ̺‡ÑÅ:¼,â:}²Œ{hˆsÁúôÅˆÖÆ ö¨|;m(dþƒWjMÉØuÂG}Ó°*s£O§”™¦d»?­2Jž¶ßÄÁ/„×k¥dο\™k_Cƒw>»e$l ­B‘A1cÝŠ®…‹«t–0ð¸;$Ø"“_]ˆDbýAVâN-Ûä19¦MÃÿ« •EEgú¢Édyä qÃ~ÉLâÌO½ç{c6eæUþ€RîMGü†Âá|@¬³ÁÇ“g³¯ivHž1°0å¹{y<³ørž8ú_QÏKœÂósJ]ÄÚ"ä%9¹É¤å¬^(â„ç-ð6ìl8<ÀCeà¢$ë.ødávŽ”Fò¿ c¹†Ä}Z´É¡Ø«»ÓÞ™«¥\Ó\ß ¤èÈaò—¼à`¦2ZÁY-LºÀ™dàv‰Âsõ÷x KåÏd²‚Ã{0\èf¹7n®€˜…]ÊKÒß;1è²åªÎ³˜¸ÅÓš@Åy§ @\lK|±áš„^’bBßíR^ZN½<7w4íMIxƒvñŠ‘åý8L4üLÃåÆDɺÛó?*Bá÷6õè§ÌFË\. —.´§[ $—¼çtŸ<k'Èáí›+ײÜ!˜’PgpÐ4™%ÜÇN§÷“Ö/¶1‘uî×u‹¨é$ú¤ž¾ØI…®ˆé!1)7ó½E N"ÜŸÉ0í´EËE™z@%fB¤·E\`ãB§#d«À³¦xs;§ãlü%¨ æ¿(\†€ó®o䛽”u=ž€Ç–£<­Ñ´„óõd'lõ¢¡—@:wpóÕIF!ŠŠkäX®·öc*ÇJäÛ+µölN ~"+‰n%™`em¹Uâžã>Ö‰tæ§4Ú*'D#Üeú`‡°nâlᬔlFF?¡wS9:F!ÇçÐþ­Ùý½w£oZ-×þÃ`OâZóÑ~O"×@¢ ÃÏŠ¡ÐÌ+A×éXhˆÃË–ë¹Ðn-pã\b.œ™<[øÄ¥Pl ·bxØ;Î 8m!U}ß_Á™)å÷6ö"³eqpD‰é®ÄL÷ûõáñïWÖN‹Å׌uÃÌï”ÜÙü¤‚³0½a4Ÿjy—$ g1P´ÑIXE®Ø.Ÿvï6¤ôH¦Ju¡ï˜GSNLÙî¸KX8ešEž/ëœ!OÃXP]»c*Ó!t+6¹Fâ${üyˆTȸõ90(Âl=*¨­êpÂ]¬»n4‹"äzTD TDŒmÚÜ¿fÍi§óÔ°ËV¾[Û=]Â8 ‡AÿÚ\Ž\‡÷©è‘Ñ:/x½w!›ØgÕ(þôHŒBßo d{VY«‘ Zj­py$WÞ÷i`†aAÿ—мf©S"Šáձݲ,b›âÓHXŠ^Ñ.1"IÊpËÀ0xÉ#¶Î7«/Š7Òˆ°jü¤HV$tõœØó£s™¨2¦^ ~ߦ]Ù!&·4çÓuGÈôûºü ÆH^UÊ÷×<Û w2ÕÖB‡î¥ßÅ©˜$‡xG›0—”!¾÷ÇT£l<Ï@áÍà‹vij›ßvñÙȉ2ÇiõØGp“àcæz'óý·#Æ=™EUi;ðs•˜»} ƒª,#¬¥2‰ò‹CA 6T¿¦êÈ` ›€ƒÊ;Œ¶ 천àšÏÀpoêî¥ùUãp©ÄòuÆ©J6—HuŸöÞž½î«"h uÀñÏDí„ãC°{âipiØií¢©LYò}Ó|ñʆcÂÇ4~‘…ai}&U,ÚôðR$V’òí-¦V]£©Í'¶%<ÓŒêûës¶¤MÁ„T¥(ù^¡ZbOß]íÀ¸ÐýÓ%ðõ¶4ªKX{/Ë…‰=ãu0Þ7@🷃E¼SÆ ‰G#ãól´‚ÄpÝÊÑp£É¶añŒÜ.7ÜN¨ccB¼÷Ùž»VrÆAÐ|¬‡ªö…sÃw|z?¹#ïžiþ€‚IÙ± uþšÌdGƒä…Ti#¨Sìy‘0„!аÇuBä@/7A1ûy&k$0ª-"ï2JÌ9]it.lrýÙÜg ÷ô™&söYyh£HÁÄ<˜v©¥m5(Þ.r¡P®ÅsâÒâÐbÄxûk´K­DÖD _7ºÖƒÇJCIÙ8ÄM Ä€ÅÍ+› ‹~W4[‘TêHNÚÜEªA縣оæ[²úÉ¥ïûÛüØØqNcê¾¼Ë)»è ˆ¦¢raN’/±>Fг|oÿÕ½óNßãGni­«XóÜâo›¯cÏ´è ZâÇ…‰( ‡ÄãÝ$42KªœH‹Ú„•°øûPgÖKˆ“ Âû2ïiKwÃÚ›aÑÑø¯²wÈ8\kTqÕ´Q?“.aWÈ%½²žî ¦QÞßvß’ø`¦!)7KG»‡åŒY&ù’·nÀØPìXÛýnðÜòK/rÙý½a™gX1Hè=ë--5-s_~^HÀššOÓÒh[¾%Làu.gðÕw¸~¢!&3ãÔÔ¤…ì3Q(ê>ð¡Om@x`Áû"976^ɇ*œdªEöfŠt4F-«IâöAo÷ùÖ`:’7®ÃûP ¦×€(å2ÍñªÜû<žL™®Ì:`ÂëNÚð•ˆõ’Hu˜§ÄÚõd‰¼$Ã(0”­øzúÀIcÕ¿ Ç]¿ªºE€zó,³³NßÏ&ý’ݾ Ew/{\‚…N¢ˆݪ8\¯ZA¹SúBjzäjœ¨CPçDh^âìÞÂ+ŒªVç S5_u³åºæ,´+›y£„X½eÔÃüw5jU¨ zÂ`;7Ÿg:„0…qÌqQð«Ê[m„H(`g×ôÍ9kˤüyÐÉË‹ö»QÔ _Ã4÷ÎÈ@Hõ ïJ­ØºþÐ I!dõYi=¢” ½å'žA ÃGˆA™ni&¬©:=¯yLØ3VõEϾ_ƒ.ÛßÌ!‡ò‚¯•ÖŠ†¨Å£Ã¸žÔó¿=¸QWœ[ ‡ÿÄtœæY7³&Ío¬\Æ ³„qìGÈÿÖâlHß( / )ɵERî­< ±[ò°йðtöðÉí‘›©UEÏçñ3/™±m)ìf=‹š=WE`éálj™ÕýnV?÷$óMoù;a9þ–éñ"¶ßÓ=²7ôOP›5óD_šðžÓK8fEÇDŠΰŒk,‘78ÜEmðX‚Æjtô7øä§4å ZÝåU>õN-üw‹K‚¦´7äëÕp' ÍË"ªìÜ!wßÁ#K2Hºg{¾}·ØW;hYÙ60)Öì……^¢ª¡!|qƒ.»Û§Æ ÿ·l€¡@ìTÞ­í™Ï—BñÁ)‰WØLZψ1ÌßžÞÎá©÷Óæyø9ü›,.͈¿,=ÎÜŠf¾êŽRÄH…p‰$e`VÏòÇïã“Ãâg,óãRJœ* O´·5ék$ÑÄåcæôSD>of’¡éÿb!çSnÜÝôÝ…´4Ø Ü:>®ú”ÛOºØïeVàà6Dfõ`uHdËí7¢îeçùÓ‡CUÿ’_ÉpëËÿs EYÍA9_AE·0üVÑ>ïYS‘£„Á¬o£Wˆxo.i_Ø·âÞ,BŲh=/9hyx6¸™jW•¶A³Q·=€xôþ㨔©É<‘¯ä=‚8ï×”w I“-˜WÛföw÷–½bóà¢õR¬Êv›;ðÃ~ÛtÃH–ºX¢ˆp?z3Á¬2½_^.µ µÀϤlô¤a„•a›%³"‘†§ßdšãüE÷ ¿áKYŸåœŸÖÍ OÜ O-vC'âE¨m Y7äÑÙ(QâÒl'€îwýRŸ ¡S—ìÿž“ÓÞ¶Ä {ûF†*[î‡U7íhÛ…ÐÉš^ˆ-B°WÂ!³69LžA å_$­3ýd?ýH9u΂˜•“Š[÷?J2mdHôáÂ_ßÌÖ¸É7Ö>I®Uò³D«ŸÛT Å~@Ôñ*i gI]Ü›S|4#mYÙ¢R1B³gÖ¬Á/úÒÙ$©ì±ÛF5¬slï:î‡m|0Kœ ÐU‚Õ&~?€x/àòšÍO+Ú•Åak™fHëóIÁMä™ïŽùcM3o±4_üüº¦ÙÙ^Cßke‚}5IÞ¬`Áê¯øÄÚÝ¡eÉ1¼Ñ–WR&û„^vpóïÒ±®!å$8¨ëÞ¡xHæ±Ìqá߯O”BvMµôÇÕ~îÉw·BZPÔÂu ‹Øqv×™y¥/ G‡”ÊÃmiמÉÚ1Vž×¦HY ¦\™æebb¹ÛG ÛpñFÑõ Ú,ÊÓLvNf_›n²eÂY§À•SÌ('uÈ2cJ>p- ‰¯yzu€ÃÊ…éš……gàCÉp µç,óâ!îÄÙQ"ñÒ³dÀ¶È%iw}<Êñ s40P¦X_©®áëtJ6úÜ6N&Ÿ4t#BI¥Eí­¬"çµE£gó…}e.rr¢Ê½OT&,d&ßÏ©‰?¿!Û™åW›Ú¦˜LS ¡„FVñ«A¦Жñ“Û)²©ÍÁ‰³U‘ª‚È»÷yéÝÕŸ‘^øÐ‘ƒxüo¦Gw iïÜD÷´¦8bÚ^u¢Õûí®NÔhÌ:ð'qÕ  ïŽÌô˜$ ’™0p·Ö_"#žÙ¡UñJ_†;ùPÈxQ|9$¿V×,ÄK¥Îý*Lî4^QUɉ¶ðn‘×X›:´>bv¾ ‰l ÑWj¸ÖvêFŽþ¶ã¾O6˜(@ÑŸ‘HþŸ*.aaÒ?Íâ¶ƒÂÆžBíúVTźýƒ×¤».’—ç|øÂGú½[­‡õQwS‘à9ýU_cÕÛ¹Ú«CMŽÈêK36»ªÝÙxãËHìÐ/Ù¥eýýz„0,Ã…¯ÕŒt_sS®ÀÙBv¹ zs$rmŸ -=E¿O\>)jã½ eO½×ÐNýzb€ÿ¾õŒžúYw2e­º«ßRƒVa\¨JÉ l+'×»ûÃê™)ãσèrüpHfe{šh1F“n¬UGJ¾Ë”ZäÓ›FcqFŒÝÂT¯‚”ka§³ â+É LÒI渜¶½‹ ‹žõ'DyíBÃýµÓ 怕ˆT’髿o"¡ÇÄâ$Ô!>:A!à¤KÊôÆ»¼Ÿï|Q µ¾)ÛÙ4ÊuwOǪ-‡¦—èÚ×m(§ôèÐë¹j—VPùF¥±=Tîÿ¬ÜcØ“¸ò…MY[b­a³ã¶ÍòÞ)ç’5øgl°!aûbÄ¡º®–Ø£ôÍ펜ؠgºÔP¡`Âe1²è‡}ÁÊ{š.×õôÃÆ—Ÿ˜uÇh?~]ZYô¸kä$¼¦dïìÔ=È3ø%+þ.vä0Œ¡¥œÞœ…e‡Ó¿¢¬K´†Å¯¤ÿ9«McágÉÚ×{Ó*>-T¶ Ë2hZ–¤aêæKòÏØ1¾¹\:J"†ŽgŠ{-™Ãûd¸‰;]Pyr=ßø,õMƒjÚ ™•Žn d_¿KFÚi* b¬:{˜áÆE%Z_I#“aËIÇ`OùmûÎKÁtqDûˆ©ÓXí”Rj¤¬N÷y'Ùs=P”æeÿêÔ¨&#m•ýÅè6&“Ìsbx ÷u2„ƒ;«ÇM^'V|•ž‚2Ã>1Ä,F;ËéR(jתÀÏç‘ 0Î(DG¥­VÑçI:ÐÍ!_þõ{;q 3L;ͽu•}/¯0*Ĥh«¤â[‡Ø×ÆŽHò™”~Ìâ9D•Ð ´Â .œ¡ {ÂÒ]úeÃlø A¬á1±†&¸íÀéÀ,˜ÏôVM Ñô¶¡ªaÀ僳鲑?ÿ²îú‡.Þhy<Šxc©p÷9êñÜCÎh{a}t§E³~‰¯Ù~d_Ô:\±0Y _ü}âÝUk}f¾ H$¼‡¬Òd-J-rýëÔx— ­ Þ2¶²¹Ø¢åÁÊøcb„_CÃJïÂiŠœ- ©åýA_ñ„ùe·òY+¹Å!aŠÒAœ“çOî9<ó3îˆü€ £ˆ\êÍ@ iÕJÜ‚4éj´ Z¢Ç˜¦ýEÌ&ÑKÀ™¼"x7»¢‘âk G´`¨¿fÏô¹j²~H,ðV?VR«p2ÄJa¨š3\µøXž_ɯÛo±y™¯ d‰úˆø>Œ-ƒùU GdØ2‚6H¿Ú»EF”m~΂&úOî»®["@Ú´½rNj¯³*ÓîÅas9ÆÈމ÷ïT0»ÙJ²ÁÀq!7SÀ^×™Ÿä†Ù,TÛ,•‘" üõ"s<è-ôŃk;è¬õ/±Ña">"Ü=ªÇM·w¬èïÃMŸÏ*”†OVé²ýZqD¦o%3ïÀ$®9Õé4eÃÙ(¡,©ÕÓ”ãuÈš­#ú^]©ÊOµ§‚ŠV^S+VoS®C(™ü7ˆ,áN~¢^®9ˆ é⽊¿Þ‡ì“Ç8Ê£Sjß“aÖ/æQ]d'»ÎÕ–'·™C+,tÚìî ¨AÕ¯}l¤ñ°Ç2ÜÃÃeN$œ*¸l¯IÇÌÝpOpg÷öÏ(eäby2Mu;äð×ð»àP-0u»~Ö¢ù<Æ~E \ÆV ÛŠ&ÝìÈ7úÈçAúM¾1šBhQãZ]ûÛTÏws+`«;qKyY|PE…ŠT°ËêêžvNóPG0dÂòØ<Äwÿa¯T]ïAËÇÎ%Úøö|¶¤B;l„Fs“+î,k®ý Í{˜]1HÇbŠ)U­g©IÏv0èÕÉŠ«c…/1 I‚ ë»NÂx•®‡#¦/·Qí•CúöåðÏtÝé¬uy›LÂ:R¿Ã~Lƒ¨?5Ï—Ô5ÏâWÄëN­0fL®’²JÙ\ “„nˆ½IëÀÆbæÖ¾OºÐ^ÿ¬+v*¥ËT$ ¥È=CŽOY>ÌW­Nè‚X#=wî§H•?Ã,‹W5X‚óƒ8ˆ1ŠXŽXšÇÿÿ"»CXØ ¼õàMû ï8`Ôµ÷ѱ‹fVÇÍ(7ÐrÙwoÐÑu ja»Œ.ï#ßÔpLW!åôæì& ÝòˆȧItkÆ0Hî›ôO` ̧Vá ÊÑ"\PœÓºDÊ;R=|Iôõ\t±·ë ýRG$ÀgfÉMëƒv%Óó>›à© ½ÅI”,3é­²B¹>jÂ7U§¦^lý!˜F©YôÞNóòQ:õLZ ”ý¢˜š\K+¹wMùÊ‘I·E¶T_&sáb³`p,;,?u%+$|f ¯¡{EoËMX «ŠS–Û[¤™5®ºž`9‚­OÉØÇ6Alx*ìªáø&‚`I ¼¶ A¢¦#‰º¦•ÃrÆ€œ%ø<l2%þØi¦£ Š?Š [lßßPÖ—Çvõ¡öS½Q[:¸J“ŸÈª‰–}W¿JP&ôgêKê°Ô_+æ£áS µë£³e4»X®µ{ç}éѶ&³ Ùæ@Êž±Þ"R#›Mgã„ iÉH®(v§>ôá¾úÓÈzT^[÷EØ+‚ò.-([£½ðO«`be™®‚˜Z®}_žKÜëˆçé^ÅÙ9ïAsßäU rµVÍa½c÷>@Û’§äç0mß7ÒÌ6Mn‚¼?‰Æ*)ƒI÷=FDТå½K×Do½æz%õt@AÙ}¬ÈšZ¼2ò`èæ„V¹? ˆ9K?Í„žD†DåøœÅ’—@á¸ê}j‡oŸŸ%»˜µÈìé•X·Úؽ9>‡täŽð²Yš÷–­“Ô Q€û»•±3JK>’Ñ-á°Òf¿ŽÛ±—¥&6cÁ^ãI:S.Ž!‡ŒM[Ï ~‡U°{ò@.[‘„¤èúR8kð ð¤"0¾s͵Z¦¹à‡ zbÃüiñÎRQãåci™9˜·.ˆ†TñHÖ&ã—ø}óWI5‘˜õÒ×Áµ } Ýðáš×× ‚&¬Ìb´©œ©Üê×® d®ñù!þ«%î_b‹3ÂwJ†•ef¥mKøª1 ]­ä ßHŒ.à퇉K ’ÀMjï!*à×Ú´IøkTà`ñ 2Ⴠ³¤‰Á×ÞÜçd¦z*ÔÜØM0v )ÄõÜõª™¹¤ÒI´.êd%§‰zÚ iyÕ÷úýÆg\Ÿj5Ú³§fŽŽ^¿°µ0“' ©ê“ÄF'ɪ©3«ºN*œ©ªÍ¥¸”w~°KÊÎpU +ÓaíLÃs£m‹··krä$JâA-á ¬¬¬vç,­ü³šgÊ<ìÞ~ØÌ*#%ÆøhÍSßd^„Gæá‘°¾|ªï|Pê\qUß[.‚x¦†wËmr¼æŸ¤“SÞþûxä¡"ØúÁ<^¢S\‹ÏͽdÑÑzÝñ·æóÜQ+ƒl2ßîåV¤òð÷º<øJ\¼¬W .Žçþt¹ÐYgÝ™Â±Û •ù²ÃóEåÐäC!fFgÿ‰wóÅÏÅ_-HDÆ“Æïúé`ßKexŒ'˜5ò´ïÅÀ˜xËMóÙá0†Âôr3ý’ëòä*‹çÐk¸«¢¶ëpMŸ _(à©Ä›åõÕ*•y/>'ƒÜ-ª˜Æó’a ^l5 “÷ý2´WC­•-4 Ž@t’,à‰rϨ(ç®Ù™Ê&åÇ0UïÛÞÆäÄIØgB;”¼’(Â!§‹‡Äíã€ä°"<ÇÉ!ª9Ķ_Ÿ„Ž=Á ³¾ze§˜P§’±ë6–#ÅÈv“‘BIç¼Ô5ô=Æk¹vDã:“ZmVž3‰arš¹²\“ãkÔî3²)€gW>$;¨g~ݤâ7ƒÈU.BõFHŸ] À@ÙÔŠ{f»[w ¨_Á[ð1&Ó*ª[¦ûÊêYŸÝå~9ÖŽ ¨ÇÜýªwðë×)ÿ¡.xÑ`E½‹ Ó-¥1H+´ÍOùYÂ&¾10Ck‘¨©á4ièý@@Xd˜Î‰m’Ó4ú>Œ§Þg9›Fl›_á£x‘8ƒyóë/N½®\_â1ò”lXDø[Ølú4èºyº¶6`?3’¾<&&ÄOÂ$ï0³ÒÿÒe&çA m•`f˜ƒmÞÿ¼!â݉t´ž Ë—£q%Qµj›j;ˆèo#i'Å”™¼¡ó«u.öf¸dx·³Û»œ³ýH‡ªWÈ%Enì=yôÝBÇ/_fT2î[âÅX/V–O´võM}´0Ïì‰ÁœÎ®BÄíjtó/z™çä†óœàõ¢*g ¯®Eõ¢"xâXÈ",”“ ];ÓLâ\-ÚŽø1SL ŸÌE§øÅû0›‡åNä‡H _ŸP³6:þ¬þÂZWûb&È5û0q‹«Ý{!$Xì òL:G˜$b¼ÊP±ÀfK3»¾ï££pb}V|ãý:a?ˆ l?5N(‡–À¦ÓiŒs,·î(„ñN]w¶º*‡qdK®ITô‰ŸnÊÚÖœ²‹p bƹ­`k©ÂàRfš èõÒ¢áêÉFÍÞ98"€ayææîÞ>¨ÊàF§ᆇ÷>/:ûãAÉOÈœnÑ’ƒûìÈ}R€åí¯M8Ós¥A]+cúÅÓF(ªqÍ𓊞„Y¯¸N –g’Ÿ‡ðy¦û`ZîÔP¬ ¬ÄVŸ€_Þáüâh-„ùŒ)ªrù99)œFg…?†e1hR_- Wnõ݆þÀ5c1°î…52ÃÖÿ/Ó:gìMÔýݵ¢|£†ø)9Tˆ½:%hç ®âÝi·29ÇE/Èq%¾¾çõ>¬¹©®A|6«^Mî#çÓ°t7Ý>Ô#À¨–æDäJ *O¹¶y€YÏÄ–vù-ºHp/ÒWLüÄŸqW>ÕŠ8]÷ÆÕaºÂÖvc‚eYé«h¸Zˆ:›—½³\ý–uZáô)ßOpF'tîý_ ØÃ²w¢ 3ÔI5SŒø›øM‘5òV;5ócý0Ô_Ú"õ¶øv¶l­OwRäDŽ\Óª²Š"QQ–®E«”mί>M«ýߵʎ½" UTfå½ÞÃé)k.2§ß™yyˆØ(Ôj wMŽ©87CïQ,í¤×±kQR[̇j-g§8–èû…µ@1Ó ¤vXCë‡Æõ±ðŠ~éàœ÷”.¥LL‰Ž˜!hc¯FºÊÄb€Q°]„rÊ4ƒföÆ…qR,ÍNˆéuë  eXtí¥ÙRœLyE‰¬ËAŽ2‡¸íïLZŒ =,û_7tI,Î3»ŒÎQýÑIž%‚£9*º¦=«ïEo¼dWø§À9„e6Mñ󹇯çV#üSiúQ#µ‘2Šú­ƒA•?~l6/-ýH¨óƒv'W4… ,ïf¬Gó!ø5Ë›:®fbJ˜úƒŒ¦gÂaÈW¶Ð†%Ǹ]ë–}¬ÁË-3ÐiÍbX*tÉUB@ƒg/4Xå±³øF´JKLQ¢:q;£àS4=ûE,½¿'Ù€›Äú+ƒsBˆëwô‹nq•ª‡ÃàüÖy"^F¾(:&„6bëÎl<%ü†_ò9“Ìùïïu•½ ÝÁàÀõ®À_‘åÎJ|6<"…à¾q ÅǬ2ÞRTŠêîjçcã‚ÕÛ»ú½gܳf˜Ež?,é]š ˜¥û„ÓÙRP^N©ú5ÊÞBÍFsÞ'Ûbƒ_jX´8dRMŽ›þ“¸vz6œ¾ëCý’`͹ W\K¢pF«wÃ’-ÄuŽöOâs6PMŽt´4?¢bC‹²^•ᔚ”Þ`î/È¿³ÿuæ´åa¥G·wÔÕ—I¯q2£¿z‚ý¢ˆc•ªYàç‚ÂשR¾\f®»ŸQ.xí´ÕñÀQgF̨rë¸a=®d–¸ªÉQOi<ûp_ù"^ègÛO„b-ퟅt>FDáà”aÒø'âÆÅãµùà1‡Ì|YØ™ãi…ØhQ…»âX’‹g‹Ë·Æ?ôPqlø™ÎéPøgp“r.M'ø9Ó˜rÏ·C9ù€Cл h®õ A¼`5ªÅJáàœþg3qÖ3ø£t45~Å!”Ç©+¸-Á¢…^;Áá”QÝ‹ˆv²—9 8ñ§Âr‰*Ôfcú’;Ár¥p¨ƒ‹x«\¸tè3Ð%sGÂåå)dµð/Á¥q0…«,éO ÃÍz2ŠY5¬¡  ‹D§Á¶"Ï—óså¥)xy&Æ¥£SÑR#•øj"ì™È—w9Š€¹F ?\^˜&êBëXö½„-_HÛ¬\0%þO•øðX!߇÷à‹4‘ïtú©®Ì5‡ Û}¿â6‹3ױׯ€ù|P¯)zhCŸë;–Mq_d%¦›´•Ðë @ òàFŒ×ï´B™Ú=¤×ñKrYT×Füf#¾aÄÕë9ù„àh©¦UÐÖôRüµ0Eß3DwØ;оÞÐ+€r?ÀQ(0¿¢^4–ʽ’\=ZÚ fÈêøEñk­• ‚uÖUíŸfD.£}ÎËÊJy|¯L"f\d‘ðwÜ'@£Þ™µ½#±:¢+PiÄʹ‡„+cÙ‹‚€Óci vg&¬Ò³òhª–• 5Þì#M¦B˜7‰þµÒB'ÆÏsŒ³h=Uå(æÌ‹ë›p¶•³`ZŸjz¢"ˆÑÓt—ÐmgQ×dÀ²X«RçÕ³p°fçˆÄ,¶Rü”Ž¿ÉxkT2;ÞÔGHÜÌÚ¹VíjÔcg¬šÛ-errPΠ†KWá†Rˆ¥¥ßåå€ÿ¹–$Ho%œ <ë»D ù#˜@߃‹ûî¶:¼Céh­º8jÏ¢-I¬N¸'0eø½è×M_:±|t´»ŽR\˜Áð¨«ÚßdÜ<‚ceö ÍžƒyFy ¸(¬â³–¤£åL&›„Ä}È"Âê`ÐÙNÆ2ŒJû.ÜžÀ4ÓÆÊœ+HÞĺc˜V¿{ve­Ou-þ>Ó¾)õÈ)Òöû™êbïîh8ÈjE Öë4ü¦¶(Ü6œIÜÛ‡÷ÂèpµÎ[À«ÇS1¯eK>y|œR¶Ôè,·zïÓ$)Ë_s¬ÎcqÅïV9¢S+â§Úç3JO(zëØõ¥dNͺ€Su›#â:M÷RbŸ+‹ôN ÷´*tåþÞ`èÔøýëî+Xäžç5Ä"sf?sôR(Óóï’Faæ”}89«í_+yÛ¼±¢Ö­AyÞK¾àK#ÒOHœ9?F›9LÄË[]s%åÖÆè´ ð°,ïñ÷qü´è¹Ý¸Ä›êé&®Wظ5e(Éï|W£ÎçŠÜ­Ú-¥³óTGxÃy|o éÀ^âeóÃyà+moëä$=%ƒ“µ ôăÛÌ1™Žg 1ê¶Áœ;¹·¨T.$åú4Mf•ƒhºqlÞGy@mÊ”üž“?KOõjkŸä:+Ö=ˆ™%.^¥o<èâ7|HT¹…øúÿ¶IñÇ9¤F`‚š˜Ç·º )ÑSùäa¥OÕªÒÎ;¹]þ¨8Æý‘°äÃôãÁjlviä¬.3‘X¸ê!™‰º5¼%9w]RÕlûz÷çåúJäò¥­Ñvt €áÖ “ÐaiÀ‰µ‹¸5‹ù e”$¡p«—Ô¤¿'ŽŒº’ó'=ï zeÌõpGߤ:©%Éáfž±+D[à5€þÁH_çtƒy·ö0Jšèß…˜Ng٠ƀŒ°½ìÛ­»Ã}í³€íÀåÖ¡(>ø“¨uÍ¡Y‘Ÿ¾Ï³VW%‹™Xqø¸E¡ó +%UvCòôÏO ±ÚT!îda‰Ðé›]c­ŸÓðL_¡ƒ=ÏܶÖIà”™¼ ÷á-¥qѵ*jÎ+묂Ynúš¡À©ä,,Ÿ,¿„õýn´`yO¡á·s˜\×uÔK…H˜ Ü]EU”–UÞˆ[PÅä h&*NqÏ¢Òz!¸gHuõÃ1õj³•Áp)ŠØù¢O‹÷$‘`ÅètÚ1ÇæŠËZ^dá÷ð•³õœi. Õ ±Å»¦ÀÔ­Œ(jèòKëíh+wÚ(·›à±êš  ê5zü m±Y ;|ÑA­Å5"øYVOŒµDœ'-Í1Å<ÐâîB‡Õù+'§/ëLS b‹ÆR!qô¿Ñä=E~–¯OAc¹,Qog°%«÷óÔÆq+œÍß•úöV#®°Œ¡E{Îi„šöšìfGlî¤×þu/PêtøéÌÆNx©Vã ì4m–TC×¹«â"……0nóiÁÆïãÃ,: ¿ÐîðzÝæ˜S?da´.Û„f4³½–p÷™ªoÀꤰ1 ÇWúã¦`?çÀ؉gëv”%<0&¨J¬Ó‰…ý]Àšn±ÃGÜð^6´g̬«RžWõv¤7žL9š¯Åù~úo¤Ê¡¤Ãå0>ßd7b´¼ISU‡²{B/[eFVñgpGœ¥œ;DM2¯ˆÅs¢¥Ù×8ýÓx«â@è9S…ç‰RA¶~ƒdDÕúËX8ÌO(uñ¤ŽŸˆVéÌVUß 2Ño®°Soµ2 ¢òXÎ.¸V•á)!ìëóØc7½œ>ÏE î§=*œ¡)Úâí¦RÔîØC¥¿vÔÈÏ_ms´äÁEàÊÜ|†s.Ç:íe}‘Ù ž,Æ¢ˆYÍ¥Þæ1‡^ÅùñÕ8>€±”V¥ @“ß9ÞyÏQÓurÂöPô½ÞLs}d\f(¯ŒšëÖʵV%W8––ê5æ;+:öBí1kÞªŽ_­Ú©Å´™\®’l±ÂV½Ð(´‚§4Qýk±c¿1 ¶!ÓùÉø°eŽøråù±c;þûwÕ£xªŠæ ØÙ£Î„0bÜô L`anó†WÀõOüÚŠÒ§\à1’TÃ]ôŒ-ûò§“»™V/Œ"‘<ŒkY¸¡)ÿTkº2èGcåßx L.‰\橤Ÿš ð@Ó hж þ‹-ž8”@Ñêeª]‹¿?7™Áç>>1óÁ”ßô…¨“‚‰³K€å¦*"0'¢dƒ²ŽÑ¤-r÷‹øÉukðšÓ¾\,+`ß]{H¿eª„Jʺ>|9Sކ&P“¤€ŠzŠì5‚dŽÀÎP¸¬V=Ýåå·šû ¶OGÇÁ’Tøÿ˜ö¬“µxïS"0|Ë‹zÚtFNû‰@ûÚh«`åñbP:%ÿ–@3ĈLòZ`CŸÃoUèUÌ¢ÿ>"ŽÝ…»ÎÁ0>Çѳ’õn‡àÚmëE„û{Ó‹É_(ùm(’RÚg¨IËj`ªz²#ßZ‰ Œ'ê0ÿºó½¾N@™ä¾Æ“H˜û-4®ŒÀâ­€&³ÕþP"0Y¾áî;O>ôû«{ž¼G!O«ƒ^M>úiHUɇ¢î)­dßÄžMñùõrÄ3S¿°Øú b®RÇüÅͬJ„¸[ËHi ~ ìióƒYl€„A¼ƒ´ã4—MíÆa¿÷£œ`_$žlÐÐZŒæšò ]µæêSY¹3ZŸûˆ ZÝý“ê-‘c ˜áG {ð¡Žd©\÷†íëyX?PésMÔÚc¤{8nšœyD¥ïEFÍìBø9ËÍñÉ.ìØç á ßFsF +×8ð´Îó©(_*JRÑÌûÝ(œjÎJˆ†ÙËËébtÍ÷ä_2Â@‹Ò'¬C±ë„u¶„4c(¨LÔ½ý Ó3¯ÉmPîW]Ï×§ÍÆ¾ÛLgxzEO&s²¸¦åŒ$}Õùý˜Dëò0Ù­`¢ø\­z”Øäýs'ã³NëC•âk¶N#-)}nÌ2ŽõpDç4€Åœ_Ðd…ƒ£yëÍ» ’HëºøÇ¦ÞFd EX}"ãLóÂÍvžøÜÐEò̽·~•81öÒÃFx_—³V/Ó ‚Úï]Ñ?±¦Ûï¢=Ð3ŽØZóùÞ=M’šbÀ™0’¤ k{ñ~à³°¸>Ü{÷ŒöËNí’˜ùñ<Ò¶”þqÖ¹ÿ¹‰$|ëìe‚“wI9yzSm…fì–¡{+1=Åå##•Á¶dà0ãÙÍß5I Vªð}0p}E‘{5-°-cðH©[R.ÏÛqóZÒS´nJŽ¥ïšG@ý›f %«åu@hè§µw£Ö òU1 Ž©œm-D®e…Ü}/âü¯·ñ²Hñ9â«è³öm_’Ì•v‚e%íGÕ¨k#-´M(hˆ8­®&÷îq½x‹¦9†uP/9/Úê¯Ð-=Ïiñ² ¤*€8-S7èèB“ -‡>-Óã¯åò? Cålè†l4’ï°ÂBÀZcûs¶(M{Ëbã•ÛÀ$q,üá¥Ì’%§1<[co2ks¶Ê'ø:g?*RÈ å£q’çFùØX·ÔÖëÜ\j\ ù€Po}€„yU»­ ¦jÂ; éë ¿æ™2V¶ÔñÚÔ¹Íu“bsãc9p-÷ù1ƒ&ª³áéNÚZm´:y_9SoÞºbܸ¾…¶Ï¢D«+oÔNÌ?ä¬ s„‡Qü6³üjÄwŽîÓxÁ]} RJ³eXÊ_ì5yw&¬Vbóé+gqw@ÝÜš¤« ŠŽ ¤xþ€0í…´¤DK6ÊÁê…3¬ì_",g-N˜¬¹´ñ‘oW6ÌÙ9“át¯üQ/Ú%¿`௡¸qãmé}†˜zè CÆ»J©Ö†¸1ž°ºö–)‚s7Ø-K?}æ~n–Ì!S2{Ö4%ë(äê®!âzV.árx¢Å¿¹¢5,IvGç¤1à_¹ä”HP62NUy9gÕîc¬@¨èÞnaÙ8g™åÛÑ;Û$4¼Ïœé.…GÒ8ΉbÅÃMH‰æCXýe™_¿ôžoÒ†âoƒŒ2öÖ™÷ÓþsAõ_:1‘¼NÚÍÆS¸{ {´@¼\ÙeŸ]C‰O“ç¨}OŒê±6H·ëF—T©>ë fà nÑúÉ’’¥he}Σ[É4gδâ=óè yšé§AMÈÑjTÒþ›xã¡á¯ŽÇrTàTpòÓ沈aÆé5eÜþhÞ‡–¸ ?Æ>¯*„µO¹¸ðÖ¬?DO}ç[©XSf»âô<—_M„{eµÚw9j¿ £xd:m\—lHj,4 endstream endobj 43 0 obj << /Type /FontDescriptor /FontName /OCOGQQ+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/C/D/E/F/H/L/M/N/P/Q/R/S/T/W/a/b/bracketleft/bracketright/c/colon/comma/d/e/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/period/q/quotedblleft/quotedblright/quoteright/r/s/six/slash/t/three/two/u/v/w/x/y/z) /FontFile 42 0 R >> endobj 44 0 obj << /Length1 1869 /Length2 11667 /Length3 0 /Length 12827 /Filter /FlateDecode >> stream xÚµPÚh‹»»3„àîîÁ5‡Álpw÷ àîîî$¸nÁ%y¹'çÞÿ«Þ«©bfµîîݽ¡¢PQg3³7JÛƒÀLl̬ü E56v++3++;•†Øø·‰J èäleâÿ—„Ðü*“4¿Ú)Úƒò.¶67??++€••ï?†öNüIcW+3€"3@ÞtF¢’°wðp²²°¿¦ùÏO­)€‡ñOw€˜ÐÉÊÔP4[í^3šÛÔíM­€`ÿ A+h ;ð³°¸¹¹1Û93Û;YÓ1ܬÀ–5 3ÐÉhø£`€’±ð¯Ê˜‘¨–VÎÉÕíÍÁnÆN@À«ÀÖÊr~õp™¯ÉêrïÊ@Ð_Æïþ2`üÝ3Û?áþöþ#èOgcSS{;c‡È`ne (K¿c»ƒÆ ³? mí_ý]­lM^ þ<¹1@ZL`üZàßå9›:Y9€™­lÿ(‘å0¯]–™IØÛÙA`g¤?Î'iå4}m»Ë_7k²wyý æV 3ó?Š0sq`ÑY9ºå$ÿ6y!ý–YÁ.VVV>NÐt7µdù#¼†‡ðO%Ûâ× |¼ìæ¯E}¬Ì¯_H^ÎÆ®@ØÉèãõoÅÀÌÊ 0ZX~GÍÿâ×Ëw²r|`}=6ëŸ~鿎—™=ÈÖã·ùŸ÷Ë"§«¤&%ÇðWÅÿèÄÅíÝ^Lœ&v.6//€‡‹àóßQþ©ÿ?µÿ)U1¶úûl¬¿ÊÌí|•ðÚ»ÿ”áú÷TÐþ½1t€ÿΠdÿ:Ê@íïÉ×cåb5}ýÃöÿ<ÿºüÿýQþo“ÿ¿’v±µýSMû§þÿ£6¶³²õøÛàu’]À¯[¡hÿº ÿ5ÕþµÉŠ@3+»ÿÕÊ_·C daûO­œ¥­Üf*V`SË¿Fè?·ðÞÖ T±w¶úã­0±±²þîußLm^ßç×»úS|]§ÿN)2µ7ûcïØ¹¸ÆNNÆH¬¯ãÅÎÅðb{]P3 ûŸ“ `aÙƒ_]¯åùÌíþ¸Qn.‹Ø¢¿ˆÀ"ññ°X¤;€Eö7ñX”þ!ÞWK•ßôj©ö›8,ê¿é5ƒö?Ä÷JÆÿß+™¾6ÿ·þ5‹ÉozÕ›þCœœ¯ôú*üËÿµ,fÿB6 ð_øz‹ßøÚÂé%þmðÑò_øÚ«᫃í¿ðõ0v¿‘í55è_øšÚþ÷Q_m_ÿ-üKýšÉé_øšÉù_È `ÿƒ¯;ötþv°›ý¿^Ûèò/|=©ëïä¯ä túËü¿fÇÔÅÉéõMýs»_ë?üçºM‘–ìM‚­ë‚;îkĈݘv'…f©vµÓ蘼–:]Ðà“éª?n8ÝŠ%öa¬mKÑÞˆ®?y·6À‡µ%©¶ÿò~4LP›ÞmGZúŠ74Up,V?HŠH¤!ºçýäè­`Ý Ù-O•ã苦’‡}ï6 ã^?X¶:º°«ºWÍ­€üX6ã­Pws;‹•=õB.ŸÀ€äsÃQ襻ÉûsÞs½BƒÝ¹‡ð-¡.)ô Öø4µ—øAŠ<þ¢WIá†Óxê<^çÄ–ÝG6ÛZÏ]%µ{§ÃKjª)~ZBh¹¨è6ÙD»bŠD8ÎÌó5ù w¹KžVgFåD«e[žz.5d¾ÝÞ‡ìzÏxZÜ:ú05KÜäzrP?W)dv=5Zxþ®Åðc þ7½aÓõ±uœÆ>4#)ÒÖNÿïŸëÜ×5(F×ÜGäæ.ä=gÂ]·émqίM3쇺÷&œÍì “©…jÚ’³%‘ˆ£ðê3I]nùZ‰a‰b(“?§ç´r4ª ê×í#ÓeT´º!݇mã”i–½ˆUWæð~Æ,@”…‹ýÙ ¶5á‚'óu‹_òVØ–|xì3mhÞ•veßÕD×Õ™~>« s™…º8:Š’íGlÝ,åøwg³¹±\Ä| ý8ÏüÅ mô°Þ?¤‘ƒ_¼ú#+aþe RŒ„Y¿; ð…;­Y RÝSêTŸitúOýC":¬QF=tGUnÀ-0ÛyPxÂ/µKkûdlêZ5>qÃüE=ßÊŒ¯ÌX-½üüíàæÙÝNdzSBqC,¸†|¡SFÎ ~‘óÉZúGûN^ÍÑ r¨O †˜u—CÉ÷C,à¿#s¤ºé¦"Ùt£aËq¸2P’tÍoŠÎÂøÌ,3Рêp×=ûQˆç9›ñ‹9S=*Iñšœ.tUp´9ú‡ë“ʬ¥?¥ ›¥²á®ózAûÀˆô…KMÿö)žÉ¦õ*.ôþ%)1÷üj¶J9;ÍÃv5;·—‘ƒù‚%zþÝÔ#|ŒÌ“Å©bù”^»|ÅÚY­ˆVzÉ ¾ûL†ð‡)±ƒUјJï'ôÃTžµ>Õ4j¼ N¨Ý9ºÔç¢;Õl>î­%9¸´Õ|Àõ¤(Ó§ sù%BoN¾qï?;M›'u-Ó;Ô- ÛŽ‚ ²Éðõ<ž®Dæ+ß ÷Û–ÏŠ®˦˚L+û0€×^“NªÑ/ôëqCÀuƒëðñ¼E-[ó®å›z˜µ£­;>&…i3£´Ž;y,÷"æN?žÿv‹bÍ‚\ š@Ö_‚¤\@­W âTsÓÿD„¶(Fq¹bšÝ[ù`•'Dc€'‰à¡Ém*ÉN¤ºPa#'EˇÇà»MFVé¼@…)*’RÏGú+Ôå’ž¢‚ÍeïŒÄ¹~²p͂Ӊª¼´ÑÛ9¿­$îËtn؈ìË_³ãÉÈu7]5¯Ó¿Ûv¨xSÑi · Ù·-–g’ba Qw#íWà]ËÇö;§’æ×%~‚õˆõ[&òöR Ì‹áhÈKOã±–»#‚ÀóIcO%zª7Ɖx,¦ByIåáD}À=â¤M$é`‚ü˜ 7Êš±¤q¨˜ÙfpOvÐñ ­‰Ç”YàÀ”$åO 4hŠkÌÍŽ§§nå¼pXrúîó¸Å„&ˉ3°Dϰ½P7Ý%—°50€÷Yibräm›Þ¾|C­m.‚ÏiöŽtSŒtJ2ÅáÛPÁ¥ÝÉ´ám‡¯H.ã–eIÊoæLU[‘%hçꪜõ‡[ØÕlÄ]d”&ñž _ Š†Æ®ˆ4&ßuˆ@#RRGùú‚º;ždwð­Ÿ÷ü”°Fç”MÍ¡“KHÍ{QEPd³Ë¤¶•º*/éµ› ‡©ÿ³@²Y!\Ëší˜=âQ+ûJ’æÖÕK÷÷4‰…(*¢Á÷74j×ÑÃDÖ3Ùö l¤Še ŸwÏq çIüÊÏ,ãFw¢Aû³Ù³±»¸¸£œ-± åòHhÁâ(Qã#oËßÏ×Èâ"Š%øY°âÉ©~$¼ü&—úËÕ[ð”~NfyGã¨-¼5ç ‡_IUCK¦síš<¶ÇãÃÖÀi[.V­°RåIÎ]ˆ‰’¢ŸÔ‹Áþ°Yk›pmÈ{E“Bxü•cÍȆ^¥‰¶ªT?«›Km‰éC/­T剘<‡3?,^,ïh-V÷¹lDʹAi:Ú®ÁôkÙ3óêOa”°¾ðÙËϪÝaÔ­Ä)ÃîU»Çã­ž 4´îðP‰’sGm¦åä§ nÇ{xú4æ[ k[Ý'2K0qܤ?{!xùbÙƒšXú…›à­#ùÚiM»4³â,šAé–@º+èÁ$±JÄuû½Ò$ƒ|êÐv5ö 7uÎÛ“Œ_ñ‚ÈXG”èwS5Ð ¢ këfddˆ›0‚êrÌ0ÞݹlÏÚÁLûp¾žñ¹7ø•?ýÕ0 °Ýüu) ѻܤŒÍkg~Œ6[Ù½|Žáä$f1©Rz9¡!út ­°ÚDZۉyqyXP®l9%/6ü)½¾CØ ‹Ï5{6ÞƒžžFÎÜ2[Åo¦Dy–˜ÿñÝ,ñž±š{N?EÈ£E§2äÇ ¿ðôFú‹¸€î¾½|õªAI3l›¥~¢D“·5ZáeàNK.`Â7Y¥p§ÙJ¹BFåfxnšÍB­)LÛ¼zòÐ ¤à—P%å#‚JwcÄ1e,­]¦vÚf ùÆfÝ. ÄÎ ýjÏÅ5ÑEæ&ÿÒŸ¸(\§SLqI’ï¸ –ew+-‹«YÈœö‹1,&ªU¨’¢ÜfGÝ)=î9sbO¦ÇƒicmS¹yïÍÖiƒéù³îícÌŒÂóòÄTL‚£C™@ a‡Õ`˜D}ÊÆÂˆ![ êÑY`Ij%úAŠ —ö4½²"W·š¡ÑlAØÀô›V÷«”î˜qä ›®ÂêèP&¯¯œÍæa[ñŠs=Óï §ºo‚:EÉ{¥~AIª¼·åßâÈݬž´€–{Œ‘ß— ãÞçæÙPnV¹‰ô:ôo5¼L$õ?m3ñHW{( Ù³fNu^…f(‰ÛŒI3¢—ú KM ‘«èž­7 L/˜CVµͪn…‹hFêù€•Cbò=¢¡Êøµ¯ylïÄkʧ°(åwê Ï{®žû/ZHðñYq'8“:!òX˜ <ºï$ßç'_›ïɱ•ˆÌYƒûiFyùYh£å²dr³Wàá Æ¹#‡aÃÒPƒrëJn÷ŸÝ³–¬¾…7øU·óuïzöËuQÀ 59ae”ºu”Ä"R8á4õM, Éb˜ÞñïGß±àV¬T;`/¥  óoesÿ9üñrdÇ(N«'ù‚ZJ *;@¤ÉƒmáEb5uøO“Ñðò[˜êJE× ø#Ò#<ïújçèI”*nŠ JÙT؇$7Ìàm°Ùrlªýœ=ù]±aÈÉG{v´mÁõö2D¨ðZ’aÔ^t(²0wÅx¹n¤ÎëÊoÍ$5Žt0~¢Ìô[4o&Yy+3ïKñ¹™¨Cµ9ŠÃ{Æo-¤4P4¦³[œC,<âp—`l®N˜À›:¥‘·^®&h±¡ù‰½Ùéä_°5B¶s†€H{•%˜ð”ÄJ·„øð-¸„Nµ Ü'ÆiaÝ^V²¤üÈjzWÀ¼ø>JÙ× r±’cÁÓ"ºËÓ É»)â F¡¾Áú¿Ñ÷l’ÆéìIX–ÒÀf±S³D,êsâ0Æc>¤ 3ÿž8|Û©þ™Z×K‹x¢ nÕðµ ms ¸‘%õ“¶)Rê.[ÒW¶Go=1 JÛœVÛvuñõrqkÿe@`&½´9¥Š ñ^l‹?Üã™o ‘]¿¯õùÇωÒ®$ZCò…ó%f x=š÷y·C±×º‘ÙØ1¤á Þ{X|ÔðŸ;Ѿ™;ñ o5ù«vø‚š™ï¸"T±vOY>DBu’|H ôWVsã? ïÊ L!zB¾¬H#U¼ª&,AÒ¶¡hàó jöNÜ¥…Ö-md0/#O~6×¥Ãês á>dß]h¥í¯ ª$š}Œ“vg^=°³þ3ˆý[MAŸÕ‚S.Ï4l(I¶{äôg!OÔ)ï—æÓ`ÿÚ°‘<.ßyþçÎLI7‡7åÖ5b0•ˆ“FêjzMïaÐj™gÜ”6ñŸ$jlv=°Ë}¿¹ÈRÒò¢M)ñÔ\Ñ7XäðÉ-’X͉¼–Is"&Å©»É‚|$kYOáޝ=nvŒÍ ‚üK>‹qˆHÝÆ2«ad‹£AnÀî¤ÂšNiz+_–0´j’¾mpšZ‹ˆ¯"Å?5ìs'ç3nn±Ì8 p‰ñ-£ «~VZ”ѵ‚ªØ¸ûœ`‘ê ä:kˆ>ò‰uNvB˜öKƒ‹vçl¡§w†Æxö–œâvµ9ýF~0w.ü¸é~ÕŠ`êg5® W&·*ú]Eô¥¸ðŸW)lZyE(Va";yòâæ!9„™Ç¤jEPðV^;²” œ–È´!9ă¾H¼]L ±‹G!8¢÷´>'{xŸá4S?«TÖ9Ì…çyF{=Ód|wG‰8ÃeHODú‚/øC¼˜È§”¾Ü;¾a+'Kš³îœÙ/tæ D¯ÿ>ƒëWÀ&?YVJ³XÓ]úîçægzS‹Ñ%_;s× Þõ±aìàPTT> ]Ñ8Ì ñ!èâà+‡ærö¦ä@Õwåõ£tŠ]éZnžbÈa>6Î0Òøõ©Ð­\}-Îr¢ŸÅÜâÔqX|›ƒL¢éEÊÝT2(A|ÈŽ%r\Éù”‡dl¤<îí¸a–›ûmk’ãz¶¿ííÖË•÷Œ¢ÚC3“Q4ñf5J©÷žâƒ÷`v¿…ï¥ÿÝ{€KÙ‡ZÛKZûŽå¸¹ ¢O¶Rè'nIÍ-½ Á þÑ~×f+õ:¶8q’:.ä8yY2È­d&ìŠPÀJÔÝzàââý†•ÚªŽ;o«ØAªH+YO 7.Ç#Ujv = £úS_±õÔ£Á™JR±SuÓòµ¾†÷À´ ë'ÏMmÅHõ}¡šø$è+1ä:QÐŒMÆÏŒçà\ ãAÌÀü=¹Xþ‚tæ’M‹‰ÞÍöA«ÜúÝÞ(T32t®*Ö7¬«LHÉÚ¹£«_6÷Î)y–ÂMéF! ÙÆ1¥*5´¾ÖT*U¡-#£ÂèH2Ú¶Éï¦E >e†í4žÿ,º…YO(¥î´t¹ î$ƒ }‹3GõËgª§‚òF†öÍ7”Áïe?ŸnC·N`G{zq’g0 ÿãÃ{ò–Ž7ˆ¤LF˜ÑÉ.&( ‹™¼KoÔ´¸ÍÞbZÇÜ•»U‰²Û*cNi©˜˜o/QÁ=IHF#~áY· q ¶]K:Èsz¨–¹éO úi·ƒóM¹êy9”À­ÏMÙ…^iøÍÂÝ42óÓ‹Vþ\/_…lŸ#o ûhÁ&ÇEÞäåå¢ß|Æu^s€z:þ(5zgd‚ÞÀ´~O¦‰öF.EžÒ·B‡e\ãþ¬‰æq¶që öY$)É”ø 'þ‹š+RÌݹU ¡üˆ„œïã™ÚÄÐx¼^d všKÍͪàgâíÌU‘ºeX˜ÖCé Þï¡U9ÉGö$quSK?ðíwv$ýÉÞ2d$–¤ãˆÁ5Hww, •ÜÔuES,ÖÒn"¢œDm{ >ó2 ¶Ñh{•q·Ý “†Ç?µ žfØÒRá5û#—œtú‘±”Çh µ¼¡üŠmÄ}éh¦âܘv*g¶>¢„LÊ,½5 {±›Åô˜xÅÓ}r¡Æ! ¦ÉËö…œÔ œ~Cšr3ó9L$Ò¯I–-¿€IpŒÄ' þãD,ø ð.uBö‰6¦|€L-ñrñmÊ¢NUw§\‹Â)EŽç¯”º ÷7Àˆ'-F;.¥?ï¯]Å ­3=|Ã?ÏZ"+J–qA9~¥¸ˆ¤«S˜B¨*ðç.fpæYœC9ž&Ž C”E¥ËFvJ˜×Ï¡Iˆ5‹…fÀ´Ánè›”Rk`üÊEÇ  ÂЦ3ûÛ%+È‚¸¾èP4o¸Õà–ôAb ·7!J³þ¸Â B”sÎf«…J;·PšHÖ–?Éd“A2ÇQJ˘ ô_S½Á»{mPËÊy¹«å_;oãa÷g’­ÎAÔêü¤ë[1¸—™Ï!±lj‡×/2ª$Äk¬ÅÃ…LŽlT5© 3ó‡™r§N‰5ïÅwlÓrQ«ÓŠe÷Qx7t_™ùÑõŸ2:À&²_[ÉL v9¯–ÌÞI¯>”+ÀNÑÙ’Ý.Çu…ò‹ÝíÇF£ÌdÈVÎi!ÎzJ›ŠQËÄwp~Û2uXWC­7¸-+îý±ÎFf`7[râÕöÖÜ@^7%|Wd¹Jq[VŽÖ^‰(;ß"i¢šÑewÐ $HiɾÞò+êM[i5ûD=ˆ{ŽU+]|˜+GÆâ#ÑÔ ð]À$§›/hÉÔ¤|{` J¼ÆErs)J9b²ÁóRR=Öl U÷Mà G¹†sÓ7ODâšô†d×€yo·´\¥á,4ø £E$®ä3­˜µUlÄ›õÉŽþ¾-/œkt0å­þ» —VH‡K{mHÒu#» Ò`Ù ­f–Ï߯¥)Ø'FϹÉD÷±8Îø5®N…šòâBœuPïî¤dø$ŠM¥à PcÉÏ3r-%ñqWÈ$ºKê˜!ŸÑµYî3£ž?v·*Åñ°­6³™¢Y±ð^9ž&è|» íç¥Ò¤oÓ$5#yfYº0ÏM1³rX`Ô¡½¹p0J¹w]1dÿIÜ4¥'ÔEß—0yóˆ=ÍŸg³Oi¿Ëz'Ê!¦—S_æBD®ctT™ó(6òöƼˆûˆ€ç¢F§Û(Œ` ¦·¤c*)~|-¨³Ëröi˜ÕÅÕä œç¸?¸`°›#.¹ ¦'ü¬¥0f‘ëjǦ{7ÎdOåm1×iU]±m|€ß˜nëwk¤;‡5ÝuPÙŠ7/ Ó¹&¹ùÞ,}~صœbjñݾ”w?ßê¾Î˜<Ázè0»á³e€û/YÇKcšø›cÑÊjHÅɘDFPÜ*(ÀOÏ;XkD¯ò§\>^F™P}q‰Y0Ú´Óøˆd{ÜÂO¦)4kjPÚèÇÉ·xht{—sôÓnLuäåOºõª!¿ú´V1¿Ä·~ÒùŽØÙÓ Ú[ü®ÅÆŒò)šÍçôKx¦eŠº„d,|—#Z¹ äelf ZiØsÈÉ"ð~iÄóc ]ZËeƵÜ2T0`0 Æ•æÝDmî,µ ãJ$#…C" ûfÖbj‘¥À,*ê.WîÙQü˜¥œÂK¬Ç&¯Q¡äϸÎê}‰2¾¤#ÌìcI–Ešc#òt3rŽèÑbˆÃr$¼IòàM&„§`ðP%â5Ó#BŸ­äùk½–ý[DÂrÊÅC”¯5ÃÀ¶ gWé:jºö)‰˜¼(Œs[¦»áw^䃩bñ|À6Z¹¬út3f!ÁT¾žš‡‡ƒ³iÑm²3HAôÍæn½¢~¢h`¹‡LsB6s’lÖ¥èÞŒ{ýq‹áWü‚ý±f¢-—Gá¡×¶º|cO½êr¸ï†,)8¥]/c>e Süµ1¶¢¸~™Åñ´å–GÓHÛó|–üÂ}_J¹E 0ºáž‚°m˜“¥ÎðHƒ îv5Ï¡ç˜)Ù=~?dẚÁí|ér¸*hG?©BæÇ Qdagðjž.!úz‚VÝ—¨©¶¾tÌ-Ø(35,Ãç-Ê<Ý>ìIwkâE–Þr¥~1ÑaÅñ•+Û‚ÓRDm³R†w’ ˜•Ñ6¿ŽE^öÕ èv)5â]9û-o'¹Á•TŽ+;5ñûÉ”;o튤\öqÑûvóUIŸ§=ø\±=¥…¹\Ž‚—-7Ü jÂMI°\ò¾ÜyB€£]"Ó¨zn›§©Òô‹*ªÕ&Û.]št±‘èôžâ‹%Î<7 ò!0R:¤<†Âs²ƒšŸð[±3ÇÅ*ÔœºK ‡®œpZ¿š˜ê E|Ù/2‹m(‚.ûÈ 'Ë[¥A^”ª¶ùöìÄ•©as£ËI&í ƒÊ7yxRÒsa€GÁ°‘+ckHÕºÎÝ»¤ÂDÃì8‘L)Á€I!}¾Þ na“6V¦K(];5¨Eb± „»)#P¤€³]ºÜ…>„‡ÓB‰qâZ…ÓÝŒÂ~l”2ó|Ox¾•d¡Öl  ë÷ «$wÉX“Ð&Çb?q‘Õ#Ë©iBJ×AçJ¾¸<ÕaG»(u\ø]Ÿ²óº3SÝq¢`ô;*j®i<ãK´ˆbˆô<”¡75Ê«¢Á‹Qé£èóÆÔXOV³–:Rmqi!ýQÓU<ì£UDaTãv™:¦Îœ†%†DÌ2-?L „+š¬gáú·$߬ݷ¢´·>\¹ï$A ¿%+ñ­˜®YÈxפ7È&¨a5$¤YVŠíÓuÔ`²@1_ ö™Ëë õ ØIjTîu¿o¬ï‰Z¬þíË–úå¦9ëÖ?˜“»Œ Ôc]H‚`H—=U9BªNh›’J’™eêv1yiÁ—Ë‚E½¼”r?*¯ýsK|t÷9crœ¹» ‚ˆƒtXDUäGŠ`¬ÇçZñÐ ÷ÄØG¾,= Z8pæö°Bõs‹»Ê§E=à§Núå=NFƒu™ÜÒ­”žókI]3˜U¿Ä¨ *ðoÇYÛ«cæ™4Bé´¨ý°6×Ô#Lµ¥€CK=úVè¦îPdCspXTû’ñæ›Ýõìe¢ð•4ÞôD0.m¢öÅ,g¥Dè4o¥µádDÒýc§Tmû{Îmɯìm†¤,Z Ñj7´¡ÀX?,OK ŽÃÛ43½ŠMvžƒšž2âXßý;ô\¡ÜPqu‚[8nœ6TA;bI «¶­{¬ä3Ir#{k“Ж l–´pQG^Œ•ÅI„c„‹ZÕ#ïÚÌÑœ‘8ª®JaXŸ}ЇNÄ,=Ñ'XÛªh;¬vŸ üj—½ÆTËOï˜r¢Ý=Ïó5|/x! /[P·#¹áù1QR„?Ê/óoÑÕ€ÞLÂp|á/íŽGÑžˆÁ¾G”$9œ¡Ž›{'«ÅWpß1ṳ̀ùu'ìr<2ˆBUl;Q|u>lëÌA-lÇ­¾jÞ5l—¬Ž ”_úÃð¼Õ`9'ÓK0Ä©j:¢™ÚôÓÔ£&²?×)ö¤³>wâ4RÌ ¹ËcFìùLuW†êÊ':<Ï—г>"áS·È2kÛïJ3bÿ‰xÉéÅP 5‹ó—ò¾òvõZºž±[4&’Ç(§­N÷øÏ>ñ:Po)tˆ—âñj{DOê·;%aF1ªM·ÜõDw-ÉpMv¸ãذ`-(F©á޶©gžz p 8sÑe徒äìÌvA—ŠäÞ«´Ì*zòæ§nW>G @g9Ñq9QÁÄΆ¼«ø&£0Jú’8NÙc Ý>fîÁGA0×ý\hòã–CîèMµ˜ ÛÜ:xãx>ñ¾¢»¸‹sO2v%adO®ªx^oÌñ+Ú<80{SR·,§6üΈ*g¡ šx¤ŒÉ‘ §qý£º‚¹ÎÔ7s#±4“5„d›õX^;aàÈŒe|ÓƒéO‰F\‹ !+û²çÁ&Þëô^°#!{)è4‚íæ%õ–°±¶¯÷ý‚/ž„‚©åg•2yýB3ö‘¶z"Lñ†è®Â¢Šƒ;?zs lß9ê…:à dWaþóâZ=óÉï¨QC‘Á£Rž¥³WþžÃ„4<:–9Ö¿¬p ÒÞwò¯ß·uð'Á1Æl0Ö=MIHLs'…kÁ1höîñ\Í—™_žñf‡ïOìõb”‡ê¤äHP½1óBEù‘C#QõÆ.,`wWº%{F\ÃcYªÏ…îLq@D«a˜G4µ}᫽SÄä÷Ò­j`t¦+û2Ò< öÄ=¼%ùÕyCœ‡û†!|i3 å™|‰=Ýt°í¼͵®µÄ¯>eÔ¡½ÐsÕ°{4[:F¦_¥Ý6#={Aäe¶&˜¢?ê–‚ÊÏ? ÐgÅXcmÞšÎKùiÇ”®¡XcNžnZ<ñ¢Œu†ß|#üÍx ª³ä»9WàÐBßĦ¨I(,¿ü¥Ž$àPØ>xd*@¹‘¦SÜUZ#'’i¨‡†ÖÐ&ÆÜåBÛy2àBpû³Z¯Ì˜ÖÞË-‰ÀNcïÞQ„C>pÍÑ€çì9±¾GøHo¢lŒàŠÂb;€*Q\þÅU4š*ïÛå5UÆÓ)'Ä=TIúº/¡‡^Q?êhöW¿¥šÇôwiΈ¼M˜º¨Ë{Žh’G±Õ²¾7¡ @îÆ»t·ZV„w€OâŸpMcâ?ŽáÌ=¹4 /£ËKÞ¾|LÇpMú‘ÇFJ Î~GPðžm‚cyj ffwÄf½OÚg¹¢U}ªš.ÎE6e¤ÈûÔTn¶Ý›· ŠTUID¿ï(ôy¼­Eúá!.ýTÀwèöˆäy,dßpÀÃ$!oïÏî@³3Ï"f‰îT“#«ÖáJKâaìAd7õ²KÞ0äÏ‘¯‚8Üq­"b¬­ß#‘<ÐL…‰æ¤éRäm c?WOCì¸i®ni5C¼Z¤ÈÝórbrRVš”b S‘Qí¨)šˆ¨t‰œ®kz¤dƒ$ãu‘;0‘ÍC»Õt}Æ¥·+k’4¿w¾¼É=A“ø^M «näÔú•N <~€ÕöS‹]¿žPv›ÒrÖ._ð] é‡p+“zK7”>ï­ÑJƒG'ñ)sVR}òªÏ%8ù¢ˆÀ6Wÿ‘ûœçýqr ]¨Hí#Œgz¢„õ€OÑ3:s¯mt’mdal鸩‘VöQ¸¦ï5Âl‡XÐý»÷Ç¢¾Œ¥ño™±8dQ4†U¨³f¢Ž!#aHWŽ«8äm‚AÀýð[¢²oN€MÛìS¤Gq ýhƒCß—ËnFÖ)ƒ-ü¶|v)ŸèÖ:U1’BßÄñ®¼½(ç¾×Üöâ¹}UÉZ nXiçº}õ]tÛ/hÙÓŸ ÕÎ Ž¶5Ö©t( ìÜÔSü.W?ÎµÈøí“²³bH&âd¶¤î¨rÝøùn5¸œ½ù aàyj%4Y5rV¼d·Ž¨ÐÚæ-…Ÿ|äÌ¢\k(l.²UóU@1ª~ ÒâðÎN,N"b4‹–"ögÖ°¶ ¯˜GN\*ôtVæiÚ†¿œéTœG Wêwq¡§N¿ÔTìž`|K>N=òÇšÆ$O†P’1†‹!.WX¬¯]Zøe?O“J$ m„g̽D9Ê%¡[§ºÂ†Æïá<¬p8*I4^X‘&‰;+Ù¢L36’ˆÝ=q5iÖ˜zÛY$ðò}LuNè0Øð˜?Ûh{ÇÙœíÕÃÍ[¤ˆ‹ ê¦xì%¯[’ýqš—azÙµÑår± ocÏâÍá=}/f %Vüá ¶Õ-Ÿ5j*ôþÚjÔXþÝû“Žrj•c›ë\7ãD˜‚³–‡:P%¹]è!\î†úÌ žünrð|¤»°·nð^€{áôY°“5üÎ]ì|ü'b»Ê+Y™¥H|æËr[—ëŠý óТ<¯q"WFº6UÞÛHj®†¯ž¿FùJÙJw|?t?ƒèìc;ŽüÊDFɘ¢é¨ª§R'³#l~¶ ¿mWñhøÝÉJGä­•,ölýͺŧ¶5Ѻ -Úù)`KÍ5Yæƒ ê¤uú©ú€êÁÑ 46kWG3¬#ˆoж£…›¾8:Ôꞕ޹!>â8¤8 FXí’^¬ý!HG¦¦'}ˆ I}ÀŠV-7º‰Gò…½W«zZĽ ¦~˜iV!0-‚œàM]ìWuŽeó/QóÀŽðÛºÄú^,ûu¢ïG”Ç^|-Îövz¨<Ô¹u·s?À¼ÊhOi†bhM}Oë‹7ÝLħÎÈf7©s;ùnȾ{Ž D¥ù®®—$ÃïtÊcÿš°È© endstream endobj 45 0 obj << /Type /FontDescriptor /FontName /IZNREI+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/C/F/H/N/P/R/S/W/a/acute/b/c/comma/d/e/g/grave/h/i/l/m/n/o/one/r/s/t/three/two/u/v/zero) /FontFile 44 0 R >> endobj 46 0 obj << /Length1 1606 /Length2 8745 /Length3 0 /Length 9790 /Filter /FlateDecode >> stream xÚ·T›Û- ÅÝZ¤XŠ´x‚KqwwŠ H‚»Cq/îZŠSÜ¡¸[qm)ZÜÊ£=çÞ{îýÿ1Þ#ùæ²½çÚsí$´¯”Õ˜EÌ`&`IÔ‰™•ÄSPeå€@ì, :-­:ÄÉü·VìàAùþ æ6vz²‰;=Å)À Yg+;€•‹•›°@¼ÿ „9ðÄ] f€, vD§ƒÙ¹;@,,ž–ù×#€Î”ÀÊËËÍô' b v€˜C ÆN–`Û§Mmj0SØÉý¿JÐñ[:9Ùñ®®®,ƶŽ,0 Az&€+ÄÉ  v;¸€Í¿ mÁ1cA§¨[Bÿ²«ÁÌ\À€'ƒ Ä u|Êp†šO‹ÔdäJv`è_Áò0þî €•…õßåþÎþ]ý“llj ³µ3†ºC sˆ  $)ÏâäæÄ0†šý4¶q„=å»ClŒMžþìÜ )¢0~"ø7=GSˆ“#‹#Äæ7Eàï2O]–€š‰ÁlmÁP'Gôßû‡8€MŸÚîüëd­¡0W¨çßÀ53ÿMÂÌÙ¨…Ø;ƒeÄÿy2¡ÿÇfvp‚@ n^NØv3µþ.¯înþãdým~bàíi³˜?‘{CÌÁO螎Æ.`€“ƒ3ØÛóŸŽÿF謬3ˆ©Àl¢ÿ§ú“lþ~:|ˆ@ô¤=Vè÷ëßOúOò2ƒAmÜÿþç|Ê ÚŠÊŒ1þ·OTæðdfg0³q‚¼œn^€÷Wù7ÿqÿcU6†ü½7Ð Ê@ÍaÞ¿(<õî_4\þVÝßCøïaORèþ£üw NéÓëÿ³þÿ¤üÿÉþw•ÿ›òÿwC’Î66Ütüÿ·±-ÄÆýï€'%;;=M…ìi6 ÿªþk’ÀfgÛÿõÊ8?M‡ÔÂæßm„8JBÜÀfÊ'SË¿$ô¯Sx*o‚•aŽßw €™úßÓ¼™Z?Ý'ŽOgõÇ~§ÿ^Rj 3û=wlœ\ccwtГ¼Ø89ž¬Ojvû£l szJ<Ñó˜ÃП((úÛôqó€JÿF<¬ Ê¿ï“Ïô߈õI¡@ð? ;hñÈ Bþ¹@ëÿ@Vý|*ûäþŸJ9þ>mØéð©²ó? èòø´g×?ð¿šfêìàðt™ü‘õSGÿ…ÿÜ\`°Ø}qfú6Ȫ&¨õú“©+óΘÀ4íŽV =³ç¢C›ó-6J"}UFÀšÃ¥Hâ—nÜå- º á%ÊÏŸëPBš?¨´ÜyÝÆ©Nî´ /Löü©í#G#cVÞõz°÷Òô·Fø ß!K›cï̃­œGpíÚ+åVÛWúu$xnGe·ŠKã¾tŠ9J#òÑ m®Iæ,1²39*þ‰ÎÌÅå4~öø#¥l#º÷A{¡§î:[ôͬÇJ¹:›c' ‰.19ÂþÈäkOÑoI²DóžÅ#p›X†Ùòd3õÂÐd_ÑìøõxZÉu¡ˆ\®‡¿v· ï^ùy#£žxH¶ŠÕ¡Fìj½×‘rëh¶U!ƒ%|Ác1}†«{Ùáu=ë|(;Y”F1ñõ¯~~áüŽOS7«4Ö›ÉÙMm¡ «ýÄ"O¢/Ì¡‡§^TO{MyZ(Qj)/é«r*w;ÎJz×n² Q„!êÏÖü¨·Ø¶üבs’ê ›wãš…Å ÒÏ6¨·ç'Ýu¥ÚLO#_©ÒÞH¾ò¶°¶çÍ”Æ':À"Œ»ð¬xŠx†^ ^«¾?¼yžÔýzKkvÿ‚ÃÿÛ%ƒÛ¦åTëGH=¹Œk’ÖP<–8Ï܉»&Ñ7—´ÉÊ –û÷÷°‰•P}Éž¦ûµýf­öÈÀS&õÚYJ“T£U–!usdR®[<:³[2U^8a~úÒ¹ûü_LAdj‘®üê³-ŒÇ–T¨>ðŸØJùeÒû’MoÔâ¼,ï6C!ès«’€¿c‘°8ø9Uw´—>¦ì¸÷ÁÖ¢ºª5£ÿhÉMB-&5á¼Ó;Æ"VØü³"t;}Óø#1à3“Nwì“?m«A×̦wõ`ŽF%ðyÞ³Öë]‹=Š6åƒ×0Çñˆ&ÿŸá%ú”+³6gqïú1 ?Äy†K ^ …ßà¸,2 ~Áâ}Ž?pï#Ü„aŠ›ª?ª/ûrx8º­N=çtÁr2O!Ut‘ÆF¨Øb|!af~žçHœ9+¾ŠJ€;Îìén¨Òüxœ¼m}Ì=ß3ÜûñW'¯z%ótQújI1s –Z,-çêæ€ÔÌÇ£÷ ßÐê D«¯ÂGß‹¨’ØQ[¶¬ ãaïwlÊ®…\t(œ_.ziˆ‡¯¦–ÍF0Œ2ô-žtM)»Ù¶g}r Ø±Á3ÔR'yÁݦ$ t~Žéz­Íæå£5¤Q h4¸²‡ìÿ¬ëêgPª¿-Öû–ÏÚN1»%"Ó.WH Âzúéq5À¤Eóax¢ºq\ßÿË'xd!’÷‘ú )ò»¢Æ’,ì% »±ýò8YNβOÈܱþRÒ¡ãbtþÑ‹ÓwKuïY˜s¥ù×IPGIpÂxZÄeWuMj}¥f܈”^·!¼ÿÒ§Ó¿%°Ž×?/²åŽÒDþªi i»&Dé{{Y”f=Âry|·#þ‘TL¼Â!¬-à7Énú³åq…§f¸nÕšªûÚBr.§Åô9«GsÓcâ»7ù qëpšÄpª›ìw9ºo¾;#F©lãõí?Ê+Ôf˜¡›Œ¤¶uñVÃ79sT×¹·”É_÷¥°}¯o¶ÒÍ_‰ÉñŸ bâ¢ô"&BàWþçË,çÏÚcª°³£"”½ÕÌJ͛ٗ…F4@AîŬ‡7V{2$ÈLa4Ø7޻ɭîv–¥é¶za­Šü7Še[ïiß…Ÿ-Å¿g HЗ2Ð+'/êå[ØÔ1Ì©­ÀÝ ¸¶fèÄÆÛ¨h͸3<€éépl;Öty£SyÙ»wm01+9ËßÔ挩Øu["»!ÉYås#ÅþØÅO"ˆåþxŒ¬~"ùؘ>"ý.pÀ¾q…ä&@*±¾‚H¥E™buV„KÐXZà§œ5Ý>(¨¿Ñ&ocò_·¹5ìàh?Š¥e7)…hËoQu –¤¬ä"%!#ƒ ( ®œ†:“ö m”7¦0¢ÕŽ÷V&ͪ“-ãF9ÉeTcÞúı”xñAánjoÙܳŸŸÌ¿Žè….±í8µZ!ùýT)R›;<¬;¥;–­›éYù)ã-ߦ¦×^qk)—¶öíC1|/ùQÂ~ED2A6KQ97(Û&ÙJs<´yª,sÇä6Ô¥ÈíÛóU3Åí;ÎJSBìû9ÿA‡Eœj+˜5¢HhCs}*å@èË8ÿ*È[o…;}:—Ì·jãÝç:WpQoâ™+û¤zΆÆ›â´ïð Ì¥’ý…N`âbŲÑ{Œë·Ø“i6/3R¹ ¹ Ù´ˆ^ËùÒxMÌ¿an],=„ËP­†9ñà¡@^YÙ!1n7v° 6óWgµ¿Tù¾ê>Uè‘™à,Õû¬a{À¶]|å ¼‰ÓÓNþž*ã¢ò!Ÿ9Ï ~¥“¾õƒÀ; 匂ò„ÆSwúƒz\"´ÌP!½v‹Ú‰_#¨Â~–|0ÃmƾVxȤŒñÝ9™¶K ï$ ô¹£{Áé>*‘0®WŽl3ˆóÒ ©³½Sy—y-7JxURð³žîð行Õ/uƹéíPԻ׌òJF½Øñ4\î‡p¸„ÕÔb>u‹‚#lR'|É7yl;!Þñö’ä'›Ùpdáš üíGÞÑéb—¯!Êoñ—‰’o~a¸³ìt=Ã1©™?û¹iµÁ? o‘vƒ"[+Î.ßd‡n6K#œFÍÇЧú. ^*þÐÐÝ¥˜©Bj½^¶¬êgÓ|©ã.”¹^<¼Ø®PzÿœÄ…ykÉ J\8ÅLŠ‚àߘ,$T§‰eS&¥G•9*ö–¦Ó7·¹Ô 逮^eª=~г!xU½ì¬Ó|ü¦é<ÍtD<„W¦Qu:ïJ(we…¯$Dó*FP_Õ‰hïÉôk%Ë&ýšP|Â%´™çMKgž9ÛTÄ΋%]÷·¯@pî2ZË8ªMQ8ý3œ¸W†—³sí›l‰‚#'Kø\µ™éÛÅÏðée3eïEäqÐìÌüÌÆ3OØÔÅæ/T¾Ï˶!¯ÑRÞO8ïWb½²3Êê2uÑöcBõ± ƒ¬æPð #`""Ö?ÕðJ=­Ä=T“t] øŠDcõ¸ªqôäþËo[©'×& ÙÊ(WŸœ[ÛM½}¤åÊæ¾ þQWrI8D§(@7 ïšá É:}nüQçc ³2¤Ü‡s?Q>–Æ«ë†ýn3É]`í|°-&wöÞE÷ƒ„rsØ‹ xâï8æ‘ßÏ´'Ù6+ö¼ Öuë5`R:3×j!Óà2ñ&?ã7g›]˜jX¡D sÅŒâId1¡úÏëŠ>˜þtäõf’üüý qß.¼Z1¸Õ‡ÌM´ŠÃÍL·ŠûüË¿†`)7±$ Í\U­H‰åôÚä'p«|f²)h†Ü£‡)SááÒÍ×?¤Ü>wé1ß`’x&SzÐv(cvŸø‹þ°µs’Ü4ŸëU©?ùý!£_vÜÄêìU\Í‹í’Ú$K¿6Ý”RÓÉF ¿Aðžè8¥xetJ˜ßnþ评Ù~t ;ñ ««òM€¿gNÛ.U4<3dšóK¯Ãv߉¢ìW£ÆžlDóSÓá‹Ì÷ü(¶׌ê£È¥«ùy›g#BÉØ­iÍw?ÊÌ֔ЕóV'sàPôÒèmMhz㵑íF±‹©±]êöå@‘F-¤ú­"øelsŽ(öaD¬Ï>5º‚ ZÈÑU„$1ËõJäkVS¡`êt¢WáË¢ÈÕç¿ú7õ‰æCø†¤x ·uâö ›?ïò JgTdMpÇÒ* ÔÓ§ë1{¬ÌN€Wuh.ŠÚÞ°ÉSôáòÓmDJk˜/§ÃF³2§†öÈÜrÛ_2!Ut‡Ó4Ðígë©hùËwˆØÖkïØfÄãíŒÁB Ç.9_é”N9y4NVEσ«uXy{p²go]|q¼¼lËVknnÇ-ÍÎ…WK/y¯.u3êbx¯Cs’Kø"ƒ‹xƒâ~4x¦nEˆ´"«ÙjÕî&ûésRE<8H¸,î„RßÒ‘-YžæfôªwÚ¨ãÊj74󦶑ˆù$ßrˆ†žÚ–0¦¸[盓 .1údUÙ¿RyqìdÏ ÜÒé|Šq!»â>º_?`J=˜ `)9º‡÷”N‹„‡ ü˜ÁbÌ ˜Í…ò¨ÀWò¸+#uÞžâÐØm#aX6÷;ç >‚\jÌp§ÅæáÚ(̬†è/JÇÒ|¶é·ÿ´•€ÑŸ%†òœ¾ÑÊeÀ5š%N|#NÙh'W@”\É«Óh†©|z&YŒ2¢„rx<¡ÇýìÖÒ~3åþ¤F ËÓ_¿%ac߈w°AäœR^˜´Œše,èÕx¿9/ÃôU|bî ¨tž6Ù'Ž03…Âîì>^êðAM–Àžø§m‚Ö§” aêÉ…¸_ºï=”Ÿ‹”¢"gïôë7Ôx»› jöBŽØûTž5?Ž˜µr©›$p¯lõæ)¢ ÐgGC§hïƒùUõ‹Ì_I :ÊŽwŒŠõ^vP¶#r~ýõÁ9÷FbÆùBf’bané¥\ð/ôãàñø2ŒàÂá î'Vü¹üˆÓ×) áD>ÜcÚ.›{±ê €G7ݾ•ïÏÏÊÄWˆŸMüwÍÀ8zè{’–àÂo½ŸÊ¥_ïKŠ/„c¬'U+Rn±Ä<Šu¦<[¾Ô FL4C;_ïUË’KÅçG£”/]–|ÜTœ'ïVèÔŠP±uÁm-šÖº¥ È“‚ަã[©ÚÏY¾þ²« ùn$Qe†®O '½öVã¤s Éñø1¼‰:“f:ÈfÛ‰p}j5½Þܹ澻u'ÑÆ@ø M*™üÜóÒ›¥ÖÀ@ºÛùWuZ{ݫæ< Žuä+ü’ù>BòäqIÄ%ô±Gz»µJs¾àZÝBŠ>ãEùäœç‡‘m4…D¦a"­„éN*j8¥aÔK:ÒL |Ø‹î@©ðICI îmëúÆP{¡&8ýòs0n1̾~õ3Içz‚6½Â=Û¾tù¨öBCÂ7a·Ù‚(ÓzÄå=³cè­#9ñ8{Ëeöþþ|ë܈V¾÷<³.ò}Ÿüî,ÊÁ *Ûks4:ò@¬ÅEu2šæ{µã†ØÜiÿE²Q?¶ÌðmÏðxF¬ð2EÑURšë¥#¢Õî„ Ð]6kš^û §¡÷ÌxaÑtm-ŠÉúàL&®Ì¨]MfÑ,ƒ¶þüå’ÍŠ EëeÒ@‘)Gþ»i…’ŽgÄŠõ7ïòÆÅë0õel‡“ LñLÃöuD¸¢‚Ð5ÇKkpF ƒ {{°å Ð)øX…>–b{.°; ½T|Ðfÿ0³ÿZîž\0Šzæ…I¥®KÄdèêp«ê”e÷%à‹ µaâZJ§÷2¼¹Å7œÜDs¡;>|Nsñyó_—1Ã’\eŠñ…„(@=óÅ7#1#—ñ=Ü‘– 7’è‹aƒ¯{qP.Rˆ*‡È ÇÁ¸¨8°q¹d Zc L‡SßÈÿ<™öÜìB Ø‚×ÈÓ¼}-.þz8äqŸˆ€«sŸbÑJ¾ÙT¡ÇÚDå‡Û“Åj¡¯¼«Z ³9=[¹Ê=’JÚ.¦úøpl‡‹A.eiZ}=;â¾ÚO®-¹®WG„¯n@fµn¡"í¤¬Iy0i òi{8Êpvòšý$ŽùÓÁ…Ž4ýî/ØÝoôÓKA±kžMäIJè˜yt Š8Î8Ì”zw£µ"á»ëïïw¾Ù]Äœ`Ì0Gª|”íŸ ¦3šÜÈausŒß{ÕÙ›êçÿÎùÕÁžz…áÑG›ðTˆ†á¥\U–O˜‹|¸iÞgaì+¢¨ë_Á¿òñ –ȶœâ`çd7‹r:ÎqßB*CùJãŠïÝÛbæëvKŒAc6ÄU{Ló/“-²»^/ yÌ£‡mØiŸ+•g*ã‘foSNÛ‹‡ÑÓpùM‡4¯sE}-õ<¤Tã^âî™cø±VXºìLÿA v¬·ï4´Vvmv©Kí- ÷ˆN®æxôk× »w›0"ZR“´ÖÛ~÷v8AÙè=IÀñ½ö«†qVn0ie¿Fßnß‚{O—D¡i©HV]*ˆó‰k}6¢º`G6rº‡†úÕSŸ±&pæx—«~¹ÇCR‹BE&)Ä¥5 0áÝݘ@ÓŒšÑÞCËV oSÏEÈBí'Ô…_u[ã,ñÀM|i˜g„Kçðg˜úãñ¼!+h/U^ËŠ- Ƕ»oõÒéë}GdW³Ñk^´¬Ý+/#.a—+ºˆˆè u Y©a<6¢—¥`u@k¹Ö»¹+;’†°-ÜB3J¶X;CðîTZ¼®ÜmuŠ>«~(ÕÈ1Ë|3qÑÊg_gãûõjmØIãTÉèèl¡¹=±­JE›od(Ušƒ•õÂ=6ý{_Ìg\ÏI/Út!·½ç‰´(Î’À•[¥JLƒ$5K„J†N/Å×8Yå טEã¶>B“w?*õÍ­É”Ø^•£Ùkmc¬Àwef—Ê®sY r@?8ˆºÏÊo2ªUEç$o¢ÓéË$"òwøË]³­®IuÎÞÊÍ(âž Wî pcœ:À¿²Ä &qíC/Óý²ÎÛ¦ñA',)¶\žŠ_ëõÕ¥ÕÇ1ÙèÃëãÂÂÌÑîWô~½jú2Žg/Ì5î”ó¦ïúÇÔÇW‹ÊµÓY ¾k¶~‹Á¶üA J²aùEÎ *Vöº¤Cç×_¿]ç´ÉTá†28|ß>Aíß;£ Ø.› ÑçΡ”qå®aôãYå€Á!ÖU?í¿CúØÈh¯_0“Tî4ê§©QR9kX–RuÅìø3ÊâÃÎÏé‘Ú,sbèGÐàFZÊ㮢ڲŒT©'ô;ƒÊŠ›oߪßëÿzª? Gn^ÉXtEÂÉC½U­ª‚x|Í]~p´fþÄÐóíY¶Ô8•+ÿQ~,`]Ê´ï£7J—­4覛bÈðc¾.¬ͦ\å$ÆÀ?#ßÜõ<Ù&Ë>/­qØÂà‰óªøñ¬œN0!Ì_¢Dà‘™o“F'¦§Xö¬ŠwÂ^‹DÙ•pÇj¿ÿ^}J@a€?Ñ{e5åËO4ôMÎ #%ÖÈè–UË.ïl4“´áSžuâ^ó ¶[á9ƒ³“&Õ<…|æÚ>yòÀøÎçtå±*–0¾Që¦T¦É…’/Ÿ¿M{Wwx}ç—M—ä]¾gx4졾'íÔ•¼Xï~½ËD˜1d=r +£éåØY‰ø̵Eó²jákh)¶ê·Ý¹kçuN©€@5º÷è*ØÉ¶#ÔÒÛŠ*'eé*8].Ã劂^âê™$ÊÆj˜/É“¨y©S>!Fe¯òÏU1GiŠÇá á¦K¾l Ô`˳h5 ŒNh2Pž¿÷bˆÄÁˆÏËÆ‘ç^ 9–a¾:‚7›/`šü@§¤¸õ–áØFÍap$JÃ0ÞD‹.sŽŽ¿"x3ËíÜŽÊ郗ÑlûÛ–_µ×Ï•Š³p´Èò¶ç£ß6±Ðšû §.õøåÀ¶þƇi‘á’T®Í\'.ˆä%èì…i@ ²"±ÐÌwTN²Ä‰öVQ¬&ÖõÀ:Ém˜. ÿï…m1yþý‰<ìg„M5;»þÈ)-ímÐÛzÜp²—+PÝø4ŒÚ¼Py£néw¨Ì«5ÍfÉžËlrÓ‚€¢~µî í`/¼Šìulù+gLŸÖg!ù˜ý[Ê®.óéSu*>‚Áçö77Ž¥¬í™Jp½_ì)RŠv?W¾ë!?Þ#Þ¢’޳•,ª›N )¿nËu™õ·©d'ü†®v‹¥E/kÛ‰TýôÕ<àš.-6~O :ÆV½¨×uÔSy Qäú/pŽÆ`Œ©LùàþºçMY<¯Çlr|ªGõÅ·œnæCPi¥–Ô³ÝÃëb®Qƒʱ±é¡Í%Lýk^)³Ñ…·ßœì“ ºÂ\áØsN<;u°C}ÔÂî829—Xa‚#y­~ï@¤FEé=íט‹CŽ…_rsçF­sÝÄ쪯 1€¹ß_:`$´~ <ùÈÔÿ3+7dÔ)é3/ÆDŽåÁØ®å4/¼ñ)Z±õäýÉæÈ@QD½pëÌ#å›ó#¡ðøÕoL’3X7Ýš(^r~IʳyÙÓ?Æçß,Ÿ¼p#8;w ß Sl JðÊJfä*C4Ž^öÊ£Oo8hB;é\6G3;|ìºñ(ÕVÌõ¥5›ÒÀµYqˆhÐ_% Ss/(¾¦£Ú© (ùÚV¦(œ'd Ym,¤`TÒòÎ}çüÖ0Z y8ã. =NÇ÷¨2²…wx¸ípÌ6†ó G´ƒßyÌùÁâRûCž&Y„UÞÖuõ‹hÊÿ×îà endstream endobj 47 0 obj << /Type /FontDescriptor /FontName /PMXUNP+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/B/O/Q/c/e/g/i/k/n/o/r/s/t/u/v/w) /FontFile 46 0 R >> endobj 48 0 obj << /Length1 1497 /Length2 7042 /Length3 0 /Length 8032 /Filter /FlateDecode >> stream xÚ·4œk6,ZDè‚Ñ;£×5ˆÞ;ƒÁ(3˜Ñ{'JÑkô¨!JB"z½÷.|“œœ÷=çýÿµ¾oÍZ3ÏÞûÚ{ß×¾¯ý¬5LtÚ\ÒÖ0K° ŠàâåŠdUµµy ŸäÃfbÒ Áû±™ôÀ®p *ö„¬+„@úä@$P(»9xù¼Bb¼Âb@ €ýsÈÜ!ÖUn€2 †c3Éœ½\!¶vdŸ¿¬Vl^QQaÎßéi'°+Ä ¨‚v`'dG+#@f#¼þU‚UÂpãáñððà9Á¹a®¶’lœÂ †ƒ]ÝÁÖ€_”j 'ðjÜØL;ü¯€6ÌárGˆ G¦¸A­Á®dw€¶’ @Ý ý ¬ò€ðg8^nÞÿ”û“ý«ú;desrA½ P[€ Ä PWPáFx"8 ¨õ/ ÈCæƒÜAG%ðûè €‚´&„dø‡ÜÊ⌀sÃ!Ž¿8òü*ƒ³<ÔZæä†"àØ¿Î'q[!çîÅóçr 0¨Ïß– jm󋆵›3.ââV’ûƒAº°ÿë³#‚@ PÈ»ÀžVv<¿èx9ƒy¹‘ü|œaÎ$ °ÄŒüÁöƒÜÁ„«ØÏçŸ[ؼ¼kˆ` ¶…@±ÿ[éÛüe#ïßâ 0"åÇ þúüçÉ©0kÔÑë¿ðßWÌ#«¤©¤ôŒãåÿed`ž.!^Ÿ  ** øý»Ìð7ùß^ äÏáþQP jˆþÅ9¼¿y¸ÿ럭aü»ƒ )g0€õ¿ê7 ­_¼ÿÏ;ð;åÿOú¿ªü_Õÿ¿'Rpstügý ðÿ‰ƒœ Ž^H9»!«¡ C.ô¡úà¿öYl qsúߨ„\i¨­ã +@<ÁÖ„•Ý_*úûå!P° ùõÆpñÿC.•ò­GÞÖï¹Sÿn)µ‚YÿZ>>A!ÈÕä… D*ŒOPàËÜRk°çoqx¸¡02€¤ç°¹bÿºS!!Ì/×o‹©Û˜‚ÈM¤Úx ÿ0y<°˜×˜È\ø?Ld#Äoó_ç·rsuE.÷o!Éýmÿ~“€Áž`+ì©q˜•x¨}MhËEµ4•×êÌ…¥Ö¨xÞHAóD®Êýôg#.2Öä)“¥á߯}©Ø÷.†Q$d*7ÀQ˜eÏdKù÷G»Pr>cŽìàúYjvhf¥¸£E¡Ýÿ`e€F¹­WŸ´G«ÒƒE)"S`óxbÉ}KìhF/éjŠ«I~8(.Ð5IÃÒª]PbIäû"fô¼—oCÁ5Ÿh3»žŽÎ¾*H_‰OzMàó§_þ"a1o>ÅwiÙ›ÐGØþÑJ[ýçÕu,JLÙ‚dÙ/Níù4ŒE¡Á)§•!SŸemô×U™7Dõ?ÉG…È 6ëã3î ÞhÞƒãÔK£õw b s›û{Ï‹ø…R©k^ã>&“{¼Ñ&²·Ušç): Ÿw‚@óÙÆvó½ï,FÍÛ4oUáýBð”2Ñ,óJ±?0†/ÊÒ“´º®;ÿ©ùòÓTï¶a¤óÁS¦óÇ@fNÜo–÷f[´*géÓ‹A-=çWÆômíl›%Õ5LgKæH‘æG¾"fÔY¾ä¿-ÆŸL¥œC©ûQUǶGu+Êø#cÅv+/ª!è-ä$êàþêPËŠ«ÅÖ»òÍ‚g‡€Ѧ^àh$†Ÿóžt“GPXœ×ƒÀ«qÝqÛ&éc³Õ¬ ]¿¨Ê®:>úbˆ9U –Õ.¸ÕÙ.å€ÚDVåSŸ½úÔ]7ÛÚ;¯û®ÁY-.ys\ä!økÕÞ¥ lŽÛ+„I§r\:êM²ï×vX|Ô“ô•³Ú1$ÝÚvÇû‚úb™‹£ÕãÇÔô†[-Iµ1ßb&Tõð21q'ÞM´E¥¨¥9ämC¤½rÉû ‡Ý·ì…ÖAbÚŽuð‘l¿EíW¨ ÁDZwÁTîŸg˜7õf E¨íÓz½=¤N[ò·€~û³'L²äYtÄР[¦tñg>Miýç¡.ÂgBÄïísl(¦¥ä2ï³W y¿ìן8¥ï…Jb‰'V†§®R¨Ø+mŸ™ÚTt>°0+IÓ,¥JcÞ%”9?›/[@qPîß²"#ñß­M²üæ5éÐéÛZé$óbâ n:—¤·b|7Úm ®Z©X°-ÀMU#Ù»E.ö²†R/ÍêÖ ”Ý/ ¤“Ø1æàÙlV¢Чƒ’rÄsŸ»Ð$¦žˆÚîÝ VbIJuOB˜Ùž¾æóLsÅ“Z†òI²6lšç?0õàV®Ï=?H~Jng¹œ¥¬ƒØ|L”0žKCÒqhÉ·-û‰fjSÓ ë¡æ3í¢’aä©ÙÖmU#eïe”Ò'8ø3,¡Jó_,Bw¯ˆ/N³^Lìbʼh1 ïißo‰ñ0€F#·×ÆEXŽ%>®JRlŸGÖ *“ùò‘F8¢ncìÜ@l%isà‹Yd­û;ÓÌ×Jž¹´uÉzÝÃp|/œ>`á]Û£öèdêlßßôä2 üË1™ŸcÁêöjº:¥}“8ù³mìÕ•O÷©f€³t2l¨‰2a •Ä0OºÎhŽrÎ*¦!Lœ­M§Þdz5CBpºPFi¸Ù,÷Ñ`Ib´ÿAçyœ4NI‚€Ý´Gûȇ‰¡Vw* ÍIéÑíñù|®è”¡¼‰êm*¥Ñ7!¶<êGÝ$£rÑÜÓ—Dn7Z„!j×£°Â›0õ”„‡j^UŸ2Èõ…:#h݇T ïl½„?;t—ö*¡Äµ?NFï ø…“…«dá©•žö`ైðã²!?4½®ÁÜfçîAy®ÃÔñ;yŒ"q{äÆ^ñ‚pm§zÛ½o”ŒØµö7BÒ¬MhîýØí”2ˆÅØ_Œ‡SɾÅ{ÿ]ºzs€±§æsÁÞdô8^û|ƒà {×òWx[¢¹ÚƧ¾Eu{ùø6µÌ-Ì´"“7?ýø+ ûF‹»t:*=B¦,¬gO)Üj|PÊ]«ôS¾›ñrH³³~%äa[ÔÇö|³œT‘<^Õôê&¼ä¨2U6’/éÖk…î†SvÅñ¢`:tTøãì^±ÈÖ&Vx{Öž†9{}S˜³¾Î ‹µí·ðÆfžý¾¦Rv”Êpøðºû;§ÐsÂgÛx©ïjƒbqYD ¹„2ày…ïØÌ^‰gnñ‚ÍV,$ä›…Ш¡ùfŸ 3ÇÛ|tEwlúÆ0GÒÕ*é)²!yAÈÎqÿ&ÅÇwÍ;Øæo 2âjwj˜ÊÆQÀ~ªýBÔß“ø S«Ü©_ˆ_w7eœ3t½ŒÓo1¨‹8R .ÍQúΙ7.ɺcyÎGÆ‚ÚöÞ¼|Ýo—²N\XYûxèé9\pºì笥»‹•Èä*M–šf¡b܆]iPË«Ú`p¦CHXçfù˜Ÿ£¶×wp.wwrÇfñN÷afß蚡֗A¹Ø™Øø‡eü·$l" 7]ì‡ä+üı-ªzd„‰}}aómTerÌã8` á'ŸQ>¨’ úù‘TW¨ ' ¾ñs°¹Eoi^$wÓ]W†žQ×#ŠpÞs¶ö ¼þªùúÒt–E¦}=iFN­÷ÃãÒ€¹jTâÆÙ‹À›= ÈÂí ãlŽ„6Gò xËX§#N ÜÏWåa©.7¹ìøŠgsÛ¶à†œá¬¿‘½Éª ˆ?„÷úe|“'Üïl.µòQ›q~UIBa—.6ž5ÒaÆ!¬v‚˜[zŒtL '1Ùdï.†<5Ϲ±c6é:g\°ÕO«4ÏBYqÉÖÛÎ ­þ&Ôt—VóåCO¿øA²|†/)ÄØöi¢Ë\e«‡¢hÉ|Gçßû<ø5¾Ç+½(ÊŠ“;Ô>¨Å£,ÎéJ·´µ"/è~>ÒîC8¬À~LU*ðåz ±¾åE8på7o¢Ýíßçå e ±a¨™ÓU—ßõj’·IÙµHÂ0Ñ)JüÕ“÷¶y”Dn›KDÂïù³‡GuÚ{>,ú‹½J*êþ™ytó²oŸñYkÀuÝÔ…íÚ¬þmãX€Ì–SSœcyìÖ’ìDe3ã:þøÅ7žÙfôph„L˜ƒn—xºIÆR¤(cž¤ ÀR:kM„3QwLµlÂ:y—XT8_•Cu .ÚGé¡÷êÖõš$KSZ&äˆâ0öò¢Á>¼þ…W7–ôñô$iÎÓڣǾ†Üòc--ÅÖ›!ÎT$Æ?Óc¸8øÔÓ¼­ý‹iüµ^LZJ©fš¤<ò)IÕ2Õ±®ªa@ÿ³‘m²3[è–„úõ @—eñCÛ´FVïõ§¤>ùµ¬~=ˆå£¯`e0&ÞÚèþ›dAÚC>û>t˜ %31›Ï±6úöZ(/x%5¥{÷¢(Ú`¤§ÙU‚øES@/Q¥Ú‹rqöúèîiÍmn%ûS$‡$äZ‚ÛvšÐ膔EŠ‹”¾2Zôq£“ÕïÐ?Œ™ ˆ2Ɵ⦓L8’uÌzž,cÒ"(Î(ëHÚHÀ8`B¥¡„± Ê×x5)i¦êüà2y|ùó:4è­n¬`2'NÎŽqx…lDçGÂhªK®—€›ùVŽ#½Vnéé½Y·-å^"‰ÛáÞÖ³RmÏJê+Ja­Rf3ð…騅éæ0þ ²ù¹ >!_b÷“üv¿ðŽfL‘EEYü9¶!i:_ý„Ðñ*õP›Ì¾ÉÊ×]èE¦È4‹—bCdƒÏ²œm-îû=CÈ#1V‰ '7zEhV#{X<ļªrµö¿+^t‹.îÚoHÆ]½ª«ú ‹í«\S×oœÔ^z¾#ÔÙî!–QÓfÝX‚s7rç×ve=é˜|ÂÜÊȘ֩iér]ÙÊ€OY3™»·kª.I`KTfÖœd"×1øÒO£E¯¸Hfˆkü­>r\»Tèç´Yì›C‹-Y¿.†ZG^ÛØÁÌlþê)±"ÌWÌ/òßèìÏm³]Ë æFjiÈìä`¬}?AþÃ6M7¢Nœ²uôôî’Ž©™²ÜY¢¬+Ý’?É‚ÈõùĬ!k Äñúìà , ÞÑ35=Uæª=?§Þ%ŒcNl•Þß"ë-4uµá””åñ¥Û|F—QÊé…=/‚+ë'9ñuŸükFhÊAê»öŸ­°ÈÒ ræ³ÙAŒaG·À$³bâ—dc,l4ß´I©ošÌhÕÃcH½ÈZyWÅ DKÖªèÙ‹‰4“|”vWxÕð¶½$ËŽâéÐé;J¯½'œ °“?šé–×Ë;èŽã~Ò[‹ìžˆéòÿTe’¸¼Iàjû±Ü{…ó%Ü(´]ÇÔÄÒUvõbié›'?Ó¶ä™ôš‹L:üñÝ ªŸ}ÊŽ¥¨ð’üÞjR©²®çž¾X¶kOHmµCß ¤™§>å x™çClg’QÖ韷â1öæ½Ýùׇ~íþƒå×=æ·šµoM«„uŒNn\™ (1ã?›|'ÜŒtph8~±ÄhÉ@ƒh'T™vð0$X7èF(Á(‚ŸLº Ù~;TíUI–}ÓƒbÛú,œxÀdÀD"2Uþåþ“3¬÷DµQe±t+m4`ÇS㜊ý´¢.ÖŽ›0S³×|”.¼:þ¸ñ˜T^ÞC"ÂNÕ5}Û.CÒ MAFºã/ÑOU?UÂ?}ÉË’á ?Ù-÷ñvÂÆ0/PÜnt;ûÌÄ<¤ÚäÃÊç<7fÔøÉêë¢y¿9YkÀ`€PF†h+ž4_A`82J²M{r$Œ@Á!y+[èîŠSÄíSÔp‘Æ–»Ñ›,m”XÕ¦»é)ù†ã‰™ÑÂÃÓ˜¼€CÏŒ-¢:]ÔðÜÅ|jF!¢ j›BcœÝfü ô‡gªráÒ"X-úÅÔ<9Ÿt»½âô†,äÞRìØbåß¹¡é'Ãb ð¦ç’¦/‡ËÌëlNÉ'9HJûpuqçÛ3LÚ¾ÌÖC­2–,ªéäy—7™¿/<3¾öŠë iÂìB Ôj$”9ÄÍ÷öátES¼º+Žb;®ë ûyÏûåuÁ»Ð^Ïó/ËO##ai°ù°Ä½«WfºfóÍe»<¼ï_Æžr. ãd>†ô¸ÑÄ&”Aw_@U¿ÚÜcQµFìwÖè]/jh¼ŽñãCKg*|† eîŠÈÎï5ëÉâ"Zï¥OúI¨oy Œ¤õ cEG7± x¹G“QL×çêti^Ð ~D• FpÚ¢KÇyä8ðn\H<&怵>ô΄$ÚQ¢»O6oÝÕÄqsš#šåöòò’Q1Ò=&6É9ÿaÆð|Ùƒ÷Êà úb'±þ⥸ „V'Fî‡@§‡Ò«ƒû«& Ìê|Ž]tŸœÚµP @ê¨õ•§¯*)ý-ä^`XrÜÝMd×x&[R]€VâTwNïâ@cÖËìtk5¼oÛ'Š’E ªÈÃ9«‹9È7*^çœ-1=õö 8‡ÌX?|m˜C¦¿¸õ=ëv¯SÏWTÑí§p™æQ+ˆuG¯Ê¿@龿É@{Òѣв çP„–Øðs¥qïë”{Gøöˆ&¥§Wß,\S@æ;¥Ðò³˜î9vùg=„u‡ø–o¸ ¥Ýö£ÎÑv¤ŠŠ¤ƒÅ2n-Ã…Dë±YºÇ׬óËŽ\ø§®n˜¾ k驯ÚE”Ü@ãîÍÛ t0~_{~¬’±€§R˜çØH©ô'ñ¡€ÌúLKÆÁÞF6E«óÔðŸg YhlÑzÅŒS÷ƒÙL~ÖÌùv÷¦¦ïq? “<#Æá…zOYµïY“<àáh~ ?ƒ^Ëۣܲqƒ=ÁÃÊnçcpÐÚf{Ž0ñ0_Ù¼í2,‚ê¾ÚåÜ8utV²@Ÿç”:Û:Šz3CHÒãøžÐ|šÖÅm/#ȳq°DÊå ¶™œ"hV¤¢D©lékÇ…ÙŒkT¸j$KL/£•¦*.ÄúyäY0•p\êvÜÖ*¢L¨p„ójðñÝÙÄ5Gx^w^TOŸí»Óè켺Í_ Ÿ7TpÅ_è/ÚøY@7dxeÓ|¢’Úõ¤˜>-I6SÜô )éîù•SÉø×DîfÇ#¾YÍäɬ[ê/2YÊoË5ÇÖJ¤,ɘú§ÑÑ oqš°Ðžz;lñù¦éj€‚I£Ì'¾¦¬c+t»Sv&I¬Áõë†Ø¬ÊG­Õå+òU<ýU€}#­ÎdZy_ ½NÐ Ùl8}&Jj†üYäÌ{B'¯Ô´â&÷þœ«˜ûA_¨KìkŒ‡Sö<ÜtÌ_ïžÆ©Ç~®Û“èáÜ÷AxTAµ‚ª¾r/5É>·âQAÌtÍ3¹kËÚ¨8Zö59ôí§±OQ9~ùžAÛJ¯XÊ ÓG.³¶7fô‰ïü6Ù&3ÂTi¯5é”õ汌?Û]¨z?ÿ?o¼  endstream endobj 49 0 obj << /Type /FontDescriptor /FontName /CIQIIG+CMSS10 /Flags 4 /FontBBox [-61 -250 999 759] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle 0 /StemV 78 /XHeight 444 /CharSet (/B/g/i/n/o/r/s/t) /FontFile 48 0 R >> endobj 50 0 obj << /Length1 1618 /Length2 9871 /Length3 0 /Length 10917 /Filter /FlateDecode >> stream xÚ¶TÜ6Lƒ€tƒ2tÊJww—Ô 1ÌÐ)Ý() Hƒ¤€HJwHwKI7|øÖ}ïýÿµ¾oÍZ3çÙyöÞÏ>k˜è4užIYÃ,Áò0(â·0@FMW‰‡ÀÍÍÇÅÍÍ‹ÍĤ A8‚ÿ–c3éƒ]áTø_2®`âA& B<ªÁ e7G€ç¹0Ï ann/7·Ð߆0Wa€,Èb Pã(à`86“ ÌÙËbk‡xÈó÷ÀjÅàzÁù‡;@Ê ì ±Aj „Øé!£È ³‚€^ÿ‚UÔp=<<¸@Np.˜«­8'À‚°hƒá`Ww°5àwÉuø¯Ò¸°™ºvøŸ ˜ Âä <!V`(üÁÅ j v¸•+Äç‚C×üæ¡ÍrPk˜“Š€cÿ¾Ÿ,ÄlõÐw/à_Ãu€Â< >#ÔÚæwÖnÎ@=(ÄÅ ¬$û—̓û?2[0 ÀÍÍ-È+»ÀžVvÀß t½œÁ(y~‹jðóq†9lÊûAlÀ?Ø>p;€puûùü[ñß›‡` ±B,Á¶(ö¢?ˆÁ6â‡ù»B</¹èÇàþýùçdúÀ0kÔÑë?挨m  ¥ªÃñWÉÿ(¥¥ažŸg|€g¼Ü^~À‹‡ƒßÇù§Wÿ‡TùëvÿЍµ„þ,â¡{âþ3XÿZ6ÀgP‡=ð `ýýM¸¸­¾xþŸ—à—ÿ?îÿŽò¥ÿÿÞHÞÍÑñ=ëŸÿ=È âèõ—ÅŸÝ»¡{Øèÿš€ÿ\h5°5ÄÍéµJÐÃŽHAmxþŒ‡Ÿ‹›ÿO9.ñ[kBVvréïa<äp„@Áš08ä÷»óàÅÍý?º‡Õ³rxx[à#ûC~جÿÎ+µ‚Yÿ^A^ç«+È ûHàÃó°«Ö`Ï?(rAaˆÀC~˜+öïÁ>¥~‹þD‚ ì?èÅsPõ?èA§þäuþAB/@Ð?ˆçÆ@ð¿àƒ­í¿àCJÈ¿àC\ÇA!Ðé?ðæ@è¿àCdØ¿ ?èú/øþ/øpÄð¿ZfåæêúðªüÁí‡~þÿxÂÀ`O°öÌ$ÌJ$ľ*¤ñ²BŠÚãÙÆ/ÿã®ã¨S,ƒu9J÷M­ Ñ«¾ÑÓR­ã?¢¯–‰vy ïë ɸÌ–|Ó¢…Éf>7¢ÛX®qúމ]ïÂUÝx¨´´[ðA­mɾh÷xœJޱ‘sºmLdl+ˆ2)»ødw€ÉRû“ e(6“BP%¤I*£©LºRjl¼Y‰~,9´—øD~û*­³ŸW`µk¶˜²’F½³óØYå4cGüíVÛs*‹ÀÓz›ÅÍkÖ ÓÆW¬–ð ‘L¥õ‘cÅãõX%mÛ/ŠÝ˨©¨2˯é—I}ð´dY5ao‘-ü5“¬›çÍ'ÀRÜVR¢@,&ÿ§cú‘üèÏ*®„*¾ª•½£ fºðä̱´<Îþwĵš:'>S<£Vú£ƒ]ã œÒMOÖ´ƒ‘ÞÇbÚO9š/ #*õrÛñq˜èð£Žnžî2éçÒø>ÞP‚d“¦ÜY€õ=D À]¤Ê}Êîvëë,Ø$ÏIW‡A´¹BDÇ$v[äûJ®»*½3Uç:åYaEŽífm¸â¸aEÒ‡’9¹hÄhì,Ó"R ;Øw.N8 ±»­_£é7½©E‰ ðþUùrÿ.Å1óÐ õ>ô‰^å€Í›(œ¿ál—X3+ÎPÉÒdŸˆêþçmþKQÊ:-UÅÕîgŒIÕ§jzÆ£*ìœtÚú3Zo$v‘¶°x‘ŽKJùž»å"öYøU¹ù¬jDZ}úiícŠÐYËF{%àšX!¦ —%ÑñXOÉU@Ãc…§c¸u»E?×_eÓ«Ð~¤&š½þPœ)¥™¨W³7ojeÍí±£’ˆt(ðSaQr³2mOºS±ÄÀcw5Ñîf eì ïôD¨ò¸:A´/ »¿  øøcª¥yo*vá´è®à'ŸÙç'K’wÜ;ü©î% R[YÙÜ’±!ˆÒò¤·Iœ]òW·ûÅÄ}`1.ûic™#<ÎeÿhŠ+òxtnX“U˜¡†ô ×ÃØºÂwЦöƒžƒ‘U`Ï—+Iûb?ÎbZáe ©çð4šœ¹¶û… »ØTí)Sâí|,ï„Ê|òRL»’¯²â¾Ó.Ÿ|·¢”˜¾·=éxÄÛÞ/jrÉ´”6` &pS"[bþ¾hýQéQ®AE#¢Ä4õʽy‡—ö Åòx»è=º>JͨŽ ÆYQYÍã-æ$‹Ûm»eC¸‚}õÓ&þ›®ÁTúQ»ýÑûš8ý/ˆÊì²’¨Ó0u‡‡£²¸hª2ÈOm3Ç¿jkßòåÌù©YùY´§¼É½}•¦PTn´…ºšNzV 1 gBÈíýÞŒt2^}XïÀyÜÝrn]4¢¿bZV[ôѨPü½ &èJ¿…°-µ–mzî&¡¾œÒ#D_χ,Ë~ÄØ]ܘA´êåe’ (Ò@Ê•#ðñ¢©%åq <͇dQqN¦~MÿˆTûü¹€pœ„N +oÝrè#Â8ŽÓ½æÎ>w²Ò°ª˜¥ÝéŽowúb¦¸zxä‚þCë+±$€¹ãKþpzô@M‘''d-õ"öÓkÊÁw—Óõ°LºèÍâ6¯.3Qb¬Ñ÷ãf¶êŽúÂG;!Š8ó׬¹$×´£öŒ\¯¯ÞËÌ‘÷Š¿´v]'l5ÊönãK”¥2£§e½Y(öJ(’(.Ÿ»†— …ÁeC(eüOh0Uh./ǹXååèç½­Ûõ[ìîМëWb¹Ó–³›ÿÚzó”¦!Jç¼ÿÑÒÐãè¢È’› …Â{}†—Ò‚U5+¥1ì˜Â[(ÏeH¼ÆÀ}Ù@ÝŸo¥…åà>Búz#‹8¾Ù­«<  Hö›!hªÍ˜Úì5`Î8Ú|v-?ä; h7àHñS„iu%ãWyï:¤Ûé E;@³Ô1k}i\¬— ^Â\eïê/ŠIÜñn™ë¤•#:us° ‘&‹-›I_ñ¶°IEþ£$W…&ºäz/€På„k»²UæÖgP­wqÙŒrø-£d„© NNéíÍZ¹SÍÓÏGvŸ;¦›¼Må H•¦³[¼çª·~¨ùÒËÈUxøIÿÈèlÊÛ.ã.ãcv>qå×vëVyëÑtÊ•÷wo9ŸDÀÞW §‚ª9{Ñš`RQî7©àU߇‡ËÉüÉ­û[‰ƒß´9ç‹Aû$0dYp߬‹‰·l:E"Ïxg« üŠxDD•‹‹÷ý„³Ÿ‘H¿‡„OrbPðáy6-›6SŸå‚àŒ}QVðsÌZ§Òw5.XýrZÏdhÂSTêÆïe_}:®1) Óæ#ï%½¶§3šŠÛjP‹ÐªÂJêOXW¯”!c-´qÜIoΣ–_P2+ÍÓ(9gJÛ±×Ú9 Ð+Ú·©ÏÍñs+õ x'˜7bùvú¢ŒE溶ª»Óµn·h§VÞBfŸÇ¼~U²Š”fóVÎïíœ<›¾ôñ‰¼Ó”àìÕàŽë§f­ä)î—ÍïF¥ÔLßÛLþ¨õ4} ©¿LûqÕ¿>x•3ÏÔ÷å–u´UWâ epÚ Éc*×gÚ(,tQñSÉÝöƒLì3 [1*rÌ2›6lÝÄ*9…°€›prð;%79’`˜„<µ-Θ@Ú7¸Pñ›øÏxt§# F®íAŒ“Ù?NT×[;/Iší„wíŸ@eÈnXÑ„ :Ðp]î;î•·áû:ú¾Á-ª–\Χ‹°¤±òjšŠ>Z^ŒUŽ_b;štÈüš\þ˜¼“Áâûl äJ:)€ ^ë—-H¢ÞÈEVñͦâååçÐ$_vpç$Ci¿ºg§³<Æ@þå\ËÁ‹2à¿|0ÜâÚË&¢,RŸ>±¬Ì[³óÝË”‹ç k ‰œý¹‰dR¸C¤Ö„¦‰eÛºÔÕµ%Ïá´ãšÄ7IVUÄN‚@ªP»i£ªÒf¡OìõæuJó#o Å h:dvØE‚×ïZ^~²êû²x¥®]äÒ€ÅÄ­Bµ|Ð͵Ö÷ÓR°C7'MÆ'ŠS“ÔmO‰»¹ëÑ`ÇôWÂS³ =B¥9ïúÂ3ë6W+UðM2¤–¢4yˆ‡3oŸe¥¬¨a<þÙˆâÐE ªûøXÐ1ޏa*Ø1uç8ó =ÂÔ½Yï¸×%»¾í5ØaÙ8Áò)ïUÀa½“¢}$ŸËmC‰¹&/™ïHðg^¯Dÿ€C•æÊ9?ì*ß|w3œà'ͪ˜Ø!i죓´<÷wãoÂOb NJz—æ/õ^Ö›áíà|eÛ>cˆ9õ­\÷ ßß~á%°¬Cy,›/tKî×/oŽ:Ùò‰ûÂj³nš£=ܪtáüÙ ¢#1à-àN¬Ö±v9¾ŸB¢îke*ë?[ÉM‡!~ 0óíæ5Ö 3Þµ¨i k7´šì·yäŸ7OÜ%í¿ˆ Ý/›«&K†å]{´«ÿ‚â'?om(‚Uÿ¦/jß#ºûÇÁÓWZ¡U{VÀ.0gŸæÈÒòi€ é»w¼.‹%66„ZAq!ß,ÐÑ象[$ªøS0`T‹Gì&V©»qN¨ª0/#"V{tµò/9 ßqŸ—’í33˜øš4˜cúsèE³íÝÇw8·÷!;ÍtU¶Ÿ²Ø´K¸T{4D"¦2TrŒ'ngÌè£(Yœ¢ H·l«Fo9½ß^uzG´Ä¢cþÈ/gâ¡KÎEêΪ­¨3 wvþHr:i»ò.­¹þúUA,)Ίc–Y÷Q»r¯mÆ=¨‚ :ð™hÁ·•®¾¡ŸX*¸8µ¹¤[^óN(ÒšÂF]þu”ÈÚòèeT»¡a,Üý©}@Z_¢C‰&Ž-Íð¢Z cÿäüµ¹©ÒÓ¬ÚoÉÞ;´‰¸ºœŒúE£B„öƒûsÆK5§ñ÷OîˆV›—ê !ýZ.e{3i߬†ÎWö}r3ùh½B¹UE&ÀÙ"ï2%q—‘²ÛbìÂgÈöÜ•„íàóô_æâU÷DFfëôiôàJ¹KHD§&e-5L ¬Õ¿Ñw€‹9º[.DFìõ­êi7i2gò9ü^X-ÎÌìM£„IšqVgp­ß¤s Ñ“Š=Ðÿȱ€4–ÀØ#ë—€Ûx¦pök+,f£ê‹ßàØc[†DgšÉYœ××mÏ+¹'­Sï¿8´!Ti¬æ€7dËzgñÂ:Ñ ïjwø9¾m47Gn‹KAœ¯u“3_˜ ïãÆ{ó²çtã8%uƒCE¯ ämM­â‰7t͆_rÊ/BO¼LmÍoÍDÔñ¼õÐ ôlO'î_0¸Šú‹Zé†ßA<"=ß'Q>ñ ØÁõ’9]À•±ôi¦ø„CP×&R¹–ü‚Øá[bRîzæ½Ê®ÏqÓÛueP÷‚A+ücÒ°µl:–¡â5Q†‰õ\f‚}sŸç<ô–Å€ÔL ¢Qp]î¤Mb² $à !Õð±•4šXOæ mº]ý2U—ÈÝû¹ÍAPïWdy/nèy'žKŠTo[â<Šìndý6¿ºt±ÖqëšÄÛÔ¹´¾§ ‰>/.…K¢m a´|8ï8ÿÒq9c“„Š(RÛ?ÞÀCšîãiÂÅ Ô´KCIÀÃÈTÑx¾ªID¾û-íiðrŒ:%Å·yt¢úCþãwaà ì gb>Æ™?õžÇÃ8T™Än+.Ý{ƒ ÝüJ\àA­…œZ«òåÚÍ N  ô–ËyÈ2ÕÆ{ /\¯_»–Áž#6z䪯ã µ.r%ñÃôæŸ=/ÏmÏÔåP"«îJFÒØPztí×9I©4ª®œ®Õ£ÞOªÎiåç^x)—j%²Ñ´j"£ò"1Šv7Ú±È<ÒxZ6B‰—±O{_M&}‰1&Üú&þà ×!Ù–úêòt7=¢ÛNúùAµ™}ýö,g̘¸¥DP•Ri‚F(? wñtUC¹ðð"÷¼ún3Ö5u|L5R8¬[ð©Cý¯D8…nÚ>çµV¾Ñæ#¥ú›íji¹mtåff×FcËGd}:]"ãþ.òBV= —ù%VV©”_'Óš­U»s-¹»Rú[£Óí:§«´ƒI” ºâìã Å8òñ3”k>"2,`G%+C'!gÆtøóœÉ4æÕ9§Ô(%Z,—¶ÂÚý T¸ª8©»3w›7Íà‰/¶ŠHj%fÑ( ì±8ªçëÏ7tW¤9qݸqÔ¥ÎÒÆEÊ/¦»£üð,ï×ø7çyçâ#àllfÄ…óhçó¢”Åè RíÎé3ë0EgJWY7Mü›/[´¶ü´£UüŽÀo†Ú¨#¾J6–!>ÙvC¸rÙA¦Á/¡œï|MŸ–Ëdq’7JO ë÷Ò³«å×u÷¦Ú&•/²[|–ø5÷33O3,JG&¤áýñ ›ê„œì,AÛü÷*!$BÃ2òQ±I:¦®pææô&Þ3ÚyÖÙJ}^‹(‘ɯִ‘'/8Oï4ÏÚKa•¡›^B–µüv†E3ðC®È“jÆžiï˨Ñ^gÛŠÁmÏñ»ØÅ”Íl ‘B²9‹K(@àøÊC´] €„óÌJ5À÷.-È©ÜMÏ<~Àª°£ý%¦â·‘Rá'Å4ÊÚ>Ù†Òê6§Ä{¼aÖôqYŸŽÙJÊWf£HëïÅñÇvä›­:fÕeIe'Q ´ÛðÄÑõÚdŠª”árc"A©çII*ÆjvÔ)Nr ΆïdzÎײÌE¨ÖÝžæÌ-8Ue&kA©Y™â÷ÍïïlŠ=¨-MÅ}-îѤôÊÃ7.jegÇ3}Ö½G²ÈEã'¨…ÈGaVfTÎ1M´óÑç«5¤öê¸g–«ÎOîѺ죂ø ~´j“£ÝˆŸÞÉeáY†Úàõš°ùX4ÔèÚ"w.œ¿buD{ú~8,Mzp t[h¶s7sì-2§?Ï|Y{( ä“d¢«œ–¥d]¬åô }é›ê\R ÎÞõ0­“FõZv–& Iž•æÉ.[ënŸ0fh60UÐÉñ¬,o3B§h™-ƒœÒ)À6áÁÎêÌßùvÕ„cÔŸ¿÷žàob‹ãü^,t€¶"‹ä—ØP̸Q5Ù°ý!œ8ÉD–­ŒÑÄÚRVÙWìÅgBTÃ_ae¿ß[fjÀUßÄ-ñ5-èmœ¿±=ªµPåÚ“MK¶å^Éå‹!9 ç©M‰ËíjY÷ Æ:yí°¿.ÅSIÍA²>RЮ–ÐïýØÎî4Oöð»éîyîù¾¿J“ûÙŽ’¹ÖJu¡ÅëJçݰ¥pzv“C7¨ÜEs…½äwgSxÛ`:I§|~!õ™8ÕoFµÏÃw¬"àÍ^©^:=>–Ú´ãü焉ëü|»*Cc1 ;^úCŸÊCgkCÛ‘~ùÓkr09 µÛµÖy¦®B|g”ä.ÍÒm=ò•(šjxõ`r9DÔ[õhÛÿgvk€t§x8_¡¹)¹3þWÃw¥‹Åw]Ë'–l0ò™]fÆÊÀ–"Ü—ú¸Úu.‹¥éц6å^C| Ø%.B– =¹h°5fEp&âÍ•DͰÄ^u± CqA†”¾…ÕU¾ ®¿zu;QÆÂŒºþÏøS4™ñèIí1nÞu™1b¿{bгý™â.#*UX6Æ[ò¶g|cO(O­’¢œÀD°F.²g©.‚Æ1ü5b)6ü„ݧ¦ÂƵob>Š7ÌóÂè®Dß°ÌŒ zǧ²àŸ§úröiÍ/Ô‘µÔ-Bsa\^®;”×jAŸù)€¥Ña‡¿¨èÖÒtД®+•Ìð†^Ê•´N).µL¨{Û²Ms£¢A/+á¯øKkª›zk‰8G>ò™ zŒ-‹"ð® Õ,oòìöŠ5ýÜæuû¸3‰X‡ãº! ŒÄUÙ96ªè§x$æ`ô© ÌZ|í€R]WÀšþ!I‘„™"Ga_-,Èç˜]Z zz,?GÇ<‰UQj¥Í_XJÙ2•¼ãUqlÈ­çwoÛvaTõ0#ßE"#8CFRÆtÈQÌp’áoWÀ­ý(4nà-µ íav‘%lP Ò®¼êÎv“ €þ8´VSíÖZ"iûUëI¶D!® ~ÉuM%÷[üªz* B¾OŸÒ³TUìßëóËa.µ Ü~ÚãœÇ 髎D³y&ûT µ1k‘¾Û‚ó–¡Ñ¡(@(f ô¼ÓïØ;È=øˆ+à×XSÏã©nÍOŸhJ†ô¤âŒà˨é¸%ÞÄèÞ|AÏ}PÝ;÷²@&Þ¸_t·^’E\ÉSy¹]?"—VÉ"vÝpK “Ò6;°zjOž¿¬\9F¿BE+Ö¹N|ÄÞ\»dºµôWQåæWþdsnÙîõi±îÎuå)1s~‚Iýøìâ;*½P$Y°ÔIÂ0~…k;í{7Že¾¥­ÖK5¬¹˜-›ÎsjLéa_¦ß¬fa‰¬‘¼’6f†^AÚÒ¼[Ÿb/» Ôiy¦ãù¨}Bá9÷©=ñ‘)bÛæ¥ŠÛ’Øÿ MŽÂÔ €7 gD(9–y†ir' fx¼)—njL|ñÓŽ®âÝÈ…“#‚²Î|WíÆŸpq´MùE•¨£âqÏu·Ž/ƒ¦ÛæëkL èniUÁlÁOF¿b”o#£§²táW¦l@95oŠ—=µ³¿îÍ~ëz§ý~Ä¥+1½´T’)RßêG-*g¥ºÞ#¶hÍçÄ\˜Íã©.6Ï@-®«rQcÂùUÇhð^ýÕøÙÊÙÞ’â7msñŽjYÏ‹“Ÿx}WjBáýÅVæÊŒÒŽŠÞxHÓÈš58VöÂU¹¡ÂE×øïÁêK%m1Ú˜Í=à ZÓÔ¼{5&žñÈóÉ»UBþ†/”6om¾°Ê+ôZ×™dòxquØP+jÛ£%’lB!=w棃,Õ&>…½þzU§;ÜÉÕW.A—”—dÂø•Ô¸T¬ujG,uçË ”|8M «Ê[[ôô¥ÇÒÓÏ$ü×<QŸåôJÜÇð~¡WUÜ`Ûgg¤—~î‰ÏEUÉ—´Ó®ó‹M}ÚÎ%c¯Ã6 ÀÂyÖ^‘k¾ÑÇ•JߌFCýlrŠõ¶ãû‡Iº'ÔUrsdÜ%7—É?¼añ©j:9¢yþ^6a'kC­CµÕ†,SƒôBçWôn -ÿ@²^1à^U9t¥i#%rôþý@€÷U»?ELRÁ„͹Êwûåñw¾ÚóKµjcÍý=/&9Zú!ŽjÊ{4Ÿ$c¬3¿ª‘‹-AÙƒmXIÖ- åFf=|W½}ž=ÏP$‹m¡ÂpF´1 à)ÜbÕ¨–xÜ¡ÊÝÅT”Îë »c% eØê0H>5°º6¦Ü¶Íj5,—Nm@MWUÒñk3ŸßŽ;J‰ ‡áÈÉÉR¡»¿Á°c|QrØŸ ¿~\Ùñ¼½,ˆdFy ÀÁ¾Û˜¸·”a|n·ÿ ðÉosû ¬µFsŒ¶ñŽÊ_þY[itZñÌ~Ä@SnÅÍTüñÎù ÓªÄ×ïí„Ò…£½Ñ£?\úX{ì +:†€Ôf<ÇQqˆ5¹Ve›’²màºO‡â•ÿyÅêt#r_múôXÝç÷æŸÞ½ú èœ!4?ÙJÑ%éšîºP”êÊ×RC2Ökéßa¤,¹¡ß­|Ê¿‡ãH±ý sÊHè·rÀ—½£·òCS;]?Þ¦N(õ©¶ÁŇ”q„£"ÛÆt7 "DA|ÿÚk£³hòLRDܙƎUX¹/·îˈ,Ò…L«B“œsú×s›ËÀ+Ô¾w¦!… ?.¦}®K=e0‡x_M[GÚnQPa¸» ›G˜Q,ø¸“â¨ü˜0ÉÈï+&YüŒ›¿>›ÔÇé—j9^LÊ©z‘x¸Ñ¤^Fåµfq{ùtbJ¥Ÿ·Á…Vk[ãŸE#ÚÞwS2ñ tµWW_òfªÃ¥»—•’¸Yïfª¤ÌÊÓ‚eê"ëKWÒ©È·±H„ŒªÔDI|Ü0´èÊYà’Q(A›oúAÚ§Q›Uä‰qêö<[Y¢«µ»>Vƒ6H¨™$ Å=cW‹MôÊ´ºŸÉšõ:ÏhLŠ[jI8I¥Itº±3ÍlO ~í÷ìmã(UµuNJ¼Hœ#×SàYåMSÉpëØšê^-oŸßáªÛLnÄj©¼î¤m»˜Lµ/†I+âà±+(h Ts™^*.f…VEâ£L†)Œ™ÈSyÅ•Zu ÓÄõè[¹XIßöõ_n÷B*m=k?JúÎêÐÞ9ý‘•!”(8m³9 ¹¹†kÿtñùácÖzëB¶>-¦©1-½ëê<Ýßo“¿þò§àß{U@L)kÛckàåÝü­ó 1R†ZÖèS3ï«°å%œ"<Vñ©´rëݳìÌQ¼w» ¼M¡R•¤‡a:_mÜÜNô'“øãüg,cH¿Q¸Ð]k=M‹/¥X_ÌYoàIµ1ó®lÙˆn=ÜçoÕ2J'0K%ˆµþånÙ Ò`Ú¡}Y€²ä&ûˆùìµï)C¤ß¨üV*#_N\I²عsøyí^ ãǘ|OºðI8ê¨dl;}0ÎXž}(Ò6íÓUŽ6šËÄê1ìå7oö·ô^–iØ(¹³ª3z®û:¿ÇiÖ‹\o¾hˆæ"9xÑr ÈÒZ´%¥¶È^éd΄¸4ÖwÊ·æ·±`U_ôhyº5`€sÆz,e6¯Ç1ŽdˆuŠCÔOÉI䬣Îl,µvCK¤î¡´íRÆ&öf¨.Æ[¾K+m•rmÊõ´¨Ž‹ä{Œåòº·Õ$wáÏÈŽ±îH–½)öA“%}¿ŒýM¯z2߃}²„9£6x+÷~| õ¹¶9<æzøk"ßµ¾è†µ·¯ûøj·ÂÄUO¯/\}3P£|ƒß¼¾“7AóM´Ê„uÅ^V‚ã$Í¢ž»0X(ô¥ÍÕ{ ›6\GsR#= #øæ L)²ÍѺ®?=V«gô=sØ #wäÅÃhŒó”«LDV~´Åŧœ©'¨£×´þ¨XþǨâd.Za/Òâ7 ·ŸRŠxèœâSv§ŸqÈž.þZŒÛ_*É âpáSär²êÏŸÏ÷ä”hôz›ù"bi<_ûÕMÄ)¶½<ßì¹Wl¦’°ïGYaÃ%oŒÆ8ÖÔvR,ü>LOQCPÏ9îÀo¿Ž¾@¡iÍ«H³èUB¨ÔU½uÅôÊqÆÌ:“â¢zµeÖ+Ðàkß­ìkB £&@¶¦_`ìö&YY|K«ƒt ã[9ˆË£5šhs¦*}G¸·Ì 6Úh¨ã%ŒŽõáù¹µª|+b©u ðªèŠ1m\«1³—Á² ŽgŽCú‘œ‡7Æ¿ñˆ•œ¢¡ÿ¥\”E]cã³di )• ßòuÂÌâi—¿¦¡ÎpÒ­,"ïîZrpÑä ÷½Eí£Ç³3Ÿžî V—´ /¸é)p餖ҥªÞyµ%öÔÏU»uÙòàðsl@.dm•@ˆZ`vpòIH“þ­nº1zU¨a®ò ÛtÉ4¿§NêôzÏ…¼Ã%ß !F‰ y3'Kk¨‰ôãº_õ­ýr A‹úBbN‰µ}’Ðl¦ƒºÆÌ C¶¦_ñº¿C|Å•‘µéÝçwmÝV8øÌ³Bü‡^Ôã*)yÊÏþå’? IÖZ9‰ ?²Å%ÑF/HhÂõ”w,bò”}Ý+ÿžÍw¥q>á»~Ó7²¥ºŒl_“Úó=ò0ª²Ò ¶ðÀØ 4¹€´Õü—%ë…kºæ£_C>·øî”ˆ3®Y¯`ì>_â6w*óÜ“ÂÐ2<Ǥ¼⩽T¥[ìMñwtÀ?ÅàÖžï±zSQ«à®y6s«)^_ :¼ópQšSO÷¡n×ÐS˜HeýÚ‹]¸7ßS©-|›«ùÅèÿçeq endstream endobj 51 0 obj << /Type /FontDescriptor /FontName /RWGALS+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/D/L/N/S/a/e/g/i/l/m/n/o/r/s/t) /FontFile 50 0 R >> endobj 52 0 obj << /Length1 2079 /Length2 14264 /Length3 0 /Length 15521 /Filter /FlateDecode >> stream xÚõPJÓÇ ãw'°Ü݃Kp î°¸»ww·àîîîîÜ!¸ÛåœGrž÷ûªî-ª–ýu÷ôô¦{–”HN‘VÀÐZ(jmå@ËHÇÀ’VRbd000Ó100Á’’*™:Xÿc‡%UÚÙ›Z[qý#BȨçðaÖsø”¶¶H8Z™Œl\Œì\ &ÎÿZÛq„õœL Òt k+ =,©µ«©±‰ÃÇ>ÿù  0 0rr²Óü½ ` ´35гHë9˜-?v4г(Z˜\ÿ'‰ƒƒ =½³³3ž¥=µ1/% ÀÙÔÁ ´Ú9 IÈèYÿ-– dbjÿ/‡¢µ‘ƒ³žða°05ZÙ,q´2Ú>v(ŠKdm€Vÿ –úW à߇`¤cüoº¯þ+‘©Õß‹õ ¬-mô¬\M­ŒF¦@€¬¨ƒ‹ @ÏÊð¯@= {ëõzNz¦zú—®è}(ü·>{;S{:{S‹¿4Òÿ•æã˜E¬ …¬--Vö°Õ'lj4ø8wWú_®¹•µ³•ûÈÈÔÊÐè/†Ž6ôß­LmâÂÿŽù0Áþ±¬ ÌL -èb`Bÿ×J®6À¿Œ™?4xºÛXÛŒ>d=M€ÿ`Ýíõœ€;G §û?ÿK°ŒŒCS€>ÐØÔ öOö3Ðè_üqÿv¦. †öc0üõ÷ßoZfhmeáú'üï+¦Wû&#¤BýoÉÿu Z»ÜiY´LÌÌVfv'Àó³üWÿ´ÿm•Ó3ýwmÿÈ'ned àü—„³û §÷Å¿‡†ð¿;ÈXt3@ñ§ù5X >>ÿ?ÀßKþÿuþ_Yþ_›ÿÿV$êhañ·Ÿâ_ÿ?~=KS ×G|t³£ÃÇdH[̇Õÿ Uþkœ¥†¦Ž–ÿ×+î ÷1!VÆÿ=HS{QS ¡œ©ƒÉßóŸkøÈnaj”³¶7ýë½Ð220üßÇȘ¼)ö—õ· ø1Qÿ»£ˆ•µá_£ÇÄÊг³Ós…eøè/&VV€;ãÇŒ]þnm=•µÃÇÀ‡:O€‘µì_WÊÆ  øËô/bÐ þ!v½ÐâÐ ÿ—Øô¢ˆ@/þ‡>²Hý¡,Òè#‹Ì‰ã#‹ÜbÐ+ü¡œŠè#§òúÈ©ò‡>rªþ—8?|zèçÿ‡?ÈNÏÀøñ+`äðÇÎ  7ø/ýuô†ÿÀUÀ?çðÙ:~´ê,³FÿqÄz–ÿXó¡ÅèøbüdЛüY>îÀÄÕÆäãþña3ý~ˆ2ÿ~¨ú³?ÛG¹5Éÿ‡žóñFÐÿ#÷Ç«Doýü(Õæ˜l€v¯üŸãaaûÛfjýCùøA¤·ý~(²û~”ÿz?8ü?öpü~¨qú~ïü™>Šwù~ïú7þÏ8ÚÙ}”ü÷Sõ1$ÿá¿€@ ìò‚µ·¿YÛC•ž3íÞÄ×YÒ=•dJZ÷e»vÇ'DèÊÊtß »;„á䵊[þÂW÷“æ:è –8ùÖg…é½VØ¥)ÌɼÚþÏ0ø´Jüû¯¶Ê>æàÍ ¤Ù¶Žˆr?ÑœûÄ\jûKVÇöä÷+Ù$á^Jfh#¾‡kúΑæègÌcC9Ð~þD…zá‚4w{7‹š5ùN(C ëyÁœï®¾Éù8ï¶^¦Ädß…C‚£ŽýüulšÌ]ð0Qkѽ¨ |ãëb&%ÈÆX?¡Çh'Ñ—†”8*ƒ…Ý2§Ø‰gk-½j/íý¡ ˜û`;jCi§(hW÷ý­eˆ[µ“[É“³šI · £mØmŒµFÁuá× [Oti(ü›}Ž.<³´b’j÷^³ÉS›Y—}ÅöR‘ߎˆ°Ðy )HÈhy© ì¤Ã1·Õh,š0•œ­ú 0šÝ”Ã8+¢ßWél/÷ßXÎrÆÔ“9$ŸÝœñë]-â' ÄYõQ Í bÎÔ1ÊÀSBiâØ³ò†K$«¹¾ðK¬VðO·Šž‚ŽKÜwë”ä<¢|1¦®y:ùÚxÈ{ 1§ž¤çÕÔ˜¤‚*s‹úU~e‡G½f ï0/'¨?Od<_ct‚,;B®‡åpþþ!|* Ûį܍1XF£<SðexäªR´‡ÏX!E²¸V+d<šGqVη©ë)ª,ÿëmɶÆ~oܲVÕ—Écê³ÝêK®#.C•á5AÕƒ>*dÂ1³G id¨õ{-óÜÄœø­ržž1½Óz· ft:¯Ù+£ßë×­ö#´œ£†g¥g©\,›æ1÷Õ*’ÐÇxO×èìöÐÊ¢mŒÜ„»<ØøK²Ž2¸µŽé+;L<&§è  ~ WIÎ[¦[Üi¯‘©¬yc…­º4þ¼xµíÃ]?/ýœQ—Ô‰·2Ÿ2Ì-*ùC30ŸS‰]`MúYV1”Ž;r=:üÛµi ju&·gMìC&ú¾Y¿šê­È¢c)a[.ë`«Íj´ x[ÁVN¨"ó¥8›ÝF¾=‚…Áô[ÊÜ<Ë…£Æ)‚³Z{objæ^S›†ÃÔÌðHâJnx]:ŸÉMJh“~úÖÕòg0oXÃ|ÝP€\|@Z—2±oöe1ed±Ç÷éóâ“p#,¨ÇR4áú<‡ä9äžÂì¯eié¬ã×m^Ôx y¿ÍØ»IOLùß“0·Ñ†P(q@§ƒG•èA¦lƒq¿¯M‰UßG73Æ;ˆLúÎ4®ÿäG˜þéňӛ[#ª­À—H›‘qÕS`‹é­NôFÅhì|ÀÔ•ÃB_ÕÄÜÉ_º­YÅçv<͈DÒH·™rqí&ââ«FÞ2TrÌ,jàõÕʬƒi»}jÁý0Ú™>âåaìÙ[?K\+(=´Ûµ©†+rlÁh!§xí8,nïø²à¹ÈÈø”´Ó&ç™Çô’P–€‚ܽ8j¾fѹôMq_˜FÎ!ü~9:·]Ë49ѵïIp/Zî-8_d=Ñs†¦ á×ô[½ îdù xÈ›`¿X <­]ì˜RN`Â<¦š©7’¿ yxѲ×D©qšãeë²ÚæS±î9/Ê´¶.HEBù,9”eÊÓg8Ir$ÉíYrÞ,”t‘M9.éC÷PEf1&D~6ͬM>Ú‹ymLÕrïÕÃ[/QL:[“ä^È{5¼¬«g _½’"ç±e™Šï6ã…ºåå7Û©ÒœÕP»:èÆ3úÎDÛIðcmö}>#J3ñ åÂ]àú¾Ã\*¶DZ^¦9έqºï‡yÅÐáä{=º›&ÚP=ðJJQâ¥VßB€» ?QÚÇc¯"ï{³uQ×ïv|’½ï×äE6Áˆ_!JÕ›÷ïJC²¿wN—ÑŸÊ>A*Á’ê’â»ûS`KösÑ šŽKrþìtùÖO‹æ´-ò2Çâ¢ÃJ¼•½ÜòšÚGs“Yh¸mÁJ®?ª¿nK“øíŽ WuÈÑ¿##cu¯Þ'v më8NÐ8X½ ÖqÓmü|4gHFm}öƒª¯=u«¥i¤ˆnó0ZËø»ÆÓÉ[ä”"ñÜ]wÊ^zç³.>³~ÔÙõ*µH{f¥ây…±Ó)KTõeIÀ,šHâÚÏœõëñYšZΩ)Á²óuà¨VvF “Pe˜ÐmG¢úWÄ‘®¨ß¶´,QWé›Û@Î`o®%G®@ºƒ.uÒ„õñòqü§Šro?7tÝ}"7¯r=ªŠqÃïpÑДtâø&¶1‹oÁT àÙ¶¿½[ª½+yüe0¿Ãô3Em²#õysÊ:4h0{D\°Ú1€_7Û ,½=/q@o$¨$ãÛ Kõ··Eº¯éÖ Ç :Çãy,ú#ˆI¼»Ñ7¦~#ïP'ñYIY’žÈãˆÈÛŒŒPG ŽÍûÄþá^)eó ¥÷^™’ uëÐ|dÙÏÿ4EÉ:ïEÈÊ“…·QýÝn¨Ê½Õ«û»ú;§HIÖœXÅ–c ç 瑩5ŽmÇ8½oÞÖ#D—íÄ(Åt#NÂÅ2¾.ÕK:Ç!A#1}‘:gîç€kš.¬|A)ssÉzwhN£OÆÆ/4 G¥dmxÞ3؈ÒCzT¹s$w!Ÿ;¾¬5ðž²?58òïm€.!oC²j’AšJ™` O=(Pù5Pú]´ü®¼_œ,ãEÍù¾‚ÄÂŽæ*†D1Ýó¶±PäƒÐÓJ\î6²h-Û£ïQf þ†ï&˜·ïÇߨî-@¸Þñ¸É¯— tIÜÃÓç‹>à%žÀH}†Vë 8ÿ¾€r¤T`,Xg¶ÁùýUôX¢’UÃF«nrÄfÂ$|©;{¢+¶è2ð;‡÷ä|œ[ÎÁ¯©@¾Zï'°8¬.É0îŠÛ§•wÒ1Õxÿ[’¥ .,ýaN›:QmÃTÁ ‚  P6 Z%ª3¢ôˆiW5]réúW p¸òO•g#Òh¥r_Œb¼•ˆðÉ!ø€÷Ioª…d± }"ƒ'pZELRÞÇ} lð—|&”dcô‚zÈF~w‰qDX- ÁõÈÒ<ýaઠ níŒ$l$žÏ>*<Œf{¦Ûìl¯$,Õ@ЪºZÀA±ÔÓDŽ’£ü¡u3×úÕ×KÏÏõ"u£E;Š#£ã tq•‘Œ¿(á Ÿ1Ãü¾\ˆCs·zËia¡¶×_6c*€v¾%¼&´ˆƒÓÄñ¥eÄùÜíè fMN ½,rx¬­ŠMfþZ?×änùk5°eÀ¼QéB¨:…žÍHÄǵ‰±…Òœ¸‡Œéð… w“´yú>ÁØ?T±¨á–š ðŒl˜P&= ŸÂƒ›Ñ>|òï;•õgsºusÌ‹æ×÷ƒ ë‡1u©3X×µ[E%³ë:ÀG@?=†B‰ZiÖáEùäƒÀ¨x¬hy‚½§Fò;@—2¯§üvº{‘ 2ówgŠ܃ªÖ”¨x…’¹ËEš™±~æ·8ÃOt\°ÝÛç¥éøtáS`I¤y6¶%7¼˜^e¼ÚGn.4+îÚ±ãZviÛlÖõÍ·9C¿Ê¾Å)­ ½N.d¹§l·}´8IÐ]›ƒ­¥ì¼Ý¿u5”‘Dú=©nýH©ÂQŸJž íb¦ ʸ4´¦>û²Šý÷ZêiÊŽ™Â>Ï–⣂†îhéÛ»‘wqíMê©Ô•¤ð²`Sþ‚°:n|• Pºz*ûŒÊQ¤¶ÕˆiÕ„65éþRMëƒÔöðô)Óá}ÆSîå4Þ¡ãg¡„KmÇâЬþê–¦ûˆ®ãú»F0a}á éQ3swpÔK{漕o Œaýñ[ØäUÊk¶h¹yY \-äU‡¬YgR;nÅÆÊ>u´ w~ʾXz^9)Œ²ä!9ñº{ºDâRMùr4£î´‹±ûÊð‹„#&štÝqš~á˜|7"þyG³‘AãÔl–]]{%±Åˆó¤VµJÉɯ>Š{—Z'†°üÁyÞ:Ьóßì7}Ÿo×0Žé¯¶[ÂÆÌ•ñ×÷w½â_sÂ~#{’³X$LÅïñ?VvêÈŠo4³ã¤MÒ»GkC¸¹ÒÚc» áå´>¡²KlL/\>ø/ÎvÝ×)fïgáâ¹¹ã4Ÿè×çϘËéú1à²ËSÝÓûP0#>[Nä äצPB2K“Oà[tJŸ}(’wºíC&’ ÅÑ]›2ø" ãüý>ý”%ii¥&}Ó´ HMw£™ ¸¤¥Fa{#“GÕ˜ñ£¯Ëm­…ç—«Ï÷}¡)þÀ$µÜ@¼,a­–Ñ KÇŒÀ ¶gOÙ#:%ýzu”ùæ©(:Ì¡Ê?ë~ãdCÕá±(G}ÆÌ«™ª?¾ØBDD(¶”HŠTé&ëÄhöPQ§xô?žú&3Ì¿4Án(Û›»?âo«¨s…S¹VŽ•ÉeE íD@E,Í3Eìz´¸mÆ)#® ™<Àa2¿ŽD«ú¸+E ?‡ÑMSi,kEÎ1ü2TR^A„…+2HÎýù-€´˜>âEŽs­§>°8À/š-»c$ΙÐ÷VšáO$–Ç‹w¶™0KÈ›7Qe¼¯å&¿-š‚¬Ó.°E♤8¿özêfë‚ór ëDëMhÃáêÀ&Q[”*»˜²Ué8Ù)Ë®bþ üm•xå[bâ·aLŸâÒšS%3}60û‰ïÊXè7º¼O)úXO5qhI ßÇþ`šŽÙ{äs¹1Bh9sSž{%н¸¼h„ÍÝ`‡ ÙàX¹T‹±¨;%w*M%¸qÒ!Á•½l™lø>H†ø$œ÷³7©‹ºxÕºj„•_Âñz2P{¼z>¨vm,‹qóü8†%IÝñN•¬èµ`Ç-é¬@Œ>a#êFƒ¯r¦`ïö¥«ª1ŸßRç¦,-üSW¹EÊ+¥Žû´Ò¿y”+ÆõTU5¾ÜuBw^<Œ~®+Ü;¨êj@*±8@¼­Á{LÙ Ý]ù+²!b>†î_ó~ww1ƒzTS2FN†€ZªöÄTÊQÒKžö Î*3ÂH›3Î*h{»P-СvˆgÌa¢X@tß(z8ß1ð[¬ÊŽ)-r“£’-NR\TØ3¤"<°9ÃZŠÒG3*FsnwÔé/ÇÆgØÀfÎ×é´ìý N¸á%ySëht³ýö’\Fâgë6ß0š­YÉe %ìHäIêl ufCŽêàôç)»ŸÛ­Åldߦâ…8,í =zÙíjP¯ÅI¹‚®$ìÞx~Q”‹i÷ôÕÕþ¨t‘;‚Òö–Üþ5‡ƒÕ½©ö¤ <GüÐO‚ÎgÔÈN´’ºá‰Ò«:ºk}|Àü’N¾M­ô`¿ý‘åòÀ)Ú»5H@w„;OŽ7ÝùdË)。ó96€Ó·ÕÑÔ`ß~|WÂÛÖ@Ý£¡’DhHcšÀ4txá7C|ò\³Ù1ÀËì!ã&º¥Ær§½¤ˆÿm$Yb«0óˆòÇ;:iz¡¾F'Š,_ïe?7F–‚sÐFó H9k.q¦Êž‡7÷|…8Ûï°xU0rMÃÐCÉÇ{O¦pwyJg\‰chÕÍH SfÇpTf0¥4[Ö}‚'O±Y)¸ùRªs²lÏôÈä`º\„“s—í`uu1E- —Æáâ $·b4 ïcÒº®žbÇéX#|”±k¿®SßÙ·$áˆ8GÚ#-@‡éÖàÁ¬o &1ëçƒ`%ýùÆÔyJ>·]IkgZ‹€m-œÇ#ð¨ê%´ n6zSÃ!vlòXŠ5;E¸3pòÖ0œi–'ÊÄàíQ†Å•Ãç眮P—‡õ9„0 ­æN$å¦÷§ ¶6í°ò. ÓvÖ;ßžäƒkSœÜ.Òúý.€ÁË—,QºEƒcÀbýûä¾ReòJ=— øª­qL˜ÁÐÖaÒ{BB7?C*âofˆíRñìÓ&…*öÁ¾ö̸ŽÀ?kÌ=ÏióÑ0’T±JÅÿ’FA§å}Üÿ Âdø%U‚ó7YŠxxÀ—jÀd¿qäFƒU« (uQ9Æš¨Š•a ´ç¤‚šcоx£o¹S꟎±´9«ºuŸõ:ú.~QV­ßŒQv ø¬3±Þ¹—¥ú“ñ`š,äì²äcóa-0´F>ðä¬%]½`z]¨B¤ƒ‰í#&&Sð¢'‡Q z>þn¡‚ -=;¶yÕ[•&°6¡°PYÌ»ùÓ5Ý¢] ÁÊM“Â9ÛË#4x"îaº«ÉA¼Nª¾N)éû²Áóƒ4ýÎøiIœ$=w}kÉ4ñ}«éïþÖMxÎóÆŸ¯˜c»ç#-X‹/(köA¯j™.(…Ehèl¨×뜚âWä¾Å³æU‘Ëp8#I“BS‹p9…ÆŽûƒ7Í–œ{mÅé¸`rOªÁGêÖZÂßWO #®ÎÏ‹‰õí7MmyiúpÕ­F>÷¥1ï÷„§Æ(ò«–¬Ÿ 0Ú_INß³êßÖÊž +³ÈÁ·%¸ ÌJ˜ |˜`eb빘…„¢¹e‘Gœˆy¼0‡jø8¿vÎéÅÎb¹£?=I¶†6Ü‘yJí[9fxa糬f)kŒmRÓýÔ Ð?."q¸+f<¦kð^œí6˜~©tß-åáIs:½_kÚÀs[¸ ây‚¹LšÊ]᳃ú…]ïCœ®ïëÐ2’Lâz4U²£| ÐRIÄîY˜™ãÍ]ßaÏD¹õ"”ËŒmT¡ú¬.4<*›y¬èã sÂP{ä=¯…Õâ;±ÐÕµ§è_Í:‘pOëÉâûins™¶; «I\¨"Êq¨9P 4yC½¿vºÇN6†Bì®U2*Û!z[ÔONÓÖ }áW™ûBrg©Ð=Ô3â„#§ZWé }#§´æ¼G|2šùÀoÐ~ÈÓ mb¾Fg}dqÅr].Mudâ¨Ø©)ï'yQ¦_)F“²ݸ|5<©$ÇO¼ ÓZu9âN®r7Ë/†á³à¾(-nÓλÜÓ& ùœ‰•GªðЧ¨î1ˆóje,æöÍä$vÔi©¯Aûì”þ”–daR*còs;Rìq”嵯wÞ>‹×1ã1 ÄtÁ]mïF€`d‘´WªmX¤*,é‘;_.vüÊ[3\Ë´dpø¢zòˆNtæfô>< ;ÀïÝRˆß!Ù8'VÑëÚ)ö-Ã\YÚIÒ"qýèÓø`cÓë‚;<+*_NjUìWa˜c={}öhMʼN»ÀŸÅ_¾Í¤ô >T9÷,ã#xŸŸôŽÖÒ,uÊ/ì„שô–…•€ŽfAF— £T bá9D 2÷‚ÕŽEÛ Bñ&¡ºœª°¢s’ÑYH²˜—v»W®…Ø)Šë®YYLßó|Ͳ"7+XÅÏíDê?47[Ñ’—DR™|Ê’‹çìZûúiÏ„! Co(ç¶ŸGC$²Ì¦üEÉy©LËѸ„ÂU1ÖÏPú·ð¡"5Íê¡ê™"XYäž2¡Y(«ô`¨Ã/?³Zƒþ¢À›ÝÜ«¤/¾Â˜Ì¥YB‚˜{)>—å*.5¯H]šu9qÎMJ#ÓH¾„ÁÖuâVÕøíèõßuxMÂ[ÎÓË|i%îŽê¡IUêÒ…äšO`¼®ñѦ@%¸ã½L“}-QÔ3âVb,VŠ'(Ì \¼ÄÕÑËã> T"qoíÃpï¯Õ´?ô×dý;Ä'C‹µÈµ¼+Sž9|%ÏbŒ±ÛñfÁ/L–¼.Ó.}¶Ö évö}†J-H·7 ®XmðÎqoÌšÀÈÃ4º7ˆõË ú2<þ" û©jÃÝ8 cVs·EA¦a„aZ:vá{}Ù¢ÇK ã'ñnÉuÕBiAßt¦u:ù4²nûÎÃÝxi°hä·wN‡À¤ìÒB&ƒï…5d¬?sVj›_(JàÈtûz§)ó.åR_вI¬1Dáüú;?©¨¤‚U:GY3ŒæXÖá$a ã[êlGYäýÄ;iitOº¤ÛIf‰ÙÚ«ˆùxõ–î•¡¾LSì\ ·[nù*3CÃt)s?ÿ©h…œÂöjZ$zRäëŒI—á…(A–§›r$£zÅ ©™ð8Ô"-43%˜P*üÛ¬%“Æ eY ³¿˜‚aˆ§(1²GÿÒoƒ{¯;ñWͼWÓYdí0ûTmÚîÓ¹!IƒÉ°wP]aø A‹šø#yÜœ~–Êö|w:JÊÇ.÷ÆÅ¾¾Ü@5þø4øzK3Ò˜'sƒ«ýlld:†XñnkN]vº‘.õ a:›œÅ/"íØã; mäz.rÂ/ÔÁXßHãùYTÁH]7¢KŠ]¨!Ö¨ää ÜÁ»¡­íN ’üþóöeKEœü/l¬S—Ÿ_m¬o7óŽÒ/gÙ¬ý~Å#Ï”æß›Ò¥?Œh6Î9"(@–X@Øt$ŠVÊH&v²·8îc¤*#qô%ÙT|I¶öÿ¥¸˜€@c(!=b®FÖ ½Š¥Ö¡²0…¢¥1 1÷ˆ3ËaMb÷XNÖK*tfÐljaÐÛ9és‡û§jô^4:ÿ˜»ÑgN”N?Ëó €ºÝF5Šê¾ê:½$ë=²LAµ‰L…®Öt€°(Cj’·|œðöRꔕ7ÍÈð…Îç F·Âèæßã˵ÏW¿íhd³îá`Š.±:¿×ù:å·c{³]”¶´I’ðõfŠÕ–«Ž4õéûÈb^³•—'6•®…cÿ¦®îœ¥œ= I»_‹7@@S5›ß±­DM–À¸5ËàëÎÏOcöe€æ õsk]~K=ʳLå$¤±¤ž[ôVÁô:=P+IoñÁ1·ªàó|åš}B8o(&]:Ÿ žYiJkýâ[Ö¥ÇðP“ÇN³²à.Žeg! B͵.¥ÉI؉+]¼v‰ÜäÈ‹F3­Ã[iª¯ÞÒoqE › X-’Í_R U @ÒÇ“H20Ãá“çö‡®Îƒ@ëã¶¾×É`òùL.ui­1ðï„t\þØmÍcWÒs ÚÊzo¹š#RAõ€+‚›pí¾8Êl2IOU£û"écƨpdg­+4UKFO³uÉ4›°º~ÒE'f$v¨É]F¶d5˜@¤ÿ›Õ˜Ôƒ*3• NÔæ{0Žfn¡ ՠϳð¾öb¶ý¨îV)X'ë$é@Ë?ÀdXCœ×‘ŸÄ.­•‚¤ï-ûë£e»gå¯Ðˆ ö¤Þõ/4 Y 'o[eř̃çˆGVUÂAbO‹¤Ý­øæÏ£Rþ ƒv´ºâkÉÑK!/(ÞU3íM’ÑU#Bð—«œý–‚«—ŽÓ¡¿5E¾EÀzd±:Öù ‹{%AKý¼2Î ÒÓ'ž¬p…Uó†C ÀPåç¦ÌíÈæ™;5;IÑp¶VuðSýiäyöK`«OàpJÆ4ÿÈü«ðã³È¸uI¢„y´¨2Ü'ó&ô“íÊè³C†Is¸ãüŽ]ÆVûñJ‡µÈTxä²ÅMûŸß﫾ú?¨Â¼‰H<'š„ùÝ¡÷yƒ>'ܸBº…R®)H'ù€J9Á…j`Óc£LtÔÅ96?CJ¥z&Â׉1 !>D^ JÄbÓhqïƒv5òe_†«{ß´óÐÈïFF΃I’¶ÓíD ê³°å^×»qmAU½:¯Ò®ø£˜l¸÷’W‚.€:xààQ»'O= (ŠÜ~b¯›×A˜}iO5J_4å®býátª1³%þŠN×ë&˜æÇ— î}ß)X kYÂ̺˜XžÁúíƒ}¸F^C`°ÄÍcV§ƒ®zuJ4޽ApT…À5üèú.#Ú˜zG*¶Æý--*.þ0Õ6ŠLÝ€a´a˜ÇTùNf³®i)7úÄF¾ H»ÙÖÍÑAÎÈ O,`u’dûŸ/V±%—¤(1úÍÙJ»unFÎ>]|©­ýÚö¬;«N5ñK“.‹Ä6®üfxpÀûXÑAŒ×XoÜ`ñ›Ïdb—B›]FE×I'ò‘Œ–¥A™œòXÔ#’z¾zÿuâäCëõyQŽ›å$΀^\cž°±¤ïàl2™V`0LâCâÕ/˜f7ÿõ1ЬPD¶3Yl{hÇÒCíÕв4û´¢í ÖbcÕb¨_„müzÛU.̵¦XÑ!R~èwyƆüÎsAr;3Îô¢M2ÑÂg5{Þ±]ŠÞª² ïßy‘¢û×dø„0Ä À „Œ©ðçmsÑHüÂ¥ù¦"™ãÕ×q;4HYýp~˜ð¼øvjºÚ¦×óü¬¤²9;ܸŽ=Éá´×n´&‹)¾’ý…Ñf¾—زþÅiÜŠ§± VÞp:œÂÎ ¼²E`0V?½ Žˆ=“ÄP‡¿)Ú¬V,‘̰ÂD¿±›Ýg¤Én°Á˜ÇÉ#EæÊc|XK%ÈÚ´ÔeçUÈî§pÄÈUãI£e•‚£×M,H+^€Xö²R£±\&ßÑŠëW>,eröyn}txLyd“V£RìÌÌön íl…ÙÕpï W¤Øo¢SÃŒ ]|æ†M–ª´ƒ& ÛP&/iãRÊô/wMèFñ:/ºìüB÷Ý;åF©ÄQ&Þ¸Ä}bÞO*´DRɈD=Á'ÍØÂU°òëïØ¶Øu‡ôÐ ¹ôæÂEßMXzä#䔎÷@oFâÙB¯ÑªúîB”è%dqͬ$èÌ´‘!»™ô@?þ~ÄZ’v¿W|Ù'VÉ’ ç¤]0c³p-ž]Bb¤'ùÒk0;ƒy#»RDÒï®{¢Kíͨ̈L¯C^¢Ã—x÷”õ̯o½ ÔòcÏ»rÚ± éIñ™sÑó玘C rÂùkßM—–Dи"Æï6¸ÄU„ý"WX}Åí¾Y¾«¿ÆÅ#Gɧž^ãî¾ÞQi2­T¼±cdš›ke©ýjãFRÀôæs}Æ=.|?à jÊW“[xÍfJè»ëTjºŒ%qwUÎ$3Ÿ‰öòè{úÐÊNs·•Ïa{Ô~3Ø´©Ì)½ÃȮ؛@w:žw„dDzTSˆ‚ðº}É­éž’]%#³é©¯@$e|uèb*ãAèuèì,úãš²vékQsÏ›K±µ º‘м¼•²KÔóäÀ ÝY|{ãƒ/‹Ôó§>QÊ"pàÝ ½ÈhÉnJSôé9‰”Æ7÷‘ëƒ<çQh¬ËÀÑ”«Õ7x×¼|»ßR2 Lû‰üeÃdwŸFt&öòטHÈOH·D\ùú)> _¯Í+çÒ’NN_yo”(­Œ¯CêGm7-á±FÝR ¡t#^0r0£ˆén!£9®fí!Œ–³GàI‡®‹ÆebIúå.F¡·Wn­ÒEégòíOcæ1½/ÜSHŒüÒŸóH!S)Ž–ß!8F냷ì>ÑP+v®;⮠ŶcÌ`5Ry·sݨ¢xë\O™ëÈÞ†Ó$Ú5L"x±¨'~¹Ïm u§ µŸ ƒVCì/¸CHû)6jɆ {‹Ë%„ò¤GS7(›éÈ¥¸ŸÙö­™œ^vÖºñëo¢%€G¬¼‹pþ€qß—PUÂÀTŠáh×(M³ ¨æ†Ç*6‹*ßM¡_'ÜØ Yfdp_´´%gB)1«yÚ»Fý™·È·÷é.¯*õö&™¶QËRáo'Ûc±¼eCåP¬ Ï〟M®´6‚ørÞÍŠ©aQÍ Òöè3Nn_ØPæûüÈÌú>šé2-ˆL">¨ÈqvW’šb[Š3 tž®A•ˆÑþҠ˜ÃÙ¡â6á3u_TZ·Ÿw A¯†éÝ2ß%+D†ž…Æ«5Fác´&¶Q$a‹S3)>ê‚ø"/šÞ¶Ÿ5¨›¡æ›µ —Ü,?â_¬£RSÆZzÿ£%vèöGä±-o¥ùåhxÀ”ª97DþïÒE<¬á=êÁ‚‘{Ìî|,×5ºP›Ê¸ðtfUzl©G­]㹑ÄA×*µåW^¬ ˆz2ªR–„}iEãïQpÿ€®âÖ–•C/òð°íi//IüÑFЏ·u”ïRÚ cw[O犚NYÚœ0‹¿–}ךd‡vÆMÆaȘ…Å”T^×ÛNÑñÖ1;ìáþr2òüÓÞÜ0hÍ›¶™É-Ò·Ô…´ªÕÌõUô¦ó[EXĉ=å»ÈOþ?½¼ "ͺv­{Šmð©ý¥”NÌn=ˆì/et:|B)sͪê8 †[Ž5w§/w³Ñ4 ³iCЗ„U‚=ö›/Dв4$° 8¤9-3Ñ)Ö‹jflôêçÓS }•s&®,Ø#&yb.‚ˆöí qU»R¹sÒÙûg実=!&ª£ ˆŒažL˜g]ïeÊïÞ ^Κ¬Þ«|)ªÞÙãAU C_›*œ×Mµ÷Ù‡õf¢Ócê/¡¾cÙ$Ž@öV¨´ÚèîX_z#VÀuî«Us7ÒzpeÞ£ ðÔ^¢ñ-Ûá?z+“a” ¦Ó4Šø ™¬”Ô"zéŽý0Â1$ïý®¶Ú!Z0xÑ÷(cxHÛNàÉn@ÄKŸ¥þõM­ZLb`­ì!ž½éAA ΋‹ Éd4î…|ÉÅJòAñøš|OÔoÚNÚºüºÉ U´§ùD¦3‡æ­þj‘aç~ñÈotç}t3Áö3–Ø9¹’%ô2Þ(gèa „³lÆæª9Û˜y„çsàp„Bv—Mó ìäaÖV³"P"h8¬g—{‘ÕþÐñk˜#,âà­¼c¤•NoΟ'ÍÜ~öü|Å/¿X/RQ¼¦‘KÚ:=XfòFº´ƒ…è>„nÊEzÌ:}ÈÅ??%ŽJvNª@¼-¹H.×îËÒ 9iÛJÉidFNkÔ)ôJÎÑÒ(°·Ìueƒ|¢Rò’n.1ÓrɘU7¨LÒ¯¸l@‘0ú CÓóq‘9ApGsDéN@+ôÛs„ŒßŽëpaHŸÚm÷:S·$œâ÷9tuVO`ðK0¤†‹ü—Æ+Ω ñžñÈÀû”opý°iêd€\jAÌ»ÕûXÊüXyøšøl;Í<±QŽÎ]•¥÷A¢€¢°S-íï'ƒ{ /ivs”HCzÄŠŒ8p°÷jêFS(3Qƒ›Z̓šÆŸ(„æ$X¥ô.iÜÀ òObÖ0=Ã¥òpƹB%N)EGVC~1bUZ¾|ŽTg }Þêîn£K¸Ê[¤ ãL¨ù+Švàí”{‘›7íņ¥?;òòLÕógGþ¯kR©jý-I‚Yáê0ˆ—‘½ÏB¬«Í¨®œïÄ×Õ½*D“DÍ3Zy¤Þ; ÁJž²LJ<ãø4à6XFìJ lÎ&t`CCüoÖ‰®Å&KÖÍY Ä£9uq¦ÔWWäjߟŠNûIZG²»¼'YašJMaM9i443‚RÅ$ÐQeÏÉ˽d=?Êõj~M7‚mÅò2žt'˧ŃK÷t°¡’ñ=¸X\QhÚJ1羫¸ëg̦Ñ¥£áwÓõLß–¯¼‡Ç³¦žè¯!ä½7ðŽûƶH¢ÈtK«¸”´ÙBªˆ×ÍÒØHÓ¨<:sQÑÁÃ{¾Á¿ÔßüÿþK¼3.-Jű{ýÖ²ä± OŽUD¬yá=rZ8ËKÏqyÐM‚–‚ÿôb+w˜H¸ø1*1¼Èl\©üoï6;”;:HÌp%Š®sÕœØBŽÖÏ ú‘šõ„m·á¨–°·Rï¶Á ,Ù¶c‰«C¿ •¤r g©q÷Ssµ ?ŕפ |†÷b.Û¶,}}Eß­Öwç¥fei[åìtØËß­:M¥à£˜ôÊGj©Ò­,cIÏQêaÀ .‡ãD5+ƒáCïM%‹u«gzQS΢wëd&ñÈâÕ7N÷F¤™å›¬ˆ¬¤iÉu|#–1Ñ ‰9’Bt5%oYok×á=W¼úÐÉG'©Ç*®”O]j%&­#àUü”~ÏÉËé¹óúÖ“LfX¨.=kº¹/î,·0çÏí“€¡@¬ÝTxõR:ÕØžoXÅ4L½”>»¯Ö9! N‰rc±À°”Ðmcr1îeôÊrì-Q?hl·‚ôþêìlÜ“#O~HCg‘a¿e°[A=…Û럳Ê5^¬Ñ=^æÙ«OGý]q²çˆ4ãB½ây«¬…ÅË]¼¾Û ?ÜNi§"ÉôÛIk[Žºúµ6ç™á»¿íÞ´9÷½ÄübÓšèê3ƒŽ™ÕŒñ¼)e¾|“w!šl”³ mûU=E®ÙÍRO@cø<8"=D˜úYØ«¾ŸÂÕ^ûN³èʸ•ü7 wü3d Ž½›³ª£k‹ŒºÎ¼”Ѩ¸ÅÆ®`kC–¶!¨¾¶Å8á}Ož»˜ R®¡Igª*;rdÔú&ÙìBY|t ;1KŸ®.\—]±ª PSMü–âH( ¢à}^Npç~o¸6òvžä(Ó`ôõÌO-áÀºŠfœJ__Ìñ±a³D5—™ §³A§†AÂ/:á Ö¨×4Ž鲃€ÒΣ_:¬IXϬ´ K5Cvì‘Qÿ£Íæžr£-Ül=n ¬__žbÖÆ™‡ÝEJI_P%‹¾4™n©­~zùY:×Xáûa“½ ÕbƒŒR4eÖE«¤ÄsL§÷"Pö¸`ݼ5¨R€•dt.Âé›kUb}µöÔïm‡jšÑrÚÛNš‘²ˆ² %cd›ƒǯ Ÿˆ8ô-ª[ãBsß`%ê‹ÙÁzåë=v(Lx"}ÏJÑ-è6´ˆ: X‡nÞj #±•ÍÔ—6Ip9ŽâÔ …bõ3Êà3åèñšÝ…n5ŠÓ¨¤Ò§‰vÐ×ß• ª*ThN<ñ-…Ü]©òÛÃ/¯sZb•p]*Ç •bW·\¡g?‚ç¬U¤÷óÀ—Åtö…¯áÇ[Ì4ldONÚ† ú‰}`rÐAÒÀOðeMŒH±‰vaœ—$pLTK×Ähé4<\–CÛâsÝyšH÷„ÃÅPçÕ.U°â!t Ù¬ñGÔ3¾D1K"ÖÜ=ì àY–èoˆÃOfò|Cp£e\Ó¨â‹Û_JRL4\m„’´\òQb½fQÈÜks.)ÏFÊæ)Ê…ˆP#Á0r«ºØ–Üœ+õ!3sJ]ý~ë¦VWz2¯/(§ˆâvØ" ¢wP[`Ê#FÀwWBVªw‚‰=ž?‘ìÆyç†]*ñÔÕU£–Pùäì’Çñ©†¯¾Cø¾ørôHjì×0ñùCî9˜´Hµsçór³MÓ[Ã\ÈG.ã/»ÒTKÕ9Ô>§:£IݺLq„,ÄgšU¢–‚å©Vi aWL§ø¯–Ñð£ÕÇ…è£zÌçõÊ%Í‹­èÊÞľÙqƒÜè,,Ázš_˜[¡ãÔÌ îÕÏñ#¼ÖAš`“eø"¯ßÚL “R&`>‰_<ÕbTÌ?_î­]JV­c(´šìôk[ÚE( ¹|nS·d¿QK|$à©[6/ ã:‘¼¦–ï¶¢uÆluË+FQÇF|_ÁÕ!W鳨ÀKt ¬ÏÏ…?>™Yý™$Y Ïïhfˆ~ÿy?|uâeà©B+ÓôÇј$~·¥¹´%\œ­×ZÝl~Š›Ìøã{@\žèVŒ ‰×aø¾GcãW$©á‰\œ»ü\È!Î3S¢ ʯ·Š2ÑSÛ‚’”j^™iŒ–û¡ÍAz†ÃLCWVýƒ« …¡<)?ï^l4&.&Öiœ¬[â‘Á"ÝŽv%Ÿò+ºñpZl”ÙÔX‡äžøuŒÑñ\)Óˆ~f_Úíì˜ãF—'ö›¯N€FB!ñæ¶Å« _??ûóáû‘_WTL£[@~ɺv²}r©BHªˆJë_óQÅì,W‰ÁÒ¨‹VVQž YDã¢e0‚Á¸—+d8:vn×T87ŠÂÚ{çM'‘ *”ªG/ÞóbgUÙ/ËÑ…ƒ¡3¬Ô³‚'Ε“°(̈‚É yR20žþ Ã6Ÿù~iݦ±±ÞëKÞtYùmW‚WT½ûe Qè2OÒyÑu³VTHR®W[uA.:õ’ËX‹æAËél³®ô^¤$í÷ýÒWNñDK&1'`÷ƒ¯Qn*Ó™ïÍ1S¹–=œdø3YÜg壣àïèÛù9»"±Yþ‰‹pl“™ò®Œâ•¬\ ;Óršß Lwz¡ãö$ŽJ•^dWŠÀcÏÖÝh¤Ðµó´ P?ŸÆÑæZí!Âå1ÔÙW³WI×N©„ÆÒª®}-ž‡òóÌ¢ÁÛÜOs$jöp«“¾9(Ž•ý¤LrîY%ÚBY³° ¹Ù¤p¯›ióàˆíy˜æ‡¾ 5°}:j>¦øMÅÀW%<×TÏ_=JuCS" .¥>( üå«#œ®°C€[³<R]$ïä*³$©àrq¼î¥QT4BrvCÈ;VoO¬6ÇèþXQÒÆ)Ư™£‚Ÿ½ß^p9e›AÀýÒ:Çç¡ Mü¹Íc‡['úÇyþà‘É=w‡^w€émd<—:0ºìÒèpc4/Ýú–EçÐMÿóï^vCU¯âØÉwÎ6vÊï!w;#癫Z*®=Ù/&#căQ)Ó"o2‹]> l™uB㔕Ùè–%£7ŸÅ‡ò —íd¸©u–Ò@Õ6Ó$¸ë:ÒíHRWqˆ$_‰ñCοðoŠª³ˆ+@»pÍøOv–ÆOó,›¼žå·ÚßÍhØ ‘U‹ç¼MŠ@€êù¥ 'Ÿ{&Ò™ ¥¨M8ý ®õíe(ºo`àkïw2®côùÁä4¬l«+.·R¡f÷nü›ë:\<%N²”Šh•ânçÀï©î'ý_{$A³QxGŽK°o Ã4vòVx]&ß¼Q†N¿«ÜKür6‹.…™‘\AlNìßGµW¼dI0Ês.<¬©ï•Vœ-@ á®{­yç÷þ}QFÔùþðË¥ûö«ši "ØJnXwáâì€-;oýÿÌ,\Q endstream endobj 53 0 obj << /Type /FontDescriptor /FontName /TGHNCW+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/F/I/L/M/N/P/R/S/V/W/X/a/b/bracketleft/c/d/e/equal/exclam/f/g/h/hyphen/i/k/l/less/m/n/o/p/percent/period/q/r/s/t/u/v/w/x/y) /FontFile 52 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CYMRGO+CMBX10 /FontDescriptor 39 0 R /FirstChar 45 /LastChar 119 /Widths 32 0 R >> endobj 15 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NWVXUH+CMBXTI10 /FontDescriptor 41 0 R /FirstChar 65 /LastChar 116 /Widths 30 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OCOGQQ+CMR10 /FontDescriptor 43 0 R /FirstChar 12 /LastChar 122 /Widths 35 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IZNREI+CMR12 /FontDescriptor 45 0 R /FirstChar 18 /LastChar 118 /Widths 36 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PMXUNP+CMR17 /FontDescriptor 47 0 R /FirstChar 66 /LastChar 119 /Widths 37 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CIQIIG+CMSS10 /FontDescriptor 49 0 R /FirstChar 66 /LastChar 116 /Widths 33 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RWGALS+CMTI10 /FontDescriptor 51 0 R /FirstChar 65 /LastChar 116 /Widths 34 0 R >> endobj 13 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TGHNCW+CMTT10 /FontDescriptor 53 0 R /FirstChar 33 /LastChar 121 /Widths 31 0 R >> endobj 17 0 obj << /Type /Pages /Count 3 /Kids [2 0 R 19 0 R 25 0 R] >> endobj 54 0 obj << /Names [(Doc-Start) 6 0 R (page.1) 5 0 R (page.2) 21 0 R (page.3) 27 0 R (table.1) 14 0 R (table.2) 16 0 R] /Limits [(Doc-Start) (table.2)] >> endobj 55 0 obj << /Names [(table.3) 22 0 R (table.4) 23 0 R (table.5) 28 0 R (table.6) 29 0 R] /Limits [(table.3) (table.6)] >> endobj 56 0 obj << /Kids [54 0 R 55 0 R] /Limits [(Doc-Start) (table.6)] >> endobj 57 0 obj << /Dests 56 0 R >> endobj 58 0 obj << /Type /Catalog /Pages 17 0 R /Names 57 0 R /PageMode/UseOutlines /OpenAction 1 0 R >> endobj 59 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() /CreationDate (D:20131113201921-08'00') /ModDate (D:20131113201921-08'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 60 0000000000 65535 f 0000000015 00000 n 0000002799 00000 n 0000003128 00000 n 0000000063 00000 n 0000002904 00000 n 0000002959 00000 n 0000116053 00000 n 0000115914 00000 n 0000115775 00000 n 0000116333 00000 n 0000116192 00000 n 0000115491 00000 n 0000116474 00000 n 0000003012 00000 n 0000115632 00000 n 0000003070 00000 n 0000116615 00000 n 0000006460 00000 n 0000006176 00000 n 0000003277 00000 n 0000006284 00000 n 0000006341 00000 n 0000006401 00000 n 0000008043 00000 n 0000007759 00000 n 0000006552 00000 n 0000007867 00000 n 0000007924 00000 n 0000007983 00000 n 0000008135 00000 n 0000008451 00000 n 0000008825 00000 n 0000009257 00000 n 0000009571 00000 n 0000009885 00000 n 0000010501 00000 n 0000011056 00000 n 0000011394 00000 n 0000025878 00000 n 0000026175 00000 n 0000035051 00000 n 0000035292 00000 n 0000055986 00000 n 0000056433 00000 n 0000069380 00000 n 0000069683 00000 n 0000079592 00000 n 0000079838 00000 n 0000087989 00000 n 0000088220 00000 n 0000099256 00000 n 0000099506 00000 n 0000115147 00000 n 0000116687 00000 n 0000116849 00000 n 0000116978 00000 n 0000117054 00000 n 0000117090 00000 n 0000117195 00000 n trailer << /Size 60 /Root 58 0 R /Info 59 0 R /ID [ ] >> startxref 117520 %%EOF Biostrings/inst/doc/MultipleAlignments.R0000644000126300012640000001216712241047515021752 0ustar00biocbuildphs_compbio### R code from vignette source 'MultipleAlignments.Rnw' ################################################### ### code chunk number 1: objectCreation ################################################### library(Biostrings) origMAlign <- readDNAMultipleAlignment(filepath = system.file("extdata", "msx2_mRNA.aln", package="Biostrings"), format="clustal") phylipMAlign <- readAAMultipleAlignment(filepath = system.file("extdata", "Phylip.txt", package="Biostrings"), format="phylip") ################################################### ### code chunk number 2: renameRows ################################################### rownames(origMAlign) rownames(origMAlign) <- c("Human","Chimp","Cow","Mouse","Rat", "Dog","Chicken","Salmon") origMAlign ################################################### ### code chunk number 3: detail (eval = FALSE) ################################################### ## detail(origMAlign) ################################################### ### code chunk number 4: usingMasks ################################################### maskTest <- origMAlign rowmask(maskTest) <- IRanges(start=1,end=3) rowmask(maskTest) maskTest colmask(maskTest) <- IRanges(start=c(1,1000),end=c(500,2343)) colmask(maskTest) maskTest ################################################### ### code chunk number 5: nullOut masks ################################################### rowmask(maskTest) <- NULL rowmask(maskTest) colmask(maskTest) <- NULL colmask(maskTest) maskTest ################################################### ### code chunk number 6: invertMask ################################################### rowmask(maskTest, invert=TRUE) <- IRanges(start=4,end=8) rowmask(maskTest) maskTest colmask(maskTest, invert=TRUE) <- IRanges(start=501,end=999) colmask(maskTest) maskTest ################################################### ### code chunk number 7: setup ################################################### ## 1st lets null out the masks so we can have a fresh start. colmask(maskTest) <- NULL rowmask(maskTest) <- NULL ################################################### ### code chunk number 8: appendMask ################################################### ## Then we can demonstrate how the append argument works rowmask(maskTest) <- IRanges(start=1,end=3) maskTest rowmask(maskTest,append="intersect") <- IRanges(start=2,end=5) maskTest rowmask(maskTest,append="replace") <- IRanges(start=5,end=8) maskTest rowmask(maskTest,append="replace",invert=TRUE) <- IRanges(start=5,end=8) maskTest rowmask(maskTest,append="union") <- IRanges(start=7,end=8) maskTest ################################################### ### code chunk number 9: maskMotif ################################################### tataMasked <- maskMotif(origMAlign, "TATA") colmask(tataMasked) ################################################### ### code chunk number 10: maskGaps ################################################### autoMasked <- maskGaps(origMAlign, min.fraction=0.5, min.block.width=4) autoMasked ################################################### ### code chunk number 11: asmatrix ################################################### full = as.matrix(origMAlign) dim(full) partial = as.matrix(autoMasked) dim(partial) ################################################### ### code chunk number 12: alphabetFreq ################################################### alphabetFrequency(autoMasked) ################################################### ### code chunk number 13: consensus ################################################### consensusMatrix(autoMasked, baseOnly=TRUE)[, 84:90] substr(consensusString(autoMasked),80,130) consensusViews(autoMasked) ################################################### ### code chunk number 14: cluster ################################################### sdist <- stringDist(as(origMAlign,"DNAStringSet"), method="hamming") clust <- hclust(sdist, method = "single") pdf(file="badTree.pdf") plot(clust) dev.off() ################################################### ### code chunk number 15: cluster2 ################################################### sdist <- stringDist(as(autoMasked,"DNAStringSet"), method="hamming") clust <- hclust(sdist, method = "single") pdf(file="goodTree.pdf") plot(clust) dev.off() fourgroups <- cutree(clust, 4) fourgroups ################################################### ### code chunk number 16: fastaExample (eval = FALSE) ################################################### ## DNAStr = as(origMAlign, "DNAStringSet") ## writeXStringSet(DNAStr, file="myFile.fa") ################################################### ### code chunk number 17: write.phylip (eval = FALSE) ################################################### ## write.phylip(phylipMAlign, filepath="myFile.txt") ################################################### ### code chunk number 18: sessinfo ################################################### sessionInfo() Biostrings/inst/doc/MultipleAlignments.Rnw0000644000126300012640000002442012227063322022310 0ustar00biocbuildphs_compbio%\VignetteIndexEntry{Multiple Alignments} %\VignetteKeywords{DNA, RNA, Sequence, Biostrings, Sequence alignment} %\VignettePackage{Biostrings} \documentclass[10pt]{article} \usepackage{times} \usepackage{hyperref} \textwidth=6.5in \textheight=8.5in %\parskip=.3cm \oddsidemargin=-.1in \evensidemargin=-.1in \headheight=-.3in \newcommand{\scscst}{\scriptscriptstyle} \newcommand{\scst}{\scriptstyle} \newcommand{\R}{{\textsf{R}}} \newcommand{\code}[1]{{\texttt{#1}}} \newcommand{\term}[1]{{\emph{#1}}} \newcommand{\Rpackage}[1]{\textsf{#1}} \newcommand{\Rfunction}[1]{\texttt{#1}} \newcommand{\Robject}[1]{\texttt{#1}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\textit{#1}}} \newcommand{\Rfunarg}[1]{{\textit{#1}}} \bibliographystyle{plainnat} \begin{document} %\setkeys{Gin}{width=0.55\textwidth} \title{MultipleAlignment Objects} \author{Marc Carlson\\ Bioconductor Core Team \\ Fred Hutchinson Cancer Research Center \\ Seattle, WA} \date{\today} \maketitle \tableofcontents \section{Introduction} The \Rclass{DNAMultipleAlignment} \Rclass{RNAMultipleAlignment} and \Rclass{AAMultipleAlignment} classes allow users to represent groups of aligned DNA, RNA or amino acid sequences as a single object. The frame of reference for aligned sequences is static, so manipulation of these objects is confined to be non-destructive. In practice, this means that these objects contain slots to mask ranges of rows and columns on the original sequence. These masks are then respected by methods that manipulate and display the objects, allowing the user to remove or expose columns and rows without invalidating the original alignment. \section{Creation and masking} To create a \Rclass{MultipleAlignment}, call the appropriate read function to read in and parse the original alignment. There are functions to read clustaW, Phylip and Stolkholm data formats. <>= library(Biostrings) origMAlign <- readDNAMultipleAlignment(filepath = system.file("extdata", "msx2_mRNA.aln", package="Biostrings"), format="clustal") phylipMAlign <- readAAMultipleAlignment(filepath = system.file("extdata", "Phylip.txt", package="Biostrings"), format="phylip") @ Rows can be renamed with \Rfunction{rownames}. <>= rownames(origMAlign) rownames(origMAlign) <- c("Human","Chimp","Cow","Mouse","Rat", "Dog","Chicken","Salmon") origMAlign @ To see a more detailed version of your \Rclass{MultipleAlignment} object, you can use the \Rmethod{detail} method, which will show the details of the alignment interleaved and without the rows and columns that you have masked out. <>= detail(origMAlign) @ Applying masks is a simple matter of specifying which ranges to hide. <>= maskTest <- origMAlign rowmask(maskTest) <- IRanges(start=1,end=3) rowmask(maskTest) maskTest colmask(maskTest) <- IRanges(start=c(1,1000),end=c(500,2343)) colmask(maskTest) maskTest @ Remove row and column masks by assigning \code{NULL}: <>= rowmask(maskTest) <- NULL rowmask(maskTest) colmask(maskTest) <- NULL colmask(maskTest) maskTest @ When setting a mask, you might want to specify the rows or columns to keep, rather than to hide. To do that, use the \Rfunarg{invert} argument. Taking the above example, we can set the exact same masks as before by specifying their inverse and using \code{invert=TRUE}. <>= rowmask(maskTest, invert=TRUE) <- IRanges(start=4,end=8) rowmask(maskTest) maskTest colmask(maskTest, invert=TRUE) <- IRanges(start=501,end=999) colmask(maskTest) maskTest @ In addition to being able to invert these masks, you can also choose the way in which the ranges you provide will be merged with any existing masks. The \Rfunarg{append} argument allows you to specify the way in which new mask ranges will interact with any existing masks. By default, these masks will be the "union" of the new mask and any existing masks, but you can also specify that these masks be the mask that results from when you "intersect" the current mask and the new mask, or that the new mask simply "replace" the current mask. The \Rfunarg{append} argument can be used in combination with the \Rfunarg{invert} argument to make things even more interesting. In this case, the inversion of the mask will happen before it is combined with the existing mask. For simplicity, I will only demonstrate this on \Rmethod{rowmask}, but it also works for \Rmethod{colmask}. Before we begin, lets set the masks back to being NULL again. <>= ## 1st lets null out the masks so we can have a fresh start. colmask(maskTest) <- NULL rowmask(maskTest) <- NULL @ Then we can do a series of examples, starting with the default which uses the "union" value for the \Rfunarg{append} argument. <>= ## Then we can demonstrate how the append argument works rowmask(maskTest) <- IRanges(start=1,end=3) maskTest rowmask(maskTest,append="intersect") <- IRanges(start=2,end=5) maskTest rowmask(maskTest,append="replace") <- IRanges(start=5,end=8) maskTest rowmask(maskTest,append="replace",invert=TRUE) <- IRanges(start=5,end=8) maskTest rowmask(maskTest,append="union") <- IRanges(start=7,end=8) maskTest @ The function \Rfunction{maskMotif} works on \Rclass{MultipleAlignment} objects too, and takes the same arguments that it does elsewhere. \Rfunction{maskMotif} is useful for masking occurances of a string from columns where it is present in the consensus sequence. <>= tataMasked <- maskMotif(origMAlign, "TATA") colmask(tataMasked) @ \Rfunction{maskGaps} also operates on columns and will mask collumns based on the fraction of each column that contains gaps \Rfunarg{min.fraction} along with the width of columns that contain this fraction of gaps \Rfunarg{min.block.width}. <>= autoMasked <- maskGaps(origMAlign, min.fraction=0.5, min.block.width=4) autoMasked @ Sometimes you may want to cast your \Rclass{MultipleAlignment} to be a matrix for usage eslewhere. \Rmethod{as.matrix} is supported for these circumstances. The ability to convert one object into another is not very unusual so why mention it? Because when you cast your object, the masks WILL be considered so that the masked rows and columns will be left out of the matrix object. <>= full = as.matrix(origMAlign) dim(full) partial = as.matrix(autoMasked) dim(partial) @ One example of where you might want to use \Rmethod{as.matrix} is when using the \Rpackage{ape} package. For example if you needed to use the \Rmethod{dist.dna} function you would want to use \Rmethod{as.matrix} followed by \Rfunction{as.alignment} and then the \Rfunction{as.DNAbin} to create a \Robject{DNAbin} object for the \Rfunction{dist.dna}. \section{Analytic utilities} Once you have masked the sequence, you can then ask questions about the properties of that sequence. For example, you can look at the alphabet frequency of that sequence. The alphabet frequency will only be for the masked sequence. <>= alphabetFrequency(autoMasked) @ You can also calculate a consensus matrix, extract the consensus string or look at the consensus views. These methods too will all consider the masking when you run them. <>= consensusMatrix(autoMasked, baseOnly=TRUE)[, 84:90] substr(consensusString(autoMasked),80,130) consensusViews(autoMasked) @ You can also cluster the alignments based on their distance to each other. Because you must pass in a DNAStringSet, the clustering will also take into account the masking. So for example, you can see how clustering the unmasked \Robject{DNAMultipleAlignment} will draw a funky looking tree. <>= sdist <- stringDist(as(origMAlign,"DNAStringSet"), method="hamming") clust <- hclust(sdist, method = "single") pdf(file="badTree.pdf") plot(clust) dev.off() @ \begin{figure} \begin{center} \includegraphics[width=0.6\textwidth]{badTree} \caption{\label{f1} Funky tree produced by using unmasked strings.} \end{center} \end{figure} But, if we use the gap-masked \Robject{DNAMultipleAlignment}, to remove the long uninformative regions, and then make our plot, we can see the real relationships. %% could also have just done <>= <>= sdist <- stringDist(as(autoMasked,"DNAStringSet"), method="hamming") clust <- hclust(sdist, method = "single") pdf(file="goodTree.pdf") plot(clust) dev.off() fourgroups <- cutree(clust, 4) fourgroups @ \begin{figure} \begin{center} \includegraphics[width=0.6\textwidth]{goodTree} \caption{\label{f2} A tree produced by using strings with masked gaps.} \end{center} \end{figure} In the "good" plot, the Salmon sequence is once again the most distant which is what we expect to see. A closer examination of the sequence reveals that the similarity between the mouse, rat and human sequences was being inflated by virtue of the fact that those sequences were simply much longer (had more information than) the other species represented. This is what caused the "funky" result. The relationship between the sequences in the funky tree was being driven by extra "length" in the rodent/mouse/human sequences, instead of by the similarity of the conserved regions. \section{Exporting to file} One possible export option is to write to fasta files If you need to write your \Rclass{MultipleAlignment} object out as a fasta file, you can cast it to a \Rclass{DNAStringSet} and then write it out as a fasta file like so: <>= DNAStr = as(origMAlign, "DNAStringSet") writeXStringSet(DNAStr, file="myFile.fa") @ One other format that is of interest is the Phylip format. The Phylip format stores the column masking of your object as well as the sequence that you are exporting. So if you have masked the sequence and you write out a Phylip file, this mask will be recorded into the file you export. As with the fasta example above, any rows that you have masked out will be removed from the exported file. <>= write.phylip(phylipMAlign, filepath="myFile.txt") @ \section{Session Information} All of the output in this vignette was produced under the following conditions: <>= sessionInfo() @ \end{document} Biostrings/inst/doc/MultipleAlignments.pdf0000644000126300012640000051535612241047515022332 0ustar00biocbuildphs_compbio%PDF-1.4 %ÐÔÅØ 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Introduction) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (Creation and masking) endobj 9 0 obj << /S /GoTo /D (section.3) >> endobj 12 0 obj (Analytic utilities) endobj 13 0 obj << /S /GoTo /D (section.4) >> endobj 16 0 obj (Exporting to file) endobj 17 0 obj << /S /GoTo /D (section.5) >> endobj 20 0 obj (Session Information) endobj 21 0 obj << /S /GoTo /D [22 0 R /Fit ] >> endobj 29 0 obj << /Length 1691 /Filter /FlateDecode >> stream xÚÍXKoÛF¾çW>‘¨ÅpI.@S@q4œŽ€Ú¢`(JV"‘ I¹ñ¿ï¼v¹’é¸Z IËÝyÏ73K½\>{þ:Ö3•‘ÒÉl¹žEa¤y2K“<(’|¶\Í~õ®¾òvð¶YÕ üÞÂgÓÀ×¾†¯Æ2oðçq¨¼Ÿ?ús­¼OH Ÿjèýß—oŸ¿VÅL© Ð:Bmº’"™Í£<È‹H”•@ß!HŠRQ[Ÿ¶A9ÀQi˜Íæ*Í|‰æ´þ˜ª–ìQÞ >G2Ï:©½«VTÔ¬béçlf¹gé‰ ´NEzÆÒ_ûyÄL+–òÊÈPðûVÂJ{ÖκJÙ¬jÑ~ƒ2úzt“¸™¸†æ$¨Ñ”, Š(?õó=—¢|ØIˆ/YÄ_…¹·`? ±9¸ÅAœ%Ìü®E w¨¹öøô‘bfìSñ(-‚e¨à+æô%ÑL%Aœ¤”¾¹Êuå1, ò¼` Wœ¦˜í«y%é‡`A‘F)²‡``A‰[ÊŸ ò 0DÞÐq.ãÐIá–㊮ Y áå¼Éî‰Üˆå¢Y]]¢M[“ÈhÉ(¡õ¾Dˆ}F ÜÝüSM1kZ s‰y¹§šA ç1ù0 Dv[ZÕý”üìò–ÿ Ø¿Âçr1HŒ£Á oÃÎ -ÿþª•ÖSÚŠ)mxÍÚm—žËËFî *[õûrÏI“N 8±q$M‚Èà뙃RQâ½!yˆ ÈÖ±r²H"ó°ÊC Úò– „È ÇtQÐ|ľêݾœf‡1Þa•,|¨JÛuî¥ähvIz7ïæqê0 ðêiÞ–GP噎I͇–«ª-7d‹3«œm£Ù´é§”Ø‹Ì Ù¨zÈ=¤[ w”hâNJ€îëŽ:3m ’"Xv5TysFX¬“@EZuÖÒh™¶7“ÌÛt-J>ôüØ®ù·ÜÙiC¶8g—üpÙƒEÎ]öT-ï–BIçÌE£b;˜«zþém3ØÉ¼@ 8ÜïSmK€8È Ôˆf-uQî “øAN¯¹Ã“ç8øhÝrÓOÃTŽ£¶–f•‚e¸þrtdpàhk–ÙrßC: WÆ!h™QQ6[IAØ’· ‹$ëSM·¤ª–ƒóXœÛÃ0F±Ùä¥÷§Ô6¥a•›åd(ÚŽbï,5Ä\뻉;P°-MÅ#q"šäR¡u^]¨Îè)²§åpúÌ0å=rYóݦ’ø ;º*¼ÜJ«„ížJg8UÓòÒ z 'šM=RRàå„‹OìàBµxˆ:Ž˜ËÆ°6ì¡äŒ÷:ƒ%2 E$S` ¦¢·< Ä]̧T§^ÙÕ¼°8‘ôØR‡¡%WÊ£!Àî=¯é2IZ"^(e§éAí@WŒ³1JY ’úcéè³9fÂÉôRÕh.űº#×Ç(ˆû#!Øßž5uúàžD2¶>ޏ‘Å1ë« ]k‚''ǯÁ0ìZ¯a} J6spùþJ»[s}¿óu:6œ•í͆å¹.Âãœ@œÓ±öN{LßBý©½¯Ñè¿êì=×v"L*ZñšÒŽÍ|ò>àÃ]ŒÞB¯êd –8é¤=·: ”²ãö›cÍxrÒæaÇ©‘w‰YM¼J EV˜Š%‹Ø®=H+ܺæÒ˜-Wì •cãvJŒž æÅ(d¬°oÑÑÈÆ¡ìäE«9oe=‘lbv’í¼š¯.pÑ‚€Nô‘nDRé¬×êÆ”ß¶uàmz§ ›œAÐU¦hj”ä-N~¹EüÝKénR§LÞ‹"ª§Ï·fµçÓ•i+¥Ø×ÊWb%¨†r~ôåæè)QlocÍí@~ïi@ê~^šÜ‰ðÁÉ{#¹žÉÕT‡M­Ã†,ׄQuzdÒïí5íLÔwP‰:3¯Êl-Æ‚î]"ïZ‚¾3©’^<ÖŹNåÙâñ|-d†õ *¹ç©/33I3˽¶ZtÂEç…<~–•£³”óË©ž J£°ø_ˆ’^¤à+ó²wã*‰;qüâ± Š•lü¯ä¥´”¢½/DÂßEË…AÌãJ9†k|¥Ü;Á0 +qáè(4n]< ˃Ì{‡ž‹ÿ4•¼qüWÐ<{‰ŒU Ã‚fj–GοÏ^-Ÿý2U®0 endstream endobj 22 0 obj << /Type /Page /Contents 29 0 R /Resources 28 0 R /MediaBox [0 0 612 792] /Parent 40 0 R /Annots [ 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R ] >> endobj 23 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 489.036 143.832 497.902] /A << /S /GoTo /D (section.1) >> >> endobj 24 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 465.185 191.075 475.985] /A << /S /GoTo /D (section.2) >> >> endobj 25 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 443.267 164.813 454.067] /A << /S /GoTo /D (section.3) >> >> endobj 26 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 421.35 163.688 432.149] /A << /S /GoTo /D (section.4) >> >> endobj 27 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 401.364 179.887 410.231] /A << /S /GoTo /D (section.5) >> >> endobj 30 0 obj << /D [22 0 R /XYZ 63.8 705.06 null] >> endobj 31 0 obj << /D [22 0 R /XYZ 64.8 700.753 null] >> endobj 35 0 obj << /D [22 0 R /XYZ 64.8 502.097 null] >> endobj 2 0 obj << /D [22 0 R /XYZ 64.8 387.367 null] >> endobj 6 0 obj << /D [22 0 R /XYZ 64.8 270.924 null] >> endobj 28 0 obj << /Font << /F35 32 0 R /F19 33 0 R /F42 34 0 R /F47 36 0 R /F8 37 0 R /F54 38 0 R /F56 39 0 R >> /ProcSet [ /PDF /Text ] >> endobj 43 0 obj << /Length 1437 /Filter /FlateDecode >> stream xÚíXmoGþî_Ü/ –ÍíÞ»ÔV"Nã¶R¢*½onT85ÄC-åÇwv÷Y¸; ¤N$ÛF··/óòÌìîì¼ÌÎ^¼£V*ÒHE­ìº"iE©'âT¶²aëªý}§«¼ÀÛçÙþƒhLtO4%š-ˆQIô/¾zî÷Ùï-¯Õ•R¤a¸ÃM¯ê ˆnÐåD?ÃKH˜à¼Dß ó ÌýË eEh´*Äík0ÓLn!´d æ­ó¯†— D$.*ïæ·WE§ëûª=èÏl㙓}æg™Ã†>éftɇvd5Rc+-Œ¹8%…ïûd ‘´„=«53ð2ÀT” ¤ˆ£õbþÜý]'Âsö¾Ÿ;ÝPù„€<†ïzCÔcxް|ƒç–…Þ6–W4Sûõ½Õá 4£OD Q ‰¦ë¶9Kèxÿ·Pêo"¤Ÿñ`þ9y(ŒeE¶ÂZ§ƒÙ1¾Ÿ#_²5Z÷üCèr^ÖWXЀ㙀ŸÇþÕ úy°-? »­~{Upð(, ÁîX4Ü ~Ÿ*ð°Ð Ó‚sgˆÒÏÐMa¾ƒV0ÛtøxtöÔɰ&DÛcýé îq˜zL±Ÿ¸Ÿ€m£„ñuáyH7‡§ã²­%ØZ|;HöõOÜZ¾ÃiÍÎ1¸s=àhÿH]ÛløhP~%ºc—Õl}·Úï.¬ æ,jÆÊ¼ÿ úï z¾3þŽ]Žç¯U=ã8Žöhèîú¼Æ’?!q KælŽ»*v#~9ðƒWÍ+P,îÀ¢d‰ÀÚ×ùó–YVZÍV˜b¯sÓ•Tc©°]οCûëŽh{v®ƒcÉ.*fîªo©HHOm»È!:Ó¹‡"WÕf ­îÖÚú«·k‚t›28ØÑ%ëËvú/oב`”±¹|Mê}1Óª»¬á¸Tûáxâp<¼2·³œX’ ,—Ì2s=8˜›Üdß[Û£égÌô°=·ýâjÕÐHÖ–ç¼ÚÂÜQWb·9˜àoDÚê¯á·¡¶¼jü5ÊQƒ- fúxÒÁ™Q_ÿ¬9г{8ß3öô/+ù£¥ Zþ@Ü• ÇîW¨¡Àð{ÝÏXÍ0 KKV!—x®ç뇪í÷?Ñÿ/kšñðÕÛš ¿†¼Ùìµ·®msÊ,m¿Ý­…ÊI"·Í¬BfäÛOzWò ?=¾k²Ç·ŠdJm[)óñï}:ìÇõiUEÂ/¨ŠDµU‘ï¨ù5ˆ'o/ïäªÈ#†ã”ªÈ#‡ã¹*ò\9¦*>WEvnçªÈsUäPUDùR„^JiHJùabQRzÞÙ/ÙÙùë3B endstream endobj 42 0 obj << /Type /Page /Contents 43 0 R /Resources 41 0 R /MediaBox [0 0 612 792] /Parent 40 0 R >> endobj 44 0 obj << /D [42 0 R /XYZ 63.8 705.06 null] >> endobj 41 0 obj << /Font << /F56 39 0 R /F8 37 0 R /F57 45 0 R /F54 38 0 R >> /ProcSet [ /PDF /Text ] >> endobj 48 0 obj << /Length 1161 /Filter /FlateDecode >> stream xÚåYKoÛF¾ûWèE w¹ËG‘p•ÔmÐô°èÁõ–iÙ°IzÄÍ¿ÏììPJ¤ê:’ H‡—û˜ÙùfÈü%;yý«‰¼T¤‘мìÚ‹´H¼( DœJ/»òÎ?}£ÂÁx(S{$™ƒÜü˜ £;)è~á¦I§ì Üù®ù;4?Ò d‘Þz½2£öO ãfŠyE×€ štC¸Ú\mØ ;U„ š®¤/Ù{/ð|)EjÌ^ ”˜ì)°'gïO24c­Ñ~(qvɵkÞ3<&dûÆ )ôP"IdÛÍÍ0ø2Ð1<@ó–pvz­B¿¥1rÏ)bC_E2…¶ÓØÄ×&æñé@ÿœvA‹Û)@>ñx6Óê>M˜Gý˜SŒ·°?r±Óò¦Ùè‚|YRä„Ùgº/hÎ=õOâ’Åmц›…0q—¥ÉC“y;Tk¸¬'ñ’,V¨Ó"2Pí ÖÙWAcÈV„Q¹ÂÆ%_k6ÀÿšÏ!‚Éþí¡k¿1<]¶§òÃ1Âlu™[bâ÷À îQíA †%½Q‹>8ÌQÀQŸå‹ ì쌎†·”“¾lˆî•9¦ò£Øv’$GË'V—”)•«ÄVˆI-R­Û5ÝG _9ªxðe¨@Óún‚ÎwŸSÅdÛXÝãA^Ù5(s¬çîîÒ®ûêÚ80Çò­º]Û›5¢Lc!u!\U÷ü²áÖѪžücGåê«P‰4Ö,/ wIã6vÝC’veÿeIR°…0ÄÏB›ûñŽž™”Æ/Œ÷nZr€Í유ù˜€m±˜œ±¾l­D°ñv—ðs$csùšŒäô»å-ê$h]pìC8û·÷d‚vàp<– ík+Û’g‚á)퀳¢› ™N‚vÀ0ü‚öTSõ röÈ“å…_™ý-ê$hg̽ZNÙuļÑÚØ);t³žöèå`y A£šòo‹¨ƒÐ#3˜TG->èÇqàbwø Çãhpºé’†°J»±] ×ó`©p»¦g»C…s<ò ^ÂŽo±J•ÈìhâMáÚ [œ»ŽéÌ]ÇÓU‰æê3·tê®wH8‹ÏÍv­¢|Q{> endobj 49 0 obj << /D [47 0 R /XYZ 63.8 705.06 null] >> endobj 46 0 obj << /Font << /F56 39 0 R /F57 45 0 R /F8 37 0 R /F54 38 0 R >> /ProcSet [ /PDF /Text ] >> endobj 52 0 obj << /Length 1897 /Filter /FlateDecode >> stream xÚíZKsÛ6¾çWhÒ 5±øgÚÌ$NÒ¦“äÐ*§4Z¢l%Ñ#RQýï»/ D¹I'ÛŒð\,¾}`Ôóé£_¥ù¨‹Lg£éb”%¡eEæ…Mç£Á»± j((+(%”%”×P~—öÊ” J3ž¤:¦% ®.eÄÎj¡œóœþ6ÒQhŒM” ‹4åm™XÊÖ-/°tæÜÜAõ‚š–,Ò›ôfLð +(Ç©ê•æ*ˆ¥ãR@#óЈˆTžò–dðÊ´;7²À4òC‘Àù¦!¤Ï ¼…²8[9É•´+™³”þ39øÊ³íƒàájøg#²Û9¹”}õPAB¿Ô5“EKán%+–UªH÷eeUb Pæ:Éizé1ÛˆXÖzbÁÍ€ê·(¡Wn?:Ú¯ž,%:ÔR}/à8!meÍ]‘âûpxÚß8ØTÀ8&P½òl¯ø0Ln½ÐÑÞ [ñ¨Õ18ÒÛ‡c¿|8ìÛƒ!»0¼­8;Cþßa@üEʉÜë'^ÿ‰…­|—9“ð£ºé&1–_¼ãÙòÌûµGžîõ™W·ãCõ“ïË^TºMYf4ç;û‘ÝŸQ t÷>âÄ$î£Åª›LBõnšíK˜‡æ!yH`þÿ ̆áß$0wŽ/I`î0 à L6˜ÀÜ—y´ ÿ‘žÒÁîB°ZrÍì ʼnÚlŽ=ЧK@‹3€mè0Xý%ô›Ö—ˆ8Ãñ$3Q0=··Ä剧:‰ÃÔ`6Ã^]S1§ù¡òÄi¨R7™xÝÛÄXËŒ•Ë%‰ Ø5Üu ’¥r œ6W ÀLN°¸vSH€Š˜;*+@Ž¥sæ‰éÛüÎyRIœeÁº¢°ê9êù jôEŒ=”Iˆpi§Å­ÍÊËk2Žú2ÂÕŒppXFÄCOFi’Ïe ©Ë‡·K÷:ç©g4¬QÞY™ŽõÜé6<ÝÆæã±Ò)…k\U#‡|h ©r¥½õÐì2Q(%³’: .Ž’chÀ´î|V§[F;O€Ë‹©[g€<4>[5#u+Þ[˜/[fDÔ ©öö§–CÍ.ìOëÃQ —+™NlÍš ò+”8 jÍ wLh°tUD?“ £qæX„u8´ÝÈ»Dg–8âi=¸Ñõœ+=¥ˆ<3QžŠ>a©7ý5e;@ƒÓäj7°iCYŽÍí¯ýƒ·4B¶UÑÉ:ð`œm匛Êa4‰ã± †•ú¸ó3i˜ªìs}_¦±¾É÷ÅIá´êN A¡<úudQ® »´Ø?µ¥µŽZæô\ ´Þ=2a’Z6‰dÿ1ñà`ºó¨ø§ƒ‰ÓÆêª¼¤ë¼Ï ›³¼qÄ© u”÷EVq`¯_¾§ê\µ²›ÜUã=­ÏðK#‰UtoÓ†»ù¦’àÁ¢ÆÂ‹ãèß|¢•ãõˆ£ÿâ†ARÿ«žÇÖDê‹ÞÙlàU‰#f"t{Š}&R ûÇÞú‘2‰5*åm2Q¡ÀF¯Æ&&Ö&CDîíÃÚŒY¤›Ë$hðºHƒ×LÉ?<.¯×b¿Ø˜#ç+º=ˆ‹ÕàŠ÷"'l×ë!­Í0²0V 7ãTõŽ%@þãÐMëÎv…_DsÛ2_‚9VKd·©å0Šl$q¦XZŒi%±ÝfF|Q„MŸ—ƒn"ëæö&xnotT²$Žá¼{öAœ¡UÅÚ µÏ.Öâ¡›Âl¾Z óã@Ëc¾†!ëy»¹NI!Ñ¥[PÛ±ýÈ{ß½ó†kåYiµ+<þBl_wŸúÉ–üEÇ> ÷Ý[÷"»ö^—î•~ëyçz:Øáʽæòk#5Ï¥ùÉÍ(ùgaoN¡|î¨î3 ¿ÁýÏ;ïäûÏ*Ç÷÷Ÿ¼ouÿãÉ¥U†© qtf:×™»*±>—ª%ÿ4öƺï6؉žÉß+»H¢jÐþ÷ik³ï³þ-ŠmOŸ, ½°›ÞÏ%°sÛðEÖ£á…Ô’BSŒ¦’T-ÍØm+^¸ oœÏ¿ï9ŸDÇa¤Íg(àTò°È÷¿JÞçVuu¬Ân~p¡1†çÓ G/§þ–»HÝ endstream endobj 51 0 obj << /Type /Page /Contents 52 0 R /Resources 50 0 R /MediaBox [0 0 612 792] /Parent 40 0 R >> endobj 53 0 obj << /D [51 0 R /XYZ 63.8 705.06 null] >> endobj 50 0 obj << /Font << /F57 45 0 R /F56 39 0 R /F8 37 0 R /F54 38 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 729 /Filter /FlateDecode >> stream xÚíZ]o›0}ϯ@ÝK*ŠØ€´MbôcÔ=tì©ëJX-Kª$]ÿþ.ö5˜Z¥ ‹~8ÊÅ\Üc_ûÄâSÜ;9gÜ œ€SnÅ?->r|‹®ãÄŠ'ÖMÿã±Íè°ÿƒ9¤€…,zƒ™o&èø°Ť¿l+tݵ§èö(7yWâ1s¾G¤ØØ¤x•µwxÀþ”˦äÝ~‰aÜÆ_,ײ qÆJá®òqȦvVï‡ËÜŠâ{TÑ‘½‡'[š—`^ç ÉáªJØ®ª¯"Êì”—åCÕ— /EóüP¡¬O[Ð %q‘“Spû WÈïG6Ãé˜c“!Ú3 nQ?3lb*‹ü§Ì¯‹¹Õ¦šbÐ#ñ›/º%ö¬f‘O1å -3“ 7,SêÑ‘'Üm°²ª]ª‹|ÜàlÜê©Ñ< Í÷'Bû¬ñ)g¡"e2:h'èˆp;š!%÷ut ;C‡LÕF ¶Ø÷p : vã¡]! ¸£¦ut°æéØÆè¸ÎOõŠ)£w‚†S\wu«Á{; Y^ "<×#­<¤PöhзÌ1Êô¹“Ä/h¹ÐÂSµ_r¼j¨Ùê}•Ž–o˜$ó’4–JŒW(1¾ou:À÷Oå´T•G8g‹\ŸK5ºF{ŒåG (]Z£tY•Òe{Qº¼…J—í]éV-h=‘¢­äzi? k '¤žÜz•Ìá›a”î®J—¥k”®QºÕJ—¥k”®Qºÿ•Ò]a¹Òw ÎaÚÂe5 ×7 ÷_)\nîË ·Å§Ökîr[N‡Q¸¯R¸-þß³Ë]n‹iØEáväR`W…ÛbZZ¡pÚ}ïí¾W)ÖÅîwÀ™QÄݹó5_7˜;_óuC•öu‚sç[ç{rîkç ‡¹ìªãû¾d†e~½³¸÷‹ïßã endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 612 792] /Parent 40 0 R >> endobj 57 0 obj << /D [55 0 R /XYZ 63.8 705.06 null] >> endobj 54 0 obj << /Font << /F56 39 0 R /F57 45 0 R /F8 37 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 1775 /Filter /FlateDecode >> stream xÚíZÝ“Ó6ç¯ÈÐgæìÚ²ä™ÒÎA[hxh3Óʃ/_gˆc; ü÷]í®d9v¸ Ì{‘diµû“´Úýqg÷¾ÿU¥“<È‘Lf«I"ƒl’äaæÑd¶˜¼ð^L#/òrê+{>T¿D œòù×CÓ~†j e=}9û}Nü( r¥:ÒO‡á”Ç\t}Æ¿œ¾K§þ`ÐË^C)¡Ì¡¼†²„²íÁ’t°d,óL¹t~ɳ#S/ºù>Vôõ`ùª” ”ŠO B7(qn$Â@;Úºe—Ø8yâÍlóÅÚÁuÍCDz° ’|Ÿó¿Kç÷þÍ)¤›aH¦ogi·ÒxÒI«>w «_y:F-k„«'é\÷3MEYadYÔ¿£ÃÜÛBH—ý Ôd¯ +—®½+Q rÅH¥ô¼EXH²iK¸Nà2à÷ýNŠx’ž’JnW|“¬ø„¬¤/+'=QVrCŒoe Ô 2²LW:ªW2{²H·ž,áèE²†ïäñ}ì09ÍÐ;J¨Ì>qzeðpq&½ú^ À®h»ó†ß¶ú—oÇŸŠ­ùƒ?\PåPòñÝP<*ªEsëË\lyò•V¸aïà®åz-h®Ðóºv£÷…ße1×ñÚ]‹\¬#­àw+ ÁIæý=Ö^]*¬R²k†hÀ[”½g¤„"wŸªRƒ ³Ÿ*Úš( ‰yTH¸EîVÔú½Ð‹ÎH·,ìçEˆBÿ·È q;ʾôdpdÙMfèc [Ú¡1xDA#‡ø\ñ1¨§ª‹•uLJfµ×C¬’4HbŒ=J¾LDo£OSÁg®egûqOSÿf}ì³T9FÀÜŽ%χÏ0¬اì6Nˆé0=‚tàÁI¤¼ù%¼jw¤êmIUuGªžxïHÕ;RõŽT½=©ú Ãñ!¤ê7 Çü±ÀÙ“ªÉ©zKRUO¬«¥ ½*“áÉÈ{§“ŸzOªÐ™Á;j¦D-b®=¡ac)pWІûß!cJ,Ù0ˆRu¥ÿ+M*bK“Z¥t0Œì#5 c’ååÞ’¶+âýBÍÁ°5Gzm£×<`Æ…”[0f‚¤$·|3¦ºúTè¿vÚª·C¥})RŽ‚BCó©=ý†ohÌÆuz I¥e,•“"7œ'+ŠfË¡++ËôÎR+é«Pv ;L*®øHllhÍV4ȲpJÿEj™¹#= IEwDYã÷Ò¥–YÖukIaêµ`o[óìn9VjÙ:¾šúŸbÓ¡WyØL¯'çêˆç¶t|)uÇOS?‰…÷Õ/˜7ÆÏt$xlweòĹÎ2 :å½Ò³çöon|qÃâ _BöƒÔ¿4øô)5®˜ŸÁ¡Lâbng õ}CF&ô˜û\.%Ò.‘;~h(›‚‡†˜cû €Î1‹ ]=ú'Ž…㎧\µ4¸ÞóÙÑõ9"ª;‹—‰ÆŽ@P¦G spxyeÙ€|Þ½_f÷þj‰>™ endstream endobj 59 0 obj << /Type /Page /Contents 60 0 R /Resources 58 0 R /MediaBox [0 0 612 792] /Parent 40 0 R >> endobj 61 0 obj << /D [59 0 R /XYZ 63.8 705.06 null] >> endobj 58 0 obj << /Font << /F57 45 0 R /F56 39 0 R /F8 37 0 R /F54 38 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 1766 /Filter /FlateDecode >> stream xÚÍYëoÛ8 ÿ¾¿"Ø}qpÏÖðu[7tZ_‡b·Nâ6YSgËc]ÿû£HÊ–ÙÚ^ ÜE%Q?R$E)¯²'¼ÕÑ õÓHDƒìb)?DiàÇi8ȦƒOÞ‹áH é] Co eIϩʲ†âC¹†bÚ(+(s(? ü誥C¾„r å%3µ´’†‡ÃÏÙ_ƒ`0 C?ÕºeÊïkÎMx5/vÄ~"ô“(%~Ÿ`dåóp$‚T{ ñ@’PÖÄ%êr‰ ¾²è+Îí++g‘6¬¸c¦™éWP (Ó)k7Ôÿ¨¸ÉŽâ‡I¨üT©&§fË‹áHFÒ+Œô¹úuUyË ê½™ÚÊvHïv(o¹¥QfÖürfH?±——…4‰Ãb× ªŒ"~’€¼ˆ.oìÕwéGW0¥}ÆvÒ7 —¹ÏYV]/;g+¿$چƔÔáš¾ D7n2=šM|!S;÷wbÄ¿êÈË/ öGFÞÛaú\íÖ¶ôæhKð-@¢iR•ÆŠPƼà(ÖRáSZýâ@Wèª; €½Ôùtξ1JŸ–yWT™úaÙ è÷ÉÄò²¤UXÑ–6@Lbe é’>·ë]ˆ•ò£8½¿…$Aè¢^.¸`@ E ll Ýöx¡–~œh×"ìêyO½æ Q¢›w E‘d–Y‰ëãÞ+ ›5·¾ÚDcÉTåîhÜÜŸ¤ák(ï9ÞiÙE¥_ÖŠ²+¥7AÏÏ7lª!ïY]¥prU>sÇ5%ìh¥ˆå|Ey_ 2*\ ÷kE8ÚÖì®>£ÒÚ˜yÅ5‡YŸv‰ûÕ5‘Ð#i'û4@ 5¥Š„ÞŸàÉ<’ÂOĆÊ!ì”PÞË­àÖFõ ޵·Å~©³¾ñÁX bÙç)äšac ’K::;0Ll\-M è0±q£àùxÜØI9sÀ`P­‹ñÆÄT¥‚*¦öœÀíkÄ…µ¸2eqტB¿" ..“¾¡-øüž¡œ Æ:.øræŸpɘvâðÈ>™C;dúÓ½†Ã3û> endobj 65 0 obj << /D [63 0 R /XYZ 63.8 705.06 null] >> endobj 10 0 obj << /D [63 0 R /XYZ 64.8 538.576 null] >> endobj 62 0 obj << /Font << /F56 39 0 R /F57 45 0 R /F8 37 0 R /F54 38 0 R /F59 66 0 R /F42 34 0 R >> /ProcSet [ /PDF /Text ] >> endobj 71 0 obj << /Length 1297 /Filter /FlateDecode >> stream xÚÕWÛnã6}÷Wû$+Eu-ºœ¤ Ú"-‚í>(–±%×—¦û÷¥‘-·û´h0"9Î’ghåð§g¾Î3'R¹ŸG‰3ߌþ~§*!Ù'¡bKž¸úa£œÛfô üY‘g½zÂíõltu—90NÂÄ™-•ä ”: èaæÌJç£{7Vî ÚËqÿ«±§µvÕ7c/Mf‘{„ùúþ}Faè »«:å-Ž¡5c/LÝÕç(.øyfÖô¸ÇÕj\ÎÉ÷þûWÔ«J£¸?°S ­~A3üiöãÕ]œŠŒ¼Lûˆ¤í§™6¡2šìâ0öT¥.ÆT›¸âP»oì½dõ%úw¼0ð³ U~ÇÆãG+hŸ Ã Ý ú{ÕСÅ0†}£~Ds´ šÞ@{„vmíš¿<7cœó = ý–ÏDÿ†u¬íTØû¢ý&|Ü =ëc*äÖßýÀü#o„½Ô»'h½€qK:ÜBƒaƒXa v?/LTýf·¾o±'zÀwf|(Þ²œ¾F%£m¢­“ËÌN >í? mûU@.e7ÂæÔNnôÿÀý‰ØÒÓ6úr<mvá{¾ˆáíx íiV|ò£>|CaL.„ø“€ËãöO©NÄé“'üñC1È›ÕBqBŠðe÷ÀQ̉OãL»Íq ´\VÔ¦S¬ÁþÁAèÎq€ìELUÕÀP ‘#Ɉø©gSÕÈr¨³7ògâ>¦Kœhx5òS±1û.yHkµ!ÚV›#«ŠùxxiMÏŽŽž—d{]Íѱ1Çùã²)oÐ'G[Š’C&J6diÁ“'«ÏB÷´~žL™\w-ïãL…SïA/×/4ÃÀZËâÕN– Ð Þ^“Œ@xo’G!c* NpýÀtR‹Ì›c'"GŒ8™Ù’d g9Cv²ÀîÎhW¡:Úl1°ŠSk1E¹Ù2êï«.á%¹„(Þ†®éÀ1[qã ÚFå•ÎXx¼¢Ks¬Î˦ r?ˆsXŒ¡­5éÈ{pàô·<®X§=ÒɆe5ٜ߰ õÓ0±«½­ØÅÚ]î¨V”Qa>0%$žkóÆhÚéã`^%ö¡È‡B¨x!Äý{þa²=¿èj™NK$Õjô^$œýmÏJ¹¿qÀ/}7l„å c<„ã{hïØ«Ýé…•§Œùm`)e.Æ»Ò%G€~`í%¹á&=·ÞŽ#Ö^Ò‹€áçZ-"çˆÿKè$ú`>ïØHmç¿åµ]8 öf½X˜ž¦’KÉŽåWqéê W^sJŒ 8©¡{*9ˆ?9†ƒ9Y'W?൸îësß+¯¢XâЃ¨:¿ïžN}èõÖ¹>v»¬HW ø¦x剦 Ÿ¹¶é4ïU½[ÏP›ý•0@j°l©¯Fj‘™]Ó²E2 ³²1䞘\’Ò¬Ÿ[nN„%2SY²g{Ñì(oµôC+¼¬È|ßA[Ô%ÿ’‰S?Èu¿ÚÅkè›®ZjzóÐcÃþ¬£Øì¶é°Û.­»‚¦ ?V•(HݯCв`®§:m2¡/íŽì‡ÈûäÌ~%Ö.øÐø~=•W>囵“ÿ!k÷¯Y¨•9pJèë”àg¨7ú~6úÄ'Óú endstream endobj 70 0 obj << /Type /Page /Contents 71 0 R /Resources 69 0 R /MediaBox [0 0 612 792] /Parent 67 0 R >> endobj 68 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./badTree.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 74 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 75 0 R/F3 76 0 R>> /ExtGState << >>/ColorSpace << /sRGB 77 0 R >>>> /Length 667 /Filter /FlateDecode >> stream xœ¥UKOÛ@¾ï¯õ”Tí°³ï½}‰JàÜ€CÒ'-ñ÷;»k;IU Ûú<û}»ó\‚3 ¸‡?₟ã‰8j.¿ì¥”°ûnfkqôUñúÉÏü H¥÷çòɼÃ@y‰ÚÁ¤†Ñ÷§zºÃä^|™dýÿ& ÈGÔ2+œožšù…àÐó':t&+\N;~qï¤:à^uòƒÿz Ïâê$Ü ‚3~îeÝsA*¢r ”EMP÷Ø* V‚‚A¢}\Ö¯D%¼A#ASD©Y …Æ¡5i½å#Ç=ÜëU¯q_Bˇò•ÍîWÓU½’Å¡3Ä´(U’¸Ü-g¿Æ $Œæëñ LÎ^©¥-¡òœÏ°ÕÚŒ,Œž‡èé4!f¯øDõïN'Si²k¶„åt³èèFêqR!…®î1Ç_z¼±!%j—õ)1Ú„œ*ÊÕ[÷XsÛÄм»ßýb%Td×4§/ )Vè°·è4¯Ð!Ä"+è45Ÿ*¦êê0ïaR9i® f¼Ä½b%ˆlò»-ÀºÃ†{’3¿â3Éä÷KÜ+Vyм«Ç,·G^›4@j(Ѓ‘ Õž½L‹wì­·ö·vÅ‚<^:{ wì1¦ªííníÚT¦··pk7’ ÔÛ[˜ìﱜ5ïòœ, 5’Cº Ót-d%‡Ó‡[•.4o¡‡<6ݽ®9YJgzx §Zð™NrËíõ§ËdzÙ²[ÆÇ£&¢±í°[=5ó8¯oÊÝ,¦õÁÙ·sØ_†U»”ÝÍ’&\>~‚Ír½XÍ?\âz\­’‹  /‚Íí²yrêÔé¢ í%?_.îz… ñ‰°µè endstream endobj 74 0 obj << /CreationDate (D:20131113201924) /ModDate (D:20131113201924) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 75 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 78 0 R >> endobj 76 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 78 0 R >> endobj 77 0 obj [/ICCBased 79 0 R] endobj 78 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 79 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 72 0 obj << /D [70 0 R /XYZ 63.8 705.06 null] >> endobj 73 0 obj << /D [70 0 R /XYZ 212.963 409.983 null] >> endobj 69 0 obj << /Font << /F8 37 0 R /F57 45 0 R /F56 39 0 R >> /XObject << /Im1 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 83 0 obj << /Length 1422 /Filter /FlateDecode >> stream xÚWKoÛF¾ûW9Q@Hs—ËWÐp›M¶h­[ÓMÉ2‰”EÊ®ÿ}çI.eÇ@ƒærfwvæ›§Ì"†?³0i%e±p¦ŒJ—-êýÅýE¥in2Ú⯉iä¤.?ííâ}wñü)+T©¡'öÇÕÅåÇbߙͫۅÉldb·€Ql‹Åj½ø+ø¸4AÏöt„ÿ›e˜$I`ß-Ã<Ï‚+þ€C\bÛà€Ý2´y°†Õ©FÞšy7K >ñúô…·[ÔÚ„oí™ñØçŽOî«þËÒ  Ö¼e[P\´ü{õËåÇ4ó Ë5›’5¨äã†]2u©’ h?Ç&嫵·á^¶ ×Z,Q¿á¤­³$¸ñ­pãëMUøQLhŽ$~âb®÷RÄ9“Úà˜ãtµÖ=õ˜'·WPj\Üñ¶Ô8L)¢ªbÚ¾;ŽUÿ I‚ƒJæ‘àÄr °¤°£ÿª–Ê.ÐŒïSÜÒ ±Hè½dh¤võÌ"=Ш#Ë8mÖÔû´äÞ|×L‡¼åãˆ/èQWTXuŒð´͸¡u§Vêè× ›cçé©cz¬<´i§±ÒÔ½çÃKˆJÌyéÀΆ€ƒAsÁš¯Enk$ì lü<3fÜ¢žS™~ p‹AêZsùA5lu»ä6ȡʣÂ+¤)¤:]µ[U1-³W÷¦J¾Îr¹¹„’ ^¼ü¦¼ËS¥ZØS8U2±rÆÎ'W?JpnÕ6ÞŸÏ«nQ)SÞÛ æX ¸8gÉÛFsSçZgЗY™Ýå0Y‘mº»±.ø ½$‘œÆê•§ÒQh 5Ìí4­ç}§B±ü øP J%/»žJûÍ8(ÏëbÝs̹ ;Ì*ìÒltÙ¨ P ¶a6ò2®ä–Šy“꣨O·ÌzB$!"è£å fXç2'7É•Ùxƒç;ç…0ŠK à(8›vŠïAÕ¹ZJx787¶{ ôá9Ê…‹l^ª¼ Zþ?¸›ºèÛñK€³ ÌNf>Tò ©â×( Pê# ó  „éªõÖý0%Ã0Ål§×<‡Å¤&rj¢¿]Á¿ëðme~¾Þ¨!s2œõ°6pýQy'u•˜‡‡¯`¢(ùÿ”Äü¢äŒîÞè&‰ò¤„d(a,–d(‘sñauñDÛ©÷ endstream endobj 82 0 obj << /Type /Page /Contents 83 0 R /Resources 81 0 R /MediaBox [0 0 612 792] /Parent 67 0 R >> endobj 80 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./goodTree.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 86 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 87 0 R/F3 88 0 R>> /ExtGState << >>/ColorSpace << /sRGB 89 0 R >>>> /Length 687 /Filter /FlateDecode >> stream xœ¥UKO1¾ûWŒ8%U;xüZû ´E‘¨›pˆBBw“–%âïwlïn"BÕ$²Ñçñ|óŒ€à þˆkþÅisóý ¦(¥„ío3]ŠÓoŠï¦# ¿_ò_:)Új$ã太WË!ŒŸÄ×q2ðÒ„Þ€²|ä#Åíàüq1ý5%a0[ïa<Ú—Ë;,$ð—lò†™êß8£ ¡u6U‹µBëcå ½Å=c) Êѧ’¶'2U°õè-îùÊ´D>46 ä—ÛA c08¨ Ü‘§]ÑÂ-¹ã y†¹¢€…îå-Ü’2Ž}/Ïp#ÅåÄtònÉ …jÃßÂÜ(Û¹“·0Ê?¾yc܇d°ÈX2,Y™[ЧÝ; y¸º’¡³­ŽQçµy]ë#Ô57¥ÎëΣîT¿¨nP7¤c+Fu·Qß÷mÕÙ×®cÍÆ¦ø ±ÐØv‘Uëæeö ³åÃs~ WóçIýî¹åëV±÷ ³¢ÎA?N#'Ü >}†“f±œW³“»á{yøŸ51<‘m 4‹æå÷_ÅY¯Ïy¼œ-æ=õø ›Ç« endstream endobj 86 0 obj << /CreationDate (D:20131113201924) /ModDate (D:20131113201924) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 87 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 90 0 R >> endobj 88 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 90 0 R >> endobj 89 0 obj [/ICCBased 91 0 R] endobj 90 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 91 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 84 0 obj << /D [82 0 R /XYZ 63.8 705.06 null] >> endobj 85 0 obj << /D [82 0 R /XYZ 205.67 409.983 null] >> endobj 14 0 obj << /D [82 0 R /XYZ 64.8 138.517 null] >> endobj 81 0 obj << /Font << /F8 37 0 R /F56 39 0 R /F57 45 0 R /F42 34 0 R /F54 38 0 R >> /XObject << /Im2 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 94 0 obj << /Length 1461 /Filter /FlateDecode >> stream xÚ­XÛnÛF}ÏWy¢’æU" ¤€’È­‹Ø5l¥h‘-Q¶ITMùö÷™=K%ªµ‹>¬IÎÎåÌuW~?~sxœô{™—õÃ~o<ëõc/íõ3ßdAo<í}q~έ!­KZZwfëyäD©h}õŸ¥0ÎœÖ ­S/mEë#ý–^»möD˜^`ï­±|ÿÒó{nxY’´`?*ˆþþBõpd*ŸAÃ’ïlIë™ÖñÖ¾G‹eò-S•‡ ö²8î¹!¹¤Æ¥_gqàFa攌â–UÞ«,ïØh¾1á0©3¯ 73Oãs8¨ƒrǪ-îÚ}F¾s.Ÿ$ô¬ò¸†ý’c²Ì7â¢Ç¡3¶¢´}Nri#·Ö !'”jcIE7† ﳎû¥¸ Dq»únsy#áÚê²ÿcŸå½)b&”×”ÎÄù“-M$ËBÎEP?‡h±hohx±i€â/†Ç/\U“¢Í˜oÚŒ¶»F[y¢…}œK}r\ûç²4Œs©¤]eb… ´—JkŸvCç-Î/«I³“¯¡gVB–tËõMlÛæF~fBÌû)aªˆªA—íõƒØv 5WDâ\‹°ˆô6pç6D¾–hæC*y"¡›²¶©!·*¾4Ptè“Ô*BM\ý´31œ’(q†•ÑðhÝ¿5"ò ]ÒôRß„è˹v×ÊdÎÎQ$0E8:F¥EzŠZ ’‰$2 % UûӇ͚|ÜæJ·ÛþaÊÔ0Õ‰‹Ì/$2²×„†‹eîÔlÍ0)Ë¥ù®£A:Š'“x ¦BÓyðÌllR~{.þè÷ĈIr{hÕã}ßö¿œWÛc‘nKê%Çó>uœe‡ÇqÈ'@÷Cø…^¢Ï’*ƒ0v. ž6k-yç„AÎìé»´˜À²sʘ@¦>9T9–AisfÇodË‚ü­ë#DkµØmÏéÁpeÖ j@†j¶µ-)ÿé½uMÜ#üÓ3{ÛÌ ÓõÜ4Û“r…‘0ß’Pª£—X…äUXsDšÕœài£òjrš öë¿0úìa¼£_¶#ÔghÈçªô&uH$r¼ !Z¬ÈÅ»÷HÞE‚Í÷iÅ` ±½ï®uŽº¶ fêúÇ5xdÔr©§P}¥L¸8.9zßñdñG¼»ª Wà}ý¦¦i_µæk5´aäÙ+î'ðÁö¨F/ñ°íïÄå›1ú‰^?À'~ŽiýA‹Ã2Â((€“y>ã"éá}ŒñàJ|ܨOg¼Öy¾Sè»@µ}€î]9ù‚œu`Cþô¿á‹ƒ,Øñ™ï¦Ÿ°†uâë7ø’n|§Ðwcè¼@\_‰7ô³dGÿ2—Ðý“¢½NÿžØº};‡½s•Ëÿ£>†[ùÜ[Y7®!~è|&£Ï¤I¶SG#ä|Ÿ~ÞÊ]ƒÅÝßGÁþ:©^Ÿ6»w¯Œá¶©¸®Už@ĶÚPÑ­‹­P«‰b'á¥c,_cËœ)BZ+îïx¿QGÎѾFR´:îÔ,³óŒŽöÀ¢k£æuÅ×° [Vn­ò‰áYËó:Á)0ì5Á^y¬‰©2Ûx_ÃKE»ÅhžÊþžšN÷ÛQÝMLy ÷ÔÿÂxA¾^—œî“â½:Ó«=ÿ¨P’!ª7R~€ñ0~ƒí ôØ÷ªuA°ú5GRºÀ¾Ú¨žº+x2¤Mæ4ö &¦í¸Bù1Qú¬Ž´Æ¡3²uúæö[s[\¹Í’> endobj 95 0 obj << /D [93 0 R /XYZ 63.8 705.06 null] >> endobj 18 0 obj << /D [93 0 R /XYZ 64.8 581.929 null] >> endobj 92 0 obj << /Font << /F56 39 0 R /F8 37 0 R /F42 34 0 R /F57 45 0 R >> /ProcSet [ /PDF /Text ] >> endobj 96 0 obj [480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 238.9 794.4 516.7 500 516.7] endobj 97 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 98 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 99 0 obj [306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9] endobj 100 0 obj [555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8] endobj 101 0 obj [638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 102 0 obj [625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] endobj 103 0 obj [272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8] endobj 104 0 obj [693.3 654.3 667.6 706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9] endobj 105 0 obj << /Length1 1881 /Length2 13804 /Length3 0 /Length 14971 /Filter /FlateDecode >> stream xÚöTœéÒ #ÁÝ=4ÜÝÝÝ݇ÆÝÜÁ‚»{pw'¸ÜÝr™9sfæ|ÿ¿Ö½«×¢ß]µ«žÚOU½ ‰’*½°È(²w¡gf`âˆÊ‹h13˜˜X˜˜Xà)(Ô¬\lÿµÃShœ­@ö<ÿbˆ:]ÞmbÆ.ïDy=@ÆÕÀÌ `æàaæäab°01qÿ—r∻Y™ä2 { 3<…(ÈÁÓÉÊÂÒåýœÿ>¨L©ÌÜÜœt†„í€NV¦ÆöycK Ýû‰¦Æ¶U©ÐÅóRPñYº¸8ð02º»»3Û93€œ,¨éîV.– 3ÐÉ høC2@ÁØø—4x €š¥•óª swc' àÝ`ke ´w~qµ7:ÞO¨JË€öÿ!Ëý‡@øërÌ Ì§û+úDVö›š‚ìŒí=­ì-æV¶@€¢„ƒ‹‡ ÀØÞ좱­3è=ÞØÍØÊÖØäðgéÆ ae€ñ»Â¿ô9›:Y9¸838[Ùþ¡‘ñ4ï×,no& ²³Ú»8ÃÿQŸ˜•ÐôýÞ=ÿj®=ÈÝÞû¿ÈÜÊÞÌüf®ŒêöVŽ®@i±¿8ï&øl@;'èz˜Z2þq€š§ðO'óæw ¾Þ €ù»  ¯•9ðý ÞÛÙØ pqrúzÿÛñ¿ž™`feê0ZXÙÃÿ“ýÝ 4ÿ~ï¿“•@—é}ü˜L|þ~ÒŸ03½­ç?ô?[̨¥.®-£Hû—ä¿"" €7=;€ž… ÀÌÌÁà|ðýß<ßÀÕÿiU2¶ú«ºe”¶7¸ÿ#âýöþ+Äí¯É úkm¨ÿ{‚è}žªÆ_‰Éôýóÿç%ø3äÿßìÿ‘åÿuüÿoE®¶¶ú©þCøÿñÛYÙzþÅxŸgW—÷ݽoˆýÿ¥jÿ³Ð" [³ÿë“v1~ßa{ Û¿¯ÑÊYÂÊh¦dåbjùŸ!úoÞ“ÛZÙ•@ÎV¼pôÌLLÿÇ÷¾s¦6ï/ç÷^ý龯Ôÿ)no 2ûc÷XÞûnìädì ÿÞúwÄðf~_R3 ÇŸ³ `d°¹¼‡ÞÅùÌANðt”ƒÀ(ü‡é?ˆÀ(úâ0Šÿ8YŒÒ#®w¤ú7â~3þ½Ç™þþPÅhö/È `þ ²Íÿ «¿!;ëÐí:û~«Ó¿âß)ÿ‚ïz¬þß ³ùä0Úþ ¾j÷|ß%FûŽzµïÁ¿üþ†lïÁ ÿq¿×æð/È`üWÌï…9ÿ“ütÚÿ‹À`tù‡ð~–‹¥ð_Òß«sqý+à½@×ÝÜ»ßã_ð=ç?ž ÷:ý'úÈÔÕÉéýåú犿O×ñŸor Ðh ¿´2å ²® j¨&p§ß›àŸ¥ØÓL¡¦÷^rúáú„ “H]•ñeÃéN8q¸uuGœêVh™øÕû¸¥&´õ›r۳ϋaœÊô^üÏ)ìÉücáº~"8Bz5¡}ŸWGÏ6-à29Ž®\ÈJyî}’uý¥+c! {ÊûU²/¥3ôÑêQzŸ‹æ(rM2çqI¡]è‰`iÐ/—‡9úׄÝÇ;~ŒíŽL?Ž—GhÆ2ãiI9¨Ds°u²eEì™qÕ\_q•açèú|oÝþß¹ …÷ôÖÖ¡>….vzë<}\8JÏ&JõßÎO_ :¿Zë6TcÞbN¡vp‡íL¹°¼±~kä¼ ¢“fÁA>-Ëä’IÙ`šÇ´s&T‡ÐœR~2Ó:!!œîDž}Íì8-\Q>C?a;ªDJE#èÏF0¤:øN f|Þå:Ëâò4©ã»æ‹}ÓѵK5`2n˜]Ý÷_`K†m°½aŠŸÇÞs‘ãó£$ÖL .w—3æ¶@W‚ív´ÜRH›ÈÁî²v«œ¦>×w®qT!}ª &{ù <ë"jJ||…Ò‘õW’ºˆs’Hç»—É«}Nã%ØœfPð;. И­v„•“¡5œ†µž­ß†wyÓv“]Ê#þÔs…M•»PvŒáÓˆ—^Æ?zä6n‡1\ÿDy$!ÖÄ-I¦ÑVð(äf1ìÒÌ NèãUÖ©“g•Λ¥Pƒ¨(KÌÈõ„Gz;Z"%¼ÌÙ± (@Z–õ=Çå$iØ—fz/Ì–¡ABIDs÷‰9Xõ#É[?D> Mà ôܸAÖ×ÖÏW¶êeø0ÍAÒy7‚ºîeøÛc¦p”:¿ŒŠð¦K²;Ö«ͤ€…ÉŸ°›iœ÷f¦>«™qωoæG¢~ ^Ö3Ž#O²¨en{1GÑ;H„a:„ã<ýh¬2i€F•ö"‡cF6Jbç¾ÎÒFÖf?ê´Eîù{Z ýT&á›þ”w™V‘Ñï'¶~ÉDwŒÆòÝ¥‘#‹Õz÷k›.‰ê,„Ï åEæÖ¼1f‚d_mIi9Nʈz, öc½oÑh×ÏN“ñ¦0èT•w‘Y ÛòžË)?ÛWàéÕê+Gò o¯µôpØâÙ3™p‡Øé·_\Ò3.èi“sàëÒ~V hŽ’ÏU<¡Bš¬e{Ù’«Ú.ÅÕ»¥ÙzðbýTTH9•ÈQtÁ’¼ ÑIEK•x“f`T‹+¶ñÆX;‘hC…>k“‚êP…ìbtgp(ÒûŠ»=_£'õÙïHÃð®d4¾þ öÔ¢ Å “d^ÆmÑÅ7eÛqÁ}jÓ{'‡#½rÂyâš|P*Ü¥2}¯Ã—_ŸÂ)#Rå)k9ëÑZÐ’\t6ž?è9ùû°'Ê5³“Ö}¡é¨Bé$:Y>⫎šH‹‰ª£k“»6·¦Mˆ;éøÑ9 ~wœ=œIêÁÔsoIY¶áª+´ì»u°Dº?l&'NG°îÜ×ßïwcèvñhÅ*;·ïÖ¶Í«*ô5 e Ê üª¼ýšã_ÈO\"»ƒÝ †dm_%MꉩJ€¸*Öèó@ÙžÖ{k#p`•ÙÞ³t‚ †‰áQulÒâÚ#HP2]? K=×hqÎôêJ|Ù6EòoC’ü8‹˜7Àgj[2p>ÙøÑKUTªÉ ²F.º˜ãCfÒ˜K±Īþ”VέÅäÈ›x}mê…NK·P\ŸÎ[669¥²sÚŒÀûb`Úý?õ5R£9Á·n7ÎÄÔeK/TAäAêø¥‹þJ†Tgø€$)Ú¶Åš å»` ´Oê+ÚLj+'yü,ú¢ë16îQiß#êHÖ@¦fÕÊ€zcõ ¹ÈxiµG((k´<œ•Û‡ºôJðÛ÷Ђw¢3®¥ü›Pþ(©ª€òîãçÇó’;{î1æÔ'úÐû½œg¬]ÔxðòÓ~¤^Ä_.Öœ°¬ýòkžÛ^…Aût[‚:MBûO*˜J"V×»SÇç'+naóz–65 ”ÆJ¨MÔ ®ÄЩÎÏi ;ˆÂ¤ñ•ÝŠ¸Ù ¼Ú~‡³-ÞÛ}FØsQ‰em˜è.eÁüæ;W§²Ø»ýù¸N•o¤È’Ùòš»âe Ŵƒ0zK«¦QíÝ^÷`(uþ5Ò T·ˆa+2¸½”CôÂ¥p Øíz Ãnèäf±*›¢OûÄä9½qZ‚›Cv+« `‚ÝX #àÔ{Fw¹`¯\ÅcNà'ŽéhÇûÙú§¥gÁGW%m«F€ý³t4FPi¦SÓ-¢ªe¥¥'ɎƨêP%g¨4ƒšå±Ú·[Ì5Ðñðçû ªJDM3guéþsý§ÙTTyŸY¨´83™=íRä2IÏ”&63*Ô …ØÂfoRlÛG½€¾ÍP%—|êøù…ð9?ÿäƒÓ-@c×ÀÿŽfÏÎã– x_Nxů70RMòø–Ó+Ò˜eÂ0Õ2­…´*_Rý£>ªýgÑ6º¼CÌfJ$õ Óy bŽßîóuBÏbl ¯¿]•Á,GÁžy&R—ÃD±ÏE¥M» W+gÃÍG+„0è°Æ À 3¨.#Sa&P¨­Úý Ó¨JWD"´cNŽbÎN0£ý£^ÐNC^MlòØb• Þö\kwèæévG½§˜«óâ±½EF×fá)C[·\Ç?ÕÅE@[´…[$o€ÖW‘H(ˆÔñ1»Ú-à JÚV©æ2,·-‹Ùu5yEt€­úÍÔЏºSañ†z‚1š.£|CÁŒ¼-ш ¤û*„vk=•ÙéÔ•w%˜éâ1zNCšÌˆÝ³Óñ „‚) 0Ï…ð%j‘±ˆ ½¡e‹Ï‡Q“2‚vqGÇ¥„ .6ƒ…é‘m”Îi±ìFBãnNÄüæ®)ïŠá¢tô2’zC#z§eÛ¥Xšó6Gð/é¸Y»„K­?#r]?ȉ‚[ÌÀóØ›ÈÀ…=ɵö9Æâ' :ý²f7èã†,UPѨ“AùUÁ ÄÚ¼új_Kq²5Y¡=è:ä²àŸôqåCÛ@säŸ#©¦‹ˆo®pñ”þË÷ïPko Ìq‡Ý==}¤0s½BÔý°ùl;ÇŒßä/‰ RÁ:ÐΜW[~n¢N·÷=OÌ HLDö%G¸Å+‡[£d¿¡áCÄ?Ufr`Qd™@’åú5|EHŽU܇B‚B̄Dž~2^ReN»š†ö{$\‘œ ¬Hq‚=ëÝ¿Ò%4úÁ‰^Äûm« ĵӼZ“Ò. •ËÚD#)³ã„gŒH–Z¾ˆ‡\š¨QŸ¡T¡äF‡Ô 4¸®¹=×mùã0°}£šu\·z›t«7éßÖs‚‹æF.ëÝÔá{t£-®’ÝmKœ -&ZႈÅL"|ôŒdðYȦüÒ©^œè»¤'½‡æDœ9ò4‚#cA€˜ÙµÅ³¿"&ˆ‹_2ˆ‡¡J¿ÂGëfH:!bÖRA4b\yúQì ÃmTɵ‰…¹Ý·,.F)÷eÌÇpþa¸<'ÞÍøhSu/™—Sb̆rGQDÄèÌÅ&ßN¼g¥!@/LJi`œT"õèT µ:ÔgÕsòÜÕoOͲ̦ÓMf6?ë]V³u"“ë²8Á¿‡#üm^ûÅàgý©Â•o ‘/Âü7†ë8M«2,ãü™ ~p÷À"AÂ2|¿± H¶rÀÙYù글ï:ò0|‘_X†)cŽÔÁdíǘ1 »ÃFzÎ)Dì,Õ4–óךË~ñ„AãGÞΰù¶IÆ}´˜VŽ#ÝbD9Ô…3TPs7A“âÕ*lI®DxB­;êåO®‹Æò¯YÙf{‘”dLÄÓ ‡WÝúYåñ±gqõABÜþQ=âõ¯Îî⿯Ê«–N8ZË4£B0”¹àNëø) Ì®`²<à;ƒIIòŽ5‰ÎNŒ_dþ>Ò—»7/ÏÛ9ê߯¤µ€•‹[Ù\ŒÉÀ®5u;ÐLêìK>˜)D²/u@æÎ/¯o›ñ•óí·.ÇpM?Ñú¼G;m¼kþ_À3Š'Ä}&ß…¼±MMä»—9tÚ DÏ« ùàiÙà ’½8­˜Öt”`gØê”ªå¥L(G©Qe)ªãz;Í=Ï©ÇkÓh-¹B1I†‹êã~³ùBÑö ß䦜›‰Ž-äòÞ”ìë¨þ?ЯC&\›[Rw>ƒ to@èT‘+…ûò ûSˆÜgIL³"5rö†QI¡Ú`*‘•†Iöv÷óaßëê@µï,d¥Ì¡¼é 9û×¥a‡E™¨3‹h'lf6Ê|– ìDÛÄ$uÎ~bÛ:âò*3x¨µ,©¥ KšXË4Séþ§_x3àû!¬ñÕ—]ƒ‚~¶W¬a¢Ùjk"ÅÂec,@Ÿ1’Èó5Ú §l†’c#9üö×`E^'Ÿûv1¿`ÂäÊ›µP¹’¡Í¶?Ûw‰·“g_­×ÞŸ²…ÖE©×¦úþ~©\|]B;_»SX¿[·ì±d†~¡HçæT˜¸ ÷òûjÐÓ!`'×+§°Ã}ï~\×r 0^¤†ž$V¡c_[ànϬ2gS¹c)=™ÖjiC‚u'ûˆb¨âE«3æJí¸µé x¸C¾…eµÜQ=ÙHÿ¥„µ‰&6ÒïMÍ;{Òûb!¹g﫲>ߨoÌ|*ÒoÁ<ß1ãG¦L_Y¹‰ÎJǼ¬ÁðŒi÷ýÕ_žîàW\†Ìâ)©Ã$V)ì°A°à™ØÛH%·øD²Ñ±*´Í¦ê[eDjj[àTYÔÄ/â²f+õ]¤Woª‘ ²ý¥Ù”>œŽ¡îó’¯x?ÓŸ²È75§r;~¾ÙÚÍp8²èI‡øo&Gµ®‚wžä“† ³R÷Áç €+pÈpÖ˜Ûbæ,Ù[­÷¢çÅÝxÇE3Q8ÄV¤¤ÀÆñìÆ +ÕÒL–×Xªö-$Í´è<(1§¤Òû¹p~½É§ÇØw°R¯•‡U!Èš<ëÝ’4|[ÈyY°»øFtWÓv¢`KB5»”™t®ò<'6ßž¥O ~¿«tmNýéÄí…-b²¬[\FÃB—»Ó®€"ìÄé+²I4ðdü„·ÞÃ`æ,pU!0e,õ°<ΚS³ðˆ,½n&z&aq¤nx°UDC’ÊÓjGwWºHS˜O¨ù`'¿šãN° ãÐ -ŠImD²ä=÷3“‚³ûíØÄaœñµk} 8Ç‚…¡Û¼Ü>¨@¼ªy ÏOšº^–„UërÂý:˜œòýº÷}wŠË0àÎt@¶H8[8¥û«<Ê0†ÏZíÎ0¿Äá¦Æ ÀK–9åÙ“Æ‚1Ἧx™³üH€Èg…©k=”`Ú÷ªé&[‡7´Rá¡¥5@! æŒDˆéº[E›ßB(–1Ýæ¦UýØØMH>p0.Úø@z2ä¬O™\µ²­Ÿas}Ú£Z/wîy²nøfý0𢲨Èw¾¸k™‡ubl*ëÆI·€é^õ$ÚY—ýN‡õµ„É®*…D&›‚£K‰¸XŽ»cÚ˜ƒuÅË—nÖBŒú¡·vc{@xéÓ!-!—§§²ê±ëÚy¤–×[–Ýá«ÇâM¸•,It…³käT¼YdÝ¿®h–àµm{`☆¿¦™çÚ » Ê׺é›Õc¦ãéÕÖ6KÕ5Ù–Ýhêf,¨€‹O¥øá‰ ¶Í&[ÎÕoÞàÇ<ÒÞõF”U‡·ù9ÄZ𼔸Jíu‹"Hî’û©qêªÓ¸9I Ï÷E,÷M{dâe^”–DÀ¡ð“,\š ELÏ…8Ç£äl`µ\¨Ô}±jãpý¦`]èkÅ)*ª-“²#ã<Ç6l߯1WUa“|—xYù’VŽFøŽ’ªê‘± ‡Ôúßæ¤ìB‘pyû—&Ž˜Gàú„wš 4бå+\–èT/, a õr˜‚#*è%G´æ¼êh%}âasÍ ãôÅ%ãV6ŒW2b,¾ÙÁÍë7ÈÛÿ ëFU-VËX³,gR†æ¹h¶}¾¤RÁ»"™.(h,Ó«¡†²õæip°Rñ»Éâ»ßfšQ­KÔÁÖT˜O$Ô”÷®°Œi²²ÊC>¢£½Õ:ÊJ†gêUÓHlÜH­TF4öÃêµT¨—ŠñêÍà,‘ÒKíë÷ÅÔÅ£ð Q¡¶·¨oò|º±ÑL“‚ůÀA^µ£›XÚàÝ<›‹þÉ¢èߘXÓ8 ÆPÁ¤¥ŽÈ5& ÕKCp4;/þxo'N÷'K—>•<âgFÕ»66r"¡°n:$½p¡‰9Ò}è |XCÑe•G¼Ùr†îsY`Ę,ínVCäýuÿ܈"Ê‹• /&VãÊ´óq>_ùE—ß+àm¤@)—FVTÝ1Þ&,!p‡lSð—MK5µ<Üåé³$¡ÊÇêAMi$bRm΋"Í·¶Õ°Ù£…êãðóÔ&Z¡‰ºyµ5µAÁœ¨ü•³ÏÆm2ež~-\xC® y>H­‚ìçÕx¿Éu©_Ìø2Ébª¦6ÕËä稸¦>¦šˆw*K¡ïA£º0ô˜süÂ?YÈíUÇû‰8˜M³—ë±ã?™­hµøÕ¨É‰QÏ4®Ê3FöAìó=¿ìðK6zSánÖ!b²…‘”âRJYiŽ 27¬Òל|˜ægbPÏ`â4|âðrД"¦ÕÊ€tqW–Šºj±'6ËÑ­}4É·o•7ëW‘†ƒ±é”[hZ|޳ľ±¯¯.ÃJ"õ‘©_æ9 îÀ úéÓ ÂÍ œédgóI.y]¹öAôõIÃck‹á³Qf¼8;¨HKëéM¸—Š—¨ŽâøÒçÓL¤îjO=XÈôCJÍ’ümùhœQÇdê¿à¶çet˜ãÏÓ˜:"+úü öëmD×§m2–U²ä¢s3#­ÄMÍ~ãLA ïï²K؇ÂVÛ㌊Æðã ý¤:¶Â“«œ—ϸºÓŸ¡n¯Â®î›£žkËRJ*‡Pi"áf§8zO̬ÝP³lˆý’8Ÿx•Ç|^âÅ„é% ëpƒöX˖ЕšòŒSÃê< &È俆&°Fãe Ý)ü‹5A°è‹z"¯IFÀÁO†QÏu~z„ ÙCÓÀ¨ ö@s™óÍþ¬å¹’Ïʤ^:Õ=çYðP[M;U®‘N´¶uq0¡šeoö°.ŽyŒ£Iû# ˆ–Ë­cµ€UI8Ñ<ø)˜.!Áàà/EjšzÛ¬Ð`>µ3{Dë(Èbe­¡„ó$ÏÙ“ë}Í&z½zeérjgL’[)¤I½VþIîÌräÿ%t6ù…×R&Û³ÄW<ç”þVÞŸ¿U@8š[ì¹±29±‰Ud`g¬Kö7¿eE½®i}=ßÔZö#"¦ÔœKšOÖZkŽùA±é*–ß¾ÌõaÆ}?«/ΈdH £(ÆV^/ݼ&ÌÙ;"Ö®„(O‰ 3»ý}pÄrØ ?[¨‡Šç»ÓËæÙ+U_é.hd™@¸-Ý›–Ôw*ÓC5rÓ¶ˆÐï°U ®ÐÇ2èv¡4 ŽòÍÂWY«{óòÀô°pNv³Ú‚‚îží+¸15xf¤ùVœNŸ¦  <”s¡žÃ·cÀsÉGª|=¿LÀsp\7•sÞ`½2Ʊ=%ć/÷8”TŠüìù¹™¨–šÈÊßµ½XçŠ$Þ$•ÉsÄÜɼÜ  šá#O²*‡ª2uü kr„¿SšÎ©ÿ ºÓ™ãÖÙ’Š¢³!»|óÄ(ŒC1Tñcl¶ØeÝ9õ‚ÀÏ–?­MÚŠc{šù°ÍSÕXTmkŽl™:Qcãý7´( ÏOÙɽôiŒ^]³{3ŽÊP›8–!Â¥èiè à.k~¾fžD!ÒrV[‘]f#v-·†óx§ŒÎ,Ä8Ïév+òìhÈ]ä]O?XÕ‹Qó¸Ç~h¢Ç‚p‹‚[̯œ°° Z©­q7eŠ H.8í‡òGëLNOŽÝˆrÊ—â&`¼pÛs—©m?]ÖÄÙ1‚3r·ég 3SG/(ÊÙ°_)gL\Œ£Ö¢º‘Ñ™A2aVé?†gßàNwÓd%ƒ /ŸK…¡ï› ¤³tq8ƒÈ¾P}»'n‰ŽÕsJÑTMõáñ–ôêù ½0·§š”ÈÊ·=ðAhr¹¿Caçæ£a“rÉzsÞøæâ…@•tG Ù€…ërFÙ=}ÊU÷·ÏÈ}+üÎæ_÷~\©®Ìó•Hb1##–U§„â= ÞôýG˜D¨÷)@‚ç©EÈËäëÎÆ¨.’¦ëBÝÌæ)—<42RÖ‘r%$Ý¥/È¢Ð]4ºÏð€Dàˆå²›$N²ê57 Òdz±âƦ;âñà ㈯²{nmœ®¨o4ˆ0=þS|;¸ž®Š·‹^6~ê‹(è˜z‹>›l&ú‰zSæOA’·«#´&s‚ 5zyCËž3Ë|…z‰/öaN7iúZEâqÐD× ½™ÄáUF¤W`’x…ãLVSm°x}N­/©dÝÞ; }–«‰lÛåœ ´>b|»fóƒ”g'œA‰–nDÌÏsDƒÐ„ØEE m{LBÖY±)_j¯0]M×±Bá¤Q•û­hPÍ=DjËú•‡ÚÖŒp¨Ÿ»:Ujó@‘ÝoÆÉ\ðÆfšÂº9ö¸— ðþÖu¸í³’Ѫp´þ ÷¥‘nã&a1æùŽ„7ú"øöpš!íÈËz±Ê(²c7™Kó¯~Ê'gm:ÌT1h#·k†Ó‡=?VÆG4iŸ$°wluo¬ ¹™±¬‹§{9&ý€J Á Ëã\—Äܵ%dAg&îj¯ :Q8Ìv* gKãdŸÆ0–1­¬î3µéø„çšh+ÄOÔðcf `^ŠÙ×*PúrÚ{Ã( ^!Ô…;8µa«T¼0Ìiø²LuÄ—ù»-¬œÎês¹çÍ1—øÎR Úº*;#±H“”kíy–Õ !•”·ï7d jt&ÕiMÁô^Þ’‘ÄL —ä[ .Ò}dÂëiìf9fÜÉϯ֛vñˆP×Rठðz1]ü)]í„“Ù༲<ߥØÚ®€ùC¬ºÙ¡ÔeüK̶8HqµÖéáŽî‡¸›é ¹;ÆJÌÏ »Ù[¥ ÂýXuz† ùù¯yØE聯,€—"A”wÞ7×^7:|øÔ;å:%Ñše[Qí‡N¦û³Š[âî)ÿÕ ®ø~Ë;px•_ž  \éÓ¸¯¥~ ®®O’,ÛLZ:¼6Ðéë>÷N0Ý·fÑ/)nõÆÕÙfy(eÓˆÂ;°SïYâqšaHÄ¢¹É·êÅ>ß5Q拇Jð5IÝDAÂ"˜;ê 2ô¢Ñg¬ÂîgH!N$+-ü”²ï`*e#¹XÇWç.vÑHœôJ¥o -_çÒJÊ^ìÀ©ôýú uô;7ž78€þ9{\Z£¯ÿI§þg°EììÞ‘» _ýèå¨ygÃ>ž¡[òóm£"Í\ˆ›pݺê’÷ÛI&á´³b£¨JÎÅsÛs¿ôÜg‰“£'¶ØpívCgáÅXi¬¨ŸoÇþ¯ð´!׋€Íâ“fÃ3&ìœa8üÎÉÖbŽY&îpãUµûÑûÞBÚs Þk» “Æ=­U¹ñ*üz¯…¨4óï´ÚÙ(¥óHûQk`š4 ùMdOÉŒž“{§äògëÉ´™6:érVIC=u;"•¢hùu&x¶GÄ]Í#\[kÁx@|›Ž JÉ\=g5GÓ¥P~m‚Ýún‘ÑX¼œšzšg n|X[ù…ÿQ7³‘x£¤–tš9œØÄT0Ýæ'Ý…´ÉÈ%‡~°Tj¯eeÉF'œž¸·”§Š9ðy§Õw‚Ø‘àëöœÿzZ¤«÷¸PNüEaËäã°`¤V$ò0uajÈœÝÊ<Ú5b*ËFö Âþ šòåšQScbc-±UŒP²’UBº vVµ0¦pkÆßâÛFlº1CóÁΊ¯×´¢;‰z,Äo|Á]Kv횥‘à°W:-ì]­«ê¤J;ä¢ajÄ=Øpé—‚¡³›{®O8Ömʼ™»J»XÒu®|ñ5ž6š»QHe¨!nEŒy+‚V›ª v“Œ4;}ùÔÈçj`/²qèO‰?4«“›ØÕd™zE%òÁÒ# Ĉ9D¤t)ê˜3GôÖ„:-îç¿í.¸”’Óˆª}-YU‘à / R…¯7 w˜„ÓUMµ®û4àÖs Hž›ŸfƒEQqê“îi—ïÀ-§[håÆd?Ü/-¨øólÓÞôÅhYâ\§ª¦íPìÜ2tìcvÎçÃFlFç4”úzò.Ó CõyGVõX W‹ÀÛ¯Ê9\×bAç"hÖˆ°Ô`rêþ_¬Z›Ê.îëzРhs]X2> çyi±;?³!êëŠIÉ®þÒ=^Zø°²Ï~Ì8 )ÔÀ1›éðqj¿SØ0_K.ÇùñSàüº–§£ËH¨âÂg¶TBM14äÞù„ŠŠ»ªÖbœ¨¼ÊÏ7:Òh¥ßO±¡zL½¾xùÊ®Îr n¼‰`9ìE¨)Ô8wxÌ„DáN19Û9$óè¶-kSÙ¢ÃsfÃàBë~Z'ö[ðs=U'àYQÛÞ9ÄØÊ.ë›ðoÄËÒâ?—úp°8·²q³¬ëbQòÜàRk›f!5»&é™+ËvV,n}ߢºâEºïgóÛ#~ÉÇ­¯ýu7ïÚð;2Ë—¤¶¬™±¿MŸÏM´)0ê^Wç ¡îbB­øûµ×šx€ TW»¯Î؆ÂÑk$d”¬€žØæMk]¸^=í ìÒpÑNÃ-'ÅÅØòye_,y_C·±þ@z¤­^m8×MüFe ^z—Ò× ÄæÀœï·[à8ʾúÑÊx1¢%­­gÏÆÏUEoÔá”6|í9Ê6“´šp;É®Ü}È3–¥ù:"!n••ßa6ªsÖ©EÍ/"…©OÅiiŠ ±)‰³))IgÛÅ‘UØOqÏÕÐëf}…›A”öN#œ|pº"˜!õæÊ‚¼K˜¡- V*Ã8#A{t]˲Û\«nŽÆàŠ§½æZÖ<ãs ÜO‹¢ép­üli ç|^ó‘Ýš|yüÍ€p0EɤéÚV ö …à% «Lã©òåÇ«%ÒÛ—Þ¾·j›¯«y4Æœ.--"ðç<^ŒU58Ú,Œ‘‹‹5&íA®½…ccbÔ+¾×Vçm(ãFJ  Ú࢑£ h/]Ý«eÝ%Jsš·f†Ê‡AtIÊ} ë ™/X&Mº¼ÄØòÓêJƒàx´ Æ3'†XÙ-6ÁQÝŠ{¨O÷9¦õÁ1YöcMZ“ÏØºW?QPç¬lT&f€Âù=6¬)–ìM¨ˆU©žh´t‚æ„ç»”wzɦV±§êƒc}'ìŸ-qÐkn@¤Rgàƒzö¯xB!þëpŒNøg7žàqXÚÓ2w-¤$ÆÏNÎÝRdÆ÷^i²G€>1Jâs:ššh¾ó=w-¹ñrOý,2rñ£ÅvÒÕ_ÛZÏ4›4>6ɰ]ß¿´Ä[öõŠD#,¹i+¬Ç ²G…2À.Øï .JIrÚ Ä· ·É% <"¸ubÖ\ƒó²%½µÖÖúWÕö°÷öýN‘nßÕk¡§ÅœïÛAÃí¨ìW ¬¦;ã˜&aÿKXÌW ËCÙ$æ´QZ GiƒR®õS%YT 6-6Y$ú¡M½ÆFm”W4Ê<“¦+E.pq3½1}E÷PwNœl JÖ&Ê´Õ?SÉ;ËjâNý$c¡5ý>¦:;ïs•ãGHsË=EV·óð÷1>ìáõföUõ§@5¶’x¾š×a `=ÁÊ/wþ¡'LÓÁÖŸpñÉý)h·Á‡Ã‚•p'K cûZ…x×âÈɲZ¬q´åTËèØN¬.¯ï"+}™¸ Ò ýºù°É5êì{’–î¡&Ü5'n<ÅÈÙ®~ùÕ ”JÆl„Úgõ®mjòÝ3¿ ”ߤòÌÛăyY×*3˜BAc¦aSiNŒ‡ìô ì’ãe"x©K& N‰$‡¿¦ÖwC|9+¿»˜YDU´lý. (H¦ã6E!{´%”Sä^€ý¡8Þ:¯™Ï-œ V0^IɯãGÖ³½á*T, 67O;.ü¹â©ÕjNg1rvù²[Jðuec{6ç ǤœœêÙI“Bäpº|Œ«ŒùE°ŠTïø5ÅšÆ40sÛ‚FÓÌÆ†Î<÷>®b¿(¾~ÍÀ؇ÛMÎ[½Ûé”=>Ü”òTn"¦ ÕHï£¡ËØýËAjܦ¾à …äm3äBÒñß/…‹^9R²wXŠúá¿'×)#`М ºó@©ŽKÚ%eïY–3£â¦ê¿Tf &[RÃ-x1(Mß&ž $c€º¹ŸguÎý¿]¿¤¦96BÂ[޳ˆÜÞš¶ÂQ@MH*?øP$ÆYùõ’,xEÆz|Pº­]uý-ú2“WX›ÐÀЙèpEíº÷C2Nc½f©Ë˜†Î¥¹kº ØÞOÔŒ¡æ¸uõr”+ÏG¿Œp¹‹¹|ãƒÒòaÇPÁìûÞífÒ>ÄYÁféH8&Æ*‘¥ Fû=1<¢œÊ³ò¤…ú0[ЉF*ÉÂ= 8š] KKPm)3mÄûWÞiN?-À&: dÌO!•±ðKÓÁáZ\SˆŒµ¡šëo{þd¹^ûvŽ;iE¤J÷*aד’–ñ‰MlRïÿNŒöº­)5ØÞ ²Vwõqx'-Ó2f4jã²É¦VtÙl‚‰·Uòm† Só%õý8¶£suĨ¹ƒ¶þ5uTàTݰ «ÇâòþyÞYX íWÁê¯Zâã¿$»9-BÛOw¥F}øü<ÁÙÑ{«ö\ÝgžŒ“ïð¤s#×úN<ªª´!ù ³+_štw%cç p» ª :q1¶Œ!¡:Ž kdf)ÁƒÅ-:Ãt —c GÖ#½i.Š(¨ËÝÅ6&ñ4ø›|&[Œ¶#g®å Ë ú†,œt Í• Á¼¬àÄá½9„) Ý›ëš0DµhÏ|€Í>Øjߌ ŽD»„aà?ÐÐ˸¹lèC蛵Ÿþ’wŸ­ŽµIj‚æ9v3ýˆ7.=ÃüJÕç䬄OåUøèp|§ $$þIqÙÊ{‡~Sq­×AµsÕrˆ8ZhC=÷xž„©1?¯HÿaÁQY³è)µ2«­9¤^41ò»}ïÖÔ‘ €ÚÃ\£rˆÙs•+Ìì7ꆦAL]kûb!%LnHTÌ·ÅáUÕÛqíô€-¼zêÖì’¤ .ê-bi„.Èßø¯Ã^g¿HçŸH•ý@œî{ˆdGl½üuò¸k¾˜8¤°c·#øØæÜý"êvqs=c´¿ñË ¡Ûm¾c1ò¤^äS¤}ï÷Œ LóiTôA•MþTOÛ²V’NmZ“_ª|¸/ *ìrjÊ"“ïø¥ÉÍšèÏ\fn†{e ˆçȈúR…“ýV%R®zÇ),CÙp4Ÿ|ý£?ãN+J!·O‚˜7là*Ú±oç-Ó‹”@«_sºÂ6ß%Í{AÿÅbDÛ„ü{È«­ïK¢”©"ÈN̤½Àº$.'DN>ñ;h}û á©i“Ð.Û^ýB¢ÜÒƒsC²{=ñÂpÉçÔ¡¹lþcL˜J‚žÊ ©¿k¿ÝhÌ®E͘ |xÌPF¼©!މóÞ|Jb4€5rýÑXt/ü«úö-L~Á€¥ÔÏ2zE’·,Vν ûj­p9õåœèUyíÅ+˜ôˆ?XÆBP›šü+´ \Ì9óiÆÂáø Ø´Uª,§Ú©~°Â%Œ1 Q Ø°Ø €&bît®ž¨úb¾3ŠW6¥ömúëµ2I¥Ž,³U®’£`²:®b„®þ!êp¼1Ö˜)| %‡þW»ü©¯;­&Ä-–ß Q,‡¸<ƒy zÛ½ÌÜ µRüy(¡ãüÖgƒ†5áûOÄS[õnîíEÊóSYŒß&?Y“vëà­œ,æC?r3g`ÞÓãßõ¡1âuQeïæ÷) â2 H’gGo°7L{³,Šñ!ÒT«h–›´)PiúÛG²¹{«ú÷ ¬)“ÕŸ‡èE‰ v–µ’ôƒuÒØ¤(iŧ“ãf:A&¸à½Q2hŸŒ|Ó¿œñšªöþ õW>-+žç¬X…½¬À«Úp]žçâ‚vÜæ?úÈ€YxDÆpvß_lÃïÁtòåÑDÙ¶ý•`¼mQ (Ôö”ÿ­eóôç :ÿ+:à|j¼I¥ñǨåc"J¡õôfï}ÌD?û³Ñ¼ÏÆÎKbi¯kí3Æ WÚzðÊÌÒsÉ®7=«é?£f¹ÊûW÷\ˆÓ¢!œfOCÐoeíÊ ¥+´©AeÓø²J,1k=ÐsÇ"òn¼õŽBmkª¦àÓR²=­9`ÃB #S.Ø;Hƒoóq¥¤½5°¸eöðí-ÎðÛù€Ÿ»>NTÒÕIàŽ§£q¯´©ëaðP?bò¤ª uW×¼Ò3¶O½Á\"5‚§­%ðOüo¹gN^RFøRE‡KMb*6ÃÄ1+®= 0¿uÑ«S€û2Z‹Q ‹30ü¾æ¡â›mkvâÌ*ûÕh‡ZNâ Ü1x`í7׎ù Å+£ì/²¾‚Ù¨˜åi[u|P@«ãƒº†ŒfÌÐõ#‘‡À•Þl†Ìj†—O#$ÂÃW•;ªu}`¦ù”d‰Ç~ü£^<z°0†Q÷ÁŽ)͹YB9¨„÷îñyðÐÔ¿*ïëâ†[”le‹0û—ïÉu_lIá…æS£s~ߤqÌé‡ÓþŽÚfPÑ€Ç.¹Rqùt~Ôt Qûk¢Õ¬ESl •¯7~”ÿ~ü O5_©ñ©/Û·ÛŠ¹QXáX¼dbn|0ü!6ÛÏôðÜRëÁ³é$þ°µ…Ý›:ЄE·Èaýdý2²Ñ ôN¤`£*ù2%W_‡RÄzÐÕÒ^Ë \¼ÎÞóÚ ž£s–'Gò_u Ä ®ž_ @ü#°ÇăŸJ5I¬áRñañXe—F¦Ýd··œƒMÛ˜Tƒ4fªŠ…öÞ|JJ÷TCz*‡,«Qüq&µ¸?†^»;Á¬S£9p zaSóÊJ¿ý!Èn€ˆ(Kò.V¿W;ÿ·¡æ.B­Ç°¿—<D°j¨G-~møFèç™`&…t·ÛíÑo¢ Ô"IñEå¿êz©gÅ“Ú9*è«z Êܾñ¸pðûíN9Fá­Óý:Òá«tkb=ŠÖx»•Ñ!d ºêjÖýršø€:ÃÏ/XÓ¤ž|pÖU]߯<¾§áäa0ÌLC&º÷ÿÒ(Ÿ endstream endobj 106 0 obj << /Type /FontDescriptor /FontName /XUEYJO+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/A/C/E/I/S/a/c/d/e/f/fi/five/four/g/i/k/l/m/n/nine/o/one/p/r/s/seven/t/three/two/u/x/y/zero) /FontFile 105 0 R >> endobj 107 0 obj << /Length1 1829 /Length2 11121 /Length3 0 /Length 12252 /Filter /FlateDecode >> stream xÚµPØ-Š»»Ó¸»$xp— i qww nÁƒ»Cp·àNpw \™™;3÷þ_õ^uÝkû:gí™’*“ˆ±­!HÒÖÆ‰‰™• &/ªÅÆ`eå`feeG ¢R3w²ýÇŽ@¥rp4·µáÿW„˜èôf:½ÊÛÚdœ­l6n~6~VV;++ßmøâ@sc€<3@ÆÖäˆ@%fkçî`njæôÖç??´Ft6>>Æ?Ò"Ö s#  @èd²~ëh´¨Ú™ƒœÜÿ«­€™““? ‹««+3ÐÚ‘ÙÖÁTˆŽàjîdP9‚\@ƀߔ @kÐ_Ô˜¨jfæŽ:TmMœ\ À›ÁÊÜdãø–âlc r¼u¨JËí@6ËýÀøëplÌl—û+ûw!s›?’FF¶Öv@wsS€‰¹ ()ÇìäæÄÚÿZ9Ú¾å]€æV@÷€?F$E”À7†ñs4r0·srdv4·úÍ‘åw™·c–°1³µ¶Ù89"üžOÜÜdôvîî,]®¥­«ç‰¹±ÉoÆÎv,ê6æöÎ iñ¿bÞLÿØLAN.VVVn>Èr32cùÝ@ÍÝô‡“í·ùƒ·§­ÀäÈÛÜôö…àétœœAÞžÿvü7B`c›9 A¦æ6ÿT3ƒLþÄo÷ï`îÐa}“€õ÷çï_zo 3¶µ±rÿ'ü+f‘‘W—–aø‹òßNQQ[7€'€‰‹ ÀÆÆÁàábxÿw¿Oà?ìÿ°*ÍÿšŽõŸŠÒ6&¶¾?I¼Þˆ¸ü¥ Ú¿Ö†ðßlßô Ðþ#]V.V£·?lÿÏKðGÊÿŸöWù¿Êÿ'’t¶²úÃOûgÀÿÇ´6·rÿ+âMÏÎNo»!oû¶!6ÿª ús¡Em­Œÿ×'í|ÛS«¿ÑÜQÒÜ d¬dîddö§ˆþs oÅ­Ìm@J¶Žæ¿+ëÿøÞvÎÈòíQq|»«?\ ·•úï–6F¶Æ¿w‹tpº#°¾ Œ‹ àÉö¶¤Æ ·?´ `a¶±uzK¼‘ó˜Ø: ü¾Qn.‹ÈoÓŸˆÀ"öâ°Hüx8,Ò#Þ7¤ú7â{ËþƒÞòŒþF¿Y±ÿ ²X@ÿ‚ì“àodþ7|“òtù'œë·ßÖÙá_ùo!¦ÿ‚o|Ìÿß³üä°Xý ¾ jýd{Ôæ_ðmPÛ¿!ç[ìÛûþ/÷Û(vÿ‚œ–Åö6‡ã¿ 7€Åéo•Ì@ÿâõÖÚÉÕö_ oƒ;ÿëXÞünÿ‚oÜÿ€ÿ%#g‡·‡òu}SÊð¯2ä2BXœ³5zdñ-¨í®Z„Еiw\ðÕ®f “ç¢C»ó l"]Õ×€u‡‘Ä¡´•m Úë÷K¤ÏžÇÍu°¡- Ê­^Oq*S»­ “8ýùÇ"µ}ÄðDLjï÷¼ží½4ü-!›Á;e¨²íyQ”r1ï\¿K¹Õö•.†Ìí*ïUqË">•N3E©GêúÍPåfÌâ‘Ã81ÃÑcœ»¡Î\ßüÀÈšx%•‰c@ðþÅQ੽Á}?ë±Z®ÆîØ…O‰¯G y1:Eí)z$ƒ;ïY\#QhB¬?×(ÔŽ ´ç¬!ë\(™ØÁ;4ð+EÝž ‰1RÞ¢:´RÍêÀÃÈ®å)š~f3ÈCpTîØÆñˆ¨˜ùê(Üoét¢ÄšÚoEtM+ Óqz4Ͻ€ŸÛßÇç3MSÿêû>nÝ0ÇI§Ûè†|ÒÁswá=1!e—©s¥öñDHmŒhˆ8ÌfF–õæÓI¦æ`%Æ«¥8aIÔ„¬ÅhͺL§Êk¯Bæ±Q ð’¾ÀÞý{$ˆy{µ]ç ãRÐTtš¿L· Ôˆìc8»jnµÎ—ã¾ QC áÑryðÛ o ñF¡ky¦“ÿ<§H'•r,˘ÒÜ{.ÕâYìQž}çÓ(—C¥\Ì/þ<¼ÚüÁ‡ŠŽ1Ÿ£lŒyùOðÅa˜d&|BJGUÞp’ù%7BÐ {)˜‰ )°»pœ mļ u8¼è{|Kt|$!Æ>•úeƒàêBU>èk>tP|¸IRYLXA 3¡0Éìwm±Öiæ{÷ãl`5‰%?¯ú„´ËNGׄ'¢Çx·”´Á­ba(¬AâJWSiÅŸ¹[ã¾ÜóºšIthÑö»Ç†(Ü¥ÀÒòíãsÍ ä®iq–B·ra’Åœ#i‰¥ÃTKÈÜD—u4¢é.Ìèiå`áµ$‘ÔU¦?-ZÑ7ÍŒò$ªg"²â¹Il’ky¬XÐÎó©°º¾¿.Çh5NeËãgñ˜’1b ´¯xGå (3œÃòqhx:•£¬æŽ¥*ë¶yÀÈÞ‘B€»Û3lî•] OËÔ%úŠCÃÀï¹ÜZ°8LÎ.} Ô&VB£ã¬6™cP´Ó2øìäàJÒ‰QѦ0Ë[sMi'½xäTÁüâjfØéûážÃ\Â;( ^µÀú§Çm¢ ö%ñ'H‰lNOÌàïv*,š÷‡(Lð­þÅ@iè½úk³„RÉ%M[“ß¾Ž}zcsÆœ«3‘zî-ñÏvêÒÝeF‘)xW&rÎZʵ¡éæüAŠJÐ{YzMˆ6‰°*'(ƒ!&™ö/ˆ†Äãy¡y¿´cÎKÌB“b¿EÄ|rS8)É]³ÛŽq„,Ìh–’ó[T,0ú•õÃ6êêÇqvqAØ’Ì»s]k„qR"üGn¼áK|Ìè9k>r$À'ñénösÀ·«§ª‘€àZ¥‹wú(ª˜XÁ:Ü4}¸—£È|òOÙ~†« 62ÿЍ¢U›ûü¾mŠ(_tú=âÌz]ós2ì{™1ó¯Ãö#)Ö2ÙZ€I{ögwzÕ{pï›0s) nW`#8î&¥õ·4meB}¹Ù}V…#û´²ezž!g9ŶqACß1ŸÓ'ƒUøg±ia®‹hD5$Ç¢ºog¹OIò ~¥ä<™²?!Oo÷[/wBVyÝž——±ù^Ù.ŸèHz˜ÅCˆˆ8r÷e)ñ±òàSÛŒ¾ßÒ’¦W{3Äq[7~¨¼†%ô¨!7øÕÀ–±ÿŒ ¤òrו¯CWåû°p®Õ6›á`r%U¤ÿ¤ËÅšH±½è‚­üq¢Ž{GvGµ@Ÿ¨ÎǦ9µBž@ë‘‘—:ˆÜoLù’¼šˆ¨ïÄ¢‰á¿à>ÑéÛù¯îW9g“²¬'Ý¢àX°¦x›±P«-èhI;Ýn1‘À<ˆ „ú^)^îÕ0Æ«ü†Âšœ»S6 EŽTIkdÝÃ¥0K;ÄhúÖûÕÿ„Ž WnAÖD‘uµÒk@«0S§[ÅTzmwðÍŠ¼tFR)kvT³´Âj¡ÙøöáäÒßTÓºûÎGç„.g,«:ãëÎúÃ&#9ÇМ;5~èr—q‚§à½HaÍ0…»ylúäjhó³S9“_&’3,Eˆy`£_lÑÆG €cdÙ+È[¢GNz׺í¸éÐåk_TXR8óŽq䊓pfÁÒç%]}Ï@\4Ñz—¾uÚ]Jc$vƒàÑóó …UƒJ±À !Ôq¹&HÂ>„ #lôÒˆ•[)ï5pü}š´¥œ›.ŠA}!ˆ˜éì9šl¦ô&(¿5¿É»WyEµØ*qG™”e–º‡î@OXøGÿvµµŽÆ+öJ ü¸JÇõéèÇKTß*ÑÀ%³ÈËeJ¢yÆÍ_BY{¡¿le“—È?dLT¡Ì fšÊØÇEÑŠÕÇxhdjhÎZ‰Ò§.+ŒØ”¤Wc7o™­²•gÀ-†$©,²Š•êØN[= Ù‡*k4ýÖä¬eƒšûLÉWX8|ò¾W½{¼IâÉeáé®±eÚW¡ò ßÛ°I"’m zo³þÊ-ÂzØcÖ…¥"ÉW¥6‡äK›KrN¹ëË?reÖIpûz#ÿjѵ[œ…´@ø“*VW#èué³ÔÖ KcŒð'Uþc~JÿhÃêï_zXdöȪÀÇ[›Á䆊«5ˆèc8¬›s¼G”ä ¸IAŒYKbDâ “5“ œ¤˜È¬ÄJŒ’€:$%WB‰z¾¢ë J…Ö %Üçâ×ÏäZЭZŽÏò GUu?3fåžÈÈ~Ò›à1¤“«‹„ÅM C 1 s`tm»ñ$]pSv¾É~… ~Þ¦Ä||FJr.À0ÌmbIX—ê¬]¡|PºÕ-Ñýd¸¹=Kyã ØA7&ËRHpË-n‹)ªŽvt¼ÈSÉœÍU²'Ú°­" H­-à’ãianS»¡³™î—Û§X& &…üŒdh³µ…DUµ­~Ð9«LÛ‘B¶¨º¼ŸÎ3?lpÝŸv§x6N{…è9 A£r^÷I×…݇ÝýУ>[Bàß½²·ä Oa®¬xgïnKeÍe½ÿÆßŸcUþÐçÜã=Xìj™Ö7i½’AoËYé8.•øÔ|Í$|z­÷Žé×1Œ”·*% Ð évÓi¾ÁÒ™æÌ5í¹*ÙÝLò(%hÍ®·Ž«9á»·4ýZ®¨Ø„»pš¢Á8tg2ÆÿVb¡Ä~¶†^[ôÆù½!c y¨¬­$«±a, å'þëhÖš §”þh¹e<­ç~ïÿ \jýËšH¦qÁ qÄÈV»&ëiÔlèÖ‘c<×7ü¡ß Þ1=³_õnÆ1#ЩØÝ¼æbjÔᥙªîR’ÿÉ­ «`-‚:WÞ{a¹x#KÜrÐìS”n–ƒ³±ÐúÅ»[ófBƒŽÓ0l[Iƒ©T#Ëk…ô™ˆ;R›O¹.óسtìi‰Ë©ñ;”'ÈÜ÷Sž/gpOeû[• º’.×ê?5‰;ý¬N¨Ü uLëfÐN‚-¸} 0Äg°WÈããõ-­Ä¾¹£¶¬P½ÒMRÙ4hÎJ~UdÃ’GKu¯ðšÙ÷ù¥mß~R²Dj.ìOY˜%6¢–NïXÚ§÷XºŸDwEjžîÄ©ž¤6£g½æ¯ñ,nIñ1Á߯òºÎÌü¥á’Š BF½?[ǤZM‹g†…™ Ø('ÂNê3ã­Ï¯|.çļÇÿöhí¦Å‹µƒËuºÒU4²P|6œ¡ŸÛeë¶Ámkáˆ\oÓ÷,D÷²Ò„Àê« .Ô)•÷,ž&ÇÊbÞeÆÃ]pƒó7> Ûµ‡dUœ­ÏYS±×­‘&Jy¶'~ò?ôiSPN¹ X–5=ÍƆΆX¦ҎF-ökU½§_NdB=§CÂgvÂ7ç,pá‹×j}<Òå<íEtÁT¦Í(é"ø=TeäV݉,ô3¿ˆ'®í'"¡›V›ô™”Õ†Á~Pb…Ž €‘QÂñ¡òáÛ¢î-XséÞÒ%‡ „î kÕâÚ'4ƒT˜* -|+¡ŠbƒÞšsa[1uÞ÷ãä®åñÿp‡sLöò«^áê¹Û"wK‘“¸¸k±Ãpõu7¿9 Ü)GòÒýr¯v÷ú‚úÌó—«²ƒv¸L|®}Cóæ{ijmkÆu y i$kÄb)â*u¨Šº(U¼=iw Á¸Åy¯²háü„zßóEÉJûp„ýd°ÃÏöiæE˜o,»<”{’…w)Y s·©ŒTêüC6mÚÈ è·/Órø°°xÃIWP Ô2ŽÒØH©Oé¡Aù úÔEÎÒ^×÷A ¯s¬%õäˆüˆà±Æ¸ª°çe=Ü•ê®×Šäó¾Ä“ç—Ç‚’1½ý¤Ù¨S:äÁn¬X`èÛψ©×ÚžžQ½Wk¤ÌAxH'¼#4 ÚðuÝc@*ScdŸVßXÃíYÍ™²cõlKð›Üˆa…ŒÜFiÀ$èÔ~ÂJ¨ái¿bÓh;/¤ šÅJ4{Ê Ò#ø–i/±Cú«&6¦¦Q«CÌ$æapn¤°o£±¸.å»Âr'"5•.*,yÞnñŸ¾M“rYŽ=ÃÄë(8ïÅ=%ºï)m ÐŒ‡³hÆÆd%’hìv‘€?HnV ÄÐqÁÙæŒQPž†Ÿ€(+œä…:GCåÞÐ<~nÅ!VvZuIz.”2bß|Ý+àCÀ¤a ´:&ÊÓ¶·_ý ' K,¢ú”…ÉëRÿà›û@‰ç]Óèîžç•A-Qø›¸­2Útºh¯SV$Ê·ƒc¿R×É’1³:Ò•Ä¢™œ_ÏÎüâI„‰¶š²I“wÝÕøŠè5„Üy—Ót¾æŠÇNÑ:Ìï52ÙÆ½–3ÏùᾺ`ÆÒáÂG:L"ºÀújæ"Í¥"¬Ê±G'Í­4ÀsícðûÆ” "9ÜÆ.šRŽþO"Z {)*R;"ßôÂÅ׌‘;êÈàçXý¶èýס—=® wp«Rª Ë>N~S¯Îj ú5…o v9H ®Em6ö™;vA±cÿ×ÃÆŒæ8{þÞ],8ЇTÕÉÀ\!{z¼ìùÙݤÝ@õ•|Qè‘ÙôÓ (·Ô>Âóà±h"ÉÓ ±Öil=Öut³–„7XÍדàà=&F«ÁA–••r &÷3Œ¹mq¼¤@m,ÇLê“6äËê–Κ2Œ¾ë8Þj`D¯g:µDE$®¥ 5ìð"H´¸¦QÚ« !Ëgv)½ÊD¶ÄÜÒ­sêÑm]ß@üÁñ°Xëc}b‰ ’ÇTàÛ¸íÐú¡æØ1i)léI»h·¼”Jï¥[7W€¬ÛŒnÐë•n¢ó»Ôj%„cÙXg=Ô£¥Støñ¹¨5‰ñÀx*T÷W'·mTÊIÕÌB×A3D/˜Ô¬Ú4&ŠI]‘û{?-l$´pØCc MîV‘âG©k–3DJ1âh²º-ïläm?(yÙZD‘Fmþ›lüŽnä¸8[o¬ÑJIåœ5þÕHœ„F%3UXœñ½%—æç4õ<óZpÞ2¼¥³:n=ýÛ/çÒ£½må ΨÁôi*Ýë—[ ägüÌÇ>ã©wpÔ!‹õjð_Àäøj¥|€ãíÀ–‡ùVÚ:„W„NÈá¯|¥fMƒ{Ä[y6íÓTˆ²>+#n)[Îî@Š e#\ÞI›{Ê$ƒÂ€žŠ–×0unyãý“cåŽÔ—5“º0ØÉzWþÕUŠj½ù–wéôÜq×O[úò=ÓîRÆÍ×rDEÜdߨHd×ì6âÓ¶mìºqHä|4ż‡5¥¸+¿¹³Á–aÁjqBËJ|£ø~Ê3µÏ1Ë䀃†ÇInƒ<.’$ókƒ&q“û³xŒ¸ì,øÈŠm€váä»Îm€ólòi6/9ôtr@˜)wå€c}S¶Euú”‰ÊM |zÁïF#½ïÂ\3KHr–i pq¯Oõ!šßpQ.¯ÍN›ÐÕ¥ ëFÓL°i?öìÇ‹s'îÔ3Nà»4Âã ¿ ´ Û÷x:E"³ÓaZP"f­ º»îHÀ«U§|öâo !•zùÈz,êÝÚ쓵h™ž< lÁ·9#žžKÝað不*2ñçÕv˜ØôÔºDÉËׂ+ÑóGÔfž’a†Nªv›“ÌŠüO±æS%#èºVg?ntO*Ë‹yúpè×}Â_¸Þ^übèÌ1VQêX·àHA½êÊíty^í*›¾ftw·ËDÿl½Á¼è Â“àkë ìIA±· ›¶ï¡y`aõ´adé§*wØoDÐè5ëzšUYQ÷ß=sfuµ$¥ªýfg.ß89Â!Ð7š+%?–rKòõ˜ÄèàŒÝK‘“½º Rvn¹ÏqƒžZå‰c“D½MÈr3$å³hn–¯_T¬äü e:?ßä›uLæÎÁž"0lr¿ª[ídÐ"’pä«IQ厗˜–ªð(èõÕm¤Ç¸«ûS`p›÷qÿø.?Nÿ2v'_…d“$|Fð2ÿu²¡n~—ÜÉžŽ>8£ª¯ÿÒ}Sc n~‘ÿ3\"q]»ìãj’äNå¡f0)i$䥚ՙ¶QRà÷ckÆì£pUÍ‚éñËQ;ŽE ³Œ¸_ÛåRYQÃÕµË:Ú±ZDñM™,ÎCw¤-kÆÄ™kÕ BÇ+íÑS?NÿÃj ℽ(âª#µ'äe0ãÕ÷ w0˜X~@—˼‰…wíŸ`ƒS9YÕÛkFœŽ¤ÂsEá¦(ëê;½.79D?½ D€¾·‰³® i¿æp'®”œD5B Î2 óÏ”œoów£ŸÃ}:Ã÷O4Yß6€‘£âÊÛmv»:kE”.XÇ5þtØòÌë—ÜJŸŽ»JM(å-I¦]ð0š½Í4 ¼ýÉj£_Æÿ}¯ˆc/Ò0sy¬èênr,š&ì¢üšpU}§„»ùÍ-´œ¨¥’…-ÊVÓE‰ Å!œîí«¾ÆƃxJ¿Œ.¸ôŽÍ2xæÂg,€¶!”Á·ígm°+flŠÂ_rìÆ•¡×¿ê¦¡«¿ÖQdÊÃñmi!ñSŸi¸ˆ  sõöf¢ñÍ U'RNj'k|¿$û¼%Ôôj¦Ï<ˆñin}Ÿ‘P]Ͷ…ÀyÞ°çÄåtŽä t@R!mïCÝUSÁ×õ«ƒ!}:¡1HuGû°Oƒ ¨®P1)ª¶ä)—v‰ÓÄ‘WJ1•ÍI×$qvCºg/Ͳw»_…Ø.€p…¥‰wº`s0v§ŠWZúZøm“Á$Ë^£èŒrël¢ÃcÕ‹¢¼NÓš‘ôÞ8§ä)ŸWT)ªÜ¾ àO™{[ƒÀG¶5ûÅ$" %kO1ÄöDß%~D^Ô„y´J+—Ä aóÀáÿq,TŸm)¸Æ)ÉlM¾ ÄyêcDó~ŒÿÎ$êyÿØšä^YÜYó:ÄàPT#0Df—‚vҬхÒù¹÷‹O˜˜Ú_´E?îÓŽâÈd®Z7 q¥ðië(v+låu¿×%zl˜ìp£ïP„üúYjiÓÐÐGÐûXC~:g~ç2Êáâ¦Cà¿Uþ SÊÒÂP,3<‘¹Æ>Ê3 <›,Æ÷{6êIn ‰óÊ>Ž[®¡šÝñÜý&‡@P:– rIºVÔ6ã>„ÌãýÈh=‰© žµµnîÿ€ºœ{ûøSÞ6þ…ðt9„®Œ(}Çý“Opó®(gˆ/Õ3Åf8Cà9à“{“;|&&ôþ®Ì¬(/‚%˜î§^뢾^HöÕÅÞ€òN×mXŠVUùqµÖŒ¥æ Í,g¯·šzî^bárG<¥%µa°âTtÒG^´ÿËtc‰íGi¾.(FöôukfücFë1)i½ÛçV}‹MÐQi„ï’ÇUâ`ú…¸yÀçHNEðùWÚgPåmà ½kgž¥XsøÐ¢¾DÝnÁq2 …jzØ)ÖÉn7ÿ¤«PrÑßëf•›Ã¨fÿ,“ØÈÓò–sN¢ƒ¸ìtpíKš«º~—;Šx=:JŠ/‰ë} ý ‡O©I!¥ zèê.…95òtô² 1¯^f1ñ%fA¯_Üôö1®¯Mñ¬ûËäòÌÎA.ÃæsªÔ¾ZÕ-Iâ)1 ¼:þ#ñƒËÄ0c`àÊr÷œ÷`Q}˜sw}næ4w©4ã²8@Œ$¦—äìÛ™ÊÕé^.ñ'­lÝÇdéeãܨ¹¨EuòåU÷¹ðÆMXmÔû¹hà-ä«zˆ›è·¨­Ï~R]¤zWœ(Â;ªÖ±‘k¦€V3œ#‰ÔQÑ­d¥õº&–‹ðëè Ö<¬Ú]ý%ý‹"”C†»á„UŸ,‡[ t³%‘ýuMÅh7¾úöÎ)¸†ZW¸ÑŸÈjq†³­6ü,½ûÒ'ƒ;íˆÙÚvxZxßÏ_hU‡i(I,çÃ}Ü!jÖ,^çO-¡Û_Œñ=<ßí´Œ7TŠvç4Í)ÏãRsÁM„ÜÅéîkC+öœL¼SÎ ñÙ1=¥®J^nþlWô‹Éþ—ü>ò/G¤ÌŸ¡æÃ„ &OØ}tÑo"]ë —NÞ¡`ËäšôÀ®ÚœZ6ØÉ®÷W¾­ þê!oÿ¨­6Lêæ Á³¬}ŸK\v¬Ïž¤.}<¿&j+½ª[daJ9?*Á# Å£J.sŒõˆQ,«î[6¦ xN´ª¸Wž²IÐÓLF¦àO%Ptš’ùÕïÜ«:®]˜àUá°!ÄÈ FlÆuM6ðâlà•Z|• ®!?6ŠPáóJO¥R\®õý¢ÅOõ®RÇC²†qbÅx.zK°Ÿyko‰ pì­È{7ÌûZ«¥2îÃ|@wßúA=ÒLÅ÷|Êwá‡f#ä~f¸Ä‘^w¥Ýü5T,ô0>d…Ó¬RŽSð&<(}Ñyr’õAÂ}µèsC‡›©~S­H¸Ff8<.X¿«9{a­éâ–?é3$ÑP•·ÛmiãÌUŸ‚ñÌwg÷I%974ýÛ†¤ÓQqT0ðkùâ-À«ØßñÚæÉQ‰dýlô×Ù·XûΚÌdE&„„é=|Y;°AINSw—‹ÕóGxÌ/cÌ{‹ãˆôµy½*؆\=ЫýIq§Ç%~‚E 1)aC²¹¨ÁñÖç"=¡ÛÐÔ?å1ÃèM‹c\M%k[Kož‹EG#ç»×º‰Þ¹YÉ‘vg]o {Kâå/»èƒ7zâø;o”7¥örz=çÅeÄêÒ¢|ô)vÛ<QäV£DÅ£$ך]ïœ_RÑà"1¢ã…{wB¥©¢:=¿2©™§êü­@LÃ6vZ¼5MÛD½ó=Ä“Pæ¤÷í1Œt ž¢)¦ŒH¹½X3? 2†Ñ¸ÃÆ-‘×Lnp³´u¸G.J÷““)Ó(ÌnjÐ'¼²3QÏ{(¡ÊeÅm! /f»°¯ïáf{5zf‡÷4ú°]xiÓ/ìó€:¸s&L—M!ÏýzþÍãC+kZ-¥Õ¸{‡.Þ—§—ÓgH©Öæ˜ÜÑ¿à)Ô£ÏK_q2-á‰ïÏñ秸ê‘õ«×ìç©懂h‘l‚KÊPI~Ÿçéo}$3˜¶ÕÊFi‹¶yãù*çÝNy”èÓ}IÓP“ ŒÝèÄýØŒäËŒ4+°_>v ôÜtfjâ3fLÎte ðR¯ÈZ$ÀD×™¥3„2û"ìªä?zðøfâf¨øt}ºÓ£š&¬.†õñK¤—ÓŸ Im%7,³Þ/Pk6šÝ۱̂ò!€Êäi¤Ôç— ŽÇ”ý ¿&~M¹*O#«“ $ê£>;ç ¿t˜¾æúœaiXëv”ÕŸß3`Tž™§>Û½f”å#É ËAÒìÌýÃÐ.cؾÆÙÊìõÄU¯£žˆCR©Ú Ç>É”h\Ö$Jz!øô{{SÄ¥p¬QÔ4ŸȾYç¢8u< fG%IXuqÆJ¤S­ákmëîmJínÒI"¦«ouËérMÃûФƒpa?äõ¥`S¸¬ /+f ÓíYe€›@–Û|Ùa>ì…T•ÐŽ£³šÌ&zz´¦†xôZ T$Ò!&iÎU[:º)ÚUM ƼhBf×®0Û/xv¥ˆ ñFj󈯼±þ‚UîËr0€•=IŽÍ2ðÓú—ÏÎ Ý$Þ+=W’j<{]ƒ„)ðÕqΞÏÀˆ8ŸM7wR;7¾ÞüjÞŽ%mГUÀCôÌ$A"ôÜÊ)¦bª¦b^=ÒvOçŒ|üñÝØ@Ù)@¥ÕL~§/g°Ç¡ÐfÌ ¶9ÇÎØ©ûè$+ɺœymJt6;C»ôÄE¢Õ~½Z?Ô@ ³µ²CraLiwN-®8wzw¬ìš,Œh¶ÙMðÂWN8Ìé›f½o-·ƒ¨ˆ¹‰B’PBª¼\Ðü” ˆdÓŒb2¡P2Î=&ÅYÙY¢ß—p.7?hn¯i6ƒX¼·ëc[x~â=$[ßRÂD¦E—ƒ™´rqh߸eõxtF:—ß;ĸD†}h>Ú2î±éji¿óÃè >ô4[â!Z•È­¾y­Ûˆ™•üY‡¤70"&ÄÿY»Z—‡Ü •±q³žÅ˜fäç ƒÁÐl¹v;ën׫ìKö0–ž8‰Y¤pùõd­/Ä·'¶±D¸’ç|ÕVtM f*" HáL-LJƒdÓ¬Šê™±_&®þ9‚÷ ìJ¿:ð=ûƒ>àG(Dfš¤RÌ­[ó—øW™Þý9ev­}ó8l8ØÈ#e½g½ðîók1Gúô1GÝž µä»µÏ Q¸¼z`ˆ¤‚„Ä&ˆû9n=;PÆóì½Åİ«üETÆ«{ M‰®Á2úÎzkÆÙ£/½¹û5éû§¹S£n!±UÈf ¿R>->_Ž!%Aç3Û’È’ ––ykC¶öò™`ŒÁáVû„\䊛'ïãNoÜÿeÞoªÁ±Zñ²¨F©W‡nÒ³%}!z ´ÌSñ¹ñ© +©þÜžÙÛðŒ~O»²Z-óýB!+ÎûdWN§ï›örßr]a¡û6wMCr&™H5‰Ã?ó¿'A.›Ôbrû Ì޾Éõ*9ôZÉïe4w½£|>1”ÈâSû³ìGAΫË·C£…ܦ·ßY˜>*áHoDªtF„ÃB+b¯‚¯|˜?ÂÏ;À3& »MÒôðí´b-#« à¿ÿÈÞuXüB|, iW‘B°Þ¬xô$#5ÿ3¶<`aåÌüPøJI(ÒÓµuêú cLÅAzGÙéÔ¿ñ ,Üq8.½ù|¦ÒKÂÌ›œ@["5`ìy¨âËÄ9Bº’ÜÅ4½NOˆójñg=ô¶ôcÊ@$ë˜Ù&»žQŠˆÓË u§¨Ý‰²Yè*0otϪί8¦Ç¯îú DtÒƒ ˜¨_^éZð)ùç¤ÂÀ$rúʹƒ0øñMj› 3ÄÄ:®j!á"ÙO½K>I®¸Í¥OT{ wW¬¶·N û!U\­…ÒWKðî;Ÿ+eÒív3þhÁtÜ€cÒ:’PbŽÿ•¢;åem` <a29Í¢¤“|ˆWi¸ —¥éÜê¹ÜP…«ÄñóüXzÄ3NõçËoWÃM:ãG ¯eÞd‡®l‚Sã”±wKò{|ü¬nÉ™¾gfÊGè4¥U]_Ö;uô„æðØ ¶ ²1ù¢¼{‡Üeä2˜¡Rj*.~ËkÑÈíóí¥ÎŠ3EK›an~é«›:ÛÞn=AFú||”qÈŠš\Ó,[!ÑõPâÔ‰ VnÁ.³×7@£þ· TûetÇÐÕ½‹²”ýŒŽsõË$Šð„{û<çé‡Ùž’• dÖØÊ1浜ÁG„*ݧ%~:Ø®ŠRO"¥àêÔ œÀ¶®ˆQΖZ¦ÀÕ®Þ6p°q7àsFNx¢G‹kƒeTÉ»CVN'ù`vï’¹éL¦˜Ûûêx9Þªï2õW¾ú§ýb3YRÝ…T·u¯¼[uÛ–´H¸[®û®–¶jŽgìØÙó'ºS®L^ö¼(4| žÝý§jq¶ý qHnDå”â¶Èn¡Œ>8^ÍzÑ fžB¥ÕgêÅ6ó÷õ›¸eUwn@n ·Õ‘K°nÌrï¬Âžl½¶½ÒØä³x¸`O=Ãç Ã:¯H¸ýhfÛ'd©à±¢9Ð, [¼¹Íl>ÎòèT;µ^3¦£€²/±À)Ql’0]tõÏ©O£EXûzá墬ϫá†e3“~ C\ÍÔ9¨Ù`Ðxˆ°^Ìuj€ÁjN#²ÜN2!ÿå´|ÀŸ$$vílÁ®`®ðcêÆ×8äšü¨xxÊ·Úøþ—|áí× ¶ÀôìçQ„’gâoˆ>JÕrC½Wú±¢~ˆÉ>ÝAèpúý0ÈŸ‘[1o°öð¾{Õ®ÜùJkM›VëXè Ud&Cž ’àð^B¢D«ªËŒ2TUšŸ8¹~p;Ç2íø@¢yºòÈ)U nº¹¯ÀÕUEäÉoZ±ÅO.³æQ²”-~ôÙ¾k@„‚7Ï`™°F-¾£^ÈŒ®«öY×¢¿bR¼¶ƒKWÕñ1èRÆøRÏ]|ØËõ¶i±ùÃi=|A\S¬Û›¸Àv3½Œ[˜vS”pÑcÒ'ÆP'ØmÁŸÞ?áoè… ¸M³6£ Es@cìn¦L0MÄÿ7µ endstream endobj 108 0 obj << /Type /FontDescriptor /FontName /JMPDIJ+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/C/E/I/S/a/c/d/e/f/fi/five/four/g/i/k/l/m/n/o/one/p/r/s/t/three/two/u/x/y) /FontFile 107 0 R >> endobj 109 0 obj << /Length1 2337 /Length2 19444 /Length3 0 /Length 20820 /Filter /FlateDecode >> stream xÚŒöPØÒ ãîîÜÝ%¸»»ÃÁ‚»»»Kp÷ A ¸ww îà‘™¹7s¿ÿ¯z¯¨‚³ZÖî^»{(H”T„ÍìM€öv. ,ŒÌ¼Qyf33#33+…š•‹ ð3…ÐÉÙÊÞŽ÷_¢N@c—w›˜±Ë{œ¼½@ÆÕÀÂ`áäeáâef°23óü'ÐÞ‰ fìfegÈØÛá(Dí<¬,,]ÞùÏGµ) €…‡‡‹þ¯t€°-ÐÉÊÔØ oìb ´}?ÑÔØ jojtñü j~K^&&wwwFc[gF{' z€»•‹%@è trš~7 P0¶þÝ#@ÍÒÊùo»ª½¹‹»±ðn°±2Ú9¿g¸Ú™ï‡T¥åŠ@»¿ƒåþ ü£ €…‘å¿tÿdÿ&²²û+ÙØÔÔÞÖÁØÎÓÊÎ`ne(JÈ1ºx¸ÐŒíÌ~Û8Û¿ç»[Ù›¼üU¹1@BX`üÞà?í9›:Y9¸83:[Ùün‘é7Í»Êâvf¢ö¶¶@;g¸ßõ‰Y9Mße÷dúûf?ÚÙ»ÛyÿÌ­ìÌÌ7aæêÀ¤ngåè ”û'äÝ÷Çftp033sñ°€Ž ‡©%Óoz5Oà_N–ßæ÷|½ìæïM}­Ìïà¼Ý€'W ¯÷¿ÿ‹àXXfV¦. …•Üöw3Ðüoü~ùNV]æ÷Ùc0ÿþùï'ý÷ñ2³·³ñüþ×ý2IJiH©(ÓýÝñ}""öovf+3€å÷q½ðý_šÿ ðŸæÿ²*[ýSÜ¿¥íÌí<÷ð.Þúpûg,¨ÿYÀÿž `ÿ>Ë@õŸÑ×cæ`6}ÿÅòÿyþJùÿ7÷¿YþßFÿÿ$ájcó—›ú/ÿÿÛØÖÊÆóŸ€÷Qvuy_ yû÷å°û¿¡šÀ¿WYhfåjû½Ò.Æïë!lgaó_­œ%¬<€fJV.¦–ÏÐnáÞÆÊ¨dïlõû±0¼_Øÿñ½/œéÇ÷Åùý®þrß÷é·3µ7û½x¬œc''cO¸÷«Go–÷ 5zü5Ú&F;{—÷À{{¾s{'¸ß7ÊÉ`þmúq˜Dþ n“Ø3€Iâb0IÿAïyrÐ{žÂÄ`Rü/â~gQúƒXL*Ð;§êÄ`RûƒÞëTÿƒ¸LšÐû ÚÿE<ï>ã?轓?è=Òô¿ˆãÝgjoó.ý,ìì¿-¶¶òß “Ù¿ € ø‡á½ï¿âOÀ{Kæàodõ'ží7tûCÀòÛ`óÇÿ;ÜÞÕé_tïÿ‚ïZþ)÷]KOK Ý¿"ÞmVÿ‚ïZÿ ¾‹óñ_ð]›ÁwylÿÀ÷·…é3Ç{ªÝûLþËÿ®…ýŸbÞ“íÿÇýÞŒÃ÷;™Ãû Ðü\ì,ÿXþGEö÷ªÞû)ÿ[*Ç?³ù¹ÿÚœÿÙØí]€f&6ÿKÈÂòîú—¬,ï*9ÿií7ºýKFŽ÷pç÷gù¿½7ïlcìlù/Š÷ÿðþ²1¹X:ÿ5ï »¸Ûÿ+áÃõ_ð]{·ÁwùÜÿ57ïÙÿ‚ïôžªyOõ:ýÍý?Ï©«Ó»˜.=ØïoÅð__Ê@ ÐniÞÞ”/ĺ!¤ý¡Nßaoüà Şf ƒ÷’S‡ët*MmvІÓpêpÊêŽ8õ­Ð2ñ‹÷q[#tø×dåoÏ>¿ U¦ö¾Á-Nb L é'„%`PÚ÷yqôÑüÞú]†"ßÑ•I©ýÁ½OÒãKåÊhØüžò~-§,ü¯Êi†Xõ½À²YŠ“œ9R(BZ´ äÙÛ»´¼‰7b™D:8ß“X¶oMÖ¸Ç9¯µj5Vç.\r\Bð[´Ñ)Jo‘Ã4ìïò’ÕE6þâ—q¾5M ›³¨ 6îhúÁoÁœ o&ßÓ/.Šq-ÙIJè ²Ä»# Öã©”ù€M³Á•L›5XŒbžÄrIÛ‹—ƒä%ìÒ’½{ Ÿ‡£ô‚<­yŠÏ4jÔ¿%p)“ìžD3Œ6‰‡öñÜ™nßUU‰`Ùk<^Ô¸Gˆ Çm©q…Dvªäu9+fJ Gƒ•ÞïÌõšª‰¸‘ضÄ#kª}xÚë*ýåN_)-FAU²$ß/{Ä¿(VÒ‹[ „yÛÀÚСø@ ‚²G‘½¿NfØ1Ü¢qùŠ'‚¯ªöPHæµ Ò»0=¶Còcj‡ÜÛ¦F¯Œ½¯ÀÇ“ n“HI²°ðézãuLÔ«yT뺺»pã2A}ÖìpãdhB„ ºƒC`üD P\A•½.WB‡ñ6Ÿœk½í•#ôDßúá³³^Ã:Æ-hÕ½.mPò 1ÁõŸ°“û¿8Só¦=$ ”í«ð?EáîZÕŖä’,LÁɱ‚`×ëæ~B½Ù)ñ§!‰1Õ ‚1=D†Ù៣ÂjˆO»TAWb/ aà­G¥BÝ|F’A®e„\êk•‘q©¡ìõæ‚Jଇ# Ô˜ìì:ž›—šÃO¾ŽfªA’X°p'•àH‰w¿T ÷©} ´Wæ?O‡‡Ÿ2òkæÏ!ba®ðÉ|ãÿvd{ÞØò¸˜½>ly±ž²QsÓÔTW—%8Œk$xÍ•vŒo8š©›ÚyÍí¡ÄÏÎ2GxýÁeâA d‘3³­Õ×IÖ•åˆíù“º(¤Õ'¬F)—š†©ß;O¢ùW?S" ½ Çó½¯_÷ÙÙÝHt³ 勵Ö©ý…9°oǼAXu%/ó(Ÿ§Í\=ïæÍ¹“2¯÷Ð sÊsþDʆûá<%GmZ[–qUçç0M7=¶äˆ¬·q„¨Žˆdn¡ç 5R”,UX/«"óŒFúgNi%rr›ç£§êV†dìMÝ.œãYàØpôà  ®ìè%+…EŠI­Wø½Ì(n&½«½Ÿ|5kŽ×ºkRf~ø,'í§o´¥ˆý=ˆUSo<ßÇË7ûŠdS°Lip~LÜoé]Xä¹ÔP VìÄMôÝ<ÛA©»w$ï·“ç›)艶f/+ÞÍO•h²zr;’È™MÞÁ·?öÛeÑ`Šù TótJœԭ]`ïõH~ú8y?@ÑWó}jÓ}k}‹Uß¾²wðÙðEPÚò²ëaˆí™6o ÌbšLÅ'ç}P×ò:€P±<GÎŽCõʲ‚áx¦®6WÒ로ç'·!ª¤]êÑ—vé_– OóÞ»Šh¤ p97Ó9[LH«¦Ò.Ê!Rù“Ÿ¶}B-šsa58Å5¶«&ÌK´OFŸŽ¡û ’7’™Ìo{sl:(”ÄY x‰4„iTEä˜öù+±Î8Ð+Es…‹6îslø>{ÿè‚§&ûº¨i'•D  ’Âí­²hŸ„Úݧ†M½k¨yf"üê/ëc/oˆ>?“®‰ºñJØè¹+øÆP•_oÐqoì’K #¤Èr\À”"qIœÒÌæID–¹cŠ,/¿0)Ù¯ó²¦ n[ýöÕk"F ͦò±Š´GFà3bQC$^S„À÷@ƒ&bUuhÅ —¾àÉáu/ØÉß2ù©5Ùë2!$ÆˆÎÆæ¨|?Ÿ`(dŽÍɆ'µ¡dì6å…«>†iX—7†1 SÅBD[¹;‹V/O7hâÆç½V9 X£Ì†u¨¡Á·XÐ>1ƒ„ˆöY‘Q1wÓŠ¾›»jž(ø¤7,Ô"ïƒÞ‡M!R‰Í'Y‰µ“çŒÄNÀ8j‹ÏÝ9Ë&Ó5±k$­‡•sis?ô¶^Ù•Y°ëFýU<ÛŽ%­e£%€$gƒ§…ÎfqYvH^‰Ý0Ð5Eżór¹^¸úq¨•NðQ%…•Án bÑò’\<äÒrV¯”É‹ø[v6œž á2°ñŠMWü²°{ÇJcÅŠqÂÂ8#naÉþëÓ6…”MÚ{ TK㠚˓{Á”]…̲€W\ÌOLV°VKÓ®°&¹x=¢p܃}^ÂR%syl pžŒWºùmÛk.,®5•9ÂŒºìEª‹¬&î)t¦—Šâ3 Ž%ØhÃ|?i& ‘ßn—ƒ^±».šö¶$œÁ‡øç±ÕÃdL4‚<ÃÕ¶4ɦû­‹£j"a›ô©3£UnWÆkWº³%Ò§k¾ z¯áÆ) 8ûoµùàCÌÎA¨óC¸hš,g³‡é‹WÛÄØ& ÏÛ¦eÔ©R}2/?œô2·«nİÄÌ»ÅþrF'žHrL»VmÑQ–§>—J3!²ûrnÉ á³Ñ²u ù3|E]?g“m%ž¨¡àc®£JAù6·JÌ^«{žOA“jP~mжGñ”¤îô£‡ W‚;w•òð7IÆ#ŠŠ…jZnv ÷Q`*'K”Ø+uômO¡û“W&tN±±µß+ñ,ðœèÄ:ó„ƒRíÔ!ž8-k>ò*¤”œ 9Ïܦ´ A™#dj®…R²²»£UØxÁï“ϲjž£7¸¯…œ(ò˜¼í‘*–桌iöÒJ é¯1•yVÆ(×ÃF §è)§öàKÐV®Z©a]Æ(îÌ ‹ä‚‹ÃT)Ô¾(|•劯…¡SÉœ?Ñu*Éú5¤}Û~ªíôm¯_$@(‰¾_ÔWzº—U/<¹~¹˜‘ îšC–Š¡jhÕQG–^Út¡(Ú}KËîÒ-§áê£ìü•o9n—ƒP{¤M5»bÜÓ¬Ö{I¥åä?»‘Édgh— .#W€C&×pÿcò\M“¡·¬DÓÆÊ…ÁÇ,“õ»Ÿ~X§FrµEú0+ÆÅê mýÞ¿"ÐܶÏå6V¿î²'ß°dû£;Ù ¿9§bô \_Ùél€Óf~ûPq?â|{aŸ…a"äè9C"*Jím èé¯Ó|rN´ÏŒm¿iâjᬔaFÎ0¥wW;>›E)Çïð­ÙÁ§Í/«‘ûð‰q¸/­™Î||Ð˳Ü-˜x˰AÄëóHx^Ø « Ûl; ØÏëöÛ…ð^-Pã"nܹb[¸´•p ÷%h8˜®= Xm!OU}¿ËÐ<°ÌšG{‘ù£êdXâ´7æÇÖ(‰” „µ§³ ñ c݈ ó%ö©Ð|LŸŸÐš¿ùV$‰æ1P´ÑIÙDn8–®í?lIé‘ÎTéB=°¤gžšr(<ðT:°rÉ|y¹nrf?‹j¶ ¾©ðÀT¦GrÐý¼Í=–,éÜßÈK¬BΣωAñdëù™Æª 7ÊmøÈºçN³“‡+KqhZ"^ÛzBôœõAdiTZ?@Šå@v=óÕiTW9LβR›a/ÈOÕéÕÓ˜ ¯¤-Y17ÉGÄK Q1…­ ‚*Ä´¶1E÷(ŸÓÜ2,&e^ˆ²ãŒé„䱚·ÏØ#°<9_[[0ñ1ýó²MeZ-ÿÁò§º+`ùÔ®„W–QË`‹`Ꮄ)ˆªeÿd{ÒÐÍ„=0G"ˆ@oG£¾’­ÿÚ¸F˜ÄÓ³}‡÷r†#×”¤Èã2-ÈdBþu>r‹ÉÜ—m#-ëøGéà©dEjÍ•¹¼óô,±–¦ú‹ï¯»¦–Ví¾¦Xø€Ù ë±A©ÎóhE©7˜á±8bÃÇæh¾Ãð†ñ+ÿÄm™V·¤†@ýU28ò%èJä*QKÁ@ŽLþUœÂo§?êº/…’kpr`?W70`d û›F…ÙØk‚6ÊS_ÅC9´”‘­-LÚi{[¯±ùØ€¹~6úJ%m“ÿâ¿YO²×ø«àvF©gäÄ;¥J¼6ãüøƒñ¡|à¢å±âGp£œ–³¬‡‡'„nWÏUr§«´µëTW8s_SÇ^:ŽnO?’—5ý¹œ'ü‡®$uúÐN—|š}+^©«üNÅоêφ@ÅÀ#B ÎWÇI(,j×ÃÍ>IÞˆ­Ë>¯àÜÐ,)=ŠxõS·Å."ÄI¯œÍ"±ž jÛ­Ílp>ko ¶ÛbÈ$=`1̰…ÜZí,H ­&šO¿|lUa<κ}q£ ´eD£SÝéû6ºdãù‹‡+«Aûv^ôKM¿íQ“As­¤+‡¡dôCÓKé3² SÌ,üëfìèöÜ&{d=K]„᳘€¯ݾy¥%9áSy?¨¾Ð¹ü£Ñ¢Át›¤ìGT±ûàñ7ˆ]i'Çsár6sá  mT+×ꀞµÝÞ«Ž©ó“i4m'”#B±Û;ÞøØe3"h•ð5@²° *Â1Ce=ÍöWãÊâᯖÛ<º³e®o0ª8<²I¸!¨}j²ÆZä»îÃÉÍŠÁºÛ`ÑøŽƒÁEžÒÔioíÖ(re•Ò]¦M¾>–D]ä‰^bÛèê= îß´cé:^ªuxÇÏú&Šû³Y¾_5Ùø/»ðA\„Àð| ªOˆ1çW#? ,sâŸ1åzN=_ •!FéÖŽG¡MwŽŠçõ¸ãuCžá#xí[]ɇ`£ùZÔ =Eíùöû{ ïŸk6CBgîÙ…;Çe0ÛÑ"y#ÕÚêTx]G§Ž E ´pŸ;0ÈMQ=ƒŸË ŒË)zŒÒ ÏÖ¾;W ~uûñmÀ@ïW$mæü‹òÈV¹‚‰y(ÝJ{çzH®=)lìR™:l»×ÔµÅO‹1ãݸ×F‰ü©Lþ^t­'ϵÖÊêI°'Úv°!‹»7vA-Výžör©Oc…Y WŸ º'å€ö Ùê§×~÷%II“\'4Å×™Rv ¹`_Ëk„¹H¼ÅÂTø™X]^äûo÷Jž?òHkÝ$™UdOo¿M¼<Ó¡/•j‰Ÿ”¥¡ 1þÜ"éšì%¥•YQåBêZÖ&ª…!8„<·^A$¤œ^>”A «ÚøÞö míÃmšBÁ9§[ƒ*žš6j$Ù Îg¹ô7öñ²³Á, ª»“ûÞG l3 I¹yzº,gÌjÉ×âM¦Ö ÇÆ^ˆá;P˘~äêÇG¢j¯± !¶{ Ú§¬¼CùE!k~MK£]ùö·…Âá7¿-àæ©†˜ÌœOúׯZȾSe¢NQCØjCÂC‡ðæ8/`EI)J¾|Q¤3í²w3dã‰jù-H÷Ozx/÷³Éà„xàð|™°]>?Ubz}AˆR®³œoÊý/“T9ÊlC&|d­qÄl×Ī£¼•Ö&¨§+­.2‰ÐL#ŠogÙ„Në=¸úumPí4ÛçyÝMú69àö(º“|(ô ”åTèVQzõ ÊÝÒWR³c7“Ä]‚j¼§B‹çØ oðЪZÝkÌõüÕ4ß,75ç¡;ØÍÛ$ÄZ,ãW¿¨Ñ¨BN1…Ú¹û¾ÐÃGè(´ŠcNŠ‚ÞÔÞÃkÃǪ@›¼zfï.ØÚ§õàš]N__µ·8Œâ±%ü ³<ºcƒÁÕs}¢©´’šÃC$…ÕçQ8¥áõˆ3CVï~ñk>ƒ Ì•òÐJ3ûbÍ4é‘z/bœ³©/{ \»îJd›ƒ.‡Þ*m”Ј'Dp#ýR/É~r§ù|aõÓq–wÓÌš¬¤­v3ÂÚq¾$»ÝÙ‘¡M( N\’+~‡´ÆGy2l¿òi sååìä[Ô'7רŠUÂ`^9gÛ^Ö#Ìv?¡ ÏÚ÷7q^÷‹YËbò/™l½Õ/XD5WX¦'Ë8¿‘} ~¸tZ³L d 8½Fa~îšúüŠ;*ãÖC/Kì {Õ:‘ª±ž —ñ+K9¤Qwu_½[‹—"hyEДîŽb³öTáÛªˆ*OØCp÷ÐØÊ\ÒÞù¾ì/‡jGík»&šý0P+Ô ´ä€w¨ê‡C̨˜äP §š^m¯þ’0Jl§t>a3iQ|#¦ˆ@_8k(§—Þ›+äÑ—¨lYv<Ú±@YÜ…5ÍÕ=¥è±Ï•’TÁ}X}«OØ_&§GÅÏY'¥”¸º±k‰Nµw5‡$†ÑÄåô? ‰Dnç‘£è_²Rð+·íoûíƒ[lížÔù ’-z›•:¸O…‚X=Yý$¶‡áqJS÷¶óúáË©ªýAÉpç+0²I Ю¬æ \¢ ¢[u¯h_ü¢©ÈYÉh6°Uƒ'Dr°~(l€÷û@þóªh …Ëêè|è7&È}UºVÍnDÝVôâ1ÂÇq)2“f8b?ÉGxq¾¸J¢¡L…ôi‰vÌ®›]3û‡GË~±EOPÑ)6e»í=¸Ñ€]úQ$K],QJDØæþ<«<Ÿ××kàQ£ËFp$;C4Ùçˆ-¢ÚˆíÊy‘Xól™oÉ¢‡„i1äRÖç…gMs£SwÈ3˽PiøÑj;BÖ­Å F6Ê1JÜšß ¡„ÝbZ2Àtš2¸¸ìm+M@pvïd¨ äšëzéÆóÙ¯„¶H7ôR›£wˆûK2oåJ àÁÝÞÍ7œ`ß•kŸf4*Ø £À G´,l+ÐáOœbiXÑø*JŽ.íY|„êÄIÝO¹¾ùÈ|°Í<*õЪJ¼6ÁÔh¨³,TWDjÀÈQIÀ„ðmì4XÆãõѲ*÷C*çgi;n þ¼áT£?v=^Çì8!nÌÊÄäjÖepôL(: ŒÑl²(("ÒòBòˆÁ‹µ&áΞX5ìruµú0v9Š¿üÓOÓ¾º… óMyL„h)bo;  *_Âׄ''+2ͯãQÕa:sC¯‹?+Œoã ¹{è+}{q8Αâ¤7›Ì:;™® ªÒjá0Ç0>?˘0†O°8Ëápb›K_sss„ÿ@OO5£ëÄAuÛ\ù²ï’píÕýI¦3Þ/ûˆé•àÑ õuÓ›¡_m8œÙ8Æ7*©:”S«Ÿ8³ÎO¢Ã6ÛƒdÀ|9”,wJt;‚ŽŠØÚ_TvLл³Ñaõà ¿™SOÅæ¼3p½_èåc× Õ¹‡.]ë#Î`šs ¤?üÄT6rT – t}ˆŸ0AÖm=>5üñÇÃ~¨<-®}*‚(³o… ‡Ùõ7]\ö…brxÞ`ÛÌih1éU3 ÌÐï¤ÔCx÷T9;þxpË¢nëÜÃg4^GÖµE–ìjù9c’>UÐÔ¿Z}ÛÐ/¿=”5–VUXkóÒuû9¯ ù…º6„,Ã?)Ÿòˆœ"+" ¼Î×ŧÛ˶p4ƒ<ßÅ0ƒ®¸Zòêà‰‘ÉÛ+`×¼ÄòîŸKEªæ6ªÚW„r~»®Áž¨˜£ž‚p`”·ãjá¤r«Šœ9GŽ\.+Ó>••ùüƒºÊ€ ï­4Ñœ_ ¹:ü‘0aÀ®¶mk;÷yé7ºÕ6 $ z,lºÂ`ñ¶Dl‘>ávòª:jW&Œ$ZcQ=*4J+¡‚Ò«Ðs6(Y;'7Ã;@Åh;#ΙòJ<¬t9!×”§$|,EDÊY‹á#‹„\€Ò˜Ü3 yüò×|?HÈÇG•/ªˆ £!5ísÐKÙ>®A#ЂdnÛ?‘÷ôç¾­tføÛÄý`„¬ÁÓ‚21à´Ð>úÇKÂðÄÕèa( Þ$‡³‚lÀ£ÿl2¸I>Q?AÎc‡'ìÔ6+Î@'æŒDAýãÁjaï°Ú$m.ˆ˜ð×§ ŠNPªE†DŽ`ùj:36ôÐØbǤt:5vEÔ…Ýé/°Îâ*Úày_ÃQ^^û†8Mëµä0¿¹›EßÝ$OØVñ­Yú°ŸáøI6ù”v5£@ØñŒ'©¡£xÛf\‹J wàèÌÊg«¯—ÛÕs>žO™Iå´J=ÆíÛ²V!#âº#q &†L(m¥oUD(/¼T~Y£éÑð‚ܵpX0·Ñq]¾‘v¬rú«ÉÐè[Ä+‘²¢+÷‡9¼$Ã+eùʘÞI²M~×}TÁ­{ÅZÞ¼Åݧ&1I—³y°‰&·Ýa{?`íøq§©?í¬ÞËÖ ÄŒÝ|±ã¬cõ=ŸAìgjE:*º‚…Ùa3ÙXZö¦hîvÓÖ@ÛièO0N¬§™ºKŒ‰ hmº_4fÛº5’{§I˜4ëŠõš—å £“€+–˜<;êeX´ŸC®2Û¹ )D[I5®Âƒ6“<•%‡jMy7˜ÉAG—ëkñÉ£7´^&];ôÄO+Û3 bæuê.o¿£+©CícäóqQ}üҮȄN“)úÑ5œÆÏ>¯\fæ~5Û’tÏéÖö‰ˆÇÕŒS”é01`}©<@Î0§j6‡0› éŠÕب ÑwÓ#ÌRŸãøn½‡_}‚¸—×›&{¯ÓÔéÆY]Rí¢}‰é‚ódiÒmƒ)ˆ¸—<"í.®¯¼uC¯M·Ï‡\wÌo¢¢-ǪÙjkеû+n Ye²â#†æÖþñ— ‰J³ÀM’E¤V¥S¨0µ »W(bWUynùƒ¥çè½¾¿Æ~G 7ïžÿ^ø­»xó§M“ƒ„…ßÓgeã-’ž‚a1j­–8}"6>%¡¼®€6±jÃ9]Q‹7= Žsríuzõð=ÐŒÌT7] 19”fQˆ£’¼äŒÓT¦ Ô¸þÂqžmûÓõœQ¯oáá©'±¨ PæŠÁ@àµ9WEôz]"ý˜ˆ¹ ³$}­úéÁîi¢1Éô][KLýW™±( þ#ø½l [·þ~2AæS{Ìh¶OŽIYSßwHéÑ<þ¬~ ¨ô"þ7™>”¬#hº±Å]ŸÞüì;Îoø–B_mÒû¥ $ºÍØóëê!’`ž6°?\¾ìwÅ çwØsb6³jø½>ÔöÁo(¢Ü¡oåÈ64)X>Ls$‹À9Vw$M}%ßdk’Ì$Áѯ¡Æ_.íC Îu/üTÀâVÊÝ6"„èvÑa-± ¡¦^$‚+ƒ'6: ÏHänïŒn8¢ûI *N$Ý翲N#ÜÄl¤wÕá?ød£gª°ÃÛö€dD²CüCáüæ#ðJ3Eò:£ÇÊâA%¾Ò‚Ü™hìGH(Ç­Sõ«l ôL¯¬ –6GawÙÓrð{^|ËÈD£´5vÖYõ@— AÅ'¶0Ô꣊ØV1ݦͼÇwþoÒ¼40h9Ú¤˜ãÓòíðwËܘ-PQÕÆ!¢ç;‘ÍôÃV3Yi–bÍ(p^UßSáˆ0…±A’•bo|:3á!šï7k–*½vq 7оcÏS[!3¦&•°;`D¯g#£Š;79SÛ" ~¨sÉZÉ«z;lœé<â²7INax Ï)Àé(ŒOƒØ -¤mö㕹%’¾œÌwâU›\3ÒÚ˜ulö£ ­¤&)¢ƒ§ÌþµÅEýùp¸7z5À‹Gì÷aƒ†ÞAR‘0Mj‰ÿ²â¾ ·›…£pÅ×Í\y_D©›‘Rªð4ç†æŠbw6xbÈVÔ\zYÂâkì~åD.š–³/ªbZNÏ ñ7…{k´˜Iá­4îƒÝzœQsCÙ0B.óBa!deç5ü‰Êžo„'3Õ‰®,tÔ‚JRÚL]!Ù¨BZu³ˆñ°åý¦8½î:¤4Yç™,¦¢¼\ÑNÂl®×Ë].¸S™^õ$PD¼@Câk WµG£:88õc´úÔRJ.èºcÌ…kÃd3zˆtœácCƒ6¦A¸ÆÛ•†™ „Æ­£®?ûÕöìv£„;…6ÕžAºÐc À‰Æ‡a¾¤ðKŽD˜¶ åùK‡¼[‰? ìËÅë­— …lƒçÙ[{ÁÊŽu@”‘4× ®l©Y³´‹‰ãp£ËdËþÀ”ù‰\Âè"=Žu|™NÈ5„4t­d¡ÙS–÷drØ-óKÉs—z —²IkÌò2 P÷»ë.çI‰ILŒIƒ'á5M} qÂsǰc儸ú&ˆ˜X·ör–¼‡„HÞíOì¤)A‰²¥§×ΠZbX•5¡m¤Ä­)‰‘û”.~(Âi­ðlϘ£¨>yÛ›$Ðæùñ9ú˜ÃâÝñü®‘è‘C‚«~/k.'µ`ª9:Të©n÷ßå`oJ:ëȃ*¹=f‚Lt1Xµ`²ØÝ¶a!sƒS?g÷4’ Çæªf~jàÿÞ»zÔÊ¡û-¡òÞW%, äùÐ8Ø€ƒy¸çñ8}~A£%_µµ‘ž_uñ¬IiÊÌ1Ì»T/ÿÏÄæ*Ì<;ÿNÒýì*Ø=ß }ýÈ[ƒ±µ±æƒo1@0ô¹‹übj#ÖK˜©55q€Z1$X½…[¯‚£5iøÅÒ¹bL4R½Iǹ÷S˜Íú¬NW+®šA_TQðíGÓÏqûó&ß©´¦û»£û(uœb`$ˆú‚6YDÃf|²=ew³¹¼àjÖ:R·T3z"ö놉֤*09,G°—3«wÊd(|a~Îå˜ÁlK–¾ÉÀ´MÐ+ç¼°š+° Øëg ¨]ZahqK½v¸5H›øö”<=wRðK¤‘•pœƒn§2bÊïVßÍ-x‰Hª¯:PÛΩQøCÇ…á~„5›ü[Ð(_Æ3¹:JŽhUœ^4ˆì“~Éj*9ÄÅ3ÓËÍ@¿øY2±<ž˜'˜G1ŽýDÑ®K†Ï@b™Ñ½«¹Û7…ÒZå2ÏHäºt¼éѲs¼õÒ1h%Îuû™Ò†èÇxª«v¾ hŽ;r³îõí5›¥Š-Ù‚ È{eöĥ쌬à¾väÐÍkÉ»ÒÀH<›®­(-Å9{‹Ö¦«ÝxŽûÅ:Ü´ûNXï–âzóï2 ëžô+ ü^ÏY4A6f4’V­œì4â,"x£hÅ‹b½Úà¼!>êØ"Š“ KÌXýuåÞƒ§¡è2&f}qSkó²©ÌC¡Öw?ßRðµ|[j*óâ%dvlW¤åùdˆÑˆeìi-nEìÙ:…¸múnLÉN}Ý•¹Qñ[ûÖ¡CÉsâÓIúVЦßEâ1+cîsÛ~¼Ý¥-î—Çàµ\Ú"8Ü]a‘µ†gŠdR 1bË!Ÿ#û”ªí)%Ù)ÕN¯°­ ehö&oéÚ£ó,,ÓÂ×ÖùP"ou€ªŒIT>n„gü¥Œ1¼£1Ø uÃiipeƒÅU•“ PÓí"´è}¶¤¿´–¼-'mç|îüøcV÷²Hµ„kôq†p=]© o6äãåÆÅq½ÂS‚—½€”^‡ÃA*á92m,Ž2""òJ+œ¦Ê~²Às<¢–|>ÁÒâáKg–WS «ÇRòŸ`­v´)HÕ*³JÛBì°YÜò¾©¾!Dñ~­ Tè3éAP<“*þGƒˆ’Âù›¯ýZX0áí¶Iv¾lY +Àgtð¾Õ0R2*3)-$PûÑ¥Ë=q_Dëâ­>XhöÁõ«ôç¾CäRÇÏÅ'ù/6ºc@¯:¥„ «:jX–uyËUº%æBïæKšÍ•#ű˜ƒå[':ªŠ<ø†–ë5‹„“Š`¶¡e=ÝôÙùôíŽÏ–qæpGȼ_ád,å›ÉQeûî}ˆ‰)·6þ'í‡BÑ»h+³PIíÛЇC™O«ÍJ¹¢¾DšÀô¨†aSÞIøz4–yèHEá¢Ï@wOÞgo¿ý ˆïÑD‘U“ùÍ¥½i%Ç?‹Î›§ë_òÛ–ÓŽD°Æ."ê¿Z¥²Çt "ülõ0€ù)ì´·+`Â){QœP)IO0Vnbw!ÓÃ’ê9žaIùþoå9;¥JÉž‚’WibÞ,ŸŽ¨[.á¨1¬U£¡\²»Gz-(ÉõÍ2}–€<ÁªÞÖXÿ^€$*‹ûµz 2Êó*´òÕN‰€~¦öŠù] G5$’1íä8®{å…‚ß1‘¸8('ÔqOØžCŒYs8€WÛNþþ¸ Áo àb{4Sëeä[@SæâbØcúäE¡ž”:ýˆþA/PʯùmÛ!ˆþì½Æ¶fF=žËÖf!‚ŠÑ|t/smw|Npüöû«¼¤ 't(%_gòêj~¨èòÏ–»çûÿH”œ5#ﻢ“Α†³°”½¬™§)ßë­tŒ•ÁóqC’x³â¡98ÿ28 !há¿Ñ”˜b©W¹!gÐEh¤]ø(÷%©åZjGmÃ?“já‰BÀmÎõX&[ÈÙ˜Ù5ÆßÞ½îd’Ì®g•ëÙzQ`ý˱”šuÇ£>-ÊA­r+¹}Áv…€£üõ—­¯$aËé«Eqdù؂’=køš¿Ê8б݆›ãÔÀEùÅ?`lƒØûèøW~Cx„t¸Àž×«@ªÇøüüJTeºÇÝe.CªžÒÆúÅuùT0V*0,!u•„ QZ›BžÒï6,*fÕAø9äÃÒjáþh§{°å ää¹’:»|ú'è"æDËHHk„²ØÇ·“iÔc¢SÒ¤uA„(“–(°ðÄABÌÁsÚn§Ÿ6y*»iÔ‘’?;‡[¬ ì=Æ^Ãy`Olhz-¶Î&×K^‹&ɧ«ßÊÔñƇç‘ì˜è—Àà †<¯p9³¡Ý!ò˜Î’Q…6½jÅ.ŽÚ=«‡õ Ãä1tÁç Ð„±¤;è,½úŒB%㼈? ¾ô«L@ åæÊ¯ÎðŽ“ŒwëŒ[¨Äd¡Ä›ÌŠZf©W#·}„’×Ü'HKÒÈn /¨T`;ŸcDÂÉ© ÌCÒqíLó‰éN `¸s.¶­ƒZëMÕ¡ÐACºƒ:º4WC êö¬™~êKã—fäÜ+r¬®˜/jDøõšm_ÕM©„¤[µ±‚äFŸÐá@FÌßgÓ3žæ:%ë†Ë¶6x·¯7’ÄóŒ 5æî¿N¾vÛ U#ß„[­~Mh©:”oÅ$ªä¾/7ÚM…CX¢g%ŒŒEÅ-Ç| ³×â̇Ëjâe û"Fê„SC= +Œ¬y«\é[:dææ‚ÒìtˆMêi–O!MŠzd;I§f)å¡ÿ0¯˜žÛ8…‹žáœòVȯÎÓžo ÀÆ(å”…¿­¥šiõydš¥9| ¬»h—¢¦Qíud矲ÙÅ‹FöÜšTMiv}!¦»h×£¤¬&Ž Œv ¯Ô¨÷®ÑòÃÊÐE¥å¹Kvø®½m¿Kï _ú©U~û}hr¬-T_ê5†¸Œg܇åöØ¿ Ê9üŽß \ šö¸ç{ü¸ ´±ûvV×=uMTA²í bv6ù¼¨tÕzHÄþ.Þþù=a3˜H¾=ˆœÉšr­7ŸK{Aâø#u™»<î<¡&ÑkŠ”›hÙÏ^Ö¨q—$d§ƒ4²šín‘Ì”ŸLIßóÏ~ ™gcÍò÷N~‡úP$©ôX­{çùÚ,›mRLõ¨§Õ²)Ë¥mýb×ù&|¶…æº}›òºáy‰z”zû”ÅTá{*5L—fߢüµºÌç3~¢;²(áìʺ´j“Uÿ½0õìø½ ѯ ŸM7*½™ÜýtÞ Ü*ZC(f`–‹ˆ~LÌÇq䦑_‘äcß]¯)àdM¾a«?² RìÍï 8À>y“ø†òXÔ$J£Ù³Ï,u>&{¥2ðŠ:ÓTAñsž±Òë Ü4ÂKM ’i=HiÅ÷‰›CÂÞ„AÂÎ[õê;Z‰Õª‚„„…?bÖ⎮V}ÿt„"sªI@¡„å®Ñ·Ð¥qLg½OAt3ÕÈP!—&ü*©%ñ‚°Üßü(¨°ì‚ö†A\žGz© þ8ÕJ¨ìLTIæÀ|¿÷ÄÌ•7R†f©j~4‹mÐ݇Qy†šP„ÄSgˆ É~ñµ=j¡Mk„»H.è’¦5+3Z™"3'¨c¾Þ®»¥lÖâa‹ëN#„™ýøœIîðxÊ&ÔI?»÷*JL«Ý#ßÀ^kæ*:5—ñ¼)]NðJ@ݳUG³UZ ÙãÉ(êö"³Í][8ÐÇûÙàFÀFÄG=V¸Òü‰Œ.}µ|‘ßêÖ"•J‡«bô¤š¨‚'×ú«‘²ƒ;¯ûHNa‡Ê(að ;Ž€éŒØÀyí‰è5·]N+¶ªU§Š#ã°¶‚µ¿ât ××´Wë=L‡tV¬Bgä¼?V”u²b­Æz·ÍÁvª¹¶O,Zœ‚~)¯ûeí2ÉóÙ/êþ”°V“6cIã)^õe(ô^ÙÈð/ýc$˜¡V—|çí êõ`(ÊéA¸­¸ivó 0I‡I¾d^üs–þ#ùJÖ,™qÈálkK9§µ…åþ]$5ø?àIÀõû¤hŒÛž!¢á99ræÊ\YèS>¸æ' T€Á¶)‚6ªÊ.¿ä7(—M!¯QYGEQÆò„·)Þ(hÐÝTÄ”ð+騸#–R¥7û=SCÚp9åã*nÝëÍ…ImT¨ôpf2ÈôžèÙý¤¯9ˆ, /–D¯ŽP7˜eÒvŒ ú’vîvŽâ‡½çà âí}àƒº?¼©ß<å\@"˜5W-ÞðVsG$é æwí5„µ:Ûƒ3¾ŸÝòo²ÄTy*peŸÔ…”ÙZ|ècÚC:T‡­Žy &é„¡žÏ€º"o”Ïbp›ƒ;®mHÎé_eçÓóñ¾¿Ï@Â×»™uoÍš¶ÓºÛ®ãÁŠÐÖ™½P® Âæ‡k9Ÿ#šÞ÷}eá¢.ÝçïBœöï»$SH,–ãƒ+ð×ËëœUõª8&MªÅ­ÍÉY¸ž¡‹Adp…fÂÆh1¡K?¾nCgË0¶)T-‹=“+\‘¶òÊ=»/ÂCz.j3´°ØÄ“¶3ñ@ û¸Áª~æ¦OD€ý0n{öãk;}Ú`Æïh÷ˆâm¯¥šÿk@±áÒ³tv‰Òu·^íÀ£ÞNgb‹#ï|àÜòBæ´›<„,†ã̇ù¬Æ‚iü×ü³¾IÒ{$3nbºª pY<&xR_RÙŸÕŒeÐ ¨Âåcµä~¿²äxx$ é„RS€ÞåéI®µÓ`Ã0îÖ¤F~‹übãV)BjÅ?Ó꜔ÀOµ"0Ôj dHk€ƒÒß¶ÑÔE,E8B”©’8ЛÓâÖ¬… Äxvû4ñú‡a"+^ŠEÑWÍIËæ+?m7Y¡.B%,x2\è'—õ1]ljrø€ö4m'Zfæ¥Ü{¨/Ç:´*°ñ*?fp° SäN·¬€SñìN¦¾æžZ,¢Â¬øfyøÇwy“ÆLÜ,ì!a‰ñÈ,Èzñ~^WÆùŠU¢3wVºGf³£#yê+káä ¢FHö‹ý&øÅ !¡Ï 6ƒºÒäø ÏW‡ÇJ¸1wÉ«ï-ù¸—Õ^RI,§fŸK;JŒ4oÖdAývgå,…èòì31ý2@àBÑDþ¹Ýñ; RpEUó3ó™P1ÜgHòlõÝä%Ù‹Þe¼LÏz_ŠºÔ#5j¨¾éóðneÊ9ˆz»6ã;ìd3¼x=Ñ>£ ^´/”ü,Æ.å,V?cÕz~‚W:VWüøôЧ¤>qgŠô¸3<‚yžð,'@?àG/3WV\\4˜ÖX«|X> Y1ŠÈvߪMø.% ›9_¾¿¤©¸izÌN Akìy*¨Pw¸ ‰úõÇ¢úˆÚ›’y EjÝkŸî&š†9Õ)FMQ©‹5-Gt&‹‡´—€Ì›}²AÔÀ\_œ±ì¯ÝNu#¿BrZäˆt/ï§z˜^ݧn¶¯¨‡Mpëû´Ñb¡j¼×x0 ?fBt §™Ío„•GÔÉIr1¯—Õ§S§ësÌÐ,âphæ•K(û<•šôn I¶6]Çý³0[Ïl_ŠQªŸ§["tG†–·iƒ<ÈO•,™Å^DcÑè?ÆQpWØàswóûK$sRÆ›‘.= z¢‰ºêLpâÚÎk¿wøp']¼õå€ MŸÒÊvŸ²Ý1j1Añ•ó\æ#pŽ 6Å"ë;¡‡€>p À©ÿʬ½X]—“ä’ñ)¥%?wO–mÛèØÉ7Æo?Ã<ëxs-v4ÆíuŠß–PëÏݯÿp*ÇÝ\Çˋۤúé¨ÆÆ´Óþuf<€K‹ô:¹Õ«¼]ó$Ÿ‚#"‹N±ñÓ¼ëZÅãÀ|rµ´cÅ¡ÒÂ|'ôžŽò›¤jugø‡ÕÂþÓc–í¦-ŒÖ ÕóOµ§à x‘0ëwƒ–pp»|ww '²æIÎNCòó­upG³èôˆäè áÅø@0Mî^¾ÈÓ†ÅÓŸ|fXÔn›4»üqìùå¡:»cl%×6%@!žëï’EyߟnTèJø™fú°ÏwVnpÞ-Ç{§X™€ÐÔšà‡Ô5Îóè…·ß©SÓ<Àì?&ÐN¡¥2§Šm”zo÷{º“’˜0¥î‹Ñ $ [t­Õ ³æà 5Ð+ÜÆ©&}œª¤“O}ÞXk-tÇ1’ëø©ÉãTìý©KXòö“•! l­"šýç€Ã©“”³Ë˶x˹+:¾±ËoÈ>½„üû‘þäÜ9’¶.r<Êá] kãbÃú³¦‹#Õ âà7ÙE¿:ªU>1dJ»âö}´IÑ7;‰íQíG ¡?óËà&­Ê“ê™®ÞLˆÐ…F å›åµþ>èÊ»’xå.p§`"£Š¡ÜËm¡ÎÕf|’lp,l}E¢çE2¯–‘€(Âú$U8‹lÂ_6Ã1ÆXu§P‘ß4ÒR$”:ã3©þúµ¦RåìEÜCMêBÞúS¿g[JØPÆ´œöà0Ó™ëgÒB£vN]|ƒq/ý챆ƒj1éH”íãïŽû}Uæ¼§ì w+wñëG &Cy¸Í{½ .%,LȰÄÅ>żî¶O˜Eîø²8BÛlLov¡WR5‘Óp´_Â@>ƒÞ fÄ£ Ž“®z£'+ć=Î4%ª^gkþðÞy†ZËØHëœïÆq£…Ükð9¬Þƒ‘’ôã`¡iš¾Î]EÆKäØtí,ò£Íôÿ)Ž÷ÿBwD9|éÛ­æEèz¬êYÔR%ÈYÉÒO&c¸•O3ûñf¼&¤Ïõ±€ãt ­ˆ¢;2„´ÚŽôÏ,—Ž[¤A#¾U %†è“õ$ CYÖa 3qMqƒ ù„¶…Ô$Z—¶Wþ#pû}¢žîÓð³£… *¹ÖGŠ2\ˆœÞpé?ÜÀÏ[Ðg9?1·y?ËX—ŽZ7kÅMú½&ÌPL†â} ú>„iiºç| ¡æüªÙ𚇙EfÌwk›¤]GªG^nSôÍô…ðÌ@"W€Â/öK2ÏÝÁ ÇT•n|ÈYœH–´cÂÊÀEQ*Å¡©=0—pÅžEÐh¦z’äXƒÿO°Oðc \— 6@y²î°ÃôåIŽ1B6/j ú,¶[1“Úv¸ -ÿz ã~PÍ[ipRÁ©¥åô;âQná&["Ç}ÉØ†@År…XTÓ¬H?ê¨L_™®©N2œùó®z¥^…Xl²Óš¦A¨†!Sù€hƒ£B;C+[“k«»ƒ’ê¶÷X…µç-k“Û!®Qn†ñLfCãÎ#x*³à×Kð8~$®Ÿaç1“_GK•-t:“'hì¥å6Òæ¾=íÙ{¯ý»¯ÿÐ=wS#l¼œ¥oç¨g¤ðsnã?0¬õpä0Õcƒf™ 'T}@ÇS–cß9/yÇ$0Ô‰$^>‡RûH¬e0kŸWùç²2eârôÖSõèu±Žöi%¦”áÒ!`$k,Ò±ý›v\Í™@t 4!G‹é Ö@: ô]BtáÄ›÷’˜Ü ª)׸Úˆƒâs«Oa&]-¨.q¼†[ç„ßV ¡å4”û>”…t œç²¶2ƒo`êÁ6P ›#Ù†ÀN ¤š%ˤ ¸¯ßT7Îl•ÜÚä¼}|Ó #E]ž‚yüò]ÅFjCˈ¦04£a7›InÏJÝÒQÊßxh\ÌmbÁê!ŸÅÙiÇS,ÕK™ea4¥0ýœ^Æ1Ñ÷[)Ë«©hzNÂ8ªß×¼;Ca4¬Nr{‹²ŠW…`òV²ÉøÙHÍ<µ~5¨óH4Ádó¯oTKd ¥ÿ#çi¾7ÝÖnÝ.䬒`}c ÅÍüm€ ¾Þùå?_=ã°•_ö×ö¯¯|P&ò¹‰ø>OÒã‘våÇ¥3¸žÂf±Ãž%4êJ·[b¹ b]&Ø•ä:‡Ÿ°¦1m†U€Æ‹÷˜ª¸xåxg?öz’t`ÊÝ@&\e„¤.›…™|È»F–õ °Š¥ðñ¦Xl2 …›™é´Aéìý¥£X™ZàøçÕ·Oî|nè'+5½$+R¬;ÍÒ´ø?{Ã- ÁP°6ι<’SÆým-[á¡ë–Í“t¤óˆP~±b@HÇ“fñ<ä¹îôó<[źs’Î…+/dšðxÙiº‘Îb;ªã¤V&Ô¦Ù! 0Æ û0rÁ•YÅNÍŸ¾@eQ°³È±ƒ:ˆ4á¿ìØz Ù %ô…š:z!KØ+Ò >!ôG­­{Þƒî‡íh=«(6'®Á>E ¡\%…[Ä­£EÁÙ,µˆ ÔFmÚ„V÷¨$¨îŽ)ðâ!fkÏ ¿o€ÀD¨`¢’^–<ÎÐDÚ£Y#åÿm®úxEìÚ~´Ó_6ëHP«:e 2½*úÿeQŠu)¯‹.]·‹xžÖM>åXŠdÜ æLi³z‹HrªÂ‰arÀ˜‰ ü&WQȧ ‚‚{¨ù%¿ßç.Jà»LÔrø8ùý@â)£³oÙl™þˆÊD½'År={×\¥çæÆï•PÜxfÅNoö™>jÀ猠ý¶ ±jþ‘IÙΞ)æFܬY°Êx÷Ëf;Ó5™+”dÙ'‘«2ʼ?¯¡‘x Y¶TûÇaÓ1c7“k¹À/D5éÿ3©2(ÍË=½4~wœëXG>x¥¯/#O/óPÿ_%‰ý*?8ê*PzáíQµP­EÕa4M:dpÉDž%R/&Ÿ†‡òr%DÔ§ÿBïâõ?&+MP©)iX¥üʲ§!’Èz¤×>õÂ0û+ýÛ·ij9©‡‚,Mq¡¼ÿõÎ2C\æX Éÿð+@ Grƒ} 1ÙŽsçncÙs¯2Çbd=PW^™²Ò”Eƒøš\#Û{Ç4â¢0yßéΞš× ^©¬‘ raœÒÏVÂéù#Òô1œNUAÎ=Y1ˆä2Je;s $5Ú=(9¶Œ9¯Mþ4<éQ˜_Pòd%5RÌQKibê6=Ê’÷¯ò¢öKOi}>ãä…K ééÙ@ñ Ÿ@  ¸ŠuB£ô )°¬Õ,dN¾ÒOº©¢hz+Ü&•`å*ŽVw`´inÅ^-ñÖ LîeçJ÷¼²ø¦™”5ŽÈf`ì÷Úlz<«A[KV6ÜqíÓÞøð€-C}ÁH…2íì)É'ŸH!ðê/[¦â¤;dÊð±”/3!\íb ’§ÐE&’㧃wÀBû¨£—ÐÆÖÒk®èð£ÁZåÌ’|£ŽL Ò«œq¶x^èxR1w )puØeýs³¨uôP33.Ð _t5ZÅ(ªuhxœá`£Í³%xp}ú¼¨ˆ´v½²ûÆ”%ùz✀{M™m§àuÈ÷òï(ÄVâî1a†ÌsÒÁâpd;­u‡Ü}@0ã iÔË„Èð} ñä’äôɬlq­Át’\ì¢_懌L+ÒÔã£ÏñnÍŒ0‹uœ*OîßHKë[¹·‰]ÆAÒ’&1ý.#%q(R;1³i®ÄÓ¦>:³ÛâöIº.K´øú|ÅyÓÆûò°Eêì>U"€-ñᛘ͹ð©ÔÌ]ÈœV“EVDìøAãL(ýibPJï-^ éèB0é;V·AÑÈ‹ÛNw¹ IÚÿ3užrÌ?O#@~ž©)~ ˜[E†};$,ì«Ú49º¾?–[bã2?ý‡M·‰{Ì—9Tmƒsœ\eöÌØŸtË|ˆ‘â=¬«Ô¶zÐJ¢ÕG7‹ŽwÑÖÏ:‰)[Ä™óƒþå^¨5•Dï`¬ñ÷P`ú¡ª£aÝÞ#²…ŽwÇÒÔ~Íåç|î¨x¨±@!y×i¸F¬ÿ+Hoïõ.y··°TBØFús˜áî”ÓDjQkGÈ”8pÉÊœÚ(”­‰Þ¦á¹n`ÉK䜉 üKšê¨¹æXy‹y«@N°eÒ= ƒFTsH3¯¶µga…ŽÛÅá%‰XÞG|Õ”:ïÏ̧AÓœúàËÙ^ÕúòX 9¡!–¨^¼g¡Åj|ß¡+â­5Ÿ7Ôx<Ö¨°êq{_â{9ã~b*‚ É'rdãc4Q1þ’Ž1G¸=a¨òáD±žÚ‚œl½æ6÷j¾·‚eŠç'l/‹ïÐ!ˆYÅ’àVf˜M¢¼ŒŸ5Iémô]DŸÇ¯—!'™ùZóNª‰KgÑ›¢–ª6ûÁLMÅ«ÈÌåg"ÇQ€˜Ðú7¯¾¥Ùõ„_ãÿ7Á^¼yLܷב)¬¿ÒW:ˆNÞ¯99âÓÖ– Ül…—ýG: Ö w ¼UÕÝü°S´A×îÆTOùf8ÏÔ1ìyJqoc#< €è´?0æ2­BxWïW¦ÏjoS‚ïtù†¯ã6& èmÉËXÍ/pŸ–ûaûO‚ù±ðy+ Ö­/J“SöÞ3„·pO ytúÆõÛÕm9´JEÑÞ¶¢1—„¯*•sÛuµs’jüF'ú©è´¿w:€(–Ì–eµ5Ý¡r…/)4ç×Õ“ÓâdDD÷Æ5S`™BÌVRjŸ¼¡²ÝüHÔyÝš’—®‡5’mrsèï}!d%¹Jò ^è¼ý‡p]¸ß­ñgéªæÜåìëú+¼C˜¸ø]ð]PºŠSéDÖÌéiP¸DAd‘ðÚ0Å[ÂP-šî’¨ÈOlêÏ@YC ¡â¶/’—]Ða=m22EñÞ S—€.ˆÇœŒwô¡9‚‹Û4ÖèØ¶‹îõ¤«jMüÙ:ö¬èÆ ¥“GL±y‚öÖ±2”¢†™¸èç<'Ɖ«²ÌyD2:_3šXD¶t­uî{¨ M;úO¾mû¿v`~8¹ ¿œä>A„RäÖm(ÁùÀF™!2¡UY1nËC¬âЈ‚ðéY$À3V“ªi~Ÿ‘×`Ósfº¦1™+;&'ÚS@Üe_q%rýgS@z¾þ6V«@ ¼Ñºæ@H'QFÃ.yð1îÄ(¢ xf±´M[ùädÊò$åck -ƒïèT^é¥ù¥1ÒNÉJqNv@E jÏ=ÒDÃ*žÐ¦\Tk¤l'ýxÉO\5¡éæ“M0­h™û:v–Éáñ¼"ÎíÞp7¹§›‡u4 ࡎ&lG˜£Æä¬s¡Hʶï«<å$…d_î3SIɸ՛™ýˆN¤¡Èx¥«i4Q¥D}–uý[bù™íRŒ;pÓ7§Ù=MR-pµÃEµ­åíQЏ"0°æj…±Üg¦ÍƳiOŽå;ù#ýh¬÷Ù¤mT>êunÃÏœ–ú×äZ‰f¸»½[^• òÝ¥~Á«+E}I_œ„R7lÆIþ@„M‡igfjù‚Jåãí<ÓÞˆ‰{"?³lÄ+÷†wu¸¹vÊÖ`´Œ?-â9^©¨•Q´¬sMïõ]©Óe¿äÆ!¬x4J6"î~°îȾÆÉ)M"F{]m± °à?7ábÅÝFÝø÷QBêõõã´„ŽŸKˆOWÔüº‡yx9§ʯîRÿDy럩l`šÐxL~¼AÍH·³Ë§Õ»‘¾ºCµ¼ª^Jœí¶‹4´ïz®Xî½g}}*Ëep¥i÷š©øÀƒ4%uð­7­˜ ì¡KÖm8ÚL^CPw‹èf«cª‚`ð=‘ý78±ÅA~¼›âp'q€Ú¶ãÐe)¥ùÂÀ Sq:{‡H®N1&µúÀ–õ©º¨êE×{áœÝ5/ÉUÝÙ; n•Þ”Î<Æ®`ç—°ž¹ÿ µÆ"•?†¥“’>} z†­R²== ˆc ˆÖèÆ-ïAÌ}•êÈë²jÈãÜð’7ŽÄ„O•Y[·ôÙØ'«¡U* BíÅ} »š lS±SNÀA <ðÀ\0ð³Q??SVuéd àf·•~ˆ ñžÖÉ/¾MœÓÉlˆ¥Ÿ —ãÙðù#Ïu7üiÕÇÚ^SËï0}‹§þ¸ÊòÜc¹°}EVÏuz§Ëh¾ãY8ÅÚb[Ý"´tŠ!·ð¿¿bã¥9ùRŽIµ};’Ýü3²®ÿ -SÕ!#†›W¡­V@Ýá¥ãñ$‚êœÇݦ;è¶Û‚¢ûµßÓr¦ÎÔ«¦\mÓgJvåG¤ÌœZPI’¦IÇò¬Fš›Ê^œ„3:§Lhj†:ûsFj4Á>pDæ-PÔ`È8zƒy]üޤW¢SD·xcˆ Qçr¼K¬ƒ½®x²/M"Ï9Î$žØ}×ÝØò7}âkÃZ“j§×ÒÕ½D3e¶ê܈‰#Ò0º;ªÀ endstream endobj 110 0 obj << /Type /FontDescriptor /FontName /GHVHRQ+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/D/F/I/L/N/O/P/R/S/T/U/W/Y/a/b/c/colon/comma/d/e/eight/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/question/quotedblright/r/s/seven/six/slash/t/three/two/u/v/w/x/y/zero) /FontFile 109 0 R >> endobj 111 0 obj << /Length1 1846 /Length2 11633 /Length3 0 /Length 12783 /Filter /FlateDecode >> stream xÚµPÚ-Šînƒ»»;w  Îàîîînw.$¸K€Üýqäžœ{ÿ¯z¯¦Š™Õ½zõîÞÝ*2u&1sS ´ƒ½ 3+?@BQÀÊÊÁÌÊÊŽ@E¥r±þmF Ò‚Aöüÿ"H€&.¯6I—Wž¢ƒ=@ÎÕÀÆ`ãægãáge°³²òý‡èæHš¸ÌŠÌ9{ 3•„ƒ£'diåòšæ??´ft6>>Æ?Ãbv@0ÈÌÄ hâb´{Íhfb Pw0]<ÿK‚VÐÊÅÅ‘Ÿ…ÅÝÝÙÄΙÙl)LÇp¹XÔ€Î@°ÐðGÁ%;à_•1#P4¬@ÎÙÕ,\ÜMÀ@À«Ád´w~pµ7‚¯Éê² eG ý_d…¿Œ€¿{`cfûGîïè?„@ö›˜™9Ø9šØ{‚ì- [ @YZÙÅÃ…`boþÑÄÖÙá5ÞÄÍdkbúJøóä&i1U€Ék—çl9º83;ƒlÿ(‘å™×.KÙ›K8ØÙí]œþ8Ÿ$ 4{m»'Ë_7kcïànïý7°Ù›[üQ„¹«#‹¦=ÈÉ(+ù7åÕ„ðÛf tp±²²òðq€N ‡™ËòžŽÀ?l˜_+ðõvtpX¼ôY_¿¼MÜ€°+Ð×ûߎÿFlls™ Àh ²Gø­þjZü…_/ ò¼g}=6ëŸ~¼Ž—¹ƒ½­çoúŸ÷Ë"'§-#«ÀðWÅÿøÄÅ<ÞLœ&v.6//€‡‹àûß*ÿÔÿŸÚÿ´ª˜€þ>ëoAY{ ß_%¼öî?e¸ý=´o à¿3(9¼Ž2@û{òõY¹XÍ^ÿ°ý?ÏÿŸ!ÿcÿ‡Êÿmòÿ÷@Ò®¶¶ºiÿôÿÜ&v [Ï¿ ¯“ìêòºŠ¯»aÿ¿Tmà_›¬4¹Úý¯WÖÅäu;Äì-mÿi#ÈYä4W¹˜Yý5Bÿ¹…Wy[=PÅÁôÇ[`bceýßë¾™Ù¼¾'ίwõ§ øºNÿRÊÞÌÁü½cç☀Á&ž¬¯ãÅÎÅðf{]Ps ÇŸ“ `a¶wpy ¼–ç °p#üq£Ü\±?L!n‹øoÄ`‘øñ°X¤#vË»ßè•©øñX”þA¼¯LµßˆÀ¢þqX4~£Wíß+2ù^5M#>‹Ù?ˆóUåõ²ûÍþ£“,æÿ‚là¿àk€Õ¿àk@ÿ‚¯©lÿ_sÙý†l¯Êöÿ‚¯Ê¿OòÊ}}ÿÿå~Íþ|Íäü/øÚn—àër°¸X¿Ã_/ÅÅÝá_¯=qý|=©Ûïä¯È þ‹þ_Cbæ ¿>ž®ñëýÿùR@3„Å93ëúÎÛZ1Bw¦Ý¯B3T»ÚtLÞ‹à.×{¸Tºšœ uðµXêhÚʶí•èé“÷a[#\x{²jǃϣQ¢ÚÔnÂÂ7œ¡É’C±†Abx"& Ñ>ON>Z6Ðm=rTN®¼(*E˜·î2 ƒ•Ëãas»ª?j¸å+§™b5côËg© Ms¿ã‘ú0¿¥Ç8õ@½ºžÁÈŸ|!•Kd@ðýËQê­·Áw÷Ýkõ“»óg|J|=c)â¶®€-Ëœz÷ÀƒU ²ÑÙÙ39¯é·ƒmz[¬ÓK³l‡¡žÎævø†©TMMABûµí©ù’ˆ „Ñ8 ¹Ä®×|m„0±©9YmM*ˆÃFõ»‡ˆtÙ5ûƒî·ƒ?·±*5+_Äjª xsÐKàßÁÅÇݵ@…oN¸âÈ|Ûä—\Ãß”‹ˆ{¦ +ºÐ®ê»˜è¾81(fbd®´TGER²MÁÔËSNP8™)Œã"4äkìÇzæ/—o§‡ñ9–F yñî,…TÎI1®ãç=8uBá wY³¦{¦Õ«>Óèôù„Fv‚ð‘Fð=õFU®\ZßlAá¿Ô-¬8î‘°ªkÕBúÆó—}^«4¹0gµ˜÷ö÷´ƒýÎî~4žŸv†jÉ5ä”6rpLDÈ'dã7yt1K'È¡>…‡jÞóJ®bWĉ>úª‡Š0t[І­À9ðÂPIÒ­¸9&-‡Yf QݾÓCïä¸$ Çk&û9W=:Yñ’”.lYp´%æØíIeÆ*€BM–BÙh×yµ¤c`DúÆÒµ¶ûÇtÃz™Á6ìö%9©ðô9ßNå#Íýv<5;··±£Åœj$îÍä#\,èÍ“å±âÇIý%¸O(g$u"ZY¦q=¦³u€Çf„Ž ²1y¤ÞLÔƒtž•>Õ jœlN¨½Yºôç‚H;ÕL>îÍYØ"Þ]ɨ)rRÖâ³±Ö¬;†Ÿ“æ«âiXÓÈ"ÃI–å&žÍ'beõS†;-•ưñW|8Y\Ì T†à˜n9$þÞâ+“'º¾j{“–û|~5ß\l5ï±½È* hÂÁ""ô¤ë·> ߯§h‹¤.ez‡zDa:Ðím²ý¼öGKQƒÅÊ×ÂýkÛry1 bùty_3>†¿€‡íø„•E¬Ù/ôãy‹Çu…í˜rÚª–¯yÓzŽI=ÌÚÙþ3!ˆ&i#»¢ž3uÊEöẼ~¼˜r“lÅ’T ï]€:ÑGµ^-ˆ#Í€_"d¶e±Š‹Ÿ¦Ø-1•÷—™±B5x’ñî›Ý'“ýéDÚ K%Þ®¤i™bñnÙdçU\É |2CFPúœB¼+Cô¹¬dcÑ';i¶Ÿ$B³äÅl¢z½heôƒí¬ÿf2÷´U7Ì{xöÅõ¦où $¤znš—Y[¶*>TtZí(v§íós‰10„¨;Mö>á\ÊÅõ;g„×'eÂxÆù/øx«År4楋§ÇóXËÞÀ↌d°§<5˜`E>–S!½dˆòp"о@`ÿä¤M"êd‚<LçM[Ñ8~šÞfðHu›Ðñ «‰G—™ã@—$æO2lŽo*œÉO §nãnr¡I â ­P³mDÏÔÆãvI%l aÇ}—š™œøDÛ§Ö/kð¢uÏep->QîŠQàd3,¾ulÚªÅõ«¶1•ª*/ñ¥» ‡%qÀ³@'¢y)lëŠí˜üAûR²ææÅ•ëgî­ ‰¹h*‚A]+µË˜aëiˆ|‡96bÅJ{_…çxˆÓd~åç&–qãÑཙü™¸]lìQÎÖ¸Ær(!âHÑã#”uM¾×¾Ã†Kô·dÅ‘UMÁ¿\€Mpó<↛•YÜu‰uÒ ‹Þw”Å­¢ª¥%ѹtKûÁãËÖÈiûQ¬F~©:’”»ýmZšAr/CÖýFmâ¥7öMþá7Žcz ¤fÚê ƒ¼~Tn.µ¦÷½´RU¿ÄäÈ8œùa€ôbE?WŠÇ‘`ôž+G¤œ•¦bì;Už13/ß #…÷EÌœç«ö„S·¦ {TyÙg ôD„ÙH|¨µpÒfZL} ævŠt€£Ïpd`¾¶´¶Õ+“X¹Æáàg/uY<[ô¤&”Î$s¼v"=A9ªífVœAñÆ«ØÈcµ¿7MªqÀÔUúÊ —>´]ƒ9ÈM]@ù+û!AÑã'…#êÍd-´=Að¥u-³ÆN*"ÄU8Þ>õGôpÞÝÙ|¯ºÁ\‡¾Ïã³ä†¸Uwjh%˜á>zd†ƒ¨ÝîR&óuÓÇ£- »—œXNNBÓj¥—_4™×ÐòË}»]ègçu•­&åĆ3³:… Ë1øÜòg<é áhdí\ZgªùÍ•(NÒƒŠSf˜¨yô“…>š“u©!B¦dûGd5ÑŸÀöìðý(ÀU¯”4Ç´Yè'H2¥¬½×:«4tIãôµâ&®½Sм«’-eTnã¦Ù(ÅßœD·-j ËFy SRþ‰·Dáa?¦¬‘÷Vk—©ƒ¶…L®©E¯ÛSg¾ë™A×üŠèÁPUÂÊη"6ñÚ“r;õM§Ÿ/žûÏZ‰qqY±'X_uBå0Ðåyô$ÉMŠS/-~Ȳ} ™µvé§ååg¡‘Í“)Ì_‚ƒ…kâŽ~ƒž,ÌPX_¾Üæxä-X~Šhô¯éàëÙõê—í&{S6Ô FÊ(õè(9ŠE¦qÂj:˜ X&B’Ä2)ðïÅܰ`ZªwÄ4YH{‹Ê¿ýÍãn8å|dÇ8Vësêµ”T~ H³ÊÜ-’Ärúp&O=“ñð"囚*E·u¸ŸÄ?q|B©b¾"Usë XRØ›O†¿OvGß ´§ 1_ŒKw˜u ½)7 ý•âÀ޲-¸ÚQ QG4ŒÜ‹ E ÛcˆÐuYõžÒ\Rã§ÞÚÒt¿õ@ËFP2ÈG™yOŠÏÝTªÝyPÎ+as.k¤‘¬)‹Ýòªdî‹ûÚÆò„)œ8ƒ´í|9Q›€ Å_Œ|Ý^§hüŒ­ ²ƒ3Ô>1Pž¸WY‚ GI¬bSˆ×’KèHÛÐcbœÆ#°qàe)OÊŸ¤¶wÉ…ÍW)ÿrN6Nr,$%)#²çcV)iY`Þ(ÔL¹/d³4VÏàçÄE) Lö;5 |Y˜Ã‡uøpŒÄb+ix¦#J=‡ZÛ[‹p¢vÙè¹ec ¼‰%=SÛ !y—-y+ß3‘·©}V«}»¦ür±¼­ÿ<0(ÞPÚ—€”BI…ðG\kìã‰_]¿ŸõiJNÒ[i7"­!i¤üé3œ>nÑõPÜ¥^PT>f,qdÄœÏ >j¸œ®A”5 0êfs€j§Ÿ} @+Rc÷ˆå}TÞûä e5W`9î£ð®ÌÀ$b©Ä}µÊ—Fkí½Àµ¥jWžF'ä_·Öv¶aQYùd+§ø|à¤C‚Xüš±ë/Y=%AƒÙ›wšš™Êc~¾ËP[ÑoÍ…C¢FÞŽ¡Œ§Ý!“Z¶wÃÁ@Új>:¸•>Eå3 7«Ry P~Є€tlÁ–ãV“I¿k\w³[ÛiÀ¥ººëïÈo˜Æ2ø$¤"áò¸bľ2«{s_ÿÕX]M¿Y÷ Jó´»Òî“D]¢Í®'æG¿5×w´¼(“J< 7ÔuY\DKýdVE ï…¤ibøäØ`u÷wö޾’u¬Gp÷‡—žW;&%ÁrÄ8D¤®ã˜ÕÐòÅQ ×avÓaÌ&5}”Ï?0´iS6‚§„Ã#ª íž÷¸ŒÇS‹76YfO Á\"|c §¨Âª9Jó2z ¸àOë79‰–éaŽBÞa3F¨#™¬³ï&„i¿4ºjwÍ”zùdkŒ7nkÉ*n×XЯ‡p÷aÛíU/ ¦ç¨qM¸1¹WÓï*¢.ÄGÜ]¤±i•!ÂEvŠ‚äÄ-B ðs‰ÕÊ à@Þ;ï(9­iC! -ý:x»™æâæ†vM`‰ÞÒúþÊÆ{Œü£‘«¨˜ž¢RUd|â8QhìãýL“áy‚Í•„ðWðXÐe>‰O)k±w|ÝVöqÁªsn¿Ð‰3µv|kü îµ ›Ü×Ê úØùÚž …÷™-±Îôf–W¢ ~v6n$xWdž1C‘ù4õDã уLJ ËC @<Ž-Ù›SƒT>6ðÔ—8~FnÁ1Ý£S3è}±Yzoê(BñË£8•ñû¯†óì–•·²[®JâïPi~A6œÆájiWbÇépϳt:.Xü}o='r³Žh—}ùØ"ºX?ï8/fD ÀÞ¸ÂDþ¸ÄÝ«u.–AöŒÐ/Á•8—ƒ(  ¤^ÿl§IEøf»`¼.KÿXOï·ñsG‰OÅ å¥râm¬W×èWÙj~wÅv/ÜÁqUðn*[t˜25Û»*xT¨õTñÊ.þñm»Ûx¶b6p[…£sù¡›M¤¾Í¢F“-õÛ/0ÚXÔ{è`(î¾ÎÔfÅÌ=0âRŽ&°ÿeVˆçz¹½91&2860cØœŠii„¡»kªÞU$dmë »)œ×Ÿy†u"]¾ˆ»°k×B¨`,Õxßy[¼8grB3Ž[ê^lù*ÄPÀ|àbÔ4ÍHPÖ§B·tñ­<L?ƒ¾É©ê8OY€H¤éMÌÓüa*H<’ðFà´TY„`b¬<îã´ižS¸¶ù•ã€z¦¿ró'Ë…Ï´¢Ú} “q áF R…÷Å{ŸÁü~K¿ó€]€kåû:ÛsZ‡ÎÅØÙ@K‚L[)Ô_îÉ-­½s! 1þŽ—æK :¶Xñ’:®¤XEy2ˆm$¦ìŠPÀ*äÝHzàüüí:HmYǃ·Ml?]Ê^#U_ »¶À3]jf50»:³/˜ÐzòQƒ ïD%¹\Ó¼xi á30åʚ鵡­¥¾'T› }aO¹J> ¬ÚŒ·—Dtx»ˆ§r»úó† ãGcò@ üMbŽ »X¶ð.5Q°aýê>¾š×”zäAÝ­¥µØj2G¸©¸Š¹`Ív©átã j¡Û÷]»D9²Ä:zÁê:õz¨‘>(!Åq>_â÷Ëj›÷bì JÁæ‡ä[nÒÜðRWIïO˜Q ¿Îè))Io÷í‘ZáaÇûbœÊï sMG3sÑÊoÞcÏ3À…3pvx~ý€½“÷Müûñ{]ÒÖΔ+øOÄLÆè1©‘)‰g‰d¥åL>WjZŠ`nxsJtëØ›îÕ@‚üöªØ#Z*fcæësd—ÏÉÆxg#þyû×ñöl»VT{¯©e ZîF…ýÝÖšr-Ôóbž{Ÿ»²+½Òð-Š „‡YTnæ‹Vñl/ß§w}N¼µì£%“ègE_ÏÏçý¿g_3ªgÁ2ŒàŠR£vE%êL|Î5Õ^/$+RZ+u\Ä6é?fM²ˆï´_µï˜A’ŒEjt„Û—óŸÕ^£ïÎþRE{#T¼‘¸µ5ž«ÝDÃëM’h'¡¹Ð"ТêòL¸û¾:Jo½Ýz(«ÑGZ•“t䇄 ¶prá×ag÷^2€„’!;éC–l£tO燫úî²ù:Ú x¤_ÑÛރϼŒ¥‚í4ÚÞ•ÜíW¨Ä O­ƒGÙvA´T8-ˆ~uù“°|ŒÕ,k%§ø†iÌ}å h¡â\ŸT0_‘O~›JÌ,½9s6—Çô˜tÁÓóëLM@L9Š—)*|œ‰ßƒ˜#ÉúB›j—ŸŽæ‰òCc5yìW!uôñ8Ì‘mî8¦Øüz1+xGC{Ël T<–Æå— Þ¾ (QÒ„­æ‹Æzsþ¤{b®#g¶«:lõV4½¥Ü¢øOˆOoüX¼üÏø9 XêjéŽ ´:¦]ŒC¿%ã98½œ„×;òg±S4Ù¿òZÎ[qwÔh9GH\ ÷³i©òpŠˆµFêÇǺö`Þ@hU69|„& {éw\ØöÖXkmp(Ê]?ÿÁzù‘£+ÊØyøA˜’óE_ž8Eµ~Äš"ß©p¡l‰…ùÔ~[¥Ý§ÏÑ8%&tê»LÐ>m•×t<Íúû×ÈÓðrý+[®0‡~.i;bŒøéy§œõÄyd›c^í~]ó6G–¬œú"ØRÙ‡|ãf¾ÇÀjëö0Ö›ŸãK ã¬$Êçh4 µ‰™éÂxR·øPa·½¡Æ³NZ©£ €)<‹hbÞ*¤±j‹Ô“,)&€Îüƒ‹]Ö®­À<ÍÛzÊèoN¯rìÞêïnË0[¢à¢a§Œã¬ õö¡¾>`(cw(žHºl’Ýìþ†¬¢³ uF«£îžæMBxÛÉþÔðƒXª8¿àeu.€^ñw7놚|r"_¼ ÂRUwÆäÞcâëánÄÔPxÀÏ{àÝ"é®ðœµâ„µ¼–›£TKÀ‰ôuu_¼£ô`ÉÁÙ¼ "ÿÜ ÇËÄ$LeÇEÆÏè—Ë Ý$+Ã{ô1FE!JË%5IxG…~M¾w«lš²¼F»õÖAcs óqÑ!æè\(©Å²xUè á3Æã)Sl±ÉýÒ\8âÅ ªìÀì=8YKÝîE•†&œ#Ñ2Ùõ¡û‰Ù¾¶M­X˜ÍU1Ñää•ï pŠg-S2+9ºä»±ö·ï~Ì™Úö¾½æ#1³¢¥³ŒRÍH›WD-Õ­â­‡è?ÍUßœ~œ|™_—«£ œœªÜê®ÙJ¶te¶…hŽ«‘â+å–2åóý®~Œì0‰Ì ˜¬·H‹—ý>l$Í‚T»¿0§Šà’{Ñü]`|Iüwº[å|<3å»ÇP0¤‡YœŒ ‘(A¦Ê2ã»jä÷4P{ûf_Lmq¥Œþ¶Ž{Ð]`sÈî…Á±Ã¿\dd ›%ÃJ0XæÒüQ«ÇB ¤ ’’\쥶°Oùù œ×ˆÿ+hHM®oöùº«‘â½i¥µ;šúW¹Xb?GÚ |:úûs÷ aæE!GÔZjleÂf©Ð¸ð\_ð1ü¢×q•ç³F–pTpõ‰$³HòDÆy”à:2ZqÐ&¦m ©8LНp8hÅé¾ÀÒ³%®ÅÎ{—ìÇc®b`¡K‰)yÓöÉåNׂ:u\Ù¦óµ¹¢X3B†{›Ç™/ä9£ñ7ÛŠ@ý=o»†ÈŸÙjKYsC?XJ…-Ì?ò¶„ +:•‰Öt:îлš¡úXϤõj’Ä#D>׋úÂT†c9+áÐYy”ÚH3ínåTåÒSZR09P–é,íŠÄaKBgI‚ÐôÞÆà_7¬z9Ì‘. áFB¨+¬Ó«OÿDì H\$‘*™ÓÒ.J¡õîºFEþFõ6ï¼ š£¶U3ÿP˜W.Üû%[ìðeÞó8é#kʽˆ“ïžÂÓçhŠxDÕ_—,Gs}ãºí_T É{©H‡½Ln"]@èîww²C\wø çêñZ©ONç(vV-hP¦˜Ù&jóÞ}»M_‹Àí+!ç’PÞ‹\½¿à˜á”bÑvä†Q^Y_ø:÷ÅWÓqTÃ2Öú—H*ÁŽ9'9‚B€c4°«½,#àx'¡>Џ–t¸\eJ„²îfÙ2àÅ}^¹%za)%#?ágÃa*í Z‘A>h((Ø÷‰¶–†sý·©Îl€g2-'D²ù×ÿ‚¼DÊgü`ûÕSKN#’O~>Ÿ¦Ì´\k_ù&yD‰—L.ÝiàÖ5³Sæ%€df\UЧ]òñ þ;š»ʽ\°Ÿà òýsýQhà|Ä“Ïr~¥ZÍ«ìS Ö¬ë*¤y²ŸúÄœ͈… Iü¶ÑÒÆ”WOV¤S˜r_R5F#Vìl¤ ©Pƒãén@¬ó¦‰¡iË7*V•†(FLäþz”ÅüW‘zãûú_¿Àá\Mžþåî¤ÐOr*#wö)&!½ÉölÓš$f%Ϊý¥½}XÒM ™Ò·çd~üåMŸVˆ®%¹–•ÅÌ´ÕžµœO8뱎^ÎÇ5PÐ}$´cÛô €Ç§rE¬íDgÆQvîIïnI±wÎö 0ÈónUËÏ- Ü«Œuƒ5OD‹Í¤š=i1§¿ B¸«÷4.T™0t$²ˆJk¦[Ô8×Y‘ƒ7r»Ý!I»zMy]Ó`QÐÞ’í2ÌòD"ŽŒøÔö 5âîwÈJ÷ ×P}®k¦˜»nÅ8ÚÙ­&>•' w—N6+…Sq‰b.oª~ù|'žhùfÐ¥;õdìÀV$¸MlrãKzzɧ4ì\À‘ÍÊÜasˆå}cèE\¬¢£lǺegšò6˜ûÞÈŒnŠ7 ´¤®ÄqKËm8G¾&ézßÍ™åÊr!Ãõ¾‚EØSc,ÍrqspnZ¹Y±ËøCÙÆŠ4•Ë:yÂ&´ëvs2(ÓR7Ê`éUÝK¦LAç-Šz¨Æ$ù1ë ÿµSk!LÚË¡^¥3B ÛX¤Fá¢bÇÈfàMkï…©i Õá…®z–¸,ÎdÀz¨_ªÿp…ÞñýÅÅóÔ§]C^Á½PÂ=¬rr«ËçÜ‹áêô÷¸‹ZcÍk[„ü‘ÃSC±ö<¢>àï_Z,2~rX)çZJ2ÞáKJwëA抶qÓÇèWÀ|6×°¼ÕIdÅ?¾¸Æ»à=´â8NGî«êIk:ûÂÜÆb£µ¹V)®ö›.@)OÑ=¡ à>˜ ïU¨;²ÚÏ\zÈÕyÓ!•Èeÿ\C=K­fÒ‰šä”cÀpždܯCBöÞÂc섯MÇî¡þ¢ùØÿñÛÅMÊ—SyeÁ=Öž§¦© Ef¤M¾`= f³ä=tptd»¼¨| ˆWÁ'·+ïvbÔ&B½ØoôO»ç7ïñÛL]9[·Y™°''=³àNˆ9Œ`ú¸¥kÂ(Çu·±’\½PF¦OáÏòO繆Vz qŒdŽw.{• 0eq†Þ‡“1˜Xñ€~5n³eÖÈiîíòšg½³Ny×m¹âR-3GS¤Š/åÐýVô6°{ÎÞξá{s\Å Ù6K>]ŒHO;žB|’Á9#&êc]ÄwÔAžTeÑ•¥˜´ÌxL*Ô Ð¾u4ƒ$@ùüÒƒ©mÁ¬LÉàðð$·«ÖÃ_±…žÔ½m÷œ¸ÇM£=pÛ§5= ¼NÇÿ5øòó™Uªaô&ŽQõò—öüiRÖ˜ŒQ÷›Ýå:D•ì{×X§ •ÏUÕ !ðg|€j¬²ðõ“¬+±EI¼9?ò™íÚêºù¾Ýù”dZñ’øÍ™WrÇ,š¡I«£8¥Š†Y¼˜°#”bí. àÉ´¢½™ëó$Xw},RÌÑ€A¤+ø­êW§Ù˜#öù…©2.hþ±Oñ2Øœ“ëN<ÂóW……ÃõrþÈ×Ò6 ÈüFýa·eç^ÐÍéúô3²ÑÕB×Í#ðDŽºìÖnßýÅû|¤¾Eq©$uoEM/x6÷v¹Î[3T_RÜ›fvÈúÓ<ÏK~mkg[Ó|ÜÝn“SÙ}7¢ÖsWÿ:—ÀùF7jÅ„´úsþº8þ£ Ðâe¦A,ð¸hS= ‹B=Gdƒà”LìvÂ~3|´bt¦ÏÏ`4å^ëa…™òÙx „¹@bPÙÙîHóúC@¶z£¦£Ý(y’Šw8Rg‰1M7/^5”±¼g¹(±€<\éù^G_ Ãø½§ä˜6Y¨ìÈ;&nXƒ‡ÓÖ­µv¬Ï<´_îpÃÀ7ìŒGIiRð«íw„vÛ~D´·§SM¥èZO?mGÀ+ºë6,k¢GÈ›5q2qXà)^5üC†,Œ†“XŠoðëüvâ$ê:/JïãHÉŽÓon—ºC‡í Ü@qås>^‡–qJçÛ"EÉ…_Å!b#[ó\¡f¿nZ´ì ÎnóßÔí NŠ&î;²@»Í¸ï…¯X¯{å°0«P/yÔE­YÙ 0¼·²Áp’¿ÏUo"îóuå/5¾'Š´ù`™ûX<Óe¸ZQM᪦£§gZ ª«±8¥ÈÓ@Ôw„Z<ùS]ÌûJŽ"b ¹cJI&!‘¢ Ízt®aþE‘¹óUé°ß?vˆLsŸLQ‚’·ÿ M‡é$ ËCÙ—¥EO]•Uø~ ¾q![ -–ËÙaz¼%l“þäº9S¡oH±Vغ!×døFybÚ”¸n/HÓ ½6êÿÙ´ ~:gìWçð÷Kz‡Û¾Ø\£¨Œn÷ióŽÙõöBš]­[ÙLm ~_¢pK-R6 4&å•öãfK‡ÕlzV˜.4^Óø¯·U¦œraR,i>ÏŠ¢»ÈÝűŽov¦Ó)ßZ¦å-íXp¤â{§/€âš›ˆÞ™Û…ãÆúm~׊ⶇ'#-Ì͈¬æsê*=ÒESò|,ËôÂ%)¼[Xé[fޙɊkׯÉMãòf&[(—L#zú /j˜AÝr=ehËægÃ*NÏw£*T”6­‘iðžÖwmuǪbŠf˜ŽÛªYzxØ.7¦~$4®ZÍðÛ¨o:‚ }zBF™M<˜YrÔG–ø»>UNæÄÍ@sjÕkŒ^ÁWì|a=@°qüÖßÁxÞ+^k³Í€a°âxÕ(ѵZìy5.ô¥wñ™æ[иë "âѱ{ŒTÕÉí An˜«B ý_1Vz&÷¨¨£ÚŒóDènfªAcc|Ç¿“‹ß lÉ4†VB}~ݼÞáƒ"ñeº=;Ÿ¾‰ ÊÖ8ë¦J˜ýÁÓÎg¯Õ ÕÔœ¡Ö±uÖ†h,™båNüÁÚ_ǾUÑ‚';yÅØŽâ{«Íþã÷”€”Œ…¸(>Žãp†EÎ9·>[vS¨w™ nûbONïžwU$²ºÔ=®rÞmŸ¤qûDzm ÆóC?(÷Œm/N3±‡QsMàß™þlê~…|ÀöSïÅÍF‰ŸM) *#Ó·"ÀàG{»E…á|·þ ¾Ìjy1VïOAÕPŠRú¯™|F°”º ˜99PwaPS£,7vݹGÊ’êÞ"YŽ¡pKoGVi|üL;%HJå^îIôbDT®²z› ÑôÖŸœ'Ô6‹J¶Êàÿ×P¬ó endstream endobj 112 0 obj << /Type /FontDescriptor /FontName /JJWGIL+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/B/C/F/H/M/N/R/S/T/W/a/b/c/comma/d/e/h/i/l/m/n/o/one/r/s/t/three/two/u/v/zero) /FontFile 111 0 R >> endobj 113 0 obj << /Length1 1605 /Length2 8632 /Length3 0 /Length 9670 /Filter /FlateDecode >> stream xÚ¶T”ß-LƒtIÇPÒ0”„tw·’ÃCÌÐÝ’‚t£4ÒH7Hw‡J#]rÑ_ÿ¿o­{׬5óî'öy÷9û9khÔµØ%,`æ`YÔ…‹(RÑäâ<@ 7:ƒ6ÄÅügAìä A…þU å6syŒI›¹<Ö©À EW;€ë¹¿àÿ*„9 ¤ÍÜ €" vFg‚9x:A¬¬]—ùëÀbp ò³ýnH؃ 3(@ÅÌÅlÿ¸"ÈÌ AÀ.žÿ¡`¶vqqâätwwç0³wæ€9Y‰2³Ü!.ÖM°3ØÉ lø% jfþC:@ÛâüG\ féânæ<ì 0Ôù±Ãjv<.ÐRP¨9€¡+ÿQÀøso\\ÓýÙý‹ýÝlÁìÌ ž¨Àb¨É*s¸x¸°Ì ¿ Íìœaýfnf;3óÇ‚ßon•И= üSž3È âàâÌá ±û%‘óÍã.Ë@-¤`öö`¨‹3ú¯÷“†8AÛîÉùÇÉÚBaîPï?%jaùK„…«§âè Vþ³ä1„þOÌ ìàü‚|°#ì²æüE¯íéþäú~TàëísX>ŠûB,Á?èÞÎfn`€‹“+Ø×û߉ÿ"t..€ä0[A èÿ°?†Á–àÇÃw‚x^½Çþúüýdôh/ ÔÎóŸòßçË©-­§%gÀú‡â¿s’’0€7;€›äåðó |ÿËò·þ¿´ÿŽª›Aþ|7à?„ PK@ð {÷— ·?]ÁôçÄ0þ»‚*ìÑÊ`Ó?Îä‚¿¸þŸýÿ»åÿÏö¿XþoÎÿß’uµ³ûfúÿÿ¤Íì!vž<:ÙÕåq*T`³ýßR=𓬶€¸ÚÿoVÁÅìq:$ Vvo#ÄYâ¶P‡¸€¬ÿ°Ð_§ðHo‚ÕaÎ_w € üŸÜã¼lïçdzú?ŽÓ—”‚`¿æŽ›ï9ÀÌÉÉÌøh/n>>€7×ã€Z€=~;ÀÉ…¹<¶åù,aNè¿Nô9€SâWè7âçpªüƒœj#A§ù?è1úq=ú•ü/Èà´ú|\ò/øÀió/øHl÷/øÈlÿä8¡ÿ‚ÜN‡ÁGfçÁGf—ÁG9®¿áö äêäôx—üvõã†þ…_\`°„>?½±© ùtU%Aîξ=*2ɰ­—ÊÌî=ïÔêzƒšÌü!3hÕéB"y° wiS†é\|úÞ{¯©5¼ùFË­ÏI‚æøv úÜ¢¾±Â=‰½”O(صÅw|î}tm›àÛr]°Õó ®Ü{ä<>ö–.~›ÙÖØùð\ ã®t‚=Fçõ«À¢)†<ó¬iZvJ4ücœ©ó‹Iüœ±jÅVtßýžwÞ†kܱ×Ó^ËåÚÜΤô¤†$”ˆçøŸÇŸyK~{«H<ë]ü>·‘c˜;ÿ^1Ëh?}N‘†Éx; ÛÛfT©Uzÿb-ê™8¬uxç2ÀíØKö“T-ZôŽ^¨œG§H³½,i„€kxÑîs5íz 8^”N1Àú l[iŠŠ}ê”BˆÎ$¤k˜]ïËæê¡5WØÙvl•/ÓéÔ-P'i€g€½»ª>)–,·Ÿ‹‹¼¨žÆß†³œÑ¹“"jm‚öãS )~Ì lû á«×3²Ú*·cºïŠUäÖé¶fÇ= åZ“@'¯i´«ô×S.}­l³äñ‰÷±ˆν+î9%¼#®D¯Â4C® ßv=ÛÔ›Þ=ç üvÁâ±a=ñi•7¼ŽRÁý­ÖP¢p¶´À̱.ñ7·ôþñÊ{*Ž»Ð;Ø—å#Ùîz¶»ÕÝþf½¶×Á'lÚ§©ÍûÑLW8†´-QÈŸßà1YÜP(h ‰ 3—ÎÜüd ¡èÐzýæ2 –5ÇÊltAóöð±½\@³?ÅäúG²ò. 8T‚^2ÊW2Vû?&j¿f Eª;}hoUýáSfßႇŒV\ZÒY‡o>½U¼¸e“*t;cÃì=  ‰Í +“VÇðɸs”^a÷z W§’“0áÓÕŽÕWªVõýg0ç±èF¿ÀQ"^%FÔˆËÓv§ ¯ú0îß½IðŽ’¸ŠºÆq›gÄ$Äï¿Ã÷oDá¦)’­’ Ƕ֊<áEÏ=™s‡ÏRÉc§s©v†›ËXX…GGå;“dMK¯ àޱ{{'k4&mÚSàP¸ÇËaËø¯a µ~ËB÷!ê0^zz.ëe¢àž;4g ~»³à_qÇ œ§÷A¶Õ(L¡j쬗üú9Þxô¨³;ÍX’< ¾‹ ÊÐ-Buž›$ÁëóÊÞuQfË¢·P#_‹ñ¸HÉ…dŸ­Ðž¤y›I¯]\)$TC´|Ÿn…ú—ä“·à{ ¤˜1Œ•›(U™ÌóH ™!H¿È4Ú4Žé‰ µÍÕùè#rV˜3‰ë_võò:¢Ak%ÅÞÈÊño ú¼oJA‰Çýþ…útOƉ¸‹|(2ÙÅ#BÛNñìl~K‡W*Ò‡hØc2Ô/lƒpJ«Ù Gí÷¤ä¹ÄÉeÕD10Nµª'€o‡ê5g07Lf;£¦å$Z/±q Þ ¶$»éhw­ôoºÐüð™µ`Eea¿ŸÄÑ·öä+óñ0¼Ã³N? _á·aSó˜ o8_JÕvh\hSêÖÐHöe<ÕWÐyçàG\Œ8“ÜYrß7Ñ k¹pX#WÙ tKº…–.õMïë…‡[|r$ªEfŸz]¾@¼ãêÒŸQî?üf(€*ôu±Båá‡.YÛ˜—š”|3 òåß^ùÄÀ®Q/wi»û¶Yòû‚õ2JÃÒaÚieBä¾ Ÿ.iO¥lÙ^¡ðÏvO±ç½ÿÙø³NÍ2C’¹Qg\ÊRF€ã#–‚Ð{e£_nêýahÒ·'u’Õ—Q#¡’š¤tÖ-Ë(xØ»íJ&«áçí*gó>:ÒQ+ieÓÑ,#,½óÇêömÙUNT»O×£Æ8õ‡´IŸò·j†Hrºbº_és^úé éFWšƒ/­¥!»?j;ÛÁ™ÔÚ/Š_~+àj£šÞ”PhSzG ÁuRu‹´dÞ¢{Ž8<Ñ\?ªëûéW0üy ñµà#9Ê«¢†’lì ‡ÑÝòE>¾²*+/Dþø@+9ùŠˆ1)¦ÀØùÉÛ…ÚPöAÅ—óÒó¸h‘ŸMÙ®Mú£"š°Ó)Ó"Ô¯+Y•º×ÓdïLé 8E½êÍùç³ïm¾*¢°EÒC¶aßxoÇ7»Ú8&?s2‹ëU0ªê”m†2¼Š:]H eŠÈ0—²0«§Ì¿,°±«e™ÑZ†;½îwÿ”iH”h§¡7åÉrfdÀqCn¹2”ýLO”o_µÂü¤l”¬–ýÒš3'â×쉆d§ÕÏLUûâç«$ÊñX÷¹$ °ï1ý$úÜ‚á8{ÇTRi$FÆœ$Z=ê‚c›Ó"tX’Μ0õ4hk¿°îZŸ²•‹SøªÕ£~GÿA*=§Qå0\_y“¶C´$u9‘Sòy UÅÏÄ`<ȱ0©•ú#^iµ1oÖo3ÍM)£õ5"‰§ÆK ‰ò(ìÐbœçöÌ9"<ž}Ý]àÞvùdƒðC£Hkæà ö„aôH±Zjª{ù‡‚¯rG\¤Ö˶Šk¥ôÕooŠy™”{(“v+¢Sr8ŠÊi‰ù9v)6ºcÍ5`…[6¡NU~ÿîEÝTï8ËIñ¡3N˪8Õ60[$‰ˆúæº4ê €Øà˜ðµ&Ð÷å2Æd…ÿ‡õWMµî࢞äSwžqíÜuun9¤Iÿá…¯ÔjŽçÁÉóK¦¡W/°ÇÓíÈ2Óøß=7áVÑ#~¦äOïóe–‘½ed¾ôP.S³æ"€÷äBcã€ÌºÕÐÎÔ,\ÝF¦±‡>ì:‹ÐéVøÂWú²IÇ~Ÿ{«øÒí5çuÂKý”¨°ïi noÒðÙóë¾rt0z#òÊJ=³°<©áÄ“y¿—øI= f„ØË6«v†/o£i#ü0£ìF+¼” RG…n‹@­G2(Û)"½žè>p†j¤¬k•Ÿ·X¤Àùé&tÙ¢®¾©H‚K‚Öë%‚©øÙwøw4¤jc2ƒ1~fTí®UÓü’<·»!œúçâZZ,qU]’àh»´/Aþ”ëÎvõ€ípßDGYÊã8ŠxÍ9þÖƒàÈd )‰Û¢N¸ú ü ƒ%â”럞۸S–dºÓd(k\EèˆAùó ëT9z øÞ@t‹izñtÚX!–^µ8àwEðBñ›† ®NÕ, rÛµ²Ý0ý´»æ O±¬µâáù6•Ò;BR7öÍã àwì䨈 )bbµº˜1ver/i³F¤^Ðwøç£”º ï3ÕiL¼ÃGOœà«[Ñ.;í°»nÜèË`“‹é™¶ îdÑÏ÷ÁÇ øÏ?fel#ày†ž·d=ûHú6I7į|t¢ÃÀb‰TU>©!à‰Vª›(ÓX…!C>+ERçv×ËÞöahéxöm¨—\}Ž2ÆIÔØ@‰ìÒ½ªØnÿ #HŒÒ±þå´Ö5È]ûň—͈~D=ÄŠEŽˆú0øiÃ7ht3J¤ùÓqªm…N­¸aC 5R?>$ ·™»9ñ öƒCKCƒCÝRyÚ”iFÕ|ÅžÒ¸Òæz£$þibEP¥gr'ýðÅ“™žçÆûæDÛàoúUÅž‚×t™ðãßì#QÈkÊe”À&5E¹Rå€îöLpþŒ’K+±x°,Ø·®t3üÎw.Jݬˆ)×}̲ÌBÈT·o³Åç£p=ªB’R{ÝmG(¿Öà<-YÅO* O!UVÔ£œ!¢IÔŠöL§ k>ÍN÷l “ÒjQé¨n>ÿ*²€ý YQž0…p`\˜LNM‡×Æ¢âÓG AiŠíWêëΆ2ž ¡õú”Õ<þ”Kn«²ÒÞ Í¾j;Ç·dÍÔ=ç¯BĦ§f§Ö¼aëT?Ñ„š–ìß=™K ýâº[‰Eã`"–Ý rÓ`{2âg YÉ¥~×/ü>b†€˜rØèDÇ'íLT²"÷@K&Ø}5Hd™ÞæaEçèù3`K¹;Ï.ÅÆ4ψ’[ßC»ýsË¥Ý]'üƒ¡(ä‚hˆIU„iÞ=Óî5×ä™Ù{ƒ÷Á®êr?¾ÝdåxzŸÎkžÛ·ž"«g­qyÓwn†odÔQš#­ÖáH¾ãX¾þ~ª?νQÉé(Xo[»V³&g²p¯fÓ…•I7˜1žntbjaEÏT3‹ÇQ¤ÄêšÖTý0™d(£ë,d……ûTÖ¿û|Âà×v²4×+޲m=ôF,Fíc©7r$ M]~X–“Êí!²+Hâ×hb³ªè†ß¡GªSãá2ÍÖݧÞ:Ò,sÂcntk(Ÿ~F¶˜•nd‹•¿RG^JôXD ÔA F®ãÕÆªÀa¦Àeí1N|t%hëžì)ÀŸ²ÑMG)k®q¾/ G·IàX®; ¹™ÁpèΈóXÝð(ÓŠ±wǵ9(Þ|æÏ6k]WKêõl¨52¼‚ *ã±­áÖ—`âŒØK¨t=©ž ìEºÓ°Å ÅôTN¼Û‘ˆÍi¾Pt;gÜIw|œ 7™öhŠÕòâìÛ¢wïM‘‰)"4XǶ“ƒëÛ»ÊOKñÛ°Ž¡þšXÓ®[©ürZGçÅy©ús®'›MQ¤n_׆x“P©Ûh]•˜P¡ÖÞ`Üóts…|Ó£<)ÚÑ€üÍ«Ѭ·øä›#Z§¥|ŒÅD£Ç逮Zê¬tÝtž%hê¤mÕÈ š•é™sÙá¨õ9ƒ²š†K<©¦ÆEê"´®‰"«p͕ E÷•f’ ]ƒßÝ÷Þh4„=µãƒ É’nC²æØtãþ³Ž—¦«*É…„ ØÑ&T0•6Uq_âj½ã€ fßÊ-[6³ù ³IÆsR’×5mÐaûhÂèæ–Á‡ï›»tèö+¤TçKÖ Èæwií¶Z{[^ pœ"o[ŒÍœ¼ê M±ßRÝ?Ï-{ž@1•:êYí 2éJêc¥ø(r©YwjOü)g ·æ4‘+j\Qn^<雓m‘ ‹Sp¾ß=p-¯À+#ZA‡õfÔ¥ˆ–UÝV³ í\<á%…HTáãÄmíR E¯ð”|#~äͲ†x\~¸„¢7{½òÍÞŒËW{¹UûCvhfºI¹‹·^X, ŽôÛr¯ü¨˜ i¢N ˆ¸ÁšÓ+ý´/rõŒ4/ÝïéÚ‡´‘ÁmiÓZG wËb‡·­²¥‹×¥tLŠ1⌈¾_ºD%©hLïN˜ Ú,Õ8aöïÝ"Oql"kk B_Àß³ßMÚ/VÔ#˜ð„LFJe|ÅöÜŽ£îÓ¢Ãox e ôºÀ²W(o3¦ÓK•ÇTóã&ßN6œšµK×Vèn„?½1©3÷…AV?§ä…鋚ˆŒ†+Sûõb7r3‡´­‹þ"Œêª`²øæ\Izýƒèx¿]d:ts­‰ÃËhYŽ«å×ϸ@batÄ4QK’"(Õg?û6æˆïgÃ…†å 7µÒŽI{(w*¥SûŠæ¸£é•ÆÚ“u˜Ý6–?¾€W èÏ‹Z¹•éFpù vI¥5ì“‘#ÙYC_)ƒ<òn‰åÛÈØ+ºH¢˜ ë™vs^jè*·KØ×r~4»åž’Nt0}‹±u¸å.2›ª»œð è¯Hž…Up vãäL߸ùãøøØ—­Ô\ߌY[œ‰¯”^^^‚¦0´¥ðžE䦔½+ IØ«÷NÛŒ–ø„¢e¯÷q'%Àˆ6úÞIÆm~;‚bÁú$/³G»ÃNWQ¿¾Y0­•R1Ò/å†W2âÄq „5ÕÓ¶À’t`%èÀ/ûƒ#ÆÓ#G õ–׌sÅeϑ݉¶´ý‰ Ž’Ã;ˆYwé¤DT¤ÈÞkVÐtT@¾RÀS¹s俇Þa ú¹Ïµà Ý!äBgŠ?=18×Nej%Üh^>ž¾É®ÏQºj3 £/[ •œ±þé¹ñó‘‚i’kiê¥Bâ”Jpd­N3L£ A¶õ³êÁÑ——ü7ÖVð©wÇ5ZXÞF-Ië#ø¦‚õgÔÊâäet£!ûhf»Íù™ š"øv¤¼c`é,CЇ@QV*•Ãé]¢ íÁ=¢–"#Éû$½ªÔLqºñ¹„Ÿ†¡^ê„¥hHa9Û}FõµÁ.ÑFˆ–£˜36â.íƒwÍÞ!»^.+]£ Ê¥ýËYªcô鑈 †»0aM£"Kyñgűö©ž‹vê6$Þw‹?߸æ]ËL¹ž+ŒSÍÍ,<¥V û‰~v0šX†ÖB4ÒUáÃJËw¹þ¬No«e¢9hÌÇà]@¹Ä/™í%¢L™“–EZ@}`vXÍ÷ªdOU âôؾY ¯ú4K~!…5ªÃe Ù åûØËi`dD¨, eκ}å ô%|çÊÓÖÿèªÿdz¥Ò©“@'-ì×¼=±ZhcçË"ÆÕê<#ŽeɇâðUE®®m)}Z_õR[ ís®ÖÎ¥±ž—Ïx¿ù,±õD%‡m˜˜T/i²ƒ–Nm킉”Vßpò’-Ån…ðùü,¥gaì·pB’ŒwâL•Fï²cÚÛˆäõÆ×šÂ݉ ß}m%6‘'Sç–‘5,Çýºêb-ö>{øÒ‡¤wÄÆÒ£>T>®CÓÎGÜ^¹;ˆŒ‘y0ô3Ý›÷Ë ü)fÎ"!ˆt²àútäÕ*:3PâêÕpóúòá2ÞŸ»©ª4n ÎS7[LÏ(ˆ©˜v£t#ÑfP¡€]Ë…DUiNä4P¿ˆlþ—#{õÁ¤Q­9ì™{Ï{zƒ-Ï~R$&Ü­É¢Ö©f"™'SNÍo Gر6-ý“1r’w<Æ?âñV°h1 ’¡*v^°]x/ñUîˆ;Rˆ}+ u­ˆXŽÝŒù¬ i‚ÓŒ=?>ƒz5àÐ!×óD8êÔq#..òæŽ[ºtPªJ÷j> Wü qÑ'Œ³Z΂êGâ%±Ÿ‰p™{MFFr»3µEKäÚÁ­°‹0aC¬¡+ÁǸS8+ß3é9&=ÍËf©ÖÅé§ÑÒ-§Œ­P_o©Uí‡aÑK<É—×/l¹ŽP[µkÀʪ|.p™Ù… AÓ!.=í‰æbB8ôM’µª[C•¡É¤˜à·ÑqH!4«ç˜~…ãLpT´U*¤õ¼Â¬‡gz»|rØ~ìíñlG¾¿‰)Á$Â@Ún«øÈ“ânjý×ÖõÚ=ÕOŶ£ZæÓ•¬ è!w¶7ŸlÉôˆ3~Öî:ê ?a­écr›Äue!Ö‹, |M¥x{jßD&ˆ›céNõ½w•e¶›ýÁvæ«Y¥vØÇßbÙ툖Ö÷í»l “à »È?ÛÈ‹­÷ÑôKš?»¯ßœmàø F­¢â!íyÜÂû ÌÅö3¸™wige«so’›v切©=©µ’Û/xW[B—{%Þ½<µ/äõCÙ8h@¨°éoêpJ=€³vwJ `‹µ5ÏD ¿ö/ޤ˜çï«ÑH_BŽ\Óú¡¤’I¼3ÎÀþŠÎ–<§©dÙ·Fxÿ<ÀC’‘iÛá°˜mÌø‡ :‚S–ZEc¨Írý¤¾ž]­f~ƒº±õ-¢™&Íþ‡= „æá²¡mh%¨‘i `Øa6ü“Q˜ÈA.ÿ*¦³;ø{$0ÕA¢£‰A­ÇÏ vSýÜî„ÊåàB${hàæž×ˆ¸µ…X‹ÿ½CjPÒªìiL.³™.Ü9idθߓ7ºÌ‹BžmDðu6S•‘y’?Ÿ·ÑxË-BG›˜è‚?—cf}нâ“| Oj—¸…¬T™cæÜö2"ì{H©|f—¿mlDñÄÇCqÀI¾2éÞ±ËûY×£A/*.ŽæFT`¯RÇri|Z˜+ëé{]B7ó£4g¯_Jbµ8–Èä´m¡;m)±ÃëƒJGó6ʱóv©¼Ž›-A9ÔNYÔ)†ñk„Q÷ÓI?y¹Ÿc‘ÅýÜWÚýÓÁ¶¸Ÿ‰ä»J¸Ê…H8Êæ3ì3 +šPÚ)zD—šbšUNf8d8Þ×2—°Ñ«©’ºÆ]®­êr›ˆ9¸E‹N6¹—ÞãxIƒs11)çq±÷KYGàm¾a\HÍùà‰Tب·Øšër ¶@rß-£î¸‹L[•„[ˆíßNDBP-ò.N+Yw-áÌ,šË¿¤˜¼—Ü\Ï¿¼'âÒ]Ä&õ±dW¦©ÊsK»U„}7›ÿ 3x¥“gL_BÚvIï2úÄÚØÑc;Ï#©Åµzha âÀ¦dö·\åí8ážåò”4¥Ž2QîÚ”îÛÎÏ*íL:îá­5CF'*«}ß?AƒíáYC½äÑüÑ2­¹¤‚³„ §ò…½Už9qÓÞ3Û­“BÈá[ÇJC؇áØUÛ8 ªCÂQ£ ‘ráþÝE”ö‚¡X3Á¹ù‹³!'¢Œyl¬äˆÂâ­ruî¢ÂÌeûxTî}U²,"=¬I¦EÊ\*¤#¾xÏx ÆoiÃp~«;½ÁÏ$Æ‚§UTK,îo¤fÄÈÝ®H8µ'mg+0ÛÓz=k€!±GÆRí ;×±¯I,©%ÖVŒØ¤fo‹©ZÓìMÚMSÓOÏ4§ÊH×›H)…Q–È×> endobj 115 0 obj << /Length1 2495 /Length2 15858 /Length3 0 /Length 17309 /Filter /FlateDecode >> stream xÚŒ·eTØ.Š;wi,8»»»»5ÁÝÝÝ$xp× !8ww‡à$ävfΙ̹ïý¸‹µ ¿ªÚõ•îÝP“«¨3‰Z8š¤ܘX™YøâŠê ¬,vf6$jj k7;Ð µÈÅÕÚÑï_6â. S7°LÂÔ lªèès·°²X¹øX¹ùXXl,,¼ÿ5ttáH˜zX[™rŽ W$jqG'oëwVn`¦ÿ~КÓXyy¹ÿ:µ¹X››:Mݬ@ö`FsS;€º£¹5ÈÍû\Ð X¹¹9ñžžžÌ¦ö®ÌŽ.ï„èžÖnV5+ÈÅdø6@ÉÔôOrÌHÔ +k׿Uꎖnž¦. X`gmrprw°¹ÀüuY€²Èáoc…¿ ÿ)€•™õwÿ9ýÛ‘µÃ_‡MÍÍíL¼­Þ,­í@e)f7/7F€©ƒÅoCS;WGðySSk;S3°Á_Á›¤DU¦àÿ“¡«¹‹µ“›+³«µÝï,¿Ý€ -é`!îhorpsEúŸ„µ È\yoà?-¶upôtðýƒ-­,,§báîÔt°vvÉJüÇ ,Bú#{rp²°°ð€ r€¼Ì­€¿I4¼@)Y‹Áyøû:9:,Á©€ü­-Aà?H¾®¦ €›‹;Èß÷ߊÿEH¬¬ ks7€èµÒï`1Èòo žk/€> xY,¿þùdž3 G;ï?æ5¨«¥-¦ªÀðOÒÿ¨ÅĽ¾Ll,&6vv+7€‹— àÿ¿Žþ)ÁÓÿKªbjýŸðþåPÖÁÒÀûwàòý7ÿŒí¶‡ð¿ JŽà±hÿl '‹9øëÿó.üuäÿo~{ùØ‚ÿ;&)w;»¿,hÿkòÿ±0µ·¶óþ x°ÝÝÀK¢è^‡ÿÛTô÷n+‚,¬Ýíÿo­¬›)xYDÞž‰—™ƒëo±µ«”µÈBÅÚÍÜê¯áùo;À vÖ GWë߀‰õ¿MùGÞ@s[ð%ã nÚ_*xÁþ—UÒÁÜÑâ÷&²qrL]\L½‘XÀ£ÆÆÉ ðe¯¬Èë¯)™ÝÀGà ý–Ž.H¿[ËÅ Šþý¸@±?ˆÿƒx@‰?ˆ”üq³€R+(ý±€2;(ûùþ 0ŸâæSúƒÀ|Êÿ 0ŸÊfPûƒÀ ê¨ñ³ÕüƒÀìZ˜OçÄ ŽÅôëÌþ p~f.¦æ¶ ðóbéöGÎþüïñÿGÞüÄ vfîhîø%¿%ööÐâ_L úã8è¸~ëÝÁ{ôç¸*–Ž€c³´öø—ßjGw—›¼ûã¬÷ûÉýÛ¨ÕŸ°ÁÕ´òv²9üË,³þ—Ñö_œúŸ¹À9Úýî?zp¡ìÿ@ð%üã›ì˼ÿØÁ\îöf¿¯¥wÿŠ|ÿD öéø¯S¬¬àÌœþ¨ÁNà—ÒáZÉÁúéÿ6¼Ó@'ðíåø§5àª9Ù¹ÿ+ ðw óŸ Á%svwtY˜ý«9¬`é¿êÊ ÎäÎßäñï²²‚‰ÿ„¾OnV. uœ…›§ã¿€‹åþgÁÿzý]Í]þ] p?<þÁ¥òüÁ Ðë_Ìêý'oðQËß”ÿs%™»»€ çö×뾯þ‹ÿú¦yÌ‘–ÍùÃlÂ:Ö‰y2íO°÷qiÞ¿º“q ÅÛAî2C}U·-'â(¸ãIÏ“P³ªÑ‡V„†ŒH"’Œçö´åëb†ÇÄ Ç„’‰&Ž©áˆHòSïðÈYŽˆ´²¨QùhŽ÷1仲Œ]€*ÜÜH·‹MHd&²\OËôœrËÙ¬ê.L“ù…~1TÎÀ¹i$·†K3"Ýrn¾îñ¶G«.y‘nÈ/Œ%1ioKF~,+@§PR ºp«â~ޏM+•Z8g븓W6tòšœ£ã[@ɲA´ô >-±’ùžà“Ï]~:Ä5+C{ñs¦Çzæ› å>Ì¥X܈YªHñ%í˜ÉwÇ2á¢í­g÷¯vÉûR\ÉFÆMˆºOóiCn[hHÃArZ•‡ç FdXhe‰ÞYySý"âs?†)Úœ±#ùíìI) }žNÖvS¯´]šå¢y>óþC½ËÞªƒïˆÆIÅiV†ärŸ³é¦@RIvÃÑj‚—ÏT‚)袆SK‡s…¤W³rt êr4t루æ> ÖÓó ”YHÿv½^ˆ× Ño´Þ0B5Èæ™UH Â30«4oÍ—ô± -ÖŸ£ÑuB3yL&&YtˆÊWXæ1îã³—=7O™)qýh’ÏW!K¤j¡/ &q«PÑš™ñaáf°P½O4üÈ몼 2›ÈºB™èKÈ›iˆW£üšöÑyÑ{ÑÐFTø§ú£=Çpcq\ØX·brâ$žHcæÚ3âÞÉS fÂÊÄAœ›˘»² +³bžþ¼±£H;c1ØÊöC­ÝkS°Z·¹*h5²†'Ž‚éèæ_4³sÃÌÔøêÌsv®C TYÝÝ9h,/Ü䤕ctQw¥L˜û[>ï°ÜÙ9/:)Þq:ñ§h¦¹ô™ß7ÜîgÖÀ•ùBsâ#Ö´ž=A¥Òùôôh4U ÅÙÐ>úÂåf–À(¿Ïåv².HªpC í@ƒ³m%$¥SdF3üÙÛ¨¦k4ûÖfÓ«ó‡aƯ9%ñ8»}¢úb®eý!‹}­Œ]#wÄäÂõW$·Lœ,Ó t®¾k€Gúá4—³hè|²Ì'‹zÈøhmü.‚¸ñ™¹2H«ò¾ ¨ä}“õψ#9ÿÊ>F!Ç)‹~s,R8Ÿ§Zëj)¬¸XwXÔL\£êPw³ubr¶zðÅA‹ÍyYùëRW{'q®pËKE/'BiTœ+e–‹ °ÒÀ²Ëþ›U,š‹þø¬Åú¢ÃÓ›oQX7 M,ña¼ŒôçádDr*¦NA‚™+…øP®Ô:Œp–Ç©A§÷ªa×Ó÷¥„Ž­!=ÌW‡¶Ûj„ùð>‰½lÙ'¬çb㺷{ 1MJªoÒ€äUO 7G²¬oŽâÞyêA/«ˆª¶"‹f i±[vgW¥Rþ”âŽ/Û4•¥Ö÷Œ|ÓÛs­—†Æk.­Àª}KaTXFÏJybðF/DJÛí´Ñ}v½¢3@Àû²ùs°i;Kyísv™Av.SÑ ÂØ´îSfQzÂyl¨¨À¤ÁÇ%s£ÄL-Í„IfR ý/ñ[²*…W›´Eñ*ïÈ„Wž?í¬[ÉIqœ54iÁ8û£œfªÞaä)‰µò½_üåE:Múò«y߇îù¯¢X¡³¦ÀÜÖø˜xÆó6ƒá=gž>Íyí×ÊûÀ_0õ,®(7_¿ûÙ9uG¥à{+…¬fôæø`¤wyH ½Œ™ÛH‘ÑÇÖ²¤žôõCh ‚œZ’hY1©ÍJŸÇ%2êOÄ)>æ*Dà3¯ÖøòAT/ë–]Gᇓ"õ\­öq‡ ]„P±,½×<+‰GÓÎÚÏ>|ƒ€øšSÏâs|QuÓÅü ˜ÝsfïÓ>¹KÊSøYdôùãݹy 7Bi›2‚5l=Gf¼šŒK’ÁäÛ_”+áÔ®Œˆy׎R°Z;çé†K¯É];¤?úé³l>1d#\룗O$·[Þ ë`| #-Lµ\n„Ê9¦\ÊŽÓæzÏ>kô)¾à\±ÄZã0Æhˆ¯NAp”RÞ7)ÄÌÞDuC´·ýæBįýÃds”¿Å„°ULh6Ûâ¨;y¡YŠìÿlxöÜ þN#Õ±ýä‚l"M¡úZ%ç¡Ùí½4¸õ[¸1»j‡~ èÖÞ€Z·~æÈ4tD°ºg¨îÆhѽ”´æ±+žôžbØCîÝ»ÑÛM«-ÿ|í]¹üc’b~õIö‡¾ZøÖ ‹”HÿÙ*±=œ°¹ËÄC_tž½Ij ¯ë`6?FhRé³^º\™!¯òCMä/ÌÍ~zœTú&Ö¼ÏdÂvÌ8È›°3¾xXy2ó=éjhÈctñgSLywHöö¡{'h )2Æã•]ÐC ŒVKøDc^’¦¸¯±úVFÆÎ4f•Å=íRi·ëDI{#“IrðÒä¨+.å{•*Ùfåjlw!ü§y•½my ˆdùË1óëú¬@|›•*oŠvg–TuÌÝ3?B '¿#bãfçFÒfO†Êby·?zXv†úó:ÚbVPÒ¸2[Œ#:mv‚+Xo„p!Òµ‚H_f¸QœÚ/ÿ8 ,ÑB ýÓÕl‘™sCš,ä³îì1&Ó&ô©n`F«^†}‘ò™œÖ ì—¬(÷ÌÁæ#/f÷en$í1È(ý ¡¦áò I|¸R'gkÄ){¼6Á"*q±f9t0\Í›¥Ói¹éZ½„ÆùÞP.¤òìézè_Aw¯î²Bpmqm’Ävôæ&3u†£ ?¿AÕ# ’¯ÕfgúÏÉ I|®”!L=%ŒÅNße ãÿäï6Ü\óÁøï*ãA¨€âT@ë¤ëÉj¾ìkºA`ÑÉ}µÅÞÈ€@EÔ~e-ýо'Iéuˆ]´3bö ax]2û‡3ÈÏíg¼(Á@ªðôujaZÏ–=ܨõÜ×eˆö† åï/¸ªd]¦$/J“¹¿Ž|·f{:žˆ²àgèˆ1‹TÍ$eQ`˜#Øýœr9v…5ª#ÇF8N_‰Fâ– }×5Iîj\ä¿4‡­ Ò¼žSÇÏ1.„RõÑ ½åaÓìQÕ²ƒsßOQ{㇄x&p7«Äb¶gå(tøÌ4¡Œ¢ð½¸%¯º=g÷zuÉî#§ñ¤•%#«ãÝ„zfÃpwºïÕŸ†|+»»¶'»ùÑ÷Œz–aÕüé8š'åEJÊ3>:ùyÄ*Ù1·Ö@Ìz¼‚Õ—VjôSÿOÖNB™ÔÏa!—¨'&‰x²;Çâ »üá¡?ùÎ @ÅK/½F=ש V?utZaó}|¿ö~•U«Ã¼ÿ61~§õîõJ±£ÕFPo°ÙùŽ}¸$R;_sþLïî—œÆ)e¾R=†¿~)qÛ•ÓÆTÿOQ+<]ÐRkj)(OX!ñðq»†Ê¦RH·­ã×jòŠEòWñ«-!¬pL WãÊRªìäbÿáz°úÕl:õY†ÊUZQÖø³Þ5dè’ˆO‘šEw»åXaæU9Û°V×–ÿweï¥xu¾@—}óò­2a™×ìH&¬9¢¨Hö_˜|6»™¦Ï0º6ÉçûEÅ1ÒZîÁRK– 5Àht‹ñÀÑúmÆûÞwlìâÁìƒâ_:ñ³püÉ´Veæë´¬ï¢N ã­?»\aޝߴ¥Ü¼muìøén½2yTÛŠÍÍþ~³«rž+F÷{ ä~ ;;ˆ¶¿+‚´2…xËJ¿d±k½m#mBaá J×ü!Žù¶’É€Íbûjv§Ì3k‹Ž Î=y%”é‰@_Íø¥…Çk!ÿ¦áP¿#ùæWþŽu~am_6Ћ–)eS)YûÔ8¨¨ó2 ô‘êì%*QÈ•ÍcfT@ãå#Þ\“ÝË„xù‘xøún¥GõØ9ÀAö‹V‰àm"ûôz£š¶‰ƒö>ÁŠûóñ÷;ŠÓ]²•e$Ú­ ÉO–(‹›üµV›éº ã’„÷­ýµ„Œ6ÈvÕ³«sGîEû›ÎU¨øWG<Ú”Íè൷>E‹Dè»} èu®xo"Up˜·™EÄHz&Ù%ÝOH)Ù¶0UA&0û”ëÆ×C}í¯µôøÄó‹¡YLKÓ›³ÊÒß³5)a–&`¢Î1-xÛúLDÜô¶óQcZ{t㎠^¸3 !†ß·²w‡OÉÄbrañ0UözÝøƒÂ¦úTœ\9ó§ÈIúÜÌ©cFÚÕÊêÃc —ÏŽ‘ÞùÕd4z/”yÔ¬oÓÁkDnâX¯œRú2þŒT‡é!ç]^B€…«Ê;òôÇi]&¸Èýtdà/“Ý•‰Ç¬Ló‡ºaÑM ÄŒÊö¼> ¼_¾)æsK›;4MÌUk o^²vDAÀ²®ª…’g/kÎï«Y4ò² B”[@I8 ÉÂFlð×Òñ·¯xìO;Œ5íÝœ-çJír03Käm§©›'„uÓ3—’û ?!qŽD»N‰¤Þ‚$¯Ú2R7Ö\SÖjeL»®•tgöAaöhCMŽìRáOHùd¸7¯õDÛwî“üÕ¯D¿8(äƒ6y+¡èªrª¾¯ùD‰êvm!œ)ܦò|…—Êk ä!QZ“!FcÆy``„? ‘eQ0I¦2؈‘ËÞrV|ùB2xkFtT&i¤BõKŒy"·‹»é'ç{·„iWG™óøà¹L–ñŽ`ĉËï… ÀY #e‚€ú÷ä~àù•áöM­k -°ÔFœ8°÷Þ7I?y«H-a~sml… Ëy7û£E0êÖ -|ÃB7¯õÇ–Ò»‹é^2”•‘:ÄKø­cáªÉñzGílbO$(çÁ¬=©Øã"wvŸ~—¹KØ!x:PžcIêÅÈÕ¥èê%Qºì2ÁIþdh-OäÊ„Z8rv>ƒ`pwotúÁJu$¯/ÔGÿǵÄunjÖN£‘hÁàgÍoùào—•¡ªã‚yÄž—ªA›5L‡=XøÑðÝn&ÜÍ^–k>“ÏO©;/L¸–” ®LÖB×q*†I6ÌgE¨ê½Âq‡W‘9Rô‚ûC³´gäxSjNA« 2Ä豬u¹»¾uΆÒ(!!Æ× ÌÛ|ãAäÏHð×–ÅØœœˆHC¢>#%_ŸÞͯ£Þ¨ï!ñ¤DC]0°7ª¦pŒ¼3«÷…J¬T_¸bErœzÔBDùU.þ£jåz ZéaUâ€oØTsè‡Ô±ÒJ͓Ӊ=WMÚûqÍÇ ÃïÑÃmµqï“8N½ÓVøì§ø©Ü!;÷BQЧ&N»Yqù?©‰XwJ5Ýë¹ÎÞ} ›Ò–U±~17©xëãî_ýÙà%TvÀØ[>ÝŒñ!({òØÂfgg3xÇ‹*½FÏbwñŽý3,¿.rÀÚJ¦ÅCojÈu›Í‚ê(äjtvYÅŽ¹®l&švKTÞ4ü}Èòš–1Ïü˜´ö j™€jGj£^ÜT£¦åÆE•±‚vÎföûŽ:(o<µl)øõŠ!lÖÍù(¾WS=¶\‘å§ôº^«9òê·<{ Ûùt8GmôFGjÓšW»V¢.Qr~0_1Q|^ãÏ;àoÔåÔKb]–| 1¥òhƒ»Õ§i¨ŠÈiyùó¤úÇ(YLXÜ”ºž;Ù£,ˆÆ]¹ü”îjCD—¯ßÕWGÈîqÞp5Ü1ažñãÀ¡h6hËR5¦0t¿œA÷0A¤>ú©ý dãJÔ³5 Jû¸ ~KËmË!ÀCÈ'O¸…U—¦¡§é‡Áι$‘UfÜœh]",BïZ~=ë£V}‘Á›ÑK±#æÙÁ?‚Öý8uÃBW~fÄÕcPÿuAJÈ\ä’‚âBcE[¾ÿ`Jô`˜®ã#B&¥K òöÍnæÀ[%µÄàÈûÛ»òžsŸWí¯ŽÛÑŸ:\KfB“Ï3 ¸¸×„i*¾‚N6Ò3êóÓ¢pvf>+´373™u“U ÛÄ*Å”ÍÅ9n‡>ÏÅÚ[×ù©›+N#ˆÁÙmP^/hφì«(À×Âà]­ÆÚN8—¸ê—04d»¾«\ùú,¸C;ˆ{O6›~ôÊñè hdNRrƒ:ŠÁœºæ%Ú²«z’;Ð>Σâ@¢ißu`‹r„Ïuu'`ƒU~Và”ë[ä*ôuUiÊ[Ãåk{å&:SŒ–õV~*ÆÔfÈb’º[U‘Ʊžý¶nÌ‹ÓF¸Kq}‹óí(v‹µþ"ô–¸hòú”í´Ì‹QQ†&—0Þîdø {ú_™×ª.ÌÞ%“#ãaÊ÷îTsDfl ÌX0@µcO«Kæo™¬hd‚¯7è:d}ä6";ô4Ojµ~¡˜MfúbvòØÉ‹94  êÎ=}$nþÓÔ“‰†Þ‡¤…iÅ¡ |˜õŒ©ÇÄ¥‹!%-h›ˆ¯+² ŧq,{xyôüÝKs¾¯ºZÏ‚gH_ÖŽã’d+ÄPÛBQГ^æÏæ·ör7ï]ÚìO®‚ظ寲ô®¾1CêâYÆË%ɰ_¢E`»ï¦¾UQ Îù)È{ĈÍmƒ\³ÜÌÿÜõ–sT§óíûª8ƒ³+bL‚Ÿ• ?ÙÉqýOO‡]ú–Ù„Ï<l-ÕÛeb#`z’è 0 êˆÞ6ŸØïÛOüôŸ’›}3iqÒ妩6ÿhioÊ«“MãuÝiá|ý¸ß„:‰…Ù¹6e6pýlÈhýðs€TJúº‘ 8oŽ‹Ø’Ë¼êb±JØ@[-÷ÝÍHoê%‰'^Ɉ7…G‡æ²Ôª4 {òЧ'7…e³`iÚ°4NKÓ¾"Ø’3\Cå"4–róM¶KAñoýÕ´¦ƒ÷ {Ýc©”ÑALí1êà¶âbÇMià§ýEpí4p,½¥!sçá‰cvWàåý ó‡Y™‡D˜y\)þVH.ÆÑÜÖ픢ÆëŽE ÉiãYÉ瑾\øWE™dG|ªïÆ’Â¥y¶[£ ÃIR–ZŸW0ÈŸZò=‹Ò)1îCÖ¾ÆCL¥ n±du×[#çí €èQføD¶‡8·£óifqñÜš¿t»%HÁ5›‰‡ÔNÁÖnüÿ4%^ß>Ë ® íò㟅|ò]l¾–íkËSÒ&*'B)(nP9þíáy0›²ñð­sF>*”Ll¥·‚´—Íž‰ªàTô ÞG<>kÒM2ßê×%7¿iÆ´6ihhïÖØCií>&Y5¤ØËÏNÆú½ ›•~'kžW¨â‘òÍÂ)—S`(Ä㠴ߥ¤ÃqLî“‘Hú0'3ÖŠá(8ÏŽ¤ëPª!33'ruº*ìÙ•'b|v+Þq³©'Û’öVsŒ=‡áûx|I—^…!Œ%ÊI ªõ¸[ô–ñ7¯™´ceƒIÝC,"·UÍg†WÞb,,ª£x^ÚOë0‹ˆ™¾výZ ŽJV»¾Î¡ñ<¦EŒ‰;u!ºŸØ‹jåô™’¼Öß-ȺÊúÕeª>¯0E‡žT"I[‡Ëê'¤íÕ0e¸yðš¿B¼Ù—vUîd8ƒ¹ðcÆÚ’Bµ*ˆ„™aî>IÄïÙ<òSD€ÍÅ„óZÞÕsµõ¨ä&–ªÞ;+DJ”Ð*Ÿ¿&ó-ó›R«yq‘æw‰µ_Ü3Ej6?èл~6í¡¸ ýÐFߊN®É5ÏH[öéí>Õœ]ªs ý0℃hU²ÓP!ªg˜9L%йܤ/¯cªÈv$UaøQ •ìàë{ѪÑÖÖ Ì§òèo5·ÌçŸ|êp”°¦&4¿-VŠEsÑ¥#èH%}úl0«› Ž}T…½áç,ˆ†ÜÑYä[›år°ðÃc>‹9¹Jqô^¢6Z Nt)®J`Q©ê'DnZ¾ßŽ0‚Ýn5ûú±A§YóíôéüúÈ|æE&RD($4$öOn™è¨Â…-Ó´álŠÒE$-C)~¶‘ôŽZ‡Z!Ù3!)ƒ‡×e¯;sºª˜ŸÔwd&½§“U’y¦²õµZ÷àácxÈkИÑâeQmVká)êÚÉ3³ø8æ©§ÒÉÀº‚oãM18w^Mœ‡Ç~amNú~i1¾ýšŒŠœà<5<&†p8åê%Mƒðžg¹'¬•ëv¿“º=ÅË7‹’Raå˜S„ÎÏ×ÇK§+, )Õ-f9ç>Øõþ)!§H…X¾y°‚°ŸæÑ4™mÇíðìß©Óa`Ì–XÊV;üZ?•cCGÑ:cFIY½IÔCN "@ADùÓ¤N‘IvO$A„­„p[¯€s:äLOS÷÷ Æt˜Ô/ÇmÐ×ÙgÄ“TLÒ’ôÞÈ/䨤¼”OÉVÆþä½ÁÓʯ™WÆd/×»g¢A¹Ýóè6Þ‹Ùïgºå«†¬ªRJPüdú·ñS9& =ô÷˜Î¬Ì :I ÇeÇ(tV54±§n uýdI)>ϸãC¤Ø?Gœ‹GÆ#0’$¦ÑÔk† ¹Î`‰ÈØàƒÝϓ޳|ÿ"Ç¥¸›€`/Ä#ðƒ6l }HŒ7âF†Bß~Â.fO> þkô1—Ô‚T9ÇjšB•w£è”z%þBµiØb‹ƒîTt¸hå–U!W)6ºO ÖùÏ·ÝÓæé”ïýˆÔ'à(S [héÄ¡]¾‡Ðy$ëa~–¯YKŵ¾è³è‡4l_SAþˆ¯® ›ð´!7¥§ÇeNßä%É"Ãá"Ÿ!r¸NÆà ®i”‘Vgÿ@hŲ#ov*yÕÏœ_•`¤Ê1'ªd½² б*³@7‹4$@’ÍOÙßðg3F•—Ñ´‚—Ó︘数êäåJ&¡cuD>IÜsûªõ„טZo— Q}"Ó`’œšJXœÜN&\¤ &¾È©‹$Éöî xX~OÑæyæô ±Zª½¿z­“è~U‘!&_HY`f¶þÈñ ä7Q þI¦Al„#Ú×™ÔÒÊkX:ºà/!Ç7Îcï}˸=ÎþÝ™`{c¤/W#Aq(œÈgÍ´´ÆŠwCÃoô)¯Pø„è§ TF<¤‘éåæ5dµ+Ò6ÉԄй3?)@[©B}¶K=àÝNöƒÛÑ­ª@í<Ù‡îNÈi”õŵx+‡ Ô8©óeNÈxSùÈ)3]OCrE)MDDˆ%žE/îã›Ç;‡Ø¸µ‹ôAŠhŒò¼Â!‡äU*iÈn}Výаb_Bs>YhkÏOÙ܆¢±gûãj¤Y¨!¼t§U„ÚáZÕ]ƒ\YéjUàÝôgÈÆ&ÚW ‰JA · ¶DdsGà…M¨m®¨G‡âÆz7C.Í&ÓHAÒÇU¬¯»ì'¾íPsFÂÇ𵈠‚ÊŠ£¯ÏqG7”uœ§Ç±CçâˆØ"…عJ·¢ü_¬µèØ@xKIƒä°ŠD6å° Ïk]ë #‘²è·¡Vü¹ ¯•µYëªe¡ÌnTOÍG»å=:ùTt\t>yÚ–ÓÂÌ;Lå³EzxfÕ|µêГ«¨²GA‹¸‰Áqµ¾£ÕtF¿ÈüH?tÓáÚç¶xÚ{uRÃñJBÝe,ð¸ÅE³ ü̺uuhzÖQ2±f í=îÍf¬0Âöíç'™yCü[7w…›gKŸ¯½‹zÜk+P±X­oÑ÷¶Y9Q? A]Ü(z/¶ôJýM‹vžbÄ嘂+û´ûÐüñr3qœFoÔØŠxÇ2N xmqza"âÛè±[Eǧ!Å Vc湑lï!/p™È€IOæ5*xBhiC‡Òšñú´ MÔ+GMãéÎ:¾o¿îwJo›àå1­¼8ÏpZ]¢ŽÉÂÙçÆ}zùçØ¥ÇÅ™«p…¦®›Ñ~‹“A¼èõþ.¿*}·ÆûªP£÷SÇØqdÝìܪ²´Q~Üo“hăŸì^·Yÿ:ÇhÊÀƒEšI·>•I—WÛà¤É\ˆlñîÄóÊîêG5³ÕØð$=fÓXÕ­Ž”øsÔ ­¡=%ÏA›Cžg•äü*ÌX¥lE€Ö‡®ê_a ‚èp¯/AZŸË¶¹ÒÆûcßv 3î–^kÆhò°Ü0]¨|]Ï~•ØEMï²x3t' “ϵ¥²”‰“”TÏó¹ÛTåápB眳Ñ}üÕG•ÅÞ\[~kÜ’ãp“öùÊ1o  ¾ïn¤ô)Ee¤vëúèý‰Òr„¼ÊÌÊ9g²ÕHl|e°F#‹´Á1߇iü€M·hAˆ3æ–2%s ‡Ü$žR_ÝÓ.š ”.ò¯ŸÕ^¤ñyšßݯªÈÛBEÊ\“‰}-ô8¿ÄO¤‡ùÝq+ÃÕ\ÇžeÙq\ª"¶JE”Ä`ù›°tÙ«7 «òÍoP>_|0z¶oœÜºnµw³V…’,қǴְÅÌß¾àþì Õ¨[’åÙ2ŒQ°ØÖ—„mê¦Ö䆺ÜpVÌÆ‡£jãXä^Ú c$x¶àP ¦Ï^šKræø²ÃX=;‘¯*·ëØxȃôyˆ9[‰¼íõR…¡ÁŠ'àé¼ÕXªy0YƱ‘ºÌl¶ FçJ|Ë@ %l‰cm‡3fÜx,¹Üù™ôX FÏ«» s€Š[a`,æS¿@$Ê#îZ2¹Pªøò5•ûx‹7CŽÖÚ™Qn´qŸHÔ·¯ïÕBˆOÞÝÕÈ3͆}Å/´8låíGˆIäÛëûøkË£ƒ:OôþuÒÊ„l¾ú–” Ú²^¥>Ú‡Tø«y´¦ˆø¡WP0Ãd ? ûä£aÎ}xI.Ž;Páb6Öv›,4|Údߦ¹ñøëhÆHäÇ~g,ZSÓÄa 1.~ië–‡G¥«{ÂÝëqS åhVâj84±``HÝOØ1›fÜÉÂkªgÞ>æ/ƒÈ—)¦#úÉ†ÌØz L?Â…ªC!£ð·÷§ÃÏ{Ë£E0e—_ÊBB}C¾$zcj5î±æÇQ‰ik¨4> Dä×J‘„7N2Å„¤«‚´O ¦Ûlœ]G§è\2›Pp #Ú!WkÖZ›˜ft1yÜPìH÷I«¸Wlœ¢O+d6H¡¡’QøÅÛcSÎ|k:¤Æ#Ó~"‹QïqqØßVáAÙÀ»x#`©F«±Ð_¶#è¦~œ´î5,cÙ°µgË鬮Í–„\`…]vlL×–:6Úø€¯ÉÙJI4òìn7.±òz×_âX~ÖÍ‚ÐÚ(2½øsõ›‹X’DåøÆà¦ –'ٹ’”èMÒ´miQNþw•ÞU6ÇÞ$tU”Ò ,G¹å'þ€äYÂ÷‰ÕËm§É†çÛ ZÅ?<Ï`,nƒ¶rÆ\Rìä=Sh0yGê;…äã 4H«uËdWx½uj8hлJÖáº:›ËôÐHu†Ä¬ íü|ŽäÈój‰¤©÷¤ŽG±¼ ªöT¶ ÅÏêIàƒUò*–½AÛb޹µóR¬ÉŸ=”­d¬üf:ö{Ñç*™ Ýt·×ïÌëKY8ûxÝݬå¿LÄkοÀ›bÏL¸ë{Ã(ò¾3¨¤ÓNW—¨œ–ä¿ìÕËsö†Ë 8Œ“è])”HãžÊž~‡Åh=`Ö>SIé†úóf®øàÁ.Ù`Q±Ýb¹ïãý4˜œ0© ƒÝòŽÉÕƒp!äRìÐ2>“iüþ*'áÒ¡ãšòyZ2¥_M@•Ò¶Ù=™ó\­†hon{’ùàâà¡¶ÃBË¿xWÓõMk/“Êÿ*M_"Ô!_¦_y0Œqƾøà³î÷©³õ»~cô+2F{oe,' kbï#ÿñi`ó¥+ø( ÷UϪ»S<¯„¢|)ÓvôóÆY¬µ+`ë´z¥sìt”¨p“™w †«&PU÷®Ñ¯b¨ls×5߸øèecæl 6Pàˆ:òä{F½±\[<À6À𡡞͊¹ÏæÃúGô¯¯oÅß´¾…e4ÛŸJj`ó°Û$¡`ù¢ÉxoÂIœ‰›~yaYŠð•«°2ç©¼šŸŠ½g…>f™!V½n„Ÿ…ãY3eÖ#ÞÎ2›&(Sº®¥ÆÇQgÚf«ƒÓ‰Ê²ráä0ýk “ï°¹P°˜åösi# Ê£d¬½#! nÏ\>èÕ°à„ßNqðºqž¶6=*Å5hèÃL–E©-EÇÚ²§2­¬qÏ»Å|7„„èÄ©‘•ÓÅ }ëé6C{Á ™Ê概_=èYÃ|·† SHiÚ»™øÆüvƒ;!Éñá­Hæn"îÇfϧóG&=ƒLË”Ïvbm6åT%é¶Gñ*ß,ýôº¤L;UŸÞăŠÉ¾TL>×ëR=À?go™b$ø¢ÚÓνSl>“{O3Ài‹úu®rï>XAäó¯Th΢Q!e¸gµOçáÒŠžG/ðFÍ0jbînelÁ|²Å®Æ÷Ì5< mr…½](ȱhˆ ûáš""µÈsÁHäïôu@3¡šØ¨ëE®„2*j9B5—˳Rì¼ÒJ&ÜÁÓ¶Š)Àέ—½üJ±;Œý€»ËÒ1É*~²!úeñbv¾§"y?!/mÔI£ý»jÅ®ù¾GShÓº4OÊCP›ónyu¿'îûe®þ‘æLE‡:ÙÝφ9¢ÿµºßƒ#\[9au¢ÖiÄ"p˜ú=¦\Ë*=K\äõÚe¿’ 'LêjĆÙo&mžšÀ­N‰ÖþûúÚžÎ,2ã¸{ROxëÙ`VâH+CËJ&ráBc¬bܽ—þUÉî.ñ-Û‡·w9eÓ[cäìn$.^«Õ‰ ôÏTb A‰+QȦÏ4¡ä%»šðÇîÉC«-9ƒB;•l… ^µna7ê8­-ŸbÃr/×휯1F 4ÚÖ M‚ßÏRÔöÕé–óN÷É>Âäixªf-(v“gJP~úzfOiQK<=¥›@6L¾Ü'M%<о±]»XÓr]í—×Ã<ôÑ(VÇþ¼lT£Ý®îº-„-o¨6¾ïN,LrBm ‰pñ]^É,±Ÿá7gzI£zy}q'«K~¶’Ñó´í¬´ioŒØù¨RÄ–K{~QàéÔ*ìShØ Q³sd×ëjråýö 1{741â.ó] Yq˜åT0]­ŒOÙù6w³÷v×?Y*¶¥¤9 á ©4óyµ¨„ÃñL®qß7í/µœa–û¿0žgð”Èü_$¾m@—±M6]Ù(Þ­–¿í$C¶kw/n"{ìIûîå?¨ÈPD|ÂщÛPS ð}v‰­³»pfì§_!H-¢ÅÆ=zîWÿ4‡[Á‡b®‚ÎA ‹q4~=Æ2®Å³ƒ(Ðq ée„ö-¥2dæ1©cêJTÔ˜ðüÜ‘j²·Ê¹/³Î­yŠ´ÏiG»-ФsP%É:§ßá…D!¤¨µóµ""™EËewºüÕb¾¿•yhZ  ‰ô*žû¹1û„¬±ì†„,úÔfV{G9ׯ9s9Z£œ@1f«åUÞ£Çk‡õgisgx&—P‘< Ì_õ·ì슟'`Ê·®9Ýènö†í%Ms”!Šž7æM³øÐåÞ¤á¦Ñ©ÓÆi“T¦´ÈwR#»¥–EgQTú?jóú®_íׇ…c}_®Líj1|âEKB$c2¾?ì^\Z&ðË‘¸9Šƒ¼ˆMFŒ·Œ»•âEpNÃ9Î ÖÍÆ…¤/Ö ñÊët-wï-¿Âº†fÕí,*õ>T¶ÙmY²u¤[“üº4=¨è÷xËGOÜã Q¢?]1þºi0þªº(†íî¿!Þú c¦)RÀ¹Ç8(Ý ;fÚxÛ§C…¡b,¥8‹Ð{`Ý#a‰¼ªwÒª'“û¨<žMk(Úé©HpÈN-XŽžÐyLF:™Ç `Óœ†Su¥HŽä7:¥lšø„ý–@(+Ó¬˜[B PùëÜ©uöÛ@‰ß¼ØôøgÏiä¶æ&ç$¶P Ç/õʸçÏ]F@p»-Ðõǯb’Y|±t.Yµ}4Q[©_¶ÛÒŸ¨¹^9^ðºSúŸ˜¿Pg.d e>£qî»3„QH³°Äô”{3xñ±„o×ÛèÔ°¿/”±.wÔáOû~ žõA|2W¡C q ·¸_Öð ÇÝö2Qö¼kE#éäYÃv]Þ’óðYï¼Rçñv-jbâ3KÄk°“ÆÐÐÃ.µ €þ, 3ÑÚ1œnläqvZí›äEöØ3 ¯KUÏÞí¯BÁÃÚ'PÄe"œ ÕÒP;–òH7´åŒÛàŸá_Pí¯Í¶EFÄ~Å..’Ú„è·»Ééíè~F^¹‹ºÃ2ëÒk'Âom[j“@§IòI-ߟ¤Ë“ö…Z4Š™¥+…dyA½¡þ æ¸9dæy™ÒS˜M“k³~àÍFªZ<[€Ø¢1ñ@3ýCgû‹N×ïÏ,xûôï»´à7‰ø~ ®õN«3ɱû¬<-kç^¢‘&-¾IMŒr£ë ŒhWËvlâ ìt-³ÜËaÞoEÅ_Ö¾”<²ž ªŒµw )ï^ÎQLر­áŸ3‘ø¥ûG„¦Ú\dÝ$¸bÙ¯ˆO»(¬¹k~|BŹœeÆ^}¡|cõ’ºÝ©þi!6ÒF©m»òóä¾tëL ¾>[ÐÐ)Ñ÷Eeí¤áÌ‘iBÌà¸ÀÀÄ!rê¢à81CÎwK®‚,{=Û‚© ‹¼^ã Щ¤+”ûb2ðÄ^á_‡>çã·Þu½Và[ï¨ –pc¾c^:Ï æ’ŒäÏf®çªÐ¬t$-T§ñÄtm5éí¹•GüßÚPÓäu WÛma.ûã†pÛ¶Öh€“œ3Í·'xÙç¯9–Y˜Îɹ1öÖéiʃÏÉr‘°hùÝ©ÄM¯$è´§äfÜÅóT啤ú 6÷p$6.*Âf 0˳ZÖÏ;¿iS*N­¹ÍôåšÏ=ÏúDÚ•¯<½2(0‰YËyþRŸÖxU~æÚv#šóp¡ÉÿÜÀµ÷ wrÏ¿EyŸ%Ó"¶¹„8èo.t£ùù†–"4ã`å~{wrö—ë––ùÜ\5`Ì ØÞ÷ûG—ò–H¥8øYú“ ¯¯­ë?…–‰wÞž ŽUtŸ q123ig™¦õàØ¢˜—½Io€;jÞJËpë“¶bÌ®jÕ^ˆúš%•Ä£¥WÉ„’[–€çÍ4<—ÜÕj€’R ­yQûdk^DƒdN±~G¶À´-C‘/Z)íd.ê­­Óë9nìÃ[u‚K$2gÙÖ‚«Æ’žÉÑ·Jg·Ÿ”tP±9‡4˜’gX±ô^bst>ra‡Ûa&`OؾŞp‹aÐëßù$ÛiMy6ÅæÉî¥w†î¶¯h|ËBíÇ)ñ =Qž ^7è ¤Ç³ð|´gAªTÛKµ5þÆjµ¤Dë3zG½îD^%ò õñÑèiT)MÒõºÊYóÕDM¦Ç ÖÉWƒ4¦_”jv*“Àì¹™\ŠåÊÓwG#eŽ4KÎÏX§æl0Ü@¶(üJß° VŠPLXœŽa·¥p¡®àÆáÒ¯¨Çt"†3±ðEtß©ª?Ôᷜ뼙Øe{†ÝÌË^cýnöPoëºdh|Áwê= ÄΤ@œ£Š:èq<Á‚Kˆ%+ˆmÎyë‹ÒÞ-“W-†o°ÏµónümåÈw>¦Ž,ÎnIˆ~š³A_D•JÌ mDûLD™é¾¾†Õ:ã9Ós«È>à}Ÿl{Ë9¯a³m¬NP¾€ Í%6u¿!àÚM°äã%åo)QLÄKþ¹¬‹L ͫڗ5!QpëÈ¢*ú&·U£?Ù’¿~çŽÊ‡µOÒ#óÀ¾„jM/³–ÙKLé½{‚PDUÓ­±—V>O2oƒêiÆ8aæìhh…ÜG\À »ÂçîìÁ›¤ÓíÔãMnžf+—g&²ÝñÙÄ‹Í=jƯ>@;¾ AZ:̘Dž ·ì˜zöã2¨ë˜¬rHoÖ#§ñ¼åØó€ÀXhRÙßx'á\y¾– úF/2âF|~ Õò05Åæ«`+¡“ñåß5 õËsEdw­aå‹yì¨kq–€ÚmÁ,¹Â¤†¡Ìƒ9eˆ/åÊ­”kñPkÉjâ¶W)îû}0ea¹Dj zƒ°ºM4Ã]@ïRH«Iw¸…„IÔÃZóºÃ X{@%“<¸äûkŒÚ0¶JÆï‹Éö`ö®NÅûð#;Œé+(× w©7[„IÚ²²@,:_ª‡gêb€ßý_97ªW˨æ8ÒÒØ¯ÞTI5Ô÷Û ®TÿĤ¨ÍHþ¡£"YÆØ«qüVd<$1uP7¶àå¦~p™é1,QOØ0bx ¦½q PÏ‘mèA¢ˆù $ÅZ[íV vIîZ~›‚“fkE¤™7G2™WJ [YÜ9wü•ŒëÖ„¶Á(iš¶9èþÌBƒ0øL*©ÎAGÀm'B¾y[WÜ Ç‡DX!'œ4ŠZpœÎ(¦&‘wC’X‹Ê®ŸØ^§¤·o*íðú ˜š› …?㘭é7°7³Ý ç%—›¯Dñò endstream endobj 116 0 obj << /Type /FontDescriptor /FontName /YVWBQL+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/X/a/b/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/f/five/four/g/greater/h/hyphen/i/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/quotedbl/r/s/seven/t/three/two/u/underscore/v/w/x/y/zero) /FontFile 115 0 R >> endobj 117 0 obj << /Length1 1422 /Length2 6221 /Length3 0 /Length 7181 /Filter /FlateDecode >> stream xÚwT”íÖ6RR"Ý0C— )ÝÝ 0Ä 0C—4H(‚tK*%HHƒ %H‡Ò]⇾¾çœ÷üÿZß·f­™gï}í½ïkß×~ÖVFm=^Y;„ T Gñ‚ù@€¼†ž€@‚| +«> åýÛÇjõ@Âp‰ÿ@È{@!¨ŸuÔ@ÀUO,€E$À¢  ‰ÿ DxH /˜ Á¨"àP$«<ÂÍ×æàˆºéó÷#ÀaË €ÅÅEy~§²®P˜-h@PŽPכ޶@a ƒ¢|ÿQ‚CÊ…r“àç÷öö惸"ùÒœ<€7 åèB‘P/¨ð‹2  q…þ¡Æ‡Ç è;Âôö(oˆ¸q¸Àl¡päMŠ'ÜêÜtôTÔ-7(ü/°ú_àÏp0ø_åþdÿ*ƒÿN†ØÚ"\Ý p_ܰ‡¹@-%u>”Š€Àí~!.HÄM>Ä sØÜ~(Éê†ø!m=`n($æò‹#ÿ¯27cV„ÛÉ#\]¡pï×ù`PÛ›¹ûòÿ¹\g8Âîÿ·eƒÛÙÿ¢açéÆo‡¹{BUþ`n\xÿö9@Q€0 PwêcëÈÿ«¾¯ôwüË}Ã!Ðß áØßЀÂì¡7?xþHˆ@yxBýÿ3ðO  ì`¶(Àêƒãý»újÿ—}sÿ0À t#?0úõùדÅÂìpßÃ_1¿¢¾–‚1÷Êÿ ÊÉ!|^0À+ ÄÅÅQaq ðŸeþ5€¿ÉÿöjC`÷Uàö@ü/7Ãû›‡×apüÙNàŸ47r†ÿV¿9Hd{óþ?ïÀï”ÿŸôUù_Õÿß'Ròtqùçø ðÿÄ!®0ß?ˆ9{¢nVCq³ ðÿ†AÿÚg ¨ÌÓõ¿£*(ÈÍŠÈÂ\þ5HR æµÓ†¡lÿRÑß÷pSÞ‡j#°_o€ ýWìféloÞ*È›Ûú‚ÞìÔ?[*Âmv¿–O@X€xx@|ñ@7 üÁ7[jõù-n€ŸŽ@ݤ7ô{„Þ¯;ø!¿\¿-ðôø¡ÿ6Á¿ÛoóMm==æY! )ʹ(4Åž¯rû¼ùýß: ôvj‡ÑÔ˜¯w÷u般Í0ÍØ“Œ&¯"D;¿U®þhE~3ß\âSbÆT¼lNëz¬ #Ë2ꃉ9q‰‡Yš§¾ŠÁÈôXX™\KÕw߯f éæçû²z{R ÔºªD*"ïQ‘ú©2æ <{OE–˜¥Ú€Dc“>•/KÜïBËø€=¶Mh£Óu¬“ê…ƒqû­­1õ–a}ò.ƒzcµ˜B‰Óû¾ ß5¨£³´wº)¡&åî ¤P×={«^a© IÀã¸ñ³^,%Sô$ û¹o‰‘˜\«ÂL•„ä—DþŸ°ñûÏ—òR–ÙüˆýEî­´ÕXý†C-_˜"?äÚþ‚ž¥8<4õ¤2lú=±¼½Ñ7 ¶uq£÷Š1aò¢ÀFýÓÌ[ÂW:·øõ²è #£mã8"tf›¶÷4²XP$®æ9-…íz›ØîfY¾øx°bþ1 à Ï3à¶›¸iÁ¶þÜï±ð u’eÖ…rÿ£8òêºþ­¬¾>HóÃuˆ _¶X8±ñŒÚÜškÑ­œcÊ–ÞAZ‚{Î.̘¸ÛÚ97J«kXO—¶h±æ{¸Q³BZìC/^–N¥QÏ£ÕFUÕqîÒ\‹³|É\qØÌi)p€罞èÚò¶88áU,útÙ’l>Æ tÛ•MædµæéƒJ‚½‰Œq¿¹lÙ'¿k¶SgìWßÑ"Ä\ ³¢)űݶº9¦îә˫¿ïsÒšþÙ͹6äè{Û#”;»Å=ž÷­"Œp­ZêíëÔI§¥Ù4îïnƒ†S\{µÖïô"¤l·MÈ7·¼î ¡?þÊËÝêýezfݳ–¬ÇÎŒ1p)D®qð=)iû©§x‹$ZqZsØË†h'ÕÒ7ëÎ;/¹ŠìB$„ôœ]êc9ÁB¸Åí¸4ðУøŸ¡4^f•Ø6 çLÄèœÒ‰zý¼eNZ^l‚÷:ƒçŽYQ)s˜úIá!׬’©n:²Fjá"¤oœrí©fd²nsU‹ø=é„Ö»fì†KãH&UF¦­Òª;©lZØWtÞ°¶,M‘Ð)§IgÛ!–>ÖÔ §I @\;fžóÐÄ0çøEž$Œ…î‘ hO}øhôÇ Œ¬¢(1c3Ô}šUºÈ~/Ús:Áé>õó•–ÜS›:*£ C½Å¯#¸åe0±#¡Á¾ü¶oÌBù޲–LGå^KJÛMázq9mi#åæ¶©hN¾½´Ùõã;ý‘ƒýÕ–š°ºFǶ«ÖŒû·¢` ×JvelzfcóóYÐWóËŽg&@ ›¯íçQò¡@Ù¯j#ýņ3±É°iGÉæH­# bÒÀøÆØùk «ÞÜ¢=?‘Hc¥®©A«&ÕÂàÐÀ‰r’(FR¬…½«ñ¥Ÿå‘ög'Õú¼c$nÊzh;û÷9êú ˜ý»$)+Ñ9Б,,Ÿr˦Ÿd¶6-½¨N5b1Û..­A™–c×V5FõêÜ€ªsÆgž…AfÌË貂¤çKð Òó“ì'€¹cÜ+_l“[z?Ï6%ø™!ãÑ[k“bìGRïV¥©@Jj1'5ƒªäQ.蛡XÛW0i†¼/„Ö™!ß‚Üèj¥I‹ÝÛºä}oa¹¼Í°öË©íѼw<}ºdqü=8rèˆ"Ð¥ð‹~"]{5cÊžy‚âé–;ÞêJØûÛ4³ 9F9Nô$¹ˆÅJR„cg,w9Oë06þæ†ko “¦ 14ÃQ$3˜<ÒrŽïp°4)6h“¨ó,A?Š,QÈqF„»}ìíçáV/uýqÙáõÑÙBžøœ¹¼‰æe>:µé¨g>ݽn²q…X© ¾™ïë$žWºÄaš—ã܈¢«­ÔÄ»š¾U…2)ÌD:£èï݆U`nïo>A><»÷39âYb™G‚œáô±«µ‡tщ¡Þà£#1QÚWÆۼƒy¸–gç^!ù#tO·óYÄv)Í|Ÿ #õ´nõ¨˜¹réî.­‡¥/Ú™Óßú²Ó)cµ÷->ú)’ÆTÁäå7Ÿd«7Xzj>îNÅNÞi_hîsu}=ç|Å™d¥¹þ¾oI‹ÝIñi›=‘fÖ&vz±yÁ—¤@ÁÁÊ¢¾ñ’.ýŽÄJï°ik»¹*Ï´r*£ÔO–`nY.ŽÄüœKFøðãQ›)ué£UßnâïÜUª¦Š¥]ƒb#†­“Hê®0¶s‡qEþλ|mR…ȱŸOíIø‰›ï¨Ò¼ÝµhnD¼C¿ã€Ûܧ5õW‡/™î^vßââQ#îqsx*óIsP"!›¤!Xº ô Í7éÔÓø©p³¶-;åFñäOJslÛœ P°£w§¿±*ÿ¸C]')ªª„W ~r†ž)¢ø1gãån+6µJŸ­©S¤œ°îXÒò¬6šå‘ɳQ>a)à¢çû šÇ×ßÒ±Qrˆß}Õ7¾f¢;4¨P(„8•˜|ûÕ˜ð%Yð[û(“ w§aÅŠ@I<ëª9QÒ€ÄQÍ+¶I|(3–èýho5Èɪ+4G’D ®1[Çg›—(= –PÒÊðSºzT1þžÖ¾ ãçuž¨Ìd[g9ÕSjçÖúÝ=* ž¯F'm,”_?tµ¾« [X'Ì -ïísvL–ÂXå^9²™w±,:¥WZe£­¸ç IŽîÌdRŽWŠ4ýL¯QC{ÛÓ/ùV˜"Šy(•Ï)]ü+ï«ÕqŒŠóO}Þ‚:w_NÞ);/ÎNP8ÐÛ¯½C=X’Û•aã`KYØ­6ÖîO<¢Ä ¥¥)ºœF}Ûô%¸\0×ëö}ÚL‚¹XB!œx…šGŒÕå?{u(ÛdMC[ ¥ؘT¥AZ)»[Iü5®Øus©XDƒð­ ®È˜NûPŸ»ÅoŸ^߉]%÷úÀ6¾ñ½oåakðeÝô¥­ÚìþT=³xu@nÓµ)Á%—2~sYþse3Ë7,ÂÉóQþ/9Ö–L÷LéEÌÙB”®Y–ù»É&Re¨ãî§ R;kÍE³Ð·Ítí#¸ú½:¶®p»(‡ë'ž·±Œ3ÁoÕ}3l’.KmMü¬@’€µ› õïÑŠ®®/Ý1”¦?KOløv-ˆ³¼Po‰:U—šüÀ„åî¶PbAU¡Øwî1Äö_¥38…õa"ä¨ÙH9ý×Iõ0·†1ÂÁЕ<ôÔîC˜²dYÈHw¬„ЧBž Ë´çáïö1ÞÒߨL ¢J K̳¸´m7a0«Š9—«|d±îãä¨ß cz87cF8ÍÇ(x(ï’­–"gÞ",É":m:uäN 2ªÍ#4•ª $µœ%Æ!¾s帓ïÌÂA»‡¦:¯ÈÏP(§” ºzÕj_¼ “y¢TËK½ƒB 55l½´È¼dÆmaƒ=±ðQº}o-2^Ù¦|‹PŸ¥’1/”Q¼þ-òž$Ø,±© nQ̘t-¸ÒÖù…nvÔL¤WÌ…©Ì9<Ƴ㙋­T=t©üD‚Úž~¤C,oHÃøŒ:yü_ýùÅû»¢°L8hòy“.dˆJJ” 3[½Ãá¼?ÙìÁƇ{ú?sw  ÷€~òÞ «ÏÝcÇ~ÆÑé5HƒÀ@á=(ý¾ n7Ü÷bvTeŠ' TtwÐöœÏ¦ø"ÇoÇÛ$´ ²y¹‰¿€v(¿ç±/•b‘(¾F°¯¸Ž§µ›‡a ¼:ÍéÏM>pã"tí‰ òáS¼×•wf¡1|™í­#˵‚£j³Õt›3y$E‡ t$+ká<µY|L&éQ«¿Œ(>«qæÓ××Ewõ7KV6¿’ØuJFƒO]·$É·'P©OGªÃÒjßÄòž”,dKö”ó¹1¾Î[ÈHÜ;Ž–&›¸Ï}jéWÑòûˆÞ‹2É¡þœ¤<Ég‘g@BͰ\ØØ¥Ò왢òZrät´ Ý*Úl0¥ßÆêüüs]hh1鱩‹•?¥QõA,ßh@f¹‘ÖÔd5­_QZNaÂB¦K<3T`AÝ¡6Õ*äÞe—HŽ~1*Ãøi†XõüxW™]@)í•ÎÕéþÄȬÐmMºû þ]ð:Iù» æä©A#é7Oe+Kø›žZùÚžGè¦UFpÏsµùÞǺzWšÓɤìa<å” ê=–ò}à ~€4§?ÕÓyk ½ƒ“‚JNt¯3»s½ÃÒ­ Hâ’¯¶¤È§œ¦w,¢Ë´¦ÏªøoqpR©m­¥÷¹1w’¶!á1Þ*®$¼nèo½RÔ%IÌqmŽQì:KÔ†UjTÇÚë÷u„Bìpx«F½½Ú¿Ë¬DS/9Hîµ=9¼ä™5[àëœh–ÞJ-ÏrÈVáy§ÔÀÏe"ðzÍ édж8±*¿Âê#uª"1Eêu£‘’\´÷8W<èÔ=·ÍVõÔjµ»³mÒ½u€ùåÐÑùÐ¥\«’çõÏÇÑ8˜ XÜûâA¹­•'|ù×;’× N…XÑé©\¨ò5oz«æ&*í ÓµŸø¾qr˜ŽAe3 QˆdºpÏQ¼[‘+£žÓõ GÌ’‡±îálÕL9£‚žÒnrîúYþÕÚÚÔ%÷{ËŠ0÷*þ­Ìx>ÚF‘'4‘ ´}Ì ß~3ï±Í4‹T*¦„· Áíc åI>Wos@ÈÞ;j-¦€úÓS'Äg¾Êưþ<^¯Õd--hfª«½Å~„»Æ«Ã9q9»´8U†”Î>o’Vð('®‘¸ªFi0¡^‡Æq\Œ*ôð®ƒ?R€Úè··jõN¿MÜ.úI?¡Ì®®*©†gBž!ÍôYäîDÄn¸Mn€Ð|åãŠü¼[l†ÝW¹!ºÁÿ«‚C-Á›]Ø6 )N©fExv#WÄS˜Uyâl¤ºîØ2¦ØbðÂ¥{}ÙŠx²ùü{1¡›Ux[çD…$uæ½ñ«áO! Öîbî?âi¡<¾Boo(ùÉ 'X¤$RD?ËìzrŠ!äÙQ#VYH(ϹR7ä9ðm:ù¬ýQÅ ë‡×ì\çÑÞË*:´ŠÏã N»È.æþ&ÖŠLBº'Ïïy‡°6°àØ«]&LÒ{®ÞÀé.»s˜Xýrÿñ«ÈDM˾"+UúÅa#Á“˜T¹DƒV)H³Neœ`ñÒŒINÎUEê¸qßs¹ãÍÅPm§RÐÔÉ šÞygû'…ìV«[Œ#÷¥h¯J‹—®U£0µs–’è§Œ©/îT#Ûv“m:JeÃg~jWúîÜç`^”BàNu|ifüÚø­¼ƒñ(ᓸñÎñ¾„à V©ïçriQ¼m_¾ö^àEš†·ë[˜Ûxȯž//ú²nIŸºÂ/y)dQÒþ|Ló£OÕ¥ Yú"L üVS&  èRó ÀÂqX»Oî 7þZ(Ý*íð“|RGóÌWAù+ÞoÏ>Þ­lê,¿ì±¢ÝÚoÖ»¶¨¥5íŸZ¿°Pa#|8+ }"Þˆvvn:z¼ÌbÃLj'VŸqö6!úfÜRAP…ÞŸrÇp=ÐèUO‘/èAsh}Iº°³’‰M—-ýŒÂ¶lfÐ@åÌ:aȆÐWœxãu Þ*˜°ðpÚÞa².wé$^zÞ/^¬ƒËmvª¹|Ò‰ÜVCÒ5ysßÅ¥Wi]Þü¨Û廘KËôQZW‡¡ÒiGZDÆçG$ñû0 «*ñ:Œµû–£žKäçQ)/§µ1×è•©Ù\Фœ’»R·÷î¶,Ô]©¶r-ž–Hã*FøÍ+pH/–Œu)Ú´0Ö-0îŽe¦éÒs–}˜,mþб‚á©j—gߣekLR^ÇéKB€ŠS.À…zï$SºG±ùè å™PFú5}2Œ® ú ¬ŽX½gÚ÷âÞ‹Ž’3íÐî“lk*ªFþï7j†·“4²™ùÌÄNDRé¸u˜,©ûRåÙµ?ÜÚ+3†>Ø}Y¯æ}šŸm%ЧûÑGÞáš+$U"‡êåã8¥«Cs®ÄïÀ€Ïè`"Ý >gF¬’¹×öÌ:B?iÞ©F‚rY°ޙա¢ÍªMìß}Ü$·‡{.4üÇáZ0‹Ç/¹54´» .ç™9¼ÖÚɆX"[âÁ„ßÉFÁ#—)I:ŸÖx[B÷£¢ Õ ÞósIBûáS«óXM ÕÌ2F5#E,¿—Ь‘ç€4K'0WÆ_±û­Òò‡Ë²Ä[œoÐÍ]W7\UçW¹4øõTg =*p‘ŸC GAÏˆŠŒ+5%‰¶o Ûjn$#ÂŒ0¦ùêÎ_¡:ÏÂLäÚ GÕL‹Ê÷’ñkd;T¨Ëh›æ&¦Âœ¡·‹ÇèrǪÇÓÓGw¸aÞòl|m|øŒ:ÕˆÖ9Ÿfb ý˜æ1 endstream endobj 118 0 obj << /Type /FontDescriptor /FontName /UETODX+CMSS10 /Flags 4 /FontBBox [-61 -250 999 759] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle 0 /StemV 78 /XHeight 444 /CharSet (/a/e/p) /FontFile 117 0 R >> endobj 119 0 obj << /Length1 1814 /Length2 12866 /Length3 0 /Length 13998 /Filter /FlateDecode >> stream xÚ÷P\ÛÖ€‹âînÆ!¸»»»K°—Æ5@p ÜÝ‚CpÁƒK ¸»]¶œ³÷ùß«º·ºŠ^ßð1ç«jrU &1 G3 ´£˜‰™• ¡¤)ÇÆ `eå`feeG¢¦Öí€ÿ‘#Qk]\AŽüÿ²pš‚ßd’¦à7C%G€¼›€ÀÆÍÏÆÃÏÊ `geåû¡£ ?@ÒÔdPbÈ;:]‘¨%¼\@VÖà·<ÿyЙÓØøøxÿtˆÙ]@æ¦%S°5Ðþ-£¹©@ÃÑ{ýO:Ak0؉Ÿ…ÅÃÃÙÔÞ•ÙÑÅJ˜žà[Ô®@w à–ʦöÀ¿[cF¢hZƒ\ÿRh8Z‚=L]€€7Èèàúæâæ`t¼ehÈ)Tœ€+þeÀøûplÌlÿ ÷·÷@:›š›;Ú;™:x¬– ; @EZ‘ì f˜:Xüahjçêøæoên ²35{3ø³tS€´˜Àô­Ã¿ûs5w9]™]AvôÈòG˜·c–r°p´·:€]‘þ¨Oä4;w/–¿/×ÖÁÑÃÁç?d r°°ü£ 7'-³PNòo›7Ò?2+ ÀÅÊÊÊËÎ :€žæÖ,$Ðôrþ©dûCüÖƒŸ“£Àò­  Èøö…äãjê€]Ü€~>ÿVü/!±±,@æ`€Ð ä€ôOô71Ðò/~»'À€õmüج|þûdô6aŽv^ÿ˜ÿyÅ,êÊbêRÒ ·ü_¥¸¸£'À‡‰ƒ ÀÄÎÅ `ccçð¼=øýoœÿžÀºÿSªj ú»ºE”s°tðýÕÄÛéý§÷¿'ƒîﵡüoeÇ·yèþCV.Vó·?lÿŸ—àO—ÿ³ÿG”ÿ×ñÿ¿I»ÙÙý©§ûËàÿGoj²óúÛâmžÝÀo»¡äø¶!ÿ×Tø×B+-@nöÿW+6}Û1«·9gbãdfåüKr•y-TA`së¿fé?—ñ–ÃäTutýñÞyóbeý?º·Õ3·}{·¸¾]ÙŸ*àÛfýo^)sG‹?V‹`êâbê…ô6oÄða{ÛU  çŸ#`avp¿¹ÞzôX:º ýq±Ü\±?D/€Eò¿ÄÃ`Qú‡ÞtÊÿ%^ö·iü‡8,ÿ%¾7?ÓèÍÏìâ°˜ÿ—þè˜Åâ_È`þ ß’Xþ ß²Xý 9,Öÿ·N@ÿ·"lÿ…oUØý ßʰÿß–‰Åá_øV†ã¿ð­ §ÿ"'÷½Í¯ã¿êf{+Åå_øVŠë¿ðÍü/|«Ìí_øV™û¿ð­2ý­2Ï?ñ®ÝÜÍÅåíÍøç~¾ÍÄøÏ×0è 4GZšw4±© i¿û*FìÁôk‚uð"ò AgGŠÐ}O-HBðþ’£ jQ¬{v7ê~ë½ôµÙVÕÖxÝ7-Šo©¡ÖÒl›Ñw KèáÐUÑ}W¡«Kß„ÃÁ ï´Eý»Ç•è =>£óù¯¹Ì}Aš–êÛ*ëSxÚ¦#f¨‰˜(x^^¨±ÌŽjñZ±™ÙN9*× Ñ‰ãÄwÒû÷i£ì\[ƒ?Ë!A›iĨN W™Â_~÷r)˜Lf¨wz¥?Ó]µ‡|¤3sÓ¡È’Û™º½Ø‰‘S·j‘Ú€H…–ØøLq¶(–ãiF»e,ð¾K²ô[äR²f‘7myoE… ¶4"rÿ"¢ôôQHs¦‚¯bíðt‚±¦krÖLZãhv“ªÆ¥ÏÛ´9âhT°K,ˆQ¼ãÝv€z0Dv ¼Í‚݇ՠIp­Va{º,259zäù#é!ev!‰/÷äɘ (7uì‘¥–¥õ;VË!Dí áPŸÅC®ã<Ûå`¿ÎhÔ™ðþy¤ÞˆìZSwE 'Sh‡¦Ò‚|«½¦0?ðEÛ¦¨!MrÙ”ÞÌu–I„R°ïr¾+æ4Èræ¹u›d4Ìè5¤^*œÀû©öôš‘b—u¦“úúéVí˜e|$r…ßdžsŒ±9ã'ÑÊdŸðúQî^ÿÓu‘Hy®ºòþz÷kª¤ú+P=ÕyJ4R~:YŽö’Z¼È!Äêovˆ‹ŠJîr·BÈÒÑ ?¬:7ÿ‚ºvˆ-Ҫ킾ë®_}µ”ãJB¥ð–ÌfX3ß+¶‰ÚPeHgPšËŽv>æÍR(cý|È)O˜Ê¥*׿ïü}¦–»|üG _†“‹UŸŽjbN×è½N´kÌ¡*ÌË’C5¢µî‹–Qó€)îÐ.(x¥4ï=ÙAä.ÍMôäk›âd‘@üþÇw›épÆHsŠÖUÕÅr`i|mŒÕæáÁª¶¦ÌM¦$Nƒ×œœŒÌ£À(J@’ZeÍ~SWæÈ_öS2÷3é½H‰/|þ˜&SVcÈb=íàb4ïYÏG ™·ñ‹Ÿ ºÏÙéGF꺱(›ÒÞ4ªn*+Ð+>{_À9‘5jmÂoE¬f•^¸g VÞHùÎGÑJY)ùþœj¨¼=kËËË0PʧQ(…áãEñ9KMÌãŠå|º”KÄ8Ÿú-½¢‰››‹?VD#Ã…’½ùò"f,Ã¥ÑqçÀˆ;^eh]ôúábÏ‹¶Š>¯ÿØÄÎf `ùâŽ3Œ6kOàÝ%^W«€Íâ¶|ð ÃÝb«cyÔ^y ½W³± 6ÂôAÎ묱•²6ÿùAˆ,òÊ]!ÎÙ´ óçûxl‰eüaáw.;˜ÝzyÞ½Iã’DÆdt«å^ e"å5Ë®¡®’!àjNR.x’»»Ù'gó¢üí¢/͇~kCýªË£r´/êRÖ+߆ IIÚ!ÈN ü@m]Ñvβ´… ‘Pì×h)]u?ÅT&íCØ+5…”‰p(mÄ£é®ÝdŽù(ˆß%Áû¦; ï'Rùý–0:øX”–Œ,Ûàt—ì,/ ˜¤'|}zd1¶ ‚PµÁdô¯,ì/¼ Üýô_me,Æ©3Úâ(¦Ã˜…òÞõ-²I¬qnY;¸µSÍËŽÑ,z&ð´Vô\8#åûü†_ƒ¬Ñsô’\d:È“[½|µs.}ÖæY¿L­¼Ë«× '¿P‰†ñ"çWæ¨ï5I]©^5œëX7ôC,ŽwxIcàÊ-æuy/×ÿÞUœð¥úêá'¾›9ÐQ´_ÍZÍAãtéþ‰SßmHá‹GǃƒÄ¬¿{×Í<Ø"»>ˆ?Õ´žÕ+ˆÌžP€÷¤Càú«®çlr²Ïßb´;¸=¾×©XÈaDN’î%~GH¸;`Ú>"rÉ;O™ë)‹¨íÇ%ã(; Å1:Î¥e@Iw5½:õˆÙ*ï’MYn07|™ý)nF£3¨”“ê¸kŠBóì«äǪ‹FÃÊ !uüaÜ ar½å‰ØC¾6¥pµ:¸‰dí9‹úÍjH„Õ^†ñ½(Üš{Bš`¹óÓ ¹k§,±ëlë÷­e€>Fد}¿1‰/n> ~ÅÔ²-ÕaŸ—¡ù¶-f°Ö¤*û iU¢x¸Øäö seîÍ'rjÜ0ãõTK'P™Ç^»r|p5Æ´xçÏS…?`„qýqüÀ¥ª„F-yÕ 3cZLÉ(ÛrNwW¤ÉÓˆ4 Ôz—¶{æ %üpú1…z¤å™nº[S$ž08mœÕ”M†¹Á£i dúiM¶ªâeÿ–R"†ÉÄJˆ¾Úr•I3±NJ&4à1 ˜!ç&…ì("Ml…<ÕÖãÊW×€Fx5%£çÒD5Ÿ· 8͹TÜé¸ÃéàM´æ?´yBÌ”üeNÆkKÂ|wbw\Ó‹îk狉RVÏRq·’.@›FÇ®j$ˆ¸ép;S;{‡dgØ/ñ´¸Á_¼IëË4ãäõ wž ¸=*Y’DÄ|”Š˜¯ãø™ŠVTœO’|×Ϛϕì@ö­,нJ8î=¹òÉ©‰jÌãt²Ëe˜^@^ 5}:|Cž½ñà‡—3Û=Â6-0?š–uo°ôK©ÌO÷Ѫ{}pð·4ƒ}ÐKÇ<^]Ù{0XWØMZ‘,vã0h´´h@|–òL옪=FV¿uÐnç¥Ë ÊŒo¤eí^Y½Ì%¤ šUhãtˆy»=öÈŒ·_3?MÂ'’Q×혆š©s0ƒ k¼ñæ•q‚¦Ü²wkiÎÒŽåýfëDmYš4ÈC††}ĬˆPRP7ýzJvâ¶ Ú}v&èYX7•3ô‚€x`–f“läÞ©Åq1ìœ×Úûh»¡Ÿ`FÊ~pÖj/kÁæçüÜVñA•ÏwÕ”÷¨hØ?|t̶Nuó†Óñ¾øÃá^ÆÉ–Ð/LÜÄË´"÷ŒÙø°ËŒËŠáõåqÞ;-.ƒÖ3hÈ=ÓôûW@8!û‘͇‘ þ×ç¶Ù ³f(TÉb¾g|¿Qi“0èù®*Ö[󽿇|õ•àn¹›p§/†È˜7—30±^ÃÂùâxŠ|EUË’×æŽÝ,Lv?qѰŸŸæãµ7ëëLR½t)©ñ«N¶užtOxß´±\º‹Ú´M¼n|PL -º-÷èSþÑâ'½b¡+€Ð?yâ5´{:AýÍT©Ô¼/7à%ÿ„äÜÌŒ4@7#ƒÝy­ÂÒS-(6£Ç†Éá7Ž"ú‚#Kd(­GÌ2B¥ñ{ìü$ÓºÒ¢ÌðǦóÇÈÍwhÉIèv'ì„ô 4@ìÜ`†Å†O·V/áÈϯ!äuV ¨´–}"Îõmà…L…|ý¹Gðí5 ì4T.£ %Ä3ý–ÞFï/÷ÞQS]1°ð»Å5ÔläÉ…C¹M_ëCu(œÜ&ŸIöW¦ê.l¥ëÛ.OO_±E%Â賚QÁM›¯êƬšQã `¬SŸ¹.t+ñúGйõ’ÛSIË;òu!ߨ„2µ$èmþ§óDº.DƒÈ>ÿRÌWwR›€´‘DÛ Ud+’m–3‚z!¸yô˛ό´ Hs›z’½ÈQ4O©´Ë¦ù0mÆO–õׯâ^1Þ½`smu®7—€CæF՜Ǫ—Ò~ÈØšOÜlžøf!ú–¨»‡zV„Ä@þ?h„ã.!fý›jŽ+Ï‹O˜÷PŒ—×ñmô®íkù÷ˆˆ<•ï(bî""Q©I¹ëmsPÛ­ñÚ¶®Bvîfk“P¼Ã¾ußû ;>Pûœý(­¦¡ñ&‘ƒÇͼþЦó Ý¡ñÒ‹9Õ.`X…˜I ú.é—€Ò~-sýô; (d©è‹>`8¦ßpĈÊ2–2¹i.oÞ_‘sOÀÚ!>á9 ´ÄTh¯gpmË“ôÎew=€-}i:àdèÙèìŒøÅ/,æàô É2¿ÔB£û;;\´š·¬Ë(ªüIÀ£ùå¶l–0çäk¹÷÷ö™’ ¼ÉoàÜ-ôªm‚¹÷ÐÙµéν¬Éœ ~Ê g?æ:ÒdÔ–ì’Œq& -AçUçyzäio„ë½Ù4<ß“òÖ0tLÍlßÏfʬ÷+Hó<¡B{a,¾Eºì™³£:xÝäb©GĶ߇i5•E5¦ƒBbª;lUy- +Z…E*~_V}üÒ„`T`iÜÜëRè2D^C•:»4¹°x\«¨¡ŒÊÕ+-´F1HN¹À ô^OœµªM†û \=¯Õ‚}½ÂO”WšU›™¸l¨%öÔ k!(ú¤aµú iS;D@)wm‚Ëü¥dšÒ|é_X¬5:ôÙ÷üîS-É»Ù4/VjžÎµN•«@—¸’|¨©ýðx wÁRˆ³"{F-;‰`‘hð …âÓ&ä<×g>©©Xìšýðc-ßw%ÎbUZ Bëç°«gîP/~@XÝ … ž‰nÔ³+rwAwΕ8@Çðnàp|ê>«ø²uS,èÕìyhñëI³9,ÎóÙÕ lÓ²o±{G»j·à6‡®›½Ðž6~TéYJé‘ÞÞ ÏXäAR)‚0ößxx?iª©)òžb/µ]ˆœ–!òŒ¦ŠÐãæ;ïdûŽĨ÷Z8ÁÑœæ˜="ºRA›_ÝÒúìÞÏäN ƪ;þŽ å½©y’Ãݳ7ôþ<_¯û4Áí/mš ¹Gž'Öã,? Sós‡Ñá–8¶½ Üwogp ÷Z§OOc†gRË¿£êúC¬ú)íw“ ¨©J7ÙÁ|ÙSÅÁI‹WØŸÍŽG`Ÿã·“ —Ë€o& ûŽú޽p2~ÞT}“?ã£jÓ¥4Ö”½_ Ҍǿ‹Àê…[Q ¯¸Àc‰Þ‰òÖh†¬¤~òº†ÕRAÔïÏ•ɲ‡ž®T:yÝ[8‡³Sµ¯ùˆÙwº\î$êÀèÐKÂ97îZ9Â?ੜј…¿¬ kÊNù€„ íö kzZ¤ñ„ `×5lý^ØBnüŠ}Ç(½æpéed)ûáÙX@ÍKV+–e•’‚žtîÜwÊ\6XÖM>™òˆðÌN"|çp€â%qµŠ"aæ5ÕIP…ŒÑÜ–&P»ÌƒmÛ“˜T¸“õªp¨ÁvÑñeGÞ”¯Ñ{U§Ûµ`4iÒBò+,‚®ìV¦¡ÅrV‚Mg=‡ç µÃ3­¢7@A¥ä¡Æ^ÇpUŽË „«âÏ%§²x¹ÂE÷¶}ÊÛÈ©²õ{IEQl ³HïXÂtÍ,ËŠÝŠÝ*MæV„ºœŽ‡8yÁUÂí£ƒÑ /ƒ—‡ž‘¬;öJ]‡€Åв«àheB‚žX¬Ö3΋ŒÐÉÕ÷«pý×B>úYGZÜqŽ ŠÔã«BÏ_ïÙ4mõîÃÁ˜n~ή_ƒºKÕ¶¾J׈¨wÊØ›fÂvÝ­€6ˆ~e‹x¡x=š{NYjá+~ŽÓÁT»-EÕZaâ®.ï/µ~cëLŸ‘ëXz ž4Û‹)µ*n^m·B?ëÏéM+.«œÞzÉWª%Ò“t«BB³CP êµ[ÓJ ª~…™"DËf+_Ê>õÒ&†Y]fûu\,XW14P¸Ïž¦óÎIA µ¾lP* íù¹á‘ü7?vYi\ì:mV ævq(ÒÍìu›µ3Ÿ…}9.Ü•žÞ»tætS–²•Ɇ«>°x  ›$H¬"‰‹oùMfÅI6]ÇiÇÒ3 «Í0å+giâ“g="•dÄlàÀ˜áËkDZ#‘ˈß.>©=Lñ^9¨H¶yh8Õ*©fí½IƒÈÓògø¬"ÕÐH d‰¶ì‹KzÅ9)ÉŸ½+?N‰44& ‰À*fˆå†éðšB,KW®ß§®ºÉ¢nšÀ"Åõª–Òø%7飈+̦Ç)tä‹ë’f=×$cpRežDK6ÔÇ-Ózǽ§ :Ï l1k){y,z¶`ÑÎ\f¾®‹{Á>52“¹t€ïKZ; D›Ö‡¸1óÒþ¾*BJjzxÙžKJþƒS {Ù4¦FɶÊ|â^ûÄW´IºGØYIŸþŸµ„ Œ§!v²0…Ñdg¤;Íû*KâJœ­ÍCÈö]§Ï¶Cš’ ê¡&kô±xŸ“’ô•¬‰Sì¥neœt³gso¶s?´í¸½Ãg éBn¯«6ÜJÍÍÎ|í$ÈH|±,÷ 63ö5y}"I–vÝ“¹m’ü9›å³ã=•‹×.è7GÌÀ…?íhnLäÝA¶u³Õˆk£Œrmb¶åôîfÐ&2øœCg·[æQøêE*Íì“%Ú°!½I[£¦%.äÀjÀÍG:;˜løOÙ“à`qÜ‘úƒ!ñ®‚yEðO¶mŸ)q”ÒJH—]"®i[`öh£–d96£éßý7ñÐ ™ ªÇE '>SýÊãŒj©tÞÖ&^¿‹çæ] N;Ê1¹I‹*úâ×´§M|.4[îÍz,EãM Í=mÜ—ûx˜`ô–‹ýó ÛI§3æIhâ´­ÒÑ;Ò~Fk‚òÖçu1Ôå˜h»×,Ni7ð‡@S€›¤×8w*!½;žXúq®ý> tCº:äæœäÍyÈý¢p5}Aô÷„?,]7vAW¤š†ÿS,ò%X†ÁЧÒÅüµ$D¾h²òWöϤ™6j² |ºMF }`-Î'Á¼.ͺ8®øž¯ú“BÒÉ rq…|Ôæ§ 0D .4x c/*òƒ#ס˜?žñ(é]e…ÙöØåZVȬ­™Àæ(Çg2 ^1*öilHùÿb#Ê®$|äÕ-´ÀF+Å­m&–¶y5"{ª,QfÒò…DHج£ØÑ)Ù¸Æð .‹µ„Þo¢;X¹Àu“åä†ÝÛhË0¶m]EÜ&³4'^ôD´SO¡²1‹ ‘un¾¬ŸÔß÷sØ’¤ G@Îiµ W…”©sR1ƒ¢ª·FzWë9hÑÓJ?›Û9¤>ÅçæJ6­Z÷]Çhê>®-·yQ/”‰A*`è¨O®IÁ@*ŒÞc¶=.ã‘ï¨á7™¨E«˜J&ªŽÛïcà x[¡Ã66_—q-ƒ‚2ß )ã!i…]…Жx‰™ßSóOS·Ð€k¾ˆôR}è2E¨3¶4¨X'¢\zX¾5“‹9”©_v !€+8͘¨ÍK¹%B‘1zã §à/ÐãÖWÐFÏÓ·òí6d!“=\h+½Gžl€ãôšIOÍûXPò*\0N« 6éŠÃ^´MĖ㊕d–bŒQ7#c?L÷‰WÉ£ Ì=Oþ‘¯¾ÕS]–M&ûÀa:9ê )µ³RÏFÒÁÏåîJ‡ Ae»olÊ¡ ï‘ñ[4Ñî¡Ý¶´¿k&¡†Ô×´í¨‚[0Pý¾\pÞŠ«F©‚Ø÷Ü…œXüX„r¸ÕI÷ ûrTØî3•Cl«ðBþ+Ç„BãpíÊ­Ã;&ýS_·ˆ‚G›£ZƒŠÜÒn@"£uAGwø¥™?îÊå³…‘õ@‡@pÓô¸öªHaÒ¯º YU+… ëúòØÍ„%v4@BW”Ôk%cّܲ 5¥ËÁ”];&[`˜¬Dø¯ÔÅm6¦QÙy†šÈ¼Ÿ~/²]öú²1Ÿ‘?Åop8´_½ÄÃ/Љ³™N"Mùä(Ch/ºv.³ÓX¨u­¸{=°•™ÈêKŒ~‰n6·d[<ûv't—øüZ÷3~5åH-[/ŸWGI®­ú&<ð„©sq†ÄRSÆ ·ñ{¤qJKçIuxó»@˜[…ŒLúxñÖ’LÎ…%/ÔÏñƒñR*8Ö°añLÛ¿c×dî:r–BÌËv©ì–Dç¤è'½A!@7®—­UïÒ¨7ê&“–ï296g‚¬+øN2ž¸ ªÂÇÖ/Š\–ÿɱgÜül>ÿ† —¼ËŠ›¨2Ù”gç缫KÀsÏ ŠÍúWi0‹3 ý÷ø‹'”õÚ˜H% “•Ä…JLø¦h‰c˜£ñ;©ðf:NìBì²×°Î·³æh‚ŸÐ8ýÖÍ#¦˜¹ìŒÇ8'‚ö!MºN6¶p`>:Î)¹J¤D¬YGÒtR¼‚$«ó¾UXö®Œ 0À]«ÜÀ¦¾ö½nŸ{'ññ!ù¸Ã‰-, fmXêˆPuN_ÈÒ£Xö¹5×q°LÜù†‡Ëì”t‡•¬Ö£Bì• QGF×¢ùD4ª5„Öò.õkßGÿÓ«„™×O4'a‰ŠDì⻹²l^ªr‰±ê7º‰üPŸãFeï kz0ºÀ^¦ú‘ëãØæðz  Ÿ0#1¸tú¡ <ë3/¹‰|é°­»q²+þÅ_ÙŒ±©c@4çÿº›“8Kž:>ØgYŒs†@É÷òÀa%ý±ýã<Ö¨äˆòÆSsn˜®çÃuŽ:½j´)½{´ ä—Œèöt†Èdß(¸@™¯]9½ÈSìÁ(Á„Õ¯ß¬ç·æ÷èIÞ¡T'ëØ3ÛOÚE—LÇe¶¼)ìF§ ‘˜_ɬ8dá²Á9Ýú§i;mܸfE’{­C¢‚·Ûc ò¢ï^vg­žËoÚWx ƒÆ¯ç[3 —¢i¶Q ©BÄeûhoE&ƒÆõÜ•GÃu$!ž&)øšT»_bÀ|I6¥Z*w¯3F¯‚ ÜUõX¬Hy6‰½Þò×vBRê°‘qX,nM_Àc_ÿGX´b­P/ðšRߨW·31]f†Ï^5,Ds‚p=¢MºßÞ)ÞÍÉ}QÙs¬¥ÜI6ìÇóò‹r>£”`÷Z,|ÌÿXÔĤV»!Åz!¦ ãá‡!h|Aj|Y"@O<Å”!s0@ ´¸2ÓCÚŒè|+Γ”Ï÷Ð6•ÕGâ‘Þ.¡2h¤Ñ72CE ©vB> ¹îîùåU1b%Gõ!®Á'kNK÷P&#¦_>þ6-Ô=i‰¬rzW%©¿e±[ô(ƒÞvžÊËÔ£­ðejŒRºvó¸9rMWPÚÜBÂÚM1ŠIygÇQòåÄÝ÷Ĩï3±žƒŽ_£SbØÏÏ‚ZR͈Q/§Oí%—tt:b¨/)’¥°c TXs­×=Ã_QdJwL³ß 4p5ív^ñG÷à­Pví÷øEñ!îx2È ý`ÈHz\o ÎcÏò­‡{_$ï=f…lœggÎ/F6غo‡úîÜ;P'@Uãë~óµcÔYɲ¤¯ô&sódû¾X’¸BbOøgåDíÌ´Á³µ­tJ‹6þ¸ ô6ã@ù†¨å]µ„­ØŠqŸ#·Àéσî"VN!ó'ˆà½«êïò%BK…{Ò‡–PÓÞ“IÒµ¢–A—J­3˜¾üÈíDs°Áž­‹ •)Wå:ímýMGs]ÉãN{—ñ}ï=¸A±±„ŸÁâŒÅûL˜þ·øÛ¸?ßRž_/’RáVÌQ¥ÇÃOé¡Fü$²î˜ ãN°Z©í¢êxýÁsÓyRcAg#tücËHÕRëR‡ÕÕ·LÂÁɇìY –›üÇ ÆMH ;_>_¥þ´§v+¹Ä&–,$ÛÒÄæJôÌa{Ý)Ë/N´'5/™W$—Α(QÓ±VmŠp=Yò¾Ó¬”ro<ê° rüOððÒ¹|$ ¯æFŒ,†Œ¢“‚ùÔïÕ–{(ÿÕ¦²Ì¦ ·òÑ\P¤¶õ Z ñRµ‹öê#zQÙN›´‡¾C>Ϊ~ËÝE– ¤FŠ@=‡uNovìS¿Á´\Ô¡ç½ôNèbšC¢_?9Å ¸{£$h,ò7Õ…3%yz$«{Àü(+$R£õï´…Î…ƒ:cÖ©Ðòœš”ÉëV_9I%‘`›)OÏ9ðµqz°§ pK]‘R•”®YÖBÔ:ñΤ‡Xï§M´kVŸSYš§ªZ}Z]\:vQÒ"øq·5›Ìoå|0íŽÎ IïIؤÊ„ÔkcêÈ(¶!#œ¸(T ùðuå².Ô••S ߥaX[oò›]=þËìóÃ'¡hW¯ÎŸ\] ¢lȼKuÁ·¶éEòs­µœ©Ö?‡ÝT½»=ÞZ†ç¢±“Š72{óþè‰b Ì­lÕêÅú®F†¾šÏ'{;XhÞ)·NP.~»æšªf3ï" èºO®Œ˜ŽxhA†úËÍT(Á„·Zx·”åUêWÂù‡¤Ý!fIÖ7XF'Í*ϼM2õÖØÔ¼¾¥Ìö3@ähýšMŸªîf'S=¼óÌîíÊjR #·ñl úU~Õu¶SŸMn@(…©¶¥;ªÉ5ð½Ï à§½pZ^ìôâý,¾Ö¶ÂºÒº-"#øÂÓ¶n?>‘ô¼‡«àú딳9‡œe"¬ÉÒ£làU5ó£È8ìŒë9=¿ßÎ?°+›|Cæ±Ñƒ˜Qo¼êéÇçAþfÄ@æñRКÌXú>7""›;ÖOëÛ8{(Ï'à’x€•Š1ÅòX}[êéµ§'V`šÝèOå¥PkÊÇŽK:b?TXÇß‚ý½¯T(ºâÇbjaçÈ9沌ˆ”¥]V‡ÇiöR)]ñ¢ª‰±Rá‘õCåNS#XNW[¯GØcòˆµj6˜ÎÔT6OtzÛß"1JÌ3¡›ôÊh~'hëMœ¯¼ìbt¼?·¬q&Æ,g™Ïè&WT+¿¨š¤¸Û×Q—õE/ GW¯þ×Îêúˆ¹|0ë€P Ôææ‰l©3R@;ßò{â²?Ž3áàó×&·'ÚšTMV­’ÏO˜*½Ñ!á¿À‘GžŒ~×”ÝÕ^Ès&-Z×AãÛIbcMÛë„8]3æ5¡/)Ð;³¡‹hͯÙ’ŸæJן×SÛÜ~ yg+¸[ç$* Àˆô É'L(}Oˆ™¡f½ØêRÈ}O8ÑýœDÝm åÑOÀV­€\4ÓØ'º=i© AƒÜ 3š¼~~–[ÿ3Ž·8N- /Ø^õ;eÒäЦ§“©Jb{åÒ1zBôÁYa0Œ¼T^Ö7LA’ƒ_Ã76±<Ö³É_ î'Ëà>áY‹,­Ü‹*¬¹°ªˆ¶Ø/QþV…[h¿—¬âÀåý´€¤…›èñR¤ïL“-³ñ*–¾eýk¨ïO¼h½ìÿ+þ§Cõºp“i}Ö&ð«×|kÚäºvæÁ¼S~x‹6æ;8¢¥Œ’í>i&²V~øh¼kWEø“"«ÛD9t¯ÊÓ D‡Ä¼Ú»‡ß"…À²‘—üÑþù´É}Ÿ9/ ¡áŒ. /üW¡ø>ØAM#$Ò¬ÿˆq¥ê1æíÁ„>ýÁ'[_àÙwNîy¤¤ÑØìÃ÷mmä™ÄæëH>‘OÐssf4«6ó\í¬Ê=xñÎq“‰8»}«ý“¬ºŸ.üñ»°w ˆ.ö¡³s¿ìmïËÝVÜßëÅ%ÓMS \“9u Úð‰I‰ºÙçzœ1"Xryv1g}Sí”;®¼™2ÀpÇ e†j‘|˜-§Ôj|ÜÆƒ!+k;Øèã½Î2Ùc8Ý&ó†Ô/yE_f¶úDJ)t¹½ÇRt;•W;aFü÷4ýnÆtØó ŽbzT®ïCÆíÙ¹ r’b¤Û!!@®¤„ÚÏ;ó4*?Œ“7«xË´yfW1Õ®ï(*[Äуû(M û‚nÔâ z»¬wÒ^D‹KJo(bgo>’hЈŸ*NÝ-ú’lòâ¾gŽ•Hy ïlÌh~ûiü­ˆ/'ËtàL÷Ê?êm.>ÙïIm‚e",„Ááùû=¬¼Ld½Yºªƒi¬Ñù¸^ý¨Ft«GhÌÇÞT ¼!‰ ËWÕ\šˆo°ú *Ø4*f8¸Ž¦ûÇÚ·JEK§ÀkF‚H yy¿¬Ì]t-òZ9JUÍky|s|Œ?ªšG»¸ù¹ÛZ‹RßÇ@è\Eq¤/$@õü>¶®[½ÞÚfn|—:@ÇB‡ý*u¦£„DO 4"v/²*rj̲[{Þ•LÞ[ȵYÑ€+‡ U%{;¬Ž Ê}áRî+ðpˆ%1<$Ù£â®h”ª{Y·/€jÉq¶hþm'AËǺ¸ÅD®†|Æš#>²C¤ÆÃpåÚÑ‘ic,ôç Ÿ)ªEúÎÏŠSŠÖÛ4¤¾dïa -îHæd·‡Òz…Ñ‹¯ [0½ ߽زÑÝJ‡DKÖûhµÉ©ãx‚ÖŒð‰$ÏÃtqóKÍ §Æ íÈŽ»ÞÃþÜþÑ.G¯•ó+þÂW;PMRø(ª…ðš >-º}ÇeE„Ùõl,*H‰6Ø£èu3¤]РÚNƤó\5,Y)Ñ·=–çèzïÔ²†~ßT}Úûujø¾#h°Ín¼7F2„•˜sŸ–t¯•ŸxkAi7RÑ:ƒž×Ê™ M‰·&½Ûuœ)'Å5z´ú®‰»¤à™Å.†÷ …òsÞŽpH"Ñ࣭ÊV•òÌ©h¯ˆÍï—ìû ƈÇÙ÷NÆÔNïk~ù X'z5åTd)÷­}< _™+=|TÃ)•÷n{WGÛ)µ%‘[ß\èˆgN=ùÝÙ'+è8¥qÅڟ脪‰c»Ê}óö7¼IWÍL 9IïÝÙº6k’ð|»njÕZYO5<³|¨ó›p¯¦Yx*ô§ÑÖ´™^øuÛi2*£ ξAPá¤X=£ºr%YTõxÑ¢šò-ù‘ Áz$ð—ouú}ql  rƒi6lº‡Ïe@ wAœ?fð»ö&læBý–…Èa9*q†¬ÀŠœÒs(ÊZØ Ë)èqoî8±Zw~¤ÀÓH(§IFú¹èdª\âÚ$üf¨“îx«HBnteÌZÐ_w´'AªÓÞã™­*à“sgYòFs%L©3‘údÿïß3ˆë*Mă¶6Ͷ3|Ú¸—ЇÀý”D³Š†õyžìªû¹dNþ|,Kv×ÜVÖì´ŸsϨ’ؤ¢ÏhÏätÎÌz$·¼`]fÙYc#xÁ-ñ2æV®%6m±u£Ê/pµÏjîeѨ>ù£¯ËäRU2Â7loÛs¶V’”UhE ÕòcnœUyæí†ðœ;ƒÏ##mÐtMÉ‚ q¤ä‚ïÌËp”ƒ3™"ü‹Ñè2P¦™vÅ"§u•¸ŠÙÐ"¬¦Í¾åµ›.yä\²-¿r†ÞãóÈâµÇµûŽHnçmh—ΰ#ͤ……Ș4ÇÚ{m½,|Sø=ÊíçYî=!þÑüÁ“‡‹*æiûöãj4ª¬´µ›Yò=JÅîåŠà#äV¥ÀZ  nõðbD

>ü0¼ÉY}÷-ÃõŸÑ²¾â‡}Kyò EDzjQ?Æ®mÀX×h‹øˆÈ,¦½v3^™vO‘L£hßü©&˜¶òs‘Lsë<¥ÒnB•/¸ü9Xj+Ù,üê{šªð¯wºÆ_Ç•_H&w€á8¼­ávšrDK#ÃzâŽÐW2ø+v/ Úf®R O j¿¢h{gå˜Þq´—/&… `ŸS$‹#Kg±z ´¯¥Mç}†ùýQ§m㲈ó¥·MS`Š2Ažè9]‘?J nþ\¬¢·5ÝM‘k¸&É×§wx…¸'½à)X‚Ñ…íÑ£ªG<‘þi| ‰›…­õ8z$£F–cÙ¶äuê ?!Û4°5aã[ç‚§OŽi¦vËOá®'ÙŸeàÔËË Ã5÷8ˆ-H"CÓâËÛ켡Ç$M¤ën˜'ž™jŸé|ÂÇ·ˆ&9íS ÂÚz4Ë-ÑâíÉ5 ¨ q/D—¼¿V2“‡Vý/°ç–êüœ´3¬¤›ŒTƒ¶ß¸þ’"ìÞaL$Ϥ“ÜÏ7òªäV’YÚp„!áiä`‰Jà·Ý7­¢Šÿš?Qž µ4¥7`2R|‰~BAžx_  Ò¡–0cýMÕã:<°“]Ž4‡öÁÜl9i˜j¨¡“ÃS'QíýûúKR×#“\ßrs:aâêšÆÁäô²‡j³:4yÕ4 N©ô9š–*´ÓÜù…zËd\KrÓìÆ«¶¼ðù>nôöía·0yÔ “°X)%bj!T`ôE’o²H|S¦â­s—(à@S½h,Çbé±ÎþïJ¦¹‡@8ý9^ñ²>U Þô =rƒ}ß-’@Õ½¡ƒZúe´E~ÃÊHöî¦åo bí*‘Ê×D†¤&ý¥30¥ÌQõÇï¹21´¼NË HN^¤;æÆHÌxÓbgñĸ¯œÇ¬{¤Ú.êþ,²U'Ý¿.2„1˜·Ðé–uAX"ݾžu̯”‘};1E¯ ˵{HÍ}G¡ b0/cåŠ1ýŠÍpè}ðÒnŽ"-.èÛ3V¦–hMN1AðÓ:8YרlŠå¿‰p¥F_Þ})‡úyž™³ó p_LøýóC€²¡Åt­>!ox1 gxÜg»ºÌú±Ïö˜ýT¤F½C[èa6ƒQé•ôé–3³2Tû2Ýu+H2âÔxCò©ºÕ¹èŽSª¬}Ù<¦lî~Æ}‚6ÍzÔ¸À“+hy^•ê-‡ëäíJucÐwYgâA™<òh>| oPªŸõÑr®d7¬Pî –‘µ‚åΉL6Ћtb%`6vMŽ÷§Þa&íH ðJ~9#÷H´õEᜈøpÐKž|Ïí¼Ú’zn8îv„uSŒ°‹ÈÈÀˆ£Xw¤ÝÆÎ,¨‹W#x{Ÿó¬Ñ]ÍXÑàŒ‰ TîIýÔӵǤû‰…‰jë;¡!­/¿òÏz§˜.»f^ÎÍcˆ°ï>ˆsRØ0rÎÊ–Ææ˜ìúÅãH¿û-WTˆVW«*©Ñió)a+bÌšÔhþ#ðA endstream endobj 120 0 obj << /Type /FontDescriptor /FontName /RNAREF+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/D/M/N/R/S/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/period/r/s/t/u/v/w/x) /FontFile 119 0 R >> endobj 121 0 obj << /Length1 2497 /Length2 17562 /Length3 0 /Length 19013 /Filter /FlateDecode >> stream xÚŒ÷PœÛÒ cÁÝl ¸»wwwÜ]ƒKp÷à®ÁÝÝÝIp‡ ÁõÎÞgŸœïÿ«î-ª†yÚžî^Ýë}‡ŒXA™NÐÄÎ(fgëLÇDÏÈ –UQab02²Ð322Ó‘©X8[ÿ+‡'S::YØÙrÿa!ì4tÉD A†²v¶)k €‰›‰ƒ›‘ÀÌÈÈõ_C;Gn€ˆ¡«… @– eg t‚'¶³÷p´03wñü÷+€Ò˜ ÀÄÅÅAû·;@Ðèhalh 5t6Ú€ ­ÊvÆ@gÿ AÉkîìlÏÍÀàææFohãDoçhÆGE p³p6(€Ž®@À_%ä m€ÿ”FOP1·púBÙÎÔÙÍÐ ¬-Œ¶N [ #ÄP–”ÈÛmÿc,óZÀ?Í0Ñ3ýîï¿YØþílhllgcohëaak0µ°äÅdèÝi†¶&Z;Ùü ] -¬ @§nT‚*ü§>'cG {g'z' ë¿jdø+ ¨Í¢¶&Âv66@[g'ø¿ò±pƒúîÁðÏáZÙÚ¹Ùzý™ZØš˜þU†‰‹=ƒª­…ƒ PRäþ·Ì è `cddäda@wcs†¿T<ì+™þƒjðñ²·³˜‚ÊúX˜Aÿཛྷ ]gG ×ŸŠÿEðLL cg€ÐÌÂþwthú :G w€6#hü˜ŒýýûM4a&v¶Ö¿Íÿ>b YA-YešJþW)$dçð¢cÐ1³°ØX8ì\ìŸÿòoýÿ­ýo©‚¡Å?¹ýOÒÖÔÀõŸ@½ûo®ÿÌå?KCø_9;Ð4”¿‡_‡‘ÑôÁôÿyþvùÿ7ùEùþÿ›‘˜‹µõßzÊÿüÿè m,¬=þ±M³‹3h3dí@ûaûMÕÿYgY ‰…‹ÍÿÕJ:‚6DÐÖÌúßFZ8‰Y¸M,œÍÿž˜ÿ(ºµ…-PÁÎÉâ¯û@ÇÄÈøt •3¶Ý)N Ãú[mÔÿ2ŠÚÛ™üµzÌlìCGGCxFÐ|1³±¼˜@;jtÿ{´ ô¶vÎ ¨:€©#ü_GÊÎ`üKôÄ`ú8 ¿'€Aä7â0ˆþ‹8 b¿€Aü7bÍëoÄ`ü@ìÒ¿ˆ]æ7±ËþF v¹ßÄ.ÿ/â±+üF >¥ßħü±T~#»êobWû@ì꿈]ã7±kþ‹¸@–†¿ÈÒè_ÄÄ "42tü­µÆÈÑÐØ z ™:ÿ–³ü+ÿÏÆü«qÿ‹Ø@Ñí¬AÃò_ +ë_›ßü5E &@%ðwP•Àÿa`ÿKïàZ½ß. šþvåfjáúGŒ¿Ôv.Ž8€LÌþ€ ¤Ì§j³¹‡½9Ðö ÌâÊÊòj©ÕTõŸÙZbó‚.@†ß‘Ù@®¶ ÍùWÀb²u±1úëÎ2û#ÐÕÌ`÷;GPL»?¼˜˜@5ÚÿVƒ8ìAÏOÛÿ94V¦¤ÿ{d¬ bìAW›ÝïC`õÇÞÚÅéwV 9¸Ø9MŒþ¨Œ $ý£«L Ô»°ý…€®t‘ dîzvüv1ÿÎtÛ28›;ÿ88PÎnv8€ºåò{Ö@ ¿8Û9þÙ Pÿ]ÿ€ ^¹ý1â  ¿s`ÙzÿÃñ?7•±‹#¨UÎ?L@רñßo @ ;Ð~eÑΘ'Ȳ6¨ýþ› žÝÞä§9²=õT*:¯Ç—Gd˜$ªêÌ€ Ç[Á¤‘^ÔõQÊU¢¯“–z˜ÐÖŶ'ïgý8¥™½6øåiìÁ©‚Áº8|:}ïo5+Èð.)²Nd…<Œ{·~q÷º²µñÅ=Åýjvi„ç²Yº(ÕHÿây²\£¯ ¸$ÐÎt°Ôèî(ó7·sèÙSoDRq4ð>§Q,…^Z›ÌÑ žß+T˜ºß“¾×Â%€¼AŸ!÷:L–ÂYò*)ŠÜø´”ÅHE¶1>@ä=ÖE|Æ­-#‰ŽÃhí¸Â%>NêÓVÇà¯Ñ‡—¹§l`O]k‚¼„Kcêæ&&ž'ß\Ô¯·? wæHc"ë#çᵿµu£yr#}rV;¥í9ªmº ¿µÞ$ô]ä%ÔÁSÿzŸ³Û»À2£”´Æ«ÏrêÔ~Î}ß]¹c°\ô§ 25ò„CÍk} 5ômnJQÇ—»Á —`ÓdXÝáÕª,8,È HÇÆ(Ô›$ω’Dèe=\¸»EŠÜ…NFÁ5··2m “Ó®Ì$Ãz½ªëå7SJ“.­Óý2Ë«<§ÐÜý†SQøé¦l[{¿/aE÷ÛÇÏ©ãZs=ZË£îÃÕ‘µ¡5Cþêä"ÚqsG`äè {­ <$\ømÁ >>q]}3†7‹–ôú/“Q9«cD ßm÷£ôŽïÝbFæd›æ¨Ýmš°÷5«R0ÇùNבè÷0*bíM½Eº½Ùʲ¾òè3Twš{OMÓß+ Býù&=i“i}«·N®¾î‡ñ}È‹°)ïâÅF¬ÿÃ÷ór‚¯õ)]x« i#,±bÒŸ%±C 9°U8×eŸäÃéy¢¿ÇFJŒÒX„hÔdñøÔÆßgaî[hj܈.¹”µç³ µÙ¯Å I¶må†+°ŸKs8ì;¢XÁ%ÒæX/\´O‘Ü4;ú’Ó³ö¾2·k;OÏŽŒ&¯æGÖgò›_§…7en½R¯@úÁ› „“‚ƒ3¾pû£’ä\–RE—z«Îœ–žDšâ@?”cˆ48ߣΛ¤ôç|ªÈÈd›øÕîKƒ×XðÓ’£‡ìÄBà-{cê=øLؘ Ø´CØÕõi±£š»Ø¦DgÑ©€Ù¦ïyH3y~8LïûòkÅô”ø“é¾&}½ê-rÀ‚ÑË$~Š„ f2s»;`îÎee(ÊÉnfé(ßÖùÆá¹fèy<ÄDõ¥‰~3íâ—„¨{€&EëpÙÝ1[˜˜±ï'[ËNæíŽèEcÌÃX7&ĨçûñC?£lIÝÐÌðæZîèñ]$ÓÅÜÒõ㈄½ãË¢§S³S².ûÜ'^‹K"yBJ ¯Ò˜…Ú1d·òWå}e`§ÈÛåØ ÞvóÔd÷¾áX¥ŸÐB‰Ý\Tk܆T`OÊO­¢lh„“•7ФØÊdpy¯±Ô/}†[êÃþO÷S-d(ثЀxâ{:Çøq•ܤlM ?(” !Z«¯%䨾“å¢$.—m+š›¥ç|h3z„`õ”I•sÐ6iÒ(ÒÛsH|Ùh™¢› r´Ü²‡^áÊ,âÌJÈì:Ù›üt zØQ~k‡7¾bØôæ©}ïî4ñ²¯ž¬ ËJÜÆWäªTí'Š *+¯·Óe¹j wõ1¥Ìf܈·SÇÛúýGUfÁ*Eº!F¸Õˆu}-sÝÚ Þ J¡`")öz 6Íõ {UTb$Ëm%¾­wóÐ:&⯢ïúr пß.îø§úÝ.}P”Ú‡m S~‚*×djÙ¿-ÿ’£Ú5SQÂp*ÿøNžÌ€üß+ˆWz€›^øÔbBš+¯Ë]b€Ãu[ôyžÕ]Ÿ0l/&g¥õ9<½Ÿö:«ØdÛšÂhÌè»m²Ä-=@>áÛ!çÀœœœíV¿øÕ;— ¦¡šEÙDˆÎë³§£yHz»³ÏÔýÉè[­(£]@Lûû±x¦Ÿµ>v(~Ò`§”Éç^‚¦dw øhˆY c>ïQ½Ñ¯2ÑÁÐKôfW‹)ŸV™º\³eÁ5ž—-c‰Õ ~Z±}:$ÏÐÌ=µ \qû2æS‚û5ÄU¸:Bè¹#Uó#êÈ@,p[ Fž¸»üÕs0w¨/_”žŠ3_0ÓÙ€&eÒîxå8¶ªÉ/ÐÓ`ŸØûÕ·ÒºjÂä@! †ŠÞYßÜ!né5Œš2Çá§_k_5ßAÖ*ÜË ÑpÌ&J¿—¼s£6‹wÔ›##ä¯ûÁå×§eN˜$õT|™Žöh¯õ3ƒZÌ„a·D<ï¥ $q©7O†¦ÌC ŠN-Ò /+`i˲“œQ›Ñ1ƒZ¨ãaÑà°¼^Õ2ö?ÐúîÔ¨È0з­F×YƒNÓTì ž…m}Xùš´Þ‡¿yµ9âô¨j½q‰–e/΋Wm¹Ä±r­òmؽwèœ`(Øú|„ì¾£ìiÊE´TÁß­qIï2,än*n$úLï¦ÎóœfGÛ ‡S($ce%ÝàÃe kföL n}ä]NÞŽç7‹‹,;lH?Ozû… Ëõãz#ß)‡ê©ñ‘ïD_#L9Ef¨m³ÊtÚ$SdúA‘úÁòW˜’•7µuÄÒT9h®·UV´qÊ™Þ× ¤¤Þîp’JÏÑmd;ù^ýDï c­W|O¡‚ý@&-?A¢ï›†ù@÷ä=<#þØ>’I¬$ð·Íîà󟙋8_ŽTŠÌ„ê­¡0V¢¸T_ÄŽ¥ªùIеíu{VßÚOšG.÷äLvÇ—\†¨BpúM-$xæüè” á¯ó{„HÀyæ&”Žà©ºyÌU#×H º"]åÆ1á²ß©Ó3Iš$\”R¢gצS¡>c%ÎŒšñÐ3 mx¡„D¨„­>•Å(Wü8hç§BbŠIżKyÕ(&Wêì:AÐ-a–ñ;éc‡B¼ä7§â$Çb2D5 ¼MN Æie k¸pFm’刀Ô`÷ì`Ú e'ÅjòyòWçÝ`²Ü³Øæ`?x!íd­‚«¯”ÊìѺN檸(Úµp¿útéCÐ Z?VB¹£<:6ÁHŸÐUÍôƒ Áä ;"ðã¯QIè ž6?]ôŽ‘†Ël%ð®×¤çäVIHÚD’aþŒ¯ þ·;FBÙS“ÃÏKœÞëkâSY?¾Ÿëð´J ÂÛnA3‡mT»iLBcæ0ósobm¡µ$ï¡b;$ìÛÄæ'k™¹K2 Wîj{¦g'À‚}£æT)"§ˆ–tÁ°Aý§òAì®7ž.±FppîõÆƒß ×ÐÉ»ð‘%O¡ÑcÞǬ¶èó¡Áú#1)+›¼»ÃÝÓ$ýl@UÐ[y3Ó»Äý.ûgWš.½ºî´˜d•Š•ûE†¥™Q–D‚ ,=%7|Ïöyy&>}ä4D Y½CWÙ5¶oŸÞ‘§;íª—^ü„±®cÆ6»]USHCËMîð g‰•uá—©%@’<ϴö¿.ç)¦Gs“P˜Œ#’Ÿ×'ÓîÆ R €Øý€õM Ùu2úcÙ£³‰Sv†0¸œ§qc[zñS›øç ßåÞæ, à˜9‚`Þ¤<|G×ÈÉ“¢k˜{oÊP]°¾,—þ¢ˆÍeã“¡ÊÕce‚D8g‰æV¶m3Æô”×s ?Jûý#l–óÛ¬Âói¢s?V^±”{]çÒðœþÚ=ŽŽ×¨Ë÷7m¬0<¢†âk²£–ž°˜ç`Ž^GÛ€9)¢†ã׈©«´—±J«ŠZ„ºwWò–])ª6V÷iêaÔ¦JeÔR"¨ÊîS“õl”I]jª]ŽepÖŸv3õ¼@›|”’aÂæÇ­æÇ È0*WìAÆ?ïl15nšžËv¬ï¨Fà5³þužǦY-=õÉ_yïR÷Ä^ ¬ÀO†mAÂi3àéfkð˜áj»5bÜJ ÿ»Ë¾Ù®oâKnÄâOT Vë¤éÄ=‡ê.}yÉŽ÷S ^±zPžt&ޏîH¦x¹ãDèR3‹—÷AKsÝwõÊ_Kw(²?àyz½o91j(œ3¶R0‚ý<è¶ Ϙ[ÓÛw_4ቷ#9WI„¤Ø¡TF:G[HPrÊs(VpºíO.š ÍÙS—6ô, ç¦z—yÊš²¼ÚO›¹iQªi°ÑB \ÖÕ¤‰r¸–+ núú¹¯Ûs½•÷‡‡¿ê¾ð´@HŠf~^¶ˆnëØ†Ë×Iö'ù£÷¢ô*F Zh -ŸÓÑôYÂÕòê¾Ï®ÇcU:"‰!À.¨n8¾ØBFF*µ ‘J‰Vï!ïÂjñV×¢|:ž–Øä0‘ïËß rP1Œ»z_½^‰“Åí„CãJHM"Ë;M˜êq´´mÉ%'©ó.u-Ê|á; NBøÃ® ¡ÑCtÇvÖ¥„÷&e)=‰®Õl˜uÇ­™l@¬~S%š&ãO oNåkqœ¯éóÓ66~ék<¢•Õ2Çýº™Þ•Ê ½ßjB›o†»`ºŠ/îÇê‹÷¾u· ¢”Y ßÔâ=¤í†ïJ®‚”Ù‘±Â÷/€?{ºˆYÀý`…4UÌPS¡ W¡k|°UrU S'ò˧ L±2æÍ²‹Úæ_/4Šôiœ™r™©‘½6JîÏwŒ—¾åÄ•—x*P+Ž•¦(/)í™PXËá,ÇaXŽ„–bB¸u¸èCââ3nà²êwÙô}‚d8ÜðU¼¼®s1½Þ΃¿¤„“ƒÊkÛæÁp°,»L£‚>IŸ«¥ÉjÌDš!˜vÌÛn+e'—˜NæZ´q|çÝÇáX‹þKüŒ;ôJÊñµ‘÷e¹™¸^o}Ýçjw…#h=?éíóïqz655ƒEÆHî›I1ùM›8SVÓ7|ÐZâ5ÆvíÃXž3)¶iT‚Þ7Ÿ³Ýï¹Ä:ã¡GI˜.ðã穉;°æ`ð\rÎhï ⃹Ú\,Œ÷&v¥üÜർ{0ß‘ kÏZ„//fIîÀžj7;y>°x ÆyŠmi²ÞªÃ,+ãKŒ¦JmgQ}~Ã$Ë,6ÒîB“çï»àÁÊVr Ýh­dËç'ÉRßóöãY¨’dÿ‘¨A¡c~(ýpíäÃùÞKQÊíƒÔ±3ŒÆf4–‹K¤: „J†[œ‘7áç“ÇxÞ#æ§nŽ÷F‚>ÁþÙi e4æåÙžP) ¸‰¦æ/; ê»êãJ[Á±.9Í"%ÁIoÄi“ÞÆe <|Ä‹2qFù©Œã×ßýø•œþƱ%@Ì)4Úm >B¿ŽawC8…ݰàæ /ݤÌ?Á¨Å[FÐ~%«—e' ±µxžˆÄ«fb”FÒû<´ÙäGGŒÜ¹Ék#ÞâåaÆÈÅW\OBÈtTt¦S œ¬lDTvB’TiŠ\˜w½B_6äÁ)µY¹Z“zWZÜ2:Ø_tÀ+ºƒÍ8ÚíH<*†Õ¥¹z^d ^ÃV.Yc J†Æ¥Fw©­üåjÕ†îX„ˆ½Ô[ØpC¹àmŸ#d÷„…¯ó¾T%Þ0Î’8¦ã9eL* WíC|êõE|Òžš×ã%¦+b"ýÆ&“øC M’Žï{!Qò'S¨ÉÇLt)®Ÿäi’1ÁkSfÑÆÔmBhà4%•Xëbê¶&!²>SJš.iF M•®éÆüúf²VlZvývß1wñK²ëgMsB ?ãlœ‰÷òÍ?/7œL„Ñf£æT¤î˜YèBˆrb4ñC¦f/†É1ØC£Ln13[@–<:ÁQ2h÷ ìxóm€é:²ï,hÜ ©7ÓB´ G„ƒÉcß~Q<ý¢iPr` ¥/T½Ih^<ïpy„Á‰HÌ3B55„×EÝß%#{W1t~aÔ•X$+ý>ÅÐËÈN:CrßvF5È®ÏmÁŒàŠ%¾g!Ê;N©Ó€í¢œâ±e\ùqÑNrQM§fM×bQÅl8"J[C«AÿÔ2¿*ÿ5‘­ º„BŽÓ E6Œ †F”Û5>|”$²y®ì¼Ôw+Á°È›gJ1Ú Îñ®fruu~^Jbä´iáÀGÛÿAËv” ¯$ƒe¿78=NYXc6¸l÷T„ÕøDzªôÐô–Ýðº^ñø®:›r[ŠÛزŒ¥(À”^.¾›EX8–GuÔ•„×{¸NŸëS×|¨aüî°æã£ìX[xã-¹Ì¾­Ë×"_ÜBÖµl5íñMú<ý`£ãRçÛòX¦cúFŸ‘Å¡¹ã™çj¯Ýr^Þ ×Ó»õæ ìqÏÅëPÞG„ °Ëäáéüï`\ãŽÐ?püI2œÓFSI=ަËsÕNºêɸ½‹³ó|ùßw!³Ðn|‰ „â›Ô© ´„G3Â峎•ýýàNëŽü cpZ&»[¡÷”ƒjØ&“îè|8¾ÀÎb¯ÐõdPã4K WÅx1 ·„†§nh ÔíÂT½w”£‡Eø`›ŠÎ¾C„Ù“Çe±Ã¶a„&ò"wWKDHá&Ó‹„¾G‹^kI’t¦îZç!;idêšÑRð€ON»"Sˆ:ÓØ.®`|ÖEžPªÐíÞ\O.‰Ž›žövRcñ‰e,%çГ;@ÛNzüÈ·5£[Ÿ{ iíZå¡p½òl9§MàŒÖê9ã¶Ë3cf\È•\}¤¨ÌyŠîõ5yá«f…«–SË©#M†súKè>UÕ† y„Œú¸â<ÒŽ GUeÙ­_“ÈÒ¯¸‰¸Fú°îö7S@ªhÆ õ6<Ê7ÙÑÛnüêË6©ˆeÄ EP]˜,-î˜ýx¼ÚŽ€Ÿ»åP?¿ä¼?±ý®—æÔ:­—"ëÕÇ%š0Є9ƒ1Î9ó]hÇ™wUýãIºÓK¼O/ªÿþgÝ)9Á—wâ"Ä3ÓÄ ²×Ù´þ¡ûon½+øH~§a'}cu´Ë]Š‹;‘õê}eàcÙïbËE0 «q𜣙Ïû êÆcÌìÑ¡ÈùRÐÝOÕÙ0¹ÈÌJè­¥Y$ ÑßÅTö¦ñc|hýüð UE+ÓÜž;5zY¹i,¦ºÀž÷HÓT=:Z@Gv ñÚ‡l—F6Æþ\Áx.$_*¾QQ¥âSo cœ÷µ9?ÖÿŒµ¾f= ™¶Îw†vû*ŒHºÖàGÈ3޼´¾{XA3ÉšùËRf`¤Ò›š+Wßûèÿf'>!I3Ë–üÇÙ ¾ÕÍŒ‚ ÓñR=~Âæ¼Ìl4&ËÆ’‡xĤpêEûWù?>ÀcÒàâ l_í^ï­ÖŸV¸™^yEý·e7ú^·MU¼Òû§>AC³½Úkh½“¨ddWïò£Ÿ¹ɧ©|hÍ$¹:‚ÝTS´Ìàˆ%‡-úø1VG#5 Cê”ãölBª ;¬«ÞÕ¦:à7á8œYÇ¡ÛN8¹[êÛÑϤål†#!Í#BW«g¡«Ó%Ó[«Ô'U ™Yl´ÌÝQg ÃPÁ(_†šr@œ, Ýz“[Uã½*H›ßï¬zõÊ ‹¾xý†l·4Q¨–«"ìÃõ¡_´ºÆ(yû=3B–ê째K@•Ô¨&—„ê›2“7lº>~FãŒ÷îàÂH”çù·kÊêHÌp†Ñ¼,³Á«ÈEv–ïVE¸ª^f©Gw û#„4(à‘E„çtiC“€%láø ¦ìã‚d7øXIï"Ó9|‡ÉFüÀÏiY8Ÿ®ò\ØÑkH°E‰œ´;ï縅=–½×?©¬«9—ôduÈqTì6ã!g™k~ÛWO°Øý1Æžci-‘ºß~¬C¨1E+V…äÓ‡î²ÅöŠzjD߉½/÷80Qäî3…þñ;qÙÐG9£i_9+ýW*©¤+PÐÌ 8in­Jmæ§Ã±¹n*ýQc$Ë£Ö;ePqm^Q.Ïk²V ô^Jj|ÊЦYm¸ÿÁÜtëZïäVšÕþ¦“©þÈm²zË+.14‚›ymÉ¥ÇlÆ´%¾¾?êè†~gÞoõÌZ` –|Ü,è}ø¸4¾¿sŒÊ•ð(`™³—’M[J‰Ÿ%@9{yÐÝtJ³rAp­—“Mr£×õÍ="|æû  Vа ­Ñ!_å„Ë5e)ÔkOZ»}·YÉ6Ša©2 ¼öÞÆs¾Xׯ‚M'î™Oÿ’íè¬Òâ?ºØ»é)a»¯•ÐDܮެ úfwEa«×³e0wz™oׄíèÊ«WBZDrë”S º{{%E4ù‘{AnOÏø>:Œ«/ÛjꢢývW[ó¨"‹¦OqD ÕL® ª±ºÀ, <3ùÞŠë¼»àº÷žÅ äeMP›ŒÆ[5ƈM%ê¸k²K¨Æö¨» ØÓ‚P=~šË,²Ë UÏ'?*ñ%‡58þXʈÉw"Ál)þ¼€—!è­À3â1f²õõ®Ã_kʼi!¦4$«.´:Óñ ¸J4y°‹ºÆ :aÍTû¼Ö„ïyàq¨sÀòu*¬é: ô’F_{bš Eâ)ì–©ú'›õj1ʯ6e ª/3ÑJá„©ôJhÙLÆÜª%,Œòó8Úí ¿`àrsõwÏç:û‰pŸ"ãÀ¢‚wz Osqzm,ãeæZwˆÑ°Üm4Yª\‰Gç÷¶pˆ*c>}t;ã|µÇnˆqß+¢V•QZíŽ^y§ì¶»gnëM©tîk)_"‚=ßqÊ"X긱­H (Žä>°$*¾fùXª„qy,ү޵í'º}6ÝàêžMð9ÏéÛ¨4Ÿ0úN{ jËëGÿÍÉ!}Õ·Nµ¤3 !JNÌHN¬ØvÛ+xq#ÎYÖ©;~§„Í\7ÜÑâl¬^Qæ3õžŒÈ`ñÞ¹¢,õ¤Õ½%ƒ9„ªdWu,jƒF+í­`>3[¬*²X¥õ$à.-üEËd1–ËÞËì¸P¼°7>l˜£ž XÕn©Þô«}+¹“³f û F›—¯Ì¼ÑxGÆë¯ë͸Ū𠞹ûÝ«ùPcš»å(*Šôиìcý.œU”…ežÉâcC‘º¿ ;R3ù—¡)†ðf§ëÀ)“%ßxë1ÅðpŸÅ:Í©Ã7°`–ª¡c’z„AVaôÂÒ^R/yÆ”® ô——'U±ªPiºIìHå0>Þ?§Zjü?Åvij¼zï¶UWA»ŽaBÁ¶F¸ÁpNXwÁyCj˜ž@µá‹8° ÈV>¼\MWÜ éªK5û ¨gjó @õê¢Ý'Ò.µ þ™x×rktçi'1Ýl¯ŽmNwO72*OMC üdÓØ?V~¸üÖ„á2¾†‹Ì™¿y¿a%fr‰.¶àk~÷òþ–¯¿üÒ(t¨pJèÊÂi¬ Ì47_ ›7Ã\/Íàdje|ó[‰nØÏÎ,cŠ·ÂYÒ°7@í*œHÔÀ´'þBò£FÝ|C>c#j¾EždST `x*€þÜžÔ­øÚ¡Sûs “§§ÒFÛ¡­BtêEH#? CÁIRgè•5< JL Q}½Tkp?¢â&ùn¼æ•_[·ŠiÓm¡w¬&0Éfóà GgËmÏC¾mŒJ#ôjŸ¥"À­wHά5Ø9[“ìûQÞò¼ÒÌïäyl/uœ¾i¨Qùkîc’¯Ì²Fñ”"§u† L È«ùÔ|a gýUùü¼JAþ´A)°’…¶å°ÝUŒë]W0Çææ‹`¡ŽÞÅšcžßLF¯®ÐXy„ôÐùw­Ã†Ë3ùF[óúU \·0Ò(ǶpI‚ìnÄ»U<ºs¤Ua¾.Êã©‘P_°Ù%ìÕN¬ûõ¶í®f§*Õt'ÖVx‘r÷í³àßÐ7åJT}!Â'‹÷5Ÿ5˜gb`[·›ŸEâeˆ?–ø´kçj)B 5ó3Œ}¦wÕ¡M´ûQäAÑ ’¬Î¥^:Ì›éÚ8.a­çlðCÃ{¶›äØäk”6PŸr°Ý'·\à›ù3ðOì¿Ë°ƒ!<™Ì}F<º}ÿ€¾óÿ¤ÔêÌLxîÑ-Ž#š}Íæ–hRœªTM±û]®è ñ…½ÉŸÚ2a§ßæ ËETRÈ 4AztÈJ¸|oU»Ð¦ñÓ»6E»Ãoà~_IK©ÛvKòh߉¯} G½¶!X ›¿Ä+FM»-¤ßZÿ®p ñƒ37"AwqZísÜû« ?³“î5Õ SE‰ÄðNØÎ­8ü M|†1ò€Ÿ´Œµ0I=?Î(Ź3í`™ïfDÏÞ·¢jF¾Å÷™6-Աߤ3‚7sš»Q¾+kך„ ´÷ýÙ+b9éŒOWx*Ô>o#b ™k+fÝqIÊØ%Ù**Y™» ö!^yí~VòPÑÇ„;6Ó»"‚ó+…Ñ4¶³¬s‚á\T*bø öý°ÄÄ^`->É5Ê6q\P»ÒG¢Ýg e\cD£Žð7);,BÓ;Úº „6ß”»®±‚¤:`+\$ŠBØÁ“ƽ §cá•¢Ëΰœ@/=5Z6öQŸGÙnù™Ï.ûÁ4dvüõ-ˆaè:KzL¥iõƒ‘¡X–¨ãüç!n®¬ŒiàÝ)V¬£tUˆÇl ï¤wcÑ¿e(žï£&+¯«FÔ½ƒÛ@à4‰$ûóXµ¼Åj¥vJÌA¦<§Ijàþà˜ümEA÷5èMA ¾úk}%«(ÝÝ¥ q÷‘n Hïk[©¥Œqa`¾ãM ªH :˜klˆÃ‘Û/K”g›˜§ûWè ¾Éù𗶉Œ>ê­MH¹4€øÚ·¸ñƒgÎ#×IÝrÈðOŽ 2²ÈjÓ+üç™9•8ò0ˆÝ©Ó`<÷ɯ¸ŒèØo¥N™!Ô«õ>!×)€.ì—cü ÛwIÆ& .²G$§‘L¬Ÿüiµ}QCKÖõØiÌß×|%œQâ¹JÛHÀ‘14”©ž½Y}ü(ž¨úÃY¬Öõ„noÀöuM£dŒæHeÁù1S!‘ì8ÞB%JŒ{ Q,Ÿe°&˜ÍŠÓ¶lž;%jŧ[›¡*>†ÝÃébêIÝqæ‘iÂJãììnç£rpÇB{„Öm¥Û‡ ɧ`KþfÆÏ ñª²45>5"Nö>½ÇUcJCnù=ƒMƒ_Ø¥íB~¼Í’—³í>Àèðò{«Er )©ïönŸÎãbyHø&v’óäÁF³ÁCfÝßxrŒU+o»Yg¯Ð•ñsF$$¼1ñ™2Où!î®Ø5 °¢[+)¾Ó lJñkžL8§¨ìgùÚ|2L*‰€ ÒŠ`çÕP^óÏF hÛp%xý¾| ®ÿCzõÌûd%êˆjÁ7®j}X—ã•RJLϺ¥2ó`šhízÑWW¡Š5XV¡NÎIL\ûÝ´RÂÞøõ'”/Eõýï ëýG`È›Åül€rzŒÏë?Àè[!ój~!îV ’A™‡,FJ($®±Ip줫®ƒýd‚A3«^Íâ’V¢É¶ŸRìÐ#àE©µ7'[ËeHÚ^ÔHòFÂÌMK˜+:kŠ»¬’ƒG`L˜Ì˜BN·ë¾›¬î y  ô·#ú‘¥Ç£kMQ‰ Vß};yQ2ù"•*ø€}mˆ\%â´Än¨áðqí›!³D ÍŠÌSÁV¶ ,$xKŠ 8ë(Õ,à=F©Ϧ³[‹¡êþæI¹u! UÁGìŸ!Ñ».f¢,…jxVg 2¼ãDek.õœu%—|¤FÐA>±°EF½«J3_}3Råžv Ú­*ØÜÊ[8ü¥ÝÉaG1jM=L·P¥öõ"ú¤Z0{Íí…†}1KºKD?úŸ]éÏeðÏ>¤º+q¥õ) ¤gÞÝ ·6l“ÏÖÒ,Eø…oý3QѸRÞrõ<üJϨÔiÛ-®&¥Û4)»½ˆÁ{’°î'Õaê÷E_Þ×à‡£FYòSi{ñ[ ¨ •ò–Gý ÏX‚Ä.9«´7rÄåŒÀ häîìì“´NcX|ñ¬õGžxÆuUÓE઄O “«Qv– §ƒPFÜø9†ÕÖ9q$F ©œÖ+f±® Ûž0²!†%Eýö'8×Ýácò¹ë$8jž'+ˆÂ9S!S8W,i‡D»úEvî¡‚PE ˜ëO0¾³ŸÈ\E˜ÐÉPhR‹/Ôiq·ì†*’ãSÞÅãèÏkû¥eÜ¿‹Jþ™hNÁ.Gúr5¸…C…í5á AÀÿý8UÔ‚…Á{‘ç…•‡KZ‚¬´îžØ- ¥±„q÷¶©Šû¾Ø¶ùG3š®mk#Q-éMth#¦ÆL"!s{™SF,Šx)Ó%\R…ºó}öÔƒ­#æ÷»ÊC¯JtÛª@©>)_·˜!VqæÏm'(¶ý_Å:±~Ö:¯Ý6 %89ø“:îbãßnÔÛ]¬´ ‰ÁÆ.R’?ȱ«P“EfžðÅoOK¥ ΕŠ%òF‚epC•'WÒUyLâaÊÜ×yæueià.˜¿ßPã~äqÎ!jè÷‹ë@Z™îJ/ÁCÃÐj†ÂãçýšO—9 +w•òNqoq;]q=ÛÏöੱ4®¨tf7=õ º+ zÇs”âåjÉÀ_øzºcÛ4ñ¬é9R'c> E*¢Uþæ1’¾‡°ÏhëÕ2íêÓ›«t?ýbM~!}«áûk‘ö²áÇüWÒ K½¡ç®çÖB¢Ï„p:D³§¾h%‡uC †‚~…P *‚Ì \ý"^ÃQ iƃ1ÚÕ÷ƒ¾À¬ÃÚL…øu‚^´[Ã0´ÌôÍã‰Cg“ê¡@#_au’-›\¤ô ÄZ†«µU*ÍÄ+7Â!}ô­rn^!Ý~¿Š»Êy¿Ø³®èZz»ЍÃW?rÐ2÷õ†ì(æÁ¾úe…ÆÝEq{Š~ÌDÌ}RáYý’G òÓ¬š.¸ ‹Ÿá*›o]ŠÔ¯µûwù>ÅDV‡h°8 é*UÉAW_‚wG`uò‰Ÿ¿¤SÕÓE([rHUŒ D_äeÌ¿p$b¯°ÿLö§˜`5 ãÓÀ@ ëìàœÞ@ôÁ´3’”ÿ VÙ9U„D´QÇþ8í_³J¤Oô8ä?Í¥ÐTW'@d¥‘Bŧ¹:-V½ø€P†ô0°ß™s ›Õý<>Šå[::*kËÌ?SE¢äמHKõmègÆæTÈÊ@à‰ª¯ ”o›Çá9…L‡«K‰ ëfêé6D$Ïfo»§¤½ß°q3¾iüŒ%LUo¬õèê d žg¿JT¥6ï4±ñ áàÂ7µ¼"ø9$9·zÁð"ŠÔšÖŠRîÜwÜ?Q¹ÍúµÐpq?–²Û]·ʳ5Õ¿(”êYìOÆ2‘¼;á4´ø(*Œ±À”\Î;ûŠÝ¯k‹•°ðʈt‡ ¨Oê7MQ‹¦Žò± œ#Õ—ïètíÅ«ák|:!3ÉAêE{6¶Ù;ôâhÏ6k/jêÊ; ³ÔãkÎ dñ5¹L½Ø€Ý-â=T£`½kX¤œpïÖ±ïhi—Ä ~ÕSv¼Ÿ³DÛ׎PÍàY£(óèõ·,«:ã>Èû©Sõðºäj}•5eo6a q'bÄSD2<*Ÿ[©øÁ©r œŽÙC#*'®Ý0Ã]fŸv„“¢‡åªúso±ÛŽ'fž Z÷bÉ÷xU©Ú¦~Èd•â ÌóÖE± ÉØa÷ ä> Ä†¹‡$¬=®ÆŽáoœÃF"ùáš– äÜßókâ´ÏÈÓ 4]zRèÀ“}ØžÍbïÜ»›¼ÃU>xwúD^ýÞgÛud€y‹´M3ºÿ~ Pú¨ìr×=:zÈr}ß1´ªcSÙP÷žë𢫨òÀI>÷ Â=>·‘Cñj–(·x­ý+¥ôƒwŒ,ùt†G8Æã7»vNíq¦ñäÈ!çÉùÚ¥úy£¢f|ÞmX˲í4^s—†ô)ÅÛñmsÛvïíżøµì×Ì¡ð¿8|`ÕãéÚó­+Ê®\lpý‚?·kJKóÿäª=zv.ýœbäÐ!$r&ÍÇf1>ÖÔë9FŒ2—è2Œï°P nY2.s äõœ¦am³ó‡„gÀà¡»½%2~ý<úù:Ë}Zæô%÷ÖÞ§côa:X¼ö¶¥­æÐrà ⃂ªÄ S:÷Ì “wÒ꬗I`ò¢KsRä0ÆÐó€…ï#Ð Zóáýé<™Î‹ÞŒë.(é F Ž'š™ÁŠR=úçʘ%ø1ÝÙ@êF©{Ʋ‹ÊaŒÅç‡L$Š€[~jÁ>z‚E´¢:ô{ÚOéýÊ()øµñFç,¦}4XÎNйm­qôõ3°‘šÉî2ldH6ˆàÅF7»VÄ;Üm#ˆB·«öC©Ee›M¶†ußuûÂ?U³†ë*­»_è±q’hˆ[ßÇOc‡Vd£u&ò­Ât@?Áïz_–¥<@*E‡]èœ8C\AÍhÌo¦{q‘‹±$î3^÷VN,ÕM1Áȡڎ3Œ5·3éÚz„ÒZQtB pÃ>Ây‰4.‡vCÉ*‚k¼Ë¤9…û‰…ÿ©Dw#ˆQ'.™9²Å% -¶©è ù!›¶²á0¯pÃ#Qg÷}In«g.Ì,©“`kCÇw’ûéíåìq3³ÜðgÚ³á%v²ù2c[ƒŒ"_Kc±x˜qØ’Uÿt÷V£œäõ{º/13>Çæ²Ž«ƒÓ´ƒ•ì­qC'<Kí™ Ú/ß7®Ù¦Å¨€¬ÛØÒá1E›-ê¹ –ýq{ÈãúdbâK¢EòQŠ0ÂÀu³¸¢GµDå}5/‰”êÒR"›êpŽ¥ÍyµÜ8ÓÍ95¨u-ìš‚Y5õ˜žÝÉá=¬/ͺæÇÙ:j:wI˜¬üßšOˆœÏ“»´s]ÕÀEmáH‰4g¶I²ýOú†P 1Õ`~1Ž œó{7xfãà†‹ÒØ³g†å ݆ÕÉýẍ?¤øyó4±¦\¨UMøNu£Â˜ÀT«L!±¹XßüyæAJ3éQí¥ÂNè[’ò;ñµ /tró¤+QŽ»„4µÞÝÐeà%Þ5l«—ßE™òäGâ†Ð¸]¼'V ñ0³»¡o>–£@ÈZL28Í<·}t3ˆ€\W­ˆÕÅYÐÍÊ:ŽZZFV.¾Ñ˜¥¾KÀÎ¥>²j÷攎¿Š#TAªŒà «$J.‚KVÞ±¨PŸÆYQñÚ½¢À7r]gqâ'ðc!6Ój°ro•$9&ÒUÝ+"tì+ŸŒo; 3;Ç©5ú L‹æpÃëk™RjO8‰°M6ß:$OKœiù…%¥…[º(‹F(Ë4Á å|U¯Ê†Ó>$ÇÎ#es¸aƒÖfuvj䈘H΂s ´^à¡÷/çì–r*ÉëÛRA~™c+¶À="û`‹ŠÙwç½¼B"‰‡mÈeEò²»òSpƸMCá,àÅdÙ¸În“WL‡N<ï—·§~M”Þ)~vG‚à7/'^.¼mÍ×¢ׯÐßÉQ½ÿfÓó6W©OšíCHVÃÏ¥ÕíKΞž/âé ½“7ilSzÊ  å[}só "r’›úT~w%:7öaÎ¥“âÁ©Œ©ó××4°r'?&¹]Oà•ZŸóM ‰Ìõ­Ú$6l™ã¾„ˆÑC‡YI³v‡zž%&½ù¼Mñ ðæA6ÅÃÙ?rT~M7¾&!GzËÐ̶ q8È›¢ ùr³á•b:¬bð)¦`WÔ-™!$zjXžlk×½ /QGëLu™8 ìT´YRáiÜ{öcÖ4”*/žÌª™t`«Rr¨—³C¡Ìpïª'SHC;±ó½Én-|º¿'¶*ã¼ÍÛ¤"K @ðpr:ý{¥\ì}$Þžž/òHÍU–¹Ò´Umçz†–½MÛ)&·qš8Ò2ª `H‰–¥M‹/GÀ¥kÄ(•†.6ìW|x‹ï­5ãÊh(Ð:“3™uhCZ¯Ë7Œ!#üZ‚$_(h»W¯traòëõÊLê¡L5÷Û´;÷s)²>¸~p¼a‡)tvE~îOAÒTç–$ã„+¤PZºoË\Bhwjf™¸tÞsbóÈ© ŽÛ3+ pgÃÛcÊqV­´ ¥¦³¸ ÙCNÊý0e`³ Äʾóut½³V°ÅLÁä¡l&Õã}ÓÓŽ©6U¶‡î’f¨È„Ùœãþ/‚ß«ö²D1"VgeÀŸ´à»Á_pxïðVÆj³Å4ç‡:aäÇcó³Ë=‚2ÝJ'Ä ÙÎe2yœH•`ƹÿOˆw÷(™®G¿òÓdËŽ#SŒP•7ó›±¢“!w[×ÛZSb›;cHŽöµ¡ˆ´q[½>¹*Ç›4Å´.<ýØOܯ•ëm…;æ­Ti¶<É`lnj–BðÎVØ/§Ý¥òV¬²/#JÁên·âÜsÃGéºß:#wñƒÖ‰È´eŽ”å{$]×´ªW½óPK…:#dfå^Ǭ¤à¶ŠJÂФΩ'‹FË:À:fSì}Uĺd~­ÜŸ('ºÁ…ÿ\«‘ñÿkgßå8Šò½æuŽ&òîºhÐèå÷qí‘Fƒ×¡¸ÙÖ6=Çp6:ŸmÛ ~p‡ûZH½ÙÓZ¢`üñ71ÃLÞpTHæìë)Þm\Z•‹}a—–äWÌ’ _ÀÖ £\[Œ×…yšž Üîšš¨íS’Ô1ë®·åw»Ñg‡†I =ä$Ýò‹Š9ºŸ3ÒYŠÏ{#eäÏ~×’:àÛ\´I¿" ß‘n…7p¢Äj+/â_Î áI÷újœã£¼ Oœo^^| „0Þøj»§—÷¦JÞ´oM>S{®Â’)“˜]ÎÙ;Æö)4 «…ˆÁÈ&ÕäT¦渙bÖÜNÃؤT¬/«†@Äí–«Z;ˉaƒmº?r­Vk¬Wž®å¤ˆö$ÖãË öe¶Ÿ¶yŽÞýÔ!´Cÿ¹ÐRï P·ŸšÇ:Ý7û£Âømߢ/8PÞ%̦nìJË^ÅÃÏtgÍs“MÎ ï¾täIçúø&H£åÛ0ÒG÷àÉÖHÏbˆB·(ëýqчóŒÂDôó6 †r},A–æ°Üþò«Ê_–äEc²‹þÖ gQôÂ÷¶ t£[J¶ ˜/Cy7ç»å¦”£ºt]Èõš%MƒB$Òœëcxè°†‡ÈßaX s)œRâ¬ôª1—f b_iÙ3GÊ¢–>DhuS{nÒÏŸîæêpP=$¸eº–Ò!PÍl•åhJ•¢- ]xº%íªÏgu,âð€Õ›”€÷TòÎàÛ‹®hMéJþüÖÚUÆ.Fáö[–·’ßï—-éð3 g>:lg äþ¬±oº«@˜ù´÷WÅ…ú½hoÞö€ú¸ôX*)ë©]ŸÝûÐ,>P‚Ÿ¢OPÚrˆ‡ÈN n›ß (EÝõñÚÓbMt|`M>é<›+ÔÚEÕeÅcbj/©+uZ*sÓþ‰û´È]sA¥Ò.Ü×6QƱ·.þây¾Òå '^óåÍÆ“g™OŸâa|àÛPâTHüÚ-¢U;BL9§Í`Óû¶F¦3$«csThV›P7RÄeŠG(Öö6Ÿ @ Ô }ô'RªÃÐ2Ô™_ž~U ¥‚–…HÑÅdTµ6«vð˜m6€Ép}Ñ GQ †G{*~hfߤ)åx%Èßaçò¢þÍ+ 9|0¶äâ8žÄX_eºãó–ù‹õ|Íúh$Tdò&¦€Þªù†ZS^ÉA¼è™Ði…ÝGU¢þ¥AHÇ$pšÖÜT° :äÕ6/®­£g… x¼9Ad.-ßœê:ƒßP*ïÕ ªÉ8±-/¦ d`yžTé.uä‚‘ãwÖ~xÃM ª q îöÒeóúg‘y¬r¿ÿ0ùȪ4ÿ—ú¦¤ЩÇ4²¬V³$¤é}³WĮݎ†Ò÷— ý—iÏõAªeuI®6­ä -lxz,L<Ãj)’E+%=Û$r±^íÆhVçöÚ1‰ôJû<ÿ Ê~õpãš§"P÷RˆÞQrÝúÓF§Òâ‹øÒ!co¤ýìMѰÇkÇÑhÝÚdjh²g]-rHnŽkÆ”ª1 <› ;M“‰ãöÌk‰žaE(Ñ Áº÷¬H‰>úr5a]{ŠW$ü>qâÖSÃ.ÊëŠÝmb²ê¸xB¨‚èf» Ç”Þ^¯ŠóàφHÒDs[wè Äm·±8WÃôØ´É7$µ84ftXD60Vÿóz'<¶ # ð×ÔŒì£õõŠb@lMºGØVË“£²*”}w±Åý£±è-¶DF‹÷Àl,Ìú/SvyݦRt÷d)‰ç7Aʹ\ŸäĤ mg–ߪ¾Yã\ƒmÛ+XTLè£Cù3ž!×¹î}’x]^Xx²p°<âÆWoLv8ƒ"4 QÙ§(¬Š£ߣB3*±X2Ñ“:g¾ûz£§¯¿`²Ó9¤8H•}}1ºö·bÕq¹ÒÞÜÇ]}œji¬¡¼•ÝDHzé’ÅИ=uÀ¶To]HÝÑâlÆæêÒI¢ J)C{¯¶N0ä(•ƒv–¸7ýáÚR ’µÍTÅ®B·ˆ¹þF)üoª¨ÃJO¯”&=Ù_ayjhª)K0Ž/¹¯-¾´…ò"iÒ÷´Ÿ×¡ËµêÝgì›Ò%›²Š©!gðÄ®!s*ci ‡ÐuàèTbvhÇB×þ0Š—!‘òõè¶"Ÿ;T„ ‚D;ªlÏU¼Tuzàúìdã“W›r‡VÁ?j¤¡ÁñU‰=FI¬5Ž9àc•%Xû´4[ZG 7OÈ>¨‹,Ÿé]=ȯ<Û‘6c‡aПØnÞe77g“ô?t®Vq‹× &ð<)Ά†ùH`ùµ¸ÀCÙU}#Âr:X†®w`ÿ¶ì=ãiă+þãߤô·í'î@;ìG#àºOV±/Ë0 U”v›Å.ˆ‡‚a©pþpm´¡ßU‡?ÚÐì3Ÿ endstream endobj 122 0 obj << /Type /FontDescriptor /FontName /HMAZMS+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/b/bar/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/f/five/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/quotedbl/r/s/seven/six/t/three/two/u/underscore/v/w/x/zero) /FontFile 121 0 R >> endobj 36 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XUEYJO+CMBX10 /FontDescriptor 106 0 R /FirstChar 12 /LastChar 121 /Widths 101 0 R >> endobj 34 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JMPDIJ+CMBX12 /FontDescriptor 108 0 R /FirstChar 12 /LastChar 121 /Widths 102 0 R >> endobj 37 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GHVHRQ+CMR10 /FontDescriptor 110 0 R /FirstChar 12 /LastChar 121 /Widths 100 0 R >> endobj 33 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JJWGIL+CMR12 /FontDescriptor 112 0 R /FirstChar 44 /LastChar 118 /Widths 103 0 R >> endobj 32 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TDWSGY+CMR17 /FontDescriptor 114 0 R /FirstChar 65 /LastChar 117 /Widths 104 0 R >> endobj 39 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YVWBQL+CMSLTT10 /FontDescriptor 116 0 R /FirstChar 34 /LastChar 121 /Widths 98 0 R >> endobj 66 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UETODX+CMSS10 /FontDescriptor 118 0 R /FirstChar 97 /LastChar 112 /Widths 96 0 R >> endobj 38 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RNAREF+CMTI10 /FontDescriptor 120 0 R /FirstChar 46 /LastChar 120 /Widths 99 0 R >> endobj 45 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HMAZMS+CMTT10 /FontDescriptor 122 0 R /FirstChar 34 /LastChar 124 /Widths 97 0 R >> endobj 40 0 obj << /Type /Pages /Count 6 /Parent 123 0 R /Kids [22 0 R 42 0 R 47 0 R 51 0 R 55 0 R 59 0 R] >> endobj 67 0 obj << /Type /Pages /Count 4 /Parent 123 0 R /Kids [63 0 R 70 0 R 82 0 R 93 0 R] >> endobj 123 0 obj << /Type /Pages /Count 10 /Kids [40 0 R 67 0 R] >> endobj 124 0 obj << /Type /Outlines /First 3 0 R /Last 19 0 R /Count 5 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 124 0 R /Prev 15 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 124 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 124 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 124 0 R /Prev 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 124 0 R /Next 7 0 R >> endobj 125 0 obj << /Names [(Doc-Start) 31 0 R (figure.1) 73 0 R (figure.2) 85 0 R (page.1) 30 0 R (page.10) 95 0 R (page.2) 44 0 R] /Limits [(Doc-Start) (page.2)] >> endobj 126 0 obj << /Names [(page.3) 49 0 R (page.4) 53 0 R (page.5) 57 0 R (page.6) 61 0 R (page.7) 65 0 R (page.8) 72 0 R] /Limits [(page.3) (page.8)] >> endobj 127 0 obj << /Names [(page.9) 84 0 R (section*.1) 35 0 R (section.1) 2 0 R (section.2) 6 0 R (section.3) 10 0 R (section.4) 14 0 R] /Limits [(page.9) (section.4)] >> endobj 128 0 obj << /Names [(section.5) 18 0 R] /Limits [(section.5) (section.5)] >> endobj 129 0 obj << /Kids [125 0 R 126 0 R 127 0 R 128 0 R] /Limits [(Doc-Start) (section.5)] >> endobj 130 0 obj << /Dests 129 0 R >> endobj 131 0 obj << /Type /Catalog /Pages 123 0 R /Outlines 124 0 R /Names 130 0 R /PageMode/UseOutlines /OpenAction 21 0 R >> endobj 132 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() /CreationDate (D:20131113201924-08'00') /ModDate (D:20131113201924-08'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 133 0000000000 65535 f 0000000015 00000 n 0000003316 00000 n 0000166672 00000 n 0000000060 00000 n 0000000090 00000 n 0000003372 00000 n 0000166588 00000 n 0000000135 00000 n 0000000173 00000 n 0000014311 00000 n 0000166502 00000 n 0000000218 00000 n 0000000255 00000 n 0000026586 00000 n 0000166414 00000 n 0000000301 00000 n 0000000337 00000 n 0000028492 00000 n 0000166339 00000 n 0000000383 00000 n 0000000421 00000 n 0000002242 00000 n 0000002397 00000 n 0000002547 00000 n 0000002697 00000 n 0000002847 00000 n 0000002996 00000 n 0000003428 00000 n 0000000471 00000 n 0000003146 00000 n 0000003202 00000 n 0000165279 00000 n 0000165137 00000 n 0000164852 00000 n 0000003259 00000 n 0000164709 00000 n 0000164995 00000 n 0000165707 00000 n 0000165421 00000 n 0000165991 00000 n 0000005250 00000 n 0000005086 00000 n 0000003569 00000 n 0000005194 00000 n 0000165849 00000 n 0000006760 00000 n 0000006596 00000 n 0000005355 00000 n 0000006704 00000 n 0000009006 00000 n 0000008842 00000 n 0000006865 00000 n 0000008950 00000 n 0000010084 00000 n 0000009920 00000 n 0000009111 00000 n 0000010028 00000 n 0000012196 00000 n 0000012032 00000 n 0000010177 00000 n 0000012140 00000 n 0000014368 00000 n 0000014147 00000 n 0000012301 00000 n 0000014255 00000 n 0000165565 00000 n 0000166101 00000 n 0000015982 00000 n 0000020409 00000 n 0000015874 00000 n 0000014497 00000 n 0000020293 00000 n 0000020349 00000 n 0000016975 00000 n 0000017118 00000 n 0000017216 00000 n 0000017319 00000 n 0000017354 00000 n 0000017596 00000 n 0000022139 00000 n 0000026643 00000 n 0000022031 00000 n 0000020529 00000 n 0000026471 00000 n 0000026527 00000 n 0000023153 00000 n 0000023296 00000 n 0000023394 00000 n 0000023497 00000 n 0000023532 00000 n 0000023774 00000 n 0000028549 00000 n 0000028328 00000 n 0000026787 00000 n 0000028436 00000 n 0000028654 00000 n 0000028764 00000 n 0000029146 00000 n 0000029516 00000 n 0000029966 00000 n 0000030577 00000 n 0000031204 00000 n 0000031841 00000 n 0000032253 00000 n 0000032586 00000 n 0000047678 00000 n 0000047988 00000 n 0000060361 00000 n 0000060655 00000 n 0000081596 00000 n 0000082025 00000 n 0000094929 00000 n 0000095224 00000 n 0000105014 00000 n 0000105262 00000 n 0000122692 00000 n 0000123173 00000 n 0000130474 00000 n 0000130697 00000 n 0000144816 00000 n 0000145099 00000 n 0000164233 00000 n 0000166197 00000 n 0000166265 00000 n 0000166743 00000 n 0000166910 00000 n 0000167066 00000 n 0000167239 00000 n 0000167324 00000 n 0000167421 00000 n 0000167459 00000 n 0000167586 00000 n trailer << /Size 133 /Root 131 0 R /Info 132 0 R /ID [ ] >> startxref 167912 %%EOF Biostrings/inst/doc/PairwiseAlignments.R0000644000126300012640000006114512241047574021747 0ustar00biocbuildphs_compbio### R code from vignette source 'PairwiseAlignments.Rnw' ################################################### ### code chunk number 1: options ################################################### options(width=72) ################################################### ### code chunk number 2: main1 ################################################### library(Biostrings) pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede") ################################################### ### code chunk number 3: main2 ################################################### pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", type = "local") ################################################### ### code chunk number 4: main3 ################################################### pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", gapOpening = 0, gapExtension = -1) ################################################### ### code chunk number 5: main4 ################################################### submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1) ################################################### ### code chunk number 6: main5 ################################################### submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) ################################################### ### code chunk number 7: classes1 ################################################### psa1 <- pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede") class(psa1) ################################################### ### code chunk number 8: classes2 ################################################### summary(psa1) class(summary(psa1)) ################################################### ### code chunk number 9: classes3 ################################################### class(pattern(psa1)) submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 psa2 <- pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1) class(pattern(psa2)) ################################################### ### code chunk number 10: helper1 ################################################### submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 psa2 <- pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1) score(psa2) nedit(psa2) nmatch(psa2) nmismatch(psa2) nchar(psa2) aligned(psa2) as.character(psa2) as.matrix(psa2) consensusMatrix(psa2) ################################################### ### code chunk number 11: helper2 ################################################### summary(psa2) mismatchTable(psa2) mismatchSummary(psa2) ################################################### ### code chunk number 12: helper3 ################################################### class(pattern(psa2)) aligned(pattern(psa2)) nindel(pattern(psa2)) start(subject(psa2)) end(subject(psa2)) ################################################### ### code chunk number 13: editdist1 ################################################### agrepBioC <- function(pattern, x, ignore.case = FALSE, value = FALSE, max.distance = 0.1) { if (!is.character(pattern)) pattern <- as.character(pattern) if (!is.character(x)) x <- as.character(x) if (max.distance < 1) max.distance <- ceiling(max.distance / nchar(pattern)) characters <- unique(unlist(strsplit(c(pattern, x), "", fixed = TRUE))) if (ignore.case) substitutionMatrix <- outer(tolower(characters), tolower(characters), function(x,y) -as.numeric(x!=y)) else substitutionMatrix <- outer(characters, characters, function(x,y) -as.numeric(x!=y)) dimnames(substitutionMatrix) <- list(characters, characters) distance <- - pairwiseAlignment(pattern = x, subject = pattern, substitutionMatrix = substitutionMatrix, type = "local-global", gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) whichClose <- which(distance <= max.distance) if (value) whichClose <- x[whichClose] whichClose } cbind(base = agrep("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, value = TRUE), bioc = agrepBioC("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, value = TRUE)) cbind(base = agrep("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, ignore.case = TRUE), bioc = agrepBioC("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, ignore.case = TRUE)) ################################################### ### code chunk number 14: lkblo ################################################### data(BLOSUM50) BLOSUM50[1:4,1:4] nwdemo <- pairwiseAlignment(AAString("PAWHEAE"), AAString("HEAGAWGHEE"), substitutionMatrix = BLOSUM50, gapOpening = 0, gapExtension = -8) nwdemo compareStrings(nwdemo) pid(nwdemo) ################################################### ### code chunk number 15: adapter1 ################################################### simulateReads <- function(N, adapter, experiment, substitutionRate = 0.01, gapRate = 0.001) { chars <- strsplit(as.character(adapter), "")[[1]] sapply(seq_len(N), function(i, experiment, substitutionRate, gapRate) { width <- experiment[["width"]][i] side <- experiment[["side"]][i] randomLetters <- function(n) sample(DNA_ALPHABET[1:4], n, replace = TRUE) randomLettersWithEmpty <- function(n) sample(c("", DNA_ALPHABET[1:4]), n, replace = TRUE, prob = c(1 - gapRate, rep(gapRate/4, 4))) nChars <- length(chars) value <- paste(ifelse(rbinom(nChars,1,substitutionRate), randomLetters(nChars), chars), randomLettersWithEmpty(nChars), sep = "", collapse = "") if (side) value <- paste(c(randomLetters(36 - width), substring(value, 1, width)), sep = "", collapse = "") else value <- paste(c(substring(value, 37 - width, 36), randomLetters(36 - width)), sep = "", collapse = "") value }, experiment = experiment, substitutionRate = substitutionRate, gapRate = gapRate) } adapter <- DNAString("GATCGGAAGAGCTCGTATGCCGTCTTCTGCTTGAAA") set.seed(123) N <- 1000 experiment <- list(side = rbinom(N, 1, 0.5), width = sample(0:36, N, replace = TRUE)) table(experiment[["side"]], experiment[["width"]]) adapterStrings <- simulateReads(N, adapter, experiment, substitutionRate = 0.01, gapRate = 0.001) adapterStrings <- DNAStringSet(adapterStrings) ################################################### ### code chunk number 16: adapter2 ################################################### M <- 5000 randomStrings <- apply(matrix(sample(DNA_ALPHABET[1:4], 36 * M, replace = TRUE), nrow = M), 1, paste, collapse = "") randomStrings <- DNAStringSet(randomStrings) ################################################### ### code chunk number 17: adapter3 ################################################### ## Method 1: Use edit distance with an FDR of 1e-03 submat1 <- nucleotideSubstitutionMatrix(match = 0, mismatch = -1, baseOnly = TRUE) randomScores1 <- pairwiseAlignment(randomStrings, adapter, substitutionMatrix = submat1, gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) quantile(randomScores1, seq(0.99, 1, by = 0.001)) adapterAligns1 <- pairwiseAlignment(adapterStrings, adapter, substitutionMatrix = submat1, gapOpening = 0, gapExtension = -1) table(score(adapterAligns1) > quantile(randomScores1, 0.999), experiment[["width"]]) ################################################### ### code chunk number 18: adapter4 ################################################### ## Method 2: Use consecutive matches anywhere in string with an FDR of 1e-03 submat2 <- nucleotideSubstitutionMatrix(match = 1, mismatch = -Inf, baseOnly = TRUE) randomScores2 <- pairwiseAlignment(randomStrings, adapter, substitutionMatrix = submat2, type = "local", gapOpening = 0, gapExtension = -Inf, scoreOnly = TRUE) quantile(randomScores2, seq(0.99, 1, by = 0.001)) adapterAligns2 <- pairwiseAlignment(adapterStrings, adapter, substitutionMatrix = submat2, type = "local", gapOpening = 0, gapExtension = -Inf) table(score(adapterAligns2) > quantile(randomScores2, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(start(pattern(adapterAligns2)) > 37 - end(pattern(adapterAligns2)), experiment[["side"]]) ################################################### ### code chunk number 19: adapter5 ################################################### ## Method 3: Use consecutive matches on the ends with an FDR of 1e-03 submat3 <- nucleotideSubstitutionMatrix(match = 1, mismatch = -Inf, baseOnly = TRUE) randomScores3 <- pairwiseAlignment(randomStrings, adapter, substitutionMatrix = submat3, type = "overlap", gapOpening = 0, gapExtension = -Inf, scoreOnly = TRUE) quantile(randomScores3, seq(0.99, 1, by = 0.001)) adapterAligns3 <- pairwiseAlignment(adapterStrings, adapter, substitutionMatrix = submat3, type = "overlap", gapOpening = 0, gapExtension = -Inf) table(score(adapterAligns3) > quantile(randomScores3, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(end(pattern(adapterAligns3)) == 36, experiment[["side"]]) ################################################### ### code chunk number 20: adapter6 ################################################### ## Method 4: Allow mismatches and indels on the ends with an FDR of 1e-03 randomScores4 <- pairwiseAlignment(randomStrings, adapter, type = "overlap", scoreOnly = TRUE) quantile(randomScores4, seq(0.99, 1, by = 0.001)) adapterAligns4 <- pairwiseAlignment(adapterStrings, adapter, type = "overlap") table(score(adapterAligns4) > quantile(randomScores4, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(end(pattern(adapterAligns4)) == 36, experiment[["side"]]) ################################################### ### code chunk number 21: adapter7 ################################################### ## Method 4 continued: Remove adapter fragments fragmentFound <- score(adapterAligns4) > quantile(randomScores4, 0.999) fragmentFoundAt1 <- fragmentFound & (start(pattern(adapterAligns4)) == 1) fragmentFoundAt36 <- fragmentFound & (end(pattern(adapterAligns4)) == 36) cleanedStrings <- as.character(adapterStrings) cleanedStrings[fragmentFoundAt1] <- as.character(narrow(adapterStrings[fragmentFoundAt1], end = 36, width = 36 - end(pattern(adapterAligns4[fragmentFoundAt1])))) cleanedStrings[fragmentFoundAt36] <- as.character(narrow(adapterStrings[fragmentFoundAt36], start = 1, width = start(pattern(adapterAligns4[fragmentFoundAt36])) - 1)) cleanedStrings <- DNAStringSet(cleanedStrings) cleanedStrings ################################################### ### code chunk number 22: genome1 ################################################### data(phiX174Phage) genBankPhage <- phiX174Phage[[1]] nchar(genBankPhage) data(srPhiX174) srPhiX174 quPhiX174 summary(wtPhiX174) fullShortReads <- rep(srPhiX174, wtPhiX174) srPDict <- PDict(fullShortReads) table(countPDict(srPDict, genBankPhage)) ################################################### ### code chunk number 23: genome2 ################################################### genBankSubstring <- substring(genBankPhage, 2793-34, 2811+34) genBankAlign <- pairwiseAlignment(srPhiX174, genBankSubstring, patternQuality = SolexaQuality(quPhiX174), subjectQuality = SolexaQuality(99L), type = "global-local") summary(genBankAlign, weight = wtPhiX174) revisedPhage <- replaceLetterAt(genBankPhage, c(2793, 2811), "TT") table(countPDict(srPDict, revisedPhage)) ################################################### ### code chunk number 24: genome3 ################################################### genBankCoverage <- coverage(genBankAlign, weight = wtPhiX174) plot((2793-34):(2811+34), as.integer(genBankCoverage), xlab = "Position", ylab = "Coverage", type = "l") nchar(genBankSubstring) slice(genBankCoverage, lower = 1) ################################################### ### code chunk number 25: profiling1 ################################################### N <- as.integer(seq(500, 5000, by = 500)) timings <- rep(0, length(N)) names(timings) <- as.character(N) for (i in seq_len(length(N))) { string1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) string2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) timings[i] <- system.time(pairwiseAlignment(string1, string2, type = "global"))[["user.self"]] } timings coef(summary(lm(timings ~ poly(N, 2)))) plot(N, timings, xlab = "String Size, Both Strings", ylab = "Timing (sec.)", type = "l", main = "Global Pairwise Sequence Alignment Timings") ################################################### ### code chunk number 26: profiling2 ################################################### scoreOnlyTimings <- rep(0, length(N)) names(scoreOnlyTimings) <- as.character(N) for (i in seq_len(length(N))) { string1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) string2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) scoreOnlyTimings[i] <- system.time(pairwiseAlignment(string1, string2, type = "global", scoreOnly = TRUE))[["user.self"]] } scoreOnlyTimings round((timings - scoreOnlyTimings) / timings, 2) ################################################### ### code chunk number 27: doal ################################################### file <- system.file("extdata", "someORF.fa", package="Biostrings") orf <- readDNAStringSet(file) orf orf10 <- DNAStringSet(orf, end=10) consensusMatrix(orf10, as.prob=TRUE, baseOnly=TRUE) ################################################### ### code chunk number 28: infco ################################################### informationContent <- function(Lmers) { zlog <- function(x) ifelse(x==0,0,log(x)) co <- consensusMatrix(Lmers, as.prob=TRUE) lets <- rownames(co) fr <- alphabetFrequency(Lmers, collapse=TRUE)[lets] fr <- fr / sum(fr) sum(co*zlog(co/fr), na.rm=TRUE) } informationContent(orf10) ################################################### ### code chunk number 29: ans1a ################################################### pairwiseAlignment("zyzzyx", "syzygy") pairwiseAlignment("zyzzyx", "syzygy", type = "local") pairwiseAlignment("zyzzyx", "syzygy", type = "overlap") ################################################### ### code chunk number 30: ans1b ################################################### pairwiseAlignment("zyzzyx", "syzygy", type = "overlap", gapExtension = -Inf) ################################################### ### code chunk number 31: ans2a ################################################### ex2 <- summary(pairwiseAlignment("zyzzyx", "syzygy")) nmatch(ex2) / nmismatch(ex2) ################################################### ### code chunk number 32: ans3 ################################################### ex3 <- pairwiseAlignment("zyzzyx", "syzygy", type = "overlap") ################################################### ### code chunk number 33: ans3a ################################################### nmatch(ex3) nmismatch(ex3) ################################################### ### code chunk number 34: ans3b ################################################### compareStrings(ex3) ################################################### ### code chunk number 35: ans3c ################################################### as.character(ex3) ################################################### ### code chunk number 36: ans3d ################################################### mismatch(pattern(ex3)) ################################################### ### code chunk number 37: ans3e ################################################### aligned(subject(ex3)) ################################################### ### code chunk number 38: ans4a ################################################### submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 - pairwiseAlignment("zyzzyx", "syzygy", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) ################################################### ### code chunk number 39: ans4b ################################################### stringDist(c("zyzzyx", "syzygy", "succeed", "precede", "supersede")) ################################################### ### code chunk number 40: ans5a ################################################### data(BLOSUM62) pairwiseAlignment(AAString("PAWHEAE"), AAString("HEAGAWGHEE"), substitutionMatrix = BLOSUM62, gapOpening = -12, gapExtension = -4) ################################################### ### code chunk number 41: ans6a ################################################### adapter <- DNAString("GATCGGAAGAGCTCGTATGCCGTCTTCTGCTTGAAA") set.seed(123) N <- 1000 experiment <- list(side = rbinom(N, 1, 0.5), width = sample(0:36, N, replace = TRUE)) table(experiment[["side"]], experiment[["width"]]) ex6Strings <- simulateReads(N, adapter, experiment, substitutionRate = 0.005, gapRate = 0.0005) ex6Strings <- DNAStringSet(ex6Strings) ex6Strings ## Method 1: Use edit distance with an FDR of 1e-03 submat1 <- nucleotideSubstitutionMatrix(match = 0, mismatch = -1, baseOnly = TRUE) quantile(randomScores1, seq(0.99, 1, by = 0.001)) ex6Aligns1 <- pairwiseAlignment(ex6Strings, adapter, substitutionMatrix = submat1, gapOpening = 0, gapExtension = -1) table(score(ex6Aligns1) > quantile(randomScores1, 0.999), experiment[["width"]]) ## Method 2: Use consecutive matches anywhere in string with an FDR of 1e-03 submat2 <- nucleotideSubstitutionMatrix(match = 1, mismatch = -Inf, baseOnly = TRUE) quantile(randomScores2, seq(0.99, 1, by = 0.001)) ex6Aligns2 <- pairwiseAlignment(ex6Strings, adapter, substitutionMatrix = submat2, type = "local", gapOpening = 0, gapExtension = -Inf) table(score(ex6Aligns2) > quantile(randomScores2, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(start(pattern(ex6Aligns2)) > 37 - end(pattern(ex6Aligns2)), experiment[["side"]]) ## Method 3: Use consecutive matches on the ends with an FDR of 1e-03 submat3 <- nucleotideSubstitutionMatrix(match = 1, mismatch = -Inf, baseOnly = TRUE) ex6Aligns3 <- pairwiseAlignment(ex6Strings, adapter, substitutionMatrix = submat3, type = "overlap", gapOpening = 0, gapExtension = -Inf) table(score(ex6Aligns3) > quantile(randomScores3, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(end(pattern(ex6Aligns3)) == 36, experiment[["side"]]) ## Method 4: Allow mismatches and indels on the ends with an FDR of 1e-03 quantile(randomScores4, seq(0.99, 1, by = 0.001)) ex6Aligns4 <- pairwiseAlignment(ex6Strings, adapter, type = "overlap") table(score(ex6Aligns4) > quantile(randomScores4, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(end(pattern(ex6Aligns4)) == 36, experiment[["side"]]) ################################################### ### code chunk number 42: ans6b ################################################### simulateReads <- function(N, left, right = left, experiment, substitutionRate = 0.01, gapRate = 0.001) { leftChars <- strsplit(as.character(left), "")[[1]] rightChars <- strsplit(as.character(right), "")[[1]] if (length(leftChars) != length(rightChars)) stop("left and right adapters must have the same number of characters") nChars <- length(leftChars) sapply(seq_len(N), function(i) { width <- experiment[["width"]][i] side <- experiment[["side"]][i] randomLetters <- function(n) sample(DNA_ALPHABET[1:4], n, replace = TRUE) randomLettersWithEmpty <- function(n) sample(c("", DNA_ALPHABET[1:4]), n, replace = TRUE, prob = c(1 - gapRate, rep(gapRate/4, 4))) if (side) { value <- paste(ifelse(rbinom(nChars,1,substitutionRate), randomLetters(nChars), rightChars), randomLettersWithEmpty(nChars), sep = "", collapse = "") value <- paste(c(randomLetters(36 - width), substring(value, 1, width)), sep = "", collapse = "") } else { value <- paste(ifelse(rbinom(nChars,1,substitutionRate), randomLetters(nChars), leftChars), randomLettersWithEmpty(nChars), sep = "", collapse = "") value <- paste(c(substring(value, 37 - width, 36), randomLetters(36 - width)), sep = "", collapse = "") } value }) } leftAdapter <- adapter rightAdapter <- reverseComplement(adapter) ex6LeftRightStrings <- simulateReads(N, leftAdapter, rightAdapter, experiment) ex6LeftAligns4 <- pairwiseAlignment(ex6LeftRightStrings, leftAdapter, type = "overlap") ex6RightAligns4 <- pairwiseAlignment(ex6LeftRightStrings, rightAdapter, type = "overlap") scoreCutoff <- quantile(randomScores4, 0.999) leftAligned <- start(pattern(ex6LeftAligns4)) == 1 & score(ex6LeftAligns4) > pmax(scoreCutoff, score(ex6RightAligns4)) rightAligned <- end(pattern(ex6RightAligns4)) == 36 & score(ex6RightAligns4) > pmax(scoreCutoff, score(ex6LeftAligns4)) table(leftAligned, rightAligned) table(leftAligned | rightAligned, experiment[["width"]]) ################################################### ### code chunk number 43: ans7a ################################################### genBankFullAlign <- pairwiseAlignment(srPhiX174, genBankPhage, patternQuality = SolexaQuality(quPhiX174), subjectQuality = SolexaQuality(99L), type = "global-local") summary(genBankFullAlign, weight = wtPhiX174) ################################################### ### code chunk number 44: ans7b ################################################### genBankFullCoverage <- coverage(genBankFullAlign, weight = wtPhiX174) plot(as.integer(genBankFullCoverage), xlab = "Position", ylab = "Coverage", type = "l") slice(genBankFullCoverage, lower = 1) ################################################### ### code chunk number 45: ans7c ################################################### genBankFullAlignRevComp <- pairwiseAlignment(srPhiX174, reverseComplement(genBankPhage), patternQuality = SolexaQuality(quPhiX174), subjectQuality = SolexaQuality(99L), type = "global-local") table(score(genBankFullAlignRevComp) > score(genBankFullAlign)) ################################################### ### code chunk number 46: ans8a ################################################### N <- as.integer(seq(5000, 50000, by = 5000)) newTimings <- rep(0, length(N)) names(newTimings) <- as.character(N) for (i in seq_len(length(N))) { string1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], 35, replace = TRUE), collapse = "")) string2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) newTimings[i] <- system.time(pairwiseAlignment(string1, string2, type = "global"))[["user.self"]] } newTimings coef(summary(lm(newTimings ~ poly(N, 2)))) plot(N, newTimings, xlab = "Larger String Size", ylab = "Timing (sec.)", type = "l", main = "Global Pairwise Sequence Alignment Timings") ################################################### ### code chunk number 47: ans8b ################################################### newScoreOnlyTimings <- rep(0, length(N)) names(newScoreOnlyTimings) <- as.character(N) for (i in seq_len(length(N))) { string1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], 35, replace = TRUE), collapse = "")) string2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) newScoreOnlyTimings[i] <- system.time(pairwiseAlignment(string1, string2, type = "global", scoreOnly = TRUE))[["user.self"]] } newScoreOnlyTimings round((newTimings - newScoreOnlyTimings) / newTimings, 2) ################################################### ### code chunk number 48: sessinfo ################################################### toLatex(sessionInfo()) Biostrings/inst/doc/PairwiseAlignments.Rnw0000644000126300012640000015030712227063322022304 0ustar00biocbuildphs_compbio%\VignetteIndexEntry{Pairwise Sequence Alignments} %\VignetteKeywords{DNA, RNA, Sequence, Biostrings, Sequence alignment} %\VignettePackage{Biostrings} % % NOTE -- ONLY EDIT THE .Rnw FILE!!! The .tex file is % likely to be overwritten. % \documentclass[10pt]{article} \usepackage{times} \usepackage{hyperref} \textwidth=6.5in \textheight=8.5in %\parskip=.3cm \oddsidemargin=-.1in \evensidemargin=-.1in \headheight=-.3in \newcommand{\scscst}{\scriptscriptstyle} \newcommand{\scst}{\scriptstyle} \newcommand{\R}{{\textsf{R}}} \newcommand{\code}[1]{{\texttt{#1}}} \newcommand{\term}[1]{{\emph{#1}}} \newcommand{\Rpackage}[1]{\textsf{#1}} \newcommand{\Rfunction}[1]{\texttt{#1}} \newcommand{\Robject}[1]{\texttt{#1}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\textit{#1}}} \newcommand{\Rfunarg}[1]{{\textit{#1}}} \bibliographystyle{plainnat} \begin{document} %\setkeys{Gin}{width=0.55\textwidth} \title{Pairwise Sequence Alignments} \author{Patrick Aboyoun \\ Gentleman Lab \\ Fred Hutchinson Cancer Research Center \\ Seattle, WA} \date{\today} \maketitle \tableofcontents \section{Introduction} In this document we illustrate how to perform pairwise sequence alignments using the \Rpackage{Biostrings} package through the use of the \Rfunction{pairwiseAlignment} function. This function aligns a set of \Rfunarg{pattern} strings to a \Rfunarg{subject} string in a global, local, or overlap (ends-free) fashion with or without affine gaps using either a fixed or quality-based substitution scoring scheme. This function's computation time is proportional to the product of the two string lengths being aligned. \section{Pairwise Sequence Alignment Problems} The (Needleman-Wunsch) global, the (Smith-Waterman) local, and (ends-free) overlap pairwise sequence alignment problems are described as follows. Let string $S_i$ have $n_i$ characters $c_{(i,j)}$ with $j \in \left\{1, \ldots, n_i\right\}$. A pairwise sequence alignment is a mapping of strings $S_1$ and $S_2$ to gapped substrings ${S'}_1$ and ${S'}_2$ that are defined by \begin{eqnarray*} {S'}_1 & = & g_{\left(1,a_1\right)}c_{\left(1,a_1\right)} \cdots g_{\left(1,b_1\right)}c_{\left(1,b_1\right)}g_{\left(1,b_1+1\right)}\\ {S'}_2 & = & g_{\left(2,a_2\right)}c_{\left(2,a_2\right)} \cdots g_{\left(2,b_2\right)}c_{\left(2,b_2\right)}g_{\left(2,b_2+1\right)} \end{eqnarray*} \begin{tabbing} where \= \\ \> $a_i, b_i \in \{1, \ldots, n_i\}$ with $a_i \leq b_i$ \\ \> $g_{(i,j)} = 0$ or more gaps at the specified position $j$ for aligned string $i$ \\ \> $length({S'}_1) = length({S'}_2)$ \end{tabbing} Each of these pairwise sequence alignment problems is solved by maximizing the alignment \textit{score}. An alignment score is determined by the type of pairwise sequence alignment (global, local, overlap), which sets the $[a_i, b_i]$ ranges for the substrings; the substitution scoring scheme, which sets the distance between aligned characters; and the gap penalties, which is divided into opening and extension components. The optimal pairwise sequence alignment is the pairwise sequence alignment with the largest score for the specified alignment type, substitution scoring scheme, and gap penalties. The pairwise sequence alignment types, substitution scoring schemes, and gap penalties influence alignment scores in the following manner: \begin{description} \item{Pairwise Sequence Alignment Types: } The type of pairwise sequence alignment determines the substring ranges to apply the substitution scoring and gap penalty schemes. For the three primary (global, local, overlap) and two derivative (subject overlap, pattern overlap) pairwise sequence alignment types, the resulting substring ranges are as follows: \begin{description} \item{Global - } $[a_1, b_1] = [1, n_1]$ and $[a_2, b_2] = [1, n_2]$ \item{Local - } $[a_1, b_1]$ and $[a_2, b_2]$ \item{Overlap - } $\left\{[a_1, b_1] = [a_1, n_1], [a_2, b_2] = [1, b_2]\right\}$ or $\left\{[a_1, b_1] = [1, b_1], [a_2, b_2] = [a_2, n_2]\right\}$ \item{Subject Overlap - } $[a_1, b_1] = [1, n_1]$ and $[a_2, b_2]$ \item{Pattern Overlap - } $[a_1, b_1]$ and $[a_2, b_2] = [1, n_2]$ \end{description} \item{Substitution Scoring Schemes: } The substitution scoring scheme sets the values for the aligned character pairings within the substring ranges determined by the type of pairwise sequence alignment. This scoring scheme can be fixed for character pairings or quality-dependent for character pairings. (Characters that align with a gap are penalized according to the ``Gap Penalty" framework.) \begin{description} \item{Fixed substitution scoring - } Fixed substitution scoring schemes associate each aligned character pairing with a value. These schemes are very common and include awarding one value for a match and another for a mismatch, Point Accepted Mutation (PAM) matrices, and Block Substitution Matrix (BLOSUM) matrices. \item{Quality-based substitution scoring - } Quality-based substitution scoring schemes derive the value for the aligned character pairing based on the probabilities of character recording errors \cite{Malde:2008}. Let $\epsilon_i$ be the probability of a character recording error. Assuming independence within and between recordings and a uniform background frequency of the different characters, the combined error probability of a mismatch when the underlying characters do match is $\epsilon_c = \epsilon_1 + \epsilon_2 - (n/(n-1)) * \epsilon_1 * \epsilon_2$, where $n$ is the number of characters in the underlying alphabet (e.g. in DNA and RNA, $n = 4$). Using $\epsilon_c$, the substitution score is given by $b * \log_2(\gamma_{(x,y)} * (1 - \epsilon_c) * n + (1 - \gamma_{(x,y)}) * \epsilon_c * (n/(n-1)))$, where $b$ is the bit-scaling for the scoring and $\gamma_{(x,y)}$ is the probability that characters $x$ and $y$ represents the same underlying letters (e.g. using IUPAC, $\gamma_{(A,A)} = 1$ and $\gamma_{(A,N)} = 1/4$). \end{description} \item{Gap Penalties: } Gap penalties are the values associated with the gaps within the substring ranges determined by the type of pairwise sequence alignment. These penalties are divided into \textit{gap opening} and \textit{gap extension} components, where the gap opening penalty is the cost for adding a new gap and the gap extension penalty is the incremental cost incurred along the length of the gap. A \textit{constant gap penalty} occurs when there is a cost associated with opening a gap, but no cost for the length of a gap (i.e. gap extension is zero). A \textit{linear gap penalty} occurs when there is no cost associated for opening a gap (i.e. gap opening is zero), but there is a cost for the length of the gap. An \textit{affine gap penalty} occurs when both the gap opening and gap extension have a non-zero associated cost. \end{description} \section{Main Pairwise Sequence Alignment Function} The \Rfunction{pairwiseAlignment} function solves the pairwise sequence alignment problems mentioned above. It aligns one or more strings specified in the \Rfunarg{pattern} argument with a single string specified in the \Rfunarg{subject} argument. <>= options(width=72) @ <>= library(Biostrings) pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede") @ The type of pairwise sequence alignment is set by specifying the \Rfunarg{type} argument to be one of \texttt{"global"}, \texttt{"local"}, \texttt{"overlap"}, \texttt{"global-local"}, and \texttt{"local-global"}. <>= pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", type = "local") @ The gap penalties are regulated by the \Rfunarg{gapOpening} and \Rfunarg{gapExtension} arguments. <>= pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", gapOpening = 0, gapExtension = -1) @ The substitution scoring scheme is set using three arguments, two of which are quality-based related (\Rfunarg{patternQuality}, \Rfunarg{subjectQuality}) and one is fixed substitution related (\Rfunarg{substitutionMatrix}). When the substitution scores are fixed by character pairing, the \Rfunarg{substituionMatrix} argument takes a matrix with the appropriate alphabets as dimension names. The \Rfunction{nucleotideSubstitutionMatrix} function tranlates simple match and mismatch scores to the full spectrum of IUPAC nucleotide codes. <>= submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1) @ When the substitution scores are quality-based, the \Rfunarg{patternQuality} and \Rfunarg{subjectQuality} arguments represent the equivalent of $[x-99]$ numeric quality values for the respective strings, and the optional \Rfunarg{fuzzyMatrix} argument represents how the closely two characters match on a $[0,1]$ scale. The \Rfunarg{patternQuality} and \Rfunarg{subjectQuality} arguments accept quality measures in either a \Rclass{PhredQuality}, \Rclass{SolexaQuality}, or \Rclass{IlluminaQuality} scaling. For \Rclass{PhredQuality} and \Rclass{IlluminaQuality} measures $Q \in [0, 99]$, the probability of an error in the base read is given by $10^{-Q/10}$ and for \Rclass{SolexaQuality} measures $Q \in [-5, 99]$, they are given by $1 - 1/(1 + 10^{-Q/10})$. The \Rfunction{qualitySubstitutionMatrices} function maps the \Rfunarg{patternQuality} and \Rfunarg{subjectQuality} scores to match and mismatch penalties. These three arguments will be demonstrated in later sections. The final argument, \Rfunarg{scoreOnly}, to the \Rfunction{pairwiseAlignment} function accepts a logical value to specify whether or not to return just the pairwise sequence alignment score. If \Rfunarg{scoreOnly} is \Robject{FALSE}, the pairwise alignment with the maximum alignment score is returned. If more than one pairwise alignment has the maximum alignment score exists, the first alignment along the subject is returned. If there are multiple pairwise alignments with the maximum alignment score at the chosen subject location, then at each location along the alignment mismatches are given preference to insertions/deletions. For example, \code{pattern: [1] ATTA; subject: [1] AT-A} is chosen above \code{pattern: [1] ATTA; subject: [1] A-TA} if they both have the maximum alignment score. <>= submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) @ \subsection{Exercise 1} \begin{enumerate} \item Using \Rfunction{pairwiseAlignment}, fit the global, local, and overlap pairwise sequence alignment of the strings \Robject{"syzygy"} and \Robject{"zyzzyx"} using the default settings. \item Do any of the alignments change if the \Rfunarg{gapExtension} argument is set to \Robject{-Inf}? \end{enumerate} [Answers provided in section \ref{sec:Answers1}.] \section{Pairwise Sequence Alignment Classes} Following the design principles of Bioconductor and R, the pairwise sequence alignment functionality in the \Rpackage{Biostrings} package keeps the end-user close to their data through the use of five specialty classes: \Rclass{PairwiseAlignments}, \Rclass{PairwiseAlignmentsSingleSubject}, \Rclass{PairwiseAlignmentsSingleSubjectSummary}, \Rclass{AlignedXStringSet}, and \Rclass{QualityAlignedXStringSet}. The \Rclass{PairwiseAlignmentsSingleSubject} class inherits from the \Rclass{PairwiseAlignments} class and they both hold the results of a fit from the \Rfunction{pairwiseAlignment} function, with the former class being used to represent all patterns aligning to a single subject and the latter being used to represent elementwise alignments between a set of patterns and a set of subjects. <>= psa1 <- pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede") class(psa1) @ and the \Rfunction{pairwiseAlignmentSummary} function holds the results of a summarized pairwise sequence alignment. <>= summary(psa1) class(summary(psa1)) @ The \Rclass{AlignedXStringSet} and \Rclass{QualityAlignedXStringSet} classes hold the ``gapped" ${S'}_i$ substrings with the former class holding the results when the pairwise sequence alignment is performed with a fixed substitution scoring scheme and the latter class a quality-based scoring scheme. <>= class(pattern(psa1)) submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 psa2 <- pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1) class(pattern(psa2)) @ \subsection{Exercise 2} \begin{enumerate} \item What is the primary benefit of formal summary classes like \Rclass{PairwiseAlignmentsSingleSubjectSummary} and \Rclass{summary.lm} to end-users? \end{enumerate} [Answer provided in section \ref{sec:Answers2}.] \section{Pairwise Sequence Alignment Helper Functions} Tables \ref{table:helperfuns1}, \ref{table:helperfuns1} and \ref{table:alignfuns} show functions that interact with objects of class \Rclass{PairwiseAlignments}, \Rclass{PairwiseAlignmentsSingleSubject}, and \Rclass{AlignedXStringSet}. These functions should be used in preference to direct slot extraction from the alignment objects. \begin{table}[ht] \begin{center} \begin{tabular}{l|l} \hline Function & Description \\ \hline \Rfunction{[} & Extracts the specified elements of the alignment object \\ \Rfunction{alphabet} & Extracts the allowable characters in the original strings \\ \Rfunction{compareStrings} & Creates character string mashups of the alignments \\ \Rfunction{deletion} & Extracts the locations of the gaps inserted into the pattern for the alignments \\ \Rfunction{length} & Extracts the number of patterns aligned \\ \Rfunction{mismatchTable} & Creates a table for the mismatching positions \\ \Rfunction{nchar} & Computes the length of ``gapped" substrings \\ \Rfunction{nedit} & Computes the Levenshtein edit distance of the alignments \\ \Rfunction{indel} & Extracts the locations of the insertion \& deletion gaps in the alignments \\ \Rfunction{insertion} & Extracts the locations of the gaps inserted into the subject for the alignments \\ \Rfunction{nindel} & Computes the number of insertions \& deletions in the alignments \\ \Rfunction{nmatch} & Computes the number of matching characters in the alignments \\ \Rfunction{nmismatch} & Computes the number of mismatching characters in the alignments \\ \Rfunction{pattern}, \Rfunction{subject} & Extracts the aligned pattern/subject \\ \Rfunction{pid} & Computes the percent sequence identity \\ \Rfunction{rep} & Replicates the elements of the alignment object \\ \Rfunction{score} & Extracts the pairwise sequence alignment scores \\ \Rfunction{type} & Extracts the type of pairwise sequence alignment \\ \hline \end{tabular} \end{center} \caption{Functions for \Rclass{PairwiseAlignments} and \Rclass{PairwiseAlignmentsSingleSubject} objects.} \label{table:helperfuns1} \end{table} \begin{table}[ht] \begin{center} \begin{tabular}{l|l} \hline Function & Description \\ \hline \Rfunction{aligned} & Creates an \Rclass{XStringSet} containing either ``filled-with-gaps" or degapped aligned strings \\ \Rfunction{as.character} & Creates a character vector version of \Rfunction{aligned} \\ \Rfunction{as.matrix} & Creates an ``exploded" character matrix version of \Rfunction{aligned} \\ \Rfunction{consensusMatrix} & Computes a consensus matrix for the alignments \\ \Rfunction{consensusString} & Creates the string based on a 50\% + 1 vote from the consensus matrix \\ \Rfunction{coverage} & Computes the alignment coverage along the subject \\ \Rfunction{mismatchSummary} & Summarizes the information of the \Rfunction{mismatchTable} \\ \Rfunction{summary} & Summarizes a pairwise sequence alignment \\ \Rfunction{toString} & Creates a concatenated string version of \Rfunction{aligned} \\ \Rfunction{Views} & Creates an \Rclass{XStringViews} representing the aligned region along the subject \\ \hline \end{tabular} \end{center} \caption{Additional functions for \Rclass{PairwiseAlignmentsSingleSubject} objects.} \label{table:helperfuns2} \end{table} The \Rfunction{score}, \Rfunction{nedit}, \Rfunction{nmatch}, \Rfunction{nmismatch}, and \Rfunction{nchar} functions return numeric vectors containing information on the pairwise sequence alignment score, number of matches, number of mismatches, and number of aligned characters respectively. <>= submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 psa2 <- pairwiseAlignment(pattern = c("succeed", "precede"), subject = "supersede", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1) score(psa2) nedit(psa2) nmatch(psa2) nmismatch(psa2) nchar(psa2) aligned(psa2) as.character(psa2) as.matrix(psa2) consensusMatrix(psa2) @ The \Rfunction{summary}, \Rfunction{mismatchTable}, and \Rfunction{mismatchSummary} functions return various summaries of the pairwise sequence alignments. <>= summary(psa2) mismatchTable(psa2) mismatchSummary(psa2) @ \begin{table}[ht] \begin{center} \begin{tabular}{l|l} \hline Function & Description \\ \hline \Rfunction{[} & Extracts the specified elements of the alignment object \\ \Rfunction{aligned}, \Rfunction{unaligned} & Extracts the aligned/unaligned strings \\ \Rfunction{alphabet} & Extracts the allowable characters in the original strings \\ \Rfunction{as.character}, \Rfunction{toString} & Converts the alignments to character strings \\ \Rfunction{coverage} & Computes the alignment coverage \\ \Rfunction{end} & Extracts the ending index of the aligned range \\ \Rfunction{indel} & Extracts the insertion/deletion locations \\ \Rfunction{length} & Extracts the number of patterns aligned \\ \Rfunction{mismatch} & Extracts the position of the mismatches \\ \Rfunction{mismatchSummary} & Summarizes the information of the \Rfunction{mismatchTable} \\ \Rfunction{mismatchTable} & Creates a table for the mismatching positions \\ \Rfunction{nchar} & Computes the length of ``gapped" substrings \\ \Rfunction{nindel} & Computes the number of insertions/deletions in the alignments \\ \Rfunction{nmismatch} & Computes the number of mismatching characters in the alignments \\ \Rfunction{rep} & Replicates the elements of the alignment object \\ \Rfunction{start} & Extracts the starting index of the aligned range \\ \Rfunction{toString} & Creates a concatenated string containing the alignments \\ \Rfunction{width} & Extracts the width of the aligned range \\ \hline \end{tabular} \end{center} \caption{Functions for \Rclass{AlignedXString} and \Rclass{QualityAlignedXString} objects.} \label{table:alignfuns} \end{table} The \Rfunction{pattern} and \Rfunction{subject} functions extract the aligned pattern and subject objects for further analysis. Most of the actions that can be performed on \Rclass{PairwiseAlignments} objects can also be performed on \Rclass{AlignedXStringSet} and \Rclass{QualityAlignedXStringSet} objects as well as operations including \Rfunction{start}, \Rfunction{end}, and \Rfunction{width} that extracts the start, end, and width of the alignment ranges. <>= class(pattern(psa2)) aligned(pattern(psa2)) nindel(pattern(psa2)) start(subject(psa2)) end(subject(psa2)) @ \subsection{Exercise 3} For the overlap pairwise sequence alignment of the strings \Robject{"syzygy"} and \Robject{"zyzzyx"} with the \Rfunction{pairwiseAlignment} default settings, perform the following operations: \begin{enumerate} \item Use \Rfunction{nmatch} and \Rfunction{nmismath} to extract the number of matches and mismatches respectively. \item Use the \Rfunction{compareStrings} function to get the symbolic representation of the alignment. \item Use the \Rfunction{as.character} function to the get the character string versions of the alignments. \item Use the \Rfunction{pattern} function to extract the aligned pattern and apply the \Rfunction{mismatch} function to it to find the locations of the mismatches. \item Use the \Rfunction{subject} function to extract the aligned subject and apply the \Rfunction{aligned} function to it to get the aligned strings. \end{enumerate} [Answers provided in section \ref{sec:Answers3}.] \section{Edit Distances} One of the earliest uses of pairwise sequence alignment is in the area of text analysis. In 1965 Vladimir Levenshtein considered a metric, now called the \textit{Levenshtein edit distance}, that measures the similarity between two strings. This distance metric is equivalent to the negative of the score of a pairwise sequence alignment with a match cost of 0, a mismatch cost of -1, a gap opening penalty of 0, and a gap extension cost of -1. The \Rfunction{stringDist} uses the internals of the \Rfunction{pairwiseAlignment} function to calculate the Levenshtein edit distance matrix for a set of strings. There is also an implementation of approximate string matching using Levenshtein edit distance in the \Rfunction{agrep} (approximate grep) function of the \Rpackage{base} R package. As the following example shows, it is possible to replicate the \Rfunction{agrep} function using the \Rfunction{pairwiseAlignment} function. Since the \Rfunction{agrep} function is vectorized in \Rfunarg{x} rather than \Rfunarg{pattern}, these arguments are flipped in the call to \Rfunction{pairwiseAlignment}. <>= agrepBioC <- function(pattern, x, ignore.case = FALSE, value = FALSE, max.distance = 0.1) { if (!is.character(pattern)) pattern <- as.character(pattern) if (!is.character(x)) x <- as.character(x) if (max.distance < 1) max.distance <- ceiling(max.distance / nchar(pattern)) characters <- unique(unlist(strsplit(c(pattern, x), "", fixed = TRUE))) if (ignore.case) substitutionMatrix <- outer(tolower(characters), tolower(characters), function(x,y) -as.numeric(x!=y)) else substitutionMatrix <- outer(characters, characters, function(x,y) -as.numeric(x!=y)) dimnames(substitutionMatrix) <- list(characters, characters) distance <- - pairwiseAlignment(pattern = x, subject = pattern, substitutionMatrix = substitutionMatrix, type = "local-global", gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) whichClose <- which(distance <= max.distance) if (value) whichClose <- x[whichClose] whichClose } cbind(base = agrep("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, value = TRUE), bioc = agrepBioC("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, value = TRUE)) cbind(base = agrep("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, ignore.case = TRUE), bioc = agrepBioC("laysy", c("1 lazy", "1", "1 LAZY"), max = 2, ignore.case = TRUE)) @ \subsection{Exercise 4} \begin{enumerate} \item Use the \Rfunction{pairwiseAlignment} function to find the Levenshtein edit distance between \Robject{"syzygy"} and \Robject{"zyzzyx"}. \item Use the \Rfunction{stringDist} function to find the Levenshtein edit distance for the vector \Robject{c("zyzzyx", "syzygy", "succeed", "precede", "supersede")}. \end{enumerate} [Answers provided in section \ref{sec:Answers4}.] \section{Application: Using Evolutionary Models in Protein Alignments} When proteins are believed to descend from a common ancestor, evolutionary models can be used as a guide in pairwise sequence alignments. The two most common families evolutionary models of proteins used in pairwise sequence alignments are Point Accepted Mutation (PAM) matrices, which are based on explicit evolutionary models, and Block Substitution Matrix (BLOSUM) matrices, which are based on data-derived evolution models. The \Rpackage{Biostrings} package contains 5 PAM and 5 BLOSUM matrices (\Robject{PAM30} \Robject{PAM40}, \Robject{PAM70}, \Robject{PAM120}, \Robject{PAM250}, \Robject{BLOSUM45}, \Robject{BLOSUM50}, \Robject{BLOSUM62}, \Robject{BLOSUM80}, and \Robject{BLOSUM100}) that can be used in the \Rfunarg{substitutionMatrix} argument to the \Rfunction{pairwiseAlignment} function. Here is an example pairwise sequence alignment of amino acids from Durbin, Eddy et al being fit by the \Rfunction{pairwiseAlignment} function using the \Robject{BLOSUM50} matrix: <>= data(BLOSUM50) BLOSUM50[1:4,1:4] nwdemo <- pairwiseAlignment(AAString("PAWHEAE"), AAString("HEAGAWGHEE"), substitutionMatrix = BLOSUM50, gapOpening = 0, gapExtension = -8) nwdemo compareStrings(nwdemo) pid(nwdemo) @ \subsection{Exercise 5} \begin{enumerate} \item Repeat the alignment exercise above using \Robject{BLOSUM62}, a gap opening penalty of -12, and a gap extension penalty of -4. \item Explore to find out what caused the alignment to change. \end{enumerate} [Answers provided in section \ref{sec:Answers5}.] \section{Application: Removing Adapters from Sequence Reads} Finding and removing uninteresting experiment process-related fragments like adapters is a common problem in genetic sequencing, and pairwise sequence alignment is well-suited to address this issue. When adapters are used to anchor or extend a sequence during the experiment process, they either intentionally or unintentionally become sequenced during the read process. The following code simulates what sequences with adapter fragments at either end could look like during an experiment. <>= simulateReads <- function(N, adapter, experiment, substitutionRate = 0.01, gapRate = 0.001) { chars <- strsplit(as.character(adapter), "")[[1]] sapply(seq_len(N), function(i, experiment, substitutionRate, gapRate) { width <- experiment[["width"]][i] side <- experiment[["side"]][i] randomLetters <- function(n) sample(DNA_ALPHABET[1:4], n, replace = TRUE) randomLettersWithEmpty <- function(n) sample(c("", DNA_ALPHABET[1:4]), n, replace = TRUE, prob = c(1 - gapRate, rep(gapRate/4, 4))) nChars <- length(chars) value <- paste(ifelse(rbinom(nChars,1,substitutionRate), randomLetters(nChars), chars), randomLettersWithEmpty(nChars), sep = "", collapse = "") if (side) value <- paste(c(randomLetters(36 - width), substring(value, 1, width)), sep = "", collapse = "") else value <- paste(c(substring(value, 37 - width, 36), randomLetters(36 - width)), sep = "", collapse = "") value }, experiment = experiment, substitutionRate = substitutionRate, gapRate = gapRate) } adapter <- DNAString("GATCGGAAGAGCTCGTATGCCGTCTTCTGCTTGAAA") set.seed(123) N <- 1000 experiment <- list(side = rbinom(N, 1, 0.5), width = sample(0:36, N, replace = TRUE)) table(experiment[["side"]], experiment[["width"]]) adapterStrings <- simulateReads(N, adapter, experiment, substitutionRate = 0.01, gapRate = 0.001) adapterStrings <- DNAStringSet(adapterStrings) @ These simulated strings above have 0 to 36 characters from the adapters attached to either end. We can use completely random strings as a baseline for any pairwise sequence alignment methodology we develop to remove the adapter characters. <>= M <- 5000 randomStrings <- apply(matrix(sample(DNA_ALPHABET[1:4], 36 * M, replace = TRUE), nrow = M), 1, paste, collapse = "") randomStrings <- DNAStringSet(randomStrings) @ Since edit distances are easy to explain, it serves as a good place to start for developing a adapter removal methodology. Unfortunately given that it is based on a global alignment, it only is useful for filtering out sequences that are derived primarily from the adapter. <>= ## Method 1: Use edit distance with an FDR of 1e-03 submat1 <- nucleotideSubstitutionMatrix(match = 0, mismatch = -1, baseOnly = TRUE) randomScores1 <- pairwiseAlignment(randomStrings, adapter, substitutionMatrix = submat1, gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) quantile(randomScores1, seq(0.99, 1, by = 0.001)) adapterAligns1 <- pairwiseAlignment(adapterStrings, adapter, substitutionMatrix = submat1, gapOpening = 0, gapExtension = -1) table(score(adapterAligns1) > quantile(randomScores1, 0.999), experiment[["width"]]) @ One improvement to removing adapters is to look at consecutive matches anywhere within the sequence. This is more versatile than the edit distance method, but it requires a relatively large number of consecutive matches and is susceptible to issues related to error related substitutions and insertions/deletions. <>= ## Method 2: Use consecutive matches anywhere in string with an FDR of 1e-03 submat2 <- nucleotideSubstitutionMatrix(match = 1, mismatch = -Inf, baseOnly = TRUE) randomScores2 <- pairwiseAlignment(randomStrings, adapter, substitutionMatrix = submat2, type = "local", gapOpening = 0, gapExtension = -Inf, scoreOnly = TRUE) quantile(randomScores2, seq(0.99, 1, by = 0.001)) adapterAligns2 <- pairwiseAlignment(adapterStrings, adapter, substitutionMatrix = submat2, type = "local", gapOpening = 0, gapExtension = -Inf) table(score(adapterAligns2) > quantile(randomScores2, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(start(pattern(adapterAligns2)) > 37 - end(pattern(adapterAligns2)), experiment[["side"]]) @ Limiting consecutive matches to the ends provides better results, but it doesn't resolve the issues related to substitutions and insertions/deletions errors. <>= ## Method 3: Use consecutive matches on the ends with an FDR of 1e-03 submat3 <- nucleotideSubstitutionMatrix(match = 1, mismatch = -Inf, baseOnly = TRUE) randomScores3 <- pairwiseAlignment(randomStrings, adapter, substitutionMatrix = submat3, type = "overlap", gapOpening = 0, gapExtension = -Inf, scoreOnly = TRUE) quantile(randomScores3, seq(0.99, 1, by = 0.001)) adapterAligns3 <- pairwiseAlignment(adapterStrings, adapter, substitutionMatrix = submat3, type = "overlap", gapOpening = 0, gapExtension = -Inf) table(score(adapterAligns3) > quantile(randomScores3, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(end(pattern(adapterAligns3)) == 36, experiment[["side"]]) @ Allowing for substitutions and insertions/deletions errors in the pairwise sequence alignments provides much better results for finding adapter fragments. <>= ## Method 4: Allow mismatches and indels on the ends with an FDR of 1e-03 randomScores4 <- pairwiseAlignment(randomStrings, adapter, type = "overlap", scoreOnly = TRUE) quantile(randomScores4, seq(0.99, 1, by = 0.001)) adapterAligns4 <- pairwiseAlignment(adapterStrings, adapter, type = "overlap") table(score(adapterAligns4) > quantile(randomScores4, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(end(pattern(adapterAligns4)) == 36, experiment[["side"]]) @ Using the results that allow for substitutions and insertions/deletions errors, the cleaned sequence fragments can be generated as follows: <>= ## Method 4 continued: Remove adapter fragments fragmentFound <- score(adapterAligns4) > quantile(randomScores4, 0.999) fragmentFoundAt1 <- fragmentFound & (start(pattern(adapterAligns4)) == 1) fragmentFoundAt36 <- fragmentFound & (end(pattern(adapterAligns4)) == 36) cleanedStrings <- as.character(adapterStrings) cleanedStrings[fragmentFoundAt1] <- as.character(narrow(adapterStrings[fragmentFoundAt1], end = 36, width = 36 - end(pattern(adapterAligns4[fragmentFoundAt1])))) cleanedStrings[fragmentFoundAt36] <- as.character(narrow(adapterStrings[fragmentFoundAt36], start = 1, width = start(pattern(adapterAligns4[fragmentFoundAt36])) - 1)) cleanedStrings <- DNAStringSet(cleanedStrings) cleanedStrings @ \subsection{Exercise 6} \begin{enumerate} \item Rerun the simulation time using the \Rfunction{simulateReads} function with a \Rfunarg{substitutionRate} of 0.005 and \Rfunarg{gapRate} of 0.0005. How do the different pairwise sequence alignment methods compare? \item (Advanced) Modify the \Rfunction{simulateReads} function to accept different equal length adapters on either side (left \& right) of the reads. How would the methods for trimming the reads change? \end{enumerate} [Answers provided in section \ref{sec:Answers6}.] \section{Application: Quality Assurance in Sequencing Experiments} Due to its flexibility, the \Rfunction{pairwiseAlignment} function is able to diagnose sequence matching-related issues that arise when \Rfunction{matchPDict} and its related functions don't find a match. This section contains an example involving a short read Solexa sequencing experiment of bacteriophage $\phi$ X174 DNA produced by New England BioLabs (NEB). This experiment contains slightly less than 5000 unique short reads in \Robject{srPhiX174}, with quality measures in \Robject{quPhiX174}, and frequency for those short reads in \Robject{wtPhiX174}. In order to demonstrate how to find sequence differences in the target, these short reads will be compared against the bacteriophage $\phi$ X174 genome NC\_001422 from the GenBank database. <>= data(phiX174Phage) genBankPhage <- phiX174Phage[[1]] nchar(genBankPhage) data(srPhiX174) srPhiX174 quPhiX174 summary(wtPhiX174) fullShortReads <- rep(srPhiX174, wtPhiX174) srPDict <- PDict(fullShortReads) table(countPDict(srPDict, genBankPhage)) @ For these short reads, the \Rfunction{pairwiseAlignment} function finds that the small number of perfect matches is due to two locations on the bacteriophage $\phi$X174 genome. Unlike the \Rfunction{countPDict} function, the \Rfunction{pairwiseAlignment} function works off of the original strings, rather than \Rfunction{PDict} processed strings, and to be computationally efficient it is recommended that the unique sequences are supplied to the \Rfunction{pairwiseAlignment} function, and the frequencies of those sequences are supplied to the \Rfunarg{weight} argument of functions like \Rfunction{summary}, \Rfunction{mismatchSummary}, and \Rfunction{coverage}. For the purposes of this exercise, a substring of the GenBank bacteriophage $\phi$ X174 genome is supplied to the \Rfunarg{subject} argument of the \Rfunction{pairwiseAlignment} function to reduce the computation time. <>= genBankSubstring <- substring(genBankPhage, 2793-34, 2811+34) genBankAlign <- pairwiseAlignment(srPhiX174, genBankSubstring, patternQuality = SolexaQuality(quPhiX174), subjectQuality = SolexaQuality(99L), type = "global-local") summary(genBankAlign, weight = wtPhiX174) revisedPhage <- replaceLetterAt(genBankPhage, c(2793, 2811), "TT") table(countPDict(srPDict, revisedPhage)) @ The following plot shows the coverage of the aligned short reads along the substring of the bacteriophage $\phi$ X174 genome. Applying the \Rfunction{slice} function to the coverage shows the entire substring is covered by aligned short reads. <>= genBankCoverage <- coverage(genBankAlign, weight = wtPhiX174) plot((2793-34):(2811+34), as.integer(genBankCoverage), xlab = "Position", ylab = "Coverage", type = "l") nchar(genBankSubstring) slice(genBankCoverage, lower = 1) @ \subsection{Exercise 7} \begin{enumerate} \item Rerun the global-local alignment of the short reads against the entire genome. (This may take a few minutes.) \item Plot the coverage of these alignments and use the \Rfunction{slice} function to find the ranges of alignment. Are there any alignments outside of the substring region that was used above? \item Use the \Rfunction{reverseComplement} function on the bacteriophage $\phi$ X174 genome. Do any short reads have a higher alignment score on this new sequence than on the original sequence? \end{enumerate} [Answers provided in section \ref{sec:Answers7}.] \section{Computation Profiling} The \Rfunction{pairwiseAlignment} function uses a dynamic programming algorithm based on the Needleman-Wunsch and Smith-Waterman algorithms for global and local pairwise sequence alignments respectively. The algorithm consumes memory and computation time proportional to the product of the length of the two strings being aligned. <>= N <- as.integer(seq(500, 5000, by = 500)) timings <- rep(0, length(N)) names(timings) <- as.character(N) for (i in seq_len(length(N))) { string1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) string2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) timings[i] <- system.time(pairwiseAlignment(string1, string2, type = "global"))[["user.self"]] } timings coef(summary(lm(timings ~ poly(N, 2)))) plot(N, timings, xlab = "String Size, Both Strings", ylab = "Timing (sec.)", type = "l", main = "Global Pairwise Sequence Alignment Timings") @ When a problem only requires the pairwise sequence alignment score, setting the \Rfunarg{scoreOnly} argument to \Robject{TRUE} will more than halve the computation time. <>= scoreOnlyTimings <- rep(0, length(N)) names(scoreOnlyTimings) <- as.character(N) for (i in seq_len(length(N))) { string1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) string2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) scoreOnlyTimings[i] <- system.time(pairwiseAlignment(string1, string2, type = "global", scoreOnly = TRUE))[["user.self"]] } scoreOnlyTimings round((timings - scoreOnlyTimings) / timings, 2) @ \subsection{Exercise 8} \begin{enumerate} \item Rerun the first set of profiling code, but this time fix the number of characters in \Robject{string1} to 35 and have the number of characters in \Robject{string2} range from 5000, 50000, by increments of 5000. What is the computational order of this simulation exercise? \item Rerun the second set of profiling code using the simulations from the previous exercise with \Rfunarg{scoreOnly} argument set to \Robject{TRUE}. Is is still twice as fast? \end{enumerate} [Answers provided in section \ref{sec:Answers8}.] \section{Computing alignment consensus matrices} The \Rfunction{consensusMatrix} function is provided for computing a consensus matrix for a set of equal-length strings assumed to be aligned. To illustrate, the following application assumes the ORF data to be aligned for the first 10 positions (patently false): <>= file <- system.file("extdata", "someORF.fa", package="Biostrings") orf <- readDNAStringSet(file) orf orf10 <- DNAStringSet(orf, end=10) consensusMatrix(orf10, as.prob=TRUE, baseOnly=TRUE) @ The information content as defined by Hertz and Stormo 1995 is computed as follows: <>= informationContent <- function(Lmers) { zlog <- function(x) ifelse(x==0,0,log(x)) co <- consensusMatrix(Lmers, as.prob=TRUE) lets <- rownames(co) fr <- alphabetFrequency(Lmers, collapse=TRUE)[lets] fr <- fr / sum(fr) sum(co*zlog(co/fr), na.rm=TRUE) } informationContent(orf10) @ \section{Exercise Answers} \subsection{Exercise 1} \label{sec:Answers1} \begin{enumerate} \item Using \Rfunction{pairwiseAlignment}, fit the global, local, and overlap pairwise sequence alignment of the strings \Robject{"syzygy"} and \Robject{"zyzzyx"} using the default settings. <>= pairwiseAlignment("zyzzyx", "syzygy") pairwiseAlignment("zyzzyx", "syzygy", type = "local") pairwiseAlignment("zyzzyx", "syzygy", type = "overlap") @ \item Do any of the alignments change if the \Rfunarg{gapExtension} argument is set to \Robject{-Inf}? \textit{Yes, the overlap pairwise sequence alignment changes.} <>= pairwiseAlignment("zyzzyx", "syzygy", type = "overlap", gapExtension = -Inf) @ \end{enumerate} \subsection{Exercise 2} \label{sec:Answers2} \begin{enumerate} \item What is the primary benefit of formal summary classes like \Rclass{PairwiseAlignmentsSingleSubjectSummary} and \Rclass{summary.lm} to end-users? \textit{These classes allow the end-user to extract the summary output for further operations.} <>= ex2 <- summary(pairwiseAlignment("zyzzyx", "syzygy")) nmatch(ex2) / nmismatch(ex2) @ \end{enumerate} \subsection{Exercise 3} \label{sec:Answers3} For the overlap pairwise sequence alignment of the strings \Robject{"syzygy"} and \Robject{"zyzzyx"} with the \Rfunction{pairwiseAlignment} default settings, perform the following operations: <>= ex3 <- pairwiseAlignment("zyzzyx", "syzygy", type = "overlap") @ \begin{enumerate} \item Use \Rfunction{nmatch} and \Rfunction{nmismath} to extract the number of matches and mismatches respectively. <>= nmatch(ex3) nmismatch(ex3) @ \item Use the \Rfunction{compareStrings} function to get the symbolic representation of the alignment. <>= compareStrings(ex3) @ \item Use the \Rfunction{as.character} function to the get the character string versions of the alignments. <>= as.character(ex3) @ \item Use the \Rfunction{pattern} function to extract the aligned pattern and apply the \Rfunction{mismatch} function to it to find the locations of the mismatches. <>= mismatch(pattern(ex3)) @ \item Use the \Rfunction{subject} function to extract the aligned subject and apply the \Rfunction{aligned} function to it to get the aligned strings. <>= aligned(subject(ex3)) @ \end{enumerate} \subsection{Exercise 4} \label{sec:Answers4} \begin{enumerate} \item Use the \Rfunction{pairwiseAlignment} function to find the Levenshtein edit distance between \Robject{"syzygy"} and \Robject{"zyzzyx"}. <>= submat <- matrix(-1, nrow = 26, ncol = 26, dimnames = list(letters, letters)) diag(submat) <- 0 - pairwiseAlignment("zyzzyx", "syzygy", substitutionMatrix = submat, gapOpening = 0, gapExtension = -1, scoreOnly = TRUE) @ \item Use the \Rfunction{stringDist} function to find the Levenshtein edit distance for the vector \Robject{c("zyzzyx", "syzygy", "succeed", "precede", "supersede")}. <>= stringDist(c("zyzzyx", "syzygy", "succeed", "precede", "supersede")) @ \end{enumerate} \subsection{Exercise 5} \label{sec:Answers5} \begin{enumerate} \item Repeat the alignment exercise above using \Robject{BLOSUM62}, a gap opening penalty of -12, and a gap extension penalty of -4. <>= data(BLOSUM62) pairwiseAlignment(AAString("PAWHEAE"), AAString("HEAGAWGHEE"), substitutionMatrix = BLOSUM62, gapOpening = -12, gapExtension = -4) @ \item Explore to find out what caused the alignment to change. \textit{The sift in gap penalties favored infrequent long gaps to frequent short ones.} \end{enumerate} \subsection{Exercise 6} \label{sec:Answers6} \begin{enumerate} \item Rerun the simulation time using the \Rfunction{simulateReads} function with a \Rfunarg{substitutionRate} of 0.005 and \Rfunarg{gapRate} of 0.0005. How do the different pairwise sequence alignment methods compare? \textit{The different methods are much more comprobable when the error rates are lower.} <>= adapter <- DNAString("GATCGGAAGAGCTCGTATGCCGTCTTCTGCTTGAAA") set.seed(123) N <- 1000 experiment <- list(side = rbinom(N, 1, 0.5), width = sample(0:36, N, replace = TRUE)) table(experiment[["side"]], experiment[["width"]]) ex6Strings <- simulateReads(N, adapter, experiment, substitutionRate = 0.005, gapRate = 0.0005) ex6Strings <- DNAStringSet(ex6Strings) ex6Strings ## Method 1: Use edit distance with an FDR of 1e-03 submat1 <- nucleotideSubstitutionMatrix(match = 0, mismatch = -1, baseOnly = TRUE) quantile(randomScores1, seq(0.99, 1, by = 0.001)) ex6Aligns1 <- pairwiseAlignment(ex6Strings, adapter, substitutionMatrix = submat1, gapOpening = 0, gapExtension = -1) table(score(ex6Aligns1) > quantile(randomScores1, 0.999), experiment[["width"]]) ## Method 2: Use consecutive matches anywhere in string with an FDR of 1e-03 submat2 <- nucleotideSubstitutionMatrix(match = 1, mismatch = -Inf, baseOnly = TRUE) quantile(randomScores2, seq(0.99, 1, by = 0.001)) ex6Aligns2 <- pairwiseAlignment(ex6Strings, adapter, substitutionMatrix = submat2, type = "local", gapOpening = 0, gapExtension = -Inf) table(score(ex6Aligns2) > quantile(randomScores2, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(start(pattern(ex6Aligns2)) > 37 - end(pattern(ex6Aligns2)), experiment[["side"]]) ## Method 3: Use consecutive matches on the ends with an FDR of 1e-03 submat3 <- nucleotideSubstitutionMatrix(match = 1, mismatch = -Inf, baseOnly = TRUE) ex6Aligns3 <- pairwiseAlignment(ex6Strings, adapter, substitutionMatrix = submat3, type = "overlap", gapOpening = 0, gapExtension = -Inf) table(score(ex6Aligns3) > quantile(randomScores3, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(end(pattern(ex6Aligns3)) == 36, experiment[["side"]]) ## Method 4: Allow mismatches and indels on the ends with an FDR of 1e-03 quantile(randomScores4, seq(0.99, 1, by = 0.001)) ex6Aligns4 <- pairwiseAlignment(ex6Strings, adapter, type = "overlap") table(score(ex6Aligns4) > quantile(randomScores4, 0.999), experiment[["width"]]) # Determine if the correct end was chosen table(end(pattern(ex6Aligns4)) == 36, experiment[["side"]]) @ \item (Advanced) Modify the \Rfunction{simulateReads} function to accept different equal length adapters on either side (left \& right) of the reads. How would the methods for trimming the reads change? <>= simulateReads <- function(N, left, right = left, experiment, substitutionRate = 0.01, gapRate = 0.001) { leftChars <- strsplit(as.character(left), "")[[1]] rightChars <- strsplit(as.character(right), "")[[1]] if (length(leftChars) != length(rightChars)) stop("left and right adapters must have the same number of characters") nChars <- length(leftChars) sapply(seq_len(N), function(i) { width <- experiment[["width"]][i] side <- experiment[["side"]][i] randomLetters <- function(n) sample(DNA_ALPHABET[1:4], n, replace = TRUE) randomLettersWithEmpty <- function(n) sample(c("", DNA_ALPHABET[1:4]), n, replace = TRUE, prob = c(1 - gapRate, rep(gapRate/4, 4))) if (side) { value <- paste(ifelse(rbinom(nChars,1,substitutionRate), randomLetters(nChars), rightChars), randomLettersWithEmpty(nChars), sep = "", collapse = "") value <- paste(c(randomLetters(36 - width), substring(value, 1, width)), sep = "", collapse = "") } else { value <- paste(ifelse(rbinom(nChars,1,substitutionRate), randomLetters(nChars), leftChars), randomLettersWithEmpty(nChars), sep = "", collapse = "") value <- paste(c(substring(value, 37 - width, 36), randomLetters(36 - width)), sep = "", collapse = "") } value }) } leftAdapter <- adapter rightAdapter <- reverseComplement(adapter) ex6LeftRightStrings <- simulateReads(N, leftAdapter, rightAdapter, experiment) ex6LeftAligns4 <- pairwiseAlignment(ex6LeftRightStrings, leftAdapter, type = "overlap") ex6RightAligns4 <- pairwiseAlignment(ex6LeftRightStrings, rightAdapter, type = "overlap") scoreCutoff <- quantile(randomScores4, 0.999) leftAligned <- start(pattern(ex6LeftAligns4)) == 1 & score(ex6LeftAligns4) > pmax(scoreCutoff, score(ex6RightAligns4)) rightAligned <- end(pattern(ex6RightAligns4)) == 36 & score(ex6RightAligns4) > pmax(scoreCutoff, score(ex6LeftAligns4)) table(leftAligned, rightAligned) table(leftAligned | rightAligned, experiment[["width"]]) @ \end{enumerate} \subsection{Exercise 7} \label{sec:Answers7} \begin{enumerate} \item Rerun the global-local alignment of the short reads against the entire genome. (This may take a few minutes.) <>= genBankFullAlign <- pairwiseAlignment(srPhiX174, genBankPhage, patternQuality = SolexaQuality(quPhiX174), subjectQuality = SolexaQuality(99L), type = "global-local") summary(genBankFullAlign, weight = wtPhiX174) @ \item Plot the coverage of these alignments and use the \Rfunction{slice} function to find the ranges of alignment. Are there any alignments outside of the substring region that was used above? \textit{Yes, there are some alignments outside of the specified substring region.} <>= genBankFullCoverage <- coverage(genBankFullAlign, weight = wtPhiX174) plot(as.integer(genBankFullCoverage), xlab = "Position", ylab = "Coverage", type = "l") slice(genBankFullCoverage, lower = 1) @ \item Use the \Rfunction{reverseComplement} function on the bacteriophage $\phi$ X174 genome. Do any short reads have a higher alignment score on this new sequence than on the original sequence? \textit{Yes, there are some strings with a higher score on the new sequence.} <>= genBankFullAlignRevComp <- pairwiseAlignment(srPhiX174, reverseComplement(genBankPhage), patternQuality = SolexaQuality(quPhiX174), subjectQuality = SolexaQuality(99L), type = "global-local") table(score(genBankFullAlignRevComp) > score(genBankFullAlign)) @ \end{enumerate} \subsection{Exercise 8} \label{sec:Answers8} \begin{enumerate} \item Rerun the first set of profiling code, but this time fix the number of characters in \Robject{string1} to 35 and have the number of characters in \Robject{string2} range from 5000, 50000, by increments of 5000. What is the computational order of this simulation exercise? \textit{As expected, the growth in time is now linear.} <>= N <- as.integer(seq(5000, 50000, by = 5000)) newTimings <- rep(0, length(N)) names(newTimings) <- as.character(N) for (i in seq_len(length(N))) { string1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], 35, replace = TRUE), collapse = "")) string2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) newTimings[i] <- system.time(pairwiseAlignment(string1, string2, type = "global"))[["user.self"]] } newTimings coef(summary(lm(newTimings ~ poly(N, 2)))) plot(N, newTimings, xlab = "Larger String Size", ylab = "Timing (sec.)", type = "l", main = "Global Pairwise Sequence Alignment Timings") @ \item Rerun the second set of profiling code using the simulations from the previous exercise with \Rfunarg{scoreOnly} argument set to \Robject{TRUE}. Is is still twice as fast? \textit{Yes, it is still over twice as fast.} <>= newScoreOnlyTimings <- rep(0, length(N)) names(newScoreOnlyTimings) <- as.character(N) for (i in seq_len(length(N))) { string1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], 35, replace = TRUE), collapse = "")) string2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], N[i], replace = TRUE), collapse = "")) newScoreOnlyTimings[i] <- system.time(pairwiseAlignment(string1, string2, type = "global", scoreOnly = TRUE))[["user.self"]] } newScoreOnlyTimings round((newTimings - newScoreOnlyTimings) / newTimings, 2) @ \end{enumerate} \section{Session Information} All of the output in this vignette was produced under the following conditions: <>= toLatex(sessionInfo()) @ \begin{thebibliography}{} \bibitem{Durbin:1998} {Durbin, R.}, {Eddy, S.}, {Krogh, A.}, and {Mitchison G.} \newblock {\em Biological Sequence Analysis}. \newblock Cambridge UP 1998, sec 2.3. \bibitem{Haubold:2006} {Haubold, B.} and {Wiehe, T.} \newblock {\em Introduction to Computational Biology}. \newblock Birkhauser Verlag 2006, Chapter 2. \bibitem{Malde:2008} {Malde, K.} \newblock The effect of sequence quality on sequence alignment. \newblock {\em Bioinformatics}, 24(7):897-900, 2008. \bibitem{NeedWun:1970} {Needleman,S.} and {Wunsch,C.} \newblock A general method applicable to the search for similarities in the amino acid sequence of two proteins. \newblock {\em Journal of Molecular Biology}, 48, 443-453, 1970. \bibitem{Smith:2003} {Smith, H.}; {Hutchison, C.}; {Pfannkoch, C.}; and {Venter, C.} \newblock Generating a synthetic genome by whole genome assembly: \{phi\}X174 bacteriophage from synthetic oligonucleotides. \newblock {\em Proceedings of the National Academy of Sciences}, 100(26): 15440-15445, 2003. \bibitem{SmithWater:1981} {Smith,T.F.} and {Waterman,M.S.} \newblock Identification of common molecular subsequences. \newblock {\em Journal of Molecular Biology}, 147, 195-197, 1981. \end{thebibliography} \end{document} Biostrings/inst/doc/PairwiseAlignments.pdf0000644000126300012640000121055012241047574022314 0ustar00biocbuildphs_compbio%PDF-1.4 %ÐÔÅØ 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Introduction) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (Pairwise Sequence Alignment Problems) endobj 9 0 obj << /S /GoTo /D (section.3) >> endobj 12 0 obj (Main Pairwise Sequence Alignment Function) endobj 13 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 16 0 obj (Exercise 1) endobj 17 0 obj << /S /GoTo /D (section.4) >> endobj 20 0 obj (Pairwise Sequence Alignment Classes) endobj 21 0 obj << /S /GoTo /D (subsection.4.1) >> endobj 24 0 obj (Exercise 2) endobj 25 0 obj << /S /GoTo /D (section.5) >> endobj 28 0 obj (Pairwise Sequence Alignment Helper Functions) endobj 29 0 obj << /S /GoTo /D (subsection.5.1) >> endobj 32 0 obj (Exercise 3) endobj 33 0 obj << /S /GoTo /D (section.6) >> endobj 36 0 obj (Edit Distances) endobj 37 0 obj << /S /GoTo /D (subsection.6.1) >> endobj 40 0 obj (Exercise 4) endobj 41 0 obj << /S /GoTo /D (section.7) >> endobj 44 0 obj (Application: Using Evolutionary Models in Protein Alignments) endobj 45 0 obj << /S /GoTo /D (subsection.7.1) >> endobj 48 0 obj (Exercise 5) endobj 49 0 obj << /S /GoTo /D (section.8) >> endobj 52 0 obj (Application: Removing Adapters from Sequence Reads) endobj 53 0 obj << /S /GoTo /D (subsection.8.1) >> endobj 56 0 obj (Exercise 6) endobj 57 0 obj << /S /GoTo /D (section.9) >> endobj 60 0 obj (Application: Quality Assurance in Sequencing Experiments) endobj 61 0 obj << /S /GoTo /D (subsection.9.1) >> endobj 64 0 obj (Exercise 7) endobj 65 0 obj << /S /GoTo /D (section.10) >> endobj 68 0 obj (Computation Profiling) endobj 69 0 obj << /S /GoTo /D (subsection.10.1) >> endobj 72 0 obj (Exercise 8) endobj 73 0 obj << /S /GoTo /D (section.11) >> endobj 76 0 obj (Computing alignment consensus matrices) endobj 77 0 obj << /S /GoTo /D (section.12) >> endobj 80 0 obj (Exercise Answers) endobj 81 0 obj << /S /GoTo /D (subsection.12.1) >> endobj 84 0 obj (Exercise 1) endobj 85 0 obj << /S /GoTo /D (subsection.12.2) >> endobj 88 0 obj (Exercise 2) endobj 89 0 obj << /S /GoTo /D (subsection.12.3) >> endobj 92 0 obj (Exercise 3) endobj 93 0 obj << /S /GoTo /D (subsection.12.4) >> endobj 96 0 obj (Exercise 4) endobj 97 0 obj << /S /GoTo /D (subsection.12.5) >> endobj 100 0 obj (Exercise 5) endobj 101 0 obj << /S /GoTo /D (subsection.12.6) >> endobj 104 0 obj (Exercise 6) endobj 105 0 obj << /S /GoTo /D (subsection.12.7) >> endobj 108 0 obj (Exercise 7) endobj 109 0 obj << /S /GoTo /D (subsection.12.8) >> endobj 112 0 obj (Exercise 8) endobj 113 0 obj << /S /GoTo /D (section.13) >> endobj 116 0 obj (Session Information) endobj 117 0 obj << /S /GoTo /D [118 0 R /Fit ] >> endobj 146 0 obj << /Length 1100 /Filter /FlateDecode >> stream xÚí˜MsÛ6†ïþ<’3%B|èMuí¦¦ã6ÊäÐöÀÈJÊ©%*"å$ÿ¾» @’cËBgädÚá"E‹Å¾¾›ž=»”"ã5\«lú6ãN1åDf”eNÙlzýž_ÂäMÁóvý¡ôó¢”U•¿œÃŸ÷P6x³„2 o&7Xï]xº˜/ QçC_ü9ýéÙ%wçÌi-°SÃY%MV Ë,ôû¬©ÏÊMÍ aó¿Á883yS”péðÑ'üé6ÔÏ$3Ne%—»ü€½[2u]]@i–hMç?ã=”7Ô¾4†‰ªjoá²°"_cÛkßæù&ø6CGÿ aÁ¡öÝP­óf•µòÚèçø|½kí+$ÚèJ­˜öîX^âë˜!çoâuÁ+›Oü8@V‹Q•LÖÊ7þ…"v‹ú À?Êè—;kn+?Ò«&A5Ť2¤ZÉ­fÂʬT‚Yë|çP½[Òû7÷wAu¥2Çœ›Wà ÀðxQ:èòGh òCÓ!Gù5²…Ún+1x=s°Am…o|zÇ®ðv¯Ð%ò÷·RZéú>t3ß" o&Ývaô ߉üjÝ1¨EQTŽ»àÌg£“Þ‹Z» NáÝP°Éæeát¾‰Ì -…‘hB…´{:€¢Ná÷Bßcp—A#P„WBæcëÙþÇ/%ÖÐFä .ðÁÃE9wð’På)jþWŒqcª\?ð”Q }žÔQ}Žïšžì ѦÒ2zu •¡9-4&ýDÐ<ÇÊ7+š®iyl"€+^U*:~Œ+Æ•¹:W¸âU*XƃujàrÝž™ï#]CãQêýâ­ ÓFÆÅ›“º÷H(•âÌ@žx‡“Æ‚Y81 "•…Ú³0Y«µ³æÎ ð-ôÁ«ü*³æw~Þ¸¸Å‰¥ )Çnc³³ÂO¾Þ‹]v8¿ñ“ "׆Ô{› Q3®ÃÉàB*I<Š´™©N£Q4~-m:´1[tˆß-ÖÚƒr&¶få÷f½üv¬,Ž­žd»¹˜åê|o[u 3›†™1;1fu*f.³_  8ý„)m‚Ke¿ Í>?ÛiíAÈ>ŸB?’!Ga#.p#þKË ¿: ?—†_ýÕðûÿ±Lø‰äü Ŭ@Íýñ NI«¸|îSH]¡zøÿŠ+„uÇÏ饦g¼ ¬èGQ±#*'FEþTø!Tö×¼æ‘ ßl»•›û or0:Yü‘-"HmD\ïîüa¾Eá‚ Y϶¸àÞ3öö} 9­?„ªJFU$¡ÊGTOŒªŠÜWCSCŒj|95ä15䍯‰ÕЇÕPÇÔP£_N }L =ªqb5è´8—|•R1£UL!àÕÙÅôìbNX× endstream endobj 118 0 obj << /Type /Page /Contents 146 0 R /Resources 145 0 R /MediaBox [0 0 612 792] /Parent 155 0 R /Annots [ 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R ] >> endobj 119 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 489.036 143.832 497.902] /A << /S /GoTo /D (section.1) >> >> endobj 120 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 465.185 279.811 475.985] /A << /S /GoTo /D (section.2) >> >> endobj 121 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 443.267 306.261 454.067] /A << /S /GoTo /D (section.3) >> >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 433.245 147.828 441.962] /A << /S /GoTo /D (subsection.3.1) >> >> endobj 123 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 409.394 268.513 420.194] /A << /S /GoTo /D (section.4) >> >> endobj 124 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 399.372 147.828 408.089] /A << /S /GoTo /D (subsection.4.1) >> >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 375.521 318.814 386.321] /A << /S /GoTo /D (section.5) >> >> endobj 126 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 365.499 147.828 374.216] /A << /S /GoTo /D (subsection.5.1) >> >> endobj 127 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 343.581 153.765 352.448] /A << /S /GoTo /D (section.6) >> >> endobj 128 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 331.626 147.828 340.343] /A << /S /GoTo /D (subsection.6.1) >> >> endobj 129 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 307.775 399.391 318.575] /A << /S /GoTo /D (section.7) >> >> endobj 130 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 297.753 147.828 306.47] /A << /S /GoTo /D (subsection.7.1) >> >> endobj 131 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 273.902 357.997 284.702] /A << /S /GoTo /D (section.8) >> >> endobj 132 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 263.88 147.828 272.597] /A << /S /GoTo /D (subsection.8.1) >> >> endobj 133 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 240.029 379.087 250.829] /A << /S /GoTo /D (section.9) >> >> endobj 134 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 230.007 147.828 238.724] /A << /S /GoTo /D (subsection.9.1) >> >> endobj 135 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 206.156 193.575 216.956] /A << /S /GoTo /D (section.10) >> >> endobj 136 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 196.134 147.828 204.851] /A << /S /GoTo /D (subsection.10.1) >> >> endobj 137 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 172.284 288.408 183.083] /A << /S /GoTo /D (section.11) >> >> endobj 138 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 152.298 168.071 161.165] /A << /S /GoTo /D (section.12) >> >> endobj 139 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 140.343 147.828 149.06] /A << /S /GoTo /D (subsection.12.1) >> >> endobj 140 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 128.388 147.828 137.105] /A << /S /GoTo /D (subsection.12.2) >> >> endobj 141 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 116.433 147.828 125.15] /A << /S /GoTo /D (subsection.12.3) >> >> endobj 142 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 104.478 147.828 113.195] /A << /S /GoTo /D (subsection.12.4) >> >> endobj 143 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 92.523 147.828 101.24] /A << /S /GoTo /D (subsection.12.5) >> >> endobj 147 0 obj << /D [118 0 R /XYZ 63.8 705.06 null] >> endobj 148 0 obj << /D [118 0 R /XYZ 64.8 700.753 null] >> endobj 152 0 obj << /D [118 0 R /XYZ 64.8 502.097 null] >> endobj 145 0 obj << /Font << /F32 149 0 R /F19 150 0 R /F39 151 0 R /F44 153 0 R /F8 154 0 R >> /ProcSet [ /PDF /Text ] >> endobj 161 0 obj << /Length 3372 /Filter /FlateDecode >> stream xÚí]ã¶ñ=¿ÂoÕ¢±"R¤(æ‡ )Š6À-ЇK¼¶Öëtmo,o>úë;$EI”íÛó%4^Ë$5œïÎp¿¼ý䳯ë™Ím%«ÙíýÌØÜ(5«l‘+f·«ÙÛLÈüFdÕÍ\Ë2ûêxnàsXŸ |Úæf^–%-¨d–ÃWQà—²vòë‚%bå˜U‘ÉêæûÛ¿ÏŠüÌ­Ö±4Ì9i˜?¥q]i”EOU,úœ4ê?¥qei”Æg_ƒ¯êœ×\¨ÜÂÈ\‚„„q1” -²7(žÅ‚²ÙÃgµÌ¾ÙÁó=à³]»y”¹ÒUâÙÄ’ Òö¥Áž¥‚IÜß/œ—2·2 (K•}CðJ‘}«çåU%ìÕ÷Æ‘R5C4çJ¨ìøàÕ ëlÅð¤É–ψ³»‘uväÅ?ßÀxà ñGüà²öèè]ImiÅ‚7~æßG­D•=ÁUÖà÷8zØòO‹ô³Wy|ùÜüp¯¼t3‹G‡þz·å9Â6óܺùݺCâ¡aöèXàemó¢P^0_º÷ö-±˜A´c¶*KÄù„,X"Íÿ¹ÑU¶XÓN ÌRÁ²ªï} $wd­ëµGž {z¶Ùþ>š§a¦AGÈX“›²ì!ãp'–I³gyí$Hì#¥y»9|>Ž©µ"×2ðE÷LÒ8zná/4/î-"ê4 ¿G*wKVi‘ýrä/BöÈ€Ls¡$*•k°@´F-XÇ_ºË=šÛÓ³Û~Ñß¾ v²u‘?—Ùù}v£ûCÏü€øðö¾{dŸA?ŸÈéâ »ê:d&úÜÍû$~&|uÀGú‹ƒ^»Öô®ÃúŽölkûæß¬ˆ¥‰Xôc¡t±ð[Œƒä纸áh5:{Ãq£Ù-i@e¯i7òwÛ&„Q^ü-3Tã±ÙœsaôÖ±U]ΨþÙ ØÕ£ó@ÛÅn_ÿ¾©;Ëv‰Ì{pfòZ¶.bEßl½²âÜœ@rÀåT¡w`SÞ@ÓªUî)7€úåüHÍû ,ò#0J!†âKÌwœiÈq¼Nè×Dô¦‹5üÎmØl[^œláyÕ;½îÝqR±r Ý ÷ûGƒs‘ÖY,$€ÿhÜ^­³ÀÃÆ…¾5 ^ˆHò¿s)‚×ã–³*·¦¬qI•‹Â‰¹²ŠWmÆT嵜EK(Lw®:±s™ "Ö.±±Îm}Á¾ö¢5ÁOË ImermŒÇaÉ+L„Ø)0p0Öò"Ò®1®@Œ9ÊæÕcPu^×Ú¯ =cˆšE›E(Á@™w݆BõÀ™0~¥,lv?Þ|‘)„_'R\9„¯ÀAU&û¿*þ2þë¦d)k -©E=”K෉ŹN$§1:Né_»ŒTËÜÔ¶olÎ#7 n¦§ß8B¶ÿUL ?ØL)Ña.¨¯ízäoìzäu\ü=TY^ÇõÈ?”ë‘W±T^¹ù{¸ž‹û¤ïé-ᘑx ‘Lø¸õà‹Ék g 18ë'­²2É“Žœtª8Ós«»DظPgÏNin/qçuÒ vÅå©#ŸüxŽ|˜¨×s‡âª Š4%žêÝ™ù]!UÊó¹9ºýRÂSàת³ê!P›DU‰w4©‰Š„:[‘P§+U^ù¬S*°PŽ%ÐíþÐbC=œÊ Ç¨ØÚ­iÝ‘ë¦ËÍ ãóŠ«·›~k%!dU !ý²Šµ"nï0Ú‰-×ÇÃuªhf ?莃>I FCÅ¢È?<EÖPU Â ç9°YÆu¡"é,j£®w$“G3H*§G\0E‘O$JBüXu±úzgm1™ ¦‰%a ¬N˜™Âré‚ÉW¡úÚš‹<ÖvÊM·`"ÑñÅáT½ †A]ñ¶8:HT¼ïŒaØ—¡`ó–JÁ\É^ñ¬;ëÓ4•§~¡† þùoÔžê¡Î?ãÒW„ʸY¨ ›+QÇÝÂ%6 Á´ào“=ðÙØ¨lW)‘½Þ¹J†‚ð®Ä…uôBa»͸á_žðHÕó£o É¡ ÓwHϯü“N?‘i®nÅC$ß"ÙÀ'$¨@ߣ}uמôG°8ûèÜîâá¨ãÙëTª†7)qÙp &ÂíØ¦úÝÒèìmºÜUÊêeQTœŠíg’œò\¹ð{&‚jý»uã;í:øy|PÜï“vž¾ì¤-£Ë Ê­õ­j?šýÚëcd\n%B ³D%k ¢Úp³•DE«°Mb»òEkê¦z-Ã×"ÅåK,l²49Šmdh%º³A}üDÇD ÀT©ºþZÑoãÁÏ5µÍà¡‹ç;ÚÜóˆ.aŸN§¨]·™^ôuàqå¦Âï•Êà˜6á ^¶)B›˜i¸cP=L›_´ª -˜"ym]’±‹\“Mþ©ê¡ðÆþÉÓ´eM˜VºÕ @§®‡ûRŠî%Y™mZ^óÛ–SÝIÚcØ$8½ðo%ÒÝFî¥GR†uÊÇà¦OôpÀ›XÉÖI‡®ù¹j´ÓÁÁýÀ)W©¸+ß¹dêôšA+!\rð²!ùb Ê‘¾çàÀµq ,‰TŒ5zãÚß-è‡Qô£ñ+û‚wÃé¡Ê‚d÷2äöÓ”º½à‡‹üÈ‹ˆd¥ŸòjÏ ŸÊóÍŒINt—8v g=ÊoÊ dÄ\ïÃ_϶»ã‹d»wZŸó…Dêò5GW ü7NôMÉ×Çf^Oˆ©4 |Î%B¯«Å#qy 0’%½J‰|§ #S†ŒÃÉÍ­øF™»æ¯TìÊzu_Ù!¶Wñ‘{~ˆß¯8 ºZ_Ck›¬¡Ù©£t­E‚85œðÒnqÐõ÷"`õ×75Xz.’:JŽ{nìÉ_Ø’+tÐÓÙœý7SRw&s¹y©êÎö”ͺ°¾çJmñæ1ÄJÇkzÎ1̵†ó°`7|äÎÝ{áLR»èrôaóà̱ÿ^ ó‰&;¼˜RfUO8U÷~ÛaÖ»":ä+ÉŽ¨Ž3øz[R×i–ÛE;® „j†ä7îâÛþ±ã¦ó5Ò:óÞêŽï­Él EU%“m¥òZÛA²mÒ¹¶>U²œfû¹¶I×õ奀ï}€¾Þy"}­§wc °ÈU˜ P0 HÉx5Å·õÔ 37Ïwû„Ì…Ug P^WvW0@uÚþfÂûÓj~kÏ'¯îù.Žz ¬OX༬°ó z1ò æZáÿ6Ñ¿zQ–s*vNæ?u•k-ÿpxµüýÿ'3©ÌÚ\jÝS/.5ãN”ûç§—*˜)Å5ˆ/>Ï\x>¼Tºâ#<œ<ì¾§¥¼ôl¹^6Ó%°,¾õôÉW·Ÿü²7˜ endstream endobj 160 0 obj << /Type /Page /Contents 161 0 R /Resources 159 0 R /MediaBox [0 0 612 792] /Parent 155 0 R /Annots [ 144 0 R 156 0 R 157 0 R 158 0 R ] >> endobj 144 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 689.794 147.828 698.512] /A << /S /GoTo /D (subsection.12.6) >> >> endobj 156 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 677.839 147.828 686.557] /A << /S /GoTo /D (subsection.12.7) >> >> endobj 157 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.747 665.884 147.828 674.601] /A << /S /GoTo /D (subsection.12.8) >> >> endobj 158 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.803 643.966 179.887 652.833] /A << /S /GoTo /D (section.13) >> >> endobj 162 0 obj << /D [160 0 R /XYZ 63.8 705.06 null] >> endobj 2 0 obj << /D [160 0 R /XYZ 64.8 629.969 null] >> endobj 6 0 obj << /D [160 0 R /XYZ 64.8 525.481 null] >> endobj 159 0 obj << /Font << /F8 154 0 R /F44 153 0 R /F39 151 0 R /F54 163 0 R /F55 164 0 R /F56 165 0 R /F11 166 0 R /F10 167 0 R /F7 168 0 R /F14 169 0 R /F13 170 0 R /F6 171 0 R >> /ProcSet [ /PDF /Text ] >> endobj 175 0 obj << /Length 3692 /Filter /FlateDecode >> stream xÚíË’ã¶ñړTÑd\›ªY'ëJÊë8ÙõÉö’8X'¢Æ³ã¯O¿4{+9$ I<º~£óæÃg_¼­Ïš¬©ŠêìÃåYÕd¶VðÈ3Û¨³ë³fïçjv·„?ÃþÜÀŸwî£ßÍÚæ4lÕï¥uw´Î ;»†—nÛ!˜?Ì*×vöÚxÜpïO#VøAHvðçÊ·z Ègü¯º_æe5k7ˆ´“— 95ºÝ Â+ÄØ­¡©jÆ=µûv%«íöóŸ>üõL9‹òl¡TÖ”%ÓðGÞxâàÒmQç³{·×kî¡Æ?~ÆÄ w½û–>p…mfk¤ñ¡“[‚Š_k½œõì!‰æ@]·ðQ¹¦þ’Þ¶7Ö;¸…áä!£Ãn5Âb’áºvÄôÒ ñeó…)Jæý,y`¹Yùr¡\Å”sÂT4†ø\Ϯ޶ã¦U‹$k4ì @ͤõÇ\ôQ†M޽4‰À´ˆ³]çhsÔ7á± šyªžÑfýæ˜b ¤.‚¸•5À¼5BÝa÷'^&‘¬ ã÷(&H0Öʾ¿ g²Ì¡Œ‡„‘#æ¶€]ë"d7Œb‡ßzÖò㪽• ûŽ_‚=!Þ ÎûÕ)\1óÖ¡N$„ݯNÌòzö£Òæk„uËÝß!A:†îiúŠÇ^ŠÔµÛîÛûýÏ$C é¡hÛ&kê¶Þdu-[+›ý(roPÆH‡Ù5íþ.ø@CÃØÀxòC+Hób¾hÊæ9pÉj%áö‘ö3ÜH Ù"¬¡'²¯p|ËJ]Ë3dèFXÊìÀ¦À.M¤›LS•5ºzÒ4!îjvïösßE›ÅtÊ>;Òg#¶|.ÛòhkaßñË/s‘©ý7¬z4Ü[¤N&‹¶æw·ª•C¹ -!©h÷ëÀí`_¿W,XZ¼- (ôØ¡…¸ mr+Ò¥¬®?\³úAÓh]¨›dy‡­c gÌ9:¥ÞÎzÞ[ œtâ·ênv¯ü;'Rmäa‚˜…ïæµž]¼szA“¶­÷t‘·;üfÃjв† ú™›ß?é$zçÖGÚó‘̓¬ïÍ7ƒ¿ |ÿNVÓ"ÂŒ@/¼¤–YÃàÿž°¼è4p™í ©uõM§aÇ¡´‚¦WV32oïžDöxÜ‚ÃÆà(@6Õl[;£ŽÓ!ÓȤ‰ò>ÑAnDsJÉ£€¦ŽÜH™µiÛAQcàegK2Vn>ivŠìV&öËv)h77C8³kÈ2’Þû°±K8[Ï\ijï÷.ì³³àUÿ6ª„=|!è‹·J!¯Q:«U ÒL”‚ÐÁʨü (iuM£²Ü ifšÒ&4*ŒžFÙ¬.—g¦’øyé*è iƒŸ§iÃQšQÑŸ-O9Å%Âä!¹-"vu#m€U¶†ÍeàÍNˆÛI$¸sá‹ïpAüàµ;;‰–>t íÜ“ÑçH"a>’kGŸ˜Pñ5 þ]:5ÞrÇ’Ã#2f DÝ»`>…¸Š8n}à^"vó €ºtèΘT§Î@àsxú"pÚåg,w²ºPŠD"yéi‹4ub…ѳ›‚<|ŠrNˆ‚l¿¿æ•ƺÕaÇ8\âù~C´ ¼+ŒHkèÀ Ö½à=ÂxãBÕ‰MóL Ô¬†®Ž5°Êjx ƼNàå,UuŒÎ¦õ] ©cl&«bû<­Î”U/EV 3ÁV„Ø~ÌóüxQˆ¯ñ•ybM`ñ¬qcv¯‰àõEP+®2“ëÈ“«U¸À~ ¬´*C`:±¢šßÈØ'iBˆv.S‰µô…\ŽEÊTMˆø¨m%™â„ÎL]MX“¹Ô^ÁXE9øNqèÝÿŽ–{Ï}dSÊê͇N—Àpp%‡Ï;ïSp&™”ð°QZŽHnéÈ*þÏÍc€Ûá™ï ªý ^¿½àwŠjqÎ?¾½8OR©Éì(mI2Yc]ÿk$B=3$è5)0Õ`¬òRÇ ÿ~·“°o6Ó•zq€±JIG^ÖgÁ”Ž:0ß–s2‰t ¸èˆUù©Lr"¯Wcà¹ãI% ©i2eüΖ E*³Â+mhŒÝMu¬8ªÈjPŠE‘]=¡9Á˜G¬VèkÊc„%˜šya›æVÈ4°IÊÛ¤_>$Ö®ÀÀ(ÓÖ¦´ö,B÷$¥pE)XàJ uls'.É*ý©ä± åñäkÝ‘yOJT Œ¯ýv’²šû=Iã"Ïtéá<$“ ;ÚÄe=Àå¤9D%”³g—cAÆsŽœ;îÆÓ’å!NíâðM'"”¨ã(Ú’óààkz0è/˜ÆãŒ#.é«T¬aXVÕõ³E«~¾h]|y‘-“iÓ<.ZU¦ms`“OI ä õäHõ)·òmb+pŠ §/ÛJJ’ÁvQm‹cEú'á. g11×WäLâ«7UÅylO©Þø¤žšQ¡·(¢ñAR©ÝøÑ"•å¬VÇc}ʳ:JyÜÚØÀ‹%kîŠ\Ut*ATXì¼ÕqöhÂ4³šYGvewÕ0×]¨b‹ãê°(ûÖAâ|?ž¿`?ü®¡lÆ\´¯Ób+åNap¢N‹Íi9áC™vjêÚGEÚ²PqQÑDÌsÜv†~ÏBTâÕš«Y\9åJ”Ôx8¨.®]K&v6:7|ç*lmp»žàÞ×&Áöz8‹êS€«ž…–>¨/-reJqMU>|Е{~—åh)°ÉBðÎc2ýØ.|ti‚ÝÖDs––£]`>õfàçÁ'aíX Üû»$^ŽçaÝN£ (ùû½O³Š!é)åí’½‚dãV{%†cÌ WÑ@¶˜KM¿H‰q ±Ìî¬æe(iy$’¸Hà¢È'dÊ$çëDž©”ˆ!´Élîã81‡âÜyß®F‘Ûñ·7,NiµrѾ¶üEGçhn]±Ç¶_ SQÁG÷ƒ£D€BÃsn[ú4}îÜ‚h j,µê<¨‰©cÆÑ.£Í\yB3Á&Y;Š}nä‚AGF°é»Õ}tÖ<´lÒ~þJ´ì½ %)ÙPºDïÓdÌ:”VŠ]µŠ _d÷Àq&„ †KU=&`•#! w2h»‡;&T9-†ƒxŽÓ~zÙÂÀKd¿¼±>[X'ÓMì[ÙµÛrеuý§Å«VbsàÕK„dz‹ÙÒ Yíˆ]f'“eûµrK ÌgîÌg |ð¾qbá…Õåt ­nåb—2U™Y;z/ˆ7+¾Ãf'Ü“zŽeX8p‘¨'-Dç[o´”-ûàŽP‰„w…\êxð)-‚®kºÑ1Ö¼ w+iGNtñ«“S¹W”°FÁŤU?\ûÅ[6:"TQ¥€˜7¯€:<天!ZU…™½ky mKoqTÝ  ª¬™½—›o; §`ì…;„^í¶¼AÍRƒßÎ8IíV‡SDŽZ‘Õ¹Äór7’Å£ V*+KСË;².ŠúÜÅ^HºV%:²–äp¼N(c¶­-'WÑ&ÃGÎ~ùbë"xìsF÷‹îÇ•1„ã*¬ôœL¡¯NþwáSǬU|>ÖC¹ªÑBjh-œgrç$ÄNR>ÁM ÂRù«EÆXNÃ@Û–|RÇCx©…KØØêâuů(ºkd†ªîô‰—pÀš >AÚß|&!TàeêjÌQࢮî¶áÕDÄ“ð»åÍ5͸ãÔá‡Úe{«±PþÒíy_oø 0,ø'¹ÆUZ`F7Y^LL\b³Þ€þ)ž²<ïè´µW𥻀(χ¹wLoœ‰TGl}Â›Š“Z¾`úý*ìWä@ùÌŽ€Ü1¦×üX^ ž;ªÔó¯“ßZúÏyÖ+¿—îU0¬“¡£ŸÅƒY‡h5ánƒ5§à›Ä ¿‚õ‚»¥oBöÝ' õ ÙB6»Øóýã[ª+þêéò ½ˆÉi¦R‚§ÿ@@Õì§˜ðŽ£ ùœMܳ>Í­§ÐœæZb7ƒ€íQð¸D-? øùYi«9XpãXÂÙïÿ« ÔÓíØÄ™\µÝö$“%:ºÑZPìó³85ivwí©=ºN.àrš™-Íã².3­½fÆÎ%JÞ­Sb™mBü)‹—q.ÆŸr§ E6+`LÊ«þß×=Û×§¬'–½áƒ6üàLQ¤eé¹îó›£Ùÿs®óºÇ—¹ÀR\_)n¯†n0'xlä5XùoÆ`q¦vÇX÷ÙŸ?|öoíŠ# endstream endobj 174 0 obj << /Type /Page /Contents 175 0 R /Resources 173 0 R /MediaBox [0 0 612 792] /Parent 155 0 R /Annots [ 172 0 R ] >> endobj 172 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[0 1 0] /Rect [489.909 570.323 496.883 578.732] /A << /S /GoTo /D (cite.Malde:2008) >> >> endobj 176 0 obj << /D [174 0 R /XYZ 63.8 705.06 null] >> endobj 10 0 obj << /D [174 0 R /XYZ 64.8 367.153 null] >> endobj 173 0 obj << /Font << /F8 154 0 R /F11 166 0 R /F10 167 0 R /F7 168 0 R /F14 169 0 R /F56 165 0 R /F39 151 0 R /F55 164 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 181 0 obj << /Length 3062 /Filter /FlateDecode >> stream xÚíZ[Û¸~ϯì“ÆŠHQ·n³@[$EŠ.’tg±I4ÇÛ±4±âà³\µãqd‘")´‹N¶ó\;|ÀR*)²ÊÎD¶ÈJ`\wÉ}×òÃzàß·©2½¨Z‚„íê‡õ»MX;Ž?ÀIUš$yéoŸwëq•û#Í»]“ãÜÛi•&¦(ƒ¢-rØÓ/¢…­Pjµ²•ýYûX°6dWt5Q‡pï¢í53™"|Ól[~˜0Ô”©ƒ)ØìÌ‹t¹Yï¶ÜFŽom7MF‰‘$Íf;&Ÿ©:Ó‰2Å ¦²Ø~$YY›ñT%Õ”"vKTâŒÍ¿æ‚ßÞbÃm_fôæƒåáõ8ša0^eI]•ÂøB–E.ÜâÚý­K4l‘¥šõ[®› @‘Q±CmNÑð¹Ó¥lrã¡¯Ž» [›M;°º@‘ç>sý0«.=fçaÿz¼^Fbâ൚äÂ>(ºïŽHG™:Qζ¯p2½ ì2•i«ŽÆ)ìˆ'ȼ+‚ì(-CÝg).Qæ× ´úÒóÆBˆýn¡Y*ï¹Å7Aø{%¬¸¹ánÉÔæKË P>jÆ €Ã^üüj^-Ðñ¯üŠ4ónÉ[&8a´<ÿ· è33 "Ì€†¯âÍ|Ò‰ø8˾%bh§IØï”€}iâµ DëA Ö/Œ[H?"1³³=ãQ²OL‘Õ«t½ñ½KiÄ‹fàä…:\= u•¨µ|fÎ)‰ÉTù*ÔWÉ\€çù‘*˜à b¡ÃÖ¡w“¤™ ×À’Òˆý  ì„çlÖ¾:‘Ëÿžƒsinœ¥Ct¤ôˆUÊ£¶ÚB­€5eüR¨Ÿó½MÓtËÀ»Ò‰©®ßñr h»n] LtÇÔƒ[`ãÝÜ9¨Ç =û›p¶·˜0eËdXUSLÙ³´±`Z "Ä>ê<ÐI¨S 9jàØßàë7Ò ‰œ¥D@ð¨21¼ÍT”潺à:ÊdPÞ£¸?pgo+øwI~|°9î½íä—+°¡_?—ÃånÜXüíjð’RH¥(c‚¿oÒˆzé:O´3†ï÷Ù`£]* ÞñTä\‚ÁÙ• 3›",I¨Rt¯Å@Ž[,b$ò ‹Ð)$¨Ñ↰É1•/B‘r,°äuX뉓C¦6>â%'ÐÑÔw¹´j±ã7ïƒÝ²i•dZyÅdCîÝå50f-‘z´.ÃåpÄ«D9‘'ùèT_]oqƒ´ËË‘ãwXRÁ÷hɤN¦?õÖ§!ØiNsAUzóCj˜£‰8ý*©rWrx!‡¡9.bNszKà»ë$/&Ö,jŒ¤’ßÁ,½4³ç˜ùEéÉMR©Ïä*ìº,ç̾`Ë¥NÊÑr}åbL°ï ŒN*í¶÷:jT ûw‚×±@“LQ‡S&¥y°¿P…êaòÀýN¹¶=ß‹µ‡g]¨‚>UFVÓ²™­ Vаîø×-xÄþBWà¼@Òm6•4h‰T«uiÃ×:n´Å8lU–O]‚áÊb üÍ’BåÓð­R¯cá‡^?å¥×“†¢" L š…·˜ ¯HŸñH…™ú|[Ï`‹úµP›JèƨštTÂÈ `~A7†˜5Ícd&u¥Oèq걮ͨÇ÷¬#”ŸÒ 3SQV(ðjù)𗦎]êÔVžÆ¶R^Ó;Èí”.¨ ?QÕÖ°j™ÿwT»JŒQfcš™HÌ/ µšÆüÃuXÐ-'v­ÃØñkT^—®RÉ AêâD ò‰ ± *GsµJû÷S8,ž§U£Õ‹_yeNäiX-OTå´V’Y‡Šr®öÒþ=Ô+YZ)†¥þiU ƺË"Z’ænŠðµˆ…1¶€?´ÞE¢ªõ.“ô–V]XDÈŒ`^ó™ ýÜGwÖœ%+å–c3º" ýsW+r±6VQ¡Žj~ €=(°é·#– ¦ãÿäg¤-Ê„)u¤>u×ÍàíµUTl[’øLg…ïd_´vŠa7ž,™< X¬ù~ÂÖš„Ϋ4µõö&‹.§É­†„'*.Hq›¬tá‰ÀºÀ-´Ò݆Êñn ´;¶¸»·®T¨Î¾gÚºªíVÒ›š]¬œ®ëªrŸ§RÚðë@D±mÔLê¹ãEq”£RSz-â)y†@UÑ7ŸËŸ¿?u&›ž†Ø™4Ó>ÖÖà§³0x,4 ’©úH×.H;¨š+âÙg–+Ç‹2ŸÆ€à¯³õ…›i?À¥©ãÖ|X§ýzË=oœÑjoô XòÁwžÔµ %99ÀŠût:¡:ÊáŠOÿv±âÿùbEñíbÅïpµüÛÅŠ 劉ô/e9ó£ãü'|~–ev;câ…ùðÿØ=©$O±<›BÎ |3ØïѳóGÿ 1Ós endstream endobj 180 0 obj << /Type /Page /Contents 181 0 R /Resources 179 0 R /MediaBox [0 0 612 792] /Parent 155 0 R >> endobj 182 0 obj << /D [180 0 R /XYZ 63.8 705.06 null] >> endobj 179 0 obj << /Font << /F8 154 0 R /F56 165 0 R /F59 177 0 R /F55 164 0 R /F11 166 0 R /F14 169 0 R /F13 170 0 R /F10 167 0 R /F7 168 0 R >> /ProcSet [ /PDF /Text ] >> endobj 186 0 obj << /Length 2066 /Filter /FlateDecode >> stream xÚÍYYo#Å~Ÿ_ÍS[][/¸b€A H€í8ÇmÜ!óë9[UW»ÛÁæ^Ý‡Ž«k9ËwÖê¼¼zöÑ+[_h­jïÍÅÕõEáTuQÔ¹*k}qµ¸ø9³)=™jm\öÕ_ð¶ÜÏáïºÅádjKŸéɯWß~ôªº¨U]˜ i£tå.¦ºR¶RZM¦®®³Û5œÝ³âƒÞ'']®@¦œì`Ó ¹Á³‡ç^ÆÌ\gŸÃ³‘¹•½•5†’U•*]¼˜LM]d¿äÚ`X•pDg7K¯6Í[”YÐÎ’¸50,³9­r[à© –aõω©*‘o¶ã%ÒgMštjÐJ‹"ÿq‡Hj.Ì6¤é @SÄl®ù‰›9RñªLY(§=Ðð Äsçžwò»’ßçCW9ØUP퇼t­¬`?Oh¿KÆÃ¡aÇY×Y›jޝ ^#¾¸ssÀYÃÈ:LÀ£‘`Œ2NàV…+˜‘7ý’-´A?0é“Däñ78 Ž{f"ß3ìI-˜£ån¦•Y÷É0vEŠ]å•.mÐEnDxŽª¬›íºB+WÆ(š¡C¬înٹ؇H„V@Zшj3bÉ òÑSØõÄØõ½ÉUÕYî? ¶u¥Ê 䣕Ñ5¯ýŒALzÜ#d0"ÕnO¢P,š QzÁrr ñçÁÀLAúW~eñ0Ï9e]a8œªÈbªr1¼“,÷fb%ë*&»Ëåðr·ÜÎiÂeŸS¢ì#¶·Œ&lþ]q&ˆH;D+'Hª¼b1^M*—5HtCÚSÎãl9u^G¿s>ÏËà{4³‹Á?—ÁnÃ|i‰¼\÷òX³Ex1pæä{Þ²žüáEžáÀWÎh˜t€+œÑ« ެÌbÊÞö|×®EŽmjÓäÈA"Eb@çÊûɬ“‘Ù¥aU*SĨz)d›ö0Èš½\ä–È´,ÍQ’ß'’?Å´+à “>2Þ‰Ãdš§àuɘêlJ <¦=YaӴݾƒ¤Ÿ”—AÚf‡¿n$ë7w«™êse^¼D Ìqуi®T<…üwä¨Å|?àž‘” ZËÞüñHⲕU¹`õfŠ÷”󀃼nýQù¹ïWuãûe=ÖôÈmŠR•PÎbEJ‰´6CN0Dì"pÏ¥Ô0Î_¢Ÿbsð÷&›÷ÚYe ýOâÙ'žœ¸¤¾•&‰ÊÂÈĕS…-Îth.b¸øé’š‘(ØåòDG–+“×=và%5”°ºê{I¯Ï(ú}†vQâïQË.c< áQ¨$î‘Q£u[[dWi’Iå1%ؼøŸ˜tÌã ¿+ªÀ]âU’6Yè¾o–Á<¡SÑ)ÜòÎã<šªXä[Ÿ­bH¹‹õ­ûhÛš?®“w±RYoCÔ”°àý-%´†•¡™*¯évÉ”@iÏÕ–Ôê^°µ'q|ß “¤ùµÀÔH̸‚"Ïñ ‰K$›ÇÖ¶œ¹#¡ò]‚ÄÛ˜ÁˆfC_˜ž@^gO¦:wef+cU­å#ô¥hÕ$‰˜áf ÁR™÷u™bItŒ_zý^ÄWÂøu’x×úy^û¸6늊QjñÄL¾’†ï–¹rÇ^ˆŸä’£m:Ëéaš–µž*Y3ðÔ²æá)ž°VÊóî¯yYÓôN¢{eŒXä)¶¿Mêò<¦†“¦+þ_Mwäø¶o,:æÀþœÙ76W&gûÁþ#X%f¸’˜Ø±&%ÿ¼N‚|hÚò…¼D!Y=µ¯ócõùMR×ÉWû¦ƒüÌ4u¢JOí2æ[á½IdyH⯯t¥e7* moQ”ˆ#ýÎñb k\w¥öd¶ÚH«o„ˆ“ÃË'‰>5Ndÿ"Nˆøîp v>/D 9ܾ:…©äðâ}$)…H}„Éâ1"gñG:æ÷­ïi™ïýWÅjåóšþi¡°ëÙWWÏþZìÍÞ endstream endobj 185 0 obj << /Type /Page /Contents 186 0 R /Resources 184 0 R /MediaBox [0 0 612 792] /Parent 155 0 R /Annots [ 183 0 R ] >> endobj 183 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.696 616.104 226.392 627.964] /A << /S /GoTo /D (subsection.12.1) >> >> endobj 187 0 obj << /D [185 0 R /XYZ 63.8 705.06 null] >> endobj 14 0 obj << /D [185 0 R /XYZ 64.8 700.753 null] >> endobj 188 0 obj << /D [185 0 R /XYZ 64.8 688.21 null] >> endobj 189 0 obj << /D [185 0 R /XYZ 64.8 654.398 null] >> endobj 18 0 obj << /D [185 0 R /XYZ 64.8 602.227 null] >> endobj 184 0 obj << /Font << /F39 151 0 R /F8 154 0 R /F55 164 0 R /F56 165 0 R /F54 163 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 196 0 obj << /Length 1857 /Filter /FlateDecode >> stream xÚíÙnÜFì=_±ð“µ&šKЦp€E¢ Ö@$yµò‘ìá¬äØùû’Ž4Òj]§1úR? VqHor_ž>{þÚÚY!ŠT¥³ÓóYjD>K‹Dd…œ.gï£÷sIXç±U::‚Ç7°JXW°v°nù¹UÃ:µâ½ XXkþ†Ï-Ã.fÃp+†ÁýXg°>ñ^Åçü·5¯’yøëhþñô÷Y2‹¥\‹ø/ù`Ë€›ÀÏ1ÁËèšq þÏü|Á4¸ MŠå%_gË×óÃ+6žÍç¯ó@ì҈˜Y¬@ðš?½$6¨öÀ”J ØÉ\Ù¡´ë¹UÑòÝ‚èqÜ^ÔÄÒé\‹4K=¶]N•…°IæÁÞ¢JOµýFJ÷|LÀðÑ á>>¤´Â¤… Q•(®¦næ±6Yt¹]sô‚—»¬ç±R*ú µ¹(¯¯á-êe/b)´°©õ ¢g©(2“õ‹4×3ˆd$ ”@ |ÃÎb+${ÈÕþeR‘åv&…)Qãí¹é¬‚L‚®–;¢+ n‡vë܈Œb`~çhg;rª\»H½À÷æeåéàn 4€Ø¡ˆ-„lùÜí¥sÒœŒ^ÉUÈço{o§/ ú‚6A§«þ‹³‘ гB¼DË!aÔ¤:”Kp³¥û Ï•nûC"Í]–ŽD|Åxã_¶›©èÐTD.“ÖwU‘(€kØRHÔyñÒ½{Qâóªô¦&厊%K*ÁÒý|áæ$Ó"!tŸøŒ`kOA“|«mà;ý. ‘Cbì®E`€ Ç6—.Ju<±úš>ú88¼‰»rÒ0˜ô¡±£L2â`"^¾õ’ÒEË¡|*…ÔlÑï8 LÅ×õÿU:°• ¾&È‹ëN_ôég4¡)Æ~»µYßsq×ß?fþº Cm)»ÓÖ/îGÁN:¬puà’i®ùöeP4ƒƒ« šh{WfCmz÷ŒŒu,¦C.½Ú™ö´à[ zLîÁºz æ®¡ÚúG'PõŽ‚ËW¼êÀzá{ïÙ›xOw¢9Xæ…Ü„,\”:Ɖ †ÄÛüÜj3!¤Zxøûp h—‘ÄaØ>l¢—#Ô#äˆÿ_ÐÅÌ!T^B™H¡.&ôà„DCR&zEÕÏ® Š1Yû~m­„Ì¡½¹Ð9W­RÌcSÑ_XÈ@ë¤+ÉtÒ׊¸}íù]—®×"ˆ3W´‘J°s®‹ðÛsÑ×rPíÐyÌzŒ)¨•ꞯ÷ÏXîL6B™‰íz—7e"‡ñqИô•(U½`*]k²êšÏ>$AC1i1h:ï{rŽ•-„Öfdj÷ôTÚv&ë€h{E4÷HY°ŠÄø³-Ùˆõ†Ý#¾i\{¢øÕµ9t1Jï;Ýɦ¡Ä‚rÞ¹š–Bùw¾²–\kãWg»]AZWA•M`qJtFm„6)uìÛ] ½ðC|X¶ê7sÍùn¤I2îEíÚŒME&:é5ËjÕÎ ø7<·"o޵ë”pûõ¼0ÑͦjÃ;pÑë¤È“œ;ñyåû™/BÀ<7‡ˆ +¸;½–›%>$‘ÆEL_’oÀ9ë—Ú#¦íŒ¿ú^ =ß„¡9h½˪un}Òºt [pDk¢O”?Û%z!Âwá¾êž¥ú!ÚŸ(¤ ºn>qM]þÅÔe¿ê¸¤ò½³dÆû¹ª›ДÿÿWŠpÏ^>ûgzç endstream endobj 195 0 obj << /Type /Page /Contents 196 0 R /Resources 194 0 R /MediaBox [0 0 612 792] /Parent 155 0 R /Annots [ 190 0 R 191 0 R 192 0 R 193 0 R ] >> endobj 190 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [202.771 325.558 222.467 337.419] /A << /S /GoTo /D (subsection.12.2) >> >> endobj 191 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.184 271.585 103.158 282.424] /A << /S /GoTo /D (table.1) >> >> endobj 192 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [108.59 271.585 115.563 282.424] /A << /S /GoTo /D (table.1) >> >> endobj 193 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.402 271.585 145.376 282.424] /A << /S /GoTo /D (table.3) >> >> endobj 197 0 obj << /D [195 0 R /XYZ 63.8 705.06 null] >> endobj 22 0 obj << /D [195 0 R /XYZ 64.8 391.853 null] >> endobj 198 0 obj << /D [195 0 R /XYZ 64.8 377.44 null] >> endobj 26 0 obj << /D [195 0 R /XYZ 64.8 311.764 null] >> endobj 194 0 obj << /Font << /F55 164 0 R /F8 154 0 R /F56 165 0 R /F11 166 0 R /F13 170 0 R /F10 167 0 R /F59 177 0 R /F39 151 0 R >> /ProcSet [ /PDF /Text ] >> endobj 203 0 obj << /Length 1704 /Filter /FlateDecode >> stream xÚÕYIsÛ6¾ëWprèH3!€ØØCg’69dzhkßhж•±k©“߇W‰}èxd’ ððÞ÷V<>ÍH„áDR"*“HbŒ8gQ¾ž}¹ÁÑÞ}Ž0JR=›™ëˆ±ažÀýct5û{öázöR” *¢ë»H%ˆr‰” TÁÈ2ú2ÿ´Pl~Ú,ÈöàDäo#ˆ• h„òÙ)ÛäAj¿¼’Ý<üU.êSaÄð$öÆ¡ôMä+çvªqE½yûK…¸-`ë¨N[g ®Ÿ¯J&}‘wy%ÀáʦQˆ¤'âÿSh´NGsç?µ: [OÍsʈÈ<Æ[¸@,ä´ÊFX‘1±gã‹ØÞ: ß;œ ½{”jkÆjÓ™%»]bÎí"¢gÆOÒIpf *¦ÆÙs´ºÆq£çˆÒp‘Wûäþª­ð„"®¦1ìD "Ék¾:S¦uŸ¯;Ÿ2â;ÓÚ`‡[o,)ˆ3ÝC2 ßvì –ÒO0QÑÚßåüL‰D1tÿ¡ QÂG÷@¬%ûàox%.úÕ;[3Žê ñ ë•?Ëô €rƒ& ;oÁVQÞšÊW<9•š2 ›eÍøl ?.EÆ÷qvýȰT I¦± ë°Ûú³¯÷#[>Öa˲¦— TÃgý—ôyåO¾¶>¸2ÅÉX1$G¹Ñ.[¹)Ï&¢ûžm—õ ÷_Ħ‹X\œL4'?\‡p!¨1V“ $¬‘uçnu2gU¡T™ƒ¡Á)?›ú¾hÙNê Á RhéŠâ•þz¡×¼¨˜#¿.b ×óy¥ô!W+[-‹ÚNÚYË´óWú\àx¿ |nMÉU5kßðÕ^È~Š¡¸"žf¶ Lµ½S°}9~kߢ;ê9W.Õ›–ŽmUŸªœÈi•3©@ùÝAöGŽã4ô °DÄ…JíÒß`%M:zdþsì¼åà*j‡I‡Çá(† ͈ô߇ȜÀïÆÒgöÂ;Øò U‹¡®Ý+0Ř’L õ§d0ñ—1¨Õ»rÓ2¤ì%½1ÿÁkåšÒ¡cŒqVú½ÝãÃÀGž«ò“…™ö0ŽnOYa§èzgo»;êæÕZžH=É<—…\mOf¡C©ÆÊk*H (—+OŽÇÜQ‰cC·iÑ6­ƒ(jîV1J±š3ÔaqYYÍWg†—Y¡ê´Â7ŽÈ0*¦‘ë§Ÿ\O‰ða ðÖ÷}´À˜˜¶}ïm]r?DÛCI{ˆµ‡x{H´‡d{Hµ‡R3dÍÙ±ßeÎoÛŠÅ̤y>5žó3ÏEã9>ó~Ù9?tQw™¿»ÆúýÈýóŸä7°Ì°  A µ˜¦IœŸH_×ýúUä endstream endobj 202 0 obj << /Type /Page /Contents 203 0 R /Resources 201 0 R /MediaBox [0 0 612 792] /Parent 205 0 R >> endobj 204 0 obj << /D [202 0 R /XYZ 63.8 705.06 null] >> endobj 199 0 obj << /D [202 0 R /XYZ 143.364 456.529 null] >> endobj 201 0 obj << /Font << /F8 154 0 R /F55 164 0 R /F56 165 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 208 0 obj << /Length 1775 /Filter /FlateDecode >> stream xÚÕYmoÛ6þž_!  c5'¾“û0 ëÖ2´°1 hûÁ±•,E¹–Ý´ûõ;’G½Y²åÖû0Žœ#ïx|x|îNùxE“ ~h¢1‰²–Hi’åúêíû,YÁÈ«$#ÜšäÉÏ['BkB‚ïÉìêÍÕ/ó«_šÄ«˜J淉ΈÖLeÄÚd¾JÞ¦/'F¤ûÇ M—;øuŸâqò~þêê·ùÕÇÊ*%ɸb4?æL§ÄJ9äU”dܶ¼ø–ÍKçÄØó&®°Lœ xvˆˆ6DqœYÀª¸ú|89|VG`Ñð”A¥éÉ ‡F¾Ø¡ådÊ9O؈jè KŒd°ŒWükÓw[·ƒG·…ZØÍæÂ’!uT\Ṳ̈nÅ…×¾GîÂÚù½·BÓ¿ÅídÊ2¾£\¼Ë¨x@àòüš>5§NﷃI‹­3ÇÒ•s †6 VNÏKúw¿t‰æ¶•K%âÐ<Ð)µ”HMáKÀ»:R§O\ˆ¡KN¶Åçmç^6|ÌŠ“Ì^朕"ÊУçË ÓÁaïí²öÓrç•Ç -©›UÖ÷È·=¨Qؘ´"FÁÑL™äljâ5ºCˆÏG`…¤€É%`•‚hvêúTQ›vTãv[€P§«½§½Øcì®ííyá'§£¼<‰;cà¶1#q瀗mØÝÁ8µÄéñûŸ×g·Àšâ"Ç!ðkŒòÂÅÅfïZ7ÌV~ Þÿ}}b>œª«HßF©ØÍÕ䱯ÏzÙrSì|Hg8ECÊ W±ËD8ψ¡G#¼ƒHÙr‰üÆaZ6è5Ä)‹Ç!³ïׂ˜6x¥ØÕÆoÑ6œm½vt\2§<~¼òàæ|>÷P>UìbúÎÿ= <•„éËÄ25Ĩã±<‹Žc,"8Ž*OûÍÜå1û„ÛÄÓ߉›ÉTŠôC*¶Sèaœ¬Ñ²CÎ1Î0´×qçÔ—#Èfœpz™Î±´wÅûá9÷þŸ ^ÖãÞtëS^à‡šl™#ÛÎyôäa2Dp ßu,Ÿv¾nªÎú!yÇmÀƒ8‘,]öw©T@»¤m\½hgAXŸ Ë¶IA@¨„j¸7Ö3½Wý4ÿ†º™¦ï2™aßPâÄ´ïŠgD×—’xcßÂägð¡ðy܉"v(â‡"q(’‡"u(Ò‡"s(²^ä':ßà›©k¬L³Î“ÈÙà|·BÖ-óާ'«ŸMãxô«“JÇŸ¬×8zžŸPòœe3zÛçÀ"#Ž;ȯ2^þ'žãî/éy—pˆ×VD¾,%m³’ …Ó6äy7°ßz’¡" Rï"²r±¯§ûÔ¼^Wcy4\OàÆ=šûsã_u6Ë_|ÇÌgh;Þ|áËbŸ.–cÞ:ô%¦¬•0# ‡Í¹§mþw †#Ô˜~ÉY«RªÊˆ8´G˜CnöïÑPU4B-<ï©e×L[½“éRÆ nê—Îfá{¾3ÌÓÊ!š xáRŒKëî(Ûªzu:n.…»§:/’¯ˆ‘àE%Dæ zOpÝ몄š ŒaÇ;q eN£+«k•ÆË¼tº§S_L9…:ðë¾c»AhÆZˆ;›>rø_bÛ㥜”Ò#žøÎ–p1¤±n!· ~¨ð¸>Ê®~Ê TÜÄx mg‡o1õW¸@­6¡l$ ìZÿ=©´½­´¶>ºÁµ¾|¬@!Ík#­'é .ñéÿ‹D½\hêÒzøw„ìc†F*ïñ¹=ÇG#¼öÀ?—çh$FN~–¼òÈzç{¢ŒäÇŒŒÉmç.#r^³ž`pÏdf}«gŒ ‹›Øÿ OÔóÁ endstream endobj 207 0 obj << /Type /Page /Contents 208 0 R /Resources 206 0 R /MediaBox [0 0 612 792] /Parent 205 0 R >> endobj 209 0 obj << /D [207 0 R /XYZ 63.8 705.06 null] >> endobj 210 0 obj << /D [207 0 R /XYZ 174.677 551.174 null] >> endobj 206 0 obj << /Font << /F8 154 0 R /F55 164 0 R /F56 165 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 213 0 obj << /Length 1196 /Filter /FlateDecode >> stream xÚµWKÛ6¾ï¯0=ØÀšŸ’.²E´@ëC€4ÙÖ>’µµµll÷ß—3I¤LÉv€hÊä|Ãysx»¸z÷IëIÎr#Ìdq?I5jbò„¥9Ÿ,Ö“¯ÓÏ3>-ìØÓ(íØÙ±µã;Ö³¹r”ìŽÖ ZÛŸ†|¤ùLî;–vÔ´{O´ÿàXød߉ŊÈü¶øs2ç SÊNœåÖJh >›«”k˜ÈÒ©Dæ9Ì™Ì¤åØ¬‡„ÀÆE¬¬z`€édÙkk—íz¬,ˆˆ˜ø¥]€u,,¼k×#`ÓéìÄŽX|Ìo½(9åâñ(9r¹i]¸ø%¦¦è©U¸0pÙnÀUkê—.8ÄÂÍÄŽ³ Ÿ{ o!‚3žß÷Î2 jã¥óÑ3æÆÛc¾ÙñO¢;½¶„[æt¾ŽœO"ÿFÈx®G 1àí~Eâ<Í­mÂÎteo„Vúþè,¯¬íhkI¢- ýìq{-2<ç0 Ãó¶è€]™z $.IÉK@Š@Š@]Ys d¨ˆHŸuRÁ2Jz èI)ÒS ©Yf¼8ªËÇO”¦3âg~âÎûEÑ×Õ»4Óè!iLj5pó˅шL4ï.ŒNd"; p^]­ÈD¸ü&š˜èNË™˜&å“wŸ2¯\rÅrð—_3ǵU$,OR+’–Õð•0™¨X¸ö˜?ÏY–ˆ†l4{ÆøßÎXµ9²ÅÄ™Ë4C6ÿµ ôiŠ:<–î»h"ûåÚ­¢ÆûV×-¬«m£ÀK›5jú½tÇ#AkÚé€çÕŽä¬vÝ÷aG–|t¦t’€Å3\„sÊ0i˜uo˜cus»2ÛþØ3ÿª\Ob+W2­îݼ§Û¶„¿­òVÑÆ>-QÈ$Ÿ®ìñ¸º„j€/îˆëtØ‘ð0ò¿•Ì‹‘3)xã¡ÏÅËk#7¨üa&´«)Tƒ6´³Ý×Ç^·Š,o½^…–oõiU@ŸÖU§OêôI}*øÝ”®Ôg.m.®Ã|ìäÇþÏŠ]δ˜®¿Üasˆ!,ß•ñ0Γ*‹¦‰ Ó§yCö7DN¯û·c;:!ì—•£íPÇäàÜ0.óqËêiAóë LùŒ÷A°Qy†-º\¤Ý¦Q^ò°î‹ûŒôÂ§Ž½®B„Õ +%7ž)6©DP¶}ÿ±143†wœæJjÌùc–s¥Ët/*^I³u“Ýisf;ŒæŒ6¥]¹]ÛŒ… "eW²,aiJÈ ¡Q)úC…È×P"\ƒ2t^™€e¯nœD:%éгøÚ)ky ÌI³à~¡7ÁŠˆ‚*@öúC øØsàÜWÁ×Çæò›“äs†‡©KÇbÞx/úð‰çÖKÚ»Ž]Ò¾»Nþ¤ïTkü ïâyí)ÔgQáÖëëqëFÌg[è¢bÄ(¿ÊUÔ@úÒ|pÒÜžå$m¶üJ±%+—ޤÂÛ ?Ÿ›[†˜QNÀ–èZu~*­ÐÜeÿF²Ü²1"äȲ̱Éîêãâêï™Iá endstream endobj 212 0 obj << /Type /Page /Contents 213 0 R /Resources 211 0 R /MediaBox [0 0 612 792] /Parent 205 0 R >> endobj 214 0 obj << /D [212 0 R /XYZ 63.8 705.06 null] >> endobj 211 0 obj << /Font << /F55 164 0 R /F59 177 0 R /F8 154 0 R /F56 165 0 R >> /ProcSet [ /PDF /Text ] >> endobj 218 0 obj << /Length 2298 /Filter /FlateDecode >> stream xÚÅZKã6¾÷¯0r²1çDæ°@6;9{ÉN/6Àdj·Æqà×Xîtw~}ªŠ¤DYòC= ¶e‰ªëE}¹bb ãÚNrΙ1z²ØÜ}üÄ'ðì§ gÊÙÉ3µÜL´Ì™á ®×“w?ßýóþîÛíÄ1—Élrÿyâãp•Á·³pçqòqúãÌêéÓv&¦‹#|¬à·}ºÿéîýýÝ—Z És¦­›dÖ²‹B@cݘs2H¡˜ÎN„øÌZV(Ã!Ȱ¿$L€e‘ƒѺˆäŽeJya>^Ð>Ï`ælýÓ)߃¢/¨1ª_ÐBT³¹RrŠ—¿•þºÚÏæ2›– ÄåW.4¢ö蟕küÿ›r;“vZ¡¦»ÏÝ¡ l¾Zn©|@ŸгÝÃlnôô÷ÒsÀ8m.¤dZÃ7j–°€Öë°fKÑËóèH!P3W…:¾ë™PÎóØà)Œvq†3ë•iÆe½²œe Ô€õ*Ö$êÖ/“˜~KÛ¬¨uØzéi‘ü4à*h¶¬®"oÚÈïqê€ÓCÀæx#™PãpÙ–K9 y‡´{Æâ!hQz<Hâߊf ÔæòQ»cP:tÛEû±\¬ýΉòPÏaÐâÊ0Ü ¼‡ð½«FÂu‰žI–is3Ñ„ˆ˜~ˆ\ˆáÏ/¤æLØqH®˳@òvdIþÀòdªzaO8š“ÖÊïê…Í=އ¢†ïðuË´ÀýQ/…_ž%ý>œÿ!Í(À)Á¬¸ îŧ¨ÝUÌR³M@,hc4ÈËòV,Ê@˜KVQdL棨-³fQ,I¸†Ö„ÅÊK ؼ}ÖYÀ¢ã;4ÎÍø¬j|†X¼IN¦2‰‘!oRç@Ü=¦>Õ­^ ŒUÌA\3­=ñb‡2¯Ú¼iÐ:±P¤')Yxõ‚å.«qòžî)<Û$¾õõŠ$ 〘KÆU I²!(û³6Üm#ÍÇgŠ4<0—¡ìB%ŒfNÖnÿH÷IL·ŽCN`5sØ{ù0À{Ç:´É˜v£äz&ãŒÛ@׸²ˆaSÜ‹ l> ´Eœ.'ܬµlsÓGqó£IØU«‚_§›É»í}ç±ÒšåFÁJ[&d6$’¨öÒ?¨‰(¹þ*”^{ÊДÁ÷}ãW8öe­psJ|ªQ’;« ¹‚ÅX-—‘‡€±µy£>UöFê û-ãÞI\ÉKÒï&9úžyvô[ä,“ã°Sj&…ù0¿eC¿1)ü ðƒ¦‡0×þÈܲ,‡ØB²hþSǢ8¦~) «‰‘§ê]¨ÿœÉ<>±zý÷…²ƒvËÅ8däЛA%4’²ÞÕi ‚ôéMAúËfuþnoÏ?Þ˜äk«!3WcÀ¦­eÊÜàŒ”;,ê§ÛúêlѪé8X¬¶'›ø¶4xÀæ|<^ÏW4„|–ÛQPÌ3è7ˆ|Ï$剾 I_¢Û[Gå2î¾ê„@€OUZL44`ÍH»û™Uún6×Z9?¨©ô‡Ò¸²d&Ú¼2ÁßϤiWwË™‘ÓÇ_>4[öTØàÒÖ‘t±MÒ¸Öd_7ûV òñ>šéÓ¹q›6aQÏô‚ –ç6|b<ÖGb•Iøa „·LBïpê ¦þ?aÐ*ÜÔÂPÒo±§àâa÷ÍÓÂ7ÌÝÚ 8ŽLÆq~œ} gì»hÓä).G†}ãüÀÿðõÇ{xax(Bǰ䘔ã¶í&Uh&ým¿ºhIò€&©$ÿî-RtÿëØ‚4ÉôySð4”áN ¶~ ‡÷/ œv¡ƒ¼ʮ׬1ŠËŽ›î÷dÉŽo…±-@B6Dį/“õÿ¿6‡óý ñòk#CG°r‚‡žË÷  ROß¿PhcM´e¹™ªîÎÆéÁMƤ•¬¦¢öw¬Hc¦I¡WwB±÷ÍöÅ*,,þªô·©¤÷åÉGjR¸}îDŸQ.‡gBÃ\¯•KíÀëEãôMÐù5T7^Ãîy¥d°8Åu¯emÕ2,¤sé&SÄë—[¦x^5[9A¹;¥«©³Ø-œë$G*ɲwO çÞ(§™=%«ÈïcWfÈ„sqr2€è⊧5µ÷Af™@cVïš*\æ ‘Þ3nNKLXòX™ýñX<í’ŠvbúW r Ú\€#·áxY00MÎMÿ[õâ)˜­áÜžK-OŽp5Ën GËí^Ê`{¦Ð†jF­³1 |IBg ¶úêC>ë<[–=5MáoC¸u. /ÇùX¡÷–`M¼‹Áš(Μ²dR„ Q•L% »0jËœ«W(vmoóÓþ¤¢Ž¥Sx!|Õ¼>„G2v‚8/U@}Y6oeT¯í <‘wµh’#J`=ZMp_œ] xIAÔ°JÑ­kêÞë×õ¼¼ÎºžCwÀi©¨93¬’ÓŸáW Ì̤9a¯nÁ,øÅ‚7 m´;µØÝ±kfð™ü ªarVøÑ^ÚÖ»FghÜóÜÝ-yÂÀÁ´ùk*¢ú½}Ue©³JÝVãïóŒ¶q«7é½ JïrzK¨¶Îàñ ¸/cº‰È‡ä±è”7/¡nµ¥´8^Ì~È%áÛ!-þ˜2sa›òœ3» âk×ÈfF¸²¬ÏµDÑ‚¾ð³ýZÝòUôVòç›Fúàõ>Vò^¯h,UÎ\®RËtã›UoP9ò¦}wY#c ä¨'µè®é}©} È@¶Ã î¿§†^ ÖËÇK‡á»«Çvý©.ùbÌÍã*šZ üTŒÒœ[‚!㨋tÌÚw  *ú€…1 endstream endobj 217 0 obj << /Type /Page /Contents 218 0 R /Resources 216 0 R /MediaBox [0 0 612 792] /Parent 205 0 R /Annots [ 215 0 R ] >> endobj 215 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.696 85.266 226.392 97.127] /A << /S /GoTo /D (subsection.12.3) >> >> endobj 219 0 obj << /D [217 0 R /XYZ 63.8 705.06 null] >> endobj 200 0 obj << /D [217 0 R /XYZ 175.882 456.529 null] >> endobj 30 0 obj << /D [217 0 R /XYZ 64.8 261.503 null] >> endobj 220 0 obj << /D [217 0 R /XYZ 64.8 214.785 null] >> endobj 221 0 obj << /D [217 0 R /XYZ 64.8 196.631 null] >> endobj 222 0 obj << /D [217 0 R /XYZ 64.8 178.198 null] >> endobj 223 0 obj << /D [217 0 R /XYZ 64.8 160.323 null] >> endobj 224 0 obj << /D [217 0 R /XYZ 64.8 132.146 null] >> endobj 216 0 obj << /Font << /F8 154 0 R /F55 164 0 R /F56 165 0 R /F59 177 0 R /F39 151 0 R >> /ProcSet [ /PDF /Text ] >> endobj 227 0 obj << /Length 2068 /Filter /FlateDecode >> stream xÚíZ[oÛ6~ï¯ðò$c‘*Rw )Ðv-°!CÖ°µ}PdÅÑæKf9Óaÿ}<R”%_â6†õA–DžûùÎ!©äùèÑãWA6¡„±Œ.q襃8ó½$ƒÑxðΉ‡®2t^Ž«ÕÐ ’Ðù® §V×*W?󢬇F?<~•2/‹e rü+…—ú) y „åÐ ¥p—t_©±+uá°T7áäKõ3­pP©Xá <ãQj×ÀÄË[õSÕZPÿ1$¾r®~ Χ@§®É|Fs2uXIÕȇÇy¯h_™wý(×Ö*QÕ]Íújoè&~æ|ÏbEG$ñg ËÇ@7câ%D(„—Eð¼üÆBæ5%Ò \ 6U~.@u B@b‰ÖŽiŒN¥3+‡d1ÌU…ú9º‘Èà\€Ð[",Љ)kÓ`Lx[—Rz2Uv“½Ãˆ8?²²ºeqªçH:㊃§Æ ¶æL–]l á{Y`T¡)Ù–¯È[t3¯oØÑ²Þ´_uzfðƒ‰X’)*Òw˜7OŠ”““Æ‹¡+c§Dº[ˆYIhrƒ8qšÑ ¤c7„aJ¢0uFWC< ëWàÈ5rA謴…Dn8•ˆ÷ ãÅ„>o²Jh{0,t”“|Å‚cHðÖœš¼T,–ü¦)rb ro+ªXâà yƒBÃgáÛŠ3H$ ¤äá{N·^!O‹š°/h_"_!$H. 1Þvp¯^±KÇÈ/4ÿ$¿fùׄƒ¹É-Ã0abŽN1žZB}-s>¦ hᦣpÚVÕÝ·Æå€]ÇUCÂCrÕܳ0lóŒì"Žì"ö=©ëª¶;¶D•u}g@ óêŒ"OF™B½PêÇvùÁkÅ)æNEm“IÑ‘K×XáÇž„V…ø3=T¡Ð²’ñŒ‹¼b?@ßLw§~_2XÂŒ‚K1V¥®—ż±ªËO¸oÂï v”U㯩$õ|N½Qã¤ÛÒi ÒÛŠú‘LS/¢v:Çzù£¾Q°J…‚¸Îàš@r¹XÒCNDuÙI¾É|Ý§Ø†Ó’ÕÆ²éL’ʺ^ð öH^ë®±IÙµÎáªLF F±Aj¯—z…Zë¶m‚«hê.TÕx€¶ëמ•ÎMm×®ؾÎêŒÄÂd_6švюœwÁØí«ÐœAºd<\wÁ)3/ 46ßû‘ú{"5³a„Îe¡b4vÉÛ%4¿É"ìxÚ…)¤i¸ö6´-£…šæð†Dcábz~ÇÅkRªõ1 cçY½©Û»À­ mX쌫iìœùìšË™ê+C_Ÿ’k•†}ÕƒwjÝØQ±å‚+S®%*rªB?òÒP¶SfÂ:Õ[+uèâï¦?J¼@˜ÍÌay侦¤4Þh'tlÀŠm LU§‹Ò‡m¥Yœì´÷Eaè;oµÕ…¼m–G^"ï?¹?~º‰©GÓhmæm®i—˜D^$6J˜œèn”MìÇZÿº'Tž‘ž_j]•è–âí»ò£@­ŠM&#à×ËÊrÞU¨’ÒÚMÃ:`4â6ÖŠå5£sSäªÉuëWtï}UC:œ5¡qSqó–|.p‘˜òÄ¢o©WË^œ= <•ü$4ðôØ„ÌnÓj é%ϵ™àsíSµ‘Wøè¢N8Ï5œÔõ‚Èž¨G·o÷-Í›.ŒË7b1§~í³ôœ§Mb™ä”$­›G; ËF•ä&pH~F·WÆsu½U×ËFàGfšê#ö¡Œ3f\³öqk#IsÚõ¶PŸ9„^´¶ÇðÏ-s"JHÛ%Ñq,¿±lйb[–|/6â|@ÐH½À‚ºíÄ2 –Â;,ñ†eÝçþúK¹¹Þ€-î¼'tÛƒ8‹ì8é&…µãŸnµŽ7ÿ1Ýæ=ѽ'|wú¼Õ‡u‡«ôw¦f»ôôtÃIž¶O¥5»¡I-²âÞí’}æ‘õxÒ¼^š”ùfµ§‘y£®Ÿ¸ßÙá;®‡·ìýà¬9¤Vìt¬nzÖ˜­hYçÆþå«é#A „,™u»bS¾ßvICÓf¢Lð‹1­´Â¹kõ;×Ê’Ç 7Ö.¤ù’×m÷̶=%û^oû®ö!:‡&ã´éŽ÷ ÿ$M7ð™þìei©Û½îóSf»hµá-ýõòshDö®™ýíî¶·ZÇŸX:ìöom¶íŒýÆ ›a÷Š´%JŸ}Ñ">ëZü9Ûm÷Šë㺳µ?±zwa,\ÎŽž»°æNöê›05è{mô6ûþ$²qÄà$ÚÌ/Ù½•% n…Äâòe‹¥ýµµë¹Û¿¹Ø±™¿åЬ¬b~a²îÝ…öqqXšgÇòŽÙuÏŸûwAÇ|x7<4¤Âù°Ë‘Äl?ØþÕ7÷´é´ÇMö.¶ñû>Z0“.ʜ˶æûI»ñ[Ô¢YT€éS—á„k£3„çܘU×/LÕÞ5À²‡~—زG?ݵŸ½° ½Ø»öŸÿa,unþM1ö„/ù»Ybý‰ A%Öh;ÚôYíä¼3= nÓ÷nÐöSt¿õùmk¿VÙç~NüZ}ÿZŒ¯Jz\QJ?‹ |ïY¸€An0æÞý›Ì<þ '€2 I†@É^Žý #¸ endstream endobj 226 0 obj << /Type /Page /Contents 227 0 R /Resources 225 0 R /MediaBox [0 0 612 792] /Parent 205 0 R >> endobj 228 0 obj << /D [226 0 R /XYZ 63.8 705.06 null] >> endobj 34 0 obj << /D [226 0 R /XYZ 64.8 700.753 null] >> endobj 225 0 obj << /Font << /F39 151 0 R /F8 154 0 R /F56 165 0 R /F55 164 0 R /F54 163 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 233 0 obj << /Length 2226 /Filter /FlateDecode >> stream xÚÅÛrÛ¶ò=_¡é5 Qo™sÚq&n:¸õ$Îô!Í-ѶZKTM)±ûõgo A ’Ý6ó@‚»‹½a|yñì›ïÓj¢µª²ÌL.®&¹Uå$¯UTzr1Ÿ|ˆò©Ž”žÆZÞC¯¹›Á{Ñáç4N‹,²Ó?~ó}9©T•›i£ti'±.UZ *­¦±­ªè}ë¬-¢  ¸ixq–y«3­L9IxÙ j¤Ï<Ÿå›ÐÑ <·2v Ï ž¥Ìá÷fŸ»*U&)+Ú"äl#hÚÕÀ`‹Ÿeôk¢-"œ{¬³°û¦ù45eÔ –î? Y ÑÌ÷†ûs·¬W3‡«Œ.§±É£fƒX>OMAÌûb2¶RIž»}|%àùSÚki¿Ú‚Í•1©[\#ëó‘ØšB%ê’ìd õ§GË}ß ¥U‘÷´LâÌ*[fd#™62‹­JmNÑ8†ïʦ Z£R]1;…Äâ“õš¢Þ cã†õ8O^FïE‹Õ5Ò::ý4r-Âo´ÖÂDg`àiÍ›[Ùø‡ÏsÚ¥Ópô„ ˜»„•òöº}i'“ØhU&%oáöiŽY­w± 6+£úNâ"@a\d·º]ˆ~{G›3ˆ‹×°rŽÃÝŒC§”äIDl)ø¹™Ñв~(ÎxYž-+Gµan:Yž"L\¿l‰U²…[·™"šÕ«a'9o«$îšÅZ k2Édv¯·½‘¡ª§#›³#Ôý!¹`´Ô5ˆ³4²3®ûSÔGx$P¡í@.¡{Áª"øáDj™"ž²m·áÙY‹]–!tQÒõrák«ãU‹–‡DÃí·A‹ È‹…‹’;YÁ'Ëj,(&7%Y‘<Ü¡ Œx²Â]‚åŒïdÞ*`9'15‚¢Ñ“¡[Ë–Sgä“ÈÎ(ù€ ÒçÓ2NÎ\$£©eíŸul©h ¶Š>ßPP@Â7 \ß _—H¥—F» Lâus/!•c˳¤I2¸G/œéÈ)áö•Gþ“&…K3ì%’aPâ÷w~‡¸/ó-„Êvˆr vædFb¸46ˆÌ^¾ùÞïÞRÃIOj¤ -Ì)oH–¸½†'Á!)ÜÀ¹ãaNë8dz´{§"?PÁ95â;b„¹€ôGõ >öù€·þY–æpj5…'aœþ°¥áý4/SyÒ èy0ËÍ3ev’\sÆlr¥s s¦Š4mAÃcÂXS­Ò!5ÿKXcöO°¾½‡Ï{OÆÙc)þ߯~€÷/„=' ý[ØË§ñÁ¥<\o«ò¼|Œ”&Rar¹ª†ÂH¤.T9ÔîP.bªdÈE°ãç"ØwÕJ•xu³œûΓæÝfì=.A¿teÍbãÎ:>2Î8,¨âØÛF™B}×û,/×Û%ç0|ªb …&Ø»ìù-RUfæß¼N0P†Û£U¤v%†I­*¨ÄðDõC#édùx³Bm½â–Žäzée„2É^3Ì÷’œñ¾‘ fV³tgF+3—r _W.ÆÙW¢ä»K· OT¨fOçR‡=0`#inì–Û!¡ç3Š¥ÄÞ8yàïc:æRÉŽ“™ÿªÉ.·\âÁ@Cœ—FéLÿݰ˜©¤ìÓB4›B°òEet¥L•«Üo¹²ž‹È6Òº„ê([C‘½›N ÖÇ–ˆöBŽ—ç;ý¹i8Ós=ÞÄ ÔÆ‰-¢·Òþ$í+)ïÝC·$cNc: úOí’¼·£U„¨xúꟂ z@Dmpé« »¦_ÂmP""ËFZ‰{¸›“%WÒ8õø f¸_•¬Ð_ÀÍz;;‘çÝë<ïâÊ%=x™ð<§Ò?õï}ú£¿€ØGöÚ#òÚ› Ù;ñvë$„ð™çlƒ×ªÿ>ÍqžÒ‹N’”6VK=÷³wU¶mÞ§— ›ñŸJ8ÙxºÑf|$±¤B{Aá)&·ïè;ûZ¬©A×Ô'Œç_À;‘´o·óÎÓïoÞ-å†É‹ ‰+#Wü©cíÙÀÆ»Ê\Qø£å.:~vyB>ÉÏ/ÒŽ Œ»ƒìH™Ôcnï‘òr¿™(ÉÝç¾pÂxjLr–Ó!ÆÜyªùq7ørؾü á ™y·¾žÐÑÙ¿{Dð_÷á©;\ ÷óÌuäÚËÆÿùðB¶Pª¹SüäóÓÊ" •|Ç~ò½mÖ\YPÅ‘U£ãËGÿB@›{wwâÿi¤U\®È};þúàq*\;d U¡’Ô~¡ú„gñîI_×k溕 ¯¼Ì¼aÚôFRZZsÅm¬ aM!ëŸóÐ.ú¦À+·Y¹Â‹ÉURd»Å#KW·œšR¦mlÝ_£ cÂÿáNýûÀ–.ÄRãîÙ1¯ÅtÝ]û@·ÝJîPtYKgVûÅå¸d£îÁâD@…ßlRõ|Ýð€ý|ß ‚¿lŒÜÿ_c€Ï?k²þgÍÄ@É‘`þ¦Re)¿64YϳӋgÿŠa!¬ endstream endobj 232 0 obj << /Type /Page /Contents 233 0 R /Resources 231 0 R /MediaBox [0 0 612 792] /Parent 205 0 R /Annots [ 229 0 R 230 0 R ] >> endobj 229 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.696 608.116 226.392 619.976] /A << /S /GoTo /D (subsection.12.4) >> >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.696 85.266 226.392 97.127] /A << /S /GoTo /D (subsection.12.5) >> >> endobj 234 0 obj << /D [232 0 R /XYZ 63.8 705.06 null] >> endobj 38 0 obj << /D [232 0 R /XYZ 64.8 700.753 null] >> endobj 235 0 obj << /D [232 0 R /XYZ 64.8 687.643 null] >> endobj 236 0 obj << /D [232 0 R /XYZ 64.8 654.964 null] >> endobj 42 0 obj << /D [232 0 R /XYZ 64.8 594.726 null] >> endobj 46 0 obj << /D [232 0 R /XYZ 64.8 169.107 null] >> endobj 237 0 obj << /D [232 0 R /XYZ 64.8 152.839 null] >> endobj 238 0 obj << /D [232 0 R /XYZ 64.8 120.439 null] >> endobj 231 0 obj << /Font << /F39 151 0 R /F8 154 0 R /F55 164 0 R /F54 163 0 R /F56 165 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 241 0 obj << /Length 1770 /Filter /FlateDecode >> stream xÚíZßoÛ6~ï_aôIÆbE¤$J*–i×d†bH=ì¡ EVÒ ŽíYrÓbèÿ>yüeÑ’“:èö ðDw¿;Jr^MŸŸÅň$aœ0:š^Xæ#VDaVÑt6zäã !4 NW«ù˜·UÉÿ¶·üÏrñb=çÓ…Ò FÄ‚ W [ÍD™˶6^£zys§Ì `lŽ.|„þƒƒhË•ðu­T“àÛRjUË;ôÂòiy…ës<8¶'!a‘¦Në$NYpþ-à¡’ ôÉýJÃyÄÇÑȃ.¬YÂÜõ=¨5\iD× Ž”*â›…ƒkÌc€¡½‡­ªçËŒmnÑÕz&uZ‰¿09›!Âuƒä½ ðAº%‹]Ú€V8ž¤„€Fm0AÜÕBzF&a,×Nž›Fù”sv-e§À¨‚ ÀåZöªVü¬QhÂ,Ù475XáBàÛfí6Î &ªiþ2€à¯™kxÉË77‰ˆ1öŸª€Ha|Ò7²nŽsØ»/:DµPL|m-N(k¥b‚°Æ‚+ž<jÙ'ik£†¸f9•˹L%¦‹Ä-q‚!Î¥ÁTc‰¼^*ßDñ¹×¥‘WÚÄL9)« ïÙ8u¢‘î?ˆ; 7ƒ” #·Êƒ ]=pÇâxg ‚1±dLånk ¬±S1”ËÕRøwsßò#öØ• ,{¡‡²U©°]pJ…ò˜H ÷œ y±LÆü’'4EÕQ[#¬2_ØŠÓGÆÓ~ÜEÆäø5š“Ym*æûþŒÒˆ7oùu$g¨ÄÁh9°6*&t3¤4Üõ}¸nZìßöé ]˜8‘M$ %¢%fËÝý&+<|"GÿñUK"I3‰Ü4¼Þ_ÇØêQéÊÜŠq.q8w–Ö)T­i»öD„ ¡xÎÅç¦÷=^ _ŠËOec­°ÒeK;Ñà¢Ø©³ºK#ן=ùwûȵ…v“ÄÀG)diÃ’•h›$û†¦v 6²kUö_âõÇ/û\k,#õAÜr->Â%ÅøYâ‚¿¢Áv‹æ;ëIÕ˜±l_Â-œ}UÌ¿³˜_åŸÚ§ÈüSôó7~ýŒ÷¯øõ†_S+ã^ð+APg #®q‘•Uí«NÕš"!GûÂéƒâJÄÃä­Å¯7­|v:k…}©©Œ¨*¢zˆ½rKØ7oÙÑŽ@³8¶ßÇ †Ùf¬‘¦“áZåqmôÍ:Æàqvb0°›ÖF¯Iûĸ±øfmªkÀ³0sþ„úsõÞ±'UWÖaܺÜÆ^c×Ü:÷px‡z,T f‘ûµ'#ýÈB¾ùÌrùù˜ŒpÖ] êÓðcÌrBž¨íï|kÎ;ã¶JI…>Ï­l_iBø&¥‰¤–˜b=TÙçèP]Ü›ï&O’Œ¤}|¯\n?’J1¿˜S¦|O..±|yà~&Ðæ»qk+–Áž%X‘Qö½XášCl~ú˜Í?Ìn²AXÊìíA,ü/QbðXëyoûúЗ'Û£ïö.ÿä/nöbƒ¯w»¿ |õ½úV²ýèc?–¾ëO.àÇ9ªNñŒ;·úN-ùÇm½©5WÛcJß–Ï·úíµNʘõKegh=6Õˆ‘~”%ÅLÝ•hñmEb}¾‰z|y@ôO‘]ê+Nã~Éñ¼RŸ˜òÕó€øÖ{r©Si§îø¬p²×›k„o6ªÐ)dñ:H‰í]u;ô7‡£§û¢‚<>ãá™Ï¸”…$¢î·Üˆs&J2x_-Å6Æ6Á6Å–a›a›c[Øt×"1"5blÄĈ©™3#æFÄÕ¨YŠÕ`cy„ŒQ7?#ïêÑV™×sOˆ©W̽¸pl[нbî“îtÇ’‡Ö¤ã(5ÁÑ;”u͇v5òî*ëB›xÝOvMïïuD€Da’фơúÍG©Á™›Ô…‡13bnÄÂ< FF$F¤FŒ˜1µŸ&%kÑo{÷"/R…¿ÊÊ~>ÒäYÑ5ê§f:À¸¸—ùÄëRäÙPê‘.ͨyÝß¶$ðXó=Ÿ•v?5{žÑÿñìÿ_¾ô©fÿ ¥E‘œ'|æ9n ÅðÙ›é³È¼r endstream endobj 240 0 obj << /Type /Page /Contents 241 0 R /Resources 239 0 R /MediaBox [0 0 612 792] /Parent 243 0 R >> endobj 242 0 obj << /D [240 0 R /XYZ 63.8 705.06 null] >> endobj 50 0 obj << /D [240 0 R /XYZ 64.8 700.753 null] >> endobj 239 0 obj << /Font << /F39 151 0 R /F8 154 0 R /F59 177 0 R /F55 164 0 R >> /ProcSet [ /PDF /Text ] >> endobj 246 0 obj << /Length 1985 /Filter /FlateDecode >> stream xÚíÙŽÛ6ð=_a$(`·±BQ‡¥ -РY´EÓY}H‚Bkkm£¶äXvœü}9á8Ôá=r} Iñ˜›3ãá£égQ:H½4–ñ`z9ˆC/Ä©ð&©?˜Î/†?ŽÆ‘ †ÙÈÎUƒ~«Ú^µ\µjçô ã•j…j Õ*}ô{5ëáÏjø‡j?8uNaí¥ˆ!½9r<î^M{p–0ýÐKÃp0–¾—ú‰ærºÂ~:¬Öf$“áa ˜åÖ’aåà[Tz6»ådXŽÔÏ8H–HxcRè•zĺŸÁV<²"ÞiiÂú%á.7ÄÒÒͳZBìÒ¿G€@Å2G‰6i€ÙU p§ùÊ ’¾7‡A:ük”„Û  âÁ؈ÕWb"-ÖP öÊTíU+õ4s£@øx§—‘ÛbNœÁŒ3ê´Ò³™éB /àX…°Œö ße¹£°Lh@8ìÜre÷#×@1r<£élMŠ^½¦€íõÚÆØé²DÝ#õ°¿\º#h“ Áj®÷lõ´–?ˆP¸ÂÖókOÔøhìj§úíÇÓWÁ¹ï½tÙŸ´.n¤†¢nÄÒÉÝRc3%Þ¢kº6Ö`¿ýhboþ¶6šÚ9l%ÿÖ.W´¼a§s»Ì=ÒßÔÿ®ÚŸªýBßT{¬ÚTµªùª=T-Tí•j÷5Æzø­‘c½¸#´† i¦–Ð`x¦Úsˆ `tH\‰& ’E¹#QhO8œaÃ-Q1JK3‚¶f´ni«Kï]5s—9Úaï8nŽø&AãÜø&ôØç+„ßsž,Ó;+½”íÈóL4ÑYõN/;6óoÏÌ JIR©¡©Ì£½ ‘TP¦?%E(í«p©¶GÃæ„"ˆ=èU‰7×›Gíàlx(˜rüZƒ‡í '=¬’‚ŠIQ"†Ï Mì<œ²=‹0Á$.VäFa]ÍØØ©¢#î ™â°ÒýEV™È¯¾ÊB÷™>¿X—Ö4ËB…Æ¢(Þk•IÊÁ—#lEqZA¤€é/H<®c$ƒÁKáƒÏY×ùµ]<]CÇEÔÁ ¤ƒ„Ít¶£Fà b Y&¬Íe­¸uÍõâÖ\ ‰6+Ôƒy &)³–f†™œ“¤\?2ÝS»ïYïV[Ýí¹usUäá])s\9yÒLÕ·Ô¤H$Tæžõ ÀU'Ä…žQy¦?KKHŽ^L‡Îà„“¬Èv/1Ío9ÂvÎX8+i÷ŠøËÉˈ[7·Ä|—Äð“Ó‘”5³‚ P lüØ0ž>4¦hJ/XLžadVWÊÛ íL„®š2˜–˜ º¢óGÆyNáªv „CkÅû‡ªûWÿ7»ß6®Û›×@¿¹6ó–ÊùBH½!õ)õF Ì¡uÛ?ü˜ìsÏT#'l­êPý³·×$œŒéyÕN>on–ùƧ4žÔ¦ÔÚ9ßE‹/sÆœ÷mÊhó ÅœõËRxIâ»ÎÙ`ü†®…ùöb×¼ì™zæÃžù¨g>ôÌ'8‰ˆa‘+ÖXOܲp+nÈó?³5øNPT¾ðš—)Ù„i„@ l’sÇé&ºjÂÖòuˆS¾²Ë[¦hpÛŠ××¢/+"\áÌMNxÑvà]Aäì74"ñ~²XÒ i«nPÿeL¬:¬÷µ»Ìúç,G¿K“Wýñ%Œ½4 Ü»+(—÷©—ÔÔ‡ÔGÔÇÔO¨O¨OmDvèÛ¡´ÃÀC;Œì0¶Ã‰&vHØd]2±…kdg¬ètŽ&\ŸJl]É·³i'¶W¶“–\éβc¢µ—ñ#­D ŒÍVdÒ…Ù QWŠèfYکݹ=0ø^ ÁjÏ<œHWm²%HéÊ)º¦®˜ 0µ1#i¨"hi%pU“q ×4δ3"¿e† ‰#çÂÞN ÷ý­©¡²~‹–i¨7âRlUC/B#þ/ò‰˜h·‹¥þ2 æê— ØeuDBå6ü†ý¼d¤V©SG§Êb©ôjmjƒÃò½/#|a Lt`xØÛš‘~¸P§7æ­~¢È [†•2¨é—¦&Dì1'YÖ‰@ÍÝ’6´Ÿm¨žÔ]Pœ.ë¤ ßØpSÖxŽï&™qq¹.šî7-ç¬Äß]…`BÚQà„r¡ˆ1ß8ÐKƒe‚8òŒ©fnyÈØžúÝÒ)Þ™Úµ6u»ƒj8è‡ÏÉÞ3c]µU”—z×4ÏIÓ÷pc”NïŽTwÌ [J\Ùi“EV¨É­É{+ÙÁêP—3eƒu,ܺGP©»rwj{UgÆNZ\çÄE?¸”ïxÒz07ÒÏÝ…]ü”ýÅÏËçÍŸ’Y#ßc··kw&}dPýwdË; aesîªó_Ëg¯®Ê¯£ºêß¶ºú+a¿ü(UÖø½ª¬òÿ*ëmÿSË+ÿSïéfn;m×DÅŒ`®éÏYÇêOü‡Ü5ØS~\ùy*¸<¿”2õ„Š,ãPx~H\û!l¼óxzç_û'O¿ endstream endobj 245 0 obj << /Type /Page /Contents 246 0 R /Resources 244 0 R /MediaBox [0 0 612 792] /Parent 243 0 R >> endobj 247 0 obj << /D [245 0 R /XYZ 63.8 705.06 null] >> endobj 244 0 obj << /Font << /F59 177 0 R /F8 154 0 R /F55 164 0 R >> /ProcSet [ /PDF /Text ] >> endobj 250 0 obj << /Length 1388 /Filter /FlateDecode >> stream xÚíÙn7ðÝ_!¸j¡Ö†çA\ E E‚ò”æAÇ: ÃÑÊNò÷å1KÎr¹²";BZû 9$‡3Ãá\ž¾”²W$EÊÒÞð¢—É„‰^Z$+ho8í}8)úÔ´'ýdÜMÕhÌâ`‹8XÆÁiœÅÁy ìP"2Ãö¤ÿqøW’DÚPšJ8FYÀRZ(„ûõêI!Í­Tߦä_ ù«Õ$ÏÕåŒ&™éË·ŒÔ™©jº¿Rm£Z©ÚZµ?T›«6Sí“jKÕ*óæès5æð¨SR™Å7‚óßWpG ÿÖ–@Ë?D@ÓEæ;˜¯ÕÐékNoç¶èÝתáä°m^ÏWpÃ@‡oþjQµ1.Ðnf.År“^n”nv}RËÎc™¦b8õüØ3ò ñùÖ!±D{ñ`¤$~øÜpä…U?¿—F2PW°ëÂ>1 z·‹ÆÀ@éߺÞV Ùr75èÖV ÆÜ ׆·!U›µIY£-S i*’X¹§uB­ÍBÝ nG ò½BLÌ"_à´cô…¦°v ðÐj©X¤I‘ó¦ ÎVÙžAÏ¡ÐKèSè3èsè Ë5ynHýù!÷Cá‡ÒS?Ìü0÷C¸™Û´z xšHÁ›Jöôá5¼Õ¹?¸¸§‘y´Á h/kÆ<¹¬ ÍÉÑ@²ô–žuÀIì? Õ…«öÞ²i /qîÜ×<ÉÖ6¡,*×´E Ä&üi8å4áLk-O kâG˜x S@wçcJÀ½&Çéæþ6Òí†)h'ðp‹vÞ×síÙï WV1Bb-y±æÏÏ¢òmJÓ-qÒ2#q½´DF¢ ‚Eƒ _l÷ /ö* ä5ÁÏŒ‡s^ìÒ¯`—P»…‰Aè ¾õ$fúœKå_‚ʹ€½=h½¼nRW(Á|.ïÉÉF|-÷š0qhºº#/ž¦Ù^.¹B.¹ÜÍK–0"ÚîXÛn4 „ZJE3®îðj2˜Â¹ýCvtÜHy±ç8~H$ ‡×F.3;-UTɉ8™¬ŒôK­Ð×õâMŸåú›è ‹ÑÆ| –ÙÏSYðÆ(¿Jü¯ôJi”¶é·Y¯ôá,yX«\(s¿Ø¨ÈÚ®¬í.EÓVªS½RœŒm|ovÍüÐ|>¶üÕ/¹˜o5oðÖ¢|¦OV׈@sTŸ2B(§ö¹©HŠ0ˆ©åÁ¹Å`2“FZâr«îfë,Œ׆«*×8ƒYj¢žNËÚpàuŽ”µ[­+ƶ­)é0¤´6¦o1­ÍÚÔ„g ¬ïµkXÐ%2‚“ »ñÛqZ5q’w&e)¥Æ¨òæxævi#œ×ï…ù?ó…wH¥I…m¾Ï·Øì®”ãŒÚ —°s‚¬û ¡¶6ïî%mu6¶-Pœã¡äerùí‡ÂÄŒ÷³Œ¼…-s“ûbM³ukfù½9?|5c‰ÿ¥J¿c%cå~³½yŽûù*Û9U-îM§P¹‚7•Fƒ?{laã´eÆ-¾ê3õyÄ_íX(•?‡•w÷í%ô)ôÙ æT>†÷2§éÿØœþ4b~À1,?ˆqTp¡ h HÖÑË@°"xþëÂÛël[k®´ ¥Ñb Œe³(^†¥ý Äi ¢žðÜ+úsÑÏÂ3§ƒßQ#æÑ§N£ZFߊEUHD?¡Œ£Qëcd]5bú ŠÄ‡+ÂòXqøLÍÎðo¸“ÛÛ­‹KšŒ ¡…ú€,ÓA’þ@¢ endstream endobj 249 0 obj << /Type /Page /Contents 250 0 R /Resources 248 0 R /MediaBox [0 0 612 792] /Parent 243 0 R >> endobj 251 0 obj << /D [249 0 R /XYZ 63.8 705.06 null] >> endobj 248 0 obj << /Font << /F55 164 0 R /F59 177 0 R /F8 154 0 R >> /ProcSet [ /PDF /Text ] >> endobj 254 0 obj << /Length 1560 /Filter /FlateDecode >> stream xÚåÙnÛ8ð=_a´Ø…Œ:‹M,Ú<,ö÷©íƒb+N©å4Ý¿_Cq(Q¶×vš¢û@óÐp.ÎAŽœ]&É ˆŠ”¥ƒÑÍ€Ò,"$¤‰²‚F“Á‡€ Cšd4 ÃO£ßaL£,!¥Q!6+Ë! .DûC´+ÑÞÄñ ÃTµ’8 ²¡ÁB`ª÷ćw¢½×{¹X7x˜jbïÙeŽ8Ž£„HfŠˆdL#»˜ PÙ–C–wb´˜C^ÐàF®®ä˜õƒ˜\×âg-AÖ¢=@/çËE­áÊÅD" _­ Ür!~볉\”+÷ƒ&*W+M¹YTÈ4^¹á¶ÒãûR~pŠïºÒЊêgà°’¸Ç°¡œI¸©\š‹,Wè€È=àRŠø"§µ>HGEÜ:ȹ„”DÆrp+Ðp\C–Õ„«Vzy¥p=€² Yέ–Åø#¡±UоƒÁT*'å} ¥Ü¹*§s-¥FJécO tîΜk¾_kCy) _êáŸè8n•¤ô9½“¼ögò¨Aæ`’¼—€i Ø*-­-xzz×L5ÔÌB.õ™ËáºÁ£¦ÚÀÀ†D”ÔP:Üå4 æ=¤@7ˆÆKu­@2Cz Ò^¤K°Ÿ 4ëm¿*ô´¿€ëÞÞÆ–‘6+3X›ý9|[€ÌIB`{‹køníJ“8µêšÀöÆÐ`Ë©=†à3Źî^­/hÓ !{a‘Ômý ,ÍŒØ uJNºáˆŒÓ—H5w€¸ÚMMþ“tØ—ËŸ-6¢œŽ´SkZ0¼îÈeö˜ýÔÈfEl%N#Θ» ÅŸdÈ¡E3£oõ¬óžõ¸g=éYOÕº ™,(anîʲ$+(€i‡iß#ÕA“(M©k¶XqYBóžu8xNcmkÆ”@ù}äÌV¨3è âƒ1pÌZ6EÜÐÌ(µ`eͽDoážD&QÛÈ_oO¾ùLx›ßCîÐÔÑòÀ¯»AÓ¸wºÿl€E÷›Åïv°.là=µ·‹¯~íiµü´È`&è %×?Aë‰éq9wÍÝø!…žAÏ¡7'Þ¾tŸ7~Ü8!ÁnÛ öÒfÛab‡È£3;Ìí¨1EMÅžFIÌwzø0‹‹[™EÛ¢€`™Ã˜WqIkì9ïöžˆâ{š‘­ˆ:½‘4ñyGAÌ{F¶¥×¬³ÊíÙ##Â\ ¥Èê&"N–ñ¨ ðêe.~æe6öJ“vØj1PXˆ—of‡¼# wEHÁ:A†-Öù_ÏíÈý¦-ÝQë苹žŸyòÎñµÔL7‘ îQû ·ðe|J¢8ö¦|x›¾AoSç(…Vö)yã}/â”`ÒÂX!l='›§di_–cô"®›°WÅïVXºG¯e,ßâHÉçØs1;ÇžpPÊ«QÊ«vKw ‹X»ütX¹,G7pmÙ;Æd™b¸š¦›ËeP:y_ãºLœc[“S]æ‘×\æì)¸r­'¥[tÓ[›B@å6SÙè–Û$"0\¹ß0V«#´ ­¢›ûAomÝ„Yð„º¢eÁXmW« °ižÂÊLÆVP› 7Ï´e±ÌÃX0.¶Š–)db2UET"}Ž[BX ÙR£ØO&}s9Ì—åíf7kÛSc ¶jþc9X¡Ç‘ܹ."éÜ)ýz0…§PÒE¡†a÷¯ž§w¸cé ;n§®TO=œgslÿO˶Ò;ÿð¸Y›(=ÌŸ'ESK¤¶RýÅïvN’U¿€Ç¾]Wè:*Ü×ÍžÄ{;NÆÄó„æƒPôyžkT½LOÞŽNþ“|dÙ endstream endobj 253 0 obj << /Type /Page /Contents 254 0 R /Resources 252 0 R /MediaBox [0 0 612 792] /Parent 243 0 R >> endobj 255 0 obj << /D [253 0 R /XYZ 63.8 705.06 null] >> endobj 252 0 obj << /Font << /F55 164 0 R /F8 154 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 259 0 obj << /Length 2281 /Filter /FlateDecode >> stream xÚÍYI“Û6¾÷¯à)‘ª"„ .©TRlÙÑLjâJbReû@KÔR‘DYìv»ÿý¼ $HQÝãI2“%ËÃ[¿÷Þ7_ÿ`Œ—©,Ö±W¬½Ä(yqæ«$ ¼bå½™äÓ™ÑáäÅ4˜¼‚'‡ç57«þâFè~ …3í«4 deÌ+ßÀ0îñn Ù™hhǼº€&> xæ"þ\ÞsËå}lnáüÛþ¡“Óƒœù}i'íð„üæ)wö*šs§=ìg¯ì:û„}Ù-ÏVþ…#÷|0žúÇÚCÝåÍüBž+¼GÂ{dV? ‡Ç'ךëk‹–§‘µ ø™& Üw¤Ñ½’Ç¾Š¢Ëä‰.ÂNóOz†]› ¼Ö\zm1ðÌÅÀª‹g=Ïì[´ë{†¯Ô‘)cžæÎ~®õó§4íÒ̲êŽîb‘C9ÏÍG¢Ôõ:ö˜€¡¾ä§F}žüNÿóY]ÏÚ`8V¸Þûõaæ1#qÔ¤•&‚Ѩn€7:š¼ü„ˆwF”Ý1øÍÂÄ€›ÔAû@« @ÂT…© À‰£,›üZ!ºß Ï¢Ð0¤VÜF²»ÃT§“{„íòN ·væâûAæ#™†ÒÁ¦GŒ8ê%  õ•N3¸i,!áe/iäN@ýWù/÷›K!­´Y‚k$DIhÈóîËø^ wqŸV–õ˜C¦ÞÛ·Ãå÷D¸>w•S0©Ì-¡zÍ[úˆ¾o„ãj„…Y˜&*N¾_bÂ,O°Ÿß/L•‰Œ»_jØÏ‡ÝÐàQ8ùG=Õ $Q I—57­ÝqvïÞúAH†?Gt‚;=•;) H—,jª¢¨Š/Ýå'mŽì&èf°½P:TÖÀt³i‰tëúpByÏ8ë{ Õ@é8¥€ÌZ”¢Å•ßúã4_}œšÔÊL€ÃÀM„“ŸX^Ù [?ò{zÙˆ³B1$éŸé¬`Ó4~ÆY…«›Ñ¤\R=u⺠­h¨¾•p”j!d¯ÜsÇÞZfc½:ËUy²¬ŸYûØm÷¯Ú`©Èäœè’ 2Ý1[’Ul?1mºfžÑâ_ðß™|bËì¢h `—uÍA¯$]IÊsãl×Ö«Qh­Êö‰4¼éº>s£-vqòÁÙÓüXwQ¶äs›J|•Ì Z Ò.¯äGt bÙªœ¢êL|AïGä`%N$Âp-q¶£ úP<вT›F"F1¥‘´³2@À¦¥6É$ä§jm·$fïû†#êtLìÞ³„Áä³LDÙ¬!`<ÛŠ) hwäÿ×ìóË)2‘¬u‚¶8©Ü2d‘FbÅ'¦¾¨ð… Á¢šÿ­£6ü 1apgÜm÷^e?µó@ËÓ4š|…³ÁîW#Šº0j³ÊIdmñOÚöì‘;›läŒspÎ;w—Òe›£ôi$°ò‰l%ʳ·ò ‚G}»’¶nd˜8»Äe9P6g¿mw3rì6×W+wsxˆJcOXZEÙlœ”ï>€·[ž@ÇÖ¹Ôu‡Ñ¤MºT—Bôgx^ˆ^–ãê4xJ,ŠÇo¼³Þí”ݤ5Bm|‘þe ¥Êã—Ê|t±Hô&«Küëk–ÐJOŠí´3!ÌưÎ&˚ѻìŽÓLôÈÿºrIqo½t'dÄýSÇΦÙH±ÆéíÂP‡¨Zø,!0<³PØo^^×ö°þ©äž¦Í*ìKÝ­‘£©'<Hp“>Ò@ˆÇôâri @¡Fé¶åFB1Ëê,QgbÚ·~8Ré¦JwÑú[DÌ]j伭ଭî—âçÌ´ýÉ«ê;_’€ä-\©ŒB5•øqßõoI‚•ï%´b|õÞo)ÃÑÉ1ÂsÃv×MªûJkS9ÌX2 ÇA"ÍEz :[; {yùžƒ¶ÝÐÝ _ ”†Lç^Èî>t‹3ÄGî˜u*ÆÊ•bV.c9Ì"™À­˜ÎÀ6~“#VB‡û KF1TH­)¿Â0JobÈpÞVPB÷í@ì—Ö§”´¨Ü,Û”Uu¹ûšP€'q HV+Dª‡+©:P)|c”+ <ÌÔš³-K¶uÓ•½°¥zªµ ¾](ÀãHÚZåA è¿–H.> CrG}+üóˆ!3—+®©ãΆÇ_u•«FAdšºµÑÏo—ƾ‚¼ø:Ä%!pY![-C<Ð ©«,cÛªkSêÚPɦÓiÒÂLëÃ'tôêBì Ò~/àQGÖ.k”üD»T‚+¶LsYn8à›ÎÚîQí}¹tëwFQ ðQ £ü.AŽ£h¦´ û(Š^·!ÝÖÙùÝݼ,n>Ü Où^àéØ(ÞÐÏ”oRoy¸yóÎ÷V0ø£¥T–z4õà…àIxRÝ{¯o~¹¹Å+j—Ã!#MRªR“1/>X]ë.@ΠCÖˆS›/¬o æ~åsIÞ¢$@2÷ЭýHŰk¯hÿŽ/{VNERò¡Å'ä¾=]d•RVö¬3r&»lœrñÖ¹Lÿ}”-ùš3n~.3oäá[q9=\áìèTb¥ºèàó˜ît0À'ÿò°$×õ¸¿‘ì”îR/çŽÕžÏHÏZê?Lj}Æ;â>Ÿ“ï.ö ÿÌï.fü»KØÝ`/zwð—íá·ˆá­õââF·›·½ñíï³xî¦[_ç{1¸…þÿÈáò_ÿÖcú_þ7:íÓïyxæ;Ï?É7îÃoTó‹¯ ý›ÿbÄ6‹‘/'ÅÈW’â©okæy?§wýëM1òe>"ÃüÊWˆþÚ?þ}˨8¾Ùö[I6®…¿ÎãÚ+F´×zÝ ÎÐP©ÙN¥PØÒæßqù endstream endobj 258 0 obj << /Type /Page /Contents 259 0 R /Resources 257 0 R /MediaBox [0 0 612 792] /Parent 243 0 R /Annots [ 256 0 R ] >> endobj 256 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.696 431.837 226.392 443.698] /A << /S /GoTo /D (subsection.12.6) >> >> endobj 260 0 obj << /D [258 0 R /XYZ 63.8 705.06 null] >> endobj 54 0 obj << /D [258 0 R /XYZ 64.8 532.579 null] >> endobj 261 0 obj << /D [258 0 R /XYZ 64.8 517.018 null] >> endobj 262 0 obj << /D [258 0 R /XYZ 64.8 483.205 null] >> endobj 58 0 obj << /D [258 0 R /XYZ 64.8 417.84 null] >> endobj 257 0 obj << /Font << /F55 164 0 R /F39 151 0 R /F8 154 0 R /F56 165 0 R /F11 166 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 265 0 obj << /Length 1963 /Filter /FlateDecode >> stream xÚµYKsÛ6¾çWhr’'JHvšÎØj£‰'MëZM"%9Ð2m«‘-E”ëäßw,H)ÊÃŽ@`|ûÄ:?ûéµ½„$’ÉÞø¢'C÷d(¡½ñyïSÿÓíS‡ /$¢Ï¡-‚ñþš–†@‡HãZ{„¿cg¬Þ?òð Þvú2>î½¥$Ѽ2P¿ OÛ7>òÈpX‘Aúe`Ív8Ä}G†a ÓÐi™†Ž ‡fŸ]G­úé`î—a_÷±Óx‡¬/A€$N€€DŒ’ˆ%F¢_ âoÀ} ôÐÐè# …¸’j4 aX]íЬv3N6@k\íèû3=¦YíPŽì)~Ï4›fYBóÂ48Ù.¶ÑpõPÕ,ÊvL°ªïÍyurŽë~ÓÁž$Ž©ßôsO¡9šv IwòtR´\–5ãžzð4a~ z_ûoávÒoÇíâìÑ~(æÉ.}‡Ýõ½ËW¦…ŽNï 7à»õ½K÷é3§[mn†TDÔýVØËOÙT)isRWÅAÒ] “ؾ÷<êÄó=¬‡^‡ƒ©¡È™x£vî¯ó;Žêû!Õ~ƒäÎã ú8Qdm0íÑf¬n7NŸ•ïC;°f;L[N‚iÇlä“ãR“Œ*óï_äL÷ȰSoWÙŽ]»va{ˆ<“ÎENŽEÎ5RŠåÉ ÏP1s‡uAs¤Y©¯ÂÔânü‡Sü²NÉËúç1©ô„‘ž‘a2/ê!£|;†}j:GηV+f(îïE¬Ùšaz 4™I¾>^íÓ™Vé"Æ~®ucxeW‰¥rªÄ¦Û6ÜÀ§E4ß ·@:E-QÊn;*:ךÖSæÀ4×ȱ*žãmFifïãõüæx¡Ýí7\bV:„u›£€|?]x°‰ 6[Ÿá²Y¹ã W¿EwÞxEðê´Î‚º¼tŠù#§ôÿêè7ÅB?³ØÃÏÖì®ã(ï•4éÓæ²ž£á4b\F©Ä¡¸¼ÿÄn¼‡$©ß^Äa¹>p÷ <ÏLG®-´Þ˜/ëˆéyntÂ…´s<Ù#¦ì¦7Z¡næ¨f{¯±™C4àõwƒ)/+¬·%OÂÌn L_Ä6¸ÌòÆàþÐð¦ /.ޤѦ"¹ZgÚÅÂ|ݰs0‹ÀÍÀ>ý õµ¼0¿+è4ÒµB‘ap¨¡ët£ýÆÕ~YކeœATµìñq®¡Þ*<Ü`]šîs§ÃŽ…ƒŽYZŠ›‰Z~Î a3ó©B%ÕJÒˆõe«ôíVsì˜À­Tvüp¹m AY–4 ÍV—™Òûò:sêÙ8"T„UÉÿQl‹¹%0SZÜÛÞJ’°bÇn¡¾:$Qµ:ös…ýM!ùSº9%xN(…Mý6(.7£n®õÝ¥¼<º›o!Û%a­/=kGP{)÷Úq»òsÁ‰wŽ O²Üy&±õOŠIˆúññŸ=+uÜÖV!ÔOeƇ›KÒ²RêuN\õ¹ºÅEM¡`.¯ÚËN™có0"1—Uɾ[„3«¹L…$ç~dd‚û̾M¯Ëwl=ªý^F•Š>GÖßRSÎêÞ=ëÆ"ƒ°½NHˆHx­N€­Ê:>¥ÒþmÈTRa¦di 3‚—¾f½X‰õovE`ÉÃ9èa[œ¡*µB(sƒ¸–nÛ* õÏÓ&PF)v”Ū®ÄÒžMç·&ãEç¶íÉhŽÅú*ê[#"ÞÛqæ½·]¦N[åÞ¿eê7Ï|çŒâ¢·ï-/ /W > ŠG„ Kì¼C½pXvܱÛ@mû€#½çjüŸ;î[÷ypx˜]©94|"Ñ à…L$›®oð½óÇ­\S¶)`¯ÌÏ)&{ûZðg4Ï.´°û?ÇâÎß.E%ÙÒ÷{r)¤·]ÑÚù«òNDñm¶@4gÎΧæô?ßý¨ÓáÙs¿x©¼†Uê¬òëÕþïeµÌ^{õ(æí–b «º±°(5~Úè2ÅË[s¬ÿñï ÷Ü—¢Þ9æ8+b®þOw·åiÿg|`˜c|Ëbž»”Õ!Kb(+5+Æg¿ŸýŽªË endstream endobj 264 0 obj << /Type /Page /Contents 265 0 R /Resources 263 0 R /MediaBox [0 0 612 792] /Parent 243 0 R >> endobj 266 0 obj << /D [264 0 R /XYZ 63.8 705.06 null] >> endobj 263 0 obj << /Font << /F55 164 0 R /F59 177 0 R /F8 154 0 R /F11 166 0 R /F56 165 0 R >> /ProcSet [ /PDF /Text ] >> endobj 270 0 obj << /Length 1418 /Filter /FlateDecode >> stream xÚÕXßoÛ6~Ï_aäIFcU¤$Š*Öi¶¶"]¡@ÚÇvœlNXNÒü÷#yÅ“EÇ^±—=’È»ûîG½½~_–ƒ:­•TƒñÕ@©¨:K«Z ƳÁEòi(’©+3ÖfÌÍhÌx3ü:þu ÊT)1 ‘ÖFãøÝ¬Þ˜qgF:•2O˜6ôùѼ>ЪȊÊqX¹3pN÷HfuÙ®aβçPeÖ“ÖrXêonÎjiPÒ¢ðj*Rsd– 3JG&’Ì m*+áü¼6C`¾§¯0_8š—Nn ¯1O¼4¯/Í–S³L¥Œdžzç€i·f\Âk²ÚÆãŠ^oað¡ºþ¿†ÉÚ¿¥¥džÍ˜óæó=ô6ZŠÍ;èËÎ|H$„1csÜfôê=Ü ‚Ý9’30? ›½aûj›ÁéSpžCZà ž«”Ýìnùœ©¹i®åî«Ûr­±t —À^2]žáĈYf‡Uº¬Ïóá(Wª2hôŠÄ檇´J¤¥ß5BV"è)Ä9ÛÎ-¤X¿ˆ©‘&u³f:ÕÀ«Ü3‚™³¢tX¿L'\@Ž)Ú|ìXºµ`@ÒŽ€N#€Á³]À ž³´ê¢®–̺ïՠޏ4ƒûÂzxÖ1 K½eámnô €j–;yÏBVÌB¹ÃÓ-À5%æR `ݺӾG5‹aþ€ÞBôTC_#€5¬Bì<ð¿”Ìõ¢·•ßþNH•ç¥?p;qÜÍvÄQ1 å0”}·M¯S³^Ǩ ¢"~¤ï{œGV¼ý¡wŽÃÕÖ·…›w,?˜×Q̪W8L¼Ì{ÔÃ Š®û ÏíŠ{Šï/Y™µpTußµç¬HþŽª%’Rm$H¸Å—¨“Pá4¼$ˆZ„Õcó:Æ8ö«‘„ó6¬ø/¡ à§‘“Î*þü<íÚÛÀ 1’“ï‰Tk™7a«ó•Yªµ@Jh²Êd¤T¢Æ‰ž[Šm+MzùÄÏøÙóú½f`uZÉ¢‹5¦®m$k•\­–pàj(«äÉ·i »\µi´ÚysÝR64³i»@÷9u‹C©“¹õÚd…ÕU”~²´ˆ 9ŸÃR¬ÖtæKÓ¾­]·7k<‡Ué¸%±q=Gƒ®· "5ÊdÃ8\1u;bíÛ˜ûk(ïj°àÑ‘(ÒÚ¶f<8_²\õ¯Ó¢Ö&ÉgQ™R–U²˜[V·sêQ ¡“Ó{ïêg«‚׸„yóH ÓÊ ¾aíøž:R›¬*<ÕÝ"hÚ6owrÅÐá*óÉÃk½Ká5 è̺JžÜáÚ›w•« Ÿ[‘–óÁ† Ù`#ºÁú› jêS/d—K™ÒFÐL?ӻ˟Q´›”é¥U7`”ÉȲ<—!ËpGØQÂu§ ½T+}ûÈJm´œ·ås7õAÅù”eÀó(`O`óKס£~(6¬œYÊÏ(ÔÎØ=%¹-ÝúºãP ÕõòM—šŸ¯úÔ0m‚zœ²K¦?ÝÌ™8ðl ð7vÄ^v|y¼÷‚DG=¿(hŸR$(Óä¢Èq¢–`Þ¿<츽cþÉáåwÀ¶$³@-vŸ’[î‰ð•ôѾc>h›ökã’ˆŸÏù§îo“·á–~˜‰BÃ9d5á÷ËÏuf1PY¼Z³PanÐ4‘–®8Dz`£+¢þ› §Ÿ:x·’/‚[Âõ8ømYóß&á>T„iY”]jÁ®ü"LKv#/Ãtή¯P0E}JMýsYÖif²À¨\¥ÚÇ@¸+èÑÏ㣋U€l endstream endobj 269 0 obj << /Type /Page /Contents 270 0 R /Resources 268 0 R /MediaBox [0 0 612 792] /Parent 272 0 R >> endobj 271 0 obj << /D [269 0 R /XYZ 63.8 705.06 null] >> endobj 268 0 obj << /Font << /F55 164 0 R /F59 177 0 R /F8 154 0 R /F11 166 0 R >> /ProcSet [ /PDF /Text ] >> endobj 276 0 obj << /Length 1214 /Filter /FlateDecode >> stream xÚ…V[“›6~÷¯à? EקΦIfÚ‡NÚ:ÓÎdó€1ÆLxïvÿ}ÏM€»Þd<!éÜ?}GÚ á§½$R™gM¢¬¼²Ýa½¿Lá»!çg-ä¢5K 0qóž€=ˆZÔZ³ƒzN̸¢Ë?# ±ŒºÆJ2†žîád&kÐüô6­@ðóH®ÅÎÍ×ÅrI)Aù“¼Ê¦bòÙ: F*ù®$Ôé5Vr£ÂÜü+à!¿“«ƒÓû¢” Ð!iú³KZ-áh½&BkU’:k¡Mnx¤L6;ô·N#6Lìz Óÿ½àVW¨‰¿ ƒÁÄŠâàëäØç‰‡ñ™jeÓHð™°õ‚kKìUŸ8H‚ÂÈg˜•ý Μ73ç­ù»cj£=„£GL=ÅX.Ò3»ÚÖýÐ8äv®/ RÔò(­…h¹Dí‚JJ7D Áꔃý«÷ÄûôjpÇÌøçaáCá è7Ò»0öÊÁ¡q®þá3ÅÇW.66ÙHÙ(¡&À8"ìÅp@Ä »Cj³1›P}™ŠY»Ø„~û‰œC£¢tõkH…if¬}÷&Õ† »ÃÞ™p²ô¸ç¹‰qø÷+&®%û?:mÈ ùþiƒ ‡ô†?rD!¾0ë/¨ºhgú§ôsèkâé–Ö„ÖH=¬ ‘CSËK{p†κCŽ«h± µí.€ç_ÛÌÊòQ"2NBwp~²øšæç®—äþŸh¿‘2žP!Á ŸµëÉâù¼%G^;ò§±Ü‘æ+Q~eouiâåÌ?sEfqÚyóÀ,ž¼ÕÕ¹AgjËà.€yÁ ñFœµ›oRs„e.¼Î™ëP“Ìë—=¥ûâ®z#O·T˜~@ö3ÀMÝeßž%º`M3Ÿ;_ÞÚŠ7ó?S¦„:$)oÆÌ׸ú®»(c’,¢ôR õiÄfÅX0÷Í%¸f=«öÿª'Ì"RÏã$Åc”·’ǽ¸"bªoÝ$ªÝRPÔÀm)Ôó\ÒùŽâÚæÃnó³˜û endstream endobj 275 0 obj << /Type /Page /Contents 276 0 R /Resources 274 0 R /MediaBox [0 0 612 792] /Parent 272 0 R /Annots [ 273 0 R ] >> endobj 267 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./PairwiseAlignments-genome3.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 281 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 282 0 R>> /ExtGState << >>/ColorSpace << /sRGB 283 0 R >>>> /Length 1042 /Filter /FlateDecode >> stream xœ¥VOoÜE ½ÿ>…ÙflÏßk#@Š¢d%U¨Ô(Û¨ ‚¯Ï³gv³‰ªŠÐC6yñØóìg{V芄néãöš>Rœ25ãœÉ²rSÒ1¸(}º¡_éÃöíÃ/?¼¢Ëë-qJ‰Î?¯/Â[¡¶7o)Ñï›Ð~n7ñôãÖ„›QÏ\Œ[+œ•FçÞénkƒEHDy À®Ü‰V¶â°r$6Ø p$–NR:§æÐ¸7’Úxx¨Ñ¸TD4‡’„µÀ Y9Î<2iRN5pçj¤"ójç`È[û²Kå$¤¦xpK¤%qqn¢Æ6€; Ü8uRTQÂßP•Fêy§À™sE]Ë:ÀRÈRåç³pGù6Åù\¼`fmf+y°*ððÔLB®¨•”Ê5 \ëlá_Íëd¿Âu«¬Èº2Y œ¢^*_n«ž­sóö¨«žÐ*[à÷A,ÑàÓ£ž}pw~Â5쫤À)ìÐKÀÏŠ»Ýmš’·„™M…^üPÆ4qg­QŸâ÷‡pà'Õ®àkÄ“èK¶ì^X œ%på~©ÌæR\”Á/5¿Öqö‹ ýz)„h=ôªÁ‰dðKèุð-âe4øišý¥Ð«¸¾mÖ_¡—Zä7óǯ_È ½*øá˜E¾ÐËÀ¯Šw=p‹Àæ³;qæ ~¥øÌ8î.¼¡?KäÛ£ñ­´ÙÚ‹O­ÇŸùB/Ø[Ø¡—Xøk\¹ƒú_ÝnЫÈÄ#pvƒ!M™¸¹ŽÃß W郿JÆ¢îÞˆÞO¡—©zã˜UcÇQˆè‡ð÷?ÀOÅÛ̱ùÞòktÚ› íz·°C/åiÔ8sÃüö¾øC¯ìóÛ}M{"˜ßÚW|¶c~õõÂc(ú]]?ƒ^Šý‚~^¸ºÐ ~%îƒ^hLŸ˜ƒ^†ÕêÄÝ_p_ô»uñF‹1Ä ÊLÛq/ˆ|¯}“墎Õ<Ÿ-ÂÞÑõ3óDHR§uí§£yÁGûš¿£}Á3û쯓}ÂGû:'vöWû•ü»‡Ï$ÿðØ÷Š7oÿÞ^†ù1qUßßXwxööºÐVÓŽö·Ûwûþeoîý©{»bÔ'î=½Ä½›/£sw}»½>uÏ'÷ùåÀŸO¬ŸÃú®àöYøçöxÆ<³ìíz²Oøh_ö³øçôÏ8s– F»UêÍ;Âé $ÿlú_ô—ÖüEåÿð' xÎàüëÕaË)¯¹:BkkÎçágðxxùW·ºwÞzlÜ{sñóŽð*\Ü?¼ÿëýý‡Ý[Ú_ýÇÔ%ˆúkžÇŒuy¿ÃÚ¢‹¿wØ–tqó ±ûóæ÷õö/·‹8 endstream endobj 281 0 obj << /CreationDate (D:20131113201933) /ModDate (D:20131113201933) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 282 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 284 0 R >> endobj 283 0 obj [/ICCBased 285 0 R] endobj 284 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 285 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 273 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.696 178.962 226.392 190.822] /A << /S /GoTo /D (subsection.12.7) >> >> endobj 277 0 obj << /D [275 0 R /XYZ 63.8 705.06 null] >> endobj 62 0 obj << /D [275 0 R /XYZ 64.8 312.411 null] >> endobj 278 0 obj << /D [275 0 R /XYZ 64.8 296.023 null] >> endobj 279 0 obj << /D [275 0 R /XYZ 64.8 261.652 null] >> endobj 280 0 obj << /D [275 0 R /XYZ 64.8 230.329 null] >> endobj 66 0 obj << /D [275 0 R /XYZ 64.8 164.964 null] >> endobj 274 0 obj << /Font << /F39 151 0 R /F8 154 0 R /F55 164 0 R /F11 166 0 R >> /XObject << /Im1 267 0 R >> /ProcSet [ /PDF /Text ] >> endobj 289 0 obj << /Length 938 /Filter /FlateDecode >> stream xÚíWKoÓ@¾÷WX9¥¯íõA¥V„—PT9•ªJÛ´”“:…@á·³ÞýÖžµ7NsâÂa´öììx¾™‡ò½g¯yæd^±“_9qä¥Nœù^’1'¿tN†û.ÂáX-/öÙÐUñx'È4t+¨4tu)è‹Ï}ˆV¬o ‹ òAO•RÊ"ìsñ¸V/»‚BÓËiþÞñ—1/ãÜ@PÂα÷ZÖF¶„©Ec*±eŽ]}¾Ò{ÓHŽ{ Š ƒ*4…‡ d³­ÐÚŒ 4A&à•Ý Œ·»íJˆ|•§ä+ÎÔ›²M>Òøž ¢n¡=G¡þ²Yødßes(èÓ†S°¦€çîˆçÈUÖ+.lÓœaý èXÐ[¼  ÊHSÙð¹ HÐis×ÆØž™lzAç$ÂS#E*Ý}Æ·àTè¸@\çDGQç)Õ3œÁö4Ûà4þA4ú*Iƒ¥™;YoMw/P^¨Æi7B3ñ;žu]8² ¸%*të µçsí¯Í—¬)¡°ºðæTN?‡és‹k•—N°³"€–ð‡~¯N_AîT’=,•¿{ÚÂæˆ‰3¢]sÒ®™ïE‘ãB K”–¦1ºÌé4ßÂk˹À"ZäB‹\d‘‹,rfǯÜâõg‡ ÊVì°cA™ÉnLë°+JM6·Ks)Ùa'ød‹án¦]v¤·F1ߌëY(¦¸m$eV¸4 Òû×f÷]î·j?é_²µÈpº}*«‡×Mqµ>%·,2ÏwÌ ÓÔKC4²@Jîò½¿JÅm½ endstream endobj 288 0 obj << /Type /Page /Contents 289 0 R /Resources 287 0 R /MediaBox [0 0 612 792] /Parent 272 0 R >> endobj 290 0 obj << /D [288 0 R /XYZ 63.8 705.06 null] >> endobj 287 0 obj << /Font << /F59 177 0 R /F55 164 0 R /F8 154 0 R >> /ProcSet [ /PDF /Text ] >> endobj 293 0 obj << /Length 925 /Filter /FlateDecode >> stream xÚíWëkÛ0ÿž¿ÂôSÂjÅzø5¶AK;¶1ºWÆ>t¥¸©›â$Íc£ŒýﻓN¶œ(mGƒ1ÂYÒÝé¿;É"øñ Q, ¤H˜”*V›NIJ$I¹–»s-ä´ýוŽfð³¢P› ›‡ƒNÿeä,OD ®‚4g©RäŠÉ4 —Ái÷Kw¯KxL{¡ä¢[à »sà,€fx–•Φ°@Æ­Y£Fyõ˜ôË¥‘¬Ð,®s…ÕùŽ“ei—èûfªh|Hì½ Þ¹ÈDFÍÔ›ioûÈI4§D—+Ú59a”½³Á›þË8q ±di–rm²C† |bLït®·f¯‹¢JX”J»³À8FëÊ$Љžgä8vv‡ ÐÏ"„œ³DÚÊ´?}:Þv)ãyn]jü&šB)E·2XàBÖÀS³ÖsTþÖ©QªaÑóá¬Âê¬ ½b…ÖgÓFq¬ À(—Üͅ⠤©¡^ôÂXHB1 Æ@Hu›Ùâ:kmÝV ¡ÄÞ0&žÁ44Sk#ýÅ HûF:!©Ýo1 Í3åv€DÊþ4(( RRy\>äy3­‚„ŒŒ_“ÿCJ¦$ÞfB»3¹ªCÕKÚ86+[]&}Î) %múMtÝTø"|Ò yœšÄW”˜‹Ö6LGäæèÓŽ]Íœ[:È9´Å;y‘ØurNã[ ÷@¯h}¨§)ô©•wŸ) ³¦OH!ø÷úrz@ÐpJ´G/Ñ¥s_3gv¯HïL“[ÿ¤®?züyÇÍþ¸ÖØþ áƒoÂÖ+<¦×kÝ©TW'òð6õ„GOxô¤GOzô”GOyôâ–BRV.~DR3EO—6že+êN)k³m$6ÚN¶Ù™6Ôb§ärC;«©ÅÎ)åù@‹¼Ÿf êž5uÆes>iXÝýaþ‰Nt¿ú͹ޥL'W8—çœþ33!Úw„-|ÔtNHKËηÙN?-ýìØï’S ./ñð”‡'<ÿxü?Ëáÿ¬Ê˜ÈMâBëuŽ_Ìv<- endstream endobj 292 0 obj << /Type /Page /Contents 293 0 R /Resources 291 0 R /MediaBox [0 0 612 792] /Parent 272 0 R >> endobj 286 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./PairwiseAlignments-profiling1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 295 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 296 0 R/F3 297 0 R>> /ExtGState << >>/ColorSpace << /sRGB 298 0 R >>>> /Length 607 /Filter /FlateDecode >> stream xœ¥UMoÛ0 ½ûWð˜'êÃ’ŽK±°a ìÐöÐe^ç N‘¡À~ý(Kq” +jìÏOÏ"©GŠ`KØ7°ãQh° µ¥%Z Ò{4¶ |ƒuñn÷õzWU!Pù³ºúÌo­çâöü(æü[À§ÂZN£QÐñÛ½ç¬ âí¤„š¶ ‘AcKâp,²¨{¬ TR°S(=·X¬È¡´mBG L‰Êì8W ŠõÎ2®Bþ/¿”Q,_i‡WPó –%ÊÄÇ”>Â#ŸR>ð ù”ò°„Ÿ4Äwäguʱ»ÿnÁÇÿQ²[êŸÀ‡‘ˆøˆØ+, h Sw0!ÖM¡^êþã/«©ÔH6“ËQr©4–>“«Qr% J‘Éõ8¹5¡[Žr“Éc[%+w©Ë”æjɾðç<[r€­>ðÉù/ÙOÖ |‚od°þÀG˜ñžýDG>Â#Ÿ>ðYüyy²š¼ÍJ¥)´! ‹’úúÔ—ªû²œCv2ÉÍx9gÄÎòr´\jÂ$¹/çv+m’»Ñr¥ØŸ.Éý©³RGZôKÓÄ9@e%ú0Ó1žÂÃâ8ÿ^3Tê}Ö=¶.Ì,åû)ÍÁÞN®WOßVðeÊ-“‡vûÜÍïf½hàýª}\wÍzuÛµëÇÝôêùk'†AÅw‚ ­×oVí·S.ž  ªöÏhâߘ=íÁÉ¢Ëûýã(¨/ñÅWX8Š3ÜMvÍ驪c¹)þÝÜø endstream endobj 295 0 obj << /CreationDate (D:20131113201933) /ModDate (D:20131113201933) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 296 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 299 0 R >> endobj 297 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 299 0 R >> endobj 298 0 obj [/ICCBased 300 0 R] endobj 299 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 300 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 294 0 obj << /D [292 0 R /XYZ 63.8 705.06 null] >> endobj 291 0 obj << /Font << /F8 154 0 R /F56 165 0 R /F55 164 0 R /F59 177 0 R >> /XObject << /Im2 286 0 R >> /ProcSet [ /PDF /Text ] >> endobj 304 0 obj << /Length 2203 /Filter /FlateDecode >> stream xÚÕZY“ã¶~ß_¡ò“TYѼTìW™‘r¼.Wj㎎U$q,JÞûÏ»»Ñ-€ ˜ÕÎŽSåˆ €¾>t7BoªWŸ_GÅ(¼"IÂQµ¥±—ÒÂ÷²"UËÑ»q0 ƾ?Áda2¾z„—”Ãb¿íj2²xœO~¬þþùu>*¼" Sd„^Ç£i{Q.ì¼É4.Šñ÷«Ÿ ì>‰ÇG¨Þ#¯$ÿÇbìnê½Eq\oÖjühp$<·P6{ø¹S‹f2 ³ñ5}MÅø–Å qH…btÓfGÆÑ;ó~ìpç~ü‘ß+· .ƒI“0ßרh½8 j,mC¦fIb€e‘—GéÈWxµ¤2±®ÊHœܱïùY(„HÔ(QQ‚Ïd\#ñ GÓØ`rR˜š|EƒöÕhÏÏø–†0S21X²ûÐj|.°‹8êkO“†ûþ áA{Y|Èð°oxTxI!Á½¿c×ä&;%:ñ}ÝÁO¨ªê)Ø?©ñ"jt«ÝŠ^¡û¨ C…zsŽ`ç¨Ì¥í`GˆC(xa,ˆ§JÙEƒ÷pbcë#[Ûìë-HÖ *²$ÏÁö.è Þâ¾ðÞnd^NŠ[³Wý+·ØŒø®þʪ…^†ðLCö…ШAÒ x%>‹F¹´Ä:Z¡NʨžI Ø­Léê\(WÅ€])2ךCBµ¹Û.r [£TšüÀH0'ÕÏBrÒ$¨û£FIмǗã={nj^yY›ž»˜$4uð‹ÌÞ¢RÛ§¾ëRúAØCJw'ÊE{L"GžâÕQÏ}㈡,ËE‘ F}åŸP®ú²CßËós¾ðç¯[åe¦c ´Û­H•ŽO ÔLˆ˜×D"ÎåGž_€…!XäJÚ;è/÷ˆÔ{J5-N%v•…@î’½v©õÚ ’^Î>Ž ¯9þü¨ Æå-ö¢8¥åm õ"†%) ÁÓS½ÂÉâ6SÙCòxö¿ R§,2˜‚ö;˜•Hùx†‹ ²¢ßS«w”Ja å¯Åªíãï$¹ÏTÊ¿‰±ð²$“yRÁ¢’TËØHýÄψp#>öÈ}˜BãÄ(õ¡ >_Àê9Ži~64/ Ã{ƒñº9¨Š•ÖdiFµz¨ŒÑ®è÷¤ì$–Jé._&¦8ÀwZsRc?¡þ5NÒt+¸Ü©¼AcÛ3¤M+Þé{if­ƒuKhîØ´(ŽÎËi˲§^jIfw{òRÌšà/Õ$dü†}g«Üƒ§¥– .BqªÓS¬b¨Ùnç÷zýS2qDðÂL}Dnªß²ú’<¡þsµª/‰¸V|Ý6¿­2Ѐƒ4X*³€ÊX„ß ½Ò±â å«Òái¥Ã£æ(C¡V:VÙÙ‡C¯Ð@ݰ7½Õð?=ª¿ 67G½-•Bßïmõž¹µ3óîUöHKÞ­lãv}Ï?ï:•©¬TÍ<>hxø-+Ùý„r&»e­±yßóNöi€Tì´v®IæÅaÜÿ:òZoç¢N\Ò:Ú"G[ìhKm©|+MEsJ:<„™Çâscg°(Þˆý>ÃüÁÒfsîiwX<(Øá…3Ëþa⎌`pèïӅÆusìç–ýö²Ã>Ù° ½É1ÿÕóì¿ÐM.4ìBn†ÉGùs> òåÁ³Dþ1‡!®œ(©3s¤ÓÜÑV¨6ò#3µû—z/ô‚—u½Ë’Å@²|Ù‰úä`¹ ½½,ÆŸœÞ^.!ý¿2í>…ôÿÅÀWFæ­º×_²^ÓMí®û5>R7üÝڸ̓ ³PÝíâgòó÷uh¼ÅOjàW+Þ˜"‹_˜x¯¯Äd[Þvüƒ¢HX¿VôèÜɈ$óÞ®¡k u瀻[××ôóšyYüe÷ÃéÚØtùÆØËÏŒúÑØ×{GõùþY}‚µ9ñ.ÿã3é÷æ´ç&&¿º<óO|hü…·îºcyžüÇŽ¼ ðbÖm÷²à‘ _œ#ú©5éó>.‰-|™nÙð§(¾Ï> endobj 301 0 obj << /Type /Annot /Subtype /Link /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.696 591.214 226.392 603.075] /A << /S /GoTo /D (subsection.12.8) >> >> endobj 305 0 obj << /D [303 0 R /XYZ 63.8 705.06 null] >> endobj 70 0 obj << /D [303 0 R /XYZ 64.8 700.753 null] >> endobj 306 0 obj << /D [303 0 R /XYZ 64.8 688.35 null] >> endobj 307 0 obj << /D [303 0 R /XYZ 64.8 642.582 null] >> endobj 74 0 obj << /D [303 0 R /XYZ 64.8 577.217 null] >> endobj 302 0 obj << /Font << /F39 151 0 R /F8 154 0 R /F55 164 0 R /F56 165 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 310 0 obj << /Length 1465 /Filter /FlateDecode >> stream xÚíXÝo#5ï_õ)âÚ^¯wq‡è!ÐIœhN•>¤iš’&d7×ö$þwfS¦‚nž9ï^M©?[¬0Œ„Q]d ì¡ÎžÇ f0ÆÝ.pUÓ0ûv sr‚;ðkšrúÌ&µn¦tÆ…[X‚ñ©æô‚ àÉb®.i]Å˳©ØRÎij²ÃÀàJ+ŒJ›gûŹã|ÇÅïaÛŠ&üÊVdíÛ{©B$i0öaÄû]Ô¿}ÌhÎ P—$±æø{]<‡c¤\T8ªÉÂUt¸Ñ&xÔHÖ¢aYˆT Ú¬7þ>CÌ¸ß !Þï{ÃL!,¹o£P|Î*,ˆÿë÷ ÒžxÃ2¿¬Nø’Àm屉[ç¶gc(ú[¹êºêž¿Ž"u]µ¸÷ç´|'®vºƒu¹WÜ}¬»³‡õ$º,¦5Ë!³,8ü'þ¥»ÚõÞU88™¬â¡5SzV3ðÀœ`>Ù¯Z‹?vTëzdö¿Žâ{YÙQk­5R ¹©Cò~Ô~  Es¼œ§óï{™ü‡Bó¡¿õ»÷´PÜfõpè•í„cYk¦uÃUš“Öo8ï³ ³HðîðGRß8³œ2¶S7ô‹›Ÿàÿ•Ë›fSâ0oq"Ù8ŸÊ atȉf.µÄ'Ñmx  Êsz¶´´ð.¶!iCƒÌ¶KJ99³D9j)9{ b­: ÁÀ3Å í»ðÆj  ¥Ès퉿ìÐ0‚ âσÌ:­ø-H8ž”œýU8A!Ã.$à0 )6Z¢ô–„÷Rb…•ªé ÕÍ×ýG0±L­OÁq8²Š¦ZàÄïË,å¿$¥|/™Ì¢ác%~D—Çv¼IBFÔÿCê#ãà?R›…¡6¢¾™Ð²Ø©,tÕ,¢Ê‚~Zeá'wñpJëãX"ë7=¯ýëxéàQœc£§÷‹ä:¤Ç®b´YR9À8£.w9M<øÊrZKà±õ^]‘]gZÈ4D¾×ã€Ô&LÁVŽWi@¨ƒ'?A„€ÊÚçÓœÓO|ñÎi³ñï–ËP§ÙÓô~ã¥o›‘]…[ £ 4.Ü–­Rôdê×Ò=34JÓáÃwýpK˜pU+ÕyoX@™ •†9> endobj 311 0 obj << /D [309 0 R /XYZ 63.8 705.06 null] >> endobj 78 0 obj << /D [309 0 R /XYZ 64.8 609.739 null] >> endobj 82 0 obj << /D [309 0 R /XYZ 64.8 582.78 null] >> endobj 312 0 obj << /D [309 0 R /XYZ 64.8 565.623 null] >> endobj 313 0 obj << /D [309 0 R /XYZ 64.8 310.022 null] >> endobj 86 0 obj << /D [309 0 R /XYZ 64.8 195.772 null] >> endobj 314 0 obj << /D [309 0 R /XYZ 64.8 178.614 null] >> endobj 308 0 obj << /Font << /F59 177 0 R /F55 164 0 R /F39 151 0 R /F8 154 0 R /F56 165 0 R >> /ProcSet [ /PDF /Text ] >> endobj 317 0 obj << /Length 1565 /Filter /FlateDecode >> stream xÚÍX[oÛ6~ï¯0ò$cË›nÃ6 `C‹kúÔõAµÇ…m¹–Ò$ýõã!%R¦lÇí€=Ȧ¨Ãsãw.äë›/¯E1aŒIÂ'7·“T’|’”d›ÜÌ'#6e'êGLcÆx]=ª—J=»ÙRý6Õ4™TŸ?Ýüõò:Ÿ¤Hy Ìè$f99rºžæ2ªwÓ˜'2jï45N¢zʳèÛ”ç†íJý”[C¶-AÆN=VL7@øõXlÔÏ §KXº\ÀÔ(6À¸5ßê[¬æï,›™ïÍ¢1&$‰c—‘¹2E›p:¨çI=ßñÿû’*íâôšd('%žˆïŽ;~[„i:H=ð¿.yŠ@/kÌt¹™ã÷NÍ0áv¥Aô‚—Ú¥Þ.Hœ+½­*Á’„™J1œ¥ÃiæA8ìý|=ÂÝÍ÷\NõÆ'C㣢„¢ñÉð§}+š„6ë?Ò*÷œÄIÆ9.KÍ2îÀ¸ßó¤eNŠ¢Ãô ci±S"v@ñ÷––î móžNYJ$–)d»{]ïú¬…Z!NUŸAm¡ÓÙôIëÒ!SgÇå az’_•Æqë'GÌœ·û¬Gj."WÌB@<Ïe?áë׊3aQ¢ÎÄ´µ³Ä¹¶K¿{º¤ O‡Ã A¡£K4å®ì4ÀÜ5h‘ #“rvh̲ÞèÑó!Ҍ„rÂE0_=Ï…?ñÈs*l¤F "'‘ŰEkæm…RùLdGP‚Â( ½ã×7Zô{¨ˆË®YÙTºôêÙmé郌±8›1(¾5Õé¨É\’‹.ß.¡V8ïûè“ì^b@¸³TáƒÉ®¿P-n¢@¥§×âBËtš±ÂõÌk)ú¿Žy]¹ÏÁÝj‚„kæ~0œX.ÇÁ3§†ÉŸNÃZaZ¶üß8êµFãZwíz¸rÚÝEnOZ®6\žöÙe˜Ë  qt´s †iâ…išÈîjGú3áLúY=_P‹Yø$©ê˜Å(JT¦i¨µª!¦Ôk¹21 3s3Õ•buüR†ÔF)Œ·[löŸŽXÌEFŠL¸mxŒ©úÖüM¶áéÏ.ªÖfBx&é/i©¸Óhô:‰ÓnÜÞlã(8#Ø%R2ž¯Œ*¯ôEïQHë‡Hƒä%¾Ïú3àsâÒ*åºÝžoçþ{ÜýjvŒS’çÜ_éÔYž²Â¶æþ½ ªž‘,^MÉÃWSrüÄêÞO¹GÖXÊl<}ÎýË“#$… œ «` Ã\×,`8wT7» ¯o*Ó²iÜÙþ¾2¸ÐÕ|Ú•CxŸ/]¼lf–Wn϶-py€N®2×pá»3š¦ç^ž¥„sqôÀK š ²ÀsoјBU'+Ø’"I '¸ßáá…[žm¸>ö)!Æ(¸ìÏÂ;<=x·4\ͤ>¡=9­Úý]#ìJ†·påUíNÃU—Sü&¢ée"ä¹®¸ûwV˱ȩ®#5·¡§éþÿ÷Û9×Pë{§{ï¼×¨ÈÛ ªÜÝsÝe¨Åú)¥B«fïýÞu·…Ff_h\9´7Â]|…®hg„Ëdn{ð™`³â,¾Q3«çŠ=똨œªþŸ©ª%(ɘċ¡_\ݼøͲã endstream endobj 316 0 obj << /Type /Page /Contents 317 0 R /Resources 315 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 318 0 obj << /D [316 0 R /XYZ 63.8 705.06 null] >> endobj 90 0 obj << /D [316 0 R /XYZ 64.8 700.753 null] >> endobj 319 0 obj << /D [316 0 R /XYZ 64.8 633.361 null] >> endobj 320 0 obj << /D [316 0 R /XYZ 64.8 528.935 null] >> endobj 321 0 obj << /D [316 0 R /XYZ 64.8 466.195 null] >> endobj 322 0 obj << /D [316 0 R /XYZ 64.8 403.455 null] >> endobj 323 0 obj << /D [316 0 R /XYZ 64.8 315.419 null] >> endobj 94 0 obj << /D [316 0 R /XYZ 64.8 210.108 null] >> endobj 324 0 obj << /D [316 0 R /XYZ 64.8 194.419 null] >> endobj 315 0 obj << /Font << /F39 151 0 R /F8 154 0 R /F55 164 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 328 0 obj << /Length 1892 /Filter /FlateDecode >> stream xÚÅÙrÛ6ð=_¡é“4@fzL’:Îtr­L’<Ðm«‹ª(Gq¿¾ÀbA€$$Ëtú€Áµv» òùìÑ“—ù¨ …âj4»iEŠ<©‚]°Ñl1ú8æd2ÍŠbü¡©&SÎÙx;aãëjòyöû“—RFØ™"Ú`S‡×LèÆ´¥i+Ó®Lû çn¨Ä"ÈŒdLy"—èÖbηˆV¯PŠÚö|ü‰² ©/Ü ÈgZ妯+3þ:ázl«vÍl ^6µÓÅä‹ '—«y jåª7I~†U>®æˆe€†Šâ’•çþö•Ôt?˜ö·iwØûñ7Ü{<™J.`ØD`w¨Û»Ì0MEÆSj4eŒFàæqo­V±UØC6k4a.°OHt‹(¢5 sV64<ÓšdEë>õVD S3efÑ®YÈ_œÇù[«éÿBéMüúÕÜq>FI–±Ñ”Ÿ`¹S!sL¸ë„ë2çD>ö!CÐîbkשHÖÁN¦ ¥Û+\—{È€ðä¥(Fƒƒ‹ðŒÔ¸<×$×þtÌF1fãr|òÍkpžan®Ð™'ØqJNXný-'"Ç€È0 žUksãÕ¸*m¸E'(:.¿ ç]YW¼©V60 hlÐæË&º¢µ Q.”¸ukø&øu®…&T´÷ç¹{mÚ;ÓÎMû`ÚÓ”UÆð &Rh%<²q:nR:ÖWåÚI]ã­K'DËpè­þq.]?e¨ Hn©O”ayåk¢=8!çŠP-Ñ9ðâwØn­® O!8ð´ý4KEŠáCv‡½@¥õ!6Vc¸d}ÇEªk¤¶Ä뺋‚‘uÀg¦µn‚ƽÁ½U7`=Ãv¾'ÎEÁì=‚þaÚ+ÓNp~Ò Z@8&v19öÒL|캈"ñûÛh^#ã7‘9¼@ß©Ÿ]wŸe§ÌòãdZ˜ œ«ÄPú. ©«ÎÙcvS³ÂZÒ°9Á|±53õ‰eûC4íFçSt’õW½ÿþÕ c›A˜óÈlFYjëØ£k`ú°ò]º!;p5Ö‘i·Q*³¼Ÿ:ô¨ìÏá”Ó¨¥};ÁªÙ+þ>VÇyxÌJVs4’ÏçOƒµ‹aÈ5‘hÎÑÖº[mCŠZ{Ãol†½"£mÑ»pËõíÖ v6ý”8™—3*²ð÷¥¦˜ÇÜ®]—à•£*®bUA¤Ñ4挙§¯Dëù—[7Ç[¨Ì]šµ[^O$º¢KKÔ[ã¶m‘]~uE4Jnkü–à寮Àò_hh ¶Åœ!É…èš Ô¹2W[H…²4nç–¸ö‡Ûð„¨7a¡^Uxȃku¸&Q­I6¨ £îLÈÖêv V¹±f½ýâü$<©<ìüÁÍCÉqÕ!–¨=rJx^ÄO¿%Fš[ôá2ºígØ—X¸6ÃCjN8Í?­H;ŸD®Ý¼L8ª¡Uá:™h 9×+NZåT ¡¬Û"ÉV–%µf¤T¢æRE˜Š\¥E7<9ÿ;³~–ä'rÂ˪ª=?*‰ãø jÅÝÌAµFå¨ßYBXf¼$ÜzC‚2d‘]È€Ãp æ~GÛú-Ê.½Hböo*oûV×hjØš×7Àäø5¡0‘åDS>.B¸W9œ"ÜÔpëE®Œµ{o^Ÿò¶FcÜ^ù±aÎ:wžsÉ%ós \[°5àÕ`¸‹6]ÔîºÂ`'uˆ¹f¤uˆ·²ñ†wjé ô¥Þùp|믔¯KB‚…íŸ ƒÂо‹ß_úùdh-ñç§QYzõ/zp³×ïÇ{>ŸöÖc^Ïzú¹8ú"à]DE‘/·Õ‹«êÄýåüÛ-2mÛ~Ì ëÃøí¾cõtñʤW®÷EÃG]÷) .77î¼ikdŒˆoCIUìµ&µü.b„¡7bÖ ÷ÝDL˜Q¨‹œ¶U Éà«§u”9æƒ3Í0|À¢¬÷Ñcüëîb(ØqbP0~DìªÜ­}Æöø!†ï’*¸KzϳÁ¼‘åÝ·5>C3mKtè9öû {‰½Â^cŸc_ÄîÞYò0a˜…¡ C†: ó0,ü÷¨–n$Jõ>HÑ$wÚ;„NJž8¢Lóä ºêèSÉažfCô¥„[³ <Žïµ2Íï³*MZU U›%ÅÏö¡^í ­ÚÏ—Â8¹ÿE$åAÑ<å]ý¨0Ôa˜‡aá?„¶ÇA/"p›ÜDà&Z¹“ßQiRUEGÿþZvHþ€‹V ‰¦}SÞãrâ ë³¤H49T÷Ý=6ô3žr½ÔOƒÄï^VVj æÈ¬üðGO*ï¯ßœQþå—·³ŽÜqÊõOã2ý)ìx4./¶ÒÑõíyT!öÊ€Ã̾“̃ŸyóÆL’–axƒòèdöèO³mU endstream endobj 327 0 obj << /Type /Page /Contents 328 0 R /Resources 326 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 329 0 obj << /D [327 0 R /XYZ 63.8 705.06 null] >> endobj 330 0 obj << /D [327 0 R /XYZ 64.8 700.753 null] >> endobj 98 0 obj << /D [327 0 R /XYZ 64.8 575.249 null] >> endobj 331 0 obj << /D [327 0 R /XYZ 64.8 558.861 null] >> endobj 332 0 obj << /D [327 0 R /XYZ 64.8 423.369 null] >> endobj 102 0 obj << /D [327 0 R /XYZ 64.8 379.618 null] >> endobj 333 0 obj << /D [327 0 R /XYZ 64.8 365.163 null] >> endobj 326 0 obj << /Font << /F8 154 0 R /F55 164 0 R /F59 177 0 R /F39 151 0 R /F56 165 0 R >> /ProcSet [ /PDF /Text ] >> endobj 336 0 obj << /Length 1381 /Filter /FlateDecode >> stream xÚíXÝoÛ6Ï_a¤(à ±*’"% [ÍKŒë lÚSÚ‡ÄvÚM“Æî²þ÷%©£y¤ŽÊj _CžŽ_÷Åãïôk»óüPÊQÕŠ«Q{:byž±¢©:ÏÊšÚÅèhÜìM$ãßöØøÝÝþÒm­Û•ngº}Òí=ð—vÌ.qC+˜~ ßs;ÍN¹ÐäiG~„Ån3³âC7Ä4™oÚ»öÕˆ«Œå|4a,«µ VÐkf.^Á¾Ÿí ϳªr+U·òH›3ÞíéáZŽ…¦U·zªÉV·™nŽvß jm4¯~†Æø¦æ¶¨Çg5hNc5ÈC­ìœ–ËÕ¢=§‘.˜ïdÄrO#^ƒèY´~–Ðeš’]вS6žF²Ì"¹§‘=‡èرޡ²´ì³Èí­Ø3Ô?ö¥ß'!»–½ìò`dÏô@×&L– ùý§½í,ÏŠ¢Ùkh*|ͽ+ï¾t:”iÚ(Ûèò4QàÇò4ÄÅjÉmØ67èP¥ØíÙµ¯OC$_ŸœoСN? qB}ëÐNLÛ'{)dÆ9ë+¾²ƒÊlkd,ì4rä”X3#ÆZœ•5€©€Ñîá,+dÙiõ¢“ú‰žý¤#_oŠÁÌâ…?餒åøo@-€R–€*Î<¶qŸØæz³bƒEºY–<Ô¤ÁTö€'àAEÞ n¾èv¢Û9ˆ±¶¾´Ã?Ûm,ù fÔº€Ù5-ùWh| |÷} ¿F§:<ø¯nos™GBͽ!~é:3c¿#Ï‘A‡M Vaá Lv8ï f”ü,l­¹™õîA'"°ígÐØ¹Öiî¬^¡) 0Ì9rßW°dŠî¡éf·Þ/—Qö}L }¿ö¬˜¡‹Ëœn^Åè;Œ/‹;ñ)<¬î;ƒ)>OðE‚_$ø2ÁW ~™àW–ßÇùàX9*2r–Šìù¿–‘Þ•5•ÅHÑ{€ AaßüFé§è‘Š ¥ ·çÜÙë?µOëûá-¸DqsFDç´]Ý „‚v-ÚëZâÅ(TVWExs@K z½€¾€^B¯ /¡¯ ¯ñ_ž É<É=),ñ¿ù è•{/aùã(aÙ¶%ìK8ýôñ–²ü”²Ô­D¥¬Ù”¨dc6§Ù‚f4[ÒlE³Kš]ÑlW™wx+.¨Lgw®XmãV}zWú1*/?¾¿Lã©2Mþ(ÓÈ´—i**ÓÖù/}¶‡=wÁDpŸá{—.Óî¸ÆÃ ñÞj=~‡µÿQëÝo­'H­X%@7‹ú<1~—à;ÆUU³` Үꦢµ(ZƒZïQ{Ï+ lÏDQk…jý¾V Pi&î´;ßeª?† endstream endobj 335 0 obj << /Type /Page /Contents 336 0 R /Resources 334 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 337 0 obj << /D [335 0 R /XYZ 63.8 705.06 null] >> endobj 334 0 obj << /Font << /F55 164 0 R /F59 177 0 R /F8 154 0 R >> /ProcSet [ /PDF /Text ] >> endobj 340 0 obj << /Length 1270 /Filter /FlateDecode >> stream xÚíYÝoÛ6Ï_!d`£'~J–šVXܧ®Nâ´·²¦ýïGRGñH‘±4kÖå EÇûâý¤ßf;?=“²hI«˜*fg­*BE]¨¶"uK‹ÙiñzòlJ'¿êö‡nGºNKZ‰zR}³þÍì÷¢*JJI«Å·Bδ`êö Èô¸–’ñ ×Cæ‡U?4´R=¬“"49oaørÏA&‡­9‘6E‹L¡@„ EÉ(©xÛŸò _óCß=ÕKº]A©Û…nKÝVvÎ’™Ç³~h(ßù7'zø^“Ëо^ŸÓþñZçºu~ñ;`ÐÁâUÊ4~o³üX·s ÿ«’,w¯/a ¯>ÀôUtΕ'1SŸuSà§ç ‚·@ÖYÃXrê:+Ñ·˜¾Œ~ßrÐÉ^ 2Õ«ìÉ´äJÕËhÇ%XÙ i¤y m¶Y‚ð ˜{ÍîÙû{É«¸ZÓ‹`¢MÖÆ»|¥ ¤V<”2‘Œö„Õ§u{†ÂÑ1k¶3Æž°²mtP!/P„8_=õVÿ$|5¸p+äÙfîoàd´ûÉ“_ ×8lˆ“žS*ü°›u>Æ–ƒÀvjî×…?µJ8Ÿù4cØ•6ó5汃£ƒ#9Ù!MýbÙØá (OPȾGJp.v„8vèýU¤4§ÔhWçÒŸ} j¥Ù÷GÝóš_ž7/2zy»ŸyÇCJëòHÌa¿ B_õ‘”Ññ&¹ Ðw‚Õ —z– ­ktêE†œ )ê(2À –w^=s°ñRN|{cgº½é±¦óî'K¤']¸ôáõeÈ–˜ç.Hð àl×è-š~‰Rï*Pf^¥‚®¯ƒ.ÐÆMºÆ¿Ö\¦øb_lwCñÔùl2G.µo}‰HNA„ pµX¤n0é DbK!߆2©mîÂk”¨\òÝà>Š´/W}Ò¡¸ì{Ëõ½„^A_Cß@ßú,†JDT…²QáHýH}áH­!ãâ•úŠ•úò—ÙÝìEΑ‚‡N•¹ÈQõ‹ê\TUG;4£B Ê÷X"šçÑsL+~<Ÿ(¨R¥Æ-ð‡;©Úb(G–KC D‹ðCD€ør¬msdN gL{-'º±p5­fÞµ"L‚vª“`¨½IÖ !Y…¢Ó*pN8Âç -ç±?Éè™gÖñŒФ­Ÿ" )ëQøÐ¬ÆùM¡E]z :»,vªÿ7ü¼?¸ÇS°s_?íc׿ÓwW¸×®‡{rk¸Çn ÷ä$øêpO ¸ç¬u$×› ‰ÓÍC×\"Z㇊þî©”!$0Ó=·¸ºÛA¹ãârkÜzÅÒØ¯ííÁC'q;þ8-™¢íðL€cjžeæyf^dæef^ÙygLZE^”Å ¸*‹¡ªüÞhŒ:¨$JѰrÊ«3 m2ó`xN…+¸ûʶ“~;·´Ö5ôÕPÂiÃ÷®—ΑJp#…‹|OVƒ:,á©\( céT¸É•$F_yô÷…»aúo†¢Å¿ˆ¢Å#Š~DÑ4ó>÷üU~²Ý7ŠnG³4 Ž"½ÖI *’èIb8ú=¢hõø÷ñ'îE‹‡‚¢dZ  ¥&Q´¤ià§)³ÿ9wg;ÿr0Ò6 endstream endobj 339 0 obj << /Type /Page /Contents 340 0 R /Resources 338 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 341 0 obj << /D [339 0 R /XYZ 63.8 705.06 null] >> endobj 338 0 obj << /Font << /F55 164 0 R /F59 177 0 R /F8 154 0 R >> /ProcSet [ /PDF /Text ] >> endobj 344 0 obj << /Length 1413 /Filter /FlateDecode >> stream xÚíYYoÛF~÷¯PýPˆHkIŠGѺpÚA‘…­¢ŽQÐ% EYTìAþ{gwgÉ!µ¸4Pr î¹zñBv,ä f̤­¢3žÄ+¥úZè*º•üdŽƒ·œÝZB‚‘íyNÙ­MLËu] !t*uv]Çø^~­ùìÙ­T—[ÀÄÒ©\^„CüÖÅ™<Øžk¼OMˆâ£~äíTÅb¢eÁ£•¨>Ä@&…NÓµll„‘àU>ùŽë¸œµé#;ÆÜ”[¹Yò3b("ç)ÙŽ‡)p*¡¾;”IJ¡i•2 £ðFŽO‘À²°Â> Î@}¹b‚¦8»×¸p†æod÷O‹x×g ¯‰‘ j@¦g¨ì°¯PvƒýUå/J>¢úp›l þÍ 3\°ê¼X1¸ä£_tuì Ö®ª~AoÅh|)j¹Í›|Tª¶ vc€b¶1Ž”iLb«¼L“Žè#ÌÈÝq Íã¢÷ ‰·¯éq%,ÝÆÃë[«Ói‹=B²©xw‰2Ui¨qþ¶{(®¾ƒ_•lªáÛÍõ¹‘âKo—ã³(IŠñ@)Ç[ÝbÔkÒXT•RÉFƒ…¨P….+V)Š”$ÕVá'Î ˆèZ"Ÿ;,RŒJ‹ˆuAQFÁÑ„e'¨ï  ŠdÄÃ*“ž Џú§WR÷ËÒqØwª‰_8}’;¡êª®Û„JW¤m®²ÿé ǯ۠ON+{P«Ìñ*)p.‘IŠ? Ã>›šÎ®ï]ãº,Å•¦ÛŠ 'ÿŠ:C€©›ÀŸ@ïñ÷[q²g⤯Jí@:¥_d19i$D JÕò&]¾9´W¹ÝýÊŒ¿ÉÎt‹rîHE{:ïõÉ$XµDd\®ßÇ…W÷«r¥xqÈú5> \w(X­ÑG7%6ÄF„©ÕvºÓ*Š<šV ñýâ:J7ÕvÔmŸª¢®ˆV ô€š-JI;ô¼€I7Æä8”Kø»d» §Œœ¶$ CÀªÛ³úù‰›½ð<_ÅÛs2¸EÙm;œ«ú5y„ÃC•›îÕdW-Ës€fU¥\ŒQçÉèU݆T8‚Çe´>®x`¢…Dw¶(CE‡ì5I–YÁ~Ûîœ aØ ²%¦a4^!¦¢¼}-J‹2£/M›Ø·bvøbÖù~ÑR-¾²ÿ¶í§²¸âá¼­¦‘Éþ>ºSEmÙM_·¼5 n{¿á¦þµYWJ+ìTŸÌgµÏ+Õ;lýCŒÆÝ§õç îÕû¡‚3=ÕÜ^ª7jò X÷ŠTçÍÓòÝÝ'ˆUÞ»ÐØwY“jú'ÌÝ껼²Ÿ5˜ÚNXv~ƒCÏÈ+î YfâêÔZEv¨Ê8GõTµP°Ññ¯Ìþâþ’P©Mn¥-=i%;h±:Þ-5˜Ø)þÿ)ÏÌ‚ƒF$Ã-<ÅåªÔ}"/ëÓâ%€“{œßÍ·ŸuêöâKà¬üf¡þÌŠµ˜³èÞIñ@¨òÛÎÀ³sz–Ùa¨þ øÄ£w££³@"b endstream endobj 343 0 obj << /Type /Page /Contents 344 0 R /Resources 342 0 R /MediaBox [0 0 612 792] /Parent 325 0 R >> endobj 345 0 obj << /D [343 0 R /XYZ 63.8 705.06 null] >> endobj 346 0 obj << /D [343 0 R /XYZ 64.8 661.582 null] >> endobj 342 0 obj << /Font << /F55 164 0 R /F8 154 0 R /F59 177 0 R >> /ProcSet [ /PDF /Text ] >> endobj 349 0 obj << /Length 1475 /Filter /FlateDecode >> stream xÚÍXYo7~ϯüPH¨—å±är‹¦@Ø»pc(æA¶dYe»’ ;@|y —Ã]ꌋö ÅÎ7g†z;|õñ¬{5©W½áUOפ¢ª§jJªšõ†ãÞ§þ÷ƒ‚ÉŠõ—Ö0cdÆÖPIÍtÛ0&@rIìֳʌø}äo̸1cfÆŽY´Òga*$ý׿×k¿„ïüdO\šqà“wÌö“UtÊ>Gþ9èwf<ÆàÙq¸“´‘d×;šëóðCö ÆH-¥÷%¨±Ø’«•dìüd–EÂR¥á13ã½Ãâ[tm‡†p<÷½„øOCdßÛ´:<Â-¿Nøf ° DÁá>Á…3©I¢Ô$+RrÙ+¸‘—i/ïn¬­ÂE`ƒÕÞ^)§Ð1Xß›qä·‡=¿¹- &\¤X™ÃîúX·ÔfHó›–• `mÏù)…*8­¥s/7CÀo 6Äé½a#¾¤Ó§¿÷ó;„Kí{”0fp§Bޱ¬>Á80ã hÆðíö?ÃXR¥"µ.SkP°?ƒ™7þðs sð“‚¹‚YÃ\‡Å,˰dqÉãRÄe—2.U\Vq©ãиCsq.‘忨 §tL›,îÖYDËÁC‰–ikf­™î8³-.†»Ytw€ ©ˆË2.UÔŸvv‘x4²"%(;&æ1 ;†¥TÆ ³)•i"4D'#ƒ¢¬ëþÇÉž[s^ÑþõcëÖS[î.Fv*ÜÚÔ±Êõ?fÏ‘¸o³©-s_ Áƒÿvw,!û×¥]ß-,‘¬û {j4^»éÈ*sëß5ÝÓ¡Ü8__HÞ‰•ãn>!ÖÀ*”Êá5.= ß _#Âè‹Ý>#?]M\³!gLX5—ân>ó¢èþch¤—$-l¸ÎÛ¨5¿xÚÖMQ} ÕÞ®¿˜q ž¹Ñ-ÔÛ½BˬõÔ˜Ãcç€veG³eqN±G~0¸C¾Ÿ=ܬY8>ĉ;–¹ÛVF©Xûlùì4BzXš¯áâ¦sèÚoP«>Z{ºÑú/ Y§5tñëµX#ÛÏý r\Þ¿®E ãd[iÃyßõa)Ào7 ÍB.Ðþ%Ú?ØüÆ æ™£çÚ"UâÛîKœOÀ&í…±ŠO`À>ï¶°4í^߯1ÔIÇP—g ñ´ñvó)BîóÙÚ»îH¶¹îËœ—~Aî¹hî ãé_Ê;°gý›¦5+ŠW®—‚ružyv{&.;K¢K…=E&$± /£©Â•! È)z÷ÌšÐò·ðmÓ®QÆn͉ðwñ£¤,S) ˆ$騼4¤m ÿ%ˆ8ŽökØ×¾Ïqû ΓA ‰û5ÚW™}í¾ùÇ8áœ%ìv~Ÿ£ }ÙÔì•nRÿ[7Y¤^âà¥à! º¹ýr‹}†öå út?ÆQê¢!ÜûÎ ÷%€®‹É;8üع¡«.×ùš:vÜ–¨ Í`ïv§Ö­õ+ÄmN-Ziö°ÓŠè˜QËøCiÆ ÷gáß¡TePý<ÄoTléÃý«[ƒ!rÚþv¿Æ|Äb=¼nòÇJxÕpòk¯X&½‹–öðbt°ï#<<ô=SÝÅf¬ åtŠ ªsØe[f°qžkáÒA¼,˜bgpe ÞYÜ2æÛ6.GØ ¥tÝ\Ú®j¹Úcçqdôe¨vj$‡rs·ÊØ9èû¦…hª<®œ…apÓ(§%1oV÷®­> endobj 350 0 obj << /D [348 0 R /XYZ 63.8 705.06 null] >> endobj 106 0 obj << /D [348 0 R /XYZ 64.8 467.653 null] >> endobj 351 0 obj << /D [348 0 R /XYZ 64.8 451.264 null] >> endobj 347 0 obj << /Font << /F59 177 0 R /F55 164 0 R /F39 151 0 R /F8 154 0 R >> /ProcSet [ /PDF /Text ] >> endobj 354 0 obj << /Length 2318 /Filter /FlateDecode >> stream xÚÕZéoÇÿЧ%bNæØ3èÙ±Q…‘¸J›B1‚ÕŠ¢ØJ$Í¥"Eþ÷λvg/‰®ãÂý@qŽ7ïšãýÞ£^œ=ûúu’Ì U¤6]ÍòBe:¥…VYafg—³ó(Ÿ/ÒܘÈÎo›HûO6_¸4Í¢Sþ~9_˜$3‘ñs©ÿóEb’*^BËh:á¶°3ówgžéÙÂUx…PnÑ“kGäžõäæÓr³9‘ÅÌŠÆC¹)É58¹Hmž5²] ûåˆìdÚæ‚U3,7nl÷²¿~Þ_«2kg «U®Y«æ‹¸(¢ïnü¢íÁwâ8:øöõÚITÁøÜfÑ/s›G˽ï–+žÛ^Ñ7Òûϲ^ƒòfí»«ÿs»ÜÀB ©‰º„áKjßÁð²Ç…Tïœ[å²Ô;µ®=( RªvIh­Ó*q…,¸òDw ·:ð²í¦•º¥æOÚÄn­>ØEË7ÞôÆ1¿UV›[ 'ƒîþ¦Z™ÂußéžøºÂµb‚±Y|àNË~àO˜ß‚±D—È¢röÔÏÝ]1Lì™ófE³¨ÂJÜlpyy Î=œƒ’ÅòÖ¡»PÍ‹¹76<+äLÃmI•'Vöåó,È¥&zîÝi½ß¯—¨ZbÑõÆFeÛ!Êí­lúl!;&Ÿ­À4ô7 {’²Ë€ÓýC¾.K2¯ûË×;íÿÀA[ÃÁÞ%ϧ 6àÐñ§ŸÝ7‹A•õvƒ·—¼R^7¢P&Iû?Ð]_¡¤ù 8}Üþ—ÿ¼†}ä[Ÿ—xŒ÷<­Ù3=ñ@v¿óÍ5«G©¿ ‰ºÇ(p\Iñûs’vÏldêÏ+Ný¾¥€“öÏåüªeüªyÌØƒÊÎÚ±ü-³bJÞ%;ÃÓËÀ¼ýgñ˧hZ'<ðªÏKhü ¾eU׬âšÇ@þIËè㌞R*`2€Ù®="£&¸=é¸}ø_²Ê²Á÷ Y¨¶ ÔíÅÝzc—Ì«&äml–ô•ptÎ9Ì.X_±kÅ{uMäo›éÆ9ò>ü“WU¸‚jôË@%}ƒt xn»‡¾f¹%ûÊ_'£ã¬Ñë²½W5)&…y?Ïùº½cN†ûâÆ¿–â!ŒÕE‚픦Ïq›ñ—÷¥øPhãÈ>gëÄ–¡:ä!C1aÁÆÉÀ_à×Qp=Èã›´È[@ÚT:VÇsÁÍDV0§48_r»Ò@¢á±¤§EAÇ\ƒ™qkyz.êoqXìðÎxÛupu»åE×Z"#K“žV¤Ysƒt7‰1Íú‡Ž28é,DÜ\ðg⌳æ_à×Àe@ùÄqôä!Î%’ý ƒH\(ÝB×=?ÖaȪ¹-áì–ë„ŒÛ t†úVéÂ>ž³€†ôv°½¾(+A7D·;ž‡„ …H3Ω4i?i—Žh¤lÞ(ô£ÉbŒYІP8¸ÏÜo)‚Ù6{ñJÕ À–c ìamyYSÕã”!Ho3ã³½¸é!;ÐÑ5¢HN˜|BPÖ€¾çt ¹ºéKZŽiŸÿ×­k"ÜPÜÅ9ÌjÞßQ*çÝ¿$L Ê u:|˜`»GÝfz½ˆ0z›‰Ú!JšJtì&S#ÈLHfGd¸»ÉŽ|§Þ’šÔ8vüØ&*`8)ºGàyM9PI_× fg¸…9Â/s+jHµ‘ŠÇÄ«² S¡Ð¨øçʉÆR’·Á­íÞÒ GÉ2¾âÇ}Ç2×|ãaÉ͓ٽõ >®™ÅcIãÞOkŽBå¢Éh3NÀ)Fk×xådW{fü=ïJx†R»ÿ•­íxÅôêÆ¢÷Lòdòø”Ópý`…ÄÜ¿«íãéÛ*H‡/É‹`¼ ÆHõMÒÙe©)ìÛÂô…e…Q· ýLzðž<‘_2¦xÍL`3áL¼b¼uÆý€càêDYkºî6óT[¨©ùÐÂ2]1#J‹pÆielñR%‰iW[EàÍ›D¯Tk®¶úØ:V öèžÛ…ɕ˅££·ÈáNÞø¶F쇅Ó=Õ±”ÛX‡ôô; Ø¥8—ÂNV9ø  iêò9 xÊî„MÜÆk‰W4´¾•R]1ï‡îžDPp‡gÇ7¨T¹ÜwU¬¶\—X{¨šgŒ¥QTî¼ËœÊ]§2Ý©¬ò2CwÇZé¬W\‡Q.ï¦PŽ¡<ÖÆoNÚ=)}ð´°~§dc =e5ÌÕð]ÁrÚwñ#®õ¤á&ŽUf’§ ·#¥ùB%΄8ëê¨Í՞ʻ(:ÑZÃqÐ 6©z;¼Æˆ^DUxÝCü‡ˆ¡Â N³³Ñß%ИKÝñzÜ_eã´ *ļ;©¸—-2´çœ%°y)hÉñér\I—ãëûX­¿• ºi¸¸÷¸èAN`E8u6Zãa|ÚÀSFs~vѸ~}àÚ5"‹~­{%Àr{ Áu€ëÖ ®Àk–µÙ ÌËÚ«½NXŸCw Q{ 佬?²Œ+Øè};”?šéYõ‡ƒ©‹Axï÷bÂDÜÜU½3Öÿ¶wKêžv­ º[Ö Ê7¥\ ÅºerœÞažØ°*€•RØ­zH±¯ø´ÆWM|Ç./\SoÝVpÃ3ðs¯lË‹>Ò‹¡©ÿ~,I˜}7}ËbN(Œ­bmvÁ¯‡!ü*GRž…ü Ìâþ D$´ÑR þ¦)5çÎñMz><¤7ÁÎvñhõô©Ì,~§ßM¸#s›JÚNÑ9N%×ÁSª‚þ þªMt寧Â_‘¿~r ‚DNoÂܨD;eñ‘áj;NmÇ©Ý8µ§ŽÇ©ãqê!x@ä8’ÓÉ¿í´¿0tþ›G†óOvíûvÄp<®IÜþÐΧ¨ ßêXùüÓï}¡ò<çZ;>Ï^=û)7Bz endstream endobj 353 0 obj << /Type /Page /Contents 354 0 R /Resources 352 0 R /MediaBox [0 0 612 792] /Parent 359 0 R >> endobj 355 0 obj << /D [353 0 R /XYZ 63.8 705.06 null] >> endobj 356 0 obj << /D [353 0 R /XYZ 64.8 661.644 null] >> endobj 357 0 obj << /D [353 0 R /XYZ 64.8 456.558 null] >> endobj 110 0 obj << /D [353 0 R /XYZ 64.8 292.579 null] >> endobj 358 0 obj << /D [353 0 R /XYZ 64.8 275.821 null] >> endobj 352 0 obj << /Font << /F55 164 0 R /F8 154 0 R /F56 165 0 R /F59 177 0 R /F11 166 0 R /F39 151 0 R >> /ProcSet [ /PDF /Text ] >> endobj 363 0 obj << /Length 1221 /Filter /FlateDecode >> stream xÚÕXmoÛF þî_!ø“FWÝéõ†­Cƒfk†¡ëZïÃ…ëÈŽÅv­$mÚb¿}w¼ç$ÊV^ÚíÆ‚•tGòȇ<’Îádðø§TZèLeÁdZäQd:¹–Áä,8=‡©ŠG³±­ •†æ†ÞDidµ¡+C ©¡­¡›–¥Â>WPòÁÐÄÐÛKì-H+ù—{lptÕÕûÂÐãPnUö?N'¿?Sîg,R•¡’BËÂùyo.™MS|—ãP¦¹½Æ÷™!áŽ>‚Ã[¹‡*“Ú°Ñö5´TÀ©ÄöKˆÀ—'†¾@ùfwzS¥1Õø@¦Bèˆ]Q«o†÷ ÖIY‘ÍrƒPÔK¾¥ åxf†$Þ•ñš%;-…ˆÄ^AßÄž€­i°)°ZWB¬eHÔ…â«rC`Ÿ† ¶ztt?ñ\´@² ‚‚©Iu¶¬äÅ<YÊ!Ⱦu{dc XRZÿf¼Œdaõ~e-š±ÅØÊ›¨w!ð×™—­79ïT¬ 0Y·Wa—‡•¢†ý#ÚûüÎ-ýàC³ò+«~‹æFÒ¶/ÛŽîfË.}‚İ=îæÎãúí¥mVšK”Ñf€;¡'ÃX&1YzƒRî[uôUÒ™°Ëü3 Á»¦ÒöK&¸E –Õ 6Ö÷MítnÎZ–§8` ÐW@¤lJ#±ÝÜ!+·ƒ£É@\¢@ú^¨ Di’³‹ÁûA$Š,˧M/ˆ…ÇÇqðl=øÝüó[!”†Lë¡íÂËæ<ºH©¥0ÂÅF™n“h=zUnÆÊF+¥`;<ì'¡7[¯¨GÙpŽêÒÁ`ß×sǵñýêM$ßjá6]£U>:+˜=®æ,=‡:tÐ¥¬o¢dIíØìÔ°]_8¤ú7Ö–òÚ‹\µ"Ööt‘f>= óÁ~\ž£d ¾DÆ"ƒ7!WS¤j´ÞÚÿ­²ß¬QÕ“åȇI$E$U·ÅLéF_QZ­Æª 4ceLÁË%!¶?eäJ¨¤ð†Ø|eèCGûg+“O…òÌÂi>¶8Ä1.†;ÕC[UþtcÁ{a¦´˜OIäǨd¤…̵?ôÏqž@¨yqšÑIÖÍ4oŒ0¯Íœd/sd¯´]µ·üº­|vÉ2Á6Ÿt’qæ9Ÿz=¢§¨‡*R"Ž´ †YTY§¶óÊý®¯‘Õb\rßï4¿§C¯[6@¡Fm¹«XmYÀøónoÙ™ÂHR÷öâf6d0=Ã1OÇò–ÞX³r5CŽuaè ó Ûü·xÚI¶Ççø>¤Šá}‚±è; k§mnúQû`?‘+ÙnKïV¥̃éØt›4ëöÃû³ÿ¾(¨ÿ}^`{Ù]þOGã߬8­ï»‘¬!ÍÃs2Ät—ûíåÆ¿NôßûßÛ“²a¹{6^ôŽ»y¹¾Þä' !FšÕlÁ¾+üÉfˆ”<í›>!íà“˜Hã/"±ò3ñßIHåÑ endstream endobj 362 0 obj << /Type /Page /Contents 363 0 R /Resources 361 0 R /MediaBox [0 0 612 792] /Parent 359 0 R >> endobj 360 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./PairwiseAlignments-ans8a.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 366 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 367 0 R/F3 368 0 R>> /ExtGState << >>/ColorSpace << /sRGB 369 0 R >>>> /Length 588 /Filter /FlateDecode >> stream xœ¥UMoÛ0 ½ûWðƉ¢¾|\‹­@° ël`‡¶‡,óI†Ä ì×O²e[ ²¢ÆqòüDŠ|âS–@°…cv GÐ –Q)`%ÑJEZ©†opÈÞ¶_o®àºÌ ! }–ןý[«á)»{?2‚¥ÿl3 àSf -ƒS¨öþ­Á¢2ŒÖÂ.#¿ŸÔ ¶5MX’ ?¤`ä"`åPp‚£,@:‰†=fr¨5°ìÒz¬Bò±óÍÚ‰/ƒÿ×`l©×oq‡î <ç#4eäû–G¾‡[ø'>¶<îßÄO ë›ø«*ö¿n/ôß®ýù~\ªŸà#ý£Ç…@&P6LLµ‡ù8‘CµÍÞW]ö—ÃÉtœÄËyñ’ Y'ñÁmö¬ò endstream endobj 366 0 obj << /CreationDate (D:20131113202001) /ModDate (D:20131113202001) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 367 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 370 0 R >> endobj 368 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 370 0 R >> endobj 369 0 obj [/ICCBased 371 0 R] endobj 370 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 371 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 364 0 obj << /D [362 0 R /XYZ 63.8 705.06 null] >> endobj 365 0 obj << /D [362 0 R /XYZ 64.8 207.559 null] >> endobj 361 0 obj << /Font << /F59 177 0 R /F55 164 0 R /F8 154 0 R /F56 165 0 R >> /XObject << /Im3 360 0 R >> /ProcSet [ /PDF /Text ] >> endobj 374 0 obj << /Length 2240 /Filter /FlateDecode >> stream xÚíY[s#5~Ÿ_áG»H I­¾ ÅVeL“JÌe‹¡¨N»ã¸ˆíà ³Ù…ùí«sô©[¶Ûs ÃJËÒÑѹ_”g£'Ÿ>OŠ^!ŠT§½ÑM//D&Ó^ZH‘ª7÷~ê2ˆ÷ÿü<úº'{‘R¢H·÷/·7¨~mÇ+;®ì¨ìXرÄú·vÌvŒì˜Ú1×ö&v¬èKR”­U/ÒöV•»[ *›Á¨­¥­åhÝ ­»¡ãnè¸ÚtC›nèdš¤éPÔ´+ì k‰Pã|ø²Ûzä²iYÙ…N»¡óîeÕ‡Ö(·Õc[¸60œ±/e"ÛOhއM‘Eµ3Êaýtù›µVÈ8þñ…C¾Bàkå­¤ÉÞeÍ)ýíÇå#Öô;ŸeÇEO›T“Ž#mDacpkQÚ‰aÅžbe “þU½‚ÁLlAQœ%ýSšÞÙ’ÍÎJûgÝ‚ð=ùžkåVt|ÇÆűî/nèóñ[6]þ¹Øå½›0ìàSç\´ô;~Næ5ήkwîÕ@gý`÷p´Å ²«cB_ÕìØ¼ÝøyÍp]´1ßÌ‚“£MgñvµðqbºI¼²zúÎAg€ðÂ/[¢ç?mÔYa©ÑŽÐM§øÞ`­Wê°·ïPòRÅä8׸fDÿaî©òÑå¿øý']âŽ/ÁÀ£†d–^WìšOIa̶ïÏöu,£K÷ù«Ë=94¡Bˆ¤r¶j´ËF@Û˜n<ÖeŽs‰yÜF“%§ —\ŽÆ­ÌlÁMH3 ø¨6’_dQ{~Åwð>Çþ] œ pE®_û£« :,ݸ¦‚ î°ýô­ŒÐÉ!˜"ýÛù‰ŸãÌ0ß! Ì þ9Èóè½n=¦3Üx —âöáaËÙ߯Ç¥À Œc`=ygÀzL#`¾„ž>>_^‚Wtû—ÁÚǧà·^ò÷ØåñŽ}˜ Ë—;Ò|œ…Ÿ`íÒùjÇZgw' ý 2õ´û½sPññuq éñ­ÞµŸâ8py/€–ù0–¦o‹¥ÏC]Êæ¥{,UˆêeWm˜½Þ:Ùð8²W¸½Þ.í'àÿ lû© .Ú%l÷AiU5`M~Þ)ŽgÁÝ·HãmäžÙeK|>¹kÁVG;œøbpŠ+W«wÑsX ßT¢¸{U< j‹ «º¿åŽÄ^EG!Gûè<ãËŽ.í5j Ñ”n®Þ¨”SøV`«Œª©†ZŒIKÜvú=ŽT Î÷§¯·Š)ÏרÃW% &(¿¼¡–îgÙ6¶%ÊMÏL¨¼z«v+›~½9¼p„C‰!8Ô§(Ûž”p—±ˆg¿æl$ë%¹h ùЖ¨–"ÏUgœ©ƒ÷ˆ·äŸÜîù.kêj~‚˜Wuû<ö†>î'2¥Ÿ‘) 2Ž¶Þ„-Ëqšõ/…Ÿçm‰àñà 7àJ´Àßøælr‹•ã`·œS“–JÎSW»ë¼ËMàbîö¾dºþ& hׯˆÄ®HG{〶‰KÚþ¦$º_RoškÛûÒ¯ßPA³Äy¿vÛÇöçåÝCÐztMéX…ò ²„´?,gDûµwúñ¤vôwA_+آȇGq’ ÛÍïX óNn95‡ѸabÿZtÒêICO_•›kÛù¦®ƒ¹ù™pßrÞvÂ?€²š€£.Ѫ8…Ì<‡Ü~®—$)–­ë±É>Ñ [†²þzá¾”P3îôÙ¡Ä:HR§'¦µÑÓC‡ŒÓL¤i bc,SSXÓ¯ÄAIT¬ê¥ããûA»¸M¨K´îZÊŒùÌýºM´ÓˆLE’fsÚŠ9†˜ÏÊ;×€ð¶K<‹‡‰ú¥Täúuµ_C´SîoÕ5lå]ãñÖ†pO#\ 0˜Î6Ç&´:«çtz}À_b©„2ûþÂO7îݧÑWÕmú)…›Ü£€ ´AˆÎ|”Í‹Œ*¹BJ"eî%&Âfß  $}^×c_P0Aó£¦ZŒŒT.jÐä :~Šqqƒ‡*5¹uf†™ÔsÉiiV·µ ?íý½o½¹I¾v% ï¹0o§ÚUXf­–Kw¹ÛÆšÛæ§Z_ã”>2°€]@æ#xó÷xä%Ÿœ/|ÊJ¶ÃEYM½ko™Wká[œ%ðýYàÍŒc2û‚î«î@`XYPø×tj'„GgœûnÜôÌ¿¤q %1nÀúûø¾ND¡²+3¹Ÿ˜82IŒ_ªÈ$,KÛY¡Ô¾e%°¬«™O3·.éÔÆO µŸ‘!Øùf'qäbÀœ Ëæ’;©¶M÷Œã$km©¢Äû0ÀÎv«“¸Us‚n"R{O«Ø¤­ñ®·ŠI‹ÇPEŸþ«Ð`ãø¾n ßéü`1«ÝÏkÄš¿bW¸«= [+ÊvLq±\­œsR¾óÿÓÀc¨2&M"²¢ 7ûª6¢È›DÊ}Ê´ŠE®4“n4Úïÿ¨2cY)\ŸXVk/BŽv÷œ(7Ä/Ofî÷ r̽'Â[Iˆ…´Bâ`»`ˆMå£ÔÂ˚ߘ;IëÜæ³ÂÓxÑ&S þϘuŒ1Å*o¼ËNלfTÖ?ßJªŠ‚»•:c_0>À+Š\h³·‚ëW•¯ ‚Z¨3ò›ÌªrÇ%•”þa5m l›M_%ÆH~]µ“ä¨Iƾ¤±õ.ö5=ਊÊ×ΓsȬ­kdêÒ@¹öMÛŒ÷ŽÎPy_Ñ ‹ótìü‰t;åŽ@QÙ]•Á›>£cÙÈÌýo6óË3—ÚN·Ú´Sl®H mÂædßiqf¥šo¯ôŸ€¯H­™Ðy±­êŽº¸#æÆJ¤™Úկɚ(›Xeµ¿rå©òT䮕BJãŽÇ1m>9=ù?¦ð  endstream endobj 373 0 obj << /Type /Page /Contents 374 0 R /Resources 372 0 R /MediaBox [0 0 612 792] /Parent 359 0 R >> endobj 375 0 obj << /D [373 0 R /XYZ 63.8 705.06 null] >> endobj 114 0 obj << /D [373 0 R /XYZ 64.8 574.178 null] >> endobj 376 0 obj << /D [373 0 R /XYZ 64.8 340.226 null] >> endobj 377 0 obj << /D [373 0 R /XYZ 64.8 344.211 null] >> endobj 378 0 obj << /D [373 0 R /XYZ 64.8 312.331 null] >> endobj 178 0 obj << /D [373 0 R /XYZ 64.8 289.915 null] >> endobj 379 0 obj << /D [373 0 R /XYZ 64.8 269.99 null] >> endobj 380 0 obj << /D [373 0 R /XYZ 64.8 238.667 null] >> endobj 381 0 obj << /D [373 0 R /XYZ 64.8 194.274 null] >> endobj 372 0 obj << /Font << /F59 177 0 R /F55 164 0 R /F39 151 0 R /F8 154 0 R /F56 165 0 R /F14 169 0 R >> /ProcSet [ /PDF /Text ] >> endobj 382 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 383 0 obj [680.6 680.6] endobj 384 0 obj [892.9 339.3 892.9 585.3 892.9 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 585.3 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 1138.9 892.9 892.9 1138.9 1138.9 585.3 585.3 1138.9 1138.9 1138.9 892.9 1138.9 1138.9 708.3 708.3 1138.9 1138.9 1138.9 892.9 329.4] endobj 385 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500] endobj 386 0 obj [446.4 446.4 569.5 877 323.4 384.9 323.4 569.5 569.5 569.5 569.5] endobj 387 0 obj [339.3 892.9 585.3 892.9 585.3 610.1 859.1 863.2 819.4 934.1 838.7 724.5 889.4 935.6 506.3 632 959.9 783.7 1089.4 904.9 868.9 727.3 899.7 860.6 701.5 674.8 778.2 674.6 1074.4 936.9 671.5 778.4 462.3 462.3 462.3 1138.9 1138.9 478.2 619.7 502.4 510.5 594.7 542 557.1 557.3 668.8 404.2 472.7 607.3 361.3 1013.7 706.2 563.9 588.9 523.6 530.4 539.2 431.6 675.4 571.4 826.4 647.8 579.4] endobj 388 0 obj [517.7 444.4 405.9 437.5 496.5 469.4 353.9 576.2 583.3 602.6 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5 490.3] endobj 389 0 obj [613.3 562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6 408.9] endobj 390 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 391 0 obj [666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.5 666.7 666.7 611.1 288.9 500 288.9 500 277.8 277.8 480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 238.9 794.4 516.7 500 516.7 516.7 341.7 383.3 361.1] endobj 392 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4] endobj 393 0 obj [638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 394 0 obj [625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] endobj 395 0 obj [272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8] endobj 396 0 obj [693.3 654.3 667.6 706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6] endobj 397 0 obj << /Length1 2089 /Length2 16582 /Length3 0 /Length 17835 /Filter /FlateDecode >> stream xÚŒ÷p Û ‡m¯°±m;il'+¶Æ67il£±m[ÙX'{¿è~¿ÿŸ9gÖLÖsݼn=kBN¬ L'dbg·³u¦c¢gäˆÈ k01Yè™aÉÉU,œ­ÿ‘Ã’«,ìl¹ÿa!â4tþ‰:ÊÙÙ¤]¬L,&vn&nFF3##× í¹¢†®&9z€´-Ð –\ÄÎÞÃÑÂÌÜù#Ï”ÆT&..Ú¿ÝB6@G cC[€œ¡³9Ðæ#£±¡5@ÙÎØèìñ?!(yÍí¹ÜÜÜè mœèíÍø©hnÎæ% ÐÑhø«d€¼¡ ðߥÑÃ’TÌ-œþ¥P¶3uv3t>ÖÆ@[§[ #à#;@YJðÅhû/cÙÐþÝ=ÓÃýÛû¯@¶;ÛÙØÚzXØšL-¬€/â²ôÎîδC[“¿ ­ì>ü ] -¬ > þ¦nR~TøïúœŒ-ìè,¬ÿª‘á¯0m³5±³±Ú:;ÁþÅOÔÂhüÑw†×ÊÖÎÍÖë?ÈÔÂÖÄô¯2L\ìTm-\€R¢ÿ¶ùÁþ‘™lŒŒŒ유ènlÎðW{àßJ¦¿Ä5øxÙÛÙL?ÊúX˜?¾`½œ ]gG ×?ÿ‹`™˜&ÆÎ# ™…-ìŸèb é¿ðÇü-ÜÚŒëÇ`üëóß'Ý 3±³µöøcþ÷ˆT%¤ä4iþ]ò•ÂÂvî/:6v3#€‰‰Àññàó¿qþÛÿTÿ·TÁÐâßìþQÊÖÔÀõ¯">º÷ŸB\ÿ½”ÿ>*Àÿf·ûØg €òÏúë0²1üaúÿ|»üÿÛý¿¢ü¿®ÿÿe$îbmý·žò_ÿ?zC k[|쳋óÇmÈÙ}\ˆíÿ5Uþë …í¬Mþ¯NÊÙðãB„lͬÿÛF 'q w ‰‚…³±ù¿–è?Sønma T°s²øë… cbdü?º›3¶úx©8}Ìêoðã¤þ7¥˜­±É_·Çü1wCGGCØÑ 6€ÓÇ‘šÝÿÞm½­ó‡ à£8€©#ì_eg0ý%úâ0ˆüAœÑ?ˆ À ö_ÄÁ`ÿƒ˜ ’ €Aêúˆ)÷_Äùá§ð1ÿ (JÐGå?胧ê×GLÃ?胧ÑôÁÓø¿ˆíCglgýÑÞÿHþê2ƒÉ?àà{öô÷€ÿ|Ð2ýÿBìYþ‚®ÿð—ÞÎÅñþ&fÿ€•Xü~´þü`oó~œ7ÃêleÛ~¬Å?ôäíþ Y?œíþGýAÆþðƒ‰Ã? +€á<™>ˆ9ýÉõºÿ‘ýÃÜéã]õÇá£WúôqÛ ÎæŽÀ´âƒ¼³›Ý?>ø»ü~”îúøÁÞí}þðþG2æð*ýpõ:þ+öÿ„±‹£ãÇÅ߯¬kùþû— tÃ./ØóYÖµ?T á¹ÑíOðÍ’ï«§QÑy-;þtyB„J¦ªÊüºéx'”<܃¼¶+Fy+¸BôêuÒRÚš¨Øöìý¢¯4½ß»4…90Yp"T×OƒO§"xàýêà­`ÞÚ)Mžëà‰¨öàÖ'á^×_º:²°¯xPÅ.÷R:C­¥P4Gžg”5MòÉ™ŽšõÒiîön5gòH:žÖç4š¥ÐKk‹9æqÞs½\…Ù© ‡ G ›üulšÂKø0EkÑ«øGÔ&ßb6GxìÐJP_¼Œ‰¯¶cP ß7ÙN4²®7ãoŽÖjÆ“òŠÏDuÐ^ÁäŦ‰•¤ÃÅúYø~¯¤Ê  &4?» »NÏU;©½b±¹™¢MØÞñ¡ítdù²¿<~b(3œ–…L6Ù ]‘ÿ‚93®œç#¦4ì]_à¥ÝÿžGÿãžÎÜ2Ôû‡³Îwœ;'–Âij‘BýaâÅÙkagœù°vC5ú-Fà²~WØî”3óKb#ÇU­3–0âYYçtÚ&ã<º¾*˜ú”ⓉÆ)1þt¿âìkVÇY©Àªâ9ê)ëP)R2Nw6‚>ÝÞOj_ 3`ó<›ÛI×¥@4QKÛ&]aȰavíÀo5ºÁú7ëPÂ<æ¾³,¯/‘zFp¹›¬!—ªt·ƒù¶¢ÆD.f—¥kå4Uð…®SƒÉëTÕ`0éK𼋠)ùñRKÆOAò2ÞQüxt~ísÞÖ4½¼ïI‰¿Úlµ´¬4þ4´ålý¬ó›¦«Ìr>ÑO Ž tºì¥¢C ¯Z‚”ÐB0îñ#—a;”þÆgŠcqÑ&. Rµ¶ÂGAW«ˆaçfz1|oϲN­|‹o<Ùò5ð_dˆ8ŸpH.¡§‘K$…V8:øIʲ¿ga9Ÿ¦ »ñPOï‡Y³Áu‰‹#«ï=1+¿õƒ0S7œâ}š7À‹âäÖˆk ¸¶V-Ã…j’Êÿ- íV†»3f C¡õË gº$§c£ÞÉD(þ#õ3f3µÓÁ!ÂÌT€Š ל°áVA$ò×àí˜1Ãx²³Z¦¶S$(Ãd(Æ#Ž3BC¥I=ÊŒY,KÒQb· æ6Ò6ÛQÇm2ïÈ÷iÔ3Y¨¤DÝ)¯2"ƒ÷'Ö~z‰d7´Æò½Uo…fác³µz·#«.ñêl8¸ùò"SKžÒ8köÓ2‚3°ƒX¯Ç[êÇó³Tœi84ZeÅ=DæmùÏ埋m+pt ju#ƒ¹wÖ[zØ­ql¸BltÛ/¯hOVŠ u4ÉØqµiTÅ"Hš£äò¾œR"LÖÒ‹¾lËVí”bëÜRo >x²|.úA1•Ìþ#è’9uíSD'9$ eòï +ƒZlÑÍ7†Ú!°d+JÔᄘX«4dû*Dgƒ;½#áÞ§PìùÉßcM4ý»’Ñ„ú7 èg4cò.$_JtâXi×E'D$Ÿ´A.‡·ƒ©-¯Ý\öÔÊ §‰D¹ t˜ Eº^û¯¿>‡SD¤ËQÔrÔ£´ ¤8km>Cè8øy³%Ë5³‘Ô}¥î¨Bê$8]9æ­ŽšH‰ª£m“½1µ¤IŠ?éøÙ9 zw’3œEâÎØsoN ^¶é¢-¸â³}¸L²;l"/F C °ì<Ð=èw¥ïvvoÆ(¹H°ëִίúácJO”†ûU7x+— å÷ƒ¨Df³AÁÒ¶JŠÄ]#~M´Ñû¢=/¬÷ÖŠÿÐ"«½gùͽ:êĨťGïGÈtM€6ýB­Å)˳+ùe_ÈÁ¯ A‚p>€×غdàb²‘ÐSYD²É¼F6º˜"+e̹¿‹HlMwJ#wÈÚl|ä§U‚®&Õ„ãò-$çç‹VþÍ-ÉœÜ6о¨v¿Ï}T(ް­;31u9à U`…ùàZ¾ßD~¥ÂFªÒC ˆEŠ´m³ä@ú,˜mSúŠvÄÐâˉD^´ÝÇÆÝ+m{DHHU,Zé‘[<¨/2\YìS Ȭ gçõ!/¿â½û™ñLtÆ×"•' üŒâ_¬ò/ï>y~¼(Yµ±åcJ¢ ½ßÏ}Æ(ÑFN-?ëGè…ÿålÉÍÒ/·î±ãù#è€v[@ë²IðàI ]AØ‚ÿfoê¤ðâtÕ5LM|^GÈܪÆ.­±r 9“‚èX:ÄÅõ§Î‚py)\E×".V0϶÷pÖÅ{›$€-'hÖñ¦‘îàr6Ô;ïŸ*¥ÙþíÒãeÁæÔÈ–×ìUO#HÆ]¸Ñ[:lµj¯ö*˜}É‹¸H½Pí šµðàÎBj Á k”üU0`¯ë) ³…Ÿ¿“˜SÄ¢˜8E—ñ™Ñczó¬;'†ôVZÀ½¹†Ç¡óŒê|ÉV¹†ÃÄGÓ;ÑŽ³Ô UŒÔ³à­­”±]ÃÏ TšåØt ïŽl^iîA¼k¥6ªd¨’x‹¾nw2pCY ¯nâ¤*õÀw¡û4›Ž,ç= ™o"ý £Yª„X&ááÔÄjB‰¼)»‹ßìE‚iý¨еªäTƒM½¸ºàã›|p¼¨íéùÝQïÛ¸ßRïËñ¯ùtFª‰ßr{…³8ý§Z¦5ÒåJªÖGU .í ZÀÚÇl¥ER :^”Àçúî­3ÝdÀõ,Æf@ñòø™ÐVéͲî›fÑ*tÙO{_VZµ+q¶r4ü&ä·€ ûÖXèuÕefÉÏäã ¶U›£fTi ‹‡vlÐÊ’ÏÙ¨âg¶¢Õ ý۩ɪ‰líÜ·YdÈ·=7jdÚùÚÝQ¯Ái¦ª<8¬o‘ѵÙ8ŠŸ,[nž‚êâ#>™µ…™¥nÚm¬!“¨â¢wµ›‡–´­QÎe˜o[sê:kó‹hÛõ[é?¿`kO…%LèëĨ;ò3ð´DÃ7(áWج÷Tæ|£ª¼+Aÿ&£ã8¤Îß=;`—T8…â±»¾L%<q©Ó!¸bp5)-`spXN úÍɪ·0=²ƒÔ9-šÓˆoøÂÅ¿[ÐÜ5åU1\ô µL‹¸^߀ÎqÅz9–ú¢Íôë7ìì=üåÖ¥ˆ‡XܤAÇ_–lz}\à¥òJjuÒH¿*8€[×q¶µä§Û“ÕhšÉ.CÎ ~)„«aX¬Í‘»¼$êÎÂ:UÉŠìµ%OЬr‚Å¢§à?zDÒ»‹Ì,äP|íT-NöYÖ‘ÚÇ s$ÊyÁ’6ÃÏêÚæ>XÀÆ-$@Q~»ÆEé¦O9%`‹ÖP‚7`X}úYìÅePɹ…¹Ó·"Ž*J!ûuÌ[þ~¸<7ÁÕðxKy?•‡C•|ÌŠ|W^XØàÜÙªÀF¬g©Á_'LR a`œD<ýøL¹:Ô{ÍcòÂÅw_ż̪ӕU j¶ ãUF½u"‹óª8ɯ‡-ôe^óEo)žîL~™Ò'Àn>‘þ&^Ý¢ ð`&Ô-°H¿ ×w,S œµp~Þp!<Îïγ8 [ä–iÌ+y8YFC3F.lsÔHÇ1™­œÁ|ñB}Õ/–4hç@ÈÓ6ß6Ép€ÓÊ~¬] /‹¼pŽl×Üפ½]’'žTËÏ׎|µÄyÙA—c²IAÊH4m÷äì¢]?«8>ö,¦:HŒÝ?ªC´ç„æ&ö~óP^µ|ÊÞZ¦¾ ‚¦È ƒpVÇ OînM€W»ð»ùÜWØ|‡oK¼>“„Y§E—vÏo¶FÐHYŒh-þ‹º?B“ãe9zeÉ ®Æ^Y€¼ÙÂ{4òÑÙDúÓˆ÷CŽï1s†Ëixʶ÷ërãt©3ëòbp— ƒÑ¹¨¯6UÕ#”kQËá뺃½|`9R2Á2OE»sâh*7h¶ýá1ü1úc›\ ˆLád¹ÿwFz£’Ô]Kb­ÝAÞÈ‚„¯wož ÖsTï¯$µ€ÕË[™<´ÉÝÀ®uU»™ôsèeæc°T*ÿ¬Ý_ž‰[Ü8¼(5÷·«AâD0¹v=—ýÈ%Ù{‡²H#*+×¼b«;o]áê¾"õù6š87|¿€»ô&äOðŒüï?x6Ñ:c›šÈö®ô&Àrùi53é ğג @3rÈA“$z±ZÑ-;h)@Î1U)&”ËK‘ŽÓñ¢ÊÒ”+ÆÍ:tv›{ž#ÒOÖ§!hÌ9éCщ‡‹êâßY} iúdžç¥]˜ˆŒ-äñÜJôuT÷/è×"ªOÀÎ+©»˜A:ˆµð#u*É–Â|}ó—Y$ó^U¯HœýÍ  _÷Io*™…šQæv/à¨ïum ‰Êg¼RúHÎŒd†Œí‰óJ¿Ã¬LĉY¤ƒV&+i>[z¢mb’*÷ 9Œuþ q‰´Ç®µ,¥¥ CŠHÃ8Ká~É7¼‰ ðýÚðúëž^a?ë+Æ0;Ál•%Á—+†€>C=;×h½Ü² .´ÍÔð[è_ƒeäù¼¼n;Å|VIà«o–‚å ÞøVw˜~¬ßÅßNCœ|¨5^{—d~X¥ßÛëúù¦sòv îÆu§±4~·lÙgÎ ýJž ÊÅ!?qIæé§×ÓÆo#Û++¿Ëuï~R×r 0\¤ú4I¤úB%J/0¾²ÀÕžUeʪtÇ\z3­ÑÒ2†íFJˆ¤¯ä‰­5æBå°½åxB»C¼…f1ßU>ÝüöKc Et¤?Áý'ôìit"ùBjÏ~œ¢.ïœ]ߘéT¤ï‚é7>‡ÌŸMèÒ}eå¢ÄZ«ó2¢xÃ3ÆÝ÷Ç”û¼ù؃qØôY‡DS’G-,’˜aƒ Á%Ò±·=à  ɤ£„±J4ÍÆªÛe**Û ”ÙTD/b2z&«äõ]$×oÊ‘ô2ý¥9Þ¡nó¯8Kßž²É¶Ô§åó:–Þ¬mfؘu¤Bü¶R£Z×@Æ;O H Y¨ú`sá@å9¥9êˆ æ¶™8Jödê=©Åx°7GƱQ ìÈц•(È1±<º±ÂJ5ÔSåÔ–«}DJƉÆG³Ì:KL)h‡t–.n¶xuúNýWë5ò1*Øì&Ï{·%ôß6üs_l. îjÚNå­‰)g—³R.”žçDçÛ³uéBAï÷nL©>Ÿº¾°FL–u‹I«ùMhsuÚò€…:Æ!:‚GOÇOyêÝõfÎ×äÓÆÒÊã-9Ô“~«›Iø4 •´8R7<Ø*¬&Aé·e±‡¥½'U¤.Ä+Ø|¸û¯šýN  íÈ %Š AeD¢ä5/€QÞI–ívdâ(^–èÆ%‚.”}ÁLßõ VöÀ®P¬ªy ßWŠª^†˜EãjÂí'*ˆ¬âý>ª×}wšó0‰ïÎx@‡ºH(G(­û3‹Ò0š÷zíî:° Äþwš§ SÚ³µCÒE_ñ Gù±2ž×]Ûr(ɸïUÝU¦ghµÂ]Cc€LÊ.˜#.¦ën e~®XÚx‡{˜F™°3°í% õÐÞ°h‚ätÈI—"µjuG7Óêæ¬G¹^öÂãtCÿÍòa4Mi±‘÷bp=Ö2íÈÐTÖõÍ ª{̓`wCæ;-F\:›²$©L–6üb9öÁoã~ø\ÈkÞo&-DȽµ›;BËŸhð9=<•O\FP.’&5<ß²mŽ–Y܇[ÈGW8¹DN%˜DÖ-ó9b‹ÔhÜX·&©ù©›x¬¯²I#ÅÕMZ­0žL?À)·¶™+¯Ë´ìES5c@úú/>•â†'7X7m;]âU¿yžpKyÕP”íßæçàkAóÓâ+57ÌŠÀù¹Jî§ÆÈkŽã¦ÄÜß1ܶl‰VxZ’G‚BO20f1=òñ!Ç©¬ µœÈT}±*…ã0ýÆ ]¨ëÅiJÊ-“2#ãÜ'V¬ßoÐ×”¡S|–yXxSVGxSʪz`‘±vö¿‘ëßMIØ…"aò®ŒÐAuñï:Ô¨Õ¾ÄÊU8¯,Ð*_šéCëë6ä2GTÓIŒhÌ?xÖÒHx'@ç™ê'8êŠIįn:¬fƘÅÙÀÌë6ÈÙ~O…v¥¬­e¨ÿ½"kT†âw¹h²s±¬TÁ³*ñM@ÀPºWMiûÍCïpµâ½Éì»ïV†A­sÔáöT˜w$ä”מ´qª¢ÒC¼ƒ­ åÒj¦GúuÓè¸J©´H,ÄÚd¨§’áÚïÁY…—Ú×ï‹IÈ‹Çá#î™"‚moQ‰rö¼Ú±ÑŒ“ůÀA0-•ãß±4Á%JÚùVfý“EÑïèÓXI†Á$¥ˆz5F —Õ›ËC0Ô»/~8o§Ž÷§ËWÞ•ÜÜMÈjòqÂ_ºU=‡×$. %ªD%«ÎÈØÉXeÛ«¤@`Û¥Î奰E2 éeÒQh*àùýE<`­“¡9>gÛ˜&ÂQÔÛ0õo—pX¼Í— ì»Ô"Øt¯å'ýAsÒÁ™xÂÂϧç>Z”ysXx h,] ü¦á{Ð¥¿mÜž=À—Êk·:u}d¡ì¶¥Ïé¿—/¶pX÷ÖÕD„…Jd=»39é—”ãPê0ìjíuhÑÏ®ÁJܯïàq³¢ê]9X¶ìS^8QDh:(Ö‘´Yäào;}ês^`@›,ínVçùužð܈$ƒ‘¤+*Zã¸õ~¾@ñE›ÏÓÿm¤P!ZFDÕ!Á*$)p—t]à—UK5•ÌÕÙ³¾aõ º‰’&Çe‘ú[ÛÚ ÈìñÂ@õIøEú.#àDݼʺ¼Ê Ào¬¨‚ÕóÃ6é2wßNœ!û†|o„V¶‹jœw2m*§WyÞ,Ò˜ª©­#Õ2¹9JÎ)Ât#±NÅIÔýOÈÎô=¦ì¿pOòzUÑÇ–às¨÷óÜwý&s¾X,Æ492èÛM†+s‘BˆÜó ÊÜ í3ç 6ýØË>‚¯@4“%´ù²œVVšk„È­—Û ÕüLd×3˜< ›<¼4õÝbu@ª¸3[IU¹Ø“ùx—Æ6š81‘¼ò÷Æu¤þ`ì7Šm ^‡Y"ŸØ×WçaáúÃÈôθAƒyŽÂ;ÐÂ~º °pSùôN´2³ćWÜ.œvtõ)Ãcë‹á³Q&·3¹GkÉË`d¯#…ó ¤ÎÙ éÄå¼^¿2w9¶3¤È®–R§ß(.‘91û} G|á1—Îñ(ñË=£»•óãkåŠæ’¹tj¬LMnbØë’yç3¯¨£Ó6®¯çZÏy„G—œÓsÎðÎ^oÍ5…®b~Wó%Exj\üø}š™ýŽûY"FB©|¬/G‡úµC¨':Y_¹>ø¨@¼xoTŒ³µY:¥g¹]¥ q©á[' ¼‡¾îH¦¶[ÄuæSPa\H ²ˆ÷ùvùj’ƒ*DÛå–ºð’§Y\úsÁ»ZäÏÇÄáìûnØe‚I\¯ÉÔ|‰VñɤÞ²¹QÇþï;÷ *Ð(gîtæTwŸ•²†TTħËR÷©‹¡$/ŸôÃÙÚ¿“`—EÀô½è²%ƒÃˆÀÎ!¼#°óÁˆo± ¡Nü&@³F£?3Ã=¼Öªw•ô.g‚^js’£ƒPßôßÜ ä‰LÑ\ô϶!Ì€&Ï 6ÆÕ½÷¢5èxŸ2Ò¬UÇ…¾£¼ÁàÒóºˆö\ ©„úv[> Ršs0µ2zZÕyƒ #R¤N¹Zo>íq¡qÊÈoÔ,_ŒürR›Š7•8×R…øé’4)ýkóÁÑç‘•–—›õœÓ,IÈtp(âÃ1]fQwp.V»xµ¯f E]®`¿f¦û·™öµêQRex#sc€@¸mìÒÂp£ÃâQª ™^xÖ)·½ó3…§JQ,:ÔF•ÄÛL3ä¼®ý6AË>sð§è·„SéÆÇ£š»Þª6m‰ñ¦mø‡–ŒVó—kY¼^ÈZT½ÓþFL|KÔÊ&e[ÆÂm—Hª¼êï²éúÄ» ›Pv”vg«2è•Ò4pdLµ{‡ƒН¦¶Ù`P?%ßüÍ0¡Ð{ #¢cüyNJ×ç¹À"ÆÆª§À;"«YŸ~•\œP?yçæ« EˆËÿ*åeoÂÖ› ÷®e¸¸‚WÜÌý 2€g^O³#-ýâQéÅn8]Ð+TÛA 8à,xÌOlàwõ#baó"Ñ…a~ñ¢6Ák"î¾=¾vÊmñŽ?¯ÂN ·dcÿöùjžªˆ ©LA½_]leÞ“¦p¥ÔO\% ¦s/×À,®E¯†£_G;Ìs(œ!yU§5n±’¦ýj)¾ûž7cè †É• :Á:´sȵL¿9ý©-å%Æ—¥:ý3¸V!œìÛ™Œ Mµw£3á§¹ =ŠŒN_aëž4xt!‰çÙú9¨ s“-ù§îí‡Xû1\”ÚãS¡Ò ög7ûÎÅuým§ìPHo°FMÊUÁÆ?¿³ ªÆ™“?…p½±Ë($üœœ7|†hÆ7qhŠ…ªÖ”³O ·r¼>kæ†PÇG‡‹p48¸§ROì˪éÜ6‡º‹ 0Àœ!¢cÝ}g‘™Åá'5ð4–x)¿í™šKúÎâÍæ‹…LÖ•?ðµ?£¦Á,h¤ ¢HÚ|SꋳâtòŸØ–›ƒ¢è_åT5ª6ý­ê½$a/wK'½Â3*ÜÓ̈™Xz·ó듸’YÏ¡ÆtAŠw´léIêK±Ûî¶‚H–ð]À ¨í³m þ[Þî…pª<Üó9’žþÚ÷¾vç ÛÁœƒ<ˆb:½žùM3PëUš¬Ûp*5Õ’ÝLÑ™ ÏhLZ¿âäµÑ¥¢;óã]85O=…’(¯ÜÓ®œW\,¦ÜçÐЋ­W\ñ^_ri®ùniäP<‰eæÙº¬£éx»/ì-*ÒT4k­èF<°%•\Dwbý#h·È8ÛbŸ®2yXEAôè=Ôw(âMúwfRQU/º§êø#~yTkŽ8KÌ.ŽTuQ ¢¿MVÅ|Þ~¶·þ±Ï]‡Ò¦…Û°_eãðä|âš±À¸À¤?y“SîÛ`µãÃîè?„wvÑc"e#ªÏÊ7¯?m«·ˆéó-,$cŒÃ°ÞêšA›Ú[¡l¥8%ÉMÚ«jHÂ3.¼”#Ì×^à§?Óts¹j&dúȯñQûÄŸ¦+L ãI…²ýòCxáº3æi„ ?wÒk:ùw‘Ïàl1Óž{“Š˜^j=WWgýÌE1ëPØg RGM «lÊÎŒXŽÜ}ðë8Ý×Z$« ¶ûÒÊ „÷“_¦db?ÓÑiFíÅ´)' Z }BTÅH°¯¿gýÚ"ëYP K[a¶ë3ëÉ]zØxb?6?ú,{¤k¾;(fÜLîƒòàx^†S•XóZr›ÂH(}öI9°üùG‰²ÎsÏú¤nÉÓ÷¨M»óÅóÓ&ÆeFÒ|¿‘æu:߸( "¶åL$taC.<ù ¸‰oäºØušk=x·éOiG/ÆânlL¢úùÜÒ\G1òx¹.^ðÏW¹¡(à L-wÒ¥°qQJü%ú5Wø¢å¬ø¬å ˆrx#»ÛȱßV{Êyä*DC¸Sß*¼b;Ü~¢†‹~ ªð[1ˆÁÑËvi¬š\0sgÿrOƒb¯´”e&Ðät ¢·7Ù]‡‰Íh)€ ÏGŒ/úDUŽtÊY~ V®¦`ÙÒr Kô2U—Ɉ€‰Ï}NøŽîhJÁJÆ Ñ¾0iºïüIžöüQÓ`= U4ï¸Låùv™ƒƒÄ}<\Xk `jŸ8÷MbµºµâÑ9©<Õ¬öŽÒ<’Q/,Ip.Zàk£c²"»ì`é~º‚?q­—+ ý’ô3Œ‹°äls[O Æ¿>¦õÅJ6`F•}Tá)æà^ž€Û…‡?õH‡Ô±êłߌç20*OVyâ&lyØ>51bò[­3aØ]å8æïIϦ÷÷Óš™ÍB±"”ZÂÑ8mWPK0ø†µê’ JOUí”=0]X…RàøQ>„ø²®·Ñf^¾¬ˆW‡_æI%q_†âŒd¶Ï›£Ð&{®[};Ï-}Ò8i#'³°†Û³>M; ÷]GbPSâ+ì§;æì¾ð{y4 »Ó²wì‰$²LɽJ㮨G0SS©Ÿ¬­UÚyqÇn‡òÃÚ‘mžÕG ÂRµ7줷l̘l[¯<{p>²mµó¶2ó ³'m˜°š)“sÊ…áâû )Ü9`öhV nêðM¦ˆî{úÑ(Bùïèè5£TŽŽ Â šXœñ Ú#õ™EŒÙÊìK¨U¥l¡Öó!Ö›µêJf,X_)CG«‰–À©¦ÎÍòûµàÇ<¦Þ‡"ãsay—µÔ0L¼¢ÈÈs—ml$õk^_¬Vlj- î/–o¦¦àS4&Á{FÍõv£;˜¯¿‹y8D{r±OºÊcá3­-¥r-Hbö‹å°:5µeËa“^øp3[ÐÕ“ï§§ÓÅ< JåW’!åÍÔÞ›ý£xZlM ‘ÝûÌÄ®½KmmÌóèuPõ¦ga‹£ÛbÒ(Š ,¡¥ÞsâÚ¥U6ÞŠªës`å}­êÇz/Þeß:hïÌýŒ¥ŠúÙ~*XÑœG÷ý¬$-Òý?n¿0{Ó»€æ{¹ÞŸ©?Y‡fu’™´ZçRÿccÅ£m<ãœWªºjšÖ*ï²ÐÐ÷žL“ :†ùëN• S0³K.èÝóˆo'E¾Q0o„5½Àlœþ°YqaXxü©áwÜáÂÄžsQ¥u¬¢ …olþH‹ÙJp¿€+ ÃxÊÖ„<óŘ)[;ÝØ6P”˜È›øúœÁÐXvŸ¹! WI$GSø6Ml£,Dâ'¦zßqɽ ‹QsyѰŽ,=“Ñçi(ëêÝV‚K ŒôáÌÝb7äó¡ªBâøî2ÉŠÅÓÕÚaá3ïy*_ûZ§µ\•6`»Êgó“ ñCãŠyïDäëK´òå7œx¶ê9ŸjêÑþ1F Ô†¿ˆQÁ¥>Ñž\$"‚ëÈV><ªm ç5‹nçä>cd¥Úü"¡ˆ±˜2ü²ßJ¨ì0h} gsÕQõ%¯~tà¤Uè ¶¿É˺ñ""r⤊~åúá$g”`ÅVlËýZ±ÛÖ7¼ÂsÀjI²ä‡zpWÙö N#:4ã¸i~×1U×3nTAþ,£ÿ%\S49„ûN.%þGV`Þ„rß¶Wz¤‚ì÷T”ˆ/NÃb¡JgÊ¿‰K¯ˆ¾â÷…‘Ãn¨ð~uµ¸¯™”ÀŒS©N ¤l1u‡>½îÃJ¸Œìž‘. ¦ÓzÊœ cô¿ Û9×£D•Ì|ÂWGr+÷b,$íî6$(~ÕgÈq¢YáÞ‚¶=ú]ßZÅéðìÊHìߥQH¬%nÌΆ­“òÌ¡'.UsÉ<>:å,ÐðuĹX}¦=©p ¨Æx¼•3þüå'¤Ç ƒÙ Dë«&ëò…@Á0K ‡ TŒÒPN(ûôìcŒz½˜ø³££Û• (h_ NÆgWÛÓ‚E.‚‰/£ÄòÖ÷7ytÞj–Íáˆjà’í ×K‰®·Ë§\ø@{ÞšÓ.ZÇ¢Q’ɱà4ÊXÖ^ùƒìfä–ˆ‘w¨™ÆÚeìù‘Ÿ%‡É§5ÖhD핈‰LË:)`¶è¾‹‹¨I<ø2 4æØÅ” /Úh~O›Ë¯/ƒ§?è¼ãºöklóôéQ’ùªÅê1SÛM~l¶g+t{ýªnÞZgMKý<ð|hHæ]PHäv¯÷°Í€ívÃÁêgBf¦1-ÆÛ©ÃÆ{ÑEÒ_B8ýEcu()9 ÒônŸÓë$–>Qºe2ïby›?/9u ÅxjÁŽNdµSp¥`‚›¨X¦ÈøƒÛLè㼨Œx ‰°T¿n@ò~×ÐKŽß­¾µGæÓÓ ÁÖ ÙˆT Ëœ…êÒñ~µ”Çìî4»£b¸ uÜ!Ï5HЧƒðUj8Y,´†#‰:à§«¤qi,~CÔEO‘ üöÆ%×TGc´›¬²+ íŠjÌ$¨¦}ìä!•¾ÏD÷d:%q–œ½MÔoÝ=ë?4Çë8%„~"™=ÊDr¹–Ø6MuÆ@Õ¢5VÚã–t$+†5cÒwƒå&®§î$]qî[ œÇq8±ÒR™ßª]evår¿–Tô~(Z¾2f½ú͇ZEÌõï£0Qú¿u)–,Q «ilL—ûUáHÖ8kp©oÙ"ÚÙSƒ`ø'd?ùRçY)lºÔ«ð()ÅBN1¤ØQu7ë ¼+É?«Ï-ÄHåvGè¤Ý-hÔöâ}wŒpAÛ.IÍT)A[až|wËQïÌ©ñtÑL&;ðl ¹xݧ}õ› ìu}Ÿ7½Cr-³ŒÔA0ö·fjhQGÞUÈ•pP¦ž^WUB˜ñã&v%d›ûRgôM+h–mÒЙÄwÅB¹Ø€7î+¾¶½íJ¶¥Ü¾ýävú'¡Žœ½]X–ÝÁ7HaÅX­—2+ù‡ » 6´Ðë öœ=廙Ãúf¬â¿ÚOkëVSƒã»¯8þ¬»r8hý,ºÄý}×Å7_æEb4ü&]Œ†%ÂÉ)¢µûknçÛõšBÁŠÁ×3êÏR=¹kpYãŸ×^ZZy°ù—÷(áõ`S@@˜Xñ²osCì~$mØ´<”öo9w*#>ù³á¶X’õ·i¾—§$~±˜+¬Þñ¢g$ø ¬V¥RS”Âyz$þ”’Î?•´¤>;qqHÏíhÐnÉÁ$†TËZ+–òíÅ Î5F˜s×#Ç2l¸ç¤èÁPŽÁÉápÜ¡~¢(Z`fC‘ŠWÿ.÷º‚K‚gé{O[ÝÜ ®*•T7Ř[·º/oºU@ƒCË«dÄkL|z›¬MaB@FŸ´èrw m7‹,G«°Ép|e¯*A™»¹ ëe)âW ²½<D¯È‘ÿ¢9áÍìÕý9äajÛº‚Åìs÷Ø…þ'MgÚ•ª@í· IþAämùÑ×–%¬O B½È5±M;ž  ºp¢£aó€œÞó ÌÌ|)ý*+Ù Ie0>ø StïcCé×iÂ+lå¹,sG¹Ÿü"îÀ±š,š.p¶ƒgƒv8§jÿïƒ2Ø+´; Ç„)LòN¸,¢‹Ý-KÚNƒKŽ0“jÙyXg ÕÇd•éy‰ÔR˜DÈqW`½_ÛƒÌ7X(X#I< k.𔱂;Áä>qW;§*ö×2‡Ç•k5îã×è0[¶Bðmlœé×N:äw¤e—Zœë~æ¤:W?…îUÂdãå%ºñÐ8!%Á‡Â:f¥0‹×Z_›ëCSÜ*öJs©ƒÙÃV4‰8<¡Ñ(£Ø‡¶( ÅŽÙ±ÀÏ)û>Ìbà*ŸQ¾SF³pWëŨ'ÓdZÛÄQ¦m›kž•"·l¨÷ÊœM¾ýv."ò»¼SödÔ"^Jù•™iü%sßiÎüµµ¬ËAѰúôÓ€ži*¼´öãÿ¥ÛK.ÉÈõŠ”«pSû×ç22H·ëÍȾøŸ¯þ:ÝU'íþñ…p z@>_ˆâxƒƒ iŽAª˜£,<îq§ºüñ8"Ý“ ¨º²[‚v½„LUB Ìuq¿ö]«xDJˆˆŽ ýt'ã=„ªÂÙÄ5/ VšN¢GÒ+èqÿæÄêÆƒ%ñÉÅLDÌØ¼ÉÑ.Š`ìbæ‹û¼Zßj!/ì S]žÍÁ±ÿÒ< |Õ.w-ZÔtúÕ\%ZG¢¸ûq­Éi/ Gäç«Ä–°Ùvv“6ÓH)‹q3ÇÃ<‚Ø,÷Îþ™oí•„QQÁ÷ÈÌtW(·â¯ð^#I¤K+º] ж¶ìƒF‹‹ ;1ëm߯£Y²1ºÝ5—ЄAÖã&ÏA¢2T”-OØœªãT•ÀÖÓ¶°AÎ"nþÐHèŸ;ç#nÆ`ðokŸÑíZ¤ãå?s\uFÀšÜÉuÒ”;$œË$*üê0QwÒÌJv›ºh̸ #Ò°ÑRí+ÄJY$¶à ýû§ßâ)^}ã0ñü¾³z€£ÉÚQ‹Ëhß?o[SRîÄÿ¢žý‚K:0ÖÐäíæ´eIÕUˆkáM ôY ·–’7ÆëÝ‚iÕ!f‰ô—•*~|ëäg bÔ-暸õ³‚iSiß—ùqèwe7b“&›®:ÜÓ-‡R”ü²‰öÂùî¥2º­¥ŽUSzŽ¥Ô[1AÈ>\‡'ývB0õ@ÓƒÊÞÙü΄Ts1W ü†E¯â†Á‚ÂÂ?ªE6ÙÒºd“27ó”ò »9ínIzÛYJê]¦nŸ'^æm$¬ß?2þ¨›oÿe÷ç«…! vçE™KhCK•A6ZU­)BÔ†¾GË⯞ÊGÓáÕ ˆ}P—†EÅYñmy+² ®$a•1o&ràXôW6a¸fýšèí‰ú= àaeCñæs'6AêwÝo±Ó…é'è$µ#Е· Ý,¢½ï|Í9"*ÂyßoEÝÓGÀ¥¬£»·ÃQ‘iÎÃiUvg‚Õ#l£ŸË«œ_ÂØ\}m£è‘àÍí™ÆÐ¹Äþ.BXèiË,÷:ÑQp•EirÁ›¨Y Ò±ÃéÆŒ§™9)KÄò9æt±*>U½5˜!,ü‰×«UXù%a­ÖúÜ ¬Æˆ˜&ÃO‘5à> ©[Ùí¹(¨Ê‹p³<ˆ òée±jÞL¯$X8®¦D›Á¯sË24¥VŠôë:š·|iQCêðîIuÆL1=ý š/•÷ð9Š· g«zT2+¥É‹FþΡӜµÄµ‚æuF QS4;£)(O@€—Gu2ê3áÝqŸñ̃íhÐÀlf‹´ùJ\é^´GÞÑþu„ƒ{þ"„ˆØÑ#"Å´×å)¸©Ž£ºRÓ &ã¾Ùȶ€7«?cû·+õ›zØb&xÈ;q%)n½¯¿Œt~´½ö­˜Ž<%wo“_ÕEÒéøXùž‘÷›¿’“D’6Õ‘ÃäfP|&6B\pÓ ·ú†c™gNj†ÁÏëö$c$Já6¬ÉÏÖC.æK¸ÁG‘å¯%¯9E͈½!“ðV„EªB[ößß¼ •²6a>•C‰XÜQÒ2. H8½PKî…ÒÌIÇeC6+(&9–[ó]Tz/Ê$ÜtÌéUðY=s”c»ù,%>Q©êB>Vfs¢u>‚ªÌÀN%¢ÿ’ ªoÕ·ˆý¤ßñÓ2‰J:— DåœÝ&–Ž%} ô]Îûñ˜SîÀRsŒ÷œgýÂã]f&€dò4tÚó¢ ¡% ½,H’Ý`9Q-&ؤVÏÒ¥ÆûëÛI‰ç^@Å1R"T4>§ßŠÍËzµ4Á|«4Äó’´…#g­#V$_QhQÕÊøUOÛ=}O¸ˆ0†èDåðË|#Žg“W;‹Ÿ×4*¤È#*³ãJyÃÉói3 hü„u¶È¬cËrXÈSµs<¥ú- Ãß9œ&·’»çºø n&% æ7ÑGAî‡}L”Î ym#YÃÁxt':±. *‡˜føº:…Ã4ÒI8ö¥"!CndÇ^>!O|^ÕÎXŠÿT*BbûøÀ(±†Y!¹uH´åy½þÂ(ô~ªú‰ú¡ ÂÙÖBúÎh÷Ç »~u{Öþ‚§…‡Ü÷ˆr)ŠÀJAž!ML,ÃÝÿwý›òÆR&2æ.$õÞZzî±5éÂ$¾ºAâV >htQf06‘knDe{áˆyâ`Í.¤VŸ®¿ ¦ÐræÇ²oЧ¤kcÙ p„™‹áð<× )¨Go GÇ@º×1ð( ¶hª>¾4‚_Â[.™›²ÁÃÚê%Ê‹Øjä%Pü¤DÐwvÜcKd€#cØ©]ED|O.Ý2nŸÉƒãÄu ’“#áx1ÓKzPÕqñ nL.-OšümP.'˜ãC¾ýdÊõÎ~ë¨âS.N±KÃ2Oôg}>LŸc÷½i°Á-Øæ¸i)ò¶Ò.*s&Œ–¢4Ðc¼F_è#õœbá ú“-­·å©bq„J"©Ç9c9N¥Ùnd"SËpÓQl‡3ÊU[gys¡üX_4Y›ÇËÔÖ½ªS”ò ¡-Z 1dHfr*+ÊŠúÀ™®f¹!á“ôõÙ=öÀãÞÖn&<ߊ%jõ±xucø¬ø â…ñn¬¦þ¢n?Âý¡ùõÛ¸AIºkïÂý7}ÎQšµál¡RïdÆË€7.ÙãúäÚýoê7®^÷EPÌäÝœE1¥·þÈÌo™àófŸðkj[ÜMèŠRqgc}¢-.YÉ  ÝëÒudÇté6p¾w¡°âööôÛ¼KªÄ®/Çf¥L°`ݘLÜÈûD¡²NÁÀ÷)4 Û-°&…H@¶±qÖ±Ì×^ ²ôókHRÌl½Ñ¯VØß~F‡“Y bš'9SàmßT’¡\E×T 2› ¸&*ãLèÿˆ-°Ÿ)문 z~n®K,÷‰½ ûÜ”5ÈÓAÒP”çÑ¿#fejÈ…µŽw]Jê¡1§á,ý6èÆ%⩤p¦V9Ï2æsÞë„ÕS¬é¿‡ØˆÄÓ›»Î’‡Âþ äØQCLœ¬òÎûêÝÕ9^p+¦¨tº«ýù¤Ó…èË´4:{˜U˜CnopѨ>±Ä’ö0 vÒ•Ö ›ÿM«!øc+óaÇKÔ™Ÿˆ¸ê>žU‘Zª[é'Wl^Ðñe @€Ž:J—Ûx¼:—hÂM)çÛ1TÓb•eÀÏù—º…tæŽÛ>äµ¼i¢E„Œ(³Û'&#”Ç]#í¦P¶±ŸÇ¦÷§‰š^_Qf'VÌÖúY@¸û.žÆÌ'œWJðŽû_ñŽ)¯QSÚ²v ?‰V¢£+ê­O )˜Ú\˜³ô†0(ehf¯[Y žq©Hç¹i®Æv³¸GïUÁzÎ]­ˆg´“­Ì¤îèç§¾çQ½Zž'/B8FIx{^£¢ngPS«Â$¸Ml r6˜šAãÁQŽŠtr‹Eît™sÅeŒ_­ºžäú gäk_ •,_çïÄd;Q¢ÇÈFÚÎU ¦°+9º˜_Çdà"Ì„%»ªM´X’³'VPøëo“šç(kø~[|}4LË5dâÙX}úŽ{bÕ£ ÞaÖÎŽwôþ#•†Ñš=¾óÝu` ˜Ùï*¿±³ÚËEÅé"ËèžPœ?¼Òc5lb°ñen`¤î*ïÁ2ŒZo~Ò½><þ½à§’}̳ºúÜ å/-¦^”!AYeòI)D1sá¹zëà‡;½þ‹ ¤!mP:ÞÑmó𺪜 z´oÝ™g1 .âÙ±Š¡*s)¿ÆA{‡ ¼¹ž=ã ]…ž48óíYku¹JR"5r¶À44cúDª]Ëamµ%žÄrÅ;YèFG³Á鿣%°Ûiè¼Ki9ûàzA²X÷z`Œ¤¸]dY!\!—'ù·Ïñ@]‚2Ÿ±s¨ìHËBŠ 0ñ‰ÀÁ©(ð"ôàf+\õ;iE쉸"¤ qE}åe­¼¾{THáL:•ÓÀý!¿®—_sCÙêeŸÔýÑ^ƒPˆü™wô¦4êfïúÁ|¹ì¨œ~Åð ‘²¾~y;æ~ ŸómÅà&ò`p›0Ayž¿;Ç\ÿòé–8C¾Ïx,3€*çtr'»¬ ´k ¾“P÷^_Kz°Ìî±2ÿ5dëR+kïú…ô@ÕÊæõ2 c*§B;Fºu¤þ.„Ð@:š(ªE)bjçóÇ¡ln¦¥Ãù˜Z:ㇾâ*öI±Ö÷-à¦ô}r6DsÖ³ýú`£ ãʤwa-)ì/þJ/ÿùdW0%TÐ’ÀC ®oõÂ-^¨ 31±ÍY¯9•”Ò3–ßÖÍ7½Ù|gäVcÃ]=¶cÑeÜÛ[ø$üÚïeà**"˜ž»ìÈ鯛 ¶†CÚ[Z«wù³ÅâJm§§›“£ÎÄ Uv‘ªR»H¢”ö¶íç @ã˜Â:"¸Ó1ãHöì—Öd|çÉý‰Ê÷`;¹103¬Lzé*ú@Gc&Œ†Ã~éåêC±oÿO5ÊûÞSËDŽò±¢‡çÞa™þcñõÛBΞiògðE5ÊžKa9… 1ç’>é]¤s#;G\ø¿x£"¸åz¥ÎÇÔ‘…P?V(½íÛm¬ESL6<» ÿ¢eþþCwýEˆüü0š¥Þ úöSG¼bA  FÞ8¾ÀG”`‹à"ÛÓ'áfÂ¥Ýñ¬¶Íª&Ú>˾øû–r·@öbùtó?­ê¡ÛÈ®›ìªÄÏhæ*_”…/üÂ*+=ÛI`ORm$‘Ÿ Ϋ–SÖ¤É'¼ä;(•ÿ”ïÜpÉÙ•Ž½wDW,,Å}ÛEôzV÷bTgm*˜E¾[k¹J*„ÁúìÈem¾+;hbþhð:AßIf®ËÀÖÍW¿GÍ$ØÓß8[½³?êBq™i÷ŸgZ; R`€8¾ç,@Ã{&æ@Bñh.†ÕŽËÔü)}€0Y¿3Ô¼»b@›Õs> ‰am‹WM¤îGxÌT Cp˜¦{D4µ8À–s‰­ßKÚ½9ùŒ=†{K{˜àºéH<÷ñØ7Ý CD;ÒVÚX6v’Å\h'ë_ºÁÔgA#º²1ÀJ§»ÙáEó[Î[äºpÄÖnÚ(Á#9Çq¡(ÜÉÕíòØl…D${RÑmƆër ÙÙ´ˆB  †×Gá‘›YÎË­=Ê:ð…²|V=ã À(-©RñH¯.×àeØ»EPËé^­\]b|رâŽÑn¨‘OŠ˜î¹õæ ¦Nž}Vè‰ZKIŠp¾³kõúªÀ›i½Ôu kÀ'§}BªÕÜ2þ‚ë`Ëh vùW£Þ,&­Æ¶í÷ö# eªFuÞÛaáÌù*¤¢å´‰ÉGgFÏöŠ-ÂVÖùÀ»ÃjÏ®Dœ–ÂÆ0š±&è‡ê”;Dðu±zSíD6n"mæÝ9Êl⹫"ÁŸ‘8ã¯Íòkÿ0ëWÖÇ!• $öàCJïäîzM؃¢Ð'×Ë4p˜ Z^eß|8dë©„iáFd¶|$¬¸ÅQkBâA1q¢‰Ž#ÊóÁLïõ8ñd,ç'P}ï2úÁQúÕ¿m޶ØãëÀÀp_à~Šp]À¾‚3¡Y~ 𜠗SHG³R (ÓÏ#rÏa¤|j™‡<ÇmÈ’ýuõqoï­æNý­-LÞiذ»~nGÙKŸ‘Yÿ=€k2"îÃP?ãvÈx×—.Ç\ÕbüþF"Ê›E.H›ŠQQtš Øß¤ßK‘€W«ÅK¾×û$ êý•¼³@Eý+Kºóø0F­q¬úûa´L¾{¸U7PúÖ5vdýaÓ¶’pé`Î/·qþAvh\<Á¶ÍëU> endobj 399 0 obj << /Length1 2108 /Length2 14442 /Length3 0 /Length 15708 /Filter /FlateDecode >> stream xÚõtœm× ÇVã4šØ¶“Æ¶ Ol» ÛFc£m5¶í_îûAïçýÿµ¾oÍZ3slDZϽ¯‹‚DI•AÄÌÞ(aoçÌÀÂÈÌ •ÿ¤Å `ffcdffE  P³r¶þÇŽ@¡9YÙÛñþ#B4v~·‰;¿ÊÛÛd\l,lN^.^ff+33ÏíA¼1cW+3€<#@ÆÞè„@!jïಲ°t~?ç?Ô¦4.ú¿Ó"¶@•©±@ÞØÙhû~¢©± @ÕÞÔ èìñ?%¨ù-x™˜ÜÜÜmíA‚4ô7+gK€ Ð ršþ’ P0¶þ[#@ÍÒÊé_U{sg7cðn°±2Ú9½§¸Ø™A€÷ÓªÒrE Ý¿‚åþ@øws,Œ,ÿ-÷ïì¿ YÙýlljjoë`lçaeg0·²%äÝéÆvfÛ8Ù¿ç»[Ù›¼üMÝ !¢ 0~Wøo}N¦ +g'F'+›¿42ýUæ½Íâvf¢ö¶¶@;g'„¿ø‰Y€¦ï}÷`ú÷åZÛÙ»Ùyý™[Ù™™ÿ%ÃÌÅIÝÎÊÑ(-öï˜w›ÐÀÁÌÌÌÅÉ:€î¦–L æáüÛÉò—ù]ƒ—ƒ½Àü]ÐÇÊøþƒàådì 8ƒ\€>^ÿtü/B`a˜Y™:L€Vvª¿›æÿÂï÷²rè2¿ €ù¯Ïÿé¿O˜™½ÇŸð¿¯˜IEUNADœîß’ÿëüôÉÞàÅÀÁ``å`°°°ñ¸8˜>ÿ[ç¿øú¿­JÆVÿfÇü§¢´¹=€ç_"Þ»÷!®ÿž ê¯ àOP°Ÿg €úÏøë1s0›¾±ü^‚¿SþÿÍþ_Uþ_Çÿÿ2’p±±ùÛOý¯€ÿ¿±­•Ç¿#ÞçÙÅù}7äíß7Äîÿ†jÿµÐŸìmÌþ¯OÚÙø}CDì,lþÛF+' +w ™’•³©å¿†è?·ð^ÜÆÊ¨dïdõ×ÀÀÂÌü|ï;gjýþPqz¿«¿]À÷•úß#ÅíLíÍþÚ=VN€1dìÀü>`¬/–÷%5ºÿ=Û&F;{ç÷À»8€¹=á¯åä0‰üeúâ0‰þAÜ&±?ˆÀ$þ_ÄÅ `’øƒXLR€Iúz¯)ÿ_Äýž§ô±˜”ÿ ÷**Ð{Õ?è§úÏ{Mã?è§ÉôÎÓô¿ˆãÝgjoóÞÞÿXþê2“Ù?à;àŸxÎwô÷ÿ x§eþþ…¬þijý]ÿQà/¿½ èùï!ÿ€ïJ¬þß Úü¾³·ýYÞ¹þ¡Îñ.Ûî},þá'oÿ_Èþžlÿ?îw2ÜïÚÞWÎþêß_lLŽÿ€ì¦Pgyçêôçø¿ÐøBïáNï¯? ïGüiÝûº39[‚€ÿèλg7û$¼Krù|ï†ë?à» ·´þ=û‡±¾—÷ø£î=ÕúWíÿÙSèýýñ÷Sì}þƒÿ~Yî@S„¥y{S¾àϵÁí5"øn »ã3»š)4 ^K —'ØDšêŒÀuÐHâд•mqê[áeâ¯ã–zذÖå¶ßÞφq*S»m‹“ØýÇ"u}„ð jÂ{Þ/ŽÞÖ-à]29Ž.Ü(Jyn½’îu}e¿FCçw•÷ª9eŸË¦¾ªÑ (ž¥È5ÉœÃ%…qf „£E¿pG½½›AÏžx#–‰£Cð9ùÊV襳Áý8ç¹Z¡ÆêÔGާƒKy‹>:Eéõé IgÁ«¤(F&4ªÈœÐ`¾I°ÕØ‘ý;I×ÙÈÄæî¡a€hêöThŒ©òŧ¡CÕìN\ôœ:®âéÃ|'åÎýlϨÊÙ PP¿µó©kXêÏx¢à[j!˜Îƒ°ƒ¤ÎE¼¼þ>ßiªúø7?á¸EV“\gÝ/cwäÓN®‡KŸ‰ I;¸,Ý5íSAµI0‚!2ãaK’l>£Ó,ÍÁþ*ô7kApüÒ¯S²ŸG¿¯Ëty¢¼ýTÈ:6 Z6àß{F‚ØXpTÛu ^4+ÓNE§}æ•鱃‘ýIƪšW£ûí¸/ó“ ºÐh… @ÏŠ]Ù¢9õ”ʇ*5Ý—!vF{˜«z”lÎw™l|ûiÄãBèݧ´5[£àš§‘p±,ž œ_ÊmíQš2(öÁmj&†îîžEØa(÷T§ûEÄV±ï{·-Uè†ä¹«Ì 17ÛFŒ2¿9Æøm ËÔ½µ ;ß7¹ì#uZ :¿$çb‡ì¯Ù´:ð:Ïç’¹Ìà4Ý~ 튄HÞ…jÌ!Ó–mÆ;ieŠ5ŸúùEô·<ëŽÑ(¨J.æš7w§®`ði£²sÌwãÕ4}AÞ¾d#ƒÄœÇPPé¨ÚN¢ ô®Rzq/#±1vŽ=¡Û¡G'ƒ{ ýˆgý‰_^Ê·Ê |\]°Ú÷úš/ N’d6¦a0ÝÄlL2ëC{¬mšÕÞãx& è{béÉMŸ NùÙèšÐDô÷–’¸íA, ™-PLéf*­$œ³?îÛ#O‘«€¥x·¡u¿Gl¨ÂC ,5ÏÇâ}3Žyþ¼5-ö2è6 ’˜ $-Ñt˜q"™»èòÎ&4½ÅY}­\LÜÖ$¢úªôç%ÚæÙQ|^m‚A‡!®»Äf¹Ößõ‹:Y¢¾u6··‘èmf©,c¼LO zÌ„ŽŸ¯¹(Êãt°1—í§»©d! ¨üZœ j÷XзíKöÕÏðm¨>aVƒžÕ ֣̘UưãHŠ­ @¶`Þ‘îA«úŽâsa%©ÁéfÜ޳In[êÊæ©£Œo 7·Ï¬p¤â˜vGò‹–kÈEN±}\ÀÄoÌ÷ìÙpUþE4PZˆŸã²Q ÉÓ©¸þÔÇEÎ(I~Ñ¿¬“”+K¶sòì~¿íj't•ÛCåuu[àãjDCôƒQ,”€€-wi/Q–<3ÿ>µ@ÏæW›–4½êô3S §mcFå-"¡ð‡r£ÿ¨éwØrÖ“¸ Š€g1=ùúª„ S¬eQ+÷l’>…jàxûTi˹1vÝdƒ‚1Ó9óT9 éÍPþkþ+nòŠj±ÕbN2)#Êø­õO=A^°ð¿:ÔÖ:›nX«4ð⪜֧£_¡úuR| Z¶ürõ‹œ`~óZ0{/ìãµý¡lò2©TæD5Ê,j ¹œuüZ‰ú•ÌwêÆó6Âô©«JS%éÕØÍ{F›åYðÏCŸ³K”êXÎÚ_Fàݽ2fm-šÂXYñ ÉÙݖ̞ς®åíϵ©xês2Þã>Xê”lÖˆ4o»‘ùО»Òy\8* ÎoÔrÍ tv«ÏÇp}Œ #é£JNdìt¿i´ÐhíBuî–ŽöRì&q”¼æð³ž•³%¡×Gšv­ç“è„ ‡Pš¢á8t;{2ú3ïVâwñý ý`–Æi‹Gú Ò0Y{ f3“Xã­'xo£Ùkæì’£ÖñÔ^û?ÇxWàR^×ô€2M‹&GLæ„°¾g?ZÝ;Ñ¡çùE>õ68¥gõ«ÖâdÒ;—xX¿œ½¶PÔ_I°á=[ f®EQæÉû,þ*d˳´4úª— r1\¿ä»·jÁ7ì<‹ÀB°—0œJ5µ¾UHŸz ¶3Ê{r]Àš£aMKü•¿CNvŠÌù8åõz÷\¾¿UÕ¨'áz«~¢IˆØåos†@á­kQ?‹vò™Ó·]qk…4>ÞÀÚF´öܵu…‚à•˜f’®QsN"C‘ S-Õ£Òosvß÷ZDZã´t™ØJ:/$€¼([tD-Ö=¨¬OÿwÙ~Í ±U68¸3»Nz’ج¾ínD€Æ Xܲâï„ÿªÛv 0«×„+ õþ]ó5-®Y&Æ!¦aØQpêPáô÷–\çÜòyìGðž<¼Û£u›Ÿ_mA®·éJ7ÑdÈ‚ñ9p&þîWmÛ†÷mE#r?›{³=ÊCË‚jn&8P§T„™¼Ì•E/}Ê͆»áî|·Au‡$Õìm/ÙS±·m_Ì•òí›Ný»ägè ¨èSPÎ8 ™~izY.Ž 1EL¥~Þ¯Sõ™~=• óDœr œk܉ܜÿŒ_²Vçë™.çå(¢¦2mINÅë© *#·êAðÙ «÷Û@Õœ-?VÏñ ½¿Ë‹VÈ Í»£—LϬà÷!lŸ÷+7M·óC»¡é˜l>åLùbBz†Ü3ìå v*@ghbahš¶b&1C"p¾ùýР7ó×#ç+ªp&PSé¦À”çî;ñkž”ËvÒöŠ«'cG|ó2.ÕûÌ×DnWˆf6œM56&+Ž”Då°‹d}X)äL—¿¼x˜wª¾‘. þf´0ºûø‰SráeðøS"Ñó ™ÖYlæmt‹–¸Ø÷ŒÓ= &z›áA¶r)ç Œ•}Ip@¼]ìG¶ÙÔgÈ×Õ- ì5e·qÜÕ ¨Ÿ^é”â•_x󬨇ø—iŸJ¾7I{&"dûÎ-§W›Ë–ZY»bÎ<{lšˆ3lOKu¾¶§Ö*ù …~MÛ 6©ïÇNIËËÏ:Å»eŒPú¯=ú8yü$X–4£€ŸÞéæºRXe6+¡l¿†u×Ã<ûQú˜0ÅçAÚ/ÅmIôfSaz×]œö_SN«g»Z>Šÿà“œÓE›Æ@1¯/ööçÒÒÍAB‹‡=4Cפâl“)ù-y+ÃtŽHî+JMR¿å“ƒ¼í%/[‡(Ò¤Ã{—ƒ×Ùƒgïƒ9Z%¡œ»Æ¥ú;¡IÉR{|oÙµå%M=ߪœ»wù¼žSßàþÛ…ôèÏöŠ„ ÔÚ4þžõ«­FÒs^FÈcßñÔ8ÊÊß¡K jðßÀäðxê$}èŒÇ;Œs™žBÛ¨ëÞº ‡gÞ@yÌ–íHM§HÈŠXró%8uá†æ8]ów„rRG 8*œ‰M@š¼® V³ÿX|ÈOãìN(b˜ü^¦½_Z8°Cn6ÛL¤Ÿ"ª| ©¿5ªº:ï%^õhˆØ–ïRTëW·00è+„ bΟ7Æ"kò8XüÔ·•Ë¡|©¨?+œò?2Ê7ÈæR§Êp“ ð½´ôcc9Ùœ¹ TñF!…äëyÛóž"¾,v!îuÄ †Õ©$Q(žöĉaÅSÜ,½éh@è¯Dæ“kåP$ÉG™‡ê1¥áÆWÒÖ©Dû…¸˜·`KãZFúkŸžÇø¨e‘°4ÒÈ.(1" ÊcÚO¥€Ü¡Úq/·¾ß?ö{Q\œ¸â…¢9ÔÎAé¢!4´cqäû±³:¬ŸW~þmf¯6>p”J¹¨¿Ñ'£;øZ³ª{à/<ÐEI&Ámµ oÀ“ÞÈŸð<Øm H—ËPlÓÔñ)×,#Ýã\pçS)l,«Ã&‘.)ö5îçãþê”Úå  “uÐ+;3 F¥P êM¥Ñ‚}V>úTœœÁ0"õC(¢bÐä’qõ€Å>„Ì6¬òµ´“®ÍÍm¸‡t`8±çóÄš{ï’R…¢ö¶‚¸6ŽË£&ŒÈ3Ì— çd}‚¹}d(BmA×ó R–Š"Øv¾à 9¿Çj\æK³XóÀÕö\s»ÚDüt&< é³íåÙËiÃ…FÏîÂ!%dSÀgmÆxɨVP Ÿä`ëžÁ—@VsK Ã@š´jn°†ö: qWߎ\[Æ|ìãèÈ@Ã/œ8é߃¹­Ú)lw‹fÂÕÐe?x1q@ꉻnø¯u¦Ïà4Ó?mB&æ*\w å ÎJS“Ù5‡ÏÜ*r‚L96Ùáý1NuB°bö•¼§Ç×ÈKS™LUQ)iý¡<¶6¥Ñ¼ Újér6ÜûùÜôÉ#·€ ùZ»nvz„ñk˱]x9jñ¬‹†Ó°]&ð;M]’ø4ØÂõϦ´P„ÞäZt«€sÛÞœ{-® ü ‘=šp ¬-ŸÙM¨Iʨ³t‘üp«F‘}LM4ô‘G'š^–jó`›„NPÙ8µžXDä!<¾©ô ÌÁž² tÖ›çrÛ×±gJê>yèþ¶¤‹qÄÆ%©§Û¿tÿMã`uSп³‘,ü˜{œþ%râK:ÚnüÜ¡,«õoºì •·È†ÔÊÁ†;¡±ê¨i8×uôpÕíär×åR‡à&é27†gƒDwÆ[³ÞAßB@Cìš*ChŠž˜Å»Zž©MbÊ_¡HpÖObØU!Ø'v*õóÛÏRHꕹe½«Úö1°‘ƒ~&âË¥1g5JÙW«ÄŽóúÙÂâ"u‹On ë¥| ÝP²N!£Xb;s˪Xà)H£]ýùû€Áj+4¹õé¬8U=KšûsVÀ—v*Mz °™1ÅOºG“gŒ¼¦‡ŠvÇœ)ˆ_J¥ÖÓÖŸÙl¢ƒ2~«!B„Cëþ"ç‰ÿ¤(MxAaútÜà‰Ü¤–ùPHsyÍÜ6O¶u¯k¿tTpy »èMiÃ#°~yžFÇn›ºZ<»¿ú8mX¢+v†¯ÜœHãR~óó˜Hî ð¢G­¹q¿Ù9fßö\?zp UÒ™!Ó¨÷Îçx –McP67f¯H-PÝ`—Øœ*ÉaFê{zÕˆTôÞµ+R7I>­ê ƒ#¡qÏ2T:cdl_ýs"Âl´6Z K()QyOªõ¤Û‡`ÿ´@z|CÒöÎ]p«âÇè……OT‡[¡#eäâ3:XøSn¸ôÞ£Û%œ8$^Zµ_ìgÎVÑ$U¬¢j½vÊäîÒ”_~vù‰óak„ö£n ö¾øw©†Õ69¶ñ˜Åò¶ôê(»*ÊTDÓGËæÙLf÷%^&Ìë•©ðî!b×RaSú=ÄÐßìZ1]yUaßÐàŠyÖ µ¦®©ËÙ<¯`Á‰pÖ{z:ýR¹ 5«!ÍCÏD?ª"ÁÁ,m˜b×KxÊd‡#ÞX}òi¤ß„pao¾E¹*âJ¯;R µ°"4ˆ¿¥oï°Ëfçº[:æY²¦SŒª•ÅÛai5%ZòJ:Q¿I÷@‹Ñaá^>dè*ß·gìQ,@tÒïlx´»›Mîõ7roÜ.vÒ&ÜÃ$â—¥O}¹¿ÖdT]š]×—á'±Ý>ý´4Å4£ƒåˆþË^æ§fùÏKùBØè¥DÍ=üëo5M¦3ôõظ5ol=áW\ÁE\æõ»á%ƒÒi8ÚAB†"ŽÎ9&ñ'Gã•e…j馛AAßÐcû ‹ˆˆ´Kƒ|¡Æ Ú!0(q0Í™@á¸*i·ñHµ:Uó\´¯ú#ÔÞl|{±Ï_V©gD©FXí5Ä'&“šŸ£gçp£Ï W#%ð Òµ2(¿ôùà*.¥î+d쥙Q‚RåÈge%Þ%ý#òÕ·Þ -áSêðe‡þZÍOwòÙn2¶ò1 äMMávDI^I„º!XíÆMIOŸÄô>ƒ8ý!í+v†ᆇÕæ@ä* ¥ºj†sê=¢ÈNT¦Ê€´eá\?ƒ–ó(3Åg‰jÿy«d'£òQm}-nîXóHjn^ï¹X¹ÖÂ9:g€€èVç¥K}Â’Êf9çq°5Q"©Ûys<¾i[nM|TC1o5ôlÓùÙömQæFÃ9QŒd½$œZ?¦4áÜÁ Þ÷§=9éWd´G)ß "<`yð´#¹WPçêÖ5Ê>¬ƒY^{Z/8ï:;MÚ—™ÙoáÏH"$_ïv’ÛG÷^Wq:Þª, …Ù-¯#,v&%å_Ruà ƒj&W—2C¡ÝzÍRšBx_Eà1ž&è¡¿Œ%»F–ã1wû_jÛ²zCR•¹jàËr:8@ÃJŽ T’@'”s]œº\Jöpþ*йç„Û¯s11¦-mŽ˜~U3LdÛ¨« ) xD,bàò‡‰ÐÒîV¯»Hû ëxì˜nX{{ÝmÊâ›b>Âû9l£`ô;úd¢‰ßí¬ôØò¾‰ˆ'ìï!Æ3~ß_ÙjÓ0~µ~åòå²=N“ÛÁ…$>n{ûú-ꑞ¡Ê4óÕ¼¦wDñ~‹Ú¤é+¡ªK JTº&sú©L’¾'Ñ®¹5:¼6ѨEßýiUR!Ï)XͲ5i°ì†ê¸õø:b“JT÷Ϲ$›(ÅÒ‹xε Õ@ñ2Ãøò²cß½p ‚¾¨§}6Ç×öM"ш :íN/ΣfÆóÏ%KªÂÝ7î˜mçx\Äûေ|Ôqsœ*Üï'ÐE¡üq(tñÃo:y„ÇãÏ'ÔìøGÙ¢Ïbç‡É´Ž/9J#•q‰…ü¹K¿êZ˜if8±œŠ~8fV–—½…J0®¶”ß3Úu4=*E!ûœÕ+’v­"´¦l|âO#îâ9¢HhùFüpÑîúvÊÖvx¢ Üã½-Æ)µV*Cš"ÓéK®¨µÞ+ÌHkSmó9¨ü`)÷Ë5"$¸Ýf‹`M눰zJ1c)¾_t·`-¬.¡"ði줴Z2gePþ¹ õ¶Š MéúS"§ôV‰‹)@üÒ /n}$]ü§/ ÏäqºÏNk³XÆñ‹6!SQ uœÐ zgƒAˆGã ŸÙ@‹qf®k}rîåñ÷ kËéA•%R~|Jb8јÔG# hµ5‡…·ü~«µ3G¬HËIÎy^(4 ‚¿,uÍDu¶‚à©Údô(ßâ‹ûX—Crn®ám0!·æ±ÐÚv¯â ZµÔKõg?XÜç ³Ú|;¾9µy²™6>öÃÀpÖ¯D‡µ(áeUK~‰çÌ6Ñ+R"ÿ"WÊ~ÅÇ— áV<ðœIðûj†.3JAXx”~»uÞ‰wa¸Ù¡CàI¿¥F?*¡ån–ì }H= €bO—&i yWÿÜûÉC ; cì»UY2ÄQFŠªðî8e&Þt•­k{†V>áª>2=ê꜔CÅXF^Z0t¢¡OãpúáÎTJ/”_fß÷vÖÔòSåü×JñgÇ…üžrCýöº—8ðªåÁˆ”qÁ,ð"w+FZ\ãòBS¨8Qn…š×J竈þRŒ_Šö©²ÝŽÏû¶\”k°sF#iÎëÉñDCseÊßeð1ô7’ZÒzn9ÉÀ¶šƒ6}–„;ïLmÒq­û^cR·º?œBì Eè3va=OKÑÁ.ÔAwe’‡D¹—oU33ë²)ù®|5`ñ¦†k–cĨMÚh:Ò½V­_>cw-vd™îÀ^_Â0¬”æÉÈT:mIv™^Î~òVߟ޿=z}fOÃ]Xî ‡2r \_9kh:gZ°î/tY^§Û &÷‹7l G·bäW›Aûi|O¨½ tR` ¿¨8þ‰£ýYù¶æ>" yz’ªîÄÍ®~äœü”5ïQÑ,A9$ò´ÍÃX6;*wG¿M¾¼´cÔx™]謰¦Ý@‡ÄZʈaˆ%b DÂÍ«¨A ò{5ðÖ©8ñ'#ÇïNmO£š7œÚ0ªNyTÊŒ—湸3Gµ@¾‹§î[¯•ÜgHݹr¾Þ›ÝO_Vd/yIWÙ\&Oi%ÌàýRmD6Z¯¡MÚ…Év¬-ʺYìü--^ƒ÷Ä5b“EGL,YÏjpÜÍñ¯ä¡~ž#ðÒèÐ} že§Z‡ù>ZMZ ÖØîh/ÌݲDås6òòPš7ܹÜâ¾Ø¹u£[(±-ª‡ŠÆåÏÏÒU:ÂL ‡~6í¾H“ÉéÒLÄÀö‘ÔêÅQ½œM¿Fñ³ç`,ož¿ÑñçR/=íÊ?½ä€ó™@§Ç›oWáÊ)–¯ÌÙûtý\¢t&÷À{2oP¨—è Û0AÓ4»èØ´Iêöµü¸ÚLÌô·Pà(C¡‘ùЉk}ž`{<¬¥a" mP/ût˜ïZÉ.iÂñ@…#%K†SÂäF:BŽ$õÚÏôÌÍ!beõà’±Šÿ¨N“ïžÙßÓÀu™=ý[P2l‡ ò0•NÏ‘zó+Ð-IŽvÑ/SÀ(²˜Hƒ¸ |ýæd´¾3CT?üdê¤c™W< ³e—ÃØIBtYiøï¿ÒéÕã ¶öÜß ÍK-ŠŸ¼Ðk`B 6L™JŸWm–¦âΨÞC`OÇŽÄ©ä«&•Šš9¿nF;O0é´ØQdýøë˜ÄsqúsB¯«ëg~¦w«0rR=>f¸Hø ud=‘‚ƒpoB±’‘)‚AþÊÉÁT„ŸÂOô>6dÝÉOŽ£¨Íˆ/ÌgÐdTXCÅ“õîœ/Yaú¯æ²Hõ%§~/f#R$ß1É€aÎàAż&ŽðÏjŽ$O,Oð{”ðd{»f^áBÜå°«×Íœ>”Ë7½""ï„Ôßn O;kŽ'GŽ`îà`&û8U³©Àf~cוŠúÛ-ߜίn¿ì|cj‚Ft»ßF˜ÒµÕj4£¯`Ü¿šŒ=š\ûTëœó‰C{\ÛžlÌ9·´ •o±Õ67"Wøº41‹ rl­žô$WÕH1*IŠ{m„Gt#9 œúGµŒúÙö![¥«¬ý@<ƒþàIlùM¹~S×Ά}Ìí‹}ºJ™DƒÍä×~³â6•­všu“ÀŽZ¼ÝSx…ݤÖ”ŽÕ/ŒËÞy‹D ”¥oTæD ™ƒš ?8£?„W/Ÿ ka#~§c[Ó=j$ Ò0šæ$Ö«lAõÁ攃ÏX’“ÿhÿ2íÒdA‹ ¶Ü)ÖjæøÉ¡œÁFµðt /KŒª 4ǹš¦ +Â&Ë3Ö«Z­’­Œô̼ %{–7¹:#hB´`¸ü­6ßóšm.«±wóî;}ØsòÈY‹k¶úVøg­îsÒa"&hsƒøÛBuÅ&ëT¾Ÿñ 'í€×Ìu™âíküDnu×àTó+é,c0Oùóô÷éîÇV9LG…+êÉi>~N(®£Z¼×Óq2V¿‹i>øôëžÑeó‡ IH7¢*>Dn¢S,ŸÇƒÒ9¿N'ëò¯˜fè,}£:8â̆Ó¿Ò·ÙLOƒ“+ò!‹ÂUƒ>px3½Ü…aáëDº!Îâ¢d‰\¥£†«/‘XÊEÑæ^™úš-Ű´Ô¼†H«'C¸`iªZHܧTs6u«2U£Õ/*öÙ NøÈ(Âw„i}ëÏZ»"JáMØOÃ⳿§pÞ£|Íezr '.'½’åe¡Jò^d£Î`åºu7ÈËEFfȈ¶H)ìÓùXZf¬Ç_‡†Çâ8ÐíY•yHÊ“]69/ IùL“x›ç·r¹j/RHcÈVÏ„¶™þ+’~:}Î蟻’èklT³hç‘ÝŽI†&3ýuÿ…Ø››¬µ^;ÊšM šm²äÛÕ&¦‚ñOí½î’XîbD‹àIÃ'aœÞšU*DŒ>Á5F´eãdáÑÏœÁÞ.‰u®·›‰ÌÇ{Ul)FÖ9ƒœJŒ¤ÂzÖeƒ”ÑXÃR“Ôòð2W¨Ä)Ö¿„àÂ!†Oñ„”úæÓmÕ#©©·N§ÔÜòE6ÓM4÷µà‰pØ(ßòÁoÖ,Êz Wg:œT–N•"˜ZÖ½?ˆ)®îİØO8É%§óÅÏñë yÖìöªÕçØ؉b`3EJ,ÜJÇ}¤ä^V¥Ä»¶éó_²áE O†?¨•>²3ýDöxRàîA|œ¨úødsúf E8_¸¥pµ¾ôÌäΙ)1V”/ëL7H|y7Œ[q2ûl<ì"YØqo;-×Oý¥Ç“$×aw&súŒý‡Ç´æú*õs׺ ‰±»ˆôš ùEd$“Úgùè·ñ[So_6ýÖkÃÜ—ÿè]üš˜ÅìÄw/«z®jã­1n™U³;ª™øU28!JÌÏ&¢æûäR<Ñ;ÆNu>ORx Lww^!ë‰î”Æ$ ÎJAŸí/5nÕT{ÎÃö{hWpì°èQÍÅŠÚ,z?ÚÕL‡ ¥‹ÀåÄöÆ1]i®ývœ¢'—¥˜¶¹ßý\Ïvï‡L¸ è*kÙ©ŸBÔ,ʳª“ÝÏ®1 ÔáƒÛVsŽšëþ–õÊÈž¡Ä•³Û®~4oÇ|kõ+>©d ÝMÞ­F;YžÔ;À¦¢(ÑL"ì1@y<·C:ТSeŽˆ2¢Œ5 îÐBSâÖì_ú» ÏâÊët:βp»o`ÓëK ]Pâw‘‹+‘¤ƒ8A[¦žØUëàË ~-¶31OþÝÙ“¿Õ&ÙßHsr\¢ ù©±™Cû/ª¹ªŸ‹=†DœRžŸpð¬I8>ôuŽ! j¡§Ö‚Àæ]â(*©•,ón°K¡ùüžp9O>ÞAÐß… ´á'SãMù»…‘‰óxè,2 ,¿¢ó Û’Î]úKò:7;úÔœy1mcŽæÈãgrDF|Van¿”žØá²>»#Äøšï +[!B£éùá¸D—Ì@1º®>g+ÙÿYÌ‹[Ž”"˜+ŠDbOj/¶”²F%nyÜq‰~xá.RâöÃή³ù±æ¬†o:’bÇa÷ä_6_£Í;“6†ˆb¤ž°ô¢ˆ\I,[ëæBP,ßK5ù ±ÿÄ¥u´ªö£åªÖZvÚVfoPU™òìQ©ÐasâÞ¡Öd쌬 =)LGÞSwVw‰²LË Ê wmÕ+Òø‚ÛdÕDDë‡øûgòÐrѰÀ~skŽsÀ`|ì-·0 ªÇ ¡$ÄåÁ ˾6–|¿œo%«¦\Ž—È‡…Ì‹c;;€‰˜¢ $¶‹PX[á‚ aß/6À”8PY?|óœÇ]Žf^¯á*ò§ýZ´ ¿®„î×ÑA;/A c.Ê7„-lÓž­b|Ù‰çYLìWþC¤ëȓܭƒ^86ÜÊQÛÎq×Ü ÁùOy‡â‰?öÕé2:¼®Ú‘‚£@ ™ŠYÈ¥½W†Ž8g^r‰ 7ø‚»naMñ5‹IÍ•.ylbϳF¢áć˿±z`0œ[ñís%¬þ)Ç% \]T.^ù+—’¨u±í׺xÚÙ¡F$cÑügÖ-ÄøkʾP€¨žŠ >ÂkØ«,~oÏ…eEéÞOWÙrGX„Žçö%kd %-šòìO¼¯átMÉIEfÃ*wS™=·j±ßg¾Ê_%&Â÷ôkÆg5Ö_,Ëe«9€÷uL®¸³øiÏ—a­8(üšfñŒ‘¯ÌxOå&Ç>²Ï²/gùWÝsAÃÇk4bsn™àjщÕ^DJ"èÀ Óƒ2¢ÉLïG™¾T°«3a¸%lËm„=,yö|=¼¤†¨ÝpôIñ2{éNŽ&Ó3v_¨£×»7R%¤0”;….Õ]^=éöÓ’TXá鉯¸”Êà5â£c‡o¯jÉ ¶ ̹´q ÊÖ¥~ -÷9‹ ›5`ìªv²yÎw\D_ð@pÿæîo7l·³zÛ’+E}f>+›‚YxÐõ˜µ=h¥ûQ|/Ý*;ÉmšY‡¥%³°w&òeÕÌîÍ_8Rû¼ÇºFµŠ #Á²/Wm¹sƾ…ÓÖ劋 çš#ÍsH¦-µUH¿>A(Ó3m¡ì+nÌ a_C6&1ýî5ŒYÛÆµ*¯ôNCÞÚ!p¼>Ã×Öíâó˜´&nñA»%ó2õ´Å¹%ÚWIæ½1ßF \Z£Ç'k/¢Ò°˜)ùøM9=—½:ÒWë2ÓÑѯÚ7¼¥3—hºgæl mÝÔ->ŠÍo²½‰b –ĸL[Ü_ü¡5?ršÁòÖM$AüÔ½’ÆS DýÉ$?ùUfýilˆ{¤äôãç™9ÈKü‰àíñ\vtÕÂŽ:Ob®8 é¬+­wÍ•ÁN¥BÞGƒÿˉ¨PC:ê£r++N¼ûK0Oø »n’~GTTyt &ÎÞ™ø6Ý{pPD®O‘®=º§Š×ÌêgœxT#'{ò¥Û!fŒ¦I·{‚¯£±™;Û(aË~Ó&ýÆU!«Jê“ùíwþVjô/ø(v.^?ÎáøEø¢­ ½MK숰„`}_?iÀ ý•žŒ“’µ™†Çé± ž Ñˆ9ëø®zy‹`§(HÎÛ²K•è5°»Ë ¿ÒÛÙ¼™‰§£‚ÑÕ'Ñfv ”ײ/–êh7fx[³LÏgfZ‘ƒŒ;˜%œ5$ÑÄÌu!tüâÔ¢¿¾í®¢‡:¢¤ÈºK5ŽëÛÅXñz£,—tï#^ƒ£_‡©òò|Z~¢Žògœ§v->Öf±ö!5E‚…lÂO­Ùëk3NÛÌ£V†7ˆÞÍ÷yn#áÚÔ$aË[›ô¾qÂ7ì\«ÿ’:ö0ã¢Nò««ìÈà~r þŒƒ>ÞÀ¤Í@ ÛÍ;K d†æx¶ôo®µír›¬ÕÎ1§±ÂCö  ¤dg‘†HLwꓲðTéÝ¢$ò™æbôÛƒÓû¥I*P«ª€€þ¹w:•xq´[Ç0¢Ô ÜA¡uèÃØ‡ Ǿâ;®ÏÛfw7tr æU³ÜÒWÍ ¡;Œª†&L–4fâBã‡bTLË# Õ«Ó¶Þ« ”õD¨7¤–3ËÓý™×(£('È.Á.s¸üBýÇ|Ý>YÃÚµÛWY“»ø¤º­0Ré8h×VûÜ*(ÆÞ/}^[P(¥~ŠTQŽÑÏ2ˆÑ!cÕGÏ2 +uÒU—œ#ôdübf”æ;ùÀýF6[¨87#ä‹L¢QºŸjHÔêNXo­‚0,Ü“^Wn޲L~FûBÅ@YÇ Ÿ¸e1LL%çc÷žsâQo2#çéѦ‘Ÿjšt?G|Ÿ®ûÊÏäÞ5 ¯ÏC4S±Ì@[Dr+…мÕonÂÅ<þ*-ŸûÁ|¹m,áÊ’íx-²Œruiá5Júöó1Ä5ýÊ|Á4ÌIù)Í–[áõ!=ÁbÈo::![ìâi¼u±6’ ¾Þñ©y„…XJ^ûþTtG3µ‰oñZ¦ÿ)É`{(ž¿’AC“§øu˜±,™Ó%=yö§U®ËÀØ7¤¢ Ç)? ©|ÚÛ‡VMzš¼ ë¶WÛ¶¦·Îg<¾xný&h$»™S¶%„¤UJf.ZßÖå „Þ‘yÔÖGifŽ"IýfÑP¬ßGβhMì%ovè‘T@‚Ƙ8´(ÞÅ~ (æ£Ýº:KmEÆÀÒÚ‡Y‘?×’©“–›ŽìP‰bU@/„äKç¬ßœáWÃ/ff€–Yuü_sÒ¼ƒX»ä"tä^k8¡')Ul7Bôà©ÃÔMšÙD4ëlúzgÍ=}#HŠ0Y=au.sP*ºˆ*JL°¬b46S3ÔeÜäzÏ–3çEnv/xº+4& Z!-W5m®h'‰ƒ£KKZ/úeŽ©Åú–šªÕœB¤”f¶0ˆÃJÉà™‘Õ=ÞœY3¥û˜Â³ÇãUÖ­Ò Êb¥gŠ”= ÂnEä#F’óvøE‰vãš%ëÕ¬úHN_»§ v1ÀÝË}˜u. <8 póð«ž> endobj 401 0 obj << /Length1 1731 /Length2 9507 /Length3 0 /Length 10618 /Filter /FlateDecode >> stream xÚ·TÔm6ŽtRÒ±HH/ÝÝÝ¥ä ,µ »t·”t§´ÒÝ%) HФ„”„tøÄû<ïûÿŸó}gÏa×Ì53÷ÜsÍï,ŒtZºÒÖPK°ÔÁÁÍÉ%UWWææpqñrrqñ`32êAŽà¿íØŒ`W8ê,ò/†¬+„x°ÉDu¨3@ÅÍÀÍ àááâðpq ÿM„ºŠä@îk€:'@ê †c3ÊBa^®[;ÄC¿ÌV,naaAö?ÂÒN`WˆÈ BØ*ZºP+áõ_)˜Åì˜èááÁ r‚sB]m%XØ„@ »ºƒ­¿[h€œÀµÆ‰ÍгƒÀÿtèBm W0àÁà±;ÃBÜœ­Á®€‡ê]e5€& ìü'YíO;à¯Ëpsrÿ'Ý_Ñ¿AœÿYYA` g/ˆ³-Àâh*¨q"<ì³õo"È}ˆ¹ƒ Ž ËÂG¤µ ‡ÿênå !àœpˆãï¿Ó<\³¼³µ,ÔÉ ìŒ€cÿ>ŸÄlõpï^À¿†ëà õpöùÙ@œ­m~·aíê;C\ÜÀÊrqLØÿØlÁ?— ¯?ì{ZÙÐó‚ÿprÿ6?ôàçƒÂ6m€ý 6à‡/l8È @¸ºý|þíøo„ÍÍ °†X!–`[ˆ3ö?ÙÌ`›?ñÃü]!žc®ùq¸~þódú 0k¨³£×?ô?F ”×4ÔR—eû«åÿ8ed ž^?€›‹O øðà÷ßyþswÿ‡U ùëtÿʨìlü.ñ»‹‡ëû»÷¿¤Áü×Þ°þ»„ôAÐ`ó?ú7áâç²zøÃýÿ¼„üÿ‰ÿw–ÿ«þÿ÷D nŽŽø™ÿ$üü 'ˆ£×_ŒA»!–Cú°"ÎÿK5ÿ¹Ñê`kˆ›Óÿz• ‡%‘v¶}:7'ߟv\â ¶Ö‚ ¬ìþÓßÓx¨áqkAáß/ž‡(.®ÿñ=ìž•ÃÃËþ0³?] øÃ""þïo ~Xµÿ>‡¼³Ôú÷Nòð @®® /ìI< ~€÷ÃòZƒ=ÿÐ<Èé E<„zöØ@]±ZˆÔþmúñ€ºÿA‚ è$Zþƒ„@«ÿ þßèa{ÿas?hþò? ØÃÊC¹ÿÅy(gûü@ÿ„´û|Èùíÿèø|3ÐùŸ>8a*„ZÿÇÄû@€Ùý“OàáÄpGü_¹* þ<žÿ‚^Àÿ‰•›«ëÃÌþØ¥‡yýÿxg‚Áž`+쯳P+ÑPûºÐŽ‹iJŽq1´ƒô #Žñ"3LÄ€ü”ùj¢nNö¼ê;…¯ýÜ föÝ2.¹KsÇ>ëõ´ ^|g´ [¶´–ñ³÷gf’|ΩžÍ>iAzc˜*C#Rê:€¤E߃%im; ËøÄ÷y]ß—$&â2A•°®žš²l5*aƒ½ï:ˆVËa½ þ²çyßâBÖbL"Ó42Ÿ©Šu]b'zT㯠/ôS÷F©¸o2„#äE‡©äø0ª  ðnòJÝw3 },‰¤v­Ê—YR/ê4~Ù­ÿÚ5¥cNî´³H¶‰áÞó¾¤&€-ˤ»ænFYË Ei’H:‡ôe@”Þ/U~§vP‰SõšŸé›\¹qSMS6ž efWO¿«XßókdìŒu· Gn{^“J°.ÏF’ͲãgR0Èà˜³pÆ6cÈc,”nס'Q² ÚhDÀË‹ëI¯ÒÇ6þÂ(~qæãÍwWpÜÕ%Ã4ïRíKã½R¿à›Yôæê€ø¡Á*£6FÖÛÃiõÌ·ÚsÕTmÈ ZìWéÝáÄÿseŽàu T@›ûv§;*4–Œ³-òYå·µþW§4ÈñÖHeùåW'A$¡H¼ØîeA1W»Þ·»È™ lXƒ7Ú;­§¢SݶC8È_Ùï$ÚÒ4Uøœ¤¹Ænux›f[Y‰‡}ºØ HÚÖ … Và nêÉëšROìü8ˆ¾1¿Æ &ÖÙNŒ‹é^9iÍ‹f™®¥œùù¸£L<“SøíìÝ^[JŠãlq`›œ'˜~ôdϰ±ŽgÍ–»Î.Déò”±™Sª¿2¦5Õ“?ëµÏÔŽò²]㬯“ì2Óñ…Ö½au'yY9Jtç AÖMtM¢Ö|…zÅO¾ò‹°¯]¹Ó[©Æ±.ÌŠ²yO<Å0Š©&ôÆuiO/{ H€\-6¸c•¯ZÇUñ™Â$ÁŸ>Ÿ'ˆ¿Ú±im;´W½y=ÍàÐâx¶Äh~âÄ`ŠŸ!¼ÆÑ’¿AêR  X¸L×›ÐâöùDDAìœùús®Â¼¥^çX‡ zø÷Ÿù•>‘jS»L¯zz°GŒr„×FJV®Î÷—%$ƒˆæ×ôò¿ C÷u<2§WE°#h²À­ØÀ_X‘m[ÔT½d$^×?[ðüBó#›óF!mϹ BWl®üz7'“YjÂ…Puu¦R¼H Ųá <ö)šf«!møŒ=ãôsÚÂV|$fbùÕoe Ë\ãŒ~o`ßH­øØ‘ðIDFa˜yÈ•JµO¬ñúQv@ë“f+RÝ’˜°Ç^Qªº ™Vijðõ5ÍÐÉéc”Ég•ªVÛ›æØØ'7nô “âE¬TD-F¯¼Š¿ÒÈÐ2ôÇ©@%u9üÚm¨,Ìr룔èEŸ,’0x›IÁ˜9»à&ì2þ²Drœ,Ö)êgzG›ùIUÁ”&¦áÒ'äµ²¼2·K®Åó„X`bS5ÿéãSe—Ÿ¿`Õr,«½0xùÎrÏ(×xŒËmÌžDB~Æ¡.°ŽÎh G-¾«éâÍP‚~ZÍYÖ@=ÂñJO‰jØyêÎ+«¬?8x“F]ÈŽ‚†ñÒŽûšÒªM3Ö7)½[ƒ5ª˜R(’?ësK5†s…‘E‡&•íL(x'3”têª"£8ÎÙxº¬äScya×yøÕ+)ëY¯¾Y¦8$Uß¼¨õ‚z~j²¯ÚOó,¬ÓíLG1ñjdq&•lË5Ø Vi"§¹Dg£¦t…å“x/ŒÙ¤×¦ÍÙ(³.Û‹#«’ðN³0v½­ÂOryWդɌÖmÂñ’.†œ&wW¥[‰…ÊUû,¾‘Z›ÿ¬0@ÌRÍ(1Îï@¸Gv.®íQ y'HÂóŠžR$e޽@ßœDMK2¡qh„TC¶jSWýì3äà3î¼D ÁàÄù«ÇG¼¬söô†}9r;B[Ñ ¿¦}åÒ5+D-ŒEµÜQlÏ«%‰š`[k§ª(34µ¥ö½fþBFâ¤ã²Et^¨bL–èo3‹"ÌžZ.PÿÔœûªpÚ߀Ӿû–J—M’;N2çxVzf`ÙË‘9xMíQë¢=Ÿå@?žpo «‡¼ÜIjŠ•ä:^X8þ›|+r±¡¦-Ç|êloÌ“¥mØ&H 榉wÑí{|àÔ4M¨¼½šOwä1÷Xˆ^mŠÚí¿—¡ª¯wàÔñZÚ¡ï|£È^Æz;Ì@¼Êû+ï|Þ¬ŠǦq]WãÝg^‹[÷ü;˜³kˆþcuÃwYgœ?ˆ^p ¶2Ò·k*ëx¼s>%„#E`‹é ¸û-Ú-37£òÚ”wI&©ÍYr^fϘƒñåñt¸ÅúVü{eW¥¢ƒ¡üøCžjr»¥Ó£šn4J¨?é`Ô¢fÛ znòÈ1§9ç×ÍÏfƒ,ľ›˜|ÇíûÚòýŠÓu ³…æXÞø-JÅmóÞ)ÞVHYwgêFœkÚ“•)†b™w8jÈÀ¨ø"-2$§€Ù¥9¦@EÊÜ©qn7.S¸EvâIŠof[s- _Þr)óö¡LÝ-CG{kî`ªCñêÉu»*M•Sô¢Ô’y‘ôó͹ž—mÓ=„˜ì :`,§9c”ÊØžX˜ÿèaÕa$ºÑB’ô­“´÷×ÓÙ¨Ö]¢ÏÖ3üÉÐ'˺`ËgiO[ÈeKð“4>åÕ¼î_ö¨bì à÷H/ŸÏ YX¬wÙ‹qI‘^ÖÇÞßé—0²^ Pš|9n’Ù\MšOÙÙЊa€¡ØWö n{ô!ÂØ eKª"•w3¹Í73€NýâÑCøÖ‹¶û0¿l“÷%ÙŒƒ‘Kš ¶Üê }Ëî_{œR!ö¦š²kgâÖ÷=§OšUM„ã×ëÂWÌ¥$ó²˜élû©Z¨¾¾l¹ƒ1˜ŽðA¥Oäß%*(Å:!±,“.ñ¢U –u6 YŽ \Œžt·²"ÂÛ?ÌÇ9ÚýüÕ&¥~ü¬x;ª(ÞoVn÷e‡Å¡:«‚%d9p!7#½ðT¼çLÇ|²K¦yžù2zß¾zMXo¡ã.;è „Bç[ÍÜ&¹¡°è‹‰S •7´–m33bls5°W~'Âò š]¶Êå¸)üÖˆhW¹0kp&ÕµÓä[Óûà÷߯uÀP ÷ÄÕ6WkR˜äÞÄLUu¶ÍgÙñ§èµog[ ÑÎ`á3Çè!ãÃÒù´øÌ_MÕ×Éçž`áŸ-Ä›UN~ÖL©u\œøä%NuRfæÍ/DîÍp7æëm¼EŠØ< ÞDNË]SxÕúD3Qþ}yšã~ô’‰¢…å£3PQf3óÒ¯a3}^¢j—̆™ÓƒµcY´gå÷îÝÑ-§öwH±’éyW £ÒÔÓÍ›üœep‘.Ó!JQ%žª°Î:IÇî†:+bÂõ;$­âó:0fá·÷ë/@ àP‚¥XxJÒ­Ã5pÃg}{2š5žO÷qem¯XH‘‘ 6Þñaw°YýHd:åÊùö=ƒ•nà.%?Ý»ÄÜ6®”¨ïóRat©MþërXÓôB¢Þüj¸?†£Rç™íÔˆÛÊ$4-J^níÎycˆÆš›&u¸ú?ü›¬”T DÜàôo ȾT´}Ýš~ùRäÉ¥Œ¸0Ã)ÆÑÐ.Ck³@ÂéÕ°ë“Sº,Zp…èÖ(^à”ág™µÿ¹â—|úê8RÑ’÷zSq¬'¤&ÊàËㄱ–êòäJüYØÛ"G^¦Ë³&Ù p§ý;É\Î/ŪMWg¢>§§z­|Áøá=yïãJ5 fðWлvWú­W<{•íäŇBJ_›&šºô{üpÛö•ƒ¯fñ,’WÑãG fÜí cÕ¤aN´r»õjÕ× rXA‰øEÒ8IYþ1¨;<Ô·ÃHk&ß s€yÛ{irÇÉǽóuŸ‚5oì(Ó I.£vŒ"Ç\á0³Ä‘•³ÃGÍXZÚ„¦PvyAþøbñgÅ#iÍ<æªpø›ZFæ…kظÜ7¥gÝŽ,U²8ülÄ¢ãy°”¸Òï‰Å?É9oWFÙ&§D¾“÷•k٪ѿ·•D¥øñZxËAP±ˆ *Éà°—êb¨؋û¼Oa7þ}¾¿Ê›—±fˆNô€®Ý·%´ÕÒý–;C… ×뎌ŽÞ'\™ ø$9-Y >U“¦Å_›’òôG:ÎSç)ÏvVèóN¥tó¯|UpXîO”LP)щýØ“§Üõ%åÄXGSL‹²n‹öSÚ+¾/m+~"èMBCjÎÔcØRV?[õŠFÊ"áªSûÖ4wÓç‰[P ¢!£% p‰Æ…Fh [èb–—)Ùy­°×òÈ^±ÑˆŠãf¡*~ ðÂÔu…1…×1D:œ®”ZÃl,I©¾zŸJJL?Rö½N?±¬þN“ó¡!4YË•6òÊwbz§K“†eÙåÓ¾B +U3¹Pܳ®¸m-z÷K‰ùæ€ø}þ-[Zõ”¦ðF¸´ßÙœU/³'ìâžæ1½åúhíq=Ëo41#ìeæ×„$Ã$ClÈ¡µÇ"%P¿>ñ’KþÚádXbNŸh ºOõõ`!P¶XyRÙ|AƒðNN•=Ø3Þai)¦M/©ÎŸ$ß§ƒèèaÈ=©PàYb’Ç'åø”mŒ„U°é@iÂüB[섌ۮآ÷¨þ›Ãgþ4k#øUªÒëÚkC˜à†‹—ΔØͪ'Žø G¶û+ÔÅ b¿š­ûÞV3'Õ,ä#'ƒÙeæ µÌÔ5CÛè·î\ÇŵOº™¸ôüäM:xß,—ê2R1©·xž-JƲ¼\k)‰eÃ’öxªZˆ}Þ  ªLÈÆ*”X§v4tCç»»P1§0Õ{•áÿ<ݽšúZRÛ Û~%ìSnÑjr@/Nº/G•>jèIƒ*AÞ¾·ÿ0rö=¥ÚE¸àLq¥"ÛËžÑ<™˜Úå¨îñLV¦± =Ár!ÿ€ˆxúô©•ÁnÇ”÷B´O›hë:[ìT®›Kzó© ˜ícï-7XIÄ}1”ìVSI\„\ŽÍ5 ábmHCÜSÉçohYiãÈC~¥q”õ}«¿$ð†ò‡ /”×[W àË$]0õA,-ºPkå”äjXäø¼6¯k!û)XЬ—YDR*fYŒƒ!êš—¦jz†šáTS‡|œšž ž‰ž?Ž^_µçWŒÚ ©*›ïsÕÓÍBO¼K CÇF!"Cè†l¿PÓTë;ºofõP=~¼…»DèUtÙ ¸ÎïüRKb1|Õß‘‘X³}WÔ¨f-¬Š‘…+uÍûÙd_WCDèM!És[Ôí’eL}É%–õKÆÉëyhLs`ú–D”îZÿ?K:–f"vùÛ!#þÀg£«¾eÌ`r Ù’Jy—"NËJÍÐio.—ú)”Þ6©·ÍØÿkã‡N>³D1ëøÖTÙÞ0ÿ+»Ž­ƒ6_eN~·^ m­ÂóÙ`‹£·iÚÚCMÛÌ7ç|Iüd)õf¥!K¡ÁÄêËÕÐWÔ˜üЬ’uÔËpWúï>Ù®½ÞõØÌ/#;£Ü!uñr?±®(jMø©Ú¿Kh¬†íÕâ‚Õ ÓÓÄÐ'õœüÕˆÀ6áî öxü•üÓ¦AåÖ öke½^†ˆØ»q¯¬¯ûI”RaÖÍ{+»\S2G¦oËoúEZßãkm3ÐGaÒɉ”!E …1² cƒÈÖ²Ô=“n‡‡ž™«¥]IR½·&d½‰˜å:à1ôdÞkãƒáTi u°Rq¢ºóSçÂG-ÅN_×›ªi‡s°^4©þL™ck–’srÌCßMÇmÝÉ’W‘?AM}3è8‚08iâO®Ãö”Á½š*Wœ1o¾Œyçt¹“¿"úæëœ—Ä"Áú¦†æm!†ù¥¯{´ݳ§Zúç¿Â7ºZ#9)ÈïcêªLަŒ½£ÐÀ•F}ù}Ò5ìòûÝèÏ’½¢gy!F· S}¿XòQÌ^à­ÖúBâ:o¥QùïÅ 4mw>Ê:ƒ„¼Y+x&ÀwE ¦3Á4Ù°c«çº&Êß:ö¹i—©§Îj¨¸ÑUŒJoô¼…(…¢ºo"fI ]GàiiÔÈœ£½[Э§°¤8ïÍœe½oÎBMbÔÑ“¥&‚ÙÄh9™L?x„¸‡~˜gf¸·Kñ’ùfüµ0±ìyÆu×-Ò{m€à·ÂÆ*V „ñîôcÊÂŽÍeP© ök32ÖÍŒ9¯H0eE«¯«õ¸rùs¡¥ÇîáôÈBð‘±ÏZKSc‚œd/-óº³À±nóñÐÏO Ï9m™G,Ë¡ñb<$&àìÒ[¡Z÷ÁbPwõ¯S>Ý{Ú ›Ÿ5ìl }:½tÛ¾™:2â» ~NÆYÛ)†Ç†ª2”µ¯ ¡%⊜Ð7}{ÒQJëäÖzªo¥Å§H#Êè_dh‰²0ö«ˆ;†«™&~yoàq|Øîud‘QÞ£8!`¸~Ò·¶^>ØÔñµNp!ßéÇrXÆèúœVËñÙ9ÁD¢ìÉ>êã]#¨·àÆÓê¤à)jåµ÷þbD(7x.d©ùW„xs“kLn7½,Bno”¬ÓoLôû×”93R9™Ïï¾_'A“²¢÷NñmyJ½Oû\î©‘^V eöá;ËbD…óyuÌyá€Ý„öŒ1c}ðlÔ¨ÛZ‰pÝ5¼‚ µ¥E“|ig†Åß"L“µEìŽ[0:ãb>kvTÿ­dŠ]üЕ«äíÁ¦¬ªþOÔžU˜æWõÜE·Ö­ ñs*×zÙvÚ'%MÉÕäh)WPÅ¡¹Ç®é ’“߆ù^ª·iÕ³z³ß )|˜>,ýD^èu ß®$¡VÑJ•’œ«ã[ 2j‘å7†?_öa|œ£‡½_cò9[W>úô¹ %iõ#l¸{µC£4LúH˜†V«„ö vÂãÖÎMOÐÅåß® %U¢±îÃâ¼ÏË,í z…"{©9míWÄ#ÑfºÄÎ6ÇÙJGÇÍHN $¦§ ñZNМ49Þ¹W±YAkx»ÊÙþñ¦SéшˆX¼n…ž í—øòœïüJ÷3Ѧ¨Ëßn]JÝI’ç<ÈÛrÅűVGBy‡á BgdÏHÅû(»ø>^µíý`X<óS¤'gˆ´H!Å™náòÞ]w3¼=wʆŠåOÇÀ– ÞzÔ–Ï'«×õžõHÈJöb~£¸×®Å™žc·ñùÆæUòÁ'g‰í[˜…@,¶¦×Ü^i®ý·âÐí‘çv]•|Ý#Ù_^áà]_Fd3d!)ÕÚ½J¹QÎòƒ2r‡ðŸ˜ºÛ³‹õR£®uÓ;ûšé¾ñY5\Tš/®ß0-“çŠÙX+¤WÍüñ\QN“ØäñíÛx÷é€DGÊ~v–úç…Š S¾þTé&ø˜¨v‹»}3‚¢ï Èû…1Q"ND"uÖ†¨¤íBž4Ì»?~ÌÌbU¿zúõCG &½œ©{Î$Á˜ïBn˜7A(ï‹´¼ýç WL­¨º4JÑEª•ã+K6e,ª§?¾”—´®“â\º‡ÕÀ¦—¨P&û”sÂØsöìcbÔ»°X[DHØó WŽjs21¶‹n¶¥ mLù„ï¢},ïõ×;uïó:4j øžoŸc±bHºI«•w±÷Çêµ|Tõ¯´ŒÌÌ3™škV]uR=ùò_r?ûÚ¶3MþX¥|> O‡F†˜ Xp5™QšÆaë*6U[­=iò÷MbS'›.ˆïÃÏÛà ¢vkˆÔã±³ö¡• m¯9/N$ø<°(6³r~ìhï?œÕR›ü8Li¦ë֌ŒÛÑÕãn¿¦*ê-^óÝ~G4ÁêooÇ£MòŸC<³ú)€äšÚ_MŠË0î#ÝtU0ìíw‚i#ô>g>ºü12÷êý£ÕSÑûµ§~·*V2®{áZ“MÍ‹ÖZe1tiÛbUö:¢¶°³ÉrÛHVÖô¢Sdá-nt£[ó]§êÉZŒ¾™®¨?üâopÁgèð‘dãäž*r*ü¤óç6ÙÔÉ×Ä™Žî’L7N[ºUòÉÐxBjûO÷êÀÛ¼Ëai Ùg—åé1Ø(®Ö£w¥mÔ1ø¸ZÆÑj@ÜO~Æ}Z‚Žˆ1WÝá‰Þ¨ÍÅ-g¡æÚ¼f®—E½-”FM¸}¨EB\-ôkDD±Ž4'o¯£e­{¤Ñ‚ ƸþËØ‹ á·ýƒùwì/ÁG^ÂO].Õ(üZW·+eÂá4 ¤âj ×ÔÀœWV§tœ_¾p‹Ã­íåðµ?:geø ôOjm‰ì]Wœ²—øf>Ÿ;È&%}†7îyôµS4^HU¨DŽWwÍKºÀ$´Eý“¤Îíüe¡µß¨w£Ö‘=rþtÿ޶ó3dꯞe’í{Õa0+€¸Š /cfÀ åÈÁ§ÓÚl†Jn¤.ô"^ÆåÙ;Á¶$c ,5jä"̧„‚~µòFx}ß~vŽ"kç•+Ó{¡—añU{sTÕàò g˜öŸ<ëÐÄOÀNÄTÕóQA“œbpб5$ ¸›hŠG‹jâ¼óÉNt,ÓåvŸÀn¶Š^¿â—,h “Äs aÉÑ@A|®ùŒì†¬ØÎøáƒdƒR>ð²C}ŠðË¶é‹µŠ”MVuç§4ü'½¢Ÿ§}¯÷GŸÓo„ENÍ9 Æ9ŒE­˜h¼»ª‹ îHUåT ¾ÄJ^ºAÙøVïç”?è]Ý6˜÷Ûe¸ßQÄš½zĶü¶§-ÆP‰˜>­¶7ÜÀ*ûh¼Rcl¿j3#p+6ý.f"G°j¦rçË7ϱF&I´ŸãCz93x¯Ž…¥ƒo ¹ÑÏå›Ñ…ámËYÀá†cê…×[³ï¨ Aâvóõ4Y38Þ4Söû ³z¢9ñ=ðxnXkÄäÀÊsº{N­‡)szàʤõÓµëL j†×|XâA\Žàä.õòˆ¸Q¼B\<£IEqwø’BEñ¢:cúQ-I8:6ú‡ï½þyÃá"Là ,‚-é(|¬_0²^–Zb¨DröÔŸ`¨©(¦ªe6¼OÞŽ4)@o?ß¹´²ÓÂvYZf|¬êát;Ä á T™¹eÉ£2¢7Ñ—J5H¡ê¼Ÿ ©hˆîª 줤ô=z7U3ãÏÿ«¶®O …‡Úéh"—¸çkEòQú•Ÿa‡ÿ½ä4m ”¹Kð™ý*ñ2 SÍñ¸¹³Û.gãŽ+7,NG¸wN”ìEáQjŽ%s¿Ñ¥€O؈6Ó’P£1í½bZ=Ae îݬ+ŒÅïö?"·±ôrµDáÄ×ïƒá%4Õõ:¿Y[…óNX²~RJ˪pJK²fïðûÒ"YQ)Är–E-Í8 L”úïþ6¨¡Lº„E«tÇó]®3,Çbë¼f@ŠŽéi€Heç——˜Š–_ßd{-Ÿ<ï[«4Ç}‚AÌ•mñÝn3+V›Þ"å‹=°Î~“|öÀiÚ.,ð2a®Û~SD8?ý4a{Ì[³1'¡rÛÏæ‹u‚oiw6øÄ…§ˆ 5Ö£6A‹— 7åuxç„üc²ìÆ™ôè–7V÷U‚+qjtðªD’ðOyôt÷ÃÌK´»,&­(—mбáןÖÅ»Z­]jzoŒè},QíÄÒ §žö$èï"‘’ãÄ%˜QzÄÖ®‰WhÐ{ÈÐßbä /.å rçJܨ ]V±©«0W«$}ö]·÷Ë£ûfµ+C "ÅÙf6Ñ¡Ç(pV¶…s³Ü„ÅâEC¥ØÓ®Š\6øùÜUýýó gèÎ/ ò.©·îH:ç7.HÆÚ¹µÓé6G£¹tÜm'tÌfà2ŠJ‚ÑŸïHGÇΊÄ?óQɾÝr~“äjnÏÑ:/ÏÿúY¡Á¸6sÅY$Rœi|wè>ËÉ3Ù'îÏsoµ„ÙJÔÆÎ¿_ÎÄÙlôb+›£HmÐÕ­©ä^¤_6– zßêõN²YsîŽíù~bRÝîÐ.˲ÄÜæ4©& aã®8¸¡^$Ñëyøò ‡ÙÛQá9ˆH²ßäð£SÆæê«iAç²±aŸî¶#µz~Ȱ©ºá¬]žVn¤Er;¡ÿÒ #zØÓ{½M›S`gv‘ï$T¹ÒÁC_ƒÃÓžKAÆY/²r1Ûñ:ßýõÜ,Ýg†IˆL”–ðŒ)ôIò'’ÈÞ—iÉÜÌÅõäŽã€ÃQa.ÀÛÌçq–¨b/ª/¤i~ËúkMMRD­žbwñssÔÆPüªW˜äsóùŠ¶ÝŸö¼øŒ5=1pWMc Êîlf ZYlÌñÚç•Kb4/°–ŒðÙêŸ× ™Í®ðz#šÁé…gÆÜðmÑÊ?´U$žÛjš -â¶®„ü A‹ •úPd:^ ÍXG¿“æ§Ôf‹îÇA'+©›—ø?uÍ endstream endobj 402 0 obj << /Type /FontDescriptor /FontName /EOWPMC+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/Q/S/a/b/c/comma/e/epsilon1/g/gamma/h/i/j/l/n/period/phi/slash/t/x/y) /FontFile 401 0 R >> endobj 403 0 obj << /Length1 1572 /Length2 8208 /Length3 0 /Length 9254 /Filter /FlateDecode >> stream xÚ´T”o6Nwˆ´€,±t-]ÒÝÒ±ÀKìÒÝÝÒ% " ’Ò t)Ò ˆ4ê/Þ÷ýÿÏù¾³ç<û\3×ÌÜ×=3FC›]ÒÚÙ,ç …³ƒ8¸„ÒªªŠ....n, PwÿeÆêÝ`g¨ð¤ÝÀð›Œü§ê (¹;@<¿0H@˜‹ ÀÍÅ%ô7ÑÙM cᱨr”œ¡`PÚÙÅÛ bk(ó÷+€ÉŠ`ût»A¬, U ¸Øé¡¢•…#@ÛÙ †{ÿW &Q;8ÜE˜“ÓÓӓàÆáìf+ÆÌð„ÀíZ`ØÍl ø% fáþ£Œ бƒÀþصmàžn`ÀƒÁb†Â"Ü¡Ö`7ÀCq€¶¢ @Ý ýCVùC`üu7èŸtEÿJþ¶°²rvr±€zC ¶ˆ# .§Â÷‚³, Ö¿ˆŽ0ç‡x  ˆ£…åá÷É-r’š‹ɃY¹A\à0Äñ—DÎ_inYj-íìä†ÂaX¿Î'q[=\»7çŸÎ:@=¡¾ÔÚæ—kwN](ÄÕ¬(óåÁ„õ¯Í ðq ðrÀ®°—•ç¯ô:Þ.àßNÐ/óƒ_g€Íƒ°?Äüð‡å ³ðànî`ßÿtü7ÂÖ+8Àl bý›ýÁ ¶ùƒšïñq=ÌÀõë÷Ï›ÉÃxY;C½ÿ¥ÿî/§¦º¬¦²2ëÅÿø¤¤œ½¾ì ;7^üÿ;Ë?úÿÖþÛªaùël\ÿ&T„Ú8@\4<\Þß:<þ ¦¿V†ðß%Ôœf `úwô¹ø¸¬ ÿçøòÿ7÷¿²üßFÿ$çîèøÛÍôÛÿÿq[8A½ÿ"<Œ²;üa-T–ú¿T}ðŸUV[CÜþ׫·xXI¨íȳƒx9¸xÿØ!09ˆØZ·²û3H÷⡆# Öp†A~}q¢¸¸þÇ÷°uV_ØCÇþ¸,`+ÿÝÜ_ü°dÿ}Y¨•³õ¯mäæãX¸¹Yxc= Äâø‚ÖÖìõ{ÞœPgøCàA³?ÀÆÙ ëW›ùùœ’¿L¿‘€ €Sí$z¿€Óâ_ôÀ´ü 8­þA|¿ÐÃÿËq=”üäpÚÿùêÀ-`vÿ¸¹œ^ÿ޿ቷrws{¸ß3ûp3ãßß%0Ø l…µ8çl%fßÖyQ'Iáɾ5!Šz”yaÀÍ>QbŠ2[KÑÎË]R~%·Ø’3µïV“r½Èÿ<ê»ÙHÝäÍ{ÎN-·kKm™4wŽ8“êû“’v¿¡P?]ê©p¹Û‚Uì£LqkÛm ¾cCßBª'Q…œ€Rx§ZWO]E® ¥ÞÁº¼ÍrHg‹ïŒŒ±`Ý)1t#Î8:C-›VY´ë+ųöÑ—Á‘¡‚~ªÞØ`%­cú8¬È¥ /z­ÞJÞMA¹Ç~öc_KyB)f£)æÔФ­œý}”ÀÈÚ§íøm÷b‘wAöû¯nr%?…5Qñã»äšk޽ßúÖX¼¢tF}?B†ŒÖ™XÃs,‘ÿô ä»B'e­c@wò™ö$|–9Oí£Ë@óz~¤kk¬j±ô€€åˆáЀÆú…Ñ«€Ø>ÛÔOuS—¥1¶ûÏït¬IÅ›üYÈ¢¥n¦+†€bA¥G­ÂÇØ£$‹TUÚKÑÌâ‰Ú8…„4Pó´Z¨±OlŠëÙϬMBð0_ß®VËêPÜö›}$ °ùD·Ïreÿ“¨ú2÷et€y;“C2Lb— #;ÉPáÍnesT—ï^¥Xlf¡¢¤@¨ñóÏÉ MÆÀw%¦qØ“•Íьշ]óuˆ1gT~H%ÃëУ 'úŽÄGoEØÞ—¨ˆök˜HfžáÇ<­¿Ìç‚Dú TîöPkh•3N÷‹®¾‹Ny–Þ'gy‚·öš·#GmÐWñÁ  gD2òMˇ—Ô0®Fq%–µžÈwÀ’ŠÕÔbp~Ýhýú•qVhóª¯L+Ì€X\„ûÙª燚Í[µ¢ïL%!Å£BÛÈ7Ì–ú>´°›ç§BµCI ?5Ñß?a@ºÛžô ¼¸á4KåFò½¦äY ª<ýÔAÀÁØgžâ,9ŽzØ}oÌ,z²ö8ÆïÏwaÞu½ëº>Oúe×<˜UË»½½¼Èò lE•-¥ºß7n·OTšs›ÓR}VW¶™SÏòSîÉ%6Œ'Øšî'(eyOä…ȶ¹³—Wi$§—ΛÀŠéºˆž|v”£¬ºæj«O®+O’DŸºú.l¾¿ ú^ž|È™Eù˜%)Œ(Mùúv_°ß{äëíÒ{ÝÂ;LÖœÁ´%áê·aEFDâ7¹~ÃN"¢«ªœKs¶ÉG¸Îv¹XYÂúcMÃ+´÷¯ð™í3 §4;÷âo*g<›³ iÀmѱ"è rDü ªèñNòÏ î…4=¬]ïv¤*y‡róõMh‹,SA1¹Vj71Š·œ@öoù”«×bxm9 £ço:ÛsÆS¯‘UÊ/› LJ{hºñU8ºðd×ÀfEÒùCnV§Š´Kt|.Žôx›½‘tú7}$‘û·gó5Ez,„OrMÙŸ+Ø™$]ÞF©öYO2ÔyÚ8‡n6?o4óÊz£^Ô<}!ﬗº„Ì ú˜ç‰FtFj!<öe²ŸäPÖ2ŒûÑ}CLçñ-­íÝÆ‹² ¨ÖÄìÜ‹¨~ð¯ýîÙ‚;Œ°ÂGúÔo¹ÕÞa¯´:‘Ü|×C ¹Ý¾Ž¹Èi÷ÔÚ”ã ý,šaÂ+¯­à³ä án÷§?¡$%{G€…,MìJBl:mŽ0‹ª×äeƾ‚²šáb<°TzŸpþáØ†hÖ¡Z¶>^mi©¼4áup½„f  ÛGˆ×YI-¿^{™ù£ý™ì˜WÍ3¬sMÎËîõB]ÙãÉ;%… àx?‡ýÏpÊ«ÛãB1GÛo w‹žueGQá3~|ÒúÌEq!¥ÁWߣÆçù³<üψÊx¹¥¢Äð*¦ÆN]_O6D««½ÆyÍG$û& k»Ó´ÔÐæóHÉw›ûnYIzìe©çzySnx±•…ú,Ö(ÐJxîlõÚö2ûpÐ*䜷ûnwdËÏ ¸õÕYЕªíˆiµô JÚY•IjvEk7µ¸ï­³‘2· ¤Ù¢9é ©©ÈÞâL ÉñMô)$·z¾„|Žì(oþ2ÓRï‚·%Q¸V ¿ÇfI(Oˆ® è>ÅÛ0åÅí`#Íœ  £Ë„Ò4¿ýQ:ªãªØ%MÏR/ˆ'pëvA=Úö¤…„Ÿ,\¯D¢Õ_õƉKtŸê«:@¼ÅX©ö=z¢DÅ£¡ž®ž/ÅãLœ÷þ«¾¥ë=+ž×'$o]’E˜˜$Ѫ:’å›Öh)kUâ¾·ÊÊóÈ…4MZs—ÆEØÏ…öIrD¨Â+5±ð=ÛB¢T€öµ¢k6ÈSNð'l™ó"”ÇR!ÏFÊäÇfx%¹>Dó(>ÏÒ%Dž½?_±&õ@^bê¡´œq‹ j¸j2'Œºh‡¨0GÑÝ}I¬~ünsæûWÖ*'ضð«í0$®l]]Rä·ƒá”m)1~Ë’¦íP’pD>hcòh?,LÁbÕð}–מ(ʤrÉTøÀƒ2”pÔ¬eä¶®r)a³“4„ê]˳Ã~'jµEíjtáV}TѾá|a竚`ÌœjæËk£Ôž·üðŽÂØió/-7,â¦Ú–ÏZ‘RHŠÖKw (J;îؘ‹SOŽLáì4yšI· ’«% OmD­ŒRçøç"–¶r A¡üG§5BcZuÓâ¹³®îØD~’-óm>íƒjÛ2uD|ĦD×çãŠm!Hò/³w–ÀÃd}M_BÍÓkç3'ÉòÞCîcB„K©ÎÞ.ûð#Çðu¿ØŽ«Äõ¡EôÉ·`^ èXø°#u×BÉþYKøDÞ‚4ÓG ëœ1 Œ™7NV¡ez?o57NBD ˆ¯ vlýnà¹Ë«¢:‚Ì{ãéUˆµç0±—©½çV”±›û\Ïè:,³b¯\êÝÈmyÂ쟪e™à-'ÝôN»™=å@*³Ãûã fs ;§#|µ5óÎêí5i`Ꚏ™]Ϫ]=âI¼Ã÷ŒÈîΕdª7‘ÃÒÍõŽ€³/F®·G™Í8‰Gu†QÎB # <çD5|Ü ƒ‚n7ã{&ü; YR¤täâH‡0œäåAk4sv˜þFS²ùŠñT,ãû»½Ñ÷4ërM³³lê¥ZçlÃûWÊ™˜k³h5ã¿-?J ¸²¦˜j´ðK~Øt§~Õïÿ%LCXž Õ>tIEÉß‚Ö\kiƬ Ž7<Ð.pF™[†±ï«º*H-ÃÒ Åv± d¯º«!Кû<h6Y¤á3 9æ°µŠâŠ6£Ê¬t™î|ý‰Û`쨜XT 3ÙÜ/zõØK-MROFéÙ,Y—H ³(8cq•=ûJŠLv®-|Ë̪U+áQ·‡Úã÷ŽrŸst©[7½ý¶GdŠÏ y(n¨ê åœ_š¿3qaÅàF§;φ·|–ep»ø#K¦_g|yñ©ÇØ·¡}_†ÝE}X4ác{xø'ÿ¬Ê”÷Cš º8%›CC$hœ8m³"Þ%iÅ·ýÁO|äT2½/ÎvâTŽ.mkÔ–ò:JI¯¡¨dÄ(eo•ÉÎé¾vU]žÍ™u FáÉ›Ö3£®k<êyNWÙ$iÇ\ÿUôIñi,ù¶q1CÊRº¶GûùB9CókÌ:#`»8°ýö ¯P<ýÛÙxb ™a.Co;f¦‘‘#‘ôŠÌ¶º73;Þl²_N.¿Ìê]|R ŒÆÿ9pŠ~µ©Î¾Â apDƒ?…Àé&îÂ1)È IfØ¢ü·OD¿\MnÒ{S ,U²Æ23¥ z¹r)ÿØ Þë¿]ù8ÿ^ýž“šTÖIûˆÆ©œZ=÷xÔ³céÇ%x˜J€Õ…RŸ: è‡%ÿä`”ø¢•Ù„}Ñ–Éò[½Y»gìE!L7fƒ¦¯â¨…Í}ÇÅËu¯ÑçÑ ÛѶVÎÎgî0…ú]u¹¿_²ï!€2¬Ê‚:­eÞ`—Koõh]ðy(oË^Aô>Ó\µî\¶5Õ‹¸¦á§<ÅÇØ†'ݨô}RO3íêßéÚºv†mî$&h÷R¦7­ë‰ÚÌî@Ô;ÇÅJ ”TޏiÄ„jé£ó¨„?W‹l¢eÌ“°dùpåêz)ɤìsüd‚ç¯D_¹7u)/Q‘Ð>»Adåà!½íh7] àØçýð“Ô<—|û…´OJÀÇèu´'13¯—yÞ!ûÒê¶\WdA¶f9xéÆ#Ž'Þ0<{┄9©Óðs™ uç8îã³ñwUÙ¥óHL‹Öíq¯·¿È­Û6œ´úŽ\:6ƒç<8=W]"|Oì›Ovøwädòò4SËõ6ôñ0Í °Y¦R(ÒNT‰?³8–X‰h²~?"K韯­É¢ÅB??cõú¦wi—àbä{RNÐá©ÆÇ1ZT8m¯è|AšR›wÚÎ{SÕL¬KóåÚ³‰ÄϬË’Æ'®±6Þp•šK˜A=~!W¸Y‰ñÉkÂÓ$2œ¬ŠüA ±Jìg¿«§®Žž¥÷"$ßÝÙÙ€ã PI)h5™ƒÙšÎ{h^¿.ýVŒ»ŒI€s«0Úvª)\<œOE„³Ë5÷­Eæ3h}]YxõÙ ÓÙBÔ×0ƒŸp«šêy6Ø!|´Žeuýó¥qFÕw9⇗Æ\0ÕÇ~TPÏØÅÑYqñ‹fAßÄ–Oá}1¸ yeD/¶Ÿ€BØV•Þ}¯ŒR¿Òjz}ßRÚùš«ŒàƒðwJ<²ïÂx]/æ%{höˆz<…o NèÜéÚbTÌWZÔË%_‰…±¨Æ%îÕFxIßTª““µ;X©»^ÄÑÆ„R”30+.}M‘Hyý2®ˉéY…/¯kK ëó§î#[\fœÉ‹åûâK´î©m‡áoÞ–ˆHÄ5j'f¶ bÒ£i-ù™Ôîý­õ çkO€,@¾*¢b6Ž­ÀØŠQ½g›óp+‘’ÞßZc°)-.9ck]€C;Ž/ï—1YÜiÉTÇì.ù3Ù6oÊ(¢‰ø>—jŠÙÛœi”ÿx¢ÓûMeçp | ¯‰pƆG=€TnŸˆÀÔ»]Y•Jú†¸wÄ5ÂAžlîÜè«‚Â|N>v·%|³K’˜*ŸNzeIÆ,šI#1Ä"¸*YdËÀÂgç»E¯õ óqëIÛ1# cb²C ò¡Š®ÙJ®|¬^ì0ÓH}M2fùJwvòSãØ¥Ú’]!Õ,.ØëûhSב`HÔ1]Žñwùš±VäÖÊ3:v¼š>fîEù~Ô½V\c(H&´øç¸¨Ù²Ï“(«ØzbdZö3mÞDzzâ­sÂT?ž»WaöAMÛ?A¾ßnóç .t”©øVbeuC•tS—pMÉk´)¯©& o6Þ :–N CnÌWëyY5CAçÞë¶ :bUgôFÕé R}e@{pâcqå[@ý¨ï]Ñ|û”ýçܬ»=âHÚa^ ¯ô¾/Ò©íÀ+ ²6ÈœÈcBUZ3Q$5]¹Ì…Ôȓɨþþ¨´.µ,VNǶÇš£Õ®]DóX G9žgÇMõ÷=ûoŽ_iʘåôH0½ ½{>u«›GÌ×›­L‹8Å'£swŠÉÈtâFá(Çf,Zh@¦iã%½Ñ™f Œ}š œv Jîpm]¼ûx-|”ŠEñµ«µÛ⻨uw¿éä+=:9~{«¹Ñ@Bf¦@šÆIkаhw1h­tßçTýf0Hiâ{ˆåTèpÙDÈ¿ø:õ$;‚ûœd¦*IG’°º¸´sbäçi ÔG\%]S,çyhT¶êÞz·Å·‹KÁÊZ‡,[i•™D¬é…kÚŠÉÔ—‰O'‰èr¿¡ ‘¤J©Ú¿5î üÊ3U½T7t¾•%o4×Ù‡U5¿!_*ø@‰Ñ V»:›¶_çÙ}ì^Ž‹Í­®6aA^pfo¥iMWÑtéldrHÛ{¼ïŸÒÜ—Œ*¼~ÄrHBÔìÍ…»ßíÿ-sÿí®RÆ„í!²sãK†©¬ð¡ª“¶å ‚.C %áVPyò³ÝæÅ;›Ð¤èË·O$œÝÁFu}xÑ @ƒZÛ­(‰ã—;»š Sj„zšWÝq:#–‚ˆ[ª­ÕJþ.T.ƒ:öYY)KI!{Ú›ÝÚöWBsYÆŸl‰N–3”¢®ŽÄæH³Å("žã^ZÈ$e-Ô7Ï$Hø, ä¸ÎpX¸¬KïžÉòÕûéÐËmÎ~>ò&–‚G_šæÓáÜü*7._™T±§ÖMÕi/Ãu-[-ï+ð€vW"Då›ÒD}’Ó®~–ošàe/sN-½®8¡Ïñ¼Ý¼A'®ït#B²‰û¡C[{ž8A~n¾ö·ÃàIÚ ð.4tlm5Ü6MM÷‚ºÛHKl-WXüÎ6&À…êp%Ê=È_ÏŸJvc³Piíœ÷ôÞy´ÃÐkf>9 ’šM4–Ú]­±evó5‘5îå$9vkkjoï¤x÷iÊö,:=[1µpG%ϵ’ßñÆhÚŒgÄJÇZ|ä "!ýõ…/"7_ÈÊMEœrÓJ ÷Ȭ|§®¢` Û‹ TËŒEI¿ç¹z8Úgü„uË€.gS}ZËÏbcåcÐt³í¥üÙl‚‡6±YR¡®T–iívâ ¢^n¨”ƒãˆŽs?Ýç8l\“R É'„–ÍÎâmçèU"dTdúK7ª¹‚Ùp¥2*7S'4Ý—ƒ 2+;¯N2å_¯ññ™q 7}\Écæ~jh¼ÚAŽëOQ޲ïÁÑšÓ>™Y¡²ß]L6½³2œˆK…­‹¢>t[_Õ]=ö®±:;\»Xàο7Þ°¼ÜŒ0,;äîÜÏÄcõ?ìÌœH@û «UŒeiúQ)Þi›hfÛ"¼}¹©Ii;s×€u ‹ßjoâù”üó}{ô¼Ù'~ŒH¦ìW嬣aú­Ø<`tW<Ó^$õt †þfŸÃØìu¬ÛaiÙO䕿H VvüvÕ½`†˜íFéòWxЮ œ*êÛGS9¥üHü›æv™ÑÐ ª]j“U—2þËžë Ö“É–`üÌ :zJÍËþ“1{›6/? +²’ò@}DR¿ZHÖçk ÿMxmTûÎHE‹¦!ýüE|—ˆ0]Û$æ8AL4tˆFÀ·ËÂCiêÑu!´gé!St84h¨š+ÌaæÆ ‘wÚ·üõãÙî»"+æ&dh^!G1`¶ ?šâ¹Ñòã.:¾1ÆðQç¢P}š? ˜V?{ÂhЦRtˆ˜Ù¢¢Dá»¶Ú­_ËçÜGk¹Ò“Ê:íH!Üå3†(L–±Ö3bÑ<’ÊÅ ¶ÊQÍ!¶2dR>?½ÊúIHü)¬CÀ:Ô·B´^ZÁØùF⤛Àœ²µŽ4ÐËæWš*±SÁ¹ùôØâ}¨÷˜¢EåyîÕŠ¯áIù§'Û0‘R¼¨o±s÷ؤ›°»ŸH›ÒTÛfÎ&¼ÏÊü=ãõùæî]¹ÕžÛl5NbKŠM…º\«ùÆÊË(4˜'wC]Bš¨¯“L"üZÇ™u÷zį[ÄÔП¤[¹êÚ}¼hL7›îáⓘLV[…l}”iÐQÆ!²÷ÉB°^Ê7)B˜÷”GŽqL;…y~ö<×]åX­5Î"XNuäó;c‡³¯hœV6ÿ†É¸þõ]æ¥\Œµ„EàZ~µó#ÇEó–i`Lͺçfþø|â8Ö´Ð=“’SÏôð>ºã®uÄÏzßVGž/¶¼r°¤ïgÄì¹Æ9+q:ÃP”êílLys0¦¬âDnp7“Jäu_XçFãp÷cŒÞ‚uD!íÚ)æ·fôÄ·Òî\êè¿8àܯ“Mq³Y1ɯmt"\͉ڴýµ»·Nj‰•ˆ%ûY{<ºp/ÞºU)\àäúôåFq¸àÛKšSî— 6º§wã—ÏB>Mùg&xGhk™£NQÌ=cߔ֙‚`æ@¨v;ðmIEB{}Ìzie0Xøc°OÃKcB‡ Œ˜î#Ýæ7æ3ØôÑÓ²ö¿¨Egk«[‡chƸ|²Òì6§JL<ÑÝùAòSä•l¶4a²™%tÞ°älI }ó&•[¥6Õ¨dlƒ*ŒÊ³ÜäU,g¢T}—qÙŠÇ7Z¹Þ¸‰‡±ðGìÏ¢|ô¾;F¶Åu×è.B£Æ\ŠXÏucäý‰“*ŠùîÂTÙϬ˜ê © ¾§]ã…öI%ö ‚}wÝžÒØäWñØé*Ƽ'L ®-ÎA‚>¢ë㹚(±7~q‰U0é®NîQ\sL?;+œ'´ÞÁÂø4Ü¢¦E’·â<Ì’Z ᘯ ¨±Ì«±ŸîBò,#il´bÉ"¯¦‰XoÏèe®ëe„Ê\ú D›«M’[Glõ Ñ”-ÅÖÜ|_¤Æ%i:xÛøå”$ÂpXâˆØé[tí¿CWÃ.^ä g«Õ]Ü|N®ô¯k?b’‰€™T÷ô+Yß­øD^óõ ‚ìmu§޾œÂ©±ŠîÙ¸¹° •]Ú‹÷rOº?¯¬©¦¹LEñTÇÏœyÐžáæœðrüÀ>RuÑ›…WÙX.7.jùŸX霹°P]ÎtãÊê8ú»Aï{Ä‹Ùæ—ІÊ}š?ï`6ç¹s6ªšX/ûÎd«¹è? õ,”Ù㣩¿zwæôR€;nñ}+¾òÛúã?^"yÜÖêËÍqu;Ree]þÄñÐ4ÒdëçCÆ3s9ÍD‘AØÏQ±Æo aãGÓ[óCw:ÞÁ¡|t½Ü×¾Ù!lî|Ô¢ö[sÜ5Ú›µµ—½í²†â•v]üuä:NOïÆùMÅ]p\7–5'†ã&HÁ“mË&¤Ê$†&œjb”ŒfN¢ñ®µë:¶ØL3‰à—Þ…g)ÎBÜ7ç„WuïéHž«M"Ú+é"¦« î>¦ŸÊW›ç'6w¡sgJ\"AÄÔ+ëîÅ€i6öq/–˜ÿxêTÈЫh0­#K*%æ ßû°ù©çpüJ•ùnÇ“èþØ‹<å}ß}ãʙڪž×ØÍõGT¢í?TÁÅ}ºÒø–Ú{õãÞý»X:ÚÆbBsòòád‹ÿîPÆ_§Ä3;H„ú`…º‹ò…{[WEnãÄ®‘ìšû*l ͇WKƈuNCRÛðzEàOQS>~Fs½ûv1ýµŽ¤˜¦°E7Ø‘éZ)• Ë´=kÛwê»Ãc‡ øA‚¢B¬%yÒ„IÃ}s4sRІ(1À‡ü7w•ÊØ?5’àîÐÅ–©HÖàËãSŠÅ2bdÜÃÈØk˜›§[èaZLgƒ±]+&üÞ[óÞ†÷%Kô6Ê둸ÈL%¾éýSöyàY½3,Cí3¬JYD:kÜ(­W8ÌåG§¼2ÍsI–Bµgú”7ŸáUoëŠ?f-®÷Âá”.L~LÌ{rFƒ^‡žx¾oÁÜ£sضÿIWõ} endstream endobj 404 0 obj << /Type /FontDescriptor /FontName /QOEQKK+CMMI7 /Flags 4 /FontBBox [-1 -250 1171 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 81 /XHeight 431 /CharSet (/A/N/Q/a/b/c/comma/i/j/slash/x/y) /FontFile 403 0 R >> endobj 405 0 obj << /Length1 2691 /Length2 23511 /Length3 0 /Length 25024 /Filter /FlateDecode >> stream xÚŒ÷PXÓ ãAƒ» îîîîîÎàî.‚ –àîÜ]ƒ» îÎìî»É~ÿ_uoQót÷éî§åœ‚DYAÄÜÑ(éèàÆÀÂÈÌ SPea03³123³ÂSP¨[»ÙÿÃSh]\­xÿ0sš¸dâ&n ;G€¬»€… ÀÂÉËÂÅËÌ `efæùŸ¡£ /@ÜÄÃÚ ÀutºÂSˆ9:y»X[Z¹Âüï#€ÚŒÀÂÃÃEÿ×q€ˆ=ÐÅÚÌÄ `âf´E43±¨9šYݼÿ゚ßÊÍ͉—‰ÉÓÓ“ÑÄÞ•ÑÑÅR†àiífPº]<€æ€_„Š&öÀ¿™1ÂSÔ­¬]ÿ–«9Z¸yš¸ µÐÁtÂÝÁè¨ÉÈ”œ€Ëÿm@ø§6F–Ýýsú—#k‡¿›˜™9Ú;™8x[;X,¬í€%IyF7/7z€‰ƒù/C;WGÐyk;SÁ_™›$ET& ‚ÿÐs5s±vrsetµ¶ûE‘é—P•%ÌÅíín®ð¿ò·všÊîÍôwgm=|ÿÖæ¿H˜»;1i8X;»eÄÿ1‰àË,nfff.6Ðô2³búå^ÝÛ ø—’å—ÄÀß×ÉÑ `"ô·¶‚þÀûºšxn.î@ß?ÿEð,,sk37€)ÐÒÚþ·whñ75ßÅÚ  Ç š=ó¯Ÿ?€ÆËÜÑÁÎû·ù_ýeÒÖU”T¡û›ñ¿:QQG/€/;3€•ƒÀòkȸ@üÿëæßüü_Reë’û㌃…#€ço âý‡Ç?cAýÏÊÐþAÑ4Ë@õïÑ×gæ`6ýbùÿ¼ùÿ7÷¿¼ü¿þÿMHÒÝÎî/5õ_úÿµ‰½µ÷? Qvw­…‚#h9þ¯©ðïUVš[»Ûÿ_­Œ› h=D,íþ-£µ«¤µÐ\ÙÚÍÌêïú_@îí¬€ÊŽ®Ö¿.¨aÿGZ83[Ð…â êÕ_* hŸþRÂÁÌÑü×â±rpL\\L¼áA­!€/ hCÍ^6€‰ÑÁÑ t¢ç°ptÿÕQN“È/Ñ߈À$úq˜Ä~#n“øoÄ`’øq1˜$#“ÔoÄ `’þØL2¿(ºÜoŠ.ÿ¢+üF èŠ¿(ºÒ¿ˆ]ù7EWù@ÑU#PtµßˆÀ¤þrÑø@¹hþF \´~#P.Úÿ"Îä_ÄÒ™Ø;ä×Õ÷¯ Hjú24u11³‚Þ! ·ßr¶åoÍ¿ ]³È™™£hbþ'agÿ%±·ÿƯQb2ÿ‚B{‘þ'ç/½³;hý~UÎâ7XüÙAëßø—ñoÈÁö züŽÈòKðÛ9Ç/sGw—?¢ ,ÿ€ ÿV¿ùZcåídtøÃ$û#>3ˆ’ÍÔÛ? ¨dRÕÓþj ZýöÌ:êÚ½?ô “vüDÆé·äÌ ôÐ:ü§µì,ÿHÿÛX6P,Ь€Ô?L9ÿ’Y;þn;¨8Nvî®ÄIœwïrºþuü;4¬¿„Žn@sS»ÿäÂÆþ[ñÒáùGó_1˯nÿÑ+PéçÂ:ä ´·þïHrü²züÑ1WÐK÷/)wW;W«?ƒ¨ÿ z,˜Ü¬\€Ì-¨¶nžŽùpÿ‚ÚìñeæùLj‚N{ýAî½ÿ€ rùüNäÉèòw¨ÿ\¸fî. 6ºýõ$‚nãÿ῾ö^@3øÅ9G3¾P›šÐÖ»*|O†qiŠ­Ï4 ¾‹.mîoß|¤©Ìx·îr#òq¨ee[‚úZx‰øÙ÷ç·º7áÍI*-~OF ªS;-ð “Xýy?EjûáÔ…wýžý4ƒm!¿wÈRd9»s¿UÎA¿óì•òªí+Y}?·£²[É)‡ðTò!V#F?¸p†"Û4s‡Æ–íÌ yæúfíëÄ+±l¼ÿQ,[¾¯îë‡ûYŸÕ2uV×N\r\]BÈk´Ñ)J_ÑýYìyߢü•þ¯oüùÄ_‘è?­0 0WZ«F;4öT{Œ.¶³üÈú¥ÂïGÿ‘T]܈aäBª„YÙbîVÍf $Üo·]m½Ñì²°ùD°Äó½ö0ƒ¤cõ3¨©Ë÷±Îyuh¸Ÿáöý§æ»¡Æáí.­B¡>!KOZ +½¨•eÞtÂOÐ%ncZ@ ú%ÜOÐ&aü¾ïÎEðX¶ò˜™u¹¡{ÀG N8²üÎ?ø—ן)¶oÌ ÎÛy¢„¼†p*¾šv|:;Ëõb“0ÎxO.Ñ™½G¥ÂW¬Ÿ )a:Û(Çb/ö&–OÜâX8 Ïg—‘êÙ™¯ŠÒçmsÏ“Ëx¢Y®ÑÏ‘«Bòã(šal¿>xP4$¬—çÆ|릴TÔóÀQóþ¬Ü3Btèæ:Whvd»jÐ×NW¥T)‘hˆ‚ÛíÙ8S²cuQûÆ8d-u‡í±Î‚'Oúq ªüE…>¹þp¿Eƒñüܪ a¬ÈëÆ Öš6¥;j0Ä ”Õ»ËdFmCšç/x¢øjêw9d>`=óßǶIF¦¶É}íÊõ Ù{›|1©v ”$óÛAi—ëÔ1Q/QMkž"uKÕé3ýÀõ£ÁQ(Q²7mlÌ‚ãGÒ€¼bªŒ5ù|:Œ×¹¤/6[>™ÂÄqM®ú5k×üa¥ú:àäëâB‡p“»Oœ¿~÷’ÊVq(ÅO‹Âýa]I1—ü…d~ ^ž »ZïKêÕv~ IŒE˜ö;X³}ÔhX°mþY*ŒÁš¸”sUte6‰l’PÞjT*Ô—I‘·²È•ŒÐ‹½5b²ã`²n%`”=¾\0ñœÕðdÁš“=“?gç¤gñ“.£™Š‡ßJÎ[z’Jr$Çyž«EûU¾;ªðïB@˜2hàÏ$ba.öƒM}åo9°?­k¼_ÈX²:[Ë ]/?‚­¯¯ªJÂ5ºäJù‰…`4š­÷±ý’ÛK™Ÿe–ðRÀmâNl ‰3õ[“¿‹œ;ËÛcš†´uV´[yÍÔ´ÿ7ÑÜK€…þºói~só.»»‰^ºÑ­LsNÕimåfÿ®Y4ó:aé…‚ì½ÂWæ²Ñ8_Îuœä9ý»„ËWç¡4R6\[ÈäLõï:rŒ+r8‡C4]ôØRÃr¾&bº¢R_Úà‰½—©ßFÉQ½ïaUbžÖüTÁ)£LNn÷xðPÖÄ„½¡×‰ós86}7€‹+7:OÉJa™lZé~+;Š›Jïî PÆÚ‹ã³æž˜š>ÃI›ÖB[€Ô×T:õÊÓ1^´.Ô›+—ŒeFƒ32q»©fùÕ­œR¨xûÃDïÕ£ŒúO϶¤ÝVò,sE}±¦ô¼ñ%¥›¹ á|-V/â}ngyóïÛøŽ?~°h2Å Š W_=“0'véd;úÜ“ßOÞQô–wL azn®m²8–ô¬*Œž…d¬FÝ÷³EíO$a°yëYÞÂ.¤˜ÃzsÞ¾ë\ZJ"…âÈ;p¨]xR3üœ®ªü"åsWÄsˆ#0H•øƒzô¹UæÉJñ¡nÎ÷‡àígHy³Y{Lhëú‚NÊAR…£Cû^áF­Ù÷å8yåö+¦Ì‹Ÿ¡iŒÓ~¾éÍNZOb²¸îÉ´k£P–`Íæ%Ò¡Q•gÚå/Á:á@/û"’»~›iÇWá;Ò‰@MÖ¼  í “H  ö,”ÛWuÁ1µ«W›ú‡‘Ö„©ÈK œŸ£‚úÜô'-Ôõ‚„6$ï û¯œA¥YÕ†m·&n_ˆa…•X~f3e‚Iž'7°y‘¥n›!+(ÌOJõé>¯êAÚ—½6ûLÄHÂÀ¡Ù•Ü—’vË V¡4Eã´D ü÷4iâ¡VÔ—­qé³Oƒ× OUѰš°òÛZ$c KÚ”3÷Û䡦‚¼î  pŒôƵ5#P±.¯T²*‘Ô•_¯=B²îáÃô‰N/Kx!.VIMIîXçñ¡1Ætv¾x°·@•Û¹x#a lN6<éue)\1L£ª¯cýº¥,D´%?bÑ*ãèL‚Þóù®–ŒÂ—«°aíkjò-d·ŽEL¿EB«PbTú²aMßÊÍ]:GrÔó>Ìò«€¾À†0©äƃœäz¶éãç„vÍàvÔv–]™K¦ßËcWIšöKfSfGô7ŸïMØUX°«F¥<[ΚùM…£ù€DWCÛãWóéo}º`ß”çîåñÎÈñÁ5ø€zVâ‚•ŸSâ¡(Þ­ ÅÅC.#oýB™$²`‰¿é`Çé . '©TÁ/·óSy,O郈ΰÇû¤Àµïv9”{õw:;óuT‹ã`ZK“;!”9ÌÁr€\Ì4&k8ëÅïîp¦_ðºÅà¹z}D¤óg¿²Ã{3^èey}ÛZucq//ÉDt™`ÔcÏU[`5õL¦3¸ç(ñp¬ÄGkVúHSIˆ~”òÑq9éçyzá¢élIÁ®rHTŒ­ì'a¢|5Zù–"U»yvDM$‚h׈>uÂb¼ÂíÎxéNw²½Húp)ÈwFè3T7EïØR¹žå9ÈüÙõêÜ .š‹¤×ÄÉÌþ§u€å‹}Bl½—¦÷uýêT&©™OΧB'‹.¤LÂ÷ ©7 }EŒ.¢<‘ä˜M:båb,½n%æÂd·EÜ`“¶Šá3ÑrUàYÓ|¹‡3IvÁ’Ô0 1Š—Qà|›ùæ/eÝÇà‰å(Oë´­QüýÙ·ûÐCÑK ]; xøë¥âÄ$ŒÃ4r¬6Ú†z)0U’Æ%ó•Ûz·¦PCÉKâÛH§ØØZo•yæyŽtc]yÂÁ©Œ·Ë‰Ž\–´îy“ó]§¯’‰…a,B3 µVÃ(YÙ=ÑŠí|vÉgXµNÑkÁ;'Ì÷:Ïú=éÃ"¦F×I«ÌÒ@‚PcC`+•MQXýhG}>]OKÔ RÙa²wRäã×zFùÑô,/¬™DI§”oè~›®dwÕðïèëÝë¹*‚ÁÐL‘Œ¤è|<:»'™—ÑÙ)šþŠ+G±o–/QÙtDô˜. º8*c€¤Ãr »œnFµz;ª§ò^ÞªD‡aç]€šË‹· @AYGªxv’ˆ*–Àªx [ +:L˜#(qu}Šþ.#A!³'¤qH\Ú&<eÛÓó×J ü.c·àÒä\eeö„í§Š%»^>Ê”J2þ½¥´ª `<ÅÔIŸtãÆF¡œm30a5iÊþWèÖÄ( ‡7zp¦ä;ýmÍê¶¾K“roïÖmÞói:Œ/f$¹^gÐ)ïL'^æ"7™,üÙÖSÒŽ l“J§ –ïQY(¸N½™!ÖÖÒxöº©olÒé­5Dš™§° ‘n?V’~…û@ltßÍ·^3~˜°%Ûä‘ý¶&Ø`… ž|ñM ò2•˜•P0G*¨Î3aËñHU×¹pR9N&\šIY]FªH YÔû;G-ð:ê‹8°ÆB²eãùI_›ec6?; ãf*»¬çÀj’º§ìëiåîá#ßä‰ÊϧãN&û†Á V?•l!3OÒ·î˹ݽWÈ].RV/?ºÃ[ø›9÷Ðqty<¯Ìf>àßu½Õ /owˢٵ敾ÈjW ë]¦®0*Jj¶¿8OÂ` –¹ïoô2HñFlž÷ú„| K—ÖÕ§ˆÓ8öXè#BšôÙ6ÄÙõ¦RTßjj`À©Ðþ¹!Ôj!›x‡Å0ÍzKh½=/-¼l1òlÛ¤Êø3ýúÙƒ*hÀžjLm»[¼etÑÎû‰‡+ +QçzN¬¶¼Ïþ Þ°¡RÊÃH*ýÍ]ý"KÁ#²SÌ ÂËFìèÖü{d5K¹C„Ñ£¸ ¿ Ý®E‰%9áCQ¸ð©Â½ñ‚á÷oRr7|¥0yž?[ ~ȸ8ŸŠ±Yˆ¼[×Aµv/ ê^ýÑsÑ6uzôMÇå€Püú†7.vÉœèj>ä* IÄ ñ'CI<=ÍV³IIÞP³ÕÖÞL¡û+¬Ú\"n(j¯º\±‰6ùOË¡¤¥½-¯h|ç\o(ê”×Vù™N³z?+¢Nòñ-t‰îxÏXº¶ç2]ÞñÓ½Þ‰¼¾ –Ž‹z»ÀE`'þ¸±û0žTÙ1æÜJÄ~]Z¿á'þ Óï©Gc“³l´‚A¤(½Êñ(ãïí£_r»=ñº Lˆð³}v­/äMB±Ñüm†«ö†„s£vüû½wOµ ß¤î8„»~øÌì@ûÖ÷m¥n±ÏeôÇa´hÁ¦=îcb'ù)ÊÁÜGÈS9cA€q]E·qJÎÉjÇk‰P³ÇHK¿¡þS$m"æÜ³Êðf‘¢©EÝrkûZèGR¸ØÅB ¸VŸ©KËCË1“âÝë$³¦Rù{е¼W›JÊ&!h[!-o^Ù…´Y ºãÙ‹¤ÓÆrÒç/Ò »&åŽ5Ÿ5Ž/oó'¹húó.S¥â¿@4•‹p‘øŠ¿Wågbu{V踺wÝ)z´å‘ѾJ´È-Θ‚Üzx~¤C_,Ж8*LAd<Ü$éœì!¥•]VãzÛ¹¤CT K°}j³ŒDHù}Qd_‘®t7¢ã[ ,ÚšÀuŠbö9§Gžºj$Ù2N…ü§Wöñ“=¡t° ª›£Ûžû@IlsM)ù9zº=,WÌ2©—¼ C¦¦b纨¡p«˜>ä²û{]¢2ŸPñb7aD¶[ ZZú×}…aA~-+ã ­‚¯ó9C¯›ÀcMqÙY¿OÍÍÚÈþS…b.QƒØýêƒ"ƒû8ÏŸs“•ýù £H§[ån¦ÉÆÔ³ßJÞ>èïá=ßÎ$AâA"ð¥ÂuúªÄõ{ß!I»Ïp¾ªô=O~¦ÊTa4åó"kú@ÌvI¬6Ê[bcŠz¼LÑä&›ð†Ip8[éõ$ƒÐEs-¸×Ë êL« ÍÖé×®zƒ »Ì{HÇv½½ìII>zEÊ"*tëâ(ýjE•.™ é™±«IâN!uÞcáÉSì=ÅW„7jÚ]«ÌÕüe4-VZs0Ámìß$Å­â–jÕ!h Õ §ˆÂ<ýŸé"t›$0'ÅÀ¯*otbU¡õ>Ý37gl­ßõáÜŽ_^t69Œã°%ŒÒ½ºbC 5¾øESi'Ö„‡J #kÌ¡pÊ è§†î­Ü>ñi=B ÎðÐÊ0ûcM×ë“ú.`ž²i,ùôŸ¹ÿ̰€]Ì »V^/¦‘ˆàF~÷¤‘ŸñàISqf‰5‚é<ûanC–ÿ­r3ÂêóB~F««#Ã7áDx9H)®¸mÒr?•ÉpˆÝ’‡€î…«_Ø;ÿÜ^ùÙ:5ô¨|Þ ‹’YûÖÂn¶Ó¸¹35Ö^Ü„9½ZóÆ…¤'Ù ý•Z,¢r‚ ,³£%œ §{d?˜·v–©þt‘=——(̊ΩŠÜQYnz9b?p¸‹º°‰škññðŸŸÒUBëôVÖø5º´y  Þ-- ™ÑÝPlTÃ+¶¬ˆªq𼿠éª-ùBÚ3×›Qk¹¯~кúÃдX«f™º†–ã Sv·Oƒ“´fˆ¡HâRÞ£ã“ÏŸÿžÛ埈¹Œ¾1SD°?<ƒ œÓGÄîyô9*CŽv,XŽw~U+_mG9z¬B¤DŠ*¤«wå»vòû¨Ä)뤴2Wv%ѱέ!†É!4 …„yƒ´AÑÈ­¯äh`ç¬ü*ßv·v!­ 7‰¶FªsÈ–|Í œ<§B Á¬¬‰ay\’Æ4||Fü9Õ .”¶±‚#ëÕ­*êN*ùŠªz…Q·JŽyÏZJœ%Œæý›åxÂ${óŸöE ñ*°÷ä*VÄù(ÜVFçÂZ˜ wÕèš´ºôšÐ³H?mÇ¥EÉL§™á‰¤î$ø>” ¦B)~ú.ÙŠÙyõÃÜñîÞªO|Á\¬QšMÅak~4èýè[+=,1J$¸†¾¯`Ö_ý^^.unë!‘dì Ñd›D•[%s¢±F'²-IÁbû„)1äÒ6§9g'õ³£S7ÈÓK=0)øÑêÛÂ6My Æv*1ÊÜZ„0"1Ÿ!tkiGÛÚê X?U Wôï‰éy ¦ñ3u[^®Èµê)=Q©ß5 Ç$´.ƒ½•m¼ön–Ëqà ïÈÌ¢\ñ™È6Eº½¹-û±**êtæ+øó›!b$ÒGõ‰ÌŽÑ”zL}÷Ïsó¨S&›¬½øj|àþž¡)S…(Hi ´q‡>¬ìÅf·7òìäç¬Ë’Õ0¥?=ùŒ·Š6¸hÞ–•õ,"2gaÈL^ž.膴ØY|û\¹ÊÑ~º¡¿ìv )€4ÜJ¹‚—û‚±Uæ™þŠ9§½í!±ËcvÀåµþúf{ºçˆ²ŽX'èÿ¥·ØÓÖ[¾G9·âpöPlc÷mÞ;¾ËÅÓ™šÎB=„úy»PÝfËI;—m)Ö¡ùjÃÍb2‹Ü-U>¤W•€³®‚ªÑ~˜ßҢ¨åâZ‘SjdÓ!?ü™6£È¦q>aW0†¦ì§‰Óˆ¼¦7Òhß §à†»>)y%µ–hëêÅ…H)¥ß¢I!‚Âw:îÆ¦ïM.¶×æeÛ4Ǻ¥~´FB¯z|Z?b/Ñs}à iuÁìØxÕ¼7=}¡V;v^£¯õ¸ýeªõOz¾´Ýš§]”¾¢ =ªD¯Ãö¢M9}ÉÀ £c`Mõo’Ü*ªÚ‰«óí~ä•€NTœ9,¾#F¹tbÛ } ô­ù@)º’ÀLq•b†ðÅO%¯…];Flo(@î:¡Aq÷Hé9gc­¹‘îèÈÖ© ˜SÛMòš˜Š1`ÕYãºÝ1èRØŽélŠ`£µüÌa™./Yø2Ü…Kt¢¦I ;¦5ʵÏòõ0u_nJdÁV$—Ô î½¢7Q}Æ0Üóý _Ö“åK/¸–˜t3dô!þ9Eì;ÃÞ7>Wy‚!S59ðÎdh¨ï$árÌäVÕ§ì`S·‘Ðoª©Ë‚%[² `n;R4+Ø‹ÂöDD®ˆå©”=(G²VB;h¤ÖÞPS"UÆ@¿ð,j¼ˆ%‰z”*~ÐÒ3§,bB! TÁ‹ÑáÒœÊÕË#;†>CƒN7ßï‡óU3¦òk+qk6¤+¥ô6˜ÿXPÏÔ0sa¼Ãø™iÉïËÓŠcëËšÌk‘PISïP±{Ë”–ÌwdòC~.àjûãOë•M›[ïe}¡ÿcò-T¬šƒªßø8^fŽ9çf>çéä’CÔ¸šÝAáä:¿/dЦ¤øM ÜödBé:–ÑßÏ9¿¼œè¦s$¬ÊÓ„bãNÈS%<λç²*$ZÂDžšlg|¼¹o6z‡>&´3~­ïÈÐkê¡_0Lb* ý'r!ànN‡ð†Å¢­¹óÝŽæˆ VDz²¿/ڕˈ’ atXžÈg5‹s°qƒ÷hQžõ¥è¸9nÄÕW0üG¦.íu+±« „‘°„ñèil¤ìm¼äNÛmﶆIË {“¶å†iúÝrw¡ì_£ƒËqÏ‹Áœg»o˜Øªm¨{ <_µ˜•¤ b9ú'³kY³û’ÁûÕ h=ï®É _yÜÖ'fOš¨kš!Á‹÷ÈF›U"{ÒQNv¨ZÈa!O.¾áEFVÀÚê‡éCظî©ôŒH>ç0‡Îã¼w‡îŸËÜäKä„: ¥°çÂ=‚ðÔ~i\`L øq x2+ÄNÜW0Ôú˜«´®›æ–ÇÛ%Gг‹ykš"–àƒÐ\ßcáÒ“….‰¾÷9¨+&0;Þ\Ê£%Øä¥W"” t¶6ÕÛø-%)#Sä)³RûŒ„Ê‚¢fÄ,¹=ÉfŸq§#{·ÎKIÞp|kD> ã0…Ä—8²Ô6w×9䀭ÎZ ç¨Iˆµu¦vÆÜö‘ ¡4¿§x‘Gˆ¸.ü¥­ä—œ‡í¢ <ñ×'†DmâäûÖ½òÃqüfÅñ˜×ôœÇ§¡—ª¨zÑ<§KX™Ó)rí“îUŒx© ÓcäÊàb0S&f>·Kí/¼V·ÍIº,skÂÆ´QIšy‡&ÆDü±œ Õn±ˆßUí0¦B.¾g• ã¶¥âôf¤Ÿ¡Ý$f!“åÞ6¼=~Å•Q~¬ŒMÈC<¢Yy;¯p é±ÄNi¡ë:{®dÚÖŠn™”vÖqóCj0Çù¦h»ÞÉßÍ/|ØÖÅÒ>$F´@sÓÔÞöåëR²ég¹Þe@8>½òu÷°÷ý‡ˆž†fß ðä´ëçwM#×Úò`ÑÙ™Æ~šæ Ê8rcVsšÌ0²=^‰XC Ë„-‡¸4-Ÿ dBÉ¡*º‘ö\Äñ¢Þ ®±ø¬c¨.–Gq$2{;³¤Å:É:’HÍ4¨î4 –»õ ·OéMß"½Ü ;ytãe¥ Ö2u}ë0·ŸøÂauðL®½íßw¥ÆE>ÿvÚ³TC´‘€T–«>ãKo($Ú8ÄÙ9 T¹E¬..æpC$BŽ„öï^•¡©³ÍWô8ÃtÉöƒÉÈæÒ‹_eâßÎXf×*KÎÄ<32K*(_êuãå"n!wÄŒ¼ëH{“;…A] Aè;íY TULjm3!iXhÆ9ƒíǪ<øñ¥Ÿ¹î=fnDø±´Ò{¡ýZe+9(<ª7”Û LÓ» •NÂ*pÛ¼âìN%%Åùœ‡)7dnŽ„ú~'ˆó…:îµæiVõ·®¼×HØI‰F+" œÛ´uË ôwUOÝ„HzñŠsH1u¹¦W¨{¾<ˆ³w#ÝÓ"o¾×a«Òjòº3øXLÀÍŸÝ×!žQ °1„&^md<žÆ½ ‰PÍØ²*¾[áÄ´’É—P1÷ÄïvUò±†ª*5ΟìcѼÒdÃkâ=Îq–Çc\ò ½Frÿ§šh°›QáÕƒ>O1!öF›‰ÅÞÿÌ·ûˆªÂ|´únLØk¶Þ.W]Ú×¼Ÿ`9¿|Kuò!ýÂ(9âDUÙöó£Æ&’v$´_G\Ví{ÞÐK.?8Rþˆ®pïõ†Î½0· ªñÈFø»VŽHÝl¡t©ÆN ìé&:¬f~ƒÚ`ŸS4!–} S2h—íàܱòËù¢V†•3öÄo9(ì“RèÖCyñ Æ2 „B`ü˜¥^¬A¿ÊÛ<2Þ=¨¥®>u~é­«¸rßj; Hób)3¡r³óˆÈzí9©}-¬[ÜzWzâIw§G}}®¼CÌÿh(¼]D9'’÷®Ú–ãÓ~…FëôîLÀnÿN™ñ´ ¿‚Ì»#ÔHA2_±3¾ðÔ· G‚o?+\Q2"Cg^K:ÅbŒÒª2ë]Ó¾~Ùƒö¥ºïã9uù02n¥Ê^T†Û±’ºoÇ+Ü…øñõõ”elâu,Î_ oÊ$¿QÓV4¯jļ¹BJ NÙÍ.·¡àhdíÁ¼P‘4tÓ¥‡³•b’~צv}³xBÑtvË 6VJd·ìþâ1–þ¡ÈÁ.wyÈ(¼©Ùú«Ü›•.«oäƒ&bU4>j™§rÐﯪ úDÒp†êJmŠí ¸`ÖåpCjoÎð`ð7–8Wwº8ÁLQ®/Kyv’dí™åµDà4U‘32aÚ_TGÀ0]†<3jöÈ8©¿}:4†ã¹,*n9Éx¿‰<‘hèJíbCŽÿ ù)‡3r3.¤§×  düm1Õ"#ImÉ&u3Â÷Â?ßÐ5Ì}ô”U(Ï5þŠ£ r œÃÎÒY'¿®aêíònr©4\€´E®.üZh—^ôøT°*×i»;üó.´"æá¼š%±UÎíçÇlãõoÑofÒÜ ’¾ŽÞãØæõJJËæ]Z³/~4&r| Ã’úH挣Œ³Ð’ä«ñ•ôµ 8…ÇÚï}ªòå#zï”*W¥ìn¬–Ö¾…ÉoœOq‚qùç9YÐj0¹â¯o"Îà³gg7„ÕÆ´ï¯h-Š6®ºÓm;‰‹ ®ô!ƒbí°o.DKˆ8Y®÷jP²¾:ýB›)|äÈ:ƒ,qTFÒïY4MfEà/Ux1©\tÍßè+_©å¿XæÿYAƒWœLrÓvÇš‘ ¸…×D# qÖ DÏÓTŽÙ©xØZÞ`FÅC?œ˜µ-Ú æÝ‡™9a¬Ü©•'qƒ•ÁáhÆÒžê%ßGit½€°í˜Ä‚PI«'2{üÂÎâh– ÎVjg¸ !mxxÈaŒÓEÍm2;nÏãQW(¥¨*&ñ~A*NŸËb\dòPR “Ö¨¶€»¹¨¹I!ã40ȈZètï‰+H :â•sϪL#žnî™% ï•T#ÃÅ+ìˆz½ó8¦Vü…—‰¨æ¦í+ì\R¼Ö6ôú@“+ôÌl›Šëû¸)DšàÑÌë\ORŸIÀ/H&1ñ–ºn-äJ6µ Ùðâ¢u‰WØ´Ë õ”,Ýy/Ê¢°½Þžõ ™6n>…S_ñ÷ynO‚Lç‚§É¡·}K*jHÈóÅ[”7Æg½ø‡$’è$Ža`%d3tνËÃzÔ þò„…*X)£LBZlÈ^¡@i± 7 Ө͡hñ°¡û€Ó~åÑÁMc,Kà°£Üâ4˜Sjù‚g—™™~<É ™½ X çb¡=ÃçÏÊuIlµâjœJ>n˜ƒ1 Y ϪÝ„¢ g­&Û[нDÌ])ç¢d´·ºcí¥ÊÔG£ò´XMg-¡TyŽ\T#rªÈÛâ­–]zi¹¯äȱE˜MÈÖ{S[ïÀß‚•·=m5Q˜í¹8Íßr-‰}†}ØãÃ,%«‘|«4ÿ•¦ÃzÊÛuèÇàa‡ÎÃJK#P°Fk«&1çphøã¨šQŽ~Š:¿߀ÝPëSýÐlöF œŠÓn½á„Ü*m}Ä›§ª]þo±Æ¾Ò¶ÅúˆÏ°p¢EtoÚ²Šà)ˆ†œÇ‘›¢lÝôðä;* ´$©·Êj¼;o‡'4Ê/ÅÁ[ÃÁˆz¬«&6Œøn)¡—}›»Þ,^[>ŒÄÄ$éȬË(îM,WG:í#¨ÛéëªYa>/ò÷>¼ƒaÓ åÚN·à’Ö¶~ýp`R|F¢W‚d1‹ÚiÒÁµñxÔ½—…‹çu0C,¢UíZµ!‚ ÿWÙ¬+ß$éE"MPjwÚKìò§¥Xqã&t£çÉ(’êµ²sҳǼ³¦ObŽ·¿¢OBãÝ;e[·Šðcî{ ·¸]dsáeKÙkˆªæÏÝ5Yw8]K´ Ijªå؈ Ÿo:òöÑ*¸Ò¦¦»ÌŸ)Ë+Zw[‹TGÎÒÙ‚¡Üq^*4éK¡ÚHœ[!ÔHy$Ð2‰ûlÙy›ö1H ¾ž/‡¢ÈfA¡”Ù>À®™²'+݇‘‰4*Üiâgñè`í¾4ùÄw;œ»¹Ïöè9UŒD_I%Û?Œd rS} dø‡a7š9À*5ÇTGôŒÜõ¶>l;*×F¾QaÖÛ“^q¤)ö éÆ`C:>u>F¥ô-™E—Šå3‰t‹£ÓUY÷ÄЮZæE"û !lK=<ˆùò¾Î^Œ ’‘ùA¶8æ~]"ÌI¿´ˆ³Æ|ÎȪA”T9 Ç#™úÄQQb½]ue5§¯yž) ~~f´vqÖÓ«ºD¾ä9j € þØ´е]ÓhTxÛtÛ|CU8¯¤,ÕæÑÃ-„õЍ7¾_¶ì%=ѽ§gߪðOÉÝášíówï¼r>LÓ~™ûcʶë¤_S/Ï{QóZóœŸ8ð)>ßDzëûÏÐîT-iY,fK>\FÃòç•0ñíЀGÊÑËåQҨđ¬g÷ÎþL­Æ`ëbqìýè#4ûN`òw— Yl+ ÙlwüÈ°Š…>N€Í¹ÑQ•v cÉ.šuDL]“÷=-?{F^Ls #IpKŸLÄö‹ý*– æŽ|i`öËE_a|ñ:µº`"N¤ÏuÍ„¦vŸE`9Ïá;éÄ.ƒOR0KÏR¯%ïߊoDVì|ë.ÉnÁÉïúðÈø†,•ê8þŒ·ŽU%Ìó‡t 8©4•m€RäOB¶ïüÄ[Ÿ^¡ó¢œ¬[Æ#˜2ºÐ}÷„Ë%ZSI5¬“ð¨Jèا¿VÁЏ€;N)”T¨©À5¢]Öºâ\+Z|GBgYÙ9á [‘Ÿ”k XstS^í~¹K ¶VBOHeÃÚoªKë>¯kÐEt« Cox ü¬t…×¹eÃiXØÆ/fkÈòÔÑEÙoQþúú…V¡ì} ]´Ëç©Ùðt‚äb1,ÔÚF7ø ¡OQ{Îý¬}Z¾?)ˆØžHÄRbá!&F`Uiw <ÈТ¢¼ëÅ ®¯£ær‘t÷À…\õ±IqÕ`M©£én ÒFFÛãq5>•ì<¡øÚwùjp{üTOØ…œh0ÿ†ýYÇlg6máŠì[8# çó»ù.ÎÅÕj:I•ê†@cßuaáWTÖÏ\hÔM­µ ¨Ñh[Ðx³t Ÿ¾Ë”¡û| xšCcXB„°e(¿º/ó K“þf½Éñç|½Ì“åþ†5¹4®tûE4˜¯Ó^ЦŽÔFö Ž˜õ«“ œœ%Ú4]ñˆ¾¼³õƒÊ»…TQI›¬geÅ5O~ŽPÍ\‚®{ú ˜Å©ê£5U_ÄÈC6²£ U\µa*U0N2SýZá¼iUÓ¥{–ÒàÚ{ãYý6^îÒ­±zw§Ç„¿7ÏX½Ã-Å©ô÷ããËœÖT_¨Èº†C|É'´ÖäoàðÔ¶òµaaÞ´ÊÕd H¥Z„ö\xÖÖ®s^µ,jkð¥2™žŠXÔ&jeˆ‚Æûiã+]à)ÁÄŒ„øé\Çî¦ñÊ­êí"픥‘Ë5“h ÷i*,ïå+B%£NQ 4+˜Jïvy(ѬRYòÖ_ä©›"Ïpú­¯ªŠÌî³C´’Â@<—h‚ž|i›ìÖF®®¾iŸdªÌ}ó·ÞÚ~7JðÊüb¾ø^&¤Ûç]ŸÞOû}6õ Ï›¨ïÿ±K‘v¤>I% Å£n/…ßTtY;FÍ¥0àg\臦à²Â¦L´.±Å†êÏíB&٪Ǯ`/nUtˆ¶é_ÎQ.Ž)µ±/øë¢¡á;§ ZÊ,Ú­tJS…jïö|oÐ6 3yWžlatL|ª‰úÐ/%! °z|•º(u *Ñ¡ˆ©ÛF ¨Í¶X€œÜòPÊNbd´´$Ó{SMüK´!ÐÅb6Û¤Ö÷‹W²ú¤\0»’¼×£ËàøÞš}*'»ïí•‹¶zM%‘I¦èøhY·jaÛð¼P7º?Ep|0,Q’·è\!SÐrìÈZ oW Aeл’[Ù·qHÓEÞ ïØ(V½»3î|¾óë÷C÷) ©ÉC˜ëìlض‰Žç×¢×zi_z‘z»$7éçìÞR&Žv[»T^XÀ˜ÃÂÙ»±78d—Áe¼¨¬Tùø×ÝHñ2rÅTŠ%ŸÚóÔ|Læ[KeÄõi #T³ã‡°åø^ÉK4”OQ=>¥?1»%²6TœèÎù)óСó‹™$;MµU/|$Ä ®%g8–ÖÞix@VäܺÛÏ+™Q•Z£­u§¿ uΗð7¨ö]õhdÓ+*Z–×Ô4¦=Kùu1q¬5¸‡ÂÔ‡ËeNï(¹ØÐJ…äý@~ÃÂ_ÈËn}Ÿ>±¼ò >IÌh™,›zz"êDc=…äÖÇN¾zË6’¤Àžtzìä‹'cÑãS_öQõ™²j;šºÙ¤Áp?ósähc“›Z>÷§1qLKxf¢Fg_*êiåJn‚Å"#O9Y¢ËOÊ vŠxzÌ7ÚÝ/nã4#œáQŠ_;Dêøâ3¯ =ªÃ‹٢~•†|j~çymì32¶T¯ïñ£ã0"úxÝ\žÂ^&ÖZ…'QµØ}þ²?õâ|™Ç;o«¤ëa¥œµèØ\[ÿx³ÏE‚žŒí´¡=Ø‘Æ:4¯îÍšÌ{qÖOmÇÜ‘¹­ë!ø“QÝ÷;ó­\°XYýup¸Ïâ+‹E¢²É©u~i¬Z­ýUŽgN—ÉÉ[êf1w.Ž©-¸Ö¥e÷ïydzáÆÆ¶:RH9•}‰ûß\•£2tÐÆÖ™çî‘ ¼õ͇Y³*%óà{ƒ£4>‘K̘¡§úõörÚ¶½’^ŸA® ¨nâ>«+³PÕ#†¨ê¨`] ˜ªö—ª7¯Ï2ž54ED=ú%$ôá…f¿½µ •2èDëÛÔh²ë‰LÞÈeÝ¢ì¨e>eÚe“>:à]m-+Ð\4åÝCµ‡;ÈÑP ƒÙ*|®…éƒÀSò|RÑ»% '¦o?á'Ю|öŽW|kY)R1ȧ¢ó}rS _‹v®}åáQ?€æG4ǩש3&Ó£Ø8¼öõžœŠ g‹bì.•í†3OØTü§W ”>•U‡€ß☜û×8øØÏáB=ú”b-…º!Õ‚Yà¢ÐM¹øz!‚a¢ Ûd”TÚ,zÁöÕu:Õùð3ùÚ‘i ´BñÅïÓÝñ&mVd@­j¸Å%+ìYC| `|ëK LX¡elÕÍBP“~žùÔ´b=XDÙ&"ƒö€á~*÷)0¾×ªÏî§}³Š>Nm›Ï¤`T+)¤yÜ9á5»{iQÏ^N´¨KrÛÐJ4âo[¹<• Éøî¢‰†(Ð\Ï+¯¥WËqÀñ™æùÜî#‰Ê‚Û±ÿ¢F^lœÑ—°pß\JÕæÞrû¦óõ´ïäÀ#Û±®1]q Í\ðó—¸,8ÌùòøÏ.ñ¿¸óì]/ιחΉ¤ôD~ŸZon+rlÅ'™«7ÈlªæÕâ d¾•† SÛ+iRE‡ˆ N‰üÎ*Œ9ñã-êTù×é€Å®sñcuˆwÙZ°Ã_ѹc6Ê`Ë<‡u .šBw?1†A"-Òž|÷ôáÙDYßÊ;eïkÞÈÖ»¶ý„+­kI ঌ„å >-yk§[îì7dø]œkÛŒ–²-^AHß ¦ˆõ8 _·â‰Ö޵ pHð\›õéCŸ„CZ¡VEªKæ#¼¬ÒKLh˜Ý^8d¥gÖó«”ÙΓ^e„ÜÐŒË á.˜àðð±[2h_ÁË6Vu ly¡\±Má/$Ü8¡:b¢Œ×L~Ï‚‚º˜Šï«¼ÓIJäÚ9§Å8ùb)Ë®…†r¹Ç»¯° v”RS¤låÿÕp«¨{¿0ËŠÌr©ÿëk­YÅÞ*#á±ÅÕ3a_ ¶9âZŸð‚ì"½€6/OúXê³:6¦nÈ¥bºþ¥¦F¯óÛ™eû}¯Šì«¢f T`§ZÈÛ#d5',ž‡Fú™~Á#èA3úûKÛ§$âP1/5þðŸ—vÐêLt°òØœAƒPd‘TP“Ž'c€1½¥(j†=ûÁ@®Ÿ^“& 4¢¯üJŒ²Ô(ëWÚQO;÷dwû¦üQ‚&ccát8ÂG…ù<[ªyX1™–6!±¾Ô`ÈïÈTfp·¤À$žÚ¦Od“MXݰ¯·êX1yÙ ¼É¼ ÙÛ]]{/dß¡W±¦âË8mÕi ak.Ù‘›9+ƒû )4pÇANX§º´õ9üX‰¾8£KdÙ<œ¸¢¹Â¸Ë¬›íZõg4nH+ŒóǾ«¾¾¶¬.Œš„±<ÁüŠ{+,)Ø1°ù91“rwÉ´ê4W=úÍ âRÅùÖ'Ý'=ÍÎ{†=ä|Îøä±!bó{&—c¹kåÁ%¿^•ñ•¹þm§-"bìƒԀõ¶ïz3Ò÷øÞ׬™Œ~x˜¤Bé ¹~ÀÚ¿ø‰—|ˆ D‰Å…°Jr{«‰‚Ðkýþa´Ýÿ¤ðÍÔ«h€ö1 ²õôÚ@×uÈM¼ìëm›Ð}ÐXòy4ÅE·‡Êê'ÎC ­ØrYêƒa”hÅ™÷ÈÊCÁ?t:Õ}OFs_Yª¾ªhOç›Øt=ïµüß àu×ÂÓHsõSEÕªKt@…;ì\{×6UÅÞ+C]ìé -ù× ¨Ý=–»Fu]%Û }«ŽU£êoQtQ”øØ‡p½tÆZ ü.M7§Ý@«ûn¿†¯4‘xƒ %À†Ã î¡hÚ1WÞÎgŠ3Ëݽ§9`0F¼™¼XEk«k«;  ·´YåžDóóqYI¼Y?ecƒÐîº3Ç Öéɦ¥®N@\µ_tUúæ*œ+S7äºûØH]SøÏJZs.‡H´HâÌgƒ…!˜žÚšˆX¼]ÎC ,ù¸Ÿ“eý§!!³ðÔ6°2Ó«í´Ê£´®äíà$ tSÞý§C^R j0²`Ï\¨ úž…¦âϳü¦2gX“ñªtñÒS‚†Lcƒ¤Š‘}Õšd Ì3­dyÒ¿ÀB ¼‰,JìÎi`a§²tŒ»cÇÍÇ|ØM®Jˆ˜’«þªQr…Dr(g©!9„…€û}¥`ŒºÚò2h¢µÓr%@sÁ´/3¹‹¬¢¡ë,ÅËÝ ÉæcÕY/eÆÜ'í&w«7Œ÷NðO™¡‰B¬¬4Ãïð'6¬žÑGhOóYœÇUïØ½zžLÎÀêªFnóš}çì•qäÖ”ÛN}J°VÁ†KÛó ¬ñ¦€‹0׸ð¶ HñÊ'`ýh­˜.FÏp€x_gŽWöŽÃ÷Å‘`oÖ]û ó…ùöÝ%|ÖTÙ3l jH7G§ö½Gš<\…6Øí²Èó_ÏbÈÕ/É(ª%Š¢Qä•ó¿ÐæHˆºhB—´®ôe51Ž…ÐØM ™·‰Èýù6ó\¤TˆPÍìuKnª)ªq€÷¢¶|Á„Õà ˜á¿š¼é£GžŽ q o4 PKè^vòÔàØÐ)÷ ¾ùa†üg‡ö}Õºy·§ÐÖ`²™ga€ÖþOw.VÖ{o™h°Â–­o¹Ç3ÚN:›Ë?ä{_íÚj.£õrË[B–O åzK_ÙÀ))Ö ç°÷O;9CáF ,Ž—p—¼EÜFoÕy„Àm”,_·KÌk'u÷C4íz5$ŒÁÑ>ÁÐ!®ÿ¢Õ×^WÕ  ™Fu?Ì’íKøå¡@ôîP°/¥1è uFÔÊ«G#ÎÒÖ[Êu’Ì›ºÙýw9 WdÒÔ qù«<ÛqôW¸› è­b‰òº.¨7ma»¬Z?…ºÇáÿoÿÞ’ËÁe¸ ðž=Á‹9{þËC03*J4eÉMC¾ÄÆ]ƒÛÍJ[ÂCh¦Kv ¿+,ú2mù†·†®àž}þŠj©ý´¶È\$„2‹Ë²5¯òU/u®dºkqz^ewoüîÒ›ü@Û[eÿóüvK塱¯î6dž¯¿ 0< €h=<£[×c˜Cм¯àâVwÆO3> £³ÉŒˆ7Ë?H¬Ñ6¥B'Þ©&>Ì|èv6#’†,RË ¾mÈUf'lr&›K>1eÿþ¾€ÿAp„¬é@‡°laÕ^-ê„,¯Ö4¯‚Ó æÞ›k6L?’JE9×[õ°v^?îÑŒ>âwÇ¢U(W©ÔãËÑí×ö=O'…1éࣆÛߨ6Ü„ØfÛì•’úgT\»Z•Kïùïz;ªŠøT†Øð²‰/BÿD>9–qÕUĶßïìãqóAa¡W ÅÍSEçÆct¤£^|:‚bv‹!ëÃ1x CÑÆg"|ˆê³@ùyMÆa»i0ÛRzP5g›´t«Ô»f¯|{GyäsÂUäHqjÃèf´X!›þk±dÀŽØ*ïì^$~ïŠùî¿ösŸE.î@ܯ‚–×Ó0dØï(;^a‹ýÝö-p!i=i‚À,Ü)ž"·SM’f©¹d ²ÜëEšëz­ñâÀ^ŒÂ Q¢´Œéb¾ošÒÍ”êÀ“k›Ž ªp££}:º2¨ÆTâÁ`GHJ8iü»×ØÙÙhrN×c£¶²ÙÕµ›Ý& \²–‡>e’ƒ»t¯#[°´ZÆ¡cÀýf_"`ç„áv„i Z»9’œ§×Yü”§ìˆæ»bE)×8y¨Î ,)ÿ÷WýÚn˜x2)‘cÔ{(0U²y^À×z¨Æÿ4¨fDC·¨°|ãÊ1ö™@&€õ—½„áÜ×ÀÖÀʩޭÏ}"ñå‹­ñ$k=TåÇ™zz^dœC†3¶½gáábVؤ[ ï¯æž¬ «=]|PÞØCÒ4”±ëä.ÁÉqŠ×ýå‚/ý_+ÍÄBiýNŸoW7Â՚Ÿó/Ã:¼¢bÇQžŸý‡Œ‘´—ifäçáö<ª†« ‘¦Œ?èfû7XX1nº•ñSW ÄI4ÒS¼²Vøk´ŠÄ∈ãV±^ˆêe‚dùäæÔ.è詜¬Ì:s’ÿ;ÔŒ#äØJ¨uð·§½D´òø Có”²ùô¾y 䟊3ÞaÆX’›qÉŸ^BôÑf³µ˜eÿV¼ãº |uí]¸Ë¢ÇÎŽ,£¤\gZ·˜È’ï‚tÁ)åc>{aÜñxì„–(ºlÍ’ÊöÔOÁ¹¨ÌÕÒ>µjÒHÒž&éÜφ|ºú~hÛ[ijÚß”Åìï;h׎ø é—ÎZ˜= ½;Hÿ0PãJìû¼“ãM#V¹œ’±K_zWî4b ¼Ì¹SMc©îðÙþR2°%_>cü¤•™Qÿ‹Ð“”‡³/î¦|²XÆ,}º&87ȼ34¶N,èDü¼]öÉ,)îõ‹âêEGáŒé°¶¾~ðVÞ B²¸°ÖÓ¢×q³Ê)êØÓÖeS‹éÁµ…jL/:«U!ˆd!PNóÛ&GSk}ÝåS"ùõø~å8“<©b^Ån-ú˜§j65æ„ÌP¶µÊr{ä y}·’ä_Ò·þ½*qr¨Áëæ’ŽÓd;‡¬D*xÐö¨ú2»bˆ8ŠÍ E}d—û"ýéSx›Þµ–’‘8쇷ë'XIJ-¡]1ÏÑê ÇLâË|t ñ )ranŽý¸aŠË}ž]OoÁ ÎðŒ—Ÿíñš6õ…0z¶“R€§Zý,…ì…ÉÀðÀ 0‚žR¤`³!"7[€ ¨„¦kΟ/ÿí´˜ ‚}ªû ÀUBþ}—÷°Cgᩞ ŒJ=7¢º ÊòDŵ,g™ÞØ$m‚_¢_Z_Ô…é üÂÂ`аnŠŠ‰Mçéž‚ŒÌW6x)Ÿ >è §M³ž~v}qØ+R]¡TGM T¨O}…X¬@|bã, S´¦€VQŒËof`AN%Ž5ñõŸö•œ ¹Èž¯b{“¶ðlõ=âñ²]'àLÈC!§V½ˆošÿ¬°rÞFÊñC·ä.â)süÓõÁmâ Í~&J·™½Ÿ¹6ëð»QO,ÑaÒFÞ£Ðàá“ûÉçù9mL(ÐtdJñ° 2Qs GH»F1qÄ‘@,ìáªóËK±¬ñ-Àóí„Ib+Xª“‡³Ùn.Ö^Å÷Ä*|b|ÍÊFNüüu™Øq&®_ðl´¤z½bò­>©Çùµ9ÃÖ¦ò¾XvžQyß=æìµ©œ0ŽZ ¾Ç×ôGœ6onVýŒ® ÔÂû‡:rjÓ« Çø´ZÁ΃ƒXHiüÿgf+¨AÖË{‘4]Iùgdµè)Bí0;®ÛkžwsÜj=;JÍé¢1ËR^åEp¡å>Gó_màsü¯“ÿ*‡¦|ïô>Ö<Ævqê¸ ­œ$†g—ROOçbŒ¤÷5ÂÛ91µavF[´à¯¼>ÄìýTâj›+ìÆpxøÍNEzw⥠£ð÷·°‰ÝôMq¾€»£Èé{.Ø}x–R”ݼ™‰ÔôŽZüÐ pH¶Š‘m–‹4osJ‡õ¤T’(.M–i€ÎqrÿvüF¡êAŒsÃT±EÌDÃÖªß|IŸ€«r#äw&<{!•;z g-~éÜVþNaàYù)$U±¢óå½ÖOغˆÇ ÀGó–:‡j{OŠà…ÌCwMV|y¿r ÿÛ9—gš—‰}Êz1`ý$+/ñgûîrñL)?]`Røò5Œ)ål³Ò_EâÃÏ2ÿsÝæ´¾ÛF`×Úp@Š´Ñ6°7Ò§â!(54ùþJýÎÑC'¬ Ûfÿ¦>"Õ<ŸKÖfx_'Êû†–¦ˆsgX‰Q A6ƶcL‹c¿Óóëѧ¦YÈ"·©<ÛsFCøâL «ë šV½X2Òe¡ž+e¸L£PÑþŸçÁõ68§°¯í‘|IÇì}c›}Ëç³0ËgÝÜ^ŒÈÎ5 óÉÔˆN>ÙñáCH}D"S‡Èî!w ¤Š r‹†¾4Ò!c§#u-¬- ¬UÝúwÞÛÙ`qÍ`†‰„yû@4‘Ü&v6âÆ@I…e†.ñ«TË¥ÔRíkˆÐÁgok_׫c̽NJøÐ)S¬…ž>ëâZ6³–Õ¡‹‚üÈÄü·! žø¦ÛÛgÎt¦fÌsF™%ÇÉÎïg{ ¨5¬úŽME =þñ螸V5ñ¹ÚK‹¬›y!w]ä›È¿i079î…ƒÄ!:Æ8ªÜÿëû]zdqõ˜O i™?ñ8œ¥mvîÛ¸ Í_¨¼é)´WU ¨û8 4Ž˜E#›)3m9ŽïÓZ{:àìIµÙppÎÉlðÚý É@W²¥ßªœv-Þí¶ÐC]Áœìbjé:¶,´ê–ç`l"MÆz”BØ8gb,ï¨`PJ=Û›]Î[×§tøÚ[ž¢œä#Nb $í´œþ¥‹îVü ¦¼Ñ„XÕkœÏBÎVÎwË{´@\÷:É–(Ïh„hèM¯Êúµ÷ÛcÛtFÿθ¼ BíÎþ[êElx"ž23èþ¨W4!üh4i¦0<Ìš_¬tK®u‹GŽX`ãJÝÆúóYªt -cä*þã;?äDó¹,kȂޭ‰ÎÏèkOÙžËu/ë$Ab÷”?Q!g>ß±$«÷+ÍhH Ô¬~b† ðbÅ0$NY0î¥õðžôöþ/Y™¥½‰3¤P–|‰ÔdþEPÉâöïWÂòFu5÷àû© l6™í V~ÉœE[‚µ`Ç]À°Z¿õÆgær/Æ‹ÞÞÍ»÷±ÏÉÄÕa‚[rPè=£EñMW@òÑ[hWãH ul²—o¦xûùD”Y›Ïç­“Ü‚µ¾Cp‚dBÇœT¬)ÉqÞH¬ô¼½îŽ)<;ªW Ãò­%ãùgLž,qvü…”³™¯¸ÆOÊ쌼¤»EÄ0 ‘¥ëtëyÿ}Ùáœà”Þ:Ðq`R"fßZ*„ PI›Ò¶âð«nL!7¼SoßµâTa1·Ò^w«¯V¾¸wm·ŒÃøu¥â2Bæm`ȸ¦€my¨w4²¯íx.'aT« #ÿEšõŽT5£Œ‡„"i†" O#¥i0@¾ ®œnw"Df[B*l5žÆØzþv|ž‰ßïÚL4 XÔš Óéžz¡/è­¯j²¾fú¶¯ßÈ~g¥ûÁŽwºA&zFìܳ.E«ÁV:¾Ð8¤/hžÞË/.‹ª±ÿÝe»6öSæòŽníDãý [E%²JlÍ{pÑ‹„Þ;‰fŒ~ ÖÆ26à°m6õQʰBð‚™H5ºb_úï ëÕnyàB.u¶Èa • Aå´˜vÚk£i§ ­¼GÑ…"Á#Æ9œÃËó;kBúòixM—,4I"­U…–”ªæý¼§…žñ2Žšï[_²Ãs¬…UDVÛ·3ééØhóÇØr7€6µ`*Ã’þŸ2±1GÖ•-œÛÎ/6 à S…\ ³2[Ç`ªí ž„$ðoe¥JÄ–ÒSuÃRáÕW9¢ÚÕpùA¸¤áœÚ=×t)&ý“¼a@¯Uõ‚,ë= 7Œ× Fë’–‹²ŸÒà7‡Å¯·‘l(Õa:qU¨3`0O¼¡ƒ*ÿq&o€€¸Ïm+P­(6Z0öòïé®ÛÖ¤@ÂQ7?¢k1 kŸÖŠè~œMþ(z}?ûOSÒÕáNB%’¿?•Uo_'Žª¼bûŠ2(á£ø”cv©œ#J9&¶ƒŽ§€Ù•Š0 9J¬€&][5qsõt<1“hV j©jS|†gÇ£íAð&ªè´dé‡BuR˜g#ÄmAÚC±úfïiÕüv¼úšUç|ë£êè!–‘;ÝŒYj¥?ßp*²ÒÑ[mí·‘Ú@eÒ(ï´–—¶ú ¹];Á3]‰†ã½ÄÀùS‘{LÅâ‘]ŸN$Ctº½{U löH›¾Ûrç¡Xéž7äw;öÛSØD©Ž0)ó Óa~` iO7r­áá!eEÌ=£\¬š½Åð·éqãP«ÒÞûO™ú26†ßt$oŠäžýÕgw—ý½‘1$«Ú,^£R²C:ο§xPßr°'ÂÕÛ¶ù"Mb޳Z¢¹Ý«&H.ŽÃÉá;”Þ`ï°°«]ú[còŒCtG­;ö)ƒƒJÉ4=Šs¿+ —hZæù¾eõà, J÷º¹3LwqzìKK½¡eƒŸêpV¶aZ59úÈÛ°˜¶'óÀëðr8Çÿ¨ïû$¡•–fñÀU/·2Ê­Õ¿åã —ŒÑä;Þfh[¦¾‡gq‚áÛ<¢ÒsœåBI¹•.ØÜò¦¾…¤þsIìoòÊ`5Ó'#Ayr5ô”ü×Â\լ뼫±ÀÄ(P×mg¤_ÞÊ"¶@Ø~yÒê³GœÂMqÚêªBÊé42»˜J•GŠ¿]Ò uçÖ4±éT;që¾:yn1F*'O —N‹D4ž¬?q(–12ÊɵZª’õL˜íÿ¥<#wÇtì¶ _eÂhK[¦²ÐqȲpB|BLï5ÃÐÃ.ÊJãH)x¸ÊÏÇ|”H„Äð>aIg˳Yo¤0\¶ÐˆD ýz[œÇmëõ=üf!y%Iʃj“(SH6,a}`ºš*Øœ>jþ8S¿%·t¾æ“{ã0o–®ZD&zçnY3¾0ïXð_ nQãê $ÔýéÇ5v–ǦsE#'ZÙ¦«¾a-i÷•Ž ©JJ’Å[uâ¾ê(½è ¥£GChv¢«òÅÙ„õü§6°eiU˜~§-‚žf×?Ç3«Å÷¾Ê‰}xI¹í+jä²¢iúU}Ø}%蛈®¸Í–ïKLC{þiÝC㌼ÿºvø÷ý#Zy©¥ÄÊ^iug Ðtõ.ŒHÒCÄuH†u±@„„¿îi<®*ÜõQK†BØQüv‰]ß{?ý;§ÐcÓÜð+C´ÍÓÝ™‰¬€éâŠ\ÒÖ2_ëòá‡=¯XS¯àa_‹âWn‡žœnéÀ®ÄÎÅØGâ¤á¿<:|v“±å$£‚BtXHñË€ Hä¢ýx, Ä+<‚K«ÑX ×qñq1°ç`ƒƒ.st®¸bmÆ:LâŒì;î ­z´jØnßu=âÒõW¶Û? môÃɆsRþ¨ýFVzaÊ Õê¹g)ÕÝD̽ÜÔš3Z}ÌM?3È=ªè«Ý}%xò–•,`FËÙèÄÓž®òe&¢¦5*òýîb:À™Ÿ^߸‚1,øÏö ̓]n»=¿Ê…Õþä1Õ¥Ë|^ò9¢îÄÜPÓØ—§x;E[iô¶$ú·ìÊD¯öðä†N @×aÛã`‡þ¢…#8ž\Rc¹æÙ‚xF77Ò7'œÅ¦'s˸³Þ‘pAÌð×a€RGÁ|%$½ç^àæîûšJâ&$Óg³AW\<è§cßÑ“»u"¿ÊZèÛ°ÕŸZCI£Ðšî ^½‚×è)¤ Æg})æ2sjD›¯©mézzƒWOzwÒ«/Y1Ây–jœNK4ƒJʯÜ ŠþÆ2~ÿLü&áÕz®æÌzia©!`(ÅaU…èëæ¤Ó¸úN\€2üൠ· Ù|"¦ôìÿ¸V!¼²úäýП8ßž¶Ee¿}½èù…˜âúÁÀ«§æ;²í0H— PQÃFÅ/óû•°‹Î4ðÈËÊ3k^Y—ßAƒ0…“ÇÊ©Ì÷jçŽUúŸ+ ¶­É7,…6É.Ç•ˆJW‡ÔP‡%6§÷kcGJ md¸^ç’f*æ°ÇåP"ƒ~·X]#rQ'ºö~™yu!4;æÃ'yM.M÷Í(lË>Uå{iµ’j.°yЙøHßF/¥Ú‘¢ç…øùCNàÒŒ÷‡m»—>gÿ67€ïÒ¶ËÓœ/?{HÈiª®ôƒð%¢v–àcƒîÑŸc…Šžîùp:˜=¢i•,ôô¯µzÚÒü­·`äIl§'·ŒSa˜÷gœ;Á)’VáÑäíKŠaý›æª²;&†¬`Γe Và@èºñU×a£9·Ìy*¬¸ h´ül<¡î úûhC‚VøNJ6E|¡æ°àTà“ùWˆ¬ým'Úä}^ñ(ïsuôPH´š\œ(¥ß‰Ñ Ÿ;®¥I^¿:KÂÁú7ÓuàùÑ0Þo4Jïã3(þÛ)Ó)4çñ¨RUààRV]Ì)½áÉ–B í­ˆ'@6ü÷+*Ø‘Ï7 üÉJ¯’öÕÄywõ”‹¨7C¿ôR9›ž¤~uÙÎ+ 3ì› FZä¨_Õ×1ôöÎ%º*v­ý1(×Ù8¦êFTœú9’ަ\E5ÀTCbÌ|b|·é-Øf.Ö¢»q—jsñèåP¡òa$xëÛhk¬Eñ …îMCÀ²!Ÿ‡'â}DT)(|¡èà Ô›ßý®¹¾B­GçhhJ†æšòa_%1Ͻq…ÛדòþéA°lßó›ð:ÏÛ®ùÎíƒ_7UD?ÄGœÊ;®vç—¯Zà#‚ù(Îz¬$Ðü¶¶qþ²¨\(‹ân5kÖfP,G£ljîË6Ÿ¡ÛYˆÈÖ"ø’«Ïõ|c¿Ó´ð¤à<í7 ©•Ž4íW(LºHxË:Þ‹…9ð~@)Ú ÞV ¶ÁâkÏ5V:£òL€Õ”A—/ÍÔ08è‰"Œ7ÄÞÃ>›ZK9y¨,Ðåú4±•=·Ÿ·Ó;¡øöþx@%ÿÉv¸[8÷X`n^u.Nî¦o–þå!tà;§HÛ ¦è¯³÷> endobj 407 0 obj << /Length1 1876 /Length2 12108 /Length3 0 /Length 13267 /Filter /FlateDecode >> stream xÚµPÚh‹Ü݆ww î.Ám€Aww îÜÝ=¸%¸CÐ`Aƒ‡Ç‘{rîý¿ê½š*fV{ïݽ¡$WVc5³3JÚY™Xøb ª¬lv&6DJJu³ ðo1"¥&ÐÑ dæû—˜#ÐØùU&nìüj§`ȺØXÙ¬\|¬Ü|,,6ÞÿÚ9òÄ]Af&€¬è„H)fgïá²°t~MóŸŸSZ+//7ßîQ[ #ÈÔ P0v¶Ú¾f45¶¨Ù™‚€Îÿ‚FÀÒÙÙž™ÙÍÍÉØÖ‰ÉÎÑBˆ–àr¶¨€Ž®@3À muÆ„H P·9ý%W³3wv3v^6 S ØéÕÃlt¼&¨ÉÈ”ì࿌åÿ2`ü}6V&ÖÂýíýG øOgcSS;[{c°l0ÙJ’òLÎîÎ c°Ù†Æ6Nv¯þÆ®Æ c“Wƒ?+7HŠªŒ_ü»='SG½³“Èæ™ÿózÊ`31;[[ ØÙ ñúÄAŽ@Ó×c÷`þëf­Ávn`¯¿Á63ÿ£ 3{f 0ÈÁ(#þ·É«ñ·Ìè àdaaáæå@wSKæ?«{ØÿT²þ!~íÀÇËÞÎ`þÚÐd|ýBôr2vœ]€>^ÿVü7!²²Ì@¦Î Œø;ú«hþ¿^¾#È Ëò:{¬–?>ÿüÒ/3;°Çoó?ï—YA\SJIœþ¯Žÿѽoçðbdç0²q²xyxÜœ,ŸÿŽòOÿÿéýO©²1èïÚX~”›ÛxÿjáõìþÓ†ëßSAó÷ÆÐþ;ƒ¢Ýë(4¿'_…“Åôõëÿóüÿéòÿ7öDù¿Mþÿ$ébcó§šæOýÿGml ²ñøÛàu’]œ_·BÁîu7Àÿkªük“€f ÛÿÕÊ8¿n‡(ØÂæŸc9I‚ÜfÊ gSË¿Fè?·ðÞ*Û9þxkŒ¬,,ÿ£{Ý7Së×÷Äéõ®þT_×é¿SJ€MíÌþØ;6N.€±££±"Ëëx±qr¼X_Ô èþçd˜™Àvί.€×ö|ævŽˆÜ('€YôÑ_Ä `û‡¸YÌ’¿‰À,õ›ØÌÒ¿‰ À,ÿ›xÌŠÿÏkåßôê§ú›ØÌj¿é5»Ö?ÄûJÆ¿é5¦Éoâ0›þC¯ôú>ü¶þã$™Íþ…¯µÿ…¯–ÿÂ×3ý _[ÿ _3Ûü _SÛþFÖ×Dàák"»ß…½Ú¾þ;ø—ú5±ã¿ð5±Ó¿ðõÿÁ×]av¶tþvfg7»9¼Vêò/|­Ôõ7²½ðø]Ë«Òèø—÷©‹£ãëÓúç’¿Î×øÏwtš"./Ø™ò[ÕwÞÖŠ¹1îNÎRîj¥Ñ2z-;v¹Ü£Â'ÓÖdn8þMíC_Ý– ¹Y!{ò:jk„kOTéxð~4ŒWÞí@\šÂš,<m$A fTÙó~rðÖ °†nƒì–¥ÌupáAUÎǺuro,ÿ6º°«²WÃ%‡ôX>í¥P2G™g’=ÿΙ‘ä æ™;ÚÜõ¯YÌœÉ2ÙxzDŸãhö"/M¶˜»yϵJu6§ |èḵi*¯÷?Rdñ½J‹6ÇRçq»Æ·l“Xm~Ðxî*ªÞ:\PQNòÑà3CcË|ŒÚh—N°-!O€ãÈ>[•Ýp—¹àn3qbPJ½(Ùp7pª"ñîöÞç4xþ€§Á©×¦ SµÄIn ÷s†‘@æ4P¡†ìZ ?Fã­ë ›®}YÃnjåE5’ iëòÿn‘Uïp°¦N>ºê>"3w.ë9îz°Mgƒ}veši7Ô½7îdfK`™LÙÔ(ø£¶=9G‰žè#nC6‰Ë/Þ6"XÂèwÉY¹mìMÊHÆúõ»GH´™5?:Ýo÷±Ë5Ê_Dkªry²0 ¤áccîZ Â¶Æ]p¥¦¶øÄ×1ödÃcžiBó/µªú.Ç?_þÔ/`d`*·P{†¬h“„¥óI)Nþçl^ '‘oc?ö3_‰\;¬÷©$b`ð‹W`%Ì¿|A‚aƒàÓƒC'žP—‹AªûQJ½Êà3µvÿÁ‰ßAHD'ˆy”ŸÀCgTùÚ¹f; Wè¥niÕ~Ÿ”5@M³Ò'v˜¯¸g½ÜøÒŒÅr`ÑËÏOÀnžÍíd,'å>'Ä‚sÈ:0eä'â]1¯T ¥”ïäÉå­»Ú4>JˆYw”l?Äž<©ÝÇënJ¢m7jÖ\§€KEqׂæ¨OèYLRjàNwŸ§… ¸ž³™LÙj®ÈhC¿ Œ¶Dº>)ÏZú¿`•y§d¸ë´VØ10"ycáRÛ¿}‚k²iõÞ.ôö%1!ïì%ÇV¹‚Öú~;–ŠËËÈÞ|Á-ïfò>ódqN¢P1©×¡_y‰zNZ'¬™Q:ƒç>“© <5%²‘CîMG;Hå^íVI£ÂÍä€Ð˜£M}.¤'Œ°U ÆâåÚZ’á†Ë7æÙ¥Ï‚š~K¦ÍRpþ¥5ãŽþpÒlMÿýA ö Šðp‚E‰±GóOÑâúiƒ–r#¸Øk^Ü N¦P2}PÔgYX÷d¾Þ‚½ÕÉŸ|T÷'-†wy}k¦œl4îq<ÉËõ©Ã…„éÌÉ6n½ãæMÓäK\Iõu‹Àv c€­3}=OV" ”~ õ¯oË~ŠjÍ¡ý4‘V¦;€×Q‰A¢Ñ/øëñ3ŸóÇ>é¬U5Gã¦õ‹j˜¥³½+.:…q3³¬ž+yÚYæEÔn¬€b‹|Õ‚L_Ú_ ‚¸‚_µWâDcÓÿX˜Ü¦8Za¹ršÍKéÇ7&ìõîDüûf·ÉD?Zá6è"±7¹)š&ØÜß­3?•]ËòWš¢ *ö$Ñ]¢,GK÷n.{g&Ìõ“†k¾˜ŽWoäÿ@-µ™óÛJäš±Ìà‚ÕE`[ÞhšÊ‰#%ÓÙtÕ¸ÊønÓ©ìMI«9ÜŠj{Ö¾X‘M‚‰)HÕiŒ¸_‰{%Óï”lHR0VŸëã·Lèí¥˜Í5ÐøéKêûÔXn+™Bø¼0ÿ‘4¶T§cìˆÇJä—4n$‘œCšâN&AÈSÀ8™Ñ§KjûÊ™mz÷d×qmŸÐzácR ìâ$|©ͱMy³9qtTmçöKŽßÝ£·8Ф¹±–h™Ö"çj†c1»db6pc>+ÍŒ¼"íÓÀ—u‘ºŽçbøÜïH7…HÇDSlÞ ešOÖ<ð5üÉåÜÃÒ̉-©ª+ÒøœŸ«fýáv5šp$‰½ÇéVƒ¢‚¡±*#Éví#PñƒÕ§tÉ©ª`±âˆw)ü¼çol)¡„Ô»&­k·Þ8º„Ô~QG¶¸LhQ ¢©ð\¹I±[ø?ów"™Áµ®Ú|±C'lc{BNÔØº¼véáúž&¶ð‘’pðƒú5µêUÔ0¡Õ DŽÝ+‰B9ØGþ9–â,‘O鹉yÌèF$h6g6fg”£5¦±B5ø=òDZŠŠÆóµÒ8¢ñ~,¸2*I—ëüp©®Þ'\ðsRË;"ÎÑÚ¡QB[£±ö2xU”µ4¤ÚW®É_ö¸}Xy!m*DkäVªý!ɸŠ0Þ¤¤è'ö¢ÓgÜoÖÙÄ_rá\R§M±¯YÓ©#7ÓT—éêGãâT]bÔí¥‘¨:•%gwâƒÒ‰æ®Œ!Ãê<—H85*NGÙ6šN•Ÿ31}»Bë Ÿ½ÈRé£j#Jv¯Þ=kó§¡v‡‡Z‹•Öš;h1.'?q9DØÁÓ¥ÙÓ3ý²°²ÑÉu$µt&Šfçc+r^>_ö "’L'wøå@öõ¤¶C’IaÕ ¿l‹?C”|o’P-ì:€õAq‚^6uh»k‹*—â8ó!NÉóð=ÚÍd-4˜0èʪ–I}' â: ÿUFÏî\ŽgÝ`¶”]8oÏØÜ[¼ª;UôB,÷0orƒA´ÏnÆ‹æu3§£- Û—¬h"f“jÅ—cjÂô_ÐrßúØw»0Î/ê*”,'eE‡Ó3:… J0y]sfã<èˆà©el[g«ùÌßýL ,H’Ÿ%Ú3VuÏí'y4#ïRE‚LÊô Ïh¢;Ï… èÞáÝËÅS«7ò^ê'L0¡¨½×<-7pNáð±äƯK+†;HWÉ1(µÀsQolMbØä7…f"¿„**⯼s7†@ø¢¤þéæ.cM ¹lS‹Îgí „®RrýÏÅU‘E¦fÿ²;dΓˆIÆØDqùFNCÇeé݃*‹À’fRÇý’@ôã5Ê”‰Ý•f‡Ý)=î¹s¢O¦Gƒi_Ú'óò?˜­ÑÓñ}ºµ‹63 ÏÏU¸W6 Ž eƇÔ8Ã$è¿k*в± –¦V¡ýH1á4Ú¦S’@àŒC©ÓP·¼'X³qíæí 2¤…¼›#£°ËÌ:"A§£iUˆA˜ï\Q~Ðü˜ dŸ÷eØÙT̨}>÷;KfÌ@½5gåQšAꃄpVÙ $Zd¬¤YÁ/`a û˜˜-cŒüH½š»CjÚ¯†Ë$Ÿ}ä>äÕÐ7™-˜®k~äÂd‘ÐrfyÂÆ" ­ý‚ú”Ȫfs8ÁÅD ž÷œÏt{CÁ©î›à.²^‰(qå¡ö\ ¶Ìõ·cƒVðr1Ò‡r!œÛ¼|ëw›Õn½öý[/ã‰ýO[ÎMÙ¸$ßzÈ Y³fŽõ^EfÈ Û ‰3"úôKÍñ]‘bßÐ<Û®Á^0,ªÇÕÝrçQÄ Tó+Ddµz„CUq«;Sù¬òïk+&1ßÉîÔC6õ\>÷Ÿ·’Øãá±àŒ°!&´Cd11âå¸uäÅß$_™ïɰ– ÏY9÷Sòð1ÓDÉ|’ÊËY‡ƒøÒÄ9 C–†"DŸW_æø p›åþiÉ*à«`x£_Mo÷®g¿Ìgr˜â¡fG  ”b·¶¢½hD œ†“¾ ¿E<$i4£<ß~Ô 3NåJõ˜=–ñRÊ4¾í)V÷»á¤‹‘£x8Ížäs* ¨œáfSt|Ô…[ld±o©ÃéÜÜõŒFÃË05U ®ð‡$‡¸Þ !TNQÈÕ\ÚäïÀf“aº‰n;Á`š`³å˜T»9;²›Ãã$;6ÔmµŽr¨ð:âa”^4(Ò0w…8™nÄ®«*] 3qõCô;ä™~«–ÍÀD·Ó¾¯›‰T»Óà{xϸ­…Œ‘Fò¦ 6‹3¨Â…Gl®RôÍoã&ð¦ŽidmßâµYQýDßn€µóÇÎY› ;8BÀñr$½JbŒ¸Š¢e[‚¼xœ‚'Zîãc4°î/+Ÿ$üHk{WœyðÐ}s®dbÄ¿'%¤EtWd‘u“ÄáB­Ãú¿Õ÷l–Äîì‰_–PÇb±U ÷9²ã²  ’“šOþÛ©–E¥…ã¥I´Q ÷Íð¥us ¤‰95]Ë1e—5q‰3Ç#ž§ˆ¹}N³}»¦äj¹¤­ÿ" 0Î@Ò‡ì0²2Ñ^L«?#ÜãOßBÛ~_«³¤¬„7’®ÄšC²¹³%&tx=êù¿†b®t#s°¢I"¼÷0y©à³ºQ×͹ѶšýU:}Á-ŒyÎÌÝfÝH¨.b|ÝÄ@%U` ޣЮÔÀ$R‘'Ä}•ò×+­ý€$\Õ•jîF”ãŽ[+[ÄÐÈ öòÕ3^Ç„à#Âhº‘Ëy='aƒ)Lé†Fú£Ò~_Ÿo¥h­·fBÁ‘#„o¾ Ž¥Ü¡Y´†‡…´Ñx´s-zŠÌ¡Çhx«Bé)8@Qªé"Ђ#Ë¥*•úëKãêX˜«íúNåõ]GNà ¶~¥ ²˜Oðãª!ÛêðœõÓ56ÕÑÒ?°NŠ{1¶H&å6ª‹Eż—¹=þBäÁÆÏÌO@rµïÞl1‰’SüÑ q`v¾k)«¸°Z_ë䌱ejÑ%ßT…ĈÛ7 |îõCÍäß»´Ò¸¥ Ræ¥déÐ~Î}V‹fñÆþ!æ>d×]RŒò—QI‹:ÂN»1¯ØY» b[¯-ì-8æqOÆRçc¹GNsq<áùÚrì_6’Ïií;Ï÷Ü•-îfÿ¶‚ßê¼Væ¾ aÂHMU¯ù jÓŒ›â&Þ“X]¼õ®V…ﺋô»ÔIEî€+Ú³ )’ÿDsB¯¥„Iv„Äè 57i°½xË üýÑ•Çõޱyai–(»°Ä¯&Uôœ÷¨°»©°¦“ÞJ¥ôm$ŽÓ‚ËaqÕDวÆ}N£±ä†Í-æ¹3G~NaBÞ/KghB*YŠ‹R: ø Ê›¬x‹ÔP{A¯ÐYC´‘t–9éq!š¯.Z]³EžÞ™êcÛš2 Û5ætÁ\}8ðc¦ûÕ+©Yªœã®ŒnÕt» hK±áw—)¬šùÅÈ 0áü@Ù÷æ!¹ÙG$ªÅPð ¯éw–H4!¹Dƒ¾ˆ<ŸbCºÆ±Eni|Ž3ñ#öpÕ³àÔ‘R³‚•«ê~ÚÏ…çyFy=Sgf…»#GüÄ¡ÏH@üŠ'p*༘À«˜±Ü;¶a##M’»æ”Ý/øÓ ˆV;ö} ï—_!«ìDy]ôbmw™¼nzË@´©ÅµÈ’¯­µ¹k©ÏÚ—a¬àP^u{‘XŒ ±!è’à\·}K[sr Š|Ew}¡}J ®™È>­ª~ï‹¥ðŠ®mˆ½ð»c÷‚T·=a;φ‹Ì–Õ72ß]ßK£QC6œÅà jj•ãD‘ksÍ3´;.™ý|œn=Ƴ3Nh¾ùð²Fœt±ôì8-§…ÀݸÀFì]áí×: H¡x„ëâ‰]ÈBäÒPmôØ*DPÁlçŽuÃgèÁˆv÷N]pÛ‹UæÈ—`ɾoc¹þ…q©ê{W`ûÂÅS…àªüKªæq{WŸ­Þ\Ÿ2VÉ9À/¶mw߯¼SÔþ{¦ÐèBNÈV™O³H¸ádKýö lÙ¥6Õ~)-ì»»‰EÿÚŒ¨…ú<<ŠÑ8¶=azÙûlOW˜ŸFÄúbÃú¦ô?ü¦£Úƒa邾Ü5Uï*±´u†Þä-ê<ÃÙ ‘}»Œ¹´m×D,c(R×í¼„+X^0þI=è³òy¹eB>—éÀÙ°i†Ú¿¸O™vårªä“#Ý,ƇVˆý"E.±† cTsétàû¢K@NT(¡ÃJnz>¢±‘Ò˜·Ãv„YlÞúÖû!ôl;ÅÖ!ó¥÷Œ‚ê} £QÑf r?מ½÷`N¿…ï…ÿÍ€K¹nÍ]çò Ü\€aºÚ±[bKkïB0½”Ÿý•ÙJƒ¶ v¬¸¶ vþ')¤6R6(`Ênpqñv¤úMÛ§MôGªX 3YO'.×#Ubv - ³:½/ˆÈjòQ—ÿ§rb‰cMóò•¾º÷À´ Kºç¦–B¤Ú¾`m\"ô%˜r0hÆ:ó.óy ú p.šáGôÀü-™hÁ‚dö’u#³‰ÞõözW™µ›½Q¨$è<ÌuÌËlHñº¹ÃËë[§”|K¡æ £øãè2åZ_+JåêÐÖ‘Q!4Ä&)-›dù€ia¨ôì°¦³»â_0kñeT½‘–.×T]¤¢¡èQÑs”÷1¼¦zÊÈo¥hÞ®#~/¿{ºn Ý:†íéÅNžA‡ð !ŽÊI¥›¸ãOÔŠ½ÒT®ù]:2=áz… )šUj%çFÚ=òû´Îõúñ™ŠQH§8Æ~{µ(¸Š^±†ú\>Ä@h^^w )œ¾ê¬—§XtX»°‡R»ÚÓý¦ú;£G£·K€„!ëø,k6ÑL¡]*â ƒúµªžÓ‚æ)´·V¢k‰Ôîa&ï•Íj¶‹ fbfÉÑúó\çwm—dÉãëèªë˜Õê¡Fú Æx}´It¿©²oÝ‹²Ñ+™½ýî !É… q û“ -obVGQ1Pœˆd»oŸÌ'ªÀ› óLn_ˆsæ#'ÜÖ=ά=|h=G‡Ç¼H)Î:lvÌÔûùSÝd­Iו$ŒFQÉIñçãñäE%ŒÞeתš Ž\fVÑ7nÕ@œöªèJ&#¦_(Î=‰ˆFøç#~áŸ~üjŒ³îZÐÀžÓ߀ªÙ›þïÀw¶;ØëJµPÏË¡øn}nJ.tŠÃ·¨ÖÙé/šs½¼•Ò}<µl£…“ìçù‹~ó™WùALjpô#x"Th]‘ñzÓú=Ù&ZyäùŠëEöË8Æý§, æ±6±kàŽYD ñhäF{øbŽ|çµ—$»sÇ*è0‚;ñ?°¿ek5Aãòx‘ÆÛŠi,µð·¨8?mgëVGêl”cbX e4z€Vá ÙÀÑN.âÙíìÞ‹û“RÐg&”f`‹Â5Jvw. –^׎"_¬£ÙD@>þ¸í5øÌÃP$ÐN­åUÎÕ~F÷Ô:x’ix@C‰ÛâTzÜåGÊ\­!PÜúöÝ–×A¤ …’ccÚ±BÞlmD.ñM2 “ ôÖ,ìùbÌ'ÆÇ„KîîãsUvt~Q¥HÆÈ°/*êÌ­¥jf8ot ö/Ú¶tÙÈ[=l¹Õ0ø×©ô+¸šz¢q$ú´’|k(Ôï¡ø·S`ÎÞ…|89ÚÐ"YYlñ­ ŸÓÎÞ³HGc§u²èå€DWk¾}Oæ-ù>á\~ÐßZ.æém+=^ Ù\ý²ýìÁý¶rÜÒç ívbA%Cœdö½gngoùÏdvÕ¥nhf=úÎu=¿ÓKãíËz5—Ê—§¤'AÈûë Mãý(Ú‹«tÉ©…Ú¥u àgv±‰*&.rùR{t· è¡p볋-’Í=iWÇ‚ŽiC]üШ‘fò˜ò>g¦ÖŸ+¢š‘]cwl8K„Œëâ8R³³§ß¢"«Š@KŽñò|œ6â#âͰ–cÐkbíëåC´ÃKd¥KçÅÑ)QOªÜP³)°­´ÆN¶ö ¾ÆnD|ó?0Y’Íè”-T Û÷z?¹G¾O|=ùþÁµ  ÏRÊ[»su³¾Ÿò‹¡›Õ깎x®½ó/Û3Ú$·E¢5¦ŸH§Ü·ÉÅ[/fÉ/ëº+òù<ñÎd“Ü轎r¸äÜwï”Ôè{pܵåªàq…þ±»Õ%{{ùp_ª.h³‹-r)É·)‰®âé­ÍÉ ä‚ÕqœlkuFnRî’Åg*­$¼ÑÑ&œÃ9ˆï5F3Úf*² h^‚NÜÓýžw»†» º²ôšÝÖ®+¶u¤B qå¸Á‰5Œð¸è%ÔËà—Jò'òë¬Ï#7™˜ÌøŒ$PÊr'OË”.ÛoOŸŠYÉ‘uv\Ê´á#µ’€/'Bz‘7^ÃöX­”€îáK%1e1ßöä×T9ÇuʭЉä«èeõU×Ä„<†ôºŽúP:½ß»öW*(.u??+}z K^Å®å5µùxÅôˆÝÕ¯˜ÿѾÇéO¹wûÔà-ZîÁÃXÃÔ@Š Ï‚”÷ù‡(Íçù'Ñž2bÊ«Ö6ÝÒ]o ‡œ«ãeäüÊ[dPà®}°b¤Ç©É¯.e»{Äž¤ 8¦÷e«sSj Þ{\¡<Síÿ+í'Aæm^LLÇYõµ˜‹S«7hÚò¢ðüšo!Ó—»58§¾ÎOy²¾°z‡ ½ØÇuÔ”5(4õ¶^öÑÜ;€wâìoSÃÿë%=E?±¢¦qÁãR¹¢?¯µLãÉ4ÁlZ `V#ÃLÍzˆ~q<ÎÇÊŒ°äîìDÌtŠüا[mMëZû¯Z‚(-ÙM¹Y ¼ºEù;Ô¾•A@ûß ”OU<„}ݺbrÊ4 ‰þª+Eå–=3q*èçsåiJû1žªâ‚SÛ¦3¿ÞÑSLeŽ“¢£ðmáO4vf{.ßnŸÄº²Owš±(HKjC!1ç;"!ïEê<4I}´hÐn5øÂ;‡r¤ o¦ò­Þ…‰©ûê¹dró'ȼx½8äfÌsS‘%QêRÁîÏ Æâ÷ |ÓàH ¶\PÆ ‘<cˆoü˜£• (ÞcZ›Yø­ù ãF¶ÕåO4åÚEíå%êÛF§ óëâMÈæˆ´7}w4ÑfXfL㩆øê—ô[5dêÌ aÄç×Ñö>»BÄ%a^ðþ¹»¿,z}Ñ2\‰B³{×|ŸÛ³öÞÕné±*éØã¾••è ~¢Î!ñªâ±éxgÌv‹Ô™žì×׬ÖÙòÝzhßÝ.UPeÛãû·ªµ_¥9h©ø©>/âZ‰g7ŒªØ Ê *twPá…F ¥ãS%T¥ô‹}¥¸+BQ)@>ÃÈ1Ê錵`5}N™Ëg·¯PQ)žðË_ukUÉÇÙôdÏÒNü LmÔ7K1V]k¨@ƒ#†;P˜Ç¯ï—ýT–áá´íqéÊ—§Cඨ7Ôº«ºRkÜâ¥bêâK\x‹¡´Ä‹B*­ax¿ë¢{¯æéâ€ÈÌHßoÏ÷¯A‚·®ø©t~un¯$‹¨4;?s³ãߨ&nÛl9²-RÐ# &¿ïŽêËûÙ/ûLÈñ½W¯¨Ÿ@³<™£Ã•”éNå”ã¾Ãð=+œ§Öþœ¸íBðzøœû†Äò Aå—m“O>ƒ¹h1ó‚f‹³¯°˜çjµIRš§Lxóu ZÅ(ßÒ}~AxŒ*Í`¬8é’^£<Ë--%¨"2vp… f°7'BæK!ØrÆj½äM†QUÚ|šq†"ü Ç•ù,ÕÆOÌŽú´¨c¯fhK3 ÿ-B®á‘ú¦ê6%¢?­Øð¡c}¡Š¿ ')÷Ž8Ü´¸pW­:×ùD"tª',&bÑüq ‹­zໃۚ{¹Ð°Î“Ugh±èXâD¥§eÁHÔvèQ¸æçHìºñ Ó¯[y\Rc'§0A½.2[šŽU[fŽ›ÍÖ}¤*mÔö1º ±ÆF ŸB½Ic D¬6¾ç©g˱Ûj9»ÈÑw  SÚML²xùH »÷¨—¢‘Òå®ý¼‚;‰ß—¼Ï;m»´YÙˆÖ>vZ^û‚ƒ3|³2Q.¬½ÐöZ‡æGQ ÝÞâ-†'÷]6K±_T}^È]X†j­>\¡vÐÄÇ3‰N›ð€—[ý"ÞºŒ½Xü˜í<´í#>Áó9ù…èé<=WzTÇÝ/ ¡^ÑpËP´·vã²#}èð@µ#ô®çÈ‚d ïÑÔ6*%™“?$à†‘Uð„ç’¬»¶·0ké)/Q>FR5 ï›)=Üà÷³wž‡îãguKÕJÔ*7ÍÅìðÙæÝw§vj‡xßIÉM¼ÎŒäÑ–—I‡ð`ØyÚ´zêV{-K8ì~ÈŸ'ÿìdÓÿÒÓ.ÇPÀÖšE¸Î×rüÞTƒžµhØûËÖ\¾…äzTz83HyTH®†Û™›ïä‹ebu ZK@7‡qf"®bÒ vê)ó,à¥éÓ¶u/ú½—eËUªì,%†tZT 11¿ðaºÍÕãIàÑ]°ÙÌǧ¬!²;‘Ú§0º*UÓFɇ—ñoyìk 𦾉M-z/Iºô‘r~’}?–k§‰â±®] ±wØšgv#Ÿ‡šnºØ´ÄÚ*Ò*…ãv|'¬^싦ö~г æ#4p#õ×}¾Q ®º¢•ßÏQTK­ëR,m´Y³·gŽh¬7ã7¬íEÛòX5ðߨ«9Y4M3ù•£¥‹ö+„H¾Ž(ó2[—Ü9çeZ÷)½8|- Û{1gT壪tî´–æ²ÎÚŠ-’ˈ!«}»+hk›ƒ.l[#š_ e¬~¨¶˜'ïJ<—œãMý†ÊS˜à׈ –JpâP£±QvA¹aÑôç²4]ô¬ ©w.ïª^8¥,47ü>HÇÄœ´=¥˜¨ŒPxdL=”µ¬HäÓí,Tcƒk”Z²–‚­ ¢ËС/ÜëEZ]"þKhÜR"¦–lŒÝ}ÌÜe–×7ÌÓBî~ÐÞSt"™ PX;î§î…]øX¦@&‰VäһɑŸŠ‹Ä!`_„"I?`’<šˆGD nçÛ­€+y„–AP†¾üÌ5ÒÒ;ª„D/M”ÌÉpw¢øOJUÅ1UÖ‘ø#Ó¡ ;Ÿ"††ãÉ;ë’ØWaø¾P•Ô^Þ'Ÿ—\TÞ4Nèñïkmôîtîð yÎÖ¯ÊF¦QëÉÆKëÕ`–®Õ‡¾­LÆúF¾ÚDUsH¢ÐŠúÍüªkâÜrP®»áäC··t .„8­z¹B¤Þ5u[´ ²›=7nâ„Æ ¼níevëò4-V€s?'‡¨[ØšHvs‹çs.j‚„ÏÖ ¯ " Ø<ݯ-® '㞯p£ÏÅæÖ¨jýpLãá)ØÔ¹äÇ=_ØÕ•f±r½°ô}HUŒ?ål¥iE¤ãóËi—¥œÍõ͉óQc¨¿uÜ‚­1Ń€ö|uòá›™–¨ßâÍ>É¥fˆyt4"%"—^áýW”उà>Œ°ï …t›m+Þ´ý4¿úI24/TPÃ%`§Bí)z2¶7’Mš·å²„Eð1 Ÿ€ÄV^E¦Èåê5ê@³ ™qÏEU3óñ£xäuÇû½_XìètlPØgc¾=´ï áMúÚŽÄ{]JÒº>>«Éê(ÆòÅyÿ„:µ%L°/¨ø‘,hVû&•ÀЬ²Û´¶­ŒóìÚzïå íLQlËð½•R +`–•ø³uª Ï”÷ö Ân&Áò|÷êgEò§;˜äå‹$¾\ÿ¼v¿wtïœz+qé–‚{hC8VuDXTh¹Fg'6¦îâ[Ü<Òœu×¢Ü6âP¤÷9w íy_²qƒ¼´æ“ȧYNW¯Šiõ ~¥T U}H¾ïœÌdD…¨~ [C çS "|6‰ÄÕ''ƒ±`ôQز@KÆgÛ ¨lÂ'š1B¾ñ‚×~FÓ/Ír­¹›ué|…–¨JnKÖe—_;Ë{—Rð´n×µoª¨–';A€©À] ¹Ù㑤'/£å¹cšŒÚ²ŠC×5!lïNYÍŠ=TWx›¸)Èõijgl"|F^1ÁTcáY‚ð‹éäñêwFª‘ec Eî®°å ¼•Ó‹^ã}C•îÍŠüœäÖXXcÝ4ñ’³µ[ÛhÁm˜µk>LéÃpØbÑTžD†Š±^iA#l`§Dñæt´™•þöh­¸OizÀ[ŒZi^5Iæ’oH¶6ê¼ÛëÁ<¸ïOÜɘG…?çíõƒ6ŒÞtˆV\ëg±_9äWÉìüøÝ2ô Qê¥éòn<êQÚõ;3ºCés[s•¾[»™G£éƒú¡Ó¹62CžäþÈõ]‚²°U(KMéèÒ¶¤Ï(ŸÞ8 `,[4PD,ûvrMŠ`ߛڌ„áSß³º«¢D”–òã[Æ=»ø-‡O~~O°àKÇÏJÔe8ÂŽêocS™%N„ü…WcCLZ#ß¹¨˜/çHäN uA¶`3*`˜çDDsßEáÕ–ÂeW°÷9û|F¢Ao,ëâÀ”ÈX•ïðÔqã°{#Èâ¡äç°š/ÜßÌsL@ =ïxJ±ÖÌÙßi0Õâ0è3 [£ÎïS¼…Ov@“m7¤˜-6Ò0žÛ-þªª; íc cÎÍË!U²R[a™%P§é}ežÜ“lË‘/Ó4W•²Æq<Šã†Z ÊŸîÛå•wL†m’ÇµŽ§Bæ'|A;å׉5ñ0‡§èfrä ¾^|ƧûM„ê×…Q¶ÚV,ƒ§áÝ©1‘ÒûÇ/x_ÕG÷«Èu#—õïJ³¤ÎhŸ2ß¡0 ¨{ÌîOÍËrŒù‘¦Ý‡ÌÖ¾ã·QltºO×Ò.Þö/6M5ÍxãËølÿü ݉šnÛú"E&³õ9ÿÄT? Y`aU¯y- Ò¸½›<_ýóÑ¥dîAPr¹è%k‡4VÙ °íXn¨Õ‰-~Fb:™Ë}TOÖã–ºÓyôp´¸fiY™ß¶Ü—=Ÿ/6ó¨K;[cÝüv¨œ=_¼ÖÂ44NgF¤ïÁf|†u1'zÆ[ñ}t©¢LB ý¸¸…TuÜüLÈÝl£dì¡ÇS¶×*ó gbÄ0p)¿˜ïT.˜sL·½c½‹J±ÚÄø÷b!ÅÓj°CQlŒæÏ(@+ÝFª½©ˆïB‡è*a^+,ÕATŸß†º©©[…à¢èëÌëW° «Ð×AX¥®x°ägüˆzË£B°­/©övü=ð'»*ƽR箜]óª´ÑPïdÈ‘[Š]hÇüHå¦f‰ô¯Uµ2CùÖÂóÎ}xhÎ6«dÃÿ¬ñ–jÅ}I5\ØbâÆùÞìè ™[î4äÑñjŸûlûÑbÈ«}êåÇ 6Xëlå¨O=GŽcÏœ0õuý—Èo”{nÅú/o´~u¯Ò¸-‹ð3`ÒÖÍ?t0ùš¢òiEgdòвùF'ª'÷LÓùïž‚zÖÉOoüÏxG~àtÔàå¸Î#¢Ûõ0“Ðè\n²W:zæ’-ôAŽX’6¤o¬î7ù~é_´…o’(7 ÏØ‚·üн÷Óa’%ãhâ®È™,©nå ƒ ëÉæäLÄ{æb+'ÿI ¨K>ú™GפE„û îñÑÇ‚QSÉ‚Kˆ˜_©$›À9Ý»†Ý=·§˜$ߪŸݵ¾u8u0VåüØžïÃïe¥•3N}ßDy‡©¥™««dˆAä߇Ïá 5*s¦óˆ&‰ð†UR2c=üƒd)¡®ÑLœ´„mO*n¬âµG£Ÿ‘2N9æñHS…òà¨~Õpõú yŸ§«©Þq µ ­&ÛêTgw‹ÆÞ=p¡öèhcq7—3ðTŸB¡€y1rUáJªß¸ Lñr hóêA…/ÓË";˜ìbëÚë¼v6Å@Ú…¥àr:sØJì€,¦ûäeHKJI¸ncÊ„pºy øÕíJJ<\î'4nTÛ²xÔ€ SíZBßRƒutUž”˃ó–Ô[ÉhúäɬÕc>}3Ÿ†ùè`¦æ€ÿ»„mظD€’„‡áÁøÞæ·Ò@¢ æ"cÔB§Ãº0½fþäéŽäÊ<ÎúH c ¨®úŒ!…[yºRõ¸ôÔ|©J;zuàô¾çaBK pJ"ªS½4é\ÿ{«å°PoÊõ¬¯,Ïí¶‰k­[Q1X•.å×.7ãâ}ÍïJf±LÎ=x?ʾÒ\¿x IÊÃ*Dîë±TVÀFŽ¡8 ¶ \üx’nÛ’M C±†$^O Úñ>Ž”(èž'ׇ_±–|žü6såA2¶ÜÐ9i `0¬ å;w¬ŠÄÐð<…mÕÈÔ\Ò.'Æî4Øÿ4I†³³Z/ßV7IŠÀ“>Ɉ/@1‘¼L†ÛäÀÀDXY„‚¤—šƒ­%n`f#ÓâÜIÒ–Œ¿ÅŸ^þæ¸z«Ë<Áèg%IQ^Ó¯ês§âH*_Ù†¯*¦€8ëWjJ)[*|XÒ–óï¯O£¹G;’l=«v–nµ®jB6áÔîŽ"Ó­qÐLñ&çÙ”¿Êx(ȧ Ðo2“RJéCà³SM¬Ci!ƒ³Ó ¯CQ3w:¡$Q8G˜®t TTì&ôaý2ôÓÿXpO!“Îq9“nsÏ¥ KŒžO“&ˆ±Ý,7^ —×t5ìLdPçf‘éÛ[hðTÄ„*úðB¸o„rqs\˜k5 ÿUý8IÌ2¤<9ÀØqÐÝ>"JtI–Wšg$Ê‚Éhj]•<ëâû ÊDú©Ô§P¢üǨ aŽJºõ¶‡ËÌÃyG_Õ#.K}÷݈~ …3ba·žA Þáw3Øqj€ãÔÓÛÔC%Ú§ #ûÇ*Œ[;’˜—©¯«Û†X_G¿´×#°ðrÁ¯Â92*’Eø‹$Jc±~ÍÅ9ÿÈü¡pA`_7h(ˆF $—°VÅcËûÖ& o¥Ï¥) Îlâ.ӻɴÚ5ÍKÝlþ šÈñÖ ¯%„oÁ9¾ûEùÂÊ0f¯¾3»‘³ªôlà²0ûläÌ*5^ET¤Âþ¿®ïëHéĨªtAxi/.8>0BÌoà]”J~ªg¾)øø3kp˜‹ðAƒ ÖkYm”ý”âÞ±”ËʨVRÞ±×%Ö ˜)Þ¡{UèÕÚ\Î 7¶¯’Íb"¼9Q&×ÏV74ÍÈghAÎ èï†ß*¬™dU§fã]Óˆ½‡j<—»OþÞU&Î7õk>Âó\³ü-ÒVïz0ÂøÛ ®­ÅëM1.Y͈¡‰0ƪdFÆH}1>Òenø:9›‹HµÓÍ8¸Ÿ@ ­ì%C(è+b2¾ùL+>„•OKôÖ.R¶x=ÜG‹‘4‹ë¤JÂ>:ESù\¶³Y’Fõ½·Eõ˜ úÂh^}÷vÓä켇nÈoØÉ’¦Ž9wü›ŒK)ö®l¹‰Ç"scÍl¯ìÍÕ8Ta‹³V‰äSNœ2“){bFjºì ÕݦÜKhjZCGös k>ÎemOåû `ÃPå_zó_é\ï¬AîüZòm€²ÉˆCJƒÙ!BkzUJV„@rÜp[pK‰$)–‚ú—†Ml"eÐP,óSr!îÿ}CÙ2 endstream endobj 408 0 obj << /Type /FontDescriptor /FontName /MDVGOD+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/C/F/G/H/L/N/P/R/S/W/a/b/c/comma/d/e/h/i/k/l/m/n/o/one/r/s/t/three/two/u/v/y/zero) /FontFile 407 0 R >> endobj 409 0 obj << /Length1 1620 /Length2 9042 /Length3 0 /Length 10091 /Filter /FlateDecode >> stream xÚ¶PØ- Á!Áƒk,84,¸»»K t7.Á]Á‚;‚»[ðànÁ%$8Áý1™¹3sïÿUïUWѽ¶žµÏÚ§ ¥TQgµ€™¤`PgvV ?@\Qr²è´´`g;Ð_ftZ-£åÿW€¸#ÈÔùÉ&aêü§ƒä\ììœö7üì<ü@ €äûO Ì‘ aê ¶(²ä`P:­8ÌÞÃleíüÔæ??ôæ v>>æßéQÈln (š:[ƒ OÍMíê0s0ÈÙã¿Jпµvv¶çgcsssc5…8±Â­„˜n`gk€È äè ²üA d ýÉŒ a vúÓ®³tv3už v`sÔé)Ãjr<5¨Ë*”íAÐ?ƒþ `ü5;+ûßåþÊþ£ú;ÙÔܱ7…z€¡VK° ,¥ÀêìîÌ 0…Zühjç{Ê7u5Û™š=ü>¹)@JT`úDð/zNæŽ`{g'V'°ÝÙþ(ó4eI¨…8 AÐÿ8ŸØdþ4v¶?oÖ sƒzþ,ÁP Ë?HX¸Ø³iBÁ. Y‰¿BžLèÿج@În ÈÃÇ 9@îæÖl”×ð°ýv²ÿa~bàíi³X>‘yƒ-AO_èžN¦® €³£ ÈÛóߎÿFèìì °¹3À d†¢ÿSýÉ ²ü?]¾#Ø |Ò;øÇçï_†Oò²€Aí<þ ÿ}¿lªºÒ²šL2þÛ'&sx²prX8¸>.nÀû¿«üÍÿ?Ü[ULÁ øOAY¨% À÷'…§Ùý‡†ë_ª ÿkcÿÝA ö$e€þ广OØÿŸõÿ;åÿOöTù¿)ÿ$åbg÷ÛMÿÛÿÿq›BÀv<)ÙÅùi+aO»ýßPmП›¬²»@þ×+ëlú´¢P+»¿Çv’»ƒ,TÀÎæÖJè?·ðTÞ ©ÀœÀ¼5v ð|Oûfnûôž8=ÝÕoèiþ»¥$ÔfñÇÞqp¿˜::šz ŸäÅÁÍ ðdZP ûoeØX¡0ç§À=o€%Ìý}à `ýÃôñl*ÿ N›ú߈Àfúâ°™ÿØŸôÊú|Ê´ú|jþä°Ùý >•‚üÙŸÎý|*åð/È`sü|ªìô/øÀæü/øtd—Á§Fn¿áÐÜÅÑñéiù-ò§ùþÿ~Ç@ w9úÂ,Ì\ Ȧ:¨õªR”Äe{TpŠv[;™ÅsÁ±Íå%‘¡"=`ÕñB4ñköÒ¦$ý¹È"Žç^S-Jhs¼jË­×q¬ÚÄv úü8AßXþžhM/)‹†Èw¯{/-[„&ø9Úl^L•\¼+·i÷šÞâoÃ!³Ûªß+ÞÈcÜO²¼×Œ2ð/œ¦Í1˘!¢Bvf!CeÄ=vÇš>¿˜ÂÍ{¤‹eB÷ÞÏùÉSo#úzæÝr©‡S'1 ±Â9îðÄkO±åç<‹ "±Y‡8rïå2 ÷ÃÑçå(é¶ýº=mFå¿ Hì_¬E¼v…´ }¿ôóFF=~'Õ*^‹ù];XWÚý‹`3D•–ð‡Õü¶ÞE‡×ÕŒËÜDa*ØÌïÅ0°}¥)"ú¥c>:=¿–^fñofwõùü/íÇV¹’½áŽÝ¼ubº8º˜»«*S‰ҋ¹ÙØHßTRxÚ±–Ó¾|O2‰4FýÕÚBŒû^ðö*jVJCqãvLëS‘¢Ì³uê­¹ =é¶ó“(JJõ¤Ko+[¾ \Âý±çže÷l¢žaWBW!jÁ×ø»^ojÏìžsùÿ¸`tß°žl]å ­#“uûhÿb0îm¦ïì±.§á×Ôþ‰ò{YrÖ»à;Øør˜fµ¡¢Tw=óÝên³v{Tà ³FÍ …Y?ªÉ ë †%2É›z‹RY5>8‘· ųwyÌA¤êQñ—~µLYV¦£‹j‡Tño!Ò~ ¾¤Së5X¯J»ŒEáPðzÝ+$Ád¬’Vû¿&kwÒÃUœv VU­é}‡‹î’ê1) gÞ¹4VD,›” ó˜i¦D€&fÝ®tX¥?m«Ñ—QÙ ïªlÍr6üÜg­Wß­vÈÛTö_ÜÆ"}üE¾ûlHQ†°Ö3Bzàr0âKÐuEèë >|Üþ;\‘F”HsìÃC¹W«DCÑmµ‚h\èÙ'ónàã9r™…ç©J_BMÏ%-,B##rˆ2f$VPñ°ÇX<=ŒU›ñ6!¤X~n¤1%}מó·ýÈ@÷zÅßi´ôò\걬[ö༥ŸÈí÷5?ß²;Ú·I1ÚRm†!²•cg½$×op&"GÜ(Çdˆp•ù'©žU帊áE—÷® 1X~„z[LÄ„‹-Ö¼?´A³8fñdl¢œ]HE•‚Ô½_nû~Î%2ʇoÁõäM2¥+5–¯4^àE5EÊ“H7Ü4zßF(d›­Yã%x–Ÿ3Žé_vy÷îˆe¾s#“?Ë·-`xÿƒ )G€ÊDgÚ‰ˆ—³L0Ò«IÒqgC|Û/š"™™<–œöЇ¨˜c’ú¶XÅU,z£=qv)e! ŒS :ê†ÃIàÇ¡ÅÅ:>µY¼çÆs_"cg¤EÛ.1±bó>}mI,r+ÔÖÕèZé Üô;t¦üå5=j=À„ÂÈÀ¯Q.w©ºûý¶sûµÓòC!)%5‹AÒãC§K3GI[¶Wȳ)*Û.ÿ O•ý¤òq%À¬Eëah¬¶~T×÷à“74¼…Å÷HMG‚lPØð9sÃ~t·4VŽ›»¤ÙêÏ+i™²°1qzÿè…©ÛÅÚ`V–™·kĨ#ÄXá¼-r+ zfó5¾ÒÓî„ʯ[‚¿öêöm ®áôÝ͉î¾ð@i$}Ó2’‚,… æQøßÜ\!G¦Ú³^ÝnKЋˆ–¹Dtý&8͵<.óVÕn£ÚRu]YIÍf·˜ãã¹½kci|L4 CÈcŒ]ƒÓ"‚SëØà¼Í>×£û邸^u §w7äQžH±&ÝÝl8¥í _|£K|¸“†îµlÞš/9$ØÐb¹ëmùs.|\¼²ñóâó˜HÁ‡¼¦‹L—&QA5Øé´I!ÊÎJF¹ÖõÌ«O&4xlBïêÍx2ïélvd‰‘™ÃiÀÛ°\·›]í¬‹SÃù "ÚeytJš%›Á´ƒ§‹qÁL@AI†bF•¤ý<+A»ZÆYõe¸Óë~·ÖtÝ8‚8;UíiÆ{ Ž|Ëž¦€àcr¢ wkÐó·‘·>XöIiNŸü°!´”šQ93Qêû°P)ŠXêôÏî'š‡yÿÜG´Ï5Ž­wL1©BdhÄF¤Ò¦È;¶9-D‡%h.ο¥˜1ßÚϯ»Ö!kcg{{Õæ^¿¥ó(žšÕ¨xª£°IÕ)ô9y9M <‚KW«‚9óâ ƒ)m쑘¶:X›ßVe¶¿RÝCŸv…© vËŽsë7iBö9¶Š.]£Ø®cõu’"B~¦ÈºªÆ§à²äÕí°v2´Æ X©¤ç—&4œx0ì×a¢Õ3>Öo·ê ÿIþ °èó<Ânô[Ù;¼äQþ[§Bó¶#Iäí$Á^t/8½Geb¦µòá-FqPnª1u¦‹w2"ߟõúg>ÕdÜ̧7ü'*b•Ñ+Ý1{®U“ÜÏ#^œ8š®wƒXõoDÔÕc*»Ä@‘v)ã¾dëN¼võ€íPï8)²ã,8²Hõ9îÖ#ßÈÔgb"×oš¡*¸K„I׬Û_žaO[¾ÒÊ›y…ܸÆ^ˆŽà»@»Nž¥k†ë ´G·˜¡I¥ŠægìUŽþ”-Å7t}QÊP%±]+Ù ÑÉBõ³k¾ÐõÎX+ZhW,¾Ã'veÙ\4ª}šd!AAðoH®ÕzþÞ®DZŸ*cD\€¦Ó7§¹ØiŸ¾Nuò.zÜ$w}ÈŠFÉi§åØuãYªù°D(Ÿl ¢êTî¥>›xì¥ ®²0 e ¯®¢ÑÁ“ùa9Ó.ãŠ@bÜ5¬™—’¦¥3×’c2rû增™‡%ÎC¶_{ K­ñ=Vß47väe ñÅÌlûG¢Ðð}àñ"Œ´­ó¢g8žÃÀàó– Ã×5Ä´‚|JG';u-–ˆ•düÐ\_$» Ñ•iâÓæà2‘&|ÙîÒïíâ”øÀ² Õd—®ÏRÀ8‰ø,µt¯$¼Ûÿ•Î\˜Ì¡^Æõŵ¹›†ÀÈ;›°z°£4ÅaàˆÐÈfä0psëq²m™f­ˆ^ƒ?b?.8»™£9î ºÂ¾¥¡Á¾n©4eÚ$-–|¡lOqB~s½Q ÷4® ŠÌ§Ø3õ=õð“ÚlÏ£}3‚mÐÊ"¾kêtø‰pd’êRIyqua¶x) ;‹¥‚ΗNli%–¡÷þ£ õ,Ó³|wÂ@ÒuƒÔ?ùíÇL‘…l÷Ê DÚ䯽n¶#d;ÕX/?¯â&†&˜#–—Õ#Ÿ! ŠÖ õÌ$¡«½Ì Lõàk‹ WoQì¬j>ßá ZÄü„$'ƒŸ„?0ñö•´²&—EYkïW Òm•uð—†Î þ$•ú¤¥ž¤ËgV%ŽejÕÜUv_5SôœG ÏLÏM¯?ó„M®“o< ò7-AB_£Í'»ì–¿ ´7ÎübîªãÇŒ6âc^ɦøÔÿ¶ l™lÈðDÓ+åLH¬,û@]2Ðm5@ðÍãŠæ!ÐãÁoK©;Çî=²IŽ!¦Ž»F=úpË¥ÝÝDøG=!ðÁ ½’ ý¼[º'\ûÔ™inA ‹ ¸Ô‡{7Qá×—kÎÛ‚«gm193w®zñ’ÊÈÍá_­Öáe‰~bYFý<Õ™àØ(gsà«·­]«Þ‘Ð[¸U1 «š‡”H4ú™Òn|y®þ"Œx¦”^4,.\×´¦äóÜŸ^’,²ÎBêíÛ>ÅØõç^­<.ƒ–fÚEæ›…½þ…ß"ö_¨4²& N_V,K‹g÷Øå%ð¨61ÛµBïÐÃU†È q°éçêî“oð)—ÙàŸotª*œ#YÌI42…K T–âÜ¿=Ã×D Dªã„ÕF+Â=O‚ËØ£œxi‰RÕ!¢íÉŸ2SŸÍD(¨­±†¢ÛIJ.×ÝÌbØw§Å¸¯n¸—¨¿‡¸aÚm¾öežÁ¶®«ƒ%ôy4Ôê]p˜×°ë??DZ UìB«š÷ïE¼SµÅ ~î˧ôõî»htVƒÈÐ…œë93àN¢³f’Æxƽ)Zý[ß[o’äûâ|ÝuL;i¸¾½«Ü”$Ÿ ë÷T‘;qÕZåòú3ššçÅ*oØÑ6›ò"ˆ]wÖ¸P(Úí©\äéQ Öžþ ìóT<3Ù\“£qª!¿ÜÍ«,¡Œ¸$›#ê§ÅÜtE£Ç©€®ZŠŒT­TÎ%hò”måÈ ª•É™SÉá¨õ ­‚²ªóTb5]Œ‹äoкZDÒŒü5R+d.µEêwë½jŽN5ê?ëÔÇ0Y“‹-Æ^ÀŽ6y"É5È‹úâVch$Ÿ÷M"ß2g2˜ ˜NÑEUó¶C‡ ‘ø‘Í Œ_nîR£CVˆÉÏ—¬c‘ÌîR:lÕ÷XÓ¶ÞÉÂ=² ~l12u|WŸo‚ù‘üþMvÉ›XÒi¨øQÏj'qWBià¥ZÝ= „°5k »ú4Ž=bTVjV8å•m‘ ‰‘uºÿ.tàRZ€W@°‚iϪˆ,+¹®fäÛ9{À‹ñ)ÁLjØÚ%A  pä½Ã~åÌŸ2¹_V\BÑ›ßxgnÆä*ëoÕþ’œiÒfèâª+ìCüc¹WfÔ7D‘8Nó3³9p+Œ)«Wâe_øêqNªÏËµŠ”_oýÁ#_·Ý%LjTÝ,‹ì?¶Ik¼.¦¦—{/B‡à=Þ%x(FNirwÂp×nùè¯Ìƒ¸†ŸbÙ„×VCùÇA?3?MAËêŸsM…û‹§UŒbzlG Sô©ScN4 ù©ëòGåù€÷òelÆ´Þ÷’çÐWÿºÉµ“ ¥`êÒ²å¿aáImLø’- ›ÑÿŒMìÂD :,­áʲ^ä*HbjŸ²uÑ_(‰Q®P½úМ-F£sùÁg‰]Ñ O=Hôð2RŠˆ—õj9ê5»¹pu!eÄ’˜ rÕÙC߯‚!áý\(ÿ ’4/ô¦VÂ!acùN1¯xZu_Î {4µÜH#mªîy·å¯qЊ.Íyaû¡5À.·!Í.A´¸šåb*|$3crp‡,À=ç–P¦ý3RYQC~=ýn–¾ª¶¿lQ‡(¤–­Æô–cZ"ÎÞä$ÌxÔéšýÁDÅù„›WóxEì” ¤J—¯+kæÆÕËË R²R}}3fmq&²R|Áwy¡˜ÆÐÇy–ô™?*¤/(v¯Þ3e3R´Y¢]ó=ÉÏ›*òÞQÒua;Œú†žtÑú$'½G£ÓN[N§¾™/¥L.Ü'é†K,ìÄaà3S²‡mž%ñÀ"cÀOf…¥êË#gÞ•–N—Œs¹e‘ÝŠ¸sÊþdëçÃ;°iwñ”hD¸àÞô ¦Œ€™(¯*|9¯‡ Ò—‘›,û-$ ëæ>—¼xêCð…æ4Oj\`.¶âôJ¨á‚Ìš&»>‰ÊÍŒ¾Lq|PÚzë£7#yï%ˆ®%(ìåó “ÊAᵚÍ0ÕÊgRE(ÃÊ(Gãú<Ïn¬­à7’Õ_xú¶$¬àšð Ô‹žQ(ˆ”P³Ží£šî6禛SÂw æ‹çh“Üyc 2’ÉíOïâ©îÔåðˆ~A´+“ÓE¨'æcô‚ß©à‹£"†dm÷Ö×øº„ÁêÂN˜»TžÕ{‡,ÚÙLÔ’XÈ—ý9ò÷Fè3#a“´w!oÕ -)eDœäÆ:FÄ{.:(Ú¹>}{ˆwɹ–œv9— ŸŸ]|I!ò€~r0W‚ÒB0Ô•æ~w¦0ìüm’M™`¼Vî1õ;‡G‘&ê2€W/Í¡—ÿ÷¿•‰”ˆ•fþß-@Xùúè’Ž;RÖ O?z*Ke^ïJIÌG`¬}4©R¢Ø€cyïL~¶t¡‚&”h$v¶Ö£ž)Ÿ‚û„Rºxø¹`CiެK±GH;RâŠÝZ8¥}C+ IòQƒM“Z¿þú]QÊn8Quš¾W+­æV㸳ÿ£ÓÑcD#t:Õ|€5Ò‰pub3µÑܹ걋½y+ÙÆHp/C"•„oÌ}aŠÉZcd$ÓåòP•Ú^KOyИ‹ÁµÆ‹|‰ûy®—€,i^B q}ô‘Á~5÷]% sºŠ«r˜¿(ZÙ:Gr!ñbT“ E´ç'Ä]Óͦk dùú¬¼0˜!ãÖÀþ&`<ôû•‡­ïÑUÿ¯×YòÅÓ'þŽê˜Q\=Ñê¨cçË‚FU*œ#þR$C‹1¸J‚W×¶d^m½–üûl«µóɆL祳žñâ[hЉXÌC„ÄÚ STÔpÊC¨ô$š¸°—]ÒÆRV<[¶u aÂpĆ¥g ì"˜CÝJqçZ‚"&ƒâÇ®LéˆÎ|}Â÷™ü÷æuºùˆK;GÐ'2¢1Ζ‹¬ÝݹÖÙaí<ï9=ä»^/ømì”ýabTŽ×–hôd/¶4HišïÔò?ä$Ëø/ŽøqdDlyFÄ1½ˆ(Q[!¡¹Z×ÎÈh³üÌkUÍò'y)#qfRAÞ–NX“•ܵº'V®P'RB|›ô"ë¢:PÊþ#äy¤Óy¨e=¿ÂTž¸zRGvs4–Ôã(jƒý9°¥4竪€QóPŒ—¡€Ö·GÖ7EÖ7 KVä5Kõwùžù®…fÛ%·óð Sj¶l;m“˜ŸŒ6LÝwÃÃÑKÛáqN™n”ìnDN2¹äi]kÞüA¼RR‚¼ÓI¸*"ýîÙÈ®Y=!Ò! ºj–7‚øøÛ‰ ‰#dÝëåY挮 Ò­'V ï>9F¼~ø­çŒ,ZÜkŠvøHªÿÉÉÕâòøÜ/ÖÎ[î t‘h÷ЇÅûKÍUkq-=õòþ9Á… NæË4»DÃï8~¥×H>"Κ`iž&Ü‚Õ3柙¬Œ¡H z—j˜›×üÂÇëê ¾“ëÊëµâùy€–ã+ ßíÎm¶Øe±Š©_¢Ò&Úݪt1nîoÕ¼ÈvÊldÜBz3Ýõ¶hx3vÊ%£¢Ô˜„¤¡TÍV¯ ªiÆ«»9%q^y–‰Ë,µ¶LœÃUVX¤Y&Æp]xkwˆ DÊ8pŸ}ZHÊöùpñî]%•Ç´ÚúJŘ¼&—Ë7[AÎogŽÎŸF 㕺& =,͆·pÜ/L³8C‹gp¯*Ã&ç,WW=#5GΡ ;ò ]v½ X5GùÞÙfãöZá«¿‘¿ÇFzϧæã”M6š ~ºüH èÒŸX…‹ÌÕ5¹Çvr“ª{Ó\¹žðÒâs«àÿ:‘éxfDªË6ë \—–ȰŒRòõ¼ßØ?ÿSz4þ·R1¿Ãcž]@E»â3Ö(U¢.ÍÚ«dÕRÄKÈHÙŸ0žÏ÷7×f΂L²¥Í+v_µž/£>´b*rƒn¥õ›? å¥yÈ= C6 ¡e‡–³jyÊ8[O($ûÊûÊOÁ•Òh›ZSÓoÏ”(§ÚÆfØÉá{‚¿ ö:¥ cGÄáÉÖ€[ž—ùLMé^UK¦xû( ÷mî¤Kù'å:GöèO=Ÿg˜d¸8ì §@%v}™J×w¨ Q_Y¹n=h¬5‚_+JCIñ´iåtwŒ†äžÜLáÂâÙf¬µqâ7 ÓÃé„5y™©í xr}±Å‘ ªöx‰[4rï¶òãLÔ[2@bþª …Ãc¡Ô׊–u§JŽ&%y¼³È!…#ÎÝDa“Xné»5°T{añP°#$è±I†ò²Ü¹Úº¿ 'aÝŸ­´M¡q¹,6¾/G4B32Ësd{=ë¨<Èxô¶˜Gnµ6â³1Q© iÛûû6ê|š0¤±ÓóŽå0ûÕ­±ÜŸÇé.zUç ˆ,£ ê*Þ©­œ\)Œ,2ƒµi`ÂmcDø»ÓÓEø”ã¼%8+5‰ø¬ìѺîUúûH×yŠSüÉS’yÛº·›ýàŽ DócP{úà³ëGü9 ÷¾oÔ÷KÉ¥kn˜[Ú’ø-ˆ«8s\*š%]½=³`þCâƒö–9ó „PLÞZGóú±øBÆœWw…j6\­|Ôõ¼¥!Äj·*2­ˆáf¶€‹Ö^ ¸Ô£ÿ’Bþ=ÞXNZµ°|Ö,õ}žN3Á$> E³Æ8Dr{3Ù}ÑjËM¿|æ(ûÖ~ƒånæ™×Í2 ¡•¯E‰+jg?´™Õž_¡æ^ˆXìäÌêÝ]yèF[ ÍÇ™…MYçEÓœ½—Âk÷æîR–u}¼J¹»ïÙüÉèt§¸8tŒk«Ä$g¨a4(0—ȳ:0¸¥ÖZEúØWJ3©õn3×FF+7¿ºÙB%ªn]på.jüëáEa2š&Ì¸ËÆ5Äs4p¤Jr¶Jh©ßqë¯é ­pXãÊÕB4šœU’¢6 bxÕPœ÷¾"»MõL ^Z;ã]NE3§rþkøquŽI`j×ýw*¦ô6$îµ®ïƒ5|*¼Àþ\<6óÀó*õÉ-žØÌ!‰ÖÄ ò´èC°HþöW™»tl´úì->Ǽ®HXÊi3ÍÑʪÃÌ Zœ¯ÙmïH†9Ç`â唳C±Øã-Ö Ó-Òº÷± “v`‰®ºâ1xP½ùF0¦~j)‡½‚§’’&©»-$ðîn°>Õç6ÕÕr †Bš8Jö1‡á•Øk¶5˜<ø`|·DSüb„÷ÄG· òå<%­#—Y¨x†ƒ¹¢—Ú}¬ÑèÜãÍê§%& k­tB딞ܼXó¼öÍJÖõÖzæ< êØ;ã ›“„GèvÛ·àþNOMøÔøLŠ}%OWæhÒ±j=Ñî9q|sšÁ„@R‘»Ê”jììšWZëŠmþòpª¿—`hwÝi×h ftÏûsk²HÌ ‚œ÷`–SødôUá±X6K~<¼#*w«Zí5Äz b}»vèX Sƒ¸Å+w˜~³¾¶Ìæ·®|#‘V$XmFŸšH’T<¾ómßÓp‚ÚêhÛZØ-õˆt ѦÕE½)®ÓÞ$åÛWg ¿–Š7LÀ ¯MI”¤žyz)ûòžÓ»¹{ù5û-CØd³¿éà%ü²e56½pÔvðI»J´æp车'UÑ~Oàøâ(®l±DÆùÜ›¡)Ì0Nƒ€*—¹ºRIŒ`4~Nnîí¸â—òZrdØRÔÀê^¾0Ri»@Nôçv6Æ ‡~2ú÷ô1K´)™TK1¥4? ù½¶'HYC#qÏ5]çÓ…×vhðtnv:6n¿;´jö¸sz’ò—ª9CÜÂ×ùôÕ³-dšð“ð[ýú’{f˜Û¶âJC Öm†÷ƒ^=-Üß=¬¬b+”"Çû}3&0ï¢U@äÚÁ1X#më—#{îÉ|œºy™0j2ü†Tïü˜4·L«þ¦Ö×:BlÞŽqîÚÖáØÁ,·ð²HyõöõÄöpæÑ¼a®—ž¡c£1Î ëB*RÇu¯ée^ 9£Rm’è%@ ¡}þtϽLcƒtÈå™è6Óœ}Fã{@ÜêÒƒ±MÚUÈÍX³Ägˆ³³èÒ!Ô Í¥W¯6̨vƒ6î¸LT ŒQ”ŒdJ?øØ…5(Ò,èdïÙ` Ňp5}:ô™˜.øy—UÞÁ³Üp)4òoR»Qs˜"bSfÊn¡„§±¤ÚHÁòÙRNÀµ½ ­u$æ¤x‡{´¿>³+÷óå±hÞ½ïŸÀ­A,Уg–åÆ6øM‡Â÷E x,áAécêæ×Ý<Õ2Øt]{ñ¡*Ao}+OP”v“5^$Ö6fÏ h?R¨é ‘¿%´{õòY­FÙËŠgÃtÀ°Íw;ßT“fýBÓ%•]¿‚‘µ.52í©ÄWP‰¿ nÎ\NœÄ$¢m!¾Tud*¡Œ †ˆb •jºå BnåÇæOˆ%?€*³¿*¿kƒù@õŽ‹«û]>g¼s;Ïf`åÜIž;ˆq¡*þÚï©Å¦ä77lØôŸL`Z©šÓÞk±e‘@û•ЊËÛQ—g 72&t|‘‹f,cÑ/M] ~!ú˜%Áweç^ÌB¼ŒÒ¡6>/¥qÓÊ?¹—|k"í"Í^séc˜!KY±KÏBÞðë®%V¯*[¦—CÏ‹j¡SMÓ6m|ß–ÂÞ0p¶Ö4Í¿D ö¹)QßE»wë;CFãŒ.eØ*—=¦6 úNkP…u?ãå³í ïiÐFEøvnߊF^¦Ô°È?GÛð3zwÝ ›=°}€ôÌÎQ«ÈÓðáÆ CÂÒÈÄ$#ñhÎ y½ÕäÿV9à endstream endobj 410 0 obj << /Type /FontDescriptor /FontName /QYGDIU+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/A/P/S/a/c/e/g/i/l/m/n/q/r/s/t/u/w) /FontFile 409 0 R >> endobj 411 0 obj << /Length1 1395 /Length2 6101 /Length3 0 /Length 7050 /Filter /FlateDecode >> stream xÚVTì»'¤CJRp4H  éF¤ 6`°Ñ ©„tƒˆHƒ4Òt Ò!%J+]wúÕýþ÷žsïÙ9Ûûôó{Ÿßóž±3ëèóÉÛ"¬ÁÊ8ŠO( x¤¥'…ù@!Bvv(Ê ü‡–Ý슄"à’ÿÍþÈ B¡uŠ ÚM ¨»9…‚¢’‚b’@ @”øËá* P¹CmZüuŒ$d„pör…ÚCPè*\6ÜA 1ÞßáyØj‚´@(†®hrè#l `”׿RpICP(gI~ ÉpµÈÍ ð€¢ =0ìê¶ü‚ x ‚ã'd@ È?Ôú;”È @+œ 6`8à·»еújšmg0ügÍ?x^ @_ðïtFÿJ…ÿÙØ `Î ¸n°ƒ:ÚÊšü(O/·ýårB"Ðñ wÔ dvøÝ8 ,¯ ¡ñý‰iã uF!ù‘P§_~¥A_²ÜöÃQHÂ_ý)B]Á6è[÷ø=VG8ÂîóÇÙ ·µûÁÖÍYÀuq«)þéVþ£³£"@ PL\v€=m ¿’x9ƒ©Ñýûù8#œvh`?¨ýC胹ƒ(W7°ŸÏ7ü["ØBmPk°=NøOv´l÷‡Œž¼+Ô` DOüõùûdŽæ–-îäõûïá 詪j«ñüü·IAá ðáø„D€h®Äпgùÿ_Øku@Ð?{þ“Q n‡Hü}wÁpÿ“\® 7àß#Ð<¸þ¡½Phƒþü“ÿwÈÿÆù_YþÚÿg?ÊnNN¿­\¿Ìÿà ‚A¼þ´£Yì†Bo„½ðÿt}þc‰µÀ¶P7ØZÕP ôfÈÃíþ¾D(Rê ¶Õ¢l 诠Ó;Aá`úë™ Çüz×lÑO =©ß&0z•þ]R nƒ°ýµsB"¢«+È‹=x´$ðD/§-Øó7¯üp @ÃóØ!\ Íó@ýXýRþ–ÑuPˆßò¿ Ù¸¹º¢—ï7Ð]ü%ÿÞt0ØlC8;…°‘ q¨ i>«gðà[‘ùľþ$•›ÏgÖµÅí‚/‰»<#hÉõD>©¿“laM‰ëXnîÞ•ÏvÃ{¼ÐÆݦKߟ–qzcëM„3©{Fs·å«» îòÈ}õ½rñ5 tÄnÀlSgÏrq'Õɦ<óèRñ¬î.žz1µ®ûµ\Tƒègñ8_”a¤Y`Áû[ëד´,¸(>Füû?¶ÓãSrÈm¸•òvpöª¨/öbÜ4£¨¨0}*¬ªØù%Gt…ùá´QÏ7z1qÒV¢Ä¶§Ãö:Û¶i’~bÞüÌy% «OâR¹ENŸ«1¢êw7x31Ò‡ó »?ónònç¼’§êKHú;.%vü'bß)ž Ú›xz¤å¿½ˆ÷“—l^NC:bÄsTÜXö >Xû^plm.Ÿ- ×msp 4’æ›…ÐOáÖ?dgßq[(ÿ¤Ç°)rLoHöÊ”¼Hëêê}AS|°Æ)þ›'tâ1®8±Ï¬‹òôøùŠ “¦û¥°*QˆÏPª(ù¾•gy¶=åë?Ž÷Ýs±ª¢nwš“y× ¯Krô4vPÑ8êþòÙØEÕÌZ>¹l@90׳"f1®6Ý#ÃÏ,iŒvªHZ.à¶£g‡-×J´o{» †7Øçë§ÁlÞ7;‘×?Ô¦ØöÍkïi¤ÆŽFc™2ŠÛ׿’ƒ“·¥„â-&ñæ•,u2®«dŽ”¾ýȱv+™W;ªyäθx›ÆØUS#sбIÔWLð@ï`¿¥xR:æU„ÂÃq´à«²pY‹{°)ºÊÂJ˜½‡:(ÑÚê1Á2AH[»˜¥JàÙ¤®–íe­È0äêøß§B¾~iƘcõ £¸éêø¾C#cDáþ‚Åî„}ñm¯7öåØ)x£bÌV«ƒ…Ç"nkó,ãÍðpb¶¨<È¿÷Š/ÿ:¦¸­¹S<ŠÆ3«»Þ~Òó¹….§ðf﫟TçôÒgŠÏjË—Ä6–Œ;^“ÌXø±Õ™K|3ãÛƒt ÕºÍÛØ¥œŠÜtkÛįwãËÀYO/4õØh4±ÔA”:ÞfM?%/x¦HèVu’àôñ?¡9¾nÃ"\þ–ïÈ|ë&î@h °ú>ç‹(½`áÚåaÑWŠŽÎèá–½ÇøêVŽùƒ]»¿¢ÄüãzF3Ëlç#äyd…)Leua0…|vŽ7êÁó¯É ½]zÀ’%ÚO¸Qµ¹x}‘kÁÉÅ3ìßÎéí‡I•å[(sÓI¶6â5ýšÂ‚aÄ\æjÛL£w´Èlsß?¾p,à~Ù*·ÖVµo§_%òê&Iø‘ØÞºÔæ<7Îéd”àpI‹©Zkr•ç3Í+3ê;sŸq X?M_ÐÐݽ&åµu%scÖfxÃÙ–;T™®ŠÎ‹l9ðE^VØÓ@r’ÖUÚN“ɘûé8o»œDÈï=ÆrÁk“P$ƒ+;ëoB‰õ{f»†gwŒnÅ,Kl¢ÿ %óŸÛçvX©¦â¿Ž­jÁÛ$¼½fZƒ(uºÝ߈ð¼9s'^Œé ½ò4Ð7Ïdß¡eÕ|mÆúÂ2ÊñÑ„©gˆñmQ‡¤ 2w ¦A>HÔèÙðæ|Ùœ†#ñËü¤ÏÅ.î€ËÍt/LnjNƒäæd:gyû„ëËÕ 3óFÊDhgC\…4ðÛrWóëN,£Ž› µøádúXÁ>vÌÌøIwÞ–µ;ŠGõ‚cÙÌaoMhÀìÖâ¶sC]h‘Ú? çÜ Áw y¶¥vOöÉ^0ƒgãQÆq‰Æ#×WO²…üq^ت4¸®ƵÆ-‰Ôœ¿ÜsXx•9®¨^¥Ýë x?X.•«®ÖÍ!RñPAèM§ÖbˆT7꜓r™ÄŸã¦I_ȾAO$Âú¼¶ãº¨°ÐÖV\DöÑźÒU­2¥"£«ë½µ^Ü©~~L#šÇqT”é"y(–Ä[ïNQà ñˆ IÆþâM°pçÎiº“¤ ݽí’jóZ‡ò5e*ƒÅm’8}CV ­ ñ럷U…>]<öˆ;/yFŽ -ý‘9Qý¤A$’¬Ðß”¹É;'Vg®Žœ;Žœ{­Ã²™Ú1î:òÈ7½´”Ì&Ãâéã9<þ§göÚsÅ1 ä0&UómÉ£U±\%w»V5›«òétbZûfæËêÓš̱…šǧŠ×V4`OL‰F¬AX|ÄãÒq;·ìg9:Ód!çú\§ÐЭz¥‚8øi'-rÆ4*±bÔnü„Ê^Óîà¨({ñõùµóšÉ§ÐÉ;µ/HMÃ-0Í `û–ç˜`†DZ”uJ |ÄÛ”•Eæ•dH`h\vó%CñÙ’ð+^R)¹ÝÏ·GY=æs¶IΩ̊I·–zô$Pqêî Âz¿“8{…dp'¶3–[[侫Ûì-'¤ýYÒ Nºœ#§ Ð¶ÉùáX¦Ï*ƒ–%ÐïðÐÛ”Ù#ךÝÒ=1¢³+¤„cáÂ<ˇ@¡šk¨\û§4Nð‡‹ƒë0Á õû;]Üš‡3)LeùõÉRVäœÔaÂ]w&'o©Ý• yà;؆ϕEŸ9{²9ª7hÀû‚¸ÝYL?0‘‘‰1ª3CN€‰{Sß’¦7{»wWyÜ n°6&ÛLû‚²²¤ïªúß?lG~c!o+÷¹!ðN/§É¨×á)»õ !¥4Zq‡.Ù,¼mN….¡·[¬quãs©üƒC.Õ).Æõº*ÇŸ‘IDöóÎw®QÂt"Äw/g!ͪÝ=&oÉë¬ÓJ˜f‰/δ™03ÝíÝgܕþ_[Ö‹§ˆd{¥ˆ ‹)?tÞÙ»¡uÞÓŠÏz}d˜i#0¾+ÚÿÃiOã:ÆeççÌGµžc†ŠE:ØK¾TéÓí c¶ùKÜð UëÉ ÔwDÁT`Ú|VÖ³*—ÈpÖC¼š³•,Øü!\²œáçc6N½îßojæÇiŠ•r暦²Q¼úÝù X;&Se¤êW\ØÒ½Û;êÕøáOÆ·ÂsSKÔžPîíz~Q±ÄɼFPØ=·]2° 9´Ÿ¼ƒgGÿm3Ÿ(YvÀ/NîcxÌåÉàÙ’(GFºgÖ1éR/$’Pý¸Y=“XA;Ì‹a[[Ë_è:Áž©›¿…0Šèê|Y¹KU¿QÝ©æ ’—eUŽ”zúÄdõõ²,߀]ºnÜ`_„þ,¶ñí¶Ç4!Ž|Áb³¦Å6Ýõ\þôø|A°«N"ϲ%`oΉËÔcP™Hw‘.ƒóöÖ1>ÂéE}ý¦Ùžª~ ×°u7ªŠV’8tþV÷sO‚9ßðpBJŒÙÀ¢8ͤic©JFìva7g‰iÖ‹_ß‹»¤ôäL>¥v9—Õh…ËÒ™cðº¯äJug9nû›˜¿ˆÆåå;já–…gë×å5œŠñµ;6ÁªÉpˆ5nèy…ýŸµÛèÈž:Å,(¾%î4æ¤ Ò/=Û z“í³T1ì°&¦›Ø0é¯!³nÿjY©B†j_wÂì±uÅý@[æÝHÎÎTã£ì½K¥z‡^5£yv ñ¢Ñ8µNÙÈŠÙ)Söø ¾4ÞhÏ2†ÕÆnÍm¿óŠºýÌ¢)è°H–»m§¿Y„Ò)ðÒZXè¯{ž×8óÚa/(¿ê ÅÚ]er7ÓBÆù3)½ÎÚâ2­B­ˆ¯¢YŠøäÔú`‰Ã?TAý¤í>»xThå`Äììš~KdßTçG¤~Ä´îÝ£FˆÈɉ8¡<235#ß©pq9kɽ7§"¯)Œ½Ö©9¡?PÈ÷Œ¾Òtëâ9p±3“® >zAëH''ÎòÌe&ÂÁñÖèÇK1Gp¾ÂAn»ü9]©÷UgTÏú£|cepJ ƒ«ªý¸ýÌeqÞû+¶1–ÕÀòüúa…J6÷- ¯j{\– ãùÀS¼À€©èú¨!wC­‘ulb|»{Ûª‘ØòoNjR:ë?rHïÆ„Ô¶¿ Ácø@·‚3=¸?(ýªáKÁAÛ…õž.aÜý×}Ÿ[ÈI¶â,—¾äá©I–Yñá¦ÌR5‡ ±^ §ëä\ø5þpG¥GæZ£sðC’t™ d‘È—cñ,ÄdÏ…KøÜ9³R‚›“žH,8 fñ(\ÀqƒŒ?àÌŽ|)ŒOY¾VûQœžg¦û;ROÍ}Ô‰çîõÇ¢.=DÆj+˜Wí*jje­ô0»@ç¼Kmy–ýÛ¢iÌß^³´>h*û°-iÎon°L'|ôÎ;Ä~áúJ,_¾ÊèÃØ§Sbg¦C ÷û\†.IèPÍÈÀQ«‹Ìý*…cd!ÇýÙ ³¤•ðÒݤªo>½Où/oá¦ÉX¾ØÀ›¨®ª\{Ó„á1pm0Þ¿Š((¬,f¦9-:£m 'W{TçÛm{NåZé| ŠonKfWçÿ0ÍWƒó–¨‡CË©)»ò'­†%[Ü(“Ó.7Y=MlqÈì½{¾6å*³…l$zæ4œö*™×-D~I"Mß²‡Šænw¼kù²Øß´ÉC§D½¸“*²Ïž_?+ 3„©Ô^Ž¥Æ?Jþ\X/ÚS[ÇØ¤@4eù°±©¤û3ð*­7ït)3ßôag/ꛊéã£æÃUçÁu!vœ—%/v.RæÙÆW1úbm3’= ”¾~8¥Rß–ñOè}áþŠ4Ô^þZzº-Õý›µ{@½õS0<È»¾\ûWjÒ~zÕ>ZøR2qÞ4€ç·Õ\æ_­4÷†Ê™Œê¿F…ƒñ=—„Îú[·GZò§oçW×ÈÍqãæßlá^:eY´s"®sfž,¥JêIGôBéËʼ Ä޵¹˜c“¸á…ð’gWQ¾¾§Ùy£.9SµœˆòVå =ƒ­Ì‘. À~NµG¤gZ{ekªA«nõyëX CAD@ÙPËŠ3oéqàldöÕÉŸµñëTÝ*ý·`/ƒA1«à´QözŠÞž„?&Eˆ´nº,6^ÎëZ±Ž4;-–éBO5£\ˆ\~7êyÙ»ð ØÈ0?îhɬ¥í…4¦Ç¶'÷þáÞ}ð-Ç•t¾¦“,ªâ0j.Q›ê¢#I.oÇ4ö÷»Íq8^nˆ0¾-ÿ$nœ:©÷¤‚íÍÚ¤Ã=¸œ³âƒ­¯Ú`òÄíªÔÖ…ötŸ°«O¸ñDAµ çv›&G]—S?< i¬%b,iDW?¶‰q4ˆ‰>eò™©ýŒ¼ÁR÷Áiê]Ÿû} 6IØ|Ào²aë;v{²XÓ¾CoršãžncU?úñhsËÍ 7ΟL?£\-®oò±SI/yÖÔ% ¢ XÕ}êa~T.‹_ñ1ô°ñÞAî²Ý;ónË$§!“Bîsæ…ñz%Ò@‰”úö¯:ŸUì÷sC[p­ð²>êú| ¤¤§‚g…GOf*ÏùX´ 5Ûá¾XÝÍú* âîØgœn0”ûêxgšgõî¨R@ßÍ®åéž/%ײcþ¡ÜÕšAÕj’[»òXÑ]~jzê˜t‚Ë#Áàø1”åQô"U,,§éV‡ÛDü©:kЮÂÉò6Ž˜$õåG7¥%Ý*¥‘À‚ ³;M¼âóiRÊ‚‚»bëÑ:ƒ˜kéK ðØ±¡Ó®“ÈÞ"|úJµ‰Íç㟕¾ up‡-a˜Ìf2 EB¦ßáfÓ´:Ý`N±³ »•Màï³PÛrµ²ñ\æD–âš »CÌm#Gsà!ä7'|m{ªY>i¦Ü걉Q¯Šg¹Ì”‘èÙ{…;Á7šê‹Ô÷íyŒ©£VNSöŠâ(ñó `qAG¤Õf5âû°Îî?>\2‰þJŽ+Ê:„ÄJš?`hfjÄÖÍnuÜðŒ5EA1þ-÷&„yó¡£(Í£ hM%PŠ Œè›&Vºò)èÑúŒœ/R÷Š;ÕUF,:*|Àë·jJ)O~î{X^¾ëZ…yºÇ=²0µM"eð‘¶c–asb¤tÓñÛL5hQI§ñ-ë—ðï×»7ÊësSÊÂÌêÎê%ø5Éw3È^wãT*½?º±Vú ûËn¨8+ëmßl%ʧò˜1pg˜§Zªk"%“ˆÂyåªÉ:±‰“sût[Y¯ô ¤„ϸ”ÙÃðêÌòŠ?"åŒnÞ Ïø/&ZEZ+Zà‡Q ¾qã7˜Žþ/-óÅ— endstream endobj 412 0 obj << /Type /FontDescriptor /FontName /RHUHOI+CMR5 /Flags 4 /FontBBox [-10 -250 1304 750] /Ascent 694 /CapHeight 680 /Descent -194 /ItalicAngle 0 /StemV 89 /XHeight 431 /CharSet (/one/two) /FontFile 411 0 R >> endobj 413 0 obj << /Length1 1474 /Length2 6575 /Length3 0 /Length 7560 /Filter /FlateDecode >> stream xÚvTnû6%1:¤‘QÒlI¥KRº¤ÆØ`À6bä ¥DiARZE‘’VRJšÿÔ_üß÷ûÎù¾³s¶ç¹îxî빯û9à12WuÆ8Áµ0h¬8D¬T70‘‚ÁR`°$@@À ‰õ€ÿApo$­ð¿ìêÞp(i@±x7 ¨ëë„H!2 Y0( ËÿíˆñVj@ýÎ@  . ÷¨c<½‘.®Xü)/B0a D^^Vìw8P÷F h ë GáO„A=€¦Ž üB7\±XOÈßß_Šò‘Àx»( ‹ý‘XW  Üîíwþ¢ 4„¢à¿‰I€f®HŸ?°)õ‡zÃxÀ ƒ£}ð¾hg¸76ÐTGxËŽþã¬ÿÇA ø×Õ!Òýý+ý; ƒaPžPt íD =àÀ[ZúجŠvþåõðÁàã¡~P¤Ô ïð»p(PKÕÅóû‹Ìé‰õ‘ðAzübú•Éšhgu Gc}¿êÓ@zÃaø[ýn«;ãÆýY#hgÄ/ ξž s4ÒË®£ñ—ü‹¹À±@i0,+½€ð˜+èWr³@Oøo#䌯?ç‰ñ"ðà!HÿÀù@ýà@¬·/<÷¿ ÿ¹@ @g$ t‚» Ñ€³ãa8âÏßyodð6/<üëóÏʯ-g Ú#ð_÷ßÍYhéiê‹þ&üIM ĉKÊÅ%¥Á@DR(‹_„üg–øÿÍý7jEþUøßŒ:h(ÿ‡þîþ¦á÷—&„þaàž`ˆÁëúWö¶`i0 ÿùÿÿïÿ›æeùÈþ¿ëÑòõðømúeþ?¬PÒ#ð/;^žXüD`ðsþoWKøŸ!6€;#}QÿmÕÁBñ“¡Švñøç‘>Zȸ³ sý# ¿{€OïDÃ0>È_Ï Pÿ— ?k0wüSâƒïÔo?Jÿy¤&†qþ5s’Ò2@¨·74€o<~' ÄAðÃé ø­k HÁâC€xz!@Æð«Ÿ×ä ücõ ü³Ažø'íG`ÿE!¡zù,…‡=|}þðU‚°þ˜䀠 ¸÷à?ê†ùzãÓaë OêïýÃcØõ»n¯ï¾;¬Tåð_êWX²LÇMx7úÓ¥¿ÌŠ˜õ>PMéi£û² )´¯2É}†[«{C]ŸdÜp|êh2´Ôd~?ðlMµª“‹‚SÜLe9øÌ+Ø"܏ްYW ×ËWŽÆ(ŸñпC; ª³lêcÔØ’ñòK=ÊÓ²OâÌãmËGòœžŽ²ò’bŹÈE¶hGö†r.¸uE!ë¤ q6s’Fƒ¦Ÿ›Iú´°ñ³Ù°rï3|ºŠS[MÕeùŒ+)œ)±õ-Š•úÒB`§:6O!{#™(÷J¹›˜gÙåëÏõfÊÚ^´˜vLÅdê³å3±ò;žDÒË+§àýœî;t›¸1®2†š×¼Í§ÏdÕßd\ž—‰ ÓåãaWTÜLæÞö¾?éÇ­4É­½Ç–ZÁ¢æ6¦Ö¢1xÚ‰¡®pˆä!ï eóò K[szaÒŒJT§ÎIbºöåÕ÷8ØHĶì"ìóA+,,ìŸD8(vªEcÜ]K‡‰Ünù¯6~ñZ'¢Øv¿*–´ì –ññ¼'v…7 ­|PÔ?j“$œ”:zŸ›±…½Ÿ‹¸ˆâ{{êr\ŠãÆ›o“ÛA{L¨)SEú”SªIïÀ‚É“—,;]0M‰›‰g£ì*^;µ"å\á>‡M•Æ´Èã»=õׄµòýj?< 3¢²Ø\*aOhñDº'Ö:ºmn/:¶dV·j–› cÈ7¿W[nSº©"î·NµÔFõ˜Å“Ö}‚:ðo}£{AÝã«áÌ5.õИü MÍÆè{j5»$ m®¨þëìáÑóœxÈ8ǧù<«¯î)²,Ã:™uJ§«!Ãwã‚SKfÂ¥¡—ùuú/¼æéðU‰0$ ¬Z¸÷Ó´t®«Ì¼™Êb´™Õ•q Ûz1?©èª:Y9Ûÿ‘T®™/ã4æW?Æ7ÙžqïÑæm¶åur“zV/íÃŒ^ªá:Ùóг‡5θïÓÚOqíÏ-*Îý¡VÞM)·lJ4{$¾(®% Ø—4‚$-ZjY„k›ØŸ~ÿÔÙµ(4»½ÚªgCÔ³‘]bà4y( fuœ‰}k¦Ú,3>Ôü3‚:HoÜ€ õŠ»¯ðUaÖöé8…¨ý·Ú1?ÕªwŒfï¹vw™çú†Õ[U¢ž]Ë79ÏȺG•&ÕÛʚפ‡H"“÷¶xüó†í¿%Q1wŽû% ï ]/ˆ€·ýx7ÜP@® 2‰]XOS~¨Qå÷jMm£ú œ“¼JUs¸q“°—2Ö.ü¢óxÅâ{ÅhRùŒ›¬ÔÚÓ²»Ï+ŽãÛÞ`Y.æ?¾ 8PXátº•6uû‡0ýæÍïÈFT­ˆ&5×’;.Šš»äÜp¯ö*&Ðgk¯R+_û âö|¸žÞ•fL'^ŠÿR“ʤJB" ä•&PæéT qPÛ"¾-ùꮤ5Òèå,m?qM~à`‡"J–¦ÚXáõÞå¯ ìInq²{ ||ªcgãü|% \]iZv¶ÐåW©Þº¥1Š%žRä{ {Sf ÿ6ó=•^íÏNþ( ¸buMêØË$MB«ÂËJ55O+äྴ¥Z =]H¼¥ÒȰdЭ¯e’ââ;^•‘ñ¼ÙÀ{çÞ:=¡=_¸ù‹•|–Éf6ö H/+­UJŽê»K¤KWéÞâtŽ)1~ ¼´ñ3¨þfz=’[UR±EíHy³à]+¯I }% ÕÅ¡G,´æä§—„f0ù8f&s©lçôñZäô^ö'<»åœ˜•hdòâ­þ$tíj’¾³M_Èžd”ån&½Äڵ⇑› ö}"…ƒ\U̽Á[6ÊUweï>´„l¾ ¡Ö¸a´éu³;Š£ ÒmbЕɔT‰©Uüiü8_pâCªëwúço›@ˆ—&óï§8îªUT05ýèCWÎíw#cÓZ¢½þRŒÓ9i‹Â&V´|\µEGùò…>A×~XÅò¾æsš§õ'ÖÇeâ´Â _|u#Ì|Ÿk7’ˆ­;à<’äøl6‰Ý”Ø(ÞmîåH .sè¼Â¸Í:›P{î> ôBë@/ȉdŸrZHñJ¸„~“2UÎÓ—¶Óç3#÷ŽB´a:Š:5™^;ñMC¶®‡Yã´á¨b—oéåþT FóÄÀ< ö,E—}¼¯iÞ1Qq":Î%›úÁ²Áø'yP¤IG,õ+R£ö8K187ÍO,étÙ¢=³É’{o«šÉdÛwû‰ýzÝYI¾¨ÍÑÛϲLKoM5™¤+ Rnen™PPƼ𢪢³´¥=ÿpùÇwŽWQ ‹Ñ,ÁìýË®„ Õm]}_MÄü^ÊÞ§Õt"ˆè\®·‘fRdßWjÏå›’(™µ‡º Ó=²d&aÏO?g¶.nÞbÑ0ùìzWÿ„(6>zŠ~¾´T %öý@eêm“®vñyÆjË9ß•÷úD-fi¹©1²ÐÜ>iÀÒ[÷y¬“â<æpè!sm ìAV,ô°ìmdíUó–‹± Áq9g\Ê^”m,ãö˜Ì—n3–§š:±{gÉZ_ŒOóû¹_dïØY­œr­Êàoô(åÒ­ö»OæÛjφ›­7ÓXZdGíÍÁÑ]? ›&¬Ä&z0DAEO(¨¦ í¢JοœÒ¨›nç{:õ7w_ØvàbŽ:Y%Å ³fWuM¶Ô}¯Rœ4ðU›ú“‚{OB®èžÜý6?,ŽyÊšt«ßÚ,UÝn9Ò:~ÿý¨Çf_]mL íV¿‚ÌÃÅ“^'üú¬”ì®cqôÆu€J•¥útïO÷XIë›stÉ Úükºû#Ii·ª•ôDé9Eµ¦v%(ô¾lä_|¶œ¤¥™ü6cis‰*ÅÆiL—2jò©(aÅì$»úpZiË{5ò 3u#.þºÖàí±â‚gM\ ¯;K œ/¯3[E ƒuÞíÛõ•xVX!äѧõ>È"C~'ÏÔ°Ožoo˜;íƒùzKoj­mU v}!´fyô²{P¬¸7¯ ƒùCD›Y‘ \CgÊ3? OJ1ˆ \¾C‘TõŒDž|DpLÝÉD&_t‹¾ÊïÞYaœñz°’õ5@xü ½'S t”Çv£…{е‰°n¯/ÍÔ›‰xú2†š‚Â×fÊ ‰ÄOýµCþ9È, 3È,n)…»{‘úµ´F±³uÌÿ@b0Þ§³Íä«x*WL ¤e°rfq£Wøš_±s wÂLs«iüDÚúöíí&Ç ÀœÔ¨_ËaüõH\ê:k(oÆräçlf­õ¦»Ë×ôSŠ Þ¯Ô'ÿU{‡‡G«U û®S¶ÓÌ[ü,¨«6®†ád×ɪjøÞ¨j˨)×pwv.àöÏŸtó_œ^‘ ?™è“^¦üˆýšê›\÷è]ñ5/a™âÚÅA½jÒ>”œRb©ý¯´aãË#˜wíXf¶¨3iÕ!ÎGA¬¢•¢_¡š—©º“ ÝÄs[ÊêªÛNÕ—)¬!ð2ó…aÃòÆú+y—< FZŽíbÈB²/ÏÛüL|-üü‘œgDÑíhÿoµ}"Bå¼ ·¯–ûæ+ôˆ?õ~â»)ÞG§˜^RÍë­®†öqå8¸»Õç2|8€~]Z¦4yÃéu9”r70h"zžC”á5þ?ÎEÐÀÓ‘)Öµ¤„ÕÍ(Å:™ç˜W%ÏYvŽžÒTp!Fú’¬×ZÁV7K®UŠLÝ$Æúo°ã[ï’ …y„ívL¾ƒ†ªœÙÀ¥Ð8Ñ\ºÓÀn ¸½äI4ê‘#dÑ­hÁ–™ŽØµŽÂ|È¢ð&aoGé£dýã±Óy®Â«w ûûK¦˜Êô”(ÁÕØ"‡jÇ[Åä Òï(c Ö³Ÿ,„$.Ù6˜wý|¸ÆÃ7Kmü©‘V½25[§PºŒáøI Î&‰›ç׃0¢»‚ä³êc6FåŸ}%ÛÁAª.±è±€ô¨!RV1ð#åS„¼g J.A\&ˆÎ¼¿›Õ…è;]ºÄжsþ*Íý0nvUÝ•Ë×(nL †–x 1:Hön$[V»•58Üjoæ^$ˆ[2BÁK9ÚxÛg)óQ„eòIq°]DSð½håYª¥”€5—1©JK$‘]æþ6#I×BÐg˵a«~SÍIÖ€žSâ Ñ–¤ëh½¬YùZýðVÆø ¦rÇzñª0ÑWÄ­;i™[¬nƒ§nîìZbmãn¾ÜÑnÑDx°­/5­©fì öJPi u:þR™ºy—„¦³”‘k[ <ÆtÎ~ƒ9Žò¢sÔ¼3?YUR ?8ž¾<æ! …~9­ˆ¡âØô—бý–ak•½ ÚÝœyçZ¦ãG»—©ÁI~Q ‘“’fáG”Ùg÷rœeH$dµêÝÕ—Asq]içÌeVx–vû«ØcöH¯ˆŠÔº0î¯~f³-³Ù†]«Á*¶ÄïÉ¢àêëJíŒüVûr0µZAŽª0c|åµá{o “ªG蜢“ÆÈ ™Zõò· ‡Á¬øÏOVÚVÄi‡É5 öÝÝ–Ö¾ Ðî¼9>K»€$ãCŸ/8Ý´¯YqO~7†¯U+e=Uºl¨áù"ÍŒÓLÆFàÇÉàM Ýi'Ö­l'H*'kÒö2P$™® ®ç,”7áºù>_ª}4ûvmb¬l#‘@oæô¥}ÕʯRN[jì*üeÎ5ëürBk>I÷>XЬ/¶$S† ¯îxÑ“ô}¹–¾ŸÀŸ(±°ö«j{³†´ŽÅÁ¦íM)ªü¨¼T¦gQiÞ·}õmE© µU=ÕâÉk¾Å†›7E5âýlB-o=P¶ —ê”"6¤Ôº7ž%?HH– ¸ÍKÅÛPízÏŠI[KïÅœKés³Ë>ZqÉzÚU•önÍ„ÄÑXOî·íáöædJ캟û v£âBŽ)ïu`äø{€|L¯í;£Ù£u¨:û]ýÈÇ»¶÷ø è*Õ›´œ¶v= Œ ƒHp×÷ÎçmëL½$¨”«EøQ•‹OôÏ LfÞ V3³xLÂr³tÊšE´ÅS7Ä0ÛóåÙ¤Ë&UÒc}ï šïC5ÓFR-bjl­_¯fäp;â¦%‰C‡± bè¸ÝÄÊA_òpývÀÇ)âG ¢@Ï@¢_.’²V)3ˆ-àÃx×’ï`¯§}G“JŸ¯ÿàk Ntb—P"!ež/Úî&â{¹ša1*ÃÜ9š< .GgÞÎêHÖ’çÞ”óKôãì>ÞõפÙâMÅÛÍ™zèXžÍ]8~Ô⣙]jNÀõ<ºa>Sb^è¿#Â=ˆy¥×>4U$äîXvüê-*”¸Ráp!ÜyÉc÷0ùkŸ”Œx4£Gùˆ2KøöD¤Ý"ªQÂÎ7»Wãb »u}:¦¶·᯶XP”˜ä*öÅU¾OS&¹ÉwŽK=%n/nš¿âs å£UY )ÛÎJó‰åëÝl…òËÂX[ |ÄÓ‡Ö×WÜ÷­ÃTÛì»YJE³s”P‚%ÆWÊ/ Ê—q¨jK²ë–æï£ùæ5%jNaÃ.?ã‹S¾_fÇÈ:Y2–ô ”¬Z;.² “9…Ï^¥ìòêÃÆƒjI÷Û”ân}þɤbaÎQâÔbíp_‰˜|øÝè°HU~æM¢ð™[¥rB‹tS5Äæß» Gª4 jÍ-^E~ÐÿîùÆc·º¥Pž¯Èƒ²Û9jŸ¼"q¸êèÌìÉénÕ•úJðôe£Úrw¤fŒÓ‚§eêöºG‘ÕèÖœ˜ŸÙª*XK4Ùꋳ,ªt7–›œ&PZÍ›þùá»÷·4פƒÉa‚?’7R™â›7›y$Û,‹—~'&]9±¤G–»ê6ýèé­ídL(²iŠÖa˜ž}ðaøÚ³)•ËâòJ߬ËÌj¤¨kM#þß[p«ë0û='k#—n¬0ýú@Ø=“½‘ù{ËéCQìÇþ²ªKédó‚ÙÂÍÅæ¸ä¥2nËV ©+_\0< ƒG‡º PŸ±7~¯“üÀY,˜þ)Ø%ge­£Uþ'Eå°€7“kÀ©ÉÇs_ÿš}­¦_2D´ÆðÜå+o¼4Î!¤] šçá¿êù”"o»…ã¾mǨŒÎÄìæ76Ïè·£–çör+8* AŒå¸/àÉÂÀ´¥ÀØêµ‚­¿ÑÔ*¬À1fË ¿×;í@í44`´wÓö÷q»˜2¶Œ)wÖ¡ ±bÅ…#nz"[Q= ©´»À‹ÛöÙÀ)~ÙÛ®.9>2}à'™öR¾Â\#§ó=Ÿ|&¯vK0Sš3’?±übòE¹ƒgÍC…›ß^±å+\.škþT¥ªQ6À¶HRöíÓ÷äœâ°·/–¸Ì<.ìZùÊÆáäQ?U«#ÖŽôÈHQ„nž–b)Å™ J:îðA.¤H<òÒ1sú3Ñ… ü˜±>0fLð¹ÏUí¤ã=ÇE/_f!´Fƒ!y=ä^ÚhÃ2\ÁDAíéÂ*×GkØCªF ±™šÐÂÏßÀIö埘œ(ʋⓑ-uR›  oGd=¢XJ€¥\t/àöb˜•éA+œÄvËsXf±5Ù¥GH~)ÌÍ¿#0d¸†¢;šzïb d‰ãeøËÄŸö¹ëÜlŠ;sªGåÏëwrjç tÕ‹ˆÿJšõ endstream endobj 414 0 obj << /Type /FontDescriptor /FontName /VFKEKQ+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/one/parenleft/parenright/plus/two/zero) /FontFile 413 0 R >> endobj 415 0 obj << /Length1 2751 /Length2 18242 /Length3 0 /Length 19807 /Filter /FlateDecode >> stream xÚŒ¶uTÕ_ó*ÝHwJº»»»Cpèîn$¤KºCn–î.éNi¤¹Ç7¾úþîýã.ÖžÙ3óLîý¡"SQg5µ7IÙÛ¹0²2±ðÄÕ44XY,,ìL,,lˆTT–.6 ?'ˆTZ 'gK{;¾¿tÄ@@°LèVU´·ȹÚXÙ¬\|¬Ü|,,6Þÿ*Ú;ñ$€n–¦E&€œ½È‘JÜÞÁÓÉÒÜÂÌôß4&´V^^n†™DmAN–&@;€"ÐÅd f4ÚÔíM,A.žÿã‚FÀÂÅÅ™ÙÝÝ hëÌdïd.DËp·t±¨œANn SÀï´J@[Ð?É1!R4,,ÿ}¤noæâtÀK3ØÈÕÎäóÔeÊ »++ü[ðŸòX™Xÿq÷ëߎ,íþe 41±·uÚyZÚ™Ì,m@e)&ÐÎô·"ÐÆÙltZÚÁ ÿ UÁ9þ'Cg'Kg&gK›ßY2ÿv.´¤©¸½­-ÈÎÅñw|–N på=™ÿi±µ½»÷lfigjö;SWfM;KGW¬Ä´À"Ä?2s €“………ÜX#äabÁü›DÃÓô¯CÖßbp¾Þö3p* _K3ø¢·3Ð pqrùzÿ}ð¿‘•`jiâ0™[Ú!þñƒÌþÁSàdéxÏBVËïŸþ3Ï™©½çõ5šY^CUAM“þŸ¤ÿ9³÷x3²±ÙØÙ\¬Ü.^.€ïÿ:ú§ÿMÿ_R åÂûË¡¬™=€÷ßY€Ë÷ßLÜþ34ÿÙZÀÿ2(كǠù³ú,œ,&à_¬ÿ¿wá_&ÿ_+ðÛËÿ-ø¿1I¹ÚØüKƒæ¿*ÿ/  ­¥çtÀƒíê^E{ðªØý_Umпw[djéjûOe]€àeµ3<#/׿ŖÎR– SK‹ ÏÛf°±´©Ø;[þ¾€Œ¬ÿmÊ?gà 4±_2Îà¦ýë^°ÿe•´3±7ý½‰lœ\ “Бå˜Oåó©þA`>µ?̧þq˜5þ p]û³ëüA`vÝ/˜]ïÛÿAì`; ­xS~ß…ÿ•²²:›X‚;mc úGÎÁö[ 8Kgë?Á.Œÿ2Çl túKNÉØ h²™¹ü%æüøß«÷7Ö‹­A.ÿ£ÏËþüÿ€s5ùq‚ƒ1±·ç?1sü–ØÚþÉù÷Ü2ÿ•,ø"cþ“#x,™AÿÃÀõûÜѼôÿT  xHm€¶yׯì°†™¥Û_nÛ»þU°Šùð¹ùï'ô· 8v‹?™€+fáé`²ûK,³ü ‚ƒ·ú ‚{mýçO\à*ØüÞÕ?çàRþ•øÎfþCÅ öeÞñ?ESÛ¹Úÿ¾eÍÿ üž0Ûÿ ìÓþ/+VVp¢ŽÁà‡ßîšÍÁúéÿ¶|E1ƒGÕÒþOó8ÀEt°qý+ ð§³ãŸ Áttµw™Ûü¥–þUfVp&˜§åÅyú©,cã§Ê;;Ô!ÁböI®³qêžZN©ñäfE;†ÑÜ|¯ §ÿìGiD—ÚscBÝRn¾Ž±N¶‹vy‘ˆ.†¢È\êý+†¢¡_K P ~”‚Nܪ8ß"®=IÅRó§cl­7²ÑÊîB³t!|óÈ©VfîÇE2?c¼²¹K‡¸fdhÎr0¦;-§G(v¡s”> à|Ì“¥ _ÔŽœ0?” mi:Á¿}µ‰ß•âŠÿ`X û4—4ಊ8 !§õuýÄ€ã¥,Ñ=c$|_@têC?I“>r ¿9å')¥ñž§µè‘´M½T0ÇgÒ;íf wÞ]¾Wéù±nBqŠ•>¾TÇëdªÞŸÄm‚Ý H´ÿå¥`š¨Áä"Ä>þl>ÉÃÅŒ-¨¢“  Ûò ¼aë»ëñérߌ „o‹^÷›×2ÑQÏ6h¡J$“ÏåˆôÂ{÷ÓЦ?¨ß™,¾ÇÒ'0]}Ž8DÓ þÌc4>Á¢CXºÌ2‡~¶äî¸~ÌDãCú¢Hª ê,o§µ noÅóHǬºÜCÿs=i{0#]Y5ÑpŸú]4^´nTÔ!>D‚ÉÞ÷1ìH浘œ8±;∉öt™¸g¼Ýä<¾±°2QçºÆÆÙöžl^íòŒ˜»/ï'ýaÄ­‘H,eÛº¦Ž•I­ëLÔûJYƒ#{Ád4“.Ífƒ™ÙA&|*¡:½›1]]°{z;ŽyU[W¯ÁÂË@wJJ(§t8 ü¼œéL¥Ãkv˜p|«r9u QL`ßÔÉt±o½©F çÛÍ–vÄêw*6¦{½SY¯¤ú6‰™ ½ü)æêÀT–õmÌA”¹»”á’Š¨j‹’hš»YûaZÅ@"ÅwtÉ:P–RXSÜS0ìmw#ô¥^*¯‰´«ö5ù‡ü|X¸[VŠ#ý·Âh¸Q š‡µŽ“Ëe>|Þ—õ»þúÍTå•oi%øi™”ŒË´ð#Sº¿Ž™¼Déæ° ó ýãúÝLtbïU0´4c&˜HÜ4Þwí•EoȪä_¬ÓD«˜“ /?ÙZµ“â8©­×‚vôE>þ¬zƒž¥$ÖÄ—±ðèA2EòòذëÅûü‹WQ,ßñ†ÀìÆØˆ—xÊó&½Á-g–Ï{êÓªž¯k·þÐ5,ÎÈW=?}l:ˆÂð<•‚~¤øu§{¡'·»I ¾Œ˜XI‘Ò1ÔÞ¯¤ÁK=½D­xàø¡1ކƒÊ¸øyÌP"¥æHœÜMDã&Ýsаøv%•zX–ŒÅÞˆoîâ]œºª§x¹Ì®{ò:93n^™ÆûC“7mh¦ñ&QfA1a$9^L_³óeEd¡?LÕv~ûâÒ@ÀQ#ÝÎæLÚö´¬ð"þ¶œ7ñ蘃鴤âçI¡h7%ïTŽZ¼[düªd{·)ü  F`pNNASªÅ —ñ°p‹ÅqÌÊ0¿Aèþ ²ÏÇA”-’Š@ß.Mõ£õ¾6Gç7jl¼ë79$™ c{؇L?ªü¼ùÞT,é–\†ã †’ v^üè%ä8 ¢d!^| ¬|:U ™±-œ¹}ó¦'½†Åë2ð¬pÊ6%rªû½˜eÍ¢F!Smó7>lÃ"áƒh÷Œ{™ÒCIÅLî¨æ«lªú³¹~1›=¦ÏÝsôMÐcï0Ï_ÛÝZÙºæˆ~Pµh¨Œ|`›§K›<1Ü›AËos Â®6.œ¾àõSR×¹y<«Ý³£T1`Áðj¢5íØ‰Ô°ø‡Ï=¹ÚI"“}¼¬õœrØðè–å$g,66Xöì<¤+t0X1ŽY”‡ZF÷RT6Ö·Åä@5 ¯ ^Q`fqŠ·¨Ï3PNWeX„¥W2&Cýt̉ÑКðïûµ~dÏúþw:>æÙË&Aîæé Íiuoü3ueþ$ž|-ŸfÄe·YQ ÆQsèUöçRäy­"Jû•åËb¶xs²ûFôw>ôŸ<î%¯F&º+"»°ëäJòoxË#X ç–z.T öt¼¦¼2ó •'ñRIûè²Ç:2³b®„È“Öe$+Ù:Œy5%É6»”¿Âª]| â]9HÀlj›£,ö¿$sn•ÎõyϲþDŸÂüÑY°&béHr³ñmšú—€’üD³Õˆ:ÈÌÈCŠÅlá(m® ö™_¢óN{A Á¥Ðvã¡Ñx¨ xêäø eh°BLìõÔW„k°›oÏD|ZÎÐÖ‡ùšÄ„fÒL/™ß_Oœi„#ù>ëÇž$.äWŸ`¿ÿÞ¨O×`šæ;S®/¶ƒ2{»ïfddz3AeêqÈæÃE"}ÒM»ÕŠ#³,äQº¯‰ÔÅÁÔà£ÇIùÞÈ’÷™T؆ ifÚ3Kf®3Y õél„6úÄo’1ëÑÖß6¸uç•>AÆcìk;Ô@-ƒÅ"ሇ$çõÓ{‹†úŽÔÆ_ ;SZ¤’®W ãv†&8âÐåà¤ÉP–Jw¾ª¤—ª±Ýñg}ín΢Gà Í^Ê‹œ[}Îú‘Ïê×W»·ô[Ó‹ª:&Š.HŸs¡„ãÍ Ù¸Ù¹µÙã!SYÌw‡÷KNPî.#Lg% ¿¦‰qD$ÍŒsêõ˜ß8êZ¼I^¢¿RœÜ-Íí“F’hÄ×¾s6^`â\“& ú¦;sÈE«É¸õk²ƒ9¥I¯]‰®@ùDÎFóF¦ë3ÜàS ÉЋñm‰ qK$rom00T~>ޝ Gêèd…(b‡×*PD%J@ÿ“q:-4WÃzñÇ©¤Ìd­nÃlOH'yöd=´ÐÍ««¬lóxy³¤éÚÇ7D6tð&FÓÕÃ1w£5H‡‚d+UiŸó}ge$¾}•! K<&ø„•¼ÍÂÿÅ×e€y}Å ýg´³Œ9‚²Cƒ®;g°É’7pnÏ´ûbƒ½Ž€‚ ýÊZ܃¶#æAá±U°=dü~pU2í—#ÈÇå.Z¿/Qxê21?©sÃvØj¶géMKíšµòÏUÒv ñ‹ÒDæãá÷ÆLgëa*Ü4-Fª±$ƒ,24ÓGv‡LŽmaò‡u#Cǯ„CQ‹PÞ«šÄ7•Nò=ÍA‹¼d?çıSô3¡Ä÷¨ žò0I¶(ji™“TžxAAî1Ü *Ÿ0ZÒÓñZ½¦ë‘‡‘ù^\â¸<¦u{´Ëî"%ñ$Ä#©ã^»§As·¹îÔ ‡澓Ý^Ù‘]Ïõ>¡š¡ÿarŽx˜Å“ð"%åÂÿ<ä ‰dŸ™£/f9VÆêM#5ü¥÷Žu‹“Å-_&ñ[HÐ9Ê‘Q,:®ìÖ¡øü6hð߉>¨pñ¥ûCçe¢‚ÅŽNL¶—÷(hçñ¸ ¤B:ct|ì4JËüõB¡µ EZP¯¿ É é†}°(L;[sîDïæÑVã˜"[ÉÝ÷}1Qó…ÃÚd郞.h±)±”%¬»ÿ°YIiU!¤Û\Š~ˆ‡c1qA‡,ñXøjM#éÏU·¼˜(;±Ð»¿¨>D9“LNµGš¢r‘TN˜:ö¬w ¼(âU`ƒjÚÑb6’ÿù¢”mP«}Ã÷§²çb´:Ÿ¿Ó®IéF‰°ÌëV#æ,4ax û#ŸÕögà3´®UüénA!@̈$WË5PjÑl¾2…9Ít̸f“á¶Ûü#»x {¿x_W^*ö¼/©Ö™¹êÐ_«;€ðc‚hK„oNc«WM Wïšì[ï\-—'ªš°¸Ù3ÖÛ¿ÎqEêþl„ØM`gÁô¶$ùš@´añ¾h á;×jóZÒ¸Âü¤®É}ÓõWF}6ÓÍ‹™­÷Ô ZDX×øå`Æ'ü÷j†/ÜØóÙWµûï[㯳·@°¬só+Cx²þü3Œ ëJ1LÚdžmçI \Ê“—ðX!2T·éa—\ÜÙz›—qñÒñÐ.º…[ÅÈ)ÀN¶K«·Hp‘&–}jµNMÛÈN{Ùõù­x¤ëÍòãmÒå%Dš2É/fÈ ëüUëɺ Ã¢˜!×]?µ˜”fˆÕ“‹S{îÛ«¶ÑóÎö¸4 ëP+ï¼ ßì¡mçzëÓé\ð:^…©Ð÷a»Q8Š.ëg.zŽaÛV½ÒÍ“äwk1‹ÁЃZ…9^tòu<”BðøÜXoêñ^ëêòÌç”÷1°%ãôa<¹”±œ;N6–†½õÏgÇœÄõjܲyP/é o!Ýä£ïl…¯Dm\ÓÊÖ¾’Ô4D;9Ò(ªv¼<ìfóAo¹L/ „Ñ1ÊÆ(é~ALH³†.0‚Þ¥X5¼øÞòZE‡G4·œÊ(±8µ>£,=*˜¦I½8~ŠaÊÛ\+ðÝHÄEo3%²©S7ê¿vï…;å>ÿÍ`F{ûiè3©Xd&t.†ÊN· @Èäw?gÎìI2âï.&TŸî‡CúÔJjB#ó—NÍ}ªõSê<çKÜ*W7iá4ÂÖ±-—)¼îÂÔ¡;Éx—áa`˳…ܽű›–ðÏÒa¾è;Ž™ºþÞáºÕ4º³ ÜÆ«Ôä8|"±a”»Èö›“_.ØC¬¬D3åï¾ë_¦á²®ë<Œ€e„X{-ηÏg•„ŸYŸÒ5éD¿ËQ*)•´_#ù<ì«­8,,×ÃËêælo¸Y”ðÉ!a·ŠÚ€â’ò¶éÒéR½z€1¸!ón<Çü5ÖhiÞч “´5…­bŒÕÆü2teøzõÅû\M™ŸÆ‘xV˜¾lq<û½ð¤ÎÍw÷öЯÉ55؇­„ò½dY/1š*áä0¶{[ˆÊ Väó+ÊœS½çe²¹#v›‘iÈ©.]gƳ­2 =÷žÎ'ˆñÜXÊÃæ EyÑTÄ›¯ý1ÏoIWÕTIˆ³›5}÷Õ8iÉ >ÜÅ/‰8”…x~íS`ŽsñØ»W;\ö§-†Ê–ÎÆS¥–<9èéE²æ²ãÄõ#»ê©ésÉÝù;ìÃZÑöcB©w ‰Ø‹æ”ĵçøø*`û¥’îLÈ&(Äu Þž=O*ôãb6)ÎÕk áæëÅ+á#¹|À:ïWHÚòôòžÃå¯pq@õ¶õGr—É,;oáÅÒ*|y䦸7Ãó ‘cö<ÐÐÂ9ˆ¤©äŒ’‰ôVbd²·œe£"]Äý‡ã… £zÞ£M±_¸ ü¹î| `ˆ•ºˆªMóU99üiê¤'›`ÓöîÇ™öºwо¹;÷×´^¯Ý i{Ù@©šñt LHKˆóƒZk{o5m4’ÅÉÜgcíqðdjw«»½Öúx²YS"R ?“„)T¼|‡Ö'‹åvr~1Òy¾u‰™ræ±—9ÝŠœýÌ2vĈ0~¾ç™ P8ñ·§ˆÐgDûß Í|za°yUåìOÃ\j&ŠíÛù ç÷>i£@-fn}ed™Ói;-×´9üÚ5tÍT'«é׆’ùÙT7)òòP5Â9ÜÆ¡pùÄX½v‘;"¤cêŽÔ'?ÃWv¯^—_™‹XA¸:î#qê…HÅhêEQÚ=¬þ bþx(-w¤¯1U°dì:ßõt˜;º#’÷–+Âx½y¤r}úVbW¹©Yƒ8? E¸õn)9jŽfƒ¿.¿«î f¹Ÿ«B¬W2îwbâEÀu¸q7øyðÐ>¿;¡àäB Ã5Å!n!7üJL!ÊÕnT%[s½¬µCÄBb=E 'eþùN:TUQ ɾãÙlWøBqòݽ¿‚´«ŠéÃåü(Š•-Õ¥5B3 z‰Á¨@„U…N¤˜tèÛºTQ#Iÿ­ ©}e®$ܽƒ:¯@ÅÅF•¢ƒ«÷mŒ3…ýGLâTjØu‡gõ{1—åfôçƒuNEëíŽýy‡pqˆÐöö›ù—1<›9µr'â×÷&,§¥vªrÏ‹ƒzÔúsžcTð›[4Q‚Ó\ÔT>ªµ¼íß^‹ü잇ãÐÙ ÝÙj¯AÔ8ÇÜá…Ÿ ƒÇ™Cº¡²§,¬F¥§7"%¼Â;ĸ;Hs‘¥D+*`óG\¯!‘í.óÛ¹oè°<¯º'K)@Ò0šªÞ²1dÅÎn盲ðáYKˆ@—Ùìâï"i$\ ei6~¶A÷2[ñšx~JÜzy`Ä1£ˆqf´¼ºŒòWñ7ˆ³b:Ñ/@QïŽÚ¿K—¢Üm˜¡9qË‘WàM¨‚?ýP!BûÄZ¹í]íøÆ M9(Èð’>†i“o¬,€ìîÒ ¾‹“q@Ôk¨¨ áé­ÐÜ*Ê•ú"OBä={jǾ¹q7dìWõù QDçþÉ-äÇRñ_åË—“PPJ÷?$öøš¿¤Vˆ”–+ŸŽl¹*“2Æ4Î ~F 6WµEeÄq{&-óÙNòSÆø¹B´í#ÚOÖŽw°âðQ±l“fÖt­á:1ï ™Ô–Uý(cùbbTöÎËÕ·â›þK°lŸ¡§|²1Ã}@ÚÄ¡©ÕÖÖzà–er¥žéöÂ,û7~]H$¿•åϦ7v݉A—ÍVóªÃô?"Ò’H˶Lte?£j7†gMÁÝ-­hòÌHK¼ÁºB)°AiM¬Ó‹š¬Ó4[Û /7TÐN?ÁHËh­†ôÄUK“‚[-Àb]ŸKà€ä‹qê±åáˆ,=%Ww\Ì’Q½ãÙQØÌ˦Å>h¦û  6¥y±m¡!ê®/ç݃ìõ}Ú Ww¥.§^ìï÷ÉiÑ C*‹&°C}Šº²€Œ†—?KJð¾w„‚ňÅEY ý©¿=Ü”pÌ™[ÁGöñ|Ô¯Õ` j“²¡€g/Ê0¦MBAOÒÿ”N¹s&ß3öι‘Øa5q•AÕJ\e:¥ ÿÞð}äêF*Ã2•¯ Ÿ@ÇЖ§¨ÆÃO¤E•i]ŽzNKÑ­}³O¨Fo{Î0ñ­¥ŸxByì ÙˆŽÎüKû¯°{}в)`$²£æ™ß´:}(63Íû„svÔôhNéø93™œkM?¢.A"ðqµÞȧ+=calðÐS+C(Û>¹—ø´ÎUŸóvRÆ Ð£ŸÊ:Xçm/¢tÍï¡=¥Z±Ú¡b׺¹z0S• BñêIôòN7ó¹<„Ô¶¨;íg ”žéLÞÇþœ;aWHÀã׆KƒOºžºßrck‹Š;±3ÄbA—T ÕIÞéK]q ŽpÛ;w£b” „ÄôC­ïÕoïôy^G=”ùÞö"î…ìš¿»a¶ tòaŒ\pJ?Ö!ÍÓ_¹þltL:Qb$™‰}€Ûe‰¢£ÁæöFª„œ}½Zz$ÌÔÓ˺§]êtS8¼>κó$‹}gB.VÕ2…Œ¡1¢·"ùQ…Óq‰!DaFZÔÜ—þXÅãàSÁᯉPí$Úráp—ŒTý=£#‰`߯Q=–TñpJqœ¿é] ž s£ú {Œ‘Þ(Dýׄ'Üä^ÙþÀ廟‚{nŸ´§ÞŠöïe‹ñ%óª_½ ‰9-fÌ";…ß¼g€Á¶q,Ð Wà苹_Ô4C²)Û°Ñ™áŽ7tÿ¥àm±² ¹®ãÉ 7=KÀW^ÏFŸñ3Ï©:A6OÕÃøƒ •Eêü ºadLêÞ‘È“ýE*„GΧ¼ÿV® {Úq„Tú´2ïy¿¨îa¢ðŽê¡ñ©¢áÚg!Є~â¥Xí5ƒ¿Ûïs¹ÒG$k ï·³ññât‡LKV"\Uši$ËËúÐZnìkf¤§€L¦19&.1~ÒÜ®ý+žP85ŸkýYî¾Éð¸”i;)âµ  Hˆ»8ŽL–“^ urGÁ"cU”rZíp¸Ïn¤Ü¸ QDÑ?¹ÏJ4OŠ&¶;ª?ø@ˆº¿“{·pþPãs–\ç+##3Ï–GÜÒ)÷™,~÷;¤Î*ÏÊB,ýA}dz(kqÊFŽð€'Qm8¹›DB)Ó7=ŽM”wÆp‹•è˜e\ã”ßÒ6¨Wyçâ;áKÖñíÍáldà-6ø\l¨˜¥6ÓºóÞê$âš8P GxG¢Ô‚À„ÄÕ#õºë;à“G²"N™øXKd¾ÖŸíMp§íëa"R’/ýeÉ €±DNôÁJ{(m¾³/•;¨LŠ81GÚÉIˆ¢ Ɇ1–^„·nÏÁZØoe¦¥ŒŸ§#Lšãyœ‹ì˜Y­jÐNÁU¿^ÍgUFpÕQRc&¡ìL¼QáèxßòfðK/Bó´vvaÿü×¢›Óé9dtH3¢EN>¾£8߈, GoÇÄSçˆ_Mi¢_¡l(™ânIÑŒ&©Eá7#lJæ:ææ†dmim½°ÑVƳ¼fiL{è˜ ˜LS)M;ï)!CƒÚþëóg wS~Þª¥?œÐ‡]û <Z ÙõX±‚Æ~10dlÔ$/P…¼ÏIˆô <“MÇ—ÛìW¤4˜vG•gK3ü!q²»Þ¦˜eܤϋÝ{|VòëF¼i³p’ ò-þ5ÜeÈE *úLl¢ \eÖ®5ßþ¹îJô.ª9Áæ½y±9CZ·]­‡©É‰¨bÅìÀKXÏÊ4ÊW³Æ¸Ûqr¶§_’nâû6ÂY°É$þù±4zÖåøŽSË JŸ0%Ø_z ×dšàaßSÆYá^«àhÂbæÑÁ;ŹIlÐ>ÙF¨Â{¬,&B+-`štÚ)×(ÕüÐÑK_‚NÖj>£s>§'µ\ /Ðibã^ÜwÐà"†eÙ.(…W²úü<~më,œƒ$b½¯©ƒ ßàê¾>eEå5pÚ[,†¬]ÜuLy;Z<<@´ï]nœ¼' 뜘óÉy¹·ÏKÒxß;MÚsÊç\ƒÈetbêSGö÷P¬Ó‚ëÈ)ž?¡‰Ê¦¼sVx#H}JL~Ä:'6Ë‚\d<ÛQ¶Ãßf Z”‹ƒ^•2Ë8yËiÓÕØ]nlè4Ä_ XXP}üõìªeïtv”(ˆãUÂÎÍ5ßÚdTHèõ{‰ ÍÛñèBFN?Ud< èB¹:ÎÕ¾. /FXØÀŒiÔ×Gf³Öcçre{p×*ÙK ¯ž¢Ê'­YlIo}á:™¤r[Â÷]2þuÄ0ž‘ºÉSÄ\uCŠTÙvC6¹/H½qô©õb`›'ÀY.ßk_Kÿ³ž_+“ "G¼ŽÙ½²;‹ç TY£lä +ŠjÕ§LÏ[ Þ•£ˆ·HèÑ?2¼‰ ìát¾ [µ¦jê¥8º¼¯‰C_BH—8*Μ¤©­ªåÌ”©W+²ïÓª¤u%«Øg ¦^Œ?”?ØÅ1õþ²W«OysM Ó­ºóÊcÀ&’»dÛß|pk;#„cAìMÁíª)*±~vîÙÏ÷¨;bì/(GÍK<˜˜àOý ƒ@BÃÌ%o&'VSH“‚šK&gm+o¢×‡ËöxÓ·á1÷6ÌB`™¨8€—_UÐa‘HÐŽ†á[³m‹‰€W1\æ·òiÌvê†ÏaâͺK"xS÷›ãÜ w}%ÇyJô‰“hÕú.§wa›Ýçf~ì÷#ñeß¿™±*v¢ðû·y ø[› ¾œäëØ¯¡­5ÈÃØoQ¼®Æ‘ÓïÊÑos?¡ô .ÔWž¬‹>yúc§ãV8o’AèûUœSŒçp=2°)„‹F¡LmvÚÅ–ÊîjQeG ÜÇ-1OÿÂÌF“æøîÃ{ ƒ‘i@þÍS‰½=‚âSôl $ˆ%-@Ïãã(õ&iÒ¢e­îjb7º°²¿¥Œ5»O!ÕãÇìxZSI¨å‹d·‘&Ù#+µQº^ƒCÛ ·eÂGN-'|%Ñ­Óù-‡«ä¢J³UV)¼ùÈÝ1"µëš,ûj Á1.ËLñsìkkŸÔwdµýO‚·¼oñÐë³4åaŒ0MÙM³Z` 6}Q¢è¬ßúÒkûä?¬¶YD‡8•­zĤ›°ƒ¡NraEŸ„_¿s ¿ (†ÒÊn÷hÏEÁ꼦m׋gDpLà_êy/šFmÔ׌ÙÓ?›BǬ’‡FXÒ4©L(ìdl8EñîUèºuuƹ:ŽÛ"Õܔ怄Ê)!–×”áf!§Ô•&Ime+—Am¤bÖL2teŸKN…w®\9‘RûÉ ÔRÑeaý.·QÙ ¢E e jr½HÊžUI²©ÉUHøR<¼=sÇh³Ï@ÑX7¨Á4¤8&²ÉrcQi3 œÑ!Æ‘IgVTààhÕ%ÇÄ$:~ÂX^žå„]}v©‚3&kM‚Ê-1¤éJv÷=ÕFk\?úü~ß‹×ÒñCo<Ô_„•œíÉOøÙ(/ƒ!K×Î>‚izª½ïýl™5Ög”¾Éð¸˜nYƒ†q Ò«Ši&q>]îü­š)Ùäb瘔e,ÇUÈe´…93¼ßÙeŠ¿åÇÏä\ÂøXrÖŽ é XÏììj"™£Ûl¤ãì¹$vȽi¿ý,ü)Š6Ɇ²‰¡…{º3ŽK;û»¡?ÏЗ™4i!ûd]ÙZØkUl§¤4y–/Ÿ=å:‚Y8 ß?g­±µCÒ…%`2#AÀ9?mOŠ)‡]ft¦à“©`uÝüèmõ®$«<–×Jž#®õJ,­‚—‹":Pè{RPÁPáD?øŠtËÕ$µô–É-€ã¸bؤcI44ƒž‰o ꀭ4‘€[³ªW…‚«ß(+ö;+×½S® ?Í>À‘žIdsW\*Âö³‚’{}Á2#éL6Q_a _"Àf©&w@À ïC‰pCiKc ç j¤ýmÀVm…ŒÈTÁ÷Yj’_ä3=)hÔE¼T%éÊíâ‰Ñ\eÞªü4Èm~޲¶¾g²B°GHê{½²iÓ^¹rÔ|[&,´t»6ž|yOh37Y­èo.ÕdÓ_AÞÅšTX‘»”q¸®’7ˆP}J"x{ ‘J\óIOR¹e˜‘¯þ¡UÇPïÇMˆÈšNÆœ×UÿéÁ"[I=öîÕ¾Ú—ÖŸ 1ìçÜFvå¯%YŒSÓZ^æ¾IYo­IÎoAÙþˆ=Güf42+#F þ•ûu-¶t‘|ħĈ毆ÌÓ/w·*gÂACøG?›¡.ÓNˆð'Ø×·èA#Œw‹(aìe[-Â0–ýxg!˜T ‚Ø*R»¶›8-Û¬–m% ½xšºÛa¥0öÌêÙ5üºÉŸOþ˜³[DwrÀ%z£×d=ñwThYCîoƒîdÏ±ßØ¸ÝpØÁÕ§ ËûÉqˆ'#À*hT¼ä;Qz|¶Ê‹j«ÓÙgEb>r{o±›}€$q¤|+À+9ŠÒ*#Â|ÙÔS»ÉøókÃvpïG§¸S‘ÀÐæ•×.ÿ)`©†û¡îÙŸf…GÙ!g¬É gP׿‰$7mÿÌy¯Å(Ú%r×´N÷ìfÃHu=LÏ,!`ÜO߈%Í7gšƒêøƒ·áØü¬Î—cöSh üY2-ƒóšM÷¢"³2¨ Ê7­e˜õŠþ]A8}¾Ð’ÑÏ ü5&­ƒ]°óæ«0'&mèͺ”µ{ÌX”TVã£Îžöev²/2d%ÎÜvSúBÆ:^NÄeíß§.Za2>)ê$½wÞ PÅ.aEBÖÇb…Á?À—O™d9Ò¡K¦¬Åì K¬{ÇXMÐøHh§,ß±¸ c÷^kþÉ¿¥ð ‰|ˆ™è²ü;Ó´Í8[.ª/«áp¾H‰‡¾ô5 ÞY·üjý¶4Ôå´KÒâ.žMÊV*zä?eÊ£|¯`*êÃôÎ.âòªpZ·òDrCh;pìš™Ç>Fö¼e¯ ÷…+ÛY.òŽþ¾Å|j„>–HÄ{Î>ßòØ gÕy†¥´ŽyOŸ-b!‹z€éˆeJ<¸NÖÉqUã`²—¦¯«QÀ†ƒt%ÒåœÏøÌŠÒÙ3SS‡áI3jµŸX₊¾ü¨`7ãsÈÆ¶\ÐÂúU„ÖӽA0y}9ž{t3±]ÕM/Ÿag” e´/%Ûè[Å7n:â¢Ûî«sâÇOêõÃÕz$ÒrÒc]UèD÷•&ŒueÉп4ýä¿Zc˜·¸ ñ4¹;×àjœ’¯~<@$ÈãÄ|Û!Ü÷¹ÒòokÀ¦ÑKZ‰«’§ûóè¸ÌV™C'çü:ÚþVzä·³Põ‹,ÐŒú¥ ë|ƒvI*O­þ錖%.—Éààð Lñ†8M£µ[ñšæ¸Ö~”ׇ£zýZŸMkðCAnî>ǦuÅ=sPÑÄá`ï2Sê2ÔåODa½ñ1ŠÓÓLêH_1KÌôæ›íc.)Ö_u º¬øÂ+iöI¢¤Â¥kï’åá"TÑæÊ’NØ=®ÊED=LA[!#B®'È+Dš‹ý¡QËÏÆúéÉ>e×™¡e×”XˆÕAÌa‹Ù}zÚ齡ùj43dôº‰Hiè¹Ø ó/94è "¦¨úbšmXìK½£¿*ÍW6=U§öÑÁÏ 2}ŽŒ\Gy|¿…ÐÃ$ÅIJ |K¼E'_Q“”½DÂúD©×²`³£tØ.h9/›¡zf¬7±.z†>žiªrÐÓ«(‡±)ÏA` ,µ×ûõŠM Ø%ÕPŸ»tƒ-ÉHÒºmHl -øÎm×`¥¬{{ÃåÃØ¸ûL úBïiÁíÃÂ6:«î¼ªw’CφÇ|$Ãl÷üS|f$jKø¸mŸm¦0Ýy²ìÉõÞªb΂õ]£³M¡… Ëqåõ¦\?»A±²—ÁÓîȶ鼹`f¯ÆöNº;šë+,×aÕþÙwo‚4FÚ>A[C‰ñ]w•)…ßì%ò`–ßJi à[ûþüˆ|Ï_©w`š¿­ÀRX´`qÙF(“ kþ ¶‚X¹áMÎZš·rjXîÖé’SµO£Dý¦•ûñHS÷¹7¶'v\pAEñ©‘´EhÞaXÔзU¹RewSÈþÛÜó’Ù¡0͑˼DÐDÐh<‹î‘hdšõü²“±Wuô,=™O$Fmº`êuØÞX€¾¼8ÿö€iuáJw’ åv• _U•¬˜{âÅÛ’$È”òjid27žÆ+ò¨˜»ÿ4u߆гÕ!JoÉJÈÊÝ‚Kw šK¨b8eÞáÂl å=Édø7DÇë¿uWT»‰mM™ýÏ ±‹/SáIÒª›nÃáéë·Aö9*Héùâ6HqÎ-£¥(®i‹¥ØJä£ —)×+Œø×Ñù™óVÁ÷ªxíZ qÆ dri ±TÖ{‡*ªÚm”<‡ñ6¼¬Ž$ª* LË“SKnÚLþ) ‰œ9a÷l\‹íM€Šö¨†IH±Ýú¬Þ¦)å¼gšh§³ç`èð”DƒÆ»6þÆhA¿BèðÐ-YV‹ôrÈŠ†ãë)E+Mhòa‡Mû°„¦­µæ%<ŸÝ«úZ>±I]ã»êº7¬s /-œ)©,ôEÖ÷chß}’ÕâšP|ó|=¥IÞèÖÔ.Vß±t´9H†&<}Y°äáÜŠýB9»0iÒð•I æíBrAç¯ 29ÛjÑKè<²)”!Š…Í‘ÑØú>v[#óï@˜!vÁTæ*É8óÛmM²õæƒêGw§ëBâ¥õ@·ÄTÔx“Øè>†UµV}/ø¨Æ:×ûzF²,%bë qDZ"œ0VÞÚ,¸ù&½Qæò¦>?Êö7#ðôb6÷#Çü±ð¼Q†üþð¹Ï ÄŽOï×yÛ`Çhƒl»Yã©q¥a.ô˜¶B ›œo;míM‹È?‡Pm²[$ž¦­­"•z[8ua—ÔøáºöºÉåzqë3 ›N•d-« Edw‰¢È$×b¿·µð{D'Ö.è¡­=ø½ÿz“­ÞàOÁaà§ÇbÄ®Æf^©PÀdD(zi,Ë÷3ç¦Ø· çC…ÿyíÄÁ„ûWR £DúE@\”¸$\P À£±„±õ y9¦ÆÊ#&ÌHqõPZþðùûçLL×W›m÷qŠœTË€m%úvg,ï`o®Oä ØÕG÷'jb¼“TÈ¥°½@r&N[ü}lŸ¶µÆá…û¡\b© K8og| W‹__ù<ƒG"°. ŸÀ¥¿.¥™tfñQ”M·ÍÙfb¨£T$9Ëe˜£¼i.W7Á{¼GÈ1Þºîexï1÷SW» ‚ï§•{ÁnMÇv+ì—I Y¸šêÑO©³´—A”c!﹂ 6ê¤,vR(·®¬Þí›Õ—4ܧKåëP.LùÊgaôÓk¸9=|ÉéQ09?æÌ.=ž»Ìk”OŨ¬Ž`0ÝU¼º‡#Tf0]hQC×A:¼ÆU·C6,8OK’nãÆÎN©ªá›'ãul²ïQÙÏ¿*(á’SЪÿX;O‚¸ڜGØUêªíepRÀgË"ðØ1È™â 0.Y¬ù¼å“¨ýMvd­g±ï%DØÑÁ+ßFïÕÚ¹4tqe™æUhå©„Æ\†G“O×YPº®»w$µbo…J[ªÈ˜RÍ7ݧåbÿLÌI$WË´­¡ǤYªžãÆ·}@7ùjºŒÊ€oƒ{œpŒÙ ÿö²Øúá{ÊXWåŸ)–û‡Ü_¼6>×&ÆÈ´Ù? ¬ãå¦+-~“P¼•‚«~KíxMûð ’7½ß¸*~‘ò;…¸ "Å®ðYeƒ*á@2ñR–µFÍH’ GN–A”E.ÑŠïb’äÜT!Þ9SƒûIn…ÏêNrsPz±¹ºÚÎØDàÇ„ÑÈÔºg¬&'wü"aÃ"dµ?´ÃŠ ûÓ¯à%Ñ;„‚Ûõ§¶ÜñäÎ-g~ÉR*ÎeV?x¤a³Õàe¦®ãý!ýó­ÐÝgÅ!¾ù²_ìã{Æ 'жÖ/ÂÃyýýoIm)ßï6ÃP$ÎC. Wóf³‡¨P2¿¦2çW|ZxxÞW¶+glŒ.÷°ž=?ç”È6ï‹JÏVÖjê¾Ýì#åB]Ó Â×v*US8dP9óõ¬ùä’ù&}#ÁCÍvÕ³YÀé1±™G!m-çæôG°vÞ•ÀÞeœÝ‡˜jý?RÙœ/kl—“|ΫôèPá%Ý:šÖµÐ¿P/pùózÄ1³[w0P£‰æ‚zëÞßúôÀjj5e5ßk80ZíÛÑg^ï÷ÅJ&óñ½ÎÊ£ÜCKâë“…e=!î·ç,β¡eÝë¨ÿPBŽÓõœÚ£òU¦³ ]´“[ìáæèC†Â. o·oú2EybÚmýd_Ô`º=d°}e—Èz‰Ià©… OqÝ þÜŸ(' qi#AКÈì¿–3lE[¯8a剞q¨»”¾x-q@€5çÐèkÛq¨=y ™À{\ñÀûæžÈÄà¿ tWЖ¬À_ýÎs¬sL¤tˆ±?úó!Žôx”óCê‹í½XÅêÌÞ‰\³ÚV;Ò¨ðo<^$ « ¸^Ç:·™}†ˆ”y=HTqå1¥9Ÿò¥ž¹&0^äž2{ÚëÉ9>{<&‰RE%ØÞ ئíƵç %– , ¨Hw´h‰œ©;Z2ã55 šY¨ž¨€ýtÞØhÕŒ5ÎnsHˆ˜æ´\\ý5eßâÖá¯ê Þ¨äLBRᢩ2ŸB©6p¡±#•ÜT®ËŒˆYÝ‘Œ’àÍâ9;Ù8>ýw­ÂžŸì/œ \û0ñ.®"›æÄŒ&vŽÍÂè¡»ŸO¤ydfb/p(É~ˆþˆ—-±)J¶Kïî©·ráS-æá C±¼z}·yQd‚ÉîùéÙªAO%.£ÓôW÷Çv(¦Œ]¡ãZ‚2iì»%•1jÍBî­ù<š1Ë7YÄÀ]åö4@É4"—ÍíÙ#ëp¶K‹{TC /¾Š£PG®,Ê­–Jd+;ŠvX.—Ö¤Ø$öe…±ÓîÑÝ·g5ÑÇ œæ è ¯é®ù¶ÃÓì a¾ˆ¼¶'AXx<¦öRy®:ñck Ô³U}=+’V¸3´‰¢©£Ž_aöhèüÔ´Æç[5†»‡ÒÞÌi³l΄ÄUÈZq\°Ò}ÆÙêÒ#)˜à$]³-RöÛÎdhF1}‰#S,ƒ†BB¦®ú!Ìß ‡Ê|¤™º©ÜqËrÄèq“SÂh aàNõ;Ý€<Ï¡®6уö†Š´ýÕ"¼/!q]UûÃì¼Ìz…ö¥:˜ßä %Vfda¾GžäÙù×ÓçÙMLoÅóü¡kØÃ‹xÇ×ÛpÚÎ1þ/X.+«‰øBØÞ«&9sª ñáAÇ“»†y[Íú‘¤C]å½Kq ªâºzV¯>XU÷`MÉ!{‚BU!AS#]e<öˆèÂ#>è0´Á!ßh¾Ï„TËœi{:%Ë4_HÓ{ 6 •ó‰*ù0Þå<Ųûh÷ˆ:ºŒ1mötÃz×¼öóc7¦¸xßâ(–µ­ÿ$ÛcÀO¸Ð°`x;ü© ½u‡Tûh‰Rìǣߖá9±æŸ9úqѦ1þ&%"Ç´}ÜsJ(^Ò8Í"à`¨‹Ùp€cV»“©!ⓨGsòÁªvT ÕHx`"¯B]噄øôÊ8úkp«© )Ì«ò¬H]Œœ6Ý#&‚;JEÒßGÏ wW*½‚ËW-jv{*ä{ßÛ<>¶ôÎ\“éð\ÔXg:¡Ábi˨ÿ;:ñžî;‘]½z·ät¥Á>=’ ìéö/q”ˆ6&iÄ^ªi{j·—o/µ]5k *¼…?ãüùŒ:ÕéÜʡŠ¿>HçÝ!ò»¢T›Î4<¹gi}LÆë ½Àí~«¬JR˹†®¾ÿu mÞtá9ä Pë ë³z§€þJ’–Œq¸é׆o3¡)¬“ÄAAÏã⋇KÆ|Ö/q…à¡òEFüîã¢À_ÁéCc _ä6­_ø¶ ýa—Y0@¬“ó,OÀ©Ž€nÌšŒÅÓøU™yͲƒË=¬_¹Júü±šg‡)üSªÍßû@¨<Þ ¡QKAß ÉW66ùp&)?1+ïYÒ*lñ1"š9é{þÄ—«k½Hâ`¢ÿiN€NaD¯µc¦…?ì’ÓÖ®àñžÿËñÞ§ ´ ý»o>OD·Èo€Ï0ýÜ’MÔâ6"—躚zd°~bL°ˆ¾ï7MÖ:Æ…XÞiëñ0É÷“'JÒ±(‡ˆ0êÀœ\ºoK '%L"YΟÐ#ý{¿´§ ƒ£ŒšG;©^BÏNLjø$B.7ôT×*¤n¡(X`ãkïUÎ#+M·`”ÕúúþØgà{gÍ RÃ>Eýl}·Kå«íʘ¹¼ Ié4Ÿ_#o0Ø“rs{rHÆœ!¼2\yo¶Iuå…ʶI½Å5¸œh­~ÎÊî“Ìݨ)uÊñÜñЋ‹ÎˆÇ­$eK/6nÓîŠVÒãî¿‹iåŠôO„.&3mû¤`æ[;t-§¿MYèÍ=íÑÅ+ø‹ðS™!ì•iý$ucaIÏ®‹ׯúªˆ1)F7¨î¤é¯l` ln„¢gË÷À™Ï€í±»]ìAb¢¦ÜuvçjcJèjÝU⌺\Ê@ÈçR|x\Ø.^L•FƒGö>¼žl¡¡Zp,š2xîFÀoÿùDXgá¶: ËB)Pž¦³.ã=&'K¢p±¶/ÑL¶}‰ƒˆ;)ÖºÙŒ>ëöË`ü}éËm1}NK•qŠ}õæE´Òª@¢@Ù‚cïÌ÷N³E›à– î-cl%~–¾je/K&Í·˜o&eT¿¥0véhZP­rìºÌH% kê«U=RÃ(,ö u=¤V>™5€›ßÕL8dÃj²# <¨¯Âi•Fgö‹F¤;*ç<ä\ð" Ï]ù„“FÛµžú´†Äoa|™±!?ùmXû![ü7ÚH'¡5vçÛkb Ö ­a¥ê£íÞVà  …&¨±‰æÇi7TcÂYò©|±û/5’Ë“ñ"ßÇÒ ¹Ù‰Ÿï¤ºö^Ab¦<ƒÌÆë|šTjü=Äy¯N‘¢¤³ÁO€wÎT)¹‡©¿¸ƒÖŠKÛVBŸkLó‚5¡6¢o¬Ûõ ­—Ó¡Ìf•‰ mÛ톋\«)i&t#ᜪ“¼Ư›€%5‹N˜œì2³dÚhQ` Nö•@í‘nÊ(+žÚ¥ýZÅ(zrë€K€ªì¨ñˆé2¯¾‹Yíy5ÞÉd®Û˜éeŒçñn)ïë@ÝWr*AVhøhâe^h(Ì¥-òå *&ã !*älwñc¢=o2ìaÊvŽßÖr`&ºñ›àû ˆÝ#SòÛ Ü5œ¥ÚpÒðŠ0³· KO²| ª9õ%›2“P£Kã©/p‚Á` ç#­X„tOôðHï´6¶ ŠÉÙé6ÉÀ@±IŽ~¯”w˜€êN”A©•-þYÖhm5{`ë<à¤ë¡yéÈ$ªÙ†lÖÍ÷ãwþj,>UÔýço¢ëÆšÎLÁ^3~ôM³(_Ú„µÓæI›RnÞøüS½ù ¶„5°–Ê’eQOšpïpTi7gÌXÂäÄÃ.[`—m¼Ü:Ö+=Ýcxøw çbà-þ7stcó° :ðÕ´õàõ _71XˆàŒA³ ü½÷²nÂîÌSD30’Ó:7Œn-×Äeб@ з©¾€©ÓÂÛOì!ã4æX>gÏñÒñ‚^Ü8‘®2ø šÏà±ß®<gÊ8™2ˆ7?µc¦ú"^„d»~Y$ï| ¢ÐôT$Ã(ú§ÈÓ˜€ª§’…<ªf{ÿ¨épÆÕ)ÉÃþKte³¡6ÝRc(ϦÇ"JöƵJ8(ñ–£vú ê•7)nÅaþ†Ô\[ððKXñ& ®h< Ÿ¥Œ$–˜z›÷…¿MÆO!Öòyë Êͪ»0Ë»ÎÖ)»ÂM-}exçµS—÷ï Ò«9ˆ†|ê{ýv÷þ¤¼Ü£Y…UË ¸EìÆÑ]jë¬kù@Õ-³{þ)Drä­7Í¡å²yŽ:Oi~yÏúø`ÅH&ÃËGé—İ0 ¥\©+Íl•Líè4*`¾®Õp]㋲´¾,©Tì±»_û!GùTºO+6ZXÿå"Çf¸°§ž\ šŸtFgÉCò…j1é áëšÄ®ñçñÏÃ>!¡lBfl4.Õ0 l«Y ‹¶ïá¡›äöJÌìšÀÛÅ{¢½k Ôm¸$€ÿ”šù.º–`ŸHPºa¿™Ul+S'‚½]lòÃ9,Ävz+¹±IJV~µ×¡=VðAcÖ;vÙg/~ŸÏvöUNÁp5õÀ‹=cn0)€C<~ï‘å•Eï$7*¿)Ôiëíð@æ;Üi€7ØvˆžÍTˆ^ ŽâÏÎÝÙ¹¨Ó?[l=…:Kn§#ÞÏºí¥¸3–=8‘O?%œ-+~R–H[<´c™å î@y/ŠÈŠX ƒqÓ”}ý—|Þœ68Mg°ÖPû \—MåSÇ~/êdž(@Þm¦õÍ]êQå§3|ðš·r lZ­ÿ\‚ ‘ªV*c5Ëý4Ùé›?ÓÄN‘Á÷‹CœqƾQ©ižß*>ã‘hÊ;¡Š!n¡Y8³Ã:ekº©>¼‡7ÊÅÅP‚Î[óë-`ÐêŒùY{mVÍÔ^ìüÉ!e¢çð»³$΄H2[T’S±–äÓ›ÞúL{°ëeC-œP¥ì‘¿™"A¿vôC Œ×C)å£óµCm—%aÄ'0ŠÙ>p0°×Ï` |¦wl3ûl_Â5=Ĥf‚ –+ÕW–"¨S£vÒ @sxç‡ô!>ƒñqœ’víCz´xËe0Bµc´œxÈ£Ù'šõg8|éH+žo»ÔI-2CݪžïPm"|‰.¬s‹dö„„¶ä‚\ªüÅIU‹ËÇÔYz¢©Nt6ÝU}ŽÐZ)Ý;vQTçØWyD$Ó¬þŒ¬è”¦S…lÎB´§‹'MæS¥RéFàúsz}+=Œ'¶=5ûh~q?—TEJÜ[±qcÛéõýÃÉRgî¹oÖ\XQµÏx¾`­Ðë_cÁêvìw5ÌÉ [wo½ F¸Îm;øU_~@Áöm,ÂW—©*Œˆ"‡Ñ(ªFßÎzÅ)83dÉWÇz-S`}:Ž2S\îÈk˜ß`uv,  wÌ[p‘Z|Ôîyýž^ q5ú“VSÖ¸:iév§eÑæùs=[âöIBœó"Y 3ÚýÚÿ÷J…tø"œÛb+ùp»¹¥~‡÷¬|c}\W@>ѦG‡îXpQ+Ü[Ñ´ù5­ˆGü|=©˜…Xá+¿Yzfñ%ûLÍ:G¼Ö¸±>k3 !öñÜ|ù‡ð/r×7[éí?´tdSõƒ!Ç%ey «ÃiÖVÑówÏ9ɧ¾­3rk$ÙáÝuد";•+´HÅÃàW~8F`ô§w}H©gÿqì°º®µ“ØaŸ‹.³C‰DqbU6 )ÜÉgòeôÅ:á?˜(Z,^F,8wu8#0Ö÷„£þÛO®)‡ÈJÀçEj}†T>'[ûÝ’fg‹_âyóèÂðgàÉwµ²È¸f±8£øò½´±Ùç®ßщ·A¸‘ìÖÄjÎ5}8“)ñÓ#„a!?ZÚñÏÑÂáz çêʉ£láõý"ž §å½Œ2Ö¿ÇiBEëñi€™y0!š-åm‹T~e:Sê’‰A¥Æ àgp~1íås1Æñ›M®ߎzKõAh=YüÚùc¯%áŽg62Éruq!2ø#v)MuEhÍDó¦J‚™kWaÿ|Xü8…x‡àML€“Nò >»«ƒBh6ãí ©ÃºÉFQƒ0œómPkåü£b+»V8·±€¯<Ö‹eþ°,/ÈÖ;ÿuÝïýϧú‹nýÿõVA+pº<µñ©rQü2Œ¢¥ùO%ø«}ƒj°†{÷ƒ†5x߀ªh5§±úqÑÍQ:TJ+D›Î—fwumF/¡J--F@—Ãdš…É . § endstream endobj 416 0 obj << /Type /FontDescriptor /FontName /KTQLRU+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/W/X/Y/Z/a/ampersand/asciitilde/asterisk/b/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/quotedbl/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 415 0 R >> endobj 417 0 obj << /Length1 1540 /Length2 7404 /Length3 0 /Length 8413 /Filter /FlateDecode >> stream xÚ·TTß.Œ´€€€¤à¡†NARº»`ˆbèîF¤S”A:$Uº¥C¸è¯ÿß·Ö½kÖš9Ï[{?ï~Þ½æÐS«i²KXÂÍ!²p‚‹$ H)kjrˆ‡âÆ¢§×‚"ì!Ù±èu Î.P8Lø_RÎ0âÎ& FÜ*Ãa€‚«=ÀÅpñ s ƒ@7$ôW ÜY»A-e@ƒ¸`ÑKÁ=¡Ö6ˆ»uþz˜,˜.!!¶ß逄Äj†Ê`„ ÄánE °=  ·€Bžÿ)Á$jƒ@8 srº»»s€\8àÎÖbÌl€;ah@\ ÎnKàe@ìù“= euùá ·B¸ƒ!ÀÁj¹Ü¥¸Â,!ÎÀÝꀦ¼ êý¬ôGðgs.®¿Ëý™ý«ö;lawpÃ<¡0kÀ jTe•86 ³ü¶wßåƒÝÀP{°ù]Àï­ƒY u|ÇðO~.ÎPG„ ‡ ÔþGÎ_eîÚ,³”‚;8@`¬_û“†:C,îúîÉùçáÚÁàî0ï¿fiõ‹†¥«#§6 êä ‘—þ3æÎ„õÍ‚ø@ ˆ€8 Î_ hy:B~;¹~™ï8øz;«;_¨äîËÛìή_ï;þ‹°¸¸K¨0‡XCaXÿT¿3C¬þÀwçï õ Awòã@¿>?ß)̳÷ü'ü÷sjëHKÈʳþIùo§¤$Üðfççعù@€ À'øþ·Ìß ø‹üo«úçæþUPf„þàp×¼¿x¸ý) ¦?§†øï *ð;9C¦ÔoâYÜ}qý?ÏÀï”ÿ?éÿªòUÿÿîHÖÕÞþ·Ÿé€ÿìµ÷ü3âNήˆ»ÑP†ß ìCu!̳2Äêêð¿^yønD$`Öö7ê" õ€XªA6¨è¯s¸+o…AÔà.Ð_7ÀÎýïnè,ìîn—»Óúí‚ÜÍÔ—”YÀ- 7?vv{bîÆÍÇxsÝM©%Äã·¸Nq—ÜÑó¬àÎX¿Î”Ÿà”üeú„Nð?Hà4ÿqÝÉ’ò/ÈpZÿ òœÐà09aÿ‚w¹ðA^€Óù_ð.×å_ðnOˆßð?T-\ïîßr¼ëÃ_ø÷¥x@,°f§á"!¶Õ!-çUîì«CèK+­‘ñú=|†Ï¹Þ6JéÏÇ$Í,ËIRÔfJÂÆ¦}(Xö·=Œ:2“årH2=ß$Øóú/Ž:¬!T–prë”Èo÷Ô)ñÌ Q u§¯C:yÖ+Ö ~¶º¬m@á)>u2"V"»u9ZŸšnñIß?ŽÀÙ0ÕUK^{ä'r44îL²%†ìÂó›a\Ú§……¾ÌÞžž¯»*ùËÃɈ¼¨³^~${”©Ðà‚Ä Éw*U’ȳ?Ù…”;ð }|Ç×\½ëX=+Å %ã½… ù¶N}ÒÞ¥ÆLrAa¸,³ûSsŽˆ—;žfãºý¶UÒ‡f‹y%ê~!¥]U\Ôå`SŠbL‹]H«£MÊ¥‘”ÒÇ>[ÕÙÛnæµ!O ç Ö¬§¼ö÷2Pܵ*Ñ÷ïR6§mGdC%RY/ufXök:Ì>h†ŠùH[ìèom»=BŽúÆÎÚêþuvnõæQ¥!µïr :Lùð"1q'ÞU¨E©°©9ømC„­Bqí†Ýî[–7–¼švöu.ãÙ¾þ¼÷ Û/ïSÀ‚Žboƒ(Ü>}‘eØÔ™×¤´MÃëõr?iÉßùîwúÏÓ#H’çQµCoèÓER¹Õ%tCœNù‰jms¬ÈæÄ¥31Xªø½^tBêÒ÷BÄ0E+ÂRW) ”lå·O­Ê;˜™' «MR¤1ìâ‹«h†PÄ‘ GÕŒe?××Ie;ÎÏÓQ؃汔†Æ~æ{£d¾ ´Ö3tF<¥X¥|æãÒïö¸ÚŒŒsz@þê{KΩy™n¶²ŽæÒ¡ÛÌä’ÔßWû@jG”=r±lWNU¼£b¿¥òBÝQúf~5kb.êè¸%cÅ•„±¼Õõ å‚êÈÚêz[‘OI¹cÇAuÎiýͦ¿°C£:­žÑùÐ7£«Ž—ú@2ƒ§Åç1uâ!_‰oŠ#ý…:sÑIP1‘æ0Õ#|"ߨÆè…eÓÞœ¼}/þ0=Ù®™AÓ&…ÿ ßáÍ2‚p}j"´ÅýëÉåÛ²0«³6Íâú:”æö¡¾ãWp²ŽE͆Ä7‘uŽ…8äÁœ§‚‚ªª¯„Å ëX¶´#pÓt£9ÝÂ$Šš ̃Ž$ éØOH·Íû ¾Ô¤¦½©‡‘iS %MͶl«'+­•P°KÿÌö³ÀÏvY‚‡è|¶{It~’õ0²‰)õ|‚®OóölK˜“˜{ßäìÜ-0Ïy„2~'N0nÔÐ3žÏESí™Îv¯ÿkyC½åà´%K#ª{_w;ÅõbÑö×c#â]( ¤õß>¨¨Ú ë©þT°7=ý }±AxÊÒõíœ=¬”9ÑTeãcß²*£­L|›žJæzZ¡Ñ믉¾<ƒoú&‹º´:*܃gÍ,çOÈ\«½‘Êœ+uS&L¸X%X˜Fñ9™—u±a=zcæ3JbG«êžÝø¬•Æ 2Å]ƒ‚#:­pýÝ0ò®8.$t»½r?ìÝKF©šÄrþc/š“#GÏ1ÙËœÐXë~›/,†ù‰5¥Òù!´‡¯ºï±°ñ+â÷8ZÇ‹O¨ Çe4äâKBe'°<O]õâùšÕ,‘n¾ÁƒE/6{—›Ø§X7à¢Ê¹aÑ4†êÙ[¯VJÌ’ ËðAwŽú7É>¼kÞÁ2} C{?xW³SM_:ñUîç§œHâÑO­t£Œ¹ênÊ8£í y§Û¢WþC.¨$G~‚-oZŒiÇüŒ›„¹;­Ö´lÝw—¼ND@AëµHÈÉ™ ßÜ’ŸóænN‚3«TY*êoäâ6lJ[^ÖA2í‚C3Ø6˦L¸í5=' ¹ýÝÉ›E?°»3û&×ô5†¥ xá§ÂÓï¿éá¾}äÿÞ*\ÓÉvX¦ÜWˬ²GR€ÈǾˆ×FQ*Í0 ¡Exú é½ò£A_ßGUå*#‰ü‡¯}ílƒoP['¿4/“ºj¯AD!§”õˆBìZ¶Ö¾½W£ê¯^ËÏe™eÚÖ“¨åÔx=<*ñ_¨B&j,Ú8¸ÞØSƒ.>ùB7Ÿ#ªÉšü²åªÓ†¤‚x1ò•9«ÊŒ.:FXÝ´-¹"¾°Õ_K_gÕøÇºôúfŒÉàïw6—Xx«¾Í8»Ç$¯¥9·IžÎï0aP9F,¬<Ɖ¼¢Žpy¤LŠÓ[2ä£à_Œ[Ñ`#õáQÖ16B:+XKüç¬ µ™¨±MÓzû*j­F:^çäî½´“Ú¸–VÙ»úËÁÏLs®mŒºÎè–¬uÓ*L³¾;åòŠŒèìÎeNVñ7ݦU+"½ïéyÏGŽK;”B„e›&ô½tõP¥<™ûÇÙDŸ;ú÷ÓJÎ ³â¤5jåt¥›[[t+Ž·{ãȲBS”ð]Í"Ö·<ñ.}4»=ãi.Ö'tA`f¬©ã#ꪲÛ^uÒ6 ƒ@›–18:*Y±ŸjcòÞv"'@~_ð¦¹X0´ïžKXd§UÇÃÂ÷ñ7¢W‰…Ü>1Ln^ôíÓ=oõ¿ª›ý*»]“ÕŸ¢i8«Hn94ÅÙçÆn­H}®h¦[GÃ>ãüšmfBCˆc@ÅoÄ({C·ÂÙýh*Eœ<æiÚ<¥³ÆH yÇèPÃ*짃Wé±Y¹ãeL+¡à¼n’v¯n]§I¬$¥5á³4AÚ^^4Ä»“Ëï±ÀêÆŠî1ª³´„öè©ÑàÌ••ØÃzÄ©’èô'4'ÇŸÂñ"ª·5bÑ Gë…%Äå;àÆI ã“”ÍS}ëÊjz4?™g:³ùoˆÁ(!£§u–ÙWMãj)W“údÖb0ƒyt æ„£húƒ§xO¢û¯“ùžrÛ÷¡Â%Ɉ˜½7ˆ4Q·‡QB¸ ßs‘Sºw@åÁ´2@zšM˜G(üY¼½0{¯úžÆÂæV²YrpB®9ؾm§ …zXAЮ¨P~”ά•¤~?pœæù`ÌŒ¤!î,µXÂ)û,ÅdI£>:Yƒ™#'RnM.®h…/‘É|Lü×6»yvœ¡L$B¸?Ùyy^ºt©0qüêu«UáT,ð…l ;ù.R y ḛ̂Ùòí²!«±9úԪϨXûþZX¬œyÙö¸O}¦|úozáÆz¡—aB…‹´’q!uâ Ï÷¶Î¯”_Æ µVAš…,¨rÌÃãl»žaÙÐè …öˆ¾Ù¹H|)¼Hê—äI“8ê/Á._Ý/d<øÄC@Ó¯bh4ÀCd¢x\\ÃBµ_J"v™ìæÀ[=èØ0Wï—NÖ¤!Î ÷MÊúœ}Fô—Lnƒp„ֳ⋮vƒù_ÆägØAoZœs˜^f{íº;5£·®¶°‘~Hí;ˆ&'­á¨ùn`)…ï墘ïyO³{&s’Ypzbü<8d»rÏŒ•‡¯²ÜÕ%X¾c*˜ï†7a0'$«ãdf.ž§4 ‹'æ“áµz‹ `Óóâg\Ò|{÷æ¡ÖVÑ÷çÍ¥Â{¶IH°™›–D©ö82¥ÿ0%hjMm4ûIÑb–HO‡#õ»ÜUîô„ýã±GSOYÏA-ýòª^£È½ýlòωrS¨ƹÚäOV »ä›]“߉,‚lÅZšµg´Úèí^}® *$:6°7õf"Õ­: †æé∯4>6Ð_Mí—“”ž2ïßÊâ^T²®I1# |°bÆÔ/H¦»+ö$Z)/ÖA|OM-U¿þ)ÖŸ–´£BùTÚ» V'"õD›43¨+V/QQÄÙoêiqñ©û±œu¥Íó)Úõ‡â4¨ziýà) 0^`㼜ç¢ý¤2ûº$—êË—P]àöÃß.ѯèDã&£;Ç=8Í ‡ !&éz[”xÆvv×8¢Díhö¬’ó3™âöZZŸ#m'QÛ‘ ,òÐ]ހݹօ¯W”¼(‘6¦ÍÆ9œQ}™\§R‘ìXMyã©:ß“@KLöÊ1w·6ê ñï¡8|äËÚºÖ"ûmQ#?®Ø¾.rtN5‹m§”eZgɳ½Š‘màdÑ äþ ¹y"bk€´4µ*õÞCôT^x†ÈíS99©.hï±+Ö©qnÉRpUmµ|°£ß½}ˆúõ‡Ýû2d– ¶w·ùǘ¨ õèûO…ürZ+N8ónžw$m$àœòÒ#S‘ÃYekîT¦ÍMdjék·ØžÚ1’¨6~%(sÆOž„Ó0)s½dQûû Ÿl߆€²§îç<Ê ×{b[…­G̤õÎQè~j䌘‰rˆãý‹äéoŸÖaoµë¤ø’Ù˜±sÖ° ÃÊ¥Â;?àG»S\°¿®[%ñXè´rHÌíÍ»n)ôˆÞŒô¶ž&Hkz¤ÛQ^’[ øi”0˜¸‡-ÍE.Í5‡ò’„Ë,”sóû¹çç‰iŒ%^úðN•À£,ί†¸ŸûmÊ9c+d…¡^v/?Rý,Ìý-Û0ÓÙÏ—ÇÜéù7âÞ sr F")[§B¡n–ôzf‡Z¦È36꺗¸_*çʨ¥e±´e÷’r6Îò®×Öf®XX™”;U>áÜΈåxÜÈÿ‚Ήt€ºéÙoè>¾Õ‚dœBF÷^Ú¿}\º,Ñ#jƒ ,MlûÑFuéG2¨?-eJHoî›D$ýíñF }ñëfšºrè{ŒG÷רՙ§®¾,/Í”p‹¿¼j“v.æJX#pPW¦=B½ Šaº“îaßà%µQíl×hž®Oa¼¹¥š’cTRQÄÒ'Nç΢ùÌÿpªl9Ü&9€kô}ô»6ì¼]pŽÑS®!¢Áû›´u Níž>t‡Ž³X’µ<$«‘%4jZ–ð%LIc|UpɱV–°/KK"s?2=h«kû¯€ Î¨7v5¤1%­½öõà8€­…ôø¹½¡èö‰$O• é ž òYF׋S^×FȈ"¾üb\ñBöµ’Û¡gÓÉgµQ:S´Ÿn,‡óGûo+)‘âH>O>±Ýsé¢ío¢/ÏÀ¥|ñŠÐu8¾áÓb@Oñ*nšÊuõáf÷p¡àƒ Uo¢JÃTLú¾ƒdèÉÒ¾Ê ëòœTCEË„T‹A*uò“8KW†4’’ò¢Ç¨+µ—C5Ú²~3'ù½qRvV/ MÙÐ8O<òr~š¯&²£ñ}lê!]téô<‹jõÈblð©ÄÆ.èé{|eöÖþ¨Ð¢%!>×袮ý†dœÕ˺ÊQxl_Åšªn{ÄŒæŠâg»»pFu›ec1öµ‹ˆ¦3ÓqøÌS†V:º´NuËL§«‚ÌVZ\òê™Ü½ïð¦ªâæDõzR-ÓHÞ¡~* ¹e}ñúˆiÍþŸs&±¯Ͷ¤|wØik칬c‹Ñ³íxªf…ï 2\2<>Ï­½«$¸¿°Í|%ס¡&¹“ƒ¶6q|÷†mœn@™8kmïáÕ%S=k¾³B^W²%sœ5 Hu¹ý…-¡kàÄé÷º,#KŒj ^Ñ_ª{*M•{~ξK˜Fÿ¼Uvˆ±EÒûÆØÙŠMLŠÓ‡zó9uF ›'Ö¢t0Ž”SœØçÑ}|Ò¯L!)©ïÚB5B#–xKÎINçÑFì]’LŠˆ^L10SiŠ«n}Ѩw‰!ö$iåZÑ*^«B ªe/'RÍpë‘Û\>¨riÛK2ï(J™»U«ðÜxÊ6@»$ ¿?Óñµ™ú[ãzYõQÜOK!½ÝãamžŸÊô¢ç’©áìm_¿õ^b…„´k™;K­ž¯¬ŒyðÐo‹:À®ØI$HßFQüìS°/Av)Ζåz¯"ž t)zø aZ¯=%¶Ö yÇ›fšúŒÓÿEž7‘QFi§_Þw÷©×µ6g£Ë}Ûý:Ë®zLo4kÞW <6蘜ٸ4gÀ}þEx4¿ag×È{µBgNK…hÇWš³s×Ç[×ëFÈÃÉ‚žÎ8¡X*÷*%ŒH½îA²n}F´ ÐëÑ?œ-#DÂxzJ‹YKPÃYKýýsÄþÄ0g‰l?­°‹©ã:ÔØä7¹—–N<:…§×° €CUu߇v„¨Ó°mS öô Ôå.‡r²$¹Ãjgº¥?ÜlC™iy‹Ú nÃÃbŸ™<ª2zÿýÓNž+rüLÕUá¢ï‚”%ðÀ—”$ØŠ'Η剈kӜœµKÞÊæ¿½dtý9R¨¶åæNð:KS+å^y€îf|BeºÁolb°ôð$&ÏÿУm‹ N9ìçX.Ÿ’ŽŸ ÛŒÒ*ß{·7õᩲt˜„ f‹nG%gÎGínÏ8a3é·dz;Öè ™w®È:GÉð¨ËwzE13ã#¥¦uV'ޤ3¬Júp´qÛ3–ŒÚÆ æk a+fUÔ2\+Ë› Kž^yÆÆu7av!h4âKâ†ä{y³9£È ßE2Ôõ…þ¼çõâªà]H¯ÇÙÐ72¼gð4øbhâÞåKm÷ÅæÒ]N®Ú—øñoNOØ–yAq’õƒ{\©bJa»†Q0åQX!ÊNÒëB…Q¾ÛkzJº×Ú)~ðFy8^Ô®ðÏ Õ®‡S ýXl{™½'O2Ê’ÃtaÛMƒŒ «i´ºìáª6›Œ}“ÊOZN½RèÆë‡ÑÌ]÷·‘pVNof&ƒ‚Úhß×vÞ4ŒS,< мzžlÒáÍ©Á£ú*óRöú…Øs\a6ž¶-™HÍŸ A‰Lä¡¥@ñgY)ŽŸ>)e”î<¥#U»­Ý;751ZZŒœFhׯ5í»ã,/êb[éèÄ9F$_tí)E?Óy«0K•ž-ؾ‹¿;¹älûì” M· Y±  ·‹žw6ÌÐ'âýìéÉLþ“ŽŸ¸ºæ„J´‚³Ø³œØœz¶wß6bq⢛8ãØ[fx\Ê^Æ‹Ìȵá}j Ü…âKoŠÉnõ`óV¸öC …šd;>f#lJf 5 ì{)>ëÊ—šÑͯ ©*švm›Ùðž„òú'°âðØ/;Hø²ì ô¦Y¢!Y°$É?áЧá¬O»^îCøµ˜†òH=ˆì¹{&=Š^zöP—…x]IB¡œØPéÍíM3EŸŸ¨ÑN¹ŸyLñätʧõ„aä¯Q Ñh«óñü´ úŒGǤMó‰ZÀÖnL[Gð×wÿŽÍ³d2{7·†*Žn®]MȬwý>ìˆNOÙ^µd=©D…‡_¡Ÿôž…ÒŸòX‘¨H¥"&Jiûmœ“ÉåE‰†®f‡ìÄbÿ!Æð8’þ]µÀžé‚׌£š{Ð5Ïü±ÿ .Ú0ÆWm·!ú±ðd*…Ôäöõ˜€rwõÉ/›]†ªôBJr rÏ+ǃÐn¯Ó^ŽV}T0ߣÈÚ0úù­ç~QÖmWìÇÈ·aî YÌÖ¬I£9ä×T=Z“Ù#x:„gSÖ•áJüEʬ”1^oý5¿ßK³ÓŒV5ªŸËɧöà ŒñdJkM“NUW窱Aôð)Õq7ïÿø1÷eœÇB<Á6Žw.®v2%SÒFâWÅÚ¨VÛ›*ðMû¬aZåÇ(îSs¶>ïäÊ„“¾çÓòÁ?-}¡õKÞŸ˜žÛjœ*…^ ‘Y’ˆÑø‡> endobj 419 0 obj << /Length1 1540 /Length2 6978 /Length3 0 /Length 8012 /Filter /FlateDecode >> stream xÚx4Ûmß¿¢VÍ*j‡ÚÔ,jï½÷ª„HØÔžµ÷Vj¢önÍÚ«”RjÕEQ5Þ´wïçyîçÿ?ç}OÎI~×ç;?ßq%'Ì ÚzelàÖ`E8 ù˜›W §¡gÂÇ àåàæååÇcfÖ‡ ¡à¿q!Q>aQ^^?/¯ÈߊpWQ€<ÐbÐà¨Âa`³ÜÙËbgDÅùûÀbð‰ˆsý6È8]!  DÚƒPA@(@‚€‘^ÿpÁ&nD:‹òðxxxpÜpW;Iv.€iÐ#À®î`À/ÊM ø5nÎpg€-ŠØb F}àù €î`ÒÕ ìç󟂞ðøø6` ¶ƒÀðþíƒmÿ:£úï ñ˜ñ¢ÆÀûëõ¯'sÔ„ÙÀaP¯«ÿn1‘†²†¦çÊÿÊÊÂ=>ùEE„x|||BaaA€ß?ýü«³ÿj!²û*0[8@ä/¨êýMÄýÏd°ýYvÀ?#hÂQó °ý{üŸñ ò‚Po|ÿç%ømòÿ›ý_^þ×ñÿïŒÝ Ðßr¶¿þ9Ð õú£šg7$j74ਠý·ªø¯…ÖÛ@Üœþ[ª‚¢vDf‡šóÇ|O¸yŸü…CŠO°6 ²ÿk–þn*kÃ_÷ÊŠ—÷¿d¨Õ9¢îªe¿E`Ôfý3® ·ùµ‚ü‚B «+Ð 5¨“ À‡µ«6`Ïß#àá†Á‘(Š£ÀîŠ÷«± Å‚pDõÁþ—ð7ÎÇËà±v‚ÀP°-ò?`?ð_íýG¥ÇƒÒüµ­ÿÂøQ•;ØÅ ÕÝ¿Qè¹!þíÀãŒò·A]0¨DPMý%ùI›«+Jø{QøûüûÒƒ=Á ¼ùY8H,ÄáMHûE µÇãQ¬å•ÎÈx“¾A$ËÇ—>öêØ™JS.²V6U‡Ó´çÊÂ&g}©9.Æ<Ÿ½Ë\JUÎC¢)ô­É=ÎüqòÎLg§²N‹\#9LС%²2Ã4cM2š½ îØ|ýµðº±i*² pŸ3¤R#cdr;wÑ_˜00­ ‡LžÇÞw5KwÓW1¿F‰=—m¦üáµf›1ôùóûìþ¾4㵞j¡ª0RÊÞª ¹Ã‰”d ÙªM4YÁ3¹²”xFÊ"§0–% +ᥟÓým n všr÷´ž4ºÕÁg%r»—Ži,׳ôðÉG}õM´tM\ÑP™€ibBRǃ2Úן*…F^J5K¤< à}¾0qtG^g/ޏvížN÷»ñÖ®G<ü8jy¦öV%š¬ªÈ'ñÆÝø«-Y“©À#áÙ¥<ÙKÒÒçÏòlc~Æ~ßë\¨ˆÀZ•F‹ˆ&~„¡¿<Á÷§÷ € Aü³0n4{ÛF¼u¨”Ú'ò‚]3¦ÍQ$u—JÎGg=4ŸI[kixT¼AçEAŠOºk ,~á1Özï%ïª=x¾»inäB-¤Ñ‚aòd¹ä$¬™¤À$nf¤ÀX[áHýšÍ’¿å^UK\9ÅÂsŠòÁàkW»¥oœàâìÒH“žV7S!ù¸x?£%nýô'KòZ:”^ñ–ü™¿: º®=ßk:Å\ëoÅUã~œáP¹ s@qÑB7N»í <˜Óvüa¶Æî>}ß9TŠıÁxPeá¯[ùÕ¼Ü)lø¤$D­\kp*–Aå^ô›é7?7~×%¹±DN‰et|Kp“f{TŽä)!¾gð2ÛÇwíûw? À†b)#¥óä©'f%5vá2QÙH¦´»jU¬Žá“áÒÄ \ëЃ`Cx]Ú‚{kî^¢Tw]2½Xrv­Äð¢$WHÿZIEç3ÆŠ)™“ºûwÝuåRæŠ0³uäíñ( §¥-¹rȇ³‰:ï“ÇXÛB7eT.´-ÐËë2<æ3I‹mT•½Ù@çÁž?ãé¢÷ô† ´Uêl}ÔÆÊFT¡ø£&Õíùû<{îïâÆÍò[~ÎÑ5«3kåKïf(‡%Ý_ÒfU}5¼àïž0ÃÕÏTÏhoP¢!uZ·+µ’äÌ1"ìNø‘BbA›á·¦D”$]¨™(hq$©¿Q÷Ô¶5 @å¥SÜ¢ÅROPÉ+<ýuŠ™07D ¿ð2Q×ûéɉí¶Oø„‰¼ýâ©øzOFƪlÊðάßåÛþù\¿-«Ü‰×ÒjåÀëé×Òæ º§Iµ0*aÖ`ʯwÔ"®ž8jIPìßTHÏK¡\Ÿµá /–(¾:¢Èà ÆqÁ0ûÄ€µw~Ù46·5ý Þdñ‘©‰%zãäØœä)4%n½ ÑÂòŽ'~uÕ‚=“A£7Hp‚¾Ry0?Q·Bءǘ/·•råf¦‰'#xœ!$+A²Pà[ÈÐ_éʈ«og Ê µ|\Ñ,$Zߨ4ü´>6Ü,Ë4?Ý’šáÂGß?¶FæC“Ò퉅nµ"Ü»-K°t·GêDâõÚû :Îç¸ïâ©Ï[\…ÎÛ߉Õ™¦nuõ¯»Ïщ8â{‘Ä’7('z9‹QÉ~\$9PîóeOˆ醘W~βöV’“bdò.ò`تMŠ.ÒÕÞbúÚÔ"zÛñ}°#VáÑÜV‘ keÏFõã–Fü÷üh<Ô}æo±~áó]ÔÑs‹øNáզWT½ê„OÇßžÎÇ€†OÆáæÑ+£²Ô•‹>´ª-žž4æ²§ÇvÉåü¸2ñJém+Ê˺ƒGj©1}mõXº›÷¾!Ö55ëiöxíÄYR¯t°ÈFês­1&)[°Iphï¹£¦QƒÉÛ}Å9ñ-Y¿ºÔmǺ…ìeÝ}¶O3ãüsÌļè2W×{N!mhÑcDÛP_§`øôû½²'”:­dU!ù^9¤¾IqŸÜéïr>/Ì£ëMVhÅ~x3‘¨Ñ¿û‘§êŒ–|9Šq¥ Î ›×–«ßv×<ØdTòÃ/Þ#8ÀÎË5oàË—¡ˆÌé»YöÞb8óm9J©´*¤fKmôÀ{É5Ïr_â§£kù“á0c @1[×Þ”Ú°CJožÅºÆyï)õÓß–Hù;týOýXáUØwnŒ¢2Õ»l>‘X ¯Ä‰¨{¿B9×,³žÜò® í¬S¾Î7CÓôDŒiІjGrÔ¿ƒËâŠm‹;Ñ<?…?¤»PæcÆ)ƒ0ÆLô1ñÒÎÝÖWôJAºîßô>Ù|ÚßçÛU$isëय़ØÓ`è4ð5m…Ò¥dÄNnˆ2á$ápîmkæï»múrKþ<½Èç­ }éawKà´ûi"Ñý®ã3*/òáÕûjg¤žù­Ü¸\X£œÖ|5³o¾á÷¨dAåÕuL1ϵÃà§íǬâ&ËXàÇ{|<„ÑyÂÑ ‚Òl¿ÂcS}ÌåÊ%™n0q½í&"8^Á[Ѧï:D}x¬ù3p´h´ ~ü4®OÍCÇîsŒs6Ÿ)a÷lTDÎX÷n-¾ºaäóÓ÷·WN À1sæ{ÜŒÅVñme–¯uš 4þTëÎoÏúb醰±‰è‚^ÜÆÁq4S£¯Ù¿}¥)ÐÏßG+>³áSË+p¬¨‰røì_Q€C ãõ¦(WzM»BïÙ· ,3ÒÙfö™~¨ú¦eθª [©âÅÛÛùŠsúQdŸYÒ£BÚ`ùG ‚«9*J¿×.¥»ºjMÛŒÁ„a÷ I¦0lE‚9ª©÷ŒE¿wnJ´gŠrŒ.©ÓÚ¢Æõˆ$²Ä8i}ÈÚxÃqÙ'>É$ÚõÔ¨qì«u£/6²zÏ›žŒÈÐ~bÇ…œß«›ÑoO&éɈ_P[&TÝ=<Þ¶‡”^›‰"Äs›ù»¾=X2¿ôÍBK}„õCÐ0d×vÒ jÇE;ÐïüjÊWâ6:õ{¦[PËW»k ‘)ò­„.Öo}#‰–ÓÎY&€«†ë„¯C¿ ‰Ü`pÖ÷üÄÃÔꆴ9bîmÅRjêÁ–aÞ‚T¤nöJk:7#ßžŠ²‹P;à%x}ÖÉùø@5^/]S»šxky´#3å/P²ªC¶Ý%KgxúœéHD¡ •<ÞAï…¹ b+ÇÇãnµ%‘ Ày‘âÝtWݓٌ­õ¬=™ÒŠû+.oƆ‰è—ß.M>iÀŽ¢ /ŒŸ8à{­mûðnå ׬^_žÐéZû]š—®…%f Ÿß¹[}Áoo¨ýCqÚåïy®Ät›GR´3Îí—ß2vo$¹©”bq¼Sq4#TS›™$ñ°ê-ÅzŽáŽrn,žM¬ÞHݧ­lÒóó/2½ @ÍÒ=š,*Ni¹Ÿ_I3¼wJ’ƒ’Ý2NÊ)o]ä<ýàH1“pWÜë"[Ó˜Œ½STÚÑÇ]܈ŽÔ¬/ê€ò¿!nv”Q1g§Ð¸ òoÔ+øzk’:k  ŠÁÂʈ›a)å°ˆ¥H`½I£­>¼biô_ë+L;亂¤Ú¯¹»3_Ι "¬ hÏîÅê´‡Ï0Øqf°ìD/Ñiÿô}µX3K©þpånº$!z_éè[óúû°cIÕ|o©yùý Í‹Ð;Ö0Ú k6IÆù§[/:GK½.à«Qh‹€€“Håµn‚8yÕ– óÂüêx²]›—> ‰dCE=/<ç)W2H¸™È W6í©ÙgÞŽLŽŽLæOv«É0@¶Íù—ÕÄmr˜F©ÒÇÃ'?rÎÒœé¡:Õ/“t¾fDbZ¯”’ñ8ŸÜi8yI£ŸäÒ©8ùÓòfF†$± ¶Kªóû¶ÀI-Ö‡Å[L|¦++ÐéxÍ "<2N^¿›ýê+ùµ‹q€þØ1Rœz&Úñ˜GªŒß‰’=wxÜö´¥z?eeµàÂëÛZµó'Ÿrjâ†vºl^IJgË©í¦lgåŒë‹C…åC3ää';-5šWL—Lo$P} ú˜-µc#-b'6(§J%Ü™¡™AcæÐðS¦é¡ÊØ.Ê“³yµ’~wÐÕ¹ƒ²†ïÃuž" qW(A‹LÙWb=_•{–ÚêÌŽYÅ~†u“mIŸIRÀ^;ÃÖr™UÔpOC£¯¡.„À¥ß¥±zè\nyC@­QÝQç¡¯íæ“@Žho¯¹ÐÎ}Áù8§ª,ßàEZ­âwƒ mÆ6µ±°0Ίö)“N°0©o[ÊĆš:S½^ÌÎ[äÝ}6•ÇñÑP«×ßĬfÈ6¿ÊLà(‹Ö¿~¹b¢LkÍ—Ô°Ú¦<àÓì< ka2™IIÈ…÷’I±ôCª²üü±!•”ó1¶×dZËí%fE‰¶ î~Ùp¬³ù³|%µ9mûºçšõf͘*C–;r8GúäÞKS¶¸›¸âÓ©ÉÑWw¬ž ¾•øfUYÛ¯W>3YùéâbaòV@²ªÉïh[<»© äøïÔ»¯ìtú«-ùdkL/ H}Œ‹)Ó86ÿ!jD)ö€Ä>>”8ý®ñªØÝYúDÜÈcÒ8ní1©<ýÂ÷½&ùÆ™ùúëàD‰I㨛{׉‚õo£\4’^ÕakÖrÏ-:}Ô2®µùPÖÆ‹¾â”«“;ÏNÏçòiÔÑwƒóµ“X„‘H"ô37%o15»'ŸN&cèÄšÜØ·ëÄ.õRR»Ý;†®¾Ë=¯“êR nãITd2à®á•ÜÄB?å\TÓ™á¥dš®˜”Ø ü†Ø^Úö„«š¯|,gñ¸ÒúÌí÷"7¹;ì/HrT`¸:\VÇYIRÔTYõöŠV8ªÎ”ùz¶¬ßksc¨7 [?/ZNðJÉÕnÕ«—Xp„).<-šÅ·&®¡+ çyÊg¥òõ¹§¹i;ùÕXîËlÈ’àµeÁ·ñØ·ý,ó1ó>ô£‡¡Zs TN„Üѯb«ŽpuÍ:)&Òášâ¾âܰmö¶óU‘ξó£': }¦áŸšeÇÕJ…†­‘šf<¡S‹° Ç,ëÛ*ì.Û$"•ŽÎÖ¯L̰Ï™ûÕ|­tÔü¾¼_;v“ËNŠ$ô;a ¸î}*Â}=[Ò¶iMå. âôWèâ”Â,Ž`Šœ·hKNÀìNqU7E¥º‘ÉsñXzZc ~B~9'³¢/ZÂ’ŽF—ŽEeèÃÆÕ¬Áoh‹É³‰ÈºÅ JÞ|Ô\xª·qX@|$ —ÄÏxDMõ-uÉjœbC&© \{¤¹Ž…“aýÔ§Ïü8Ú©%‡'œò^ÿ7âܶ±dE6Tî”/LÐðLRÏnè=àΤ§Û  ½Ú9ŠRð‡ã½ÚD"«ÇUŒYïì’d£r¢ÇúæµbOÅd-tâ´Ê’~tqÈÞ¨ vƒµa05-«ôîÜæYjao¬>àѧ3½]¶ ò{,B¦ÃÓ[´¡QÈ•š{70¸3UÓp‡ŽxÏ~Ã<ªØú¨ ÷z»m§Âr‡_|òb4µŸ“xIÓ]^c6ž]A©šS¦%]Ȭ‘ ´´M€,n˜sÇ ›yFÕÂc½6Ùs¬a¨H6Ä+x;Æé¨²Áo$"i›êWÖ ž¸èm<@†7Vܶæ;”‡÷ø2–Ô==ˆŸÅË4#›V²ÏC5¹OVÇ>v$[¾IzÄì­œø «ÒsÌ÷QðÜ/RÎWT#Y[Ÿ»;ºo_r¯ÅThâa(š×Ò¤½Þc#Óûq„cªY›j·$J×=47rê€ÐrÑH¦ -ÁeíõˉHÞ(µ%ȉaF‹Év.7"¼µ¶ ýlbÎŒ7C¶ ÜYŽJˆý¹áÝÀµ(\­ßv­îá”8'¦û4/—ªQÈ¥ª]ËaðxÔä8=À®XÒûÀôZç'ݤœúiÁIB3¹gºî—ÎbÚPÅæ¥¬»,ÏCÖ’$GÃ|Ŭ0‰úðÝ2_ЪÖ7ÛÍb™Ñ£•Ò ¨b–+°B¼¢Žîž3¢n6: än¦^–ÞèÛ0&•¿²æÜ|§f>­öüÂ*äq¼&düFޏK^N ›ò]¸m›´‡¹m±aÆp·ÙŽÿóÝh>ÅÛtD2«ZYîSÕ4üwÜññ¼/7ô›—.‡yç??°~t–uÇ,ËÛk©Gâ^²ÖÂePϸ֣»ÒeáSpÛäc.t¸­ï†¢§ý•ÅÌëä‡ì3}š´âZj´f/ù‰uK»ë‰<ßoíâÐGèôáœzÈÚM$¬¶_ë]·åf1~,‡fYy‹µÔ¦«xÍû³îÀÅÒüÛrƇü nxé àDÁ ÎÞùD‰é1+΃ږ’ïé_6­#tÞPÕèAïç9ôâ)©¼±Ý)ш—VŸ3s“ªy?Ó|²yµvN®°ƒÍµ6äŸ"‘Р€“²?x¨ 0üR(:Ee0Ï?Ù,9Èññ}#Q—ŽQëË`­ëï“ O8´¼¶rƒšO@É&,WË‹ssã¤q{;»Â÷“MfÔŸ]¼?Úá’„ ©,+F¥ðdK]De¬˜Üõš<7r3mè„HŠÅkåP%A^O?0­µNš%ËìJœí@Þ ×Î/ª%tÊ wOÑ5«žuIY> endobj 421 0 obj << /Length1 1411 /Length2 5990 /Length3 0 /Length 6951 /Filter /FlateDecode >> stream xÚtT”kÛ.Ý(¤ƒÂ0´HHw#]Ã0À30 Ý”„t‰”JH "ÝÝÒ)Ý!‚ ÿ¨{ûßß9k³f­wÞçºë¹îûº_6-]ik„TGñ€xùIJêºF">>^>>~"66=ÊúLĦEºÂp±ÿå ‹„‚QhLŒBû©#à7GH‰ˆññøùøýíˆ@ŠäÀî0k€:/@‡º±É"œ½0[;ºÌ߯'ôè‘ÈÃßái'(Ãê`”Ô ]vè" 0(Êë_)8ÄíP(g1 ÐÃÃìäÊ‹@ÚJr>xÀPv¨+éµü" Ð;Aÿ0ã%bèÙÁ\ÿດ  G wEG¸Á­¡Hº8@WY  é …ÿqVûãððWo ^ÐÒýý+ þ; œœÁp/Ü`s„4ÔxQž¨‡0Üú—#ØÑŽ»ƒaŽ`+´Ã ÒÚ0šà_ô\!H˜3Ê•×æø‹"ðWt—åáÖ²''(åJôë~r0$‚n»ðÏdà¸Ï_ÜÚæ k7gàS8ÌÅ ª,÷— "ú³…¢B|„…EPÔbü•^ÏËúÛú£øù8#œ6hP?˜ ýGäã v‡PH7¨ŸÏÿ6üûD¬aÀ j ƒý“ CmþœÑÃGÂ<&|hí|¿~ÿy3CËËwôúÇý÷|ÆÚjz2ÜÿÇ&#ƒðøð€„<„@?ú!"Êðûwšÿ4àoò¿Q-0ì¯Ëñý“Qnƒ<úÃݼ¿y¸ÿ% Ž¿V†ðï ´–¡Ž¤oÊ'ÄA?@ÿß ð;äÿ¦û_Yþ_Òÿï )¸9:þ6sü¶ÿf°ÌÑë/´”ÝPèµPG —þß®Ð?«¬µ†¹9ý·UF¯‡4Ü-q /Ÿàæªó„ZkÁP»?Bú{èŽ08T á ûõÅAGññý— ½uôWÅ=°ß&(z©þ]WAXÿÚ>~!a‰{ñ¡EÆ/$ð¡×Ôêù[ß /B‡Ðý6$ѯ±ò€N0¸›ë/ô7€Ð C÷ãò¯Z7$½‰¿%¾Èßçßk…zB!D3SÈãPûªÐÆoÒ <_†ð–VšŸÅuE ¡Ø§_úØ©ág(Ž»ÈXZ—ÝHÕúü&|lÊ—ëàÛ°§i[VÐbŠR. C¾kMæˆ'¯ïò´ÍÊl ·I}¶F~˜ ÍtÛÒÇäA’ÁÔ0‘vÍò‚ŸÍ®›ÆvN€¢¯d,) ¨Xéœæ]¬h#ÖT¿‘)YÒ$ÍMOùéÈO¬hXÜ…Lc ݥךI\zÿÂBoVwWªÀÉ+ÕŽwÂeá”tTÞ*,9‰=tÔ Y*u®ì2B_eß$Çߣ+t g_Ävªš12²ÆuÒñ9Ší¤a‘˜‰HÍÛ*#5 cƒüì½â,?¼½ð^²I ÝjDê%k‚±À½"°2ȶWqBóFóñ3Åš/KÓÉîû`#Öì(Ýž£;ûí²¹‹†Ñ.GJ·44¯¢–7ÛÒã$`ÃfwµË…äÆŒguçÔªH|µ… 1ŸìN7LeéžSPÜ‘½çxl¸1¡x¼»‰4%ã ϸk‰ûî†ü¦ÉŠºÅ•’úIä@‡ðnåŠÕ¬sÎ’±U­ü(yK@6îá€9b^p½f{¸ÿ%IŒb…î2ß¼éµ9pþtôDþ•Z–?ˆþ˜ŸòQ2R„wc_ƪY'«ÒgñËÛ@yÌ*b]ªNÞšG´8ý ÀX|' ‘Šcâô÷k·s€&邟Ší½›¼]–ǘÒ(ã%ÖÏæÓxï¼ó\¹&Ä´Jãù®¡ôœ‚6‰¦ÿ\,E.ËUM¶€ñcê5 «f*ùáõƒ ·´“Ì©bŽÝ|/ Ê„ÕK—@Vç½°l×®yäHä]]ÙKûê‰î¡ ãæî8¼¨e•Æ5ýÂóÛœJ}ÕßÎ]ÀÉ iR­Øí§ ïÆÅÙÀªzUÆ"ú,¼½î‡7R’åOñKFdügNMY£dE? ·ä¨|ÀÐ]bª!{Å•!¨ëd&?îY]Á«i¾~e÷p©,,}Ä+¡›í¶Õ«Ëz•o£V@þ"iÔ±Pþ—u§ûšb*öx ‰ÙsãÑá€ÚÙ3VA¥F-÷|ž#}º-°HÏ¢ 4Em2v®²ßÂÓvnþZí“ˆ d¯)”·ÔùÀé2îÎdp×'Âr&¢¼j ÐJU«åÍœM?³´æ|‚¥´'¿÷Ä€#IÛ¼ðËùPO?ùÊžœÝÙÁˆ»É¦yøqïÉ=¬ËkŽ;äëâýô›Ì©ÃÇ`rV«¦óbßX ÁTÏåó¥&’›Œ·DÅ¡äo8ŠbÓ^€Ÿ@öuçàÂÎvŸ3Œél¼½O¤¢Tûˆ©fè®X#.kUÀ(—“þA²–‡á81C'¼§ ›ã–‹¡¤Ù‰*T2ä?¼’úIæ'wLg í5–ÐOMI.Zz»&R' õñ5ù‚v\zW5Ç´W‹Þ›¾ ÇKÊO«VìœÜâ¦ÄúTLͤ:ÃÔ…þ¼LégyßK3tˆU!EGéš‚¹¤=ÛO?:áÆ×âº%Bࢠì|û˜ø'‡œ#‡*\T@ SX\Ú™Þnt7çòg“X-Nõ®ü\%v·?¼ëQ}6{k.½Ì˜XŸ ‘^~}”AÜ>}7î›K|y!µeûÕ «ñ—æ¾k0)›±m¶,e ‰õoKFŽä hî&ÐIM®Þªz/×è Çÿ~ãÊá( °ŽïYgh#Ÿ]V ¹;äL5„ æôɪDg¢œ²—ZyMüÄ/ÖD~’Î6ÄÊáq©-Šøë¸ææ6H*_VôÅÆ¼ó \ìÏ¢ýúYîö³¾ýܯ›¸¨ †›õ ž·»saÛ-ƒ{,S†„åˆo3'ï´;°sÄ©4“ ézв ×ìí—® }d,YΩÆ© OÕ¯ßQIùâò0$îi™qGè‚I¦Ê§&mU:˜.µTÑw«aÕùtOøb+Rz©¿_ÏÎÙâûöV(TZê­|q8L¦|žÂŸ–=žÙ0ÛqTv?êî svß¶§U—eˆQÐÂ’¾8Â'gr‚¦{|áþÝ_æÀšÝKQÃÇ•À ûbå;Ž–ü¾ëílvÉûꃆÂeòƒ,ä JgBÛì2îo¼Œ® Cމô•‘:H´Œ_ë.)ÇŒIGã4(QrFøx=[¯Ê¸3k»öQZyC"cæÄë7ã[/ƒÓ¶Ž0&âõh(Ë\sqÙ!\³“ôÁ÷W¿ƒ©`dÓ=¬ñ×É´ØlDP—Öû\LS,ü× ‚%ºé_î•Rzꪟ)X3䟷qGN7ÞzñÁšž7–™©®GfÖNÛ{´ë±ÈùÆ>†á0Ýö{+Åg=PAÄ•çù‘«Ù"Ñ2èÔÓP!÷’\ÉSxF¤iuE‹„ð‘aÈ íJ¼Â>[À¬õÝ­ÌêR–‘'K‡ôø~~¯£\äin1$—zY„ƒ –Y`Wޮͪ_»e€ï8µh¯{i²8 =ª¯FÞ þLbJ1Dñøé³n Ô©yÌÚ}š0Ì¿Änš \˜A*n˜DÏ®ú÷O’Ðc X‹w•GÈåÃhQ¦á…7þ!-À7¹Q ƒEq·r‹2øÁ¹ø‡úü³B’rgj߬iÜ24DÂpÄüÙzžû ^Kè?-.r²bn)J]å!FÐ':øg³É“&ˆ}’&£x‚U´>ÂÆÂ¾—;ö.%,YÀF4wÊñjÛ:䇺N&ÏöC¾7 —p,&ê,ŒF_=ÆvÝ:ð,¸bo¬Ö™« qË=Ê$¤\$š>–ÉŸé$«‰'åÑrÝ»Ø!lK©k.ñrˆß|ihYŒÓeÈÔXUÀé“êbåf}‰È¼Á·¦§Yé ã4–eÙ5$]7óÕïwúŠkUê2å—¸¿UZÒî’0J_òälêΆ "\B¾ñ®³þ]¡y6ÙJƒŒ–ŽÑ[Çdzoà‘5§\.$ü‚ jì‰~éBúƒ€Ÿ¬X n¾Ì/Џ˜ÌÔgæ»Æ“)×kнâÝ.wž~-œ”U+üq«âˆé©áM˜£6µÇmÏÌSÝ1åÑ"¹©iyïAWä=çK‰\âXʵõz/o–—y˜$’Œ[‡¯zPé!SžƒÃ§q´x}ÔwÜÈe…Ó¬’«êWî:¶Þ_`âF8¤{GÚ²œJÌÄReužV ü«wØqišzÿ^8’·ÿ¡¥ÓåC/Eä»hÅ×ÁéŠÍBd¸âÒõç»ÓÊ%N‹þUkÁ¯LCî uî1Iç•_o˜‘Ò”šþ€/4ðCÉYØOz·("wkŸ±šÂä~žF|Íô™@²nÄžÜ.›‹Î Š”˜Ú¢W1J…K`K<çòbǯ‰YÁQ}dÅcô~}ôs¨çùz§’”FXÒÆ ¼Î¯+”&ÜÄx“CêИ°.w÷Døó« ¤³ÌÂFÄÞŠ4¬ÍþÛ¶¨I×UÔMíIm”í®žÏ¸PŒ³ÿs”"ÕœÇd$å ¿f‰á ]á–ÍDCº÷ïÕÏ—–¾ã%Èk`–’ǽ®&ŽXŒÑšÃM* ŽV´zü@ˆéÓÑù»”û“$BíÒê×÷;–F±ÞêbêÚµ¯¤åW%–Ü£\xäà#ŒÆù¿TÏÖ®}y«þ ‡9°ñ¥¡ÅO²*屪BMçŒB¡Ö<ðkÒp™]¶îÏ^Ï7Û1fY¤þ<ûàþ3àe9NEj´ –¾Õ8Ö( Û\Q—'¡kMêªK½Ò‹²sìè¼Ç!ö/ÜÇîôù\ì-ùÌmñD8p+i’âV,ý4*º‰:ÑSä§9ôŠ‘,w)åÀ]Xgÿ\Ç”;Ž4)ÿýÏŸ¬Þß-ÂÒZâËü(D–f]GT‹£'!ìS“p£9#ÜP^:çkN® ú±-{·;kÝ{¶§e«dJdä$ f¶ƒÏ}M‡ÞIJ¾†9æÇÅlg,wƒ˜ïÕó7pÆ Aƒkœ×6¨ØßÈW7'ï™Q/Ìr{Æ©Ðác¯(on ýV$ˆ£ÀÖ/^}|f’FŸ§ê×·KkªáJ“¨óÒÈéH²õF àŒ-mgéܽÄJX…¸Ñk8Ð|–Ár¨–Q.ôÍ.woû¡²gÄÕ絤ÄgÍ1š‡K¬ØqÒá†*‚z›F™oï±ó2†0ù|uA†Û7½“½do¡_½UöQ ±«\ÊÐ(§žu¤S÷0åù@„¹xSðŽWm[6ƒ!gßÀ&f.(5͘ØÇT F‚ôr 1^2¦ võC8j²%ôÙ4<äµHTlsôÞ‹ÛEÌœ4Þ™aw¾·I¾nªûᕨFÛ*¿§_P¸ñtÖ>O~X S×x}¼y y™Au2À`kP½F©š(Î|MvÜôêfçig™&’ië OÏ·ÃW(¢H7Ûó l)-mŠÆ/‚?ÓßëàFª_ 4Í0Ozc„Ý ©ž4Çáj[}¯A§£ô?üñ.nø^wã|iÝ7›àdšìu9ѹÿFÂùƒ\*ßåºd ¡{”‡þ$½~:êÄ÷'JAáÔ\3—ykq_€$þÀ«n‰v`½=HÒŸ OÎvŒcàÙAóBKè‘»+ 3 +êXB~<ûÕùÂÅchèÜ$o·éž~ŒJÅ¡c‡V.l!w²­Óª3-”Z]ÆUª?Ì=°¿Bp +2u,W—3Ô‹,DÑt†ƒì#aõö²Ñš°¶#P`¹7o{ûU´å¹ìUîu»ºƒö#:²z+?5vÉ‚`\¿˜Ã ÏsÌÆê « p\ßgì±t¾=}M%±è:ó{•¼¶(’‡1„”pýà]*9‰©Ë⻤˜íÊo}»†C;Éêú¦Ce:}/#>~ïÂ,|A–DÚqVô.º£2¿YÏM›½K'ìoœ§>~Z8[-"-ئ—¤•å\‘•£>üæ©NkEJ'~ Í^$þwCrBs èKrKWƒÇpIð€×­!i›û8ÅUÃáœ+$~zð´òV5õ­Ìf£$ìÑ»!|Nf£{Óæyñ²ÄïÙ‘â&U¸é{OH=N8;E;‚ŽY-ó䄳-œûJœ¶[m>K߯ÞçÖ›IÉûëÔ–rœ_ÏFR<¨‰²Ô»jY]éO}¯ƒ°Wú X4P—Uws…gíiAcÑî3ËzëU¾Vˆ¾Wª1ù6®ëe¢¹ÎJk”ßÏÃËJ&TüGº"©”H˜ÅÖ<˜®úoThñ'»ZÚ°9ŸÙúòs•[§U<Ÿ«÷,“<+õå~”²c¥[:3rŸNouV®ÒÛkòh•^âbêW*(6¯e7%·ì]'Gq¨Î}ïÌ0íqXç­Ø?']ar,0¬Ö…¬ù"¯Ÿ›˜‘ ¥|×f(f™¿ê5,G•e7› 3Tu‚ê-kgºtƉ}ò“X P,ÐðÒ†ø-MóÈôs‡v,¦ß¬½øÞ ›ýÄÐáÿ)¤^\]ä}àLx¯ã‹öýÉY×u W±A¿¿¦NAN/8Þs½·¢‚ ”Ø¥ëþ]zÂd¯‹‹o;~Íš¸Å¨­gÉå~GÔmáÃNÞQ§If›9ÔÕ6¶­QCxÍÈ@@’Ë,£_šÕöhÙ>‘æÖUR L„þ;³h U&Rf½3ÙxNÜ«¦¦a;"™B2ùÚnp z²Éõð+ЮºZË~£ÙgÝ’>„¸ENöÌÂҎöì°ÂYªTÎ’~ÛÇ ;jw¸ÿýÃSb3lË2vÄ#ŽA&I<ð¤cc nóÞ·1‰gÁª8MDKÀ'µÒ£¾ÕXŠÜ‹z2ÑÛÙ:GÓ!¤šSÇÒk2ÛÇ|6\ïQƒ.DkÃýãô Ðõ1Š›xípRíÌÀOt˜™D/RŽb¹`ÍÛuX!ó ¢{\UyTËlêe NXá­&ÅCyfX"uJÁ!Àí‰^¼Fè‹2`r$!I~ ‰e*ˆ’—œ¦Væo]¨Ö#µù0P\;7„ž¥ŒãÄøpì»=©Ç½^»·¦ÐVo¼ìõš+Ai—On<-ZŸobÍäô¹»¨Z¬f·^Šó,—Í9|ð ÞÌȳۉ]ôÆf6>Ü¢4˜Â91CÚ®Ã5^>—ZSbvwŒ0‚Û¦ˆ—»Ý£Xt`;§?¡—S¾`µ=÷íôB1»FÈ;(gªÐ*f ({G× ­¥yßH×È€hgJúì+æO±,}õÚÛd¾.“ðÏníðÚ> endobj 423 0 obj << /Length1 2110 /Length2 17608 /Length3 0 /Length 18867 /Filter /FlateDecode >> stream xÚŒ÷PœÛÒ€ £ÁÝ%apwwwwwÜÝ!¸kàîîÜ%¸{Ðà®—½dŸïÿ«î­©šyŸî^-ku¯·†œXI•^ØÌÞ(aoçBÏÌÀÄ•W“ff01±201±À““«\l€ÿ‘ÓkœAöv<ÿ°u»¼ËÄŒ]Þ åíí2®6fV33'€…‰‰û?†öN<1c7@ž cot†'µwðtYXº¼ÇùÏ#€Ê”ÀÌÍÍI÷÷r€°-Ð djl7v±Ú¾G45¶¨Ú›‚€.žÿりÏÒÅŇ‘ÑÝÝÁØÖ™ÁÞÉB€šàr±¨Nn@3À_%Œmÿ.ž f rþ—BÕÞÜÅÝØ xØ€LvÎïK\íÌ€N€÷èUi9€¢Ðî_Ærÿ2 ü{sÌ Ìÿu÷ïÕ9Ùý½ØØÔÔÞÖÁØÎdg0ÙŠr ..tc;³¿ mœíß×»ƒlŒMÞ þNÝ !¬ 0~¯ðßõ9›:\œœA6ÕÈø—›÷m·3µ·µÚ¹8Ãÿ•ŸÈ hú¾ïžŒÿ>\k;{w;ïÿ9ÈÎÌü¯2Ì\Õí@Ž®@i±Û¼‹àÿÈ,€.v&&&..Ðô0µdü+€š§ðo%ó_â÷|½ìæïe}AæÀ÷xogc7 ÀÅÉèëýOÅÿ<33À dê0Z€ìàÿxÍÿÅïçïòè2½·3€é¯ÏŸôß;ÌÌÞÎÆóùßGÌ(¦¥ -£Bûï’ÿ«±÷xÓ³²èYØ™ÌÌ,lÎ÷ßÿõóßøOõK•ŒAÿÎî¥íÌíÜÿ*â}÷þSˆÛ¿;ƒêßcC øß öïý Pýi=&v&Ó÷/æÿÏCð÷’ÿ½ÿ——ÿ×öÿ¿I¸ÚØü­§ú—ÁÿÞØdãùo‹÷~vuyŸ yû÷ ±û¿¦šÀ ´<Ð äjûµÒ.Æï3"lgñÞçôÌl Llÿ’ƒœ%@@3%‹©å¿zé?‡ñÃdT²wýuObbú?º÷Ñ3µ~¿[œßìoð}²þ7®¸©½Ù_#ÈÂÎ0vr2ö„ï€wbx3¿ÏªÐãï02ØÙ»¼/¼×è 0·w‚ÿë`9،‰þEF‘?Ä `ýCÜFñÿ'+€Qú±eþл¹?ôîEþqþлOÅÿ€Qé1•ÿ €Qå½GWýCïÑÕþÐ{t?ôOë½ÇÓþ/q¿gfü‡Þ-Mþл¥é‰í=ÂûmgûÇú¯³b4û¾g ü¾§kþß•æÿ@¶¿ô‡ÿ2þ2½Wgñ|7·ü“ÊûYz:X¾ßÚ,Þeÿ\ÿ¾VÿÀ÷Âlþï•Ùþ#µ÷:þáê¯Tíÿï©9ü‰ýîØá}tíÿQøû ’Ññøž¬Ó?ð=3çà»—àû¸þßuû¾'êþMzOÔãøž¨ç?ð=Q¯¿ñÆÃÔÕÉéý ò÷=ö>;ÿá¿_W@ Ð~iÞÞ”7Ī6¤ý¾Z˜À~o‚… ià2òVsWÏm_9H”ïáŠ5/jQ¸{öWÔÃ&ú1Kñ[“µ6“µÁ†OzöR};´¹ÉÏ:ÿã±³œ+Ë/Ù®.#V;3 ì³f•!÷k¡j:Ç‹½¹ÌCI>ŠæÊ» Ë3ÊÆDˆ‰˜(\..VDˆáÌŽJ‘á™ÙNi2çK¡‰ßI%ÒûGYØ·–KéÀA[éGGH²×™G_z8ðe¦3ä»=â¸OñTA×í!T&Îcª‚¤¼YÒ»S—R—»1Ò*ÍRƒ›ýi¢›ñ$ç›pÂß=L(· xiºÄŠ[#—RÔ ¼XÙ)K{ÊÊ$1ø%àúá$¦OBj¾£ÉúÈÕ O'¨9§dͤÐf`4*©^y/0O›ÂF;Å‚èD:>îø«ƒ}‹±Z°1\ št©QÏoïE‘B 'F‰¼xútL¤‘OèÃ1y:&É ÊÁJ{bl§dlBOd<«9Åì5{̶Ÿg¾èÓ2” ï›‡ï‰øVcŒè&Gâ` ©ú˜J_\„›k±ßæërÙ¶%äG‘R2¥=s“e! ì³’ëŒ6 2ŸyiÙ! Ó ©ãƒÇõz®9½e¤Údk¦½}þ¨^3fž‰Pæ;™ãc`J÷Y¨<Å;¼n”£ÇïlC0RFµ«¶´¯Îí†,¹îTGBvQ« Ÿû•è»Æ’r‚à1ØÚ, ØeY9+G©k>xñè„‘/z­«_^m;Øö§Š¼Tî›®½ÞÒqyþbsôË™¡²|ÿ6$ÉO3ˆMÇ%'»9³$²DyèËßKÓÆÒéz u4çÊÙ+¿i 1yû$Ùð? b¢ã1éP‘MÎi¹áÓhF;Ç+A½.ÙUÂYj½ªóâ0ôqj þd‡ðöƒ‘O÷Ú—@èRÛBI¹±*L Àé{ú¸õõƒüœœeEeá“´ ¶/êGà4Ì&Eç>°Rã=ŠÊÍù‰‚' €[~kgjÿ@Ô5RكĔ/:iyÃOÁ²"’œéÌh9L¬bo“6,ÖñôbÙ‘7ñâV«!»8S¬ Ñ]ǬÄzÖ£•þ‹„–ŒŠ}Ù‡!Yåî4ÖhQR· Ëcr‘PžÛ™¢qב–†¡ñš<éå; ¬Wbž «„0ù±P¼uvìO¢Í«ŸfŒeúß,®úƒXFo ùôž"È7’ì&5©‚1Ù]¥±7(~®›åIÃå›kV·»”é§=èCw±²Ý@˜\–|ƒÖ@†h˜Võ P¼)©l@: H6z9´ÜÔr–&©Û!ßGIO#™¶ïÇ+ì®^«Å™àWÚûÅû,â¨ýÒ"jÏD> Øé£ïo³ 6<G!R«Tù˜DÓVd ñ ¢+8Ã?ïÍœvѺµs¼zX“ÇÅð Hˆ¨žÖJ=KK«VËÀBÅBp]*Ù>±ÂÈÞßÏ>;šäi|i:ö]ìSZ•¦|U·\m„|úDØnGìpšç j늶q”¢ÌOˆ„`y¼ANí‚­]Vœ´I a)Tå“&=~@Ôm#ýêÜMdŸ‹Öú$ærùth¼+û1`Â?Çw µƒ›Q~IßüwÛ­%óË<úG‰ ŸE@¯6A˜ù7Ty ¥š‘å•  Šuøu¯­äˆÑ mÆLCV×x-_Æ«®Y*™)Î5k+ fJµiÅ>šQÛ†Ò‚šs¤ôG¯:Èå»v²“dqJ‹'€»fΩ×Ü4ë Þ¸Á«´rÃoò ™P¸>Bnùw•ýFñk¥ëú MËú>°Åñ/} T,éÅœ.¯•ºƒ_r>$¢âÕî¾"¿2û; +™*Y)®Ü>³)ó¸Ê~q︦µõsëºw±ûVÄ“f\G‡äD¤ƒ§ËuÚ!pÞ«ýq>9Y…í‡c6ÚÜžÐãPÈo7"øAŒê1a—_ ÛÿpÚ6"|É+Gý9?ùçÝ( #Éo0Ì+sÿ¢ï9DäÔ*ä#&k\KV%ÙÁ0‰D¶gX ް£âÊô¢DHãΩ²M³ob— zåAü*¬8ÃXfÄÚ+±ÇÜmòáʵ&R5æÌê¶*Áa×zh_EöW!°ª4ñ(‚¥/΂V ¥o²„oŠ0,iZJ½tšÐÕ½h—·†(ùÕhêÖÅš,ó’{1.Ö…´–|d%†jErÇ‹®/Pצ^Ü‚gõ3žÏ5T¼å9,5«¿®Çèïý8+púõQoÇœ*Š(”S˜t;3¦…åõ¿™ÏiýlôÐÿj¹Oÿun§.ðx˜»J>ÒüB5Ý­&˜€œ>΀‰dÌ,ÅPïÞ82ý¼.UQözxG*CodÁSi¾F ¯–T+.êÿ†ÌvÇ ¶” °@˜aOÿáÌ]šWLp=%©íÔD6Ÿó pöýJn·»ÿ³ƒ+É’çØê#.SlÏ”0ŒËšáþÔæwUŠZbIcÙýêW^Êt*%}>¸-»»™šÙ{x½>ÑçÅ€Mž¼”­èLJúç ÏÏXóìàÀQ±¢d" Ú“xÄäx-ërrAa.aÊ}S.{ŠQkI€[…@ ±éø³C#- Ä˜ßæÙd—Ó05¯ oË×éðM–†£Ÿžú ̰;`”ÀÜhJ¦ý}0½â#tù¸@‹î ZÛ #§dÖyìÚL-YWH9¢lèyÔã Ñâ‚~‘Y6ð=¨Ø1%[Ô¬>Ë Íîk—n… ÷Hóúƒ‚J‰SH,9“,þæÙ ÃN{ì‰ WŸZnº¨w$–ëon(røÎ fôñ¾ÅV´kƒ Yu4鯖âïK»æ[µÎûØ`]”%é wI –“<1>­8”›)©‰».H·Ù™ K­4¶ÐK\‚þYŠ-}·NuÖËaÇœ–žx õ¦N¢É'–ÿó[)«f_Ç—¶2C%lŸ5c®“‚a¿ðÑ1ëZ¥­[6û‡BÃãý0ÔÂm~þ=4¬¸«ô·ŒÙ„°«Ô«²á•q®{uvÝÃä#„ÓÔ‡×Àü¶#[#AÖ­wÚ=á^xÛÆxå&dÕÌ?ñ¶i(—"ZpWêÞ«ð³ùCˆ¯Äª™/lKÂHä©{Ô௳ òVcùbÓÞlÿcÆÜS “Oþ²´X,ŽëeææhÊA±!¨?Œ ¡Hàí0åPì#C)Ýcö`Ë h41r“k‹ 2Ã#ì/ž"·>"§$£Øœ²àQ×S1±‚ië?ßuZ¼æe„#¼¼…u×ZÔ#Pš÷ :Ö¹·E¸,dÊæêÌ=¹ÜÝP@OCdÓñ‘‚½Pok¡óúòÐï5Õ ó«°Šœ™8%l0»±º.T“ÄÁuòl{m¬âÄ\¼±ãôü\!$F…`Õ„äÒ¸õ¦bÀT5.ë‚~æ=×…b!R÷D2·Qtw&f~O¼¹Áï•X¢¼¹Ãó|‘DÕ§ÙëW,‰ãìöÉÊ?}$ɺL Á‚p‡ñ·ŽÿÃ<ÊÕm¼¡¾:اìÆ)^GDIˆjgtd%ÓÜhVã§+: ×qo¨ßü1Ø·;7šŠ\BæF•Ç*/¥ÿ”´6¸Ý:õÎÏ‚ó)Ri}€x‘GE8ÀÐÇt¶< @¡bÏñäà:æâ²?Ba½ÏG®.ŠˆÈQQBvŒJKÎÞh›ƒØiIаvæ·q3YŸÌ‡àö©êÕë0$÷>ÿY\'@AáE( ƒ•yS¬ù¨Ñ¡úRŽ9ÓÈ£]›I$óMDl¿‘¼y>Èò›Ëù  hSoÚ£FeˆÝ6•6®J»%¢ïœrž˜£É¶×Ñ:·åˆye³8_ôC¿6±Ñþ8ôïìŒØã¶ówxTcœ_j¦Ðz‹.XËYQ‹¥R þÌë^†ðzW2‹÷ý´ºÔk¨}¦h{òÈ 8w ¹fhÊï5x~c¼û e4gD†“zËÖ‡öˆ?µ‰.µ$iÉHé«ù¦ù2=ò¼?áJÈNcÒ ƒËý¬°= SO1[å»ÜDšE» ?ÏùÊ¿ÆèóØ Z Å’0;ª‰ÝMì.œvB`=4L©&Ï'¤:SÙa­ÄeŽWÖ" XvpUñy °§Æ ËØ°µß%Û¥‡$°ñ1†,mvi8rañwœª{ÿ:uÄ1é8ÐgxqÂÃÆBºº¸S5>/Ò9Ãú1jëwÆ ¶‘Ú–C1îé$Öí®<õÍ¥ _ x=¥Ô¡×HI¨?ͽ¹48c( (é&žÌ¹Gx|KÆûèí„è)z½†(jâ5Õ‰[€ÚÔ–Î[³“‰aý#)97ëMöX•ù²ãË®Œ1wƒ×šf·sÞhò¤™X54¬–Ô#z¦žÙJV¢U§?5«Ç*¹Ý ¥ ¬Ë_V±è±ÊVSoMšÝ„¥èÇ.0e!¤½Â¾›B‹?ÝÃý²Ý¼Ð”Ä4\_eÍ%„üQ5Œøù¶šÙ1Ux¸'iBì8¢åMA¤Ôö²{ÇÓeÊKß¡¼e¨(™¤ 6•A°g,qºj–qÕfU×f"s=BÅ/NÓ]„8ï:ñîÉN€‹VšÝ][_Ê cµ¶ƒWdð Ñuðf´îUhô–s¶ËŒÐÉ5šµ}7üÞ:Y'êqö´räãkü/Õ÷€omunÃÁh®¾eŽÎÕAÝÅtÊÛÕU‚*’¶Æ™Ð]÷« Mü½o‚žˆžÏÇ&ÁSæê8rñqšhÊwùB(¡ê«ô•À•Ã¥–VZi캗sbMs<÷Ó&[a…±ö¹­ëÈ9íi¹Å‹Âü;O™rå$jÂn%pH02>­ÁvKJQ8ÅOÕPSxÈ™§DouØÂvº¦Cyºâ8gùÖ)v¿ì?§A‡—Á[ŠpœÕXµ.zDϘÕJ—'*~f³G\¿ÞV”)>¿Ë¿­{ÝqJ›ƒŒà äúdÝòÊ"†«–uJ÷¨\¨½'ÝòtR'"~-ÓIáÔ®c‡=R­¨:À;ëç(Ám:Dz_Xfjš†×:ŸÞi&7˜oÂ4:Ú…õuݲ_gá¼V%S¦h @3+YŠ ·„·ãÍ+J ´‘6Õ² Ñe.†qäΧSlçŠÛ¦]ÙáAÅ0¨Hî¼ ‡kKCÀûóYÒ5?úÀËò¦ÕÀ”L*‘ =â럈°rc‘äÇ…oÒgy«î#}‘MÞvX‘:sYVâ©© 0ŠW¡nA·%©ëQ™ÌX*ý‹7ªIÜþÔÊA¸„æ" 6¢éZ6ÆýZ*´S>Òæ&!Þ9–ˆâ9áAúìÁºvt>\úŸªD³épÚEæÀ5†Ih‚ tf›‡Ó,’«ÖiŒêŸWâa² ”B#EDCÚ¾]^QË͉‹-£ö¬þ<ÃWU³ÇwQ4‰€+Õû £ÆÏ¸ôtýà<4ÝÓßMuÛèR&(ZX§d.Stûun•Áøw*•(ñ⸘ÉX±Œâ%øKVä¿›§µ÷÷œÉj¾$2_fĬ§îç0j[»uf3pû³_>¸óõ*ÀèMU!ý}^Óƒ|YÁª\Õ ãÆL‹ûz+ðHÉ©a¤~\ñ–ó‰ÚJ¥ã56°Šµ•çôØ&½!OR=AÏŠy÷-×àâLƒí~óG@–š9’è4í[VÃ=_Ÿ‡:'MŸï„4¦àÖ†CLVé s s$'ËêÈ[¤ÚŠßI:h}›Í¾ÝÉ6ämÃßuýˆÃèbHÑ…Ð^[©·”–%ùÖ‰›‘ôj^êN`¢/àcôöLøulXÂy_ò®Qly6Ë{×k*»Ï!nŽ€çÜŸgÚÞÔß!ºƒh5êv»ËJñÆÈdÛáãÔ€Udð«æ¯n¨'ëWñld“ÏæÈÃzÔÞFm jæXàýkþ·T6Pß`>›Œp Á:¬;éúÉ—SólÝöøOŠ)Ÿ^ôi…Ï èœ>±íÂͫߜ"ͬ?m8ä·…’‡GQ_9.¨7O¶—Ã3Ø\î6¼£A°qŸÀÁµœ~”¦w•’óÁ"¨jOŸø"o²Ò“õTŒÌ•š}Öp(xœ¨ÿÊœùí¨ÛA³-æ™⬭ÜÞ+ÒvF}‚ôÎûi1Ôé7þNIîù_?yÓéý]Å<Ç9Òð¨Ý°…¿þΧ>$„¬ÿª¾‰6'vÛAüär™¿öuAè`B•šª#¯+RYÕï‘>áÊE’VÏ»ÜÉô­(D¦`²|ïÛròL9QÕ‰°ó3_N¡Zm{ÂjI~‰Zé¸|nrÓŒ3Y(ü' ìz÷±WE™Ç‘›P´Ÿ/ؤÔÎRÌtË?l²Íˤóï´O¼ð¯?ßtJ®k¿ì±výÔ­KbPLÄÊu¯ó'Ù´rÃ7¾ ƒøö`5žuók~½ KÎ>ª%ËÔþÁŒï¡ôª½0joX‰’¾©×ô’ôÊU\ŒJ9½ØÜÕ{ÐĜ֣Àç9ÆõÎY¥ÍÆÈ]#V/7ekqJéʇËÂüv(Ø>@Is#ÝŽ±U0[ÇbÉÒ€ ÞÇ›@φ—•DkºTr?D„¯0ù1œpÁÿñÒu²©Ü*B¿ ñh )y «_ÀqpwС¿µ -4û*ÎŒÄ8„ í‰5b-YæÓÆÙɆ5!•þçÀIÅ&ÒmÒÈ]-¥Yµñ!T;ÉrÒÀ];óK>XKD#qzNi>R{9£ò÷¢ Õ[~ÙÀ(F³R~Þð ¸}þŒOIÙÞ±3"°`ÃËb(qòWÂoßnÃe¼5PÊüc5V§ ¾xmmW‡‡ºÚ-|õn´~Ó¹ ‹¿ÒºèÖ÷Ägó¢ä#éO"Œq ”ÝÝe°ýÔd&‡ZD’ÉI”GŸs¼mʾŒDVzy'a°Ú4ËÖŽ‹š#!ÜèPEe/JÂÛ l'ž£îÿb?«Ó¨K|Ƀf¤èÁÃG•­ÚÈ#8; ººšé…P:pþ¹*cê$4ÜÎ}q)J<#`™$ t5X=ÞÅRåEÉèôZÔø}BXe©šÈgbþùŒ'©L•#e"ï/7‚â2ŒÑo¶õ\«Š]ƒà_MM°³ó”%Ò´[èºBµ—»Ÿê«O´-i'“CÖ7A‡ƒ”s¢Kâ?ÛTŸ?¹±õ'‡£í#j˜£KoÇ€v?X/œÉÿn+âˆsJ̓ÍÒ˜‹Å6²_…ðUï+ c]TæP\µ~ØGÑì4zï„~öÚUØdüsÏŒ2¦ÓàÔ¨ñˆ½o|3޲%º©×¨.p†å“Ô¬¨¹utm¿Ê1†Ð’ÐìyZ±øoÃf‘43)– mì¢ðÛªÑò*_g§ûvÍG ¸m>ÈÝ0Øh‘ÚE^èš|ô‘†2Þ nö¡¶“L‹ÅÒJ ×îJ_»-MÚÁù‘]yÝUBV~ïÞ¡|bµçc“ã°aÕ:M÷ÂöBŠî߬€nq-•ôŸuSJ:pÓŠÓs5¬ð jå=èCÛ/§&ºµº»¥ÎíK‡¥·üuª7oãï¼jªF uuê©:êiŽ¡°©›Âž¦oA榽A¶9É–÷ûÉ'ŠÎOYíŸ&’£Mr¶g€) =)‘ž^àVaÔ¶q|ö„EKÒZˆXÌiGÚ¨Nôˆ«»×ý †«×*ù}«¤a™IìñØÙt÷yÚµ•ix:wôç’ËüodcF~?×!Òä R¯ƒ9‰¶Û ¯¿õÜI“êfâÇØôÍä}Éã‘m«©:žíIòÂRœÂÅà ²q’ÕM7vŨá ût‹[dèŒP½¹Á“W{髲©%¬éÁ*·‰Šo aÔÔ°õÝ:æj8§Bž/ój«‡èŠ9÷·âœ¨Òˆ ú bZ1\œžÊ×{Ëè65žô¤àvª“>|+xƒˆŸ¹I 2Œ¹¯Î M:%*{òa÷ºpFæËL*¼ä¡ÐÎÚŸ¾± OÌŒ}XÙ­Æ’¿€r`¸CNÖ¸ss,`sjEÚ%\=… °±á|4á ¹E"ºs_H}–•£iÔÝ÷J"#×óKÐÛÚÄî¨*é5(fidãæ*#"þ,ë¼òe³O`Tõ%°>±•Ž“ÆxµšÊü¿÷g|;ʹÑg1úZÌÒ7pùÞ‰}M¡ãê„‚òÌ:Ư CÓŠÛýÒ¥¨ZñaÊ‚™ï×™Ðí¶o“D²©É.nE‡Í™-”ÿθ«&?ƒQgÂP’ÆÆíù‡Uí På~VTÅúm¾è‰Þp¬ðê¡@Q%ͨì*»Y»<3H„µ~lŒÂ7Ñ"ÜýE׿D>ަóÅF Òq™³Ô¿Lo §‘òÀÈ›€uo30ÝŒ“ßЄ•–&¹<üöaÆÂYÎkl§.†#„¹¼r“xÛKz÷Ës½Ö1dê‚ý~Á„Ѥ£zLNA~nc¼› ïSƒû÷Þ:š™zªyòÀ@!쮥цŸ©ž<„ ðÞ€w-v¿¯:Áýï°7±ò#Γ%¼÷L‰µ—õ¬ÜP¦L[WR¸Ü„jx5U)˜ç>unk#}z%òÎ_Ù:B€½¤íˆ60×”´UÙ²§¦,äqn…S­³À[¤äí<à®I-¿JAÕ—‚$®Oö7¾ú /ÈoQJLuüƒhT¨V!ƒŽ‚1'¸ÃÍçe ûx¬dþ >7ãçF þIdQ4V³ôTÄ$+æã{?Åe“0nzðCߌ=•su>d7*Që¦;2m/ýТÒ;‰JgBYð±¦ÃÛ"z¯-.ÍŽ)e2(ifFC¾aá¾óŠyò9ž‘ûaੵô=lBÄ]Ž÷M:ZžÜR/N‡ÞÔG ©‘:[WD=å8ûURe þªŒšà1{HåÛ±Iëí¥ ÿ‡Ú q½Ñ¬ÊŒ6‹×gnP­….kñt£ë-nwò´' ÖÔµ:f”üªÊöþ¥Úíû?PÌýøIÓÔácÏ-o’ˆ~–_)%ÝnE±çÆäS.WÚßú#—¿ 5ÄòÎð r¥bÑÉýú‘b/9'MVœ;CXÇz¦‚d7Âr50XÁº«ºÐ»I½H‰ MÆÍê÷¬xÒ›¹ ÃQÜÁ:ò9Ù¹uâÜì 4Z¯gy£YXÐxÜÜÂ’Êe¯.»I…MÌ¥pvÙÆ\¥#[lHØ·ûå™Hoêãu»\¯‡rÝ/$ySÐå¸i›Iâ­RW%ô•‚Dà¦#úþ ©öU{j»åC)'™#éYß#g¤N1rè ©*\½å"Û”bu*œ{w/=þ-¢×fqP•Ÿw(ì‚s_#²‚eÛ¥²d?ýX³º¦ý¤Î¸`¯H/e²¶Ò©™ÀV ;ËŒƒ o”-Bº«’>Bn¶>rí!ÌF鱩ÛÉè­0üÔK1O‡!L`G»È¨4çÄJ1L§Ð8½þç‹“nµeà6¼v‚>]‘ õ “ØžÓT6%²–Âd¶lÙwø[ѧpÄ‹^ƒWnñÛo”îP «ý]‰dÛ=€¡5I·©²Õ}!æÇ*Ì%å%yúIëè«j)Du¾øȺ‰RkFiöÚëÑ«´^cªË¼Ì8}À:st©X°ýظ| cZ]Ü>11ì­Æ’ %þp>z`¨‚N>ÒüžT.^S‚y®ó=†„ôG†Ó9îf»víz9)Ô½ôŸ§àIò#;gÑ×ð+fº|¿[¿ærÕöFc°@V™bÕ^:D[äÌMR­×ù’3L3£šµø:†çÇË®}[>"vÈÔ7*WÊ¡Žz¢$ò˜«ÔZÅÀð1ë€ÄÕ‘‹tÅRªŠáê¡mÒ…£¡-œkµm‘%*›>@)p'ãQfðÔ™¯!þxƒƒGix¥c·;Íÿ¹ƒ„¨þÊ1©O0\'2NZžÂ–¨xHõug}èA7„ooá¸á»¡“•™f¦|éC˪k©*;Ï‘é/κ·ðIwCð"´Â}ørÙàGEÙú¤;Ü%þ/––ÂhPÔ’Ýñ´¸ÝÊW¬ø*ì ¥†oŸ­­ì­aÀ3ÂÐŒ»Õ~ m|=¾àª?®ÚFy™À›ú4ûí7„¸]´4}•!cöw§_Ôt Çjî³xŸè~A»Æ]‘Ò3ÜE\2—“à$aÛ×õm‘ò„•l?¿–ùù$ºNö9„½„å°>nÍæm§æ0â•.¤Õ¸¢‰Ù,kêË”äðÖ]¯öÓ6m¶ £ ½ÚÒlWV H$gÏÎïãìc 4Ü!&å0ýýR”žs{ŸâŸíYÊòCe½sªaì7L»?ÂÄŒžqã;¡yÀ,Ê42Ìù¦^/ 7œÄà&¨?›>8?@ÇÙœpm¦«ód—Ÿ©R[¯Š%:ˆÚE ]è'ŒìgFò˜v Wˆ'ºHÝ@k ŸW(Aì×*f`ŒÞ) ŽÃ¶çIƒáÀÂ%ű6Ç€“ZM äÒ2™–d§QSQ°U†o °“;jFe¢•v(Œ8°ÀÆ¢øÚSÔ(`F{dÈ£WšXîqåóô%Ÿ!(^›úü-i"f’‹„ã¡/Jx/L!hwzkV™d AB{·¡ÓljÊLJƒ7Ñn7·UF…cBÜÖ%ñÒ*@_ÉNÿî—¬uÉ_V;.<ëùàa4TÒ=wF‹ö­!–ŽÜôÁ-Ó´·þ´wZü=6#Yµ“K/¨¥Mgd(ñiXÌli†Iúü«á ñîÑ—kËF›px\åÊ }rdeÇ"‡;a‡ß‹•iÛ¬$ºë_å_DÜʹ©ßdÂtÍѦœ¾¨Éh€ÇcªÆq®.æù­“JÆõ×:~”ÐÝ^ÓþÕWóžÖ0"WLBÁ…Š*LLì{t…–6ì©§['"…XæwB•}E0/ª/ÍB~+Sìºÿðyö“”a¨"eä.|F Íjàžž¾›h‘E%±ßŠlWÏö%tB¼ÙmðÇcú<Ç!hòšVÕÏÄëA’9Í=)äeÝ—z³À£±¦fxP^ÔÓ=A~ü½>{ÆeÀš&uÅ’d–9ÛGÇ™®^ Þhë<ÂëZê0ÁXú¢Ò]à{)8ef†%P±'ó÷$;”SÔ¨4{•s qšÞ_þ`˜ò˜àyZEˆa8@3œV< ‚NÛa©*ƒWó‚½çˆ8]ÆÌê‰Ï%wÞ­¿ØÈƒR Öå#°{Ör#¬?´U¾[Î<¬IVž‚*+ÝʘšÖ#]®n§›rLªÍžøÐ(íÉDY9Vò7¼T>ù’û/m·ø:þ$uöëhLu4ú©.[ã ™–˜@x$½GöÛl¡ÎÆedœ5bƒ$TxqÚÜ/Ó*Tx…ƒü¸²ˆ& fóêưI]sgÜZôÏ{ bÌcÀeœrñµ‡àuÖ /CˆN\¶l;Éhp)íkR ÍÞvb E¯B`dâô}ôšìù’(º!5ÝîÉÖ#JÂUd,õ†| ›)éÚ5Þº,žžS'(`¤FÙµ&·ß¾\6á`ÅB&%DÚM¼PÌHBB8ôÃë캃ÛP®¢J@ÄÀ&#Ýê ¢mpº–Q>ô´OÍÙ¸ˆ‹¹ÔÚøÊ‘,üûnúåå5ÍÃRsHwmé¶|h“©SÇÞã ñ™ñ‡—p.° Œ:zß=°L&ZVþSwîD‡îÈ—–¥ÂoýÒ(¤?¹R0·0ù¦ýŸ›`­hô{>™ŸUeªó+áÙù±Q¤yn Öœ8Ý™ÿ2R¿z çtÈÜ00NMÎæì‘0ÞC@ƒaÛ{3iYÞaoüLâ?2@°.Kð¢œOg5n‚”Jtàl¹%n¬5£7l"ÅèæyUù²Q5”ÄÏFïòsÆ©NÃóLU1ßîuw½F©þ6,8´rãWñ%z{7ûC™ÿqŽBÑÐ)HDDÏÅ¥AÁ+°[++FÐT¨§OzÍ-I˜z¯#_˜çád"ÏjÈâØJ0‘¥l2~_Ûç4RiyNY’Øæƒs¨ ÐÙ EˆIÛ¸žK n§íTYQ Z}¹Ñw®ý‚Þ‚qýÒÔÛž—tT¾ßæ6LñZ‡Puf1õÕ‹,jJ½Ûü{û9”RI;zäÏ›}ÎQÍnµŸ&¢¦0IššvYʉÖZk/çI€°}ív(¬zI€("ÒÚv B"•øVNccÿýïEKR-[xß&Þ/Óu¡B±?…&C—’[ M9"ئ ½À†¥#øE[ù˜kdH²AY¿G° «‡%‡+ûæ]àßhïøÁd¾6fÚø¼,ïé6,&ÕÔýD…Aº‹œn`<À9N>üÃüf]nâF×[çÐìÔ—d•eª:ÅTQEz ÔóÝÿ0ÔŠáŠ5Ý0<é56YÛÒ"WÍ|·†$Ùgm0¤ßýô+)¨µB2}±Nà[LZ¼¤ Ô+C„:H–ê„8^Çl‘ÏWN$¼jUðäzÃ1¨=Ô§9÷‘²$2Ó3ùÃ%äwÚÞ3©-aÑ"‘]ù5¦?“~²sÃ6¹öúOº¬|–å‘o3nZB#‘+™e`W¦’.ßÛ†RyX¸:ës:ÅÂNŽÅ '›ÝGùÆõ´Ó`r/´W€ÊvD…Z±9r×k=NËÏçØ"tV4|Ó’ÒÎ<£C¡èXnØ]”3øÔÎ]³U®4Ò…×E!Š‹3i?|qPÍvé<ûèçÿü«ïÇÏâ©CDÊèD‡Í©¥É™ÏÀ¤ÁÆ”÷б,Io]Î3büïi®Nq·£òŽ V!Njn|c—G›ǯU6ighÙwû©P~i½½ø—Hq45|ÍvÙ\÷éÊj]˜úNüÕ££·€½¹8•)=¼/ªkࡉ«$0€§!û65?ïÓ‡HíÞÊíÐf¨àzN˜#"?Zúr"5šÉÍKþ9/{&Xæ"Ðá ‡—›îØ7írøýnr“ްº;IׄÉ<(7]«5,ÚË¤Š”ùŸ ¿½à¾¹¹WD›\ëŠ"0ÊçãÔŽ}éÉztˆ•7‡V—¦Ksnû¶ˆ¿ZGø#Ÿ—×7“SãF«)Us5°uRIP‹rö–Àk|átš'Ž~Né"K½§ ú™”+F‹‘'°æ×¥øCA!0Lwìxð>eóÀxkä©ÓDªµœeÁßUèSûc5V+,|4F¾Jå8<Ù±¾¢ÛA·Ù¥ÊŒ7‹@¬Î‹;ÛwuP¾ÏA{;yYlÎþýØ©ÿ­º ´«ðCÿêïT¯Ò/)`²v‰8wåßÄ€(ux·+rò,‰±?b ·X9úå/ýȯ™Y¢Ÿy_üßšžéd8-,ñ*Ö¡{…5óullð÷"CÄU­H4ÂìÙÏW³~YE¡J›DÈ÷)„Æ£ŸJ+pækäÈH“fÇ {4/„šfxHvåûjÊð[¾rí⚈ O¬£I®Ë‘°f=™Ë‚i2 á8{c¨Õ¦n<Õëù/s¥ +‹Ó?F¦ãŠ< ·£ê—îðæÒï_±œ!Ï|j‘ FrZJD9Y`Ä&ŠPDBYì £0îƒ[Š)3{µ$àÜM1üxqÖj_”yûaHG¼¿áù%ƒG º‚x–ûWSg½ל£X¦¿ñ¢Ñ´™$Ð?zÑž©9k…kkô ›atŒžiPÊŒ«ïažKÉz¶^i«vJ¯iC\Ù"¦/Úø$dáX cY ÛçÊŽA„ ChË–Y+“\Õwúð˽éÙu lQ0gð‘’ ,XÚ ŒnH«º­È&Oúv¼(K‘tÖèî‚9qFŒ,SGõ:Zo÷%Ä1Òå£I&Öå6^“ç¼19{m˜ŽØ™oUZV£òY Ÿ=×£¸*6â׿cít…ý†8L~‡2ÐB;ÏFìpà-ƒ8TEZ ‹,Ôí'JëØèz-´Ð€~¢IÄyÖêïü—£v®êG1æ‚(} £_ÇÀ`Š¿žÍ1¸Æ0\ܸçÖòÉ^¥j—2´Ù‰VI ÜF>™ãEa'u9ÿm†UÑ×TŠ‹§Vyû(¿±ÍõÉ) ¤ë†k˜­˜‘ iôWm2‡®TYAxžuÜæÜ.d¼ŠVy±P«Ï¦å[0˜OZÙ ³SÃÒºÓ«Û‹º'Ã5À\²ßž–í1 å,^f±s”{,uYþ·-g•ÙŒéŒîM®ï”kD2á*¸CuPT•à‘ùÁŠŸj4{2ϵŸùlΆaÖæO˜ë©î‹V¹ˆýxo¾šºL.ò½ÊÕfx¬Y?‘Û:lw¿] è‹ïK[‡ë lí+"íñè®6ºBù¥…%Ÿ™ˆªm±®Qf”ŠÚ“SÃëP‘mÜÚ £;<|«Í^©Î%ê|ßwvËg›=;n—6O¢9áëÁ+¬Á–œ3YŽ=dóœÍÅœ^´Û0NïTCNbfé<äÌ^’ÜÅy³¦uLÈ_¡ýg‡õŠYä|øhêÕó#±8–Š&›’ÖQNÖKÆۋ‹ßÔÂ?AË,ȳ¦cD¤\GÖáÝ©iÚíêCÚ,ˆæ„ÛêPÂ)æ!Ó’ dfÜÓà`\ó};xöû„Ö§èÿ²û2«¢F!ÝãW}&7„™—ëHs[—ã!÷òÑ‹ÞÒŠÐ5ý©M­£Ë•ÙFvr{«™ˆ ˜âú<)÷5”D-ˆ'dŠ5)€vŒ{Ũ:úü90àq°ã§Õ§3@Á­<ƒYq_ÑFfé—@ä³1›¡%çËqEÝDÿ±ñ»¬6öªY~0è%ï/õ¨Ÿ=·F¼ÕËu=7Ò‚ 6ŒGEÑÒ ç¦ÊòWqÁÀ¡Y5Ú/Ãf)D[zQX~dÇjþÀöéè%\kãºTו‘PhD‡Ž5­ÄѽÚ"‘G,bXÖõMàg(‚ØM!æËhiÈãbYæ ¨Ú[ª¹tïcrª-¶L5#ÀCK9%jµÑgVOR¢-iÝs»Y+ŽÐSºFC¸tÌ›ÃÒ“îÒªø:~©}NÂD“I}ýP4èÂ9½Uj»m´B3»>†2š‚È(T!¿õ`r‰ñAQ'5u^éDJetëTõN—¿_/¶PÍVe8Kü8£S(tqû53̤ ——ÓnÙú¡èØ=6œÅsõ&UT!‚~þ–«?ÀGŸˆ›ucJÈJŽ÷VIŠâ^£Ûˆ5›T@â°…+ Ðanˆø¦°ðŠr+ *¬ß„Ó˜Ed‘8 þÔª]+erØ6>m=Ü'ø'ÚHÏKõ;ÒE žÖ“¾Ïè ¥”4%Ù«ækðëõʨ{"6×Ù·,|Çç1â‘/ŸÚ¡)¬žÁtÚ½Y¾ýÌeFÈM.™µî󰇈Ôò Ê:³Ãõ’˨!YÃ*Ò4ë@ÝÁ|Q–ØRo³Sq¬˜D=ïäk§e¹»s2¸£qÙ„ºô¼ø8ik =¾Öiþøi Ç_%H&¶Þïsý-þÂïø¯Õ«çŽ;Õ[ByÎ'çœu½GðÚë²kEÙ{‘ µ>IóœÅ6U§l´IåÃ<£)[éVæÚû>uÓÂÝ+œýýµ’¦yÔïxˆÛf³”›x ³ ¼=ÑùxLÒÙe7dž%üò­x›P#ñO­B5ÈÕÑ}ŸÆ ©Ú´y~ýÔ²hš¤ŒÆÜÊ’ZæmÏ\Yçv—y ÕÕ§ ¨þ‰ ?¬o VÙšÁääéƒ9 8 —%yŠwÛ+ŽJÏiãÒâ1ÇÊÌÆH'¹´T­øyàcržüÎDÔ왯p‡)‚èRa¾¤½ZMfDçÕ££0AºaK¾ÞYU@íGî€-)•¢ "ª0¶“‘Ç0‡Ë™D^UcõŽÕ¾êÞ¸Ð|ñGëÂ~!Ôï¬õ¾Á]Uèß!­+}³™ªÙÎÞFò~Ulqzcò±…ï8¿yÖ‘Ò©|œÍÎ&´ðMánÑcè3’†>úmZþxÒ;`Þæ9'iOå€çï­2!êžv~¤7oÙK.`ÑcÅiÚžB`­HôV$̨íñK´Û–fñ±^ž)MÆÝ lµ:Éï(i G§Æ7¼2ðø¹ÝVS*eøœâYÃßÛ8{Ä)·Y\R/„Áj{oJø>Á÷¯nц%Óhû¡,~SLä¦O5Qk‹^ôE¢Á£KSU9–Dí½x+åBgMý6׈'0R—z‡jiSÁŽÔ±óQ”ìkakðDIì°š÷Ï7(¾ Õ4”‘™2–eÇ2ÿ°î':E"U æ|ë<IÎGy–ªXõ­ÿ*k-ÄâÒ/Ygísæ0Ñææƒ?HÕ‹=÷ÁâßD©o+Ž©™  J@$/.ÑcPë"ÒÐ'A̦)P†"‹ëÕ4ÜýB¼Û‚ztí·Ë9"^™´14”ÉhµÚ?2ÝãAÄÜqª#Ù‘^×çåÓ `›‚c]ïÔ—CÜtÿ|à £%"PÕËÃÑm,@¶ ³­®¼dBݤ«ø=k€ôSþ`úÉÚ â’ø¢wÙ:À<?a‚«%OöH(š’Ÿ6f˜¡{ê 3Œˆ hï'ÄÕ*“À qØw¼;€ï¹UjKxJqnC…®Æ:_»®z5+Ë­¤ƃÄr·$KO$6h*9¡gNŠ•Eó*³å«ÞJñ“÷d5Õ·,>hPªšŽoðXx|‚x$C‡F°Y3G®Oš%p¯ÍVÆÚ2Ìø|aVn*•Oî*F`+eóÀ¤Ü»¬¶ÂBŸÌäœstIÑå¸LÁ‘'fòÖD 4תÍñ{ÏH™<¡dè|Æ&2‚¤Ðr°¦`qÔ- ¹¶Â7^¦T¨Äˆá¤ZMh(L¸} “µ>¹í×A“þظ®ûÛ¬ç„E戧v§4.g˜ßâ<:éA]N/.Ð ™?œ$öH´ùÕÍR•73Ô :n!A˜r ï¨ü£úUÎ`”Ké~NšF4$ØDÍÐÙ·‹Ú`•Â~¥ƒà³D?QzÒ¥6~<üZ+¯ä»ü€N&Æ!ÎÓÌן#ˆç@Èœ<®ÛU!Â…†¡J«oêÚÿ’Ùat»$*ž3"ãòŒ¼^l­<ëÈíïºJòqÀ1ϱ>鑿*ÛÉ6'dÌši üBoéúþÈ ŽQ‰‰’¤j˹(@¶î|½'ްµ) -š÷ÄÆU-ì®bAD(%¡Q/™ü^à_Ë]Œôê zbYD@Íd%3›|2l1áÂ>ƒ‘Mïôì“]gTå$’ädp£â»Ê,ßIw¿ør-ÕC´s*’‹[lªß›"¿Ì©Ž„wet"£œ¦óOç¥Qˆ¦øŸ¥éT4•Ï ¨ø(~Ók´O°¹n‹ F7¤«°"(Eø¥D*ÁL'%X´¯§6lO~_ÙÑ'-öÕëØÿsÓ×Þôþîá¬5RŽ˜³püfÄõ…ó(-Šª$ëÃé®ÍÚG±`ÖnH|,¡eþϯK×—>äÙñ¡†}Î¹Š¢Fx°(ÊÃî.1KòãÊÔ3À’‘˜¬£ö¶3ƒ0r‘¶³]iØAè¦Þ®lÚºÊÿ–wk»_M6ûE†Î¾WŒ+‚Èiùëþpa,œŸ`Ýí.`lÃ¥øAçLTpb1m±ð’~êX£C WÛ6'MÞ¥Í]\È^tÒ' Ùàö&¤åÕ¹›…ÕªÃÎúz–S‹<8UêÐVÞ¸|QÖ¤Ç7WŠ˜šê6v~.éÿÜÍÕ‰åT©·‰Sÿ.š…ó'¥¡Ê³Òúw@oš’§ HØ”;ycÔLæÎ[äE~5Þ° uò틨~%oÆ™î¯aÚX!^ÍAý‡\r‹ºÜ£»ž¥§ˆh¹¼"wýQñæ6YJǺ¯°¶róÆ3¨{óohŸûÏ\°ñÇ­‹Š]žÿÌ<ö‡Ôd¯ª°(,[F2>ˆ†œHQü˜_sÐi—OÖY—/Ыú÷Ì-Ö(ïÉ'ÆLj¥ðƒ>ûæ‰,ºªâKˆ–ô“(a¹<öY³FâIWj½ˆˆ)ÄmÁVÕ4ö¹5²vQåýU” ë‹lxÙ S—gŽrÐ_—|J‘ÀOÄ»Y|ExsC;cTÑN}h§B !ÏéäWèlQ£7Wý΢ÙÓú}Ë–4 2?’;ènÑšNËla‰n~3+ùìëŒà¹CÀem$èÊR$Jôf{ɳE£Á=,<‹WÉÁï&Fu·4д¥yÉ~$? CªÊ—è­Ö?ÌC޲+E§Šùú¾.AuîÚ÷2ÅÅÖ@>@í3>z²þˆ *Ò:èœ%j±‘ÍìÈÜ‹¹Y—Ö9”ü&+ Òt0”ÞýE=sKæÌ‘Í­w쎠ì–Š ¿Ú÷ã_·„,##³ ¯ Òj$|>ñ¼êÓreQz6ÏÄ~;“4,@Iž.ªÒ¥¨O¡ÅÛOˆAE&Á¯¾là˜×”[ó¢vÕÇæ¸µ@psj_MÈêžm<ÍAEM •‡% F–>Š`Šÿ²³†ÙçÑüvúÖTÀšà;ë°C 8NG>lÓGé]+¤ÊÜCµöÚñ¸³Á ³ÀÊ£,xsÍ ¡SÃù ­ÌÀ8¸<÷d@"˜Ú}õRMÃU×u0’ s+è;HDwêwF37óäg솱ÿÑ$ ¦¿€„“ÅNö5Yæ^âúú5äæ®æGiü dŠj:™iR#÷AC­Œp.mÕvíI泱ɥ?¯eÑô­QÉWrÌ^'ê½€'©Ž;¦Ó¶7D.±Ø$OžÉà endstream endobj 424 0 obj << /Type /FontDescriptor /FontName /DXNYJR+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/B/C/E/I/J/L/M/N/O/P/Q/R/S/T/V/X/Y/a/b/c/comma/d/e/f/ff/ffi/fi/g/h/hyphen/i/j/l/m/n/o/p/period/q/r/s/t/u/v/w/x/y/z) /FontFile 423 0 R >> endobj 425 0 obj << /Length1 2742 /Length2 19509 /Length3 0 /Length 21063 /Filter /FlateDecode >> stream xÚŒ÷Tj× ÓÝÝ %Ý]Ò)Ý  0t ÝHIHwˆ4Ò ! Ò!Ý%”’ßœóœçèóþÿZß·X æÚ}í{ïûh4´Ù¥¬],Aò.Îvn.€ŒªŽ7€‹‹—ƒ‹‹A qýWŽÆ r÷»8‹üa!ãB 2Y j¨êâ Pötpó¸D¸E¸¸<\\Âÿ5tqȽÀÖU€²‹3ÈAÆÅÕ×lkæùïG“3€[XXíow€”Èlt¨!v 'hF+ #@ÛÅ ‚øþO&1;ÄU„“ÓÛÛ›èäÁáânû’™ à †Ø´@ w/5à/Ê5 èjh ;°ÇÚ.6o ;8‚­@ÎPOgk;š ­¤Pw9ÿÇXå?l€šàæàþ7Ü?Þ;ÿí ´²rqr:û‚m6`G@]^…âa­ÿ2:z¸@ý^@°#Ðjðwé@€¼”&eø?+w°+ăÃìøGοÂ@Û,çl-ãâär†x ýUŸ,Ødí»/ç?‡ëàìâíìÿ_dv¶¶ù‹†µ§+§®3ØÍ¤$û T„ö[f ‚ø¹¸¸„xy 7ÈÇÊŽó¯:¾® ¿•܉¡ý]]\6P @° úÍßè@Ü=Aþ*þ¡qs¬ÁV€%ÈìŒö;:T ²ù†ž¿;Ø`Ì?n×_?ÿ~2…N˜µ‹³£ïoó¿˜SYIÁ@CšõÊÿ*¥¥]|þì|v^^?¯ @@Xø¿Qþåÿ_îK5€àjû#ž’³ @ø? ½û/ ¯æ‚韥aüo5è4ƒL¿‡ß„‹ŸË ú‹ûÿó üíòÿoòÿŠòÿ:üÿ·"yOGÇ¿õLÿ1øÿÑÀ޾ÿX@§ÙÝ Uè~8ÿ_S}ÐÖYd ötú¿Z%º!RζŽÿ6ì!öYk€!VvOÌÝì Òpñÿuߨ¹¹¸þºrVÐ;ÅzX«@ÐúߌrÎV.Ö­¿èîôEã‚Î??ÀŸº£Ö Ÿ¿GÀÉá캠ì6.îh©?€Sê/Ñ€Sú7pÊüFBNÙßHÀ)÷/äpÊÿFÜN…߈À©øñ8•~#>è,ÿFÐì*¿4»êoÍ®öA³«ÿ‹„ Ù5~#hvÍßš]ë7‚f×þ Ùu~#h't#h-z¿´ýßZ‹Áo­Åð_$ ­Åè7‚úÿEÜ<Р@+0ô¼­A¿­ ñ,#hÅ–@+G ‡Ý¾|‰Ýÿ@¹Xº­@Ž ÈbþÄÿÙ¼£rÿGì‚ü½0ï¿òÿã¥eõ/⇖håâÒÿJøøþ’89ýA:¾œÖÿB^(YkGÇ?k†Þkœ¿yC–ô?IþÒ»yB¯ß.ÐvØüv–köú#Æ_jÏ?s@MlG„êmÿz¨Aš@kÿÝZ>hÇì|]í@ÎX@eà? ´Rû? ôXþ€ÐæüY1´sN¿!ô‚æü™êê Ýì?ôPÎ.¿‹:»üJÀõ·Ìú;ÿÏ!òqÿ#ýß#„Þÿœ® wèƒý‡©Àß2°Ëïƒâƒ6ÌÕÑÓãœP‰Ûïþ…ÔávKT“fãaÒeyÝ·‹½'¾ï…cFB¯~ùy{S4ù:¦L–(ñ[âµPÛ[%}7"¬‚ÃÊŒaKÌ/ž®xU'rK'©¼býQrº]þv\5jÿ¦Ç¼¢ð—5.-kýý±xËÁËã„Y£Ü(`ð§–t}е+‚E~CÎå1£úÁâƒâ¨dX"r¹ñÆ£/ â•Ð{ùæn®1ã¾!¥a“ع:Ø´D«Wç0I? \ÖÈ÷JØje¾*o0}3ž(¦=£ö©û;¡êƒøUŶñE_ò’i-]PƘÑLÑ¢ïˆÏPM\}TÝ—Pý²ÆI3‡0Ù/ðšvÛæDi…)Ú#4ï;“6ºú¦WóöæñË£ŠÔMkÎ{ñfG·ƒÞ Ã3ª-3,>NŸæˆö ?¦Œ½iïiƒ²…dŸ/F§É·x&'º÷©nä«C¤çÊ\fâÛ’¾ã›!¼îI?5*ÉGB?^zfLM¬ŽÄ‚U÷Ÿ–ÏxÓÜÊÖ ýu;)Ê¿–S¬á$5;ÄZ ·0â·6òþ]¶u‰¯™Z¾†Ú ²ÚÚž£ª$Ó-­ì ™2f5üÂt?¥¾o±J|‘>¦ß_ýÂ|$ù®^¤”IŸq > æIz@¡ƒ”ÝýݘNadê‘!8;\šÍ!¾lÿNðD¥m¶çEû’áæ}¹ÅÙKÜi3 *˜F¦ÔêF$§Ì{JôWŒØ¯¶g0_æãæÈmj¨±‰¨øÇhó*ðhaI ˜äoJ°ŸÏ™Ä3†¬\Ëq¸Ùeô!Þ’ç_þr V”y-©}Ôu/µ¨®þ¹¥*\‡ôÍœ@Ùö«¥7Ív:ÆX‡GèˆÎטjÙnx˰a}7Ó`ð`¡w{²ÅóAq9rãn¯Å¦R/†ŽN‚R¥³âã·æ"ÜÏãï.ßÞôXà­]Ïï„f„\/¬˨\£7°˜Ä* ¹[÷®+ßèvMW•qž¨ß#ê 1X¼8¡ðg"y5 Â!s%\Ôå£8ÀŽïµ-÷0ËçcÎO½›P°Ôö“ÕÏö3¯ÔzÛ‘ŸÑrÔrÍ-Mñš ž\{ 4°…ª¦æ|cÔ¯p‰ˆìæ9NÕò¥n^5®ógí¯ÃYkNx8d—ïA,ýŸÓð¶Ú:±Gº@®·£Mhܧõ.Ø!¯`N˜ÒÎü¥È¦ýZBÞHÕÏ p“UøÜñÖõ»E=Aòµw yÀB8¦‚ò³gKÎ"c§}ø›%˜ÌEÕ‰b¡øâÍ· ƒF8cÑoa‹QÄ7ükT\×qûnô˜ðñ¶FVy_‡Ÿdê¸?È8ò½l1zvªõow'îÑ5z–«ÈŸŸUø¸å™Ä'¼ürÓÂ…Ô­sœ3¬x+èËg;-A;" ÇF˜z¡J¢Ûà‚ÃsHÚÇFÁRîÃ[_ôWD¦ [7*ñi‡WMþÈÂ6(¶¶l°Ž‡•/:ÈC¾’`©YÞÏÒ_¿¡ìò¢[m~y"¨{bu<Þ׌\ ÃØGåüI {*s‚;.k¿D}°ò ¹léYo£¢Š_©!E7h“¢CkCG‹ ºI2(}ñN«³_îË1ºiJÈQd?ŒÆ…„³Ð‹1BNi ŽÍëë´dâ6®è¦sN‹ªØ@,¼¬ßgî zz–À_¡úbÜö»àmAýGúN¾:lmc`¿\e—Ík¢PÇSóÀ¥UdíRü"²I®q´ŒiG{dtœ‹#¹«æ-÷:3ºõ/¢Ø×t?F”ÆEÛC4L‰ñ>7]´iÁv=¥>¤¶)Á³¥ÐIdç&‡^ïXJçON =,¬®(Læ­¯™ˆ¶)b 9n!YñDoÔøPL pÓHˆlnᶦíâAè¨ú6‰$Z§oRmÃc´»@Æ~Yù q˜ˆ@ÀȆsú½ì ¼=û}Jxÿ‰z¸€×•Ÿgq¢¤åkÔØT°O£Õàš…û Þ ÷î} L,¥“#$¼Ò„åVó—¸(¡˜ÜÚGÚÖˆ?aHv éO#,˜‹{«¯¦ûIDcˆN»RqMÑoµðL§ä•>ê8øœgÛÛZæ)&[£p0‰ õlŸUæPpÄMÁ¥3»ºuUü|I\õÒìÐχmÙßìݸ•©{ö¶€ËǖȦ֫¡õ*ˆb²ÎªÌãä U]tÊm;ÔT莞À÷S‹t´‹Š;fˆ¿¸Mws=#@þv åê5ÃK,Þ}Å=ÄÚ£ˆ([VÍϪ¹=«ôW¿BÐxðbï§<àˆ'–rÖº’6fÇÔÒñkHdw¨/ÕX‘ù’„í®„ßsC\™Jçò¾:Y1šV¨Ìp«…ÈùþÔ¤ÿC{(vÇí=Jäùk ÆÃI ¤Ÿ°¨TÙ§!UhahF‹be‹ƒØÄÄÂsíÙ˜0šœº©ô'Ãa+oOtÂC„`¯Éœ»sX¤š2uÓÑSìäeæc|µCU=zâe§º}Wúg²Ë{¬Èú ²¹)rÕ9½ôXæŠÛŒ´=›Èʆz£ÙB'ÝÜ=HÖtÊ*ÜDøªCø´Ù–¥cš=Xg­6V-S3ùîŸkÐÅlƒâÏÒ“ø k^MЇjï^˜[£IF‡˜#óÏ)zl†ýºZ%<â¼Ün‹sУXóܳýœòX;ŠÈÈç˜:•²+yWÓe®®´Ñ*Hš=ÉéŸh†àçËní>NâƒiC^øyŒúOPyczþâ6|a¦û¦Q;·|‡1ŸŒÜÏŸ´õزéÃŒ•ƒ†%JÐ`(Ì"Wa]oßmɸùŽÒL5M8¦ÎëO±Zô3l¨ÂÊN8 ¤aŠO¶C_Èe õ4d~yPEõÖ½É9áK_\îgËÙ—DZl´²€M YãÝ~ª&³´äµ‘wû­¶‰­û†êîÉLIF¦¾$Ï—5mÝpòÌœø¨~H*Ç¡cÙd„;×”…kΣWÔxJZ€ÔHΧuH›@IT\?Õtt¾………YþV¿çEak€¾Ó]øÑ”¢ ê°ä^Ô„ µzßû½‘p7ýØH`Ò%iÍj5qžˆ1² ­ªØU†ïá¶½°š’ bÆ ¼ÝÜ6»IrÌÝ7*ËY¶[ugF!ÂᇡŠê4Ädr³‘Œ¢”OÜD€¨Èœ‘`FÒ@£A€ã>EÙLÕµàmá„eˆÎWÉ4ZMòo× ûlÂä9;î›QÆ«²)ÄF³7l±I¦³Á÷=ü Ýèá !óDà„:9µ9ªu:«c¥­?X ÖÜË]O}…¨(6Ñ)m??¬Âîõ†-g¦O{a­Úô÷Á]‰K[™SÍÐJ:W´@C%äWÆawÑl37RgZcÔÈ`±}ØÝäâDÌÍc‹hÈ„zô;Á,DZ„k.ôq*†!éåݵŒz D®”tWÒçïO*ç)u˜Ëëw²)@5¤Ý—ÀP<÷¾…ä9IÒ;ëΊôž”}¯~‚¸£¶~a¿¬k‹•¸îÙ£rÅ Iˆò)kvÊÉ)6$kET®ºFå¨ß4G1 Z;¹·¶.ª@w5Ô…ÜUz~;JÙXº»_ÛÝ>ˆ]á¸uUO~—¹º)» ×À"º‹Ù;ŸötÑð† HêØâd -#Õéê3&¢Ã¢ó+'ál³gmóKÚgŸÎ JÌY!)Ü…<ÌRóXþe·g;V¯j ’*Ëü4X4GËÓµ´v­Y¨÷Õ¾/&XâÛG•Àyö4(…'¡àÚ áý`ÞåÔ'Ïy°¬yñ³ÁÓæçvÚ£ªBQû¶Ä0¾›}ÅE&3ÚÈÛ㬙zÖ¼æB)¼/Ó”SîEÛíå/§Rd„çÜúÝëñ~(Ü1ˆD]*»?5‹­3UÚ*˜õö76Õøh"™…¼Ú^Ÿ%%îÙ4¼7ŒM¦½ý”BO aÓ"H•¾œµˆÛúÎ`ô›ËAô>ïCã6«N(@ð*(ßçVX¾óÝ<ÒH2 •Àmì,#¼ƒbƒ&¬Á%¥|!Öî ¶Úóÿ¦âfeÐÜC€H/3d¿u„æXÅ€s¹¢š$jšóŒöB{Õ®-1Îe$VAÙq©j–ç"·5–‚)fm ½Â4 ú²ÙŠJƒÕ¹)æ¤ÐêïkË%ü²´‘–Šû°ä»I5h¢J©CÛwXZI§%nnÖëo tÐTHªÕîàåHP ¾9árs=ÿŒ¦é3íî²£x¯Ýéåw±Ÿ=ðú½tÁ—`Qöe Tny“Ñ&Q©ÇXô9'¤ÂèeÙ'BýRÛ«º+#ó³èÍÇ”+®¯´îYäÙÚ2÷àÄ{¿úŽ`ü2žý5k&FÃ^ÂM_˯’²®Š‹«Äþò‰h.Eé†;Êš.OYøôE¦R|]`rÀöíF³K»4.,kY5᪼¾³u¤jख¡g¦¥|KXµWÖ¾•„¹­ª¿‘K¿ËÁ7вü†×_m "჈7¾+ô¾œ}Xl:fËÇ)¨Êرu6…“Âo‘€ÏÈ_´F«qZ¸"•bïOlòð€áËî!£¨LœÆý’;¢2%0¦@w9ƒ+ÌpýOlp2±100êD×o4OÞZ”í[(›K×lRٕκ]â aЈs\N~!ïbéïRQ½©úr¶ŸmÙ•R¢úŠ4èoéò*[iÏyZ7Üå¹÷œ-å%ﻞ¹ø€$­N7J ÜóJÆûrì=Xíûy¥y=“~äSð¼ŽíPl¼±ù†Q“ù‰}$ÅÇ÷O)üÅ5eŒjBÞØªÑ Ȭr"^qh1#´áðŸf*Îʃ·’%>D¢“†o-œ0nê&Añ—ggå´–›`·—lýdFÎ#”}eÙ¼{½q ©1¦u¶ƒ‹.¿J;âô'Zw-ÏùMO«U÷ˆ5ùŒðÛÊ"Vö¼%a65¾PÂ#ÉÊ|>.N‹3a¦ø‰„²èî_Î#L›6î+9z}ôÕø¹ô`7cLÁmó›öþ&:mcõA8­æÐC[èÏ?7 k.×°J™ÏУõœ‘Þ5’õµ'Èμáô"VELssGE0™¹ºÁö:¤%4ráGÒxR3-Gtwdz G.û‘e »–Xuä:LD¢æÊžÌ);£‚¦‰±¡‹€·Õ‡ Ÿ\ÌØpú­áôMé±sâšY¦GÛ°H¾YºªŸ°\ò@ Á4ܘÐôšôDlYŸî¸Aßc•÷]`/Nè^餚ÔãtÐÙÛ¡_òíÝÏÓÓc¼nÑ 3\þ u‰ûKÜ¦Ý YMyÒ–‚Ö<ëd½ŽZuè?J¦ã#Þ·¯qRY>P³§8Ot?&°)X•·ã#á=HÔ(Ü«©¨±‡¾f²ÁøÁ @~ Œö}ª‡U÷„¦u‰Q.Q©;kÁˆqnFo}¹ó³ª+RpïgóŠCÕëÉÍ6toAívýà“àÞ-Ö¥È÷7§é5ôŒ¹c¸Þ7Mu[Šˆ3g@÷zDÈÈñ':¯3…Ÿó3Î;¯Úýèn‚ɽ­®Ç/ÔºZ­¬…XÏñk{ñ3eÓ†Ò4`ÈÅìÉÖ)bäaû ;÷ï¾SæJÂú¾Ö|¬g+Š)õIczÀH·]6rÜyÙ.•Èc¾a›H§… óýw’’À§:xÜÝz¬©›S°äû_ú̇Y-´*ŒDÄŠšf6É¢49ïzwÏŽ*#.â¤?ìŸ,¡Q|”6½dOÈPÞ*‹ ½ýÙâÓË»C2³Àø %Ï~³çÝÓ7¹R ºÏÙSÃ’±Boå•€¥¼~)†´É$<3A€!$–Ï6ã€Ö|ç‘+¼ÓÊóéÀt凘Íï3õ¥x‡8i>ý<¯ÆiÞí—{¦ÚèÑs¶V21›÷X„ÆÖJ/!âï >ØÌ³ògqnœÇÑç´­2Aìæ5µâŽëü"بÖUËã`Y*<ÁC½Gú؇Qª“"Œt7[ð*³ÃXsåØßöçÞM@‘ñkû5¸€ -›o8?ñˆe|÷ÄsalxI'_msîkÙ<÷9bËHÅû©N\xîç÷’Ö•P†ÕY]¾ÊËdç Ú›FwT»£#;¿»›GFå(^7¨"ÕáXü„ó.f<3IŽ¥@[LÊ] “—l6<*¬] ¢]J@Á…wwSîQµ!oFRŒFAÇlâ‹.‰£ÆÕ(SýIWÜQíʲ+¥Õ Á€1}Øä{LJ€ÅÜs]Ô%B±‘ïhµæ¨É^,! K§hÚp:á»ê$_‘Ë%«{Ýšé_p¶j(R|XÊó6cRƒÃ¶ßãgÙ{CNßey½á[ò{*K!ú¡ é£whÝV5T(©9<e®éÈž“®¸àèÓ´ÌóÆÂn&<®y°‚;Ýáüøª$P{X|vîΖ>Ά×)ú©•蕞hTíC;uøH¦Ä&õ6±ì’¬'ˆÚôYèYõKiú#®_¤—Ô¶Òö†Ì+XŒg‰8>ðÅ6Žß8¦aG¨.Dæ:ûãpP_°âÜwÁ›öžæ0âD!Ûeˆ#vI›ÇÊlAÅ‹¢• ·×ÛäUßãG§]BiKèçÞûù1QÂS;ïŒo>ÖÙNé"•ÛcŸ"ñ£ÐõYc)­¦Ñáà‚‹]å=Zùö8:'b‡K|2VURËÌŽžÄeÎÕÓÜ$ïÛÜ‘¸°TÆÔ1ÖήA£ï°Ô˜ºÍ“_¦ìø/Uï]dýÂb»À9b„/¤ôîYÐaÕX)rÌÏÜÜ  ¥_Ò1[ÝÈ‘-y¤ªµ’èKË_âu~˜_HHEó¼^í±þõJ׿óÜœâJÏsÄçÅÔÌ­¸}]1ðž\²ö,ÆùžÛ›ñ§öèaÿÁsS²ä×—äOYgÃää´ÔzŠi'Úž“¥u5Z’¿!™¦^{çu-ŽM©î(ìP~ k§Á‹ÐÆAç›±OÎwýe\©]쬹$Ø=:1wa•[M8|~%M˜gè6¾p ÚéO€`zàËÁ.›;̉£ùTl|ò§èÝ™yäèrwÍ„³~Á:T û"¥Ï…‰9ÍÄ`÷e¤7„6\EöÐÁò©ˆNöW}ùËšÜÃ@Oû'…pá§vÛk¿:Ù³Q¼:<+â›Cê«9÷ýù2z`峇@^ó}IrýñJÈ~Ü~Þ)É¥x@€õAvSŽòÌA‘)+¯=˜7©×³G¡èz 6ÑjÉâ¶Ð•†Æ¡S†Â’ÉÐÆG"1¿6J¾í^/¸Ð^¬eþ=§dÁñëîªd"o|뱫·TMeâ}S ßð€*æêt¡#JÕ,®ŸÓ›oÛA<¬ái07ÂÓP[§ æ]šüo>âW«¥ i16}ÀƘy¹0:Mû’VQEÏ(z”Ò¯¢\­Æ¾Ù§]ÿv–År?³a™ÓÂúµ×}wL¶é=;ŒLèëùÑSÖb }bj÷MXÏÖ¦¯–©\ð l¯&û­WMYåÑ3Q äøF2’tõ70Ž+X’(wi"H}5‹ÙÑ16~¶}ÌȨVw¨UÀÏx¼n23&Ç•+ Ç8W$"ÖÌNåta»Û%g¹zWZ±Ü²Í®Ä‰ÿ O§†ÉŒe¼^¤´Î™7@Wl4Ò©%ïs}Puå¨ “o~E£Ò­'R2NÍRP[5y\vŸÓcê«\Gµ…aÂcêL“‰Ò?Û{ê™o°º®¹9“‘ÖYFÒÍZüZëŠkO`^‹Pz3rÉó ¢ðø HèmXÛ.wu¥a–•hľ{Ò/Õú±;a(®þ`((/K²û¡ÎÕ$¹ª>ì‘y%LHñ‘èðºt"{[²Ïü¢Ís¨×>5xIÆqÍŒþ*$ß ‹ZÅG¬­4òº$Z)¼›6IúW=U6 ç4Š›‘_mµÌÒzkk-Ö×Í/Ë$ƒ4‹†)â®°ËN²Z²ŸÒ•[]Žl^Å‹íÐI6˜]ûLt9Ü$qêFá[bðÓïæîKÞ8㈾)ç–—ûaprTdï±oòÅ‹@¹®wÙd‚åðÕ¾$Ã0*D¥|.®lÔêbCÕôídâ&ªß>ñT¿þñÚDOCÞÍ Dæ“ÍÏ/†âBƒ)¢Ÿð2 Ùjý¥Ö´÷ÇFZŸr9Ñ/}®³HnX8Îóc°ØdË»†f”oÑñ‹ ÎÍÖ$4 k¹ö„©6áRœMÞj½ ª™ºSHs‘ùÌãt°^Ìó–F]­¹…VˆK|1 ”ð½Á}dëEÃ.“U+ïrÃzö‚âkç`šIJ÷üöÑ!.òÀÚ*ÂÑÏqInɆ]Ëjk}-”³‘¦‡ä79»µm¿‹ l '31‰å£“‹¾þL‹ùo†…‘)ýQO÷®Qö‘ób?XNäÕŠ<†_)?é¡fç”DÞÀ{Š^OÕ›»x0­é]ø(˜ ÓYújð¹×áyžt$ꮓlçk’ÆF–Þä¥9íþLT>|ðŽÁJ»çúý'¤hu&йÒ-ß!|£Ã ŽŸÇÙQé¨Ä¾bŒ’˜q#‡D#']7\—S‰`„k¿9˜à¨Aú×o¿¶æR¾–$}Ôö öºè"ÓuõÑWéSN¼ü ßó”Õ)ØâëvuLÅ-WCEPL@jw­8Zø¯ÊJIW?I G”sÈ¢ùþ©W•ñåŽ+O}š˜×ü}ÊÒóú·ŠÛ‰tÚuwrqÛ}y­¼çÁzT"|Ò)óƒÞt\ÔûçW#%sº›ûxj®Bð» ¾Q¥ ”6 D±Ê‘ÆÕ'ø“ åT=²¢¥UÍóóoÒ9_->Ë’ÛÑ—¼ ‰Ó­%)Σ¾Ì5^ç¯íŽ`¸NhFzó/ëìÌ “šÁ,ò\åålûUŸ«Â󨮯é'nÞ>’ñhª>”ÑÂ9 ´ç+}™ëãé…är¿“,ñfì½ïîv³õ‰LÝô/{­”›gHå_ŠAPL(.˜F®ïu“ºY…e×r±Kî’G:­1ÿöã‚îgC˜§]:j]CÆA:"†4NɆ+Á‡DɺëžÇ®eÓ¥Ín.˜mtsØŸÇkÚÚ¡¯{ÓK³û½\ iY;µª}uÞ‚¤C¹Õ÷{£ð”tIŽž`Ë%%«ÒÐÕ'õeò ¡jJd|EÀ½`Ëvà‰ô?˜‰¡Æ»ËËO‚Â+±Œ¢8EÜœÆè¸à><³ø¸{Ï™Ïù‘lQß0ºÐ8Íù*ž;"Qzë×ñÃ#Æ‹•ÙOŠ=}s¡¿‡°ßæÏÅiY't'·+`±ÿˆ[.¿pÓ¹uä”rûrժÏ[“å]üB{Çò^¾Œà­²g9‡³"k11”œ£p4Kû¯}惼ÖיѢžÕ™ç< KBç_0ÝØ0ÜÂÁoK‚üÀÆ€¾ò›1‚qÂÝŠˆx½jù—l?à Z\QÈÏò°yd±¶3Œ"›­‚ÏvKˆØOcU'¨(ͪn‘³½íô׬Šª5®Öøsbo]ûC“OŒ‚UpÃQÚ@àüßæã»©.rø†K^ZzâP­:1d G–H¶È Úµ=ÁM>mÑê~Ú ›+´PcmVÈËáïÝŸ[A×.ÍŒ0¼˜a¹nfÎEP.`¤òŸC@”bðÈÊâ ßq¬ScÉÑ¥ußÚ&Càùè°oAP˜5š>é‹Â#àÎ?|=ò?v¬ØŠïxü%º°êX¸öf mÀ á²§îHÎC#E–‹†Wâ9!1õ-+Û|(ÙÑ0,ÚÐþ4M®p£m·”**ŒªÑu0Ÿ¬\qV#)ÏtŒ †é&ÜŠwF %fý Ê€uV Ö¬¦xŸ÷qñ኱Úoê ÞŒò³³)#:'©ç¼1 hAˆÑÚIÌ{pÅo]ÍÇâæu.À£ylKŸ¼å?"k¤Ïè“Íá“\Èzùë@¯rC3G×Ð5,9öÕȦïûT¤¸ 3uÈ¡J¼ìú™Â¤[|E5•\܇՟1Îú]KV|³º~G‰YonØý®«üÇ‚zz¦®SúÔN§7$÷uÔ•à&=œ{‘þës’±Ñ¥v’ŠuüüÊ6+ï¥;Q7ÄŽbnEáÄ&Ž’¹š°W:ãÍ/£0È´ƒƒ2*ã0däõ821*TîŠòLt __ÛI *®jâú l•u¢IÌVÁؘZGßè©Ißå¥B^í(^ :³¦t" w2^ÞåpwàJs %vI~H%ow™MÒàŸI@-²Þ ³êZ78&9H,Oê¯ÎŽ»Üsû¶Õ»³ñ·&øZ˜Æmé++LÃ0Ò[™¢Á%þ&¹òoU˜*Xú¦"u¯Q©†n–̤]øn)¦±*‰—á+š8a¡Ô‰(&RŸóª&¾;ÎÜ`/b n©-§L¸Ã˜®(}ý¾áˆ K…Ñh·w˜[¨… °¹BE‚ßç6d1 Öý3Séó¨1ý¥éÙ×üÑà`ÔR€6èv:ÿõ.:©E}äpÊ”áÉC²?$Ò¯¦šœÞ®ëlÃ!Tú!VÜyˆŒô'ÇæÝWHÐ2;Òd…Y…àD<µœeˆMñ±ÎÐqQÁaÖCbéäVc¬•…ñ -úÊðQ§åú0ê–S¸ÊØÄ6xaÓáà1q¤¶”ê„ÿµ{ÍøÐ?Õ:9‘Ô‚oý’ç8“gù†[„oøñ-þ-¨ÑÃEÂú*#am Ç?¯Eê\¡'ôº›é¡/, ©B©ºûâXEoò?d¼©B}©ß,½—ð˜:áÄïI@¢%&Û{½ã‹¡»1Â.RŸosúFsÆvtLÐëeil}mX`»øÂ£…¼»«ÿî™é‡¯ &¿ðù}6ïÁÞÏ#¢Y–\åûx±­â!ej(ïêsé.¯ò{!{ª+ø°4ØŠà¢>òe²‡ý«H· úOFƳ2Ãëù©REœm‹¨¢_¿¨©µŸpwZtªÅxu;éeöYVìÀ2#ÐX%DzæêUGLJF¨x#èòlU`Y.«“4T´®¸{±½'KÖç»Ñ¿Ïi!æíB> Q8“6‰myWÄD/K=úöšî_JslEÊUŒÆŒå|äûá}ùü³*|LèbýÛéÙ}6gV*_„pb\›ß%'çW²ýh±ðº‹Ý¡tðÖ8É êK‚Ê1ŽV#.œËøe뵄²ÈFm¾8Ae}ÎEÑ$ºƤJž‘‰ê>êV–°óP†£<í êiŽ÷ÄwõÜ‚]A(•@†>y‹—:3V“F=ž;rYUØ7®7Rv9„›»»Ë,µ<HïUô‰ã$¶=ZxáD°J† ãÏúèç5ÄFÆhÍ‹¡RÄô?ú¹*´NóØ¦Ž‘ø^õßù!5—U ÙJ¼µ-9Û:8ξIå45!œ jìB’Ê7ޱf ÿD«k?Ƚ6JШ25—Ù}1Åå)0!üõE:ÃÉ›„žÎä»›UOüÙUëOƒ´:·‹ë׌oŸª©÷à…­T@‘b‘gªecLdï0ô=Œ; $®PÛÏ㌠P¼]ÛÀX*[W], QbÆ‘®ôìoÅ|M”,—u§d^àv¹êû8E„ÚBÂj ˜c¥‰_7 «wîãîæÆõ#²Z0Ÿº‘ÅØ\(ø&[‰liP…‡‰€>Ûh#7ßD:¬Tmó1T×õ f_–2ø»ð܉¥tkW6ÚÓ÷F—arœüM)ïOþ8¢pdÄ7=ŸImª :¨^g—Æõ}6±º’ˆÉ!3¾üÆCçelš)£ëÖ`Ù§õv4?BŠö„$“žÚŠ<Ý Oäh®9,pÝà=A-dè3{³aõ´d…@‚;ÉüÕŽ·žòà›|7 ·TÍSíˆc¶¯–Óìæ›ï-¨f3äÚ;\ܤ™tºSÆnT“d‘³.k-p™BžµS‹Ã"¾Ò´ÖÜ”WJ\®t3Áõk\V2“ÈÆÎt½ƒ¼‘ÙM·YY6K»‘˜„2a%u±½–òL?QL…9üRuÑÅ`yóݬÆd|èá D0XÀ¾i`ì9–™FŸ ê¯ÆìB‚ìÑ=ºl¸IÈ`’QÍ_…\ãÙ¯í1P¬~|x´(Ìç—‚×o.¨sÙX§Hÿ$Ý›R%ZrÌ>$¯ýè5§*‚øáÄ貑¶Û»ì ¸úb‘wm”QÛ‘LŽZ¿Áíâg¤mÚÆ[0˜µ9•,¦ÙÌÈê—ìLìÎ:ñ¤^ìîýMˆ"=¡éHy R{)Sa–)ãÌ}½þ=ûé#DH‰Ç£6&J¿ÅAÝ2ê­Ã\E¦ooŠ Ö,‡…jKUUJ§DRxÛñfÁ{¶jëײ ´Ú‰½(½Ürs.kå;A&ªÜÂn#Œ….7zê%eèØTññ¯¥Œ‡ÔÚh7ök±}ÞrûüaÁ—؜ѳŽPÃá!ò&éþ®>:S•PSËøIûà¤&ÝÏXÂ2Ë`€S¯°Ì/¤íð[_´’®õ0Aª¬L –âLHOóº ¦ŠÍ9cdm/Æ<ŽøS(¨’Àdë%í¢D)E„Ú×€ÁUÓj/迪áôÜaõ<@ÆÕkÿlig²Üg€ZF¥Iìô’•Ÿ¶“=,,M¨Ò~êJà.s6ú{þ¨™Ö¸´"êžÅìÁs)oвøxС ÕFaI7ɽЋ#Žedîn¾•Ùy¤¾ÚŸ¬Ü%N`ø•`J䋲<Þ0zé¾åý%D&[ã'ÏjS]ÏÀø¸2iGÏe8³@¤{ükŽw³ ”¤kïÙZù]¼Ixÿ:&þˆ!…:@ÒµØQ¶²q´Îïh ™ó#ÁÌæƒ„¾7©e¶Éñ+–Ì©o§øI'„#Ä:gkx4ãuþÂ~g±|•¢¨«—·–÷B­ÜW6½T—iS§‡†x¹jÎ!ÀJš‚ãý¤™ÊBÆ2D°Ý<: °ð¿ÃÇ:­#§åœDÝMQ®T—í‘É‚´|‡zäBù:eDVBÅ[@1D‰ÊVù=ÊK~ÙQêxÞ`w>v&ÖK4[`¤Âý{öŠCBG”—)l˜—C*æpëíÖ›LûK&jog) ¿2Sx+r²ŠŽèSôWm¹N2ÄÓߘ¨Á¦=¼_æ9„D•nÒP–Ö¿ÞBê4&' žÆæ!ï©ôûïËØx\NlÔ½œo!Á ŸÓ [Gî÷XÕ#ƒÀÍðo7âDA_™ÒYèõvd¾ —õn×/„ó!«õö¸X‰Õtøb,yx! °Þ_±|&Øí¦ûYTBY5{øýûǘÁüŠ›•pÖ¡†‘Ó0è¼ÈÅ*]Û^•B;A?ß(ÝÁ üdþÑž®ò¥ä…XäCT¯È}§áb³%_w…‡ùÊ¡àYwÆ'*”“Þ~™£W\Ýšß”çÜPmè'wQÊ‘ÒQð\‡w÷R‚ö”òßlg½lÛpئmèK}ÑÜF”ØS™=M·}ž&”fRw6w÷ÌÜþÍê~å R²Cζ*SmˆN— Œ4‹•M¦D¼ÿ´]ËüÀEdý’Z­o ëòñw-‰ïgâÌõmƒYµ9SR3Ô=ϯw½ÈîrLN*w÷²>.ºgÀª³De²ß|4ïáÔG¦`TÜ,Áz]s‡°b¹Ó6ž‡’£ÇƒrøA&¦Mµ(®èéÛU8e&¨T5¡ÝDçˆùsGúÊä9búŠgY1³«óøz<·Ó«|˜eù~Ó9† tJ÷Û£•›^ŽÂøXUŽrODÂ¥lÃQ(›ßÒ¤ò-.–4©Œ")m9ÉSÓãbÉyaÕX¿?>ψõ½%Û·ÍYU Ýbmzƈš 7¬½5M“uËæiÌ|gAïËöý¢‚­ç¢wÓ§FzOÛDðSU{•92“ã®@rbŒóœLp|ÚH¡êß3Ø«µœŠ±õÙ7EnF þ.nKKÞ€øc’°Iæ×!ü®áLWA»'ZÚ=~&]ñ6yØ×M1¯|HÁ§q¼E¢7{Ï ›@—MœüO-mâ­ò0œ¯ïÈîQ“1aA’œ}£ËãbÈ¿g#OʺQRFl6¯E³†Ñ³-å®0êÕyÔ¥aLøG{~‚6¡#{LaAA>6qv6—Ç‘‡üŒy6IÎd,²³F«N”MV–ù¥_‰÷›ãAít}3 ðØ_Лu_ÃÀpž!Š?Úû÷³KmpâƒáU–h=°Ò‘I½ÙôÞý–ß_©YüÆh±Ç“qÖ]Þ1`¡±ž‘i¡AÀ<?!×@À哉©Óú»Ê„Þ\$ó­å©‘n®§Zƒ¾c€ÈÁú0ý×ÚGÛÚÉfñBd”Ç´üBè!Öc±Ÿ¥Š5¹ô¨{o(çˆüÛž«(É’ìKͽÉÅñ_ÑçùEŽzC¾‡‰h>¬Vœà ušhicõZÀ“ñáªEh#ôÔžäŽÕ8›×]‡,›•SómVˆÞ%^/ ®³Òîña4½õó[™‘©Po¡ôQeãχƒYL-V?µ_×}Ÿ¾QÞŠ6®=ó§¦+÷B ÕRð«ù±ôdL€&¿#ÿ~k ßi‚_¯o®wÊíbhSioF²'ûQeÝFlÀÀ>€™ÍÝÁëVç‘_—·û•¢qÄÄd¹9Ûð+;êø6»ù !4å#oHìÆ!¯ b<²=æV”¹ñ5Ú9ØdrG!ý.ZTÉœ"uÙ¹½Qçe°_GÙN_EõX7Ï8¨{ø£Sñæ¯h±,˜µµí  ©"ެÛ+bIÞ,®&!&¼âD<ªCåd¸°‰ëî»uUwRÒ`é•V dÏBÄÂÑÏËøð¢+vyì¹ßDXùt¤{øì nž& :+ë¥ØËtu{g¸>D7K AûöQ•&­vŠ~–rM°;¶Ã·’2Nõ’â[ÛÜÃ퓳O@®Š[Ø4Þ)²¦E„»Æ·à¤ :à×åÈDz{˜ú³7gÄ"X¬Ms¹ µ®Ÿé¦V ÛFÁæ²Ñ¤jdd’Qvãi>¤¼ê8ëÓÒV¢z°_Ó¸º›¼;vtmÀª¬TíŽßg>Ä#è}ç§uTÀŽª;4lô>ÂïN?¿uâ઀oü†¹™¹s€3’DLòh¿<èñ2eb†ßÛº®1ë9T>©É±º×t¦[YþZÒ/87¼ëÔ;åG0Ð'æ.v/ eÆìLXÍ_’þlÛ{õB;ü±‡]µà|¬u&L<{ª7áûÞ¢ª3ÅMó͹ߺș‰E±á[g̸Öýǯ]ƒ É)PŠÏÆ=v߇œÑ*å@Ïmi¥‡Q7ÇÈ& jPfWMÎò½ìG’uʘ£Ïªž Š½ÐœÖ;4OswHì í,ù‰?crÏõ®fuÔE× $3DŸ›ÓA6PÝvÿƒ&¸a¤g’…=K+_Ûve/°¡‡D@ûGq$dÙ¾!/uç§QõVbfKèTdmæÙ ÛaàüùÞ“MB¶r;O\Háê0ð~cs ÿé'Ç/J“L[˜òÃâ\qb"OaYÅ8:êm‚S?8z§oPãÖZ|+å¿ÂÌ{”÷ ]ß(u¥g ¯¢3`b©g¢ à ɼX³«øJ¿ý~p6&6ó·ËîÝÃánÊÐÀ¥*}.]n½¤[}Þ³cüô™ÎË·y®CúÓÊÅx%m* ]z%…˜8X z€Æ`Aã…X±ÙéQúh­=É*&r ­–çE&6ß,{Ô,Œ ÔÍ)Ü"¼y6$¸Î|wšë}C-ΧéS…£)æÅα˜·ßH,kœ¨_ðÍ)œªFvt—ágǺÙ^wËIšÔD> е‰Íf2ü0}=,m.¯žþáT2Àû³LÔ<Ä.øè¡F2Uâ¼P4Î@q9³‰Q·ÿ¬3nVg¡Z†·Ãgv¬þuõ@2×E¤X‚Ï‹§Œ_/1RÅ©tòÓõ+ïçË/[–V‹†k“°î›n\”8ó>›&Úe¡$W@€Œ%…˜1…ú¥ˆí “‘-¤L‘–pPˆ¦‰}•­0ů6h‚³#ŸYø S]„­5%ÓPÐ-#þŸ`ŸïÖ/?|zi¦ÄÚÖÖÈîήÃY׸ÖýXPðOð…@úI=BÏRcH¶Sá±"Ã<4~×ÃF«!ò œiBIõ›“…KÚî™ áòã”Ûù5ãq<°r·Rn¿|F©¢¨¡g©~‹4Ä £"ß /¤ÈF_Ô²"-IìtÐyÇÔ„\ÅDl+<`áffÀD<äìÉ™½5·Nƒ& ÆÉÖìú§º‰8Ò&§÷ó;$NÜ~aúXùzŸTÖ=HÄù™s·èµÍO¹ÞŸ®ÊÁ?]`ò&d/§¸ ‰d(ó«<òϯWFå€Dݶ¯\bõÓ0¸ ;t™ær;dѯ£ÁjѦµ}á±W™oâQ¯1ï¸gÂÒ6 ¢½4ïs¼(¬4¦¹Í4U7È©Ò&Mþ~÷¹/ÉÙ¸óŸ¡·äÌfK"üˆ¡’6š€Ìi–ùÐ.¾È¼úÀÎZ“´ÿk|Òöö¼½F†ÓÑ‹§ ·â¤ü‘.-bŠÊÝ·ÙŠ™¡+& *®4ì9üe< QÍÉyÜÅÆ"5€T=ytƒ¾ÞIÆBø/À·ÆY· «£ªy#¯þMý»à^;]Èø€™M@ée–gRc¬© GØáü½t=>)ÞÚ“8/»¡ck§0ÖGÁaØx#Õ¼Àoj³)œ:3ÂSK(uj+TÃÚ ’8);•_ü‘¥7¿"žÚýèÃö‡ÔºÚóð€Ù¿âKÝ ,Ç™uÎQ°-- MêmÀ·%¥º‚·ìNÚÎìy†çç†x€j ³Ã nÆÔ/òôŠJ‚·V/e¢ç_Q™7,Äbqј4…OgX´X‡Iùƒ ÖG,# ¤­<ØLÃÒŠ‰½js¡'MB’|ÿF[•3Â?D!Æ#±ŽUGa™œÂ<ïʞÃäØ+]ð^„‚Çë˲\v‹ÜÎfUýÇ<úž³òÎBè9s·8GÇÙ<]ŸÙAjºn°úïw%}rXCs¾a£Ð·„$ÆÿšÛ GÆG7¢’âd^wŽfm¡¼žÅ}*ÿ Z­J<ùR'v•xt"I¤¡yoÉã qÒÛxÑÿ™6vû–. (1Ç€*r×¾ncÙ¬ýŒùftÒÇtúÄ“m¯•¸ƒÊÖOà‚C>`ë¿–¹ÞÓZöƒÆFîã”Ù*Òô÷.¤›C½ –SðIT{?n<ΦJ*å=Ò8?«IÅG¸¥ÏRÙƒn¾Àiyå1¬®oÑ™Rð‰ä¸•˜2{Å—®5ˆ77õ˜L³æ–AÓyZ¿}F­³×E˜B¯`¾Q)9Ä–®M©¼tß ¯D1öÓ÷Ð\Å)'c)‘KÏI2η—i#žyrÇsLä‡jŸ]ÖÄí×@ÓX¬0”ÝdkKK·$b=[ ¼êŸç¼^ïyÄîË|I/‰¸Zª'ñŒ"±¥È:m—PXú;ôªGÁûŠCš“”â³Ê…¤ž aÃx,½‚XiÕчf/8ŸZZ|C†!G¾Ãû›x}~6`JÞP9Óß§0¤§\lYÏÂ+‹l]Ø-a,ÜAðO%DÖ`Ë®MliÁ¸ñV^Ç aËÁ Ž–9öAHôb⸲!û þ³U¥ÊU"°ø6 >Èc{ÐØ¿o\ ú¡ºNˆÒkâêW…|º»õ°™žIÚè¤9$ªv*8òÉÖU½ð ËjÄØÿ€IÍàN7磀~8„'¼Áð®½7òíO”á$24r‰l±X|ñ¤aVPà y6æ5$Tóµaò ý“©ç±UõÁ¨(#’F—½Y¬Ì!bg{ª°cæÄ%ß®>X€úäþ´ªd³ßó èÏåèX ù©%é0°m¤û÷c'Ú¨”n¬¹@·I+Ôˆ›-…âÒ²?!1 ‘ÿ¥©ÀD_㸒›ÎK\[@]¼p ¼X(*µžü:…Œ=² öÛ×$›.[k¶Ÿ¯¦¹™ìEQ4Û}¨mõ£ÚyŽ‚sœWÿŒ%þe¦[5ÓxÁTeýÀØznzÝ`}_þ9·Þ®Ô¶Èß!}õí¹_ùÎÀ¥ž·ÐT.”Æn§2ÞÄ_~¨ùPú®®:Qf$•êji=µ°Êð]ätíÔ¡!ƒHÂËCŸË/f I(S‘ ŸÒÐ#õ4SiK&ˆÞ¿Ü#— I‚¨ä$'º•}2m•ÿµÖø'_»¾DMŸö›õ•N±B[±¸y²•ëL<sG2TE[çÁ¥ô£Ò“½†…—@á‹%‘ýÝ ç‹ ”¢ÿ–°¸`EëÀ†H{}GÁ ”G°~ϼ/ø¼$ˆÎÑ¡²½^ÿ¦“®¨b:”_ÝJC>oD Ý¢ËÑ šêS ~´É~9–ƒI*1‡ËÊboüºZz=“.(¥À`bÓN ÿ­ÖeíW~òSÂf…Íø}_…@~(äŽÁqÝáe~@>m~ø˜,8—Æ:à+Ïk’;\ U¢Or ³äÁƒjÉUþƒ°xÔß«ÇEN•ò‹@ÝvöíÍñŠc°¹C5c¼Üù$9£®üñu Дvä6²™çáX µéFïO úê£ø(DìŽÆƒÆÒJ¨‘ úA‚µÈcriŒv¸Ô>è? Ylw^œ‹5ñc?p ÎÏMÿé½7,¢þL2åĸ Ò}ôöØóÞ¶ÚìÑÈÇvËÈÝûŽé‚ï‹\º¯ÌNÌù¶”M¹'ãÏäS²¸qœÊ«W÷‚LÃ2 4¯(¤ÂØÈWPQ„]ÚÐÛÂþô¤¹˜šÆq•N3ë¼AZòpðžV iϲ¤fIõ}><ÓO—*>RdÙ(„&‚~¸|³‹€ ÑÚ±vD r™åjé¤Vß#¡;vPþ˜Ž/³t£Ž1¯¾vÈèã¡ÿçáìŸ9ëÉŽÈŸÝ3RâîÕÖ60˃Ýý_QQæa Õ´ÁOgHŽï!Ã×àà`¡ìâ6îuÿWèm+b™ó zz,UžÙŒôŒò¸¶¤* 6‹=ׄŸÒØørž58÷ü¬²StLA§uwß ¬Xïbž?q~î¨P€)-wë_ ©‰B ï¹KÜ©°_/ Yæ:(Ól¾*`|-ò'†õ÷?<*Òîäòû¶žcZg©¨ßG¸Ï'µ’îXÒSÃì$Ó“ Hý’Ð6eÇ€4ˆY)vVf&ÏZ•%ïnN:ŠNfS(ØÁ%ÍnL¼Žàù îßÒhä‘xªãéqNch—ä0Ý ±À¹+÷`;GU–eþÛ° Õóaþ7Ð9é}ns{È‚J†˜—!çÞ(¾Ôÿ¾Lå ¼t3„_T&¹5FÌ«õå¡¥¾”½rЮ çý¬?äÞ=‚ówÿüéA¯`=jðs/BS¬‡Ä‘¡nØnØäÏRmû‹ø d mùÜÒŒ\ÁnN¼Pu5! ͬDûCc‹¿äÊRyèèu‹àBx+Õ5Áó±ò°€Ö(2)7Ì_±É4õÂ-‹a¿ç9M¹FăyÐkùµ,8í'"vÆ2’ ª8ë×÷¦î÷¦S£;¢[·å”wôðo´#h­¼¤Ü—„8OÌ,«Sm] È»P;c±0fÀuK­YßEX.h|YL,º^4á>™ÌçÊ7@stþÚ<$;d#ÜgÂ͔¾—ìŠ5èÝðÔe¨]géÒi)È´‚â€ÐØM ™·‰¼ó¼d!_ \94–¬°Þ¸¯Ñ÷V•ì(_†´7Ý´WåÊ*ã^ñZÖÍ>½Æ÷lµb]?Ì+|ÈÖg¨Ä£qE Ïñ °BÐÇîWvÑxû‚+ÉP)ÿ^w—ícžiÁ˜ˆìž ÜPð²ÿ5Sx´A¸¢7V!›æ²Mƒ9° _ÉI^ܟ˜뭟º´| 7/Í‹þ«›P`ˆÛÕD^ܱ ýØyãã'd÷FoÏHYÓ õc*º B¦ “yRŸâÞ,éçÒsÕŽó.8N2lµ9û—ýw…øw¾«ØÄõ˜š½ F|/ùøûÏ©ñâ0,0kÊü»ZŒœUIÎ.oa¢ŽtFkmRÝês‘+¥ŸÍÊõf 1N‡?¦ 'ܬy†eó²¾Îµ=r«5 ODЬXƒ!hjôý¦wTèsKÀᯭÊWq”µÆ§³è*#Úá*äþ5D$v—Žç;y6» endstream endobj 426 0 obj << /Type /FontDescriptor /FontName /JIGXPB+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/asciitilde/b/backslash/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/f/five/four/g/greater/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/question/quotedbl/r/s/semicolon/seven/six/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 425 0 R >> endobj 153 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UGJPMY+CMBX10 /FontDescriptor 398 0 R /FirstChar 12 /LastChar 121 /Widths 393 0 R >> endobj 151 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RSLNAE+CMBX12 /FontDescriptor 400 0 R /FirstChar 12 /LastChar 121 /Widths 394 0 R >> endobj 166 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EOWPMC+CMMI10 /FontDescriptor 402 0 R /FirstChar 13 /LastChar 121 /Widths 388 0 R >> endobj 167 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QOEQKK+CMMI7 /FontDescriptor 404 0 R /FirstChar 59 /LastChar 121 /Widths 387 0 R >> endobj 154 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XVBNFQ+CMR10 /FontDescriptor 406 0 R /FirstChar 11 /LastChar 122 /Widths 392 0 R >> endobj 150 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MDVGOD+CMR12 /FontDescriptor 408 0 R /FirstChar 44 /LastChar 121 /Widths 395 0 R >> endobj 149 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QYGDIU+CMR17 /FontDescriptor 410 0 R /FirstChar 65 /LastChar 119 /Widths 396 0 R >> endobj 171 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RHUHOI+CMR5 /FontDescriptor 412 0 R /FirstChar 49 /LastChar 50 /Widths 383 0 R >> endobj 168 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VFKEKQ+CMR7 /FontDescriptor 414 0 R /FirstChar 40 /LastChar 50 /Widths 386 0 R >> endobj 177 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KTQLRU+CMSLTT10 /FontDescriptor 416 0 R /FirstChar 33 /LastChar 126 /Widths 382 0 R >> endobj 163 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UVDAFI+CMSS10 /FontDescriptor 418 0 R /FirstChar 66 /LastChar 116 /Widths 391 0 R >> endobj 169 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WMHMNK+CMSY10 /FontDescriptor 420 0 R /FirstChar 0 /LastChar 103 /Widths 385 0 R >> endobj 170 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZQLTBN+CMSY7 /FontDescriptor 422 0 R /FirstChar 0 /LastChar 48 /Widths 384 0 R >> endobj 165 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DXNYJR+CMTI10 /FontDescriptor 424 0 R /FirstChar 11 /LastChar 122 /Widths 389 0 R >> endobj 164 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JIGXPB+CMTT10 /FontDescriptor 426 0 R /FirstChar 34 /LastChar 126 /Widths 390 0 R >> endobj 155 0 obj << /Type /Pages /Count 6 /Parent 427 0 R /Kids [118 0 R 160 0 R 174 0 R 180 0 R 185 0 R 195 0 R] >> endobj 205 0 obj << /Type /Pages /Count 6 /Parent 427 0 R /Kids [202 0 R 207 0 R 212 0 R 217 0 R 226 0 R 232 0 R] >> endobj 243 0 obj << /Type /Pages /Count 6 /Parent 427 0 R /Kids [240 0 R 245 0 R 249 0 R 253 0 R 258 0 R 264 0 R] >> endobj 272 0 obj << /Type /Pages /Count 6 /Parent 427 0 R /Kids [269 0 R 275 0 R 288 0 R 292 0 R 303 0 R 309 0 R] >> endobj 325 0 obj << /Type /Pages /Count 6 /Parent 427 0 R /Kids [316 0 R 327 0 R 335 0 R 339 0 R 343 0 R 348 0 R] >> endobj 359 0 obj << /Type /Pages /Count 3 /Parent 427 0 R /Kids [353 0 R 362 0 R 373 0 R] >> endobj 427 0 obj << /Type /Pages /Count 33 /Kids [155 0 R 205 0 R 243 0 R 272 0 R 325 0 R 359 0 R] >> endobj 428 0 obj << /Type /Outlines /First 3 0 R /Last 115 0 R /Count 13 >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R /Parent 428 0 R /Prev 79 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R /Parent 79 0 R /Prev 107 0 R >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 79 0 R /Prev 103 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 79 0 R /Prev 99 0 R /Next 107 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 79 0 R /Prev 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 79 0 R /Prev 91 0 R /Next 99 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 79 0 R /Prev 87 0 R /Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 79 0 R /Prev 83 0 R /Next 91 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 428 0 R /Prev 75 0 R /Next 115 0 R /First 83 0 R /Last 111 0 R /Count -8 >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 428 0 R /Prev 67 0 R /Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 67 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 428 0 R /Prev 59 0 R /Next 75 0 R /First 71 0 R /Last 71 0 R /Count -1 >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 59 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 428 0 R /Prev 51 0 R /Next 67 0 R /First 63 0 R /Last 63 0 R /Count -1 >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 51 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 428 0 R /Prev 43 0 R /Next 59 0 R /First 55 0 R /Last 55 0 R /Count -1 >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 43 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 428 0 R /Prev 35 0 R /Next 51 0 R /First 47 0 R /Last 47 0 R /Count -1 >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 35 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 428 0 R /Prev 27 0 R /Next 43 0 R /First 39 0 R /Last 39 0 R /Count -1 >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 27 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 428 0 R /Prev 19 0 R /Next 35 0 R /First 31 0 R /Last 31 0 R /Count -1 >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 19 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 428 0 R /Prev 11 0 R /Next 27 0 R /First 23 0 R /Last 23 0 R /Count -1 >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 11 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 428 0 R /Prev 7 0 R /Next 19 0 R /First 15 0 R /Last 15 0 R /Count -1 >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 428 0 R /Prev 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 428 0 R /Next 7 0 R >> endobj 429 0 obj << /Names [(Doc-Start) 148 0 R (Item.1) 188 0 R (Item.10) 236 0 R (Item.11) 237 0 R (Item.12) 238 0 R (Item.13) 261 0 R] /Limits [(Doc-Start) (Item.13)] >> endobj 430 0 obj << /Names [(Item.14) 262 0 R (Item.15) 278 0 R (Item.16) 279 0 R (Item.17) 280 0 R (Item.18) 306 0 R (Item.19) 307 0 R] /Limits [(Item.14) (Item.19)] >> endobj 431 0 obj << /Names [(Item.2) 189 0 R (Item.20) 312 0 R (Item.21) 313 0 R (Item.22) 314 0 R (Item.23) 319 0 R (Item.24) 320 0 R] /Limits [(Item.2) (Item.24)] >> endobj 432 0 obj << /Names [(Item.25) 321 0 R (Item.26) 322 0 R (Item.27) 323 0 R (Item.28) 324 0 R (Item.29) 330 0 R (Item.3) 198 0 R] /Limits [(Item.25) (Item.3)] >> endobj 433 0 obj << /Names [(Item.30) 331 0 R (Item.31) 332 0 R (Item.32) 333 0 R (Item.33) 346 0 R (Item.34) 351 0 R (Item.35) 356 0 R] /Limits [(Item.30) (Item.35)] >> endobj 434 0 obj << /Names [(Item.36) 357 0 R (Item.37) 358 0 R (Item.38) 365 0 R (Item.4) 220 0 R (Item.5) 221 0 R (Item.6) 222 0 R] /Limits [(Item.36) (Item.6)] >> endobj 435 0 obj << /Names [(Item.7) 223 0 R (Item.8) 224 0 R (Item.9) 235 0 R (cite.Durbin:1998) 377 0 R (cite.Haubold:2006) 378 0 R (cite.Malde:2008) 178 0 R] /Limits [(Item.7) (cite.Malde:2008)] >> endobj 436 0 obj << /Names [(cite.NeedWun:1970) 379 0 R (cite.Smith:2003) 380 0 R (cite.SmithWater:1981) 381 0 R (page.1) 147 0 R (page.10) 219 0 R (page.11) 228 0 R] /Limits [(cite.NeedWun:1970) (page.11)] >> endobj 437 0 obj << /Names [(page.12) 234 0 R (page.13) 242 0 R (page.14) 247 0 R (page.15) 251 0 R (page.16) 255 0 R (page.17) 260 0 R] /Limits [(page.12) (page.17)] >> endobj 438 0 obj << /Names [(page.18) 266 0 R (page.19) 271 0 R (page.2) 162 0 R (page.20) 277 0 R (page.21) 290 0 R (page.22) 294 0 R] /Limits [(page.18) (page.22)] >> endobj 439 0 obj << /Names [(page.23) 305 0 R (page.24) 311 0 R (page.25) 318 0 R (page.26) 329 0 R (page.27) 337 0 R (page.28) 341 0 R] /Limits [(page.23) (page.28)] >> endobj 440 0 obj << /Names [(page.29) 345 0 R (page.3) 176 0 R (page.30) 350 0 R (page.31) 355 0 R (page.32) 364 0 R (page.33) 375 0 R] /Limits [(page.29) (page.33)] >> endobj 441 0 obj << /Names [(page.4) 182 0 R (page.5) 187 0 R (page.6) 197 0 R (page.7) 204 0 R (page.8) 209 0 R (page.9) 214 0 R] /Limits [(page.4) (page.9)] >> endobj 442 0 obj << /Names [(section*.1) 152 0 R (section*.2) 376 0 R (section.1) 2 0 R (section.10) 66 0 R (section.11) 74 0 R (section.12) 78 0 R] /Limits [(section*.1) (section.12)] >> endobj 443 0 obj << /Names [(section.13) 114 0 R (section.2) 6 0 R (section.3) 10 0 R (section.4) 18 0 R (section.5) 26 0 R (section.6) 34 0 R] /Limits [(section.13) (section.6)] >> endobj 444 0 obj << /Names [(section.7) 42 0 R (section.8) 50 0 R (section.9) 58 0 R (subsection.10.1) 70 0 R (subsection.12.1) 82 0 R (subsection.12.2) 86 0 R] /Limits [(section.7) (subsection.12.2)] >> endobj 445 0 obj << /Names [(subsection.12.3) 90 0 R (subsection.12.4) 94 0 R (subsection.12.5) 98 0 R (subsection.12.6) 102 0 R (subsection.12.7) 106 0 R (subsection.12.8) 110 0 R] /Limits [(subsection.12.3) (subsection.12.8)] >> endobj 446 0 obj << /Names [(subsection.3.1) 14 0 R (subsection.4.1) 22 0 R (subsection.5.1) 30 0 R (subsection.6.1) 38 0 R (subsection.7.1) 46 0 R (subsection.8.1) 54 0 R] /Limits [(subsection.3.1) (subsection.8.1)] >> endobj 447 0 obj << /Names [(subsection.9.1) 62 0 R (table.1) 199 0 R (table.2) 210 0 R (table.3) 200 0 R] /Limits [(subsection.9.1) (table.3)] >> endobj 448 0 obj << /Kids [429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R] /Limits [(Doc-Start) (Item.6)] >> endobj 449 0 obj << /Kids [435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R] /Limits [(Item.7) (page.33)] >> endobj 450 0 obj << /Kids [441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R] /Limits [(page.4) (subsection.8.1)] >> endobj 451 0 obj << /Kids [447 0 R] /Limits [(subsection.9.1) (table.3)] >> endobj 452 0 obj << /Kids [448 0 R 449 0 R 450 0 R 451 0 R] /Limits [(Doc-Start) (table.3)] >> endobj 453 0 obj << /Dests 452 0 R >> endobj 454 0 obj << /Type /Catalog /Pages 427 0 R /Outlines 428 0 R /Names 453 0 R /PageMode/UseOutlines /OpenAction 117 0 R >> endobj 455 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() /CreationDate (D:20131113202012-08'00') /ModDate (D:20131113202012-08'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 456 0000000000 65535 f 0000000015 00000 n 0000012588 00000 n 0000318349 00000 n 0000000060 00000 n 0000000090 00000 n 0000012645 00000 n 0000318265 00000 n 0000000135 00000 n 0000000189 00000 n 0000017035 00000 n 0000318142 00000 n 0000000234 00000 n 0000000294 00000 n 0000023249 00000 n 0000318081 00000 n 0000000345 00000 n 0000000374 00000 n 0000023424 00000 n 0000317956 00000 n 0000000420 00000 n 0000000474 00000 n 0000026376 00000 n 0000317895 00000 n 0000000525 00000 n 0000000554 00000 n 0000026492 00000 n 0000317770 00000 n 0000000600 00000 n 0000000663 00000 n 0000035381 00000 n 0000317709 00000 n 0000000714 00000 n 0000000743 00000 n 0000038176 00000 n 0000317584 00000 n 0000000789 00000 n 0000000822 00000 n 0000041189 00000 n 0000317523 00000 n 0000000873 00000 n 0000000902 00000 n 0000041365 00000 n 0000317398 00000 n 0000000948 00000 n 0000001027 00000 n 0000041423 00000 n 0000317337 00000 n 0000001078 00000 n 0000001107 00000 n 0000043756 00000 n 0000317212 00000 n 0000001153 00000 n 0000001222 00000 n 0000052611 00000 n 0000317151 00000 n 0000001273 00000 n 0000001302 00000 n 0000052787 00000 n 0000317026 00000 n 0000001348 00000 n 0000001423 00000 n 0000063343 00000 n 0000316965 00000 n 0000001474 00000 n 0000001503 00000 n 0000063578 00000 n 0000316840 00000 n 0000001550 00000 n 0000001590 00000 n 0000073293 00000 n 0000316779 00000 n 0000001642 00000 n 0000001671 00000 n 0000073468 00000 n 0000316691 00000 n 0000001718 00000 n 0000001775 00000 n 0000075365 00000 n 0000316564 00000 n 0000001822 00000 n 0000001857 00000 n 0000075423 00000 n 0000316490 00000 n 0000001909 00000 n 0000001938 00000 n 0000075598 00000 n 0000316403 00000 n 0000001990 00000 n 0000002019 00000 n 0000077654 00000 n 0000316316 00000 n 0000002071 00000 n 0000002100 00000 n 0000078007 00000 n 0000316229 00000 n 0000002152 00000 n 0000002181 00000 n 0000080436 00000 n 0000316140 00000 n 0000002233 00000 n 0000002263 00000 n 0000080612 00000 n 0000316049 00000 n 0000002316 00000 n 0000002346 00000 n 0000087746 00000 n 0000315957 00000 n 0000002399 00000 n 0000002429 00000 n 0000090661 00000 n 0000315879 00000 n 0000002482 00000 n 0000002512 00000 n 0000099338 00000 n 0000315801 00000 n 0000002560 00000 n 0000002599 00000 n 0000003832 00000 n 0000004156 00000 n 0000004307 00000 n 0000004458 00000 n 0000004609 00000 n 0000004765 00000 n 0000004916 00000 n 0000005072 00000 n 0000005223 00000 n 0000005379 00000 n 0000005530 00000 n 0000005686 00000 n 0000005837 00000 n 0000005992 00000 n 0000006143 00000 n 0000006298 00000 n 0000006449 00000 n 0000006605 00000 n 0000006757 00000 n 0000006914 00000 n 0000007066 00000 n 0000007218 00000 n 0000007374 00000 n 0000007531 00000 n 0000007687 00000 n 0000007844 00000 n 0000011907 00000 n 0000008175 00000 n 0000002651 00000 n 0000007999 00000 n 0000008057 00000 n 0000313658 00000 n 0000313515 00000 n 0000312941 00000 n 0000008116 00000 n 0000312797 00000 n 0000313372 00000 n 0000314945 00000 n 0000012064 00000 n 0000012221 00000 n 0000012378 00000 n 0000012702 00000 n 0000011751 00000 n 0000008298 00000 n 0000012530 00000 n 0000314229 00000 n 0000314801 00000 n 0000314657 00000 n 0000313085 00000 n 0000313229 00000 n 0000313942 00000 n 0000314373 00000 n 0000314516 00000 n 0000313801 00000 n 0000016819 00000 n 0000017093 00000 n 0000016687 00000 n 0000012914 00000 n 0000016977 00000 n 0000314083 00000 n 0000099574 00000 n 0000020580 00000 n 0000020410 00000 n 0000017267 00000 n 0000020522 00000 n 0000023033 00000 n 0000023482 00000 n 0000022901 00000 n 0000020754 00000 n 0000023191 00000 n 0000023307 00000 n 0000023365 00000 n 0000025712 00000 n 0000025870 00000 n 0000026019 00000 n 0000026168 00000 n 0000026550 00000 n 0000025556 00000 n 0000023618 00000 n 0000026318 00000 n 0000026434 00000 n 0000028667 00000 n 0000035319 00000 n 0000028729 00000 n 0000028497 00000 n 0000026712 00000 n 0000028609 00000 n 0000315062 00000 n 0000030927 00000 n 0000030695 00000 n 0000028839 00000 n 0000030807 00000 n 0000030865 00000 n 0000032484 00000 n 0000032314 00000 n 0000031037 00000 n 0000032426 00000 n 0000035105 00000 n 0000035734 00000 n 0000034973 00000 n 0000032594 00000 n 0000035261 00000 n 0000035439 00000 n 0000035498 00000 n 0000035557 00000 n 0000035616 00000 n 0000035675 00000 n 0000038234 00000 n 0000038006 00000 n 0000035857 00000 n 0000038118 00000 n 0000040817 00000 n 0000040975 00000 n 0000041599 00000 n 0000040677 00000 n 0000038370 00000 n 0000041131 00000 n 0000041247 00000 n 0000041306 00000 n 0000041481 00000 n 0000041540 00000 n 0000043814 00000 n 0000043586 00000 n 0000041735 00000 n 0000043698 00000 n 0000315179 00000 n 0000046160 00000 n 0000045990 00000 n 0000043924 00000 n 0000046102 00000 n 0000047896 00000 n 0000047726 00000 n 0000046257 00000 n 0000047838 00000 n 0000049804 00000 n 0000049634 00000 n 0000047993 00000 n 0000049746 00000 n 0000052395 00000 n 0000052844 00000 n 0000052263 00000 n 0000049901 00000 n 0000052553 00000 n 0000052669 00000 n 0000052728 00000 n 0000055194 00000 n 0000055024 00000 n 0000052980 00000 n 0000055136 00000 n 0000058523 00000 n 0000056986 00000 n 0000056816 00000 n 0000055317 00000 n 0000056928 00000 n 0000315296 00000 n 0000063127 00000 n 0000063636 00000 n 0000058391 00000 n 0000057096 00000 n 0000063285 00000 n 0000063401 00000 n 0000063460 00000 n 0000063519 00000 n 0000059905 00000 n 0000060049 00000 n 0000060149 00000 n 0000060186 00000 n 0000060429 00000 n 0000066178 00000 n 0000064963 00000 n 0000064793 00000 n 0000063774 00000 n 0000064905 00000 n 0000070523 00000 n 0000066066 00000 n 0000065060 00000 n 0000070465 00000 n 0000067138 00000 n 0000067282 00000 n 0000067382 00000 n 0000067487 00000 n 0000067524 00000 n 0000067767 00000 n 0000073077 00000 n 0000073526 00000 n 0000072945 00000 n 0000070661 00000 n 0000073235 00000 n 0000073351 00000 n 0000073409 00000 n 0000075715 00000 n 0000075195 00000 n 0000073649 00000 n 0000075307 00000 n 0000075480 00000 n 0000075539 00000 n 0000075656 00000 n 0000078124 00000 n 0000077484 00000 n 0000075838 00000 n 0000077596 00000 n 0000077712 00000 n 0000077771 00000 n 0000077830 00000 n 0000077889 00000 n 0000077948 00000 n 0000078065 00000 n 0000315413 00000 n 0000080730 00000 n 0000080207 00000 n 0000078234 00000 n 0000080319 00000 n 0000080377 00000 n 0000080494 00000 n 0000080553 00000 n 0000080671 00000 n 0000082485 00000 n 0000082315 00000 n 0000080853 00000 n 0000082427 00000 n 0000084103 00000 n 0000083933 00000 n 0000082582 00000 n 0000084045 00000 n 0000085923 00000 n 0000085694 00000 n 0000084200 00000 n 0000085806 00000 n 0000085864 00000 n 0000087864 00000 n 0000087576 00000 n 0000086020 00000 n 0000087688 00000 n 0000087805 00000 n 0000090779 00000 n 0000090373 00000 n 0000087974 00000 n 0000090485 00000 n 0000090543 00000 n 0000090602 00000 n 0000090720 00000 n 0000315530 00000 n 0000092329 00000 n 0000096709 00000 n 0000092217 00000 n 0000090915 00000 n 0000096592 00000 n 0000096650 00000 n 0000093265 00000 n 0000093409 00000 n 0000093509 00000 n 0000093614 00000 n 0000093651 00000 n 0000093894 00000 n 0000099809 00000 n 0000099168 00000 n 0000096847 00000 n 0000099280 00000 n 0000099397 00000 n 0000099456 00000 n 0000099515 00000 n 0000099633 00000 n 0000099691 00000 n 0000099750 00000 n 0000099945 00000 n 0000100340 00000 n 0000100371 00000 n 0000100697 00000 n 0000101297 00000 n 0000101380 00000 n 0000101778 00000 n 0000102401 00000 n 0000103070 00000 n 0000103461 00000 n 0000103776 00000 n 0000104399 00000 n 0000105026 00000 n 0000105663 00000 n 0000106093 00000 n 0000106438 00000 n 0000124394 00000 n 0000124742 00000 n 0000140571 00000 n 0000140926 00000 n 0000151664 00000 n 0000151952 00000 n 0000161326 00000 n 0000161576 00000 n 0000186721 00000 n 0000187263 00000 n 0000200651 00000 n 0000200950 00000 n 0000211161 00000 n 0000211411 00000 n 0000218581 00000 n 0000218805 00000 n 0000226485 00000 n 0000226740 00000 n 0000246668 00000 n 0000247231 00000 n 0000255764 00000 n 0000256003 00000 n 0000264135 00000 n 0000264428 00000 n 0000271499 00000 n 0000271730 00000 n 0000290718 00000 n 0000291054 00000 n 0000312238 00000 n 0000315623 00000 n 0000315725 00000 n 0000318420 00000 n 0000318593 00000 n 0000318763 00000 n 0000318931 00000 n 0000319099 00000 n 0000319269 00000 n 0000319435 00000 n 0000319636 00000 n 0000319846 00000 n 0000320016 00000 n 0000320185 00000 n 0000320355 00000 n 0000320524 00000 n 0000320686 00000 n 0000320874 00000 n 0000321056 00000 n 0000321260 00000 n 0000321491 00000 n 0000321711 00000 n 0000321858 00000 n 0000321968 00000 n 0000322076 00000 n 0000322191 00000 n 0000322267 00000 n 0000322362 00000 n 0000322400 00000 n 0000322528 00000 n trailer << /Size 456 /Root 454 0 R /Info 455 0 R /ID [ ] >> startxref 322854 %%EOF Biostrings/inst/doc/SolexaYi2-benchmark.txt0000644000126300012640000004046712227063322022324 0ustar00biocbuildphs_compbioSome PDict()/matchPDict() benchmarks using Yi's second Solexa data set ====================================================================== "Yi's second data set" is originally available at: lamprey:/mnt/fred/solexa/ycao/080623_HWI-EAS88_0001/ Lane1. Myoblasts IPed with 7311 Antibody Lane2: Myotubes IPed with 7311 Antibody Lane3. Myoblasts IPed with 6975 Antibody Lane4: Myotubes IPed with 6975 Antibody Lane5: phiX control Lane6. Myoblasts IPed with 6196 Antibody Lane7: Myotubes IPed with 6196 Antibody Lane8: Myotubes IPed with preimmune serum =============================================================================== On george1 (16G of RAM, 8 CPUs) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8 lanes together ---------------- After cleaning, dict0 is 35567623 x 35. > library(ShortRead) > path0 <- "~/SolexaYi2" > list.files(path=path0, pattern="^s_._sequence.txt$") # 8 lanes [1] "s_1_sequence.txt" "s_2_sequence.txt" "s_3_sequence.txt" "s_4_sequence.txt" [5] "s_5_sequence.txt" "s_6_sequence.txt" "s_7_sequence.txt" "s_8_sequence.txt" ## Loading and cleaning > system.time(rfq <- readFastq(path0, pattern="^s_._sequence.txt$")) user system elapsed 382.303 21.193 414.080 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 442339 23.7 83093856 4437.7 107396566 5735.6 Vcells 528200241 4029.9 1715252697 13086.4 1704641212 13005.4 > system.time(dict0 <- clean(sread(rfq))) user system elapsed 5.892 0.804 31.320 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 445623 23.8 53180067 2840.2 107396566 5735.6 Vcells 563768713 4301.3 1715252697 13086.4 1704641212 13005.4 ## Preprocessing > pdict0 <- PDict(dict0) # ERROR: Trusted Band is too big! > pdict1 <- PDict(dict0, max.mismatch=1) # takes forever (lots of swapping) lane 1 only ----------- After cleaning, dict0 is 4469757 x 35. > library(ShortRead) > path0 <- "~/SolexaYi2" ## Loading and cleaning > system.time(rfq <- readFastq(path0, pattern="s_1_sequence.txt")) user system elapsed 44.450 2.120 49.867 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 442269 23.7 10798339 576.7 13860972 740.3 Vcells 66506225 507.5 215613665 1645.1 214056559 1633.2 > system.time(dict0 <- clean(sread(rfq))) user system elapsed 0.793 0.000 0.791 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 443715 23.7 6910936 369.1 13860972 740.3 Vcells 70976449 541.6 215613665 1645.1 214056559 1633.2 ## Preprocessing for exact matching > system.time(pdict0 <- PDict(dict0)) user system elapsed 14.520 2.856 17.385 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 874117 46.7 2830718 151.2 13860972 740.3 Vcells 442722844 3377.8 569051730 4341.6 515966682 3936.6 ## This shows that the size of pdict0 is about 2837 Mb (unreliable ## object.size() reports 3448 Mb). ## Preprocessing for max.mismatching=1 > system.time(pdict1 <- PDict(dict0, max.mismatch=1)) user system elapsed 26.966 2.164 29.130 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 1894849 101.2 4065505 217.2 13860972 740.3 Vcells 684867192 5225.2 1023208512 7806.5 797303398 6083.0 ## This shows that the size of pdict1 is about 1848 Mb (unreliable ## object.size() reports 2928 Mb). ## Preprocessing for max.mismatching=2 > system.time(pdict2 <- PDict(dict0, max.mismatch=2)) user system elapsed 56.760 1.532 58.288 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 4409170 235.5 9820776 524.5 13860972 740.3 Vcells 815612649 6222.7 1371741416 10465.6 977847099 7460.4 ## This shows that the size of pdict2 is about 998 Mb (unreliable ## object.size() reports 2582 Mb). ## Preprocessing for max.mismatching=3 > system.time(pdict3 <- PDict(dict0, max.mismatch=3)) user system elapsed 29.694 2.656 32.349 Warning message: In .MTB_PDict(x, max.mismatch, type) : given the characteristics of dictionary 'x', this value of 'max.mismatch' will give poor (or very poor) performance when you use this MTB_PDict with matchPDict() (it will of course depend on the length of the subject) > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 5555999 296.8 10351814 552.9 13860972 740.3 Vcells 922524858 7038.4 1440408486 10989.5 1370974508 10459.8 ## This shows that the size of pdict3 is about 816 Mb (unreliable ## object.size() reports 2800 Mb). ## Loading Mouse chr1 > library(BSgenome.Mmusculus.UCSC.mm9) > chr1 <- Mmusculus$chr1 ## Exact matching > system.time(m0 <- matchPDict(pdict0, chr1)) user system elapsed 51.455 0.956 52.410 > object.size(m0)/1024/1024 [1] 468.3648 > system.time(cm0 <- countIndex(m0)) user system elapsed 23.217 0.000 23.218 > sum(cm0) [1] 110578790 ## Matching with max.mismatch=1 > system.time(m1 <- matchPDict(pdict1, chr1, max.mismatch=1)) user system elapsed 641.280 4.552 649.840 > object.size(m1)/1024/1024 [1] 1038.721 > system.time(cm1 <- countIndex(m1)) user system elapsed 11.412 0.072 13.297 > sum(cm1) [1] 258783032 > sum(cm0 == 0 & cm1 != 0) [1] 118600 ## Matching with max.mismatch=2 > system.time(m2 <- matchPDict(pdict2, chr1, max.mismatch=2)) user system elapsed 12290.748 42.695 12442.805 > object.size(m2)/1024/1024 [1] 2007.031 > system.time(cm2 <- countIndex(m2)) user system elapsed 8.116 0.416 56.458 > sum(cm2) [1] 511651541 ## Some sanity checking m10 <- matchPDict(pdict1, chr1, max.mismatch=0) identical(m10, m0) m20 <- matchPDict(pdict2, chr1, max.mismatch=0) identical(m20, m0) m30 <- matchPDict(pdict3, chr1, max.mismatch=0) identical(m30, m0) m21 <- matchPDict(pdict2, chr1, max.mismatch=1) identical(m21, m1) m31 <- matchPDict(pdict3, chr1, max.mismatch=1) identical(m31, m1) m32 <- matchPDict(pdict3, chr1, max.mismatch=2) identical(m32, m2) > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 6776903 362.0 19227046 1026.9 19227046 1026.9 Vcells 1413290587 10782.6 4217248080 32175.1 3591384996 27400.1 ## Max used was 27400.1 Mb so with only 16G of RAM there was a lot ## of swapping! > sessionInfo() R version 2.8.0 Under development (unstable) (2008-06-17 r45946) x86_64-unknown-linux-gnu locale: LC_CTYPE=en_CA.UTF-8;LC_NUMERIC=C;LC_TIME=en_CA.UTF-8;LC_COLLATE=en_CA.UTF-8;LC_MONETARY=C;LC_MESSAGES=en_CA.UTF-8;LC_PAPER=en_CA.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_CA.UTF-8;LC_IDENTIFICATION=C attached base packages: [1] tools stats graphics grDevices utils datasets methods [8] base other attached packages: [1] BSgenome.Mmusculus.UCSC.mm9_1.3.7 BSgenome_1.9.3 [3] ShortRead_0.1.26 lattice_0.17-8 [5] Biobase_2.1.7 Biostrings_2.9.31 loaded via a namespace (and not attached): [1] grid_2.8.0 =============================================================================== On lamprey (128G of RAM, 16 CPUs) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ lane 1 only ----------- After cleaning, dict0 is 4469757 x 35. > library(ShortRead) > path0 <- "." ## Loading and cleaning > system.time(rfq <- readFastq(path0, pattern="s_1_sequence.txt")) user system elapsed 58.147 2.572 81.392 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 428340 22.9 10798339 576.7 13844467 739.4 Vcells 66500371 507.4 215606846 1645.0 214050084 1633.1 > system.time(dict0 <- clean(sread(rfq))) user system elapsed 0.788 0.000 0.789 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 428828 23.0 6910936 369.1 13844467 739.4 Vcells 70970334 541.5 215606846 1645.0 214050084 1633.1 ## Preprocessing for exact matching > system.time(pdict0 <- PDict(dict0)) user system elapsed 17.834 2.688 20.520 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 861818 46.1 2830718 151.2 13844467 739.4 Vcells 442717290 3377.7 569044281 4341.5 515961030 3936.5 ## This shows that the size of pdict0 is about 2837 Mb (unreliable ## object.size() reports 3448 Mb). ## Preprocessing for max.mismatching=1 > system.time(pdict1 <- PDict(dict0, max.mismatch=1)) user system elapsed 32.982 1.960 34.945 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 1841306 98.4 3833815 204.8 13844467 739.4 Vcells 684845356 5225.0 974395366 7434.1 797342043 6083.3 ## This shows that the size of pdict1 is about 1848 Mb (unreliable ## object.size() reports 2928 Mb). ## Preprocessing for max.mismatching=2 > system.time(pdict2 <- PDict(dict0, max.mismatch=2)) user system elapsed 73.860 1.760 75.619 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 4355627 232.7 9820776 524.5 13844467 739.4 Vcells 815590813 6222.5 1371723488 10465.5 966735831 7375.7 ## This shows that the size of pdict2 is about 998 Mb (unreliable ## object.size() reports 2582 Mb). ## Preprocessing for max.mismatching=3 > system.time(pdict3 <- PDict(dict0, max.mismatch=3)) user system elapsed 34.590 3.068 37.657 Warning message: In .MTB_PDict(x, max.mismatch, type) : given the characteristics of dictionary 'x', this value of 'max.mismatch' will give poor (or very poor) performance when you use this MTB_PDict with matchPDict() (it will of course depend on the length of the subject) > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 5502456 293.9 9820776 524.5 13844467 739.4 Vcells 922503022 7038.2 1371723488 10465.5 1370952672 10459.6 ## This shows that the size of pdict3 is about 816 Mb (unreliable ## object.size() reports 2800 Mb). ## Loading Mouse chr1 > library(BSgenome.Mmusculus.UCSC.mm9) > chr1 <- Mmusculus$chr1 ## Exact matching > system.time(m0 <- matchPDict(pdict0, chr1)) user system elapsed 60.604 0.024 60.628 > object.size(m0)/1024/1024 [1] 468.3648 > system.time(cm0 <- countIndex(m0)) user system elapsed 30.946 0.000 30.945 > sum(cm0) [1] 110578790 ## Matching with max.mismatch=1 > system.time(m1 <- matchPDict(pdict1, chr1, max.mismatch=1)) user system elapsed 643.588 3.665 647.242 > object.size(m1)/1024/1024 [1] 1038.721 > system.time(cm1 <- countIndex(m1)) user system elapsed 12.153 0.024 12.180 > sum(cm1) [1] 258783032 > sum(cm0 == 0 & cm1 != 0) [1] 118600 ## Matching with max.mismatch=2 > system.time(m2 <- matchPDict(pdict2, chr1, max.mismatch=2)) user system elapsed 16388.369 14.624 16402.895 > object.size(m2)/1024/1024 [1] 2007.031 > system.time(cm2 <- countIndex(m2)) user system elapsed 9.944 0.028 9.973 > sum(cm2) [1] 511651541 > gc() used (Mb) gc trigger (Mb) max used (Mb) Ncells 6748852 360.5 19227046 1026.9 19227046 1026.9 Vcells 1408812643 10748.4 4217175576 32174.5 3584563517 27348.1 > sessionInfo() R version 2.8.0 Under development (unstable) (2008-05-13 r45683) x86_64-unknown-linux-gnu locale: LC_CTYPE=en_CA.UTF-8;LC_NUMERIC=C;LC_TIME=en_CA.UTF-8;LC_COLLATE=en_CA.UTF-8;LC_MONETARY=C;LC_MESSAGES=en_CA.UTF-8;LC_PAPER=en_CA.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_CA.UTF-8;LC_IDENTIFICATION=C attached base packages: [1] tools stats graphics grDevices utils datasets methods [8] base other attached packages: [1] BSgenome.Mmusculus.UCSC.mm9_1.3.6 BSgenome_1.9.1 [3] ShortRead_0.1.26 lattice_0.17-7 [5] Biobase_2.1.3 Biostrings_2.9.31 loaded via a namespace (and not attached): [1] grid_2.8.0 =============================================================================== Summary for lane 1 / Mouse chr1+ -------------------------------- NM0 <- cm0 NM1 <- cm1 - NM0 NM2 <- cm2 - NM1 ================================================== NM0 | NM1 | NM2 | NM3 | nb of reads | % of reads ================================================== > 1 | any | 186274 4.17% -----|-----------------|-------------------------- = 1 | any | 106373 2.38% -----|-----------------|-------------------------- | > 1 | any | 76754 1.72% |-----|-----------|-------------------------- | = 1 | any | 41846 0.94% |-----|-----------|-------------------------- | | > 1 | any | 53419 1.20% | |-----|-----|-------------------------- = 0 | | = 1 | any | 33474 0.75% | |-----|-----|-------------------------- | = 0 | | > 1 | | | |-----| | | = 0 | = 1 | 3971617 88.86% | | |-----| | | | = 0 | -----------------------|-------------------------- T O T A L | 4469757 100.00% ================================================== =============================================================================== More benchmarks --------------- on george1: library(BSgenome.Mmusculus.UCSC.mm9) chr1 <- unmasked(Mmusculus$chr1) library(ShortRead) path0 <- "~hpages/SolexaYi2" rfq <- readFastq(path0, pattern="s_1_sequence.txt") dict0 <- clean(sread(rfq)) pdict10 <- PDict(dict0[1:1000]) pdict11 <- PDict(dict0[1:1000], max.mismatch=1) pdict12 <- PDict(dict0[1:1000], max.mismatch=2) pdict13 <- PDict(dict0[1:1000], max.mismatch=3) pdict20 <- PDict(dict0[1:10000]) pdict21 <- PDict(dict0[1:10000], max.mismatch=1) pdict22 <- PDict(dict0[1:10000], max.mismatch=2) pdict23 <- PDict(dict0[1:10000], max.mismatch=3) pdict30 <- PDict(dict0[1:100000]) pdict31 <- PDict(dict0[1:100000], max.mismatch=1) pdict32 <- PDict(dict0[1:100000], max.mismatch=2) pdict33 <- PDict(dict0[1:100000], max.mismatch=3) pdict40 <- PDict(dict0[1:1000000]) pdict41 <- PDict(dict0[1:1000000], max.mismatch=1) pdict42 <- PDict(dict0[1:1000000], max.mismatch=2) pdict43 <- PDict(dict0[1:1000000], max.mismatch=3) | | | | | | avg nb of matches | | | | nb of reads | total nb | for reads with dict | subject | max.mismatch | time | with matches | of matches | matches -------------------------------------------------------------------------------------------------------- dict0[1:1000] | Mouse chr1+ | 0 | 1.673 | 68 | 8273 | 121.6618 | | 1 | 12.987 | 111 | 24408 | 219.8919 | | 2 | 38.301 | 131 | 45897 | 350.3588 | | 3 | 158.322 | 151 | 105827 | 700.841 -------------------------------------------------------------------------------------------------------- dict0[1:10000] | Mouse chr1+ | 0 | 2.995 | 645 | 85745 | 132.9380 | | 1 | 40.133 | 938 | 220686 | 235.2729 | | 2 | 137.215 | 1154 | 416988 | 361.3414 | | 3 | 494.440 | 1315 | 762942 | 580.184 -------------------------------------------------------------------------------------------------------- dict0[1:100000] | Mouse chr1+ | 0 | 15.534 | 6448 | 1695089 | 262.886 | | 1 | 76.388 | 9220 | 4618443 | 500.9157 | | 2 | 224.011 | 11206 | 9319253 | 831.6306 | | 3 | 1204.326 | 13037 | 16226338 | 1244.637 -------------------------------------------------------------------------------------------------------- dict0[1:1000000] | Mouse chr1+ | 0 | 32.423 | 64249 | 20751467 | 322.9851 | | 1 | 148.992 | 90811 | 51550694 | 567.6702 | | 2 | 1120.742 | 110296 | 102207683 | 926.6672 | | 3 | 2457.180 | 127862 | 176974849 | 1384.108 -------------------------------------------------------------------------------------------------------- Biostrings/inst/doc/matchprobes.R0000644000126300012640000000712012241047607020437 0ustar00biocbuildphs_compbio### R code from vignette source 'matchprobes.Rnw' ################################################### ### code chunk number 1: startup ################################################### library(Biostrings) library(hgu95av2probe) library(hgu95av2cdf) ################################################### ### code chunk number 2: matchprobes ################################################### pm <- DNAStringSet(hgu95av2probe) dict <- pm[3801:4000] pdict <- PDict(dict) m <- vcountPDict(pdict, pm) dim(m) table(rowSums(m)) which(rowSums(m) == 3) ii <- which(m[77, ] != 0) pm[ii] ################################################### ### code chunk number 3: basecontent ################################################### bcpm <- alphabetFrequency(pm, baseOnly=TRUE) head(bcpm) alphabetFrequency(pm, baseOnly=TRUE, collapse=TRUE) ################################################### ### code chunk number 4: hgu95av2dim ################################################### nr = hgu95av2dim$NROW nc = hgu95av2dim$NCOL ################################################### ### code chunk number 5: matchprobes.Rnw:176-182 ################################################### library(affy) abseq = rep(as.character(NA), nr*nc) ipm = with(hgu95av2probe, xy2indices(x, y, nr=nr)) any(duplicated(ipm)) # just a sanity check abseq[ipm] = hgu95av2probe$sequence table(is.na(abseq)) ################################################### ### code chunk number 6: pm2mm ################################################### mm <- pm subseq(mm, start=13, width=1) <- complement(subseq(mm, start=13, width=1)) cat(as.character(pm[[1]]), as.character(mm[[1]]), sep="\n") ################################################### ### code chunk number 7: mismatchSeq ################################################### imm = with(hgu95av2probe, xy2indices(x, y+1, nr=nr)) intersect(ipm, imm) # just a sanity check abseq[imm] = as.character(mm) table(is.na(abseq)) ################################################### ### code chunk number 8: bc ################################################### freqs <- alphabetFrequency(DNAStringSet(abseq[!is.na(abseq)]), baseOnly=TRUE) bc <- matrix(nrow=length(abseq), ncol=5) colnames(bc) <- colnames(freqs) bc[!is.na(abseq), ] <- freqs head(na.omit(bc)) ################################################### ### code chunk number 9: GC ################################################### GC = ordered(bc[,"G"] + bc[,"C"]) colores = rainbow(nlevels(GC)) ################################################### ### code chunk number 10: abatch ################################################### library(affydata) f <- system.file("extracelfiles", "CL2001032020AA.cel", package="affydata") pd <- new("AnnotatedDataFrame", data=data.frame(fromFile=I(f), row.names="f")) abatch <- read.affybatch(filenames=f, compress=TRUE, phenoData=pd) ################################################### ### code chunk number 11: bap ################################################### barplot(table(GC), col=colores, xlab="GC", ylab="number") ################################################### ### code chunk number 12: bxp ################################################### boxplot(log2(exprs(abatch)[,1]) ~ GC, outline=FALSE, col=colores, , xlab="GC", ylab=expression(log[2]~intensity)) ################################################### ### code chunk number 13: p2p ################################################### png("matchprobes-p2p.png", width=900, height=480) plot(exprs(abatch)[ipm,1], exprs(abatch)[imm,1], asp=1, pch=".", log="xy", xlab="PM", ylab="MM", col=colores[GC[ipm]]) abline(a=0, b=1, col="#404040", lty=3) dev.off() Biostrings/inst/doc/matchprobes.Rnw0000644000126300012640000002323712227063322021007 0ustar00biocbuildphs_compbio%\VignetteIndexEntry{Handling probe sequence information} %\VignetteDepends{Biostrings, hgu95av2probe, hgu95av2cdf, affy, affydata} %\VignetteKeywords{Expression Analysis} %\VignettePackage{Biostrings} \documentclass[11pt]{article} \usepackage[margin=2cm,nohead]{geometry} \usepackage{color} \definecolor{darkblue}{rgb}{0.0,0.0,0.75} \usepackage[% baseurl={http://www.bioconductor.org},% pdftitle={Basic infrastructure for using oligonucleotide microarray reporter sequence information for preprocessing and quality assessment},% pdfauthor={Wolfgang Huber and Robert Gentleman},% pdfkeywords={Bioconductor},% pagebackref,bookmarks,colorlinks,linkcolor=darkblue,citecolor=darkblue,% pagecolor=darkblue,raiselinks,plainpages,pdftex]{hyperref} \SweaveOpts{keep.source=TRUE,eps=FALSE,include=FALSE} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rfile}[1]{{\texttt{#1}}} \newcommand{\myincfig}[3]{% \begin{figure}[tb] \begin{center} \includegraphics[width=#2]{#1} \caption{\label{#1}#3} \end{center} \end{figure} } \begin{document} \title{Using oligonucleotide microarray reporter sequence information for preprocessing and quality assessment} \author{Wolfgang Huber and Robert Gentleman} \maketitle \tableofcontents %------------------------------------------------------------ \section{Overview} %------------------------------------------------------------ This document presents some basic and simple tools for dealing with the oligonucleotide microarray reporter sequence information in the Bioconductor \textit{probe} packages. This information is used, for example, in the \Rpackage{gcrma} package. \textit{Probe} packages are a convenient way for distributing and storing the probe sequences (and related information) of a given chip. As an example, the package \Rpackage{hgu95av2probe} provides microarray reporter sequences for Affymetrix' \textit{HgU95a version 2} genechip, and for almost all major Affymetrix genechips, the corresponding packages can be downloaded from the Bioconductor website. If you have the reporter sequence information of a particular chip, you can also create such a package yourself. This is described in in the makeProbePackage vignette of the \Rpackage{AnnotationDbi} package. This document assumes some basic familiarity with R and with the design of the \Rclass{AffyBatch} class in the \Rpackage{affy} package, Bioconductor's basic container for Affymetrix genechip data. First, let us load the \Rpackage{Biostrings} package and some other packages we will use. % <>= library(Biostrings) library(hgu95av2probe) library(hgu95av2cdf) @ %------------------------------------------------------------ \section{Using probe packages}\label{sec.prbpkg} %------------------------------------------------------------ Help for the probe sequence data packages can be accessed through \begin{Schunk} \begin{Sinput} > ? hgu95av2probe \end{Sinput} \end{Schunk} One of the issues that you have to deal with is that the \textit{probe} packages do not provide the reporter sequences of all the features present in an \Rclass{AffyBatch}. Some sequences are missing, some are implied; in particular, the data structure in the \textit{probe} packages does not explicitely contain the sequences of the mismatch probes, since they are implied by the perfect match probes. Also, some other features, typically harbouring control probes or empty, do not have sequences. This is the choice that Affymetrix made when they made files with probe sequences available, and we followed it. Practically, this means that the vector of probe sequences in a \textit{probe} package does not align 1:1 with the rows of the corresponding \Rpackage{AffyBatch}; you need to keep track of this mapping, and some tools for this are provided and explained below (see Section~\ref{subsec.relating}). It also means that some functions from the \Rpackage{affy} package, such as \Rfunction{pm}, cannot be used when the sequences of the probes corresponding to their result are needed; since \Rfunction{pm} reports the intensities, but not the identity of the probes it has selected, yet the latter would be needed to retrieve their sequences. %------------------------------------------------------------ \subsection{Basic functions}\label{subsec.fcts} %------------------------------------------------------------ Let us look at some basic operations on the sequences. \subsubsection{Reverse and complementary sequence} DNA sequences can be reversed and/or complemented with the \Rfunction{reverse}, \Rfunction{complement} and \Rfunction{reverseComplement} functions. \begin{Schunk} \begin{Sinput} > ? reverseComplement \end{Sinput} \end{Schunk} \subsubsection{Matching sets of probes against each other} <>= pm <- DNAStringSet(hgu95av2probe) dict <- pm[3801:4000] pdict <- PDict(dict) m <- vcountPDict(pdict, pm) dim(m) table(rowSums(m)) which(rowSums(m) == 3) ii <- which(m[77, ] != 0) pm[ii] @ \subsubsection{Base content} The base content (number of occurrence of each character) of the sequences can be computed with the function \Rfunction{alphabetFrequency}. % <>= bcpm <- alphabetFrequency(pm, baseOnly=TRUE) head(bcpm) alphabetFrequency(pm, baseOnly=TRUE, collapse=TRUE) @ %------------------------------------------------------------ \subsection{Relating to the features of an \Rclass{AffyBatch}} \label{subsec.relating} %------------------------------------------------------------ <>= nr = hgu95av2dim$NROW nc = hgu95av2dim$NCOL @ Each column of an \Rclass{AffyBatch} corresponds to an array, each row to a certain probe on the arrays. The probes are stored in a way that is related to their geometrical position on the array. For example, the \textit{hgu95av2} array is geometrically arranged into \Sexpr{nr} rows and \Sexpr{nc} columns; we also call them the $x$- and $y$-coordinates. This results in \Sexpr{nr} $\times$ \Sexpr{nc} $=$ \Sexpr{nc*nr} rows of the \Rclass{AffyBatch}; we also call them indices. To convert between $x$- and $y$-coordinates and indices, you can use the functions \Rfunction{xy2indices} and \Rfunction{indices2xy} from the \Rpackage{affy} package. The sequence data in the \textit{probe} packages is addressed by their $x$ and $y$--coordinates. Let us construct a vector \Robject{abseq} that aligns with the rows of an \textit{hgu95av2} \Rclass{AffyBatch} and fill in the sequences: <<>>= library(affy) abseq = rep(as.character(NA), nr*nc) ipm = with(hgu95av2probe, xy2indices(x, y, nr=nr)) any(duplicated(ipm)) # just a sanity check abseq[ipm] = hgu95av2probe$sequence table(is.na(abseq)) @ The mismatch sequences are not explicitely stored in the probe packages. They are implied by the match sequences, by flipping the middle base. This can be done with the \Rfunction{pm2mm} function defined below. For Affymetrix GeneChips the length of the probe sequences is 25, and since we start counting at 1, the middle position is 13. % <>= mm <- pm subseq(mm, start=13, width=1) <- complement(subseq(mm, start=13, width=1)) cat(as.character(pm[[1]]), as.character(mm[[1]]), sep="\n") @ % We compute \Robject{imm}, the indices of the mismatch probes, by noting that each mismatch has the same $x$-coordinate as its associated perfect match, while its $y$-coordinate is increased by 1. % <>= imm = with(hgu95av2probe, xy2indices(x, y+1, nr=nr)) intersect(ipm, imm) # just a sanity check abseq[imm] = as.character(mm) table(is.na(abseq)) @ % See Figures~\ref{matchprobes-bap}--\ref{matchprobes-p2p} for some applications of the probe sequence information to preprocessing and data quality related plots. %------------------------------------------------------------ \section{Some sequence related ``preprocessing and quality'' plots} \label{subsec.prqplots} %------------------------------------------------------------ The function \Rfunction{alphabetFrequency} counts the number of occurrences of each of the four bases A, C, G, T in each probe sequence. <>= freqs <- alphabetFrequency(DNAStringSet(abseq[!is.na(abseq)]), baseOnly=TRUE) bc <- matrix(nrow=length(abseq), ncol=5) colnames(bc) <- colnames(freqs) bc[!is.na(abseq), ] <- freqs head(na.omit(bc)) @ % Let us define an ordered factor variable for GC content: % <>= GC = ordered(bc[,"G"] + bc[,"C"]) colores = rainbow(nlevels(GC)) @ And let us create an \Rclass{AffyBatch} object. <>= library(affydata) f <- system.file("extracelfiles", "CL2001032020AA.cel", package="affydata") pd <- new("AnnotatedDataFrame", data=data.frame(fromFile=I(f), row.names="f")) abatch <- read.affybatch(filenames=f, compress=TRUE, phenoData=pd) @ % Figure~\ref{matchprobes-bap} shows a barplot of the frequencies of counts in \Robject{GC}: % <>= barplot(table(GC), col=colores, xlab="GC", ylab="number") @ Figure~\ref{matchprobes-bxp}: <>= boxplot(log2(exprs(abatch)[,1]) ~ GC, outline=FALSE, col=colores, , xlab="GC", ylab=expression(log[2]~intensity)) @ Figure~\ref{matchprobes-p2p}: <>= png("matchprobes-p2p.png", width=900, height=480) plot(exprs(abatch)[ipm,1], exprs(abatch)[imm,1], asp=1, pch=".", log="xy", xlab="PM", ylab="MM", col=colores[GC[ipm]]) abline(a=0, b=1, col="#404040", lty=3) dev.off() @ % \myincfig{matchprobes-bap}{0.7\textwidth}{Distribution of probe GC content. The height of each bar corresponds to the number of probes with the corresponing GC content.} \myincfig{matchprobes-bxp}{0.7\textwidth}{Boxplots of $\log_2$ intensity stratified by probe GC content.} \myincfig{matchprobes-p2p}{0.7\textwidth}{Scatterplot of PM vs MM intensities, colored by probe GC content.} \end{document} Biostrings/inst/doc/matchprobes.pdf0000644000126300012640000077662712241047607021040 0ustar00biocbuildphs_compbio%PDF-1.4 %ÐÔÅØ 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (Overview) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (Using probe packages) endobj 9 0 obj << /S /GoTo /D (subsection.2.1) >> endobj 12 0 obj (Basic functions) endobj 13 0 obj << /S /GoTo /D (subsubsection.2.1.1) >> endobj 16 0 obj (Reverse and complementary sequence) endobj 17 0 obj << /S /GoTo /D (subsubsection.2.1.2) >> endobj 20 0 obj (Matching sets of probes against each other) endobj 21 0 obj << /S /GoTo /D (subsubsection.2.1.3) >> endobj 24 0 obj (Base content) endobj 25 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 28 0 obj (Relating to the features of an AffyBatch) endobj 29 0 obj << /S /GoTo /D (section.3) >> endobj 32 0 obj (Some sequence related ``preprocessing and quality'' plots) endobj 33 0 obj << /S /GoTo /D [34 0 R /Fit ] >> endobj 44 0 obj << /Length 2297 /Filter /FlateDecode >> stream xÚåYI“ÛÆ¾ëW r1X%BèÀ%)OIIUbÕxT9X9@ ¸DC‚Á™Ì¿÷ÛHpF*çbç@°Ñëë·~ï!VQ½{•^ù¿¹{õæ­É#•%Z9Ý-£Ì%yê#Ÿ§‰W:º[D?Å3ovðXÍæ&Mãæ;ð½Çn¦³ø »kìê6 lòìí¦‚—¶)ñÙ–8û‰GÚz?›kã’¶«[ìU1žVÿ ܳÆc+Ù‰hXÂlK:‰I qjgÿ¾û{¤R¸ÂEs­’Bå|‘=.«éÙÐÁ°1œw~½Û n:Êpån¦=Óauöfnx˜4¼y«ÓHÁñÎid­vIªŠV&F)¦è_³œoƒÛ/W%mÀ„yïñäÏ@©‰9ÐÕÓí[áD?©ƒ¿cÎé:xïz;czwÄg’ÜàŽM¬îü³Á(¼È߯‡+ý¯¹­Sh+ø¾«u‘²‰±žî:×i üæÖ'ô‰ø3Ò»›ETÕÜ:àòWi’FüË\Ô®¢Ñûí;PS¼L“"-IW³y4ýÛ>ÌŒf^< ¸êGÞ_4>²…N È# ¿æt¸†,ãS ^¬ùÔ(ûÍ@r¹ŽEÇH6&%KÈ õ–^ûËÌÛ¸\±êüzß¼UnÈž¹;.ò<š+“8èMHds° ß”¤öP […þª=ovg„ý4÷E'3àE1øs`$“_1ów°ÙÏTaÁVF½/j:ŠbJtA~Êúø¶~@%M?Ô,År·àFÕ ¹ïÉðÑ”O¾ Äù辌™v´gô©ù Éç’ùö[™Ÿ^c¼Æÿ£D>VÈÐõÐê‘¡5XÍ’;É A¡/e×zà‘rU† /ªKÞ˜'4¸Ý…Ó^ÈÅëß­þ_€ïªƒ¢÷štüŒ€Üýz«gfNÉÇ|›|æå2ÒZnkt4È]l}f´F‡v ÁvÚÒÝeE×KÙš#ÍXÔ=…Ó8ã‘™Š¦CïSÅ×AêG÷8V!Áh‚½/„‚-‘K¡PGHý0ÿHGÞCtS¦í´•y€íŸGJ…Ýêeƒ‹·å ¶ǩ٠ùؾٜ¤Ñ0 ß¡ãÄñÜÅh«“4SÁGìÛ™ÓÊáYO)ƒÎçó~:~8íËÌyø”(¢ÉB×ÝZ´¤§W¤3y™w º²€c5fs#i7”ãõÑNL ö 8ŽK]lˆ‡ØôÛûBäE¤ø¸5¹†J¢"nü)u˜}÷>@¥ìD8첟%ÉO³ÔL~RÓ`[5Įم ²Údf1îBΣۓBSÉÅ'…ñãþGŠÁ¬Tú'%E*ƒ¯¢z‚µÅÈÏÀÄ=a£C9NF«ï{Ó\¯$.®Do­_´ÕÌ$¹é)Ä ¸×Cpdå@;3®cµb½zÀøÈ…‰r`ÙÇ&C#»deÅ‚ˆJðå‰C*lÔÙõݤÅh£kÍÈ•¾G.|d.`¸LQnìO—b²‚Qù9O ¨7¨Q[Ÿ’½€¼9…dº!¬`›*eÛæ Õ¨ÐsÏmvsêx¿~oZ°"í¯9åCB'J†hÒ¡coû¨*!R‡É`)gAF#,éq… l þIA _¼„vØáqwOaŽ4fÁ3—dÒ[ž9$^‡aˆ$²í¨ºÀI ÅTŠûÊK¤R;|ªã¿-yÊNiŽü²:)5<ꤓ¥M<Ù3(*)ŽM¹&ö¹Ð„ãÐR#{`q¹ KÝsø˜Åš¥AcŸ°/Å3ÈÑQ›éМèBe'ñ:Ç“¢ðþ»6÷‡£Ä<(qY†­ã;d^ˆÒ0}ÐdçbáFôñ­÷=ú%Ò(¾nË/äR?\> ¥—ðœ¹ÁQ­È>pû®ž íàÿÞôÙÓ |Ð ¤éÊŽü‰n›I÷i“ܼæ‘`•({؇ Ù@†~$£¥–”·!/„ù²­š_Âò à, mT%‡½épÇ'ž0¹ø~Ëqýìb¼{˜"†À|î$–»<Ü”* *ÌKéêE–ªõ|¦,” +6}Qn½xïFáY P€|OPÉŽx Õj¡».ê׬uÓn­^6íw§êØçQùyPÆá’˜$¡8@æ BE,OBŒND+ê_‡(EµIŠìLßÊFmÀu¯ù줥:wâïÑÓSëyî¦PòÞÀn‚ß<ôan·"ŽL =KÕuŽK1Ä`©æ²I ýwëàÛžÆÅ8ð¬ &s/—¥L#`õb„ Ù¦ž84èÈÿîÔJ°årpÚó - ù‹&³4„/Lì™2°™öç/L†N]Õ×tì¬pñž¢ŸØÌ2˜ÜY©ŽQò ™«•Ÿ“áVN*!c+ô !ý¡Ô£:U‚꡵‘¼ð¨ÕzJ7SQJ?’ÚŸøïÛõá¹ò¡¶>q9*K\áGßëdÅ_ï^ýØ•- endstream endobj 34 0 obj << /Type /Page /Contents 44 0 R /Resources 43 0 R /MediaBox [0 0 612 792] /Parent 55 0 R /Annots [ 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R ] >> endobj 35 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.697 532.164 125.543 541.684] /A << /S /GoTo /D (section.1) >> >> endobj 36 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.697 505.59 192.393 517.226] /A << /S /GoTo /D (section.2) >> >> endobj 37 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [72.06 494.157 171.459 503.72] /A << /S /GoTo /D (subsection.2.1) >> >> endobj 38 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [97.151 478.491 313.32 490.171] /A << /S /GoTo /D (subsubsection.2.1.1) >> >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [97.151 464.942 338.104 476.622] /A << /S /GoTo /D (subsubsection.2.1.2) >> >> endobj 40 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [97.151 453.509 195.132 462.865] /A << /S /GoTo /D (subsubsection.2.1.3) >> >> endobj 41 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [72.06 437.844 291.839 449.524] /A << /S /GoTo /D (subsection.2.2) >> >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.697 413.386 384.128 425.022] /A << /S /GoTo /D (section.3) >> >> endobj 45 0 obj << /D [34 0 R /XYZ 55.693 736.307 null] >> endobj 46 0 obj << /D [34 0 R /XYZ 56.693 735.307 null] >> endobj 50 0 obj << /D [34 0 R /XYZ 56.693 546.83 null] >> endobj 2 0 obj << /D [34 0 R /XYZ 56.693 397.964 null] >> endobj 6 0 obj << /D [34 0 R /XYZ 56.693 126.766 null] >> endobj 43 0 obj << /Font << /F38 47 0 R /F20 48 0 R /F45 49 0 R /F50 51 0 R /F15 52 0 R /F57 53 0 R /F59 54 0 R >> /ProcSet [ /PDF /Text ] >> endobj 59 0 obj << /Length 2272 /Filter /FlateDecode >> stream xÚÍXKs㸾ûW(7ªÊâÀG6›”'›um*¯ÚñÍ;Z¢mÕH¢W”ÖëŸ~ )ÊöÌ%9PÀF£ßýjö0S³ë %ÿo.>ü¨ÝL«´R•žÝÜÏ “æY5+2›[ÎnV³ÛäßsìšùÂ6iïùÿk²¶†q×ÁϱÁ.:&€§>0ÑË<+“öÈ/éÅ<+’ßpµ‰;Z&^!£zÓgäxìÕÁ³÷Ç5óÏ7ÿð£+úJehS 3éó´Ÿ»,iïðWè‡FȪԹ@¢,QØ/s—'õC#ç¯DØ]+2 åž”@ÍPÒI4°‡Øl>Í@Ùâ|ÝìQ˜ÙÂd*-s3[h“:[±nøÕy·DzÄf9ùÿÁ`:ÙðØûÇ÷H[ãÊqO -í%nˆûå>àGvÞ1Q½›´)Œó¢ôVºúEi{^>’Ï—¤í„im™Wù]é|‘–|j·l<©!Eq°ƒŸ¥W´Þ{²<Ù†¨[#ÍÃ%,Û*éÚmsJ¼FþOhÜÕ [¾c[g®J•)†¶åM¡Øûä \DµŽ¿t‰$Õг*Y‘¥kžt±0*³<È`¤y…’Ó¿8kÂʺRi¡ð5‘«ô¡«(.[ >Z8ˆaÐüN‰ÖZŠÉ(•EF©ð–òxÛã3 ll©S•g>˜j.Ô1·ð”ýŽvš — «»c ˜^uÌ4×}¦e–EÕO÷íÔÙZ§Öð%G,Éá‚—\+œ†§wÿ8~l¤På’ãø,ÊsEùHåÅ$ž`B)´Âø¤Ý­B¾Df-3 |× 4ðu¨ nbº}莋ÊBÍʆ)ÃɾЀš=àO^ÆÛØÐøyžUù¶ñ›P’IÑnðÊáfîû‚`/¿„ð>¡nwG¯§ p%°kx®#ä¡×ì§ Îù øá®‚þ( )›í7—ì¤ß.'äÚpbïŒÑ:w#ƒy@€oãK”IH$Öë&RøX!YÝ_aÈ€áÂnÌi$ÐC;2zÊþµ3ªr.Cÿâ®[6Ã-Sk¸~¬¥&¡Û3×.8-ú¸› d©RWJ•øGs`¡Žžmb{ø"pJˆ: e+;†Ö´ÐöëžÀ¶v7²ˆ½É«¬ 0¨ˆj,| ™áö@b‚ZÛ2ùìÇ‘œ÷„Ђà±Dó>ß4[>!,%ó “tc™ÞaË€ð_WÒ ÎáWÇ‘{‘æ8’Üw½ÎXSµú@˜¦Ëvë;¨WÓ¯‰]qÑ:@ì“o?ÃjcT‘*• êÈ\S'o$°»¸w„w ÃjëÿT1Kó20§[1Õ³ˆ™7‚ÇSå*-u(‰âΉÓ2MÐñM]tòמ( .Ö¸´0£»õW‰iMšÛP’ÏáÝÕ°ó^¸á§NçÌáÏó…ËLòþ{¯:oˆÄo"?Ñj€2ñ‘gm¸ø>¶Ø(ÅVÜ.iø'r- );Ṃ瓿éúFLÚ𺿠ê|”WX *x]ÖÙÙ\´äí„%O¿1ˆxwð=r,æ“xì¼o”ð(*o:Á“•¹>O]Í{†xý4¼Ñþ0 НN—õ+gü7ÙÜŠõvÂè•3Ÿ&νÚå 1üîmdÚß5.@.uJ_z|ÏûÕOKì_IeÇ›o¤Y^ÃãÇW£ñuïýõˆæj´v5¢½šòÔ­ô‹ÿ'yÌÿPžðíåä3£Í¡£ªÒ²(<$éïøÛÍÅKlÑ— endstream endobj 58 0 obj << /Type /Page /Contents 59 0 R /Resources 57 0 R /MediaBox [0 0 612 792] /Parent 55 0 R /Annots [ 56 0 R ] >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [300.977 612.231 316.9 625.029] /A << /S /GoTo /D (subsection.2.2) >> >> endobj 60 0 obj << /D [58 0 R /XYZ 55.693 736.307 null] >> endobj 10 0 obj << /D [58 0 R /XYZ 56.693 557.946 null] >> endobj 14 0 obj << /D [58 0 R /XYZ 56.693 508.167 null] >> endobj 18 0 obj << /D [58 0 R /XYZ 56.693 422.417 null] >> endobj 57 0 obj << /Font << /F15 52 0 R /F57 53 0 R /F61 61 0 R /F45 49 0 R /F50 51 0 R /F59 54 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 2021 /Filter /FlateDecode >> stream xÚÍËn#Çñ¾_A >Ùîç<’l€]û€±pGAöFCJb,qhe­ŸOUuÕL÷p$íb/9 §§»ëÑõî¢^\/ôâý+Íï·¯¾{ôÂhUëÚ,.®¡PEí¥õÊùjq±Yü²´+³Tàq«µ1¾Z¾mzøÚ®Ö®r˶ƒñ~åìò´¯ÕÇ‹¿{gBŠ[/ÖV«P…ˆö↔õòrĦ—- »ýÊ–€'5}ÐÖ_uÐqªZÞÃà×.WkøÅ­Ç¸«»â7-´ˆòþHË€q?í6߸mZÄx¿ZDŠü5Ça‰„ê&Ä¥FÖ#¿#-â!·=clö|Tà¨s·ÝÝ·ËA7qúaÇ4o2 S¢q*ø: ñ ¡é<¸g%G²/L*{oUQMP ì»…ç@$ }_2 ˆçHJŽ3èÁvçÔ[—Ê”¥PqK¨Ó-Àz­ªàÀ¬ ¦ˆ[ÿ¾Z눖™º‹Sƒá:¿že#¦ ˜å·#]ÄÖ3Ä?ê–¡^ÃsÏÏðü žÄ fÔÁG¹aT ©t œŸpÄ2U–­ÀK,)¨ Ù[Þ€ßi_.¿ÞóçEüì{1ìÈÜZ¥,þˆNo–#´‘—Yê8,}…Æjj˜ž9,b²9¦ÀpaøL?É嘄?݈ɾ„Éç˜C”hdÒ¥¤M¨•‡àÊÔÕzÖTŒUÎ’‰Ú¤¯ãËëºÐ<•«&(|“\Á¦¶kl¡Œ³_C}¥ÜÀÚEaF»&± ࢌbd%…ˆIdÝfbưÚqA[›:×gÛ‘ÿ?t¿=¡ê*¹¤žpþ·û9#)Á+ûE&‡èÙWfÚRÙ¢–í_mnBnƒƒ 'I×­d+ˆNÂá#²»ûÉ ÷qŒf ×zËUQ]ÝË Ÿ¢'¥»~ö2Womý(£XA[a6) Úí99jeõ`é©'ô´Ìêi‘OOÝå×Þåƒ9o6;´:jñ<åÞ+¸â £±Žœ¡a­2~°ŒÃPÉü¶ ”®·*Ú-„ùÒMÌvh93Ûs‰+rÀ&~H,qÖžLCÆ:U–ƒÇF€KüÝÎJßÑÏдûH»Ù W1âõ’ÊaþR—Ó£ïäú2õã ŠÖïjUùrÎ\&g”“Æ‹÷ßV¼-1+v¸žZ„`:nù!^Aéô÷rzýžæxûVžœ˪,Rãè$®Ögû[FUƧý­ËäÎùûܱœUv!¡Så¶MÑOv½æ]Þ”CŒÒƘ3ç €˜/¹M€ñX¸œ×:k_Tãì­ÜèžÌ$FkU¹ih ƒîâ43ø;—0Ž^tŸtGáÜ™½ð9¸€”`±‡—_žDn—CqßI§§®øy|¹•v®Êôj&ÝCŽ¿çfu›4F„¡Ës †—¶7ÂÎÐÌØó¦?']“)ùvy“ù|`¹HýÆD_ºY˜|—4v˜³ÏË#¥O#äãùñ^3‚ã(€ÏPË>Wì†r`ƒNšDàI3t7m„JsúcŠdþ³’øAá$R¦WϘ÷‰dÇ”tpüÛ—ßÁß±5|€çŸÔ¤úìþÁ¹Ážž÷ãõæ¬à› …ikoûŒîNI«P.i‰RÄyö¼-ñ«é¹&¶2•1Ä Sär>lìÚåAÊ Àr§NúnzìXËR™-¢áß®³ä I4@Âú,”Üqsįþ{dÊ endstream endobj 63 0 obj << /Type /Page /Contents 64 0 R /Resources 62 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 65 0 obj << /D [63 0 R /XYZ 55.693 736.307 null] >> endobj 22 0 obj << /D [63 0 R /XYZ 56.693 735.307 null] >> endobj 26 0 obj << /D [63 0 R /XYZ 56.693 467.546 null] >> endobj 62 0 obj << /Font << /F50 51 0 R /F15 52 0 R /F61 61 0 R /F59 54 0 R /F45 49 0 R /F66 66 0 R /F57 53 0 R /F32 67 0 R /F33 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 73 0 obj << /Length 1975 /Filter /FlateDecode >> stream xÚÅYKoÛF¾ûW¨éEBl†KrI±¨¸nl Z Qуã%Q²ITE)¶Ñ?ßy’KжœäÐÍÕrv^;ûÍÌÚïÍ{~ïúÄ—÷/£“7WÆöŒï¥~jz£Y/ ½8H{Iya4즽›þèn`úùà,LmÃ<å*ÛÁk2†ý;þT"Õ?ðgƒ5~Í‘’¿f[eõ×ÅŽøýžÍRØNð2Îqæ‘©J™+¶H?åÉÅšßøÁÑoC”TŒgA¢q6]“þçûÙ ½š¢‹,G¥Q±@Þ+^Ó ¹0ð"ê’z…‚g'ëZ¥Ü‰òiCo´¹@ÇÝ{¼á0ñ’0hîÅÕ`A ÁÊÈô/€[øˆzåbÛE$}½Ö0Î/Õkñ\4∗´‘suÌ3~7ƒ®ž ú´¨e$ qË8q©ÅDxݾ(ŽÞŽ'&ÅžÈDý«2¡2"§Ü~+¬)ÜðÑp Ñ<´ª(5bª „ojIö‡‚MÝP AàY³„·ƒ3„94ü†g<Üh<µõ’U¥ ј¤š¾zø“oý*éÈ)5ùJ¶Ççðxšì^OÙ ÞX%Ææ@Ë E%‹ÚT'“çâü]­Õÿ£´¼žöåD„8šf¢¡7`¹sôÈdn'lëeŠ7ò ð[yDÑú¬^,@ý»w¼B *¼¼rÜÒ†9ŒSëYßJ‚0ZàƒX1’·Ž¯[ã ‡Þ¥u׌ß:¶æk…޾Eh«Õðˆuø ÑN~ð~”.÷;…Œ¶ßâȦ‰Bý⹬`ÏDU"-‹tIžÏÐ5ÕºA* T \âUGÍ‚´h T"kŒdL†ñPTx9çI=Jš(#Ï\Δ1Ä*¡ òyQÙd"NÄÙJ|¹ËqHäÇ^âõÈC—Ób/#¥8ã4¥‘—M3x&ãôV`ìÊvŠã!駘½«q;+K4\Lµ¯™Öà™™ÎrNá4ïúý”§îïDê²–YËê0?°¾çÇV{ì2ßzImý¤R´Øv˜ØHG MºT¤f¥ÖzðIÃW˜Î¤'ÂzCÀ‚®ÜUÇ8ý® 7U™^ÕŠ1¿R~ …u€°cR®Úž¸‘6Ááb;¹„Ǹ„Ïé’<ÇÅÖL¢N&Ãê1±ÇT±M.Qƒ‹ªãwºÅ6xڇёó}.]ð¾î7®²¥»–‹RnX©ÖBgFùe'…!Î|¡ÿdÐ…uFE¼´µ3%à b<áÚ@.}sNÌ0úéåÙG¸9ýI!Çnêô yóX¹ÿTîÔ®å->~}JyYQ~þŽ.eCcíœ4‰ôv€@Aü‹¼—MÔ‹µTE|;‚(†£ Uhè™ Ö&Æ]ñntòÇ5/Q endstream endobj 72 0 obj << /Type /Page /Contents 73 0 R /Resources 71 0 R /MediaBox [0 0 612 792] /Parent 55 0 R /Annots [ 69 0 R 70 0 R ] >> endobj 69 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [112.414 387.686 119.861 399.366] /A << /S /GoTo /D (figure.1) >> >> endobj 70 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.323 387.686 130.77 399.366] /A << /S /GoTo /D (figure.3) >> >> endobj 74 0 obj << /D [72 0 R /XYZ 55.693 736.307 null] >> endobj 30 0 obj << /D [72 0 R /XYZ 56.693 358.716 null] >> endobj 71 0 obj << /Font << /F15 52 0 R /F61 61 0 R /F59 54 0 R /F32 67 0 R /F45 49 0 R >> /ProcSet [ /PDF /Text ] >> endobj 85 0 obj << /Length 1349 /Filter /FlateDecode >> stream xÚ­WKsÛ6¾ëWpÜ 5 a‚/‰™:3~Dw’™4UOŠEIn#QÑ£¶/ùíŤ%DÙnÜñÀ À}~»Ø]†ÞÔ ½ëVøÌ.ÕÿГžŒ¥Hº™—ÊŽYîóÖ÷V(²0ÍMŸõKˉƒÓ›¹ô®ªÖïêϾ ¬Ô€‰½è·N{2õd(ò0—^⥙ÈòØKòXdiÇë½ßkKÿN­év¥þ—í –¡/ßµƒ$Žü+z¹Vÿ6j­ˆl¤ÖvžjaÈ«‰Ù—DUÚA”YI×êè’¥_ލ£¥•ê©«ŸéÊüþl¯VZ«f†>ˆÃ|§¦t:3¿È¢áÊ<9¡!«—Ê’é”þxm(Haeì¡G¦S[¶U¿çô'V ’„‘–LV®Û·ýßTT DšäÔû»¶•Ä ÇÕÇm¦f_jEÕ‚8ÈЩ¡º¾4œEµÃ‰#¦tîRË“™Ècü$yš εÓFÖ7bÞy[mòÎmÃp³·n¸ Ù§=•,qdŠnÞQêŒð¯¡ŒÏã…æ.´£šÍÉ7)ò<²\Zšø‘Êbç†R•sž@¥¯èF©D‘H%Üy¯X#ã‰ÍB‚pˆýQ­¯aâh‚õ¨10gìŠL½™äz£®H»‘ÒšŠ4LŒÖÏà!ÿÆóÔ`…yêdæ|fzTÔe7Žsÿ¥N+J”Àêáé2P¯¥ZoÕº5žž¼À•“=é)r¹ÒŠŒÂSXv‡óÂ^_œ}ƒHK7Ò©!ý@­H‡ÇXãÌ•E|_°?fæS½…'VäB“FMõA¹wyˆfú$˜ç˜ L“ÀšÔ^Ã5Ãy’Ò¼È 7­Ãzf!Ÿ'fûU#¬×0o]ËŒ S\î3þ?lfY[‚Üe]ƒïí Kµ>"ô!–ijs»Ÿc G»kpÃÆÏËì+{{N¼HäM\ƒ²³Á2ßC×ÂѳfO8¬Ï¢;ĵn¸, íô á»hí¡”šCÜßcæOö .Û—-©%ï£Dý©Ö‡z^Θ¦ª!æg;®õŒz³Wßì´yžÒZÐ\G«“z«©WûýEuðî½²ÞÖÍ!¹2«h$¹ß·î¡ÙÌè³nZ¼VÔ[>ßıI1òø;Õ-íz[Kˆ5œ4tl524n¬Í‘©‹M}3ëŠ$Ll“7ó^VjBcKö®±õGy&:­?­¥áˆu•Lj’ȆntX#¯Qàê—Æ¦Ð7Ä›ÿ®œ”Ë^[=öNY¬,<!] oÌq^BÓÉK2ÍD¯È´ÈÉ´#ñ¨i= G…¦s$öhЦã’q­.›ÝŽ ŠÚ]]êÎŽcmͳ٠kÐv@Y°‚ÚC; ®÷Ç®B°J—ߨq.íÈŸI—ÿ'k\Èx™ã“Gð€Oxý`lXù[³Ùêñ°/<™‹¯¯zñOäbvÐÿð—uúyC&-YŸ1$¼‹° ìV, Ð=\·÷Ÿ¤œÍM µ=æRf`!òD­.È_0ß4ܯ×]¤;pÎKÓ_/|~\ø—ÀBÖ[sÁP=A0Xxz[’‡Ý·†s…-”oè>9~éóíÓËê÷§CÒÿRìÞ»¸å•íù‘Ì-j,@gõL"íÚLîü‚Ä v'¶Xœáóà“Ç0ñijb³!̶vµÀ-> endobj 80 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./matchprobes-bap.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 87 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 88 0 R>> /ExtGState << >>/ColorSpace << /sRGB 89 0 R >>>> /Length 715 /Filter /FlateDecode >> stream xœ­–MO1 †ïó+r„CÝØq¾®  ©•({C½”Ò*HUýûu&»3Nf©ÚÃ.d=OÆym¿3h. š{ócº’ÏÛçOgæöyB°Ö«¾Ÿo÷áóëÉnÂ×çå×èÍ¯éæ³±æë„æR>÷– ̇)F°ÑD! À¾džîÌÙr; NÝ.H¶#°#<‘"P.óÜ!ä[$&Öˆ @©AÐVÄBöÑ`'úP2×AÎ$dÞ"r±ˆ£9Ü‚°ó[${àÜ&æÀ- F·a=kë .Ç).P r 9´PÈùä$¥ò\¶m4@ŽÇ `S…"·å!bpþ”"V(3`ê I^Aõr\„p"UÆmb •Ää„¶Hó*(ÈÏEiË´½S[AѶuJI²ÑµÕjÌLž­Ks×ê–’ÛbӪƑ±ëîäõ@lOýlcÙ£»uøf$"$ì&ÕÇcHñÉÞ÷~p)>R”_0bxg»Õó¶¦6{Þ{ƒÜ}3"å>P¿ê:¡(b8J–f÷`NðÔìî§w»yç?£h±¤µ²4ÀJÁëXÆ"ÛÊò¤¬bý›¤áX±áïY²2wI±q€¥ù±±²i€u¹ôþÊæVÚ.ëúâ@s8qrÖE ;1笕Æ29ñ[F hÍb¡©9ó€`,®è‚ˆÁ¼üIúÌ´ö_².M ±îq~,9E¼QÉ¿òˆÅ ÏôÍÉã©€9ùùðåîéô³Ù]2ý§—,ŸÁ¼ûÁÔÉÜÅ`¾›ë>ŒE±ºZ£åJž¥‡ð~©â> –x]ªx‰Ü¯Ë5^FJÞ-ñýRÅkºK|Í~ †/”AœOöŠTÚ¬ÔД°²(Fd]mm¹ë+6Hò‹¯žýª (°¼MTóÕ\M¿Z^á endstream endobj 87 0 obj << /CreationDate (D:20131113202020) /ModDate (D:20131113202020) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 88 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 90 0 R >> endobj 89 0 obj [/ICCBased 91 0 R] endobj 90 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 91 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 77 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.018 265.265 114.465 276.944] /A << /S /GoTo /D (figure.1) >> >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.018 220.234 114.465 231.706] /A << /S /GoTo /D (figure.2) >> >> endobj 79 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.018 161.653 114.465 173.126] /A << /S /GoTo /D (figure.3) >> >> endobj 86 0 obj << /D [84 0 R /XYZ 55.693 736.307 null] >> endobj 75 0 obj << /D [84 0 R /XYZ 104.032 507.206 null] >> endobj 83 0 obj << /Font << /F15 52 0 R /F57 53 0 R /F59 54 0 R /F61 61 0 R >> /XObject << /Im1 80 0 R >> /ProcSet [ /PDF /Text ] >> endobj 95 0 obj << /Length 393 /Filter /FlateDecode >> stream xÚ•RËNÃ0¼ç+öèHÄõÚŽy´©ˆÜ€¨€@ü=k;VS@­Pd¯=;ëx,` f…Ø‘f¨kg@ϵw°x.Þ Á¨½Ž”ñ:&såLNž%µÅ9}?¯òéÕèøƒ¦˜L±Ü Ð<jÍm-Aëš{¢7wpɦ%²GË÷Žæû²RJ1¹_VZ+vЖҲOJ¼Òx¢Ñö4­«}Q²§vY^7§“©D°Ü[‘º¡çµ²PIndê%mS•ãÊÔ°&1/¡mõÐf5Hìú•z®âYwÓÙ+:TÜ%ÂíˆÄwímYI“ÿpFÐaZ.ÂomvÌï49Çãæ—ß¨‘{m³ßÊY'¿×ë˜ô" y®v{>jñ—çRp+H:®U½Ås5x~AÐ"Þj¼Ž.›ßFdÃø3‚æ úÈÏB²ù<Å-F>Èj/Qm|[Ý6ÿ!Xh“`Éf‡¹˜º8ÖÿÃ9@'ymèqzäF¥[1%dæ7¡ÆÖï endstream endobj 94 0 obj << /Type /Page /Contents 95 0 R /Resources 93 0 R /MediaBox [0 0 612 792] /Parent 55 0 R >> endobj 81 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./matchprobes-bxp.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 98 0 R /BBox [0 0 576 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 99 0 R/F6 100 0 R>> /ExtGState << >>/ColorSpace << /sRGB 101 0 R >>>> /Length 2795 /Filter /FlateDecode >> stream xœ¥[MåÆ ¼¿_¡crˆ¬þR·®^$ $€³äøäر Í› ä߇d‘-j4ož5º Pb‘êÇju³)M¾ÂðëðùöÝðy(Ë8塦1ç!·y¬qˆ±Ž%ÿþqøÛðéöÕ—¿~óõð×[§i&÷÷ËŸn•üÓ°Ô1·áù¶ä±NŠVCËØfBÊTôóð“†þðñ6Büð—[cþ{ûû÷Ã4üã6 ßÞhØ·À„áÏÛ—0<ýÆ„Ö#Vñ$H"„(¢Ð¯¤!7ÎäÙ™<ÃÆyÚ̵ Œp-ŽKî¡26EJ¬=Ì ÙþÞÜy¿õö±+çä”YÚ8Ça ã²Pôò˜&…k‡$x⻫ˆµ9&_9‰Óó`>Êx˜æ1ÏœKÉ“B ùê…0Å14GÀxYg^É[8š©)D8±oá@PÌŒ÷çÆ{úÜ—]îChc ÃBã¤4¶EáÚ!M­(÷YáëÙ7Ræ'”~’†ø0ýq§2´Ê&òÔÑp¾paË—0 cú#ñ’ ·ŒKUˆpbwá„àÒ%=;_¯@mÙ+êØÜ-Jâ§¥ßBaå‡líd…wPRáõ‡~•†øP\ƹðM•}¸&ÒÓ0 £9ðlÜÂ-c© Nì.œ ãBzv¾¬À4.ýÅÎ -PÓjæ[Ð35…k‡§ÊÚÉ ï( ¤Â‹ý* !ð¡s#­eLâ ¨£á„à¯<¡:tT`cŠ.Ü2†Y!‰݅‚ba\HÏÎ ̼ӼT Vžœ´F§Ä· þ\®.cåŽ +¼£€’lâiˆ>ñÞT å±Ñ¤Íºlêh8!¸&Ê”'`@GM»èÂ56"œØ]8!(Æ…ôì|¡@N娥¦È2]ø1P^ªÂÕ WU;°;¾£Æ”§ñy°˜‡¥â5 "­™4Hü“/ Ž‡|õB ˜TKt‚è Bœhç .^) €ˆ'vOŠE„KÚyC†À ß b ÇÎÝ$)êì&€¼?Iy¥ìŽ_—Áb6®Ÿé—iLeˆyœhîR}ȤB'.„P8[`#:ÊéwO.^åª ñÄîâ A±0.ehç 8õ]"‰ ©H\øÁ¤›” UžÀÕ`˜hw)rÓ‚zYñŒ5ÉS<ô(“­+o ‘—s4a“tª”bQðÚñLÅ?eÆ7|Ge¥ˆnŽE~(t©ä.]g6$N®DÊÔÆÐAå Ãí\]À"®@‰»‹'Å`\KÓÞßËÁÛ·“ƒ鉗‘ÆEÝ‡Ž˜R46e†iÅS©|ÃwäPVjèóYà‡rб7Ðd^¸Üdg6$N®p„ô)Cu”£H7u X¤Ð(ñ`wñ„ ŒkiÚû{9¸¬urTt{©TÜRItÞœƒáµcnµK\å¾#‡²rFioQ€ÊÑБ¦)gt uHœ\á2TÚÆÐAå¨h‡÷€èR ”x°»xBP Ƶ4íý·#ŸßÐEnO%+žoy’¶a/ Ó9ž ¾Î7|GeåÆí¹çÁ¢?’#ó¡¤ò{€œÅY «›ô WùòÆÀ:¨£tü¥¬l%)€’lØ]äÐ&ÃkÇu‘VRç~]c•‰Oeôû4 ðC9‚ô¥µ7(´!±¸‹v/Œ¡ƒ:È‘ƒ5Ö0¦±5×cTûÅ`\KÓÞë ä =—Ø)ó›$ºO®¨¯/•+‡µó ß‘CYt6›ä÷ià‡rpy¸U•ƒagW"æÜÆÐQõ Óðœ]Ä,mmW;+c‹†b0®ejï¿uËŠ4Œy@|ÄÉó,e#ðj˜hQ”¿ã;ŠhÔ¹©"ø¡"Ez¥Üæ‘ZÀ°Ž‰³ƒ+| icØ¨ŽŠÐ±8&‘§F5ŒˆÂØ"‚¡Œk™Úûû7HÛ{$Q¤N\hó۫ʧ~;Ε#ðÚqEƒ£ó ßQDY9àå˜E~¨HÕ&v‘wƃagW"•©Õ3ê¡ £ŠTíº[Ä&moň(Œ-"ŠÁ¸–©½ÿQ~·*ŠÐÎV¸{†Ý÷VømJ3¼vLõH”¸Ê7|GeQIøIä·]ÔÆo<áKKJõ¾é„oŽÜqÞ|ó _š@´¹l¾å„o ¼›l¾óo÷ܳ_œo=áùôã|Û _^h›ó]NøÖ™‹U77NLŽÄ/e½Àá„©dîF:ç2¥%q³Æ9ŸÈuN‘_â8ç ËUöI÷@œHX R´8çž0|ÜjªEªqt‡{aÜãÝ>cƒ•Ÿqéf…ÎÞ^xºp³ó> endobj 99 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 102 0 R >> endobj 100 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj 101 0 obj [/ICCBased 103 0 R] endobj 102 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 103 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 82 0 obj << /Type /XObject /Subtype /Image /Width 900 /Height 480 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 66342 /Filter/FlateDecode /DecodeParms<> >> stream xœì½{œUÕ}÷¿W,z5šQA£CÕ˜D­·*&¶IÕúĨÓ¤‰cbÈe I†è«&ö§Ñh[ŒšKÏ$Ú§Ä´ORM ˆ—*5‘¨xAEd@ffýþØ{}×w]öíÜÏÌçýÊËöÙ{­µ×Þgögo+'¥4‚¾@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ a@Œ€†1 Ä(h£ aŒjô²ñÖ[oýêW¿’R6z Ã…Ñ£Gæ3Ÿ9rd-o1ËèÒ¥K~øáF U‘RîØ±CñòË/ïÚµ+Í!?ýéO×­[W£ñÔÕ2œüøñãGŒ(_ŸvÚi_øÂª8*€áÀÀÀÀ¨Q£î¿ÿþ‘#GžwÞyéüÃþP»QÕÃ2ºk×®o¼qÆŒûì³ÏĉÇŒ3}úôï~÷»}}}uè¼øâ‹×]w”òãÿx&%Zkê!FçÌ™³lÙ²b±¸qãÆþþþÍ›7ßu×]O?ýôœ9sêÐ;À°¥¯¯ïºë®Û´iÓÑG}à 7är¹FȦnú{ï½÷…^8øàƒƒNž<ùôÓO?þøãÛÚÚ~úÓŸÖaÃeË–M˜0ᤓNš7oÞ¤I“=œHêamkk{ିýío;ì°:ô0|xçwV®\)„˜4iұǛËåšY‰ŠúXF‹ÅâÅ_|뭷Μ9s„ ½½½«W¯Þ¶mÛâÅ‹ëÐ;ÀpàÍ7ß<è ƒÖ¬Y3vìX!ĉ'žØè¥¢bôCúÐÚµkyä‘uëÖmݺõ€øÂ¾pÖYgÕbUNš“µk×.^¼xÞ¼y§žzj£Ç’:ÉÁQ£FÍš5«*¥@@ÿ¼y󮹿š£Ž:êë_ÿz£‡S(íÐz,\¸ðá‡3fÌwÞIiâ­J;´ ¥Ré¾ûîBœsÎ9guV£‡SPÚ  ÙüÃþpòÉ'ïÞ½;ÈLš6mZ£UPÚ š‹\O£Gh&vìØÑßß¿~ýú 6är¹c=öÐCmô ª J;@s!Û=@Ó000pË-·|å+_ikkkkšPÚ  é¸í¶ÛfΜyÎ9ç\ýõKmAi'€fá™gžyî¹ç>÷¹Ïuvv6z,u¥¨ˆ¹"×è!hyvíÚuÏ=÷ ~øá—^zi£‡SWêa3gÎ믿^,ÛÛÛ÷ßÿwß}wÍš5ßÿþ÷çÌ™“Mÿꫯ®X±ÂÚøè£xà5/X d£‡ …)•JxàîÝ»8âˆ#FLž<¹Ñ#ª7Í[Úéí·ßÞ¶m›µñÅ_\·n]í† P¤”ï½÷Þ˜1c|ðÁË.»,ŸÏçóùL-亄ì¨ÑèêJ=ÄhPÚéŠ+®àK;p 'œp‚µqÍš5›6mªþêÈí·ß~ÒI'vÚiW]uUy- %*PÚ  n<ôÐC«W¯þêW¿úµ¯}­ÑciPÚ  ¶¼ùæ›?ûÙϾùÍožqÆgŸ}v£‡Ó\ ´@­xøá‡g̘1qâÄOúÓ#GŽ9rdíúÊÍrQ횯(íPevìØñꫯîÝ»wÇŽ“'O7nÜ!‡RëN[Q‰ŠúˆÑ9sæ,[¶¬X,nܸ±¿¿óæÍwÝu×ÓO?=gΜ:ôP7úûû…‹/îíí9räùçŸ?vìØFª©iÞÒN­Å²eËÖ¬Y3gΜË/¿¼Ñciêa J;YK;´7nüæ7¿900pöÙgÃñ›”vÀP`qN\PßEñ¤”wÝu×ÙgŸ}øá‡ßtÓMe— ÊõÙVÝ¡µ(퀡@=•h©Têíí9sæ)§œòþ÷¿?—ËUR)h8+QQÏÒNüàÏ9çœ\.lÙ»wïÖ­[±Ð<Z…ÁÁÁ×^{íðÃ_¿~ýŒ3r¹Ü±ÇÛèAµ<õˆ]½zõqÇ7yò䣎:ê׿þu°ñµ×^;è ƒêÐ;@… !}ôѧžzJqöÙgסTÓ0¡bô‹_üâ'?ùÉÝ»wßu×]W]uÕÊ•+ëÐ)@UذaCŸô—ù—_|q£‡3Ô¨‡}öÙg¿ùÍoŽ3æÌ3ϼóÎ;¯ºêª½{÷Ö¡_€²‘R~ç;ßyùå—=ôÐ  ×¥FÔCŒNŸ>ýÁ >_pÁï{ßûþñÿ±ý”ÁŠ+zè¡\.÷õ¯}úôéΧbô–[nùÜç>wê©§nÙ²%—Ë‹Åxࢋ.ªC×)éíí}ä‘G„ûí·ß)§œ"„Øÿý=¨¡O= ÎýèG_zé¥G}tß}÷BxàO<ñĽ÷ÞûÌ3ÏÔ¡w€x6mÚ4uêÔ—_~y¿ýöBÌœ9³Ñ#FÔÃ2*„˜6mÚ¥—^:a„àŸcÇŽ½ôÒKo¾ùæúôŦM›î¾ûîO<ñÃþp£‡3쨓h*¤”W_}õ‹/¾8mÚ´ùóç=ºÑ#¦ / Ë_ýêW£Fºà‚ à¤m`À°`Æ ÿõ_ÿ%„8çœsÎ?ÿüFÇ 7[ÿw¸1 ±8×èÔŒÁÁÁ'žxb```ppð#ùˆbÒ¤I´>y“ éÿ7 F .s«­wîܹk×®­[·¾òÊ+#FŒ8ì°Ã?üð*÷*bMÁ‚ª b)å­·ÞºeË–|>ÿéOzÄhž& LR‹Å<ð¢‹.ºîºë= Ä(†úÓŸ~ÿûßõ«_½òÊ+=˜¬´ ¹)h>úûû.\øÞ{ïM:õŠ+®hôp@f`Ð2ÈÍh&zzzÆ?zô裎:jß}÷ V-,£h%¤”;vìB,]ºTJ9iÒ¤“O>¹ÑƒBˆ\—B̬eͨ!Yˆb­Ä¢E‹üq!DGGG>Ÿoôp4²C!VÕ²HÖ,D 7=Z€?üá>øàµ×^{ùå—7z, šÀ2 $S¡{´êå܇;vì¸ùæ›wíÚõ‘|äÚk¯môp@õ’©Ð=ZÝrîõ!×Óà<öØc¯¼òÊ>ûìó÷ÿ÷ûí·_ƒGjÄ(<ȶÆô»cÇŽR©|˜6mÚèÑ£§Liš^5Í[Ú@Œ )عs§bÉ’%Û¶mB|üão!ƒhMó–†6£À°!·¢ò6ׯ¸bÅŠÿøÇBˆ‹.ºè¤“NªIU‹/T—æÍ¦ÿïÿþïþð‡ÖÆ—^ziúôé €¡ÁÌÜ06bÉ*Ôã¼ ª³÷Î;ï\ýõ×_ýÉ'ŸÜ$åB _ÈMÁ* Õ¡yÅèE]tÑEYçÍ›·iÓ¦†ŒÀÐ`ø*Ñ&ãç?ÿù1Çs 'Ü|óÍ£Gnôp2%Z-à¦204–ÀiàY¬_¿~ÅŠBˆOfÌ!ÄŒ3&NœX•!U·º~ D¥†ÄB F€TrG –¡–ë¾·ÔóNöOr:§,?$¥ؾ}ûÇ.ø÷¾¾¾£>úÌ3ϬÒ03Ð<ï ϸj] FÔ•:Œ¬"\«0R°ºîû¬“i©çqœË7Þ¸jÕª‰'¾ðÌ5ãÆ+¿¡Êh ë)ˆb@]iþ´ò·fšÌªœ×ƒ>¸páB!Ä5×\sâ‰'V¡Å¡E Ý<ÍÄ(`àú[ëì[¯‘ñ¸?ò›o¾y÷Ýw !N9å”Ù³[fQËu—†Ö$·® ž@Œ o½Šª4¦©¦2?ñÄ;wîÜ»wïé§Ÿ.„Øÿýs9Âjβ¯•Ä!T…¦º”M Ä(–*F|ò¦*_ì§êôõõíØ±£··wݺu£Fš:uêQG# ë\öÕkqäÃkNq,ÁÖœ@Œ &>½!òå'?ùÉk¯½6~üøB¡@Cë\<ÕUœ¤ÚWIÜäÃ#qÌËàëvb§´¦¥C‡[Ú4@Œ@chZËMݨõ T%\¯l–åÉ—òN¿»»û?þã?„_ûÚ׎=öØrš¨«¤]¹)Pí”Li‹õ–ÁçSêN”¬aá|àbC“¬fC­uŸZôU•p½”E7kŸ–¬¹8túi «¯¼òÊ÷¾÷=!Ä…^øw÷wéGUkÜÊM¹)~u^¶ýa b€Ÿzê°Æj¾Z“Òìz‡ù´”‹cXX´hÑ[o½5uêÔ/ùËÞqºÒ³÷çeޤ*±¶=þí µ€ÒRžùÍk¯®wØ;°OýºuëÖ¯_¿wïÞ÷½ï}ög6nܸý÷ßß;N÷=ËâÆ†1ÔߟŽèšZ1  %áJ«n’¨Šæ7¯w˜N*kħw`nRÊ·ÞzK±|ùò1cÆŒ;öŒ3Îð–jЇ&¼Š&í4åâ+¼Ð•KÉæ®iE F4žx!â —äJ«ù½ü‰**˜:©2.^¼xùòåBˆË/¿|Ú´iY'û«\”ÙHœ¸ÿ™,ÁÓ_hï„CJ6'£P°`&\]²T}°f2_¸E³ âU­ÜS‹{iÍš5óçÏB\xá…\pwŸÅ)ú5j'e4§Ù¿Š¼Â÷“šVwu£RÊwß}wpp°ž@¨d¡Å¬´VÑl¯cÔÕ%¤B¬™ä’¢þYÏexuéÒ”YãSÞK1Ҝ¾›o¾yË–-øÀ‚dùܼõÊiI£ïÝK¼ÿ ºS=©‡ݵk×7Þ8cÆŒ}öÙgâĉcÆŒ™>}úw¿ûݾ¾¾:ôCŒÖÊ®ºc´žZ¼ŒÁËŽp„·«É%ˆc¤¹Ü,ž|òÉçŸ~ôèÑŸþô§óù|ÆQñ’®Sw¦÷„8}ßaëåæùzÔCŒÎ™3gÙ²eÅbqãÆýýý›7o¾ë®»ž~úé9sæÔ¡wYñ.ZS3}>÷TˆYv²ÆZ¼r/y0BÙá‘5éå×Ü\è7Ï$ˆwíÚõÒK/ !öìÙó¾÷½oĈ‡rH†ãëK”žNsûUþ’VÎ÷•Äu¦bôÞ{ïý÷ÿ÷³Î:kòäÉ£GžûÉ(µöc"euˆk+ ÷T%¢Šnæfë-Q'K;”1྾¾o}ë[W_}õÑGýío›U÷Š)'3'ž˜Ë>òLÒ6ëÄæºbx ,òœªB=,£úЇ֮]{ÇwœwÞy3f̘5kÖm·Ý¶~ýú“N:©½@ QaÀ¢×íN–¡ªÔ ªâ 4$Mb&77¯ñ‰TŽ\þcɾê–øå/¹|ùò±cÇÞ|óÍS§NM`ŒŒ³,ˆ®ÌªÐVZá D¼úë\Sæqpñ—MJ;5jÖ¬YŸÿüç¿ô¥/uttÌš5kÔ¨ze™ÀÓ†°˜ò‰ëu»“fªJ4dU²ãƒ;¤sÔÀ Ÿñ)±(¦u3[2=FR[’+^Å\—Z$eoذaéÒ¥BˆN8á”SNBŒ3¦ZÇXà A;än,»ºpñ¯Fñï<ü¢ÄÏsïNeG›Ô¿ôØ¥ü1mZ²*›&¬EÊ œÁHç@”xÍŸ1•/‹b®’†R´eúC‘ZZ„ÿÓU6†<µ~ÊŠ”rõêÕBˆ-[¶¼ÿýïByä‘#GŽ,¿ÅŒØ¶Bùmïni  ÿjä}硦‹’ø’´Ó„?ÀAi'ÀÐ$*O|˜PÝúGe;ʹõ+*º.%ibï²^S+V2ê« ÆZ…Û¯Œ=6âŠÄ»#úúúöîÝ»víÚ•+WJ)?øÁyä‘ñƒLo Lï )û5µêÎ+‰Þ½Ž¹)…ÚZ¥y‡!(íšÄç‰{ŸXu EW -;K£ŒÀ._¬éò^ÓoïlUN²ö•ÌËSl1Gõ÷÷_wÝu[·n>}úg?ûÙ\Î>UÿêV ;¤éºZT”±Ôeæ­Oâ¡ä$z¹9:º4Ý;UB`F³F0·4(íŽÄ<±jJ=W ­¹)5÷x’|Éu‰Räº"_¥•àí]T«Xâ‹MÖ7Ÿþð‡ùé3榛nš2%rÆãww¨âÕ¬h9%ŸÂ“B¶éÓʳÞw*OèEì c5RÅ|¾áLNÊšÿi\¹råÅ_¼ï¾ûº¥²&ÔÏ›7oÓ¦M÷ÜsO† U§ÂŠ6ufn®‘ŠÙÛ{ÊêNer»ãx« E•F*ï*[c^µjÕêÕ«/»ì²¾¾¾±cǦ9\TìƒN3ò² l¥!Cµ)Ð8:::æÏŸŸ%Rõ£BˆGydݺu[·n=à€Ž<òȳÎ:+>¡~ñâÅ·ß~»µñ¥—^š1cÆïÿûZÐJàIV-j*88ú©[w‰¤×ßÖÍV¶p_œæõé÷õõ=üðÃûØÇ^ýõñãÇOš4©œF+&þ§”X}³’Æ+$'z÷}®§:…?[ë²> 1 ¥Ü±cÇøñãGŒHèïï7ã\sÍ5o½õÖ/~ñ‹Ú ªLKh嬢*f’,Ö‰Ï̉ç ¦¢ZªÂßx¬®Pueâ7Þ˜8qâÛo¿ýÒK/}öÙ´½L;kŠ‘ûmÏ5»K«b®ê~ÈÚ4e©©mÞÒNcÆŒ9ÀaìØ±n7`(Ѽ¢ÚÑX%š2_*½ üÂÁþÞJŸ$†¬ÖÀLrjGæÍ¢zé_ ‰‰‘±ONôX!’Þû6fÀ .ܵk×!‡•¨P³‰¹YÆ?Óihïµ®•Xÿ=!Oœî·µøt"(ÑV¥•RÝþæ·#Öš™¹ª¥•x•‡7ÑĽˆÞݸˆ©ôi;“ç ¸z"ÅýÜüt訔§ng‹Q…’4:AJ¨ó%QHÒGŠ6[è,.Q*ÿ_þå_–/_>jÔ¨o|ã“'OŽ­ÏjŒÍ,qšÞš[·÷=ïW+Ї;‰óîï«q êᦟ4iÒ /¼pðÁó;vìhkkÛºuk¦¦À-Aª´åvÝÄ®CÖÕ[¹.!f‰Î#*ʸZœK®Ÿ_¶·×:¯G}ô…^¸êª«â©j@Œÿ=͉‡$…Lc®Ä×_ݨŒzZ ZÞMÒNÔ¬ä ¼ThdMs¸×Òö|A}ë˜ýÛØâœÖ.®ˆq ¨®¼Jÿ¤·þzG›F•íí Îëí·ß¾óÎ;O:é¤+¯ôWÆ_œ í¯ÕT¢=¢ýçÎFu9Òœx°s¢L Æœ! 8»“_µÄ¿uP¢-G=Äh±Xü§ú§|à—\rÉW\q饗¶··Ï;·X,Ö¡w† ˆŽª5­z]õÆu¡¢øÅ*#\·\F‰ï*8ÁÆ™92dÐ…ç(ßr³Ã~ù·Q™üéºX©3Ÿ¡-ÖZ€Þ™¾¥ìÕ¼žzê©-[¶är¹}ìc#FŒ7n\°†'õN'ua>:'¬\¯ºl3þ,„u ØåHŒÁM£êÊx Ž $õ\5QüKcq­E=Äè‡>ô¡µk×ÞqÇçwÞŒ3fÍšuÛm·­_¿>k‘Qhj¦Óx6NþTŽ_¤;Ѭ•›â¼5þYn9Ñ“›í;„–wüòQ áûËÍþýuî ø)žÝr=Îô>³+¿š—ËîÝ»¿¼ï–µk×N˜0ဘ>}ºÑ¸ê]Û†£}‚}Ò‡ZF¶ãtÞ^Ï=_%³Rn¶†Áï®,éˆ;o9ê!F…£Fš5kÖW\qõÕW_tÑE'tR|‘Q†­²DÌ MN‰Édž¬¤÷@ºUøF[Þ‰6¯&ˆÊU÷®¯c-DΑ›õ0‚^yê=_Ùæ±¶½PËSÍ Ï(«òG¸IÖh’ÔCŒþîw¿{ï½÷„ßøÆ7Ž8âˆwß}···÷øãÿÊW¾R‡ÞÍFµV›bÏ»pOYgç>ÎSÊ Kgxía.¹¹eŸ/ q¯5§S~:Wê}ä"!®¹)Z.æÒ‘›Â*+ñ¨ƒèw'Ùf|ÛyeEö0¯Žá7mÚtíµ×Κ5ë«_ýª¿‘˜•¦¡ó¼•°ìÃͽâ5¸p‰“`ß±¡ ÆöÍÉûØ}õ¨‘ß »¦>'nàJ¼‰T cÖε«í*¡Nnú€§žzêÚk¯7nܘ1cæÏŸ¿t©¯,-NM³[À&x¢§Ï•á{æzBƒ'äôÿááó^ùR­ˆÒbÆÙ!çBeÓ~¥Q_S»ïÕ#?×åyN/`VÉ\‹bÝý›õÛ 5ë¥ÐÂêH®Rt²¤ò¹9mž~¶Á4í:&7Û/㤔¿øÅ/6lØpàΟ??ÍÊ‚^‚óÍP%4V2ön‰îÈ—gæŽ$éE˜õ‡Q¶©üO×ñsb‡–ÆŠlý’SËp©!öb\ê$F7nÜ800pÜqÇ­[·.زzõê)Sð*† (Â\6ÕrßךšZAseè™Ê÷”m¶A(ÜyJ’5ËôAÓ35ˆPÔIßfüß2T6«¤§¨Ñ ¯wÃÀéü^fæ’uƒ5K¯?\¤ÇgúZÀLƒ ¤Ç6Oæ1hŸ*Ym¾þúë/¿ü²”²­­mêÔ©£G7nœ5ž*¢¯BIº'S®»-Z8@DC ¯=»ÐÕýÙ™p7O«„K Oê!FÏ<óÌË.»lüøñ=öØÕW_-„xôÑGÿöoÿößøFz´ Õrßׯàr-kêF~ƒ\–gj¢Á&>/D§ˆ6rÜÇE1.2†ØÝâP¡MÔYQS‘ë«d„„ç¢PëÄgÛÈEe®nE]¿ùæ›BˆgŸ}vôèÑ#FŒøÈG>âMÆMã Ni¨ã‰ÿ†žóÝtúQïusUö’·dRV¬hNoSWúö¯ØŽ·hVÒΫ&¤bô‘GyõÕWß}÷ݧžzêG?ú‘bß}÷½ï¾û¾ð…/Ô¡w@­©–öjixºF|ê= “ó”«ß¨¾yôÛ?ò)‘%4†9j€ŸNpK¸V:ž #EÛóÒ¾sŒ\ûtFV7;Ç<ß!( ¯HÜ®s]â÷¿ÿýƒ>(„ø›¿ù›÷¿ÿýážY¤-׈)_*¢<-r‘§ëçóᇨ÷º*{)¥ŒÌXš7¶pÑc$jÿLtjìë. p^5!õ‹3fÌQGuê©§ !>üáŸ~úéuëPSR¦Í¼6?‚ž…5]§ÀR*¡&¸!nB/%¿È¿ÝýJ8B3qHÂ2¸z¼*Ñ>ªÆSP…Ôh9·"j„Ô‹Ü^…@˺‹+Åõë×ð’¯îùû~ô£—_~¹½g:UÈвmÿ)«VNóm–œÆÄBo½Ñ™´¢Aé+Ê¿mñ•ÀSš‚¼'’Òg‡rá†qû³"†&ew !Ä\Ÿ†3ztÎÑ[©T·yŽ=çÁjŸá%5Âú =BlÖâň'Û#a*Ç’2–õ¾ Þ|óÍ¥RéðÃæ?o©æ~³dhÖ»‹NPŸ~ÌÎÁ2ñÑ&Õ„¾¢Coy ­²ã>#Õd 1éí+! FC¬G]ô4aÑš Þ ›ÒEK'b¸wËŠ·³žôñ¹b ¤ßA6Õî?Ï 3°È^Jv¤ò½†õAÛlyî?[<ŸwŽ2‹O%Zàž{î¹Ç|ĈŸùÌgŽ8∄½MÎGUÈÊóÅ8¡iµ_ Q^ï2â>e«·2¨o§X y1 6åUñ¤ãƇÆ+B®ª¾jyPŽ)>%(qT¢²´h¿Ý,€ŸÆ÷j„,b–>j1Ë—ÒøBìÞ½{åÊ•Á‡ãŽ;N1mÚ4=°¤3µ­ÎiÙÙË$Ù ÞeÜKášb2k©Š¨™7’¨R:Ö¹EÜwˆ·DV°€\K1 ²”ïI,+¹ÄµÐ㇯G¦ÑaºœgÆ3]¥J%j”0LÐW»'7;Á<–žèºòƒ“v é§?Aš“¹9ÏšÂg]{÷Ýw…_>ô¹]»v !N>ùä‰'Zã´ŽJãÎd+Mߎ"×cJðOžuszo¶Hó§cªô‹ÈtbÚ5öÂ÷¦ ¿Jal6öo‘u˜€4ŠêXñWAJ\½&ZâÔáIV^uaŽm®S>É;ÅèŽZX #á芛¼hÀ"Ãü7>ÉIÛ;ïÛ«q3'#I™-´ßû^¿õÖ[~ºõä_u¦w÷å$k8ÈÁ§%=ËVKÁ2TÆ–rÃ+­"ÍŸÊT©+@¥è1J 'ÏU›žÙy­³Æ¸W-Í„CÂ6ˆQ@c¨n•ò‚äb$N\Á#ó1_¶ÅË;fzrÇh)>6Oývoìf!iK-¸¥@‰Ë`I§ø‰½F二¥tøÊ“´vÀG6xCÒ>²«¢£¤”ÿðÿðòË/ïzí믿~Ô¨Q¹žó¡wÁôÙB¤)ÎÕ·¤gÊ¢Z¢¬@ažY¯›bï¦NÌ;RÊØMc1ú@¦gwÓ—çôˆšp÷ Nÿ:1 Àp¡Õ@‡IùhKsØK.*Óšb<•i9Ê*= ;h–çK0'5¾ä96—¢C˜jF/)¦s‘ßþÄ—ß1"€/Až$H¼2È«¨¬xJ‹üëþý·¹\î–[n™>}ºþ"bjï[-@¥;rV ­z@mJxLE(­hÑ׊«Í§¯N¹_öéÉèÃã+¤8‘ô?%w¶k´„=ˆb€áB-êð áòÑüQšhò±Ë1fOìÐËQ.ʦG£ú2ž¦§ˆÎ#„0O$ü|Š.éi|¶×0_--dï£ a´Ò ;êÑvÓ°A'BÔKzdÅSlÙ²åþûïB¬>ã¤sÏ=׿¯¦f@ʼŸÜl!–†'«ÍÏNu­ø•Êè׋»RLÉOwHžUGdëw§˜8Zž/NÖeŒM¶ù[ Å]­ñØÁ •z5fxíëÄ(-üG™Hÿ,±ÍŸ$øzž£Yií̬˜ëÒÇztƒzfë}"ª£/¶‘Œ¾âÅ#-:.äfѹۉºêðXeåŠÑǹ)B¶…6H­HÒ­N#ÏTWRJ¹jÕªÁÁÁíÛ·yä‘Bˆ]¿˜ ¥NcTKJ,é Œ:D¶ ±(ˆ±]Á·ç¦xnÛŠ5/Ÿ™ë±ß´ˆŒ˜Z2@!JîȈ3v~VÞšßXÐ*ÝŠ;Êöõb€£±þ£&¯/íÚ“ø³$fð¹)~óg¼1Æj0nÑö,4˰g›!»´AKÛSÕ>^Mi„lÆÈéŒf²ƒn+„Kh†ãY$„Ïìcõ`ÚBá®A*z¬â”®ÉP—˜mçSëIžv@K.Å›ûûûûûûßxãÇ|pppúôéG}4oÖý)-Î…W¼ìE>-ìÐÏ`ò¥.Ë,Oê¹=fÑ·F›YbcüïÀ<q#hË®9?Þª²ÿY5¼ªEå+de1 È€$Çžs•x«H¼‹Ÿë +P‘)&æÛRŸæâšþlÐ…í+8£*üÎàAûß CÌ‚ïV_4Ez®DWù$7ëÁ[òÑú „]mB])ÚâmZ¼®ü F>5I0¢6‹ ýÈÀD)¯»îº 6L›6í‹_ü¢»~’‘h¥l®HU)¾d•Ù)¿ëlûºoyỾÞ|ùÜlUŠýU<Á0fª«f7ûjiÙ­ÌFhërµ¶Vb*ø‚¡Ä( Lø»ò´† ɤ†e‡¿¥‹õ  m¼€©[/ ¤š¥SBùkX=Û"” /»(lËXd9ú) ö¼ð[ ™›­Œ›…p&PŸxO‡Pk2=Ÿ÷äzH/&Ä€2–xæ–èYÀgõ£÷@KíTÿ¤:ƒªÃ¾Fwß}wwww.—ûÞ÷¾wdîAŠÓÊ+ïуçÖbÒL‹#èñž]pR«¤£º"Š$n!%Ê¿õ¨X_bâ*)r]âyÙ#”ñ5fçôX0'z¢î|7ÕUÕé‰©à›žZdp‚j1 ¨+)m!YM­¤†«k2qµ…`nbB‡ÙEg§,À.„m,UHhíÉU™¾ôùÞà˜j¡O_µ9W­Kó:¡ÿK… øÂÍBq[Aß™’+?rÓël'%ƒ©v³ÔWI1NY@Ç‘•´ÃØA±víÚb±(„˜={ö…^(X@m¨8­’ÚÂó"(·&بß4¼®öˆS£î\’ òÁÌö·ãQ±QãéðˆlïÎv´IÌ"·æÑR´Eýœ¹ñÞ(œTU'x¶WÐdp‚j1 ¨9eÄRÀÅz e5™$>Ï5O..Õ™x‚¤H¢ÍÌ…!›«¤6Uå›V0òÀÌ93'r]z{`œ›S…è’=$+SèLsuMRÝcx·£.7ià>v‰‰=pO-¸pÝÝÝ}}}ûï¿ÿ§>õ©Å91f̘°£ˆe?f¹‰·Ã³1~TqQÈ],€!¸ I:̵7 f±)º “¾—%Ëî˜þd”ý2mš™cõ¤yöOÕ~ÒO#½C&Mk @Œ€?R5§’ P‰Á‘1¤\WBÆUn¶çðLOý > ÎjO³Ö‹c–ó~õ|ÑÞg•4¦ÅÕÓÚÍ!°ÄR±J qÞ~¡ìB'ÝË6eK[$f½Ï6‚nEGWàRÏÍÖAŸ¹13y¹iÌnòSÞ*§ßÚôƻᄏ}ûöñãÇ;6ŸÏOš4éURJDˆ?wÁ‚¬oJÞ[á\AÊôê*Оȷœñþû¢d|WYŒŒ‚4|ùC‰7m /yŒ„žY¸~•ôX"Ó¿ªñ ŠjÒ¡Í Ä(ø#U[ÊÎm"[Ëâ\™/ ²ÃãR7vðÙlè©g÷ŠªzÓaˆs"ë–§„_ÑJ’¼Mwux®§IW¹Z$Ø3(u™=á9Þ ì£jeÈP£(0Ž)<*P/EG¨ù‰ÛTå|ÙfLx®Çã8ÛhÊ@¶›Mcû–ðCN–î¹çžÞÞÞÉ“'Ïš5ËîÃ1ÔE–£?ÇSå4±Üzâ²O^¹I;x" Ý€Ñ)þvx_A;”Œ )ñ¼êë.üùCq+B×]´Åïslšz$__Q ´ÕÉI™ÅÌÝhæÍ›·iÓ¦{î¹§Ñ`˜’›ÒŒ¥O¢ìÅÌ\˜A¢—\êÔ3rfÒ=‹\—è¼2Kr˜)"Ýo­¯‚qÿ+„ÐW8}q..wÍšøÆÅÒðúzªð—B7O†Cêþ+zôÎ3ztttÌŸ??(Ö[u`„¤1afz¾V·(i¼½*SqûJÖit[s MVJ©X©Bax¥Ji_ì+{IKT(jn.Œû ·÷ˆ\—³â‘³ ±Î±Jê‹Q’' a+ÑÎ-Â"ʽ+ 1ËXMŠ33ç·†Æ4òôÓOàßB|nàï½JÔj3*Z ¾ŠBpá¬Bäɪ7 ¯~-O‰Îuâ+\¬rTºÇ²”hüµpt†a‘ÈÍnU%Šè¬¦b€aŠû·8S6@R™¢jè‰ù(Á é)ã¨Òö&³Äk‹^ôtÆtE`X £s·­ FÓݬ1#ÛÄ3lT¶yjã‹Í³ƒä*:ö\(ææDû‘›"nSãwÍ´´ý¶’³*½rŒçDw@‹XI´Jú5–}Êl5©ÞÞÞ;î¸c÷îÝÇüêû¾É»Ö*Pd„V}‰r‡ýC0£(¦6ü§eÌvâ(*êÚ•£²ç­'ò.Õ×°ø•l]¡i{öÝD«žÈÞ=ãI\á³f嘚ʗ F¦Tëo1­3^6‰%?CŒÏÔÄ…¬•€ïmÜ™ csSôTP¼£kÒã‘…²M?#­g³WXÏÍ1d—Ö—1yú:Itè¤ìžP¿RæJPøS˜"#°™É!Å¢ ¹JgåÃ=—rm–×ÓÅsÀicû,Pòö_!¤h3kzŒÁ eú5¶t Ù¡L¼A_¦Úë¼R!ž~úéWW¾6räÈüãûì³Ï¨Q£FŒ!Lyd ýÀ6Ìå ¸]½È­ü½ {rà­}Û[‹°'›P#Öבõ‹°^HÂas[xO¤½V›{Û⪇¦!ŒFMg.u3ÿ¢vCÙRÌ;÷ÒK/mô(¨7¢Ðè4í)þn‰¼ìᇔtû¤ÈËv¡ç\í=»3¶,¥²do±7»YW\”d»0FÂ÷t›²vnö‚o;ÙL'î=)jJwqîV Þs´šµ¦w÷îÝ7n”RÞsÏ=Û·o;>v$Æ>I?w‡`KÐ8õ%J¾CÌÑ;ó«;’øé’jþwKÙ]$0Ë z~æFýÒ)Íò3•pÅW¬]»¶FCŒ‚T 54ìÒQa),ó¸F¶\v§¡„-úÕ§[ý¹ %ŽúI¹O\­cœ}¢4ÉÊ`Ï੯õtAm/˜ÛKáž| í¬)\Ȳµ]„-XºÖaد£ê8{öì‘R.\¸pùòåî`Œ-MÃå¯êºÛw oMÈR§³O{ôYÄu£ZðÞQ‘;ûôŸ5rþSuçVÈBÊ?àú­Ãº‚üͧàÙÁnǺ@IrÜÖñ©Õ6¨'£ˆQž†—úà>D«H»c-޵¨ŠÁÃÕR’Ý–ùPŠ'­=cNG?¶ó{Äz¤‰Ï~峟ñ^D>üoüá’ ÏnÇÈ ;°´9]ëÝ,QbúÛ•.7‘%¯Ôbùòå7ÝtSÌ>iWãæޣfX:§™ýz@ú®‘W÷Ò±ÕxÉïõÝo.‘×”ÏUÄxRþ-õþÜÂ{Cé~¨?Cø‰P F5£TNŒ–Íj ­\rÊO7°,ñoHóîÌŸ¸®üŠ·ñt;È`ýö?¥Ÿû¥Èë®;…l¡åÒ½ÁTpØ&Û­-lÆ2YùH¢ÏGömÛ¾õ­oíܹÓûmü»Mò8Ë6í—¤(ê{;F¬'nÌd4UŠ­dü3[4H­—z{Ih_KÞà=§i|è°¶VĨb€f&¤ (Û†óx³¾ŠzêS8©Lg,ñUûÜÙCεíÛ&X¾CÉvalh^ŸÆìuë‚•Ìœ^o{¸§é(§Ï¤‰¯H' ±Sg{i}ÿ¼÷Þ{W¯^=00°cÇŽp;Ÿ²Y^Ô£}'di„.™{,Y¸Û…ã(¸¾^R=«Éˆ{uô…‚x^N‚˜³eüÅr‰‰*ñ·ß4zTĨb€Ö%¥5½tðgÛDy´ãR„´ ua’37!F0ʹD¼ÙNf33äQž…ñ™VR­ƒ-Qëø²;…£ÞdÉŸãóŒÇ8g=óRJ¹iÓ¦çž{NJùÔSOíÙ³'NѦÉLJ2FFf&Uf@ RÜ2ìŸI ~óTNí”íÆrþZ’î Æ Kñ ~þ–¢Ay ÃÇæ 1ª TÚªÒúbÉ”Lð„Ò=üx\&åýNs+Ñ5zSst6‰ùÔÆ<'ÿ) “íàJs~”– QÍzê—uá‚ù%K–¬Y³Æ;þòPf¿"ý“²²¤9–±3¦Z‚tíÊŽtK£„lëiÅj)*pÖ³½‚WúckqFåÔšŠQÔ`Á«]–·~{bÉú¨¢Ö˜±––ñÖ_´ÊFRõİX&UhŸþ/ØŸ/8Äà¯HÚeT¬\Åþ¶{׵ׇS!RÑFK;ê•Á‰çKBv%6åf£,åÌ\XÝ“ùÌÍssjùÙB¶±绌v¬RùÁ õ ò›ÃòáÂôÁ":4’„ìP .¹)Bt˜…÷;"NÙªÁÎfuåÊ•¿ùÍo„³fÍ:æ˜cÂv"JHÒÅ¥rª1„U-Eý3ø_øO6Ÿaü)víO÷> £âÃh?"ü'Í¿ì0ê³Z.Øs4o,ŽUV-w¹Ù)J Æ]ß‹îmUÏ•~V¹.ÏêMz`³V¨§ß{0“t¦Á]®,~ª¬ ¢‚¦F"·FÀ2 @µ¨WË2Å{êËK‡J”VIøZÊʰ£‚ñ2Q\¥7x@×Bb‡ëvŠ:•ÚÔ ZæUqCøÿfÙQý=(Ú[ôÆ}èèØ·ÞzkîܹZ9Qµ<íÝÒ5 Ͼҕ1᩼çNÙ¬2~tÜ|ίrÙø³¯’ʦ&7kEzÀ¨9䀛^1 @yT=É ZZ6M-Ƙb4’ù¾Suçx¨¥4»Ô…w·„a¸IBfÆz§Ê"•c¨ÕRªòC–útGÂw‹:…¸`Í‚ýAJO¸ªÑZÁÞí·ßþì³ÏZ{º27ÝY…‹Q ÕéÚÐån"|ÁË2b*x¶VâÝ•XÛ!þÇÒî¼°yC]…,º—¾B¥kt‘2ö·d¿eî¨âð (݆1ª rÊþSîyFVð\É–ôàÕ[>ÉèÙ-6)»“…ú+ðn‘%©ÒA¬„oAû‰VhrT,¯+Ä£Em•}ú¼Ê=›µƒ·5k©!·PhTXêÿüÏÿ,Y²D”ä¶mÛ"G&íÖ¤)åSš?ËÆ²‰rÂ@Þ‚±s…}ÿôU§»³wc·#IËž´òþ8TR05ªØm™­ ›t¢ú1ª =U·ø !Êœh&ᦗLy¯ô)Çš]µ”ê}jIäkßUxþM;¢Î["ß:/cDUÙU¦„µ ~#mÅhJin®eóžaÇõYOã Øï½÷ÞOqÏlÕE\Ëki&FŽêí² ½BÄZ±Ó›,“Àµ¶SljdJ™…âeÖið‚ ¶w*CiŒ1Œ:õœ©:ðí·ßþö·¿ÝÛÛ+¥'î6@Ç6øìpF¦¼m”åAŸQ×Î+¹\Ç·w›²’|¸ð•§QBJŸï þccKr²Z³i{þè‹•êäT^ô´Ö4Ã,5„á+FÿÓáŸøÄùçŸßè¡04Éô¬å;k§p¢Ê-ˆXn‰û˜m³({ÜòZ›^d­9Î¥!÷ÒZÅÞãísd@EÙ+t›ÞµÝõQQžqUIõê=UHÕÛî3Îy-v.:Ū ¥”ÇþÕwøÍÓöÀœ„}#½† Í4V[ëÀxÑæ_O5"ï-|Pï"Eû46Úȯ™i­T6Q¯ù6®÷Àj^™ŒK[7·dÿ7C¾õ~ã~85[Ý´l†³Aw˜ŠQ/pÓТÄ<·"]ÏIëÑánÒ†ÎX÷™*ÃÀA&7¸3Z…Z1fÖí «2™UîùP­lh;À4p=Îý‚¡&õª ­’Ùšà”uÄjÞšŸ°æ–,"6Jjô·Ë;v‘½5ÃMï5<;—ž¼öFª¾5òØU”¬l° ~ƒ'Ÿ¹a åT\r£2WKò¬nÊv¾u—Ï5#€KÆ­˜(ˆ“VOu?jhâ+3ªÙ­¢ÃˆQ Ä()áA‡Y -º‘¤§U¼IÉÐO¾Eqb2$ÜÇ_3jxdë ?"Ï]È‚e5J1¨]æ“ïf®úm ”¨”s{$E[ìZ ÝöÌ|󘩳ä8/ e\…’qR.o¿ýö¡?þ/!Ko¼ñF___”½ªÛW:À_Õ2"uƨÓTÐâ8 ¤Ë¥y«drCŽïÊŠŒr"c ÒÔ‚HWÂ"Õz÷éj£–Ÿ‰Ï¥sÓ{ÛAV F5£4”YÌQüòjÚG¦!c¦lüÝJèXjÕÍÚrÉ«qƒ_ÑV{ô’– «gI;U­¨ArÜ[ÉLnz£÷‚=c‡ˆÅÍ)3^Ÿ=÷Üs»wï^¿~ý Ÿ‹ÛÏjÜ[*8ëˆ"ÿîþzK´¬‰IYã#±Æ ÉTQ\É*¡eW?ˆ ŸˆÐè–ù9À^)4eä¨+LS-z~‰Ú”§Rù¾mR¹YçþðtÖCŒj FAËQùzîµ#ëŸÔ”&™²O9ª‚7OB—Ñj@ïÏd7˜ÿ¤ÐÉN¡Ì„Ní$I:‰;‹KÆ«;ÿH” >Œ (1=d¥Z˜u¬¨Ó B ˆíÊáNc3óoø”ºK¥[ RÄž={vïÞ½}ûö#þæßFN}Õ)<*ÄåcðfJÑn›g7wu%²ÓG:Z©ý‘ÖÊ”L+`T˜r*Û§óþf N ·$­j6må„ì‹”G*{í°ÍĨb€Dj –èÝŸ×Ö ˆ—–ט;O#;J¿SÁVFN7?ASZƒ‘>MCµ?­ ù´üR }ƒZN<<и¡é4*ævån¶Œs®þ³•·SJŸ‹iE#~ñûßÿþªU«ì#e(|õ?-Qž©ú#/Ü€ ®‡Ò]Šì± %«*êéÈÖ€ •kÔQ)g,ÑŒj]Ó˜=†çLõÚªWp´i « ˆQ Ä(R¹¥6þéÅãÿbàëùÛa!’|£¿ÆM’‘ŒLªÖsþÙ-˜qQ–¼#©¨Œx”R´@¸Le)R›^r+Íß’ì¡$•¥Nf&ýªË3™e¤ü"Ýôưթüò—¿\¸pa¸1¶çUBQ•ÞÒQþ+È^üq%ÙÉóÆTJÝ£ïµÁ¦¬zq³ˆÂœÆÜ" w«¤lËÙM~s’MaE'¾ SÑ‘¤ û•%¯hs=I7sS«t®WÔ¬ʵ§§gÁ‚~A›¾c‰?úàšýgᄺŠÜoás« D$r¹¹_žÖbÍr^+¬{•ãŽ}%ã7FÜ0(¶ØIh«ŠéêþÉbT1 @yTÑ¿ÓršgG×F<Úý¢$"9šH·¡ÀMÇË[õœ)#¬ºKVùLcŰ}ÃYÔš‰&*\žÇ´:”¼z¨éJcO½6có¼xIQÞ»>»¼ÌM<øè{ßyçm۶ݼ€Ÿˆþ,K\·yˆÖåE%¦cCi…ª-³Æf|ÎMlûECÇD¬š‰J‘ –ü.pœT'Õ³½ŒzR¾KÓ KßršfÓ†£ˆQ0Ì©¢ó(Ñ_o¹ŒËèÚª»n|Ť’ÿ1UÚÉɃ¦v¤²/†.yœÔÚ(¥V‰´ !Å 5•‘ÄÒÞ¹Ö”æY‡#1»vÏ.ØÎõ¢%Ž-3-·/ƨ.«þ””rëÖ­›6myéÎûï¿ïÞ½RÉ\é›ö°3C9Ì Š·:ʉ’™¬:Vöáy}²\£[º‡¿D»hÿSÛe“^Ïø;ŒÞ¨â7Zmpõ.æ®– Kßë×p§Q—õJ)hÿÉ~‡®³;p‡çªÉ|hýµ”±§)–ünµf9ê›AÖzW´‘.PŒr-ÙV.ï>QøoÝÔ˃1YI››ž˜Èl0lÕ@Œ‚!FÊgLuëCæ·¯&X²ÜÖÆQy*þ.˜±‡›µ<>úXGª;r>0î³vן¤|##ÊPI£nŒ,1™÷h>»Mf‹ífcJ qM&Š‘Æ3ʸw¶ÛÓ(•­.«Käå/ùËC¿ùÑpi«¤0µŸÐ”)%£®©±Å‰ß °_µö*ᬛ{;Ëaâ3Ö+’U—[ÜÊg¬É³]¯Õ¢ìÀJÃúžº´Eæ^d±ÂÈQ04€Õ@Œ ½Ñê=-2Ù?,u(£s“9ÑÙǺeæ×u‘|Z™r_ŒÃ z£°ÖÆ4á®Óœ×htÓð¹®2<Å<4³¤l«VP©Û½ pá½t“73ưé:‡LX³tæyWëKP6Ýî¦÷™‚S­t¾¤g<1Ê—n-ÿ´·+ÏT•«è.ì œµ¯­ÚŽxsð¾z^$|eÒg‰¥ÇßfD*aZ kë.y«ª&bT1 jJ Ô7,[Ö ª+³ìæ".[]¯·wO‘—ÎÂâ.¼SܦujAY4{­ å”˜>Î I¡ñL ¥ìa.néttÈÒ´þj±+È‚Fü¸ïŽ;îØºuëž={rÿ6`Ù­NØ·`øôŽSo!“3iqfH6NÇ´G¥£é¾_kOd°/$^ôx‹¶Æ›£B¢Ã+®’¨ìoÍÕç½mòî:£ƒbãÿhÄß!üÌŒ+}§†3£ˆQÐp**»Ýè «ÄÚÝñgeËŒIˆv»kpšk“íSïŸOÕ¬Þ_ÙêøŠšÆ·J'…þwe4΢ >**¥²Ø)°œz^[žzWÍ’]vTùèyåQžCc‡¢2ÙÊ÷7&Á”§ö¹”Lík:£ù!{öì‘RNýß÷ç¾Tµ\ä§©rì‹nkViU JØ—l¶óÊÒûƒuÕ¬ºÁÉúKøn]žKD¶akÿ¨S°¬¤þˆÒ˜°ÔtNOÔfbèˆ[ð!º¯²#,±'(ˆQ Ä(h62¢*ÝT¥»²Ÿ1^dL§éu-íßiÊJý•×–iVå£rÝÇ\y„Áš´%(ØÄê~“Ô­m;tô„%È«c.y^NQk\¡ª»K&µy·có@«’Æ£’|á…¾óïxÇìÝß5W{ WY™@Rj!®†W°ÏŒi¤’ÎQs‚«3j̓NùR×Úÿ>U¸ 6J•_D#;M¬yK¬åu˺¯KdUÉ7š¯ŠY¯È‹ª£ˆÑæ¡*~ŸáL¦hH{‹%RÛ2-:…©â}ˆªR”Ó0tùü›ž6•pqÍf,èÌråÓ?{¾Ìl À*äÉ#ùÎaú¶ª©Éµ…6› ðè²—Qu¬|¢ÓPõMã²[Jr×®]W_}õæÍ›í>x#ùÈ75ëÈSOb¸“Y¥ã"*¬cÃðVä÷øc%“²š¤ï5F´2N4¬ZM¥·ƒZ•Û¹©;>¾VG-ç%/¡Ù¯oe„ô’±v~ùZ½Ø@Œj FAóS¶Áz0w ýp­'–QÓÅ0çÊ,rUÝT¡‰·ì£¸=*5ħ9ŒFŠRÈ"×èB­f$"JÐSì£ím/)UçTtòBª‹;ßµKº rqL½Õ.ì3ñ’ßÿý+V¬Rnß¾]o/%ß*^MÏ n9^‹¨c:}ÉaÞSíÍ/Ú¥dj¸`o1Ú÷Ý1'ëmLc©-Ú†óTAœÅ0t!%©Fb.¯nô­`5$ÿvoøo«iÁÖíPbT1 †$™ò!â¬PY ¡§LfrõG^ëE²˜ZზÉ-Xô\?ùÒGJù™¦ùªÓI|îdÆK2.ê‘ЂéÁU‚¶Î+2½üB•g¢LÓÔñ§»¿ZËÍ—ŽJ°^6 [£Ša¥óƒ·üq)å¤O>;âÇ}F;±ÎV>·üt¬qÒ><~×J]ç’ÚÛŽn/ _0sƒ ioÔàOÑ%+MŠKa'•ÊÓl”&KTó¿7Ö3îu%b‘$ÇëÏÄ2~eÙewx·'ýðͤ=8Á€”£ˆQ•ªxšÒVŠ®RY¾”cެӔäm·>ô*£`»ZíÆ2Žz $ì¬~=Ò'ÚÓÊ×yhò€+eI…*íd ‚ÞÁSú‘'ô<-éÿI9ÞR ÚLŪ‘rõÚù¸ÍÊ7ðfzY“InݺuRÊ/úÿö?|µgM‡~§Ê»ÒqŸ|þÅ“<†Õsùè,JaÔ µRy|ßÅÕ7†fà$°çùvýi\#2³ø«;«ýLf³¸÷:ÖxÖzñ¦¼€Ñò"Â35„ÃFAU¨Ÿ퉦FÝgb´4î“»ü¦|Y81z«öž¼u3Y$ª‹(kૌº^W_F”$GÈÛl¸ƒ/ÕFJ)d©SØJQ*T¨uX@`"%ÍJZ3ôª+›¥7ÝÛ{šÔ,ÿ–—/¥3Òÿ5²—ŠÁyMøÓCG}âÎÁÁAcÀÜÌ,ž”LâD%Éq³«±ÅSL*œV¥UòWGZžnû[7͹©x$WünÔŠk&´0hc|‚¼1NµÔ“ÿÛØß]µ^GË ~ñЬÕú‰Q!ÄØ±c'û¨JgƒƒƒÛ·oß»woÙ-@ŒmÒEµ |>…0ŸR§'ÓI^Ò†ƒ”g·¢»eªEÿUÍu–*ânwY`~Ã’G¨ëÕ«uÛC ¥’•Ü’*JZ}J%žtXdhß ÒkŠ¡° …,èÜ|µ[§ê—¦Ñè±$¥Z>J'Bñôÿ‚£àÕá»wï>ñ’¯mÚ´)ØîuUGÔZŸ]êÅBpJo VzI«Xµž§e·º3ÌÒÎUÓãd‘·`ÇqƾV¹ï{žz´ét[ú,¨ò WèþŽ3ë¦3ˆ –|–þ൶ÔOŒ~éK_:ôÐCgÍšõ£ý(ø#XvîÜyà 7LŸ>}̘1Bˆ‘#GuÔQßùÎwvïÞµ)ˆQÐüT]}ÆE¿E±9Aoµ&ËHé %´4Šì”¤ïÉÇï–).FòJɤ¤/1ÙPrŽÇ<ܞדen%ýÍ÷Ô –lMc…Ær;«¤š—4¥¥°.: P›ä’(")§««ëÑGåík]nê9#°Ï—&¥¶°Z'Å(r}L-»Q¡¡j§!±’®ÞHY× ËwàçåùÊŒ–¤ò]ÃdÄšœ.J1›éðJY7€t®»”‘*–LûüŸn×öÆbhé׿— Z·ñF…ú ’ÿîÊMñ©›y´"uÝ»wïc=6oÞ¼#Ž8âÌ3ÏüÁ~°aÆ ûøìg?{î¹ç>üðÃ[·níïïߺuëc=vþùçþóŸÏÚÄ(ð’2J²yð<ç¢Ü‚©³=¨eý9b%F¯¥Í؇-Âîùª˜jT–V[ufH+iS"ßS/Dd.qnWâj@G:òrByCµ!•´®#~oA×¼ §":s(&%Űó)y7áæ¾÷¤”Û¶m³š¢HVW’r%ÍÛ¤–û¡ ·ë‰bæ1;hÕ Õq =çÜ„iÔOu_|™CžJR†UÕˆK¦½Ë %¶ïª4k QÔñ¬Rê×­JÌdDª÷(´CìÒöÔŽÆ$0 ®\¹rþüùG}ô©§žZI'N|ýõ×­ï¾ûnÞˆQP;ª U^#™ä&~sË?¹iïžî’Š€f¨SUÆÒû-Évg)vI&"’JÚPDŠFF Sc¼4ºV®êŸ"o<Ôu$bI Y ãYÈ)¯ÞÓñó|EÅڹߑ¢(ûûû—/_>88øÒK/mÚ´É;â‚ÒË—$%—z1,Và¶ ¹¨eEX¹°–J¬K©g)@¿È‚åÞmgöK{´Þ”¦¢Ú…éN¬q!Xƒí^mÊï7¶ÕÌKãØÂ1"¦Ù?°”.òèÙäcÙ:iñÿH×/ô. #Fûûû÷»ß]yå•S§N=÷Üs+éã„Nèêê²6þçþç‰'ž˜µ)ˆQÐ d2µ&ÇêÕ,¨4ýsÎcÆc‚€¢­C ‘®gaV ÔÛ}Ù?´1¬^_¤;H’’'*¹zPk‘?Ô°ä©ÙýOk_*Or=$•<åÚ‚Œµ®q‹æèm# ýëÖ­›võ}‚*Oi˜ xRuÍ»°Æo„`2k(}eMÓÆHt:‘còÔvâ|h_ÔQ¿¤€•96¼dæšI¼M½ÝÊ|2}â„a¥²²f˜Š(ÖèšÝ`v / ðHƒ!|hZ™eu{ëf‹Ü-¢”;ʦ®b´¯¯ï¸âŠ+¦NzÞyçuuu½ùæ›öñÔSO~øáÇş>õ©Ïþó—\rÉqÇwðÁ¯\¹2kS£ %ðZçnôãAK„ØØJãŸI·‚’÷@¯?ÑØÁ’æjé´C`Y$Ãd;âkut`eðÏP<±Œ£/ËÏ­zªê†j-R݂鶢ò2óí<7¡•„¯´;Õ—Ê.ÕɳìK‘e¢.b__ßõ×_?öú¯k·0å]ÞH±âSaÍv8€˜;*Ÿp¿vVŠždy]d*æ! vZ½™ö·íóé¾`X¡ÆN,¦w¶£¦:2a.VÎZ=ÆÙ¯3çÖZ_MBF1æ¤~bôsŸûÜÔ©S?ñ‰OÜu×]o½õV»Ù³gÏ’%Kºººnºé¦Ÿüä'K–,Ù³gOí@Œ‚&'¥™³›¥TÔ]’‡‘ceÒX!’†íÊ'^£Ò·Ý.¬°²Q‘R¡ŒmÂ,á†Ü›¯ ¿‹'CÁZÔ‚Òð31º2e©[05Ì—£d&CKàÞü’’hìôµü22õ×½7-G_ñýeË–¹hÓ/hÕÅõ J|µ ̸””µSÏ®“WS2cy%SQv6[žMTÁÞ(¥²Øî»Õyè©a˦«§.ºf™Ž*vÜýï?Ê|5dßEDú‘Ecg¦¼ûê*W{~"þòT%Z)¦}кԵ´Ó¨Q£Æù¨Jg(íjDµþ€Öy Þ’<ÀQ2Ùš²cH¾òï1-ø=‹ÚŽåu¡j¡©AIP U,][¶ÔsŠ–M²z×Eé †©ŒòœøêÞíB¥!s1Ê|èR‰žð5×ýJkQTn}U‘ÔÕâÚ¦kù»I²3Z¾|ùÏ~ö3‘w²¹ ZÚkFˆêÉK×&-ÙÒ±³*–TYÙ¼ñhÑNa;ɬ¡¶UÃçk²sG?¯ˆ‰R úÝföÎÝ6k¿Ö< 5Î_ÁÞâ¼­ùͽMg* iÚFQ?1º)šJú@i'0láŽTé3uhAãK‹‘Úˆifˆò6ZùÖÃU:Ê@*tÍõ"µ ÌJOc[I{ºÝq •Þ®÷/H«#Q²Å¢¶\ôÿ¨*JÏ!··sC©“Æ®C<­¤gUIëJÅÆÈg=zûïÿ×»r¯ nݺ•þâñ¼Þš`ÉòÔ»ˆÉw£Š§,xÔpª ‰icx``š6µŽ¤–tHnx9Ìàn5,Žfð€÷•Iß<¼Õ±qں܉¤ä6u,뼦ɖ¿Tèý¹5× 0^½R›0cJ)ÛC-·èr¼ˆ´ß†bigP#Z~&”vMEyªãIiµŸ²±É=îÓÔŠ4ü¡®SÒ—Ó®V ÕR^ YàBãk­·™·?Ðn4lž5“ߩ˜%%©pû¥>V™—%2vâ5âúÊ­y)в—j%ëÃ<î‚nA˜†§¬>™ï%Öcèñ/Rƒ®Öž÷H¨àØý?ùü¶mÛ6oÞüÇ?þ‘Ôgp5;M3›`ªÅ¢Š-ÐÔy ºVM«ˆµ1IìÒ“)`AÝŸ¨Îï6!Æ”ªcùÔÙ÷-Öõ®ãšâ—å¹ùKÆ–?ë”Qn„CøÙ•¹é\Vø¬·©Ö"æ/hrZ~&”vÖ8§^ÄŸàn'‘œÓý­()•æ³0ñ€H˜û`3Ô§eisò²Ãò€KnÎdñ*Kä×-(ÉÕ®Vl¢î´Ù¬ježeˆÂ¢ä’HGKJ€ŒR  àðôÙÍÁY„йÀš*I)åž={¶mÛ6bJ±XuY¯.8qÕB̲ˆŒî”]œÏ*´,‘ú¿|µ÷¢¡i¸ ·ì£2¸ýÌ÷“ }ý.ü¯`¿œÁ†ýÕ—À“áç»õåÉYÿtÙÆ>êªÅÀ#I¬N£Ì4!Îöbµ‚&ãÏÝ»OÚ–£‚q¡–_ ¥ÀÐÆ0ï™ß­’Úžc]ï¼7[‚ „²ÈmW‰zš*ªÅ®¯n†!òNIÁXÖ5ÚÍ𜖴X4Ä+ån+¡`źÆHiJOÁêIiå…L±ž+ü®»3µ)wÜ ¾Ü¨V´úJyã¬ü'},Öž³ÓB}ñ,¥®·B#¥Ž[`9ad=µT²><ŠZ},Ut·¢Ø…“æ¥*”—A¦BŠòÔS²šTWÐ>Áˆt%7„7è…ß“B­@KáFãN½‚LļBVØ7…‘ÄûÓãÛ4¾JYٔݨ­n^ ¡åW`Bi'Ðzˆ'¾Oj•>‹È‚§WGÚ0"Âìx¿~3]¢ÐCÇDÆ3×\dÅGÕæóF‰ÊÐ ÊlW”ÒΧPåú©Ue"l•&É©½TU”•ÃÔ½ðúöªèºt¤¶7äÑølfŸYüÝï~wÔŸßIz‹Boƒ,õ0½­ºn#²,r AQ­äègbŽÛGI1[:•õÈB zg29ó‘è‹¢»…˜¶v:— ú3y†q‚lÀ|bø¨ò†¨5öô­†¥¯”™ËohýÓi?! Ó `u©µøKÿƘ//-¿“,«´ÓÀÀÀÛ_úÒ—.¹ä’ †<µˆ èuÖæI„;+ÓkSgÔé® D…30O—–ÜŠæ3±p}&¹83í^¤ \G”îCÎI£Vz¨¨m¢¾ ùzð¦8âPéܵ%% dòä‘‹Ü”h‰• ÒñæÄZÒö7ÞøÀ·þßÁÁAaՙ⥑8-£)Y­X¨®)žˆö’·³•N©;®•õù²îIàJSîë^òì©´3Kwr:Mª!Fé…Á7kføþÖìé¯Ì Gºß?2§‘Ê¡õB½Ò-Mù ñ3Œí´hþÓŽ €±Ôš–_‰ÈTÚé7¿ùͧ¦OŸþÑ~´*ƒ’´G_ÐaBT®wVR>QRBÏWw:ëÝRoñX˜¢ê„'™:´àˆ©¡úau+ugtœ€‘¤’×Q›*¨ Ù5üÖÌצE˜È4+T9R£Ó’¼˜š»¾f@Ãòîmó§Y_òU.M»×ÔùlܸqçÎ[·n•æÍc|Š´æÕTó Û¼ÖpÜr©LÚK4»WĈm(ç˃>Á¨{µ›Þ¬øT3¹ŠNÐ~0Õ­5Û ï‹l1†MEX}‹'EµÃ/Ÿ±Ý{Ÿ{ ã›'^uÈ@^aŒfd<«¯ì4+(›–_ ¥€—ô  —AüMÌëW²>ÄåËŽ*ßÕ£ÿ[ÇËlEOjƒŸïQ-Töº5Tþ ]ê²ÈM­†6UåÐíF’SECeJUDÝ5:j<·2š*0PƼx“ކ4-gähÖ{ZåNCël!Ç%¦ð¬úS¥ðð±[ðꫯæ~²'ÿ·KúúúDѶ"s:Ux¥n*¯fOÙ5­…—Œ°Z¥N—©³ƒ³îV¶a;7K½-¸·™×F® ¥< Ê)›Àí¡¿¤ó«hÌR½$¸ÇÚm’ß\UU«Ïx¹™º‹éÍ(ŠÉ´­ì™ÿ²T’É”ilÔ”–_ ¥@ՉϜ5ö¬ª‡®*ÐÉ+*ý­7Ä3Þøá¤H’¡*“Z‹±ÙÞ^^2I—‚2üƒ<‰G»ÎMùJ–’-‘~-IݯêO .Ò$H&€´î$+ ÛÓ8MŽIatxp^4ÈQ?ìEù¾ ~q„éì(éŠëW+º´[è©“ÌÖ¨+ äulMBp:Ú.Ë‹7P²wÚÎ}¦šüÙëVL-Y©y’³:w“eTíCb¦N_M–mF¥™ÞD£5ÞdtÜ‚¿`­}¦5¾ŠH÷î@ƒáMÅÕ÷UöZoáug©o‰ V¬ªK˯À„ÒN ¦TKnVźà>k¥ó˜Ô[_–ÍÏWVDË=Juv´3¢8wjëÃɇÈÒ‰¸hÐé,*!©‹•¢Å0ÈU´¬± i=l½…»¤‹ym ¾¤c(µ'Z¹ã)ý\“JΆ͚ÎúÀ¨I½<ðÀ?ýéOƒÏÝ´.€elfbiš…*Þ(òÐ j],å±¥¨PÕl‘ÏR8`KòRY¥¹µO¼¨ …Z἞HMç@ãç¦n:}+t˜K7WÙ³T´ÿ+eÜO¸¯~dÅ¡2y°ÑûÎfG[’Ž)»–ÆÝás‚{vó)»ß&qHÖ°™Æ@Z~&”vÍOoÊ´ƒè]"qÜÇQǺ&@79ƒÛ¢h‹¡_RLÄ›íKå&¹§ØIQ"‹£>G+››9Ž•£¿Ôɲm´ýOyZ;© ¿*äD)ó¶Îæý:¶^Rfáªô¥pÑQ[±ªUÆ"™,ÈáøýÖÍ›7oïÞ½Öz÷4óäß×seiD¥ÅÃýMϸ‰Ó7êCòæþÌq¯-‹VEU3.Öˆµ k+^à Xì*ð— jG[sÉâ˼Jž$~âỊOr§?ÅøºA®d!Ö¾~5l kKÔ/"“)Q_‚ìòNßü/€ä·øÂ$ j@c˜ªJ; IoH¨Ýêv2'XaKï>î3UNz°¹Q€4¼¨G)™¯ƒïË),²3fÀÚ™«VHצ&füÓÆÈ’.* 2°âh­©RàÃCT!gY`òHå6iQeàŠÊ˜¢¼V®dÄ ;hðß\aïí·ßÞÓÓ“Û»vÏž=< @ÏO1L<êT’Wšr“ô+Yì„™}eK·‚è §‘T/¥4ñâ¦Ô,3Eó‹ÛÉÆÔ1Vˆ‚™\EóÙËÄ·>q3è6 3QÒ’Ô©,KcEuõͨÓnfu–1닪Z¼Ö˃½§¯ð™5f÷÷H¯dec«Jß5k¡"± ã((–£²¬ÒN^ FAÙxž+5'õjhK.só¡gg+/ÛRE<‹\…nРâcàØ¥RJ,˜çŒfM³ò+?2KvÑ-3=¤í‹, =”2J²é4mxt‚Ü+¥–­ÆKZyèñíF$US2ŤÚ>aÍÒVþzppp²— [,º/Ú‡H•uÄ3™BÑÆ>è!± `;Û]iPËL³'¹âg“îÀµrIi}ma-ê÷ ~¹}öTë† žÝ`„_ƒšÆ]½Ý 0f˜ u-Õ­k¨çÀ,â]Ω‹äÄ”bÿý‡ÂÞÓê("r@FÍ[ê ü™ýeDà2Ähµ€ià|»}+kgm$ M™˜(ç»Þ ¹,¥öÎ!¼}Þ‹.ÒiE[E†±up»S¾TÙ8‹Z„´IÌÐsjµtkBe µ NNÑNUbSPEO릲Eæ.z…2¨˜¼VòÔ,¥IãÑ9@ª|¦’ì{öìY³f(Ê¥K—޽ôMKjëÄëÝÉÙ7ºÖ‰S¾ÑºpÚì$Z¹ñš¢ [àQ¤’jQß3áôZÖÖ¢!…u¼«¨jHgÓ²H‰eá·%sgVOÔEüò‹FË è6Sã¹É™^‡¬÷«GšëƒÞÇ-bšn™4Ï>U*™”^øÆìã{ l F5£-JCÞÊ ‘ºÄê›1>²,çâväæ5{ã‘Òc¹ô«´¦a_Œ(2jÅ_ZCÒ”")¹QëÑ¢6Ä’Ô3$&KZïºÁvr“'ÚIèÖúŒR¶ie&Q×9[¡×X mP4ìg*„€‰uú___Ÿ”ò¤ƒýíok‡WòBT<¦³ ÿG}ÙЂVúð‚ZÑ>¯/®îΑqZš«S «£Í¢®å•&¡¨wóÜ %óãB–UõF!vå¼ùϨ_»1¨…ðp³_û@~)Ùi*£¹/u¼kO_ž%æËÿË•Æ×‘ˆþkéÒDÑòbtM4Y›‚m9j÷R^ ߬z¾MLh-¥Û-*bŒÀÌ"Dô`ë4ÍEÁ>Ü™~ðU;¢íd0SçU a·3{¤ÞŸ×H2×ä”LEqë—å Åw4•b‹R†;“ezŽš¥^(j“σÈÛºGJÉEªE2|î÷©Wÿ¼ð¹ŸìQfE;ᆗ|7Ö8ålÎõF+à¡~«ñEî"×‡Ó õ&=ªzìfú[ë<åˆ×SG ºþhÇ®_B¬¬ö¢1±ŽÌ-ÒF ü .ø«‘1cl*ã%ÍY^Áý§e]öž”}¬ùêe_ô Á4o¼Q 2.B æ«Ú›?y¨1Q 1ºdÉ’[n¹¥òv F[‘ÚE8¹Æ³J4µšTC­bÝy†„²*r‡Kå§³ˆ=«˜(ö${~Ó¨w=˜“¬Ð½mq,*•c:m¹£_ïFš’ÕÂÔãdêSÒÒ—ÜäÉâVH­„ Yà/RïVU !Ko¿ýöÃ?,dqüa/œúž1,nUP©`$E-Ù<„™Ýú¬PK=ÓÜH^ljAÈRX‰f••sçŽum0&_QiYSîÛ³Q²GŦ1´¸ µz“6‘ò׫¶.ÏÊçñyûÒ‡û›z4A-'^±Ë{"ñî­~˜æéxUÓ•X `ñê×]ƒ¿x‰pÙƒZ3Ähµ€¶Tq!{ïÛbRþеš²RO" -VÁv¶›U0ÜõÅ{Z#ã“z8YS¤ƒð˜æàÏcR0Ú~© gJ¦Ktmsèî:‘™P*CW7s­’Öƒaá•B–Tº}AÏmž+Å¢¶üY¦VæO2œ]©T\µjÕ³Ï>K½„͆A¢©¬€¡8VbKG&¨ÔuQÔ³!¥žº"FH‰T³T“P‰íô-¿Êº»‚ÑwO«q†…¸ ·Í¨¼Ä=]kÏWA¨:µÜ<Ïõ1m¤aðÝøÏÇŠF ;ŠV /VÁê…O…Õ±Ë0ó# ¹›zeåHsm2¯ÈÅŸñØj%ïÇuQnÅCˆQ Ä(àxê:?™ÛŒµjðl5ÏŸÞT63OÖ2ÆôªØM½‘B-Kö£Ô=Iñ—¬peM$™Ò('6Àh‡új9uÃÊÄh8Bîë' +õ¢Ôphêc‘†òˆ™ÌlK@eüï r F5£­E^ßãzxðXvÇ”©ðÖv÷QMáŒÃùnY’Ì< $­Õˆ”¡ÍL »<}Kò¼S§ºqS¯ëÅÙYBŒdzKP"6K[1”MуÔi(XMC)7eqÙÁÙR)o:YÉ$ŽÖ‹ÁÈÉÊ«¬¶ƒƒƒÇìëã^y4˜[+ùÎݸ x%N.¯ÙÔq2 T’Ú˜p™À²²HíiÛ0}›×®f¸¨‡A²PêK¨d2zUÐ{2ǽ`Yùü:ê`_^½U‡m¨ØšÜÖ+JöK”šŠ×…Q¿Má,%e|Ë¥3/ˆV2Q!ºLá–î!•ÚoŒ°yHUüsÚØ¿Ì EÕ@Œ‚²)ÏVÚiÚ&-H"ø³èÛNk‘ʘqÊnK&•ÈÝìíEKU‰SJ-é#WÚtÔ~svawa®} ÉjŒít²²Avå)Z«I)0Év6RdŠZ\’ÑβH…]³P /òÝÖùî»ï>½߇Ú,†1®zæ«g˜$#¯µdÞ ª {Q½œt­€‚ÖñÜH)TÝêÎ"<„ËV&åIARËÒ»C @å„Q6[°±JÃz rñ¬àf`Ó7Éw3ÐEWïÏë×£ÙpæQÎO̲q’2æWŠ_¯˜¦xï¶Ä´j‘ÆJµÊ•eÙ™ô7i€Õ@Œ¶ e{ÉcÈ–µPÌðßx†…†¥„çP õ!䥊òŒ’¬%¨~Ä’{×ÊRW¾òNỈiX)à’B yØ¥ÒF$¥dŠ*¯”‡ ñ¤ªC¢hH4£;Êì¦pÉ¢¶>Ynk$ã…ªQ›ñT‰P^qI÷ûçõ>ìÿH)GoÿÁÊB‰‚1ܰˆ'¥¢J|À4óú\ø©iAY$©'TåvºÀä½ P¦š«A¥d½çÃ35LªüN+¦SQb×—¿NPk¼uíÚøUÍ,ɬƒV(‚ÞŸWÑr×À¤ÖØŸ¡~ñ0µ¬uç{¢q;(ÿœø‡"y‡ˆrºÐÖÜyÏš¿_ñ™ÆÀvÐwiVU;.£ˆÑ!Iý}F:¥Fåè¸<½Î{D¦Hg¢“³¬ aïZ7µÖ¤ýù±Ô   Ô©ŠNvRF(¡U‚‡W†"¡xRûyýt´ý¬$t &n Ug'§Œ2¢$RYí¤P[Á¤ÉÆÆò¥„,æ S®YÒßß¿nݺ7ò™1Œv*ÓËZW=P¼Î‘Pyåútx~5òv•mf ë°Ú+Yyój)ì•[Xó,Z7œfJ4_6øµ34kA·&•d ´i'U*`ú˜VL eZõ-jÞÿÝ‚Ÿ”.°ïM4‰¢ÃD±)‰rJÐýk2Oĸ¾Î/%¹_K²ûb&3g –5ê¢+ž‚ê1ª•üåå²,êÛ h¸ÅôV§êÂÍ)a9=áv•™d[”’{Æ)ÓÜJèÉ“¦aÎqžoÄ‹‰”,“E)žÔÂQ ¯<%µÔ-™ô„Š;$­³,hjàw¦ÝHkò°K5½ZÀ‘„"1WÔâ/˜¥mÛ¶íܹó7Þ8øÂnQ´V à>evKAðƒî=oŠ<Ÿd7lœ%s2ÉL5S•%X«CÒ t"ä…·´5ÙªÃB(©)©‹Kyf~#}©OßÒOÜ ke\•ØlX!˜¼ë-ˆ†•Õœ^çt´–AɃóƒ¥91¶¸ÙýEçÔ¼… | ø©â½5ðUUkÏÄÖ2umíiå½Ð$@Œj FAˆ¢äÙ ’ä³÷؇DgÇ%¥zH³ç(ås´s%Äü×R<©/)Ñ“×S+É¢ÈÄí£Z2»"”%Meƒ”&c•Ö¤nóLE‘O™|ô*ÍÅžUž}¯` UÉMš+=ZU+Ô2µJ)Eaðß¾q¿'^ÓÃ0S^t §µ½¤…W80î”§4•«N/:¦6¯õ7‘5c–”¬Ú†Î.Ø“ (¤Õ”Èt)é.2à Šv¾•K¦YkôëA)B Zc°U zóQ1ÍÞ•ÃøïKc”»Ü²zƼûé·ÒÝ|Ý9q¢¶=XÆjG+>5fŸ I%kV¼¹FÀ°:€Õ@Œ¶áÚ0IñOYIŒsêÎäL]hP&…Ãj—ò¥†Û­e™]So·$Éfž±Ä9|EÉÔL¼v}‰E|²ì! Ú¾Åd¤‘ü$KVÎJ;ËÊÒ:5¯Õ-™ ;…y^¦ùÌ¢¤†¹”<éE)J²íoºþºå¾lËpKºSÅJê᱌Ë2ÐuXåiñ¼"–_«ò–ôÕ _Hì53µÕ;ÐKzJóJ©çèôÃëRTÆ`’æVÁ„¢þ¬ºP•öK¶z3ÞèÒ3•Ìï+.©£ðKm;µ¬CܼÐuñ|ew“b.}¿Í˜Ý¬.<{Ƨ=E¼»ÆcíLï±­¦DÁÐbT1Z êÆTOL#™ço½~*ǦVð¦\W¦±›™/b5.TJM·`ºÇ|®K2×qaÞø m¢d8 üàd~#¨Œ©¡Œ`èzOV¯G’Á,Ï$žØ>yf¤`JãHV2:4>ur%ÄU)[=RJ&(KZeNú§gþõ_ÿÕp÷—Ìÿ•Žç)\%v AfºúsGQÈ¢zY*Y²ÌrRsá"h}&²zRÐè,êõ•ÿ$•hîäÖh~?:”¶¥¹Ù"UdRýÿÙ{ÿ`Ý®²Îsß{ó4Áà„ÁH0’C“ŒSŽ¥–ÿ@©¥†QgXÕVQf¦gôtÛÚvѓ։Ã(¶¶4J\i™êr„Šœaº±0S#L±Ì *Ð@®¤n ÉMÎ3ìõ|¿ßgíý¾ç}Ï=çÞsîÝOݺõžýî½öÚkïýîÏþ>?èYJèkAÓpYâ C{޼/X]uÖ:<ª¯Ö!4¢ê‹p¬Iá–¦Ù.ùª•gbËÉvHÕ-ØÔèFm#NHúDô`ÍL8ƒx¦å“À"¼íšÔŒ¢QÔ`Å5uæJÕôŽxõ{ÚŠ;â½ðBá>o åWl:.iÉr‡$›ï¨zôÑGßò–·}ócç=úÑ£o~<¬¦qœyLTÞUF¦Á 8WÖÔŠR\CjQ/ÒcáIaËPL£{ö­¶#&·…ÎeT°>ß‚%ÁË {I毛Ý86á£HP[p£5תֈml|[-r܇áj¦°W¿ÁÄëŸT]ž}ý(ü<Œ­²8O®ß„x,äf7AŠÃç- A½MíÍH¸Iñæw7ÏË›%c-SÅÝVžÊÇÊ»°¶ÿÍŸQÁ]µÍ¦k¸ðN·?~˜m×6Ã(m†ÑsÍÆ¿×‹¨ty¾B#R.TRƒ¶CòìFײ´7s¶3yö ݨ¢-eý‘€B *Õ/KÃçÍH„H2#‰núÜ6æ¹'>³yÑDÌõOõ¤› [KÒmÏÔ!;Ñ…Prö+¿JùR3ûÍßüͯ}Ý]r €êåXàÅV9V‘%‡$‰f’Öçø#LÂNçWz…´àXÂÙ¯§Â'TáLaLóБ;¥$"ƒ¹_¦ y½ªÒBFóªÃ@ˆPÀm”KMŸšâ3•HùÕøMɯ"#šå5¼$}*—-àÿå&á§Ë4T\Ìa×¹=üÙf;gíìÑííí‡~ø©§žÚu 3Œž}¶ëßú Nmžš¢©ÀcS·ö!­Ñ%*¹ ÍjywbfÄÙ c`¸äåߛǡɌD±ÄÅ=!Ï|êQp• „ƒ0IŽTPƒæ§•2³Ð•‡† ÛŸÇVº¿YÜÞû¼ÙÙ³þè¾ñ柯­i±$Ð[L þÖ½kh»ê—pÙË:Jƒf,Tjƒ‹œµîQŸ«¡|½„X`<‰|ïQEp0¨Ú»{½9 ›ê|Z¥ÅSD&„² 1…Ž·I¤CèôuGã+±h ‚hŒL˜Žh¤ýO’¨9ÄŸPÉó™Ï4 yä‘Ë.»lݦf=¼¶D}á:»ý)êqnÄTÒMi™A?Ó¼F_=S§•8ÖÅ™:PØá»¹Â"%R$9h©ùa+¤öÓ¡ìòë²ÊJcV*Ù0qÇ3ôU°ôxu¡6´t”ÿKèÉff|ñÏ?ñ‰Ot½õÿþ^þxJFMp‡6¡@› °×´þ”óŽH‰Ÿ²hÔkC'³¤IöRèUþL¸$\«Æ{H“9«J™“äïžýTï¿Rõ‰NÆ¿ÉUÒ*¤I°qÇC_œ¯Þ‘üºJ¦®¡ÿ,_ ÿ|ÉêsêNìhM’Ó½ª¹ü·h‘–¹‡Î¢ýp»¯ØæéO«šíPØ¡‡Ñë®»îöÛooÞqÇ×_ýºMÍ0zÀ­y³_×¹¶úÊ+¡­Ä}šÑ­lS’S‡Ʉ¼Š'}¨ *‚”ÕÄêÁÅ<ª^iýIÍ5 ³Á ‡$†–d&),>"Ýi £¡eàR¹©f›Ätˆ},±µl?üp×Û?õ®øÃì@¬‘ò®ý²—Ô»íG xUy»“ ]ÖÛê¥W¹X0¤‰T²ÔÀÊÞjlÔ_@gvõ «Ô©­Çˆ­!ÓÙC„k <ì¢IÓXXUCqUèòr’+Jߦ&*C½Ò±©G;”­µ<ý)o2Ír=„q@BnoÒå¶RÝÓ^S›~®ngPÔ\Í×…ø3ÕælÓ=ŒÞ{ï½W^yå5×\sã7Þ|óÍ7ÝtÓµ×^{ÅWÜwß}ë65Ãè!µE‚Á¤:0q<¹|/ãgØrf,Ùø¡> ¯Ø#’©M‰É Û,,›ù\oÈ’dWpq7ºˆbŘSßëÂB– •Ði¥“@OöS‚J Ÿ>¼Ã=ÁèøÀ‹þ‡_õ<}^áIò–»ŠÊl º¯Eâ4¥v E\„0R3³çRDÉü»Ù8ñ`cO„aPWß}¶.±$¦„ð*Ê(zP{Û„”„~&^QþN5¿èÙ0®%×?ýš ¼®Î} –ëp‹1cI‹–Ñ}TÛ™øEPwÁ¨óã©è¯oÂvKHS;Êû­êhì¡¶:Ûl{k‡FÍìäÉ“wÞyçí·ßþú׿þ¶Ûn»óÎ;Ož<¹‹vfÝoÛK7ÓN?à;ª›ðDÛ¢GÔÒ¸«I¹¥~X´¨hAÞqè›&ÝrO³wê!¤ªG6ú%‰$9å8¾D™»“äb9Ïq‰J„ Û¢;ÐjÔûÞyt­æª‰êZ–¿nXŽ?~ý7ÿÏ/=ö(0‹e¤²œ£Þ¬»‡ã €žÂ葳eæw×Yó’Àz_Ø T•.§®Œ²àT]¤úëÜ¡QfÄý!î2|‡Ê\®¹Ö£ÿ~id,ÒaEöQÔ øMMóèo¬¹ÍU_m±ˆísœ„ÄéŽ[õã¢q‘àv…Pç«Í ÛWoy〻(ê:9+”³í· 0:Ø\ÚéÜ´Æ ×oG0qs´Ï8K‰u«›äµ»˜^cæ‰>ÄiÂF@Ié†{™oWJ·èj×SÃ#ÞÁûœ¸!EÇ,mªç“÷ÔŠ¬]¸–¶Ùñsd—tp­1#Íy·.LlðôÍ_÷o¯¿ä/ÚFtò~|²õºfrCHkrYWªV‘ÿpD2û%dæ ÎAÍÅ®{á  >ó@ÌŠÁ×l$UA¢6Zâÿ‚˜‰µ4ÇËÖ7„îTs O²ã& ,Œ¤}ä³»¼Í,xJÚH —·¯¹Š_"‡ÿC슊ÀÆãÖÌ«ÕA›*N9l² käò4±ÎžÛdÏOåpf›m?ìÐÃè\Úi¶=±æ×¹“6ƒ„³t‚>"K³¼yÞG_'pQ€=UÛf[ a6yžá[‹rZصðhEÕ&è³$5E"÷ØU¡­ŠÿêfY“îhL¤8úMô`d ™ÃâWýÂ'žõ»lfýÉßu¿±Í3"³%áÐL4<Â_qŸx®ª!D;ð.P8ý±­øÜ+ÿIþ{=}™;'‚å·â[AÀVFÓææß×bÙU´d&Ièៜ€ê¦:è7>›å]Bgf¢úèïE‹‘ ‡Æë°‰O˜zß[¨8b×¢˜†[R¹v¤¿NDŒ§Có™ºQó› ùv»³Óúyˆ2èg;ÇíÐÃè\Úé\³é¸«œòËpP×jk‹e¨Úê†Ð cª¯iˆ'AM9×6[ƒä©NÞ-ÃYŒ5 ºWbriPŠ4!±'¯4Î}ĤÅJáÅî’ NO­µä£”;ëúË!a …UÀû|ô“'/yáGºlÏúú÷=ý—?C2†ïT­Žõqب£*¡°ˆ|‹4/RÖ±MÑé²7’§&´a¸âådç{ˆãl}O ²è¼ÛKœ¨¢p ¯…WDšŠ&ŠÝáò¿tñšÄ‹S\AÅQ®¼rÑ4B^¬-Jz–¤¨vÛ¥ ß*Ô¨ëø«”‡yøYÛSM½±Ý%H-Z8µÚiBÒS«Y¯=—íÐÃèîJ;½ãïxÅÈ^ð‚¼üå/ßÏÎÎ6m«¸¨¨­UŸoJ˜i×ÇAz\”qG¸”²7èa2äD˽OŠ $BQ@XL®#ŒT+!­!F³‰{bPÐ(¯š}èUáÃØW.uòL(‹`£ºßL¢…9GlZ%é¿èpÃøœ÷kviûƒüàïþîïKè.Wouá3! ôJÃtÓ¤oQ.ÙŸé4ý±ž-í£®)Ú¶W½„œø3CE‹ /<"MúÁkƒfµãç%‡1á HH(bXt¶w Ø…^Öšõ½„n§ ÊTÝÖ>Þ ,µN†^:,ƒì"±?rå¨ËŸá­C[Fk“œÃI×@¡ÑÓMïzìw¼¯•ø8ÖXXa–3Ûl‡Ý=ŒÎ¥µí•ê°l„Ñ)i¡oôÕûÜ®¼š¹£&>¦¥7©÷t’ Ô6$‡vˆ_‰Âª9C0Ô«¹•äqåŒÔŸÌž UeøXÌ%¨å‰rKîèVÃÁvˆãLqI–­<ÌñÂWÙ«ÿéyõü$çf•*‡­† HÉdš|hSuÙtÚ'ß»“½ ý Ï{eÍÍN–hÔ¦ 7ïyšHîCûá'pdHür@WÍXZ`áU|Àk BBõ¨Mé°˜©š^âˆÉKˆ\ŸR¥K®¾)I Ûñå­6QüH5ŠÂŸu_;Íê-9]@Õ07UÓ¥S´IqR =¶.Ëî_Hël³ vèat.ít.Ûê?©ŠnËÇxqŸf„gþ˜gêºä6 þe²f¢çÔýæ£zŸÕ±îÕà‹ÑíŽYÖcìPxR§Ðt„Õ¡ †|HnʾHlêÍ<+`Y¦DŠ n3Êo¡{÷&‰þÀ7þü¥úoÌÆ¡ÃÔ ‹!‘  ßÈ´~š2#+„ ƒ<ñ0;d»O)¯Ã·'"¹†PfÐKk&Êaݼ¢§ºø±pÁµ.µÉ¯`Ó :fÑðšÑ݃ónBu jó×36˜8¤@Câ¬gãñ Œ*¯-òAKþSscvR#vHnk·•°ìE’§ûÆ%Žû£5Û>›µÂöÄ ¥Õ>Ç{_dgFg›í Ù¡‡Q›K;Í-$¹Ë³9¬3bÊQ#Õ§(SþÔ轺DuåÉ]‹3Úœ¶:—µz‰›*”úŒ„ÃWtÐÐ[©vI¥­z‰Y„7?ùúq†ÉNf5ŠP{ë<Þ1Åû)pcŽA ®ËÞÿ{Ͻæ]±£¯~l8–“àE‚КAÜÕÄÙ»Až,qwž;O0Í„'õY“½ôq8­¡ÿYú™ åDX¼“d r~*_¥";Oò.à?‹zaPš%ßÃt¯µ5.Å¥»%ÐÈ&.KüC¹(á3 ä²_Œ|¸ø—Dc‹Š¹Üôý$¶wÜvGéz¤ãZ¿|GǵßÕCÍÚêlËíl€Qµ/|á =ôÐî¶aô£ú<^êb›"Nê.OÔ8¼E v–·¢èçcÏëà c‘®„’k®´¨P®fyÄX-¤þb¨z˜^£ÝÏKrê}!¨BÝâîî×)"·-d©cISõ@3Ö ;ýç?òìwÿ;3»øùœ÷¦/™ *Õ]¤(s¦ é ™L=ì½Ç80m`üÀ‡qóÝe´Iq#Ù xiåN ßTç8ÅÔújS?œAÒ­•ÊÜÎ%Ä à5Ã5ïa¥žhÇM^]¡6FŒ«e¨)€zRW½öôR—Àe\6ÃWê£7Bœ/€G·r=à‘rÙhŽÔØçIÛ'B¢Ý¡ýÎúS™¹ô€Ø©¿Ì6Û¡‡Ñïú®ïúÜç>gfŸþô§¿õ[¿õèÑ£çŸþË_þòÏ~ö³ë65Ãè¾Ú©cM©+…o.êFȱâˆZR4l5²’çQÓzˆ‰À ºrß EкÌÄß­Þùâ<á®vüo®J²‘fí`¢Kí’3P­”ÉPF•¥úXj¾ ‡ºiŽ ê=áø” oðßÿýG^}òŸøÃ{+¸–Ã(áP(x0”@’ØVœ— ØiT¥×ð§'½ð x ½DSû’ºHiטË ëu¢ï9\¨›^4K<÷ȉq}mª¶¢àâxµ)ží¬¯#¶ÈE ¹Pü³¾uTÖ¤C?zç—¦°¥÷éd7¦¿Jm;ÍC{/Šö¯µ»å¶P:Ý;¡ô€ßêçn¶ÙV±C£]×=ðÀföªW½ê‡~è‡Nœ8ñøãÿÄOüÄþà®ÛÔ £‡Î&¿–‹£Í|ƒîÕ ñ$ ÉòSÍjS¬„úÞâ¦xh£ ÏEu’:å´5ª6$æ’<”ew%BöWY¥¾,hÑÊ¥Ç>vˆ•`PÒ¢ ©”ã©m H´½½}òäÉ úð‹¿ç_{Õ£8€Nà? {hAkQõ^Á4µ,0­;JrøŽfq«b(’ª:+ù[¸Ÿ×†Ëwê%ù›Æ ­…aö½ÞJÔ€N°…Ø ™×Téœï!µ©D™6¤»eœ2?q±Úè” 9ýiÙ*óx“‹Ü(SÉ;´ ¾1Øwzý8…Ò£y^bÌ€E‰tÅ×cÈð\²®"»b¸va幌èlg=0zÕUW}üã>øàƒ—\rɺMÍ0º·¶O?”Ã,ÕᡲrEö©ÑÊL²gV¢Ðé@êUÐ5“©/¸+ÞóD™Jh¦Õr8ÿd ‰L¨X1GªsÀ …DdÂÕîƒVA`C´¨uD–&£Èb½$Ä\šOwĬšÜõö·þ³K~ÿÃü\%Cë;' öIl$a"o/x*þhè¬ÀMpa‡úóŽz<}P…Å¡Ïuô,Cföœ#ýˆ2ÇßRdÂRgP³:<b®ÑLBõk@ªÃfífåÄ„«ÝF-’Óý Ê/×X“_Y ç¯Is v§W¸É[e «aG]¦òÚ˜¾Ëµ_~yäÐÖÓWåÎQ㲕WëÃäïgø­[3*iE›w¶3bgŒ¾ï}ï;yòä 7Üðû¿ÿûûîºëÅ/~ñºMÍ0:i§â^ßóvNÉ×±F[ ‚åÔEòŠòX j'§›<¼;¤“kÚÍPI^ÒŒ¸!*\4§Xö9( öÖ%Û’(URæN Z j~&¥×?"‰hE¸ÅE&¬K4¹,ØÛ¯Ýzë[ßZ¹þô¤0ÚG­7·¶Æ5B8ŒÓ`Vªczó¢cΚL³ÔwV:ëyøI”`×ó4ÒÑ]çaRø:¶pvgÇV`ˆERéÂ[ݪ& y¥Ä ˆ«Žxê»0ãg\Qþ*‚I0¼ƒÀF1Xý|›Zœ6ž¬³¾Q1Ñ\íÓÛŠ»£‹vbý©Ìzmj¯lÇHÖuQo¯~E×µÕÃöpôf›mvèaô;¾ã;žÿüç_xá…—^zéË^ö23{ï{ß{饗ÞvÛmë6uŽÃèÁ!^þúãócQƒ`ˆ­ˆ¤Ê‘PÌSb@Þðgþh'Ä(.ÄÐ:¨•¾•«¤ Ñ^BåÏ$ë¸~Y;éôÿ>P‡HHqf£ {5Ý»Ø)ÂFáþ¦ªê39‰ý¢¿û“«~1wÙŽ¾ú1•u9¤PM%I©ÕyʹAWÄ3 9PqÎ ^C3‡^qÖ¥,H*r)®‘·+wnùúm¼,¢p,ý8ÏŠ^u?M€ÑH’qåçZ®ØÒ` ðî—«Ÿñø‚„Ó1G#F9XSÃ(òz“ü]ˆ•§pZm1®ñ¦£à`{ÑŽ5}˜Ð>GéJŒp˜Ê¾oJñ/±FÐÝi啼4KÄÑuµÛUl?Úœm¶½µC£ƒ=þøãŸüä'ßÿþ÷›ÙŸþéŸÞ}÷Ý»hä‡ÑƒcûT„OêšZd&˜8ŠÕGxûaì»[a" ™ÝE°žS°š•š6®sZZQ. £`¦B¤S- zïÒÍ‘4b'%°Ò¹0Ã1Ý¡ò‘ª•½moo÷ÿüÎ/}éK?ú´Ï_ô7Y;F5@o¶Ò% N»ðqJ!׃é}ÎNò™,ì7ù£T>Æ Dåé\¼<è¬Ïü,M®·F¨T#\•D3„Ò/R¯ê†r¯”U„Ö´wh·£)‹¨ {¾šõESS6Éz;¨š+­õ8“éצÞxÃÞ›¸¯c…ÏÞ«¤½šØcð:ÕþÚþú¼ö&§Óâ¡tYa¶ÙÆv–ÀèžØ £‡ÈTËM¬V&6©æ°ÄѰ _$ÈO[“°R9IKí¨ÞÅÌKÿXêP Ô•¼MxÏ‹0 §°W5Fª—_ýøB-.g6SVöβ9\ëì›ìhf=ôÐoüâùozäyo~û‘¿~’ÂdŠýÑ»~Yû ³ ²kÉPÃ+Í퀇ÉÍ}Ä*O3_=q•}Ðô,\l"¯rG‚ÚDOè”)œŽªì:¤V4GÝxÁh\„ÍÅ/Üy± – WO™Ë·¬ùÕĤ޲‚ô&ª}ö!âÅ,r,n+Ð*>OÆq¶Á©Ka/P¾Š©±X•- ±!bÛŒîmßÊú ãNÝ羌Ýgwùlç¤Í0J›aôà[|àíü³½ÐW8U öº°ñ‡–ðˆ­ U¼ÔÜ¿tZ²ö곜6ˆŠ8½ðV&@¨çwC q¥(c9„Eš iì¡:—©Ïõ$ >-6øÊ³=y[gùÅ/û¥g¼à~‘c=|sP8Bq ºN]B,œeeA2LLNò(Rþ)zGÀª¤áe³‰ƒ°é£z”©PšÃš†²ù>ž!²3GB•©˜j 3ë…ÑË™Õ0gÇzź¯èž˜¨¤¸J}ôÂÂFSÝ==ÄÔöñ­€ š±N:€ëJ×ÄȘ0"—h¬Èd7*­JÎÓèšM£€ñWÓ,Û¨­§Vªé‰sÿJ“žâqÍ6Û®m†QÚ £mŒ3¸ä÷qì@äW=7 µ¸Å%Ý4‚ó2 í·ÏläB‡Ç°£­þ\C­èQ z¦6eÈ,J§7»ÈT‰ŒÂUªÇ®^`÷‹Ú¡?õ7;YQ˜ƒî(¬‘ùвæóîxóóox+ÞÀL,áî¥R1°A¤”É®:ÔÑ,$’MŸöÓ3×>ƒÚ}y~ó¨ËöìÅQ˜ðªgó©¢¼€‚8€^Áo 8.ˆÊ"¦â- 4ºbj®Þæ+ÒUñ;«¿Þ\XeP^rÛc`ë”ÞoeSʵoe8ÀX¸”+@nÅÔ)N¿#Ž^“F쌣w0n“­-±]8²§…Ò¢G·Â»q‹¿Ëºq%ÒUv=þ m¶S±Fi3Œž[p¶vk^ø©}@ª3•“‹¨»Šq©i<ñÙŸñ6.©zéšc½³¹¬VŸÙF|jÊs/\…äø©“SK)•cÿ¸¶\¬óž*ωŸþFçÂX [uV>ñ‰O\ûÝÿ[ýS<ïfäבc}à­,* ‡œê±C¤A¥IÖ¶—AИ<±†GáÈ5tÃs°jPfˆ@’$_6àÍ×Ä|„ºJ§Á XÃ)ïÄϳݥø³æ/) ï`[Z¢â+^—[ÄJH§ãåº#ƒ9Y_©Ñ Sø ¯pã•ÆRãl¹\nòµwO˜i v)“íá¯ÖDãSIW»omý¯ZdêàËÎvÖØ £´F£-Aןrø£u+ºJ?×8éff1uSkK2qwkä±D#:ÇÝ·K¨sØfSRÔÝßtú;¾l¨–† ‰C•ç²èµ'JúDY(×)üèɾåÇ.xèßûõ¯{öWºœÅdGüóˆX;k'ÅÍÚ!~Óš'˜( )‡£ÖŽˆAÂè:g©n¨¼®1®xi+천#åWP zâØW>Eh\9Yþ…YìKЦÛÞaŒä0†ÌñO‘í¤\±zÑ6·‰QÑÔÉrs}Í%5¼àMù(–`åÄ áNÊâ:â*¬¼óäœ!\dÉ û![ò¬éÎ8Û¹a3ŒÒflßøwrÅ›ðaìŽí5:å„kOõ? ï£æ7Ò$è ×ä!… -ö)%HÕ¿<üyB+.¿Ô0!¤:”Y(B¡RQ]Ó×”úêV:T ‚Þqt€?”g’¢èHšAñ¯þê¯.zÃ§Ž½ú+ϼïÿí~c›èÓK—Æ""dæž*lȦGä€Ç_XЭr”i‘c7drÔ->œ2dðhB½€ áãö¦ªŠŒ=µX–Þ‚t>¡çKãPEÁÅ%=lI¡ÈŠNÉË€Ú³;úÕ‰Œ€ºš‡:ø…]C8< ÿw15jwæÐáð›;nh“Ð×Å»áÊD¯¦×Aêý)ü¤­Ø±SùÙÜݶ˫ŽÌræl‡Ëf¥Í0zHmGG?ÉMxÜÔ”ƒêa>4ktòzù i”Ó²Ð"A!F–€Ìòîͽùââ§~é@ N^õõi_ñ´Ä£èc#ê‘OÖY>’¶/<þ«]¶·¿ýíO»é?u`þ°'YÌŽòú hŸ³ yС'’—0’È.J²•Š|¢_†Z¤`µ‘”Øž¸ᬰK]±¡Š;Þ[ˆøªìú&Mþû€¹Mý© Ï‚ê¬Ô$*xù=Üó‚1Í”×7 _ÿÍ]À Ø$e*µ7Ëp°,GÁ0–u6F±×¸­4U¯sQQp/ÔË{»1)¶ë,ÀÄEÞ’(|îÌj{%îGVÐZ¬y Àô@uf¶ƒc3ŒÒfÝ[ò[³Èm×$"L¸ðòÄ3 *Ë`ð„Ž;ÓIµy€TÛ”N®ž÷(äÀ×à0“°ËLÜ1p§æ‹ ~SRmæŸÔ 5¸³°+¦2Rç²dØTÄô.I N¬»‰bï Ã>Öà,Öe{ç;ßùMÏþê(gÍ)ŽF©³ø@ZódÍNŽ˜¨r& YÄ6йGJ‰´xa,åU¥Ú3Ƽp0©7{ßê8H€DP‘1’I@\Š `Íá µäý!ãÂŒF— u _¡X‘ÿ§‘yB#¿Bí.ˆ+Õ¬v±¸y‘gþ9Uóhâ¯Gšù¾4Øõn,‘ZDOuý¯+mî‚xÔiÓˆÁë6e{],yrXleÌùo¶ƒo3ŒÒfÝ'[ûA2þÕ£q¬Éc•OSyT°RåIP˨ʽ¶Itƒ‚è´Aÿ)Üâ˜ÂÑYsèRŒûÌ€‰àq†¯nn   Ä,ñ(*}fòtT& ˆ ŠÕˆIÀY²®·K?üû?ýÓ?íäÎeUOER•àÔÂþD˜D¨aâw–}e6@ôc„ ‰3¾Õ U«ú‹ät(—Þ&{AtŒún]¢šwhµCÍÊ–ÔËOà¤{JµS1õ¡Ö ŒW¸øÇaá.Ärz­@½>DòS áVw¡²}û:§/3~Õ57&Ô\.ÙŸTkªª^Hµéɪí4±¤§ÖÛåD¸ç 8)$Ï6Ûa·Fi3Œ@ Ž?™-©YgR‡ /,Ñìø•ùÊ!)%Ð'Þf†­†Ç3½´Ù)SPÍ"¡g4¯ß°QO– Šf攕ÆLk¤KUsáÝD*Ò=“ w*Ù±>zíÿzË…vœ5µ^]«ª"Ñ–Ê‚•Œë =9l+ÇΈjetÃ(zžÙ¥ÊÁÖ1ú“^{ñ׋j@@D€5q MnVq7ãÌšž\ö(–åÐp¾ÌçÍòYã>/ƒ W1“ |¼~vk-„ö"–`TÚ×€ÿ™x¾$WÊõbCÜg ôtJVì^#š®Ü§µ(•nmA…ãq9÷áOnÒ=&<þÈ8âÆJ̳|¶ÙNÝf¥Í0ºßD ¬.ø=Ÿ\.Q7»['ÖÔÙÃ-™ÙV7nÁŸñ±¾=€Ìj^0ƒD‡þW͹á 3‡a¨–æd³Ñn ÄV¡'¹“73šÓË|vð•Ã;Œ¨P­uªRŸT„øwÞ«ùï/ýp—íY¿s÷±_{tè'åFó™è!ß ð±qGjhc曆À´mUêÅõß”â§l)a~^˜žŽ! w¬Ýºß?dbeÙDßd]ïéùŒ—¹Œ:÷rYÆG'}uðå  [ß/¡Π‰ðM+¸Ûð”vôÇ`¥ñ]i`ÐÄÇFÚ§/\O` »+ír½Û sûy²c[âÄX±Sß®J´“kéBvaû‘k5Ûl«Ø £´FOƒtÁóL%؆ÓÕŽó)î¡–º;œ÷P¹|ÛÊñpÏÔ!40èI=0Zæ°}Ä¦à„…~ - MAktœÚê qŠîÓ÷HJ×VyD«ªô¦1Èm—÷…v¼³rù[ï|æÏ}¥@Uæ„nJáPf‚‡:³‡•¡+W¦¥hh?‚6Dd‘=(»!¼Í¸ñšø\ì(—zt&<Ú²¾Ç\_‹"…šGÙY–h"À3ÊBµv- i¼ðòîÅ‘Ò_† U1ʹ´*Ž.dN¹Ô©Ó7>qZ³ÀyX2±0NUÅåSµ™øÖQ ”.+ÛYÿŒ¬;¼öMV"OÁ8¤gsOoÐçâíAÀ¢·úÙf;à6Ã(m†ÑÓl“3,±¤·­Á¹¹(Zt$K¨»Oqs4#¢QeL#0Ÿ¢Úð@Õ–‡HÉÏ"$çÜæIß™ë¨ àVA¨`&舚‹ÒHPæ ˜‚‘r.jhW쫯üèÞðrR1V5W%Þ|…Å^à»¶à õNÊò×aï…YE†4ãQ„ù¥Ô3®þqŠHTWÌÅ©Tÿ;œõ…ÝC$CBqDÅG`8.w‘óúAL…%“©J‚Àb0®ÕRVÃéàÿ8wβ,V•¯Lîз´©±(~)Ö%¯1yN=¬zÓI-'Üex©°ÈL] «±?;QÂ¥8i*Ç6{œ\yÙ·~Æ ?gZûÓ:86Ìvfm†QÚ £§ha øF;Ñآꀣ×eϪ˜z\—ƒF•P:­Ž •˜ÂÐ>cþ¨Iæë…ET=…:ÆÊâpŠeW=š¢b–Öõ„`Z¬+vì׿ü_üW?ú´›>W ¤ Ý.ªƒÐqMådõ2{߸•gübzá'ˆšpå{Jx½Î>Z!,y2{Ÿ‡¬ ^†·°ÿ@=@Ü˵.•™`t¼œ»l[òÄñÁ©ìé)hay#2a>ìݵØ>p-Âðž0z ãK— W'ƒÕÊÞ/rN*ÖÞ_žu4ñu³rtµk!z iµ’g“çÄm[uaO†»5ø vêõ*2íîì4¸¹gjœí¬´Fi3Œî­išÅ8«}øÐi[èÃ;d!s%És!³Y”@”œðmM%/Ýr¸ZÈ„ÃæRªÓ«<ÂŒJÅ>H›ŽJ›‘Zàs7ÑÈ£JÙ±šR;ßWö­˜Ùºd/xÉo]öþß#R÷¢kb§ÖwÖ[wÏ&b@QôÈWzc`€•Më:É^b)¢$Ȩ¤®1ØxÖŒªjOùÐr3R[ÊQUÜÓâÑ«.’Pì©Ý.qÀuä]¹Ä%·Ù…n×3â³XI¬³ËyIË X¥^­&1J9מëåÓfJÀÃÂupO¡€ëØ)±xIó~Øì}Q#´…½Ú)¾ü Ú´ú»2—¨´úvg;#6Ã(m†ÑUì‹9"ñgý°j=çeÁÔ‘fñ®RSä\KBL¸àŠQw5ÏÎt­tï|H´—€Ñ î]œ°=0Èã#3Yù.S8åP›‡–C¨@¶®ØÅ¼áòßþƒ.ÛÓoüôöövU7#›kQƒ¬å¨¼ÃÙÚᬈVê˜$?ºäFQÓED˜m9 Q%ªâíÀÕÞúk„cbAùÇ„çÝÅÅæo^¾Þc1)± ›É{äX\‡êmGœ†\®á„ù:ì™A‹¸œô6Q=] eÜs½¬hrOׄM#Ì´L€]ã_¤2ްx®Ê“¡ð†uøIAÐÂNûbkËm]l]Âa‹¾¿ì¼—öf›md3ŒÒfÝ[[÷ T.«®RyèBoó?ÅåZîûÆ:’?Á$$“ôðTá•ÊŸÒ•¤ÛS½SÔPNõu×.ž k;L§T®yÑ;™óôväò§þ»K>Ü»äçÿâ¢O½²+DÜ ëˆ¼`\õéÅHÕ޽¬&¤m4éžGÄ~Š H¼3¯*òä Ú'tÞ%I¤—ó„` d'AödÝH®i„Ý‘õÚpØ\8„kÆMêÉÅÈ$^iü×Kÿñnù`Ý=òꥑ”!ýwo¥âL¤"qÒvuÖ‚œR:w´ÉvE|\Di«KŒKZÅ*/À‹v½•çOƒ‹¶Ù¬Í0J;7atcW§iÒ'KünɺXœ¼hHjIúd•Y—à'ÍŽñ¹ ©ÒLÄÑbXujØ£¸¹ûNæïÀ é uå! Þz,™M¦DON®ò&ÀlýÂE …B{w&kBöCwpjoÇ~ý+GþúÉëžñ‰ç¿í• ¯Ÿ¸¦jM°)Ú÷Ý™>t(œ¤¾uh~½ ¡æ?©( á‚e–£ƒû^Ô_~@غª¢¼cŸ¡dUg'4õÝ£ŒêgÐ?„±BVáÙGo8Ô:àEÕë¨JþÐ8““pµóŽðzÑ6­qe´cNK“/xX‡ûÕHYê²2+Xˆÿדʺ;]sð-,ÙûÃAMä`MºÅËôç%-7­uçºs÷|ErZ¤"ï•u#>PþýÙf;›a”vnÂèZgiÅ{dдà¹" =¾E|œP}(Ñ…½%’^xáË X)⳦SµxHeâ2NùO‰S«‰ÞÙú¦¡Mö‚e½¬ãT¥dcZúf ÷LÇ^ý•ø3~ṄT­,uˆO…¼‡žCqT¹Tb‚ÿºŒ¾ Â5¯<ÊXIq©C¡tÕ6HÎÞ¦ž U…}$ $dZoï35âB¥hŒ 5ìÂà`P3WÕ+ z¼Æ9X1÷5w>»R ê B/á þrå8” O[.û½ /]Þž´j¾¼ •b§¦J.­E÷®j]>Æ8ˆÁímX»Ç)‘& ¢òxïØ|¹ #¦-Èxî†Õ–ó¨ÔNÌMuzèp9jÏ6Ûa´Fi3Œî«AVl—3$.>‘üç»Dï5Ø}>™$‚犬œ¸¤S/¹•-/~ö[œA~š£á}:C˜Nã †ËÆÆ‹ ùFfÅlÔV8iju>ýFg/þWßóµ¿óGA”Õƒ$<×zÞYe½Câv’'…RVªãzRüf‡Îôñ#n•¾uw—Éìþ Á—)‘‡ÀªóÚ¹¼М„b1,I|úðÔËP›ÉkF‰ƒ/Ò¬ bâU¡^WUóówŒdz•ÖÅÑ2<¯¦mX¶N.?C޼_]æ3lMÝYܦkŽøíÊ;!Nç~îTo½ÅyQÍÂݹݹùXœ|­µ½,ϸýŒw`¶ÙöÏf¥Í0ºº­ò8™ Æž¦¸‰ 0Zš^âçø8w=FëImr²%(:^*U![§œŒb^O°úŸèp*¼ÕŠè½ÄMìB½úïü¦O ¹IÎs'¯Õ™¤gùÇJIâçýš«î}Á?þ¿»bGÿêqêŽUžÌ.â:…Ð/*h1©ÖA§´À.î_nƒ/9“;Q-Æd©R¿EÎ; 5 }f¡C*¯=`‘¢5¯¯3áÝžÞð ˜fâªpa˜Wf’ö5ø8¹ô¨*ßR8Á)^~šÛP>š0ÓÛl½Õêor?ÖW5ë|5DGQzÓißR]Õz§îë–§ Ýã\b]œb~áj+m*ý£ñúa?¹nÑÎ6Ûl‹l†QÚ £»6Haa} ,l ùÂ83¡ùÜ->ã"4­¶5ˆ^¤Ü>†³YwÏð'ã#{涇ån+eJeJuÝö’‰ßh6êL dÌÖ IKŽ!Ýž!’‰NÖe;öå=÷'ßÑ¥í§ßóéóžs"(½’œ˜ÄP¶tG?óЬuàPö¬ À“D2tEŽ=ÇÚ‚iÂçP‘´"£ÇýÓ}Ÿ%)ËUa…^~²c¥ñõ XâÏõ%|oÁh7Mé»J’|2Çúz5z³¼>“ §ðYéÍs›Ä›Ï›¢¼xî\¦•¦ZßpFH[ýÑ»Ï?,ón77ìÂÕôØ12 &ï¢aëEˆËGó_L8ý#1O×= êÙf›m¿m†QÚ¹ £;úæÖhjDxs¾%è&£'(3AKfú Îx¢›?Ϥf¢©$ g”ˆÆ"b2!'ÜÓíAlH'¢¸©Ï+Í$GzÌ£à†–­\üÀÎûÒ›.ú¥¿}ÿeÿ8ø ÅÇͰERôàHî…K0JW<–‹wºÍ­Šã2ºšÈ Ô;”©Gí ©ó !s‚ ËHMÀz(˜ dô5…t©ºZÍjB¾DÓP2F_˜ã¯A¿ÇúP”K<5çp‘#!©o_çØÏfù¯=Û mæíŒW3”3ëõÎÞ¬ÏÞfçÐäÐ7dOX?l8òÝOáã,ž(,0Ûl³R›a”vnÂè¤:¡¶Õ !…JfFý ™Â=}î!cræëž@ƒ=«8 ÿÜO½GH\A9pÇCØ¿ŠöI&®;Ê[ ZIC®È’wza´Œ«B @¹tÉŽl_þãGO}ìò«ù_žÿð_ +3°Z}¾"Ê*}¦Z@a±ŽIäÏèV¸Ów¤‘¬p¯Ó-îEš²…½rPš]c}*`AGôýò V4ìé¬O2…§’á5‰›Tßú†]Èt¦JËpRÃ;’e¯»TY×<ŽT=éÊ¿êeá2sùØé콂NÌ#Õ8ÑéOîlY¾ƒ8¦[à¶S=’/|•d =|—>ý6Ùùå1 \mæïÙÎ.›a”vnÂè.K;-*¿7õHë¼òËÄúZ›31U¼~;ÒNüÂW F£C0wÉ6¬#Þùƒy¨×(Üæ¼ˆ*v›âðO½Ël)Xï8>ú¶= k¾I‚¶©†“vÈòÆòb]±ÿò÷>ë–÷u,Ú/ÓAQ:ÍžX“‰t}èx·C!á%t) "]If¥o3 Ñ!j=ÉV@+©xî”Iæâo/ÿà—Gj&Õ :Yǃƒ£sdtÜïkØ7B§úÄ}%üT—¤Ÿ8¿øû°„!8AçÚ:ÂôKËa±C(…%¼ Ùˆ`bv‹êת2-¢"yKLzj!þUTU¹µ§Žk…² MÜí™(|tо‡vpz2Ûl;Ú £´sF—Ø”Ž²)ÛÛ¦éåâXœÜÅ–3“Áù˜¼5`™êѮԨœ&sÄ!“%OÙF:¶ºÚ}ªú.îôÖKûŠî§&º©¸örµl©ÍÎú~ç×ÿ蛉8ƒ ÞÈbhŶºø­üïJdA/À@ÒÄQ°2%¨Ð;ß[—msHò4,ã8ý3ÓØ½We"”މ ¥žÀÎUЋ =9Î µ½ŸSß/þÞb"RÖb^ ×jÁ ÝìxÁè½À?åÃp-Õ?̪¶ê¯1€]ÂÍðvŠØòt1Ü\cS7…îTû< î„8:+Úx×Ó«I¹¨ÑWË6÷瀃Ú,|Îv®Ù £´³F÷ã—wÚÇ4%jŠFR¦Wžˆc“rŒ‚blÊôð?2&ü”‰1šfàûëepÓ“f2qh0<ø1 'qÊÓç}«»»Ûì\ UËZ )wV.¼é WϯÙ¾ÿèã¯ÞÞÞÏòÁI(“J—ìÄ­Ÿ¤ýäKÔé ¿3þõ.fã¾Ô;ß /ÂqŸ —Vgåæ™Â0’±†…x©gR g¨§ÎäHÕ§1Ô€<iQÜ tÇP„{†ÈïžTžW5·^~`Ê⣇t7 µƒ&oOî±àãFø©TàÇ)ˤO•xݧr»µøëËûñ·úay›¸¸0yÝjQg&ÚE&œq›Ñp¶ÙöÛÎÝÞÞ~øá‡Ÿzê©]·pèں¢Å²¦Vrœ<}’î ¸,Í¢Š™[7"¹Æ=ªPÔè5;EÅT]ÈDx¥¦Îh 'ƒ&ó°]ùÙÅ60™úÜ¡ö9ØQMVžõw_øªÏξèo)è—šÓ“kËUEñv¡+UÅæ€KÖ2~²“k/‚±b™£1±—^"5|Ó4ŽS‚;1žØ…w²–ñÇ–8ìh³ŠÐ,+ îäõ£ª¡æTáŠJrv’lîÃhJHÞ48Ù­¥à v ‚l}ⱄ§¦_ÞˆÁHÒTÈ ΑY¸qïŒnÌì X!É=ïê&¸ï& /i8.ùj”íÞs9"74»ðwfÁ+ñÚîyÿ‘™'4šm¶3c‡F}ôÑ[o½õꫯ¾à‚ º®;vìØ‹^ô¢[n¹å±Ç[·©sF×µ-9;záã>\›o;ÇÉ C4£ÛÔüa9<ÔÍLfް0™!ÂàÂ'7õKU¶’pqÃÙµ9é¨%®%òù@¯uIle…0•l¡>f;ï#_ºðó7½í‰ç¾óµÇ~ý+."2üD'Ûjœh¥·DűØà"œ=¾Ž{ˆ½Ã¥e~ÛË!d…#{:˜k 0™ vöº¦r¨u053¦ðv‘ lm¿6ª> ׎=…‹Wé„Ô#ëBœk†~–&iÝ÷(•nqQ™WlÈ”uu+nžÃBàòøNv¡GÛïJn‰ŸSrÓ™©vXr_é|G°ÛQnôáZ›Pg›m¶Cg‡F_óš×¼â¯¸ë®»Ž?þÄO?~üî»ï¾á†n¾ùæu›šatž:MÚ“fqažÐ:¤nT€kŸ4Ìh6̦X6º:4ñ•’ 2Â¥«¬éZš§³ÔD^ntR±\õÙmØ Ë“Ã_/x”D/dTe ÐIG-zØwÖ=yygå…¿ü–KþT D2{±–t‡;–¨*!³•>™7ãež $3Ôó®²ú\$ת+š|Uy->&x0Ÿ"X‰j?_ªï¦ÑùÑÉëJæHªø †T¬µ*åJA1¾x¸à“bùø¦d&£UÊ¥ùÄ1ÖSo(ÜnžÕGw<ÈÈÈŽþž‡X¹%éMøvBFíëMPÛ„GÛmÃqM¯3iíÑíBï\Í 4^m&ÝÙf;Ívèaô’K.ùÌg>Ó,|ä‘G.»ì²u›:gatòW~õŸcLùm‹•èm“_éyΉ›Rãó*tJbJ/j™¦ iMt%"9 ®êÖÇ­,y…NÄGŠH¦{DmùAªÜ°nØÑÀÜÏùÿõUoþ?ÙÕž;EŽTÝPó–Àg `bnÀK d²¬YãU¯ýßDªÀÁ:iUšC¨sa[AÇ•™Ù]œ3hˆ‘À«…ij«Y:P/Œ²¡GZè|ÁyÆRÏ5ßpTR¥´œ¨‰6ÁÁâ_j¨^Ä#Uÿ”|üF³Œ+€\%|e‰kÛ’ÙãÑw;áÚ¢vÆêé*¶Ò\óS+ëw‹YtÉWjC‘•Vm¶ÙN¯z½îºën¿ýöfáwÜqýõׯÛÔÙ £;:ÅövGêdl>˜B’KªÕ£ê9òf"h!3¦Ä'ýÀ UjJ@¨ ät×M©GJ~’S…or·2:³ð•ѼÑ5eíeÚž2<óDY…ÚA…ý/ú›—þß>’·É^:;(Ùœm¨¯ôƒPTRÝ<ÑY…CW9‚’8^á]VûO28âIèÙL Š1ÇØö2ž•º<£HãVK|Óh ›/¾žãÀ‰IÍø>ÀÞêôÙÅoœß4¢vzáû:Ó¦¼½ðOÿ¼aê?„[ 8ë¥D”¥˜®Î¡¶áe¯̧ež¦ÂcN×Ùy®Zžˆ.HKÖ·?,kM\´–#~Ç‚«í‘±uÉÒ­÷$–tEbžm¶sÓ=ŒÞ{ï½W^yå5×\sã7Þ|óÍ7ÝtÓµ×^{ÅWÜwß}ë6uvÃhcêg?Å_ÉFï bÆTúüàõ®K*äõf¬ä+wj¼j~ô>3ß¹$ÊG¥+I¸ cJ²98Ø1p,“ŠflÙ\þ6×ë6È¥~¡ZÀ½8êJ´cï0"§ YpQ}ß&B –só¢¢ÛZ¤µÖoE')†ºd-›<ä]´3Ûl³d;ô0jf'Ož¼óÎ;o¿ýö׿þõ·ÝvÛwÞyòäÉ]´sNÁèØ–?“¼ö#wáh~Uƒt!0bØcçD²a•*‡Ù0ññ$b®’Ó@’åBu¤œq*³WU×Ôä¥YxWµÐí’Õ?OFÁ..¾ñS—|äޤ'Ÿùs÷¹|[x(Μ‡rŽÙ<‚&1Sñ`z½(•¯ÃRɺÞ8_Bo{iE4÷úMPdU§ì­àê BE‹ôTP¦ÓÛ&Â…uMH‰Z"€!ÅrŒ”¢¼áWegÍÚ+Œ^–׆,©ou‰Ç lÕ׃Ą-4^/lxü‡¯’l5®Î[âMËÅ£ñ‰›×ã qAjmƒ¶W´fåU&ÈèbÕ¾£îÆ?>Þª5ššýó³Ív€íl€ÑÁæÒN»¶IGÛÎ[Ų5fxîÒ_iSÏ€8 Ot‰É£ã›õžEszréÀ”‰2ffÝ=Ám…?”¥²äýdîjbpëƒ/{H†›ê6&øoXw$o?íWþS—í9oy×Óù³|^hcÎ*Þwµx“Ý$*IÉIª¡tÄ›g:ãÔog½eòP…aÄŒ¢«½¬†hwvoJ©)F»jPA’ÍÁßÕq_šžø;€Tàǹ֡è=oNrô¹#‡ HŠѦeJõ:Ý—KÎÍ…=ôÁ¯í¤7Ó•R(#Z? Ù6lº•-€Ã†5¼µ,x3ÔØSÉ# 7•§Fy™Ÿ¦ÜItv/KÚE0x` ³6¯µ§ÁVèÙ?Ûl§h‡FçÒN»°d›:ØuaöåKê¼Hâ0—huz+Uz,NQV†RDtg@’—Úéî¯3èˆ $™F¶Nvw‹ƒÒ’=MNQ2‘R‰a”È|rVÊÝk)ÍÊšý÷ßù¼7ßA´u¨EÞúV'ÝF#[(HQMnÉ ô@Ã8ØBd‘8“ˆjY=q5ý€³† Þ>>ES¡ý|qî¨:¤=‡ÅyŽ A™>›’œä{A~[J®škŒåèÚàš×"šE¾ LY¸#¼ ‡`jQâ qqY˜ê2j‡j<¥& ïuñ®t9¶°ç¸7q_ëV‘kÑþ( _â¼5€•wq'ªUÛ$ -&T­eà Œ{µß¶¹«çÔ)ÒðééÙf;Dvèat.í´ß¶\´É<GÓàÔ ÅçÝ!KÊõ›ŠV7ædLŸMÐ…=NV@ôá@otÝJ6O9 Â#SU=ÁXR))xKÌ"G"Ž•‹Ÿÿ©ëþÉÿt䯟‚æ·©ÕãáÒs:û4¸¹·´Î(Á¨+?‹ÿšýì©õBž¤’'X…?cTC¹;rxåA\S8G(ÆÔ·´Z3¬¸,ê¯蛿ɀ›—×ca> TRef§¹Èº`Ê,g3Ë+OA®×jä ìXBKP"Ýw'—ߘúuô‘—¸OıÿÐàHË E”&ïÖ¼äO_ˆû]¡v=­ä¾_€³Çö•}OXÏ6ÛáµC£»+íô¡}èõ#ûöoÿöïû¾ïÛÏÎP[×Ç”\ÞZç5ẗ2æ0ªÏÑHêjIZ I^ýÊ£N«Ç2ï¹â#c" ±¯5&×á•ÊiÐߎ]± ˆ:ĹüÉ—üÔÏ~êâÿ§³þ„æÂ«ÉD¼KB?Àng/ŸôR\Û¯í$Ÿ*šjM$«fܱO+hBÍЀcuR¨³Gç:+B3›D"„WZHD«;uÿ¸™–©bfOýŽ¢µŸ/^u<ã©r$¢| ƒ`_d+ ‚·o.²Z`A/ãàçäMž´wÇ„<Ù:Ðq‘û‡,ûIW:Qâî¼å‚u6¬s¿G”!ciÒaHc#x:Q˜sx 1·k,¶µdÂCMu›Ö­î{b³ø:Ûá²C£»+íôÉO~òŽ‘}ï÷~ï+_ùÊýììá°ÖXTÈ®a OMñâÙŸøJ’+³Ö…œ¡,ÎSÑV©lY<'Q‚Óß<>¦ÎP¥3N–C¢ÍÖY¹ìï¹ì–?é,]ðп¡¿aÜÆ›¬ (…u§TX©óÁÏ^7쥄ª¿Ê’#‡Ä&¦ŸgFv •Œ³uMµ|¨§è—Øèf)8Mú"äŽ=¤YöÊÐ"‡‚ßÅÜï‚ÕÆeM÷F‚Ã.jÿÔYmÜյꡞN›Át¶sÍ=ŒÚ\ÚétÙtV“kNt&™¤[ç¢ôŒæNë)"î.òÞ§‚¼ªËT7«ÖÝÜNˆ&œQÌÒ ª€æ‰,WÊy˜|å!ûêÂ/|°ëí™_wïeòƒð2SIÍ‚ƒôøºÎAÏZóáŒYíD_¥78Üu‘;ßÇ•}vÐ0Y•oYà)sT±>‚hƒ×Û‹ê×@ù*jÖ+¤X}( â®[‹^^;#Dk#+Á™‡ÙIØå†ÏS…K”{)Ð&‡ÞÖ (£ÆReT:m\;IãecÖ‘î2j# †lô1íÅÒNSÆÄÏ”Pþ©é!‚F{Ÿ Äæ\œºíÊ#0Þ\úl9ƒêæl³Í¶;;`Ô̾øÅ/nooãÏ'Ÿ|òÁ\·‘³F'õ†¿Ú¡M}N'y@ºÇíã‘Ô/yØ&sfòIá%Bî{ë?µÄ:ÛATrç™íñ‘}\-‰èEvôy²ÕàÔb]¶‹Ÿÿ©—üìOmy’ô£TGÑ1w…nñÍN–gé’èdèI-ËU=Ū—Ì$®™7U ᪄WÊ–ìLf;‘$-IÆ—jJ®ÞáO+aäåÝ ~Oéqø`x÷èåÀ™€x†HêÅ\0F¦¿± ? °‹ƒB°2ÝèH*¼’³³>^4K©©åW{Ý6FRê[S¸‰Š58Hæc ¡tTXG#YçKàR¬ô•{ëTQ¶‰FÑ¥«lµ¶ë_³Ùf›íŒÛ¡‡Ñ|ä#/yÉKŽ9rÕUW½ë]ï>ðÀ]·öÞŒîÚ»t*þ}<ÕüÏ„65-à†ŠÏ‘á}1?iuÎ iŒ‚’u¬µ™èÅVZ±lÇLG1Oß„454øÊ{™«¤¦<òÔo\÷ã?rñÝO•±{O±Üiãh–ô£ÈŽþUr%Q›ÎˆuR{ú”㘾N«iŠîlwß«o=;ÂéXŽÑè<ÿ¹è YZ¼ÞÀ\ü1 Zo5£ž5&÷PHî%°Õ;Y/3àŸÌÁG"TÙR!×@Ý6‘‰ýÆQ÷*Ƹ”¦¦DR§3}å¸ò3ïÄ¡“¼­Št@9=’¨ä®ì={ï[[^44…Ø\KM‚+ñ.«ÊH‰UÖ_bͱ종ÆN[ÂPc3Ï6ÛZvèaôÛ¾íÛ^÷º×=þøãï}ï{ŸûÜçÞ{ï½vÀè¾Z|L;ïê· E«ÕS¿Yï0¤9ëÔÍ{ŒADˆ§Än8$qªthT <€ ¯¹©›¿óïü¦oú¦'Ÿ|r†ÑµlÑOð¢d…ÎSà±þ\ 4<†%7ßìRϲ±‰þbÇÍÆÛn©¦ÒWJp?8B3«37[w+ƒPÁjN`NÌ) lmÁýȽ=ý³xîO¾£Ëö´|öÈ6¥ûJŠè›æ*™ä«ˆH>ޱ˜Ð/[Õ?Ž#Õd#ua«Œz¥P|}„‘_WF8)Êå@—c{ئ]_2eœ4•0*‡iˆ¾1°Š¾…— ´à-^x<¬1ßßËE* —±ÊÉ~­–æ:¬²£-È ’¢ª ñ‘¥š&ƒ8'6Iu¿8ö7,KŸN®°Ä–Ðî$Ï% nX·ç è*¶$w¶Ùf;³vèaôe/{ÙÛßþöáóööö÷ÿ÷ÿÌÏüÌ £§hõ›ÖmtãçžvÌ‚ƒ!žÄÊ" ³“ø?ó”jCAG‰\„£€BߺïH…:ˆÖ3íåŠzÝÔ¨A í­Kv$m_öõ÷¹üɯúo?~ñ?*ÚȬ8T!Ì4 ¨ùá´U9Ñ"‚ P®HÑBfPƒë|`Pë¼Íž™¥ø@ö–³‘å AdBTtÂW^ÏüWHo¡†? 4Ù×͵ÃLŸw’êXÑ“®óFVïyºÍ ";Þ%YS%Xî7&Û1JOßžR ÔÀʽ3:…‰”ÿƒx ‰WOΩk#%Ï ]œ1œ·Ûr÷Ä«¼šáÂ]êi C†W…Å%¬“1yÄ®ª&~ö‘qâä„·!P²¹U'Ç./½}wSiò“,>j!7öÊö¼Áý³îÔÈpoÉòÛl³í‡ 0ºWvxatu;aÝf¥+ñ ~ËX”žðÍì5ýH¤èŒ=¶»ˆ¹ðÜ6:{Gÿ_ð*`Ê• ÈÄÕ¾‡œ´%ãe` ÷ŽXy¦rêëÞL¨³36Ã(í\€Ñ%ÖeÛ"•rfNý§w5VŸÖ<áŽÔÀ¦i+R¾ü¹ðF_­(L7ᤊõ‚Pðȯº:¯{ò±•.ÙWä=Wý/ÀšÛh‚J!µ&ÁS:©eò'CÕ]#×G»×æf©¤—[]…-Ö!,£„Ý…†žºlÒ…)vÀ}èUSìÍ<½ÊÂôLWJAôc)GU;Sg£•D¨š{dU”´Ñy7ãÛ— “HrwØ•k~Ò]ÐeN|;†ÂE¤¢ý™ÜŸÇu„Ã&M¡ À¨áiаr^ôÕîlo øÌòôl³Í¶ºÍ0J;Ë`T#ÂÜñcóç_ß<ù˜ÏÖe;aA"…i&ŠW²L-N| &qŸCŠŒSc+¡r µTòKŽAPþzöRxµÒYºèSÏ»à‹~ÁÙUï«p†\“$w¸×“öDÐj¨0³âcaFHŽõŒê.µYÎ䵤t‘Æ•’ìÝ Ûô@àGA–þx¶B‰ÝòªukVſ̱Õõõe@½äêmw]Ó›@K‡Wã ª£‹;:ßv,K —j|HV0•ÿC4ˆ_Û¥›R(õþ’?Yñ¾s—½ÆÆøŽÆu‘9WñÏŽ·jìÔ}Ó“0‡Ë`vü…J[Øm—ö4RsÖ.g›í`Ø £´³FwTMÆ>Äá©Y#œÜ5ï!ŒŽ#E“cúC1¸utçÜc/½xu¿2.ÌœžäO„ì•$èÀó›Á²¿±}Þ£¿Ömßõ¯üÈ…ÿú ]ˆÎŒ)A¾S|+Ð)UT>T—·b+h2I³&µœ ã*! Õp 10eÏmÝÔ)ŸÐOÓ îþ„ñ4Yp*Kk>,8 ònþ=e¨×JºàN ìΆýBÃü"1 Ö÷Î$[Ï.2,^À&ÓÒ-u,5Úó< AÕl‡À9ÉÂÍxBʥɽÁÔŠIQýºÜôûk" `háæl­]å±’ªC§B®³Í6Ûa±FigŒ.öMá¶i¥+ûº<&1ˆÆ“圳ždõkøj³³à˜.¢AV™SËC޹GBþTIÕJ 1&µô]¶«nûÑËßz'¶ÝĤ–¸8»S}нxm)‰M%öЃ>q¤ÈÜj%ÛuŠ=b_:˜¤^GU‘ ‰×šªeR„ße]9FíÉUŒÝô¹7Áµâ¬×ð‰¢×†W<åádVíaßÔR蹋ºG«á †O²È&š»ïG'ÂS¯‘—tèGOtF?m …£é@ñ';°ÀÕÞI:ÑrQSÚl³©lŠÏÆe›Â·`å8‹÷CzÖ¡Á½U.O›íyÏTRÔl³•6Ã(í¬Ñ±“*ðôÚ²N¤šÀ‡…¶¡TÒD ÑY鯓¤Ke °—ŠšTÅ´TG³"`bÛ‰Î.{ß;¾á^j”™‡wPq3_œùÝ xˆíd½”,u™vÈ‚Ú@î< IE%)°¬H(*– ».2hÈ2)\`^I@Ç_5EÒ/™IrE XÏ—òdÂb~ºs‡ª«E¯‡ÄýNö^ÆßçµÂévæŒYÉz=3À×7ç!Òâ¬H–b%'²ò˲|£IqQî&FOçȇ­ÓSõê^B°v[‚~ºÃM¢À¼ vФq°«tïàcî¢ÓÄæÖÙf[`3ŒÒÎb]búlhó“2ÜC|^E‡šÝ@˜ƒÊ¨q~pCûìE4OlÏR–(Ipªò¨†Ÿ»öl÷;Îä~ñ_ýøcGÓÉ#÷o3u&{·AÕÁƒ,iIC¤„nq‚û°0!KS¸w‹±Yè¾**ãÀÍóЃ#Û ’nÆxj–9ò…¢l‘6I{ÃI¬åú%Ò@ä^%ZuÍ‘I–™WÞj j[57w˜¤Jã;üø2ÀSÖwÖã=Ç/ÂRO.‡3?G½h±Wr½¶Y®AÞÁ\âŽB¯SóaÑMäûÒ¨ë‰éŽ5…»‘{½Ù…¬Éðƒqí¬&®<~w]Åv·Õi°áÂ;Ó½˜m¶Ù–Ù £´sF›ßå ñË‹^å±&ὄ06&ÈùˆP¡ô …ÿ·H]O%00"D5ù6:RÌÖYÿ¬[Þwñ|ìU^ôþ¿õÀÖ\'ËÉh|5lXõ3ƉrVô)YÐó45JÃÀ»™“I:K%)c"%9©î #VM*Lù( -ª ÌwªA¥…¨-¸)zpî†9-Ík0©h}w|)C ¡À…µÅØ·ÖEîÙWDv%oø žü«]­¥”òg)Ù‹Ì駦¶¬ì;ÐUQ˜NqBù§ö6) d¬Ù#ꀇn$uˆ'=ÒØ`‰ëM¼üSwîz®dð^Ì´¢Ô÷Û„Iì ®H0Ûl³@›a”v–Á¨<éÃsH““êB}‚2¡"™»§³ºS‡¤r²”ëŽxð:µ@º*…À¸&´QCB‘Ê“ù'ŠnžwâÕOÿô=ÝöýW¼ë-Ç>öåØgòiÃ:wàú~{é­ÒÁHf½Wÿ¸êµ)FÀ¹œâÔMª,g«Êë~jx«ëò$]&J:”‚eÁ8%㾆‡öÖw¯sTµ’¼OR•…È™Ú_6:€»œ/-¬±ê×uÓ¡5\“¢J&jº$Ë^qŠŒŽ×ðw˜~³ïzc:]œ$Ì÷ËòûÉœÞçÎ}‹ §à¸!á.íÈû« 3-ºBtÐffZ È*¦Ëxæf«%¸6ê§½ØÍ2äl³Í¶®Í0J;Ë`tÒðÈlr#,>2Éš!+¨Ä…Bc*ÅÕ$t÷áæŠÔ!°™¤“ÃÕÀµ‰LéœÚ;úêÇ»bÏ¿ãŸ~ͽï#Oo¨÷ªbÔÀVC¡ÐQJ–@ÍH÷ñ’Laï5ÈrƒÉR^7´÷.¡@iwÏÜWG~8/µà¢'5J6Ø_!v!o'=UV`ÚúaÞWoŸµèeĤ¢>b-ÄãGÇsÝ׋M3 1òjT‰Ý_cêr\o!ü´ Iä&1yvd;}â6ú¦)öó "S +Ãíž•,{g/¨€ÅXª%“ÙuµÎfT’C&ÎrX„ m«ŠÒ¤¦S1Å:MÈ4çˆqv{ÑY]·ª0¢WÓØÐæŒp‰$G{¬lÁ .‰D±*ÊŠ_´¹Vë›’¨Ëž”&±’(´PÚ‰…–T•ÔØ5V3÷ÔKÒRÂæ]DAÅGGÏ6ús-HêF~ð=÷†¯Øà¢n¦×=Ý»ä¤_Ñi¶Ùf;u›a”vØatl“¿ãÌhIx Ë ÁÔˆpé¦Ê=AÍò¨¾,•ƒ€, R(m*J\æ«2W<2ò¢¿¹ñ™ü]¶¯~ýGilhŒ!¡5ÒwñíI=’p|j ;µ—=?S&_]ôÕ.Z›m¶ÙÎq›a”vÖÀh'/( õ+Ò£2`+ @(€z!ݬR±ˆnnVÆÊM3«fó8n´áSJÙNßø©.ÙåpõÅox  ÙHˆ%踚"þB… *nßúÏ #©r8–¦Œ(¼Ò(À4±®P†9®Üe!6CŠKòOèÖ8—)´=ŠÄ~)RbóqÁWáàe’{ý¸°#†sŠþTBTÔÙÌKKÞ*AJA=^oGéiïõ’3Q©¸û•`®S1Õ{åK$ÏÉÅ{ÜSZfÕÝu š 7ÚRplhX<Ú»‘9÷#UhµRó(Eé Ù¬ÚÎ6Û^Ù £´³FƒÏÔŒ˜1Ìn ^’6R|ê{ ü¿ªo…dð²aݦu>9g&èÀëÍ‚D(NäK^rh`¯£'?Ù»ìO¾þÊßzcíg‹’Ø*Älv,Ÿä³ÞËÔíðË÷µ«¤"0ù%’’­hJ)Mö„~sH•— g°/wäG‡zFÐqѸ cÌXÊ\YCKCayŸÛÝJW+ÆGÿ{pÍ«âÛË Š0 f‘•u~NÄt­Øàª^Ò+ #²‰­( €ÒÚL–—vÝv\Â,D^be[ívßj¨1 ¦l×(ÃÅoϵ!o¼ 2ým²»HÍu·š™l¶Ùf;E;{`t{{ûá‡~ê©§vÝÂÁ‡Ñu• °&Ó“3‚ †²‘)º>‹{H=IS˱!œÂ9Š^Zø]¨…”VDZcœb~Úçï»þÇþѱ>JåNs„Nz78å&èVKG!l —}¡ ¯¡&$¹|[ÍS¬’`+Qì˜Ø=Lìi˜È oà0$B)ãBÌŠþ…Ý#Dö“â'š\ÕÐJ†ë\Ã%ü óηE¦øc•û.AFvQC´žcÔÆ˜–áÂ3¼/¬yø=·åàÔ˜T¿ÎAÞ¾2¤P´èy p>"ˆ%ÞS ‡ÕÍ'ÔPÆ·änžºúí¼ÄA¿è«æ¸ÖIHÊ“ŸWïÒ’n,]s¢òl³Ív®Ù¡‡ÑG}ôÖ[o½úê«/¸à‚®ëŽ;ö¢½è–[nyì±ÇÖmê€Ãè’G—?+"lXw‚þÇêEÝ´®³~Ë:ÿìs‹;­ W©×^³˜Õ5 ~IIúÉä Ïbù¤%þŸì™öŸýîÖY:ÿ&˜)·TVÏÁÕ®éäMì#|îÊ,Õ“ÿ< 3VžjfÂÌòω*cî% ·Hêp¦ @h*a(´}D ÈÜT¤gÉšŠ`*ü"=ìÃY¸3™¼TÔ³)Žrp96ôÜ“úgÉ:÷Mˆ†yh—"2“ê5Y /Têàî$aH]´ã%Nv'u_¡ßì°œ Dky4èR!°Q£S‚ƒ7I6º‘§ZNÕÜ¥+¯ÊË+î}•FNÑÖmdOvºß¶î{Ël³Í;ô0zÉ%—|æ3Ÿi>òÈ#—]vÙºM|µÅÐAøÄšÃÿ¤O`àEâŽc"³Ì†ææÞŠð“ÁE=­z•×l•c}ôYwÿ‹®Øu_ý—ç½égVÐa_± zgF—D! ú_!Æ…ì.Ü6ri1YAÄ] 3Ï5Ù?(š–»¡ôRñj£ªV¶¾æÜ£#z®†E‘åŸTs7øúƒ>qáÎÂk# ÃÎíæEF8•¤Ž,j°­iŠhãžÚda„±Æ8vâÈÞÔKÈ·íÚPª¶ÞÁ4Q‰%ëƒp'z°Q´¥ÒgFÛXÏUîJi>èé;w)njOâò³MÒ;ûŽh¶Ùf[Ë=Œ^wÝu·ß~{³ðŽ;î¸þúë×mêPÀèÃûcFsÆcIm$qÃOÝxØÝã šT)ŽØ‘)zAEÓ{÷–rwÅžö¹_9²¿ú#ïéÿýñ2**dÇAɳ®CÀŠ7 %ÈÓ®œa[’,1R3 µè£ ZlH@×Ù•$Ô!埸_¡vDÙXÅá^4>A™R+Þg9q’?8r‚ã+Ä‚æõ£wîI2™;Oqo†1¿´ü‚±JlÑ#Ï´z™u“s+DÿµìÔZ©2Ž˜È½gEÛ=qS· ç^jî£E6KT¦E›Ë7×…úƸÄ·]U#œôÅOʨ{΂3\Î6ÛlkÙ¡‡Ñ{ï½÷Ê+¯¼æškn¼ñÆ›o¾ù¦›nºöÚk¯¸âŠûî»oݦ7ŒÞãIñµ¨ôQˆs ìC¨ÌºD%u/õ°SkÔ‚êÐÕè-ÜøŸždå‚ýý7þÜw{ô£TAl= ›o°Êf#™§oš,¡0˜@QÝ_ ÈŒ¼ë¡ÌRGrºjÆø³ÄQRòkQ‰° .uט•’Y”*Éú~‚U•2-sÌÛ¾‰CßPZ«æÉtó{”+!ÇK¢ÇëÄplÀ;„ó²SÕE¡±ÛН#å’WìN걡螯65bj‹¼ Âöß(ê¬e‡°KœÁߢºYZ—‹dÔý¶Ó3Òé´Îã1f›m¶Ãn‡FÍìäÉ“wÞyçí·ßþú׿þ¶Ûn»óÎ;Ož<¹‹v,Œêãªy¢Œ}‘Á eˆúŸ†<æÍªHy0¥d±T:£|ˆdÔÿD9ó?&c~÷K~ö§.ýów±˜›œ/'!ð4ĆÂîe€*!êTÓóÃÔ”@4§@YH°!0ïZ“ŸdÖŸ¢B7:™IÅÕA§“Mb(*€:ìRJt¹WukóÌ*žDÉ4rm/ s±¡ÞV¤ç°É0~:œ>ƒ§>ÉÕ‚,u—ºÃ+Ø«j±~Mêu’uÞ/‚¯YK:ø5œä’žžÿqÏÞB;cçXXÅ«Q¼eàLr¹Þ Y"v PN~5æÂE-,†W·]0¨âþä·ë68Ûl³Í¶ÜÎì\(íÔX7•Ïä\RÉæ„;¸AECB½§¼änºâ=ÿ/¼xÏÉ=p¦³ìù ÕmtöMï~öó^ùv “ê‚je/è)ˆ Ù/ÇÙ›&|茧ŒÌçh®eÞIº=$P6¡¹%rÓLh™ö ~êÒÂXAùYþ%J›„õÌã2 (Rc˳‘äÝCÒ¤¨û:Íkr—H]ÞÀ…ᇼ) ÓŒ†]˜z¨©¶rzLg'5Å,ˆšËÇzàHg •*86L9ºM(¦v#¯º­LWs r‹DÓ3e3;Î6Ûlß=Œž;¥&MÒ8àTÍ™^.xᮆV¹k‹Kœäë9»7)Š0Ô+æïM_:ÿ¡7¾ð-×=yÛš›G^‚cõ¼Y'-L ‰N‰ÿ«Ú7 $4KrX–˜È™B–ÀÁ‡ÙwŒ¹ô~â¨q˜Q@\ÓÀÊèÏMMSª†²÷˜iï᪎D›ä|Q^5ê| råK—íP’” 4¹Æu˜ÙˆJC’ˆŽª× ›¢¶¨»Ý}ùDQwéC˜WltSð} "(˜UËv¤EwÖ®m…È}¡ÕYm¶Ùµz=×J;ÉC½× ?3ëjBÔ© .¢±‘<°&èGÊ'1ÛS.Q”¢Ê؃¿ñÿéëþê«èõ¦d\ …Š‚ Q‘¾Q7%Õ]<݉Ø'qñ05TS…rÀÊ®¾”šؼx§=g°#:©kÄŸxD¦i^½ü_8\¢¤Šs_vµç= p˜Å@JDU×ÿ¨°tß"x ¤ ù%T ŠKˆH‘ÿ«H:¾týÏPŒ3¾eµNóáÆ›£2€pvÌgÚÂ$5*^¾Zo^Í]Óá$jﮩŻX;Fv¶Ùf›m_íÐÃè¹PÚi\k”õÈ\ÃÂÁÓ=8è71™¶4¶º =Õ3Ü‘o®©÷”<ÿm¯L¿ýß—LÞ㢂ËÅ…OPþ,‘ízÉÙ—xM¡OÑk5Ãg•67:Ûh˜;ð®Ã4ÅËÂ0V‡eþ–ôYør4gaZ²²zÕG“ìTAÖ¿J$WœM¤þðÄy$C$ÀxòH‰ËlÊ3®d[\ ¬Ä‡1nz ÍÑ%ÊܦE8š’™ß—¬Æ…KIIY7Ç®X±Wûm³:Ûl³•vèaÔÎÒN0‡Nª$t}$’ä!«•-÷ÎoL¬œGEØb ¬´ôŒûñš×Hz.¼i1y†WÙ²dŠnV+±~È@ä1Aê›’’=ù‰sñ ì2Ø q|»0©¡œü |;Äë©ì¨ŸÖ©~óÜŒ0»1Õˆê”IQŠB„hNqÙD™œ!¸´ÄÁÍéÑCߘ¬V"›Ž«&µá˜ìäè+ß üþ! ³Ý‘+£ñ ýQkÖꨩ‰Êöûm“úëº0=Ûl³Ívèìl€Ñ½²ƒ£0DÈi’ žåŠ˜Ã Ro²÷ é¸SL2ë3%IËõGžLÏ{û5ç?ò¦óyÓK:‹A–ކ½3PsÉ0DĪV^D>>"V!ÓaÛœ§ÄyŒØIÇD&ÚËä¥Åév *Ö]ra÷ŒYrgyÈñßgNŒ¹_¸œÿ"»ÐYôMõé¤ÌêÂpÊé-ãØ–ê+l´½b-3œ” ÔSgºR²1a( Åß½Ò$Äü• ›L^ºjðkK°éDüèø.èFÓ~®h€ìu69UIrOˆvõhÙf›m¶Cd3ŒÒ&ŒŠ(Õƒ :É;®˜˜¢Kƒ^—ž©WML¤ww9Žîr_Ähh¦TR|ì.K{.Ðår_gCé?¡&9ö€ÁNö]ˆ Î+*䎹DÚ”ÄPÅËÌä\í1G‚eëÔ[79:tir$‹qŸKÖœìÒr wà´ ¢§ßºƒU u¶Ùf;×íÐÃèÇÛºML5ÑA±šÐ¦Ï²2{š$+£E‹ ¤b(¨¨¦È y0çøËÎò ÿ¯k/úÛ_ ³ñP͑ߔû›h“ÌJ¯±p3þ,‚e)´Óó†Là4ò8÷r,žˆÃÈWd#‰K½­ Õ  zØû@ŸˆjRENÂ|@vÕ† )Ú§;Üy B玂¹EI€f™œdŸj(… ­ZŒýÀ…Ô\i¾ë,tûÿ·w÷ÁQ•÷À¿‡, Bñ@A ‰PÁnŒ SQ¸ÅËz­u,”7´NÛ }Á—Ü;½ð‡í0Ój{Í\æú²ÒÞ™{'ad¸CÔªÌM°â0b«6 rÛºA®" ©/„$›<÷gÏó<çd–ìËÉî~?ã8›}9ç9'{àËïy9¶+mÕ~ヶþ¬î»×síÝ{ñ¬HŸ$àŽ áíäüäyÿè7ü¼¨ñ\ž^T&"ÿò>Œ~õ«_0yòä¹Ã\ê¦ü £# _sÿm­¬1“J"u©‘£-:訮ވîtVùÌÔTuÐV8ùñ+÷-žÓ²¶ÞljÆY#Þ©~ycä¥Ùí®Š¦® ©î‡n޵£‹­M¬¬d¬˜³f“­tMä7â©ë6E1ÝHç£?Ú¬©¶ó4Ì]HÖô‰èÓ5<£.kNÒÙWÿNå"Hü®—ôü$UÃöôž5Ѱpb–»§Þü2Ć}P…oW uÿËgøðMÛ‰žLi«ª¤*©ª¯´9ÀóÅ|‡¿”x… æ9„,Éì.²” ¸ZLD>Êû0*„Ø´iÓ½÷Þ›þvÆOet„NFGUŒ6%b>:ë‰Êgôtxý؉Va½øè´·æ_ûÐí:kÚf‘RUUõÐF³Zó¢Üã8ÃNîQ½áªÛu›P»^·6¢*âΠf¿¹Š®9ò1§"Óó“bžÞùDFO£^ðßìÈVÎS¡ôLÀò¬NoôÝÇÔ-‚Ì<ª œæŒ¥°"m#'"©0wš%dá £ ë÷Ìš÷|µŒè9â:GêAÒR¥:9#““ny¤d©ÃŸ*ñŽ7œNDD”q…F[[[~øáô·ãK©Ò BI¯Sõ”É)èî—:·VÒ…Iµ§+¤†UUOERçM‰VòÙc×üã/îý°T—c".#ÎCÝ£0ÕFtß½îî×+Õ(I§6©—|WµX'Ã…§k&™­õØ#êògÐuÒÂFKÌÁ*à&úiV UÕÃŒx1Êöñ~µˆÊ—îøSåmç7î)]ÇTÙ[kjªê¦óU‰8yQßâH}…Ìðä¬u¥;Áe(wñô°QÕ)/.ÂÌᤉÇôóæ·z”¤"#•¹,Ê«¼ÙØ5Q^+„0š)ã§2ªµ®Äƒzáªõ7U2Ò^*¼ÊdÔ“ëõpÏíߘÚö¶5pwù;ë{ÓëÎ÷D<êMDƘ‘¥tb êœQÕ>cT¥13QY´õIôéë’aÄx³ÚBX§1cè§:RÇt3>¨F5¨èiŽaUëX™C3U6b 3«C†-51ã1×tÖ×éV…K8køIZåoýÏ ¡‡gè´í|+TÃ\߸{ÕÕKÎûu';’-œ4üë—ô3ªzzä/í[>r²úÁŒ|œˆˆÒÇ0ª«0jö™§ŠdªXhö×›ÃåK-:#&ª¡*¼>p¡¤ü/Ÿ ÌþÏ'žýœª ¶¸· ½È¼êmWEM•AU”ŒéâŸëžfP»æú¨ÛÖü]™Õ Ú §Fu_#+;ÕJg 2 §sYEOwè4úâõ¡9uJcycY+O^TR5S½eZ³W]í+±2¼Úš! FÎvî⨮tš_5€U5@}ÄŒ’ž8Ñ=æi|‘“¸hZeW8QQaÕ| £ÃSB½î¨š|µ×ÉaN¹žÆäJÕ÷Ö½ÛzBwdooÂþÖsŸ[zør³óZ ú4B˜YþT£cFßzb:|‹3`À azr·*@ºïÿÑñÎ m® ¨kü«ÓžXaÔ¹/¨ºû‘ZHÜZÉ\]5è ¯¶YXNÐÕ6£iŒL0»ÝË| s꺚½ä^Ó8Ÿ¶û?µ£Äá ç_òË *Äê»a”Emõ‘¤tBMvL ? ÷ uZŒg\CS©&«Ë^Âìx""** £Ú¸ªŒJªNfŽ€ú>:‰u”z]©ÔnqEŸ0œ¹ð2Ÿé˜vÓÎÅFº³è³Ø»|ImD-MjŒ7Õ11³œÎe³«]G•ŒÔZ¡ž)íÎÈNu§M}÷&[Ý•Ô ÄÆ|#]ÆT!w#Íqê%]75G8¨’¤ª+#É\ݵ ïꛞќ¶……+ &VŠUqV}Ê;Î2büä"åèÙN¥d÷Gt5uÈþsc_aIDTøF5ŸÃh»9/‘üd$r^Òó¬ÍÿÔóõN`­èu/A  œ»{Eýõ[ºËd=µ×5ÒT…3]ºS«2ÍØªþoÞôȘÖc¶žÁëÒ¬yk%Û󌡟Æ|vUãÔÁQ¯¨ïФN44ç™åOϰZ³oݳpRXÅG³ÏZ½eqÔ¤/_5b®÷^çÃtþSÉUms¤Ö»^>¾s”Iî©®Ù)ÜåØQŒ¾xgêvÌ;•7Ñ8Ä0ª«Ê¨ögD(Ñ®>ê-:½%r§1ç=a?´onåëUzrÂ…Ç{]CH#‰2ª^²^y4æ†ÛFÉSßÈ,y¶èm†[z&Þ\o޼4»ïU÷wX÷˜»ã¬'G܇©Ã«Ûª›~vsúQ$˜4a«ÿG\%Ló#rã©5Ö»—ˆF2Ù'P¶\ìÒ¸¤Pe¦ía/]ïþ ª_ÞXmÔüQÁˆ®ŒŠ°«®©ïŠ©’hb:¿Y4K­æègˆ§4Ãúy÷0SヮµT݃/Í‚nDfÄzçÌÇVÕJ³è¨Ö%?:ÅÎÄØážl®~)Â=ÜÓù>üSI¹ß?üœªc¾÷z*c:3ÜÎxJDDcÃ0ª“ʨ -F¨2gÉ´èQ¡¶hO m1»ì‡ì)±«‚3Z^½þ+\™ODœqŸ1c‘Q÷jκNò±3ØÔ5¶2h,nÚ¢»ûÎz}'O³*©‹‹F°ÖóßÍîÄŽôŒ{]õ4’·¹d’k ¹Ð3ÓU3’,ÛîäȘñØvÇݱ5oOý°‚h"õϨ”S¿Yu€ž]Œ­<éùÎdV*UU""¢ô1Œjã$Œ c䨢×5ÛªfÉߔѰYòÕQ~×I÷åüÆ3ÀÓTI~gr@~%ˆˆˆÆ †ÑT­1ò 4NzX ˆîX@¨Í*Ä]ÿ§çkÿ{n 6Ÿ¿çÝ?®ø‡(ìh§ÚÚ¯/"\f Ô‚î(ì š[Ð h  ¢¹!ñÌö(ìtÑD5Š>%B@›Pv=šÕki„]ŽX¶|EŽ"܉<Ý&w'±h"l¡UÀAãÐÛDa;™Xg) urM2ùÑ-C›À¦ù¼L–AtËM©T'ÐÀHƉœäI¢#h’¿gMîW7É—œ°Û%eªy©ìÂÜ×%½ [ëáßB©#툈ˆÈ £IÔÀ²:]ÏÅ<À§ºd¬é€Ç? ñ‹þ¾mý_š<Øñ÷g¶ÿ2u ñ©ªYÎgWÚa÷&h€µˆ¬€ y2n×I®a-l²âÜd5""낉*6ÛeZè ¢Y~0ˆf籋Sæ”±J IJƒh–-èèº: d2ñ6 Íf®’ïqªÂ®3ha–ü¸óc§:¥f.T§ÑýÙNŒÀófϯIµj¤÷ç…|l3QêF“è€U®g’vÑv¸k¥5°&u úêf¼·à¿¬oxbÁ§C•ýQ„×" ´ý, Ý)tÉÈØ   X›”®…-+—õènD$Šp4Qæ°EÚdY€SYlk“õKtG†S¿TPŽ"0ê‚ ¢×À ¢['³œé‰w:ÍS!{Ï~ð§ÔÀêH<é:ƒF } ‰à;b¯·§Û³©Qd°'ˆˆˆrƒa4UI«n0F.¹p¾j÷_zÎÿ{UõÿýGè´ì¸"&«’@èQ`yE¬ݡĨÌv§ðy0Qï4Bj›.õSæÜ ¸ÉzØ.ÔQ MæQÙýôÓ===ch@<oll¼ë®»ª««õ«_a DDDD”q¹3zûí·wuuxÿý÷W¬X1{ölÛ¶o½õÖ>ø {ë­·Þxã’’’ 6\uÕU9Ø#¥(aôÀçÏŸ°uëÖêêê³gÏöööÖÖÖÞwß}ÙÛé… Ž?@Δ·,ëÊ+¯ÌÞˆˆh rÔM/9räù矟2e €Ÿüä' ,ÈÆ^Î;7eÊ”öööx<¾hÑ¢›o¾9{!"""¢ôåèv §NŠÇã_üâOœ8!Ÿ9zôè¬Y³2¾£X,ÖÐÐ044tË-·Üzë­ß>eP.Âè—¿üå»ï¾»¼¼ü•W^ùñ àСC_ÿú×·nÝš©] nÛ¶íÝwß­®®Þ¹sç„ 9 ÙDDDD”K‘›=õ÷÷Ÿùdyyy]]ß )¯½öÚ¾}û~þóŸûÝìÙ³çã?þáèwCü±sçÎeË–ÝvÛm~7¤@<ÿüóÑhôÁô»!þصk×ìٳׯ_ïwCü±uëÖ7.]ºÔï†ø&K2€^}õÕ~7„ˆˆˆˆÆ¨HKâDDDD40Œ‘oF‰ˆˆˆÈ7 £DDDD䛢 £@ hW¢¿¸?ã@Ñ®Dƒ¢ÿ:ùág\‘ŸÏ"?ü’’’b>|äõÒNcváÂ…I“&ùÝ  ÅãñÒÒR¿âxùúë¯/]º´²²ò»ßýîùóçýmaöÜqÇÇW?&=êÂ;­­­×_ý”)SV®\yôèQùd‘{–¤~Ø)ó”ïç!Í‹(ß?ãÒ¼‚ò÷|fö Ê£ó+(,D¡»êª«>ÜÙÙÙÙÙyúôi!ÄÀÀÀ¼yó"‘È{ï½ …üncæµ¶¶nÚ´ ÀÛo¿-ŸIzÔ…w*N:U^^þôÓOüñÇ;vì¸öÚkEÑ{ö¤xÒ)Mç Ê÷óæE” é\Ayz>3~åÑyÈÆ”G‡?6FûúúÊÊÊâñ¸ùdkkë¢E‹äã—^ziáÂ…~4-»~øá{ï½wòäÉꂤG]x§bÏž=Ë—/—ûúú,ËúðËäس$õ‹¨Ni:WP¾Ÿ‡4/¢|?üŒKó ÊÓó™ñ+(ÎC6® <:ü±)ðnú“'O^vÙeëÖ­[°`A]]Ýûï¿àĉ555ò 555ï¾û®(¸{¢nÛ¶m×®]•••ꙤG]x§âŽ;îhii‘ÛÛÛçÏŸ?}úô"9ö,Iý"*¤SšÎ”ïç!Í‹(ß?ãÒ¼‚òô|fü Ê£ó+(l <Œž9sfÞ¼y?úÑž{î¹’’’ 6èé驨¨o˜:ujÿ§Ÿ~êk3s!éQÞ©¨¨¨°m[ÑÒÒRWWרØhYV‘{–¤~ö)Mýóý<¤yåûág\šWPÁœÏ49ÎC6® <:ü± øÝ€ìºé¦›Þ|óMùø±Ç›6mZOOOeeeoo¯|òìÙ³@ ¼¼Ü¿6æHÒ£.ÈSñ·¿ýmóæÍ'OžÜ¿ÿ²eËPLÇž ©_D…}JS?ä8é\Dpø™•æT0ç3ÍCίóñ+(¿ ¼2zäÈ‘C‡ÉÇ¥¥¥%%%@ ººZÍn{ûí·çÏŸ?aBŸIºðNE__ßm·Ý¶xñâW_}Uþ€¢9ö,Iý"*ìSšú!çûyHó"Ê÷Ãϸ4¯ ‚9Ÿir‡l\Aytøc”£±©>yå•W¦OŸþòË/÷ôôlݺ5 !æÌ™³wïÞO?ýtÍš5=ôßÍÌ–¹sçš3‡uáŠ={öÔÖÖvâñx‘{–¤~Þ)Û”ïç!Í‹(ß?ãÒ¼‚òú|fð Ê£ó+(l <Œ =þøã .œ:uêºuëN:%Ÿ?räHmmíŒ3¾óï\¸pÁßFfùᨠìT<øàƒžn9sFDZgÉ%]DvJÇ|åõyHÿ"ÊëÃϸô¯ ü=Ÿ™½‚òå}Ú²¬ï}ï{æ;·lÙbYÖ‰'üi(Ñ8ð»DDèàÁƒK–,8xðà·¿ýí+V\qÅ@à…^˜8q"€¡¡¡gŸ}¶¬¬ÌïÆù‰•Q"¢Ì«¨¨˜>}úW\±aÆŋ¿ùæ›ÊÊÊn¸á†ƒÊ÷üþ÷¿¿æškÊËË}m)‘ÏF‰ˆ²èµ×^ûóŸÿ|õÕWËׯ_¿wï^ùxß¾}ëׯ÷¯iDDãÃ(QæÝrË-Ó§O///_¾|ùý÷ßóÍ7Ëç׬YóÛßþv``@ÑÒÒ²nÝ:ÛIDä;Ž%"ʼ¦¦¦ë®»ÀÌ™3ÍŽø3fÔÖÖþîw¿›1cÆ•W^9kÖ,ÿÚHD4.0ŒeÞœ9sæÏŸŸô¥o~ó›{÷î9s&û艈À0JD”ck׮ݱcÇ´iÓÚÚÚün ‘ÿF‰ˆrjæÌ™Á`ðܹssçÎõ»-DDþ³„~·ˆˆˆˆŠgÓ‘oF‰ˆˆˆÈ7 £DDDDä†Q""""ò Ã(ù†a”ˆˆˆˆ|Ã0JDDDD¾a%""""ß0Œ‘oF‰ˆˆˆÈ7 £DDDDä†Q""""ò Ã(ù†a”ˆˆˆˆ|Ã0JDDDD¾a%""""ß0Œ‘oF‰ˆˆˆÈ7ÿqK*t endstream endobj 96 0 obj << /D [94 0 R /XYZ 55.693 736.307 null] >> endobj 92 0 obj << /D [94 0 R /XYZ 192.457 459.535 null] >> endobj 76 0 obj << /D [94 0 R /XYZ 168.411 131.985 null] >> endobj 93 0 obj << /Font << /F15 52 0 R /F21 97 0 R >> /XObject << /Im2 81 0 R /Im3 82 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 104 0 obj [531.3] endobj 105 0 obj [777.8] endobj 106 0 obj [571.5 490.3] endobj 107 0 obj [755.6 674.4 703.9 1044.7 1059.4 355.6 385 591.1 591.1 591.1 591.1 591.1 948.9 532.2 665 826.7 826.7 591.1 1022.8 1140.5 885.5 296.7 386.1 620.6 944.4 868.5 944.4 885.5 355.6 473.3 473.3 591.1 885.5 355.6 414.4 355.6 591.1 591.1 591.1 591.1 591.1 591.1 591.1 591.1 591.1 591.1 591.1 355.6 355.6 386.1 885.5 591.1 591.1 885.5 865.5 816.7 826.7 875.5 756.7 727.2 895.3 896.1 471.7 610.5 895 697.8 1072.8 896.1 855 787.2 855 859.4 650 796.1 880.8 865.5 1160 865.5 865.5 708.9 356.1 620.6 356.1 591.1 355.6 355.6 591.1 532.2 532.2 591.1 532.2 400 532.2 591.1 355.6 355.6 532.2 296.7 944.4 650 591.1 591.1 532.2 501.7 486.9 385 620.5 532.2 767.8 560.6 561.7] endobj 108 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 109 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 110 0 obj [613.3 562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 111 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500] endobj 112 0 obj [602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.5 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 113 0 obj [581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] endobj 114 0 obj [272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8] endobj 115 0 obj [693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6 484.7 484.7] endobj 116 0 obj << /Length1 1940 /Length2 14289 /Length3 0 /Length 15488 /Filter /FlateDecode >> stream xÚõTœÙÒ ãNp·Æ%¸»»;o q—àÁ'ÜÜÝ%¸»»_fΜ™9ßÿ¯uïê^ÝïSU»ªž’ýR’*«1ˆ˜Úƒ$íí\X™yb ¢Ú,Ìff6FffVJJuKÐ唚 'gK{;ÞYˆ9€.ï2q Ë»¡‚½@ÖÕÀÂ`áäeáâef°23óü×ÐÞ‰ üli P`ÈÚÛœ(Åì<œ,Í-\Þãü÷@cB `ááá¢ÿó8@Äädi´(],@¶ïM€65{K‹Çÿ¸ á·pqqàebrsscÚ:3Ú;™ ÒÒÜ,],ª gÓg)àÊE -è/jŒ”u Kçÿ(ÔìÍ\Ü€N À»ÀÆÒdçü~ÄÕÎäxP“‘(9€ìþc,ÿzÀ_Ű0²üíî¯Ó8²´ûó0ÐÄÄÞÖhçaig0³´”$å]Ü]è@;Ó? 6Îöï矖6@ãwƒ?S$ETÀw†ñs6q²tpqft¶´ùƒ#ÓnÞË,ag*fok ²sqFø#?qK'É{Ý=˜þj®µ½›×‘™¥©Ù4L]˜4ì,]A2âÙ¼‹þ‘™ƒ\ÌÌÌ\œÜ#änbÁôGuПJ–?Äï|¼ìfï4@>–f ÷?/gàgÀÅÉäãõoÅÿ"€©¥‰ Àdni‡ð÷w1Èì?ø½ÿN–î]æ÷ñc0ÿñùûIÿ}ÂLííl<þ1ÿ³ÅLʪj"Jâÿ¢ü·RTÔÞàÅÀÁ ``å`°°p²¸Þ|þ×Ïßø/û?¥Ê@Ë¿²û—G;3{ÏH¼Wï¿D>ÿ54­ -à#(Ú¿Ï3@óÏøë1s0›¼ÿ°ü^‚?üÿ›ý?¼ü¿ŽÿÿÍHÒÕÆæO=Í þô@[K¿,ÞçÙÕå}7ìß7Äîÿšjþ³Ð¢ö6¦ÿW'ã|ß;s›¿Ëhé,ié2U¶t1±øÏý· ïÎm,í@ÊöΖ\8fæÿ£{ß9ë÷KÅù½Wª@ï+õ¿!%ìLìMÿØ=Ö÷¾œ€ï­G/–÷%5¹ÿ9Û&F;{—÷#€wr>3{'„?:ÊÉ `ýCô'ââ0)üƒxLJ#nV“ê?ˆ À¤öâ0iüxÞ½ÿAÜ&ãлO“¿ÑŒ™LÿYL Á÷fCŽ?½«Ó¿ôïI˜ÿ ²˜,þß“²ü|ÏÊú_ð=-›Á÷¼lÿïkÅd÷/øž—ýßýÝöýªÿ—ú=3‡Ôï%uxŸlû{09þS„w{GW{©± ÈÌåoû?Šÿ,Î?ÞUÿ¢ÎòNÎù_ð=æ?ÆïkÆäbáú'Å÷ñarq³ÿ×÷j¸þ ¾Wãó¿à;C· ë»??áÿÌž‰«“Óû½üçíð>˜ÿž@ w Â✽ _°UMðÏû*7†1iÊ­TZ¯E§_®`“i+3לnE’»P—·$hn„“¼x5×Á†¶$ª´>y?Æ«Nî´",L`÷ç‰ÔöÁ2¨ ïz¿8zkXC6ƒ·ËRæ8ºrPÎøwë‘r¯í-Yù2·£²[É)‡ø\2Å­¥P8C™kœ9‹KãÂ@G‡~îŽ2ss;ž=þF"ÿÁç8š­ÀKg5æaÖs¥LÕ¹O—ò}d’ÊKtÿ«,μWѨ5ù,®ðØßÁ= ³ršxd¾Ê¸NÁÅ éþòíÙn&éN6š&ãŠ*j’Z8¯Ê")³Ä òÁ"ÃLBK¿‡r"µmpÓ¿:‰;ŽO5Úé¼bqyY¢÷Æl‰o06Û2}9Ÿ`˜J“RòÐÉf`«ä¿•°§FÕr}$T£ëò½t{ßrÜ1XAZ…zÿp±Õ[åíAtçÆQ{2V®ÛO<;y)h³Ô­¯Â¼Á š@5lã Ûšpa}eKl຦—aÅýpRšÉ= ›ºÆ<‹iëL¨¡5¡òhª}LJ8Ù+ôaú%³í¤DhIåý˜ý¤)¨?Á˜æàg81J(”°Í}šÅkÀÛ¨ïš/ž¨£k›fÀ4¬Ÿ^Þõ›cO«·¹fH˜ÅÞq‘ç÷¥"ÑúRæ&ä1GW†ët´ØPñÿ6–ƒÝaõ¹b’6äLß¹ÚQ•ìe¢²?„ü9tÚAÔ˜üð­#ç§,}ï$™Î'!›Wóô`}’QÑ÷¨Ø_sºÊN^ö£á$œÕtÝ&‚Ëë§Ïr‹y$¿@z®piòç*Ž1üš 2"s!ø‡<ÀŸ°†«ÔT‡’âLjë¶ÊÚJÞj7ì´Aáù6©Ž~"›”¨?áUª]hôöÈÞË(•ì†ÑP¶½ä­|Ï*zh¾\çvelÝ!Y•…ˆ XVhfÅc*DgCö‘󸔨Ëb7Öëáîaõô$oƒ^MeûëÖ¼§2*ê"»r<=£}•Èà Þý›+Í]œ6xvÌÆ<_lõž_Ð1ý.*ÐûDÁ‰¯û1@C"‚¼¯)J!Wé˜y¼†QüyC¾r³Wï†nCøÞ“ºðÕD2çàsÖ”e˜ˆvJè4É×߬ýjpÅ×^™j ’­iÐbb­SQ*?¸Ýˆv?†ânÎVëIø~Â0¼-N¨{Å‚{Â0¡ì@ñ¥Á$ý ûyÞùŠOj?ãœÛîĺ×VçôŠ1ç±D4…à4ø{*†n‡À=êpªˆ4ª®:´f´¯.:kOPzND~ÞÉ …Mdµtm•(íDÇ¿ù«¢Æ’Åc¢jé[å¯Ì¬>&ŵýj¿=ÊÌ$sg ‡,]sÕþí³±¿H6„0h*/AO°jßÕßíýÌØéâÞ ‡U –`-ÑùÉ&¯ò‡i(#Hq¯¶ÿF,.Öï‡I±Üv½8²•]¥ ™¦v(Ò²xƒ÷=ÕÏܰîkÁ}ËÌŸ]‹Ç¨`˜îUQGÆÍ®]B?¾LV' èÓÎ4›3=;’ŸwDLýZ‘¥ˆ§‘òúøMlŠûÎÆˆ=ÕĤM!«å£‹8¡2¿Ž¸ôvèA,ëOhç Ø˜Ï@ý²NÐÿD;å´xÍM}Ö"¸¶Î%ÓjÞûÓº§Í ¡e³a*¦6[jp®¢ RÇ7]l/!Rƒ Y"R¬uƒ-ÚgÎd÷µ§pS#¾Œô!@ìY×}dԽ®KÌ‘¼ž\ݲ…õÚò^kžéÂr‡.HHÎè÷`Vnêâ Á›Ï9ßX{| JY¢pþ¯(Á9éJÿ²Î£§‡³â%[;ž–´G†Ð»œ'¬b]Ôð²“^än¤=+.D8¶^…MÏÁ»ôB:绪˜Ê¢–‚WÛGgÇKŸÃ4%gõD,¬«íS* ×Q3¸¡H` Ò ÎÎè`ÚûˆÂeðU>ò°Cx¶¾…³ÏßÙ ì¸i‰Ä3׌õû³`ßøÏF5hÌwnViò”XS"›_òq—<Ù ™·‡opÕ5«¼~VÂßJŸÅE„ê¶0lDû77‘SbˆžÙ£/BÛaØÍ‚‚í ìB6•Ä †oÔÌ“k'ŸÙ1ä7²pZf¸µ•0.½§t—sŽŠe<¶è$’˜î±Ÿx -P8E(]sÞºªß6ª9d¢1‚K2oÜQ-*,•¨~(•òðGid7¥A]SŒÝ"lò"öyЋè[Tpk"¤ÝƒŸ‹œ Œß;Ý4· ünévlÝoh@we„—z}CU¤¯9Ý¢ YÆÜþÍ“ÚÈsi ÅU¿ê¢ÊÑ 7Ñ-bÖS#iûΊ‘r|·WX®¾!vÍÇ~ƒåçó3¥¯4˜æ,Ø1ˤWîp+ò>¯°þ©ÊÝÂUM,h‰ÖP ´×fd*Nå ·VY ïgUêŠJ†¶­ÒËSÎØjfüÜǨùÿ¤£¨"±³wß`“ Þt]iR´éæévF½„¤šið᱿FF×dá©ÀX5_%<ׯGÀ˜·†’˜§¬Ù¯.#“Riàcvü´/(n]¦™É°Þì7Ïg×¶WåÒ6êÖÓ~)áêN„%Œê Åh¹ ó„0ñ5G#Õ“íª–Û®tUd§ÓVÜc¦KÄè9 h± uNO&Ø'L`€ylÍ…/ÒŠŽDœëµ ÿ68ˆ—²H8:.&_s³ÌMm¢´OŠg7Ÿy¸¶ò›:&¼Ê ÓÑKuHë œ~Û,ÆÒµ:‚¦ãfm.¶,Däº AÉ‹›O!ðÚˇ=Ê·ô8Æâ'õ;íYqôð@–(ªjÖÊ¢ì•s°Ö/ãìj(7Æ«0>õ%»¸Ìù}%^‚ ÃaïkŠÜâw$ÓrÕãË)º‡Öþþš¸æ†À wÐÍÃÃ[3×ëð‹†/6¿MûðUá‚: ¬ÍíÔyi¾yaÅpògÏÓØ¬ äXdOJÄç•ÐA+”ìW4|ˆ„ÇŠLN,Ê,Hòü~ßú8Ä”ˆa¥]hdHÄTx|(5pQåÛå8(°Û%‰èŠìl`I†{pâQçGŸTä /v^໩ڗ`ô“žàÅŠ,èãâ@™œu4² NxÆLP‰Õð³Ä— cuÚS”J”²è/µ‚õn+ŸŸj7¼)pÙé„§…–,ïÃÆÀêŒ{7õœà£y>ˆ”v¯ëð?|þX2S)/¶Ýš<ö±ˆh‰"ó+áƒG$£»ØÔb_6U`»FQ²Ï¢žÌ~˜IæÐãެ9RfÇïî’¸.~ñ –&ý­“ñë1G´¶*’ÓÒã¯"/X£ îu,”ØÈÍžß’èâTò#Þ†³¯Œƒe9 Ÿ‡ëj;)|\”#Ö|[òH¢¢F§.Öù>ð];(õþzaÒªÈ}£d’i‡'Ú¨U¡ÞËãg®¾;*h¥ÖíŸÙ5a§ósÀ±Ðå´ZÆ2¹/Š’üºØ0bÀŸÐf?=,Ä3œ(.Òø¤ù Î&2^ÅkY–bó§‚ ÀÝ‚ …Kñ}G2t Ù˧§õgЍ£‚î|« }Ã2L˜r¤÷ÇK?ÇŒPŠÚ40pM ag©}c={ùBwÑ+‘ÔoïHÌ×6Û:δ‹ÓÂy¨[„$:wŠjßÔIШŽt¹ Wœ+žT#(ðõbû¼!‚".+Ût'’Šœ™dÒþ>ÉÅU·nZetäIB£Ÿ”·wXd5ÎÃMâí꾬rñ˜³¥Tk>ñ † 7<òI-?¥» UA!ÂÜu9ꩯ¨Å¦Àºd]Þ«^³>ý¶ßtµ°ˆ¦èƒä]oÄ'®çÅèß FùˆÕjB”M–ÞÑ.Þ`ºpwØÆü\ S\8΃võø¨ “%n¬ì«¨ó!¦LƧ⾺´•°æì…¹lû/+RT`LŠA]”(ÉD‹|å?]w‘ÁSxÁ£pö‘1º|ܾa¡1yÁŒ—ùgf4.NÙ²"ÕÙŠæÌßE¼}õô˜³™¡}{!«,ßÈåbŒou¬hØÚO¥Â-²æƒ™@¤øÐúgníy&®óâñ£UßÝ,K>ÀçØw÷¡gmïKÉ£x ©ÿæºä—X:Û|íp ×ò«Ë{°ý„w%°Úb4¥|DÚe|ûÁ·†ÑÛØH±}a0‘#Hÿ)ƒ‘Hòi9)ü[6%x’T7N ¦U=Ø)¶Õ˜ZY 3ÊaATiªZù¨y›ÞVS×SDÚÑÊ$ÔG nÆPLÒÁÂ:¡ø7vè½#ƒ×¹©g¦b#s¹|·GÄR=mUßýóûzuÈEêps‹kϦPAŽÍ‚(íªò%ð¯þr ÂÞ‹âZåi‘Ó×LÊŠµ0ÉltÌr7Û=/Ë}´>Ó² ædS܆mæ¥bάbõ\ôr™Ù(³YBpc­cã´9»Éaì«H–YÈÁ»ì[J¿67â`Éh›d*ß-ø†7²¾À/· zÙ_°9‰¦“h­ˆ”~übz€Èö/Ñ9¥ST<k)á7p{ý¥”yíüün›EÖBIcK¯VÂeÊÞ„Ö·Ø~ìß%_¿8ûÐi¿t/Èý°*L»2qÐ÷óMãæïÞŠëLekønռÚH™ ÎÃ¥8vNáégÐÕ!h+ß-¯¸Åsç~TÛ‰÷å œ§…'Ñx¦g›ãù™YiÆ®zËZr3©ÝÜ<‚ çFNŒb¨êI§3âJ븱îxĸýpÇf±¥v¼–¾§ŒµŽ&>Ô›àCË 7}Ü—H9—Òµ§¢Ï?cß3b6é;g–.à˜ñ«S¶§´LœTg©mVNœ`pʤóîf‡?O·?—1sŸdBú ™M;¬,¤X6ö¦ R™ë>!™|˜8Võc“‰ÆF)‘ºú8M-Ió„œée]Ùå«Z$£\oI6•7—c¨Û¬Ô ÞBúcźfø¤bnÛ«í§#«žÌ¿õ”¨–e°Ñöã|²0a mB"¸"×¾,W- ÔÌ WñΜ\'îÚÃÐ(.š‘=¥31Æ ª%6ŽG'NX‰¶VŠ‚æb•XñèÉèp¦yû~±ý€ÞÂÜÙÕ:¿SϱÿRvV¹g‚ýøi÷†”áëªÎóœíy"Ñmuë±¢ )Íôbæ×3Õ§ñÙŸYú ¡àwÛÊWf´ÔÇŸŸÙ#ÆK;%d5ýÆtyÚm ø ÂŽâ>8AFƒŽGùêÜ ¦Nƒ–ƒRGÒÊâ­¸´~’§×N%ÀLÃ&ÍÕö·ˆjJÑø­[nãènËj‰ð 7ío¥ TqÞ Ub˜ƒ¡EQ «I¡ç0+:ËsÜ,‚ÄË“\¹F0Ä€sΙ~~„@ßµ/¨lêËó•¡­“#eÓ¾sû…Ž&¯r·ƒîu×™ê2Jb$¸5éÓc€+ÉIí¤cS@Äð^©ÙZå;\W;cap˱¤>yЙ3%õýæ*;T ñ[bêZ $™ô¼h}–+€ÇX*w×Öî#‡±áŠDŒé¸]F›Ý@,’5Ùäü¨FÜÔ CHÙw®A‘8ëS¥T.mêgX_t©ÕÉŸy¯¾ZݧªÎ7ðŸm.Gšg᜘K;qÒÍa;—=ˆ¶Vå¾ÓcÅuÙcr¨I#“Ëe£àèR!Í—áî^›ô"åàA_òñ§›6“ Bu׬mö‰,R|$äöðPQ;rB;K×ö|Ͳ=XdsŸ¿·”#.wvœH0¬]p«ֺ²ù”<¢é§eê±²Ä!‹W;¹o½|Ä|4y¨ÖÒj¡¶"×¼MÛ„íOì?ÿX‚ž\oÓd¼á|NPõê~Ä+ãUgDPsxAªÏK¯ø´j^)ÈS|71 @]v5# âý>å¶n÷ä7Js2à@XäQþ›yL”b¼ã—Ã(v°nTÚžXõ‚Qø^°ô•¢TUµæq¹¡QÞ#köïW˜Ëjp_}ùØø¿.Õó¦Ô4 Æ"cí®QëÞÌÈ8„E"áóv/Œ1Áõ oÛ´æè4•b‰Ê]~ÏÑ«›Âê×ç0‡DT2H iÏÞ{Öî”òN€Ë53LpÒ—Š_Z:.eĘÇÚÂÏê×+Ø}KûLS%^ÃTwý[Þ¸Íï rÞtólQµœoI*]H(Û­©Ž²ñêa°¿TþÖhþÝÖwý›QkÔþÆD˜w$ô„×¶ˆ¬IŠŠê}>’£)Í*ÊR†GÚeã­½ø¨‘z‰¬X,Ôò•t¨§*pùºšHù¹æåû|êüaø{_†˜pëkT¢‚ÿnl4ó¸PÑ ¨ŸBGýð:öcH±ªnžõ½yïxaô&VÐ$N:¤¬ÄñƒAµñÜyUÛÚâ<ÝÖ³Þë±ÓÝñâ…w/o#ª&´bœ¨R§†ç‡Áeiãs T¥¸ô‡Ê N vùŸõ¨•²Æàõ?eNepÅæ2ëŒrihô}åH‚þb 6Ép\ÔY¶f‰ˆTuöC,½ż!»–¯S!Åh;®D5ȶ+ Åqðì4a>€¨èÓ1Ö©Mî 2[¸ Yø6œQɵ­Û“äBYÍz»~¢<3œ£ý†ìüI? ízñl}{ESLT4 X~ïÉ}”ÅÙ°¸ FuhKg»M‡qzAJène“ à„ŸUçÚÐÀ}€ŒÂ¶îðõ™MÜ‘>±¯ê~E—MézæÇeŽ c¼¤³I‰oï4á©EŒ+I_\¼Ú•yö;Òl¾Ê³®€§ÿëPr.œ˜†c‚uXRÐù8¦Ðžus"2­üÅÉ“¡*qU¿– 2 ™ê'®óB­×Öå)°éù¾ª£ð³´-æÂcµ³ê+ŠêýB×8QùK§ÀVÙRwßfn¼W‡úÅ7Ìn/õ^ù¹Ìr:=Ò Td†Që;/Zp*1š¤»þ³&™ݱL, ­f3Z~l'_ËwÛHBVÑ0O…†!›s¶[›ˆJ¦'†_ìøþ™VÕW™Ç1Ÿ- êcáü. ä„œ6žQ×٠ଋÓ=„Å«ó>²ýÈž}fýØìß±ÒY&KšD±ò>}˜¼Þ Ài%B hhÖ9G®Ž ðtiååà€lÿ2Ù¸²ß4nÁJ}Oê„ÞÖE@éX-nÒœö*’°¸ÞíTêCå®aü>©Ÿ}ŽÕës”& ý£H]•ã»88Rë“æƒ@œ-®‰cj;*Ïð‘r’®;©&ÙY¾Z[4n.p§?½ã^ï%:Õ’“ml»à:ZMàêÂæÜ('¡ }ƒÄ9<2OäMKB–¶s—\ºÒØ¿*%3“hbÔyÓsåŸ%A^(b·’Þ>dt•‹œ0ïäâíômÑÜ…ÂÒ|cZp pBÙòü”•D‡ûD ãÓÁéóñCáÑ: b¤%³X¨~èkç=xÞÏZ—^±qKý†uH“ÁN« ¥!\pÃc8P•zä÷îPæ‡;[Ÿ¿Éú€IÌÙI Úľýd ëeæ&9e¼®¾˜w`rc˜°ÊcvO)]oÓ³+ºht­«hb¹ b#‚:Ôp ¨˜„Ÿ`ÙØL¹hK×°Ú\¿ø+8<«ÉWBÂ¥ìkq©0¹WÆðƒ• C| “ð]©ïÂ#Þ°O´ºçæˆlCÞò [¶Û®â®9Ã˦ 途_|oÈ»æÆIc¢,“ç§B»êÅ*¡Læ“\±aU¢AM)/t(î2YÝ‘b0X¶'6n†qÆ(òlàzÑ"ÞÐìÏ$!ÑUèQŸI·„ª°kRî½à ì8 w©ÝÏo€z†ckǵ[p±Ñ%=¿¢ñ©ŒÔO¹µRau /r¶ÄC™Ÿ“* (G³zŽ{­CÛ±u»xŒè$¢ý´Šû¼žrã‚Eµ]{aÒ®9y|$FK†›Îš-gÄ"R) Ë7ÒúÒ^ÛTyOo^;\"ò‹!ݺ°šU&€ Ág U¥1S‡ £*X•)Ç>’s~¹\’çP¡Ðp-ð_\KÎ(â¬=ïJû´y4Ð$1Uj¤·’3Í»štÖ|9ÐãáuP0ãZv¨ˆÖ¾Ypž"¸ìB4À¾Ë‚£®²Xa7k7“1 $@¢•ï³!Ó鬻ä|‘FÝ@ö@’@U³ë £l®»¶è÷cMÔzéÅ*°&ºTÈpÕòÁ”¶ ÃÙí¶a1ÇÁK.À¯íNFÞ›ÅýZˆ)Ú_õï íÄúT{‰Æ<íý˜ÃH52É)­Œ­>gÂ!§lì7)f&aLС¬ÊãÔc‡a4Š–u±'\c²XX±0 ó„sO:aþ†¸ÎµÄ—¬ƒk~,É=Mà¨;!ªk7™a4¸)í 40|5w›Ûr©C] ¤ ¢y … ‰MxX6I§p§\Ì/Þ!’ù˜Û.¬ÑiKLïQ(IX…Ë!]E"7î¶ MHFü»,små¹o ]Évù2î%ª>HÀ=Þ³©æØu`gŒ‰Ét‘Dõ-mV™Ó¦Ù»%bLUäS]Cy$yYϧÆý•b”ú«ÂÎÝ£±²ÚËaMå>ºÏXf®Zw­æ+N[>0Ö‡¶Eé|6Øu‡+¸}E¦&ë—÷‚•»a“8' ù‘~̬ûntÎáäð›S<Ãý˜º3à×)+WpÞœ|ƒE±bšx6躚hŒI%¾–ñªCæí¼PçÚ©/`¬or’Ï‹ XëåžÂ°pæMo±|€í`÷ƒ%|ì4-Ó’IYb¿ÂúÜt2‘H6DŠõDíÉŒMgéfIxª*ØpHÒ·‡ëŸA!l;³­Ÿã[ï;oOÙb(ðŒõOšöÑò¦)YÂmÑÁT„ÖJn%mÈ`ûß”™Ôt)M¯y“N.tŒõ_Jô”¼DdyªNóañÜKÕ9U*= Uè–ý õ׬ìJíèÏA¯&â.ó™?Ó׊á\(õ# JozNK§$Êm&À—GúùêlÂÜEÊDø;˜<¥RÂRí8ò*ü€ Ð幡æph¡I'væá8~ñ^ ÝLóÌ—´ÔÃn‡»húÕ[bMW4–Ô·‡¥oÅlVªǖ˵ûcLý`:Ñúv±?à–1ÚŒ›ö›ô€PCl¿ÐìvÜAÈ‘ u¬™™ÕÒd¢ˆD¨9˜¸]© »¸êV¶šy¥sfëäéüÖƒÁþÔ,C}+nuƒü-c7ÿè8ð´ŠÚdíNà>½’ß]‰Ç8™Ï«óí5qé·óohMãün˜:qØ—«Ã ßêc‡z=I°K¹ÛC·KGyTgÐÄð>B£=þ†JWÅ.hûôØFœp÷X3,ùµ¨~ C¼À¤¾ôÛߦ¦Zê±;Åóµö* Åž܇%ÝîWÁЇðe}©ûÙɧôkkÛ_•)¨‘K˜(UsvVu v—^ûɾ˜mœ7מ­ßcvb·ãÙØ•l©™{A3³ŠœbŠ.µ»oûc r0%å ˜Rø^P—õ£<S±êFêa¹P–“´ù ×ƒSp?Zâãf`¯{ŪÝGOÝ¢ôbAÆP9-®&]É\†ÅÏþeô0a{,[ajm;Ü ®éSÉ»û¶+Þ©¯ ®£m®ë¶÷)Žõümå•ÖüO<–,ŹÙC펋®µ‰Ôg°é±Öì6°^=LÖpm/ódù6AÎÏ5þf‚ð˜æÜ»ÒuE—>Yz•N¶-^$Œõ:öv§ˆYé`s«¦" àœþÛ.MÐæ(=Å&Ô)]B]^¥w¥d:{è©im÷Ã0…oÛC[!{JÇ£YB¤••k¼ûÉÌ šo{ý¶c.ø7Hó°Œ_`¦À¦”î ŸŸêxÄÔîbÍOŽçK"pZ9A}Ó¶?ľI((¸ ;æG¾BJZèDUCù–OqEç×pÁU¸¾¥xËOáaä5`ž {lð˜Be~æ„Øi}~À»ºˆ]hvR5ÍfÁ´Ù‡¨ …¡²ÖÙrqS@xÐJ](η™îk~²—ù°V§ÄÆÖó*2À’Y“DVÜÛ½ìw–¤M¼ìXî3º‘tSÀ/Ë~v\㚃Qéhܱ0£TöÛïG‰ùMj-È )Oñi¡>‘ƒÑ)‰‰VpÌyà*yÂç—‰–ÊñGçMÒ›fþ—«‡ ýIìJõ§4Eí®Í» ªDƒñíƒð ä_ÄÀ¼š“\¹][¯p`h¡âäø\oðÜ=_$& ,†~auÈíˆ`¼Jÿé`eÁ¬“#”uˉأuöV=«r§yu™%a¸òë°d'Ê óÏ"Nà(Ýp~×ü×Hæœ|ú<ð|sRÚ6Õis$’÷z‚Å÷ÅwDš^=ÌA9m};z÷Ñ\hʪ>¿ù²FJg»ŽñÉV5hôt¨ëq^Šètn¶/qÏëËï’ýÉ©‘º×¦¡ ]J9O ·ÔWÁ'è³#ª“%ßî˜ß~ÇÏù~3aþ:k]²çBàŽ‚#½ÔxzñõâÚäd¢¸Í+Ø/mÛ‘‚$š’ ‹ã–:9ϪÀíÉŒËà6¹7é—<?¶_Äý?z2#L¾eE‡êc¤Ö¦Y¼„ßÌDÕÉ øå8§v¯®ªús¬ÕQŒúµgÞXãPšÙÀ̬Á¥$`óh 8ÖÔI4$¾>öðt^Æ—ìŸp Ÿ „Èô>è .–{ìõ4†'y¦×ÓÈ›£‹Š@LÿÞ9±_ËkPŒmG,û”ˆ‘ÖOñ¾_ìŸ=t 넘D©!Õý6¨Q(8ƒ •50…ºÍñ1¯y%¢c¹GrçÌðà´ãBs ¬ë¬&|ÌT´‘š}jW„“쪜랈‚®¸=á¼õ°ˆvC»6·I0‡·†ûšµm=FßFËYƒLFÚÓkëÓ1¦êáßæEŸ‰ºr‹º º‹ŒÔÓ÷Žè<àŒ‚¦ ËËYô-Â^×T¿J@ÄÅpbÕh'ìÆF¬cKDÁ™™ÍÌ‚µ,Í÷Â¥èÒ}S¿F»uGs2ßüMßâ×ÞDm[Ñ´~"öû2x­¾‡õŒT°Te"_¸mcü)•çd©O“ôWW—”õžä{«ú¯vW¹O:НÚÉ Ø}hä;$.oB2ü6ÿàV¾”úŽ-<’Öd‰}µt©¯äDæ¤hÁ ÏËËqxó1˜fH :ýé¿øv˜+8k'Ê(ü²QBw[‹ÖQ@V…HqG(úæGOåbTËö?Ê1íaá3L+ý ‚=-Ó'nûs ,lB+híùLöƒÉîªÄé¦à“{Mók}-5LÒO§Ï>Õ¹oïX}Ÿ¾³5ŠÆw¼ Oc3†‹ßµöâÆF$» ”´y@"ûµ-PÌJúšaöȬsÁFˆÏ0{ODîë³ÓÉYUB©¥JªËr0…oô·ÇFÛ±;¶ÿí¼m~2Òya¶eìŽá²"!éj?O~?ÄöeÈ@HO…á80pÕ@¦Úð‹nþY8Íu2&˜çlŽO¹TD®ŠêŽÏ@¡´ºV®·O¬&O-´ Ù°OÖ‡(^#ht~Ò)K§äuY13ÔæGÏ6š¼×6£­µÚ$ùŽ%Ádd#NCv öï}¥—ªÅ›Üâß—ª_2àÖa:†Ü3e'W¿qá"N™~­ÑI€ F²$vj B“7}Xoã;‘§V5(éô›•K¥(¬dy%€‹aå;t˜T’“FÃ*ÿ%€z"»Ø)kú8ÞSFVχë@ó›q®7p–V)ºÛy– W^s¼m9¿„ºŠ¾{ØÚõg‹²´˜vd!õ:Uu×q¢°ŠK[`‰ÛUû¥¼5ì~Ô2W„$;¢<”(ÅáïB”+<Ün†¸hJ§"ø‚Kº¦,ªi'oT7ÔK_#ñUhÆš„ NOÝ^fÊNöØ7ɯçW< X~/SÊ=¡?ƒCôÍREk«éÀ½ðañEHl±!¥ÅËûgFÏâ‰| ¹­áޝò‘5C¬Sáë°"ñÆ>ä–u<̉vè9}òÒ_–Z›Éz PN£ÕæF,ªõÐuöRú}z‹ÜuL•½g-ˆTMWuÉõ8LŠrmäìŒ $•™|~uûjpB™iCžÂÃÄ%Ä p¶UŸã•·™ïÍï;eðÏé<øé' 7:§Ø°Çr¥ˆnd.£â çH¿KïRw ‡t€A’{Öcl!h3^v™OŠE™’û±Æ>ÇÒ¢Éwÿ‘z=twh]æHpkMÕ8üšƒhäãqª¡‡Â9¦¾øV4ù\³\õÁ6ïÌÂl¼­]ýÀâQ.ŠßQá: {løšAkøóKǨɵ‹‡ûÏ´3*Í>}[L€8,eÜ„‘öÆu÷Tÿ'frÑe' ?ð¦_†ÆX‚įù»7éÁ´¯'‚ýúIGwÍÓÚáÔ£ Å•–pÖð >h°÷ [›M,|qP“û,}ç ÉH¿xu#ëÚ”o¾<þìp8ë¦[ô£ÓÄððFvËѨ\Ò G>˜ çTéU™Éó3¢+Çê½i33nçH‡OjÙŽ·Cð‚”àS˜üŠ K!z9kÕm1¼ˆPB0…mõP+_‰ùí'ƒkÕ;·™å[…83w1/ª5nZ*ýÓëôäo»Ãs5L¬ÚÕ³¤??å…+?ö)ØeÊøˆxRJE¹Ì‘—Ò´‚…ˆ G_|ÿúm0d‹ç×BGITÿ„Rß Lµùk Å©˜Ýhû‹]Úì Yè¦Vœ·§–Â·Öæ²3?·XÙW4}“L½SèûÈé£NÔùÇ7/nW³ûÔIñʰ×RŽ{ç n»O›7um¡ŠÙ\T*BÇ,óe²´’eZ6¹—±·ú.#ñ€§`;Óë;,¬ªã~⓵½Ü22ÙÖÙ‹SÃóÔó47óÈ“#ÖSП6J+ݾ•]üÜV-AÎî¼1ŸžïdßA}|3=”1º# ’ò¹(¥50Ïæ‚Y7öÒ/ѧAu%è¯sÀ)²#}°¹Ñ ÎbãzÐi¿ÅÛPzxº?n!YâýìÎhú…‘ÛV_bAf jÙD|PÖ,ï‡è·¾Ðä4ÂôÕ~µr-ot„¾fD*Pzœ4ÕÖ4'ªÓ—uÇ!ö§ïíôØ·$"HÜW‘ 6æ}Érûž¾Ü­‹"¥¯9yIph[ç¦$gi¥¼ÈË0Ìy¿(jgD0CFn ‹÷6åŠì÷i°ÔðÓ^h×Ré…Y‰õ[›æäÒþ¤ ê;.HPeØåÂMU»Ù|@Òå è™4­ <ûbb$q)8–x÷öÞØ*QF&g¬ýyS¿ñSÛEB÷ ´ë1Å‚­$$¿-xjâXÔMHà]£;5Ôƒ—^ËU66TïéˆùDËòíËz Ô;ñ¼E˜é¸OîÆ¢ÝOÒ_ö®»Åh7yLS§{U2à†ñ Ž>R¦Õ>ýÞ7y+ƒÑ½Ûl‚iÃÃIRã<¾ÐMòIa˜Ý_&šzã\í”ôæ¾m_ ÙiCœQˈ40†E>†¶å|Ó•ÃÙ¾ÔRŽ$[“whØ)é÷T‘ó”Å>ñÄȈ@!X:¦[7w²³h˜°Yç;øÑ£«À½¡Pë("®ý-oÚ¹OZ“bjÿ){vª¬À³žl°@>ŸO‡uXß¡sžÕqñ &1J» ¥ƒ8T¾Ì£Uþ#àslù!'=ã#Ëñ`»8â! =nÚ| B¯sÑ*"A¼ÉfÝrXG$íAŠK1ͤ‰_]ËKí‘Q\Î;i…‘/Ó}LëýÎOÊ•-==Ú(f1’3*ÁÝÔÅ~à–w ‹òçÀÞüXˆÍI9£(þéu]Ì?˜Ÿ*¼€dU§ð2ŽSµÜ²¡ëK?ÜÛ¥±3šl‘?Œ®0§jöÄ óð9`{ÔuÚÄ~»‰+µž”šW?V…ør»FÕ}ÈžÈpKkã)¡žU¬ž¨m™{™ÀŃ2Z 7Ý6A"]sÿ=ø1º^ÊR[С£ÕdýL}¼¹ Úã°qããÚ>/å`¡…”ª9„Ðg2¡únª6*]ÂT䟂Õc%—‚„ľÃÇŽ‘:ñ6õ¿kö´b: Te° †®pæOkAyy0ŒGMu}§Äh&¨;³¼l£Õ'ã8À#„cµ„7«Zñu wÄMçtvøš#Cqà7Œó|›IÝU­o·5ø¿¶;•PDPýÝ•Äá$¾| —ŠÊ€Ï¤ ©W‡ªì:á ™Æ9EHC-vžË阶(ßÒã@s’âC*0^bÿŠ»áçô(wÅ_'”@—§Ä¼üQÇ ap0çóµˆú¼2Rü:©¦K®|œÿºÒ¼ØùÃăt®ÄýlÒ¬ SAÛ=Ôê#)zd^=gn«ÓIӎزqZ¤g{&nº ðùVŒ;3Ð${ïÐXÈ®/)h¿^}‹úp…–.€(r?6’½’¨qH)À à’þlu¯2óü þœg•mÞ}¦óTÅIjí߯(·ÍºàÊ…fòŒO‡0ÛßTùgß¿sjsõþZÞý,ûê£Dj/Ò¾]}ÌøÞºüÑØdÈ8¢ü¢&²Øè½›¦Lw¬„Hèak#ÿ3‹"‚ endstream endobj 117 0 obj << /Type /FontDescriptor /FontName /PRSAOD+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/B/M/O/R/S/U/a/b/c/d/e/f/four/g/h/i/k/l/m/n/o/one/p/period/q/quotedblleft/quotedblright/r/s/t/three/two/u/v/w/y) /FontFile 116 0 R >> endobj 118 0 obj << /Length1 1923 /Length2 12036 /Length3 0 /Length 13221 /Filter /FlateDecode >> stream xÚµPÚ-Šw'èàÎà.Áƒ»ë 6¸· < î48Áƒ»{ðàìqäž“{ÿ¯z¯¦Š™ÕÝ»»WïÕ:*5M6 K¨9XêèÆÆÉÎ!R–Ôãäppp³spp¡ÒÑiAÜìÁÿ±£Òé€]\!PG¡ß"¤\À ·g›4Èí9PêPp·pr8ù„8ù…88\‚ÿ „º¤AK€2;@êvE¥“‚:y»@¬mÜžëüç'€Ñ‚ À)(ÈÏúçq€„Øbr(ƒÜlÀÏ-@öM¨ìæý_)ElÜÜœ„€@OOOvƒ+;ÔÅZŒ‰à q³h€]Á.`KÀ”* ðßÔØQéZ6׿šP+7O ðl°‡X€]Ÿ¸;Z‚]ÏÕšòJU'°ã_ÁJ°þ€“óŸtŸþ#ÄñÏà ¨ƒÈÑâh °‚؃ª²Jìn^n¬£å {Wèóyb2ø³u@VBzfø7?W ˆ“›+»+ÄþŽÀ?Òë `üWþF¼Ï8ÿŸ—àÏ#ÿÚÿ#ËÿUþÿÛ‘¬»½ýŸ~Æ¿þ?~ÄÞûïˆg=»»=ï†2ôyCÿ7Tü×BKBí-ÿ×'ïzÞ GkûÆq•…x-Õ n6‰è?·ðœÜâVƒºBþxplœÿã{Þ9 »çGÅõù®þtŸWê¿KÊ8Z@-ÿØ=.^>ÈÅäÊñ,0.^^€/çó’Z‚½þÔ6Èîu{>x&ç°‚º þq£|| ä¦¿?(õâUÿA\ Æ¿ˆÔüñ€Úÿ Áç, ‘hþ/zÎiñúƒ1Ðò7È ‚ƒÏ%­~ƒÏ5­ƒ< Íoð¹Èoð¹ »ßàsö¿Áç6þ…œÏm8þŸÛ€þyžcŸ_ößÜÏm9ýë~ž Ó³¡¿ñxþwtþ—ós¼³;Ô lino¶rûÇÁÍó¯ã¯=ù7óËå7øLÎõ7ø\óßàç­ºÙ¸€ÿmñY-@7Oèož§áþ|ž†Çoð™¡ç¿ë9Ÿ÷Ÿð¿¤fáîâòü ÿù<ëð?øÏ7 ö[ ÎÏ@-„Cm¿„¶ÜTIz²mˆNÒmé¦2±ùλ´ºÿÂDJbªü¼êr%‘4ð {iS†ñòÕåƒïÁ×Z¤ˆ¦Dõæ»7÷¦ ã[ͨsc„½£y5=ä(dlZ¯¶ß<8¿Ñ ²ƒÿ Û®@—åì.€©–ƒwãÙ-çUÓS²8>³¥¾]ɧˆv_2Á«cT8E—mþiš˜Ñ™÷Ä kêòj7sô‰R!Õïg,w¾¯ÁWÜí´Ïr™—kÇKÚ—Ääð—¸Cãô¾’»É D³¾Eï£ ¬ÈMfÄZ±@Î<ÕTíó"%ƒ£ëƒÄ{¦AR%X›ãáï,Ô7è$öì53Ûˆq³jø '8MsQ]ÕÛv}¢Ë§>º„ˆ÷Ú¹ªqE¤u½·§½dGlÛØMžå›{™ÓÛ#è?ÁPûþ)àU—y¶›a§/È ã° ŽÿæÔotTÎù³á…–þ¡˜Ö Ù è;§ U¦0¢ÙágÝþÞ Ü';1XÒâØq8EÛ¡êU…v̧.•Ï!â &"Û·¯ÐáÖfµ¶ÜCç,K Áãqé¶B Ž/ï¢h¸4sª ?ô|’4Ç*S† ††~á¯,ò’#sH#¬/ ¯ÕÈ…FjÇ‹'Þ¢íYVJZ¾3._2vöÚÄó­2VEé(˜FZú˜óS)·nbnG$ûÐØy»;!ßlŹHªÖKåŸÔub¡.ÄŒ/ËT‚û>'£o„Ðdˆ5Øv^Ùä Ô±¤j?zV>n¢Þ×ÒÆÿèÛ0Z×Ua—ÊgÔ™0:VÙÞ&ËjýÖȃ‰0%!~foŠíÚY¬®Öp]‚Öçm¥é]´>Ón¾†3Üe&èNî×{¥¶Ñ_¥âî2ä$ênS7<Ñ/=2ŸÝÔ©6mRèGÜÐH‰ÐÑ1…úƒ­hÄG›yx‘‚»lÇÿjóu¾'QˆÏ–ºÜôR3%æÌú0û‡q ¯¦Â\â”Æô`\‘(¾¹t^ÅÅ©ôØIŸ{¹ÖlX¦Žý²Ä(¡ÙJü‹XBIŒâl~yé „™­,ݧ¯Æu» 2ÈÞXAC#ªãƒ‚åÂU`ÂýÓ>ìo¢_e½ä0zù`¥„žáòbnæERKj÷“?òÂòða\Fy,¼0l(ãw†…mÊ ”N«êŒ{`¾…nJˆtjßÃË"Øï¿4z°ŠB›Fðr^tÏO´§ßÓ:à%RQ“/ ÖÄhDù ÎüŠ?.ųø€Ãˆu Ó¾£ :Ô±µ1¯nv¬ñàÓÎБ6`«Lî¬H›Ò]PLvª«D?Êi¬Ïö×r¿Î?™Q=¨á$H(£º "óeÐóóä…ì Äì-M´÷ ±Š6± –èÈYls÷pW ¾ì°ëA³ùiŠpˆhßL°#ሿ Jߪ n¸RéèØj:É.4L£δƒX̤Ù>HÝ)sý0âu©Pzw.”Kü£&¯ÿ×ZyÛ°ÿÚ£EJÑZ$•• ©˜Ú~¥²l^ñU¹ÂÜv*^R}*Ò2Ob ¹€N™Eøáö¥ÎKt1Ö×þ&¥ý°Úb•þ8¸+þL/‰’å2ÙðMCYF§"S¸nZâÒ!Û·#Ÿ8a\ª“Š^ôˆ” ­ˆÆ l¨À:ìÆ#Ò8€¥Õ.ÆÓ‹Þò5‘&|¸,ðµ‘é0ÕcìõŽW¹IEb$)Ü!²äÉYÑã)AhæÅ£zw‚®'•X%C¡pWÚÖ€m47e¬—OÜ”LQ[‘q?oÏÜ85D*¤OVÇ&Fæ4À•Ô¨ÔtWÛ7gð¹OÊ¿¦Ïþòö², ·Ù23oXô `MŊ߇ں䛩>Âr‚$È­ã hKRµŸ9«¨«ßÀà‡¡¦„ƒõvfYß.=ŘP¨M 8@@DÙö¸¶ºŒM/| 1 WÃf⩲šaQuÒ3}ëæàM6|§a@+b“%µâ™ÚJyzÇ£&÷ÁÓÆ¼=àõ-7DÆ/4¸Î+ßá§Ïu’Á -ùä=¼¡L/^X·“P÷v“ ¥9¨d*°]—è`“X¶:chi Ü1tÎh(Dfÿ4#ÅáN¦sMþ³•¾dk‘UbÅ“š…§†v%_lâk^ª(Mø•"³.\‹Ld¥Û Ó6…Ö}hæä#¹¹ç–ïNŠm"’ã¿D¿ëóR9,ÎYqÚ|ç _ð髜Rà¼j¾Øyæ$4öbò «èIÌ‚‚ð‰‹‘ê%™ÂË;>âïßì^âÅÍ8 R#ª ̤': [O»6|ž¾X"¢+~CXj0Rù«ÈÌQo\%fS~Z)ö²\”sR•Ç&j:ÞæõlúÓĘâ0‡“®3‚œPÜ* C>~wLuP(Ö¬Z³Þz3kÞÂbú]EBätøœD_fûÀtÛ~ç^Úá΂o_kyùƒ§n¯Ñ§ØBÉ5"‘ðFKÑP¡Ìc„ä>l;F\7Rå&Z™€¹ £Jr|¤dun%;,GË…úÅ2 Se-alHî»_úµe ”­|Ц¹ðäì*ÿ*J&œ†É˜•õ è?ó2ÄŸÔt¨ S8õÃÆÍÎÖ¸TŠ÷«ÅƒB°F”ØàI{PG-pJ¢—®¹åüòµ`_î0¤/d¿sì é7ƒ{7‘5ÃÅ–Ñø"p%pIö¦ÍSYU+¾RÚU!uP´©öWgˆ/Ê]P«ÖJ[ÃW…ÎË„ ×Õ‰¸»3¬€6:É›˜³EZ²YÖõs±Ìí’sèžbÊõëO£•˜SXY€ÆR®Iì"ía~…jÆúãfò¾Œñ³r N5ùåøõkvû,õ)XÛY:ÛÌ"µZTΣfs®ŠjÝÀeņЯ½}V¬ÔK@nÿÜîJừdþ g¹è ”mGƒ.0j{Í1™LA²žì•ã6ìŸÇÞ7›| YÁªL­tßxÆúÔÚÕ°ø¡Á ›v’ë§ËwÊO¶;HE™ès¤?éâeáˆtBŸÞÊmô{4#Š›i ­)€4z‡ê°n63Jab²—Eô¯ ûSêË/úVàâñ'×ÚÖgBöiµÓPƒ‘ÇDq§íÈÑÈO­V¬B³“ßÅd¢Uà×¢«y’ÊÔ ^ŽÒª4‡.ˆä<=½¥¶ÕChÖs…Pv!™Û—©¬ýùiZéžz—ê'³1K¬¶DdÂèw8tVqnÜŽM/þäS>Òö'Õy”èÛMš~¼»´¤÷|¢hóœF`âª\{Í àµÚµQ±‘™ùúæ4í•‹hÓ°x<°€äZ0N$Š'©½0Ï_ÁžÅ[¼I,Y¿©!H«ÉQëPámÒ“{ápZo”9§Ú%‰&‡ÿŒap¶„ÇV¶,¿6<®Hÿ! ‚oÒôx5‘ Ù«÷Ü™ð¦y°L‚û6xŽMçú}Õ?Ã|y3iÌw¼€*´uâjÊÇ[Zò ËÚڔ˜ùŒüê‹Po¶}Ù¯WжÀî|›\Ó„N”Uó…NKöRÛAþ<¬ˆÙ×£86ñ£Kca¶óBD9?MZ Ðôëu(úl½;ñgöCeŠwŒì~jèŠSW-þ×Än?yæ•Z"I©Q1oñtUÓX„žÜ{¡¤js™,ãPÎú “[sÖêE¨,‡¥y<ˆ¤éç˧¡Ì+9“¡2»÷Œ¾;]ÃBK¨Èiu+Æl`…†9s’¤A‹ iq‚êÌû!›kWÜ‘œ€¨_½¦u®Ÿ{5¿}Ú%g¹yC`«OLJ\¿ÒÕžÉr¿¼·ÆÎÏÌ_‰¦ÏQö›[,êçΔ¶ë·1‹5Êtq·[=¾†|• 5m;Š$@…ÊšŽ§YØ]ªdLEßP:šåüò˜%˜fâJOZL{ÿƒ–æƒïvÜ÷ñù¾tg£¢ÞHÖãRû§.9Z{ ý*‚¡uíöa˜-Ÿ>®ÚÁõû÷&vöR_޽±š–èÈ)™Æèëu§e?ªað•±Ó¼Ëð§vüÏ œ[‹(!ò9aA´™RƒZÌ^!%=Æw%;ÉL”LXX7ƒŒd˜)c‡­È I˜„ջĠÀŠË&kÈãWÔ3:68íÞ,C«*-=þ) ;I˜Eat²ö‹·¬×6üÇÊ9<£ûd(>»‚B›C5ë¶.—jq4bï³Í½Îš7M¯› •º»3ѼKÃKCª.Fy±Æ5^}­Ô¥NýJ-¿w ÷Ï^ùÏmºÔìQUÂó4?dŽÇ_6ÇX©åBÛ•'YLXS1øL‹º¾6sÃÇÀÈñôý!ÛM¿‰ÇC…´q×ð¨éúQë3¶D(E+5þ>J¾ÎF06´LÑB>*š JËÞd¶&Ÿ»?ô½'¯ƒï%£`šÐóS4€— ø¥Æð.QAПQÌ_pƒ¾+Å£sÃä‰9¡©5Bw‡TÔ^e"¤‚=÷¥˜.–acÆ‘sÉÚC|'‡¯†?èõUáÕãyÊÅC§mΆ*yQ+þ|›ùòÓVÞ×XX·lÙ3ï³íš­ËSúcßsOuCƒ(…÷9Ψ,_×_¡o:8²®Ú*;ÊXÉ£; iÈ‘Wj¿(¯ÕǬø–~£FT”ûôI;JˆÔ¸;O’ª¤‡HE

¾@å’ –»©Ö§ýtÎztJú#fpžŠ }¡»ü›ËÛP–§Žâ:j4!4ØxK"M¤“òÒo|Úž—ªÔ2³wäc'g¢²ïºDz)³°Æ ©Ã¼8ðap6ÐÒ. |}ƒc».V(ÙC‰Ñûê Pj;‡MAtÖ–þÍñæ›»ŠºS¥ÚY>ág°W9ÑßU>…ç\±ÊÆÀG”8{±úûòu‹ÍÜð ½dÖ¸?>¼OØ5ÛvZ› ÂG]<]‹f—wcx{a‘D1âßtX-ah… ÊÜÈ´4:èð•:¥4Ž)eºêûFJ×Òð Ý„Hû‚Šl…hó±-¿g2 +Ê '38%n¡ƒ&)®–L¥pˆ`9g,11ï¿ßƒdd0—x¨Û D ÷ÊüøùéæšÒví€\òõv‘ å…žðæ"C’I¸Woú„õ7Ð*Úí;d}çJX ®>nç ¢â1°Š…Øå8;¿ª2#Œ$Æ—Š®:bÅä{¹ðæLûåîC®¾bߛơ­mß Ó²¨gqÛj1ì`¼L]’)Û ‹ÿH_«HÅÎá¶ÇT–mur9=uΟ„g?칥'òíÍFûMvãÉŠ'1Mów¡7ƒc-|+Ù³<¯o«ò§ì\NýåCadâò.¦NÓ=Ê#+ÍY¿¦{•­÷c뇽jH]s!S"jè`øEÉ=(d–/Á/õÎ_Åt;µMƒFN·›q”ôŠ%F[-Ê Gàsû*¢υù¢ªàÔ*ÒƒRýñÂ/*QU™õtçã/­‘aÎúI´õèm†ßòÅÏ©¶íœÿZ›Òáª6Y ¾‰‡Åô‘«<¼@T²&FJ¼­ZM5Ÿ¨çÅîØ­Í®H$ùävPú$“(îû-õŽâëð/ã¾êÉøÁT< Ûëâ6›îfÚÛ«ãñ= B E¡AïeEjâI¸§Òî à—7TèWÔMu´Iî_ó5þ‡v¨¹lù ›.ͯ«\“"î ·ÊJØ_?våˆPÕØ0 ºÞdX¾&(±_ ç^ ún¸áÓ‹Ù ‡è?6'³îZŽG·óAcS+§æ:v¿’È|€‘›6ÄžÀôª-ô~ȯg˜…Ž ‹´g‰«ËÀ׬ Qt'w©ª/tŠ+Nk ¬é›ŽN„JþºÒ,o\¿[êÊñU|ñæD2/ÅGÒãAP”ËÿBÓ}Ä?¾Ã=ÍæBˆÀCíˆ1"‘¬p>KŠ˜´NI ÌîûNZqvp lP0&œëiîuÞr@BuúMèôí{{/iŠÌZ §Û1!¾‘‡1*w´òô ‹ ßõÜèµÍçž6ªZÍù5%­Æ¢à_\ÞÁl6ÈxH%S•ì5/Þ›Wx¸·®óF^To4ù¼‹'mÚSýñ±î«vËØw¦3#‹*9ZÑELhÚìÓA†1þ]¤+Fr4oê X,&%sû teC{‚ÆÀá÷a] „m/(s»ý€Û‹zDHž·ö›@jÉÈ ?4ÆõšnÛIg=&:%» -ºŠcãʯllÆ*aýø3Çõñº‚NÖ]ÆJYôeµ‡0ùc§Ž®³»ç×söoG÷å-ñ# ªk#HBô:WÚ¹%&>Èo7æ"ÈÝÝ"W¼°ãà꫞|ûríó’ ‰¹þ'ÏïÊ€0v–¡e·ýå9û[Ó‡ö<ß³Ø\Gý³¼“4Tq¶”Q3W ÙãñW’/šGlo߉+ eAP%>\Iµ ·¿AJWEê÷‹GX]ìû¹à-®éSOH›¯w´V”õÚáòÁ“RÁC«ÿ¡+Ÿû‡ªÄ7ÈÛ4”„îóUš¡+¡Î’ÿgm{Ÿv÷è¯îÅ |Œ8ï˜4& ˆ{‘Z‡½zÂ}ªwòĺ>”s'7›Á˜^æ}ã™yª`¸g—ư±Ã95'Z—1‘jký<}?ü" sµ8-s½ GÖçƒl!¤YÏâqyÇd[r™MÉw £wµP\ºýk3Æt±]v¹™ó,1hËK1z¼„ã¢û”"ï]Bn`ÊH bwó¡ LðrÃ7¦`èá¡Ù'C"Ì\Œµ<1„c±¢I»¤À9"£ÊW¯¸V©ótÁžè„ûœýäLÁ­ ד¶çz©ö¦aÇ]5`“m)B'¤«zRXâ¡·yM;Öuò=óÅ9;ì,91‘8°ðlŸ1é‚·—SOÀñ²Ò1ä,9Ÿ˜¿O}g\E¤Eû‡MóÆ,?Eà¾çfI ÉÐpãõ°<œôåû¦ÂG I÷Ä¥ý«»k}Ÿf”ª²Þªœf¹¡™cîÖeÎŒä‡/²‡eéŒ {3¦Æj²|ÐE)˜·úþZʇÊÀVFDñSÐ6›7Žõ›>×1Â/£»úu¤/[~º!弎¨ëýl¡Š^÷=RË2˜B^ ¹Üº«ú<žoL’ÍÙ <âk朡¼Cyn'EuÂg'÷}6N n˜ýX¸Ié‘rMRž¥Êµä¢dÁ…/kXOSˆã†ÌÒ߉«Ñ—?ÎÙVDO?¾…Šð}Åqë³àá—‹n”^L¹™Äš«:¤:Ÿ-ÕĤñî©›ò™’h·¦—Æt'»ˆB…Þ“Éd<>ëU P6å›}Iñ{/l‰c^TñYJ•›§ûS=†š¡Eÿ·”Šõ›…»Hmb¯³åG‚ã« 8HÁEÜ9lXü–ÞÞËB£¤—Jc7}º:—$æ’æ4׈¥0iS÷µµ=d0púçÛ¯pxt¿ `” ÷t^Ss§¬ÐUacjÝköÍØ@rf(·pž•¼+û•†D‹¹nc_u õ©iž-lŠ×¾ÎÙQŽgþt·]3ß~SÒÔ²1’ûsG _ÏõêW¶\/rjyÞ€þžÊ£™IÀÒpĸ…ýÀäõèIXª‰¾²Ï To†ŠHÐÖÚ wuçÒä°–mÒ§IIŽQÏ1tr ÜŻę(½ (7tè³Ä&›BiÛ/|oaàç[vÝËŸô«l‘ÿE.£ªù¦| ‰ƒP3йƒ6‡+™¼síõ-Ð'0Z˜ì ‹¯ý´kŸHÔŸû,,lÍ#ÚŽ½*IH…¯{ÚÄE òj4–ðU‚¼ØgïBh²‚’ä(ƒ8ò›­!" $ÒýIù¾[s^šé$1‘7¨’}Ñç¤V³… ûÞy¯ÄÎ^ß&¥Ü«FdõÒð$ o_çÿ …¿‹\}yÙ/í‡^½ä¾J¿bÄì¾;Eåîç°ØÍÑ1ÍåL½¯z ) Òf€™ÅÄ¡hÑålŒøARÊEöfü­¬Ã£”ü:_·ÛÞKåxµSë²:N2 5ÊÍ¡ÌÃÀÂŽ“þ z~{¨ŠºQ¯È°À<²]WKû¸¨3 Ï-g‡qçÒ‚·Á#mÜÇH¦…;€Ô•Û¾+šn‹T=Ÿ$´0žËFS“ðÑ"u2Ÿ '­‚ZÁuk»L½0Ôàg™!3}Ù:ߘ¯,Édäh6H3|.t,­Vè/rl[ÆVôsºJh·8 år†–2grE™8SC^JßÀ•vŽ”XJÞk µpëÜ›"2‘]&ˆÆÔ1Æ‚õßóu=~j•Rƒ,¡¬„’(~´5 ø(Þõ¨?X3žòQ¿†Ì–ÕŽòl,`Ü·0ÒÝí-M¢_,˜Ø‹¦éëx|ÚŽ6B)ûÀrc­_`n­§àçvТª.Ê~M›Ø¶b±:½blŠ(eÂ*—_‡¨•tŒhzð¿–Có‚qJ¦s¬å¹¡¿)RÓŃ)žºkDI7AÓýô¶¦çã‚ìHü\à¾QMêíp=]rÝÀÇ |©s8a'E -ƒ‘edªÚ%7ÜöRp´Þ_0iŒäÛ+!ÌðõM|2Jg#WШ=`î§òƒ]o²Ã~ªØˆ”ƒ¿+æK"YÚ˜uûQá]¢niI¾„+W †+bÝÚ3vá5óõ­Î°¶¤çëuÇ“aÈÉgô§úÉÔN¢!k–ļ¶CWÔ‰Um’4ùé.Í“™B¿^ò÷.•…X޾#{ïÃy¥ôÎöÄá°d {¸Ê YPÛEé%€E$Ëëªí›Ø_Í=²$]ú@kt†Ì·¤Éqç”óÛíPB©úaža6•9A¢4ò ßôÄÅ {I&鎦×;è~XWÆâ—¤¦Í8,XËå–¨eäf©t=5¤_ùǰ#cýs$5 A(_™R+ïæJåì)l#®¿\ê3ѨØo![gà€Sx÷¥v”¬;ùRÞ§X(çѲ¦‚wAanN.½Ø%Ñ—HwSöÊÖA„|mh*ÊÞ5òN¡Møûñ‹¹s¯Ñ8ÁÞ2B-ÐO½Ó:o/̼.fŸn*±£o³^4•¹¡]ñϲ¾¯Z¦ZVwzeØÃïÌG¦*AÁæKÌíœѧ”ÿ!kdö›#m@R[‚¢/#ÔÔÜǤ"M§ýC ®øFpT€‰`„®“⤎,„kA|½êÝ(™&Q3ÎþÙ*ƒ¸Ö³£F¥:WBŠbñ–Ô(}V}£²9ù}´ŸCky!CµÁ ¦ T}WÆÞ”œ³H¼Ýūƨ¶é°«n³=þ¶,Àò¥Ÿ$Θ¥8zWjãÕÓà«ã?õAi©ï‹qÚ0IߎBR‰£lÏmàM¼sÊ­“ö<.wútuxãÕb_ç¾ ¸·Å–*¨/+"žÞIŠ3Jûjh]°ÓÅÄÞ±™µEGßòøAÅ©N™ÐO¸Î¢qí²YÐz§BÊãUƒîbø^ÚT6­£[ÏALÔ¿5Ú~Ó­f7ñKvNr °5Ÿƒáåæ>Cöƒfä’£”í|(:I½îAÄ{Ư¨mía«M¬…¾ÐdÄÄ×b0’1)¶ãj… ý,nßsîÇ Âé}î.W~=…ùÆÔñ$¥ßÝ)£äɬ éý£ÛvJÎk}!”±E‰ƒ§b5*®ãh&ãlcH°½«ï‚y÷¢.8¹Ÿ”ÒÿJU×®}ȃ³–þÖ& O>.—lçÚä—[R¸s*CÞÅsùóöüœ`T½O9ªuºØÃI'µ{éJ¾µ/Þu¾Zû†´û³êm.=À²ñUÿœ¦àP6Scü¸‹c¶/ÅîZ¼Î,òáÁö>Bg¯± ­Ûžp0Û¥ÓP .vÛ«äåû06výžaAø# ¿Þ]-æäݾÝXF6¶n\ÖL$Ø—GW.xÁéd)«oûÓ„R•doϦ‡{³ýLå,6¼‚1ÎXåÛÍ£b|ú†B9¶Ë{ï-­4jìûÖÌ›ìØä5-yãóÂÆ0Ì¡+#W{Wĵ¥ËdØëØÝÉL’Óuë””ûë†uM š”Œù ÞcUtVGË•n¥F ,º8^qÝ©½®ßõ’™(ÞG~ÈT4g9Äp‰ù „ÑéSsÈk`äˆÐz_ññ P%yëMò“€†þ„úçÙUoÑ^ ½áøA¾&Õ»o\„)ŒšªïG—38úhÅ¿Ýý|Þ-m&sRd–¡˜fPœ5póª™)á§;ÇN½Úà‡ÂˆLÈ™0Y{.à$ŒF£`u²xt>ÝZLg3d†g~2 ¦Z>ÁŸ~Õ¡9.°ì›oÇ-ÝŒ×H×Ì ¦I ¡}¿Ì“2ȺÀ À‡ñJGên]ÞzYk¶;6§Ó\—¥µ x$§Vª:Â÷\bÍMx·fV ÈákÞò9¡O"GÞiCÄ;…ã2¶q±[o¹›»všã¾¸R&î»ÛQEÎ DµŽÊ¢Ïf0È}Bü0`Á>£ª?mmÓ¤ Æ‰\òYš%\D¹”‡õË•„άèiÈ9sqK5›¾QåÚ ©l™ˆkX¥6í®6ŽøG+æUãPgômnZg§ çÂ>1ÌRaêÝ„;Ð#ü2-)Ú[`”ü[Ç7Úß· t÷ü»é¾6-¹QŽî+ÛìI¼se8UÑ–ß-Ÿ–Òc~:²›°KîPÉ/~ønU‹+,t’ûÚEy ¡õ­H=^PñI†w,yŠ-µR¯ÁÍÅ£Üì"ÊÎy…áÏáfÖp¸D£¦Iá†È†qØ÷ö#†ñØxºþ#a~ßRõbS’tÛUù(ãýÞ0yšvqká%R³Ïõ§à6îM¸™Ò‚ý~Dò‹'ñÏ=Ã?+>ìÁÜþ°ÜùðƒÄÜé›ñQÑúöY•å]à±íT—œt.öþI)üCgE*É>[?ÜÈ+>Cœ¬ù¬šlWÃ+ÒF¦Nj)êÎ ¬Äþ“ãª2i4æC¦fºur®Ìê3*2µÑ×gúpêùÔtÉIÚI ÆìᇙQï0ÝÉ”ÝvöÒLö’gdgæ»=£7¼ÝÃÀS-¦iÿÕ_¥qò/ˆ— ’ƒ{Ø ÞÙ’·šxq!÷©©›GŽìl‰w_6ÇúqF)â¿—h¨$±{Ö”E€‹ä+5ê‘Âkgôìg7pÊi¶Y"’ž.HÄ$)m.èh…›R"Éøó',Ô™<£Bj¶s­œòêÏ$ªûòýº¯ï¡"hoŠZ&_v8p¸Á‡<¥ºu èMH#¼7×½ëqÚ¢œ¿ÌŸÏ‚5…Í`%mðÐ{hu"|0W9qµÙîæ—Û(w†£:ƒ–9ßÞ;l¶­a°M(O8øïB©ý‡ÇBº€SéÑÖ z(r¾‰MÔ”ÁßûÆ{VÎò h)cz×e ƒQ†;–ÜLýmžR9iT î\.Üg¯ýKP¶ÎÇz& yãÏ5|zßµ†zÐÔé1Ü`t³ÝdŸmD'_é ¯;ÿæog)#/Q"øˆcDªZʇÛ!ÉRé6ÁЃ©ŠSl÷9“&åø°¢aÆ»öèNâ†yÓdˆËD©¥:@°oH5tÍ*83È .RN½SȨ¬¤fÎö”ðËWPT·¨‚ÁG¡J¶BgÍϸ4.7Õ¢on*²-«‡¾VÊæØÒ1º¸nèNšQSΛ¾¬ˆ?^óÿî· ÍžjíÌï02ô< ªÊµ¿¨d…}ŸÆú„²/ÏÒxî¾Ô÷¶æc˸™]‰-Üg†aÈh7ùv«&·Ê\g a˜Š´­9=þÉΜ‘Ù"—0/©/_‚ÿè o‡œ Žò‡²ŽìobûjR1¸Œy1rd~(lÒÌî‰oyWq ÇÇ¿'^¬œcB™xÎUašÃæ>øÕkÌîØÕº&l© Œá¤å³ƒˆ±Ê ¼èëø‰Ê6PÛ~®Î­–Óø(;áÑØ•‹] Ýí51$yÈb‘ËT©`hžì|X Åª/ðkõ‹7%Î{L¥¦³1=YGÓ¾pŸ‡ûh˜Y`O÷”ü÷ævEÌÀx+ÜÜgd *]Ž“@Xì—-°Wõ°“ñKM@pŠ”"Ïý&¢fš0n,žÐEÜé²WVï¼sýȣ텿RcO¶Í^$£ø‘è°•{µA+á…³eB:û{ÿ:jN®~ñÀüÈ`9a£œ‰mXCM8çý»ŒB! ?Øë xºª¶óD‚~Ò{ÕÃ%[ê%r Wa+±Rø É5lfQm„™¯áëÖ:ïòÔncl Â¥5ÆØØÖØ©[Ì1(«Á?w¤×ƒù•¿ˆ×‡Æ”´=EáCÿ ›kàGHñÓa=“¡¿KɸÚ5"σqŠç^R¨¤‰ŽþûÔõ…Ë"û\|¡³Ü¨–ì…Ò¥Jø“¦AÎ<ÂM#Û3 ÖX@uй¦êfº×»Ô9Bpå#ÅÁ(÷ø—Σ¾døCf,»Ã75(-É£²É-yOÀií=¬–4¢}ÛGBÏNqáÝ&“ùQ‚Ï"Qú˜h]ò¤¯Ñ"·’Çý…˜±\÷¼¸›C`”C´ØûÎËn”Ä3b륺žÎ«0âÌZþS¿:Eî¬~VUºb¯úܼ`î€ßÜÌvJÂÖ©à׸–XËOµ_"Ѿ6J@› jq”‹ŸtLë\WOðªÆYµ;.Þ $îæ‘œ÷ó\LA¾<´äÈtØM`g½ª›Œ/ö³óÐw)®ÛO¢ñþèhÁa6>DÖr&•dkn[»> `øÞaù@ÅÁ–‘nÇÃ5 º6ñsØ™„‚Ú"ZnM ½§ª…õ´1ßҤë#‚„.™rml½ÒÅ ²üþEÇ5Œnÿè[…>”øÐÁ©~nJ„ȶ´îM-ÕÅA-ÜÓ¤¾­ ¡˜õιù 'Éä’¾9ñ¨ …•ž<¸Mó^DUkp¼{kÁA¬m^:j ý)]¯ ÙW¼t©¸jÇÇjŽ7)#&ä¶È2\›é;°$ŒÔ«Ž žåÓT7ºmÇú¶kw5³³<âÄ>ø9NjBcîÇkµæ#‚#InHG†‘U ¿Öæ Ϭ7'„;(úýH á¾Rc€}âݯ+Ño·²Û ¯×SâÔÒ_];˜ªÀÄPP2‰á2ë<ÞH¤ŒXÍÍïÅ÷÷fS‹ýhÑ yòïÖ ži£þ”iȳdk}½‡ÒâÅ KAˆjVÃw+¿¾ô³±0ç†Q`ÂKMûô\0†½"¿H×MæÓ\`íÉañ·òiCuîµ\Ny§(×âñôÆeÌ‘ÖVÝÁM+ƒjô·˜n‰(¯\ãyý´ªÝC]®Èhô4!dˆxtÓåýL•©ÿ.²Ö endstream endobj 119 0 obj << /Type /FontDescriptor /FontName /VHLTYM+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/B/C/O/R/S/U/a/b/c/d/e/f/g/h/i/k/l/m/n/o/one/p/period/q/quotedblleft/quotedblright/r/s/t/three/two/u/v/w/y) /FontFile 118 0 R >> endobj 120 0 obj << /Length1 1514 /Length2 7684 /Length3 0 /Length 8687 /Filter /FlateDecode >> stream xÚWuTÔ]×¥Kº‘Ê¡‡n‘–’n`$†¡A¤¥‘PJBRº»Aº»[JiøÐ§Þçý¾?¾5kÍüÎ9ûœ{÷½{ÿÖ -.i+˜DæˆàâåæÈ>“Ñ×Vâåðððsóððá°°hCö*8,º¸ æ(öY8Œ¸ÏÉ÷Ðg0G€²«=€—À+$Æ+,ÆÃàãáý ƒ‹äÀnP+À3n€2Ìâ‚Ã" sò„Cml÷+ýõ`µdðŠŠ sþnH;@àPK°#àa q¸_ÑlЂYB!Ï`•°E œÄ@ wwwn°ƒ 7 n#ÉÆ p‡"lÏ!.¸Ä ð‹6@ ìù›7 @ÛêòGI fpÃ!€û„=Ôâèrßäêhî×h)©Ô Ž€Uÿpþ</7ïßãþìþ5êø»li sp;zBmÖP{@]A•áà€­~Áö.°û~°j¶¸üÞ<  ­ ßsü“¡‹%ê„pávÚÿb ú5æþ å­daG„ ίýÉAáËû“÷ý}ÅvŽ0wGïbk¨£•õ/*V®N G¨³+DIîOÔ} 矜 äááæ@œK[ЯE´= ¿‹¿Ó÷<|½`Në{*_¨5äþÇÛì à®_ïÿ,ü;ÂáåXA- ˆ ÔçŸé÷iˆõñ½ àP€Ͻy<¿>?™ÜëÌ æhïùü÷EƒT¤ u558þ&ýwYFæðæâpñ òxù„‚ßOúû þâÿ;«†þ¹¿ÿ˜¨äh ˆþAãþüþ¢âö§>Xÿ´àß+¨Áîu °þccAËû/Þÿ·~·ü_ø5åÿaƒÿÞ“‚«½ýoë_ÿ…;@í=ÿÄÜ+Ûqï’g°{¯8þ7Tò‡¹e`öVÿ]SB€ï½"íhs¯w.^n?òP¨ÄJа´ýCO]Çý öPGˆÌúë tßÅÃó_µ{ ZÚÝ¿e\î/íw rï°¯+ïh ³úeE>A!{âÜkà>xóÞ{Ö âñ[æ·# q߸gè °†Áq~]­ $ý+õG$Éü‰ @à"QÈòïè^å këÂ{º Ûÿ¨ÞBüòÝ£=‡ÿÚ¼¥+~ïóß:»göWüû¥x@,q¦'`–âA/Ê‚êÏK¤©Ý¹Öùð:ÃO±ôÖä©Ü65d%.Nø3#¦¤›Ç6".–ˆwùrïªìôÉyìL}ÞGˆ‘O—×£[[¬rú ?¾ÜuQuåÛPij24çw´²!ÿ^ý¼ÛýTj”‚Óùh}<^ùÌ¥¥%æÏŒûÉjÛÂ)ȸµ”Nè6u³ÿ;…¬ÂÞYµ‹ÑK$!ÙþêŠ>¼Ø}ž¬ª—tL’:1ø^³Ô‡EažÕõ4`^?Ž)$€ôˆSùüéùmÑØÖF7›G`Ôãv_ì”/§Óöï„_?Z# Ãa«HKE”#JùOúÇô4ëÉ…³˜eXÕÑXÄóŸ­Ýï 2˜GYá®øÞÅû/Èå1‚fX: Ò$T@í@jID8»Ú¥áWÄ{‰˜5R¥vE¤V´Hþ”M\fh¹‘õXmøÝK` G®¾ Z[¬Ÿ “ª==câ’2¬Ýö㲯ÇÊO¼8•2=b¢ ¾5ÙVÁ ÒöÆ8N¬xÐeµAà%™.Zj¼ôOlÛ–8Ûvþù„o'ÞH~ªn,©‰õ­6ÔWfÆ:ˆ<õ¥Š¤ê5If¸úI®œb­örCF5º²a¿öQ¤õ‘9,ÄMsv%JEi£St·lgD¿{Â÷AÿÉ¡þÞ·ö 0¤j†ä‚Øhê߆Ý5ËÄU%Õ¤3çÕ7×mµt°ÙûÎ7ûáoÔ£Èq4œµtŸíʹl6ŽÃβxð mtG‡Ùžæ=b=¦h€ÞqQ;. Úò›)qùæáùìÕ´?ZÎeãxýÒ¹¹-ô'v»®ú.)tp3^*9:Á¯ÙeD.› õ{׈biæ i*âªå“ð¼^Vx„W¹".ð€äæSGôÌ"#o»!²o­^äÙ <$žH#˜ÒÌEA·G^]ʰ^~ýé4ñ¤C¶©4)Wågs_Eföè×\ˆù®îó·œMòª®RC7ã) [ºÕ„m›PTÒùÁåÄC}׳)†¼LàùCÀÎFZ5DªJSh„Éë Ø^t\»1†@UC >Ré¥È)½ M¦vô]•C?°®*W¡Ã„Ççø t4É3 us—ùc*lÏèÇ,ùãM3ÒùGÜñg rMü Ucy íÆÕÄD¿â kÏÏ_v ™˜ä,´XVmÁè;‡Eóe~3dNñ¢YâÉ2„õ?†}×ÄN\Â-]ƒXïÆ…”üp4 nn‹õê%åXØ3çÕå¼*ëE#Æ»(gß½‚üé[»ïIvÑ7Ã-F2ÐÒ‰¢#.‰°˜T?>Œ×†¼|üy›“†!-.„mrýcúÁfy¾v sÀÝÐÔà!²üî;¡`äôJ9¾/$öˆJ|؇ùX¥„öõn‹È7³ m¢7=ýÅãOý™¿uª`8Ï´¤ä1uíãºCT8DÒŠ™±gè ~ò©åºç(Ïú÷vŒ?¯V-K*C¶žkŠ[5Òʉ`÷ÞD=oëµ7Ŭé1glUi[¿í'²Üàœ?6úÉ—+©iç}Ñ£,ýdlMÔ1…¶{ãqÖQ¨aÔd…†²­|ÂiSFãtºpÕòÃ}…§ùd»Y€:ΔÔÄŒýz$Ö$‚¹'YtÏk¿¹ƒÒ•‹j`ŒÉ,;¬³X”ò²AS‚^ðt»+£^»‹¡sW´ÕßÒ‘Yg.Y˜}ðU2Æ£*aÊÜ©«ÙQ‰êÒIyF“/ΆÈdØÈ9$*joÅòžÝ•¼ Õñ·£™¦R.4ÏÇ¥Û?L¶—IŒªn»tÒeÎ9eëQ®.ä €°Ä¾´c¨ñ.hà¢swZKF…÷þpÏ?Èj»^1Iú>Îæ°VÔÚ¶i.ç9À ¬vßnBݬWØnòRó¯¶o57]ÄV¥j1Ï_ÜSW<ŒÍ"ká?ÏSDìú[Ø‚tí Ðè+P73®Æ|)Å(F, ‘¾Fठ"z=ââg¾ j!J:쟋Hı±‹ÆÓÝalO—‡yÎÎc_ƒ½a1Yº—R ]?è€qa×ÂKo]¸ãCU»·ÛŽêÛš04U:þ¡›Ù­ñö©X$ê!涉¥YÄT<Íf†" ëYröÈþêHPÉ·¬šO¢ôsƒîœžÐàƒÐXÚ¤è6ûž>ï-MYÔl§^f#mÛùŠ,ÿ¯G'l4Ïg›Xgb‘t×Ýrù¬©÷‚ÇM¸m$¸ã…–j3ØÐÔdús‡Ÿë0ÞZl|êáŒ/iA'\ˆ‰Óq¯_¿ikb0‰èÚ·êÐmjp¤x¡áÐöªIÿƒÍÛÏXúño5›>3ÌHz0'S§e03ÃK%«tÚ?»×Àf³¬@ÚpQ"m¼<‡K²¤‹(w–¬¹NÈù {¥|>šeˆ‰sþf¸RB{Zîõºw!GÞ«#ü¹ýúÓ†Ò½³g}¦o9³òƒž_Å[?æ¢Û"=%Z‚/וŒz˜À\*å뜵ó¨âä"*Û9æÖÌè~:¢FüÊ`%6•RÀüFã÷¶kõpç`|2Ž–¬Ø4ŠÈFÀî^µ¦tßK™Ä]™S~£j(T!iÖócýLr‰©ep3–üËlb ’¸è(ÈjÂó!Ú\§ìèNr¢ó–@/C “ÝGóÂÃîé¨ôVÒ;[Cå§B¶ï$0]ꧪܹ>NMc¬ü‡—Þ”KÚçqK[4ª²q‹ÚìîG‹Üަ»±êÓ^pž… :q˜;µI¤ÊR=ùÅšõ;ßOšOóeQ*…cøÞœ½qC²*{æïröôýýÿ(úû 4 >iíâz܈òü‘ ‡ïÚO#2Ýø×kÛKêâUñŸðU?K´ö=Þ5áqcU£»7Œ‚çÔ'~Âê •ñqCë¶ðÈö!±…ÂQSCmŸ>D¯üˆ9”iX9Ò:i½ñ²³¢È ºÁ¿²*”L'©F½Óð©Þ]Ÿæ•~%=4ÂÔžõFÖÛ–›v4€‚µšL£TQê‘mû"ŒÛL0$†bÃb:wüŽ}xªz7·6ÃOÄe2uòŽÝƒ ó ­Bóni)ãuå8*ÃQéõÄoõ佃 p·Íg2—‹¥Ðhº˜ÆØP2镟{;æPà¢jN/µPØëÓ‚TTñk²^-~ׇMÝ™F›û?Vjœ§H‹íöØôçlö—ÃxÌóÔ•7d©¡xÃ?…Oñ·|ݱ²>ܶØ_ ½šA{²8ûîM‡‹wÆó PZh!ñúL3P…5`³½žwS^¨¯/U:ÏØýb$]JDuÓ”€}&Q5V³ì«˜BŸeÁö¨^$2=W¾}êË`‹~åÕ:l™^r@èjHJïK7øü×ë§ënÉŠ$aÄRéœjÜ/´‘™—ßÊ –¥'Ql½—¨QƼכÛcÀŒTÈöœÔ‡tÉ.ðìÇ`Mgþ®ü±[B;ß®0Qh'Ó—ç3Ó|ýlŠß¬.¹»ë©ž bæŠâÿˆÑ,£Í”Á¥4ŒÑ·(:ü^Z[Àf£ÜóÐPp);É ÞÔÝXˆe»LÖëuEû­¾õ´]eïEéFQâÄ•®×MÛÅsþ<¥ ï’’ p¾2†”¡Éè· “_éQãœ?/^Õ¨)©)5–o7âä=e¥tÒ•ÄØV&-~Ðûò““ÎgÔ*šTÓåÅê2'¼¥Çw¨ÑµWçã΂w*F/—‹¤bµÇ ±w¸Q‰ªãk+Ì’}êj½‰£‘mT™»^¿½‘Ó™+ÉÔ®Wëô¹Tqý]•KQc<ßœNØ´“7qÔêX„¡òÒF€×—¸ Òù/*ï“Ü`¿ÉÐɾÆ^ùu©:ìƒOcåPV®ä †]â9ØúómiÁÕqišu*þò "PÙå‡Z9NÞé ‹4*’Ú, ç¶/ep†e:µã1§CQ°)dû“ëö}Í=E¨×îÂiÒ©‘7åO<1U¾rç<5y¼!bqy‘k .yjßžSI3¦úª‘Õ“K’Ñí,NýÑ‹¿*l>ƒ•¬ñæZ<_x(µÕœ—¿}'X6q½p„l»©d••ºwáP2cÕ9õIÝÄ­ÑJ]-yàlo¶p‡Áw4Xã)µ²˜rx2¹D,/%ˆ*¨}e÷øü¥1Å&Gkiö§Ñ)Be‹ªÓÓL>çò“íä¡Y~íäüÖ‡€¥"\sÅÆª&x$ë¸>“ûÀÑÇ—Mí±Þçl Dúç¹wt欗Q Fj­åÇGj?ÎkPã·ÉÅÂ=ɞ˚M‡à •H-?]ü’wÅëIGt L±cÊàíÚÍÄØÒ¥äÐÕÉeÉqfUñ«R-0Óß|1Ù ²–¤„(Og× D¼7Èq>[R m.XÏ_Þ ²Ÿ™tz/ò¨6#6_=‹(^šmK7pé$îÄÀ@Ó—]<Ò©þUBрј@¥û©~òŽ.í2˱›Í%=þ.¡¶­³4#ð'KiËŠ<ì V<€«ÙYRà˜Å÷5ŠO±¾»¢ë ‹$ñ¢÷ǧ‚9ã¦l´Û¤‹†ü<3áH– <Ö›~¦_‘›.}t•¦ ^¦xïØ¨á–~©Ìsk!îzžœ©õ.:§brSB‹Úàíê£Ý·WUyö_]‹$t©Þ§Q‘¥#ÜÅK“ôî3#Õ9¯‘Qw»3¼|EÿS VtÛ±3þlŠf‹ÁŽéü•þ×]²þO†3’±% ÊÈ”Ü'w²¾D$ÕY­la ˆÑÆMSBs´yÖÇœ•ÍfÃØ#2h—‚“½Í/sƒj»¸>b?áýÒBÒ-syÖŽsj’¹óè}{ÝNJrQ2ű?_æÁJÝWvÜ.ŽȈ®¯çLf󎙂SïOº&X‚ÙZTÒu÷‹î]M‚5]ÎFõ²Í’ÝËö•²l@¤8¯Á‹°Ôv·Q„\û%8*À'ÕF¨çu=æJÆiê³*`¹È‹í–‡ËÈ!¬g“¢&¼›_t4|M¥ê ꣖ îT}$ʧ¹Ò;ro…7&¶)v/(„W_%ºT¾ˆ­Ò<>ÿ EÁ^Š‚á[U=™VcÃDÈAú8/ÚØÓo *s± û¶ «nUŠØ*i9·|ÓLÏþ¤„XÈbä§Ôt"+È;ý™Fâåɯ[í‘~Ä ¢a`&[if²ƒ¡¥ë§<&¹zr»·ÈÆK[þÉ0ŠDŽÄä07ì¿ú§y×¼®vë¢&ù,üñ³!™óv_哲}™V’>&oJ/oíSjmYÁGõG<5W§Xâ®ÍH‡Ù°[´Úƒ‡~¹hbŒR×ßrdUÈE?[–/¼¼"©íá -³²(ÕÈ´y<O¾À˜ ß’ð±ôwvÌ»ÉN-Ζ6¡a®³q'q¹TÓˆ¢¼Ü& ÑßÐ K½ä÷¿ÅXÏ;ªg6U<ô¾á×c—=¾¹.§P‘1òs'q  $sV;ß÷—ãÙùf‰Êdz8PFÌç IFq_S«W1ÔvyòɃm%kñÔ£½œZ© ¸™Òž8¼3òPL­| sÓrݼ5ñ <"~Iš’,Ÿõ=AaÈnÅ¢»hšeé”9™?p´¥Q–ª` 1Ìž£¤Û$«Á{bFi =¾H EÞ4ªîħD)^·*2£¶ùÌ{3þmgÇÕ¯ á‰7اàšc½/’/ån EoÕôO‰á«·«#:yÃôV÷pÑuŠZ_ûDiصŒjð¾¥_g‘Ê,æAêê0Ù觸ÏÉåõ4Ñ,«Ë¥‹¸Ìµ¾«AìŒ3˜x”ô=xïtn|¬)'Vè@`»½AÉjŸòbvªÁ‹Ç´1G50ܧá4[vÑc˜.•¾Ô¾†ÖÖSØ'&r Bóyyo=2æ«ÉŸØ6?-gRâ‚à/­ÕÒq—äLKs.f£’æNE·¯Hp\Ü=îl £+Ùen ô׫Ÿ†e+j¯JÎ ™ºšù&ÌÕô²yröGi“b&g1«{ìy¤b8lÔ@ôÏ1‡Í£È¼ ¶#MªrÝ`1‘rр餹?vÄ€ W±^)D¼ùüÖ•=A‡t.¿Ö5'p¤¢y깂?Ç÷°ðº4R;þÿrÚù€h¯VxkŠ£hÊ7~$}yT-3bjõ}Qˆu@˯ð}ºM }¿4è¢ÑÌpýSZ´ðûìÞ¦£²l©Ô…nVXöç4nîì0s‘PgIÉ´Þ̶Òô,àÜE³7?Ou Ð׫…èpsffƒJGÊ=4J)åU“ö]ähÈO¿¿ˆ–\±77¬{æ4ªÄàýr)¿ð khT®f§¶ž­¢6w7‹-7õvVx‡˜Î–§ š ô ÛûmM“m´1>ç±/n/—ƒ)ûlŠ!çö0:jEÙ€39;f'6¶±™}#£î˜Éö«ôÞl#ÿL憦âOp¥~Ëv‰ùÓBêÎÀÉ?·¥8ðb†Dž a‡+“©¿{°¥'ß\1ƒ¬ûDl¬§Ã(nˆ«µª1ÜXôT•ñE_ŸÏ!p5×Ûˆ*Y×ËcNħb°å,Š–)ÔöÊVY— ÝåîâÉSaÜúêQ¨I‘ÙŽ ˆV§ÑN<Ï\¦e)q¸¶Ø¦ltÕÌÀõH­û«£ÜÇÐN£ù¦xÅ-WŠÒVïe_ý¤õ²×ã¤÷K^Š)×H${×›1È'Ã0ØÅgµ­Àh ´cšà–²›<¡î—wU·NJ­ êºÊ¦6‰a ‡Ú¿A¤âõ¼|Ëy\"Ë”ò‘¾§Téln8ÝWç1üX†¬šÃ\—=i–ÐO°îj<@«=@B©‘äÊèa«Ø ai™J‘ë'é.ÿ¤‰†ðÈyàl-Ê®IÕlâìnMlvñRÓ5ï[Æëm‹À-Eߎ_‰÷ìR¦àsxiçXñ|_mõÃfĘ™¹¥qYÐô ÒAŸ‹íiz&ދɾžl³R½>e:öøû¯N<ÊѤßéŸ<9¤FyêÆ1ñ˜c”ozP‹6D<¿ס …Mq‡µ.ëac ƒ“>Õµ=~ºGJÖ‰Ö™}ô³C§G€¡Â¡êruAâŠÈÑOû:©äÂe{ÓÑÆ4Œ lPÕµàl¯iȾð5¯¾Ñ~mìrõÂäXóy“0C|¤d Ÿï\ õ·Š¸zCq—žÑÏèÚK¾øÚ/RÝd¢©õH úpÕstèþ<˜@H+IMÈŒ ßfs²dÊšœÕ=ÜV­g½«Ò2],Ü즃µzu„÷›ѱ*cˆƒ7û­‘¿­¿£¦·‰T·ÖR9_b ÷Û³©9ßTUN¶ÕÁÛÿyüÊÓkQ®ÜLirôÑi*RiqŠö7ÞiìœÂà8gqk÷V ¼Óʛ鶔ƒXîºð•Œ6.Eã Ô€½õr‹‡é ]±ÏÝûb{wbi0½h﵇ž7;>s5uÃÔÙX”´ Yhƒ½¸ˆzò$EÄ6gF÷á ­w˜¨ £¤V—£«Léâú¦¢`ÄÒ?º1dŒ¾C¿L²±eÈ[Zb³ƒœÂ7¼+Q—ƒÏø¤å+â9Õô!œóŸD­MÐY>‡ T\<ççܹÓÏB¸µõØï©Šsf?\†¥*ª{«€ï£H脉Å" bžƒÜË ôý¦Luñl¾"øAguoIi®™½ÆlÕ¸hP Ö˜ú¹GdN¡’_œãíT‰>sfDøMs[äÓ/Ú>S½ÿã Õ™ endstream endobj 121 0 obj << /Type /FontDescriptor /FontName /KAZVQP+CMBXTI10 /Flags 4 /FontBBox [-29 -250 1274 754] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle -14 /StemV 107 /XHeight 444 /CharSet (/A/B/a/c/ff/h/t/y) /FontFile 120 0 R >> endobj 122 0 obj << /Length1 1431 /Length2 6289 /Length3 0 /Length 7254 /Filter /FlateDecode >> stream xÚwTÓ}Û?R*!"ÍT@B`£¤»S$Ç0bÛ$FH7Hw)©t‡”’¢¤Ò !¡€t ïôö~žç~þÿsÞ÷ìœíwõõù^Ÿë{~c¿óHŸWÎaUFÀ1¼ > 8@AKK ‚|@ ;» ã ý[OÆnE¡a¸øx(  ` N§Æàµp€úgH=@ ØßŽ”8@ì³hñÔp(šŒ]ôDÁì0¸:?8!\˜ØÃ¿Ãr.P †´À¨ ®"ì ÐG@`PŒç?RpJ:`0Hq~~www>° š²—æzp‡azP4åµü‚ л@ÿ@ã#c8ÀÐôvw0 À)œa( y·…¢¸ê}5M€ ÿËYó/‡€?‡ñþ•îOô¯D0øï`0‚pA‚áž0¸=Àæ è(kòa<0`¸í/G°3‹»aÎ`œÃïÖÁe9]‡ð>4CbÐ|h˜ó/Œü¿ÒàŽY n«€pqÂ1h²_ý)ÂPPîÜ=ùÿ × Žp‡{ý-ÙÁà¶v¿`Ø>AòÂa®O jŠ|p*²ëì¡€0Pô¡ ¨0ê €z@ø0ðDBA¿Ô8 >^H`‡ƒõÙAq?d^h°€A=úxý§áŸ°…A0¨= Nöïì85Ôî/7Ì`ÄÑþúüëÉÇ0[ÜÙóßî¿G̯¬,§­`Âóò¿Œòò€¯ €W@…Dq>ÿÌó¯øýoí#0ìOwÿ‘Q n‡ü*ñ îøþFâö‡œö† ðÏÚ¡¡Îóß( „à¾@ÿç-øòÿ#ÿ¯,ÿ+ÿÿ»#å'Îοíœ9ü?v° ÌÙóŽÐO0¸åÐBàVþß®ÆÐ¿6Z j {âòßV5 ·$rp{ÑyAB|@¡¿ô0´2Ìjû†8üE¦¿§«á ƒC!а_. ü/n÷ N¸Ë›Ù_&0·ˆ˜ßãý%Cq«öÏ>”à„í¯€Q(°'Ž8IàÂ-¯-Ôã7çü|pÀaöØ!Pd¿ ø=~éþˆ ¿çoñe OP(\¿ùëáoù÷=…z@!d“ˆDcuPËq¥£;ïÊ$Ñv걉ïP¾% ¦[iÄj1^?+sJã•òdHÙÒ±][Þõ8{îÓž×r k­§Ð!/«òš=«MìÄåᕱ¯#¦»xÏ“åYÄ‹PÝx˜#);Helí»õÙ)¼ïWw~Npç )V~¨Ü¢ÝÖQYœ©IË$fô틦ɦÏ`ExŸî~ΗgKQæá)Úéw5$ÛNÈâÝ+(zûûf¨º˜ßDú«»¬ì°…`¨”$ú˜…®Vͼ¸qžSä¶™Níe£rSvÓ¶»dž+ù¸Z{×aywÓâgbÇCëD»(Ð7ì 3r†F>•›·a;ÊJÐÐ+p„6êLƒ©¾+ûÂ줬á95Ö9¼pþD#EÍìCOç­x©‹Òåo>uì­Ñnv!øÍ÷+“©–•xh3¹6|ì_ô°9gÍr ˜‰¦:´HΈ5û™P ^wƒ¥–Þà¯ûÚ{µÀôÐ +tñb¯­Mžcʵ"M…]¨™ñNÏ~º âW I«ŠRÀº»,zWx,Zhöº |ʰ-.Âß>QÅD!ĬÙ/7Ú#‚¢éøšÃï–M/u…°”âÇÚâkç–œîûÓ¾ïA´à ’¹ûGnbn⧴ɵX¢WnI´Û‹ô¾è&Ç—ž|pùCº9EÇO]ÈE8øSO°~¢‰›¦Ï«çmó2µÕb0ìÉÊ­ÄeY Þ›Óœ1×htû×ãŸEµÈ-ì7åDrV1Ž}¿ÖR,åOÂ'öòkææ¾ =#Ã^¦Ô V³6+ÖK›K„Õ­y&£üùÓž€«õ»ÆwY¿Óã/×ge¼]ï®#+£u⸂óÙ·mv›Ü£´_—ªJ(úìLgÅu›&Ýhù^[r|\h_|ƒ¸dÓÖ”©þ ìmÝæ]dó”ë»ià6ÄŒ蘸Sm‚÷ÐóØžìfª½~Cð ¢§>ÔÈ Þ‘ » KølЬ›ÑYk´¾·×Û[hg¶Š†ÊVÔpãc½“ã’Œa| bƒ\1½iò!ú1óhÁÏž9å>°Œ²‰OßÁ4‘€É‚…¬ä‰—6nQÏœõ ‚¶y†§¨F¯P|3®«èG"2Ï2K Ú<¤ûí>©Öœš±Z(¾qL×ë‹ðåç9#_^¦Ý¤§RÎ:‹.cMfâ‘Õû9YªwŒŽfümëïÔûIØ ½È3( ˜°têFs¢ñŒ{fB‚ûáÖU“¨ jìu'Àí|ÝÑy÷ni°kÈ (Zí´iHƒ’#Xúqü(N*lî©^rÇQã>¬çÂyKÚ=~ÎdCò‹ªite¡‡uëM¿ee^¶Œ»64w8ë°NŠºz6‰šÞëŽù]YNäËÚô‡Be£ÄB'iûó53—ŽrÜÖö#¡º¯ªªI9 ¿J øWê^7d R@Ú¬½—•8îTÀƒ®s(›qF’½8>‰=)”¢‹FáE|Omi¶Ú/¾J5b§Cb<÷©8§øÉ pö(.Ú‰?¾œ£BøàÚ»‘⓺ñϤþU¼óš¦F_Ù|2É6>t¤•Vsªö«¾cÒÝ¡ÛVü¼7Î0¥ò0c  ê|j ÊÔ¹ðÌè‚öô\ž£ƒåg2#Á‚¬CÞ¬€ ‹´åUFl“ÿ¬v9GC¢Ê¸!H¶.„_ _¢wXíÊÆel"[a›Ÿág~ |çOv"® ¹Ì¤ždÕî>Uªªü5Üì§Ó6IN ç¦UžõŽå[)yÕú­©æžu\ðÛ2ÍÙFkêõô,'Ä<¬}ŒNàà\3ZìÌ ]j•uÊ';5îY3;z)|-jZÁQ.ö–/Ë)\_•×ëpµ›ó>¾EÏ’½©ÞI¦ÊÅ„Ò=Œ­cÖ>Ì{j@g£éÃ/=$ìDýîHJ×ý…ÎÅCZáó°{ŒâIŸ¼0´¢Õ|$W×Û[[¡|U_ëp¶=~}J:éUχ£°•k+?¹?9Þ3îÌRÜ]‹dÛõÞ;Ӡ1ß?ÑxÁ°>¥™ aõ”ÌV7Y]­¾9¹Ó´ó3­‹žëÚÍ£æz!DøÛ{…EÙÈD·0e¯‡¦âûv¹Ôˆú§?»µ ™?ê‘4#¿gÚõx¬ (r& Âs«§&2§a3ѯ> ¿ŒB_ïœl‰ürʇš#©$`ÙS2{ÉKPú³áÛÁµÀblkòÊ3T9ÅÆÂ[ü+rM|þˆØ¯âò´€‰¹O~*ŒÙ#C '"@ ´µ?Yü~’wzsg­PÎ|çúŽ|õO^*§–×MÙ=ÉN‹ûg¯5XÊ]"geç¬òåî¯~êxÜ<ÚAMò€MJê2¦hFPÝôØ)ß ''6™Iû)ê"‡<øšIhÛ¦-qw9Í—Žx8¾¸ 9ßr˜r«‘^A¥ð†_‚öǜʘ®yo €ÆÕ-ʹù£±^këå6Gq~rüÛxkžù]^²sŸŠ0šÞ«—_]L˜Š“ìßXyņ$p,óëèYwïÄóÀŠç`åùê¯Æ²ÎÇ­†Ý;è5Óæ,Ç`Ÿdæo1ª W·ûOXÒøÉW¯ûI½`Ю¥ki¥’Ï+Û6>üô~Ëç•© u>Æä…qÑN=U IåÙzÏÔÈ4ù¸ñÉàøA .¢¨eSz¯¬í‚Ç5{._¨3¯·Ëpf²{8Ýù©&î'¶þÕjˆ÷µ“¯æ°ì×ï¥o¯¨HuY–8|ÞàrªÈh‚‘ŠÚŒÆË¢-o{¨\òÅ…PlÒé…¤?ŽÜr¬XR¦1˜iùxýx;Aoºòm—X›—ÿÙÜÅâBTñ¬>% \'ô{£´j³ù@¡Üu¯“#ä§ÉÍMµ¼Œž±TBT«ùtýÛ€w—_Îô k·øÅf”ím¤Ì·cå™vã C·ˆ«^N4"CÆöœˆ_õÉå²RrNZh-Ó¢¢ ¥¤9œ‰µô/×IªržýðÑSŠi¿Ø+¬åOe»€|Ÿ8éG ŸµÊíà;¡ÐäÁ­aÖDêï.œ"[šU”Æ8Ödnòn.”3Z'e-ÉŠEÞIE˜Ëj&€ R,ô0äß(°í÷¸ßJ„ð* 3¬' ^Ø|™m^®hh?oHl“.ù¦áá*ØY°ðÎ SÄ\–±ûÑ{Øø{0oPjU)N¶¢9‘o[ÀrUS žÃɬ*] ]›z48[3&Qqô¹÷Óó ãÌuÞuZ‹rCX´5ÚÆ'6;jòg'ºQ–Æ*ÝŸ’½¤ÖD¡¯ô¶$Åy+rÎÁ\ÅÚæÊ!˜E4?½sn·ÏÒPðf…kzíØÁöÒžÑÝ’K·öÈÆÇ *¼h™ÔœÓ™9æÑ†Ua¾b´x›E/£„ª@ypkµŒs{m5„†zùïQÁÑþ(IÞô/󙟿7ÎF2$)aæ§ÓÿŠ×<ñúp""c(÷fг÷=Kß DUة‘C-ï6{´~ˆ&¾eƒèûm2 ßyŸÝ LŠø2%|'¹ÞwY‘tôž¨Äµ§Ïwk/÷ЄÌ9–•Rö ;/âjýgeNÖ6?a¯JD[Y$´ |qýT*Âù1çä{k" /ªØÇ4¥ž¼c§8‘—c;¸ú£w“Ž-ƒ»A$îà´ÏEqp'”Z*±6pÃoĸ›¯ØÖ÷H娔º8DŠ—?' Z®/ˆö€UF½r½7ØXQ’XF9üjŸ¯}ÅÝÓb~ÂúAnº{ƒæ•õ#_ýKV)ÙK¥“U ÆŒ Žž½ð<”9›)›Ù§(~ ¤`ÞæSÃ祮DuÜøÖ¹(ÀË#9ò²CÑžÞnD,7}éäºRÁ¡³S‘,\—goPB/. ž.àù!¤‚6h²Þ‡åõšÆúg #ƒÀ{%¢ ‹QÙIH%ñ6÷þ¬ìaZ%5yBNgi§”ÚÁzx‘z¯õλD.=í¹øõX‚.Ráa¾)‡â{$ÍŠªô9“À>|Hï›&Zõ‚kK!Ûþ⮄´=}ž³µÊ’¦—9ƒÏ};½wKæIǨnîð£Ú²VlËuÙl´ôæÕž-;—²;c÷é`_ô×ÅG ÚBæõ³»«2J÷~èÁGŽ’în,:Ý›ÍÙ—ÕÏ=õV'çºÜW5'd$¦ñy8âf(£(Éå7¼m‘Ÿñ3+éõN|é—¹u•½ToˆðÒ ØÖÔ´=#ñÒEi…øµ˜½+ÚïåHY‹0ôáÅa®ßuêg½X#–´9IÊÌiºB¶”CÆÃ"!u=ƒPeúéS¬(åC}’#¤š-Üé`ù½ìI]aj$XË/ìmòmš{ýÕPï³Ô}›Š/,iä×0š¡¢ÃUÀ”þ0ï£m:,\ó®W(•“0¤É:9øyRÕÍÝD‘S×?Z­vK]&PþäI©Ñ[ ‘ó¤{nN¾èiIñ@ÊÃ*êM‰!ÑëgóÏEtHBå§–De‚e‚¾®(½ŽÆ‹c2‹Ù÷TLœl¿êb\hu/Þ&|™ìíÎE¥f½@QÖ ƒ½Á=èV^>õ,ä]Á>9YŽUOÙÖï´_Fø‰‰ƒñ;’ü‡Ï0à ääI{<ƒ´Üë·U?XëJîÓÜÐ:~MWj¦Æ…SlMЧɪ1U¶NÆÈ‡+®žz#’½,‹äRû¼™na„ç*h|*M›¶°´±ýм\0ü.F󜥚éÉKÆö‘/¯\ †¤ø«(Ú9@Ê>J?ZŸÏé³3qh5zFç™*ä'’Úœ,5FóʹßÒÈ#;j0•Åe’æ)‰,3;£B%‰….޵ú­, ÂÒ|狀U0ŸÉèz’9.ÌÎ_L|ú†<Õ›·¢II´_k@H•³…õí£¢ÂϼdÔªj>¢}Cª‘„›cÐßàa‰¨ïÓÐØ{©# =íÎIoEYoÕ³Vw·6:¨Ÿ5¾ÉezÁé}i³ÂM+å‰b|IRw¶+kߣ%šÝñJ{A#‰GÏY¹YŸ)Óî¦ðwNלP=Å"„û fJjlK (•ž&œõstÒ|&î)Ê?~ªÙÄ'¬å_šÒ·V¸†ðÐjžO[$iS@ŽDbªæF*1Æ:Ö!L#;B|:lñ_©~Ä›4Òç–Ø‹j¨ÐXmkîøO ö±…Æ;ƒ0ñ^bãž]š–öó B÷¯/Ñ®¡¥m"¨©]ÍqcÓˆ®–´8À’ý«ü:M[é¨ðP|«×eÏÇÍ·ôµÅEŸçÑÞ·'\/œ'1”™ãZÓ³a>›BD5ø¥®IGˆ\_êêõåJ%Õ‰'+yÙkâ.üžÿîÀ¢·SZ1'”žŸnN½¤M…¼q!¥÷àM6PëqÏ9l°ÎÞµ»r…W/—Sº€{è”t¤ø[Ÿ€p˜CËÚv³·Ÿð“7ÖºòŽ&¸¬¼LÑÕí­_ç<¿z$” L—TcY8@£5_c&Vá¶–y¯§¬U|}¡Óïb|Ð~)fÙa75'¸ÀkîQØ–æ7Å}×èÚ¤6Ó$ólt%­•ï¨g딽OÖ/²~Çxsl(öTéV}ZÓ¶Èñƒ35ƒ7l¡ÑCž“¡[ WT“‘°¦ÕK#ˆC¶3ÇôüsåÎYñ¦·”:ùël÷ú"Hî(ŠãERá³sá_¥Ó-ehy$üìë½k¥™r*ÃôÖ–šûT¶5ànªUù§[öå`aª@h\çå-«-)­T‡!>F=+þ«Ú÷ÔŠ˜ÊIÓjªætLí {à(wÙݳ§³š1åMÏ‘? (‰Ö¼ÞWC³Lu·1cî­r >Ãzf‰0ß^-_-§4f*G"­’ÆAß’ø¨žE{?·Ï“¬Î³+£HÉp2 X¦d¢w¿ /h="Bí¶°µ~ºˆ©|×%lÃð*ô ;×Õ³øóž­´ÎXO»ƒîÇÛãÃ!!Þ2ê“Ç"r ö÷%ïE½Ö§)|²©Þ«Ð%PßW¹kºM³A˜5ùlÅåŠA.y¯ÂùìaÔÞ¨YÇE}Œ¾ÐÄ2+È­mgs,½kv´Ê»·×=vꂎÑýN(®û–%—ˆhÁR/VG7ˆušg¨¨ãׇ«‘Øqñ¨˜Ï&ƒ£Zßtʘ¿O~y>.xhƒo(ÔÊ›ÑÐÃRrÉS–ßAX…g|(±h0Õ9#;ïçå­·>Á8Ä™+«îÏf¶jšÊ}öš?´ ÖJ> endobj 124 0 obj << /Length1 2394 /Length2 20151 /Length3 0 /Length 21546 /Filter /FlateDecode >> stream xÚŒ÷PèÖŠâÁƒ[Æ!¸www‡ÆÝÝ-w'¸»·àîî®ÁávfΙÌùß«º·¨ ½¶¯-_rbe:A;# ˜­3=#@XV‰‰ÀÈÈBÏÈÈ ON®bál üž\ èèdagËõ/aG ¡3H&bè ²“µ³H¹X˜XLì\LŸ¸ÌŒŒœÿ5´s䈺Z˜déRv¶@'xra;{G 3sgPšÿ~PS˜89?Ñþå´:ZÚd Í6 ŒÆ†Öe;c  ³Çÿ„ â1wv¶çb`pss£7´q¢·s4㣦¸Y8›”€N@GW  à7a€œ¡ ðofôðäs §¿åÊv¦În†Ž@H`ma ´uy¸Øš äeI€¼=Ðöoc™¿ hÿé €‰žéŸpÿñþÈÂö/gCcc;{C[ [3€©…5 /&CïìîL 0´5ùmhhídò7t5´°64üU¹!@LP`"øzNÆŽöÎNôNÖ¿)2ü겨­‰° ÐÖÙ þw}"Ž@cPÛ=þž¬•­›­×€©…­‰éo&.ö ª¶.@I‘ÿ˜€Dðdf@g##ã'NÐt76gø^ÅÃø—’é·ÄÀÇËÞÎ` "ô±0‚~Á{9ºÎŽ.@¯+þÁ31L,ŒF@3 [ø?ÑAb éß4|G w€6#h÷˜Œ¿þù¤ Z/;[k?æÍ—AFFA\YŠæoÆÿè„„ìÜ^t¬Œ:f6FÓï%ûúàó¿aþiÀÉÿ%U0´øOqÿŠ(ikjàü›¨yÿåáúŸµ úÏÉPþ7ƒœh—ª?«¯ÃÈÆh ú‡éÿóüåòÿoïGù[ýÿ[˜‹µõ_jª¿ôÿ?jC kÿ€VÙÅt²v ã°ý¿¦êÀ¿OYhbábóµ’Ά ó´5³þ§Nbî@ gcó¿wè¿S…·¶°*Ø9Yü~lt ýèàŒ­@ŠhV©€ {úß”¢¶Æv&¿™`èèhè=±¼˜@jtÿkµ ô¶vÎ ˆžÀÔÎþ÷DÙÙ ‚¿E#vƒÐô À üqDþ Nƒè?è#€Aìb0ˆÿẢ?ˆÀ ùòÉüA |²(ŸÜÊ'ÿâåSøƒ@”þ På?ˆÀ ò2¨ÿƒ8AÈðå3úƒ@ùŒÿAl ±5hHÿ•°²þ–ØØüñÿ==“AP€ 3¨,Ðô Ìÿôð·…ƒ hçÿ8¨˜þ ÓÁßJ‹?E±ü†®ÿÊñ[ð'Ûos;ÇE˜ý ‚8ü©†´ æöæ@ÛY€dÿ‚ qYþ ‚úgõ/jÒ¿©€:hó/* îü‰Ìrµ-ø¿ô ®vŠ9ÛýDÆþÌômfk 4uþ#eúôï7ç1¨j{ÐKc÷¯áün•Ã?”ÍÁÅtõÿãÈÄjпÚÇê†Ó '' ÅÿîÈÅ ôžÿ“DÔÉúßSgbÕó' èIdp6wþá :ug7»9€b¸ü ‚úìú/ªÃí_;òvÿ…÷øS ÈÕèøwìÿyGŒ]Asþ륭éñ_ßæ@ ;Ð~qÎΘ;ز&¸í¾JðƒÝîï4ù®z25×¢c»Ë#ò»êÊôÀuÇ_‚ CÝ(+Û¢T·KD/^ÇÍuïÂZâ[Ÿ¼Ÿõc•&w[á&°úÇókûàðéTö¼_¼Õ¬ ›ÁH‘g;¸p +ä¢ß»õŠ»×ö•,„Îí*îU²K#<—LÑE©~Ñ ø>Cžc”1‹CãLGûíÂýýÌí¯i´¬ñ7"©XxŸ“(–/­ 毳ž«e*ÌN¸d¸Z8·h#“^B‰RØó^E+ý îÍ<DYH´I+t(ôÌi•J‘¶=Õ®#‹L;Ù €`Êýè;qÕÅúŽ$ò˜•­ú‘èÎÕ,V@‚ƒS¡Õ¶_j]¦–IøKœSµo€$Mócÿ¦.¯§:‡Õ¡á~º»Ð¤–û¡Æáí.õïü}üøfnLE͵#V–¹Ò’ KœG!:Õ’(´K® ÏІ!<^—BxL[ùŒŒZÐ=à#øglÙÞ—_}Êë/ä:6fPç­ÝÐtƒÞ‚ØåÞŒ~$]\äãš³ˆ¤‡R変v}ÎY‹¦Tä®ÖÏ•0\l”cÑ‹{É|Ûb[¸ +`•ïÙ¯ŠÐ ô°|àÌ£?S+WmaËS$Þ9‰¤=¨ éåüer°õ«´THóÐNíá¢Ü-\hèë¦Ê§àœÏJþYNò)â‚‘…wÛ³=pF¤§*B®Ä6ÑïÕUx·G; ŸÝhK$EÈ) eû¤y¼uD zp«ü°>ß6ú3×´ËßS!¦£¬~%Oß[†$ÕojT»|Åú ¬rŸKê¹Ö3?5ºMüsr›Ì˺\ç;ko€›íK ¤u,ñü¶êõ:/Õ—ˆWÓˆ¦5U7Áº%üê´™~àúÉà”é»vF ¾± @~1eúšL ÆÛ\\¦å–g†À#Qto…“NÍÆ-OH)¯N§&8Ùº¸êÜÄÞ3{BÖ”»xŽ¢í@é‡ÔÜ‹Jò¹øLâùIxf0ìjíÌTÔ›í?jâ/¦!°Æ¨‘°`Û<³”ƒ5щ—Jè ,¢9ÄÁt\Õ¨”¨¯‚ÈRï+é¡{k„¥ÆÀ¤œKÀ(z¼>ÁİWÓ¨MôLtÏÎIÌ~ˆ»Žd(F›7s#c‹v»T'ó®| °SäÛKB@˜4ðmàÉ db,ö†Myãi=´9¯k|XH_2¿XË^/?ô‡­¯¯ªJãÂ5à¿þ”xŒ… ?’ ­ÐqÍá®ÀÃÊ4KpÍë<~/¶ô‰›=¥¹ÉÇQÚ…éå)UU Ú"«N¹¼frÚç—áÜ«¯1!¹ÎºÃ¹¿NKË«<«+±všþdKnÕymå3fÿžq$ã:A镬ԃl–&cÙH´«û:NüœÎ}Â1Ëa(•„—÷2>CeJSš~Eçhˆº‹[|XÚË0\XKH<³žÀc™ 9Bš2´‡YžqZ-©‚]RŒÌúé𱬉.{C»çx8:y?€‹+=2OÁLnoTév'5‚›Bëbç+[ÆÜ‹ã¹æò-%;l†ýcjëÇB¤¾n¤ÒÉ7ÎcEëü½yÒñXÆÔ8?Çï6u.̲œË)ø‹·¿Ž÷Þ<Ù¨»µÇíµ‘e›Èé7¥å-Éÿš(Pgv':àp –1™ªØþ`wì»Ã¤ÆðePˆW úæñ”˜ñ[—fŽçÙéÃÄÝ€?yoùÉ!L·ÍµMf]»’žu@…þ ¿¤ùÏ÷.9B6gb0Ø\õLȰ ‰&°ÅƒìwKk1¤¢`[6å+7ŠbºãéªÊLqÏû"Î#ÞAÊo;T#/m’Ïærus^;òhäd&HWãYLh‹úÂNŠAÙ“#›^FõÙÐrœür›#rÆÅdè©ÇïzsâÖãLo{2¬ÛÉD™s¸Õ©•…döxJ°ÎØÐK„3óÖï2¬¹+¼~v"P‘¶,h@ÛŠÁ|#K æðRZ°û†ÚÕ«‚Mµ£¯~a$øê'ím'‹ >7¤ŽºþŠÛŽä±#{ðÆî_š]­×~gèœI+ ÏtœÃ&vIßÀâAHš²mü^Vv~B¼OëeUÒ¦ì­Åsü‹˜ šuÉC)I·_jAM(Z]ßg_:jEypÙ—6ç<`íû¹VVA{«XÔdI»BýA» Ô¤¿û=T!޾ö˜†Z8*öÀõbv%’ŠÂÛ­kPö¯£˜ÐýAìcÉŠ… ÖeÔžà—‰~ž¬AP~¨2¹J­\‹ô§èJX¥”¹mÇ‚´çAÍÛ>ôSM O[õ>bAäÝ‚f˜Âã ü˜¸ªhîÉõë—‹ié ÎÙ÷_(kêùÀµÆÞK.n8“çí¼%¦wjQê¥èxÎ6³Í@¬Æ=Ô¤œY6ìnP鹤Ôpô›YOa°Õ·M€”’ÉÁB€¥J€¯ÙÏþ9‘ _^/Gà%-V¿¾|¡g•f´Öm{ä‹uj S™§ »l˜¯šÞÜçõŽæºu.³¾Ò²—ËwÔLæ‡îh#øv攀ÑÝ}e«µù1¥•·ønØéöÂ. ÃHÀ+Öc–XX˜(Ò Û–^ÝO«áäœpÛaÃÈ>ÄÌI!Ù„ŒnRçWåØL… ý(´¦÷ÖèˆÞ;iuôC½‰ 4¦cžE®AD›ú5BžÃaY¡7Ìü®3m°0G×m·óa=à†yĸ³ù6ð‰Ëa8fn‹Äïàaï?íŠÁi x(ëú^†dA¤”?XÛ Í–ÅÁ%f¸3>4FˆÅ"®®?ž‹®j‡šÞ+¸³úK„dcz½S®ã^'œÃ@ÑD'aºa[¼~޻ߔÐ!™.Õ†¹gJK95f“»ç,±çcþ$Õ*ôr]ïÄyÑ`FuS쎩H‹ì̧]±Å1'îÔ×ÀE¤DƩˎAþhãQAmQá:thÙýK½(R¦WIH@IÈÐúDZ{­~ö¼fW ›ì÷J¨õ½³eŒóˆwè_[Ëß×ð+zb°ÌÙè[Ì!öY3ˆ?;¡PÇ÷,Ù™SÔh&ƒ‘Xÿ¾ÿ~ÄY2¿¼ Îop–~QÿR`Á³Ô1EÿæÄv% ©CþyÛYPšNÉ612‰Z KO?dÙ ã[½o&V4w”aÕÄi‘´PØÚ;°·¡k…¨2¶ ž/þÀú‡¢}l(^i®ß4ughCÆC}ÁC÷;e\JD½æ[®g(©jK# ÷ÒÚ Q*Fñaî±ÌeEˆ¯ÅñV*”Í™(Ü™<1lv\œ­e„™â4zl£xIð±ó½Sü;‘žLÂÊ4øy L=¾„À!eæQ–R©DÙ¥áàkªËéz2XÂàâ.ƒ½›ô'põ`„7uÏòša„Dbù†Vót%«K”ªÏ¾Þýž›" UÀ$ñÏDÍ„“#°âpIØÍÝ¢é,\iòãÑʦ§4^¡ÅIÝþÊ0LwÒëéTsämÅPóMºÝ@_eÇWC6€¬‚¦xñì7!'T¾.Tñ$¶&Vdˆ›ÿ·ÕõI*<øûôX>„Œž Æ! ˰\”m'LGÌ@÷•Dø=ún¾¥‰¹ÊÊœq«¤Š%ë^nŠÄJRžý¥Ôª+` µé䎘gšAã@#1˜€²E"ÏtÛ·3( «-z@†X ¾Î¶Zu Kßµa¹ ±‡GÛ6×å4 F¦1qžûtb Ñ¸ìëÜçMS–õĴ㟅Û$âʼn¨åû”¦²N“ïfˆ4ÔU_|žÕ76iöÖGé!øÏÌ“[ŽKtœGÊK¼Á~%Òhˆä>«»ò‹Ý’jrÍA® Ð]!…'[|Wò~™RØœ?€-…'Xç… õôgU×¥@\9N\ªaY?FŠ ŸqD衵:x,ÕU4Œ#XãwÒeƒù [M/ËeokW‚ ƒJIëì¿jâݺçœÛi…îá¯ø\ÑÊäsÞ1{Ã=„€ócy+HƒŒÆ³´mûûGÄr2Ç«ÄÕëxSc‡¶._â—UÝÙŒÇ÷'Ȫ´åàÎÙÔ{\WÙò!½ËTú@ù€C1µŽW‡ ,¾2—ƒ^:q®ðÍË^Ï Ì4 -òhÕS×…N0B¤ Ïm=œŸBQäþr*[M ,¼8Çüm6Rßî±è¦Y‚ï,¶ç%VbLǃ^¬š”èÓn_\)ýlèÑ(G•·»EZG­=ž‰p>Åaå"jÞÎ ×–÷ÙÖë5TŠ»°é‹§½»¯_d*|zïÌðeáu#jdë~ƒõs5S¹m¸þ“Ÿ= Íži‰§9ÁcQ¸®À¹ìƒÁ‚ÞT³¸ô/n¶R˜|·ãV¨IG‡sÁ"SÁÀuMT —2ÿîÕž«öÉó“)4MG”C‘Û_\ÑQK&„ï” Wq‚ΨˆÇt%1´Ô[-†%ùC-æ[ãœÚ3ß]Þ`•÷q8¥¿á£öªHjí¸™ Å5ÈioA¸G~pÊó€’¤J|k³Da“ù^"Ùi\ïãmNØIë)²…®:ÞãÖªEÓþR¦Å5v¾ß;žß—ÎôãªÞÚoØùaÜÀå^Ϫì„sn%ü .µ_o‰ýÃC¦Çä“áEZá R„våXŠÁTLjhf^·^ô‰!áÄÏ=‹+Ã`l4Ëáªý!§¼ˆ]Ÿ>?÷÷{çê ÐïRvmܾ&3Ú~DöB®´æ×*ö¼ŽLF‹äkÚç8%²§“™¤Ì{‚<—6àÔ‘w$æž­þr*áoqýÙÚ¯§óüùã7̹ÅáÍ"9#Óšå¶ŽµàL;¸¨Åïªpmž“×fGf£†;_c\êIJ'SxzÐ5=V›JÊ& ?¶A šýzcå×`ÖíŽa-’HÍM›¿JÕëšpÚÕ¤'«ž^û"Þ|û6ñ‰ï„º?ÿ:EÂ6&¢¥¨\ðÉ¡—H¨³ó‹lßÀ̓Ón¡ÿ“§¤ÆÍ7Ó¼âôIÈ­·ñ—'ôÅB Ñ“ï‰(ƒôG›Ä=$¥–•?!w.iVÂâ@Ÿ[.#PL- H!Ò”î…ÿhn…E[Bã½M”ËÙ%cw­QÆSÑDýLºŒS!“ôÆ:öýlŸ? lœò×É]σŸ¶‰š¸Ì-Í>–f™økþ†CS±C]ÔÐ/pó/}ïË´Ë<ƒEŠYî€h©iY² |–Ô<êæ;²má|oó¹Co¾›ÀS5©Y烙÷>“ß…#±ûULq^ ’ó¾Å+øpCGL·Iÿš&‹UÉnD»{ÔÙÇ{¹Ó›‰ƒ$ÀƒDàNëô>Rˆèô"I¸Ì°¿)ö½L$Sf(² q»“6}%b¹&Rá*±4B=]&or–Š}ÇÀ7œ#ÿv–Nਸ਼Ðë®[Õ ÓÆG½užÕU¯ëoñÉf×¢½Ÿ3!ÆB+GQD‰nQ¡S-§Ø%y%13z3AÔɯÂu*° v޽/÷†ðNY£k•±š§ŒºÕ|C}& Õ´YL¤Ñ«¤?ºQW\˜¡GüÄt˜áÚ0±$-h®\Á 7ç0€PÞæd‡D×,ð ^RüSô6I¹·âDÄ^Éã.@ëÊÓÉ;$Ð'¯Wf¶N=¢€Ëß´dÖ¦í{· ËyôÜ…2s//nìœv­IãBܳTºÎJ-a9þ–ñÉŽÿóÃ{o˜ŸÎ–L“ýi‚ûޝ˜“¯¸#R®Ý´ÒDÞàpWu!ã jk11éðÉÏiŠÁuÚ+k<ª]\øPKËüÆ4¿È7ªáNåZW„”Ù8CjÁ£J2IzæzÓkÍTÛVwôŒŠÕû`a–©j>’¾¸Á”ÝPcF|‰ÛÑÃ#v,ïÑô,à)¥ÀvLâ4‘þ`ÀàOg g÷Ôùi}õ~ä%"]šïãh€4îüªzò®Bäh…`‰8eP/VïÊ#víÄÔˆè9ó„„§.ìJÂSÍõ!º±!4QÙØyÝÔA¡Ï[Ydh`º—Ìä<ŠÍ{[¾{æz›„Û‡#'U~y¤K^&…ön“Á`GDv°œŽq£ª^¶ž?}Ø•u¯yô·O±>׫ÚUì ä”´¿GÜÉÛ忨˳—Лôo–ã ïÏ'êáU`ïK#T¬7r“;¯ŒÌ…´2@ï)Ó4©w!i7¡çŽ­Æ$„H¦á‰|ÅD¹¿–¦@É%M‰µavÞì˜ØÝ?˜÷‰,x€ 7J°(ÚníÂøïÐŽ ›kc S Á5ôeYdy¿¾^ëœ×ƒ>“²ÒE’V„oV†o•Ì E韥KµÆ$~!×°<Ͻ8«Ÿ™üõ~z©&ñC¤Ê¶€eS>µâõ0‚®_“!´ê“?}²³)1BÃÙù%E•#ÓPÕC3–Íz%°I²®“йMèöF8lÒ!ƒÉ5„¡xIÒ>;@öÓŸô“Öy0“b_qûÁ“_8ãf¦X?üí¯¹šì_†š§Éu þ¶C(ð‚áó[r48HZ^%MtÌICc+€S +Cgpäm Tj"z~¶¬šuø%_:"ë$¥}6Û£è¦ ö=‡]òðMl=°Ä¹¹@mXMbÄA¤>/g¯¹DÒoÂÝÙì6æ©áú4>~rnB/<÷LV5­ÜÅ’<ñ ê&çûMýo• zv=bÏ ?E²psº•'Õ(T¥߆sûsÛ!s¼\+Ò«$ùŒâKbýêc?â „ÕA‡\Ž©”òëT'€>j xrí å?ï9|ØÝ\¯5?}kGf<‡¤þ–©ª)NÉbOÞ¹ž_DІàˆ(vªÜygóÆWí¯µ™ppŠ‘‡%[Tãà6Dþ€(Y˜ü®½ê0(`:&6iˆIšàOÏ«–ÄûUØŒ³t‡Ë".CéWé0¤aPi„Ý,+]íùîb˜šˆQ¿FM6ç²h”Лvré-Š£éÄi¯êÉ}•üñöNQO¥ø¾c΋תº'¥KÛ8ÎHß×ï8¹Æ—d¿` Ø('Ãéy?Q³¦'濦ˆñ†§° ó/iå; އ •˜ ÁòÀ^„Ùú² ¥Xñ‰þF:üö[³ê~œ¥(V<¾· æzúÄ@‰ÙÆ=%¨ænÒO³ã £ ;‘D èÌ‘¦ºûò@±ú•®ÈB¤˜ÁþjáÝÌS#™_ÙÔb¡ìcTÆÀéJ°p«›?Ãü¤”;+¡ÚHÖœdèÔô ìwc6îÜìÏ,ñÙ"·†çŤ äGF¹o+~¯½ì÷‘íÈÇËCÝåá~ÿÉç¹Å¼×S—0a¡ŠãÜ¡wºJW-RJc¨1´ÇT±n@úH0b²^C–­p($ ÃâjÔ, kòE¨3Çž¬ÆèÁŒ¾Š*ƒì—׬{¢8Ö€ß6›5Ž{B9.¬¢Û¬'XM纴Su»º/Çšw¬gò–¼ ¥Åªpí÷úý ö<7.ƒA£ø”SÈŠ)_ÆdSKÏhuÉàcù£ô%úµµ‘…”îD{3bLt;6½×†ÙóƒM¥Öpb¹^¶ös*òÜïmuì΢ 1dzzàí3絃¸1@³&Éþô „êGà¢ñu?0í‡,µƒ)/|“ñ¥Ž5˜y–ô¦¢üëLœÉÔ6æ~ÔýúJAp&&c!º»Jú¢0I‘×ëC>1!]jÌwº–¨OE¶™a(a£]Æwš†î¿2¾‘Ð7ŒzJ)TœR‘%#qCÓžºŠŽfåI¨û¬ÌÙÂû”þ2¹øø7ÝlÆB¹!(væÓ‹Á» Wû- /‡.íšMBô',~½Èvð¥_%ÀTó¦™Ñ¦ï;­u5eC{CWo:Z׆ Ú˜pMj´”5€´lÇV ŽÞWqšÑ犪ë.ÝÃFák¯ïbç#Fü9ÎÐ ºY#Q«*_m1#Ï¥)ŸX*AÕ9áS$"{m­(ƒ‹h—úÃk>={¡P Ÿ+*˜ÒÌå£Aÿ£\uxÚ´oøIÎá·#!¥µøâÈC–I ?Âa{¸ZL _)UE×;ÁÎI’*ö‰WA²'ÁŽØœã6FR¬ €–2ƒ9(·0êÁîb´é5ë=ŽK~j£tõP -H#EHlI²P…z^¼’&´Ûn‹›úÂãE ¯Ip$Å–×DÚª—!}7o{‡1úcî¡Nˆó¥Ñp ùºþ<ÿ¶/Eƒ¨´ýäö¶üP¹~÷Ir×ÊaÍSÅõ9¿Êc¹‚ã–*h9³äËU !^–ô:IµŒ!G‚å´Ù6:ÊsæÃmª!ð¼sÿíLÍî/«’)¿nS=D¢Dé'ÑÞðp–ÆÊIîm|”³Iøñ¾’âG¨ xÚcîháe¥á{*o¹ó&ê{z eS²6rê<%Ghœ«tmqˆRš¾ÏÈsò»¶èl%wUÀ·èÔœK0ø¡]žb;8Âa°ún?æ|J®‹™ûÞ׋RÙê„’XâÛ'òÖóY| mc÷çM6*P¬xÑ¨ß ìYz=7óú Æ÷éxE±SGÚ&À–{8kí zƒýÞÚg\”~Ëk?Ø|¥wfðËD~º'ˆ?íN%[%¼r|ÅÓÚÕ‹DåŽ)äŒÎ Œíàj¢Æ[Jɵ\?Ng‡×¿æ×³FXøœïsGæ®HZf—¡KÒÝC ÁâÒt »Ç«†×Ò/ù7øm^Dʘ÷iK^¼€÷_%~ éyu€²ºÁ–Ò^ÁÀŽ4X¹ÖËy:™”KѾßHõøÔ8X«““w7麔;DÁ9ÝIùí§H.BW‹‘{”ygÅÈÍ”5‡a%£Ì|¤ '.tÏ<÷3ŸüOk> ¥xÖV82Ú¯–Kñ?fM[EiFË—moÉ(7êbœ˜%pÛ©Ôç—oï¨w¡S7~xבðoG¡6vß-¯ê©b¨ùC}t£ø —ݰdˆr!T3#Êg3Ð3ÿzö;Ì褺 ŸËûltXˆùÜ?â‘ÞpÖN|»èttêH›òÞXym*É“G Žœ3HÃ3@RZÍj¤ß†#ÔÒîyÑç$?ÎtPæ–•FÈÄ{„[êÇOå6õ-ýCõ$½?ã{â°ßÌŽ½º;¨«®ëG}Hw…€~@c0œÖñ^HüÑ7tŽ“Ü žÐÀÜÔÛ^ÚñœÇg FãÙ¢]ðÆà0L°4~š%.Ô™ìĘС–ì†_Ã%F–ñlÞl‘º`‡Eó¥&öU©a~Á=]ÎÀЏHTÇ¿Y",þípµÖ#„z ºJµ¿Úkõ.bˆÙä%²¿–”^‰ÊëGI"˜°•H’x5©¶âQÕû:Ýõ.4«¹OÃ3i[ hµŠ§£iaÖ½¶ðéfe<Ä~*)³Tïf›=øg<"Û —`¸µ™j!d{ÞeéåFÑ€Ù`C¸aŒû**6½7/cHé!Œ-ÜõCÄŠ8à©ðèU}yo¬û9 y¿{½d…:ÕÎÝsÌògr­k˜rƒ9ÎU«w"ùMUª+ᇵU¨¦òajþÆ: pÍW¼|cA,­z+D»-ïwŽm–o¹S€Áþ ¶3LZú CãÖb{Ÿ—LȾ.SÅy#XAä ?_Ö½Õ•šmxZbÑmäæÀm‹ ˜lJŒ@x9¬ÕCfA¨÷|̇&Ruâ‰7«¿Í~ý#?ÈÁ8ø!¿ÕËèë.ê>—mí®~<Bafñ.{4ÑÍÔö;•\í³\ѳKnïV£Ùï'#߆ÏÁ1†ÇjÇ/•¹²ö¡\}ƒaoÞ*™0m„òBð9×8âŽoÛ7ª;Ÿp3 KÌ8žeè=¹Dd¥è~IJRF—YBð¾cçd?E£#Ü«¿Yâº[‹±'Ù´èÂA !‡\ѵQ"…È’ I£4(?†÷G¸;ÒUã¤2±š Lá …¶ÿô³ÒŸhÔBjùíȦ Lg;›Z±ª"*.S|HÚxß ®1“ˆ¤5Èâ¬0â‘”¯}Õ®NUÌiLÞ'_ùâyÓß,¹z¾V±îÛÝ·Wò%Òv5Q¢~£Ÿ&‘{±´ÃUïÝ :ƒE%0NŸˆbµB¹wŸ);ùs¸'¢ änó-_¤!p«8Â¥BOMG×*Éi‹ƒ`‹À £‚×Ê ¼uÈ,Ý\FuV[™žfÍ6 éyˆ%cè§Ðy£¬û,ÞtýK¯Æ.¹)?mqLeUvØÓÖM£TuJs\Ù\b­^ôà–XÔ4Ôçyh‘lŸ§ñv7÷aõ""å9p<þâ°hYÌ;¿íÓ,8Û°±ú6ò× Ï­9>¶öMì9Ž1ãz×`ºfî˜}™TøêGü½å|þÃQ¡æb0~¹•),$-ú,¢zÐ r‘8«yuITPÐúN"+)Ì1„¬àÎX`Þ=ÉR‚ííÜïè¿XvŸ± éWÇ„œ —CŒ²²ÙñÉÒzqš@@LH5æ »=”’@UT‡è3á ï{¤Ý…Tý¢‡RöñS–[ʱMókR}1!Ζ‘È Y¸¸öu»Ó»bD¨2Ãþ¦·ApèRMëÈ ï¨ü2šÂ6yô"_xîåæz51KvpzE[²-×5‚-Áœ˜Íå‹O;GE–}Y­…ž¸¤Qâc÷®ændÆîÜ—YýÔay³RÚ•/ÊM²¹ãK»Ú±ç7]_@®£ ’)‘’·±ÖäÔ[(Ó æûøÚÁ¡dÊ露­D#Dyõq3?>ëgv–ÐŒ¢ÂË–k2o4ÜÜÁ˜©ˆ Âm!Zà«bq‹$ÄÊÀÔϱB—ão®Û­)-ð)¥WüG¹œ”±·ºr:wMÂ:7™ÐW…'û 4”¤ªçÄÞåL%%“ùÕt7þWÖ5Éé]ŠsUͲ!™2+À×â*3Ývm/øûŸä#çzí=OŠ2çÎð6dõSbGƒµºl¾ñ±G1°.½¶R2¿z­ºñžî+‹·éÁÿ8À¶«Àäg0TeAŽáåZ'€ðÀûbã„sᚨŠZ‰fOsD!¬0æÝv¶Í€pJ~Í7AÑšRY¿‚¯n_ˆco ûŽ,´1lÔœ_ëÎ]-²÷6 5îs]·Ã׈÷™O2Ögyt¥|Äj”“ı£ª*ÈÕÚ›Íñòù„zêÆes•ǰ›în&úƒc…Š¥çËÝÖôÛØ+Ÿ‹;¤¿v_!… þTÍS'[kK; 6ÒÁaŸù¸“™äjˆf«L³ñ6u»ÿ¼´ròÎñ¾…$cqÏi°Hˆ³»o„±æA •x©3âÔz•oßåk{Ò°U&_Û<µ²s+I/Á”@>]ž£7ß°~JB«ý(J¶@fLY[Çîtzç!œô<2äTBwÉ0ûyǤXZÌÅÞÛW{G&ñí9–¬¼­s»FQ|sf>]C$@Î&Åäıì!lr{œšB¿ž[š ¿¬Hä;P¤ž¬Öéž®NàÖ#µ©ÖDø¶i@+é­;¿åùã²¢>‡>Ç¡Ë=Ç¡¬ú¶ëzöÈ"Ë$ÄP\F‹ËÈå.9ù;òb]L‰™'î¬ñš{L:RkŠzhçFܹŒ<³S>ø0ˆÉý'ËT›Êm^â/D¿²x‘+¶o`ìw„”Ïi"oa6Âî0ßÔ V~œ—»fçà°üØP+xÙ!ªÍp<ú64 ÷>Lüð¾s°E°ÙÙˆ‡þ]}*Ç4rQ[íçb÷Ïp1¸ÏzKKmŽü[HQpÖcZ}ý ͫÓ;=¶!‘rÊ=>dž€ásÖ ”=d8¬'œ,0,¢¬ Y—f·ÚŒ¿ Tv¢Î)0é¦H}_Çí•ÛeˆåNñ¾ÔÝwr6ÂÒR³ßÂ`µž¯¼‰r¨Évu~›7\ †Ù'˱¦½ °Ú¤^盳²'ÏÛÜ¥µ®#äÚ}lþ§¾Ãè)HþÎíÉì}¨P/|1¶X¼ìnËYs; ¯Àð ]Sœé2ª‰2ITA™M)‹YišGöNŒÙL6Óå*‡pð<—¯`‰«ÌãèYKÇúiÎcî)¿æùW9ÒߨzÃn;JÐÒ/hÍrÑ7Oo­³šF›ë‡0TÓ ¾ÌpZFبYÔ.ãøGµÓxúu±®è7êˆ~ ·%%lðY»Äµ”½!ýA½ýQĬªŽ3u½œÚ¢] ‹Ý¸I>«Ô¿ò™BC"3öŽWínVOvb§çZi‡y<… éÕÿã÷QýòÐbÅî^Š:Œåýß™ÜU¶/P¯nù³øÚëk^#¶ØTÜtžpI. › „ò§h9k}rØa=ÂbQ&ë£Ê*ª}˜­5<ÇÕ=EÇHR˜ÅÂ},—EƒÅClº¹“Æ8ÎÔï'¡R>z]ÔîE¯ùZ^T9yÎí\§¼ø¦ÒìŠæçP!¤Ñçf+¥"Âà,«è,—"B‰›“Ûjê¦7Fì+±' Ž|¯…ÊÏ.Å Úé?¾Ðçðý€C ðÜ']2j×§KZÇÂl°F÷…ϬÁÖxòÂô8ef–™Fž"WðÂ×" ˆéÃüôMEHÌÅc›‹¼+xêC˜™áÚúÖ ùN ò Ò—­ØîŽ‹“wI&¨q±ó>_ëÅ4Ë|‰QEÀŸe)Çã÷,3¸Á“{¯šðè€jQÖØþ^Ð X3˜-m–È <¹8#æg‰P“|‡ †ñ cf-zˆ ?Øå†ê?úç~äWôJ¦å>±Æ8'ã3§úÆ “Èœ –§¯YI»T…çM*5ª¿—¶ÂÝ(ÉèPõ“…”oÔ¾#Áj°Év$­$-…m (w饬†&Hr´áö`T$„”sz$þ~}ƒZŸ*+kkÔÆ‘¿GM8Œ èÉC(”pÊÿ¡4] €ºUV˜XŠQ$ÿY‹ó¬ÂdΪÚ. ÝásàZåsUé.ý Œ‰M /µz¹r zek#“õú¹œàÊVˆ‹´8óÝ¡P¼ZqYsâŒVÍõC(Dé¦9tð¹.Äz*˜|+ŽÃ‚+He0Ñ)˜µaÏ{‘­“Ý4´°k™øËz®5(¬˜ÝΔìv„Ͳ½îEéÙ#(ì‹•’#iU6t\fùÄ£0®OwÑ5aÁ‚Êʪ½$zÞ ðÜú/¶¬×׬§d{pêG蹪—ØKޏZkcïê—.p$M„ûö3ÄF9x9Ô/ñ-|à\6¢ÕÆ—&l&¾½+°‡çüµ‹É#ÈÇT‡þ¹ïfÇóÚrІ¾«‡—£ýÑuvôû¥ê«…Q/¼­§[ööhïk>±vùͦ¾ðËú©ÁOË`jZ[ŸƒÜìm.M­µèù¬wf“9ȶš¼Y &µºJ[òâ&èìœlè¥× â¶^uxÛ6Ô¿"Ë‘_â” «šn°#fºƒ‡wš¯’êÁ;ï2qb**À0£ô>ài;Ín!Ž‘6t'æ øô¿Xº™U->^ÏÚÊfÍÉ5eµ >öÁ@“ç»ú>m—ànõUƱ7ÞBçüU5Ηøæé¡…Ùin¼Ù§÷`ž”:6Ϩz=”ß¶0éîšb(¸ŸÅ—b‹obE¥z˜k¦žœ½VÅ;ºáÌx½Š±ÓN‚å{+ÿ†Õ„ðQ*Eðîäìx"{Ÿ¹ Vò­^¶Úц›¡HnzwQÝÏ}Ô(uCdò~ý­ÓŒƒJ‹cñ>ëÇ9EO-ùe{aë2ðyZQnÏÂ(ÑháØB¥Ü’/CBQ>q+®ÒbiæLˆïqüNÛ Ùê„NZØÙR®XÒ>0v£;íGiæÃçh«óî6I¥ÇZÜ{qáG÷Šç‘,Coà_GÞ7©XÊbä3ìrV#KMªÉÔ†‚[Ý)p_vESsJ`¬éz]Ázåvºç®/ÃC%“cío­ÞÓ†qdý%gž(ƒÀ\Õäx¯3*sKùêêä~›~¿7 ƒ·uvöîŠÃuSb¹ÀBîôh ˜Mׯ,ø‡¯×Uu©0pyæ³lì×Úzà’‹‘4Ë4öû‡æèƒ%tYMîd3)”å>¥uT>ò¥(ÄÊT­„Œ•_Q´Úªà”ð¡‹Tg “¼?¤‡Õ‰Õœ–ú\7y%9ž|cÎÈÐq—0TÞLe_c¸øÕ:†*H6¼ÇòÉg"Ê÷+ý9.8i,6*EDzá× !²AS%ŠŒ-?}Ü6_Ñ=ù<œq½b™aÆÕ„»Ü5´ƒG¸Wa 1k<þ~ IÕˆÅP#à§¥jÕô@);Æå¡Œx¼jùfÌéë°—°NßE9Ô)®çÊQž¤º 8qEiû«ˆâtB[Í„rN[^u¢ ½3qyd}_ZP”T›Ž'3Rk*6&>¬SÓÿ@‰$­5®tÝDèx ¡Ó—gì-|Ž™ÿ’PCOI7²dµÃÑTç¬ÃqƒÊÓDx~çíQ3–î‚ðưì>«/íþ‹ö…Áµ%[û¬‘6d¹Š&•ü•X¾f7wWs28k\’ IFÒÂ)H󧱯lCäk LÛÓÞòj†IhŸ®cðD«&Ìa‚zhþqÔP×5Ka²'Äu{QCü—!ß Î.'+ƒ›‚H·žfæmi|Ý\¨Áª-Ùì@µÃ®¿Û605B•Š„§˜×dÖñÛ•þàˆ ´Œë.†tÌîuŒ‰Ìp*­Š™xß_rK º¬Éví/W¹ÇØ¢›Ö,7Íló‘ã29ËÁ~ 6Þb;Îë)vwQ¤‚ä Sˆn«¶Õ·$%û/_ŸJnSJx® †# QÓEÿA:×£‘M×Z«ë¬ ν`OJ‰²'‘;J Œ7ùþGéhÊ p|sG)K­ ÙÜúý¸vàZçëø°ù~ Q¸¼]¥Ö®]íºCJ ®"¸#Œ¥b9Mkî+»rw'4¤.(QÌknÞÊ™Ë]ゾÒb±?¿“¢ãzŽJº†TÓ›ëh·ÖIü"èücÞ£GzÝ@»!@.CS·_ tï3!ÉÁB«›s!ø’4Š»´·sbª·…N§À9 ÍhÀ|4¼¶o1^Üí ¥AÕkaQUÅ— áf.Ñþ‹R¶CžÛ HýfA3w,9ëiæH}°nϲ$vÜŽŒRH«Ñ@€5?@’.ÍU…XI(Îí­®Muí[9L¢˜óW¥¸¦4îÉø|¨Bp ®oxQ>pÛ [5gÑþ!ÅMiá¢ãŽYNí©E–|nêÊúä¸ÍR³¯g{JïGÞ‰gb:8Ä­Wmš¬ý¦í(j|w§dÐVž~òˆG ãdñþ“#»J1&yÝ5…¿ĘZZSD\nè+#zÿÁ×%¯… ºÐÞ_ÆŸ\ãÙÅØ%õŸqº¼£¦^ŸdMâŒÚö= ¬oÀþéfB¦,Tû¨ÅŽÍMh„“{%¹Ø•À¬ý?Ä3À‡2°Å%0º€PñD#|«7&Ížî0s~CóÓñ¨ qc¬“ÛÊÕ~‚?I“Žd[]dµ§—/¨mºËöùŒ ùM?„I(4Àä…ô{¡FuÞ„Àt& q0Ú.MÝÅú¥lq¶¥Õ:Vº²§·¾´G;FAŠC½Üú6Jƹð:S$D[‹aD1ùì1ƦýëèÅWž§/)òŒðÏœ5E/&c¢%ÛëKÆ;Û¼x…íм&h̉ÚÒœ4¦öâ¦ò2.rTØ éËÕÕ®p¾‚ƒúIÆ(ofE¿G.fÛàyÉVeÎ DQ×”4% ì,¤†Á.óÕî]¿Îøe£ürR’¤Á…\YÏžx,û©™Ñ9â+<²›½®’aBºd¿¤˜ôTkqa…½7åXM.þ¢¨O3PfÌ¢o,§)Ks µ&‚”²¸üÄÔ7+”ÿ÷µëšQŠ+® #êh†{V\Â_2ÈÝ‹B!¡ÿZRݧý­¡ëäOïònÛM†E´½quZe`Ä´x‘rê3xó¹JÒº="-k¡õ6ÈWòëÑ«A;;q£2®×ÝZ.îÔTÃ+ÃSè“ó 宎Sg÷Âz\œ|žÄSÚ¡`‹!ܳðïS©^3Ò6+ ­óC¿¸u+ðE¢\Ðò|j+QJŠØ|×êÝLW Ê‘Má“”½üL£N]o:Бg|ªÜ™(y£-æi~âêɉ…M^‚äŠCCª·ùÆDMh{•}ƒCdo‰õÄåíä s‘ØVÛ€ÓgìÝ]ó0|øÄ:¼mVÖÃïáMJ3×ä2מਖ਼ó‹ß&fìé;K Ë}¸£‡â©+êáV;²zæ[N8t!Z$¶åÐö©Žh¾èÒÈäÆ.“®AC¯·pºÎ‹ÃHØÏh9ßïˆ;·­÷û*°Å•ÈØxº9€Ž6 İÔû¶J˜ ìÚÏáÜaýˆÿ Ý 1pÄb3œ-\c‘b&ŸX‡Ó½ÑF+YMQ×i—³@àÛïvÉ]pø&']ë·Zåj³Õ;êæøŠBž–+ÜÁæRˆx)Z-7N„#ŒÈhÔØt{‹6‘²elDˆö#nÌÞ¦â*ýij^ŸÙl8!‹ ” uU¤¦$Ÿ ¥«PÉ:¥ÙhnVKùØ Ë}ÚL¼q˜9Oß36l`j~ýƒÀ¥A10q#ˆ3vל† \õœä×t“ʹ{& YÀ´k\šÛwy°ÕZ¹ÐiägCçA"/8¦²Ò6ê*¨<¢ÌÍ8‹E©Î;ÜD ºÚ¥v¼Ý5FZÇÞ:Ä¿..8áú(sÉ ×ç@Õ öˆu<¢ÎÀ•6ì ܦ†,@™¢Öõ¤W|ÖSV€5#·™YG˜»ÿ±Õ‘WlÊSêr\…QGÂÓæ ÝŠPÛuÏ­räý›íêªEÇE`ôúÂÀ<ße'0R¨mî€-šuæyY*ó@Â,Úý*NÝ·O Ó+OÿÝ_ò"R7¨À«ýI+üUþv3­ÜáÖª¹¡Öw"a_dæ!NÞûÝã<ã•ÎîÊÎh¬ÞüfŠU›?&†R’ÊcªÖJ’}ÇãÜýÔâ¨p< êМ®¾SßÚ´­ 4B|œ·ËK°8%•nLá5`¨§Ôû "À' ¼\«FëÄùÀÔ…<©›Çý‹§›;æÍÎÑõ¶º§Ó(ÔÖjîÔMä4óT‡€êØ^œ^T¨Eðà/‰`üh|}âÌP93ZˆáZ‰„³dÏØý¿TuÊ£˜Á…x}1ù®[Ïq:|ª³Üªn…„ÞO)IÎÕ¬ ¦Šž ÀŒ£‰§Ÿ^¢W—œ»ã\Hˆ·E‚æ¿TšŒ‹%Æuøq‘ý†»ä†î›Q’Ž"Šr% CìÂŒm©*l‚hËžõX¥¬í…ïÁ1í×'l7PôÖ%;õ)ÄQ˜7Øõ–É¢R^âUobU¡&ƒ‘+ѳ´*á®¶ˆŠ{—©%-ӞƃãƒÀÀ££ŸÁVÞYkÖœ¦b™ñmô‹²°ScÉTJÐrÚ÷ý£“ç ÃBjÙ‡†|%ÞœdЇÐç~T5CZµÕ²Ñ¾‡02—*ìZŒ?í/äБ5#À`ÈZSõ½@Sœ~Ê «W ™;ã£Ú„d€¢t -ˆÎÍ@¹ðÔ–ÐáȨ¥ 蹓1¸é6Ìä?/Úµ©ZhýêLNŒ¨ÍÃ%¼4›†Þ´¨!6£8äÅ‚4³ï)ñ¼*Áä4.ö|- ± Ï…[bø!ñ¶×AQ6›Ÿi²WPf½5¡ì HOÈÈÖ7öPć–#Ð)âøõ}”4^„QÅ-x®„+ó~õqÉ/zÃ’\„ƒÁ¾GpŸ"wó´L.ñp‘—ΈçÞ©O›z¤kÓõò«#$—æp²K®29y¢ÂXMCu„d‡Gƒ2W¸w9¯sù˜!§ÍÝ©w3‰ÆvÀÈ÷òcþSiR"Ñ:m§ÔvRò¶4çÄ·{¨¡1Væ.%b.,G õ‘§}“ÞÓ•-ø}:r¡œx˜Ù…27Ú$;ú6ri†žÓñÔþ2']¸\®ü¥f>8Zò׬œ®r8°Ì.ZÑV+Ö/^ÚÎáºÃ“˜\f E›Óôé”bØG*x£Œ—ˆ:¿é@/!¯b¼6ÿgrú4W#ya ÔZ¤ß²Œ~ˆ“C)„•Ëg$Ý_›Œ×G±ÿ£¨ï¾èËKvv`µ³RçhŒå5mkÒPã^TKô°ùÓz/Åå¬Ý™áœãIÍH ¿õãƒ9xbÜ¥6ªUr@!¤¡Ô`'ý¾±©¿‰[ë4JBUW_º´îÍÃ"8ERd«ä–ñ{V¡p$ÅÄäd]€k}PÕŸSy0pÄÕWyJ…‡Ç¢ä ?jyƒõ‰ÐÕÐôu±¢µ§|8G€&ž0(Ü~Ø>¼XÜaÊïêØ¡î€ä} åÏûÜqݽ¶Á|Ž{Ä«kÛPãañr4ìíˆÿ¥í%çd­LÒôc†ÉÅFžLÚœ¯ËЦ³žáŽ`„ÓE²%“?&š™’OS´Ö)Î~÷ˆu¯0[Ñÿú™6îJ !wï9`vÎÚ RÔ3ÕçZ¿×ÊN$v–ð<ãþØ©u]k„ Áß%ƒ7ªØ+Îèƒ œ`­èÏÓòviñ¶³»°a%Ð~‡ˆWz«„@Ñå“\Äï®í­Ð‘¯ñ¸4Ÿ!é0Õq3Ü—7¸ÔË´®jK°‡ÕUAÀôß?½é›]?®×tÃôÁ„ÉCÆœÆRg gPpÏž9¥©maÑ ên43ˆÚèFY®‡ë94 k…Ý  jX|ž[ÂÝüq¤fárþØà–+0úGÿbcX¿;oS‰h²»Y>s29 ¾¿ :e=à)ú…v§oÝ*W­“%Â9Q”§ï„#q°Þ›ædm RÍtFA2еÇxÚpv¢êá§EsË.ÀÂæQp³ty—6çFÀ?æøO¾·–4ö©»ÊÃ=qµ5º…D`ÃÍ Û]Ð#ù^q¢£ÂÎ$1Èy z/’ˆ‹¦Ã)ç *œS¯B¼š>`„Xéœ݉$>ô¥'uÙ¯ž)E¾v‰M½EL§÷ ÔµŠŽ^gN!#»ˆ¬½\Ø´ÈõšBŒÁñƒð Iœ"e´gFòái‡›²†éÚû~ö ô1™ðŸW懻˜}'¨D(Œp"„Œyv Óy Ì®ÐXú´õh *ª/Ǚ꽛w¯ü¢qm¥I¯ücë|B2˜ƒ¹ òy(‚§Í?*ãžóã—.¬Átm–Öe‰Üpòß êýñSŽÓEfkgoÍ uI·]#0˜ü‡¥AûŒyÁ.™màߤé dôù«Tï>HÑcýI™åÇý܃ÃPÿzU/¯“Ò ßñðOL&|M‰Ëž¨n6º CNLO %åÚÓ–3¹ËJç­Ö‹ú\,ÃS0t‘]ª•2!ŠéOsÙ§¼Q-$àë±eT’¹G³eüÏFÈ÷wéÜÖª¢íï©åõ+X ¤­Eu“×UA–  ¦öT!È$ow~QêŠ"œ­p »§]ñ¼§T¬{2™?„kðÕN¢Ò4ÖøhˆR'U%rˆÑú×pZ=Ÿ¿»>faAx;¤PòJ=­/'ai(ð›JçÄÒ?·K®Ó4(-Fß ÍôD öù‡èHæk€&NGÛ3(¢ 6+Ž"O¿EGÚ“K— ¼çÉÏ÷_¨î%†³>Oê€aî)Îõ“‰ùƒaÿã#^#vÖÉ©¡¨XÑ´Ã1èÊ×ÒºRÜ`,Ç¿è.ÕYJ¢µ,à.e:]Ž”xfKÍÍì&̘Ù˜»¨»]µG@3ĺÚûàÂn¨Ý#»·<Ч?À0ÀÇ+[MÙ&¾µäÈ5çè’æ¥qŒé‘CˆF«ÀÚžu×ÞØ9'´Aƒ³UÉx;gdU9þaQÒy_A5·bBm‹á¦hÎÍ ÃO – "XÓd‰Ò©—ËF©¤ßPð¤a¤­]‚‹:ƒÆÝ).leòùoV:ù„AbÊÒç)-DÓYp¯á¢vlöÂLjq¦$üm *¯:ƒ=39_Øß'ðbÈžÏñ¢bÆSñÇyûÀaÀrÆx#0‰œ§ùªXœ*Fu HÈ MåoC{—y]R‚¾x.ª®©9I7”¿P.|ô›¦Y<…jWû9ì‚/‹¢#"]P!)‚e¥œõê}©BºÄŠìïL %ˆ°0--¥Ût¼jZ°+°€{˜‚€yìYM|Ø7# ¢°Šº¨eàçЦ@Îÿ!ßô÷S‡5 P[CÉ!£ÉÝÜ0Zn%Y‚S¶ÿ% endstream endobj 125 0 obj << /Type /FontDescriptor /FontName /LLPGSJ+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/W/a/b/c/colon/comma/d/e/endash/equal/f/ff/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/quoteright/r/s/semicolon/six/slash/t/three/two/u/v/w/x/y/zero) /FontFile 124 0 R >> endobj 126 0 obj << /Length1 1733 /Length2 10290 /Length3 0 /Length 11394 /Filter /FlateDecode >> stream xÚ´TØ-ŠÜ%h“àîи[p ® 4ÒÆ-h°àî$Ü-xàîî 8A™™;3÷þ¿Ö{«×êî]µ«NíSU‡†JUƒEÜÂÁ $ãqfá`eH*©spØÙ¹XÙÙ9Qih4ÁÎv ¿Ì¨4Ú ¨Ø"ð/‚$dêül“2u~æ)9@ .v.¯Ÿ;;€“ø¢T eê ¶(± 'TIG(ØÊÚùù˜ÿüЛ38€@>æ?Ââö (ØÜP2u¶Ù?ŸhnjÐp0ƒœ=þ+½µ³³£›››«©½«ÔJ„àv¶¨ƒœ@PWà·`€²©=èOe¬¨4Mk°ÓŸv Kg7S(ðl°›ƒ NÏ. ð|8@C^ â‚üIVü“À øën¬§û+úw"0ä`Sss{GSˆb°Û*2ЬÎîÎÌSˆÅo¢©“Ãs¼©«)ØÎÔì™ðGå¦q5€é³À¿ä9™CÁŽÎN¬N`»ßÙ~§y¾eiˆ…¤ƒ½=âì„ú»>)0dþ|ílvÖâàñú X‚!–¿EX¸8²iAÀï\@òRQžM¨ÿج@Îvvv> 7ôr7·fû^ÓÃô‡“ã·ùY—£ƒ#ÀòYÈl zþAõr2uœ¡. ¯;þ¡rp,ÀæÎ3‚úOög3ÈòOüÜ|(Ø Ïþ<{öߟ¿ÿ>—…ÄÎãúýeSÑÔUÐeúSñß> w€ 7€…“‡äçðñ°|þ;Ëßúÿ£ý«ª)ø¯ÚØÿI(±tÿ”ð|wÿ‘áú×TÐÿµ1 €ÿ>AÙáy”Aú&߀‡Ýüù‹ãÿyþÿùÿûßYþo“ÿ¿ɸØÙýá¦ÿÃÿÿq›Úƒí<þ"dù/È`³ú|Nn÷/°Ùÿ9ž3CþŸ3;üSÉ3÷ùuþ—û¹4è¿ /€Íùoø<«lÎÖPÐ?üç°9»9ü+àY¶Ë¿àsi®ÿœöŒ8ï\§¬ë|øëù‰a> »k‰•†º²]ž^–JŒâÉdn©°¶ÿQ èM3#¢÷Ô€ '¯î0ÀBˆ_ÉŒ4óêˬ_ïZáˆDÚlØ’Ý“ªÕzéÞvïûîk¿D|é¡7 zé܈°™G(òT5·ä¸KÁᯡ] ëÝ'PرRbznÁnÝ3ëåë+d4Íév<”tLðÁŠçÛ{ø€¤þÔÛ@2R l€µ_ÄûÑãó)!.qbŒí¥p Ý03DŠï?^¶Ó~Ør£ãÈqò?7R–rͯÈÂÎ`•í©Õ€´ºëüøGè9™þ‹5Sãc¼Ò%Cð¢Ð@CÄ×ÕIk¿×Bò¯UŒ·–?µôôË\[¹Tvoš­Ù,29#ß<ÅÇåžþÂȶW-ep§»ÛŒ¦åäõ2q´œ±Æ #º½ÇFŽ#'χ”gÊ¿M'•7þŠò-{þÙ`cÚ-ÓÁ¨Å²¡Ä~þ†h_œU‘©Gý‰xaõ¸ÑVC‰ Rô%0‡uœÈñUѽ] 3giôD×G}wÔªoø¾blßyßNëŽÀ“ªÄ.*úK”Ñ’rõÆ;fújœ>OúB¶ó[»b :Ä6ý½çèx!¼7_åJ¤{eS!+¢F<›!k$¥4D¿©å ~¹VX·ð¢ÇI$1Ï%cÂi£z¶ÖuãO<Ú>öÖæb¼˜º$–µôÏÕüx‰ãÎòOâîŒCùÔëTKV”êðÄr~0d¥‚êÚ0ÇZk~G¢Tv…‘Jó_Æ9­ðTöYñ?höðÅßÕ»Æû2ˆ6ÁH¾XÍIÒ6Ãç3Ú°MÏú|© øÅU¹#ñc>R–¬£ðÓÚ¼wzÜT7E¨Ö§'óáòÕ¼=Ìb»)ßõxÞ ë4^D}ÎùÕº±ì J½5W­‹´ »VUoí¾FLûÓæÙÒLr\\aÚVSÔÝ/„ QÝN)AÆäùCÕq©ˆQ¾ó$Þ^êy‘¼=µYƒÉÉÑ|6ò×$ÈþD!~ý)œÉ$5¦øa÷E4èO)b|ÜhbO0Üôqd­¬Â°?Ô&YÖtŽ_&6™Ü]‡ßúW‹~‘á‘"H0ª®ËÌŽa¤mâ>sœƒn¸GÞ¯ó€à)r¢¬±ÒmÅÎ4Œ‡¢¶)%파†|êYÞÅšÇWAO+(bU-…È9 ÞánJáÐxs|àª*ýV–- r…`b _Ÿ[|~w²ú‚q ÏײI?¤™m­:‚Yf2ïaÆ¥Àˆ x¼/ᦔێa˜ÄÊècúT´eˆx1dÛ½Ô¾ÞÓ×ö4p"šm£¶•ë/ö¡.*uÅ” á .#:&4¢$Xjüän²\Vä~‚­hHKvƒ(Ã$MœèñZëç—.¼)’3iHzu5/éÔ/"úHl&`²f8È•J >ŠÑL0§ñ*ulC&×b»“Ù“QÛ0ÜQµ¥ ¨˜Aè‡ú©KuM§+åPÄc}­Ø åÕ^ž ­"%ÿrõ:æEž’ßsŽ|÷68Bd} ÚQž¨Œ¦’žâí…kâàŸG-Ö®T¼âÍB¹,%o΋¤$ÃøNl¦´»µ*»Ø c^‚sº¤—‡c\K&¶ŒšèõôåŸ ³º±xyÔçXô;é¥ËŽÄ¨¸œAŒâyKùCèˆz%ýÒNµÊãöµæc%g¬¬‹·"è!]¡“?3DÔÚCh›H“úÜË·‡šJÿ#„æ{ðÚëz´BxaSɪ¹•ˆsB¼G[Š¿=•íYÕ›)ë ìšzeDTvë§Žý Ï=Ä[ʨë«›´é¬eÕİýSF$77)›Y¹òÓIêü›Å.®í6œ³ŸûUþ¥*Ö£ â}©i5­"FE¸@×ìÉFRd:y{çÆÉr å×'Éù Š“¤;¦êî9ÝTî-¨ÚÔÑ`Ò}CÓêÏrüÛ·€;9Då½Rx¶sÝ$qfÔ•wÚg}Á%FÎIÜ>Ö< Ø9åPh\™|³J2/ÝZÁËõQ»¼ÊàtÔ §`e•â…×î¦0(ƒ*šY/´·YZè¨êô¾z¼]Ei+¦2¬ðœ]›e­÷û|K€Îs3Ê/¥XËc —ÛÞ/{gPTÁFÝ- ÀÞ³®P¥‰ÿèøbqОÔáž3%þ`~Ø›2Ø<š›w¯k±LÄ(uãiaš—'®t§jÌù²_áŒgøº® ì›íÀ$¨8¹ k/ÉŒÇoœQE…'£JKÓúîå²k;°…Ô˜övêåµ£dzÚ·Crl¦!úF¥(”éÖÕ_ÚãTsûœÍ%Mš§s6ØÓ£zªýÊùy¾èŠÓ÷ÒíÇ…r(¤¡1 “Tà%L BD¥£¢ÖMßáä…TÜÐ1|7æž'ÿêóF7·‚©ÎbFÄÈ|Eû#ï7\vi½oÎÌýøx/¾€¯àA¾Êš²ÉlN!)˜_‚ç‘qç[P²û¤MŒ²Súœ”ê“Hsˆ_þrñȨ2ßaЦ["Bp“›gûz­ÜM´Ó±{½öi8¾ûaݹ.“|±ƒÊ˜Ð:Ùc­ö*¸·@ÛdŽŸûiÈ4WÛ.¹ˆåÙt ÁñBØgW?Ò*osAÆL;í¿°OJYi@ò­,fik,CQ¢²t÷µÂV5lÝiÇùc÷Y#¹#;Á0fäí\œØ7|zŠR¯Ló/,wä9ŠÉD§lœ»éøØè#ä³ds³‘`ëxÃû^†¤`2åV†^n2ܳælü¿ ‡ÖúV´Û·=»å¿R!~«‡â€d•Ûß*;Ї%q#i9š ZÅÂRD²( ìF\³|Y(rÄ3Kz%°9Æá~Û—ð³Ë$I»#ñŒVZ.Û_´Þ›sæ]r1¹/•¯šÅ¤ož¡¢LÉuù€ü€Ð»æ­SOÄz9ï[ª«×‹Ñýx7œ­ }Å|T²Ã”åu‘ñ‡£NÌM¡å–¸Ð*²>ŒN,8Šw¥ùv#Ô¶‹2}j )ͽì[ô‰n›ž†µ€x°· ë®4ÐÍL®Ù©WÙ3f}&­¿–ª.ÓêîÓÌ=>o1öÚâ°²94…²éçb¬ ¦¯ø«UÈÛ¼¡3Ž:ØîXÿ7ä*’,„ÊâŸ×…DV<ÂÇ:FîÃCôˆîþµ=O YÒ¾• ÎüDØ>ÊÙ3òQRƒA q)aí¥i”íTþ1Äp+ˆ~¯ }`ëeðÛ{;bç¥5ñ8ûíÕÁB(…]P.SBö¾Ã^* ˸¾=Ä–p Z/mÒ˜r¤Eã'Œ̵ž¢:¶äTsTŒmŽø9žlXþR6ôæ$íæÍŠ¢‹ù¢¦îŸþ™ØŒF2>$”¯EÑUIw¢ýXîOÞ'‘Øw¿·9MȈ{!ãJ¦ý @öætŽÙ€N7ïê[Ô…^@x6^$yXèŒ÷.9£­sÅʇµ^ï§ÖúÒÀPä SÃÝ>fÓ‡k##ÖðSQwÝ‹lËöŒ¢xÂÜUب~¯`¶ÑÙõO T_(wá«}‡qÔrcco‡žÆ•Mµtú :$‰£ìc›¸ôðSUóP“Ô˜#ßji¥Þ« ¾÷Y,Æjű ï'y1ˆ9”t‹AiÕüÖNëÞÁµà!<› §æ•§pu± ¬‹P¯ºlòÕ`íÒPˆ«ýÊV ÍåmwKv;áaUIŸ û%cÎ¥¾)Û‡K|<ÚÃophû‚ *Y¾Ù8Äù¤›ˆ6v5ËN¶æØ+”ð_”/WOÒ³@TÞœQñ2c‚‘31?.KY›˜k†÷¶‰iCóJtâ‹ÕE$ÉšW•Œ|î ƒ-%\éÝRú{iÓ² ŒX'S_5"Ù½ñ÷$Ý¿9´€•#üÞˆ)‹¥Dâ§\[Vôl-ßr®T~êÏ@sùƃiÈòðÜÃLJ¹ ø>óo8ò« éÏã±}?-ðØ–)åæøªTÐæ¬Rá® eÄDCÝ ^³ŠuÂMyèA²*ÖvÛ¯ôýŠ‹Üë}z~ÌQe¾€+Ö*›<š•à^<»’%‰×\Ü/.r”øÈ@ 79ˆ£Tû1òÝá…Çå–©å§@¿â q.Qé«(Vuìl LØUÄmÿdDóQ-o•ŸÅLMZäÔµÐqáù°˜rRHÌCí.ÉPb>óÚ:ÛÔ©TG”88wŠ%¢–¡<+«Fü²zk•ì(ì%7,Bÿ½ÖE§m²ÀÓ;]s¨vS[^i³Â’q5?ˆ·‹yÈ|·|ÁH(9Cgؕŭœq[ k.:ôö<‰#@;¯"º•  aù!çeæ!¹z!2ØkKîu-·5ýØR«Þ÷­¨ü_Yf¢f>´ ã‹ÝÐû¥߇íjf i¢)%g©–U˜œ8N…æšxFx=Ò¥g„º£‡0¥Å¡~'ú!ä<TN›ïZµ“—#ÏYvÊì>qaUm !]ù~âP)ùÌ9[ÙþYQ?µ¡'Ò‰ÑÜêRlî½½­¥k±$ÿò`^P0PÓQO,Ú'pè|QP˜Ï±¡”³>1@M±´†¯ú“cF¡…Ø.ƒºa瓵肾ýGÑ×GîùÉìÌn;¢ž5?Ó–^Èo¸(KÈaÑÁÖœFõjë”DP½å¥½m9góõqºñÎL;¦_ôr„·±wl9ͧ„ö ]» †í\íV:õåËbx„|"’ü©“ÃàO»Úa¯FCа™3ÔŽœf€ ÞÞ96ô“ÏQòKN¾bn‚DûåÎeºúûÛ|û'^ÁÀ¨2WÕ <ÙŠûÍmUb¬jKCšhgßè¦íMb;ËVq[ä\\‘™ìëu”>õb¡Æ£ Õ›OˆŸÏuðiw‹_ߎÌúU¦EÌübÊ%¢ˆáܧ~–ÈôtE81!3”Üï34gÚóóhªEd ¼­+ßV"eoj ¾Î5îDrøF¹xun߬ú™¹@S¿õ)~Æ4è„®µðu¾aD˜)‡ußÙ¸n‚™Î¯°K•aá|¬( Ê8‰³Î­óÁq–:LË‹œ%¢¾x<@"ŒôLòn!'5ÕÔDeÈûÝf˜E bîÊú×> üdw3õúÛ¹÷„’ú]‹IéZúgAÞ¥;ïÞìn«÷?ý®u.%úUv?éZ矦ü­HRí¤±ŽÜâ;g‚˜ü"|/,jÞÚáGK½u¡ÄÏË’Ek¢0ãT‚•al‡1‚fgoVÁê‹oÝù›Ä÷’¥!¸‰ê¹H9ÉÒ“ëXþé]ð©]¤6£÷š@âÕø"hEýü…¡¦wϸ {ªçšŽR¸Æ®peL<ü9„v™$pÂ6ý6ý±'òh*’y/²gú†R<F&sζ–ÍÌàrs¯ÚU~ùzg® >W w÷<Vªjêàü—íSRžµH}šÉ‡ØlÓÈϪ•ôïmhT˃ûD°PëduìýÇEáR3C¶êNo ¯–c?Óv†[»\ÂжQˆÃScGDNÑÜEÍ TÑ_ÉÒ¿ZAïÝ(¹}¸¬ ^?BèèÄOœÀ†ñü€@‘Ìô*~Ë´¡1°D{C.<5îráe]$‡ìBöµœ{ø†.Vë¾fõðDé¬S K·£FRi§dMuÎ;Ôx ÐdŽd¨>éå)YÒ,ê¡Ò¬1úô¦ùÚäÞäÕÀå›ml†-§xºÈ6-Y QõòÞKuÏqaKœ°ý$†+ñåx:÷3 U ¡ŠÍ£‰(æI*¬î\×émû94ªØ*F¡ò*6j¸þ.8a¥! Ï[rýEu®õ;qN&å@‹ÃW®02¼(Ò—qú'¬X¹#“zÊÊR¤ä›]»”ÖÄùÞ”¸§ovEx&>²òпY¿#˜aBdânñ˜+&XAÌŒ“˜þ¡¯KÙØšp‰ò…œÅä'"1,!öl8–ª ˆÅû󥺶”Å‚Ç&òºÔ­D’Ý\yLOÃjÂzõù#Õ„ø¬ß74kïª6±m À‚xŽ/‚Ô3×ü^Cní·ðWT*á烉ݺÜT\•ûn0maÜÍÃ3SŸ´ó§:_äºÞñWr|Åá:ËùùsÖw:ý"/Õ_# ‰©ŸHŒ«-<Ö gܰ#ÓLg5—*Oy¥ÀqžÀ´û{œet«]ô2¤eUZ*½ÖyO*pVyN޳=u¤† œ¿»‡¿1”©SG OÈïEk/©5× Ø æüHº™©_®·Z‚‹có-­Ö[^›²GRˆ@4:÷ƒÈakûNÊ‚š)=®8 _©V¦½uµø²úkÕlý úÑÇM¯ÞG~æ¡f:¯ÞæK,òИ‡ÆÞãtû€}zÂ?´â£6_ ¶ÒH-¡ÂÆW¯ÇðLx÷Ã= 4Ü«ãÐRE‹åþ7ñ/ÉY…á×'Ïf£²XîãÎùÚÎÔ¹°ÅUÂùYƒ—Ô1c$ ¿$Äï}FšyŸs«˜»}©Šfáîäåõ]È7?HólJäö ½NRyQ?yÄÉeOæ«§ ¿Y*`nkTut,WóÅVÍÛT›;ÙÈãY–Ó˜sšÍ$Œƒ;¶[ßž—°¤O[Xß²FMÕ+ˆ½©Î…;Fœ»WègéÎMû”pR²1”Æ ÈÂC6¦Œ%ì^¸_m7|ä‹Â&9W7]kVB椚(Tx_1¾;+Úâ²_Ø­ ^µŸ ^Ètìú2: .{ýŸMÇÑ=,«à•rdÉ.I.ôŠY8ÝmºêÉ1:W2"âä˜ÆàèHMæ|ª\ñ®-hök×$b y4¯è!Ø®âF Ó:¶#5Ðñ5½1kJotD;÷ qŽ€%¼#ð#õÉv߃Äb/6|EqÿÅ#© Ù´?΂W)ŠsÌ«…„‘ ƒù‘³6Øëh8ø_vŒŠrZ)®é…ÀõVMÄHªêœ&Òø"ñ7>'øK%›: µ²¬Àn,¾Ü´ìën¯² ž2².Ÿ%I£È‚fò¾ŒôͦàÁµÁ xwåË{Ht;IØîÌë阀º/µ³ n^àÙìÅœfš¶}&w}ßÁ~Vi,.i‡ÙâÚØßÍâ£9)ÁçªÝ#>( ìñVk–o}]áàjM †U©ˆÄÈO¡!Pò††·dy`rn³"µ¬Ù6çm\ûV•ùÜQl ˆ¿Á•…ò\|-®A+…Õ!‹¤füâ§íMˇʱžÎ·eüxQŽ?ÞyeÐe|qoHf MW 9…ô]”N#ûÁ£“U3»R0á-…‰Åۦ󢨤v4ªýié…¨êOx8=ä5°ØÁ5ÒCH‹ûÑûzdª˜Êl1ß jK ÉÉ?Éß³l³GâÑ¿€»ôëè(i·*D@3ìÛû–ˆ-nSZ]½¢Í­(¬h'>bÈ0µè£†·;Þ¡Fî›T§j}85n_f\ç…Ë*}@®hÂèòí{Zä ™§¾Ãò©H­8!n€Ÿ@V&µo[Ðyժ컢ø7<Ì÷½Gàn–âËÑ»Û@å]­&JÀ®Úeẇ†]r·â›S£2·8¥¨Áô Ôs°qþÕ‚YmþÒØ1zÙ#ÇE %ß $ƒü—.½°º˜ý8™Ú{–hE)÷@©­ µí°žu¶CÜ.§y©ZŸÙ„AI ‚UÓb 9Aë«Ov$)Ç3ímD!ñ†1]ÖL¤íþ†0cñ‘o:R£/$)áNÚvÈ/Nr¿ jJÛå!fÌlv–>k ó dK¤‘².%¦“ª™ ^è$Ëd ZS¬EªŸåïLh…/m]È>–#Ä!qš\>çΤøn*0 BŠÁW·0 >áD|X&pÊOëèçplõ(wìÆò_£ì ަæTÇŸ_W²Wò.¾&©Xôàˆ)yÏ3Ú?[þ.ún4Ëbc俆¨[S±Ê‡ùµ(0#nñ]~–‘à‘-¥Ýé©CFb¯äèö•_\9øŽIï>17 FÿË.tO {g0‚¹ª±ÀOù1©9»H9y`Í“÷ýN£@ÒzJ=p‡J¸³[b hÉ‹Wãɾ<6u|€-+Ôõ¦~Ýüʦcp º‰QæaÆ-Lâß;lZP7?Bˆ` &|”RyËzAVpðÉÑý0ï§\—´X8?Ehi…#wÝ~,/ÌüÝa—982ÈÚ2#{d9¦iÖ´ˆA’NFlD7͸§Cvkø#„ÊC,5ÚjAwaΕ Ó¬r“ˆ×Vʰ³Ò9ޝtàbž nûƒ…×~uP­®ýÊ+ìœ][#Q%W_l×ûe&QØøeë1{‡h× {DÂTÛ¯¸×A1R†­êGxçÀi»79œ—» X¹)ƒÉss9(X´+'èÀ7$ú!C $õªÞ®Íª‚ŸäÆéFÍóJÙŒtÈ’•³NÊQ¥#¡ç•™gØaS°=|êem¾Dq'ó}þ‰V£¼;pßG„ ­C¼î*d”—!$s¦RÖ?Aõu½?vc¯}»Y~G¥ó}— µ¯‰÷Å=Û&mƒø»Eu~EÛC¿+ØÂÖæ5—^ pÍ!òÇñ~Œ–×`>­3 ËNš„Š×'¬™Ùýò•ÒÒ¡ne¹ûÌpbFi…køœ§–R©;‚È€y¥@¼IïÛI¤&ÓJ†¾J®Ïð儈Xwã“»¥ÅTÞFZñÑîÕõŸôõtI(Æs¸¼†«‘ißY¡Ø‘ÒÞ÷åžZA¾_lÂÐË>wÝ“u ´¼X`“³_'Ú>²ÕPÃ28¦©jóSe¨LQuY%à- QÔzÒUÌí_9Jóq×-K½cUN÷°F ’Tb ›âË1æ—¹¢«cÅ H,²ËeaÒå,–ø2¤y)ÙFQü(è«{…Ìÿ6s͸olHè5ÿ·áä®»KÉ+<{€}wE¨ÏJšyÂOÅÒ›=YJ|µ—¸S¤CÈró6œwž¡ƒøñ­+Ž}Uóï" v·~¡ îcçe<õ_¦IB:í ˜GËÔ;…¿»•^?™+•o™ê;‚ÓBÑ?W¸´¤x7Wêl+bƒ“޹_´1Úýµ«sPàà|ê^Œ¤¦Y½¸Qg–ÞkF_¢ ¬Ö O³P{DË`_Ón~˜¿ Z'[˜ë öŸØ_TDb?ýäâø…ååôT*õÝTíö ¼]%¤Ï`½¾§ï ̺Rb‚°Ù<íç³Ò~­kwÐ*ŸZSÅ#P—ñ©/OÍ ºL€t©®Rm¿–á·¬?V|Â)Wmu)6ÁI!‹©E»à7Øæê}.ó«»+:†±Q`Ô2ã1o‚v]yÏÎT›ØðŠQ»¹ +Ááÿ¢sˆÐÀáÅÒóñìà‘¥]¼2¥é*TK‘êm15ÍR¡^¬ˆUfD¨âšŒ?‡»o¿RT”‡ ã²á½&Ë»{6áüüs²)WÅÓl¼Ú•î¥ËgmIþÞßÓz®·Ý‰·œt°E}ÏqƒäÅxR<Êx9oå¢(‰ŒÆ{2ߺ8_þœÁ¹‚>õÜW®ó TbZÏWƒC#¿¢‘ËF&7ØyS‡åæYªsŠ0½Ül×{?­"†yU­|\EòkˆÄ3‚³s½‹ªðü?PMr endstream endobj 127 0 obj << /Type /FontDescriptor /FontName /OTYJSG+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/G/H/N/R/W/a/b/comma/d/e/f/g/l/m/n/o/one/r/t/three/two/u/v/zero) /FontFile 126 0 R >> endobj 128 0 obj << /Length1 1652 /Length2 9224 /Length3 0 /Length 10283 /Filter /FlateDecode >> stream xÚ¶Tê6 ÒÝ%5tÌ€ ¡twK7 1Cww*%Ý ´tKw7Ò%ÒÒ©zιÇ{ÿ­ï[³3Ï®ç}ö»÷»` QQg5‡™‚¥`PgvN@\Q“=ç¸Ð4 ζà¿Íè ¯ÁŽNTàqG°‰ó£MÂÄù1NȹØ8Ÿ8_pò €@.ˆÿŸ@˜£@ÂÄbPäÈÁ `'tq˜½‡#ÄÒÊù‘柟f3'??/Ûït€¨Øbf(š8[íÍLlê03ØÙã¿J0¿²rv¶ÝÜÜ8Lìœ8`Ž–B,l7ˆ³@ ìvt›~ (™ØÿRÆÎа‚8ýeW‡Y8»™8‚[ˆêô˜á5;Éê² e{0ô¯`…¿Ø÷ÀÉÁùŸrgÿ*þN613ƒÙÙ›@= PK€Ä P–Ràpvwf˜@ÍšØ:ÁóM\M ¶&¦¿OnU˜< ü[ž“™#ÄÞىà bûK"ðW™Ç.KBÍÅavv`¨³ú¯óI@Áfm÷þu³6P˜Ôëo`š[üaîbÔ„B\À²‡<šÐÿµY‚< ˆ—Ÿv€Ýͬ€¿Êkx؃;9™øxÙÃì"À> ð㺗“‰+àìèöñúÓñß“`1s˜‚-!Pô«?šÁáÇËw„¸ô@³Ç ýúüç—Áãx™Ã ¶ÿ†ÿ¾_ –†îkIÉg)þOL æðbþÀÎÅðsóx¹ù>ÿ]å?úÿÑþÛªbùûl  ÊB-`þ¿$<öî®OóßÃøo%Øã(ƒÌÿN¾>ˆdöø‡óÿyþ§üÿý¯*ÿ·ÉÿßI¹ØÚþv3ÿöÿÜ&v[¿'ÙÅùq+a»ýßP-ð_›¬6‡¸Øý¯WÖÙäq;D¡–¶ÿi#ÄI â6W8›Yý5BÿÜÂcy[¬s‚üzkìœ Ðÿø÷ÍÌæñ=qz¼«ß.ðã:ý7¥$Ô fþkï¸x^LM<ÐAãÅÅÃðâ|\Ps°ûïÉ9 0çÇÀ£<€Ìý×òñ€š¿L¿?/hò/âÍþƒ~hþäÁ@.Ðâø´ü>Ò@þ€| íð‘Èî_ÈùHý>Áþ€DöÀG"‡? 7èø|äuú¾ÿ€r]þ…\D¿áµØÌÅÑññéù½ýÿÿ~çÀ`w°úÂÌìe°uuð§ëJQr7öí1Ái†m­v¯ÇV—[l”w,«Ž—¢ï»p—6%™/D©¼ö›jQšT[î¼ïâÔ&·[Ð?O÷ì‹ÖôR¢Q°kˆìx?8x¿°Ah‚o—cÈqpáÃVÉ#¸vë‘v¯é-ù2:·­ºSñBã¾dŠ=F3Z? p†!×4s–”Ù™•ÿÄgæâr?{ü'µ\Ü3tŸƒ˜çï½t׸ÞÜÌz.—ip9uÑ“é’R"\àL2z‰í&É‘Ì{}ˆÂmäæÊ{Ë48ˆ@ÿ,GÃl¸íßíe=&߉"qp¹ÉèmÞ¹ò÷AF=ñ”ú$^‹µ£¢#íÞ)Øl§JKÄã0{‚«{Ùî}=ër(7Y˜F 1õǵ­4E¾!rL&Dgx­›UëÃæâ®þ¹ ³íÄ2O²7±›¯NLO{oUeZøôb^.Ò•TÞ6œåôÎd!ã(#ÔÓO-dø1/±í_]GÏIi(nÜ¿~_¤(ódnk~ÒCWº5Ñì{4F¥özò•¥¦ >ÉqÜ…WùPÔ+üZè:T-äð†0©‹qSkvï‚;`÷’Õ}ÃjêÓ*wX¥¬[’=ÖPü«, ¾¹ç¯Iv]Óú'?>ÈRq܇ÜÃ&–Ã5« ¥ºëÙîW÷ú›µÚ¢ƒ¾³iÔÌR›ö£¯p iX “¿¸Åc6¿¥Uã‡yÅR2wŸÿƒ-˜¢C=:áÊ¿öY¶¥ÉØ¢Úm«;iÿL?Šéõœ§e]F¢p(½î’J}I˃өڣ¯éC*N__"ØYVU|Êè;Zt—T›šxÞá“Go+bѤýŒ¾aòÐĦӕÁ« €cødØ9F/»áS5£ùH˜÷äÓõŽåWªV•F˜ÓxT£oÀi¤ g±u9Âò¬íYœ~ÆÃû„8¯Hé«¡ÈA×v¡A,~Büþ{|_‘F”(3ÜTƒQ¹§«¤ÃoZkѸÑs¾vƒœÌSÉ`^¤q+u†™\Hš[‡EEæ9‘fÎJ¬ à޳{y¾Sm&LÜ´£À¡öw‹•Æ–ô[ÃhÝÍD÷~*Ða¸Dt!åi$ë–3ôÙÂ_ängÍ߯üžáUò[­ ©VƒPÙÊñó^ò›x“QcNn4ã‰2¤øÊ¬üŠCS´Oªr]Å¢/>ö® ±X&A |Ì'ßFˆ-Ö<…üh…f?Oœ#±~™íìB!ª¬îC´âWœGjXß‚ïÅ—lÂ0^f$_i´ð\Õ)_âe†Á¦aLO8‰MÞÍoÁó‚\˜ÑÛþeOÏc”Ï­dØYÙ~­#±Æ”x\^ªÜK4óãh[yð”ú™=gxg•vH¾Âkͦì>Öp±”¢áÞ¸Ø&ß­ªú·éL[Vó=Ü[{_’",ÿø¹wÅ}SͰ–Kû¥qrŽ×Ä;hÉRßìVX˜ù'âZ$ö™è²E’ àþô2¿á„!6ªè"ÙJÊ£Š.)›—˜Wj”gÕ즨l›ü{UÎï•wˆ+¦-¯/†g jëÇu}?|ó‡G¶¢ùÒ1‘#ë6ga/bØí•ÅÉñð”V"[z"ðÆXJË”‡‹3¼Y˜¾[¬ á`Ï•yµF†:J†Á×"!·² kú¹ÆOzÆD™±å!0d°W§oSp ¯ï~^tË¥‘ü嵡”ÝR„`þQ0uÀíí5rtašÍÇåñݶÄfPé2·ˆ¶ ÿäs³Ó–ŸË|Õõۨ6´]×–Rs9-f„nž­ì?ßé3!䳯­Á½&…Skßx~—s¡ËôÍ1Fu ¯w/ô§<©bM†9ºéHjk'|£KB„“†Î½•lþš•]ˆùr׫˜Ü„øå%o£ä7]f¹4i ªÁÎfŒ Q¾®d~|}3ûô½1=Pȳޔw!ëÉú«,2[=d¶Ë}7¹ÙÕÆ±8=ÂUÀ"¢UžÏ¤¤YºÂðr(òl1>äHP’¥„•E%yA/ßRж–uN}îì¦ßíS†N o#ÔõÚÊo­äÓVwЏ™z(÷Ê£’ ²9 ËhIxAÙ¶ÉÖ¯ÇÛ§ªÁ²wlîCJ¼~Ý_^§¸ÃYnLŒ ™ p\V©²†Ù І×7×¥RO„Ç_ݨ|ô–yÓ§s)ü*Öõ›jÝÀ…=ïÎÜžOjä¬k®sI Nû È~¥Vv¸Ð z·P¾d‚qý{2ÍöiF*ïûF\Š‚Z$Œò~ôÞóLì-£ %GBpjU0g><´µ=Ò³­†vÄæWUYmOU÷Ñ?ƒºÎÃÕ»e'xJôš4í¸¶Š®\£7qzÚÉ‘¡ßRe]URñÙó ë¾rt°|JÔ·TÉ((KløîÁrP‡K‚VÏŠ.¬×fÙÎ0‘ð%Š6â°è‹i;ö¥ÜS eLàΩЬõXy;Y°×ÝN÷§2Ù³µ#[¬âà¼4#º,!ŸDþ%~«õb~Õü¬Ç7ü*b•áSq^{®Uã¼âQïçxš®÷C8õ/DÔÕYßVv‰£lS'ý)×ølëÛa>ñR”'Ùpd‘ê ü­Ÿü£ÓÅd¤®_4ÃT^â.‘$ßüÀðàØî|‚;cñôuþìSäÆ5ÎBt„€À¼†uªl­8ûp|/=ºù,½HíÖ^å· oràÅ¢„†À®N¥LUr›µÒ½PílTÛæKá̵¢á…6Å’{B2WöÍEà Yðû)vr„€†daáÚט1¶¥Òz´™£â/é;ür‹Kœ‘˜ëT§Þã£ÇOñÔ‡®h”žuXŒß4ž§™H„ñ˶ Š¡Nç]éÅ㮬ñ•…éiÒauˆ^l?–³ló1<ªˆ%&\Ûùhè[:ò,¸¦¢¶‰uM=^Ò€àßHV©OPÊåM¾zÂeYZÒ[®VÍSeëô´™ºç"ú8Xxvf~fý‰ljjãª@Ó’]#Úç” —½X4öFÂYf®Úþlh£¾Ö•ê÷ý¯>„ϰ‘P|×ôN=+Â=T— r[ ü‚DoýsEóˆ äñÃK©;×6ÙÚ8×€’[Û]£}¤åÊö¾þ§®ä’xˆYIyÞ-à .šsúÜäƒÎ‡ H™/ÏÞ;…XzïΛçwI‚«ç­osgï]u$•›#-×áeI¿áXD;ÓžäÚøt௷©]«>“3›»U± «š…–J4ú›0mtbªc…“€Î•2Š&‘Å…ëšÖ”|1˜%)£êÌ¥^½êSŒ[ß½ðþ„Á«á2daªUin¶Yø³7 ²ððKä–J#GâÐÌUŲ´xN±m~"¯j›-HñuØ=z„Ê0 .ó|ÝCÊ-¡ÓÍ2s£#HUálÉ|^¢ %\¦¯‚´ïþå ¡&jRÝsXíE8Ìd¸Ì}fÀwï×¢´uˆhû²ðglt糑 jkÀ…aèÖqËuÇÁ·söÝéoÝW7ÜKÕcìÜpƬ‹6ýØfq­êê`‰=B µº×<¶5ÜúbLœQ› QÅ.´ªÏ½ˆ÷ª6x!˜~ü Ƀ÷;¢o²D†/å\/Ø÷5SôF³îMoÔ=}[ôn½É’1%‘„:ëØ¶Òp}û×y©É¾V1´Q_ã«Û_”Ò›ÕÔ|yQ¢ò‚m³)?’ÌõëÚPw" u›=­‹<3 ÔÊ+Œ{‘F`*›g|œ+N; 䟷y-”™„O¾9ª~yVÂÃTD]‚GbT4Æ÷ßYóÛ,~(av\#Îp¬#j«¡àoYï§íÊëŸ=žŽO¯ÃöØŽ¦îS§Ãžl@óW׈Î÷…ìÈX¿Žé¥Êe®>½Í³• £~ÖõÚFà~”7­1±3ç¥Nfÿ Ø¥ñËêðô†kc»õ"WArûÔ­ËþBIŒHÕK%ðÓØæ1zíèXß=$:tESõ`Ñ£«()R>ŽëåhFN3áPºtšÈ%1Aäªó} $óaCHÒ|ÐÛZ ‡Ä}ä{Å|‚’Õ9Sܱ´†éÓu˜ÝÖ§àú‹ÂV&Î#:€\^Cºm¢hI5ûåtÄhVæÔÐWÊ@÷Ü;™¶§lHå]¤‘,õÌ{ÙzªZ²Eí¢vµÀ“;®‰x{ãŸ`aÖãל/,Æ*Îßyø4OVÄΈC«t8ù»q²go]ýp¼½íJWªonÇ­ÌÏEVJ.ù¯.u3âxŒá9ÉÅÑ¡…üÁqûõ^©›Q¢ŸÕí´jv’ý xh£%]¶Ãén™)­¾çfôhtØjàÊi×7ó§¶RÊEø&ßr‹…w(~–âa“oA6°Èxè›Uá@£JtììÀ¨ÒÒáòãBnÙct¯"~À–z0ÈQ|t1é.™ŒÜŸÁz–8› åS…ÿÈç¡‚Ô9zû‡Þ~ ê¹Ï%?îr©9Û”‡k«8³f° KßdÛç Q¹™ˆÑ—%ŽBN_ÿôÂðÅh~Œéuƒ½|IòGVpD­f3Lµò‰Tʈ2Êáñ„ï“[+Kø”û“ju,¯ƒ–ÄõQ|cþzÑsjòR:ޱàT“½æ¼ 3šBøvÄÜPÉôúqèáX|)Fh ñppW„+þ\aÄùËP™x¢VîgÚ—G‘&7ê2€O7Ý¡—Sà÷¿•ïh+‰MvÌÁ8zè’Ž_¥¬Àïw{*Ëd÷¤$>Gb¬%W)QoÀq¼ý)Þ‘òdéR7Mè¡<ÚùZz–|*þ+0JÙâUPñ‡ ¥yÊ.Å!­(U;WÜO…ÓZ·tAyÒÐÑtüak5»ã +ÆÁE)}¸‘wª3̽ê8é5Ç B'ýINÇ?#y¡3ifv×ß­§¿FG6w¬zìánÞI¶²?ÈK%ñ\š`sÔÊt¹ü¨Jk«e¦9lÌÃà^ãC¾Â/žï%¦Lþ,!…¸ˆ>ö“Å~5ϳ5SÅÓcwT°(VùižüR:kL“ żï/ÄSÓþ¨cb|ò±0„%óNßþ6p"lçÚÃÆïøºÿ”1[¾dæ{€£:v4wÏuÔñÆ‹eAÃ*•ç£RäËoñ•¯ol(½[õ{©-€«µŸS ž]”MÎy%Œˆn¡)¾Ãa&!ÓJœî ¥ƒSF½d&ÏÔćuIGNIYònÙÔ5„;7‘”ƒq‹`u+Mdk‰ŠØ,Š÷\{2e£ÚŸëwEÜg bÌêt —¾šCo(IÇŸ·\fïíÍšÑÊ÷™g×E¾ïõõ†ßÆE9!Cåb´@c¦ ÂZØ^Р o¾W?.`ÍM‘ X õçÊŒÜòŠŒ†Yª$¶BN½xÄJ²_åA ßáæ²¡ïq(wnas®šòf°Rx™|æÏ½¶öóbÕG‚Üs}¾•;Èzù‰÷ªšÅ^ÊRæ»Ù)y&aM*×êž8¹BA~Þ( ñ)\ŠËìËê )û$;Ì(§TaÁÌBÓùâêÉí9Ío0é®à:EwdJ‹žþÀœzN·˜­vî+8„–}pä š’iá•1Ð9Ál Ê©sŸ$º;úö¬²ä«p\8TpãЙ×G0Âjo:Þ9†p"˜”Ñ'w;Y¾ù\Dfe‡ö„RC÷Š?í¾PƒÚmF˜*,SóFŠõÙ•Sñ:,Ãݰ{Pšó.+Y¶ÛFhaYsKjæR½5jœ¼{…ž'C˜¨„ÿùë˾3È7ìgídÛúC¡xMË•Æ[–5›FyÃSØo3‡Ñ憎F²â‰?˜ Sa7É"{_†®(ÝR?™¢Îk´o¸ “ q›£FƒýÇPqŸw™óƉ©’;M¶¿»Òà¸=¨[E^¿p¼@lIñ„M©[‹ñ<Ñr7Œa¦²,ŠRé|ËSˆp•®¦O®ûêèÐNÃb\¦%¿¬q¥œ‰xŠ£Èà^„(©j®oJý =V[#‹ÐÂgú 7´ ñkÖãlí¹aOne­g=&B nùiEÖ”PQô>Þ[¦°k…lYÀ µQ„þh÷â”î…pww=ËgÆ|aïóbÞázo^¦‰Èp·Y8ÑàÃSHGëïÜî:Þø³’¢É(yøõ}¶Ãåø"Ú¾/ƒÒ¯ÛÕ;Ú”$.åèH7ÑïøP\ô_ãp¹kQ}Q øÂ'"¨èqŸõãAÝ9å]kGŸ£BìÓHX0:9ßIOÚŠ¸§GB]ÃX~DõqÂkª˜ÜàaŽ5I\þ•F7ÐÛÀÞ©¥éãCdÉТÊäó–õŠKÀÛcEE¯w¢Kbü”Äûˆªc3/6ÚB_! 'Ñó±áªÊT´—ÚòÒ¸èö÷$¤~Ô¼c@4Œn¤W$ÐCžànòd[cI~ªÂ鸜M¹YyGùP3Škvž¼öæÍ_‘íO=zÍ3T7£Ê~ÃÒ¼æfª&H&‘”TiûνšgdÄ·…¦St[× ò(ÂqòáùGõ®ÞÁ/ü^m®ÊºsQÓ™Ð3ù6¡ÒBJ{OÍ  ÷žûã ãz§Í-Ïè<’í \ç`UÎKgŒÉø{6Ö1EjªXŸL–^4:”9¥æÉåY^?ÖȱóNoô R‘ßnM¼|!Ã÷í"ókiÈs­û”þí{ZíBtq«Év‘âM&ÉÓó:.½ºpàœ%z^׎K¥» Ç3Us1&Œu~jRù¼p€žcôOábMm˾Ê9†Õ@XÅj烮–Br/S* ‘ƒ‚µKp}¢Òæ=)é³}åß7…ýÀÐw…ŠEÇ|W8çøÔÓ_~TËZ hŠ’ýZ»ñd¹»LįZY®Í_5ñjíãaÜô2Qv¼wnÛm¼UÏMqÄ›aìñð;oõ_i@ùIâ—ONÉcRSRøNÅ}áÉm¹Xµä>Ĥ»½¤rýùe37|ÜÀØ*²äñ&° E<ùÐ6œ†ÒÕ.f9ø°š(gRÚ5kO À £-ýPö®NÑÒ¸Ÿp½ÎAÅŠFy¿1IõÎ|!;l"ãSeÚzÂøíÕyÑêe«<ª³æ[î:Q5>áèïß&ZèM®ãülÉýê]F¢ÐŒ¬f€žçÖ†LÛÛqt w‹åÔçÇ„!<ùj¬­ÄÎg öMôl)ß…»÷ÜnœvÔ»Æos²¡ÓìQ˜ÇŸÓŒœ¤õªDÐá,I¥)V/üßÛ»lŽH†‘r4[…2ëw}šqa-Ç•ØË¬V¨ˆ3S±5¼þá¥1O#7r¼4ݳ;¬AÉ$ *Ú÷yÑè>úZZòF™¢Öu1ÀfPüV—cUvtóôµðv¥»Œ²ù,Sêi# ^Ì,âŸýBz4šèR‘ߌº'µ+¾`¼gª‘áO»ù%º‘^Há|ñ€]A$Ætlµ«“32ØÖVh®×Ε6OQ—¦ˆó#P‘Ùë¬,H1}âNÁÍ×!#S~.¦-ríï¸ï{ áôû-Y=$1ão=|i/^D«0ž}¥À¥]½O°:"0·dT2èT›^²†Ò}"Š=Ÿ~™Æ¸äëóþ8{.³‚8&þ@Þ ŠOCªÊøn‚6ù2Ðdñdr™U_šÐOú á!–tg£vÈPqñQ° ¼W©´$éÞãœbÕžÈi˜Ïؤj&Ñäà˜ÙÚo6‰ÜÂd9k+Ó½©ãÖ `ä‡JVn7cŽsAJGÕ¼¢eTP@ªîÈÏë#<}Ñ8ÙÔ…=‚š að¾·#|Á*aÓÑà  8ç¤ÊéˆZºXøNÌš ý/N°8çoù7G­·Fh™  ¡5%v[·âçJEù|=W5—%†›>º™úTé€@ pš(Ž”›¢•'½¤dwdƒbòAÞH!Yæƒ@›à4¤zf§ˆÕÖTWàe$b,ºƒ¿Î« €{v0ŽÐ;åÁíXÐq–C´»€Þi}Î'5…OöD]›«¨Ñ2%iJߦB·oKº/èÙ.ù* ’E˜+³£½SkŒ—}“Û|ô =F•3ªŒ4}¾K÷]w„ú6íŸè’’P=R‘xÈXÖ€Ò±ò¥ê¹a¨Ü;’èT•!0+Û›@Eu[óËÙ¤î8–¹lŽDãBö'Ÿ„½mò|RZà, »ÙÚ…#â:oK{ɪ6ŽÅ>ö‰šžÚq–¾ÈÁ¿zs°j"Â¥€!‰§Wœy‘ÜÍ—ÛO«« €Ñ%«‰a¹Û$¶Z×€ÈCÆõ1Z—­MºêpªÌqùXYäÅÙ»úrcÞsƒx·”…ò6ƒî¢i× ¢žÜ O»ýûú _à@ãpGAË6oø»‰RŸ-È„3‘²º=j ‘žãŽ´ž[B—©ÏxLx º¼éá› ØgjîCLãc©/‹é‚K9i޾8Z’'öŒ"ž/E"ð;Âa` 0[ðá r˜á©D >ÑxÌ¢Ø-¿]­KçןÿÅö"Ã9Ï"÷¢²3øÁûçunïy–¶Ôчp§0'ÃGÃ5lvúî.¤£NT,3ÄáÈåëÝDµÅÅ"å]â%¶y–Jô'yÄkÙ·êàÂzwžä¹ž‹|ÏGúÂRÓQKç €Ba2ä­ ‡è¦/yÈp¦ºQ©yè²aýœb¶·^¦ü èɳø}œi£užµO’F„7.xV„ÜoncHP-O@cê S$¤èãÌmÚ0œD;¢Æ~ƒ×ÃÏœ7CP;ð™B®Zw4ºÓ¸L,QžÀ¿¤Ýx÷qNÔÿÍ·žîö£¯D”×¹Ïüî÷½Fyžq§´4ëI «3&‘NG×;‡Eú“ûÃ|·ï@)ù8A94M›Ûz¸ K éÈjc4õëP¦Û¶ü¤UQ¤¬Z¿]ð„†§> œ‹‚ƒOžý±"LHŠn p·ߨ¦t iÕÉŠàE;alÕ× }ü‹Ø=!¸“ŒêpK4_?{F£g›ºá0%©kÿÒ%Qaa“èÆs¬LýnæC߈$¥›÷b˜JðB“Ü?ë°€}þ¬¡®è95hm»_C8§áúBÙŠz&–Ü€i=Q·ùêšw<{m.gYPœžÌût2æéQ‰ÐäC«‰Ò¯ò¶"ãûêÜÆIVD2E®¸P¦c¡¦åæKzNÒ¿ÔŸvh}i_ ˆöwöñ,0*çãx}ñ¥X|n£E•µ±è;}9ŽV7ð®*.õâU•JÉ¢”;pÍ;³¯wci¹ìîY%UµªHÅÂG8ü’H© 2<’ŒÞ0›#ìÌNè¼æÙTÚ¦÷¤E7'`QdútBon:âOíàÇÆà‹™^oå·/Q(JH“¢½Ð¡ VÁ´£7i¿õµ™ÝMÙkÁ¾®/†·+ ÜŽE ó¶.$fw‡<%B¾>­ô7¡ÞÇ—À{mz ¯!( Óµ2Q¼%Û3ÿçŽ&é]í:]UWÑ!òUpW‰Î_ë—ðQ_ÓUªi:UOŒR±bnâXäa(;9 ^›PSû5® •1é<­üAueþḘ‡{:¬ýÍbHû½(¢ŸÂy´dØ%—Q.éÙ³~"{Uó‡-å‘¶íM6øèšdœˆ·Uý-^Ow»_Zº“Pçí|ùÉ"ÚYP¾Ó[æ…>H0“'èÒ`žªÉ& I &?²UçÄ(óó©n¿’^ò•Sô«1%Jåï[ý 12Xû†|H8ªA‘°‹\0‡?ê2sŠ$_ß×ë2R£¬Ô¦~¨ÅT_r•I8Ž®ÂâïÕ<싽ƒ¬k¶÷ÇJÓòþ×8ç… endstream endobj 129 0 obj << /Type /FontDescriptor /FontName /WTZVEE+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/U/a/c/d/e/f/g/i/l/m/n/o/p/q/r/s/t/u/y) /FontFile 128 0 R >> endobj 130 0 obj << /Length1 1379 /Length2 5960 /Length3 0 /Length 6894 /Filter /FlateDecode >> stream xÚTTÔÝ·¥KºîAB@¤»S¥k€af†n‘ni¤AZ@¤CZº¤C@@”î7úÕûþï­õÞšµ~sï‰}î¾çìËʤ­Ç+c³) H^ Ÿ€8@NC÷@@à!Ÿ€€ +«> ýa%`5Á`Tü¿ùåà K$Ê&o‰D…iÀ UWøŠŠ Äþ „ÁÅò–n`€@!Xå`Ξp°=Uå¯%€ÃšåùqÁÁÖ–P€†%Ò䄪hm èÁ¬Á ¤ç¿ 8Û#‘Îâüüîîî|–N>Üî 'ÀŒ´è‚ ¸Èð‹.@ÓÒ ô›+@ߌøÃ¬³Eº[ÂA”¶A¨W¨ @Õ詨´œAÐ?‚Õÿàüy5 ðo¸?³¡¿“-­­aNΖPO0Ô` †€ZŠê|H$Àjó+Ђ€¡ò-Ý,ÁK+TÀïƒ[et–(~²CXÃÁÎH ùÅÿ ê’ 6r0''‰ øu>y0dºuOþßmu„ÂܡެmÁPÛ_l\ù  `WŠüŸ(Á?6; , *€\ k{þ_àúžÎ ßÎßfÔù}½aÎ[/Ø„ú#ðFXºH¸+È×û¿;þ½#6`k$À d†üƒŽ2ƒlÿØ£:{ŒPƒüúý½2EÍ– ñü'üwsùµ”5´ ¸þÛ%+ óxó>ð €¢QÔÂ÷ß(óÿ‹ûo«¶%øÏ³ üƒ¨µ…Äþ €º»¿h¸ý9Ê…ðï š0ÔƒÿŒ½‰€°€5êüÿï”ÿmæ¡ücÿŸçQt…@~{9~¹ÿ‡×Ò ñüÓšbW$J0”. ÿúô‡ˆ5@6`W§ÿôª -QÊÚAþ¾D0Bì²Ñ#­íÿ ¿z€‚‡€¡ müë™ðþÇҚµ#ê)A :õÛBIéß% Ö0›_šXÂá–ž¨Æ£vÂo Jœ6 ßs àçƒÂ¨Šž/À'øÕO.?ÒöËHð/`kW8%¶ßGUýkÿ[Ù Èš`vf-ñÒ¡úeóY• ;ïÆ°äëÆÓN^ïYx‹ë1ngeÆ‹%ø‰LRÿGÒ/k ÇÒsŒ×ÞßjqCuš.}®ÌãuÇ6š>R÷Œä“©éfÀ§çÕ—Þô¹vñ1 tÄl@oSeÍvq}D¬KqæÞ¥äQÓ]2?2½¡³Y)¢vçªdœ7Ú Ê$°h’5Ç*sІÉË€ÇE~àA2y|2Aþfä–Q5ž›Àw7úa·Ñ²`Ìù”×B™¾ ¢–…Öˆ†ó˜|pŒÍ[vëµêÝïâ‚%ø`òuËЊÓ+ d‹ÃkCS÷ ¾ýÓŒuDœƒ–†“R%2j©Q9Á©ˆ)G(óà‹ê’‡ÊOÑ+VøV "ZMlÞuh7V“Ò‚‘ØLú¨™\[_î‹$÷¨åiWqSxØõ-k÷S©)ÎO‚KÉ/{~%uŒ©T_3•Wá e|ñAxm~íþËW·ê©t?{‡¢õÎTØV‹tMy3~þÉt8>Úm˜ÎIÔšÖZTõå2CEÇÇïd« {Ö:™9õíã GÌäÈH<0^Ópè®y&ñ´#8¹•—"%ÖœÐ>rÝ•úúD9£…9tU3ºIâ»ÕážE´QgR{¢U¯Í2‘x—¥¼þ ñ(|Ï’tò ‘ý¡kq%H‘"î{ÿ¶òáú3‚xl" ·3ÌbV%̓֙î»<ã…-ü~£á§Ì默ªØ¤qZ‚ÍÅqQ¼¦*J/¬×[lE×'  Î Ý‹ŸËóÕß|í!zÛ)}ˆÏæAEÉ@½TCþÈžà%Õ¬·e­0ý’z@ï”;»–¤VÑ:µÝ™öê»·x±wŠé^T¬¤/JÎÈ^‚|®Ã´’ù'¬öƒ*iC[?_îìâ—ª­&˜5Ôw…<š mzÌ©QÞ²öÃi +ºXbðëëxú’r_- ©‘Þ0å×ûNÚA¶CBU“œ )¾áéÚ…ý[v‚£Õ ]ôàªâñðvñ÷Å\g¢dC´¾?£¼ëŠ“QÑ ƒUµž—<šÆ$AnÔJÀ²{²Nø.оì×@ƒ»e”…†Aÿv.id¯$Ÿ× X¾cÌI ãápíîÛ—ìx»ç´a­y «Å†¤#ܺ³tþJ×ÎYžòwé•GÜ<¼È­Õ©±rOîÍ[[ÆÉïuQ…ã×+nkhÚqè¡G¬B¥&9±v¥$š¥5(óöd5—Ê”ZŸÇʃIv`D˜PB"íŠY½æzÏæå±¿DÅÚõï#3::)Þ˜ÑJÅ|곌¨Ïø!zzþ ÀcÏm«³Å©1¦åØÂ¡Àºß±–ÅU¼G·„r68¬ðÕ ‘´i*g˜ôÍãÝæÕº)>³çlïRæCèã`‹tbˆ'ùDçM­ñ•Z½hU&æ·å’YaMW¥1iZÐGt?uí¼–o~=@—5J*Ï¡Ê4pè3;Ö§”‘X´5µ—ñrÙQl®z:ˆòä™{캘¿OŒ›‡×ê¡{ƒØÓ¸3Q ßÌ™y1ÙÞ7¯©•¼úú‚›¡‰·÷ <¯õ/Ú‘3—õ1á?̯’…Š¿ZŠŒ#ŠB¿R3áLj¥ ‚g¢XkL–eá,qMHœ!aÙaÏ¡@×|gãý=ˆc6DwwÝíg@¤P”¹G0yó–ù}–{8†Æß/q•®³NÕ*/á&îÇ9Í þ®¬ûæÕiŠDfw1%óÖÑâ·(“&3ûBäBl[RXygæ?´Õè>i^ÐÁÄ&AJ ôv=n•ƒ×^Ñ,ï{åm®'ʧpPœ€|+wÄiðFФ‚[í¨ %É;涬N˜ƒG«\ôµÐMÕqLZ (eÓÏÆÊpÆ»4†5b’‚a¥Œo<Ô[#ÃÇý\ûï›5™Í}%B§åë/‘žøp?.²—v†Þ“¥ÂBgœûå9rHyAk·ÊÜÁ´YBÎoÙWo+î¶ÔvûyEzD‰´ú;%Sã>;Q4Œxu"§ å¡rAà èTøÒž“öY fýÔhh䣺 ^†È¹í×Þk®¸D‘ÁÖy\Å ©9«¥^4ˆaÙÏé0™t~×/Y.½Ã7ÛU±÷­†WVG95øä0ô/çmªh„˜¶ ›SÖAÕÇð#·I#aáx–”ÆÂÞÓn¥|œs·ÛyH-…ßö~ÏlX•±0\=Ô×OÿÀÍÉAnz£ÔJ£‹\Ü.ke¯£3ô¿ËPë%xxókâ\ Éýò>cžN§¼BC¼<?2îØ+žx<½ Žn)my패Æ-âÂûRƒ„}Ÿâ:§;vn‰ØÛÃs؈ð询——Œ•Þ•qFnxËl¶ç ºñ0Cá“›!Nj*V®¾Ù¾Ú o®£TÔþïi |+6ÞœS+Îx²öwñ¸…ʶb] ðïpU—na¬ˆ_8%HmÀ,éušb¼äÕ .£7MÑ/;²#H•`Q S…˜y–]ÀÈaÊäùÎ ª5Ý´«$;ÓˆƒðTľˆ3fW*Ž„¸ÇÏjÁãD]ZÎÚ%ÝÔ[^EÑ’5ž@‡6ãò.ŒV§ÞPãìš#U3K©\zS;pU²r^9ºöÉzV?à.©z TÞU·üfõI=ðj#<5íGÐñFϧVŒU¦œ:Ñd3¶PÜØgû@Ò dyªÄ°IÜ—¨“Gâ;<ÞaÕՒטª$ A‚ÆO+ä½å»E¿41ˆuœÐ±«,fŽn\>’ÅÇ ÜÇØJ¹<3Ý#æ ÂëKƒbªu}Ñ ÷ûާ¦'ʉ§ÖÞØý\§í0' w‡®´yo7ëÈ|À†b½mP²KTQ~eŠ«@t^E|óï6̼ý°Ð,$Ί7`²¦Ÿÿœñ¸­&»~ùu§fƒÔ2Æ›>Â=¢möªOæu¼iúlXNr&nÎ+ g%Âu•©æÓ´*Dd·|®2šw?Æ UŒ!¥¯¶ \Ór7-ž/MR÷5}’¹] 8„æu¹¬”µÇV( ~Ïá)sªÆXS(Ú©{’4qU,ªrO&yЦ4vTî½6Z‘-e81 ™Çã¬}¢Ÿ¸~sÇÖ.KBå¦e©#I*—9u^vbzBÞs´šP}Wã ÂO·uát‡Ï6Á=ßxâ0bì É‹¯U”uCTVjû‚WûÍ—fûfOO± d E+IܨÍÊ,¤¿Q³˜#S0çHvœ¶ù™òñ mÄË ¢²€Æ4@™Ë?6éê„ŇR3±=i~m¸ØÓùtˆ¸ªÌ®X=_à Qî„Kâ‹Ã@·¼Gë¡ Ž+_Þþ`êk£yóiÏ× )jôÓ7ˆ¼7£v;ËÔúuá7¦i¿’h)_6JR«gù)õ.3`…ȇw1)<⮇cÏ/D¦ ŽDskä6¸ÅÕâ'wÂß­œ/ø)Ú`iÚ•ñ”†7YO0Іf‹_½ßY\ïžz®ÖÜ]ÜÀ)¥  to‘ƒ`ïm–”½Ët*vèØf±–»›"“ÄL’¾ïHlNÿʈ1·ÁÑF_g•F¯À€5ZsÍZÿŽƒÐVÕ+|pÍìþôZö¤šj<ŒƒDº€ZÁ¡ØË—ÍÔ½A¹ûÏɉ§CŒêsŽ®èƒ&Æì‚m:ñ Ä&ø×|rŽ& GZôÍÉ©Øî±˜§—QKS/½(†•f”V!™}0óülF|É’-ÎAn&°¯²»ÀuæX­Å¢¤jÀõc öÜ“ÿ$ÃõÂÝRÕ xa ð}qWzgå:«=ê*ØáshHFu;H×~ƒ—$šï¾=e±D´=ŽF¬çs™ue,ÉÈI·Çã¸&ÂýN=Õ¹æ`½ëjÒg¢“ûúûÇxq’Åè"fÃÔ”›|–jœ¨cúÛ¸õá½éÝ×ÒÆˆiG4ÿS!GÕ¦iþ =­’èsUf§¾{û^ÞÀœlºèWïo°36¸0±ÃT¯Ôög|°8Zs¡­îrÓõ€>¡~6 óÖ¥2²E¾Êç1åWVÆ ª›Š’hD¹˜Ù˜Ð†‡3ËÈÏ¢ÙX~x+ïÆJY@ZHßt–pEI°ù¸…hÓ4âžµwf™œdëéá)ä«Ã·ø®ÃºÆ4³è¢Ù¤-ÐIÇõҢĎAyǵ¯T…ôDR'×%Yg¤û/€[²îôB "Ð[Ñ[[ö™¸ŽoŠ1½(949²†;/K0S-öÓ8ÈpšJÆ^?‘‹HrÉõ§/©gÆáQZ!/á¡ÖÉO]ZO‘RÆ*`ÆÇ.6+yÏÝ÷OHÓjk¿P{‚¸¥KÖƒ,| ǡ܎] ø»jéD£ÜWˆF7Ç%ºByR;D#qϯŠuƒV;ÈçÝ£›@Ä5Î*_NË3\Ój°³N>«ÝÓJWè€óJQ|°f!Îö¾±ãwo‹ §W3Dt"–l#‘w©·m‘7nÌŠÔÚ¾ûP&pczùi¶ÎsKÊú‡kP“ºÛáž>¾\¹ aX*õ—™KSQdõæ•T³ØK|wzP®S_˜ÑÆFàžëCîÆi9ëÀ’c£ â±ÈI`›l—©Ä&IÝJ6‘~ØýªÆ1ßÖÈ…ÀæCo®£¸7uL¸ZfýÂÛD…í"K=“]*ñQ©N¼=Ò‡óŸbãÆm‚hÍáøQšô±r³V¯S¸óÀ›þMé¹ÜýQg¥sP2WßåÌ7QQûfÊW¯äßKö›cfáù†Ï6|áF<”Z{Û?¨L|¬çùÞÄÊ ßs¬ÝÚcÔ®-âóA/{\ùkà8r©%_àÈ£Â'Nÿ¤‹vâÁpß|Ô¬Î'úJ)s€«jášÜÏÂz§‹ŸÂÈ1Pì…I,S][ÕióÍQ3¾NÐ-­¤,,l£Ë*_E«¯’btó³#ÈÁQ@Fôä;©¨7ÿôË;£ôI‰¸ÐŒ/Ú§;; ¹åG‘Ìz['f‚Ñjî¡n“ç2*‹ã³’u/;ïa€”Š}gºæñƒfw-ÇÕ_°‘KÅ ð" 5Ö¯3øpÊSr[¢½ÕÔY–L4NSì r¬­¶rãšò–-Iá'ë&Ÿ Þ…ô¡ËæÞÒ‡/ õ3W|¿¨–Q®~«À%»íô–þ‹ûÜkžþ*{ž7Ø6y°Þpß_RÊNò¼ÜnÓEË~“|¨‡¨ æÅ=r(améé[™¾œÙê„»l¼Q­Ê l‹«~QEÒ¸Nüé”v÷Ty7¹"Ðâ ™žOÒ1»%“¨ñÉ´[Ÿ¬›šX·ßP%»Â«»õ“Â¥…sY1B»P=6ß½AEõta8Ð÷ÙVf“”Ĉro僶—‚«ùÄV Žg8 Ø‚tðÉw1ðXbhØD/¢¦ ]ö‰õ.Nw¾ó$îúâá«¡üáÛð²È˜ÆtªñÍÏ=¦0 ê" ¾·Œ’v8ÎŪ¿¬^Ùà3½ˆ}ÍoŒÞyøä lÕ&Æ4SëI;ޤ/gémi ÃY¡ÝSˆ4O}ªÿÇšb¬‚òxº‰„î–xüeÂeÃÊïÃq®—k"oA…ÝWþûJ²­Ð±Õ4Ã3¯´.£Ò@GW ØYñß: ¥ìaºÂž/¥Rݲ»ên¤Ùk÷¹ÛÛfqI9Òl£&¯iœÍX¹î/"Ð ô ‰M$ñ¸FHl©bpâæxh™|í™R…–Á­^¥aØÛ,ö46Ũ#+Ò†QG-p¬s&ç"²(íÓ³’¡AÒ£¬64o«•èãMh CæDÏò«ÁóŒ>´+rìZV×f#ª‡Î,%®WÅÃ#É|aê<*øvH?èúÎuA×ÃÀ°ÆL¶ïQùX5©n»5]”…aEAÂ#• +¥ŠyÚ pO‘)îã û˜€wu•O[’¥˜‰«A°þ(žã«ÍtÐ2 X$ÐÝàüŒpYÏãgÏþÅ–ÙÎ×’Çï þiN1ý~á{&^¦”4…ž«Ÿ•}S?ŒîÝdø*Ö]M¬ÔpÉ–*¯'ßs¯ú‡ì}Rýc´Nìâʵæz®;¢nЀU¶—wxsZ*1±£Yð>”ð<ÿ§p]^Ï¡~m(=ÚîjôëܾÝ(GqEè™}ëÞ ¶“§ñ…Èà§lé‚"ü¶BjIYÊ5´ÕÔ,á[óêÅòS=è-¥o­ËRÚT˜N£ÛjbUú?%XhªAõéXXŸ2ÞJx Áê} òпV“š†#8±~Ú]ÓžÚ ë1.ê§‘ù/^ýtí endstream endobj 131 0 obj << /Type /FontDescriptor /FontName /OHMPEU+CMR8 /Flags 4 /FontBBox [-36 -250 1070 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/two) /FontFile 130 0 R >> endobj 132 0 obj << /Length1 2585 /Length2 16764 /Length3 0 /Length 18267 /Filter /FlateDecode >> stream xÚŒ¶eT\Ý-Š»[pwwÜÝ]§qwwwHwׂ»»»† ävŽ|ɹïý¸£ÇèîYU«ªfÉÚ›š\EYÔÂÑ (årcfgaˆ+ª+hh°³ØØ8YØØ8¨©5lÜì4HÔZ@WGÀ_6â.@S7°LÂÔ lªèȹÛØ9ì<ì¼ll66þÿ:º$L=l,Š,9GЉZÜÑÉÛÅÆÊÚ é¿tæôv~~^¦ˆ:]lÌMAES7k 8¢¹©=@ÝÑÜèæý?.èÞZ»¹9 °²zzz²˜:¸²8ºX Ó3pcΠ—¹5ëï ÞNÀ)Ù‹Á<ü}–`*@K øÉ×ÕÔpsqúûþ­ø_„Äΰ°1w˜­l@H¼ƒÅ@Ëcð¸ØxôÙÀCÈ`ûýùçŸ!xÎ,AöÞÌÿÕhVmU1MÆHÿ£sôø2s°˜989<ì¼~€ÿÿ:ú§ÿ¥ÿ/©Š©ÍÒûË¡,ÈÒÀÿoàòý—‰Çƃî?ÛCøßJŽà±èþl7›9ø‹ýÿyþuäÿo~{ùØ‚ÿ;')w{ûYÐý×äÿcaê`cïýð`»»—DѼ* ÿÛTøïÝVZظ;üßZY7S𲈂¬ÀÏÌÏÂÅóo±«”ÐBÅÆÍÜú_Ãóßv€#ØÛ€€*Ž®6¿/ 3û›ò¼ævàKÆÜ´©€àûߨ’ sG‹ß›ÈÁÍ0uq1õFb77À—¼²@¯M9€•äè>3ôX:º ýn-7€Uô·è߈À*öñXÅÿ >«ÄÄ`•üñ²X¥þ v«ôÄ `•ýƒÀþ pÅ?AéGPþñ#¨üAVµ?Aýâ°jüA`~š8žö?ˆŒLÿAìàÔL]ÍmÀݰ·þ#çâø-…«ÝŸ£àTÍþ °‰™©¹«½©«õ)¸ f.`1ü²tû#çüGþï-ùGflþâ‡0w´Æ?™pý–88ü•3xbX-þœ`Žöö¦.Y€³øC<#¬Àÿ Êó[ïìÞÀ¼€óOŒ½©Ã_^À -ÿx[XÚxüåö·ÚÑýï°`«?AÀz«ßÏOàß&`:ªÅn”µ·“5ô—Xfó'oû·Ïî/®×<àÂØÿ^œ?zpuÿb¾@Yÿ„âûîOÀ¡Aîf¿¯<«¿R_’ûtüë;;˜¨Ó58†ø) úŸþs±ÿGú¿Ý߬Nà)süÓO.pìÝÿ"~/auþCò7rºþëúø's®ßBG7 …™ý_ÁÒ¿jϦ÷Ç-÷oôø»ôìàlþä¾ÀYݬ]€uLÍÍÓñ¯à ºÿÁÝðø ‚ åùתO{ýÁî½ÿ°õºüÛ÷ÿ\væî.ಹýë¹¾ ÿ‹ÿõzÍ‘VÍÃlÂ:ïëD‰<™&9¿òhÞ¾º“q!ÅÛCî±@õ)áÛ•qüäKÿ ¡2f-\£­ ‘D$ÏëiÇ/ÖÅ…Ž%MxÎÒøVIå;ÝôÛWÂä8üÌ'âÞƒ2—ä•·ºÔÂâXêޏ$÷zGÇÎÊpD¤•…ÕˆÊÇ‹ôüx!ß”eìTàæGº%ØlC"3‘å¾´Ì<ÐÊé!·œßaWwa™,,ö‹¡rÎGH#¹5|7#Ò-çèžøÂñhÝ%ÿ®²‡©8&Ÿö膩xänE:%€’JÈ…Wïs À½/­DBjñb‚£ã§l¼²¡“§ðÔ*žŋ(¥Š_ÖŽ™²:‘ mo='¸}µO>âI62n"@Ô}ZHrÛFCÒÓª<¼2!ú@+KôΙțê_ø1NÓåŒËï,âHJièóu²·›z¥íÑ®.˜÷Ïzê}ï­:¬ñŽhœRœagL.×ñ9Ÿi $õ˜â4 ­&xùL%”‚!j8½ yD0ÿ‰ôñjNŽXý… ׿8ªy÷«ûÙÅ%ÊÀœ ¤»^/Äk…è8w'Œp ²yf£ÈáÃ,ŒÅ-ù²>ޡůsô †Nh&ŸÉä›Qù*Ûæm|öЧóÖ %žmòÅd±T-ôeÁ^*Z3 >,üá,6ª÷©†y]•—Aæ`YW(3C1y3-ñZ”_Ó?F/ÚˆŠát´çn,Žû‡˜œ8‰'Ò˜¹öl…¸w2hz‘ÀLD™8ˆ{KcërïP¶ auNÌÓŸ?Ö`iw,GÙ¡q¨µ{}VëÇ{´‡YÃSG¡t óÍŸ¬†sóÃ,Ôøê,óö®C TYÝÝ9\hl/—¼ä¤•côQ?K"˜±¶}¬°Ý9¹/;)¬¸S4Sˆ\¾™ß6ÜdÖÀ•úBsã#Ö´ž?A°J¤ èéÑj<ªŠ+r åû½Ï,†QÎ}ÏëdSTá:†@×g×&JHJ¯È‚fxßÛ¨¦k4Gc»åUƒug˜ñk^Iü×c¯ó«¨¾˜kiÈÒ×Væž‘;bò§WF$·LÜ,³ tž¯!6ô£ÑÐ…d™2‹zÈøhmü.‚ ¸ñ¹¹2P«ò¶ °8·Éæ>âXοò+“°‰ã‹”E¿Î6)œÏS-}­V\¬;,j6®Qu¨;Å&±9[=øò°Åö¢´üõF©«½“ø½HËKE/7BITœ+e–‹k¤e—øu,š‹þÄœÅÆè }< û¦¡±Iƒ->ŒŸ‰á"œŒHNÅÔé2H(sõ>”+µœåIjÐÙ­jØõÌ-d ¡ckÈ–«#»5•ÀÁß²Sž ‹`¼‰’Òu;mvŸ_¯ê ð¿lÝ6íd)¯Î.õ"È~OÅ\¸ÊE06£{wÆâ#Ê@¸€U˜4ø¸ìa®sœø ‚¥¥™0ÅBê¡¡ßsxY¿-«òéj‹®0^ÅŠLdõ¹lwÃZNŠë¼¡I ÆÙå,Sõ'æ%±VÜ¥_^¤3¤/¿š|¸àžïøÅ>9a ¿ÛžóÏxÞa4¼åâþàŧO{QÛW¹yø ¦žÍå¦ï›Ÿ½S7qT ¾·RÈZF@oŽfz—‡Ú˘¹­ëXÃÃz6‚Ô“¾~­Að±³QK;µYÉó„±DFý©8…Ç;U¬Ÿ9ÞÃÆ%·ëY´£²älŽ&‡ðW4Íðj˜ªÞâU2žé[¬o *4ôOÌ!:1,’5Ìã,C‚"I?ú°Tæ}’}' c4ÓÐmü¹Ì­™«^º‹Ã•¬ói7TáE½Š?õôŒ‹å¢´úÛ±y‘h/ÿÌGµd˜ä É®^ „a¬àÐN¼…­hÖs7>œÃø$ÞéD[gV4eú‚?HEÛèáõ¬öÀ‰ZË„Ëg¬‰ÑºzWϵðä’D!¸nðžqÚöê•å¦`.13\õî:a(r2\7KX–‡^ÅôQT63pÀæB3‰ª]W`es3oWŸe¢š­ÍµŽÌ©aN‡þæü1ACWx*pànëÔ‘3\Â7‡ûòe‡0ÿqÇâ'ÝE]6Â3mͧi|ùÍèë^Ëâ`aÓ¶ð›¼Ìr”E­b*ÇõhåëŽf+Hò‡L?ÆX¯‡`É›±©Þê¤ÜF¹ÒO?ùƒ«¢ÙŠV›û]®T uš}f|Þ@.+Oãg‘ 0äMt¿ÿp#L‘¶%#!TÃñåØŒ_“iY2˜|§G¹Níʈ˜ý8»µs~¸$ðšÜµC:ßOŸmë‰1ƒ5ÂU¨>zåTr§½C³,hŒôSªåFt#Ôû˜Êå<‘8mž\Î9£²ø‚ Å~ Sh9 h2<É_‚à8¥ã Ü”0 g-Ô Ñ&Üúå;¿öKL“­QÁÂV1á¹l‹kVýS—‘%ÈþωçÏÝàw©Ž'd9h Õ×*9íÌÖhïåÁí¨q^‘Æìª]Á…uV·öÆÔºsGæ¡c‚µ}Cu7&‹îå¤u=ñ¤\Ša9+«Ñ[ÖÛþyÚ{ry'$E‚êSœ_[ èà[ƒ,R"ýçª ÄöqÃæ¿'ùb˜€øö§¨-¼®ƒ9ü˜ I¥Ï{éw;ðdV…½Ê4‘{¸Xšýô¸©ôMløŸÉDìYp‘·`g}ß`Yø’®†ö€|9F0Íüá'’C ChÇþ)cŠŒ1×DeôP“õ2>ј—¤)Þk¬¾µ‘±3­YeÑ—Œv©´DIû#S\I˜rðÒ䨫.åû•*Ùfåj?CÏ>Tö¶}`Dä"Ë[)ˆYØÐÇd`Å·½«T¡3î>Î.«ê˜+º!gæC‹$[qðrò"is&Ce±YŒ•ž£Þ_G[Ì IWf‹qE§ÍMòë X!\ˆt­!ÒWo§Êó¤‘%Z´ï]Í–X¸7¥ÉB>ëÎðÐk2oAßMw³f´ê}ÁTb(T>—³×Àþ)Ûó‚eHÃl>òbv[êFÒƒŒÒßj.¿É˜$P'uz¾Nœ¹ÏoüN%î­A¬Y= OóVIÄLÚût­^BãàÏWwYa¸¶É8Š6I‹Íb{s“Ù:ÃÑ„ûq¨zä!òõÚìÌOþó2CŸ+eH#SÏcqÒ÷˜ÂËü݆X·Ö}0¿Å»ÊxP * 8Ð9ézr‡š¯øšn2Ztò^ms62"Pµ_ÙKú0ö%" )½Žp wÂ`¦CÌʆ7$³ïœ~n÷ñ¢©"3שŸÒ¾l;ÀzPÏ÷­@´7lºÐ*{ÁS%ë2%yQšzÿëäØw{îKÇQü,=1V¡ª™$“, K§ŸÓ{&®=ªÇˆÆ±®³W¢‘¸ehß M’Ÿ5.ò}Íaë‚ô¯çÔ‰ ÌKáT}´%BoyØ4Tµìà÷¹ÓÔÞø!!ž ¼Í*±XíÙD9 >³M(£(/nÉknOÆÙ½^]²Èi|©ÃA%AÉÈêonB=³ax;Ý÷ëOEFÃóid÷Ö÷e·ò}Ï©ç×Ì¿#|€æKy‘’rãŽN~q…ŠAv|_k f3QÁîK'5ZÖϾËÍæñI&õsXÈwÔS“DÌ7²»'â‹{‚á¡÷çÀ¢å—^£/ש Ö÷::­°y>¾ãÀý_g…¥Õê0¹ã“qZV¯Wˆµ¨0BzƒÈîÈ?9‡‹#µó4Îõ~þÁiœQæ)0`úë—·]9mN÷ß‹Z¿Ñ.·¦–?ˆ($=îÔPÙÖC ë¶•cžàãYO]1£Aþ*zµ#„‰ äi\]N•Zê?ÚV¡šK§ >$ËP¹J«"ÊšxÖ»† ]~çShfÑÝn9ö)óªœcX«kÛÿ›²÷r¼º@ Ëyùv©ˆÌë N$3ö< QT$ç/,Û½LÓg]Û䋃Â"€˜ i¾–{°Ô²åbMk4†ÅDàhýÓm¯U§x0ç ø@O'~î¢?™ÖšÌB]ø]ËÆ> êŒ0Þñ³ËÖÄÆMkaÊ M«cǽ»ÍêÔqm+/gîVWåOŒî·ȃNN 1lWie ñ¶µ~ñ.âWž¶Í´I…Å+(]ó‡8–•Ì;Ws»¥žYÛô\HpîÉ«¡ÌOújÆ/-¼¸^‹y7 GúÉ7¿òvpì ‹ë#ø²^‚sÌ)[J ,ÚgÆA…ßÓ€ùTç/Q‰Âæ¨äh³£o5^òßÌ7Ù¿LŠ—‹‡÷°1t(=ªÇ. Ù­þb¡eºDΙF5möÁªû3ºxŒûOг=²Õ¤·tÛ’e–(K[‚µÖ[éºÀ“â„÷탵„Œ¶wíªçW޼K7kPñ‹®ŽoèR¶¾@¯Óø.Abìåû0è\ñ;ßDª0àzžR:‹.‘¼_öžÀu¨}eX¤0,8ëÕbƒevq›ú0ÈK4òQ #ðâ@4¸¼66X:/(aáJ&Àzó(ã¸v§œo¯Œú8ŸŸLqgÖ«÷Èã;F»Je$R¼…ò¿w¹µwÏ®ØJ©$­oŽwq¦STí†>ì å ÀìºÍ.!F20Ë&(é–!¥dÛÁT™ÀPn_}m­eÀ'^X Íb–XžÙšS–ÊÖ¤„Yž„‰ºÀ²àokL|ûÕä›ÞNjLëݸ‚†ÃÞŒ‡Où­œ]á3¬db1ïaß`©ì÷º …M PqråΛ&'ùêfNû06ЬVZóiåüÉʯΠ£Ñ{±Ô£fc‡^#r ×fõŒÒ—é>Ræ 9ÿÊ2,\Õ‡aO_qÜÖ‚Ëزcç ÷ßÛ Ò¸‘Íp¹ý¦å&+=‰@£Xlõ>¦ëçù%î;;ñ\Í×IƒDÙoØ·tÇ€H²NÂìýÖLß÷¾Ï+‰<³?åh2ˆ~•£RR* êúì÷Lx¤¶î´´ÚgZѸàð“—P‰€ i·¸ÓT\RÞ!G:'º[ª_0áñëMآߙ`½—F¶oüIʶõ4}}Q‡s™  C^SÉOëû©ØId¾u–²]®ç€¾¬…9’Þþ>ÆM¹ÖfÇÈõpWÃv+ÌJx™»&}­Ee…jÇ> *Ê|§Öçg¶¿’#ñ˜“iþXW,"ºÅJq£2¤½ Ïï—gŠõÜR‡ÆÇáMsÕZÌÿ!Y;¢ `EWÕBI˜»—=g“ÿÕ,yÅ!Ê- $œdq36ø£kÉÍ+è çÓ.SM{7wË…R{Ìì2y[ÅYêÖ)!¨nfö»äÁâ=$îIƒhב P"ñª-#usÝ5a¡VÆ´ëZIw.læ€6ÔäÈY ñ„”G†wóZO´óÓ}J°ú•è…|Ð%}UNUßÉê±O”8 nÏ™ÂmúÈWd¹¼–@¥5bt‘)f‘Fä#Y³d*£­¹ì-!wÅø»’Á“É"àiÿéŽØÝ&&Á|O —i˜­ú;Uû¶›N „S²¬io5ÀŽÃýÚ¥ö¦o†•'oev¿ÏÁ”´£l°Tý¤ÃT 2× Òâ°Öæa4º¦½Fº8¹ç|¢#¾LÃAÝI¯Ïæ_{FtT&i¤BõËWòD^wÓ2ç[·„W>G™‹ÝøàùL¶‰S®`ÄÉï‡Þ) €ó@GÊ„·Ìß’ûaX/® wnj]éX«mĉûßà}“ôs· Õ¶ÖÇV™±ý÷²ó-ºX£~¸¡…oZ¼ÃûÐz·­du9ÓK†²:R‡ø~ûD¤jj¢ÞQ;›Ø Êy0k_*6À¸ÐÓ§ÿíËÝûeœ7:PžcIêEÈÕ%êÅQúCœRÁ)Ádh-OäÊ„Z8rN¯):¬ÁݽÑ釫Ցü¾|Rùþ뉼Ô(ì!ÜF#уÁ» &Κãyà·ËÊPÕà ¡ÄžßU!ƒ¶j˜¾`ãGÃw»™ð6xñÑ?ÓœSró E¾±À#i§0®$¡ðÄÝe‚î2©•­ÿ±ªµOÌFj7M/e•y/®ª(†ìØýly BƒX’~ÿ %¨`(XÍ®bHöx½8Žjë@}m‡ØH¡]a²0U Æ©Å$VL;ñïX©®—dü\‹Ü5‹ºPå…‰9ÀE[0 æá ÎÐy£÷y‚“;ƒs-!u&+òG·w¾“˜Û±rf‚ëñ·¢Ý^÷Ñ¢S”8dxW×ÏÅ— |ûµ*’W}s¶‹rªÜóò°­Á‚÷5ÂÎ.]œÐ¬5-µŸj×ç×âÐóh& `¨7Oí5„ïŒ7ªº(Ö¹H(t’5¬÷ :oÆÚv\zv;F‚Ð'ª[Œ·›,EJ´ºîÓ˜û¨»bòƒUAç¶Ûó†gº”³…ê-Ó‡Äù½Oløvï`*ìPN5R~„ Ð&jÉ´Ãô±\÷™z~JÝ}ydƳ¤Lpe¶y¾Ž T 4L²e97(DUï‰;ºŠÌ‘b:蚣;÷ø(¯ÀŸR‹p\S!ƈe¯{¿ç[ç aØ)b|͘À²#0QDþŒm‰P„Ã͈4$ê3R܃ø„.¼°z£¾Ä— uÉÈÙ¨šÂ5A`eVï •X©¾xÅ$Šä:8ý¨…ˆò«\ü®jõzZéaMâP`ØTsèNjXiµæÉéÔ§&-wBóñÒð[ôp[mg\n×™wÚª€Ã´ UB€;dç~(J‘ãtÃäY7;ž`™Ú;›NiVM÷zžs«¾°imYÕ›s“ wÿêÏ/¡²ÆÞòéfLAÙS'¶»»[Á»^Té5z{K7pœŸau¡ÖW3-~‚zSC®ÛlUG!×¢³ÓÈ*vÍue3Ñ´[¢>ÌÀ߆¬¬kó-ŒIK@àÜ –¾µGíHmÔ‹›nÔ´Üܦ¨2VÐÎ9ÇÊÎí¨ƒò~£–-¿Q1„þµÂ%àjªÇQ€÷nå)½®—ðjž¼˜š†o_a§ ÷¸ÁÈàXmFójÏZCÔ%Ê@Φ Åç51þ¢¾ñF]N½$0 ÖeÙKê]p·ú íU!9¿à)¡‡þ1J667å·]OƒœQD®¼ ~²¿¾»ÁáwN@ïPõ!òÆ'tJ(èI^0(™ûäxïÚBâ´„´Á¤j+®2›ÑIð`¬³±‚•Å´Jí/$ð¶{d÷-·¨Æã7äe•Y]®&nÑÝ#ËX4Dô–¾Kdl;é“'¾p> ñé¥óòP`ùà n¿F%¬D^Ü"+D‡‹Q‰¥EA,Þqöië/+*秘¹éô\„[;ÆÉ0u Ò·M&~=9œ\KÃ'ÞZ¹ÂyŽéý$ÞhÜ·Óoa-}YìþŽÒyaJ?½´gT«Â»U@;'Asµ)ï(_½‰_Œàuß_¡T…‘¹Ã÷f !…Öó!$›+ˆüx)âeøUÙ|m«;Ôâ­û9?±Á¬¸ä n®X"ðšº9¸.Í7g¥'ÉI¡Ð~ïLk<‹×=vržù4kð±‡Èº ä9L,úÃàž®ªÎ]Êùœ«]› ,=û3·Å+B‚‹°±ŸÝÜá»mlD¤(”°ÏPÍÄK£¢¶Ü„ùa‡†XTËØ½¯½:Áâ¹)<"¢;C•â´J†6Ó¥¬>©Z¿ 1Cèž³™F·CÀÃ+,¶j>Pf© Q7)å±|ã#ÖÌ‘O>ôM|ì@‡¶ž®Ø…Êå}d›JÎW©äHo LâN½@ÒUÒÐoâÁ£brj·Å>f©þ|o…cõÕÍä*ŒRˆÎA³çø›ëY¬ŽÊ[}‡[g6È!¼l„Èœ2Çwáã"XV/Ο-ké¾Ï6FË ²Ú.Är÷Ëu¿\@%À®QIÉ:t+d|¹¿l†××òÇÝ]1{º6‰]ÈË‹~ýQ~姃¸”%Ϥ›•Ì÷ƒPgÁ—}M(·«…ò&‡ÓÿãåX(a3æV‡Lzó{ËÙ%ž>¿Ѻ¤e]Æsïɺé)= ÍJD˯®ü”àr½ÍÄâ]Y·¸8ΓitiwþÈ=ò}šµŒ³TvÏÇÙj¨f}ÆÊËæ¯»‹‡¨/Ôß(y+_˜Ð°³¤{ÞeAÕü´™…CAºQžR?ˆŒÄ`N\1Àí£ˆ’Ãz_®£;#sX—¯!6gô\»)šG®gBoe“+À=$ v²ü.@ëf[ݬˆ¢Ç¹šîKûT݉ó„7ÖMðqÂì}gÓ„‰iÛã51ù3ë—Š%&VƼ ]U­·›ž¼jkJ|Y+3äsZ,lñ:Û‚är«zƒ< ¯ã2ˆ?Ù#(+ wB!°¾¹œ:¸Eìzº\š˜gV&…ÌÉ/úv¨òS}Jrò€9| Yè€îL ¡ìW?°Ô 6h7“üˆ¥ :!߃ ì @|ü޲™Ugïw'š­¾~(5DŸ %ÏgØV¯l#1PkÄ?¢‰‚ D=8<ú}Áœý¹qÔ4,% œ«ôV¬¬(`7j+€xy.øñÆúŒÁjÿÔƒô42Á€.G.¹»ÕDñ µ)ÏãW; ´^g(¦µK­L1±§ Wƺ4¨Û9>Ug(É 7÷¡gßõQËÎùWíáóá»!{UšÎˆÏ<Úa¶JåV"ÿð8?ùM»æ‹Vü§pño#ýJ”|êRÁt¿²*ù^6“•<µ tÝ•£Ï*h7€ ?¶lÓ@ÜÃÎ……;J]·¶1⇊BôØbÏ "¡á÷wåâiϪޮ¿^Úhà1Ã\¼8|k‰!Ü´JV rÎ>! })¬žÐò_5³ 8árÕêÚ(ÞÑŸFݶYö|0<¨Ó Cåä5;3>#è¯ÎðKd ©ª§ z³†|õX–„RQŽˆ†Ó¸uLlG–.DËbnm…i>ÇÿÚÒ!•vsîз¯€R{©~f¶¤¢øµ zY“añE‡Ø÷õLXžÚ²®ï8:šfr䏨0Sz$Ÿm3OõŽóA ¯¹axêvò1:ÇÉü<"¢¡o›="g­£W.Rë–ÂJ i7·Ì v­Z€c¢­­S?Ð×û§"rõ)¬cY1,éØú¯šoF0Å6V”s ¸»Â-¯=M >ã‰P Áì°LÃ9¬Úú‚Þ‡šÕv†àfPßNx½ÏÝÝ„œ£-4Ò§^ø üØ„j~à|l'…㵔ʗҀùÒ¯±=HÄÛõæ¢G¦ NÉ3é¶›ÑO3„eaÖÚõyTÇÑhïJR0—êoªS&j*wU·Êùpü>·¡·óPuw¶A¯Îµ±0-RÌìL1Ûâ M%B§Þ -©‹I«™´ø6[?y’A(j¿hIÐ&aÖ?˜ ³éŽ6ªen?”j\0²öï²Í¨áküðC:XL0 ) ¢ãÐq„¯à8‚YÛq^ε™Cñ´S§@ÿø¼gâàOƃ*ùÀ’#—ð E5$³ºÏÉZ%Jr1½‰^û˜!¹ ›É)htˆ ®¢…Õ‘“Âß+ÿ¥µR"=§‚ ®Œ+ul`uÊó«¢úލ¼ßûfƒŠ& œ˜†ÍM²|DñkžLNœ)˜Ð_†‡g¥8sƒåƒÚ"¤ŸårgH²ZfczÑñì4–Ç~Aó«z»á¯Á1j ¯Ø²ç—Ю9¤^zexáÛ]~Ê—÷hK§isÆè™ÂF= ˜§éWª‹o¾R€}5M9^³—ÙŽ¬ÎNE¢Ls2[0Hr.¶9“ Ù 7#*Óðóñ“iiÍmyTÿib[$¥ìÑýÏO ÃôQ3Ì_†^¿ì#„1trÓ¯2§k™ÅÿàSÏ­13®ŸÑGeª=Hÿˆ¯_  r÷ïÉ”ÉX:Òã…8cGF´(ÊЪJ,èÜÁÌ‹UR´¸²z³šÅ<¬ˆx*½,EÛy.‹]÷Mú¯$` ·Ðxë}"îLÿ³èDÌ5~¢ O%ïè u-¥Üƒ²L3S=îpU†Ð¨‡asÆzcFù'²ëÍþ<‚jâ9òºðØ/Ö6÷O´?™½ïR?™J=zDA dÆ–¯Â]&ÇÒdËê E8ã›dH|uêòwª¸}žä¥}ªÄBOúÊ\l£¦ü1 ìÝ÷Ê4ù¾ýØÏ~é.CMÕ[Vè¹P"pn˜llT3Š¡`ÆŒyÕÿV•¥ìºõåò³i¥%Ë›ÕÐǧ‹LënÕ„ª+aûîКe'_ÝxF]•aÜ’y¨íq VMÜ´#hß kÉ2› ÷H¾Ï¨×ä™w©º¹ÈìûÏ:Þïß4>â­åî¿ÝEé”ûÒÍûý—įºp½„{!‘ZÊö1äIö¶~¶‹õã*·ÇI®f?¿~5‚!4øêMaô“ö¸ô“ÙkÎJp Ë4~æB+'G‹:Y©QXôîênÛ Û¼rW® °’£”3w%B¨cüùÞƒÒÅŒ:¶6tó1;¹a<–÷Ó•¸±-AÎüëÕN›zÌ6M3T1j؇chý"aè$Òú ¶ÊPôy'Å7Ä^N^Bc¥ãšã_\ ”R5Spùnƒí*\ ‚kÚj¾×/ônA¦(ñY“&¶Uô}h÷ w±Í8{e/‰ÓZzdÆ——Âí. #Oõ7ÃïSlM{dÓ´tyÛ¾ËÍ/ul"¶ú1;ž‰’þ+,ñÞœ¦ *©æ$T„¦œÉ‹Eoÿ»™á'º¦X^½2qºüµµ¾Žà°45~Xs+ÖN}ù)”—Õq éÄOÙˆû>H,„ÓœuÈ1eò-c\ª 0âQlD3)Ãm‚¢!|<|Óµuca³ê½ò}[õɪñ0;­I,ðÈ;è”´W¬ qQ%òøsù)Ùíxáˆ`¾Õ¶‰d -«”â³H7ù˜Ü hï¯nê!UC†zö".±moàš¶ÊLcŽ×ÄÓÑûæmÝ…ã–D" Å}Ö“¬ck‡’D n¨/œK|2 õ2BÆYC¹>€d«Ñ{Lï¡D\wùt)E4Uð,´Bèüë û©\•ᯚ“™$£žl“Êm:½úßaX…ÏAÒ‰Ìâþȉ<“K~Ù³Âõüv8qQFAǵ|W†Ý¥-^üÁ¨Ø½£Ê”æC†<Á*ZŒ¢d`EèJiÚFâ³ùBÄý•&è#‹K‹º‚m',3KÒý.ÿuôÁNÒ@Ý£ÛÏ^î⦗g'+FœÌ> ¤GY³›84c¾Á$Øêùd®%n¾-?3æ§Ô|å´\dÅø<#,¶/ží. ïx:Ç®ý`ý=ßäBLJöέ¿ž“¼­x'ï‚Ýz™C/íµQõîÑxÕöMZTZ¿:wÚZ+"^O"òõfcáy\õX2é„0c§7…ŠeZÓ‰ýÙ:%>–ÑÍ"°f+”R²ø6™ohÖMflR®|öxIœ[½£Rl ™Æ0Kmjå|&‡õØ?nŠË¸.”¤¸±\4Áu clízÒÄ÷è‹62_Ùœu)^Ü%++wÜ©rt$+5Pô/6êë8¥¹k„MûLºë«ÏBÆîMž2K¥¼½9eÔ$Xͳt¡´~Lì|}:À¶ñÕIc¯~ ø|ÙŠXC׌CQpÈ^Hf3<ÛƒÖºc= ŸŽ°…6°¼c­ßÚ<µ#×Ï™jÜqà¬[5§DÀ±]ÒØçVu¿Ôˆ[-°À:³?Ò‘“È+ôÁ/*4Ï΋€³ÃTúr3ýê8¢#-.]+ϲÕ™ãRx²v‘¿SH;…¡\ò€D¢¶›ógé>iü@þX˜S‰X¢ë~örL7”Ñ·t+ôgÉhÎÅÎŽÒœê„&ªB©érEY"kÚq*ºi2§žYL›Kz r‰ ©Í¥€°è ËmŘۇ33{›$`¤sÈ|{| ’_~œŒÏ“Z¯Å–"ü^?†j•²ö²À[2âËD4½à,î²J ?¤EVû%îúìËPn0/}Uϸ“Pè$¦§ü ßÇ^Z¦0?N[øÒð%Á¸ÜUË,,2²L¬˜à(TÒ,ßG–Mi4ÞƒV-ýîÑg²±zré%žcÃÑ[qUM”V­þK‹ìkȼŸVYh_-ÈúÍÅÞ.NZÓ„ÅLÿH? WÞj7Em^_û{ì#H’M¶Rûo;æ¹"3ܬ- §Ø Ç1ïu6% ¦}-¸s›œ‚¨Š³±Ð1á·U@Õ .R‚wMM–wÏo냜½zì@±U2ÎÞÅ‘ãðôʘýlw¢9?_8¬©ùN5gS­YßÅ.ã¶XðÍ}Ý|%ÅÌæ[AÚdÞOj 4"!§t×ììåÐs!ÎÇÁʃ¾Ï[¹38Êš+<&Òï=ÏU 4žI¾¢¼CÐa0Ê`ã6ˆ¶›orèÙ­¥- îè¹IuÎ 7ï¯A åvkãc0]ö¡BBak4uÃ^k¶7[ŠÏZ®V6î¼G9"Ï•©ª4G,‘v0ß☻ã"Ûù¡>•7Z„ÌŒÑ"fæc®s+wøDB.uŸñÖeŽ|÷’Pt¥cÎ&Íû5IsoSƱë)²p гoø›ÿZîxÊf[¢È_î"D/Áè3©`0¦ý¸LÌ.¸Õ­j F«/÷Êt[€Ú=ï»BT®gÏyšrÁ™=›»~u"+Ý͵Š)5YÚcmT± §ü~wîãñ#Íê”d| ’<ÌÚd{XGe§Û¶^ü,FDå„X•—Ýv#%È™=(íc|| ÃiÕ¨7%»¢xÃÅ–ºŸÉ¨ñ­X™J¬l.‘y;w ÞF ÇIf¨‰µ£xÄ·o,Œ$lïõ¸¹4¤nõf˜%WkdIf]WzõmÑ/ÝÆ †+”œ7÷7¯ô<2~ù:}Xº¶-¡ßô¾“æ\£»Õ[ÒAõƒjž-·jîVu|}Ü(²Ž²ëkç§ÇÎNM‰vuNÞÖæÈÎû)8Y?i­™SÒüh(‹.#­#e }lwÂâÚ µ†J%–0Ö\½tïGZBµÅËMD(NËNßšw¹±³£6îúOfËòêÅ,1¡z¡Ã›UïãbU­â šE'£ &~}rú¥›±°à< UIÜ\@Mc÷ÍöÒ§'gf2ãƒBøf$z`Ò¬èvQa£ÀIÚ†ì»È5å··òjoÛPS-PL®F™óð~v@b—c-~”Ø@:`—À¡«%àtÝ‘lš=0A„ódF:¾þîÒR£EìŒÙÜJµ¹¸+C7 YOô’Q!b_Ý0q;MöZrDZìëŒõ!…ytèlØÔðsç<"ËÆF+fñÂ|ô‚8ÞVÿI-€Æá‘ðGùãgqydÍ{X{o³ea1v΃kæ úÔ“ÌQíGndGwO¥m….ž×¼ú‰f±õ™ƒº¿¨Èòo×;ûñÞd#ž°½·¸Ìä37Ö¶9å'€ûôµã“S³ÞŠå)¦ùM–+—®Ö.µwL¯/l<Ýߌ”ÍO©Ä.^8íÙFê?6 GK{3úëg^èÄ¢ÖDÕñ[÷ŽÒi ¨aX6˜ȳ)qßÛýc—'rÍÄŒÿìñ¦æ-Ñ´t:«éâ5 ²³ÇC8ˆP¤Œ°Ó3[0´…œ¶nHŽS…}¾—iz/¨_NþÆ8–1ñ‡B¨õˆ`÷£®å@hò© -}Åü˜ý/l.ª¯srˆJߤ_áôïˆõšëGÑ"6ën2¡÷)å1ÚŸ~¬ûØwýSƒn@Ñ€!éœÌÃëT…õ¦¾8ÌäZ(jbE±Ž]Ú~ïÛô†t‡Fš"šhð‘RÊ5md®ár˜f"Ãû¯T³(䔾 ¦kÀ£ÜóF¡”ol ,tÔt1G fû‹´‡DØ,‘’¡*&ij=Z ¤÷o­5½õ„Ž £SÈ8îÔ÷ö5)’Qäô#ÙñóÞÃB³“Ò4“"¡[Rÿtz\C­PÇ«L¹eÀioâZ˜&-+=&dÅ¡ `ž,‚ßÓ^(A®ü|ÂpA©è͘Á{œ–KÅú 6°J¥o­>$ïÞB[â Ò¹™SºcÃ×ku«é8Q•ì+f÷~âµØFÒ XXå§àÌ»G1PуêæB^l¸ðMiÜå‚?µU)qùWÚ=¯*·¦whu•—c Œ-;0õ—‚¿ öT7ę߾D¢`‘@õ%%ÔFÔo gºì¯àM˜§_¿òKd@m@RÑÌ0¾Ö½õv-’Ù]2¹rŸÙ²&A%§ÈÈpK/€0,É å¹ ´!þÌ•¤ÁÞßK“­!Åü˜µíîâAˆ°Å ÷‘N«EÞtíêÇ4ZâƒV¢ï,çö;Ã6ô£h#íf§ùË›AW¿‘'Z«ç7úì£Ýúò{ˆœ¢0¨•(±çh~z®¿€‘©=9ÜoU°?˜rìC–Zô —Ë`É+;zJˆ5Ð6¼WûÎÅ­ws¯ÞjS·Å¼øûÝ=6B&jÎIeî·¶!bç3zxnOÂó ÔyØ È!}ÂpÑÆŠÃ3ªø}„koíÔJô“´Ç}ç9PåY?ãóÐp-–'Íäe°Q§IôUk–4ð ￈ü\‡ñFJw*Õ)“5¸áøJOÍ?NŽ› «"£¦ÉU4w« ßDN^O–eníMLºª;‰:Wâ>m©ïBƒlUDX)0Šj tìôBd˜»r;}š 87 1á§·'pCÔLÔã+èJdô™q&™ÇþÁBn]Je®@aèʧŒ$ËŠ+Ö=¦ÿ³86—5ÏĵoIÃÓ똤cÖ}V–{[#_®æâ9œ­Y2 ÄõPæÝ ¿#¥ªœQÖS5þd Ùä}{¤(YOÆâÊY´Uoóé‘>Á¡Øss†géö}Psê7þÛþ¢'ŒpËeUFzZᙯ!ð0}ÍÓwDÔ·ÞpÓÐj¸‚¨s */]²8µÄg˜“¶6÷ÞX ¢~†ëÔ ÞGZ/†¬}w‹<’>Y¦ ~7åÔ6Žk:žš+¨÷åli}£²-?ªSœeü´u«mÿÛç\5³—ÔI34¯§šð}ñ}…‚÷›ª›ýXí—Vrx½²B°ûæÕ¬~z)d¼ÄƒXÿï7ºØÅ2åÉ6Xó!Îv––½=‹ù…nÌv±T”åE–,}~¬˜¨äQíSpï~8¤Æ_Æ÷CügÛÜ}Tkè:VÙ Ú׆HÆ>'ÔcIÖ˜Fo#™ÞŒ²ÇkU ´£<¥ƒÇ?.¯ˆR|KóÅ'èÛtÃ{Ðå‡4¢£ÏÌ÷¹zúq†ÚëŠSWûfø}ØMKr3%õá;øJ7jófÚ3T‹ƒ/,þ¢ð¤ÈÜpœ¨šZ¨ýâ~]Œ°çÀæTºÙv‘Ú®„zK¼°gMÙ_“²E>±ÇõGFÒaà;#Ë'g¦äD@b›Çq ”Ža£Õ­`R04ب6æZ‚ÜÈA¶Ì0=Í‚µÄ‰´_éÐKwOj‰ý:r6èr^«x|÷ì â”Â[{lj[æM:‹:AfSo+›NÛÃMZä!Á|+#4‘ÇaY®29·^¨jJš5׋Q˜»ÛT—!tëþ4Å×/[äåg4aîÉ÷4>k¡s­L¦J¹ìSIHBûâsV*¸•QNlƒŸ P Cð\jè™Y‡»üÚí˜WÖS9´ÛÃD2\=·½%öÜ :ú鸧ìv—³ŠKÒé ³´bå±IêÐFhˆ KÜÑÚÄld:Ùò’Òìt÷ö X:§1c#pQŠœöà õ¤àÁ ¸á0®]ChGnô (Ð Ð-‘Sd9¨ðô½à·<À°íÔTO¶®¬EJP0{3Ÿ1¾l~:5~UΪ§fIJ“zj³nçÊ r½U6t ¤å¶”½UT€åI±z}iªË©R'ò#õ1ĤrL‡˜Oq%Ö"¯<±Ê„—Z É$Rñ¤wX•Ü™Eó¦Z …Ù_ܱJÕ³ >›>ðÈàB ¨ãŠò݆ëÒü¬Ä¤ý®µ™œ«[è›¶+“•:¦öœ}b 3ˆ²Šf+Mö™vó²FÓ©ºPE –¤Í‘-m͂߶aÁ„0r[à¼êê:ÔÜžYiÃ¥Oì[Éáº9³èØ K`g¬hÅÿ”«ÆÔ™í*Á7V ÉàPÿÏù[]Š. V6…ÉÏûùW™ÀÕ1Éó’"'–1(f«zHf‹xšhI‡º‡l#—ÙÄ—¶rSæãÆÅéÚͨQÞõZ\NˆÆCio/.©%ÎvbÓ?º“-vh‰š:w¨/LÂ)¬ @/–]ìryMâøl›èód:Ž<ìá.¦˜ã4’þÕ*.ù£"+Q&#ŽPy¢VAíiH¤a, õ^¯JÜ‘²ñjb®oû×[ßì'%b˜àçXÅ—eéÍŒ7êçnØ›TU#VtÏL—6„³uÖiÏBîÆõh‡“mû+ÐS“Í‹F’ ¾™ÁhŽ·Oú—1 ÍÝÚø<‡y®n•,þyižÕ%}Î4ób•K(HÝ…Œ-8u‰vWÆU²B‰7á²îñ6£Uõ‚o¦¦ûFÛÖü’™æÑ“=GYþDxÖÒ®ñª/˜±Q"Ù2¨ŽñYñëpkŸV:™ßlç²ñþunöåO\ { ½›lŒ5bûR³Á$Ï»$/ˆûš2±/I±ÂS S!ëVuH²oѸã{®¡Wc›0“ìGÒ#‹<…œû(„ ½«ï?âÓay® ô 1ª\]î07Ý[ª rkØãÖ IV3Õ' »Hr¾`ô e}À¯;R{I¨ÖDç{£üE1,…Ňf߈ƒ3O-F¶‘åŽò®^Ž+ágû-íCœÇ~¢¿3f)[‚ð-—q"4*jûP™ 4ŽqÏxE úUé6ÿL&ÜË qIªQ}X“è[ö[ ‚°ê÷2f2.äžQ›TÎÁƒxTÖ§ì`Á»wsåΞí~§c_©BØs|IzHulmZkŸ?·eAÞG6hªAÅ÷±°” %Íøq´E\F¨NR¯Ù/ñµRJ ޼î9;µNQ<ºÞLyQÍi×Ó.o@Þ¼]ž¿0ÉV|Z¸Ì¿Ìå~òÀCxp“âtUIú·ß–®Dp>Ë6ü­/¿¸» ¯Ü±>º ôãAZô‡‚‘ü½*vgJOE¶ôž\:{[ O¦óňê§þ,] o}ÜÔUúàÂö‚WåñúRcP}Ù*ÙŽ… û¼7žÏœ`ööÆà /EÏpȇ,ñ›ú®nE¹~I©üuÍkÊÒÅô%ÛSMÈ5SÖüMŸšÂ©Á´èáYO¢¶)*tœG ĽŒ)i·úrKRÃ÷´ýl‹FÚëùZYON;A‚þi!@qÌ^_¾ûé–`D­.¤:é¾?——­ãô€còÇM;b›ÁÍB¶US4±‰¥Ë£À±Tx3¡í¹È6Õ‚ ¨iõÉ™]1»ÊQru_6äì>ÆXYeˆ}Óæ‚æYÄ›,Ò "Áx·9mÁÍd5E%Rœçãž³Õv)¿„Óðµ»pð‰WÈFh¨è˺I "YêÓEÁ¥˜ÀM÷g¾]È…»ôeÈå(T÷diPº‹!*äì;6Ãä.ÁMNòîòÿˆwúra‹’w³…("³HÒš¨n¸kËû•è”þ‹Ö;ª.¤ºyÜ­Æ{Ÿ ´ÞvÚ Δ­Â…±øî‚^ ¨h¤Åd8a×ß³"~Š›Çб ¯•óbУr˜Baõ5sM,¤kžÅã²gÉŠ¬!ÍÞè9ÍSïX#ß â= “ê<ÿÍÎøƒ«ÿ‡2MW¿„úœ…4špšå+ ’w= ‚ÿH=ìÁ˜âJħýùS&¿ÄðOÊ·xAÑz@¥ÆÛÙq¬^mtm«;F¥ *Óìb¤.ʾήŮùoãI—QÝ “»5ËŸ†×zçC¤Õ/?LÞu`ù‘#…²aÄŽAcÁ>F¥¤D„Èr Gò+JÓa1rÕ÷ ´S ÕÄj~Š¡>V×gQoôït^)ºo£ÊĜ˷Êú´bf?’XU½;iVë½ëòXij÷‹.j1a9¡Ùl²E©;VN깸9}‰—+ö|µø¡FPåXoÇÿÁ}e׎‘a&í2ñ6µ ì”hH‰¤ñ+”¿9þL ÔØá0wgÏRö°ê² o‘êB=U¾`2ÝGC/ÓÜÍU¥,翎€Óù\¾î¬áP*Yº¾k¶,Qþuöžôá÷ívœÚBЄFÙÍw¶.¼=s¤åè;…WôõK,~LÑ=;§ ¸ô3PDÞE”SÁÝ—>c€­.f½Ÿª¼>Õ¯Çt˜B•‘ʺݸ_cÔá¡oX66á* =7¾™ú¤8 L£\oûF홞Ÿ–ëLK†+©ÈQ°¶C]£°å.ut…HƉ‘%XrË>7ð†—¤­-ªIèQüH½Äû°â½QñçΚFÌÅ¡Zº}.ÿN}=<Õbðf;’ŠãiÈÊŒÚ:.&Ÿò@8ä¹è³ùºRÿÔ›¤ÌøÚíb«Hª÷$ئϫƷ¨Ñ™Çš» ÊñãN3˜z¼ØHo­éSh·¦±©lź…ÖDTîæ{ÄL&–ôçl‰¨ü7³y¶a¢¨•°Ë9Î ]ù-áYóá\L³à1'=ìR·O”_‰tb4Tß¾þYÎ!íûØ;‘Ç Ú±o£G={­U/\ 3€vâ@–QÈ(]£%È.ñ:}¾bâ8ÈdLë€ ¥ª¦O᳨t_•EÅÈÈma0 0üDDæÉKD0ÆX},Hª‰*d›„¾ÕR±²•¾"ŒvìtvË|¯ú!X>c ‰t·<ãÓ€»É¢Wtê`"§DÓa|Kb–Ø €€™àpnwÛ;ޱ3þ‘>¡)Pé©ÜB¹,ÚYXåÛˆn’ŽÂž/…f©ëï›Ã;OÈC‡Jx7§à)zΕD~*~¹VïÁù“‹Q6JѦû†iËÀ Z!"îKרF‡õÙK·ø«WnXxÔK_÷ “Ƈî½,L/g-Pª±é¸Üùy8+>¹?Hapð¥ÐY(˜0 LX"½ùUHvfŸ¢4])‘U(—â b²â~‚û†tB±ùîhM=ƒùåèÄÉØkh9°]€«E6­–F"Ö~ÈÓ‚7Ÿ;ŠŠÚ:w§j½¼ðŸÍyé÷qläÿß©|v÷cî/:S•~ȉ2§e1Õ“RŠz¬àØqR»p‡‰_ŒõÆ04…pvß^Èïå'ÛñãsmNŽ¡¾9‚,–i¼vµÐ¤töác¢¤€¹^Ó ¸å endstream endobj 133 0 obj << /Type /FontDescriptor /FontName /LWPQBU+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/I/L/M/N/O/P/R/S/T/U/W/a/asciitilde/asterisk/b/backslash/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/question/quotedbl/r/s/seven/t/three/two/u/v/w/x/y/zero) /FontFile 132 0 R >> endobj 134 0 obj << /Length1 1404 /Length2 6009 /Length3 0 /Length 6967 /Filter /FlateDecode >> stream xÚxTSëÒ6Ò¤÷îé5€té]z‘B€@H„R¥IïAz"¥ H—® EiRDÐ/z<÷Þsÿ­ï[Ykg¿3Ï̼Ï;ÏìdmN6cA%¤=T‰@ Šd]cK‰ @¢Dœœ&04ú·ˆÓ ê‚!2ÿPñ€‚Ñ›*ê"À]O8 "ˆHȈHÊ€@€($ý7é!¨‚½`€®p‰€¢ˆ8Uî¾0'g4¦Îß·„‘––ø(¹A=`0У¡n˜Š00FB`P´ï?RðÜqF£Ýe„…½½½…Àn(!¤‡“<¯à C;FPÔà êü¢ èÝ ¨ q&Î0Ô_c¤#Úì08 E 0!ž¨€©kéúîPÄ_`¿ÀŸÃD„Dþ•îOô¯D0Äï`0‚ts#|a'À‡úê:Bh´F8ü‚á($&ì†ÁÁöÀï­ƒu%CŒaø‡ âsG£„P0ø/ŽÂ¿Ò`ŽY á ‚tsƒ"Ð(¢_ûS…y@!˜s÷þÓ\WÒáÿ÷ʆppüEÃÁÓ]Ø{à ÕRýƒÁ˜ˆþms‚¢q´„„¸}@} ο ˜øºC;›1ýÝ‘î€#†4æÅ|ù£À^Píá ôÿOÇ?WD""€ ‚ì¡N0Ñ¿³cÌPǿ֘þ{À|+F~"è×ç_wÖ…9 pß÷XXÕLE×ÈŒÿå9••‘>€¿ ¨4 (-DDD$IIq ðŸyþu³ÿm5Ãþìî?2j!‘€ô_$0§÷7¯?Êàù36¼À?+è!1z†<ÿ–ÿ}8‚¹ˆüŸ‡àwÈÿOû¿²ü¯òÿï©{Âá¿ý<þ?Ø ÷ýƒÀèÙ™ ]$fBÿ 5‡þ5кP˜§Û{µÐ`ÌŒ(!œ0:¹-ºý—†R‡ù@ `hˆó_Zú»˜pj€DÁ~=w0Q Ðù0£qÅ<[P˜–ývA1“õϺjÒá׊ŠK`°/F˜•8à/‚™U¨Ïo‰ÂB$`8ŽH¢_„Ý<áh˜;&ÆAôäOÌüýV¦òßëßÃ…ú@!D ³Hˆl¸ËóðŽó:%&oÁ£x+«]щ–ýQâh®¹'þÎ:øÙS”íjèG2 æ+"&g˜øöÏÇ|î¿Ê YN×,@c©õ¯+ };~åeu@2:KfD¯S$²ÙYáZq§˜Ï^>’ìÛ|ö©øª µyOzpJOÉÙÒ™ÐqJù]»Ø-Ù8VÑÖ÷Éã)=¬2=M´Lǯ°ÃâÏ”;b¾ù®[Åg ¿ÿ:w ?Cì¨H»·V¢&‚ŠÚï.[þHò MRîÝ(,.eñS•Š´Dv†·®e;ÉåïÓEíIƒbžMNz*!7ô¾iöl@ŠÏÊå÷,1Ûnä˜|&¡oIŽv¨ËàPæ¬uÀ:Î<¨ƒôâÒ²x ]K?u§‘eåg–:؋ͱøÃÄl>MПÛÅe'‰ˆZ§ÉÁ¥?šM§¸‡TöÃ2ƒìá%ðªæñ6•÷4ѦV`Ž“ž7ŽÍ'߈E¬Îdoo„¸Ûl5鸯| ¬ P’qÏ?’[¯Ñ æ’öÇ%Ž2 R%ù*EIžh Ea9;6mÀ´i‹v­8·ÄP4\h¸žö2¿§j«g¾;è9Ã) U—úîe ö…¾Äk_%dwýþÃÝMkóLª¡º­xQ–·WÊŽ#Z(Š,fÞY¨ê\‰®ÛŠ¶Þ¨i­@j¦ù‰ÐùL1Pípwwx2´#IÎO/Ìõn²e«¥•îeµ&LcŸ|çJ]Ï„ßTÿI{?H‡ÛÈYä«z¾ý—Òšñ@þH8‰Ê¹5PZ²ÔÃCÎìå8ƒ ãw§ÏÕÝÝ»ÙxW`†ð-G±ïרU²®t‹Ø  + ×®ÔšŠgÓºû|úù÷Mú¯F?lÑÓæ²YÝo¾dz*òܪDó½)£š¾aú$×?`ýëWÃ@°ØGõr8NZ×±”n5~ñ:YÓ\©¼§fM¶mÑlyâ‰JÛ0u˜²!cÉ«-ÿs²BOCêMÙÔÜz¹‘wòáëeU]÷Ù«¾5§eÓMí]÷2RI›/ÁÍ5Tu&b V´È¤É%ët¥¤³w„o*iØ`W6dy/dS•:h iú¹ò@ÎÄÂ|¾'²Æ …|665Ðjpô׫E1>"Þµ¬í(Üþìõ*aܪ°õû»x16¿5}Ùj3Çñ‚+öãñ‘5…<-a㪕+<ü•pâÚš o6›ÉǾ`0É1öjõþÂDÃ*mH§1{¡lÂVÚ¥§ –q4‘’øQ–„²ÅR‘b)Ëd &+¡~¼ƒýÑäY•µ0Þ¨`P ÔäÀbÁt:ÿcæl鵫 xÌ1´´Þ8ýaÆ¿’D¯"ëÀ™õ­rû0Àj[Õ+¦ ÝøXm¶¸16Ö ®È¶>ÙR˜ ÆÞ;²GÂS2É%’~êGyõØ–ám¿iN4lp öØ ÝÏ_%2µzHœu¼’-i¸—¾Õ=°á5Ï*íJìKOÛ¤™ìë.˨:4·¤¸0ì‰äNÈ…[W¿Ï±÷ÓPQ`ç €¾/ñfÛªO•ˆ)12Øâøô¢Uægç[Þ¡Îxµ[ó[%ÜÕ½»™[›‰_‹b 3õœ_â#º™bçßÑ»<ª½wÉØW¤C*5þòd!2rÜ4ޤ^À®ŽÉÑÑ,yÛ¦ýîä¸9Ÿ7ó+þƒ|þ¹%ˆ¥oZÿh{IAÎ5"*[Ý7±Wv‚Š ø J3¼+&î“Üñú‰Ó ´qùP1™ƒÂûz \*ž0˰G}g®zæM–/÷Ôçïl)6¤o»6,õâ¯íñ,ΌۈÎs’ƒ°•.¯>»…·cÅŽ‘mÃÜÂÓ¯?WÜf0üØFS^è›G’°èu“ò€ÿabqk_ªZ$þíóœdÝÝ9ášSÚ]ôü#œKMhvÄ‚Jã¶—Þþ&»†D qég’}ü‚|ë&‘B%ºÄ—±©ü›u<­f3_Vb4ʫᒡڎLæÔ~˶{rß5Øý¹+oDXè¥<Ýô½iõ ~Âïšü¦tzï…´F«^c¸-Höm¤¶çÞÃxÏø¢åXip5²š ªáõ*Ã|‹ÒFjë«N4¼«~LóªÐ Ë$Ä5¦[ÄòÈ š¯ñ Z‘PêXÚ…åíºIÏz®)Â+IPžc›è=å±Ìÿi¬ê5S€uSRFûoJ ôt—È;ütñ5ÉŽ ém2sü”±Êð ì“Ê0CÒqÒÁü˶ìkÒ~×Û?šD©, ÷¡¶%õgF\/C²ðíeHÇxŒÏh=.DºÔšîiŸRù¸¶  àžóÛ‹ÔÍ>ÿBÜ«•WÕ90¼‡#rÖl ˆ@žturß™°ì\Áƒ ~>'- ‰åS¿•áù¥Ÿîo­R)ÏñGÐωm"Šï)² kúºKÌ[A½ï!{£%£5È#©„~moC§÷qî¹|"6T¤¡B³1Qyc=»õÄ:fÑO^ÿ¼3|cbÜpyÚÏ:ŒJÆ÷²KÀaž}Æûås‘IáV驃ˆvA‘kUÕ›—÷AUEL]¥Æ3–Õ›¢_$ì‚+Ì ·9ý§éï>o·(f,êCkù‚úºž áNߊî·J¹U̦zKímh²»{­:_Uù×úåL¯ýi‡1„$âF1ÅŽ£t_-Óg ™¯]›òƒÙ2|£Ë:,ŽØ£q4½ÒÉ\àdY~švP$!ïÄ¢R²So6ßNˆ…vö’Y3·ß½ã7J,‹¼„ˆýÓñ 3&©½Y‰K:c+¤ww޶mTaåWV¥‡2¨;yïZD{ؾP/›F^ä`¥ßÂû&n¾ë8i³óÀ $ðìr*@îgl6æÿL¸~€A/Þ*[úKk|àÆÇ>"~'w¥`:Wr.U¢â*C¡’9_gˆ“Òk›2æ™Éƒ„¶…ÕË™˜†ZG@Eéh£ÜÕ¶l!vfo(±3#C7©AðèÆ¬›ûÑþÝHd£b]ýZzÈOÛÃ¥© ±²5CšíneV³“‡‡ÒjEm´‰.rD­€ª­<ïëµ¶dâbg%êûNÓÝ ·ó”³¶6r>+•WQ®v>x>~8Bvsååòäí&üÖÈâĉ}‘gŽôo «fû $NÖ;®3?ñ(.³JzÿÊËîqGSý÷8º“î Ÿ3 ŽŸLá%;ãB…­c7Þ¤¾(§{7Þ¥>š• ©«ÏN •£¯yåÈFwí&ßHg¥žð¦7^_´‘TâÂÂãl?HK§b¯—–[Fþû§òl¯ÝÒ _†Çà´¤æ?Ù§ÌT4·Îó¤ÞºÒÍ$]¿ã{ž«çINÅß))ïì*8ÀFë5–ôEÁEŸ“·¸*iYGòÒéž“5}úi™¾€hb ÃÃËJ˜á*糉gL⾄(b‘­Ñ_r½ ¸³2Ö_œqÖÅ:ɸWGùsg¡’?BZÜ|§ð¡/·ÛgÔ,Óíiw6Û.ì2ÎůÜ¥z9«×3åI±ûËG_ºX7R"ŽÅ,äïú),¨îËé?ºÖi a‰ó@goÉ#Ͼ Å·õ¸khÔµÜWì¹sŽõ>ŽÖ\ï!IPõ^k=·.&îdJ¤Ùux⯖L3\ÒûØ;da5‹BˆƒÆluÓ™{êçÊáêÊa}{·–÷âØRxQKÞ®‚kž®x4rü],ï4Ãý&ܰöIŠá§¬h\ûÕra÷ãkMÇO˜MRt©OJáÚþ˜Q¢HîFìR¾ÅÿYä¦ïÏå'{g¦;/ÄíhÝ &ùfœ¶q7÷én>Ú«Á&×Gè;L3±®G ¢n ¼ù#ãŽ'­µ{i«kEç¾·xÖkí8ý+™ÈËØ: Ys…A\¨ŸÖÇMå*þêÇj+VèÉE'}mæ8çÏå¨?„Îå*ì8(ŠAxÉ­Å*ÓIwf˜g°8ùt5™{³¶KòeUž®f^òpïd¨¡v¹*P§`$š>ÀKþÍÜSYg5ž[Åp·ðG…¾b1§n’Vèò6 º´iÞ /,bæ>c«°ýúdï‘®™:Í0Hüç¿«ÖGQsiyÇôÀŠùÄy_ó‰:²¹êg[¡KeDio{Yã§“ýÄY¢‚Á!+šiçìxKJšÞy¤¸¤+ÍÊ”[œAøšÉ÷±ª}ÆNPµ(Ÿ½Íü;êÚë‘ó×G÷œËn´Þ“˜ „å&°<él,h~2gì.=÷‹º³a¹òwÞzóÀðJ™hŽs}ñƒpï^Û‰h5P ›ö²XôÄ»ÍÇÉoN~HƒêÕxdÝÙå~ ;Bæ„r\5P{3*#»!ë1„úß¾ìÚQ”¹'gú·¬”kIЩ¤k_©à{×å¹QãW½6~ËñÌð;뤊ÎIÑqR ­O¦7ᇮR–Gê-Ë9×¹H²‡o¨¥ÈF4ËÚá’õ{}ç<¿¹Xkbµ™Å³>…bǰkd˜2ºÄ­Tá…ûÆ¢½|fd< “h=ïùÚR?7q`O©|jÏ¿ùJ?Âz^ëó[Âûh]Ââ¹ y·ª6«>>ëHÇ'EokÇR³¬‘« ‡»±"êß¶YmȔļª ×ôs¼¦j™›E¯yù]|4iY¾-¼§¶¿ušsÍ*ÇÏwm3ZÝÕ¨8\7 ±ØÊ¦[óƒû GÄÕ¢¹õ6ÿÓˆŒ endstream endobj 135 0 obj << /Type /FontDescriptor /FontName /DVCMRV+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet (/multiply) /FontFile 134 0 R >> endobj 136 0 obj << /Length1 1785 /Length2 12475 /Length3 0 /Length 13600 /Filter /FlateDecode >> stream xÚ÷PÚÒ # îN 08·àîî|€lpKÜ-Á%¸܃ww îî#÷žs¿ÿ¯z¯¦jf¯ÖÝÝ«wÕÐP¨j0‹™Û›‚¤í!Pfv6~€„’¦;€“……†F µýGŽB£ rrÛCøÿe!áB_d’@è‹¡’= ïb `ç°¿çgçágcp°±ñýÇÐÞ‰ t›”Xòö3 „½ƒ‡ØÒ ú’ç?G½€‡éOw€˜È l„”€P+ÝKF3 -@ÃÞ ‚züOzA+(ÔŸ•ÕÍÍhçÌbïd)ÌÀpC­ê g“+ÈðGÉe èïÒXPhšV`ç¿öP7 ð"°› Î/..sà%;@CN â‚üe¬ø—àïæØYØÿîoï?!:ÍÌìí€0Ä`¶T¤Y îP&bþ‡!ÐÖÙþÅè ÛM_ þ¼: -¦¾Tøw}ÎfN`¨3‹3ØöYÿóÒf)ˆ¹„½uFùã~’`'ÙKß=Xÿ® ÄÞ âõd†˜[üQ†¹‹«ìè’“üÛæE„òÌp³±±ñrð@Ž»™ë 4=@*Ùÿ¿Ôàãå`ï°x)ä¶½ü x9]A¨“ ÈÇëߊÿE(ììs°` ²CPþ‰þ"Yü…_æïvè³½ÐÀöÇç¿'Æ™ÛCl=þ1ÿsĬ²òŠÊj2Œ—ü_¥¸¸½;À‹™“ÀÌÁÍ`gçàð¼|þ7Î;ðŸêÿ”ªÁßî_å ö¾¿ŠxéÞ qý›ô¯ à3(Û¿ð ÿ‡þlÜlf/_ìÿŸ—àO—ÿÜÿ#Êÿ+ýÿï¤]lmÿÔÓÿeðÿ£Úm=þ¶xá³ ôe7”ì_6òMu@-´Èìb÷µrPàËŽˆA,_xÎÌÎÅÂÆõ—ì, v™«‚¡fVqé?ÃxÉa †€TíÁ¼;/^llÿG÷²zf6/o‹óËÈþT^6ëóJAÌìÍÿXAî÷ “Ðå…/ˆàÅþ²«æ ÷?)`eØC_\/5ú,ìPþì{n«Ø¢¿Ð{«ø?ˆÀ*ù_ÄÃñ¿ÿ"^6«ê?è%ŠÖ€øz‰búâ°šý±¿žô|Aÿ…Üœ/ìú/=Û‹Äò_ Àjõ/ør ð¿àK*»Å~¹1äŸØ/w„¼tø_ú—äöÿ‚/å:ü ¾¤rú|Iåü/øÒ7è?±_2AÝþë%™Ë¿àKG\ÿ/‰=þ„ÿ3Y3'§—ÇïÏ|ûðŸ/-ä2C™›¶7´® l¾©#qcÞæàBï9 ½@ÒÙ”"vÝVó—¼=çÌ ›kŸüv»Š³ÏQð\g£KÀfc´âÆO0WÓüÚÂtƒÉ{GènßYÑ…ã·B[›ž 'ÄÜ’à¸^ý—Û…è!“ãéÖTꮌ m}Ùu©Õ1"]í ÜpD"//'\`‹XjK™x¥ØÄd«µó™èðaÜ[éÝÛ”îîõžù"&XðZ ÉÞºƒÂEêžpòNçû7 &£€ šÍN)¢ûhzÿ‹æÀOô¦Îƒ"Tir›£g²g›rê–õ²½«ðÝIð«Ñ”'«Èbî¦tëFïÚ$ Cç4ó<9¹éŠ:‹‹ep…¤‘Q»f‘¥Ç«X2°¼+ûÆb4Ò&Rò˜¾áÖªjœ{Ͱ™!„8E‚™Ä[Þnø©À¤G ZÏØ/ù@+µr›bÊ¢ÒP`†žÞ“íSùkç’z¿9”ágá' Þ³6Ó±6ü‰e݇©<"îýi~—i?Í~ÞÓ¥3f,ó¥k¥3$½ˆæªHé„׸Kd.È'ʶܮ öž5­‰zÓ&Ž~˜¸L3 ‘C ð^ÈvÆ[L<6l>V Â}!ò|¨<?K´M;ÑIzz«U9hŠZì3’åadÆ$Z’àõ¥zà}§ïñŠH¨¼F[UQWµë%u|õ¸š’ú´J%%û+y†öœZŒÈ>ÌÒÌYq çû"—\Ø‚aœ*ßœªf˜u²ÒœD¾Ë¶­Ÿ•TCJBˆ,¦8g¿Š7Þø5¡ËM Õíl~Êš¤T Ï!Á™¿Ë(JåR ”«ßµîœ¨e.¾ƒÇè’ázƒ€…‡C̦GO=¼;¥ëúæN¸sľꫧ9H²•î“–À›<–n 9nï87œ—/¢RŠç¶lj›æfÂ¥õ÷‘„]÷o×¾"¡L)Z•–}¿—ƒø`½!nàѶn3‰©ÖÞ`ª_ž({>ò)­mŒnïHX`…ª¹Sš †Çͯø*[•†Ò°›ÌK–n­2G:ÎCÐbXO¯td¤*Á4 ¹é™W€9;µÃR~S2RÓsOax³Ä«_EšÌÊèã»Ì’*ñ9ÓÖöò9Ò ½𩽠‰{ÌÀDòŒÍ‘産ٶɌ'_=7gýWl˜nyÞõÉŸcàª÷» Á}ÍJdD‡>ÛEŽ`…v|Ù~J‘),7`µƒ8N»WóQÁ¦ ­}bF»©o36»PÑ{Û®Ì Gµ× Ëj s>Ÿ¼Ëåþ7`eÂoI¢fù5wˆU^MüÅGÙ@•+ù·¨9gÝÃà PÀ§“+…ååA¦&ævÁz:öœù†i:©ñkLíû÷Üü‘"±œ¨8ê.a`ƒ±#Ï [»û] J>W…¯ìÏvufMÍ}ƒ+±@Ø'<~cî´‰Ýþ!˳“3~Hò%9ýýR‘Gl¡HQùÂs1ÌggÉ@"h7)¢éÍÍ䃣Y^v¾v^rݾÏro—ê€Ý“º”Õbc/ü=iÓGX…ÃQޏ©-ÜÖQ–.7V8Žãî#± ©j^LeÄ6.£PžKw‡€¦ßD2ðÕ¹Ü> ¦ñ^zv¿ ÜTxûqØ/‰ßg«…UiÎÐâ° AwÎÖâ,‡ùNzØ{ðóUŒýŒè³ZOf+Ç/@÷ëVSá«QÒ„¹¶8’>°;WÞ³º^6ž-Ê%mÿcå¨FÝ‚}8ëD:Kn¼þ¢]~ƒ +ÌŒñN2- ¾Ê)§ŸV°fi;5À–žEe+öÄ#ÉÔ¢_ yQ³K2Ô·k¥.T/jNu¬jº`f‡Z< ¥±ðåf³Ú<ªw~+{SJHU¸ùˆÿNínÉÛ-c+ã¤u8w âRãwéUHvk¹`„HLúº¶]MCíaÒ«ýù“€ÕLèþäˆÄˆxZÎ[U'##径æí¸Í1ß… ý"’ô§h1›BÂí~»cv!aç<³”¹¾ ã¼ÉEÃ?g æ`¥<„ÁÄ;·ðËÏxŸENàNÓoºÄ;g]˜ð1–ÜîÿÛG¤)5f rô!çD…ºÉgÉO¥g? Jü…Ô9 ûðïÌ…)>, Gîó5)}Q«BN`Õž2¯^+ƒEZêd|ß^„Ã/¿Õ!¦ ;=ö_$•»tH»Ìǵz×PøÉ¤óºâç6ÉÙ•1fn¶–MÇ´ íVÔæ;£•¶ u¡±¦e¾âþl­Ëã« 3O>‘c£š ‡Jz’,ŽÊÅý‹AæÙ_žRÂnC¬ËOC{N¥ù´j 3lú­ßÆÄ” Ó-¦t‹Ôº’…nR~Ÿ@´„ïŽ?e/Òô×?ÒµkŠÄ¤ ±à¡Ù_±Ô¸Õ‚Ÿƒ–eK‹Ÿv¯©$"˜M,…Þ"–Y,1 hÆUIÉ|ö»&}“s‘ °‘&±DàNépæ+ЉªÁ øx1*óÁé§?õtÖoÀqƹâf{÷ ^ oœÿ¾õ[0rªä–i0¯ )ËÍ‘íay'¦·­76v Za5kñÍâWºzUCAä5ÈõDåä Š­A—ÄÃìÇUþœ„µðT:oæ g üinXÐÆ€d~<9û^*dd¨Šs> #ï{6iÂM[6w„¼±ð£k©pÔ; s:ìƒC-#Ü ïêñH›Sƒ€¼@Ã×±/«ò?öÆ= YØo‘6`è@ÙátlÛÛ0{8J-P~Ò¨O–í+==;ÒŒvþ{NñœÓU…ïð P]uxEòÌ×ÓXûþyÝâ“\°[¯"Uí°Òº¬B@¶›Omú¥¦|ýõË·Êê…NMH4l oV{Y6š#Ly»4³S$¼B™Tñ]ùP_ÑP¢´ö|cÇêšmľ0òWЖ[ðl(Ș۴¸]«rÞ&€i£+L‘»ÉÐrô›æK êFa^ŽÊ_·Á»NNøŸ¡ ë&q}>#"鞤]£„º¶jqžõ9f5tFƒlVõbMÉ8nýNìd­CØ}›ŠU9¼—€¼y}¾_mªT×®¸ìo¿ïoc® maãG Ÿ§ä¹~›Œ >À:/î[Yâ½ÑâÖo0žÀØCícؽ!Ùõ¯Ýõûó??Ö³OF`™ÖÁ¡K~ç{$ô6 †Ÿn+e»6Û®Û„d«/´Ë]}q¨ñkˆ zr;‚âª5ÌÏžAàÐgtµ4yí÷‘k¹)ÂöÐnZŽÓÓýl‚æ:=ê§6%5~Õ‘æÁvƒ£öa·ïWM¬ç®¢ÖõBÃϫƊ ¢Ÿó®‹Ü~*×#úH/šë 5Äô‡¹…õþ>¦i*˜ýÌôÛgÍ>"=55%óS`ÄÿöÃq¹ØÂ[Í?2«Ãäõ+JÈž"æŒ=kèg:·ˆmT¤£w:¸ÙñÀª‚¼Ô/!öµ§÷¡ko1â1m8ˆjhA¸wøŒ³5A×­–O9ß¾ >>îµRTYÖ ¤³ø)âXíÖIUÈÖ›º‡^_Ò¾ƒËd¤‚ydXÿÌä™|Ûí6Úññ÷÷rvŠ„\˜ÞÌÚŠêÏ:”.#€x»  º{ÁʆÓÃC®¨D0=ªQZ:´víY݈íûç°!(α×T¦¥xõ=åÔJþõ±¤Å ÅêŠwXl¡Ú üÿÃi}²~èOßìgW2k¿”þ8›bUTKÒ Ö¢j!„iÌó«hcC-²ÌÚŽÏ=ò84Íc&jíÂ1>lë¡£½•QÏXoŸýp¹×[Wêò¡SjŽƒe‡s)ã26fÃWkG^¹iÈÞùê·pаX¨;„=†x®bV;Ô=˜ôÜY|¼ûb¼¼ö{˜ì7¹E¿BB²4úU~¡‰¹Šˆ„%Åg®4MÁm4ÄhÛ8 Ùºš.äÀÂñöyWýúiÐbLãu2^P-LKëI*‡ˆŸzY¡s§Ý¢qÖ‹8ÖÎa\‚™ˆ¥þ%é‹Ö|)sù°“²PôÆì02¬Úc…¥I™\ÕÕí.ʹÆâl’ñ´ÀVh®ftnÊ’ôÌäp>í~]ðT»ÇÅØ±ë×Ú²Å/,ñs¸Ódž«§Õ}ŽœìË[ÊZÐŒdÕ p+F}º.œ$Î8ª(òüÕ<‘¿J0²ç šºF‚_²‰5òì=¹nÞÊšL™P&^quaßa¢Œ„­âÈÎÉ¥²ÒA‘tžuÇú¶‡]H¹ß™vÃ#ñ=(¯÷ÁGÔÐN–ûÌ×Q¥½CZD™æ¹û,´Ìê}÷C"O—#õãä€A;…›X҉ͯ>:M%AQ1ÿÀˆ²U^ ââa‘âóÒ AÀ–& ÇGÖkÛm mèÂ+o#¨“&çúBgf+5”ѹ;¥…–Bz(¨fxaAÞ}³Cq“–• ÆÊeÓjpõ¸—‹üo² Òò_§Æ-h‰=´E¾65&ì¯Y*;AYÓPÊ\æö„>Á)Ù'þ÷<µÈ™™­4ÜwÛuìüTÈϺZ3û®T7–i#++W €Ïw&5.¯4¾ßûpÚ‹·({B#;‚dgègŒƒF´;ÍÍÈ'5:ŽÃ¡Ù…8Xÿë·DÍI¤Jƒþçê)ܲ‰ô³qË[¡`ÁÑÕjE®£6øÖ©|œQï*gPûIqòúÕwA:÷}ó­ͺà,z÷Gg'€²uý®ùZä Ý’ÂŒwð¦núLsÊÐH¥cÆ?±UHDzc•âÛ,ŠúSŒ‘ïêÝâQó=HMM‘gÿw®éLà°“e8š‡;Ýz#ûóàÞOŒf÷ ž Îe†Ý!¢+å¿VájòÓöÝDæpOľºýNïmDùƒø–£¦sþt¥*h"佯40Vs›"A¬ÃQ¾ïUùü&äš$²9'ë¸È{{³gÿRç§.Öψ–oKé¥qÇkõcº_&gp‹R%.²=ٲNJ=#æÏ¯çš-±ö ŸöGgNç~&Œ»özöD02>œžÔ?GæcÂ*¿JiÞ-+{>¥ ýyýá‹%µð¢"–¿Øþx§F,xo1)Èã2ൖ ²^W¦ŒHšüX‰bïÑóöÌ)‚­ª]ù'ìZ„ã…"Q“‡_')×4Ás>l?·»ò·i„» º@ª;¤Hx¨}íÃ, …'¸·ªfc0ogfC¸©gþ3î “ô2äÜÃÐBÖøÑH@ÃCV+ö5ë%ÙÔ3´ᘥpàca;ÅÈ7°[ˆ{z<ñ[/¿=4‰‹%4 Sï°ÑV¢RT¬º¦Ê\›Ž¸øÜÍ´g…} ö³–äMy ßÏ%vçœøsÉŠ×Hº²w8©æ i±Ö­~ œî‹4G:[L+¾Ÿ‚Jþ]¹:žÁ’·_Å—[xÔRôÃ÷fã›±N¾Çõú™º8¶¾šêW6¼¢!å}hAWLމb}q‹p’û! »\ÊâE.HgíPÌQOC‡’†_ùñ”y‘‰,"ƒ±c哬‹¶‹ú¶K´©ÛxopBÔ}£tÜÄ)r.b¯ï!†=¼ŒrÜn e]q«Z´({“É/VÕ‰‰:_ã4œp}û<²ôn ¡ëRÈK/í@ë}”=£"ÍÐ’ÐcÅ ¶©Úµ/ÛŧØÑ¹Â¿½€Im½Bº\D½UƘúºíf¼úf+]ÄÍãaß4À}ÔB‹P1:J[í:Wó³Ö"óû2ÐÂî\C#£AuOô„Bǂحç¨ÎNLy°ù£âÚÅFü£ÞÔ‡1Å•Óï¹×ò%jq ¤íª°ð0Ô‚º½ÍVtÈ*d¯F‰1RÈŸ« Ä úcŸùÛc¢xǹ6 –¸ßG²ý¤×_ŠQ¬ÄßWY7ìΓº‡O›ŠøWɕĪqÙ£-_¬«Èœ\ç^U?mG8%MNH‡ðîå%³ixâ &ÒLyuÄt§öýÃ6²\Ãýn`µ¸ÔîkùVZ§f=Sd‚þ I_Gi>³_T7ß‹ÍÌ’ˆ§SZÍ{sMÙzڰþ.[uëÍœT©àÉç÷„ßMÊ¡JGÍox HÐlåÌtíØL©³Áï³§Sh׳¥ì’Î!į"XÔe6ž‡Ä>ƒªŠaz»sw9RtÞz£($U"ŽÊÐ…áÝ£kî)nñ³#{ÑÐQ•†Ä.S&ʯg{C}0LŸ78Ñ[³Y9¢¾830á,¾º_&.‡¥²ã«wÏ^èGˆº{ÊzI£bêwÈ-¹ÈǪ¸lY;ºuÕáG½å,L½²¬†Ñ¤²¾ørèC˜¾yó’•Kd26‹OÁj÷Q¾SöÏÓ›¬ëíK²Œ/_~gR#ò°˜–§ú9TU"°)ýìœAqJJr«sqüø†Æ0Œý¨Šir‘ÁWDM!Ö¹û‹ûοƺ/»ÛÉîj¡Å"ß«U-¤ ó¯¾ /²é%(fW`%M;.‘H¿!Hº¿™³¦9¬ûpØÝy¬ óË~ö-b9q;‹õƒ T´5“…ÏûìÖMð§•ÙLÞÏû)Å߇ ¦ÜEË8jЬ ëg)1 ¢lǹ@ ÿÞ±„l qíNɦ’l’N»¸gŒúûד’^]ó•ÄŸˆŒÆ`6Óý°…1d'ö¤[ͺæ•%ñ%N–§áÀä»Îqc'µ DU_àFÊõpxÅÞÇÇ+è)Y‘$ÚI]Ë8è¦Of^md 4½ÙtyKÈ 5¦mCm®*3ØðOÊLN}n%ú÷dQäFbj(ìmòü@úu°OÚy[æºVr~2ÍkÓs4“ YÐ!jŠ„ÿÄ›pÌÞÌèCx ùbØÕú|ke´KÓu‡·Ï¯z¬CN9u~·«¾º¾x’ÊÄ0 ²Àè3`ð2iú¡iÛ½äwõ‰ÞöU:bPúH4@ÿø˜ï4¢ÀhïiîÌ#L`A{‘ö¦öDœ•S”†h¢pQ⟘y½‘=ÀW*пÚ;´¢µï¦ ÜÄí3í.‰…½,ù~\(¹j®¹Åú–;Uµ‰ê´‚BŠ}mu—v 2CNkêo÷•dà ü‘vœs_‰?œ[ù}ºçW C$Óxß1âç5q4Ÿ¸¦"jûÁ{Eƒ- Áš/ü±€ó4XÉÊH¡QU¤y…#Ù>Lhµó'¤¬ôÚ&4åm´boÃü¾æÅ{ËÓZE–CÉ”XqK¶µ\Îp¼Ó`öÚÄÈÜž¶MïÏHçÑ6G›bì•$Œx›£ù?e>ÇxvàZY]äIžŒ£]åŽùê(|¦q½Ü“3V[«.0‰>F%vÜÿ.LùÎàÄ"uÝZa-:î`èÜ9ô¯›ÏÊyq*Vƒ›d€1§Øïæ=QásX¢õ•“IiÖv±&vêîûw«*]=!+ʯÊs]ËÑ=.é‹;B!‰ËÚUš¦LTw¨è>éÊcì­à+Åàê¡„r° §âé–'1æAV»Ÿx·p0g±!¡-f#·î·’墧žÕs"S{¹}ZêÊm…húÚhêuŽË%_Ãt-Ê=†9—PŠ3lWšuÝYHQTæ‡P§¢Œå„©ôqzèF h@äaùÁŽÏu•É ·Ÿ§Êèhá7Ç1¼X´Ó©¬îØ_ºü­ûŽsÞ=½5ƒGݧ%zJ MâW±Ÿà(N.FÜ:äË“UITŽåÄÚ 84UxÅ8ÒBýuOÉ÷šÇDÁÁ]dHd3g9hB ­zÓ÷X#g£-Ãy£ÊÁô¦{E¦S¸ïÝŽ-Êñ•ÞçuUL&J—® 2¥;rîeÀêñm}%öۭý3ºÌXdÕ€ü(Ç®>kŒãØxþí€)æ÷CìÔ×1)ƒ1ݰP&¶žDÒ§$"Š»g5?šô›Ð«öv¿¸¦ÜwT7n«™M©~ÏJ;³„$n¸O¡æÌÙ[*âÔǪê2›èË Œ 1ϸ Á„•~øš®͉k¨•¢& ˜-3RM˜u6ÅÑ«q޽ÙB+Ê#âLÄ‚£ßoÍ6\.}#`µRhÖü´‡êô&v(d¸é[—ŽÍ‰YŸÖ…k}–ŠúùŠ}¥qI>àÜê­KÝõ½ã­Í$Œ¸;â6®@ïÊ)yëA¥=*ë¬u#Þ^ËÔØ;‰QjæãV(n¶@¨\Y‰u¥ŒÀ `‘9”þ Å“WÇô³¨•õC±lRãÄ{Ó«aŠ Ø ÷´ó9Žˆ¶Ú o•Û"^fÑ›W—{’º%†úì›éœŽÿEBúX³w± ö>òh »íM S^̹òש1§Å7ØÁ)) ×#·Üp¨qˆgYQ¥u£ë5û6+ù©Þ„Ï5‡ø°Ntp«SÜVÚþ7JHЉÚZÂ]ׂ›gײ誵, T¶’0ó•R°÷¨—›Î"ZO|o†ÈyIÚÍã|ìóÃuÕ4TE6£?A WÿÍNüHL¶ñ G˜ª¥ï¨™[-žS¬§· ¤q[*§ó¶ƒ8)0Z£-|¯ih ½åAM÷ƒ.!N4{!Ãðe}i6ù®[ˆîrF¦¥Þ=² ÏÔ®”t‡-'Ïz¢.…!é\þ®äNN7sûMÔLªÓ0‡6¼¶üÖ¹ýFMš—6b¾š…¦õ/ª…u4$èaw\ ©=ÆZ›b2Ъ÷5Í"Q–s6ž}vÂõ·µÕÒþÊ€U£ÛsóvÖO!U"VGçô÷ž6<3 júw2tÖô!Ãp*Ò äɽë›§ã[³­.5EêX‚ä¢\NÒøÑÉmo˜Uƒ¸TÅé9› juCýÒ =(ñTš€!’nGƼã^ŠÇ£±àJaËã¼6Ë_]ãgóÉx½¾¨ßn»åœÙö:&—ý+ ûŒ‘¶·ÛwªªæACÚz8Ïí@¿šÓêF@ïàãc»su±XŸNB)“Ã>_â°[_ ”õ+s\‰.*iÔö «ûC§ߨö¡ æ6Ó5ý"'?Ó’ž=÷Y£‰Enlœ5èºÅ¦é5ÌB|=M|¸S¶‚äœH¿1:i>ù޾/;­”ÔQÎRÊ]bÑ7KH‹¨>EšµˆõýfáT'i ÜL°_ð r³ÝõUÀPª,(±¢Öûþ¨?'Mê´5®‚õ€…ã—˜ñxžê¿˜mНUÜ>é5¢P+‘r«® SåQ>R–Ð'Œü÷’ª6Ôò3_:¤oÀ¨ªèðËÇÊ ¯”þlZ´Mm©uÍ|Ñ’ÐäsŠÆ`xÈ¿7Sù¬_¢¾b!1I&ˆZM¯Ô£p¨Fë?¨¢ž]˜ì)$ Ø‹„_‰Tª‡‡’¸ h² xêhê‘™Š¤Ëãf–Ys- © ²Ù[Wnð0}EX#6·*êÒ’euŠ0þðÀèѳœ/yÔÂÔIb wNoôÕf;Ü¢^ /DMÌo—iµ“Ùö]°H7fuÊÕ‹?ÞFÖò]´ƒSå²Ôa óÖs¨ŽGr3Ò7 ö=Uâ¾ÌÑ÷ÈG1!+«ùx…ˆS¹rPÿ‚DÙ'“†ÑË\nÇW4ß 9ñ0¨2½kfâÕ[{½|.KOø¹†*Æû¶† Óâ¯|íB]eæP3zìË¢ ½Ï¶6ó­¦M"ÎyNhy v˜µc^CÃLÝËFÁ+ ´Ô·YÞÊ~‹÷)Ì©’)eþ]˜ï(„Œ„ÀÊj‡±B¥ÞYE~ïÆ‡N$ ƒoûŸÀ êD?ú%6.ßåd`P°ª±ó«JNC²-—-³ÙR Bl¯²=7ès »ƒ£oVOš+n¸¿®®Ÿöl¾Bµ!Ëœ~‡_ß&*KD{w´öžî #ZV{Ӽ܎áÝDgÐûô@ß·s¥Íx ^C)ïØFj†Ê¥œ_p]Š&E{ïѵRîâ”Ë4ØZÓIžúØÒííg„À‹tañÓ´¶ù9Ì\Ò-³ck|‚*dÐøœ0ðå üàGš«Ý¹ßÕWû rzÙU©ÀÉÉÒ-^ÒG±·x4•â/¯ö[œ`íØ•Õꉣ‰0VÅ…¹}ˆÙâ«]e«¸ã¯ŸeÆû,J´×f‘EZáLe ûÄwR»È—V¾Ö —•ΉYw|MÐÃy5/óm(Uð=ªï¬ÑÆšn þ’¦ÇÊR¯B}/šm‡ÊUÄ3=˜‘»„£Aâ%ˆFh >{‹t9;øÈÉ‘@¶PZ.±‹ƒžvå}å)ã}àOCÚ9· ˆ¢¦í~Œ5þf”Ä7Eí0t]µf1àët­9†Fö í}ð¨•Ú›¢Ô]Òy¶Sz®4šòÈ­OK?XÌDv©œäR oÞ+;#1š¹c¢1 7x'ñg¡›í90_¸œüZ¸€å 0„6]v,h ÿX^U]H€­ JU'˜@óý{ãbGä¾Xø†a:E°'Á õ»i@dEÜä«Û ò©¥AdEÕ%ëÌÐîÜ*0&r©2!¤÷ùÆÑÙÙÚ/Vì°ÅÚ £A|¼ƒñy,P±±¢žÓNÙŒ‚$),IDO^Gm]š]ÙlÈ’£;ø@1þ%«=)ÕÓ€§çž+ADm߇Üõëá–>öÉk™fš E#nšguGo-­èïoð_ÝÎÇ¥'¶j³ÂWjy9­}žÚ´b+Óñç5Évù·©†ñ§óU»Ÿ>ŽFgv?ÍÙV$:ãx±åÖàd»(ˆÇo~Œøá¡Á@ý^×Cç¼²pë»9¨1m,æ”ýI®þåhT^Y¼±Õš¡m«á:RNÛÕi…ÿI!– ¤º#7JaÒlõ)‰ÕùÌ„=G}k[U©Aä4»‡…ä9Ÿ„Õán»ì@éK¢é¡ ˆß¬Ÿ~n™3¬{`9 ®×d™°q‘SèS\sªó´ñÖ’j€Æì"ÃMä ‘¶t剫FI3D@Ï\•xÁÍìήe~ÿòJÉ$†ß¾³:0ù–’@ÜÕØ‡>Ã/øý©Tîo÷åeê§É+›¯†úJ×îyÆ%r韆løê_¡tcÂJ¤0ºÄ-¢; ÌmLGó¥¿ïÕ†1Õzˆ …Ä"«r‘­AÇÈ¢°»íW!0C‹Ó>ùÔ¨*û{äÔ샱]·R`ʧ‹Kž4v«ë‘oÂóÆERwŽð£ÂšñÚ“îšZøÒ)ŠâàtfÛø¥„lÅï»ÓO½q>¡'Ñð¸Õm*«º¤ÎsMä—×{ï*NXßEŒ²¼‚‘úzûöÚç’¦QÍ<ª³íNþ™)¾­z&{,¾€½ÅÕš@.t4ætøÕ…ND‰ór9ÂSˆzðË:óÞGgÓÞ5}Õ·oעΠÜ$G”s’Ù¡IUh›nØø¿##-^kþp~/!œòU8ë¤ú#9¶t%i¡>Ü®FçFŒwA%™Ÿ˜µÅ5AG0øÜJÅi)à©b ö¾59&ÝhL1`øÀ÷ÊËÝ ÷¾À?í´¡ù»ŽíPÙfþ"RŸ‰i9nÜí(†E)¿²q›²„]Ébd˜Ó¤¬b9^2-fz…I6|Q©>æÙ‡óôƒ›Þžï]8™|®<Ɠ蓑޵}CÈz³f¼VwBÊF3-”×@o³1à W Æš‚uÔÞNB½oê3¨à®o'“YÕ¤‹16Ú·žæV¤ÇòíOüûŽÞ _öT÷ÍpKØOí¦G›(‡ýÑã$$ÕËþŸ=»R®¡ü æwÙ8áÈ‚^,‘}¨¯F·tŽà-ÐѱCÉl˜‡^‘}h²p|3#ý/bÀb(‘âàÕN)_Á •ÛÝ '^ùfD8ƒf2Ò§v–ÝXg†o5Ý5ùK%|ÒëY5Åã ÿ®þÉŒ¶ W-ÿúêÝuþbwú¯1”L­ÞÝÕ¯àt¢{Õ‡¹Ƥî/ü°˜…ô4»žÉ2’©§.š#'Ø–kêÛØÂ°Àá¢Æd¢iI–´åä}±ZVÿm·3±'>2mA«D`z›ê<§ö¹¤’±ÆoflçUí­cÀ†_A\ C׃Äoþðç_pžˆžCðÓm Vá¬vFÒ¼Ÿd¼l”~ðUpáŽP`ìIÕ3´þZ÷—7¾ÁO¶•ú"ƒ˳ÐÌë,‚ëžr{(o§…Y<É‘JMY¡P¨áÄä7«qàE”V ¦Ž}ŸdëÎÌšX™‘…W»ž!WÔ?ÖÓM–ad&jÄ€cÚ¨ÂMÅ8f¹_¼39{›¡¸„ÄCÚð[° jc{ÈåÉö¼â‹¥Æ!Ö91„F6¸£w˜†ƒ\W±ñ1z¬jšr#åàGJ›”Z¤Z?Ê“ÀÈÌ2'C+T ZA“y/R¸`(6¯dÚÇ*9Wªqš5üˆÉ'€kŸÚ¯€}RUŠO7´¶áÅ­i­ àKî3Âyùy.¥ÙçÅ;Ulå%­ÉŽÔñ³E8N$ï];ÁÿlæÛh¸>õêNŽ"Èd¢Õ,{Ef;qÕãÕ³*XR¶0ðÙט!„$quÌ'bÄbJ;jI¹Ét”%Oâ©ZyÄëûHànþ¤Üˆ(ÉåO¼GÓ#ìžÜ»¿tÞ@Ð+aЬ’€ §Á@<Õpõ4Èí9»ÕsD[õ!Pd^7fL|¬tPõàùÌoâY¹]Ló}rS\½:јFدó$¡¥¤ÿÄ<ëY¾ü”õ¼sô{?°ì'’?uæø­‰; j —k¡La¦V&†¸)¥dÈ/1ð@0=ø|jŽO*Ä*H@àa¡i …%T•Ìœí]%ge ¢£pS»OÈf(ïrÔc_ÃaH{ݦ…&îåb^\òÌ%{ ǽP£XaâT6YØxQªâxÚ9»¶éW]}B ÉáwXC;ÍLoG/îþ`T_¡ 8Ÿ6Z'ìñü&ÛßZpÙ-Þ> dܽ@ÝóF°óæ˜6&hU!ï 1ä¦ÓÞöGI“ÐûRŒG€¢—AZlc”;+h+ú9†ªåçnïƒ|CÀvãÏ¿4RÄ=“øÇ6Öë ÇNï±_Ïk²­#ËYÄGª2!*ø«xšÌNú’ê'ž9ÿ:E£z endstream endobj 137 0 obj << /Type /FontDescriptor /FontName /HJLNQG+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/A/B/D/H/P/U/a/b/c/e/ff/five/g/h/i/m/n/nine/o/p/r/s/t/two/u/v/y) /FontFile 136 0 R >> endobj 138 0 obj << /Length1 2302 /Length2 15908 /Length3 0 /Length 17271 /Filter /FlateDecode >> stream xÚŒöP\ÛÖ cÁÝÆÝÝÝÝ‚;»{p—à®!¸»»»»‚‚Ãã\99÷ûÿª÷ª«º÷˜>æšsí&'VR¥6µ7JØÛ¹Ð330ñDåÕÔ˜™LL¬ LL,°ääj–.6ÀÿÊaÉ?œ-ííxþa!ê4rù‰¹|ÊÛÛd\m̬ffN&& ÷ íxbFn–¦y€Œ½Ð–\ÔÞÁÓÉÒÜÂå#ÏT&ÔfnnNº¹„mN–&Fvy#  íGF#€ª½‰%ÐÅóBPñY¸¸8ð02º»»3Ù:3Ø;™ PÓÜ-],*@g “Ððe€‚‘-ð?Ô`Éj–ÎÿV¨Ú›¹¸9K ó‡‹«)Ð ð‘ *-PtÚýÛXîßt€ÿ4ÀÌÀüw¸ÿxÿÈÒî_ÎF&&ö¶Fvž–væ3K @QBŽÁÅÃ…`dgú—¡‘³ý‡¿‘›‘¥‘ñ‡Á¿J7H+Œ>þ‡Ÿ³‰“¥ƒ‹3ƒ³¥Í_ÿ óÑfq;SQ{[[ ‹3ì_õ‰Y:M>úîÉøŸÃµ¶³w·óþ/2³´35û‹†©«£º¥£+PZì?6"Ø?2s  €‰‰‰‹•t=L,ÿJ æéü—’ù/ñ_o{€Ù  ¯¥ðãÖÛÙÈ pqrúzÿSñ¿–™`jiâ0š[ÚÁþ‰þ!šýœ¿“¥@‡écü˜L}þ~Òû˜0S{;Ï?æÿ:bFmy %yÚÿPþ[)"bïð¦gг°²ØY9Üßÿò7ÿÿrÿ—TÉÈò?µý#ž´™=€ûß>z÷_nÿ™ ªÿ, 5à3(ØL3@õgøu™Ø™L>¾˜ÿ?¯À¿\þÿMþ_Qþ_‡ÿÿV$ájcó/=Õ¿ þôF¶–6žÿ±ø˜fW—Í·ÿØ»ÿkªü÷:ËM-]mÿ¯VÚÅècC„íÌmþn¤¥³„¥ÐTÉÒÅÄâ_óßcøˆnciT²w¶üë¾Ð331ýÝÇÊ™XÜ)·õ/ðc£þ7£¸‰½é_«ÇÂÎ0rr2ò„eú˜/vv€7óÇŽš=þ5ÚF;{—À;_€™½ì_GÊÁ`þKôoÄ`ùƒ8Œ¢€Qìâ0Šÿ8™Œ3€Qòb0JÿAäþ ˜ #®(J €Qåúˆ¢ú±Õþ ê#îªþ  ÆÐGeÆNF&ÖÀ·€™Ë9ëßòìߊš&#¶´—íŸð£é?àGàßðãDÿ™éƒ•Ùƒ¼f–nÿðøKmïêô‡óÀ,þôÁÜÂÓÁâãêþcñ!³üüh‡õ?àG?lþ?øÙþ— ãŸPì®vSøý=û?Ù?œíÿGýQ½ÃõG0‡—ŽÝÿ´šù?Òÿm4ÛG«>îû4óãËèø7dý`îèjï45þæé?ºÅüAÞù¿ÐíÝaÿ0wþ¸nÿNûAÑÙÆÈÙâ!>*ùS×Ç•ÅèbáüÇ}Ðrq·ÿ‡ÃG ×À»ý~4Éýdùðöøüïù§šW/ Ó¿cÿÏš›¸:}´Ìå_7ñÇð_ü¯×-è4]]²7á ¶ª îx¨Æs§?˜âŸ'?ÐH£¦÷^uêt}B„J¦®Î Üvú-œ<Ú‡¼±/Nu'´Fôê}ÖÚÖ–¨Üþìób¯2{л2ƒ94]x&\?HƒO¯&tèóêèó9À¼´[†<ÏÑ• Q©íÁ}@Ò£~°l}"té@ù°šCî¥lŽ>F=Z7 x<ß8{›Ò…žšõÊiáî÷Üî°þUDº£h7?R€ùRšÇé ÜÃÆd*•¾°ÈvåªsŽà®ÕÙŸ’‘sÍÒ¡ã237:–²ö-º!KÐâ6=²Å8k÷f•ŒÌÖtè»a$@)>$3‚'™$0ﺔ:¶ÔG}ör¨ô,Ú ò±M¬±ÐåyÁ4µ¯8¿"3‹}òWÇZ¼¦ÂŸVœ½äg–B縉{h#(Ô8 ³áãjŒ 3Žá¸ê3'µ÷_[™“\ħçš7 „f ü±˜qú¿ÕI諦Ðg'gßô9bCég?GƒÑ0›»ß±ôä³1åå¶°v •ïéÖpz­yÎ2ãŸPG43ì¤_ý ˆ÷Ô¢l)»?e—0ùÂogÕŲ׹¹d‚~üÕ>æåaâ˜Õß8WZ/,+²×³¥Ž'vâ‚ÙR~éÆiTâÁéuÑs‰™ù9y·Cþ3Ÿå5‘"!¥wiÜbÝ8¢{ù›ê¡*0“’Kìýz|o¯žezªçЗð^¢Ò_d±Ä~>¦-þM"¨7õ§vQ.$ÜÙê;eò×ÊPDPEïY‰´ˆ~£ÝL‘€ç‡i^öͬB%[á…Ú¼ÏËc^›cß2M0‰Â° YõÕas•Ü`)pkjö{O+âõîUT2ËD¿‹BèW³¿r“Þ _ìÒ ‹œ‘m SŸ %ÔñSiPÒ‡¼‰ J–ÁãÐ;%L¨å‡&/bjYúC ‹ÐYgƒ—Q ™*'Ét½n_ÕÚy*5¼@™Õ7$i J®œ§„´M"€“¥D’Ý›G ÈEÉßQR ã‘?öŽTe•dQAâÐÍݤ¿ZÔÇÔŒ¡ô_?¾û"Éàh‘Öÿé^ /÷æÙ&Ш¬Ä}bU¡JÝa²Ø°²òv/Cž»ò‡ºŒùœ±;ñ^*üD‡ó@À˜Ú\H¥X¸qà(†#±ÞË¡|÷öDÃ÷ãÂR¨hʃ>à }È>x5µ8ér;© Í¦”ÎÉ„›Øûþ©Á’Rœã{SaËò0ˆž[NÊrt{H Ò£¹í‰¿,°y°†Äå­¶½Df ÐÝæ›îÙ°So:Ò¥Hýf(&Ös îÂ((ØÝkHÞ|‚rt$l®]’Oëºí5>Y0ec€²¿ð£èLAÝmëBë¢;<Œ7Â2ÿ¬óµGò—9§J¹ôÆq–ß'0 Àç4Žûâ û Þd¡‚ –èÏ­S=¯1w»åʃj¾¬[}%þ ñ+Èšÿtˆ"S+ÿÜ’pÕýWè¸V vv¨›hu”Ðk_¢v+æÄP"hOJ‘¸§üÍk(¸ÿ›85×7á,CÚÔ)ûÓÕÓ$èªJÿ /tÃCbŸ·/•F4U“¦Gêp_! ¨\¤ñ-ã—ß i˜Àóú·ÕúW +` «Ã ²Äíp" øs+º4é°úÄ\±;1ÿjuZy{^á‚ÚNÖHÃw“ììˆõÞ¸0¬CO1uOÂóYF”y÷blÎ:–¢ìÒ& ŽXI_‘Ÿ*äŠ)܉ÒFž-„æãÜö®–sØBé¿ÿLMކº{l=¶Á|ž®f_ø"jçË&Ьýî4RãÝî„Õ«®ýÎ-^–»´ YµëÏÆ½&°chãØ5ÉX¸ëw‚è±—§â“eÆM´\!Ø£yÍà:"âa&i,þÂà®Áû’nO׃õ]DÎÚZ¶ÑŠÛ ÚÜü…ÔæÄ§œ¢ÏQ~ĈæÛÙï‚n7Ò&sNõs““/“ýMPå ”Í`èav- H3éSÌÑGE[CåoP%«ïŸ7àKÓ\!i¹ßר8Q¢<%‘¨fûÞ¶·Júz"I*½Æöíû ’|*L´ßð½D ƒ„šµý…‰6»w„Œ¾=RðŒ¿ La$ƒ¾Biõ„\þÌZŠ8Q+2i°@[áV•8•©$AÕqÐëƒ[û4æ0e½Ò›7Õ“PrªÆå?½˜è•´Õ%*Xïÿ–ˆõÂC(Å[u÷”¯ñN>¡™|A¶ƃe<Êí°ß ¡oš!2E¸$£BÊ¡C¯FsÁFœ3ë©bH)ßøJW ]}1&V®$L:dï¯Fb†M!¼O}Ó,¦HPé>ƒÓ+a‘ó? က¿´ æ¢˜À`1B6 ú’HŒÕÆÞxå‚Ü,Ï7®ÉêÕɼMÆA†Ñìû Á·Ílu`¹ÇÉqôJÖÅV ­i¨•ÊйM嫹*Û·òlÞð_û4Š7Œ—Pí«ŽO21$vWÇ2oQÙ>cF‘þ“†œäm÷WÒÃBím¼nÅTí~K~9Nn“§K"ÌÌN ø½o,’;=5ò²Ìå³±.9³µy©ËÛ&k7´ i¾]íA¤9‰žÇL,ȳƒ±‹Òšr€ŒéBJØ¿ƒ)HÞ:{Ÿl©Ú ÔñÊÈN‚„øƶ-¨SŸÄÎáÁ­èŸB ƒÎƒ9Üî¼\ ¿ ÁD ÂXz4˜ m:­£R8õá# JŸŸB¢ÆáÄ­µ @ 0«žªš~ºÁ>Ð"ûbH]ØWy7;€½Ìó)ógw2Š܃ ªÞŒ„t•šµÇU¦•¹qŽT¢)4lïÞey>Cô X*y¡ƒcwÙ­æ— ý/º5oý„I=§Ì=ûªæÐÆÖ»ü‘­ ©Dµ Ñ×ée@²"ïŒã^€×#ºgK³H¸½œ‚¿7¿YOS%@âaЗæ.ˆü‘& õ©ìÉÅÔ¹3STÁˤ©=£ø9]ÒoòËJ_KpÊE°`ZŽ ¹¯gììEÙ=Âs0m¤!ÜP–.À†M û VÄîºÍ/C¨vóT™(ŽÊU¢µÛŒiׂ63íýRK€Ôñðãò>ç«ôržä2€QP,ãQŸÌµ<2¯‚¿¾Ë€¥ë=fèºù®ƒŽGÔX|K~ÒÊÚ÷ÂÙ§»èdª CÔxú5}“þš'Qi]QWÿé¦KѪ;µ·j{í¶Jˆ»8ã\*¿ø95Šºì!-åWïT™ÌµÖçëñL®†óæÞWHSR9fLA4ù†A4’ÁLãâ å^DüË®V3“æ™ù\§†Îj8>s¿˜ËÔxv­jÙiþÕƒk½3SX¡ðB(öE)çÀç» Œ¡SÆ›½¶¨ ëÏø›®‡æ?¾$½æG-ýDö¥d³IžI:z¬î6P”ÞnåÄÉœfôþªáåIoê4‰í`†—ß9Aô„Ê)³=»tý¼<ßsß š]ºO™‹‹çåÓzfÜø}ÞÄZÉÚo(d–)¿¶¯ÿ¡hÒ o_z¾’8A-¨%J¥Œlžî;a`É9cÞ±Háù^…x$Wo}úð‹<Œ»ú}Ö9[êÊÚ]ÖŽeQ˜–áv+ pEO‹6ÆñV>¾¦9Û¯ ¯Çk£oË3@ýPtF(4Uë[(^®˜^Ûø¶­kvèdz¯â Ž8ƒšq£6Êb«_Škä炆Ÿ8y xl*'$q˜…u3§W»ˆˆ¥ö¡2©±½Ý­>ÚTÁ§3Rr0£B‡aSœ¦ŠýßÇ‚5¢Bâopª7*±rxœ±È¡ÜiHäù& Óþ#4^À襫6W´£äÂ})«¬"ÆÂ_¥ä%x aÆ„í‡f}¡Äùe¤=°9Â/™¯øÍùH’?eì¯6'”B¢Œ—äî0e•‰‘¸h¡É|_ÏKyW2ó©A¿È‰ošêò×—§^vɸ` ²ÁW£)}8<"ÓTZ›r5oBKŽ7§ÏŠë˜¡Ð _Í SŽrË,‚¶ÍÓ=Úókf/†æÕYoÌE¢+”£“:ÀújICÉê>†ÓuÍß §]ª(MA)Y[òÝk¨$~EØ93 w™R OPʰ™ˆû­æM£Ë¤7IH>"²v§_'ø‰))ÕçýâMîª!I³¡amëQ,ÉHò@À(Õ©ƒm9qQçÑ´«,µ7éÈ­š½ì´-‹ˆ1 f¦BÛl¯d öî\¾®ÏEð–±0ck埱Î+^Y-w: —%åS©šØWSÖ ½é†ê.¾z'h(>8ªéiB*³9B¼«Ã{Lߌܗܫr b>F^ öv³‚úC‹h©™#§A@®AÖúbªå«¥M…†ç–Oƒ™ad.˜çµ/¼]iк$1ç³P /!zo—<\î›-×äÅ——x)Ñ(—¦ª.«˜ÒÙ(\`­Ä£Y†•¢ƒ¹wº ƒcã3mc³~7è¶íçg<Þþ¢|}[ïjv»W{M) £Qо'8ŠæhUvN ;{–1_G›Ó”/Œ:þ¼‹UÒ?cÀ’4Á(uM#eo}Y¢q¼•…©ÝqeN] 4wb1,Y]£UPYÁÔ2Ùã}ýΞøNXž{8qŒ…}CrÓq¿Ëi.(r=3"S‚òM/\w‚5t7Ä—¶b\s™GKƒ’ÝIÒ%¿OÈzúJžea R›$l|Úú•’ñι+ GÌ%2Ök:ʰfG8Ù¸èî+Û¬*8ɤÍWFÐq#¯Ÿc/¶»t™„À§nj”EÐ÷Þiö§…!FìÚ᳕lu‹ñ4gâ(n !d>)ºÐ­NUH7Á«:£ŒŠH«5G/.¸Ý ®ó‰`TÚ­ÝlÈ|*-ïÏ™®:a•=@fì÷¥ž”ÃëÓݼ®2ƒ®€á«×lq†%ÃÀRãû´6ÁòÏ”ÕFW„ð}4»“˜0Ãù í~Qò¢¢·UIwLs$NxΙSª¢U‡`ü}sžcðÏ: Ï ú|ÄôEÌd5ìrI[ò((Òôo˜‹IÒ?A˜ÃLI³Pe¸R¤KLJÖ¦Íc·›LhÚEP@iK*16$4ìLCå}§U´\Ó•À›+Ý2ŽL Ìå­Ùµíì7Ñà—äÖ͙兂ûam_Hö ,¼¬4žM†Óå"çU¤í›[ê‰s¡5 ‚§å®…+0:@#Mí°°X‚—<¹ŒÃP1ê íûðŠmƒè9qì/jÞ!k´ÐuˆFE‚€(bþŽP>Ð2,92”1©Þ!´(^p¼>Aã‚'æe¸™Æë¦è–“¿¯¾<Ê4îN*’—ÅI5ò6¶—Í”>´›U¶oÁs_4'¸aMè]Œñ‰Wér$D¹*§|*E:U}Z²—^ú¬;µ®g¹¤f>£c°­ÝhpnŠ_õí-‰½°º„RËI>œŠVœÇ-6rŒ$¼e¾ì²ôËn¢Q‘&ï´|¬a½-ü}íÔ0ææò²”ÄØyÇÒQ€nWÛnŒ ¿$“õ°/83Aõ½Ö|hÅþ¹£ÀOv®òØüžÛø¶Qñô©:—|O†ÇĪŒµ(ÐŒV!¡‘‡UTô+¯"ò˜ ßÌ‘zaAnþî…0£„yìoô§'ùñöȦß¾r‡v®ÙE_°¿³­ç~֙ءe(01>-!sù]þ•ù”¡Éwtix¾×dö¥ÚûG9_¦ÛùýFË6æ„×ÒmßÜ$ÈuÊÈÌ·Mî 'È-ìÆ’,ã@—¦ô±42Ï“™²¥üÏç=ì¾¥¹o›ûLà9(w_ˆ” Eš5h´EG‡2#sNUüaΘêOüâ°Ú§–zÚ TƒkÙ§’ïé}9#¡†0Wé{3i°Z¤E«â¼™GZC…#Ó¶µë@Uá8)ÆSIBÃáÚ¥¡rì¡wÄp[î³o£ˆ½*Ü×RºËõ! €СÖY‘$Ÿ€h¸Õ{ÊO›¹e¶>âSÐ-†JAU…!Ï6uHêš…\ `P$–*õx´4PH£bg¤¿ŸÆYòS!§æ{ñêø2ÈNŸ– fõò¤mܪ<•nW_L£çuÁ]PÚ¼fÝðÎZ€˜|çN©>Ñ„Wå:GõÎŽG\ÌÖªa³Æpn½¢$s¢ÍtÉx ;䤦޶¥ˆ’Ó˜P^@Ø—ãL¤®¬7ÿíߺü+~2¾‰„!¼§ãÝ Ž,žùJ³‹Tƒ%?ö;‡¿úÎ ×63 ¾Œ¸‘²¢µÕ}OÇ ðóG9Äψ<œ3»¯›úéÎm£<¹ú©òÞýÜ≃Íè³ø`\³›"û.|k¤gõÎë0¬ ¾}ȇ~zÓ Â¯³ÄEðfIWäoséÃ5î}«øþçágýãõt+ÝÊKûÑ ýQe ã¹Ÿ¾–‹¡V!bá¹Ä ²\öƒÕOÄ™; BP¤¢zœk°£s“›—0ØÈ²JA:¡~Š«ìKDÃmó{ ü Ю¢“kîÍŸ¿®I†Þ5S_a.x¦k©Ÿœ,¢ÂŒ8…z‚wÈ"š`úU0]ŠHá—JDnWT©ù~O°‚2)Ènù–HpÁÖP»ŽHW óe–zƒçæ+‘lá1–ˆWöê­Ñ~yòûçð|5Q_nÜñêZã”=¸õ9þøk@•̘;5:·”ú»*³t†~fӬϡÅѯ{‹š[ªê3pôHƱN¼ó¡8ëè%ÖMë"luoó´“ûÄÃQBZ$Ðè"B©ËÉB4z©ôá)À2¦hÂ6sîiaŠ;ì,4€¤o‰ù’¶Ót-aðçŒ<Œowy>ôØ-8aø’T^:î>Î<¨çŠ÷Òz¿ÚÆg—’ÞœNΊ-xˆ9Z5‡‰–?¶Æ9ò¬ s¥ÀÖ#:Nµ¡µ£¦é$ª|ûQ]wbsØßϺ0åâŸ'‹<|'!PI7‰Ë†IŒg¾(Xlݨ¥‘­B@²,b¥»·©´[œ|ÍwWˆ'Y¹³Ù/ƒ¨ˆo÷ŽÉt}Yç­çß鯋 1èϵ³½Ïß.a1¨˜°k™5<öïÊH)FŒ¦7[{a—´vjÕü^ï·N^w“'¯|Fí‘-vP×®øCtZŠo9f€‚L/wPFF:ØïË^yƒ@Çëmбë–·yŸ?»_¹+Ä&qÖGH°&Ew½î:õ| BÇJ9·ÓÔ]‡}kTV@¾•“ Ç)è0Ý:)[ÕÅà€Ñµ´&¦íŠxãÖ@Hóoäg÷ÒœŽwý¸,'vHÓ%0äß|’RãØY·VÜú,æÌ»’‡cNîè‘ÇñÖ/l…f )§-Â>ÇOˇû§È܉OBVy©¹t¥Tø)1BTs×G=Íç´«7±Q·úy¹$wúÝ5Q‘³›Cb€:aGÂÂô&Ç4`B•3òWîA‹h‘ž|²º½û tö14+µà­ÏžËÕ†AtqïBFdD®“‹ZkÀØ –Q ðˆ8’ÊÊ¡U»ÐøE™¥Q 2ÖùŒñâ%¬)‚“ÃUNvkÙKdgkµ–ÆtÙ¯»íI §òÔ&ù·ì쨷ÁwÍ™YP,JTßà–ÊùÈ`–7€(M‡âOkPÍdkÕWI8TÖl’CÌ>õDfê=уˆFø¬è˹Ïiïã˸òÇö#tnÓH9K¦a )·õ˜—ã–Ô>þn[Ê5¦ðÁ]=üæº|áŸ)3ì3”Ú€ -ÚR<bƒâo'«éãÄCïàšÓc°¯ÞœîiÜðÆß@nêLõk>Á-jªAòhÜ ¬¸ŠQrZ™®#®42œ¨€sÿúMV¯˜Þ8qÑ*ty†™LJ^Pû|غ¢›øåÖovlÛ_5.«¥ÿ·ðòjï'ì†ßg_ ÛNÏ…iÙ.¹ÝKqáëϬ®ªùÚ²qõh#ñi˜•n|5.æ?_zŒ Î8ù˜úƒì¯Ñ :¨¶f¯ùsÊuƒZÍá-êñŽh¬f߇r& Š5Íüf:eµÄ}/_Û5É`¸Æ&ö KÈ9ãå·Öƒ>ÒÚ•2úµ«_™Ù–¯öE“§¥§ÓÌ"Œô5è 6‚’´ Ž}b]/M8½œQÒÛG±®±¤r ¹e UEwbý&¨‹sò›ÿDcfõ¹AlOËXS“ýê\+¦ŽI¥÷ôû¦}úˤ ¦8·xצÊ/N÷(lÇ€íau‹+ø>º~ÖOÏ5!³ùJ?¶Å¿_ôXá¢ã°ÝkdäÙ9æ^'”"ã%º÷ZM«Ã%r#†ùžNç„ÉD”ª!c‹;¶ÉÆâ­1 2s¬G¬%ƒQ.ÉÿÜâ›Ò|h‰„©Ä·ñHp½wk–ïzw[Mªý ¸Cj£;ËDj„œŠ×bÊ­z;躰o‡²"Ø_µ×åÀÝ–}¶Ü㢤ÊÉïP_9Zþm©¤®iµÀaåF4#”ã/ ô(﫟õpã«3?ŒÄ8"Åý~ƶõ¹ÃϢݠÔÕ:=¿ßÞã݉:ºpº©Ysa&ñ;ØbLj®¤_¨¼r 7¼³ê‰ÒúMQ5R¯±O“Ь7ë·•¾s¶šoŸ=†ç<ò×Ú½‰ð/{7h?þWéÝÁÄÏA—! ñÁ¬Y\üj„@EÃ¥‚½ÌLym]~¢uá‘ï÷YþNBFŸŽÃß± :ÇJ¶êh§sm°=׌Xù™iïñLεÕ!³¡ ÆŒ*lÓD¥~«ŽÏûb:ÀÞ?/3-UcX„9ΩUv#¬öûïèöÊL9‹Ì;D¾Ði€¶ Šqm¥Öi* Fö€%FƒF²R–l^Žÿ¢TFüšM]\6K¢6Î?!µ„hÙ.rtj» aw_'Y¥V}’íÖùã%ui&uC—œ°êîö ©>=(@ŽÆ %QJÜKÌl˜•)ñIO·!wOÐõNn>ý,r:V⤺G@7 6Ö~¥¹´Öm9┟F™q.«¹ãë/•Ô¨”0‡uVúíH¾šfÙ‹-º0« ¦®wUYn¶ŒsrBÏÑÔº|ÐS¼úYǦǯ¹þ÷¸ºã­A§r‰#§EG¯¶,oÜE¿<~Ȇ¾Sdù¥brì414]Í`ŒÐ*Oim°×ÁÌjõóŸT¾¾AÉï¸ød"5Ç6¡°Œ¶|Mö–çŽRŸ[Ø LϽpç%1à±jî7íŽß¨µ.j´ ™T›ö­ á©Íþ ªÌÀ­Âî¬SÔ)„,³NúÃf(LÇWB¨7—ŽÕ…ö!Ò G¯må¢6d|ìàúiZïó©Ö§Ûä f8yÌȧr¿1"Òî»°«ù©^¡âÝ ¸Ÿ®ßnŸïÎf£uŽ'~Ç¿M†¥È¨±M‚f[ëztLsm‹³MØë¢!û–•_Ôî!w$äó¬òÐZF¢#bðsîÖè½ÛtÁ¨I†Î™–ìK“j÷¬?/{®ÿ𛝸Ä×à\1+´¥ë™I -Zåd]“åP°¦K‚t 1ùvr¤Ò[&ÿ36y`ÓP ÝJ–¿¶ÅÃÒ 6ëÏiZÓheðÛ æÆeôú‰7ÚÔ¬•qá[v²>»!Ƚ,ô¼;p`‚(z“ð^óÕrä»gŠ%ß½#¶ZÛHR6'µäÕß×­Ä×ÃVª4egËÕ‹€^Ù6BÎ~¦-¤–{!KúÞd'Bã®È›©žÙ\}§ù€°íFB›VfÖÁMù}ÁتVúIðœR™ ŽQ‡‰»”þGåNºçb&åËi-~°h±@³¨ÔMÆK}U¼§÷Åçf2ð£a‚ïìë]_lÞ¡TÏ ((¨›ö|›0öœŽ«œšXOè ¡iZ¾ŠL0ÈçÈQ¨ ä*‰5⃃k t´ˆ*§è=gÞ# “S~Dr@ÜLAÜr0HÀ?ŽÛô‡&DNpó§7WóR9“ ²(Ä׈„`š@à㜸3s:¨ò;ö9í§üDÎH·I õ7Ïf‘ÓŸS¾>X\Zy5Ÿ·× ·è:L›…’¼v(ÙÄÿH³ø¨¡ðõøÂ ÕD öm"É‹JÖÌùP7^ûþTÔ¿°;tpÕ½ßÌzþÒA™œ†Þå[¸xâíµ™ÑR¤ÃÂ÷#çhÖáÁ{5>.˜¾0Ï¢ªÎ uæð¢”púqîm·)Qr(n$yÏý‹(­I‘Lé1ò¨![¨¿Y—»HÖo½ f ))%ð%ãëµÃ<7%~öPH½¬R'¨K²°EåáÔÛTéö7Ì™e¶yhF~©›Ä­'ïì^"š§ªRÒm% XƒphUúŒ“g•ÕùÞáþ‘ÛááÉ#yìD¼%°p\Ñ¿£ßÆó`Q‹Rc¾€ôlÖ³ºÅb˜2NW6ÄJüé%ßéLHz¦¨yùÈ !OUGà|›šc,6b/¯…-j8(¾¨ FQ~ËEÞ¹ }nã²ýíÕ?©¿˜D»ý0\¦Ù”&˹XñàÙ~^ á¤Ø£}yøƒ²FT ­A <ù®€  e„¬I|€6“÷KªKIÃAD\ÕðÐ^Lâ‘>@¨~ÿ‰¥¤í6%N›u…x}ô3N—zqFëmÔç\ósYQJÿÖvŽvru™S:µ©Q”ˆ>vXVøŠî%²SV0>\«fpUp'„ˆ„R5¤´òl"ƒ]ø9P;·(e^VÉ#ÆUFÉáÁuï§5‘畃Ý€3 ›Ææ êB®w:ìRÇÊ„Ìm8¸¸2r?dCføNL(BÌS*ó]B¾Mà óކ&sê–Mi°ü>—áZ±ŒÕëLÅÏC> ´¬ÂæžÅ¬öøtèÆî»Ê@€§*ìÀQs ÅðÑu…ÆS¤}âzM‚hÌÊìOLÑ ™¹ R¥&ÊàÍö†8ŠiS¶äVÒ€ä=„Gz5Ó×,ØT™c÷ö :׺€ ã­BðÕ„ß³’xJÀðZ)¶_OÊLóôàxIÕ…þöÆEà¤ç'üz,(C=ÂÉÁo~Eœl{«b­®ˆ6*,715GÑ UœûÊW»V² b£k -™xIön,ùÀÜ71‰&ðOqA¯˜^ûŒCûÝhDTÂcE`à †©Y—tMa6$¦ ½ÇŠ9·|ÒAÖ?†JÊF^E÷+(ÉR5e»;¼$}ú £P‰6Të'ZQXà°GzÉ ,^(·+­ÖçÆ~A}–Y ›áobÏ„ýÁÇš(ýF7kÿHžEQšéÒsHld¢i® 3È4Q#ÀÍfqÞp­IÆtVèYÍߟÛÊRK›ã.ŽŠHR´:rµÞ¡ßR–…×7 ¾f:ÞG1غEÐíÜè`²J4˜p³Õ€¶ášî“ Ø® Çdæ92ľ@l0<ƒ›5ü…¹ù)öM”mló¾jÕwR,5oÛ·IÃ2ŒµÖ¡×ÒþìÞGÓqã´¦Lm¯”ºº$ *dÓ(b jò4Vº‘ß‚>E¡~‘D÷ÁÖÚqÓX_`E¡f±#&A^lVÝìÄ÷vM'”~UÀ­–ô´eb7M'¡}zÐŽXâ7yé!aežÑd0ÉÿÚš‡Þå4¾6òéw‚ˆjpÎó{ÖRA0œÓ–tÐûÑæE‹ÉÚi”:âöïÛ9˜ò>zPHŠXñ‘»­ü¨~…XªÊO{Ô¡°Qêî[åÖ¯ŒÏܧ"Õoª4f™Üíé©Ó”±å)šŽy³Ìñ Ñk¯£˜Š¶#s\.A]» ¾|>{aêg&´Î«áñ¤)ºK 1×~#„…¿`“ÑᣳÌíz‡oÁ»¡N.yàÝ\’r(­7(šÎnBq^¾ UÂJÅIî}60¾Vš‡edß`­Çš|Ð_B‡òF^/gA촜ʖ;˜ª š+X»F*Öx½ üÁiØõ;´Œ]ë]B°ø,+ò§Ü;´µ— e%zïŒN±Ì“¬´%ˆbŽð 1"!òLt£ËTà/Ô~Fo—’­î>Hü‹”ÁÝÞ¢/àtG3¤Šâ4Z´5‘aÐ?fÐXK Ò¶¾Ü>D…‘ÏËÏ;¤€µÍÇWJ!£ ¥œ£¯ÃcÑæH±ƒ »Éµ}ÿîÛdßkSF9.–$¦ð«“Ø’Ê AkJ)Z¬‚↧81fÂbâ©”ºšc›MGJ'¬‹[¥P®›lÖ=àݪ<2Û;?\CΩ©¢\J÷ =ÑýT„ëgA1‹cŽœÙGöK€ª³ý–¢á ¡A­Z‹E+>…Ûðð®äîZ’“v§FíáRTŠý» ·dW¾¨©ß7C[iëùɳÉhmÛø=D–Õ¯¼uñv(^A&g´Â+ƒ 9àê¹KdWA9ròbI+˜É«ƒxgyÆ´¤) †U‰uCï,!‰0lÚ¶ ÿ‹*­åMŠh&¼a_=üz¢EœLBÒ‹Š¢R XªÓÏô»§«Z¦EÌØ&•J \ž ŽÒ¾þ¯îíà’ñÍËYTe™–vxl&OF\od¥YËÀ .xüÿ/]àñªsî»(/!Ð.Œ*¾‘Î)÷ϱ,W&ÛÜ¿ëN0ošDDØÒ G_ Îߨú0Þoo¥Bš{ó“¾4«ý¶«\ÝäOa‹:H^¬—ÿɳY©Ñ;M cz®Åâýv Î Ðf ²@>»à"780K6FÂϪÞÞÞc?tc ª‹V±%ƒí}±Œ@ö`ASè#ŸQ_úŒ_H#c6ª|~ûËHh4—â!*Ç1àÙÞÿkQÃ5®?"ûå?7{Ó–ú•ãzÛC–óõKƒòª åKG‘Ûêv%ƒ  ð=Üûœ,ÌM›'7Á¼‹¤ _Ü®h’Ä”¡¤Î4K>hºûy×Qu‰ FÊ^9Úv³s=$ƒýa±v¸‚³Eº0Ëk¶ˆÎKÂL1$_°)Ä®µ0ÃJ±}tL§ÐÜàäµ…QèÒÐ}ØôUµ†-×9A>×iïïŠ#{”I ö<< Ž"’N»è/+‘f-t_é!Z‰HaEá™ÛIÕ èÒõȺjùÞùI¶C&[©ß Òµ“D⌉F‰{¥ò¥0NÉñ#»…7ªïVXŸ×°ovÕ<l‹3ãjÅ<,Ïû¼ vÜÖW·}¦œ è ŠýE(*§ ¬uOéB²ý•m ¼mg´7M~´½V*;ͺ«¯me–êüÖ¹=ôÄr;ðfãÙ¡\¿4Ž0„Vàïlv;r»(*ZBèç»?h‹ R*0€ëF¥.v,¼˜rtžÙ.„€0ƒMÀ¶vOÉ?â&¢ñZþ‚)~9íý‰BÝõ+Ã/«žßðúÐëAàåœ$cäo? ¼ýÍA{ PnŠó(t^ð·¾3ª©?hN$Vœy¦’… ‚6§ë5íº uì–XÆÙ«C}·Ëƒv¨²šRÜç$B™ô^;õ½ÐŽ E™Ñ‡uE3}MCŸ³¹“mÿ´U%ÐÇÊK€ŒocÅ~ßùvôË=í(E¯ÉHDþs¶;oc|ø`_6.¼<4óSµ}iz åëPZKP‡¸ä^3ê©T>@J74³§ž»3j'Äå0À¥–?ÃãÙ3\}ö°WMr³ côÉ1¼ë›‘5ý\ã”°f ´UëãqÚµ‰îØQ»–ß~}]ñbѧ‡'k ÏV «²Š&Jå›Ï­%œðÐPä¡èK}L9²M¼•ßüÂS-Ëhò²??ⱃ?poÁ>ñ«Æ¶µ†³°‰6°·>cú‚i·éÂÑ[ 6³Q#É;õx?ºÎ– Ö.óZMDDÍEò8æE³5Š{3!AÖÒQÌ »‹i!Ûl;ƒ¡zÛH¢UBìÂÞˆ\âulF+ìUýFŠQÃÛUì+²XÕƒ°s›Wù8qH¤³€;õ«µ eë¶u„ ÆÇÈÅoúÜÀKKÞV3º«j’wœ²óï­"X'PBÓ}[Ègò– 1anj!Nš ?d£ùÅúûŒîª†h)ìo𨢢›ùi©xëê4n8Àð‰æ,x°J]þ…gôWï8› ù⮺]Å4¢¼ ìðzÌ­‹EDØxœ³.¯¥¨¤´[Ÿ°Ð,üs30MÂæ3ôBâc±¸WëCò‚•¢Z9$k"¥³û–Ê÷FÓz|q>;3$«ƒôÕŠ$@’¶(|8y ]¾.µž_çSi¼† ¥¬é kðf†õF{ÑÈŠvÜdX¬e%ˆ¡šñê9zÛ+Ü€%=¶µß`8›~Ö{ǹð‰[?Q…8­ï74Ò ”ûKÑ”tôìlñ×Ö@¬ ¾Lrpãoi»Öîl%ߦ!¹œàqÞ÷ŸnÅvÝGÝöÿOáþ¾pxÅ®‡µ•mƒ4¿Å£–öÞ%¥樌o^Ö‰%t&±–Q:Ⱦ¬ŽvÇÀÚ[¼þU"hÉÏäžÚ\5¤PꥣÔ_JàRCظ ©0J´èÉŒ¿›qÖùÿ¶!÷dä~·ª\(³þ²Y¦'™ Ã.jwˆ ìaS›ÌÅ-.6Vì…&¾ê‚Œ&p( ïõ½îFêà· ШAFhVžïk!ôŒK£ bpJ䫸iج‹&Í’dÆsIx—ŠûŒÅª‰‡|–Zq‰Qµ•Qy“ºÛöƒþ|èÉe/ îê~âØXNÓýï·¶ß%Ü|oõWÁLOËV¸´Û¡)Œ=sžee;…÷²d¨{Ž-‚«²½]BM¶r[2?i+yæHõ˜ezH ::?§ú7†ÊÓ„;ÚÏl  ºÕ¦ª/O+‡"(}ÿÖ™æÍ Ï1õþ6ø> endobj 51 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PRSAOD+CMBX10 /FontDescriptor 117 0 R /FirstChar 34 /LastChar 121 /Widths 112 0 R >> endobj 49 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VHLTYM+CMBX12 /FontDescriptor 119 0 R /FirstChar 34 /LastChar 121 /Widths 113 0 R >> endobj 66 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KAZVQP+CMBXTI10 /FontDescriptor 121 0 R /FirstChar 11 /LastChar 121 /Widths 107 0 R >> endobj 67 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FFANCX+CMMI10 /FontDescriptor 123 0 R /FirstChar 120 /LastChar 121 /Widths 106 0 R >> endobj 52 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LLPGSJ+CMR10 /FontDescriptor 125 0 R /FirstChar 11 /LastChar 123 /Widths 111 0 R >> endobj 48 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OTYJSG+CMR12 /FontDescriptor 127 0 R /FirstChar 44 /LastChar 118 /Widths 114 0 R >> endobj 47 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WTZVEE+CMR17 /FontDescriptor 129 0 R /FirstChar 85 /LastChar 121 /Widths 115 0 R >> endobj 97 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OHMPEU+CMR8 /FontDescriptor 131 0 R /FirstChar 50 /LastChar 50 /Widths 104 0 R >> endobj 54 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LWPQBU+CMSLTT10 /FontDescriptor 133 0 R /FirstChar 33 /LastChar 126 /Widths 109 0 R >> endobj 68 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DVCMRV+CMSY10 /FontDescriptor 135 0 R /FirstChar 2 /LastChar 2 /Widths 105 0 R >> endobj 53 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HJLNQG+CMTI10 /FontDescriptor 137 0 R /FirstChar 11 /LastChar 121 /Widths 110 0 R >> endobj 61 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZMWPMJ+CMTT10 /FontDescriptor 139 0 R /FirstChar 34 /LastChar 121 /Widths 108 0 R >> endobj 55 0 obj << /Type /Pages /Count 6 /Kids [34 0 R 58 0 R 63 0 R 72 0 R 84 0 R 94 0 R] >> endobj 140 0 obj << /Type /Outlines /First 3 0 R /Last 31 0 R /Count 3 >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 140 0 R /Prev 7 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 7 0 R /Prev 11 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 11 0 R /Prev 19 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 11 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 27 0 R /First 15 0 R /Last 23 0 R /Count -3 >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 140 0 R /Prev 3 0 R /Next 31 0 R /First 11 0 R /Last 27 0 R /Count -2 >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 140 0 R /Next 7 0 R >> endobj 141 0 obj << /Names [(Doc-Start) 46 0 R (figure.1) 75 0 R (figure.2) 92 0 R (figure.3) 76 0 R (page.1) 45 0 R (page.2) 60 0 R] /Limits [(Doc-Start) (page.2)] >> endobj 142 0 obj << /Names [(page.3) 65 0 R (page.4) 74 0 R (page.5) 86 0 R (page.6) 96 0 R (section*.1) 50 0 R (section.1) 2 0 R] /Limits [(page.3) (section.1)] >> endobj 143 0 obj << /Names [(section.2) 6 0 R (section.3) 30 0 R (subsection.2.1) 10 0 R (subsection.2.2) 26 0 R (subsubsection.2.1.1) 14 0 R (subsubsection.2.1.2) 18 0 R] /Limits [(section.2) (subsubsection.2.1.2)] >> endobj 144 0 obj << /Names [(subsubsection.2.1.3) 22 0 R] /Limits [(subsubsection.2.1.3) (subsubsection.2.1.3)] >> endobj 145 0 obj << /Kids [141 0 R 142 0 R 143 0 R 144 0 R] /Limits [(Doc-Start) (subsubsection.2.1.3)] >> endobj 146 0 obj << /Dests 145 0 R >> endobj 147 0 obj << /Type /Catalog /Pages 55 0 R /Outlines 140 0 R /Names 146 0 R /PageMode/UseOutlines/URI<> /OpenAction 33 0 R >> endobj 148 0 obj << /Author(Wolfgang Huber and Robert Gentleman)/Title(Basic infrastructure for using oligonucleotide microarray reporter sequence information for preprocessing and quality assessment)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords(Bioconductor) /CreationDate (D:20131113202022-08'00') /ModDate (D:20131113202022-08'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 149 0000000000 65535 f 0000000015 00000 n 0000004812 00000 n 0000256833 00000 n 0000000060 00000 n 0000000086 00000 n 0000004870 00000 n 0000256712 00000 n 0000000131 00000 n 0000000169 00000 n 0000007762 00000 n 0000256603 00000 n 0000000219 00000 n 0000000253 00000 n 0000007821 00000 n 0000256529 00000 n 0000000309 00000 n 0000000362 00000 n 0000007880 00000 n 0000256442 00000 n 0000000418 00000 n 0000000479 00000 n 0000010337 00000 n 0000256368 00000 n 0000000535 00000 n 0000000566 00000 n 0000010396 00000 n 0000256295 00000 n 0000000617 00000 n 0000000676 00000 n 0000013168 00000 n 0000256221 00000 n 0000000722 00000 n 0000000798 00000 n 0000003225 00000 n 0000003401 00000 n 0000003551 00000 n 0000003700 00000 n 0000003853 00000 n 0000004012 00000 n 0000004172 00000 n 0000004332 00000 n 0000004486 00000 n 0000004928 00000 n 0000000848 00000 n 0000004636 00000 n 0000004695 00000 n 0000255200 00000 n 0000255058 00000 n 0000254484 00000 n 0000004754 00000 n 0000254341 00000 n 0000254916 00000 n 0000255767 00000 n 0000255482 00000 n 0000256053 00000 n 0000007549 00000 n 0000007939 00000 n 0000007422 00000 n 0000005070 00000 n 0000007703 00000 n 0000255910 00000 n 0000010455 00000 n 0000010170 00000 n 0000008069 00000 n 0000010278 00000 n 0000254627 00000 n 0000254772 00000 n 0000255627 00000 n 0000012810 00000 n 0000012960 00000 n 0000013227 00000 n 0000012676 00000 n 0000010621 00000 n 0000013109 00000 n 0000019678 00000 n 0000093585 00000 n 0000019169 00000 n 0000019319 00000 n 0000019469 00000 n 0000014915 00000 n 0000020452 00000 n 0000026883 00000 n 0000019738 00000 n 0000014774 00000 n 0000013345 00000 n 0000019619 00000 n 0000015954 00000 n 0000016097 00000 n 0000016195 00000 n 0000016230 00000 n 0000016472 00000 n 0000093525 00000 n 0000093645 00000 n 0000020344 00000 n 0000019871 00000 n 0000093466 00000 n 0000255342 00000 n 0000023584 00000 n 0000023727 00000 n 0000023826 00000 n 0000023905 00000 n 0000023942 00000 n 0000024185 00000 n 0000093774 00000 n 0000093799 00000 n 0000093824 00000 n 0000093855 00000 n 0000094526 00000 n 0000094897 00000 n 0000095292 00000 n 0000095955 00000 n 0000096582 00000 n 0000097089 00000 n 0000097602 00000 n 0000098014 00000 n 0000098255 00000 n 0000113864 00000 n 0000114194 00000 n 0000127536 00000 n 0000127861 00000 n 0000136668 00000 n 0000136908 00000 n 0000144282 00000 n 0000144506 00000 n 0000166173 00000 n 0000166610 00000 n 0000178125 00000 n 0000178404 00000 n 0000188807 00000 n 0000189061 00000 n 0000196075 00000 n 0000196295 00000 n 0000214683 00000 n 0000215204 00000 n 0000222291 00000 n 0000222520 00000 n 0000236241 00000 n 0000236524 00000 n 0000253916 00000 n 0000256147 00000 n 0000256904 00000 n 0000257072 00000 n 0000257237 00000 n 0000257456 00000 n 0000257571 00000 n 0000257678 00000 n 0000257716 00000 n 0000257884 00000 n trailer << /Size 149 /Root 147 0 R /Info 148 0 R /ID [<41E0CF6C379C7930FFF0B002FBEF25E3> <41E0CF6C379C7930FFF0B002FBEF25E3>] >> startxref 258385 %%EOF Biostrings/inst/extdata/0000755000126300012640000000000012227063322016666 5ustar00biocbuildphs_compbioBiostrings/inst/extdata/Phylip.txt0000644000126300012640000001425112227063322020677 0ustar00biocbuildphs_compbio 25 181 W Mask 1111111111 1111111111 1111111111 0011111111 1111111111 hprt_rhoca YVID-QMISA KAIAARVEAL GAEITEAFKD T-LVVVGLLR GSFVFIADLI hprt_haein HHVD-VLISE NDVHARIAEL GAQITKFYQE KQLVVVGLLR GSFMFMADIV hprt_haein HHVD-VLISE NDVHARIAEL GAQITKFYQE KQLVVVGLLR GSFMFMADIV hprt_vibha HTVE-VMISE QEVQERIREL GKQITERYQG SELVMVGLLR GSFVFMADLA hprt_ecoli HTVE-VMIPE AEIKARIAEL GRQITERYKD SGMVLVGLLR GSFMFMADLC hprt_merun EDLEKVFIPH GLIMDRTERL ARDVMKEMGG HHIVALCVLK GGYKFFADLL hprt_monke EDLERVFIPH GLIMDRTERL ARDVMKEMGG HHIVALCVLK GGYKFFADLL hprt_human EDLERVFIPH GLIMDRTERL ARDVMKEMGG HHIVALCVLK GGYKFFADLL hprt_rat EDLEKVFIPH GLIMDRTERL ARDVMKEMGG HHIVALCVLK GGYKFFADLL hprt_mouse EDLEKVFIPH GLIMDRTERL ARDVMKEMGG HHIVALCVLK GGYKFFADLL hprt_crigr EDLEKVFIPH GVIMDRTERL ARDVMKEMGG HHIVALCVLK GGYKFFADLL hprt_plafk KYLTKVLVPN GVIKNRIEKL AYDIKKVYNN EEFHILCLLK GSRGFFTALL hprt_plafg KYLTKVLVPN GVIKNRIEKL AYDIKKVYNN EEFHILCLLK GSRGFFTALL hgxr_toxog PYIDKILLPG GLVKDRVEKL AYDIHRTYFG EELHIICILK GSRGFFNLLI hprt_schma ECLDYVLIPN GMIKDRLEKM SMDIVDYYEA CNITLMCVLK GGFKFLADLV gprt_giard DVLESLLATF EECKALAADT ARRMNEYYKD --VTLVALLT GAYLYASLLT hprt_trybb DFATSVLFTE AELHTRMRGV AQRIADDYSN CNLVIVSVLK GSFVFTADMV hprt_tcruz EFAEKILFTE EEIRTRIMEV AKRIADDYKG KGLVLISVLK GSFMFTADLC hprt_leido PMSAHTLVTQ EQVWAATAKC AKKIAEDYRS FKLYLLCVLK GSFIFTADLA hprt_crifa PMSCRTLATQ EQIWSATAKC AKQIAEDYKQ YNLYLLCVLK GSFMFTADLA hgxr_trifp DDLERVLYNQ DDIQKRIREL AAELTEFYED K-PVMICVLT GAVFFYTDLL hprt_lacla KAIEKVLVSE EEIIEKSKEL GEILTKEYEG K-PLVLGILR GSVPFLAELI hprt_bacsu HDIEKVLISE EEIQKKVKEL GAELTSEYQD T-PLAIGVLK GALPFMADLI hprt_mycge MGIKSIVINE QQIEEGCQKA VNWCNAKFNN KKVIVLGILK GCIPFLGKVI 0000000000 0011111111 1111111100 1111111111 1110111111 R---EIGVPC EVDFLEASSY GNETTSTREV RVLKDLRGII GGR-DVLVVE R---QINLPV EIEFMTTSSY GTGMTTNHDV RITKDLDGDI KGK-HVLIVE R---QINLPV EIEFMTTSSY GTGMTTNHDV RITKDLDGDI KGK-HVLIVE R---AIELTH QVDFMTASSY GNTMESSRDV RILKDLDDDI KGK-DVLIVE R---EVQVSH EVDFMTASSY GSGMSTTRDV KILKDLDEDI RGK-DVLIVE DYIKSLNRNT DRDFIRLKSY CNDQSTGDIK VIGGDDLSAL TGK-NVLIVE DYIKALNRNS DRDFIRLKSY CNDQSTGDIK VIGGDDLSTL TGK-NVLIVE DYIKALNRNS DRDFIRLKSY CNDQSTGDIK VIGGDDLSTL TGK-NVLIVE DYIKALNRNS DRDFIRLKSY CNDQSTGDIK VIGGDDLSTL TGK-NVLIVE DYIKALNRNS DRDFIRLKSY CNDQSTGDIK VIGGDDLSTL TGK-NVLIVE DYIKALNRNS DRDFIRLKSY CNDQSTGDIK VIGGDDLSTL TGK-NVLIVE KHLSRIHNYS AVHYVRVKSY CNDQSTGTLE IVS-EDLSCL KGK-HVLIVE KHLSRIHNYS AVHYVRVKSY CNDQSTGTLE IVS-EDLSCL KGK-HVLIVE DYLATIQKYS GRHYVRLKSY QNDNSTGQLT VLS-DDLSIF RDK-HVLIVE DGLERTVRAR GIEFVRVKSY VNDVSIHEPI LTGLGDPSEY KDK-NVLVVE VHLT------ --HFVKVSSY KGTRQES--V VFDEEDLKQL KEKREVVLID RILGDFGVPT RVEFLRASSY GHDTKSCGRV DVKADGLCDI RGK-HVLVLE RALSDFNVPV RMEFICVSSY GEGVTSSGQV RMLLDTRHSI EGH-HVLIVE RFLADEGVPV KVEFICASSY GTGVETSGQV RMLLDVRDSV ENR-HILIVE RFLCDEGVPV RIEFICASSY GTDVKTSGEV RLLLDVRDPV ENR-HLLIVE K---HLDFQL EPDYIICSSY -SGTKSTGNL TISKDLKTNI EGR-HVLVVE K---HIDCHL ETDFMTVSSY HGGTKSSGEV KLILDVDTAV KGR-DILIVE K---HIDTYL EMDFMDVSSY GNSTVSSGEV KIIKDLDTSV EGR-DILIIE ---SKFSFDL QLDFMAVASY HGSHVQKQPP KIVLDMSHDP KDK-DILLIE 1111111111 0000000000 0000000000 0000000000 0000000000 DIIDTGHTIS KVMEMLRARA PRR--IECCA MLDKP-SRRE VDVKARWTGF DIIDTGYTLE KVRDILNLRE PAS--LTICT LLDKP-SRRE VEVPVEWVGF DIIDTGYTLE KVRDILNLRE PAS--LTICT LLDKP-SRRE VEVPVEWVGF DIIDTGNTLN KIREILSLRE PKS--IAICT LLDKP-SRRE VEVPVDYVGF DIIDSGNTLS KVREILSLRE PKS--LAICT LLDKP-SRRE VNVPVEFIGF DIIDTGKTMQ TLLSLVQKYS PKM--VKVAS LLVKR-TPRS VGYRPDFVGF DIIDTGKTMQ TLLSLVRQYN PKM--VKVAS LLVKR-TPRS VGYKPDFVGF DIIDTGKTMQ TLLSLVRQYN PKM--VKVAS LLVKR-TPRS VGYKPDFVGF DIIDTGKTMQ TLLSLVKQYS PKM--VKVAS LLVKR-TSRS VGYRPDFVGF DIIDTGKTMQ TLLSLVKQYS PKM--VKVAS LLVKR-TSRS VGYRPDFVGF DIIDTGKTMQ TLLSLVKRYN LKM--VKVAS LLVKR-TSRS VGYRPDFVGF DIIDTGKTLV KFCEYLKKFE IKT--VAIAC LFIKR-TPLW NGFKADFVGF DIIDTGKTLV KFCEYLKKFE IKT--VAIAC LFIKR-TPLW NGFKADFVGF DIVDTGFTLT EFGERLKAVG PKS--MRIAT LVEKR-TDRS NSLKGDFVGF DIIDTGKTIT KLISHLDSLS TKS--VKVAS LLVKR-TSPR NDYRPD-VGF EYVDSGHTIF SIQEQIKHAK ICSCFVKDVD AIKKHSALAD TKMFYGYTPM DILDTALTLR EVVDSLKKSE PAS--IKTLV AIDKP-GGRK IPFTAEYVVA DIVDTALTLN YLYHMYFTRR PAS--LKTVV LLDKR-EGRR VPFSADYVVA DIVDSAITLQ YLMRFMLAKK PAS--LKTVV LLDKP-SGRK VEVLVDYPVI DIVDSAITLE YLKRFLQAKQ PAS--LKTVV LLDKP-SGRK VTLSVDYPVI DIIDTGLTMY QLLNNLQMRK PAS--LKVCT LCDKDIGKKA YDVPIDYCGF DIIDTGRTLK YLKELLEHRG AN---VKIVT LLDKP-EGRI VEIKPDYSGF DIIDSGLTLS YLVELFRYRK AKS--IKIVT LLDKP-SGRK ADIKADFVGF DIVDSGRSIK LVIDLLKTRH AKS--ITLIS LIEK-IKPKA FDINIDFSCF 0000011111 1111111111 1111111111 1 EIPDEFVVGY GLDYAQNHRN LPFIGTVRFT D EIPDEFVVGY GIDYAQRHRN LGYIGKVVLE E EIPDEFVVGY GIDYAQRHRN LGYIGKVVLE E AIPDEFVVGV GIDYAQKYRD LPFIGKVVPQ E SIPDEFVVGY GIDYAQRYRH LPYIGKVILL D EIPDKFVVGY ALDYNEYFRD LNHVCVISES G EIPDKFVVGY ALDYNEYFRD LNHVCVISET G EIPDKFVVGY ALDYNEYFRD LNHVCVISET G EIPDKFVVGY ALDYNEHFRD LNHVCVISES G EIPDKFVVGY ALDYNEYFRD LNHVCVISET G EIPDKFVVGY ALDYNEYFRD LNHICVISET G SIPDHFVVGY SLDYNEIFRD LDHCCLVNDE G SIPDHFVVGY SLDYNEIFRD LDHCCLVNDE G SIEDVWIVGC CYDFNEMFRD FDHVAVLSDA A EVPNRFVVGY ALDYNDNFRD LHHICVINEV G P-KGSWLIGF GLDDNGLRRG WAHLFDINLS E DVPNVFVVGY GLDYDQSYRE VRDVVILKPS V NIPNAFVIGY GLDYDDTYRE LRDIVVLRPE V TIPHAFVIGY GMDYAESYRE LRDICVLKKE Y TIPHAFVIGY GMDFAEAYRE LRDVCVLKKE Y VVENRYIIGY GFDFHNKYRN LPVIGILKES V TIPNEFVVGF GLDYEENYRN LPYVGVLKPE V EVPDAFVVGY GLDYAERYRN LPYIGVLKPA V KVKDNFLVGF GLDYDGFYRN LPYVGVFEPD N Biostrings/inst/extdata/README0000644000126300012640000000040112227063322017541 0ustar00biocbuildphs_compbioThe chr*fa and someORF.fa files were extracted from ftp://genome-ftp.stanford.edu/pub/yeast/sequence on 1 Nov 2005. -- VJC Only the someORF.fa and fastaEx.fa files have been kept from Biostrings 1 (original names were someORF.fsa and fastaEx). -- H. Pages Biostrings/inst/extdata/Sc.fa0000644000126300012640000000314112227063322017542 0ustar00biocbuildphs_compbio>YDL143W Chr 4 ATGTCTGCTAAAGTTCCATCTAACGCCACGTTTAAGAACAAGGAAAAACCTCAAGAGGTT CGCAAAGCCAACATCATCGCTGCACGTTCTGTTGCAGATGCCATCCGTACTTCATTGGGT CCCAAGGGTATGGACAAGATGATTAAGACATCTCGTGGAGAAATCATCATCTCTAATGAT GGCCACACCATTCTAAAACAGATGGCCATTCTGCATCCGGTGGCCAGAATGCTAGTAGAG GTTTCTGCCGCGCAGGACTCGGAAGCCGGTGATGGTACCACTTCTGTGGTGATCTTGACC GGAGCTCTATTGGGTGCTGCTGAGAGGCTGTTAAACAAGGGCATCCATCCAACCATCATT GCGGACTCCTTTCAAAGTGCTGCGAAGAGATCTGTCGATATTCTTTTAGAAATGTGCCAT AAGGTTTCGTTGAGCGATAGAGAACAGCTGGTTCGTGCTGCATCCACTTCTTTGAGTTCC AAGATTGTGTCTCAATACTCTTCGTTTTTGGCGCCCTTGGCAGTGGACTCCGTATTGAAG ATATCTGATGAAAACTCTAAGAATGTTGACCTGAACGATATCAGACTGGTCAAAAAAGTT GGTGGTACCATTGATGACACAGAAATGATAGATGGTGTGGTCTTGACACAAACGGCAATC AAATCTGCTGGTGGTCCGACAAGAAAGGAAAAAGCAAAGATTGGGTTAATTCAATTCCAA ATATCTCCTCCAAAGCCCGACACAGAAAATAATATCATCGTTAATGACTATAGACAAATG GATAAGATCCTTAAAGAAGAAAGAGCGTATTTGCTAAATATCTGTAAAAAAATTAAAAAG GCCAAGTGTAACGTGCTGTTGATTCAGAAATCCATCTTGAGAGATGCGGTAAATGATTTG GCTCTTCATTTCTTGTCAAAATTGAACATAATGGTGGTAAAGGATATCGAGAGAGAAGAA ATCGAGTTTCTGTCGAAGGGCTTGGGTTGTAAGCCAATTGCTGATATAGAATTGTTCACC GAAGATAGATTGGGTTCCGCTGATTTAGTTGAGGAGATCGATAGCGATGGTTCCAAGATA GTTAGAGTAACTGGTATAAGAAACAATAATGCAAGACCAACCGTCTCTGTTGTTATTCGT GGTGCAAACAACATGATCATTGATGAAACAGAGCGTTCCCTCCATGATGCACTATGTGTT ATTCGTTGTCTAGTGAAAGAGAGAGGTTTAATCGCTGGTGGTGGTGCTCCAGAAATTGAA ATATCCCGTAGGTTGAGTAAGGAAGCAAGGTCTATGGAAGGTGTACAGGCTTTTATTTGG CAAGAATTTGCCTCTGCTTTGGAAGTTATTCCAACGACTTTGGCTGAAAACGCAGGTTTG AATAGTATCAAAGTTGTCACAGAATTGCGCTCTAAGCATGAAAATGGTGAATTGAATGAC GGTATCTCTGTTAGACGATCTGGTACTACGAACACCTATGAAGAACACATCTTACAACCC GTACTTGTTAGTACAAGTGCAATTACCTTAGCGTCTGAATGTGTTAAATCCATCTTACGT ATTGATGATATTGCATTCAGCCGTTAA Biostrings/inst/extdata/Sp.fa0000644000126300012640000000316512227063322017565 0ustar00biocbuildphs_compbio>ORFN:3235 YDL143W, Contig c429 182290-183876 ATGTCTGCTAAGGTCCCATCTAACGCCACGTTCAAGAACAAGGAAAAACCCCAAGAGGTTCGCAAAGCCAACATCATCGC TGCACGTTCTGTAGCAGATGCCATCCGTACTTCATTGGGTCCCAAGGGTATGGACAAGATGATTAAGACATCTCGTGGGG AAATTATCATCTCCAATGATGGCCATACCATTTTAAAACAGATGGCCATCCTGCATCCGGTGGCTAGAATGCTAGTGGAG GTTTCTGCCGCGCAGGACTCCGAAGCCGGTGATGGTACTACTTCCGTGGTCATCTTGACCGGTGCTCTGTTGGGTGCTGC AGAAAGACTGCTGAACAAGGGTATTCATCCAACCATCATTGCAGACTCCTTTCAAAGTGCTGCAAAGAGATCTGTCGATA TTCTTTTGGAAATGTGCCATAGGATCTCGTTGAGCGATAGAGAGCAGCTAGTCCGTGCTGCATCCACCTCCTTGAGTTCC AAGATTGTGTCTCAATACTCTTCATTTTTGGCGCCTTTGGCAGTGGATTCTGTGTTGAAGATTTCCGATGAAAACTCTAA GAATGTTGACCTGAATGATATCAGACTGGTCAAGAAAGTTGGTGGTACCATCGATGACACGGAAATGATAGATGGTGTAG TCTTAACGCAAACGACAATTAAGTCTGCCGGTGGTCCAACAAGAAAGGAAAAGGCAAAGATCGGGTTGATTCAATTCCAA ATATCTCCTCCTAAGCCAGACACGGAGAACAATATCATCGTTAATGACTATAGACAAATGGATAAGATCCTTAAAGAAGA AAGAGCGTATTTGCTAAATATCTGTAAAAAAATTAAAAAAGCCAAGTGTAACGTGCTGTTGATTCAGAAATCCATCCTAA GAGATGCAGTAAATGATCTGGCTCTACATTTCTTATCAAAATTGAACATAATGGTGGTGAAGGACATCGAGAGAGAGGAG ATCGAGTTTCTGTCCAAGGGCTTGGGTTGTAAGCCAATTGCCGATATAGAATTGTTCACCGAAGATAGATTGGGTTCGGC TGACTTAGTTGAGGAGATTGATAGCGATGGTTCCAAGATAGTTAGAGTAACTGGCATAAGAAACAACAATGCAAGGCCAA CCGTTTCTGTTGTCATCCGCGGTGCAAACAACATGATCATTGATGAAACGGAACGCTCCCTTCATGATGCACTATGTGTA ATCCGTTGTTTAGTAAAAGAGAGAGGTTTAATCGCCGGTGGTGGTGCTCCAGAAATTGAAATCTCCCGCAGGTTGAGTAA AGAAGCAAGATCTATGGAAGGTGTACAGGCTTTTATTTGGCAAGAATTTGCTTCTGCCTTGGAAGTTATTCCAACAACTT TGGCTGAAAATGCAGGTTTGAATAGTATCAAAGTTGTTACAGAATTGCGCTCTAAACATGAAAATGGTGAATTGAATGAT GGTATCTCTGTTAGACGATCCGGTACTACGAACACCTATGAAGAACATATCTTACAACCCGTACTTGTTAGTACAAGCGC AATTACTTTGGCTTCCGAATGTGTCAAATCCATTTTACGTATTGACGATATCGCATTCAGCCGTTAA Biostrings/inst/extdata/fastaEx.fa0000644000126300012640000000025112227063322020567 0ustar00biocbuildphs_compbio>sequence1 AGTACGTAGTCGCTGCTGCTACGGGCGCTAGCTAGTACGTCA CGACGTAGATGCTAGCTGACTAAACGATGC >sequence2 AAACGATCGATCGTACTCGACTGATGTAGTATATACGTCGTACGTAG CATCGTCAGTTACTGCATGCGGG Biostrings/inst/extdata/hg18chr8_gap.txt0000644000126300012640000000075712227063322021623 0ustar00biocbuildphs_compbio80 chr8 7462059 7562059 63 N 100000 clone no 84 chr8 12099352 12199352 101 N 100000 clone no 750 chr8 21664232 21681632 180 N 17400 clone no 101 chr8 29732668 29798768 251 N 66100 clone no 14 chr8 43958052 46958052 372 N 3000000 centromere no 953 chr8 48249201 48309201 384 N 60000 clone no 155 chr8 86069241 86193341 701 N 124100 fragment yes 155 chr8 86763703 86851003 707 N 87300 clone no 210 chr8 144006276 144106276 1182 N 100000 clone no 1694 chr8 145396296 145403396 1196 N 7100 clone no Biostrings/inst/extdata/hg18chrY_gap.txt0000644000126300012640000000123312227063322021652 0ustar00biocbuildphs_compbio585 chrY 34821 84821 2 N 50000 contig no 586 chrY 171384 201384 6 N 30000 contig no 592 chrY 967557 1017557 14 N 50000 contig no 593 chrY 1054113 1104113 16 N 50000 contig no 594 chrY 1184234 1274234 19 N 90000 contig no 9 chrY 2028238 2128238 29 N 100000 contig no 653 chrY 8974955 9024955 91 N 50000 clone no 10 chrY 9301322 9901322 96 N 600000 clone no 83 chrY 10714553 11214553 104 N 500000 clone no 10 chrY 11253954 11653954 106 N 400000 centromere no 678 chrY 12208578 12308578 111 N 100000 centromere no 755 chrY 22310816 22360816 201 N 50000 clone no 1 chrY 27228749 57228749 246 N 30000000 heterochromatin no 1022 chrY 57327044 57377044 248 N 50000 clone no Biostrings/inst/extdata/msx2_mRNA.aln0000644000126300012640000011202212227063322021126 0ustar00biocbuildphs_compbioCLUSTAL 2.0.12 multiple sequence alignment gi|84452153|ref|NM_002449.4| -----TCCCGTCTCCGCAGCAAAAAAGTTTGAGTCGCCGCTGCCGGGTTG 45 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| ----------------------AAAAGTTGGAGTCTTCGCTTGAGAGTTG 28 gi|119220589|ref|NM_012982.3| -------------------------------------------------- gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| --------------CGGCTCCGCAGCGCCTCACTCGCGCAGTCCCCGCGC 36 gi|213515133|ref|NM_001141603. GGGGGAGACTTCAGAAGTTGTTGTCCTCTCCGCTGATAACAGTTGAGATG 50 gi|84452153|ref|NM_002449.4| CCAGCGGAGTCGCGCGTCGGGAGCTACGTAGGGCAGAGAAGTCA-TGGCT 94 gi|208431713|ref|NM_001135625. -------------------------------------------A-TGGCT 6 gi|118601823|ref|NM_001079614. ---------------------------------GAGAGAAGTCA-TGGCT 16 gi|114326503|ref|NM_013601.2| CCAGCGGAGTCGCGCGCCGACAGCTACGCGGCGCAGA-AAGTCA-TGGCT 76 gi|119220589|ref|NM_012982.3| -------------------------------------------A-TGGCT 6 gi|148540149|ref|NM_001003098. -------------------------------------------A-TGGCT 6 gi|45383056|ref|NM_204559.1| AGGGCCGGGCAGAGGCGCACGCAGCTCCCCGGGCGGCCCCGCTC-CAGCC 85 gi|213515133|ref|NM_001141603. CGCATATTATTATTACCTTTAGGACAAGTTGAATGTGTTCGTCAACATCT 100 * gi|84452153|ref|NM_002449.4| TCTCCGTCCAAAGGCAATGACTTGTTTTCGCCCGACGAGGAGGGCCCAGC 144 gi|208431713|ref|NM_001135625. TCTCCGTCCAAAGGCAATGACTTGTTTTCGCCCGACGAGGAGGGCCCAGC 56 gi|118601823|ref|NM_001079614. TCTCCGTCCAAAGGCAATGACCTGTTTTCGTCCGATGAGGAGGGCCCGGC 66 gi|114326503|ref|NM_013601.2| TCTCCGACTAAAGGCGGTGACTTGTTTTCGTCGGATGAGGAGGGCCCCGC 126 gi|119220589|ref|NM_012982.3| TCTCCGTCCAAAGGCGGTGACTTGTTTTCGTCTGATGAGGAGGGCCCCGC 56 gi|148540149|ref|NM_001003098. TCTCCGTCCAAAGGCAGTGACCTGTTCTCGTCCGATGAGGAGGGCCCGGC 56 gi|45383056|ref|NM_204559.1| ACGCTCCGCATTCGCGATGGCTTCTCCTTCCAAAGCGAAGGAGGTT---- 131 gi|213515133|ref|NM_001141603. GATTTTGGCATAATAAGAAGCATGGATTC-TCCAGTAGATTCGACAGATG 149 * * * * * gi|84452153|ref|NM_002449.4| AGTGGTGGCCGGACCAGGCCCGGGGCCTGGGGGCGCCGAGGGGGCCGCGG 194 gi|208431713|ref|NM_001135625. AGTGGTGGCCGGACCAGGCCCGGGGCCTGGGGGCGCCGAGGGGGCCGCGG 106 gi|118601823|ref|NM_001079614. GATGGTGGCCGGACCGGGCCCGGGGCCTGGGGGCGCCGAAGGAGCAGCGG 116 gi|114326503|ref|NM_013601.2| GGTACTGGCCGGCCCGGGTCCCGGGCCTGGAGGAGCCGAGGGCAGCGCAG 176 gi|119220589|ref|NM_012982.3| GGTGCTGGCCGGCCCGGGCCCCGGGCCTGGAGGAGCCGAGGGCGGCGCGG 106 gi|148540149|ref|NM_001003098. GGCGCTGGCCGGGCCGGGCCCGGGGCCTGGGGGCGCGGAGGGGGCGGCCG 106 gi|45383056|ref|NM_204559.1| --TTCTCCTCCGACGAGG---AGGGCCCGGCGGCC-----GGCGCCGAGG 171 gi|213515133|ref|NM_001141603. ACTTTTCAACCTATGAGG---ACACTCCTCGACCACCGACGCAGCTCAAG 196 * * ** * * * gi|84452153|ref|NM_002449.4| AGGAGCGCCGCGTCAAGGTCTCCAGCCTGCCCTTCAGCGTGGAGGCGCTC 244 gi|208431713|ref|NM_001135625. AGGAGCGCCGCGTCAAGGTCTCCAGCCTGCCCTTCAGCGTGGAGGCGCTC 156 gi|118601823|ref|NM_001079614. AGGAGCGCCGCGTCAAGGTCTCCAGCCTGCCCTTCAGTGTGGAGGCGCTC 166 gi|114326503|ref|NM_013601.2| AGGAACGCAGGGTCAAGGTCTCCAGCCTGCCCTTCAGCGTGGAGGCGCTC 226 gi|119220589|ref|NM_012982.3| AGGAGCGCAGGGTCAAGGTCTCCAGCCTGCCCTTCAGCGTGGAGGCGCTC 156 gi|148540149|ref|NM_001003098. AGGAGCGCCGCGTCAAGGTCTCCAGCCTGCCCTTCAGCGTCGAGGCGCTC 156 gi|45383056|ref|NM_204559.1| AGCACCACAAAGTCAAGGTGTCCAGCTTGCCGTTCAGCGTGGAAGCCCTC 221 gi|213515133|ref|NM_001141603. GAGCGAAAAACACCTGAATCACC--TTTACCTTTCAGTGTGGATGCGATC 244 * * ** * ** ***** ** ** ** ** gi|84452153|ref|NM_002449.4| ATGTCCGACAAGAAGCCGCCCAAGGAGGCGTCCCCGCTGCCGGCCGAAAG 294 gi|208431713|ref|NM_001135625. ATGTCCGACAAGAAGCCGCCCAAGGAGGCGTCCCCGCTGCCGGCCGAAAG 206 gi|118601823|ref|NM_001079614. ATGTCGGACAAGAAGCCGCCCAAGGAGACGTCCCCGCGGCCAGCCGAAAG 216 gi|114326503|ref|NM_013601.2| ATGTCCGACAAGAAGCCGCCCAAGGAATCGCCCGCGGTGCCACCCGACTG 276 gi|119220589|ref|NM_012982.3| ATGTCCGACAAGAAGCCGCCCAAGGAATCGCCCGCGGTGCCACCCGACTG 206 gi|148540149|ref|NM_001003098. ATGTCGGACAAGAAGCCGCCCAAGGGGGCGTCCCCGCGGCCGGCAGACAG 206 gi|45383056|ref|NM_204559.1| ATGTCCGACAAGAAACCCCCTAAAGAGCTGCCGCTGGCCGCGGCGGGGGG 271 gi|213515133|ref|NM_001141603. ATGTTGGATAGAAGAACTCCTGGCGA----CGGAGGGAGACGCC--ACAG 288 **** ** * * * ** * * * * * gi|84452153|ref|NM_002449.4| CGCCTCGGCCGGGGCCACCCTGCGG----CCA-----CTGCTGCTGTCGG 335 gi|208431713|ref|NM_001135625. CGCCTCGGCCGGGGCCACCCTGCGG----CCA-----CTGCTGCTGTCGG 247 gi|118601823|ref|NM_001079614. CGCCTCCGCCGGGGCCACCCTGCGG----CCG-----CTTCTGCTGCCTG 257 gi|114326503|ref|NM_013601.2| CGCCTCGGCTGGCGCTGTCCTGCGG----CCG-----CTGCTGCTGCCGG 317 gi|119220589|ref|NM_012982.3| CGCCTCGGCTGGCGCTGTCCTGCGG----CCG-----CTGTTGCTGCCGG 247 gi|148540149|ref|NM_001003098. CGCCTCTGCCGGGGCCGCCCTGCGG----CCG-----CTGCTGCTGCCGG 247 gi|45383056|ref|NM_204559.1| CAGCGCCGACGGGGCGACCGTGGGCACCTCCAGGAACCTGCTGCTGCCGG 321 gi|213515133|ref|NM_001141603. CGGTACGATAATCTCTCCCCTGGGG----------------AATTACTCT 322 * * * * ** * * gi|84452153|ref|NM_002449.4| GGCACGGCGCTCGG-GAAGCGCACAGCCCC---GGGCCGCTGGTGAAGCC 381 gi|208431713|ref|NM_001135625. GGCACGGCGCTCGG-GAAGCGCACAGCCCC---GGGCCGCTGGTGAAGCC 293 gi|118601823|ref|NM_001079614. GCCACGGCGTCCGG-GAAGCTCACAGCCCC---GGGCCGCTGGTCAAACC 303 gi|114326503|ref|NM_013601.2| GACACGGCGTCCGG-GACGCTCACAGTCCC---GGGCCTCTCGTCAAGCC 363 gi|119220589|ref|NM_012982.3| GACACGGCGTCCGG-GACGCTCACAGTCCC---GGGCCTCTCGTCAAGCC 293 gi|148540149|ref|NM_001003098. GACACGGCGCCCGG-GAAGCCCCCAGCCCC---GGGCCGCCGGGGAAGCC 293 gi|45383056|ref|NM_204559.1| GCCACGGCTCCCGG-GACGCGCACAGCCCCCCCGGGGCTCTTACAAAAAC 370 gi|213515133|ref|NM_001141603. ATATCGGTGTCCAGAGAGGCGTCTAGTACAG--AAGACTTTCCTCACAAC 370 *** * * ** ** ** * * * * * gi|84452153|ref|NM_002449.4| CTTCGAGACCGCCTCGGTCAAGTCGGAAAATTCAGAAGATGGAGCGGCGT 431 gi|208431713|ref|NM_001135625. CTTCGAGACCGCCTCGGTCAAGTCGGAAAACTCAGAAGATGGAGCGGCGT 343 gi|118601823|ref|NM_001079614. CTTCGAGACCGCCTCGGTCAAGTCGGAAAATTCAGAAGACGGAGCGGCGT 353 gi|114326503|ref|NM_013601.2| CTTCGAGACCGCCTCGGTCAAGTCGGAAAATTCCGAAGACGGAGCACCGT 413 gi|119220589|ref|NM_012982.3| CTTCGAGACCGCCTCGGTCAAGTCGGAAAATTCCGAAGACGGAGCGCCGT 343 gi|148540149|ref|NM_001003098. CTTCGAGGCCGCCTCGGTCAAGTCGGAGAGCGCCGAGGACGGAGCCGCGT 343 gi|45383056|ref|NM_204559.1| CTTCGACACCGCTTCGGTCAAATCGGAGAACTCGGAGGACGGCACGTCCT 420 gi|213515133|ref|NM_001141603. TTT--GGCCCGTCTTCTTCGA--CAGTTAAATCAGAG------ACGTC-- 408 ** *** * ** * * * * * ** * * gi|84452153|ref|NM_002449.4| GGATGCAGGAACCCGGCCGATATTCGCCGCCGCCAAGACATATGAGCCCT 481 gi|208431713|ref|NM_001135625. GGATGCAGGAACCCGGCCGATATTCGCCGCCGCCAAGACATATGAGCCCT 393 gi|118601823|ref|NM_001079614. GGATGCAGGAACCGGGCAGATACTCGCCGCCGCCAAGACACATGAGCCCC 403 gi|114326503|ref|NM_013601.2| GGATACAGGAGCCCGGCAGATACTCCCCGCCGCCCAGACATATGAGCCCC 463 gi|119220589|ref|NM_012982.3| GGATACAGGAGCCCGGCAGATACTCCCCGCCGCCCAGACACATGAGCCCC 393 gi|148540149|ref|NM_001003098. GGATGCAGGAGCCCGGCAGATACTCGCCGCCGCCAAGACATATGAGCCCC 393 gi|45383056|ref|NM_204559.1| GGATCCAAGAGGCCGGGAGATATTCGCCTCCTCCAAGACACCTGAGCCCT 470 gi|213515133|ref|NM_001141603. GGAACCAGGGGACT---TTGCGTCCAATTTCGCTCCAGCGCTCCACCAGC 455 *** ** * * * * * * * * gi|84452153|ref|NM_002449.4| ACCACCTGCACCCTGAGGAAACACAAGACCAATCGGAAGCCGCGCACGCC 531 gi|208431713|ref|NM_001135625. ACCACCTGCACCCTGAGGAAACACAAGACCAATCGGAAGCCGCGCANNNC 443 gi|118601823|ref|NM_001079614. ACCACCTGCACCCTGCGGAAACACAAGACCAATCGGAAGCCCCGCACACC 453 gi|114326503|ref|NM_013601.2| ACCACCTGCACCCTGAGGAAACACAAGACCAACCGGAAGCCACGCACACC 513 gi|119220589|ref|NM_012982.3| ACCACCTGCACCCTGAGGAAACACAAGACCAACCGGAAGCCACGCACACC 443 gi|148540149|ref|NM_001003098. ACCACCTGCACCCTGCGGAAGCACAAGACCAATCGGAAGCCGAGAACGCC 443 gi|45383056|ref|NM_204559.1| ACAGCCTGCACTCTGAGGAAGCACAAGACGAATCGGAAGCCCCGCACCCC 520 gi|213515133|ref|NM_001141603. TCAGTCC-CTCCTTGAGGAAACACAAGACCAACAGGAAGCCCCGGACCCC 504 * * * * ** **** ******** ** ******* * * * gi|84452153|ref|NM_002449.4| CTTTACCACATCCCAGCTCCTCGCCCTGGAGCGCAAGTTCCGTCAGAAAC 581 gi|208431713|ref|NM_001135625. CTTTACCACATCCCAGCTCCTCGCCCTGGAGCGCAAGTTCCGTCAGAAAC 493 gi|118601823|ref|NM_001079614. CTTTACCACGTCCCAGCTCCTCGCTCTGGAGCGCAAGTTCCGCCAGAAAC 503 gi|114326503|ref|NM_013601.2| CTTCACCACATCCCAGCTTCTAGCCTTGGAGCGCAAGTTCCGCCAGAAAC 563 gi|119220589|ref|NM_012982.3| GTTCACCACGTCCCAGCTTCTAGCCTTGGAGCGCAAGTTCCGCCAGAAAC 493 gi|148540149|ref|NM_001003098. CTTCACCACGTCGCAGCTCCTCGCCCTGGAGCGCAAGTTCCGCCAGAAAC 493 gi|45383056|ref|NM_204559.1| ATTCACTACTTCCCAGCTGCTGGCCCTGGAGCGCAAGTTCCGCCAGAAGC 570 gi|213515133|ref|NM_001141603. CTTCACCTCCTCCCAGCTCCTGTCCCTGGAGAGGAAGTTCCATCAGAAAC 554 ** ** * ** ***** ** * ***** * ******* ***** * gi|84452153|ref|NM_002449.4| AGTACCTCTCCATTGCAGAGCGTGCAGAGTTCTCCAGCTCTCTGAACCTC 631 gi|208431713|ref|NM_001135625. AGTACCTCTCCATTGCAGAGCGTGCAGAGTTCTCCAGCTCTCTGAACCTC 543 gi|118601823|ref|NM_001079614. AGTACCTCTCCATCGCAGAGCGGGCAGAGTTCTCCAGCTCTCTGAACCTC 553 gi|114326503|ref|NM_013601.2| AGTACCTGTCCATAGCAGAGCGGGCCGAGTTCTCCAGCTCTCTGAACCTT 613 gi|119220589|ref|NM_012982.3| AGTACCTCTCCATCGCAGAGCGGGCCGAGTTCTCCAGCTCTCTGAACCTT 543 gi|148540149|ref|NM_001003098. AATACCTCTCCATTGCAGAGCGCGCGGAGTTCTCCAGCTCTCTGAACCTC 543 gi|45383056|ref|NM_204559.1| AGTACCTGTCCATCGCCGAGCGAGCCGAATTCTCCAGCTCCCTCAACCTC 620 gi|213515133|ref|NM_001141603. AGTACCTGTCCATTGCAGAGCGGGCCGAGTTCTCCTCCTCCCTGTCCCTC 604 * ***** ***** ** ***** ** ** ****** *** ** *** gi|84452153|ref|NM_002449.4| ACAGAGACCCAGGTCAAAATCTGGTTCCAGAACCGAAGGGCCAAGGCGAA 681 gi|208431713|ref|NM_001135625. ACAGAGACCCAGGTCAAAATCTGGTTCCAGAACCGAAGGGCCAAGGCGAA 593 gi|118601823|ref|NM_001079614. ACAGAGACCCAGGTCAAAATCTGGTTCCAGAACCGAAGAGCCAAGGCGAA 603 gi|114326503|ref|NM_013601.2| ACAGAGACCCAGGTCAAAATCTGGTTCCAGAACCGAAGGGCTAAGGCGAA 663 gi|119220589|ref|NM_012982.3| ACAGAAACCCAGGTCAAAATCTGGTTCCAGAACCGAAGGGCTAAGGCAAA 593 gi|148540149|ref|NM_001003098. ACAGAGACCCAGGTTAAAATCTGGTTCCAAAACCGAAGGGCCAAGGCGAA 593 gi|45383056|ref|NM_204559.1| ACAGAGACCCAGGTCAAAATCTGGTTCCAAAATCGGAGGGCCAAGGCCAA 670 gi|213515133|ref|NM_001141603. TCAGAGACCCAGGTAAAGATCTGGTTCCAGAATCGACGGGCTAAAGCCAA 654 **** ******** ** *********** ** ** * ** ** ** ** gi|84452153|ref|NM_002449.4| AAGACTGCAGGAGGCAGAACTGGAAAAGCTGAAAATGGCTGCAAAACCTA 731 gi|208431713|ref|NM_001135625. AAGACTGCAGGAGGCAGAACTGGAAAAGCTGAAAATGGCTGCAAAACCTA 643 gi|118601823|ref|NM_001079614. AAGACTGCAGGAGGCAGAACTGGAAAAGCTGAAAATGGCTGCAAAACCTA 653 gi|114326503|ref|NM_013601.2| AAGACTGCAAGAGGCGGAACTGGAAAAGCTGAAAATGGCTGCCAAGCCTA 713 gi|119220589|ref|NM_012982.3| AAGACTGCAGGAGGCGGAACTGGAAAAGCTGAAAATGGCTGCCAAACCTA 643 gi|148540149|ref|NM_001003098. AAGACTGCAGGAGGCAGAACTAGAAAAGCTGAAGATGGCTGCAAAACCTA 643 gi|45383056|ref|NM_204559.1| GAGACTGCAGGAGGCTGAGCTAGAGAAGCTCAAAATGGCAGCGAAGCCAA 720 gi|213515133|ref|NM_001141603. GAGAGTACAGGAGGCAGAGGCGGAGAAACTCAAGATGGCCGCCA--CAGG 702 *** * ** ***** ** ** ** ** ** ***** ** * * gi|84452153|ref|NM_002449.4| TGCTGCCCTCCAGCTTCAGTCTCCCTTTCCCCATCAGCTCGCCCCTGCAG 781 gi|208431713|ref|NM_001135625. TGCTGCCCTCCAGCTTCAGTCTCCCTTTCCCCATCAGCTCGCCCCTGCAG 693 gi|118601823|ref|NM_001079614. TGCTGCCCTCCGGCTTCAGCCTCCCTTTCCCCATCAACTCTCCCCTGCAA 703 gi|114326503|ref|NM_013601.2| TGCTGCCCTCAGGCTTCAGTCTGCCCTTCCCTATCAACTCACCCCTGCAA 763 gi|119220589|ref|NM_012982.3| TGCTGCCCTCGGGCTTCAGTCTGCCCTTCCCTATCAACTCCCCCTTGCAA 693 gi|148540149|ref|NM_001003098. TGCTGCCCTCTGGCTTCAGCCTTCCTTTCCCCATCAACTCGCCTCTGCAA 693 gi|45383056|ref|NM_204559.1| TGTTGCCGTCGGGGTTCAGCCTCCCTTTCCCCATCAACTCCCCCATCCAG 770 gi|213515133|ref|NM_001141603. TGTTGGATCCAAGC--CGGGGTTCTATCACCCG--GGGTTCTCCTCACTG 748 ** ** * * * * * * * ** * * * gi|84452153|ref|NM_002449.4| GCAGCGTCCATATATGGAGCATCCTACCCGTTCCATAGACCTGTGC---T 828 gi|208431713|ref|NM_001135625. GCAGCGTCCATATATGGAGCATCCTACCCGTTCCATAGACCTGTGC---T 740 gi|118601823|ref|NM_001079614. GCAGCATCTCTATATGGTGCATCTTACCCTTTCCATAGACCTGTGC---T 750 gi|114326503|ref|NM_013601.2| GCAGCATCCATATACGGCGCATCCTACCCCTTCCATAGACCTGTGC---T 810 gi|119220589|ref|NM_012982.3| GCGGCATCCATATACAGCGCCTCCTACCCCTTCCATAGACCTGTGC---T 740 gi|148540149|ref|NM_001003098. GCAGCATCCATATACGGAGCGTCCTACCCTTTCCATAGACCTGTGC---T 740 gi|45383056|ref|NM_204559.1| GCCGCCTCACTGTACGGAACATCCTACCCTTTTCACAGACCTGTGC---T 817 gi|213515133|ref|NM_001141603. CCGTTTCCCCTCTGTGTCA-GTTTGGGTGGTCTAGGGGGTCTGGGTGGGT 797 * * * * * * * *** * * gi|84452153|ref|NM_002449.4| TCCCATCCCGCCTGT-GGGACTCTATGCCACGCCAGTGGGATATGGCATG 877 gi|208431713|ref|NM_001135625. TCCCATCCCGCCTGT-GGGACTCTATGCCACGCCAGTGGGATATGGCATG 789 gi|118601823|ref|NM_001079614. CCCCATCCCGCCCGT-CGGACTCTATGCGACTCCAGTGGGATATGGCATG 799 gi|114326503|ref|NM_013601.2| CCCCATCCCGCCTGT-TGGACTCTATGCCACGCCGGTTGGATATGGCATG 859 gi|119220589|ref|NM_012982.3| TCCCATCCCGCCTGT-GGGACTCTATGCCACGCCGGTGGGATATGGCATG 789 gi|148540149|ref|NM_001003098. CCCCATCCCGCCCGT-CGGACTCTATGCGACCCCAGTCGGATATGGCATG 789 gi|45383056|ref|NM_204559.1| TCCTATCCCGCCCGT-TGGACTCTATGCTACTCCTGTCGGATATAGCATG 866 gi|213515133|ref|NM_001141603. GGGTCTCAGGTATGTACGGAGAACAGGGGTTCCCCTTAAGACACACCCCT 847 ** * ** *** * * ** * ** * * gi|84452153|ref|NM_002449.4| TACCACCTGTCCTAAGGAAGACCAGATCAAT-AGACTCCATGATGGATGC 926 gi|208431713|ref|NM_001135625. TACCACCTGTCCTAA----------------------------------- 804 gi|118601823|ref|NM_001079614. TACCACCTATCCTAAGGAAGACCAGCTCAAT-AGACTCCGGGATGGATGT 848 gi|114326503|ref|NM_013601.2| TACCATCTATCCTAAGGAAGACCAGATGGACCAGACTCCAGGATGGATGT 909 gi|119220589|ref|NM_012982.3| TACCATCTATCCTAAAGAAGACCAGATGGAC-ACACTCTAGGATGGATGT 838 gi|148540149|ref|NM_001003098. TACCATCTATCCTAA----------------------------------- 804 gi|45383056|ref|NM_204559.1| TACCACTTATCTTAAGGA-GATCAGAAAGGCACGGTGACAGCGAGAGAGA 915 gi|213515133|ref|NM_001141603. CTGTTAAAAACAGAACCAAATCTGGGGGTGTACACCTCACCTATGGGGTA 897 * ** gi|84452153|ref|NM_002449.4| TTGTTTCAAAGGGTTTCCTCTCCCTCTCCACGAAGGCAGTACCAGCCAGT 976 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. TTGTTTAAAAGCCTCCCCCGTCCCTCTCCAAGAAGACAGTCCCGCTCTAC 898 gi|114326503|ref|NM_013601.2| TTGCATAAAAGCATCCCCC-TCCCTCTCCGAGAAGGTGGTGCCAACTC-T 957 gi|119220589|ref|NM_012982.3| TTGTG-GAAAGCATTCCCC-TCCCTCTCCAGGAAGGCGGTGCCAATTT-T 885 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| CTTCCTGGTGGA---TCTCATCCAGCCTCAAGAATGCAGTACCCAACC-- 960 gi|213515133|ref|NM_001141603. CGGACTGTTCCACCTGTCCTGAAAGGTTTGTGTGTGC-GTGCGAATGTGA 946 gi|84452153|ref|NM_002449.4| ACTCCTGCTCTGCTAACCCTGCGTGCACCACCCTAAGCGGCTAGGCTG-- 1024 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. AAACCT----TGCATGCACCAC---CCTCAGCCTCAGCGGCTAGGTCG-- 939 gi|114326503|ref|NM_013601.2| GCTCCTGAA-TGCGAGCCTTGCAT-TGTCACCCTAAGCGACAGG------ 999 gi|119220589|ref|NM_012982.3| GCTCCTGAA-CGCAAACCCTGCGT-TGTCGCCCTAAGCAACAGGCCTGTG 933 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| GGTACTGGC-CGTTCTTTCTGCACGCTTCTATCT-GCCATCCCGAGTGT- 1007 gi|213515133|ref|NM_001141603. TGAACCTCACAACAAGATTTGAAA-TGATACCCTAACTCTCAGGGATGC- 994 gi|84452153|ref|NM_002449.4| ACAGGGCCACACGACATAGCTGAAATTTGTTCTGTAGGC-GGAGGCACC- 1072 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. ACAGGGCCACA-GACATAGTTCAAATTGCTTCTTTTGACTGGAGACACCC 988 gi|114326503|ref|NM_013601.2| -----GCCACTTGATACAGAGTGAATTTGTTATTTAGGTGAGAGGCACT- 1043 gi|119220589|ref|NM_012982.3| GGGGGGCCACTTGATACAGAGTGAATTTGTTATTTACGTGAGAGGCACT- 982 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| ACAGGAGTTCGCGTTAGCAAAGCAAGGCATCCTGTATGCAACAGGC---- 1053 gi|213515133|ref|NM_001141603. -CTTGAATATCTTGTGCTGGACCAACTT-TGATATAGTCAACAGATGTGG 1042 gi|84452153|ref|NM_002449.4| AAGCCCTGTTTTCTTGGTGTAATCTTCCAGATGC--CCCCTTTTCCTTTC 1120 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. AAGCCCTGTTTTCTTGGT-TAATCTGCCAGATGCGCCCCCTACCCCTTTC 1037 gi|114326503|ref|NM_013601.2| AAGACCTGTTTTGTTTTCATAATTTTCCAAATGC--CCCCTTT-CCTCTC 1090 gi|119220589|ref|NM_012982.3| AAGACCGATTTTGTTTTCATAATTTCCCAAATGT--CCCCTTTTCCTCTC 1030 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -----TGGGTGTCTTCTGAGAGCGCTCTGAGTGCTCACAGTCTGATCCTC 1098 gi|213515133|ref|NM_001141603. AAG--TGTGCATGGTTATACGGTACCTTGTGTTCCCTGGTTTGTTACGGA 1090 gi|84452153|ref|NM_002449.4| ACAAA-GATTGGCTCTGATGGTTTTTATGTATAAATATATATATATAATA 1169 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. ATAAAAGATTGGCTCTGACAGTTTTTATATATAAATATATATAT--AATA 1085 gi|114326503|ref|NM_013601.2| ACAAA-TATTGGCTCTGCTAGTTTTTATGTATAAATATATA------ATA 1133 gi|119220589|ref|NM_012982.3| ACAGT-TATTGGCTCTGCTAGTTTTTATGTATAAATATATA------ATA 1073 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| AGAGTGTTT----------------------------------------- 1107 gi|213515133|ref|NM_001141603. AGAGCCTAGTGCATCAGAACACCCCATAGTTCCAGCACCCATAGTACAAG 1140 gi|84452153|ref|NM_002449.4| AAATATAATACA-TTTTTATACAGCAGACGTAAAAATTCAAATTATTTTA 1218 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. AAATATAATACA-TTTTTATACAGCAAAAAAAAAAAAAAAA--------- 1125 gi|114326503|ref|NM_013601.2| AAATATAAGAC--TTTTTATATGCCAGATGTAAAAATTCAAGTTATTTTA 1181 gi|119220589|ref|NM_012982.3| AAATATAAGAC--TTTTTATATGCCAGATGTAAAAATTCAAGTTATTTTG 1121 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. CTCCATGGCAGGGTAATTGTTCATTTATTCTATAGCCCTGACCTGTGCTG 1190 gi|84452153|ref|NM_002449.4| AAA--GGCAAAATTTATATACATATGTGCTTTTTTTC--------TATAT 1258 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| AAA--GGCAAAATTTATATATACATTTATCCATTTTCTTTTTTTTTCTAG 1229 gi|119220589|ref|NM_012982.3| GAA--GGCAAAATTTATATATACGCTTATCCATTTT---------TCTAG 1160 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. TATTTGCCAAAGTTTGTTGGATCGTTTCGTAGGATACTGATCCACCGTGT 1240 gi|84452153|ref|NM_002449.4| CTCACCTTCCCAAAAGACACTGTGT-AAGTCCATTTGTTGTATTTTCTTA 1307 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| ATAGCATCTTCCTAAGATATTGTGTTAAGTCCATTTGCTACATTTTCTTA 1279 gi|119220589|ref|NM_012982.3| ATAGCATTTTCTTAAGATATTGTGTTTAGTCCATTTGCTACCTTTTCTTA 1210 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. GTCTGATCACTCCCTAAATACCAGATTAGCTC------------------ 1272 gi|84452153|ref|NM_002449.4| AAGAGGGAGACAAATTATTTGCAAAATGTGCTAAAGTCAATGATTTTTAC 1357 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| AAGGGAAAGA-GATTAATT-GCAGAATTTGCAAGGATGGTGGACT----- 1322 gi|119220589|ref|NM_012982.3| AAGGGAAAGA-GATTTGTTTGCAGAACTTTCAAGGAGGATGGACT----- 1254 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| GGGATTATTGACTTCTGCTTATGGAAAACAAAGAAACAGACACAATGCAC 1407 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| ------------TGCTTATGGAAAACATAGCAGAAGTAGACACATTCCAT 1360 gi|119220589|ref|NM_012982.3| ------------TGCTTATGGAGGACATGCCAGGAGTAGACATAGTGCAT 1292 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| ACAGAAAATATTAGATATGGAGAGATTATTCAAAGTGAAGGGGACACATC 1457 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| ACAGGATGTCACTTCAGACAGATTCTTGCAAGTGAAGGGGGAGGTGTAAC 1410 gi|119220589|ref|NM_012982.3| ACAAGATACAGTTTCAGATATATTCTTGCAAGGGAAGGGGGATGTGTAAC 1342 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| ATATT--TCTGCATTTTACTTGCATTAAAAGAA--ACCTCTTTATATACT 1503 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| GTGTTTATTTGCATTTCTG-TGCACAAGAAAAAGAAATCTCTTGA--TGC 1457 gi|119220589|ref|NM_012982.3| ATGTTCTTATGCATTTTAGGTGCGTAAGAAACA-AAACCTCTTGAGATGC 1391 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| ACAGTTGTTCCTATCTCTCCCCCGCCCCCCACCGCCCCACCACACACATA 1553 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| ACATTTGATCCTATTTTTTTTCTCTTTTTCTCCATTCCA---------TA 1498 gi|119220589|ref|NM_012982.3| ACATTTGATCTTATTTTTCT----CTCTTCTCCATTCCA---------TG 1428 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| TTTTTAAAGTTTTTCCTTTTTTAAGAATATTTTTGTAAGACCAATACCTG 1603 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TTATTAAATCTTTGTTGTTGTTTTAAGATCGATGAAAAGA---------- 1538 gi|119220589|ref|NM_012982.3| TTGTCAAATCT--------------------------------------- 1439 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| GGATGAGAAGAATCCTGAGACTGCCTGGAGGTGAGGTAGAAAATTAGAAA 1653 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| GGATGAGAATAACTCTGAGAGTTACTCAGGGTAAAGTAGAAAATAGGAAA 1588 gi|119220589|ref|NM_012982.3| ----GAGGATAACTCTGAGAATTACTCAGGGTAA------AAGTGGG--A 1477 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| TACTTCCTAATTCTTCTCAAGGCTGTTGGTAACTTTATTTCAGATAATTG 1703 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| CTCCATGTCAGGTCCCTGGAG-----------------------TGAGAG 1615 gi|119220589|ref|NM_012982.3| TTCCATTTCAGGGCCCTGGCG-----------------------TGCGAG 1504 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| GAGAGTAAAATGTTAAAACCTGTTGAGAGGAATTGATGGTTTCTGAGAAA 1753 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| GGGGTTAGAAGGTGAAATATTGTTTGTAAGAATTGAT---TTCTATGAAA 1662 gi|119220589|ref|NM_012982.3| GGT-TTAGAAGATAAAAC-TTG--TGTAGGAATTGGT---TTCTGTGAAA 1547 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| TACTAGGTACATTCATCCTCACAGATTGCAAAGGTGATTTGGGTGGGGGT 1803 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TGCTATCTACATCAGTCCTCACACGGTACAGAGGTGATTGGAAGAGGACA 1712 gi|119220589|ref|NM_012982.3| TGCTAACTACATCAGTCCTCACAGGGCACAGAGGAGATTGCAAGAGGGCG 1597 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| TTAGTAATTTTCTGCTTAAAAAATGAGTATCTTGTAACCATTACCTATAT 1853 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TGGT-AAATCTCTTCTTAAAAA-TGAGTGTCTTATAACTGTGGCCTATAT 1760 gi|119220589|ref|NM_012982.3| TAGTTAAATATCTGCTTAGAAA-TGAGTGTCTTGTAACTGTTGCCTATAT 1646 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| GCTAAATATTCTTGAACAATTAGTAGATCCAGAAAGAAAAAAAAATAT-- 1901 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TTTAAATATTCTTCAACAGTCCATAGAATGAGGAAGGAAAACATGCCTTC 1810 gi|119220589|ref|NM_012982.3| TTGAAAGATTCTTCAACAGTCCATAGAATCAGGAAGGGGAAAAAAT---- 1692 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| ----------------------------------------------GCTT 1905 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTAGCTC 1860 gi|119220589|ref|NM_012982.3| ----------------------------------------------GCTT 1696 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| TCTCTGTGTGTGTACCTGTTGTATGTCCTAAACTTATTAG-----AAAAT 1950 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TCTCTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTG 1910 gi|119220589|ref|NM_012982.3| TCTCTCTGTGTGTGTGTACTTAC-------TGTATGTGC-------TAAA 1732 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| TTTATATACTTTTTTACATGTTGGGGGGCAGAAGGTAAAGCC--ATGTTT 1998 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TGTACTTTGTGTGCTAAACTTCTTAGGGAAATTTATATACTCTAACGTGT 1960 gi|119220589|ref|NM_012982.3| TGTATTAGGGACTCGAACGTGTTTGGGGTAGACAATGAAGCC--ATGTGT 1780 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| TGACTTGGTGAAAATGGGA----------TTGTC--AAACAGCCCATTAA 2036 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TGGGCAGATGGAGAAGCCATGTGCTTGAGTTGCTGGAGATGGCGTTGTCA 2010 gi|119220589|ref|NM_012982.3| TGGGCT--TGGTGGAAACAAACG---GTGTTGTC--AGACAACACAGTCA 1823 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| GTTCCCTGGTATTTCACCTTCCTGTCCATCTGTCCCCTCCCTCCGGTATA 2086 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| GTCAGCACCTGGGTGTCTCACCTTCCTGTCCATCTCTTCCCCC-AGTATA 2059 gi|119220589|ref|NM_012982.3| GCTAGCCCCTTGGTCTTTCACCTGCCTGTCCACCTCTTCCC---AATATA 1870 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| CCTTTATCCCTTTGAAAGGGTG-CTTGTACAATTTGATATATTTTATTGA 2135 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| TTTTTATCCCGTTGAATGGGTATCTTGTATAATTTTATATATTTTATTGA 2109 gi|119220589|ref|NM_012982.3| TTTTTATCCCGTTGAAAGGGTATCTTGTATAATTTTATATATTTTATTGA 1920 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| AGAGTTATCTCTTATTCTGAATT--AAATTAAGC--ATTTGTTTTATTGC 2181 gi|208431713|ref|NM_001135625. -------------------------------------------------- gi|118601823|ref|NM_001079614. -------------------------------------------------- gi|114326503|ref|NM_013601.2| AGAGTTATTTCTTATCTCTTACTCTGAATTAAATTAAAATATTTTATTGC 2159 gi|119220589|ref|NM_012982.3| AGAGTTATTTCTTATCTCATACTCTGAATTAAATTAAAATGTTTTATTGC 1970 gi|148540149|ref|NM_001003098. -------------------------------------------------- gi|45383056|ref|NM_204559.1| -------------------------------------------------- gi|213515133|ref|NM_001141603. -------------------------------------------------- gi|84452153|ref|NM_002449.4| AGTAAAGTTTGTCCAAACTCACAATTAAAAAAAAAAAAAAAAA 2224 gi|208431713|ref|NM_001135625. ------------------------------------------- gi|118601823|ref|NM_001079614. ------------------------------------------- gi|114326503|ref|NM_013601.2| AGT---------------------------------------- 2162 gi|119220589|ref|NM_012982.3| AGTAAA------------------------------------- 1976 gi|148540149|ref|NM_001003098. ------------------------------------------- gi|45383056|ref|NM_204559.1| ------------------------------------------- gi|213515133|ref|NM_001141603. ------------------------------------------- Biostrings/inst/extdata/s_1_sequence.txt0000644000126300012640000007577412227063322022025 0ustar00biocbuildphs_compbio@HWI-EAS88_1_1_1_1001_499 GGACTTTGTAGGATACCCTCGCTTTCCTTCTCCTGT +HWI-EAS88_1_1_1_1001_499 ]]]]]]]]]]]]Y]Y]]]]]]]]]]]]VCHVMPLAS @HWI-EAS88_1_1_1_898_392 GATTTCTTACCTATTAGTGGTTGAACAGCATCGGAC +HWI-EAS88_1_1_1_898_392 ]]]]]]]]]]]]Y]]]]]]]]]YPV]T][PZPICCK @HWI-EAS88_1_1_1_922_465 GCGGTGGTCTATAGTGTTATTAATATCAATTTGGGT +HWI-EAS88_1_1_1_922_465 ]]]]Y]]]]]V]T]]]]]T]]]]]V]TMJEUXEFLA @HWI-EAS88_1_1_1_895_493 GTTACCATGATGTTATTTCTTCATTTGGAGGTAAAA +HWI-EAS88_1_1_1_895_493 ]]]]]]]]]]]]]]]]]]]]]]T]]]]RJRZTQLOA @HWI-EAS88_1_1_1_953_493 GTATGTTTCTCCTGCTTATCACCTTCTTGAAGGCTT +HWI-EAS88_1_1_1_953_493 ]]]]]]]]]]]]]]]]]T]]]]]]]]]]MJUJVLSS @HWI-EAS88_1_1_1_868_763 GTTCTCTAAAAACCATTTTTCGTCCCCTTCGGGGCG +HWI-EAS88_1_1_1_868_763 ]]]]]]]]]]]Y]]T]]]O]]]]VO]W]VZMXVOLS @HWI-EAS88_1_1_1_819_788 GTACGCTGGACTTTGTAGGATACCCTCGCTTTCCTT +HWI-EAS88_1_1_1_819_788 ]]]]]]]]]]]]]]]]Y]]P]RRTYYV][VZXHFSO @HWI-EAS88_1_1_1_801_123 GAACAGCATCTGACTCAGATAGTAATCCACGCTCTT +HWI-EAS88_1_1_1_801_123 ]]]]]]]]]]]]]]]]Y]]]R]]]]]]]UZZXVSSS @HWI-EAS88_1_1_1_885_419 GCTTGGTAAGTTGGATTAAGCACTCCGTGGGCAGTT +HWI-EAS88_1_1_1_885_419 ]]]]]]]]]]]]]]C]]VYY]R]]V]]TRVHPAJAM @HWI-EAS88_1_1_1_941_477 GAGAAGTTAATGGATGAATTGGCACAATGCTACAAT +HWI-EAS88_1_1_1_941_477 ]]]]]]]]]]]]]]]]]]]]]]]R]TPVVVZCSFLO @HWI-EAS88_1_1_1_984_473 GTTGGTTTCTATGTGGCTTAATACGTTAATTAAAAT +HWI-EAS88_1_1_1_984_473 ]]]]]]]]]]]]]]]]]]ETY]VJ]]]HTOMEQAHC @HWI-EAS88_1_1_1_570_435 GTCTATAGTGTTATTAATATCAAGTTGGGGGAGCAT +HWI-EAS88_1_1_1_570_435 ]]]]Y]]]]]]]R]]]]]]]]]R]]]HVTREEVHAA @HWI-EAS88_1_1_1_649_729 GATATTTCTGATGAGTCGAAAAATTATCTTGATAAA +HWI-EAS88_1_1_1_649_729 ]]]]]]]]]]]]]V]]]]VYV]]]]T]][ZVRVSSL @HWI-EAS88_1_1_1_867_781 GAGTTTGTATCTGTTACTGAGAAGTTAATGGATGAA +HWI-EAS88_1_1_1_867_781 ]]]]]]]]]]]]]]]Y]]]T]OV]]]]T[PZJVSFF @HWI-EAS88_1_1_1_722_426 GGACTTTGTAGGATACCCTCGCTTTCCTGCTCCTGT +HWI-EAS88_1_1_1_722_426 ]]]]]]]]]]]]R]]]]]YYY]VT]RY]VVZPQMOO @HWI-EAS88_1_1_1_789_111 GGTTTCATGGTTTGGTCTAACTTTACCGCTACTAAA +HWI-EAS88_1_1_1_789_111 ]]]]]]]]]]]]]]T]]]]]]]]]P]]][ZZXVASM @HWI-EAS88_1_1_1_945_812 GTATTTTACCAATGACCAAATCAAAGAAATGACTCG +HWI-EAS88_1_1_1_945_812 ]]]]]]]]]]]]]]]Y]YY]]]YV]]]][ZZUQSSS @HWI-EAS88_1_1_1_974_468 GTGTACGCGCAGGAAACTCTGACGTTCTTTCTGTCG +HWI-EAS88_1_1_1_974_468 ]]]]]]]]]]T]]OYYHP]R]T]]Y]HHREEXIAMH @HWI-EAS88_1_1_1_321_368 GTCCCCTTCGGGGCGGTGGTCTTTTGTGTTTTTAAT +HWI-EAS88_1_1_1_321_368 ]]]]]]]]]]]]]]]]Y]]R]]C]M]Y][ZMXVAJS @HWI-EAS88_1_1_1_974_763 GACTGAATGCCAGCAATCTCTTTTTTTGTCTCATTT +HWI-EAS88_1_1_1_974_763 ]]]]]]]]]]]P]]VY]]]Y]]]]]EH][ZZXHSSS @HWI-EAS88_1_1_1_923_392 GCAATGGAGAAAGACGGAGAGCGCCAACGGCGTCCC +HWI-EAS88_1_1_1_923_392 ]]]]]]]]]]]]]]]]]T]R]RTRYECVVVSPEAHA @HWI-EAS88_1_1_1_331_887 GCCACCATGATTATGACCAGTGTTTCCAGTCCGTTC +HWI-EAS88_1_1_1_331_887 ]]]]]]V]]]]]]]]YV]]]T]]]]]]YRVQXVOSK @HWI-EAS88_1_1_1_681_650 GGATTACTATCTGAGTCCGATGCTGTTCAACCACTA +HWI-EAS88_1_1_1_681_650 ]]]]]]]]]]]]]]H]]]]R]]]]]]]PMVSMLOSH @HWI-EAS88_1_1_1_1001_376 GCTACCGATAACAATACTGTAGGCCTGGGTGGTGCT +HWI-EAS88_1_1_1_1001_376 ]]]]]]]Y]]]]YY]]]]]VTYY]CY]][QZMVFFJ @HWI-EAS88_1_1_1_812_666 GGTGGTTATTATACCGTCAAGGACTGTGTGACTATT +HWI-EAS88_1_1_1_812_666 ]]]]]]]]]]]]]O]YT]MV]]J]]]R]JVCMSCSS @HWI-EAS88_1_1_1_879_409 GTGACTATTGACGTCCTTCCTCGTACGCCGGGCCAT +HWI-EAS88_1_1_1_879_409 ]Y]]Y]]Y]]Y]]Y]]Y]]]]]YJJ]EVXVZXOHAJ @HWI-EAS88_1_1_1_874_833 GAGGCTTGCGTTTATGGTACGCTGGTCTTTGTATGT +HWI-EAS88_1_1_1_874_833 ]Y]]]]]]]]]]]]]]]]]YT]]T]HJVTZOXIFNF @HWI-EAS88_1_1_1_671_184 GGATATTTCTAATGTCGTCACTGATGCTGCTTCTGT +HWI-EAS88_1_1_1_671_184 ]]]]]]]]]]Y]]]]]Y]]Y]]VP]]V][ZZXQSSF @HWI-EAS88_1_1_1_770_657 GATAGTTTGACGGTTAATGCTGGTAATGGTGGGTTT +HWI-EAS88_1_1_1_770_657 ]]]]]]]]]]]]]]]]]]]]]]]YRY]][XZXASSS @HWI-EAS88_1_1_1_864_736 GCCTCATCAGGGTTAGGAACATTAGAGCCTTGAATG +HWI-EAS88_1_1_1_864_736 ]]]]]]]]]]]]]]]]]YT]Y]]YYYY]VZUXAOSS @HWI-EAS88_1_1_1_885_763 GTTAGGCCAGTTTTCTGGTCGTGTTCAACAGACCTC +HWI-EAS88_1_1_1_885_763 ]]]]]]]]Y]]]]]]]]]Y]]Y]]]]TRWOVJQOSA @HWI-EAS88_1_1_1_246_659 GTTTTTTACCTTTAGACATTACATCACTCCTTCTGC +HWI-EAS88_1_1_1_246_659 ]]]]]]]]]]]]]]]]]Y]]]]]]]T]][ZZXVSNS @HWI-EAS88_1_1_1_977_481 GTTGATAAGCAAGCATCTCATTTTGTGCATATACCT +HWI-EAS88_1_1_1_977_481 ]]]]]]]]]]]]]]T]]]]M]]]]R]EYTZOXLHOS @HWI-EAS88_1_1_1_844_119 GGCATTTAGTAGCGGTAAAGTTAGGCCAAACCCTGG +HWI-EAS88_1_1_1_844_119 ]]]]]]]]]]]]]]]NYVY]]]R]JP]CRJOXEOLL @HWI-EAS88_1_1_1_947_483 GAGGATAAATTATGTCTAATATTCAAACTTGCGCCG +HWI-EAS88_1_1_1_947_483 ]]]]]]]]]]]Y]]P]]YY]VY]]PTVYMCMPLOLH @HWI-EAS88_1_1_1_878_486 GAGAAATAAAAGTCTGAAACATGATTAAACTCCTAA +HWI-EAS88_1_1_1_878_486 ]]]]]]]]]]Y]]]]]]R]]T]]OV]VTMXZRQSNA @HWI-EAS88_1_1_1_966_456 GCTTGTTTACGAATTAAATCGAAGTGGACTTCTTGT +HWI-EAS88_1_1_1_966_456 ]]]]]]]]]]]Y]]]]]V]]]]P]]]YMPZEEVAKC @HWI-EAS88_1_1_1_786_629 GAGATTATTTGTCTCCAGCCACTTAAGTGAGGTGAT +HWI-EAS88_1_1_1_786_629 ]Y]]]]]]]]]]]]]]Y]Y]Y]]]Y]YYXQVXLMAS @HWI-EAS88_1_1_1_817_744 GTATAAGTCAAAGCACCTTTAGCGTTAAGGTACTGA +HWI-EAS88_1_1_1_817_744 ]]]]]]]]]]Y]]]Y]]]Y]YY]]]]RO[ZTRQSNH @HWI-EAS88_1_1_1_726_628 GGATTGGTTTCGCTGAATCAGGTTATTAAAGAGATT +HWI-EAS88_1_1_1_726_628 ]]]]]]]]]]]]]]]V]]]R]]]]]]]R[ZZHVLSS @HWI-EAS88_1_1_1_985_406 GATTATTTGTCTCCAGCCACTTAAGTGAGGTGATTT +HWI-EAS88_1_1_1_985_406 ]]]]]]]]]]]]]]V]]]T]]]HMT]JRWZZJASSS @HWI-EAS88_1_1_1_717_240 GACTTAGTTCATCAGCAAACGCAGAATCAGCGGTAT +HWI-EAS88_1_1_1_717_240 ]]]]]]]]]]Y]]]]]V]Y]]]T]PM]]UZZOVSHO @HWI-EAS88_1_1_1_346_566 GTTCCGACTACCCTCCCGACTGCCTATGATGTTTAT +HWI-EAS88_1_1_1_346_566 ]]]]]]]]]]]]]]]]]]O]]]]]YH]]MZVUVSHS @HWI-EAS88_1_1_1_930_759 GGCTTTTTTATGGTTCGTTCTTGTTACCCTTCTGTT +HWI-EAS88_1_1_1_930_759 ]]]T]]]]]]]]]]]]]Y]P]]C]]VMVXZZHVCAA @HWI-EAS88_1_1_1_441_780 GGTTTATCGTTTTTGACACTCTCACGTTGGCTGACG +HWI-EAS88_1_1_1_441_780 ]]]]]]]]]]]]]]]]]]]]]]]]]]R]VVZXVASC @HWI-EAS88_1_1_1_893_385 GTTAACACTACTGGTTATATTGACCATGCCGCTTTT +HWI-EAS88_1_1_1_893_385 ]]]]]]]]]]]]]]]]Y]TV]YJRVRVTOMHEOSLN @HWI-EAS88_1_1_1_860_742 GTCCCCTTCGGGGCGGTGGTCTATAGTGTTATTAAT +HWI-EAS88_1_1_1_860_742 ]]]]]]]]]]]]]]]]T]]RHYC]H]OVVZCRVFNS @HWI-EAS88_1_1_1_646_490 GTAACCGTCTTCTCGTTCTCTAAAAACCATTTTTCT +HWI-EAS88_1_1_1_646_490 ]]]]]]]]]]]]]]]]]]]]]PER]V]]PVZXQOOC @HWI-EAS88_1_1_1_484_791 GCTGATGAACTAAGTCAACCTCAGCACTAACCTTGC +HWI-EAS88_1_1_1_484_791 ]]]]]]]]]]]VY]]]T]]]V]M]YC]]TZZMOJSL @HWI-EAS88_1_1_1_698_397 GTTTTCATGCCTCCCAATCTTGGAGGCTTTTTTATG +HWI-EAS88_1_1_1_698_397 ]]]]]]]]]]]]]]HT]]]]]]]C]]V][ZZXVASS @HWI-EAS88_1_1_1_955_440 GGAAAACGAACAAGCGCAAGAGTAAACATAGTGCCA +HWI-EAS88_1_1_1_955_440 ]]]]]]]]]]]Y]]]]]TR]H]VPVVTOOHPMQLOH @HWI-EAS88_1_1_1_976_442 GTATTAAGGATGAGTGTTCAAGATTGCTGGAGGCCT +HWI-EAS88_1_1_1_976_442 ]]]]]]]]]]]]]]]]]]]TV]R]]]YYOPCPQHKO @HWI-EAS88_1_1_1_366_209 GAGCAGAAGCAATACCGCCAGCAATAGCACCAAACA +HWI-EAS88_1_1_1_366_209 ]]]]]]]Y]]]]]]]]]]]VY]JH]TY]TTZMLFSH @HWI-EAS88_1_1_1_872_762 GTTTATAGGTCTGGTGAACACGACCAGAAAACTGGC +HWI-EAS88_1_1_1_872_762 PPPPPPPPPPPPPEPPPPPOPPMOOPPOMMMPOOOJ @HWI-EAS88_1_1_1_361_357 GAAGAAATAACATCATGGTAACGCTGCATGAAGTAA +HWI-EAS88_1_1_1_361_357 ]]]]]]]]]]]]]]]]]]V]]]]]]]]H[ZEMVSOA @HWI-EAS88_1_1_1_804_628 GTCAAAAATTACGTGCAGAAGGAGTGATGTAATGTC +HWI-EAS88_1_1_1_804_628 ]]]]]]]]]]]]]]]]]]TY]]R]R]R]WXVRVLMJ @HWI-EAS88_1_1_1_864_773 GGGAGGGTGTCAATCCTGACGGTTATTTCCTAGACA +HWI-EAS88_1_1_1_864_773 ]]]]]]]]]]]VY]]]]]R]]]T]Y]Y]RVVMKHLJ @HWI-EAS88_1_1_1_561_780 GTTATTAATATCAAGTTGGGGGAGCACATTGTAGCA +HWI-EAS88_1_1_1_561_780 ]]]]]]]]]]]]]V]]]]]]]EE]YTRRVZVTOSKJ @HWI-EAS88_1_1_1_415_588 GTAGGATACCCTCGCTTTCCTGCTCCTGTTGAGTTT +HWI-EAS88_1_1_1_415_588 ]]]]]Y]]]]]]]]]]]]]]]]V]]]]]PZOCVSSS @HWI-EAS88_1_1_1_862_123 GTCACATTAAATTTAACCTGACTATTCCACTGCAAC +HWI-EAS88_1_1_1_862_123 ]]]]]]]]]]]]]]]]]]]TT]]P]]]]UZZXVCOS @HWI-EAS88_1_1_1_686_617 GTTTCCGAGATTATGCGCCAAATGCTTACTCAAGCT +HWI-EAS88_1_1_1_686_617 ]]]]]]]]]]]]]]]]]]]MH]]]]]]M[ZZJNSSL @HWI-EAS88_1_1_1_299_507 GTTTTCTGGTCGTGTTCAACAGACCTATAAACATTC +HWI-EAS88_1_1_1_299_507 ]]]]]]]]]]]]]]]]]J]]T]P]Y]O]RJVXOSLO @HWI-EAS88_1_1_1_433_756 GTTAACTTCTGCGTCATGGAAGCGATAAAACTCTGC +HWI-EAS88_1_1_1_433_756 PPPPPPPPPPPPPPPPPPPPHPPPOPPMOPPPNKMA @HWI-EAS88_1_1_1_604_463 GATTTATGTTTGGTGCTATTGCTGGCGGGTTTTTTT +HWI-EAS88_1_1_1_604_463 ]]]]]Y]]]]]]]]]]]R]]]]]RY]OYEHVTQHKS @HWI-EAS88_1_1_1_366_254 GCATTCAAGGTGATGTGCTTGCTACCGATAACCATA +HWI-EAS88_1_1_1_366_254 ]]]]]]]]]]]]Y]]]]]]]]]]V]]]V[RZXAJSO @HWI-EAS88_1_1_1_861_780 GTTGGTTTCTATGTGGCTAAATACGTTAACAAAAAG +HWI-EAS88_1_1_1_861_780 ]]]]]]]]]]]]]]]]]]Y]Y]]]]]]R[XOXQLOS @HWI-EAS88_1_1_1_51_508 GGGGGAGCACATTGTAGCATTGTGCCAATTCATCCA +HWI-EAS88_1_1_1_51_508 ]]]]]Y]]]]]]V]]]]]]]]YTJ]]OM[ZZRPAJH @HWI-EAS88_1_1_1_918_394 GCAAGCCTCAACGCAGCGACGAGCACGAGAGCGGTC +HWI-EAS88_1_1_1_918_394 ]]]]]]]]]]]]]]Y]]]R]]VY]M]]OVJZPQKAF @HWI-EAS88_1_1_1_873_770 GAATTTACGGAAAACATTATTAATGGCGTCGAGCGT +HWI-EAS88_1_1_1_873_770 ]]]]]]]]]]V]V]]P]]YY]VVV]]R]PUOCOCMH @HWI-EAS88_1_1_1_712_190 GCCGTTTTGGATTTAACCGAAGATGATTTCGATTTT +HWI-EAS88_1_1_1_712_190 ]]]]]]]]]]O]]]V]]]]OC]O]]O]][QTCVSSS @HWI-EAS88_1_1_1_411_573 GAGTTTATTGCTGCCGTCATTGCTTATTATGTTCAT +HWI-EAS88_1_1_1_411_573 ]]]]]]]]]]]]]]]]T]H]]]Y]]R]]RZEXVAJS @HWI-EAS88_1_1_1_228_633 GATTTTATTGGTATCAGGGTTAATCGTGCCAAGAAA +HWI-EAS88_1_1_1_228_633 ]]]]]]]]]]]]]]]]]]]]]VV]]Y]P[ZOUVFNH @HWI-EAS88_1_1_1_359_604 GGTGTCTGTAAAACAGGTGCCGAAGAAGCTGGAGTA +HWI-EAS88_1_1_1_359_604 ]]]]]]]]]]]]]]]]]]]]]]EV]VV][ZZXMSMH @HWI-EAS88_1_1_1_303_791 GGATTAAGTTCATGAAGGATGGTGTTAATGCCACTC +HWI-EAS88_1_1_1_303_791 ]]]]]]]]]]]]]]]]]]]]]]]]]]TVVVZXOSSS @HWI-EAS88_1_1_1_998_450 GTTCAGTTGTTGCAGTGGAATAGTCAGGTTAAATTT +HWI-EAS88_1_1_1_998_450 ]]]]]]]]]]]]]R]]]]CT]O]]YR]][ZEEKSSS @HWI-EAS88_1_1_1_697_640 GTGTGAGGTTATAACGCCGAAGCGGGAAAAATTTTA +HWI-EAS88_1_1_1_697_640 ]]]]]]]]]]]]]]]]]]]ET]]]]EPJTXQXVSSL @HWI-EAS88_1_1_1_961_516 GAAGCCTGAATGAGCTTAATAGAGGCCAAAGCGGTC +HWI-EAS88_1_1_1_961_516 ]]]]]]]]]]]]T]]]]Y]]V]TT]]YPTHVOQKLH @HWI-EAS88_1_1_1_676_167 GAATCAGCGGTATGGCTCCTCTCCTATTTGCTCTTT +HWI-EAS88_1_1_1_676_167 ]]]]]]]]]]V]]]]]]]EYV]TOTMV]JEHCENFA @HWI-EAS88_1_1_1_908_493 GATTCAGTACCTTAACGCTAAAGGTGCTTTGACTTA +HWI-EAS88_1_1_1_908_493 ]]]]]]]]]]]]]Y]]]]VR]H]]V]YV[ZECQSSM @HWI-EAS88_1_1_1_335_282 GACATTATGGGTCTGCAAGCTGCTTATGCTACTTTG +HWI-EAS88_1_1_1_335_282 ]]]]]]]]]]]]]]]]YR]]]]]]]T]VWZSEVSSJ @HWI-EAS88_1_1_1_706_512 GTTGAAATGGTAATAAGACGACCAATCTGACCAGCC +HWI-EAS88_1_1_1_706_512 ]]]]]]]]]]]]]]]Y]R]]JVYHRV]]WMZOKLHA @HWI-EAS88_1_1_1_927_495 GTAAGCATTTGGCGCATAATCTCGGAAACCTGCTGT +HWI-EAS88_1_1_1_927_495 ]]]]]]]]]]]]]]]T]]T]]]]T]HOOTTMMKNLH @HWI-EAS88_1_1_1_370_877 GTGAGAGTGTCAAAAACGATAAACCAACCATCAGCA +HWI-EAS88_1_1_1_370_877 ]]]]]]]]]]]]]]TVT]]]]]]]]JVPTQMRQJLJ @HWI-EAS88_1_1_1_223_238 GTTAACAGTCGGGAGAGGAGTGGCATTAACACCATC +HWI-EAS88_1_1_1_223_238 ]]]]]]Y]]]]]]N]R]]Y]]Y]]P]]VPSCTVHHS @HWI-EAS88_1_1_1_324_781 GTATGTTGACGGCCATAAGGCTGCTTCTGACGTTCG +HWI-EAS88_1_1_1_324_781 ]]]]]]]]]]]]]YR]P]]]Y]T]E]WTRJVMHKAF @HWI-EAS88_1_1_1_833_311 GGGGGAGCACATTGTAGCATTGTGCCAATTCATCCA +HWI-EAS88_1_1_1_833_311 ]]]]]Y]]Y]Y]Y]HTRVVT]MRY]VCEVVZJQKHF @HWI-EAS88_1_1_1_364_260 GGTTATCCATCTGCTTATGGAAGCCAAGCATTGGGG +HWI-EAS88_1_1_1_364_260 ]]]]]]]]Y]]]]]]]]]]]PY]V]HM]WMZXIMHS @HWI-EAS88_1_1_1_900_770 GGTCGCAAAGTAAGAGCTTCTCGAGCTGCGCAAGGG +HWI-EAS88_1_1_1_900_770 ]]]]]]]]Y]]]V]J]]]]YY]VO]Y]]TZOCLMOA @HWI-EAS88_1_1_1_674_661 GATATGGACCTTGCTGCTAAAGGTCTAGGAGCTAAA +HWI-EAS88_1_1_1_674_661 ]]]]]]]]]]]]]]]]]]OPY]TY]YE]UQZTQJSM @HWI-EAS88_1_1_1_524_466 GGTAAAGCTGATGGTATTGGCTCTAATTTGTCTAGG +HWI-EAS88_1_1_1_524_466 ]]]]]]]]]]]]]]]Y]]]]]]]YHOV][MTPVHHK @HWI-EAS88_1_1_1_960_818 GGTTTAGATATGAGTCACATTTTGTTCATGGTAGAG +HWI-EAS88_1_1_1_960_818 ]]]]]]]]]]]]]]]]]]V]]]]T]]]][VZXMSLN @HWI-EAS88_1_1_1_227_700 GTTGACATTTTAAAAGAGCGTGGATTACTATCTGAG +HWI-EAS88_1_1_1_227_700 ]]]]]]]]]]]]]]]]]]]]]]]]]]]][VZXVOLH @HWI-EAS88_1_1_1_662_208 GTCTAAAGGTAAAAAACGTTCTGGCGCTCGCCCTGG +HWI-EAS88_1_1_1_662_208 ]]]]]]]]]]V]P]TR]]]]]]M]]]TV[PREKMLF @HWI-EAS88_1_1_1_635_393 GTTTCTGTTGGTGCTGATATTGCTTTTGATGCTTAA +HWI-EAS88_1_1_1_635_393 ]]]]]]]]]]]]]]]]]]]]]]]]]]]OJZHUVAFM @HWI-EAS88_1_1_1_403_780 GCCTCCAAATCTTGGAGGCTTTTTTATGGTTCGTTC +HWI-EAS88_1_1_1_403_780 ]]]]]]]]Y]]]]]]T]]]]]]]]]Y]RRZZRMOSO @HWI-EAS88_1_1_1_468_756 GCAGAAGCAATACCGCCAGCAATAGCACCAAACATA +HWI-EAS88_1_1_1_468_756 ]]]]]]]]]]]]V]Y]]Y]]]HV]OTRVVJMONHFF @HWI-EAS88_1_1_1_484_755 GGTGCTATTGCTGGCGGTATTGGTTCTTCTCTTTCT +HWI-EAS88_1_1_1_484_755 ]]]]]]]]]]]]]]]]]HOT]HCTOEYCCMHMKHAH @HWI-EAS88_1_1_1_973_421 GTTTCCGTTGCTGCCATCTCCAAAACATTTTGACTG +HWI-EAS88_1_1_1_973_421 ]]]]]]]]]]]]]]]]]]]]M]MM]]V][ZEEINSF @HWI-EAS88_1_1_1_497_908 GGTTATAACGCCGAAGCGGTAAAAATTTTAATTTTT +HWI-EAS88_1_1_1_497_908 ]]]]]]]]]]]]]]Y]]]]]R]R]YY]][VTXVSSS @HWI-EAS88_1_1_1_991_521 GAGCTTCTCGAGCTGCGCAAGGATAGGTCGGATTTT +HWI-EAS88_1_1_1_991_521 ]]]]]]]]]]V]]]]]]]RR]]P]T]]YTQOEVSSS @HWI-EAS88_1_1_1_495_814 GCAGTAGACTCCTTCTGTTGATAAGCAAGCATCTCA +HWI-EAS88_1_1_1_495_814 ]]]]]]]]]]]]]]]]]]]]V]Y]]]Y][ZVXVSSA @HWI-EAS88_1_1_1_703_438 GATTATTTTGACTTTGAGCGTATCGAGGCTCTTTAA +HWI-EAS88_1_1_1_703_438 ]Y]]]]]]]]]]]]]]]]]]V]]]]ORWVVZUQCHF @HWI-EAS88_1_1_1_730_507 GTCATTGTGAGCATTTTCATCCCGAAGTTGCGGCTC +HWI-EAS88_1_1_1_730_507 ]]]]]]]]]]]]]]]]]]H]YYV]HOYT[HMOQALH @HWI-EAS88_1_1_1_866_100 GCCATTGCTCATATTGAAGTTCAGGCTGTTATTTTT +HWI-EAS88_1_1_1_866_100 ]]]]]]]]]]Y]]]]]]]]]]]]R]]]]CZTXVSSS @HWI-EAS88_1_1_1_949_458 GGTATGTAGGTGGCCAACAATTTTTATTGCTTGGGT +HWI-EAS88_1_1_1_949_458 ]]]]]]]]]]]]]H]Y]]RRY]]]RH]VEMCMHCJF @HWI-EAS88_1_1_1_320_300 GACACCTAAAGCTACATCGTCAACGTTATATTTTGT +HWI-EAS88_1_1_1_320_300 ]]]]]]]]]]]]]]]YY]]R]EJ]]]YT[JZXVSAH @HWI-EAS88_1_1_1_996_317 GCTTATCACCTTCTTGAAGGCTTCCCATTCATTCAG +HWI-EAS88_1_1_1_996_317 ]]]]]]]]]]]]]]]]]VYR]]]]]]O][ZSXVSHJ @HWI-EAS88_1_1_1_843_780 GGCTTCCATAAGCAGATGGATAACCGCATCAAGCTC +HWI-EAS88_1_1_1_843_780 ]]]]]]]Y]]Y]]Y]Y]]]V]V]]]]YPWTENVNLN @HWI-EAS88_1_1_1_337_794 GTCTCCAGCCACTTAAGTGAGGTGATTTATGTTTGG +HWI-EAS88_1_1_1_337_794 ]]]]]]T]]]Y]]]]Y]Y]]]]Y]R]]]MZVXVSJF @HWI-EAS88_1_1_1_599_542 GATAATGGTGATATGTATGTTGACGGCCCTAAGGCT +HWI-EAS88_1_1_1_599_542 ]Y]]]]]]]]V]V]]YY]]Y]JCYTRRVEJENLLAF @HWI-EAS88_1_1_1_636_218 GTTTGTATCTGTTACTGAGAAGTTAATGGTTGGATT +HWI-EAS88_1_1_1_636_218 ]]]]]]]]]]]]]]]]]J]JRY]]VYVH[CVCAAKS @HWI-EAS88_1_1_1_801_780 GTTGCAGTGGAATAGTCAGGTTAAATTTAATGTGAC +HWI-EAS88_1_1_1_801_780 ]]]]]]]]]]Y]Y]]T]Y]]O]EYT]]]TPZTVSCM @HWI-EAS88_1_1_1_753_627 GGATTAAGCACTCCGTGGACAGATTTGTCATTGTGA +HWI-EAS88_1_1_1_753_627 ]]]]]]Y]]]]]]]]]]]R]]]T]]]YV[ZZXQSSC @HWI-EAS88_1_1_1_234_684 GGTAAAAATTTTAATTTTTGCCGCTGAGGGGTTGAC +HWI-EAS88_1_1_1_234_684 ]]]]]]]]]]]]]]]]]]]Y]]]]]]V]RTZUVOAS @HWI-EAS88_1_1_1_915_728 GTTATTATACCGTCAAGGACTGTGTGACTATTGACG +HWI-EAS88_1_1_1_915_728 ]]]]]]]]]]]]]]V]]]]]]]]]Y]O][XZXOALK @HWI-EAS88_1_1_1_970_579 GCTTACTCAAGCTCAAACGGCTGGTCCGTTTTTTTT +HWI-EAS88_1_1_1_970_579 ]]]]]]Y]YY]]Y]]]]]RYR]]]O]RR[PTXVSFL @HWI-EAS88_1_1_1_706_163 GTTGCTGCCATCTCAAAAACATTTGGACTGCTCCGC +HWI-EAS88_1_1_1_706_163 ]]]]]]]]]]]]]]NTVT]]C]Y]VVH][ZTPLSOH @HWI-EAS88_1_1_1_851_764 GAAAATGCTCACAATGACAAATCTGTCCACGGAGTG +HWI-EAS88_1_1_1_851_764 ]]]]]]]]]]T]R]]]R]OTRY]Y]]VVJUSRESHM @HWI-EAS88_1_1_1_963_398 GGGTGATAAGCAGGAGAAACATACGAAGGCGCATAA +HWI-EAS88_1_1_1_963_398 ]]]]]]]]]]]Y]]V]YVTYHYJ]VJTVWPZOHJHF @HWI-EAS88_1_1_1_706_182 GCTTTGAGTCTTCTTCGGTTCCGACTACCCTCCCGA +HWI-EAS88_1_1_1_706_182 ]]]]]]]]]]]]]]]]T]]]Y]VTY]RVOSZHHLJA @HWI-EAS88_1_1_1_886_399 GATGTTATTTCTTCATTTGGAGGTAAAACCTCTTAT +HWI-EAS88_1_1_1_886_399 ]]]]]]]]]]]]]]T]]]]PYYYTVRMRWPVRQLAO @HWI-EAS88_1_1_1_975_702 GTAACCCAGCTTGGTAAGTTGGATTAAGCACTCCGT +HWI-EAS88_1_1_1_975_702 ]]]]]]]]]]]]]]]]Y]Y]]]P]]TRYVZVXQSNH @HWI-EAS88_1_1_1_634_538 GGTTAATGCTGGTAATGGTGGGTTTTTTTCTTTTTT +HWI-EAS88_1_1_1_634_538 ]]]]]Y]]]]]]]YO]O]YY]RR]]]E]MVVXEHHS @HWI-EAS88_1_1_1_803_696 GTTTAGATATGAGTCACATTTTGTTCATGGTAGAGA +HWI-EAS88_1_1_1_803_696 ]]]]]]]]]]]]]]]O]N]]]]]]]]R][ZTOPKOF @HWI-EAS88_1_1_1_878_417 GAACGAACCATAAAAAAGCCTCCAAGATTTGGAGGC +HWI-EAS88_1_1_1_878_417 ]]]]]]]]]]]]]Y]]]]]]Y]]EJ]JTRVVRKHOM @HWI-EAS88_1_1_1_926_442 GACGCGTTGGATGAGGAGAAGTGGCTTAATATGCTT +HWI-EAS88_1_1_1_926_442 ]]]]]]]]]]Y]]Y]]]]JP]R]]PY]HPVOXOAMO @HWI-EAS88_1_1_1_371_757 GCAGAAGTTAACACTTTCGGATATTTCTGATTAGTC +HWI-EAS88_1_1_1_371_757 ]]]]]]]]]]]]]]]]Y]]YRYT]Y]Y]VOPEIHJJ @HWI-EAS88_1_1_1_986_397 GCAATAGCACCAAACATAAATCCCCTCACTTAAGTG +HWI-EAS88_1_1_1_986_397 ]]]]]]]]]]]YY]]PYVRMVYE]YT]JTOZMHHCF @HWI-EAS88_1_1_1_553_75 GTTGAGTTTATTGCTGCCGTCATTGCTTATTATTTT +HWI-EAS88_1_1_1_553_75 ]]]]]]]]]]]]]Y]]]]]]]CY]CH]]MZZCVFOS @HWI-EAS88_1_1_1_692_494 GGCTGCGGACGACCAGGGCGAGCGCCAGAACGTTTT +HWI-EAS88_1_1_1_692_494 ]]]]]]]]R]]V]]N]]]]]HYRYRRC]CJORAJLO @HWI-EAS88_1_1_1_971_538 GGTTTAAGAGCCTCGATACGCTCAAAGTCAAAATAA +HWI-EAS88_1_1_1_971_538 ]]]]]]]]]]]]]]]V]]]]]]]PY]YTTPZMHNNN @HWI-EAS88_1_1_1_867_629 GTAAAGGCGCTCGTCTTTGGTATGTAGGTGGTCTAC +HWI-EAS88_1_1_1_867_629 ]]]]]]]]]]]]]]]]]]Y]VO]RVTJTPVQREAAC @HWI-EAS88_1_1_1_326_303 GAAGTGGCTTAATATGCTTGGCACGTTCGTCAAGGA +HWI-EAS88_1_1_1_326_303 ]]]]]]]]]]]]]]]]]]T]]]V]]]T][VZCESHF @HWI-EAS88_1_1_1_680_172 GTTCGTTTTCCGCCTACTGCGACTAAAGAGATTCTG +HWI-EAS88_1_1_1_680_172 ]]]]]]]]]]]Y]]]T]]]]YR]]VVVTRVHRVFAJ @HWI-EAS88_1_1_1_997_339 GTGAACAGTGGATTAAGTTCATGAAGGATGGTGTTA +HWI-EAS88_1_1_1_997_339 ]]]]]]]]]]]]]]]Y]]]YH]TJV]]M[ZZRVOOH @HWI-EAS88_1_1_1_415_754 GCATGACCTTTCCCATCTTGGCTTCCTTGCTGGTCA +HWI-EAS88_1_1_1_415_754 ]]Y]]]]]]]Y]]]H]]]]]]]]]]Y]]WPXJQSNC @HWI-EAS88_1_1_1_629_192 GTTCTCACTTCTGTTACTCCAGCTTCTTCGGCACCT +HWI-EAS88_1_1_1_629_192 ]]]]]]]]]]]]]]]V]]]]PY]]]Y]YVEOMHJOO @HWI-EAS88_1_1_1_160_207 GTGATGTGCTTGCTACCGATAACAATACTGTAGGCA +HWI-EAS88_1_1_1_160_207 ]]]]]]]]]]]]]]]]]]P]TY]V]]V]UZPRVSJC @HWI-EAS88_1_1_1_705_461 GTTTAAGAGCCTCGATACGCTCCAAGTCAAAATAAT +HWI-EAS88_1_1_1_705_461 ]]]]]]]]]]]]]]V]Y]]]]]CYY]R][TPRQHKH @HWI-EAS88_1_1_1_584_460 GAGTTGTTCCATTCTTTAGCTCCTAGACCTTTATCA +HWI-EAS88_1_1_1_584_460 ]]]]]]]]]]Y]]]]]]Y]]]]]]TYJ]VZZXKAMJ @HWI-EAS88_1_1_1_434_845 GTTCTGCTTCAATATCTGGTTGAACGGCGTCGCGTC +HWI-EAS88_1_1_1_434_845 ]]]]]]]]]]VV]]]]]]]]]]V]]]]][ZVTQNSF @HWI-EAS88_1_1_1_319_700 GATACCCTCGCTTTCCTGCTCCTGATGCGTTTATTG +HWI-EAS88_1_1_1_319_700 ]]]]T]]]V]]]YERYRYPYYPEYM]MCOHTUIKHJ @HWI-EAS88_1_1_1_882_462 GCATTCATCAAACGCTGAATAGCAAAGCCTCTACGC +HWI-EAS88_1_1_1_882_462 ]]]]]]]]]]]]]]]]]P]]Y]]HTRWV[PVPHMJH @HWI-EAS88_1_1_1_346_126 GTTCTCACTTCTGTTACTCCAGCTTCTTCGGCACCT +HWI-EAS88_1_1_1_346_126 ]]]]]]]]]]]]]]]]]]]]OY]]]]]][JVXQOSS @HWI-EAS88_1_1_1_285_738 GGTCTATAGTGTTATTAATATCAAGTTGGTGGTGCC +HWI-EAS88_1_1_1_285_738 ]]]]]]]]]Y]Y]YV]VV]P]]POORVRVCPCAMCA @HWI-EAS88_1_1_1_885_551 GTATTAAATCTGCCATTCAAGGCTCTAATGTTCCTA +HWI-EAS88_1_1_1_885_551 ]]Y]]]]]Y]]]]]]]]]Y]Y]]]]VPWUZRXIJLK @HWI-EAS88_1_1_1_211_313 GATGGAACTGACCAAACGTCGTTAGGCCAGTTTTCT +HWI-EAS88_1_1_1_211_313 ]]]]]]]]]]]]]]]T]]]]]]]Y]]]]TZZXVSSS @HWI-EAS88_1_1_1_905_706 GTAAAGGCGCTCGTCTTTGGTATGTAGGTGGTCAAC +HWI-EAS88_1_1_1_905_706 ]]]]]]]]]]]]]]]]]]]Y]]]]]T]]VZUPMFLL @HWI-EAS88_1_1_1_364_133 GTTGATATTTTTCATGGTATTGATAAAGCTGTTTCC +HWI-EAS88_1_1_1_364_133 ]]]]]]]]]]]]]T]]]]]]]]Y]]O]H[ZVXVFJH @HWI-EAS88_1_1_1_984_424 GTATGCCGCATGACCTTTCCCATCTTGGCTTTCTTG +HWI-EAS88_1_1_1_984_424 ]Y]]]]]]]]]]T]]]]]]Y]R]Y]RTTPZZEOSSF @HWI-EAS88_1_1_1_885_432 GGCTCATTCTGATTCTGAACAGCTTCTTGGGAAGTA +HWI-EAS88_1_1_1_885_432 ]]]]]Y]]]]]Y]]]]]RY]V]YVY]]YORVJNOMA @HWI-EAS88_1_1_1_730_651 GCAGAAGCCTGAATGAGCTTAATAGAGGCCAAAGCG +HWI-EAS88_1_1_1_730_651 ]]]]]]]]]]]YR]]]]]]]]]]]VTW]XZZPOSMS @HWI-EAS88_1_1_1_571_420 GGTTATTAAAGAGATTATTTGTCTCCAGCCACTTAA +HWI-EAS88_1_1_1_571_420 ]]]]]]]]]]]]]R]]]]]]]]P]]]OVPOHCILFN @HWI-EAS88_1_1_1_721_668 GTAGGTTTTCTGCTTAGGAGTTTAATCATGTTTCAG +HWI-EAS88_1_1_1_721_668 ]]]]]]]]]]]]]]]Y]]V]Y]]YO]]R[ZZXVLLL @HWI-EAS88_1_1_1_863_648 GCCTTCTGGTGATTTGCAAGAACGCGTACTTTTTCG +HWI-EAS88_1_1_1_863_648 ]]]]]]]]]]]T]]]]]TJ]YRV]T]YHMZZEPOFC @HWI-EAS88_1_1_1_714_518 GCATGGGTGATGCTGGTATTAAATCTGCCATTCAAG +HWI-EAS88_1_1_1_714_518 ]]]]]]]]]]]]]]]]]P]]R]V]]]]V[PZXOHHO @HWI-EAS88_1_1_1_832_717 GTTCTTATTACCCTTCTGAATGTCACGCTGATTATT +HWI-EAS88_1_1_1_832_717 ]]]]]]]]]]]]]]]]]]TT]]Y]V]]][ZJRVNSS @HWI-EAS88_1_1_1_345_593 GGGATGAACATAATAAGCAATGACGGCAGCAATAAA +HWI-EAS88_1_1_1_345_593 ]]]]]]]]]]]]Y]]]]]]]]]]]]]]][PCPMJLF @HWI-EAS88_1_1_1_833_651 GTAAAGCTGATGGTATTGGCTCTAATTTTTCTATGA +HWI-EAS88_1_1_1_833_651 ]]]]]]]]]]]]]]V]]]]]]]]CRY]]EZMXIALA @HWI-EAS88_1_1_1_794_763 GTGAAAAAGCGTCCTGCGTGTAGCGAACTGCGGTGG +HWI-EAS88_1_1_1_794_763 ]]]]]]]]]]]]Y]Y]Y]PYRRVR]OMRMSCMAJJL @HWI-EAS88_1_1_1_570_882 GTTTTGGATTTAACCGAAGATGATTTCGATTTTCTT +HWI-EAS88_1_1_1_570_882 ]]]]]]]Y]]]]Y]]]EV]HYYC]]RVVCZVXVOLA @HWI-EAS88_1_1_1_677_183 GAATGCAATGAAGAAAACCACCATTACCAGCATTAA +HWI-EAS88_1_1_1_677_183 ]Y]]]]]Y]]T]]]RVV]]]]]R]]]]][ZZMVSJH @HWI-EAS88_1_1_1_894_262 GAGCGTATGCCGCATGACCTTTCCCATCTTGGCTTC +HWI-EAS88_1_1_1_894_262 ]]]]]]]]]]]]]]]]T]]]]]]]]HV][ZVROSSO @HWI-EAS88_1_1_1_109_416 GTCGCAGTAGGCGGAAAACGCACCAGCGCAAGAGTC +HWI-EAS88_1_1_1_109_416 ]]]]]]]]]]]]]]N]V]]]H]TCYR]V[JPMHHAA @HWI-EAS88_1_1_1_168_329 GGATGAAAATGCTCACAATGACAAATCTGTCCACGG +HWI-EAS88_1_1_1_168_329 ]]]]]]]]]]]]]]]]]]]]O]MO]Y]RRVZXOSSO @HWI-EAS88_1_1_1_955_838 GGTGATGCTGGTATTAAATCTGCCATTCAAGGCTCT +HWI-EAS88_1_1_1_955_838 ]]T]Y]]]]]]]]]]V]]]]]V]]J]]]RQZXVSSJ @HWI-EAS88_1_1_1_451_882 GTGTTCAAGATTGCTGGAGGCCTCCACTATGAAATC +HWI-EAS88_1_1_1_451_882 ]]]]]]]]]]]]]]]]]]]]V]P]]RYJ[ZXCSKSS @HWI-EAS88_1_1_1_210_485 GTTATATTTTGATAGTTTGACGGTTAATGCTTGTAA +HWI-EAS88_1_1_1_210_485 ]]]]]]]]]]]]]]]]]]RT]]P]]CVYOHTCKSLA @HWI-EAS88_1_1_1_858_816 GTTGACAGATGTATCCATCTGAATGCAATGAAGAAA +HWI-EAS88_1_1_1_858_816 ]]]]]]]]]]]]]]]]]]]]]]Y]]]]Y[ZZXVKOO @HWI-EAS88_1_1_1_111_677 GGGCGGTGGTCTATAGTGTTATTAATATCAAGTTGG +HWI-EAS88_1_1_1_111_677 ]]]]]]]]]]]]Y]]]]]]]]]]]R]Y][ZPXQSLS @HWI-EAS88_1_1_1_669_439 GCTGACAACCGTCCTTTACTTGTCATGCGCTCTAAT +HWI-EAS88_1_1_1_669_439 ]]]]]]]]]]]]]]]]]Y]]]YO]T]]]WZZXQCJM @HWI-EAS88_1_1_1_176_181 GATTAGAGGCGTTTTATGATAATCCCCATGCTTTGC +HWI-EAS88_1_1_1_176_181 ]]]]]]]]]]]]]]]]]]]]MY]]Y]CV[RZXVSFS @HWI-EAS88_1_1_1_681_526 GAAATATCCTTTGCAGTAGCGCCCATATGAGAAGAG +HWI-EAS88_1_1_1_681_526 ]]]V]]]]]]]]]]]]TY]Y]T]C]]R][JZHHFFN @HWI-EAS88_1_1_1_734_219 GGTAAAGGACTTCTTGACGGTACGTTGCATGCTTGG +HWI-EAS88_1_1_1_734_219 ]]]]]]]]]]T]]]]]RC]Y]R]]]]WPCTVCQCMA @HWI-EAS88_1_1_1_643_478 GTGAGTTGTTCCATTCTTTAGCTCCTAGACCTTTAG +HWI-EAS88_1_1_1_643_478 ]]]]]]]]]]]]Y]]]]]]J]]V]]]RJJZORVSAH @HWI-EAS88_1_1_1_152_301 GAAGTAGCGACAGCTTGGTTTTTAGTGAGTTTTTCC +HWI-EAS88_1_1_1_152_301 ]]]]]]]]]Y]V]]]]]]]]]]]V]]JJTZZHVSJL @HWI-EAS88_1_1_1_864_228 GTATTGCTTCTGCTCTTGCTGGTGGCGCCCTTTCTA +HWI-EAS88_1_1_1_864_228 ]]]]]]]]]]]]]]]]]]]]RH]VJVROTCXCPHMF @HWI-EAS88_1_1_1_623_542 GATAATCCCAATGCTTTGCGTGACTATTTTCGTGCT +HWI-EAS88_1_1_1_623_542 ]P]]]]]]]YVT]]]]]]]]O]C]]]]][VOJPCAS @HWI-EAS88_1_1_1_851_725 GTTTTTGAGATGGCAGCAACGGAAACCATAACGGGC +HWI-EAS88_1_1_1_851_725 ]]]]]]]]]T]]]]Y]]TJT]YCOVOVCHQJJOCLF @HWI-EAS88_1_1_1_643_262 GTTGGTTTCTATGTGGCTAAATACGTTAACAAAAAG +HWI-EAS88_1_1_1_643_262 ]]]]]]]]]]]]Y]]]V]]RVVVYV]]RPVTMNFHN @HWI-EAS88_1_1_1_664_726 GTTAATGCTGGTAATGGTGGTTTTCTTCTTTTCCTT +HWI-EAS88_1_1_1_664_726 ]]]]]]]]]]]Y]]]]]]]]J]]]OR]MCUZEKAOO @HWI-EAS88_1_1_1_736_517 GAAGTCATGATTGAATCGCGAGTGGTCGGCGGGTTG +HWI-EAS88_1_1_1_736_517 ]]]]]]]]]]]]]V]]]]]]O]M]]YR]WEHRMMML @HWI-EAS88_1_1_1_99_173 GTATAATTACCCCCAAAAGAAAGGTATTAAGGATGA +HWI-EAS88_1_1_1_99_173 ]]]]]]]]]]]]]CTTOT]REP]]OO]]RVSOMOSF @HWI-EAS88_1_1_1_664_501 GAGTATCCTTTCCTTTATCAGCGGCAGACTTGCCCC +HWI-EAS88_1_1_1_664_501 ]V]]]Y]]]]]]]]]]V]]TV]YVVHVOWMZEHJAK @HWI-EAS88_1_1_1_339_626 GTTATATGGCTGTTTGGTTTTTTTTTTGTTTATTTT +HWI-EAS88_1_1_1_339_626 ]]]]]]]]]]]]E]ERR]]P]P]V]YOCUEJCLFCA @HWI-EAS88_1_1_1_740_733 GGTGTGGTTGATATTTTTCATGGTATTGATAAAGCT +HWI-EAS88_1_1_1_740_733 ]]]]]]]]]]P]V]]]]]]Y]TT]Y]]PJZVXOOMO @HWI-EAS88_1_1_1_878_404 GCCTGTCTCATCATGGAAGGCGCTGAATTTACGGGA +HWI-EAS88_1_1_1_878_404 ]]]]]]]]]V]]]]]]P]]]]]]VYMP][ZCMQHCC @HWI-EAS88_1_1_1_822_121 GTTTATCCTTTGGATGGTCGCCATGATGGTGTTTTT +HWI-EAS88_1_1_1_822_121 ]]]]]]]]]]]]]]]]]]Y]]PM]]C]PVZVCVSFS @HWI-EAS88_1_1_1_708_703 GAGGAAGCATCAGCACCAGCACGCTCCCAAGCATTA +HWI-EAS88_1_1_1_708_703 ]]]]]]]]]]]]]]Y]]P]]R]]]PYY]MPZXAMMJ @HWI-EAS88_1_1_1_362_553 GTCTCATTTTGCATCTCGGCAATCTCTTTCTGATTT +HWI-EAS88_1_1_1_362_553 ]]]]]]]]]]]]Y]]]]]]]TT]]]]]][ZZMHSSF @HWI-EAS88_1_1_1_960_757 GGTATTAAATCTGCCATTCAAGGCTCTAATGTTCCT +HWI-EAS88_1_1_1_960_757 ]]]]]]]]]]]]]]]Y]]]RT]]]]]YPVZOXVLKS @HWI-EAS88_1_1_1_752_651 GCACGTTCGTCAAGGACTGGTTTAGATATGAGTCAC +HWI-EAS88_1_1_1_752_651 ]]]]]]]]]]]]Y]]Y]]]]]]]YYV]T[ZRUONFK @HWI-EAS88_1_1_1_754_734 GTAAGAAATCATGAGTCAAGTTACTGAACAATCCGT +HWI-EAS88_1_1_1_754_734 ]]]]]]]Y]]Y]]]]R]OY]TY]]]YMPTJPRQKJJ @HWI-EAS88_1_1_1_825_711 GATGGATACATCTGTCAACGCCGCTAATCAGGTTGT +HWI-EAS88_1_1_1_825_711 ]]]]]]]]]]]]]]Y]NTYYYVVV]RCVRPRRHSNO @HWI-EAS88_1_1_1_308_236 GTGCTCGTCGCTGCGTTGAGGCTTTCGTTTTTTTTT +HWI-EAS88_1_1_1_308_236 PPPPPPPPPPPPPPPPPOPPPPPPEPMPPPMPOFAF @HWI-EAS88_1_1_1_937_329 GGACGCTCGACGCCATTAATAATGTTTTCCGTAAAT +HWI-EAS88_1_1_1_937_329 ]]]]]]]]]O]]]]O]]R]]V]]]Y]]]WZVXVJOS @HWI-EAS88_1_1_1_838_878 GATTACTTCATGCAGCGTTACCATGATGTTATTTCT +HWI-EAS88_1_1_1_838_878 ]]]]]]]]]]]]]]]]]]]]]]J]]M]]TZQXVSNS @HWI-EAS88_1_1_1_414_792 GATTTTATTGGTATCAGGGTTAATCGTGCCAAGAAA +HWI-EAS88_1_1_1_414_792 ]]]]]]]]]]]YY]]V]]]]]V]]]HRRTVCOQJOM @HWI-EAS88_1_1_1_730_497 GTTGCTGCCATCTCAAAAACATTTGGACTGCTCCGC +HWI-EAS88_1_1_1_730_497 ]]]]]]]]]V]]]]NYPNRYR]]]]YCY[VXXQFMF @HWI-EAS88_1_1_1_969_419 GAGTGGTCGGCAGATTGCGCTAAACGGTCACATTAA +HWI-EAS88_1_1_1_969_419 ]]]]]]]]]]]Y]T]]CRYE]PET]]VEJJQCOMLN @HWI-EAS88_1_1_1_104_533 GTCATGATTGAATCGCGAGTGGTCGGCAGATTTTGC +HWI-EAS88_1_1_1_104_533 ]]]]]]]]]]Y]]]]]RTVV]M]O]TVCWPZXAALA @HWI-EAS88_1_1_1_836_628 GGACGCCGTTGGCGCTCTCCGTCTTTCTCCCTTGCG +HWI-EAS88_1_1_1_836_628 ]]]]]]]]]]]]]]]]]Y]]]T]]]]YYXZEXSFFM @HWI-EAS88_1_1_1_596_390 GCAAGCTGCTTATGCTAATTTGCATACTGACCAAGA +HWI-EAS88_1_1_1_596_390 ]]]]]]]]]]]]]]]]]V]]]]]O]]]]MQZXEAOK @HWI-EAS88_1_1_1_987_447 GTCTGGAAACGTACGGATTGTTCAGTAACTTTACTC +HWI-EAS88_1_1_1_987_447 ]]]]]]]]]]]]]]]]T]]]]]VTT]ERRVZMAHSJ @HWI-EAS88_1_1_1_370_352 GGCCTTGCTATTGACTCTACTGTAGACATTTTTACT +HWI-EAS88_1_1_1_370_352 ]]]]]]]]]]]]YY]]]]R]]]]RRP]O[ZZXVFLS @HWI-EAS88_1_1_1_843_797 GCAGTGGAATAGTCAGGTTAAATTTAATGTGACCGT +HWI-EAS88_1_1_1_843_797 ]]]]]]]]]]]]]]R]]O]CVY]]]T]Y[RMOOSSS @HWI-EAS88_1_1_1_720_664 GTTTACGAATTAAATCGAAGTGGACTGCTGGGGGGA +HWI-EAS88_1_1_1_720_664 ]]]]]]]T]]]]Y]]]]RR]R]]VTRVERVZEQSFF @HWI-EAS88_1_1_1_892_748 GTTGGATTAAGCACTCCGTGGGCAGATTTGTCATTG +HWI-EAS88_1_1_1_892_748 ]]]]]Y]]]]Y]Y]V]]]R]]CJM]JV]WZTEINOS @HWI-EAS88_1_1_1_569_417 GAAATGCAGCAGCAAGATAATCACGAGTATCCTTTC +HWI-EAS88_1_1_1_569_417 ]]]]]]]]]]]]]YV]N]]]]]Y]]O]VVVPNOSNS @HWI-EAS88_1_1_1_231_669 GACTACCCTCCCGACTGCCTATGATGTTTATCCTTC +HWI-EAS88_1_1_1_231_669 ]]]]]]]]]]]]]O]]]R]TOYYR]]Y]EPZXOOSA @HWI-EAS88_1_1_1_990_296 GGCTCTTCTCATATTGGCGCTACTGCAAAGGATATT +HWI-EAS88_1_1_1_990_296 ]]]]]]]]]]T]Y]]]T]]]]T]]O]JPRZTCVASS @HWI-EAS88_1_1_1_113_590 GCATGGGTGATGCTGGTATTAAATCTGCCATTCAAG +HWI-EAS88_1_1_1_113_590 ]]]]]]]]]]]]]]]]YV]]]]R]]]RV[QZXVCNO @HWI-EAS88_1_1_1_355_102 GATAAACCAACCATCAGCATGAGCCTGTCGCCTTGC +HWI-EAS88_1_1_1_355_102 ]]]]]]]]T]]]T]]Y]]MY]T]Y]YVMUSVEVNOF @HWI-EAS88_1_1_1_658_670 GTTTTCCGTAAATTCAGCGCCTTCCATGATGAGACA +HWI-EAS88_1_1_1_658_670 ]]]]]]]]]]YV]]]]]Y]]]]Y]]MTTHSZMQFFF @HWI-EAS88_1_1_1_699_385 GCAATGGAGAAAGACGGAGAGCGCCAACGGCGGCCA +HWI-EAS88_1_1_1_699_385 ]]]]]]]]]V]]]R]]]]]P]Y]Y]REV[ZRXAFHF @HWI-EAS88_1_1_1_943_855 GTTAACAAAAAGTCAGATATGGACCTTGCTGCTAAA +HWI-EAS88_1_1_1_943_855 ]]]]]]]]]]]]]]]]]]]]]]VT]]]][VZXVLKM @HWI-EAS88_1_1_1_465_881 GGTTTCCGTTGCTGCCATCTCAAAAACATTTGGACT +HWI-EAS88_1_1_1_465_881 ]]]]]]]]]]]]]]]]E]]]]CHT]V]M[ZZHVFOS @HWI-EAS88_1_1_1_110_475 GAACAGCATCGGACTCAGATAGTAATCCACGCTCTT +HWI-EAS88_1_1_1_110_475 ]]]]]]]]]]]]Y]]]]]T]Y]TY]YR]PZZUNOLO @HWI-EAS88_1_1_1_334_219 GACGCAATGGAGAAAGACGGAGAGCGCCAACGGCGT +HWI-EAS88_1_1_1_334_219 ]]]]]]]]]]]]OYY]Y]]]C]PYY]]VCOXXVHOA @HWI-EAS88_1_1_1_313_372 GACGCTGACAACCGGCCTTTACTTGTCATGCGCTCT +HWI-EAS88_1_1_1_313_372 ]]]]]Y]]]]]]]]YV]TVO]]]]YY]R[ZZXVSLS @HWI-EAS88_1_1_1_423_931 GGAGCACATTGTAGCATTGTGCCAATTCATCCATTA +HWI-EAS88_1_1_1_423_931 ]]]]]]]]]]]]]]]]]]]V]]]OO]]]RPZTQOOO @HWI-EAS88_1_1_1_511_536 GTATGGCTCTTCTCATATTGGCGCTACTGCAAAGGG +HWI-EAS88_1_1_1_511_536 ]]]]]]]]]]]]]]V]Y]]O]]]]]T]VPZOJIHJC @HWI-EAS88_1_1_1_233_304 GGTTATTAAAGAGATTATTTGTCTCCAGCCACTTAA +HWI-EAS88_1_1_1_233_304 ]]]]]]]]]]]]]]]]]]]]]]]]]]M][ZTXVSJL @HWI-EAS88_1_1_1_239_243 GCCCTCTTAAGGATATTCGCGATGAGTATAATTACC +HWI-EAS88_1_1_1_239_243 ]]]]]]]]]]]]]]]]]]Y]Y]]]Y]Y][UZXVJSM @HWI-EAS88_1_1_1_705_445 GCTGATGCTTCCTCTGCTGGTATGGTTGACGCCGGG +HWI-EAS88_1_1_1_705_445 ]]]]]]]]]]]]]]]]]]]]R]]]]Y]YHPPJQLNH @HWI-EAS88_1_1_1_371_846 GCCATCAACTAACGATTCTGTCAAAAACTGACGCGT +HWI-EAS88_1_1_1_371_846 ]]]]]]]]]]]]]]RP]]]]Y]]]Y]R]TTRXSSSO @HWI-EAS88_1_1_1_921_496 GCAATGGAGAAAGACGGAGAGCGCCCACAGCGGCCC +HWI-EAS88_1_1_1_921_496 ]]]]]]]Y]YYY]Y]]]HYO]TYPYHCMEPOJAFAF @HWI-EAS88_1_1_1_322_845 GTCACATTTTGTTCATGGTAGAGATTCTCTTGTTGA +HWI-EAS88_1_1_1_322_845 ]]]]]]]]]]]]]]Y]]]]]]]]Y]]]]WZZOVSMA @HWI-EAS88_1_1_1_243_812 GCTGCTAAAGGTCTAGGAGCTAAAGAATGGAACAAC +HWI-EAS88_1_1_1_243_812 ]]]]]]]]]]]Y]]]]]V]]]V]PYTR][ZZNQJLH @HWI-EAS88_1_1_1_370_333 GGGATGAACATAATAAGCAATGACGGCAGCAATAAA +HWI-EAS88_1_1_1_370_333 ]]]]]]]]]]]]]]TY]]YY]]]]]]]W[JHMOJSM @HWI-EAS88_1_1_1_859_299 GAGTTGTTCCATTCTTTAGCTCCTAGACCTTTAGCA +HWI-EAS88_1_1_1_859_299 ]]]]]]]]]]R]]]]]]]]]]]]]P]R]XZZXMHOJ @HWI-EAS88_1_1_1_797_117 GAAGTGTCCGCATAAAGTGCACCGCATGGAAATGAA +HWI-EAS88_1_1_1_797_117 ]]]]]]]]]]]Y]]Y]]]]]M]]]]M]]OHHNSSAF @HWI-EAS88_1_1_1_748_430 GCGCTACTGCAAAGGATATTTCTAATGTCGTCACTT +HWI-EAS88_1_1_1_748_430 ]]]]]]]]]]]]Y]]V]Y]]]]]R]]M][RTRMLOH @HWI-EAS88_1_1_1_356_375 GACATTATGGGTCTGCAAGCTGCTTATGCTAATTTT +HWI-EAS88_1_1_1_356_375 ]]]]]]]]]]]]]]]]]Y]]]]]]]O]]WVZPQSSH @HWI-EAS88_1_1_1_655_181 GTTCTGGCGCTCGCCCTGGTCGTCCGCAGCCGTTGG +HWI-EAS88_1_1_1_655_181 ]]]]]]]]]]]]]]Y]]]]]]]T]]]TJ[PMPLSJA @HWI-EAS88_1_1_1_801_48 GAAAGGTATTAAGGATGAGTGTTCAAGATTGCTGGG +HWI-EAS88_1_1_1_801_48 ]]]]]]]]]]]]]]Y]]R]]]Y]]OR]T[ZZRVNSH @HWI-EAS88_1_1_1_802_724 GCGTACTTATTCGCCACCATGATTATGACCTGTGTT +HWI-EAS88_1_1_1_802_724 ]]]Y]]]]]]]Y]]]VV]EV]C]P]RREHSCRHHHL @HWI-EAS88_1_1_1_705_499 GTCAACCTCAGCACTAACCTTGCGAGTCATTTCTTT +HWI-EAS88_1_1_1_705_499 ]]]]]]]]]]]]]]]TY]]]]]YYT]V]PVZXQSOS @HWI-EAS88_1_1_1_186_694 GCGTTTGATGAATGCAATGCGACAGGCTCATGCTGT +HWI-EAS88_1_1_1_186_694 ]]]]]]]]]]]]]]]]Y]]]]E]T]]]]WCZXVSSH @HWI-EAS88_1_1_1_354_371 GTTAGGAACATTAGAGCCTTGAATGGCAGATTTAAT +HWI-EAS88_1_1_1_354_371 ]]]]]]]]]]]]]]]]]]]]]V]]]]]V[OZXVHKS @HWI-EAS88_1_1_1_967_272 GGAAAACACCAATCTTTCCAAGCAACAGCAGGTTTC +HWI-EAS88_1_1_1_967_272 ]]]]]]]]]]]Y]]]]]]]J]]]PP]H][HZXOSSK @HWI-EAS88_1_1_1_668_200 GAACTGACCAAACGTCGTTAGGCCAGTTTTCTGTTC +HWI-EAS88_1_1_1_668_200 ]Y]]]]]]]]]]]]Y]]]]]T]]]P]V][XZXIASL @HWI-EAS88_1_1_1_306_556 GTTTTACCTCCAAATGAAGAAATAACATCATGGTAA +HWI-EAS88_1_1_1_306_556 ]]]]]]]]]]]]H]]]]Y]Y]]]VV]]]XVZTVMMM @HWI-EAS88_1_1_1_881_561 GTCGTCACTGATGCTGCTTCTGGTGTGGTTGGTATT +HWI-EAS88_1_1_1_881_561 ]]]]]]]]]]V]]]]]]]]]]]]VYY]]VZZCVFSS @HWI-EAS88_1_1_1_238_692 GTGGTCAACAATTTTAATTGCAGGGGCTTCGGCCCC +HWI-EAS88_1_1_1_238_692 ]]]]]]]]]]]]]]]]]]]Y]]]]]]]][VZXVSSS @HWI-EAS88_1_1_1_443_888 GCTCAAAGTCAAAATAATCAGCGTGACATTCAGAAG +HWI-EAS88_1_1_1_443_888 ]]]]]]]]Y]]]]]]]]Y]]]]YRPV]]XZVUVHSS @HWI-EAS88_1_1_1_167_340 GTCTTTCGTATTCTGGCGTGTAGTCGCCTTCTGTTT +HWI-EAS88_1_1_1_167_340 ]]]]]]]]]]]]]]]]]Y]EMVM]YHJVECZPLCHS @HWI-EAS88_1_1_1_603_569 GTTCTCACTTCTGTTACTCCAGCTTCTTCGGCACCT +HWI-EAS88_1_1_1_603_569 PPPPPPPPPPPPPPPPPPPPOPPPPPPPPPOPOOHK @HWI-EAS88_1_1_1_718_225 GTCAACGTTATATTTTGATAGTTTGACGGTTTATGT +HWI-EAS88_1_1_1_718_225 ]]]]]]]]]]]]]]]]NT]V]]]]MY]H[ZZEKSOF @HWI-EAS88_1_1_1_406_412 GGAAAGATTGGTGTTTTCCATAATAGACGCCACGCG +HWI-EAS88_1_1_1_406_412 ]]]]]]]]]]]]]]]]]]]T]YY]T]J][VCMVFMS @HWI-EAS88_1_1_1_549_119 GGAAAGACGGTAAAGCTGATGGTATTGGCTCTAATT +HWI-EAS88_1_1_1_549_119 ]]]]]]]]]]]]]]]]]]R]]]TYY]]]VVOPAAKS @HWI-EAS88_1_1_1_693_898 GTTTAGATATGAGTCACATTTTGTTCATGGTAGAGT +HWI-EAS88_1_1_1_693_898 ]]]]]]]]]]]Y]]]]]NY]]]]Y]VR]MJQNSAOC @HWI-EAS88_1_1_1_183_559 GTTTTACAGACACCTAAAGCTACATCGTCAACGTTA +HWI-EAS88_1_1_1_183_559 ]]]]]]]]]]]]]]]]]]]]]]]Y]]]VTVVRVMSM @HWI-EAS88_1_1_1_314_891 GATGAACTAAGTCAACCTCAGCACTAACCTTGCGAG +HWI-EAS88_1_1_1_314_891 ]]]]Y]Y]]]]]]]OYY]]]Y]]]YYVVTSZUOOHH @HWI-EAS88_1_1_1_884_867 GTTTGGTTCGCTTTGAGTCTTCTTCGGTTCCGACTA +HWI-EAS88_1_1_1_884_867 ]]]]]]]]]]]]]]]T]]]]]]]]]V]T[OVXEJSJ @HWI-EAS88_1_1_1_878_444 GCAATCTGCCGACCACTCGCGATTCAATCATGACTT +HWI-EAS88_1_1_1_878_444 ]]]]]]]]]]]Y]]T]T]]]]TRYVMEVVRSRHHNH Biostrings/inst/extdata/someORF.fa0000644000126300012640000006527612227063322020530 0ustar00biocbuildphs_compbio>YAL001C TFC3 SGDID:S0000001, Chr I from 152168-146596, reverse complement, Verified ORF ACTTGTAAATATATCTTTTATTTTCCGAGAGGAAAAAGTTTCAAAAAAAAAAAAAAAAAA AGAAGAAAAATAACTTTCTCATGTAATAAAAGGTAACTAATGTAGACAAAAAAGTATACA TTTAGCTTTTCTTTTTTTGATGATTTTTGAGTTTCATGTTACTAATCAGAACAATTAACG ACACCTTCATTATGAAAAAATTAATTAGCTATAAGTCTTCGAAGTAGAACATGATATTTG GCAATCACTCGAATAACTATCTTAATTTACCTGCTGAAATAATTTGAAAAAACACCCGAG GCAGCAGACGAAAGGTGTTTTTGCTAAACAATGATTGATTTCTGGCGCCATTTCTACATT CTGAACAGTTCATCTCATTTCAGTAACAGTACTTCAATGGAATATTTATTAAAGAAAGTG CTTAAAAAAGTATTATAAAACGATACATGGACTGACTCAAGATTGAGCTAATAAGGTCCA CCGCCTAGTGCTTAAGAGTTCTGTACCACTATAATAATTTATCTTGATCGTATTATGTGT AAAAAAAAGGCGCTTGAAATGAAAGCTCCGAAAATTAAAATACTTTGACTGCTTCGGAAA ACAAAAACATATAAATAAATTTAAAAAATAAACTGTAAAATATTTAAAAACTATTAAAAA TATTTTATATTTTTAAAATTATTTATTATTATGTCATGTGACAAGACTTAAATCATTACA TAAAAGGTTTTGAAGTTCAATGTCAAAGTCAATATAATAAGCATACTAAGGCACACTTAT GCAAATCGAGTTATTGAAGCTGGTAAAATTATAAGATTTTTATTTTTATTTCTTTTATTT CTGCAAATCTGCATTTTCAAATACCGCTTGGTTTTTTGCATCATAAAGGGCGGCGCTTTC AGTCGCGAAAGTGAAATAAACAACCAGTCACACATATAACTTTCTTCTTGCCATAAGAGA GAAGAGGACGTTTGGTTGAAGCCAACTAGCCACAAGAAAAATGGTACTGACGATTTATCC TGACGAACTCGTACAAATAGTGTCTGATAAAATTGCTTCAAATAAGGGAAGTATGTTCAT GTCTCATTCTCCTTTTCGGCTCCGTTTAGGTGATAAACGTACTATATTGTGAAAGATTAT TTACTAACGACACATTGAAGAAATCACTTTGAATCAGCTGTGGGATATATCTGGTAAATA TTTTGATTTGTCTGATAAAAAAGTTAAACAGTTCGTGCTTTCATGCGTGATATTGAAAAA GGACATTGAGGTGTATTGTGATGGTGCTATAACAACTAAAAATGTGACTGATATTATAGG CGACGCTAATCATTCATACTCGGTTGGGATTACTGAGGACAGCCTATGGACATTATTAAC GGGATACACAAAAAAGGAGTCAACTATTGGAAATTCTGCATTTGAACTACTTCTCGAAGT TGCCAAATCAGGAGAAAAAGGGATCAATACTATGGATTTGGCGCAGGTAACTGGGCAAGA TCCTAGAAGTGTGACTGGACGTATCAAGAAAATAAACCACCTGTTAACAAGTTCACAACT GATTTATAAGGGACACGTCGTGAAGCAATTGAAGCTAAAAAAATTCAGCCATGACGGGGT GGATAGTAATCCCTATATTAATATTAGGGATCATTTAGCAACAATAGTTGAGGTGGTAAA ACGATCAAAAAATGGTATTCGCCAGATAATTGATTTAAAGCGTGAATTGAAATTTGACAA AGAGAAAAGACTTTCTAAAGCTTTTATTGCAGCTATTGCATGGTTAGATGAAAAGGAGTA CTTAAAGAAAGTGCTTGTAGTATCACCCAAGAATCCTGCCATTAAAATCAGATGTGTAAA ATACGTGAAAGATATTCCAGACTCTAAAGGCTCGCCTTCATTTGAGTATGATAGCAATAG CGCGGATGAAGATTCTGTATCAGATAGCAAGGCAGCTTTCGAAGATGAAGACTTAGTCGA AGGTTTAGATAATTTCAATGCGACTGATTTATTACAAAATCAAGGCCTTGTTATGGAAGA GAAAGAGGATGCTGTAAAGAATGAAGTTCTTCTTAATCGATTTTATCCACTTCAAAATCA GACTTATGACATTGCAGATAAGTCTGGCCTTAAAGGAATTTCAACTATGGATGTTGTAAA TCGAATTACCGGAAAAGAATTTCAGCGAGCTTTTACCAAATCAAGCGAATATTATTTAGA AAGTGTGGATAAGCAAAAAGAAAATACAGGGGGGTATAGGCTTTTTCGCATATACGATTT TGAGGGAAAGAAGAAGTTTTTTAGGCTGTTCACAGCTCAGAACTTTCAAAAGTTAACAAA TGCGGAAGACGAAATATCCGTTCCAAAAGGGTTTGATGAGCTAGGCAAATCTCGTACCGA TTTGAAAACTCTCAACGAGGATAATTTCGTCGCACTCAACAACACTGTTAGATTTACAAC GGACAGCGATGGACAGGATATATTCTTCTGGCACGGTGAATTAAAAATTCCCCCAAACTC AAAAAAAACTCCGAATAAAAACAAACGGAAGAGGCAGGTTAAAAACAGTACTAATGCTTC TGTTGCAGGAAACATTTCGAATCCCAAAAGGATTAAGCTAGAGCAGCATGTCAGCACTGC ACAGGAGCCGAAATCTGCTGAAGATAGTCCAAGTTCAAACGGAGGCACTGTTGTCAAAGG CAAGGTGGTTAACTTCGGCGGCTTTTCTGCCCGCTCTTTGCGTTCACTACAGAGACAGAG AGCCATTTTGAAAGTTATGAATACGATTGGTGGGGTAGCATACCTGAGAGAACAATTTTA CGAAAGCGTTTCTAAATATATGGGCTCCACAACGACATTAGATAAAAAGACTGTCCGTGG TGATGTTGATTTGATGGTAGAAAGCGAAAAATTAGGAGCCAGAACAGAGCCTGTATCAGG AAGAAAAATTATTTTTTTGCCCACTGTTGGAGAGGACGCTATCCAAAGGTACATCCTGAA AGAAAAAGATAGTAAAAAAGCAACCTTTACTGATGTTATACATGATACGGAAATATACTT CTTTGACCAAACGGAAAAAAATAGGTTTCACAGAGGAAAGAAATCAGTTGAAAGAATTCG TAAGTTTCAGAACCGCCAAAAGAATGCTAAGATCAAAGCTTCAGATGACGCTATCTCTAA GAAGAGTACGTCGGTCAACGTATCAGATGGAAAGATCAAAAGGAGAGACAAAAAAGTGTC TGCTGGTAGGACAACGGTGGTCGTGGAAAATACTAAAGAAGACAAAACTGTCTATCATGC AGGCACTAAAGATGGTGTTCAGGCTTTAATCAGAGCTGTTGTAGTTACTAAAAGTATTAA AAATGAAATAATGTGGGACAAAATAACAAAATTATTTCCTAATAATTCTTTAGATAACCT AAAAAAGAAATGGACGGCACGGCGAGTAAGAATGGGTCATAGTGGTTGGAGGGCATATGT CGATAAGTGGAAAAAAATGCTCGTTCTAGCCATTAAAAGTGAAAAGATTTCACTGAGGGA TGTTGAAGAACTAGATCTTATCAAATTGCTTGATATTTGGACCTCTTTTGATGAAAAGGA AATAAAAAGGCCGCTCTTTCTTTATAAGAACTACGAAGAGAATAGAAAAAAATTTACTCT GGTACGTGATGACACACTTACACATTCTGGCAACGATCTGGCCATGTCTTCTATGATTCA AAGAGAGATCTCTTCTTTAAAAAAAACTTACACTAGAAAGATTTCCGCTTCTACTAAGGA CTTATCGAAGAGTCAAAGCGACGATTATATTCGCACAGTGATCCGGTCCATATTAATAGA AAGTCCTTCGACCACTAGAAATGAAATAGAGGCGTTGAAGAACGTTGGAAACGAATCAAT AGATAACGTCATCATGGATATGGCTAAGGAAAAGCAAATTTATCTCCATGGCTCAAAACT TGAATGTACTGATACTTTACCAGACATTTTGGAAAATAGAGGAAATTATAAAGATTTTGG TGTAGCTTTTCAGTATAGATGTAAGGTTAATGAATTATTGGAGGCCGGAAACGCTATTGT TATCAATCAAGAGCCGTCCGATATATCCTCTTGGGTTTTAATTGATTTGATTTCGGGAGA GCTATTGAATATGGATGTAATTCCAATGGTGAGAAATGTTCGACCTTTAACGTATACTTC AAGGAGATTTGAAATACGAACATTAACTCCCCCTCTGATTATATATGCCAATTCTCAGAC AAAATTGAATACAGCAAGGAAGTCTGCTGTCAAAGTTCCACTGGGCAAACCATTTTCTCG TTTATGGGTGAATGGATCTGGTTCCATTAGGCCAAACATATGGAAGCAGGTAGTTACTAT GGTCGTTAACGAAATAATATTTCATCCAGGGATAACATTGAGTAGATTGCAATCTAGGTG TCGTGAAGTACTTTCGCTTCATGAAATATCAGAAATATGCAAATGGCTCCTAGAAAGACA AGTATTAATAACTACTGATTTTGATGGCTATTGGGTCAATCATAATTGGTATTCTATATA TGAATCTACATAATGAAATGAGGTGTATAAATTTTACTTTTATGTAACCAAAGTTGTATT AAATATTTAGAAATGTTATACTATTTTTGGGTTAGATTCCGTCTGGCAAATTAAACAAGA ATATTCATCGGGTTTCTGGGCCAAGTTTTCGAGGCAAGTCTGGTGAAAGCCATGGTGACA TTTGAATATGACAAGGGGAGTTTTGAGATCTACACTAATCATATCTTGGTGGCGCTGTAC ATTTTCCCAAGCTAGAAAAAGTAATGGGTCCAGACCAGCTCCCCATATTTTTTTCCCGCA GATTTCGCAGTCGTCGGTGTGTATAGACCACCCTTCACTCAGAAATTTTCTATACTGTTG AACAAGATCTTGCGAAGAATCCTCTATAATCTTTTGAATCAACTCAGAAAGAGATCTTTC CAATTTATAAGTATTAAAAACATTCAGTAGCAGTTGCTTTAAATCCTGAACTTTCATTAA AATAACGTCTTGGTGCTCAAGAACAGAAGACATTATTTCCCAGAATTCCCCACCTGAATC CTTCTGAGAGGAACTCTTGGACCTAACCAATCCCAAAAATGCTTCTTGAAGTAGTTTATT ACATAAATCTTTCCTTTCATCGTGTGAAGGATATTTCCCATATAGAGTGATCAGGAATGT AATCAATAATATCCAACACGATTTTTTCTCGGTACCAGCAGAATTACAATCATCAAAGGC CCTCCTCAAAGATTCCAATAAAGTAGATATATTTGTTTTCCCTTCATTTAGACATTGTTC AATAAAACTTAATAAATCCCTGACTGCTAGGTTAAAACTTTCCAAGCGTTCGTGAATTAT AGCTGCAGCTTCAAAATTAGAGTCTTGATTCAATAAGTCCAGAATTTGTAAGCTCTCAGC GTTGCTGAGAACTGTACCATTAAGCCAAAGAATCATTTCCCTTTTGCTCTTGTATTTACA GTTCAATTCGATGTGTAAATTTCTTAAACGCTTATCGACCTTATTGTTGATAT >YAL002W VPS8 SGDID:S0000002, Chr I from 142709-148533, Verified ORF TTCCAAGGCCGATGAATTCGACTCTTTCCCAGCTGCCTCTGCTGCCGCTGCCGAAGAAGA AGAAGATGACGATGTCGATTTATTCGGTTCCGACGATGAAGAAGCTGACGCTGAAGCTGA AAAGTTGAAGGCTGAAAGAATTGCCGCATACAACGCTAAGAAGGCTGCTAAGCCAGCTAA GCCAGCTGCTAAGTCCATTGTCACTCTAGATGTCAAGCCATGGGATGATGAAACCAATTT GGAAGAAATGGTTGCTAACGTCAAGGCCATCGAAATGGAAGGTTTGACCTGGGGTGCTCA CCAATTTATCCCAATTGGTTTCGGTATCAAGAAGTTGCAAATTAACTGTGTTGTCGAAGA TGACAAGGTTTCCTTGGATGACTTGCAACAAAGCATTGAAGAAGACGAAGACCACGTCCA ATCTACCGATATTGCTGCTATGCAAAAATTATAAAAGGCTTTTTTATAAACTTTTTATAA TTAACATTAAAGCAAAAACAACATTGTAAAGATTAACAAATAAATGAAAAAAACAACGAA ATAACTTAGGTTTTAGGCTAAAAAAAACAGAAGGAATTTTGAACGATAAACTTTTCGACT GCACACGAAACATTATTACTAATTTGTGTAACCACTATATAAGGAATCGTGTTTATTAAT TGAATTTATTCCGGGAATATTCAAGTTATGTATATCTCTTTTCATATTCTTAAATACACA TACTCATAATATCTTGTCGAAAATACGCGGTGTAGGGAGTTATGGTGGATAACTTTTTCA CGATTAGAAGAAAAGGAAAATTTCATTATTCGTAGCTTAACATGGCAAAAACGAGAAAGA CATATAATCAAAACGTGAGTTTCCTGTGGAAAAAAAAAAAAGGGAACCTCTGGTTACGAT GATATACCTGCGTGAAAAAGGACAGTTATTACCAATACATACAAAGGCTTAATAAGTGTA AAATATATATCTGCCGAGACCATTACTCATTACACCTAGAATGGAGCAAAATGGCCTTGA CCACGACAGCAGATCTAGCATCGATACGACTATTAATGACACTCAAAAGACTTTCCTAGA ATTTAGATCGTATACCCAATTAAGTGAAAAACTGGCATCTAGTTCTTCATATACGGCACC TCCCCTGAACGAAGATGGTCCTAAAGGGGTAGCTTCTGCAGTGTCACAAGGCTCCGAATC CGTAGTCTCATGGACAACTTTAACACACGTATATTCCATCCTGGGTGCTTATGGAGGGCC CACGTGCTTGTATCCGACAGCCACGTATTTTTTGATGGGCACTTCTAAAGGATGCGTACT CATTTTTAATTATAATGAACATTTGCAGACAATCCTAGTGCCGACCTTATCTGAGGACCC TTCTATTCACTCAATAAGAAGTCCAGTGAAATCAATTGTCATATGTTCCGATGGTACTCA TGTAGCTGCCTCATACGAGACCGGAAATATATGCATTTGGAACTTGAACGTAGGGTATAG AGTGAAACCCACTTCTGAACCAACAAATGGTATGACCCCAACGCCTGCCTTACCGGCAGT CTTACACATCGATGACCATGTGAACAAGGAAATCACAGGGTTAGACTTTTTTGGTGCTCG GCATACAGCCCTGATTGTTAGTGATAGGACAGGTAAAGTATCACTCTATAACGGTTACAG AAGAGGCTTTTGGCAGTTGGTGTATAATTCAAAAAAAATTTTAGATGTGAACTCTTCCAA GGAGAAATTAATAAGGTCAAAGTTGTCTCCACTAATATCACGGGAGAAAATTTCCACTAA TTTGTTGAGTGTACTCACAACTACACATTTTGCCCTTATTTTATTATCGCCACACGTTTC TTTGATGTTTCAAGAAACTGTTGAACCCTCAGTACAAAATTCTCTAGTCGTGAATAGCTC TATTTCATGGACTCAAAACTGTTCCAGGGTTGCTTATTCCGTAAATAATAAAATTTCTGT TATTTCCATATCTTCATCAGACTTCAATGTTCAGTCCGCTAGCCATTCTCCTGAATTTGC AGAATCTATATTATCCATTCAATGGATTGACCAGCTCCTACTTGGTGTTTTAACCATATC GCACCAATTTTTGGTATTGCACCCCCAACATGACTTCAAGATCCTGTTAAGATTGGATTT TCTGATTCACGATTTGATGATCCCACCTAATAAATATTTTGTAATAAGTAGAAGAAGTTT CTACCTGTTAACAAACTACTCATTTAAAATTGGCAAATTTGTGTCTTGGTCAGATATTAC TTTAAGACATATTTTGAAAGGCGACTACTTGGGTGCATTGGAGTTCATAGAATCACTTTT GCAACCTTACTGTCCACTGGCAAACTTGTTGAAGCTAGATAATAATACGGAAGAGAGGAC TAAGCAACTTATGGAACCATTTTACAATCTGTCCTTGGCTGCCCTAAGGTTTCTTATAAA AAAAGATAATGCCGACTACAATAGGGTTTACCAATTATTAATGGTAGTTGTTCGTGTTTT GCAGCAATCTTCCAAAAAACTAGACTCAATTCCTTCTCTAGACGTCTTTTTGGAACAGGG TCTGGAGTTCTTTGAATTGAAGGACAACGCGGTATATTTTGAAGTTGTAGCAAATATTGT TGCCCAAGGATCAGTTACGTCAATTTCCCCAGTTCTTTTCAGGTCCATAATTGATTACTA TGCTAAGGAGGAGAATTTAAAAGTAATTGAAGACTTAATCATCATGTTAAATCCTACTAC GCTTGATGTTGATCTTGCCGTCAAACTATGCCAAAAGTATAATTTGTTCGATTTATTAAT ATATATTTGGAACAAGATCTTTGATGATTATCAAACCCCAGTGGTGGACTTGATATACAG GATTTCTAACCAAAGTGAAAAATGTGTGATCTTCAATGGTCCTCAAGTACCTCCTGAAAC GACTATATTTGATTACGTAACGTATATCCTTACTGGCAGGCAATATCCACAAAACTTGTC TATATCACCAAGTGATAAATGCTCCAAAATACAAAGGGAACTTTCAGCATTTATTTTTAG TGGCTTCTCCATAAAATGGCCGTCGAACAGCAATCATAAACTTTACATATGCGAAAATCC AGAAGAAGAGCCAGCATTTCCTTACTTTCACCTTTTATTGAAATCGAATCCGAGTAGGTT CTTAGCAATGCTCAATGAAGTGTTTGAAGCGTCCTTGTTTAACGATGACAATGACATGGT TGCATCAGTTGGAGAAGCAGAATTGGTAAGTAGGCAATATGTTATTGATCTACTATTGGA TGCTATGAAAGATACGGGAAATTCAGACAACATCAGGGTACTTGTTGCAATTTTCATTGC AACTAGTATATCAAAATATCCTCAATTTATTAAAGTGTCTAACCAAGCCCTCGACTGCGT TGTTAATACCATATGCTCCTCTAGGGTTCAAGGTATATATGAAATTTCTCAAATAGCTCT GGAGTCGCTTTTACCCTATTATCATTCAAGAACAACAGAAAATTTTATACTGGAACTAAA AGAAAAAAATTTCAATAAAGTTCTTTTCCATATCTATAAAAGTGAAAATAAGTACGCCAG TGCGCTTTCACTTATTTTAGAAACTAAGGACATCGAAAAAGAATATAACACGGACATTGT ATCCATAACCGACTACATACTCAAAAAATGCCCACCTGGAAGTTTAGAATGTGGCAAAGT TACTGAAGTTATCGAGACGAACTTTGATCTTCTTCTCTCAAGGATCGGTATCGAAAAATG CGTCACAATTTTTTCTGACTTTGACTATAATCTTCATCAAGAAATCCTGGAAGTAAAGAA TGAGGAGACTCAGCAAAAGTATTTGGATAAGCTTTTTTCTACGCCAAATATCAACAATAA GGTCGATAAGCGTTTAAGAAATTTACACATCGAATTGAACTGTAAATACAAGAGCAAAAG GGAAATGATTCTTTGGCTTAATGGTACAGTTCTCAGCAACGCTGAGAGCTTACAAATTCT GGACTTATTGAATCAAGACTCTAATTTTGAAGCTGCAGCTATAATTCACGAACGCTTGGA AAGTTTTAACCTAGCAGTCAGGGATTTATTAAGTTTTATTGAACAATGTCTAAATGAAGG GAAAACAAATATATCTACTTTATTGGAATCTTTGAGGAGGGCCTTTGATGATTGTAATTC TGCTGGTACCGAGAAAAAATCGTGTTGGATATTATTGATTACATTCCTGATCACTCTATA TGGGAAATATCCTTCACACGATGAAAGGAAAGATTTATGTAATAAACTACTTCAAGAAGC ATTTTTGGGATTGGTTAGGTCCAAGAGTTCCTCTCAGAAGGATTCAGGTGGGGAATTCTG GGAAATAATGTCTTCTGTTCTTGAGCACCAAGACGTTATTTTAATGAAAGTTCAGGATTT AAAGCAACTGCTACTGAATGTTTTTAATACTTATAAATTGGAAAGATCTCTTTCTGAGTT GATTCAAAAGATTATAGAGGATTCTTCGCAAGATCTTGTTCAACAGTATAGAAAATTTCT GAGTGAAGGGTGGTCTATACACACCGACGACTGCGAAATCTGCGGGAAAAAAATATGGGG AGCTGGTCTGGACCCATTACTTTTTCTAGCTTGGGAAAATGTACAGCGCCACCAAGATAT GATTAGTGTAGATCTCAAAACTCCCCTTGTCATATTCAAATGTCACCATGGCTTTCACCA GACTTGCCTCGAAAACTTGGCCCAGAAACCCGATGAATATTCTTGTTTAATTTGCCAGAC GGAATCTAACCCAAAAATAGTATAACATTTCTAAATATTTAATACAACTTTGGTTACATA AAAGTAAAATTTATACACCTCATTTCATTATGTAGATTCATATATAGAATACCAATTATG ATTGACCCAATAGCCATCAAAATCAGTAGTTATTAATACTTGTCTTTCTAGGAGCCATTT GCATATTTCTGATATTTCATGAAGCGAAAGTACTTCACGACACCTAGATTGCAATCTACT CAATGTTATCCCTGGATGAAATATTATTTCGTTAACGACCATAGTAACTACCTGCTTCCA TATGTTTGGCCTAATGGAACCAGATCCATTCACCCATAAACGAGAAAATGGTTTGCCCAG TGGAACTTTGACAGCAGACTTCCTTGCTGTATTCAATTTTGTCTGAGAATTGGCATATAT AATCAGAGGGGGAGTTAATGTTCGTATTTCAAATCTCCTTGAAGTATACGTTAAAGGTCG AACATTTCTCACCATTGGAATTACATCCATATTCAATAGCTCTCCCGAAATCAAATCAAT TAAAACCCAAGAGGATATATCGGACGGCTCTTGATTGATAACAATAGCGTTTCCGGCCTC CAATAATTCATTAACCTTACATCTATACTGAAAAGCTACACCAAAATCTTTATAATTTCC TCTATTTTCCAAAATGTCTGGTAAAGTATCAGTACATTCAAGTTTTGAGCCATGGAGATA AATTTGCTTTTCCTTAGCCATATCCATGATGACGTTATCTATTGATTCGTTTCCAACGTT CTTCAACGCCTCTATTTCATTTCTAGTGGTCGAAGGACTTTCTATTAATATGGACCGGAT CACTGTGCGAATATAATCGTCGCTTTGACTCTTCGATAAGTCCTTAGTAGAAGCGGAAAT CTTTCTAGTGTAAGTTTTTTTTAAAGAAGAGATCTCTCTTTGAATCATAGAAGACATGGC CAGATCGTTGCCAGAATGTGTAAGTGTGTCATCACGTACCAGAGTAAATTTTTTTCTATT CTCTT >YAL003W EFB1 SGDID:S0000003, Chr I from 141176-144162, Verified ORF CTTCATGTCAGCCTGCACTTCTGGGTCGTTGAAGTTTCTACCGATCAAACGCTTAGCGTC GAAAACGGTATTCGAAGGATTCATAGCAGCTTGATTCTTAGCAGCATCACCAATCAATCT TTCAGTGTCAGTGAAAGCGACAAAAGATGGAGTGGTTCTGTTACCTTGATCGTTGGCAAT AATGTCCACACGATCATTAGCAAAGTGAGCAACACACGAGTATGTTGTACCTAAATCAAT ACCGACAGCTTTTGACATATTATCTGTTATTTACTTGAATTTTTGTTTCTTGTAATACTT GATTACTTTTCTTTTGATGTGCTTATCTTACAAATAGAGAAAATAAAACAACTTAAGTAA GAATTGGGAAACGAAACTACAACTCAATCCCTTCTCGAAGATACATCAATCCACCCCTTA TATAACCTTGAAGTCCTCGAAACGATCAGCTAATCTAAATGGCCCCCCTTCTTTTTGGGT TCTTTCTCTCCCTTTTGCCGCCGATGGAACGTTCTGGAAAAAGAAGAATAATTTAATTAC TTTCTCAACTAAAATCTGGAGAAAAAACGCAAATGACAGCTTCTAAACGTTCCGTGTGCT TTCTTTCTAGAATGTTCTGGAAAGTTTACAACAATCCACAAGAACGAAAATGCCGTTGAC AATGATGAAACCATCATCCACACACCGCGCACACGTGCTTTATTTCTTTTTCTGAATTTT TTTTTTCCGCCATTTTCAACCAAGGAAATTTTTTTTCTTAGGGCTCAGAACCTGCAGGTG AAGAAGCGCTTTAGAAATCAAAGCACAACGTAACAATTTGTCGACAACCGAGCCTTTGAA GAAAAAATTTTTCACATTGTCGCCTCTAAATAAATAGTTTAAGGTTATCTACCCACTATA TTTAGTTGGTTCTTTTTTTTTTCCTTCTACTCTTTATCTTTTTACCTCATGCTTTCTACC TTTCAGCACTGAAGAGTCCAACCGAATATATACACACATAATGGCATCCACCGATTTCTC CAAGATTGAAACTTTGAAACAATTAAACGCTTCTTTGGCTGACAAGTCATACATTGAAGG GTATGTTCCGATTTAGTTTACTTTATAGATCGTTGTTTTTCTTTCTTTTTTTTTTTTCCT ATGGTTACATGTAAAGGGAAGTTAACTAATAATGATTACTTTTTTTCGCTTATGTGAATG ATGAATTTAATTCTTTGGTCCGTGTTTATGATGGGAAGTAAGACCCCCGATATGAGTGAC AAAAGAGATGTGGTTGACTATCACAGTATCTGACGATAGCACAGAGCAGAGTATCATTAT TAGTTATCTGTTATTTTTTTTTCCTTTTTTGTTCAAAAAAAGAAAGACAGAGTCTAAAGA TTGCATTACAAGAAAAAAGTTCTCATTACTAACAAGCAAAATGTTTTGTTTCTCCTTTTA AAATAGTACTGCTGTTTCTCAAGCTGACGTCACTGTCTTCAAGGCTTTCCAATCTGCTTA CCCAGAATTCTCCAGATGGTTCAACCACATCGCTTCCAAGGCCGATGAATTCGACTCTTT CCCAGCTGCCTCTGCTGCCGCTGCCGAAGAAGAAGAAGATGACGATGTCGATTTATTCGG TTCCGACGATGAAGAAGCTGACGCTGAAGCTGAAAAGTTGAAGGCTGAAAGAATTGCCGC ATACAACGCTAAGAAGGCTGCTAAGCCAGCTAAGCCAGCTGCTAAGTCCATTGTCACTCT AGATGTCAAGCCATGGGATGATGAAACCAATTTGGAAGAAATGGTTGCTAACGTCAAGGC CATCGAAATGGAAGGTTTGACCTGGGGTGCTCACCAATTTATCCCAATTGGTTTCGGTAT CAAGAAGTTGCAAATTAACTGTGTTGTCGAAGATGACAAGGTTTCCTTGGATGACTTGCA ACAAAGCATTGAAGAAGACGAAGACCACGTCCAATCTACCGATATTGCTGCTATGCAAAA ATTATAAAAGGCTTTTTTATAAACTTTTTATAATTAACATTAAAGCAAAAACAACATTGT AAAGATTAACAAATAAATGAAAAAAACAACGAAATAACTTAGGTTTTAGGCTAAAAAAAA CAGAAGGAATTTTGAACGATAAACTTTTCGACTGCACACGAAACATTATTACTAATTTGT GTAACCACTATATAAGGAATCGTGTTTATTAATTGAATTTATTCCGGGAATATTCAAGTT ATGTATATCTCTTTTCATATTCTTAAATACACATACTCATAATATCTTGTCGAAAATACG CGGTGTAGGGAGTTATGGTGGATAACTTTTTCACGATTAGAAGAAAAGGAAAATTTCATT ATTCGTAGCTTAACATGGCAAAAACGAGAAAGACATATAATCAAAACGTGAGTTTCCTGT GGAAAAAAAAAAAAGGGAACCTCTGGTTACGATGATATACCTGCGTGAAAAAGGACAGTT ATTACCAATACATACAAAGGCTTAATAAGTGTAAAATATATATCTGCCGAGACCATTACT CATTACACCTAGAATGGAGCAAAATGGCCTTGACCACGACAGCAGATCTAGCATCGATAC GACTATTAATGACACTCAAAAGACTTTCCTAGAATTTAGATCGTATACCCAATTAAGTGA AAAACTGGCATCTAGTTCTTCATATACGGCACCTCCCCTGAACGAAGATGGTCCTAAAGG GGTAGCTTCTGCAGTGTCACAAGGCTCCGAATCCGTAGTCTCATGGACAACTTTAACACA CGTATATTCCATCCTGGGTGCTTATGGAGGGCCCACGTGCTTGTATCCGACAGCCACGTA TTTTTTGATGGGCACTTCTAAAGGATGCGTACTCATTTTTAATTATAATGAACATTTGCA GACAATCCTAGTGCCGACCTTATCTGAGGACCCTTCTATTCACTCAATAAGAAGTCCAGT GAAATCAATTGTCATATGTTCCGATGGTACTCATGTAGCTGCCTCAT >YAL005C SSA1 SGDID:S0000004, Chr I from 142433-138505, reverse complement, Verified ORF CACTCATATCGGGGGTCTTACTTCCCATCATAAACACGGACCAAAGAATTAAATTCATCA TTCACATAAGCGAAAAAAAGTAATCATTATTAGTTAACTTCCCTTTACATGTAACCATAG GAAAAAAAAAAAAGAAAGAAAAACAACGATCTATAAAGTAAACTAAATCGGAACATACCC TTCAATGTATGACTTGTCAGCCAAAGAAGCGTTTAATTGTTTCAAAGTTTCAATCTTGGA GAAATCGGTGGATGCCATTATGTGTGTATATATTCGGTTGGACTCTTCAGTGCTGAAAGG TAGAAAGCATGAGGTAAAAAGATAAAGAGTAGAAGGAAAAAAAAAAGAACCAACTAAATA TAGTGGGTAGATAACCTTAAACTATTTATTTAGAGGCGACAATGTGAAAAATTTTTTCTT CAAAGGCTCGGTTGTCGACAAATTGTTACGTTGTGCTTTGATTTCTAAAGCGCTTCTTCA CCTGCAGGTTCTGAGCCCTAAGAAAAAAAATTTCCTTGGTTGAAAATGGCGGAAAAAAAA AATTCAGAAAAAGAAATAAAGCACGTGTGCGCGGTGTGTGGATGATGGTTTCATCATTGT CAACGGCATTTTCGTTCTTGTGGATTGTTGTAAACTTTCCAGAACATTCTAGAAAGAAAG CACACGGAACGTTTAGAAGCTGTCATTTGCGTTTTTTCTCCAGATTTTAGTTGAGAAAGT AATTAAATTATTCTTCTTTTTCCAGAACGTTCCATCGGCGGCAAAAGGGAGAGAAAGAAC CCAAAAAGAAGGGGGGCCATTTAGATTAGCTGATCGTTTCGAGGACTTCAAGGTTATATA AGGGGTGGATTGATGTATCTTCGAGAAGGGATTGAGTTGTAGTTTCGTTTCCCAATTCTT ACTTAAGTTGTTTTATTTTCTCTATTTGTAAGATAAGCACATCAAAAGAAAAGTAATCAA GTATTACAAGAAACAAAAATTCAAGTAAATAACAGATAATATGTCAAAAGCTGTCGGTAT TGATTTAGGTACAACATACTCGTGTGTTGCTCACTTTGCTAATGATCGTGTGGACATTAT TGCCAACGATCAAGGTAACAGAACCACTCCATCTTTTGTCGCTTTCACTGACACTGAAAG ATTGATTGGTGATGCTGCTAAGAATCAAGCTGCTATGAATCCTTCGAATACCGTTTTCGA CGCTAAGCGTTTGATCGGTAGAAACTTCAACGACCCAGAAGTGCAGGCTGACATGAAGCA CTTCCCATTCAAGTTGATCGATGTTGACGGTAAGCCTCAAATTCAAGTTGAATTTAAGGG TGAAACCAAGAACTTTACCCCAGAACAAATCTCCTCCATGGTCTTGGGTAAGATGAAGGA AACTGCCGAATCTTACTTGGGAGCCAAGGTCAATGACGCTGTCGTCACTGTCCCAGCTTA CTTCAACGATTCTCAAAGACAAGCTACCAAGGATGCTGGTACCATTGCTGGTTTGAATGT CTTGCGTATTATTAACGAACCTACCGCCGCTGCCATTGCTTACGGTTTGGACAAGAAGGG TAAGGAAGAACACGTCTTGATTTTCGACTTGGGTGGTGGTACTTTCGATGTCTCTTTGTT GTTCATTGAAGACGGTATCTTTGAAGTTAAGGCCACCGCTGGTGACACCCATTTGGGTGG TGAAGATTTTGACAACAGATTGGTCAACCACTTCATCCAAGAATTCAAGAGAAAGAACAA GAAGGACTTGTCTACCAACCAAAGAGCTTTGAGAAGATTAAGAACCGCTTGTGAAAGAGC CAAGAGAACTTTGTCTTCCTCCGCTCAAACTTCCGTTGAAATTGACTCTTTGTTCGAAGG TATCGATTTCTACACTTCCATCACCAGAGCCAGATTCGAAGAATTGTGTGCTGACTTGTT CAGATCTACTTTGGACCCAGTTGAAAAGGTCTTGAGAGATGCTAAATTGGACAAATCTCA AGTCGATGAAATTGTCTTGGTCGGTGGTTCTACCAGAATTCCAAAGGTCCAAAAATTGGT CACTGACTACTTCAACGGTAAGGAACCAAACAGATCTATCAACCCAGATGAAGCTGTTGC TTACGGTGCTGCTGTTCAAGCTGCTATTTTGACTGGTGACGAATCTTCCAAGACTCAAGA TCTATTGTTGTTGGATGTCGCTCCATTATCCTTGGGTATTGAAACTGCTGGTGGTGTCAT GACCAAGTTGATTCCAAGAAACTCTACCATTTCAACAAAGAAGTTCGAGATCTTTTCCAC TTATGCTGATAACCAACCAGGTGTCTTGATTCAAGTCTTTGAAGGTGAAAGAGCCAAGAC TAAGGACAACAACTTGTTGGGTAAGTTCGAATTGAGTGGTATTCCACCAGCTCCAAGAGG TGTCCCACAAATTGAAGTCACTTTCGATGTCGACTCTAACGGTATTTTGAATGTTTCCGC CGTCGAAAAGGGTACTGGTAAGTCTAACAAGATCACTATTACCAACGACAAGGGTAGATT GTCCAAGGAAGATATCGAAAAGATGGTTGCTGAAGCCGAAAAATTCAAGGAAGAAGATGA AAAGGAATCTCAAAGAATTGCTTCCAAGAACCAATTGGAATCCATTGCTTACTCTTTGAA GAACACCATTTCTGAAGCTGGTGACAAATTGGAACAAGCTGACAAGGACACCGTCACCAA GAAGGCTGAAGAGACTATTTCTTGGTTAGACAGCAACACCACTGCCAGCAAGGAAGAATT CGATGACAAGTTGAAGGAGTTGCAAGACATTGCCAACCCAATCATGTCTAAGTTGTACCA AGCTGGTGGTGCTCCAGGTGGCGCTGCAGGTGGTGCTCCAGGCGGTTTCCCAGGTGGTGC TCCTCCAGCTCCAGAGGCTGAAGGTCCAACCGTTGAAGAAGTTGATTAAGCCAATTGGTG CGGCAATTGATAATAACGAAAATGTCTTTTAATGATCTGGGTATAATGAGGAATTTTCCG AACGTTTTTACTTTATATATATATATACATGTAACATATATTCTATACGCTATAGAGAAA GGAAATTTTTCAATTAAAAAAAAAATAGAGAAAGAGTTTCACTTCTTGATTATCGCTAAC ACTAATGGTTGAAGTACTGCTACTTTAATTTTATAGATAGGCAAAAAAAAATTATTCGGG GCGAGCTGGGAATTGAACCCAGGGCCTCTCGCATGCTTTGTCTTCCTGTTTAATCAGGAA GTCGCCCAAAGCGAGAATCATACCACTAGACCACACGCCCGTACTAATTGATGTCTTCCT TTTCGGATAGATGTATATATATACAAATTGGTCAGATTGCTTTTGGCTCCCTTTCGTACG TAACTCATTTAGACTACGGATCACTAGCACTATCTCACCAAGTTTTTAAAAGATCCACTG TGATCATTAAAGATTCTATTTCAAATAAAAATCAATTATCATCTATCGACTAGTTTTCAT GGTACTAGTATATTATCATGTACAGTGTGAGGGCTCGACATGAAGATTGAGAAGACAGTC ATCGTTTTCAATGGAAGCTGAAATACAAGCACTGAATAAAAAGAGATAACAATATTTTAA TGTCGTGATATTGGTTCCCTTCTGCTGGTCTTCGAGGAAAATTTCTGGTATGTTTTGTGT ATCTAATATTATATAGCCTTAAATCACTACCTATTTTTCAGATCCGCCAAGGAAGCCACT CTGTGAACTTTAAATAATATTACAAATTGCTACAGCATCTCGAATTCAAGTGTTTTCAGA CTTATTTATTTAATTCAAGAAAATGTTCATAAACTTTCATAAAGCAATCCTCAATCCTCT TAGCGCTAATGTTCACTGCACCTTACATGATGGCGTTTGGTTATATTTCAATCCTTTTCA GCGACGTGTCCCGAAACACGAAAAAGTAC >YAL007C ERP2 SGDID:S0000005, Chr I from 139347-136700, reverse complement, Verified ORF AGAGAAAGAGTTTCACTTCTTGATTATCGCTAACACTAATGGTTGAAGTACTGCTACTTT AATTTTATAGATAGGCAAAAAAAAATTATTCGGGGCGAGCTGGGAATTGAACCCAGGGCC TCTCGCATGCTTTGTCTTCCTGTTTAATCAGGAAGTCGCCCAAAGCGAGAATCATACCAC TAGACCACACGCCCGTACTAATTGATGTCTTCCTTTTCGGATAGATGTATATATATACAA ATTGGTCAGATTGCTTTTGGCTCCCTTTCGTACGTAACTCATTTAGACTACGGATCACTA GCACTATCTCACCAAGTTTTTAAAAGATCCACTGTGATCATTAAAGATTCTATTTCAAAT AAAAATCAATTATCATCTATCGACTAGTTTTCATGGTACTAGTATATTATCATGTACAGT GTGAGGGCTCGACATGAAGATTGAGAAGACAGTCATCGTTTTCAATGGAAGCTGAAATAC AAGCACTGAATAAAAAGAGATAACAATATTTTAATGTCGTGATATTGGTTCCCTTCTGCT GGTCTTCGAGGAAAATTTCTGGTATGTTTTGTGTATCTAATATTATATAGCCTTAAATCA CTACCTATTTTTCAGATCCGCCAAGGAAGCCACTCTGTGAACTTTAAATAATATTACAAA TTGCTACAGCATCTCGAATTCAAGTGTTTTCAGACTTATTTATTTAATTCAAGAAAATGT TCATAAACTTTCATAAAGCAATCCTCAATCCTCTTAGCGCTAATGTTCACTGCACCTTAC ATGATGGCGTTTGGTTATATTTCAATCCTTTTCAGCGACGTGTCCCGAAACACGAAAAAG TACATTCTGCCAAAACTTGAACTAGTTAAAATGAAAAACTAACAAAATCTCCAGTGATTT CGATTCATTAACCTTAGGGATCGACACCGCCAATTCTGCATCAGGTGACCCAAACTAGAA TAAGATAAACAGTGGAGTACACTCATTGTAAAGGAAAACCATGATCAAATCTACAATTGC TCTACCCTCTTTCTTCATTGTTTTAATTTTGGCGTTGGTCAATTCAGTGGCTGCATCTTC CAGTTATGCACCAGTTGCTATCAGTTTACCAGCATTCAGCAAAGAATGCCTGTACTACGA TATGGTTACTGAGGATGATTCCCTGGCTGTGGGTTACCAAGTTCTAACCGGTGGTAATTT TGAGATTGATTTTGATATTACTGCTCCTGATGGATCTGTGATTACTAGTGAGAAACAAAA GAAGTACTCAGACTTTTTATTAAAATCGTTTGGAGTGGGGAAGTATACCTTTTGTTTTTC CAATAACTATGGTACAGCGTTGAAAAAGGTAGAAATTACACTAGAAAAGGAAAAAACTTT GACTGACGAGCATGAAGCTGATGTCAATAACGATGACATTATTGCCAATAACGCCGTGGA GGAAATAGATAGAAACTTGAACAAAATCACGAAGACTTTGAACTATTTGAGAGCCAGAGA ATGGAGAAACATGTCTACCGTCAATTCCACCGAATCAAGGTTGACTTGGTTATCTATATT GATTATCATTATCATTGCCGTTATAAGTATTGCCCAAGTTCTACTTATTCAATTCCTCTT CACTGGTCGTCAAAAAAATTACGTTTAAGAACTTTTCAATCTACGAAAAATATATGTCCG CAATATAGAACACAATTAGGTTTATATTCGACGTGATTTTTTTTTCTTCCTTAGCCCTAT GTATATTTACTGTATAGGATAAATGAAATACCAAAAATAAAAAAGTATAAAACGAAAGAA TATAACCCTCGTTTATATCTGGTCATTTGTCTTGCTCATTTGTTAGCATTTAAACTTGCT AATACGAAACTCAATGTAAAGAATACTTTAAAACCCATGTATTCTGTACCCAATAACCCA TCAATAAGCAGTTTCTTCAAGTCTACATCTTTCAAAACAATTACAGATTTGATATTTTTC AAATTAATGCGAATCCATCCCTTGTACCGTAACCATTCACAAAGAAGCATGCTTGTAATA CCGACATACATAAACAAAATTGATATCTTAGCCACCGTAACTCCTAAAACAACACCGAAT AATGATCCCAAAAACATCTGCTTGTGACTACTTATTTTGTTCCTCCTTTCCTCGGTAATT GCCGTACTGTTGCCCACAGTTGGTTCCAAGGGACCCTGTTGTTTGACAGCTGCCCCTAAA GAATCATTGAATATCAACTTAGAAGGCTGGCGATTCATCAAGTAAAAGCCACCAGCAACT ATGCCAGCACCGCCTAACCCTACAGAGCGAGTTAAGGGCTTTCCTAATTTATTGGCGACA TTAAACCTCCATAAGGGGACGTTCTTGAACATGCGCTTCCCAACATTCAAATTACGAAAC ACCAACCGTTGCATATTAAAAGCCAAAGTCATTTTACACCTATTATTTTAAGTTCTTCCT TCTTGCCCCTCTAGCGTTATGCTGTTGTATGTATAATAAGATGCCTTGTTTAACCAATTT CAACAACCCCTAGGTTTTCTAGCACTTGTTGGAAAACTTAAATATGAAATGACGGATTTG TAAAATTTTCACGACACAACAGCTTCACTTCTAATAATGTATAAAATATAATTTATGTGT GAACATAG >YAL008W FUN14 SGDID:S0000006, Chr I from 135916-138512, Verified ORF GTGTCCGGGCCTCGCAGGCGTTCTACTAGCAAGACATCCAGTGCGAAGAATATACGGAAC TCCAGTAATATCTCTCCAGCATCGATGATTTTCAGGAATTTGTTGATACTGGAGGATGAT TTAAGACGCCAAGCTCACGAACAAAAGATACTGAAGTGGCAATTCACTTTGTTCTTAGCG TCTATGGCCGGTGTAGGCGCATTTACCTTCTACGAACTTTATTTCACTTCAGATTATGTC AAGGGCCTCCATAGGGTTATTTTGCAATTCACTCTTTCTTTCATTTCCATTACTGTAGTT CTTTTTCATATCAGTGGACAATATAGAAGAACTATCGTCATTCCAAGAAGATTTTTTACC TCTACTAATAAAGGGATTAGGCAGTTTAATGTGAAGCTAGTTAAAGTACAGTCTACGTGG GACGAGAAATACACAGATTCAGTAAGATTTGTGAGTCGAACAATTGCTTATTGTAATATT TATTGTTTGAAAAAATTTCTGTGGCTTAAAGACGATAATGCCATTGTGAAATTTTGGAAA AGTGTCACGATACAATCCCAACCGAGGATCGGAGCTGTGGATGTGAAATTAGTCCTCAAC CCCAGAGCATTTAGTGCAGAGATTAGAGAAGGATGGGAGATTTATAGAGACGAGTTTTGG GCCAGGGAAGGTGCTAGAAGACGCAAACAAGCGCACGAACTCCGACCTAAATCAGAATGA AAGAGTTGGAGGGCTTCTTCCTTCGAATAAGAGGTCATATTTACCTATGTAAAATTGTAA CCATCTATGTTCACACATAAATTATATTTTATACATTATTAGAAGTGAAGCTGTTGTGTC GTGAAAATTTTACAAATCCGTCATTTCATATTTAAGTTTTCCAACAAGTGCTAGAAAACC TAGGGGTTGTTGAAATTGGTTAAACAAGGCATCTTATTATACATACAACAGCATAACGCT AGAGGGGCAAGAAGGAAGAACTTAAAATAATAGGTGTAAAATGACTTTGGCTTTTAATAT GCAACGGTTGGTGTTTCGTAATTTGAATGTTGGGAAGCGCATGTTCAAGAACGTCCCCTT ATGGAGGTTTAATGTCGCCAATAAATTAGGAAAGCCCTTAACTCGCTCTGTAGGGTTAGG CGGTGCTGGCATAGTTGCTGGTGGCTTTTACTTGATGAATCGCCAGCCTTCTAAGTTGAT ATTCAATGATTCTTTAGGGGCAGCTGTCAAACAACAGGGTCCCTTGGAACCAACTGTGGG CAACAGTACGGCAATTACCGAGGAAAGGAGGAACAAAATAAGTAGTCACAAGCAGATGTT TTTGGGATCATTATTCGGTGTTGTTTTAGGAGTTACGGTGGCTAAGATATCAATTTTGTT TATGTATGTCGGTATTACAAGCATGCTTCTTTGTGAATGGTTACGGTACAAGGGATGGAT TCGCATTAATTTGAAAAATATCAAATCTGTAATTGTTTTGAAAGATGTAGACTTGAAGAA ACTGCTTATTGATGGGTTATTGGGTACAGAATACATGGGTTTTAAAGTATTCTTTACATT GAGTTTCGTATTAGCAAGTTTAAATGCTAACAAATGAGCAAGACAAATGACCAGATATAA ACGAGGGTTATATTCTTTCGTTTTATACTTTTTTATTTTTGGTATTTCATTTATCCTATA CAGTAAATATACATAGGGCTAAGGAAGAAAAAAAAATCACGTCGAATATAAACCTAATTG TGTTCTATATTGCGGACATATATTTTTCGTAGATTGAAAAGTTCTTAAACGTAATTTTTT TGACGACCAGTGAAGAGGAATTGAATAAGTAGAACTTGGGCAATACTTATAACGGCAATG ATAATGATAATCAATATAGATAACCAAGTCAACCTTGATTCGGTGGAATTGACGGTAGAC ATGTTTCTCCATTCTCTGGCTCTCAAATAGTTCAAAGTCTTCGTGATTTTGTTCAAGTTT CTATCTATTTCCTCCACGGCGTTATTGGCAATAATGTCATCGTTATTGACATCAGCTTCA TGCTCGTCAGTCAAAGTTTTTTCCTTTTCTAGTGTAATTTCTACCTTTTTCAACGCTGTA CCATAGTTATTGGAAAAACAAAAGGTATACTTCCCCACTCCAAACGATTTTAATAAAAAG TCTGAGTACTTCTTTTGTTTCTCACTAGTAATCACAGATCCATCAGGAGCAGTAATATCA AAATCAATCTCAAAATTACCACCGGTTAGAACTTGGTAACCCACAGCCAGGGAATCATCC TCAGTAACCATATCGTAGTACAGGCATTCTTTGCTGAATGCTGGTAAACTGATAGCAACT GGTGCATAACTGGAAGATGCAGCCACTGAATTGACCAACGCCAAAATTAAAACAATGAAG AAAGAGGGTAGAGCAATTGTAGATTTGATCATGGTTTTCCTTTACAATGAGTGTACTCCA CTGTTTATCTTATTCTAGTTTGGGTCACCTGATGCAGAATTGGCGGTGTCGATCCCTAAG GTTAATGAATCGAAATCACTGGAGATTTTGTTAGTTTTTCATTTTAACTAGTTCAAGTTT TGGCAGAATGTACTTTT >YAL009W SPO7 SGDID:S0000007, Chr I from 134856-137635, Verified ORF CAAGATAATGTCAAAGTTAGTGGTCGTCCTGTGTTTGTAGAATGTGTGTAATATCTTAAA GTTGTCGAACAACCGGGGCTTAAACTTACTAACCCTAACCAAAATTCAGCACCAAGCGAC AACGAAGAATTATTGTACAGTGAGGTGTTAAACTTGGAAGGCGTGGTAAGGAAATTGTGT AATACTCTATAACCACATAATAGATCACTGGTGGAAAATATCCACTCCTGTAAATTGCGG TGAGAATCTCTTTGAAAATAGCACGTTAAAACGTTTAAGCTTTCTTTGAAACTACTGACA CCCTTAAGCATAAATTGGGTTTGTGGACTTAGTCGTTTTATTATCATTGCTTCTAAATCA GAGCTGGGGTAGTACATTCTACCATAATAAAGGGATTTTTTAACAAATTTCGAGTCATGT AGTAATTTCTTGTCATTGTCGACTGTGGTGTTGTCACTACTCAACGTATTCGCACTACTA ACACTGAAATTGAGGTTTGGTTGCAATTGTCTGTATGTTTCGGTGGCATCTTGTAATGGG ATATCAGTAGAGTTGCGCATGAATTTCTCCAATTGCTGTGCATCGGAGTATAAATAACTC AGAGAACCATTTATCCTGGACCTCGTAGAAAAATCTAAAGAATTGAATGTATTGGGAGTA GATTTGTTGGAAATTTGCAGGTGTATTGCTGAGGGAATTCGGAAATCTAATAATGTTCTC GATGTGGCCGTTATATCCTCGTAGCTATTTTGCGTACTCCAATGGGTGCTCTGATAAAAT GCCCTTAGTACTTGGTCCATATAGGGTAGCATCAAGATCGGTCTTCTCTGTTCGTGTCTT TTTCCTAACGTATATTTGCTTTGTTTCTTCACTCAACAATAAAGTCAAAGTAAAATTAAA TACTAATTATTCTTAAAAGGGAAGATGCGAAATTTAGCGAAAATCTATTGATTATACACA CAAAGGAAGAAAGGTAGTGGAAAGCTAAATAAAGGAGGTCATGGAGCCAGAGAGCATAGG CGATGTGGGGAACCATGCCCAGGATGATAGTGCCAGTATAGTGTCCGGGCCTCGCAGGCG TTCTACTAGCAAGACATCCAGTGCGAAGAATATACGGAACTCCAGTAATATCTCTCCAGC ATCGATGATTTTCAGGAATTTGTTGATACTGGAGGATGATTTAAGACGCCAAGCTCACGA ACAAAAGATACTGAAGTGGCAATTCACTTTGTTCTTAGCGTCTATGGCCGGTGTAGGCGC ATTTACCTTCTACGAACTTTATTTCACTTCAGATTATGTCAAGGGCCTCCATAGGGTTAT TTTGCAATTCACTCTTTCTTTCATTTCCATTACTGTAGTTCTTTTTCATATCAGTGGACA ATATAGAAGAACTATCGTCATTCCAAGAAGATTTTTTACCTCTACTAATAAAGGGATTAG GCAGTTTAATGTGAAGCTAGTTAAAGTACAGTCTACGTGGGACGAGAAATACACAGATTC AGTAAGATTTGTGAGTCGAACAATTGCTTATTGTAATATTTATTGTTTGAAAAAATTTCT GTGGCTTAAAGACGATAATGCCATTGTGAAATTTTGGAAAAGTGTCACGATACAATCCCA ACCGAGGATCGGAGCTGTGGATGTGAAATTAGTCCTCAACCCCAGAGCATTTAGTGCAGA GATTAGAGAAGGATGGGAGATTTATAGAGACGAGTTTTGGGCCAGGGAAGGTGCTAGAAG ACGCAAACAAGCGCACGAACTCCGACCTAAATCAGAATGAAAGAGTTGGAGGGCTTCTTC CTTCGAATAAGAGGTCATATTTACCTATGTAAAATTGTAACCATCTATGTTCACACATAA ATTATATTTTATACATTATTAGAAGTGAAGCTGTTGTGTCGTGAAAATTTTACAAATCCG TCATTTCATATTTAAGTTTTCCAACAAGTGCTAGAAAACCTAGGGGTTGTTGAAATTGGT TAAACAAGGCATCTTATTATACATACAACAGCATAACGCTAGAGGGGCAAGAAGGAAGAA CTTAAAATAATAGGTGTAAAATGACTTTGGCTTTTAATATGCAACGGTTGGTGTTTCGTA ATTTGAATGTTGGGAAGCGCATGTTCAAGAACGTCCCCTTATGGAGGTTTAATGTCGCCA ATAAATTAGGAAAGCCCTTAACTCGCTCTGTAGGGTTAGGCGGTGCTGGCATAGTTGCTG GTGGCTTTTACTTGATGAATCGCCAGCCTTCTAAGTTGATATTCAATGATTCTTTAGGGG CAGCTGTCAAACAACAGGGTCCCTTGGAACCAACTGTGGGCAACAGTACGGCAATTACCG AGGAAAGGAGGAACAAAATAAGTAGTCACAAGCAGATGTTTTTGGGATCATTATTCGGTG TTGTTTTAGGAGTTACGGTGGCTAAGATATCAATTTTGTTTATGTATGTCGGTATTACAA GCATGCTTCTTTGTGAATGGTTACGGTACAAGGGATGGATTCGCATTAATTTGAAAAATA TCAAATCTGTAATTGTTTTGAAAGATGTAGACTTGAAGAAACTGCTTATTGATGGGTTAT TGGGTACAGAATACATGGGTTTTAAAGTATTCTTTACATTGAGTTTCGTATTAGCAAGTT TAAATGCTAACAAATGAGCAAGACAAATGACCAGATATAAACGAGGGTTATATTCTTTCG TTTTATACTTTTTTATTTTTGGTATTTCATTTATCCTATACAGTAAATATACATAGGGCT AAGGAAGAAAAAAAAATCAC Biostrings/inst/include/0000755000126300012640000000000012227063321016656 5ustar00biocbuildphs_compbioBiostrings/inst/include/Biostrings_defines.h0000644000126300012640000001354112227063321022653 0ustar00biocbuildphs_compbio/***************************************************************************** Biostrings C interface: typedefs and defines -------------------------------------------- The Biostrings C interface is split in 2 files: 1. Biostrings_defines.h (this file): contains the typedefs and defines of the interface. 2. Biostrings_interface.h (in this directory): contains the prototypes of the Biostrings C routines that are part of the interface. Please consult Biostrings_interface.h for how to use this interface in your package. *****************************************************************************/ #ifndef BIOSTRINGS_DEFINES_H #define BIOSTRINGS_DEFINES_H #include "IRanges_defines.h" #include "XVector_defines.h" #include #include #include /* for CHAR_BIT */ /* * A simple typedef for representing a fast translation table from bytes to * integer values. Always put value NA_INTEGER in the table for bytes that are * not mapped. */ #define BYTETRTABLE_LENGTH 256 typedef struct byte_tr_table { int byte2code[BYTETRTABLE_LENGTH]; } ByteTrTable; typedef struct twobit_encoding_buffer { ByteTrTable eightbit2twobit; int buflength; int endianness; /* move bits to the left if 0, to the right if 1 */ int nbit_in_mask; int twobit_mask; int lastin_twobit; int nb_valid_prev_char; int current_signature; } TwobitEncodingBuffer; /* * A simple typedef for representing a "bytewise op table". */ typedef struct bytewise_op_table { unsigned char xy2val[256][256]; } BytewiseOpTable; /* * A structure for holding an array of pointers to read-only non * null-terminated sequences of chars. */ typedef struct roseqs { cachedCharSeq *elts; int nelt; } RoSeqs; /* * cached_* structs. */ typedef cachedXVectorList cachedXStringSet; typedef struct cached_mindex { const char *classname; int length; SEXP width0; SEXP names; SEXP ends; SEXP dups0_high2low; SEXP dups0_low2high; } cachedMIndex; /* * The BitCol, BitMatrix and HeadTail structs are used for preprocessing * and fast matching of the head and tail of a PDict object. */ typedef unsigned long int BitWord; #define NBIT_PER_BITWORD (sizeof(BitWord) * CHAR_BIT) typedef struct bitcol { BitWord *bitword0; int nword; int nbit; /* <= nword * NBIT_PER_BITWORD */ } BitCol; typedef struct bitmatrix { BitWord *bitword00; int nword_per_col; int nrow; /* <= nword_per_col * NBIT_PER_BITWORD */ int ncol; } BitMatrix; typedef struct ppheadtail { int is_init; ByteTrTable byte2offset; BitMatrix head_bmbuf[4], tail_bmbuf[4]; BitMatrix nmis_bmbuf; BitMatrix tmp_match_bmbuf; int *tmp_tb_end_buf; } PPHeadTail; typedef struct headtail { RoSeqs head, tail; int max_Hwidth, max_Twidth, max_HTwidth; IntAE grouped_keys; PPHeadTail ppheadtail; } HeadTail; /* * Match storing modes. * np = nb of pattern sequences. ns = nb of subject sequences. * The "key" of a pattern (or subject) sequence is its 1-based position in the * pattern dictionary (or in the set of subject sequences). * | | np = N, ns = 1 | * | np = ns = 1 | or np = 1, ns = N | * -------------------|-------------------------------------------------------| * MATCHES_AS_NULL | Matches are not stored at all. | * | NULL is returned. | * -------------------|-------------------------------------------------------| * MATCHES_AS_WHICH | | Only the matching "keys" | * | | are stored and returned. | * -------------------|-------------------------------------------------------| * MATCHES_AS_COUNTS | Matches are counted only. | * | An integer vector of length np * ns is returned. | * -------------------|-------------------------------------------------------| * MATCHES_AS_STARTS | Only the starts of the matches are stored. | * | An integer vector is | A list of integer vectors | * | returned. | is returned (with | * | | eventually NULL elements).| * -------------------|-------------------------------------------------------| * MATCHES_AS_ENDS | Only the ends of the matches are stored. | * | An integer vector is | A list of integer vectors | * | returned. | is returned (with | * | | eventually NULL elements).| * -------------------|-------------------------------------------------------| * MATCHES_AS_RANGES | The starts and ends of the matches are stored. | * | A Ranges object is | An MIndex object is | * | returned. | returned. | */ #define MATCHES_AS_NULL 0 #define MATCHES_AS_WHICH 1 #define MATCHES_AS_COUNTS 2 #define MATCHES_AS_STARTS 3 #define MATCHES_AS_ENDS 4 #define MATCHES_AS_RANGES 5 #define MATCHES_AS_NORMALRANGES 6 // not supported yet #define MATCHES_AS_COVERAGE 7 // supported yet /* The 'PSlink_ids' field contains the ids of the pattern/subject pairs that are linked by at least 1 match. */ typedef struct match_buf { int ms_code; IntAE PSlink_ids; IntAE match_counts; IntAEAE match_starts; IntAEAE match_widths; } MatchBuf; /* * The MatchPDictBuf struct is used for storing the matches found by the * matchPDict() function (and family). */ typedef struct tbmatch_buf { int is_init; int tb_width; const int *head_widths; const int *tail_widths; IntAE PSlink_ids; IntAEAE match_ends; } TBMatchBuf; typedef struct matchpdict_buf { TBMatchBuf tb_matches; MatchBuf matches; } MatchPDictBuf; #endif Biostrings/inst/include/Biostrings_interface.h0000644000126300012640000001345112227063321023176 0ustar00biocbuildphs_compbio/***************************************************************************** Biostrings C interface: prototypes ---------------------------------- The Biostrings C interface is split in 2 files: 1. Biostrings_defines.h (in this directory): contains the typedefs and defines of the interface. 2. Biostrings_interface.h (this file): contains the prototypes of the Biostrings C routines that are part of the interface. ----------------------------------------------------------------------------- This file contains the prototypes of a subset of Biostrings C routines that can be called by C code from other packages. In order to use these routines in your package, you need to do the following: a. Add the IRanges, XVector, and Biostrings package to the 'LinkingTo:' field of your DESCRIPTION file. It's very likely that you already have some of them, if not all of them, listed in your 'Depends:' and/or 'Imports:' field. Also it's recommended that you have the methods package in 'Imports:', preferably in first position. b. If it doesn't already have one, add a NAMESPACE file to your package and start it with the following lines: useDynLib(mypackage) # replace mypackage by the name of your package import(methods) # if you have it in your 'Imports:' field import(IRanges) # if you need to import stuff from IRanges import(XVector) # if you need to import stuff from XVector import(Biostrings) # if you need to import stuff from Biostrings c. Add a Biostrings_stubs.c file to your src/ folder with the following line (and nothing else) in it: #include "_Biostrings_stubs.c" // note the underscore! If you also need to call C routines defined in XVector (e.g. cache_XRaw) and/or IRanges (e.g. vector_memcpy), add an XVector_stubs.c and/or IRanges_stubs.c file in a similar fashion. d. Add the following line: #include "Biostrings_interface.h" in your .c files where you need to call Biostrings C routines. Add similar lines for XVector_interface.h and/or IRanges_interface.h in case you also need to call XVector and/or IRanges C routines. Note that those includes should come after any R or system include so the top of your .c file will typically look like this: // R includes #include #include ... maybe more R includes ... // System includes #include #include ... maybe more system includes ... #include "XVector_interface.h" #include "Biostrings_interface.h" e. Any C routine defined in Biostrings_interface.h, XVector_interface.h, or IRanges_interface.h can now be called in your .c file. For example, you could write the following function: SEXP print_XString_bytes(SEXP xstring) { cachedCharSeq x; int i; const char *x_char; x = cache_XRaw(xstring); for (i = 0, x_char = x.elts; i < x.nelt; i++, x_char++) Rprintf("%x ", *x_char); Rprintf("\n"); return R_NilValue; } to display the sequence of an XString object (in hexadecimal format). Don't forget to register the print_XString_bytes() function if you want to make it a .Call entry point! f. 2 IMPORTANT THINGS TO REMEMBER ABOUT XString OBJECTS: o They are NOT null-terminated like standard strings in C: they can contain the null byte so you should never use the C standard string functions on them; o DNAString and RNAString objects have their data ENCODED: for example, if you can assume that the 'xstring' argument in the above code will always point to a DNAString instance, then you could replace Rprintf("%x ", *x_char); by Rprintf("%x(%c) ", *x_char, DNAdecode(*x_char)); Of course this code would work properly only if 'xstring' is actually a DNAString instance! Please consult the "System and foreign language interfaces" section in the Writing R Extensions manual for more information: http://cran.r-project.org/doc/manuals/R-exts.html Don't hesitate to ask on the bioc-devel mailing list for questions or suggestions about this: http://bioconductor.org/help/mailing-list/ Thanks for using the Biostrings package! *****************************************************************************/ #include "Biostrings_defines.h" /* * Low-level manipulation of XString and XStringSet objects. */ char DNAencode(char c); char DNAdecode(char code); char RNAencode(char c); char RNAdecode(char code); int get_XStringSet_length(SEXP x); const char *get_XStringSet_xsbaseclassname(SEXP x); cachedXStringSet cache_XStringSet(SEXP x); int get_cachedXStringSet_length(const cachedXStringSet *cached_x); cachedCharSeq get_cachedXStringSet_elt( const cachedXStringSet *cached_x, int i ); void set_XStringSet_names( SEXP x, SEXP names ); /* * Match reporting facilities. */ void init_match_reporting(const char *ms_mode, int nPSpair); void set_active_PSpair(int PSpair_id); void set_match_shift(int shift); void report_match(int start, int width); void drop_reported_matches(); int get_match_count(); SEXP reported_matches_asSEXP(); /* * MIndex abstract accessor functions. */ cachedMIndex cache_MIndex(SEXP x); int get_cachedMIndex_length(const cachedMIndex *cached_x); int get_cachedMIndex_elt_width0(const cachedMIndex *cached_x, int i); cachedIRanges get_cachedMIndex_elt(const cachedMIndex *cached_x, int i); /* * A BOYER-MOORE-LIKE MATCHING ALGO */ int match_pattern_boyermoore( const cachedCharSeq *P, const cachedCharSeq *S, int nfirstmatches, int walk_backward ); Biostrings/inst/include/_Biostrings_stubs.c0000644000126300012640000000641512227063321022532 0ustar00biocbuildphs_compbio#include "Biostrings_interface.h" #define DEFINE_CCALLABLE_STUB(retT, stubname, Targs, args) \ typedef retT(*__ ## stubname ## _funtype__)Targs; \ retT stubname Targs \ { \ static __ ## stubname ## _funtype__ fun = NULL; \ if (fun == NULL) \ fun = (__ ## stubname ## _funtype__) R_GetCCallable("Biostrings", "_" #stubname); \ return fun args; \ } /* * Using the above macro when retT (the returned type) is void will make Sun * Studio 12 C compiler unhappy. So we need to use the following macro to * handle that case. */ #define DEFINE_NOVALUE_CCALLABLE_STUB(stubname, Targs, args) \ typedef void(*__ ## stubname ## _funtype__)Targs; \ void stubname Targs \ { \ static __ ## stubname ## _funtype__ fun = NULL; \ if (fun == NULL) \ fun = (__ ## stubname ## _funtype__) R_GetCCallable("Biostrings", "_" #stubname); \ fun args; \ return; \ } /* * Stubs for callables defined in XString_class.c */ DEFINE_CCALLABLE_STUB(char, DNAencode, (char c), ( c) ) DEFINE_CCALLABLE_STUB(char, DNAdecode, (char code), ( code) ) DEFINE_CCALLABLE_STUB(char, RNAencode, (char c), ( c) ) DEFINE_CCALLABLE_STUB(char, RNAdecode, (char code), ( code) ) /* * Stubs for callables defined in XStringSet_class.c */ DEFINE_CCALLABLE_STUB(int, get_XStringSet_length, (SEXP x), ( x) ) DEFINE_CCALLABLE_STUB(const char *, get_XStringSet_xsbaseclassname, (SEXP x), ( x) ) DEFINE_CCALLABLE_STUB(cachedXStringSet, cache_XStringSet, (SEXP x), ( x) ) DEFINE_CCALLABLE_STUB(int, get_cachedXStringSet_length, (const cachedXStringSet *cached_x), ( cached_x) ) DEFINE_CCALLABLE_STUB(cachedCharSeq, get_cachedXStringSet_elt, (const cachedXStringSet *cached_x, int i), ( cached_x, i) ) DEFINE_NOVALUE_CCALLABLE_STUB(set_XStringSet_names, (SEXP x, SEXP names), ( x, names) ) /* * Stubs for callables defined in match_reporting.c */ DEFINE_NOVALUE_CCALLABLE_STUB(init_match_reporting, (const char *ms_mode, int nPSpair), ( ms_mode, nPSpair) ) DEFINE_NOVALUE_CCALLABLE_STUB(set_active_PSpair, (int PSpair_id), ( PSpair_id) ) DEFINE_NOVALUE_CCALLABLE_STUB(set_match_shift, (int shift), ( shift) ) DEFINE_NOVALUE_CCALLABLE_STUB(report_match, (int start, int width), ( start, width) ) DEFINE_NOVALUE_CCALLABLE_STUB(drop_reported_matches, (), () ) DEFINE_CCALLABLE_STUB(int, get_match_count, (), () ) DEFINE_CCALLABLE_STUB(SEXP, reported_matches_asSEXP, (), () ) /* * Stubs for callables defined in MIndex_class.c */ DEFINE_CCALLABLE_STUB(cachedMIndex, cache_MIndex, (SEXP x), ( x) ) DEFINE_CCALLABLE_STUB(int, get_cachedMIndex_length, (const cachedMIndex *cached_x), ( cached_x) ) DEFINE_CCALLABLE_STUB(int, get_cachedMIndex_elt_width0, (const cachedMIndex *cached_x, int i), ( cached_x, i) ) DEFINE_CCALLABLE_STUB(cachedIRanges, get_cachedMIndex_elt, (const cachedMIndex *cached_x, int i), ( cached_x, i) ) /* * Stubs for callables defined in match_pattern_boyermoore.c */ DEFINE_CCALLABLE_STUB(int, match_pattern_boyermoore, (const cachedCharSeq *P, const cachedCharSeq *S, int nfirstmatches, int walk_backward), ( P, S, nfirstmatches, walk_backward) ) Biostrings/man/0000755000126300012640000000000012227063320015030 5ustar00biocbuildphs_compbioBiostrings/man/AAString-class.Rd0000644000126300012640000000436112227063320020076 0ustar00biocbuildphs_compbio\name{AAString-class} \docType{class} % Classes \alias{class:AAString} \alias{AAString-class} % Constants: \alias{AA_ALPHABET} % Constructor-like functions and generics: \alias{AAString} \title{AAString objects} \description{ An AAString object allows efficient storage and manipulation of a long amino acid sequence. } \details{ The AAString class is a direct \link{XString} subclass (with no additional slot). Therefore all functions and methods described in the \link{XString} man page also work with an AAString object (inheritance). Unlike the \link{BString} container that allows storage of any single string (based on a single-byte character set) the AAString container can only store a string based on the Amino Acid alphabet (see below). } \section{The Amino Acid alphabet}{ This alphabet contains all letters from the Single-Letter Amino Acid Code (see \code{?\link{AMINO_ACID_CODE}}) + the stop (\code{"*"}), the gap (\code{"-"}) and the hard masking (\code{"+"}) letters. It is stored in the \code{AA_ALPHABET} constant (character vector). The \code{alphabet} method also returns \code{AA_ALPHABET} when applied to an AAString object and is provided for convenience only. } \section{Constructor-like functions and generics}{ In the code snippet below, \code{x} can be a single string (character vector of length 1) or a \link{BString} object. \describe{ \item{}{ \code{AAString(x="", start=1, nchar=NA)}: Tries to convert \code{x} into an AAString object by reading \code{nchar} letters starting at position \code{start} in \code{x}. } } } \section{Accessor methods}{ In the code snippet below, \code{x} is an \link{AAString} object. \describe{ \item{}{ \code{alphabet(x)}: If \code{x} is an AAString object, then return the Amino Acid alphabet (see above). See the corresponding man pages when \code{x} is a \link{BString}, \link{DNAString} or \link{RNAString} object. } } } \author{H. Pages} \seealso{ \code{\link{AMINO_ACID_CODE}}, \code{\link{letter}}, \link{XString-class}, \code{\link{alphabetFrequency}} } \examples{ AA_ALPHABET a <- AAString("MARKSLEMSIR*") length(a) alphabet(a) } \keyword{methods} \keyword{classes} Biostrings/man/AMINO_ACID_CODE.Rd0000644000126300012640000000105112227063320017531 0ustar00biocbuildphs_compbio\name{AMINO_ACID_CODE} \alias{AMINO_ACID_CODE} \title{The Single-Letter Amino Acid Code} \description{ Named character vector mapping single-letter amino acid representations to 3-letter amino acid representations. } \seealso{ \code{\link{AAString}}, \code{\link{GENETIC_CODE}} } \examples{ ## See all the 3-letter codes AMINO_ACID_CODE ## Convert an AAString object to a vector of 3-letter amino acid codes aa <- AAString("LANDEECQW") AMINO_ACID_CODE[strsplit(as.character(aa), NULL)[[1]]] } \keyword{utilities} \keyword{data} Biostrings/man/AlignedXStringSet-class.Rd0000644000126300012640000001225512227063320021765 0ustar00biocbuildphs_compbio\name{AlignedXStringSet-class} \docType{class} % Classes \alias{class:AlignedXStringSet0} \alias{AlignedXStringSet0-class} \alias{AlignedXStringSet0} \alias{class:AlignedXStringSet} \alias{AlignedXStringSet-class} \alias{AlignedXStringSet} \alias{class:QualityAlignedXStringSet} \alias{QualityAlignedXStringSet-class} \alias{QualityAlignedXStringSet} % Accessor methods: \alias{unaligned} \alias{unaligned,AlignedXStringSet0-method} \alias{aligned} \alias{aligned,AlignedXStringSet0-method} \alias{start,AlignedXStringSet0-method} \alias{end,AlignedXStringSet0-method} \alias{width,AlignedXStringSet0-method} \alias{indel} \alias{indel,AlignedXStringSet0-method} \alias{nindel} \alias{nindel,AlignedXStringSet0-method} \alias{length,AlignedXStringSet0-method} \alias{nchar,AlignedXStringSet0-method} \alias{seqtype,AlignedXStringSet0-method} % Standard generic methods: \alias{show,AlignedXStringSet0-method} \alias{as.character,AlignedXStringSet0-method} \alias{toString,AlignedXStringSet0-method} \alias{[,AlignedXStringSet0-method} \alias{[<-,AlignedXStringSet0-method} \alias{rep,AlignedXStringSet0-method} \title{AlignedXStringSet and QualityAlignedXStringSet objects} \description{ The \code{AlignedXStringSet} and \code{QualityAlignedXStringSet} classes are containers for storing an aligned \code{XStringSet}. } \details{ Before we define the notion of alignment, we introduce the notion of "filled-with-gaps subsequence". A "filled-with-gaps subsequence" of a string string1 is obtained by inserting 0 or any number of gaps in a subsequence of s1. For example L-A--ND and A--N-D are "filled-with-gaps subsequences" of LAND. An alignment between two strings string1 and string2 results in two strings (align1 and align2) that have the same length and are "filled-with-gaps subsequences" of string1 and string2. For example, this is an alignment between LAND and LEAVES: \preformatted{ L-A LEA } An alignment can be seen as a compact representation of one set of basic operations that transforms string1 into align1. There are 3 different kinds of basic operations: "insertions" (gaps in align1), "deletions" (gaps in align2), "replacements". The above alignment represents the following basic operations: \preformatted{ insert E at pos 2 insert V at pos 4 insert E at pos 5 replace by S at pos 6 (N is replaced by S) delete at pos 7 (D is deleted) } Note that "insert X at pos i" means that all letters at a position >= i are moved 1 place to the right before X is actually inserted. There are many possible alignments between two given strings string1 and string2 and a common problem is to find the one (or those ones) with the highest score, i.e. with the lower total cost in terms of basic operations. } \section{Accessor methods}{ In the code snippets below, \code{x} is a \code{AlignedXStringSet} or \code{QualityAlignedXStringSet} object. \describe{ \item{}{ \code{unaligned(x)}: The original string. } \item{}{ \code{aligned(x, degap = FALSE)}: If \code{degap = FALSE}, the "filled-with-gaps subsequence" representing the aligned substring. If \code{degap = TRUE}, the "gap-less subsequence" representing the aligned substring. } \item{}{ \code{start(x)}: The start of the aligned substring. } \item{}{ \code{end(x)}: The end of the aligned substring. } \item{}{ \code{width(x)}: The width of the aligned substring, ignoring gaps. } \item{}{ \code{indel(x)}: The positions, in the form of an \code{IRanges} object, of the insertions or deletions (depending on what \code{x} represents). } \item{}{ \code{nindel(x)}: A two-column matrix containing the length and sum of the widths for each of the elements returned by \code{indel}. } \item{}{ \code{length(x)}: The length of the \code{aligned(x)}. } \item{}{ \code{nchar(x)}: The nchar of the \code{aligned(x)}. } \item{}{ \code{alphabet(x)}: Equivalent to \code{alphabet(unaligned(x))}. } \item{}{ \code{as.character(x)}: Converts \code{aligned(x)} to a character vector. } \item{}{ \code{toString(x)}: Equivalent to \code{toString(as.character(x))}. } } } \section{Subsetting methods}{ \describe{ \item{}{ \code{x[i]}: Returns a new \code{AlignedXStringSet} or \code{QualityAlignedXStringSet} object made of the selected elements. } \item{}{ \code{rep(x, times)}: Returns a new \code{AlignedXStringSet} or \code{QualityAlignedXStringSet} object made of the repeated elements. } } } \author{P. Aboyoun and H. Pages} \seealso{ \code{\link{pairwiseAlignment}}, \code{\link{PairwiseAlignments-class}}, \code{\link{XStringSet-class}} } \examples{ pattern <- AAString("LAND") subject <- AAString("LEAVES") nw1 <- pairwiseAlignment(pattern, subject, substitutionMatrix = "BLOSUM50", gapOpening = -3, gapExtension = -1) alignedPattern <- pattern(nw1) unaligned(alignedPattern) aligned(alignedPattern) as.character(alignedPattern) nchar(alignedPattern) } \keyword{methods} \keyword{classes} Biostrings/man/BOC_SubjectString-class.Rd0000644000126300012640000000146412227063320021700 0ustar00biocbuildphs_compbio\name{BOC_SubjectString-class} \docType{class} % Classes: \alias{class:BOC_SubjectString} \alias{BOC_SubjectString-class} \alias{BOC_SubjectString} \alias{class:BOC2_SubjectString} \alias{BOC2_SubjectString-class} \alias{BOC2_SubjectString} % Initialization: \alias{initialize,BOC_SubjectString-method} \alias{initialize,BOC2_SubjectString-method} % Other methods: \alias{matchPattern,BOC_SubjectString-method} \alias{matchPattern,BOC2_SubjectString-method} \alias{countPattern,BOC2_SubjectString-method} \title{BOC\_SubjectString and BOC2\_SubjectString objects} \description{ The BOC\_SubjectString and BOC2\_SubjectString classes are experimental and might not work properly. Please DO NOT TRY TO USE them for now. Thanks for your comprehension! } \author{H. Pages} \keyword{methods} \keyword{classes} Biostrings/man/Biostrings-internals.Rd0000644000126300012640000000141512227063320021440 0ustar00biocbuildphs_compbio\name{Biostrings internals} \docType{class} % SparseList class and methods: \alias{class:SparseList} \alias{SparseList-class} \alias{SparseList} \alias{length,SparseList-method} %\alias{ls,SparseList-method} \alias{as.list,SparseList-method} \alias{[[,SparseList-method} % XStringCodec class and methods: \alias{class:XStringCodec} \alias{XStringCodec-class} \alias{XStringCodec} \alias{initialize,XStringCodec-method} % seqtype.R (put aliases for specific methods in corresponding man pages): \alias{seqtype} \alias{seqtype<-} \alias{get_seqtype_conversion_lookup} \title{Biostrings internals} \description{ Biostrings objects, classes and methods that are not intended to be used directly. } \author{H. Pages} \keyword{internal} \keyword{methods} \keyword{classes} Biostrings/man/DNAString-class.Rd0000644000126300012640000000501012227063320020207 0ustar00biocbuildphs_compbio\name{DNAString-class} \docType{class} % Classes \alias{class:DNAString} \alias{DNAString-class} % Constants: \alias{DNA_BASES} \alias{DNA_ALPHABET} % Constructor-like functions and generics: \alias{DNAString} \title{DNAString objects} \description{ A DNAString object allows efficient storage and manipulation of a long DNA sequence. } \details{ The DNAString class is a direct \link{XString} subclass (with no additional slot). Therefore all functions and methods described in the \link{XString} man page also work with a DNAString object (inheritance). Unlike the \link{BString} container that allows storage of any single string (based on a single-byte character set) the DNAString container can only store a string based on the DNA alphabet (see below). In addition, the letters stored in a DNAString object are encoded in a way that optimizes fast search algorithms. } \section{The DNA alphabet}{ This alphabet contains all letters from the IUPAC Extended Genetic Alphabet (see \code{?\link{IUPAC_CODE_MAP}}) + the gap (\code{"-"}) and the hard masking (\code{"+"}) letters. It is stored in the \code{DNA_ALPHABET} constant (character vector). The \code{alphabet} method also returns \code{DNA_ALPHABET} when applied to a DNAString object and is provided for convenience only. } \section{Constructor-like functions and generics}{ In the code snippet below, \code{x} can be a single string (character vector of length 1), a \link{BString} object or an \link{RNAString} object. \describe{ \item{}{ \code{DNAString(x="", start=1, nchar=NA)}: Tries to convert \code{x} into a DNAString object by reading \code{nchar} letters starting at position \code{start} in \code{x}. } } } \section{Accessor methods}{ In the code snippet below, \code{x} is a DNAString object. \describe{ \item{}{ \code{alphabet(x, baseOnly=FALSE)}: If \code{x} is a DNAString object, then return the DNA alphabet (see above). See the corresponding man pages when \code{x} is a \link{BString}, \link{RNAString} or \link{AAString} object. } } } \author{H. Pages} \seealso{ \code{\link{IUPAC_CODE_MAP}}, \code{\link{letter}}, \link{XString-class}, \link{RNAString-class}, \code{\link{reverseComplement}}, \code{\link{alphabetFrequency}} } \examples{ DNA_BASES DNA_ALPHABET d <- DNAString("TTGAAAA-CTC-N") length(d) alphabet(d) # DNA_ALPHABET alphabet(d, baseOnly=TRUE) # DNA_BASES } \keyword{methods} \keyword{classes} Biostrings/man/GENETIC_CODE.Rd0000644000126300012640000000440312227063320017170 0ustar00biocbuildphs_compbio\name{GENETIC_CODE} \alias{GENETIC_CODE} \alias{RNA_GENETIC_CODE} \title{The Standard Genetic Code} \description{ Two predefined objects (\code{GENETIC_CODE} and \code{RNA_GENETIC_CODE}) that represent The Standard Genetic Code. } \usage{ GENETIC_CODE RNA_GENETIC_CODE } \details{ Formally, a genetic code is a mapping between tri-nucleotide sequences called codons, and amino acids. The Standard Genetic Code (aka The Canonical Genetic Code, or simply The Genetic Code) is the particular mapping that encodes the vast majority of genes in nature. \code{GENETIC_CODE} and \code{RNA_GENETIC_CODE} are predefined named character vectors that represent this mapping. } \value{ \code{GENETIC_CODE} and \code{RNA_GENETIC_CODE} are both named character vectors of length 64 (the number of all possible tri-nucleotide sequences) where each element is a single letter representing either an amino acid or the stop codon \code{"*"} (aka termination codon). The names of the \code{GENETIC_CODE} vector are the DNA codons i.e. the tri-nucleotide sequences (directed 5' to 3') that are assumed to belong to the "coding DNA strand" (aka "sense DNA strand" or "non-template DNA strand") of the gene. The names of the \code{RNA_GENETIC_CODE} are the RNA codons i.e. the tri-nucleotide sequences (directed 5' to 3') that are assumed to belong to the mRNA of the gene. Note that the values in the \code{GENETIC_CODE} and \code{RNA_GENETIC_CODE} vectors are the same, only their names are different. The names of the latter are those of the former where all occurrences of T (thymine) have been replaced by U (uracil). } \author{H. Pages} \references{ \url{http://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi} } \seealso{ \code{\link{AA_ALPHABET}}, \code{\link{AMINO_ACID_CODE}}, \code{\link{translate}}, \code{\link{trinucleotideFrequency}}, \code{\link{DNAString}}, \code{\link{RNAString}}, \code{\link{AAString}} } \examples{ GENETIC_CODE GENETIC_CODE[["ATG"]] # codon ATG is translated into M (Methionine) sort(table(GENETIC_CODE)) # the same amino acid can be encoded by 1 # to 6 different codons RNA_GENETIC_CODE all(GENETIC_CODE == RNA_GENETIC_CODE) # TRUE } \keyword{utilities} \keyword{data} Biostrings/man/HNF4alpha.Rd0000644000126300012640000000100712227063320017022 0ustar00biocbuildphs_compbio\name{HNF4alpha} \alias{HNF4alpha} \title{Known HNF4alpha binding sequences} \description{ Seventy one known HNF4alpha binding sequences } \details{ A \code{DNAStringSet} containing 71 known binding sequences for HNF4alpha. } \references{ Ellrott, K., Yang, C., Sladek, F.M., Jiang, T. (2002) "Identifying transcription factor binding sites through Markov chain optimations", Bioinformatics, 18 (Suppl. 2), S100-S109. } \author{P. Aboyoun} \examples{ data(HNF4alpha) HNF4alpha } \keyword{datasets} Biostrings/man/IUPAC_CODE_MAP.Rd0000644000126300012640000000334712227063320017456 0ustar00biocbuildphs_compbio\name{IUPAC_CODE_MAP} \alias{IUPAC_CODE_MAP} \alias{mergeIUPACLetters} \title{The IUPAC Extended Genetic Alphabet} \description{ The \code{IUPAC_CODE_MAP} named character vector contains the mapping from the IUPAC nucleotide ambiguity codes to their meaning. The \code{mergeIUPACLetters} function provides the reverse mapping. } \usage{ IUPAC_CODE_MAP mergeIUPACLetters(x) } \arguments{ \item{x}{ A vector of non-empty character strings made of IUPAC letters. } } \details{ IUPAC nucleotide ambiguity codes are used for representing sequences of nucleotides where the exact nucleotides that occur at some given positions are not known with certainty. } \value{ \code{IUPAC_CODE_MAP} is a named character vector where the names are the IUPAC nucleotide ambiguity codes and the values are their corresponding meanings. The meaning of each code is described by a string that enumarates the base letters (\code{"A"}, \code{"C"}, \code{"G"} or \code{"T"}) associated with the code. The value returned by \code{mergeIUPACLetters} is an unnamed character vector of the same length as its argument \code{x} where each element is an IUPAC nucleotide ambiguity code. } \author{H. Pages} \references{ \url{http://www.chick.manchester.ac.uk/SiteSeer/IUPAC\_codes.html} IUPAC-IUB SYMBOLS FOR NUCLEOTIDE NOMENCLATURE: Cornish-Bowden (1985) \emph{Nucl. Acids Res.} 13: 3021-3030. } \seealso{ \code{\link{DNAString}}, \code{\link{RNAString}} } \examples{ IUPAC_CODE_MAP some_iupac_codes <- c("R", "M", "G", "N", "V") IUPAC_CODE_MAP[some_iupac_codes] mergeIUPACLetters(IUPAC_CODE_MAP[some_iupac_codes]) mergeIUPACLetters(c("Ca", "Acc", "aA", "MAAmC", "gM", "AB", "bS", "mk")) } \keyword{utilities} \keyword{data} Biostrings/man/InDel-class.Rd0000644000126300012640000000153212227063320017416 0ustar00biocbuildphs_compbio\name{InDel-class} \docType{class} % Classes \alias{class:InDel} \alias{InDel-class} \alias{InDel} % Accessor methods: \alias{insertion} \alias{insertion,InDel-method} \alias{deletion} \alias{deletion,InDel-method} \title{InDel objects} \description{ The \code{InDel} class is a container for storing insertion and deletion information. } \details{ This is a generic class that stores any insertion and deletion information. } \section{Accessor methods}{ In the code snippets below, \code{x} is a \code{InDel} object. \describe{ \item{}{ \code{insertion(x)}: The insertion information. } \item{}{ \code{deletion(x)}: The deletion information. } } } \author{P. Aboyoun} \seealso{ \code{\link{pairwiseAlignment}}, \code{\link{PairwiseAlignments-class}} } \keyword{methods} \keyword{classes} Biostrings/man/MIndex-class.Rd0000644000126300012640000000661712227063320017620 0ustar00biocbuildphs_compbio\name{MIndex-class} \docType{class} % Classes \alias{MIndex} \alias{class:MIndex} \alias{MIndex-class} \alias{class:ByPos_MIndex} \alias{ByPos_MIndex-class} % Generics and methods: \alias{length,MIndex-method} \alias{width0} \alias{width0,MIndex-method} \alias{names,MIndex-method} \alias{names<-,MIndex-method} \alias{startIndex} \alias{endIndex} \alias{elementLengths,MIndex-method} \alias{countIndex} \alias{countIndex,MIndex-method} \alias{unlist,MIndex-method} \alias{coerce,MIndex,CompressedIRangesList-method} \alias{show,MIndex-method} \alias{[[,ByPos_MIndex-method} \alias{startIndex,ByPos_MIndex-method} \alias{endIndex,ByPos_MIndex-method} \alias{countIndex,ByPos_MIndex-method} \title{MIndex objects} \description{ The MIndex class is the basic container for storing the matches of a set of patterns in a subject sequence. } \details{ An MIndex object contains the matches (start/end locations) of a set of patterns found in an \link{XString} object called "the subject string" or "the subject sequence" or simply "the subject". \code{\link{matchPDict}} function returns an MIndex object. } \section{Accessor methods}{ In the code snippets below, \code{x} is an MIndex object. \describe{ \item{}{ \code{length(x)}: The number of patterns that matches are stored for. } \item{}{ \code{names(x)}: The names of the patterns that matches are stored for. } \item{}{ \code{startIndex(x)}: A list containing the starting positions of the matches for each pattern. } \item{}{ \code{endIndex(x)}: A list containing the ending positions of the matches for each pattern. } \item{}{ \code{countIndex(x)}: An integer vector containing the number of matches for each pattern. Equivalent to \code{elementLengths(x)}. } } } \section{Subsetting methods}{ In the code snippets below, \code{x} is an MIndex object. \describe{ \item{}{ \code{x[[i]]}: Extract the matches for the i-th pattern as an \link[IRanges:IRanges-class]{IRanges} object. } } } \section{Coercion}{ In the code snippets below, \code{x} is an MIndex object. \describe{ \item{}{ \code{as(x, "CompressedIRangesList")}: Turns \code{x} into an \link[IRanges:IRangesList-class]{CompressedIRangesList} object. This coercion changes \code{x} from one \link[IRanges:RangesList-class]{RangesList} subtype to another with the underlying \link[IRanges:Ranges-class]{Ranges} values remaining unchanged. } } } \section{Other utility methods and functions}{ In the code snippets below, \code{x} and \code{mindex} are MIndex objects and \code{subject} is the \link{XString} object containing the sequence in which the matches were found. \describe{ \item{}{ \code{unlist(x, recursive=TRUE, use.names=TRUE)}: Return all the matches in a single \link[IRanges:IRanges-class]{IRanges} object. \code{recursive} and \code{use.names} are ignored. } \item{}{ \code{extractAllMatches(subject, mindex)}: Return all the matches in a single \link{XStringViews} object. } } } \author{H. Pages} \seealso{ \code{\link{matchPDict}}, \link{PDict-class}, \link[IRanges]{IRanges-class}, \link{XStringViews-class} } \examples{ ## See ?matchPDict and ?`matchPDict-inexact` for some examples. } \keyword{methods} \keyword{classes} Biostrings/man/MaskedXString-class.Rd0000644000126300012640000001721212227063320021150 0ustar00biocbuildphs_compbio\name{MaskedXString-class} \docType{class} % Classes: \alias{class:MaskedXString} \alias{MaskedXString-class} \alias{MaskedXString} \alias{class:MaskedBString} \alias{MaskedBString-class} \alias{MaskedBString} \alias{class:MaskedDNAString} \alias{MaskedDNAString-class} \alias{MaskedDNAString} \alias{class:MaskedRNAString} \alias{MaskedRNAString-class} \alias{MaskedRNAString} \alias{class:MaskedAAString} \alias{MaskedAAString-class} \alias{MaskedAAString} % Accessor-like methods: \alias{unmasked} \alias{unmasked,MaskedXString-method} \alias{masks} \alias{masks,XString-method} \alias{masks,MaskedXString-method} \alias{length,MaskedXString-method} \alias{maskedwidth,MaskedXString-method} \alias{maskedratio,MaskedXString-method} \alias{nchar,MaskedXString-method} % Coercion: \alias{seqtype,MaskedXString-method} \alias{seqtype<-,MaskedXString-method} \alias{coerce,MaskedXString,MaskedBString-method} \alias{coerce,MaskedXString,MaskedDNAString-method} \alias{coerce,MaskedXString,MaskedRNAString-method} \alias{coerce,MaskedXString,MaskedAAString-method} \alias{coerce,BString,MaskedBString-method} \alias{coerce,DNAString,MaskedDNAString-method} \alias{coerce,RNAString,MaskedRNAString-method} \alias{coerce,AAString,MaskedAAString-method} \alias{coerce,MaskedBString,BString-method} \alias{coerce,MaskedDNAString,DNAString-method} \alias{coerce,MaskedRNAString,RNAString-method} \alias{coerce,MaskedAAString,AAString-method} \alias{coerce,MaskedXString,MaskCollection-method} \alias{coerce,MaskedXString,NormalIRanges-method} \alias{coerce,MaskedXString,XStringViews-method} \alias{coerce,MaskedXString,Views-method} % Other methods: \alias{collapse,MaskedXString-method} \alias{gaps,MaskedXString-method} \alias{subseq,MaskedXString-method} \alias{as.character,MaskedXString-method} \alias{toString,MaskedXString-method} \alias{show,MaskedXString-method} % "masks<-" methods: \alias{masks<-} \alias{masks<-,MaskedXString,NULL-method} \alias{masks<-,MaskedXString,MaskCollection-method} \alias{masks<-,XString,NULL-method} \alias{masks<-,XString,ANY-method} % "Views" method: \alias{Views,MaskedXString-method} \title{MaskedXString objects} \description{ The MaskedBString, MaskedDNAString, MaskedRNAString and MaskedAAString classes are containers for storing masked sequences. All those containers derive directly (and with no additional slots) from the MaskedXString virtual class. } \details{ In Biostrings, a pile of masks can be put on top of a sequence. A pile of masks is represented by a \link[IRanges:MaskCollection-class]{MaskCollection} object and the sequence by an \link{XString} object. A MaskedXString object is the result of bundling them together in a single object. Note that, no matter what masks are put on top of it, the original sequence is always stored unmodified in a MaskedXString object. This allows the user to activate/deactivate masks without having to worry about losing the information stored in the masked/unmasked regions. Also this allows efficient memory management since the original sequence never needs to be copied (modifying it would require to make a copy of it first - sequences cannot and should never be modified in place in Biostrings), even when the set of active/inactive masks changes. } \section{Accessor methods}{ In the code snippets below, \code{x} is a MaskedXString object. For \code{masks(x)} and \code{masks(x) <- y}, it can also be an \link{XString} object and \code{y} must be \code{NULL} or a \link[IRanges:MaskCollection-class]{MaskCollection} object. \describe{ \item{}{ \code{unmasked(x)}: Turns \code{x} into an \link{XString} object by dropping the masks. } \item{}{ \code{masks(x)}: Turns \code{x} into a \link[IRanges:MaskCollection-class]{MaskCollection} object by dropping the sequence. } \item{}{ \code{masks(x) <- y}: If \code{x} is an \link{XString} object and \code{y} is \code{NULL}, then this doesn't do anything. If \code{x} is an \link{XString} object and \code{y} is a \link[IRanges:MaskCollection-class]{MaskCollection} object, then this turns \code{x} into a MaskedXString object by putting the masks in \code{y} on top of it. If \code{x} is a MaskedXString object and \code{y} is \code{NULL}, then this is equivalent to \code{x <- unmasked(x)}. If \code{x} is a MaskedXString object and \code{y} is a \link[IRanges:MaskCollection-class]{MaskCollection} object, then this replaces the masks currently on top of \code{x} by the masks in \code{y}. } \item{}{ \code{alphabet(x)}: Equivalent to \code{alphabet(unmasked(x))}. See \code{?\link{alphabet}} for more information. } \item{}{ \code{length(x)}: Equivalent to \code{length(unmasked(x))}. See \code{?`\link[Biostrings:XString-class]{length,XString-method}`} for more information. } } } \section{"maskedwidth" and related methods}{ In the code snippets below, \code{x} is a MaskedXString object. \describe{ \item{}{ \code{maskedwidth(x)}: Get the number of masked letters in \code{x}. A letter is considered masked iff it's masked by at least one active mask. } \item{}{ \code{maskedratio(x)}: Equivalent to \code{maskedwidth(x) / length(x)}. } \item{}{ \code{nchar(x)}: Equivalent to \code{length(x) - maskedwidth(x)}. } } } \section{Coercion}{ In the code snippets below, \code{x} is a MaskedXString object. \describe{ \item{}{ \code{as(x, "Views")}: Turns \code{x} into a \link[IRanges]{Views} object where the views are the unmasked regions of the original sequence ("unmasked" means not masked by at least one active mask). } } } \section{Other methods}{ In the code snippets below, \code{x} is a MaskedXString object. \describe{ \item{}{ \code{collapse(x)}: Collapses the set of masks in \code{x} into a single mask made of all active masks. } \item{}{ \code{gaps(x)}: Reverses all the masks i.e. each mask is replaced by a mask where previously unmasked regions are now masked and previously masked regions are now unmasked. } } } \author{H. Pages} \seealso{ \itemize{ \item \code{\link{maskMotif}} \item \code{\link{injectHardMask}} \item \code{\link{alphabetFrequency}} \item \code{\link{reverseComplement}} \item \link{XString-class} \item \link[IRanges]{MaskCollection-class} \item \link[IRanges]{Views-class} } } \examples{ ## --------------------------------------------------------------------- ## A. MASKING BY POSITION ## --------------------------------------------------------------------- mask0 <- Mask(mask.width=29, start=c(3, 10, 25), width=c(6, 8, 5)) x <- DNAString("ACACAACTAGATAGNACTNNGAGAGACGC") length(x) # same as width(mask0) nchar(x) # same as length(x) masks(x) <- mask0 x length(x) # has not changed nchar(x) # has changed gaps(x) ## Prepare a MaskCollection object of 3 masks ('mymasks') by running the ## examples in the man page for these objects: example(MaskCollection, package="IRanges") ## Put it on 'x': masks(x) <- mymasks x alphabetFrequency(x) ## Deactivate all masks: active(masks(x)) <- FALSE x ## Activate mask "C": active(masks(x))["C"] <- TRUE x ## Turn MaskedXString object into a Views object: as(x, "Views") ## Drop the masks: masks(x) <- NULL x alphabetFrequency(x) ## --------------------------------------------------------------------- ## B. MASKING BY CONTENT ## --------------------------------------------------------------------- ## See ?maskMotif for masking by content } \keyword{methods} \keyword{classes} Biostrings/man/MultipleAlignment-class.Rd0000644000126300012640000003462112227063320022062 0ustar00biocbuildphs_compbio\name{MultipleAlignment-class} \docType{class} % Classes: \alias{class:MultipleAlignment} \alias{MultipleAlignment-class} \alias{MultipleAlignment} \alias{class:DNAMultipleAlignment} \alias{DNAMultipleAlignment-class} \alias{DNAMultipleAlignment} \alias{class:RNAMultipleAlignment} \alias{RNAMultipleAlignment-class} \alias{RNAMultipleAlignment} \alias{class:AAMultipleAlignment} \alias{AAMultipleAlignment-class} \alias{AAMultipleAlignment} % Accessor-like methods: \alias{unmasked,MultipleAlignment-method} \alias{rownames,MultipleAlignment-method} \alias{rownames<-,MultipleAlignment-method} \alias{rowmask} \alias{rowmask,MultipleAlignment-method} \alias{rowmask<-} \alias{rowmask<-,MultipleAlignment,NULL-method} \alias{rowmask<-,MultipleAlignment,NormalIRanges-method} \alias{rowmask<-,MultipleAlignment,ANY-method} \alias{colmask} \alias{colmask,MultipleAlignment-method} \alias{colmask<-} \alias{colmask<-,MultipleAlignment,NULL-method} \alias{colmask<-,MultipleAlignment,NormalIRanges-method} \alias{colmask<-,MultipleAlignment,ANY-method} \alias{maskMotif,MultipleAlignment,ANY-method} \alias{maskGaps} \alias{maskGaps,MultipleAlignment-method} \alias{nrow,MultipleAlignment-method} \alias{ncol,MultipleAlignment-method} \alias{dim,MultipleAlignment-method} \alias{maskednrow} \alias{maskednrow,MultipleAlignment-method} \alias{maskedncol} \alias{maskedncol,MultipleAlignment-method} \alias{maskeddim} \alias{maskeddim,MultipleAlignment-method} \alias{maskedratio,MultipleAlignment-method} \alias{nchar,MultipleAlignment-method} \alias{seqtype,MultipleAlignment-method} % Read functions: \alias{readDNAMultipleAlignment} \alias{readRNAMultipleAlignment} \alias{readAAMultipleAlignment} % Write functions: \alias{write.phylip} % Coercion: \alias{coerce,MultipleAlignment,DNAStringSet-method} \alias{coerce,MultipleAlignment,RNAStringSet-method} \alias{coerce,MultipleAlignment,AAStringSet-method} \alias{coerce,MultipleAlignment,BStringSet-method} \alias{coerce,character,DNAMultipleAlignment-method} \alias{coerce,character,RNAMultipleAlignment-method} \alias{coerce,character,AAMultipleAlignment-method} \alias{as.character,MultipleAlignment-method} \alias{as.matrix,MultipleAlignment-method} % Utilities: \alias{consensusMatrix,MultipleAlignment-method} \alias{consensusString,MultipleAlignment-method} \alias{consensusString,DNAMultipleAlignment-method} \alias{consensusString,RNAMultipleAlignment-method} \alias{consensusString,AAMultipleAlignment-method} \alias{consensusViews} \alias{consensusViews,MultipleAlignment-method} \alias{consensusViews,DNAMultipleAlignment-method} \alias{consensusViews,RNAMultipleAlignment-method} \alias{consensusViews,AAMultipleAlignment-method} \alias{alphabetFrequency,MultipleAlignment-method} % show style methods: \alias{show,MultipleAlignment-method} \alias{detail,MultipleAlignment-method} \title{MultipleAlignment objects} \description{ The MultipleAlignment class is a container for storing multiple sequence alignments. } \usage{ ## Constructors: DNAMultipleAlignment(x=character(), start=NA, end=NA, width=NA, use.names=TRUE, rowmask=NULL, colmask=NULL) RNAMultipleAlignment(x=character(), start=NA, end=NA, width=NA, use.names=TRUE, rowmask=NULL, colmask=NULL) AAMultipleAlignment(x=character(), start=NA, end=NA, width=NA, use.names=TRUE, rowmask=NULL, colmask=NULL) ## Read functions: readDNAMultipleAlignment(filepath, format) readRNAMultipleAlignment(filepath, format) readAAMultipleAlignment(filepath, format) ## Write funtions: write.phylip(x, filepath) ## ... and more (see below) } \arguments{ \item{x}{ Either a character vector (with no NAs), or an \link{XString}, \link{XStringSet} or \link{XStringViews} object containing strings with the same number of characters. If writing out a Phylip file, then x would be a \link{MultipleAlignment} object } \item{start,end,width}{ Either \code{NA}, a single integer, or an integer vector of the same length as \code{x} specifying how \code{x} should be "narrowed" (see \code{?\link[IRanges]{narrow}} in the \pkg{IRanges} package for the details). } \item{use.names}{ \code{TRUE} or \code{FALSE}. Should names be preserved? } \item{filepath}{ A character vector (of arbitrary length when reading, of length 1 when writing) containing the paths to the files to read or write. Note that special values like \code{""} or \code{"|cmd"} (typically supported by other I/O functions in R) are not supported here. Also \code{filepath} cannot be a connection. } \item{format}{ Either \code{"fasta"} (the default), \code{stockholm}, or \code{"clustal"}. } \item{rowmask}{ a NormalIRanges object that will set masking for rows } \item{colmask}{ a NormalIRanges object that will set masking for columns } } \details{ The MultipleAlignment class is designed to hold and represent multiple sequence alignments. The rows and columns within an alignment can be masked for ad hoc analyses. } \section{Accessor methods}{ In the code snippets below, \code{x} is a MultipleAlignment object. \describe{ \item{}{ \code{unmasked(x)}: The underlying \link{XStringSet} object containing the multiple sequence alignment. } \item{}{ \code{rownames(x)}: \code{NULL} or a character vector of the same length as \code{x} containing a short user-provided description or comment for each sequence in \code{x}. } \item{}{ \code{rowmask(x)}, \code{rowmask(x, append, invert) <- value}: Gets and sets the \link{NormalIRanges} object representing the masked rows in \code{x}. The \code{append} argument takes \code{union}, \code{replace} or \code{intersect} to indicate how to combine the new \code{value} with \code{rowmask(x)}. The \code{invert} argument takes a logical argument to indicate whether or not to invert the new mask. The \code{value} argument can be of any class that is coercible to a \link{NormalIRanges} via the \code{as} function. } \item{}{ \code{colmask(x)}, \code{colmask(x, append, invert) <- value}: Gets and sets the \link{NormalIRanges} object representing the masked columns in \code{x}. The \code{append} argument takes \code{union}, \code{replace} or \code{intersect} to indicate how to combine the new \code{value} with \code{colmask(x)}. The \code{invert} argument takes a logical argument to indicate whether or not to invert the new mask. The \code{value} argument can be of any class that is coercible to a \link{NormalIRanges} via the \code{as} function. } \item{}{ \code{maskMotif(x, motif, min.block.width=1, ...)}: Returns a MultipleAlignment object with a modified column mask based upon motifs found in the consensus string where the consensus string keeps all the columns but drops the masked rows. \describe{ \item{motif}{The motif to mask.} \item{min.block.width}{The minimum width of the blocks to mask.} \item{...}{Additional arguments for \code{matchPattern}.} } } \item{}{ \code{maskGaps(x, min.fraction, min.block.width)}: Returns a MultipleAlignment object with a modified column mask based upon gaps in the columns. In particular, this mask is defined by \code{min.block.width} or more consecutive columns that have \code{min.fraction} or more of their non-masked rows containing gap codes. \describe{ \item{min.fraction}{A value in \code{[0, 1]} that indicates the minimum fraction needed to call a gap in the consensus string (default is \code{0.5}).} \item{min.block.width}{A positive integer that indicates the minimum number of consecutive gaps to mask, as defined by \code{min.fraction} (default is \code{4}).} } } \item{}{ \code{nrow(x)}: Returns the number of sequences aligned in \code{x}. } \item{}{ \code{ncol(x)}: Returns the number of characters for each alignment in \code{x}. } \item{}{ \code{dim(x)}: Equivalent to \code{c(nrow(x), ncol(x))}. } \item{}{ \code{maskednrow(x)}: Returns the number of masked aligned sequences in \code{x}. } \item{}{ \code{maskedncol(x)}: Returns the number of masked aligned characters in \code{x}. } \item{}{ \code{maskeddim(x)}: Equivalent to \code{c(maskednrow(x), maskedncol(x))}. } \item{}{ \code{maskedratio(x)}: Equivalent to \code{maskeddim(x) / dim(x)}. } \item{}{ \code{nchar(x)}: Returns the number of unmasked aligned characters in \code{x}, i.e. \code{ncol(x) - maskedncol(x)}. } \item{}{ \code{alphabet(x)}: Equivalent to \code{alphabet(unmasked(x))}. } } } \section{Coercion}{ In the code snippets below, \code{x} is a MultipleAlignment object. \describe{ \item{}{ \code{as(from, "DNAStringSet")}, \code{as(from, "RNAStringSet")}, \code{as(from, "AAStringSet")}, \code{as(from, "BStringSet")}: Creates an instance of the specified \link{XStringSet} object subtype that contains the unmasked regions of the multiple sequence alignment in \code{x}. } \item{}{ \code{as.character(x, use.names)}: Convert \code{x} to a character vector containing the unmasked regions of the multiple sequence alignment. \code{use.names} controls whether or not \code{rownames(x)} should be used to set the names of the returned vector (default is \code{TRUE}). } \item{}{ \code{as.matrix(x, use.names)}: Returns a character matrix containing the "exploded" representation of the unmasked regions of the multiple sequence alignment. \code{use.names} controls whether or not \code{rownames(x)} should be used to set the row names of the returned matrix (default is \code{TRUE}). } } } \section{Utilities}{ In the code snippets below, x is a MultipleAlignment object. \describe{ \item{}{ \code{consensusMatrix(x, as.prob, baseOnly)}: Creates an integer matrix containing the column frequencies of the underlying alphabet with masked columns being represented with \code{NA} values. If \code{as.prob} is \code{TRUE}, then probabilities are reported, otherwise counts are reported (the default). If \code{baseOnly} is \code{TRUE}, then the non-base letters are collapsed into an \code{"other"} category. } \item{}{ \code{consensusString(x, ...)}: Creates a consensus string for \code{x} with the symbol \code{"#"} representing a masked column. See \code{\link{consensusString}} for details on the arguments. } \item{}{ \code{consensusViews(x, ...)}: Similar to the \code{consensusString} method. It returns a \link{XStringViews} on the consensus string containing subsequence contigs of non-masked columns. Unlike the \code{consensusString} method, the masked columns in the underlying string contain a consensus value rather than the \code{"#"} symbol. } \item{}{ \code{alphabetFrequency(x, as.prob, collapse)}: Creates an integer matrix containing the row frequencies of the underlying alphabet. If \code{as.prob} is \code{TRUE}, then probabilities are reported, otherwise counts are reported (the default). If \code{collapse} is \code{TRUE}, then returns the overall frequency instead of the frequency by row. } \item{}{ \code{detail(x, invertColMask, hideMaskedCols)}: Allows for a full pager driven display of the object so that masked cols and rows can be removed and the entire sequence can be visually inspected. If \code{hideMaskedCols} is set to it's default value of \code{TRUE} then the output will hide all the the masked columns in the output. Otherwise, all columns will be displayed along with a row to indicate the masking status. If \code{invertColMask} is \code{TRUE} then any displayed mask will be flipped so as to represent things in a way consistent with Phylip style files instead of the mask that is actually stored in the \code{MultipleAlignment} object. Please notice that \code{invertColMask} will be ignored if \code{hideMaskedCols} is set to its default value of \code{TRUE} since in that case it will not make sense to show any masking information in the output. Masked rows are always hidden in the output. } } } \author{P. Aboyoun and M. Carlson} \seealso{ \link{XStringSet-class}, \link{MaskedXString-class} } \examples{ ## create an object from file origMAlign <- readDNAMultipleAlignment(filepath = system.file("extdata", "msx2_mRNA.aln", package="Biostrings"), format="clustal") ## list the names of the sequences in the alignment rownames(origMAlign) ## rename the sequences to be the underlying species for MSX2 rownames(origMAlign) <- c("Human","Chimp","Cow","Mouse","Rat", "Dog","Chicken","Salmon") origMAlign ## See a detailed pager view if (interactive()) { detail(origMAlign) } ## operations to mask rows ## For columns, just use colmask() and do the same kinds of operations rowMasked <- origMAlign rowmask(rowMasked) <- IRanges(start=1,end=3) rowMasked ## remove rowumn masks rowmask(rowMasked) <- NULL rowMasked ## "select" rows of interest rowmask(rowMasked, invert=TRUE) <- IRanges(start=4,end=7) rowMasked ## or mask the rows that intersect with masked rows rowmask(rowMasked, append="intersect") <- IRanges(start=1,end=5) rowMasked ## TATA-masked tataMasked <- maskMotif(origMAlign, "TATA") colmask(tataMasked) ## automatically mask rows based on consecutive gaps autoMasked <- maskGaps(origMAlign, min.fraction=0.5, min.block.width=4) colmask(autoMasked) autoMasked ## calculate frequencies alphabetFrequency(autoMasked) consensusMatrix(autoMasked, baseOnly=TRUE)[, 84:90] ## get consensus values consensusString(autoMasked) consensusViews(autoMasked) ## cluster the masked alignments sdist <- stringDist(as(autoMasked,"DNAStringSet"), method="hamming") clust <- hclust(sdist, method = "single") plot(clust) fourgroups <- cutree(clust, 4) fourgroups ## write out the alignement object (with current masks) to Phylip format write.phylip(x = autoMasked, filepath = tempfile("foo.txt",tempdir())) } \keyword{methods} \keyword{classes} Biostrings/man/PDict-class.Rd0000644000126300012640000002655112227063320017436 0ustar00biocbuildphs_compbio\name{PDict-class} \docType{class} % PreprocessedTB class: \alias{class:PreprocessedTB} \alias{PreprocessedTB-class} \alias{PreprocessedTB} \alias{length,PreprocessedTB-method} \alias{width,PreprocessedTB-method} \alias{tb} \alias{tb,PreprocessedTB-method} \alias{tb.width} \alias{tb.width,PreprocessedTB-method} \alias{nnodes} \alias{hasAllFlinks} \alias{computeAllFlinks} \alias{initialize,PreprocessedTB-method} \alias{duplicated,PreprocessedTB-method} % Twobit class: \alias{class:Twobit} \alias{Twobit-class} \alias{Twobit} \alias{show,Twobit-method} \alias{initialize,Twobit-method} % ACtree2 class: \alias{class:ACtree2} \alias{ACtree2-class} \alias{ACtree2} \alias{nnodes,ACtree2-method} \alias{hasAllFlinks,ACtree2-method} \alias{computeAllFlinks,ACtree2-method} \alias{show,ACtree2-method} \alias{initialize,ACtree2-method} % PDict3Parts class: \alias{class:PDict3Parts} \alias{PDict3Parts-class} \alias{PDict3Parts} \alias{length,PDict3Parts-method} \alias{width,PDict3Parts-method} \alias{head,PDict3Parts-method} \alias{tb,PDict3Parts-method} \alias{tb.width,PDict3Parts-method} \alias{tail,PDict3Parts-method} % PDict class: \alias{class:PDict} \alias{PDict-class} \alias{length,PDict-method} \alias{width,PDict-method} \alias{names,PDict-method} \alias{names<-,PDict-method} \alias{[[,PDict-method} \alias{duplicated,PDict-method} \alias{patternFrequency} \alias{patternFrequency,PDict-method} % TB_PDict class: \alias{class:TB_PDict} \alias{TB_PDict-class} \alias{TB_PDict} \alias{head,TB_PDict-method} \alias{tb,TB_PDict-method} \alias{tb.width,TB_PDict-method} \alias{tail,TB_PDict-method} \alias{show,TB_PDict-method} % MTB_PDict class: \alias{class:MTB_PDict} \alias{MTB_PDict-class} \alias{MTB_PDict} \alias{as.list,MTB_PDict-method} \alias{show,MTB_PDict-method} % Expanded_TB_PDict class: \alias{class:Expanded_TB_PDict} \alias{Expanded_TB_PDict-class} \alias{Expanded_TB_PDict} % PDict() constructor: \alias{PDict} \alias{PDict,character-method} \alias{PDict,DNAStringSet-method} \alias{PDict,XStringViews-method} \alias{PDict,AsIs-method} \alias{PDict,probetable-method} \title{PDict objects} \description{ The PDict class is a container for storing a preprocessed dictionary of DNA patterns that can later be passed to the \code{\link{matchPDict}} function for fast matching against a reference sequence (the subject). \code{PDict} is the constructor function for creating new PDict objects. } \usage{ PDict(x, max.mismatch=NA, tb.start=NA, tb.end=NA, tb.width=NA, algorithm="ACtree2", skip.invalid.patterns=FALSE) } \arguments{ \item{x}{ A character vector, a \link{DNAStringSet} object or an \link{XStringViews} object with a \link{DNAString} subject. } \item{max.mismatch}{ A single non-negative integer or \code{NA}. See the "Allowing a small number of mismatching letters" section below. } \item{tb.start,tb.end,tb.width}{ A single integer or \code{NA}. See the "Trusted Band" section below. } \item{algorithm}{ \code{"ACtree2"} (the default) or \code{"Twobit"}. } \item{skip.invalid.patterns}{ This argument is not supported yet (and might in fact be replaced by the \code{filter} argument very soon). } } \details{ THIS IS STILL WORK IN PROGRESS! If the original dictionary \code{x} is a character vector or an \link{XStringViews} object with a \link{DNAString} subject, then the \code{PDict} constructor will first try to turn it into a \link{DNAStringSet} object. By default (i.e. if \code{PDict} is called with \code{max.mismatch=NA}, \code{tb.start=NA}, \code{tb.end=NA} and \code{tb.width=NA}) the following limitations apply: (1) the original dictionary can only contain base letters (i.e. only As, Cs, Gs and Ts), therefore IUPAC ambiguity codes are not allowed; (2) all the patterns in the dictionary must have the same length ("constant width" dictionary); and (3) later \code{matchPdict} can only be used with \code{max.mismatch=0}. A Trusted Band can be used in order to relax these limitations (see the "Trusted Band" section below). If you are planning to use the resulting \code{PDict} object in order to do inexact matching where valid hits are allowed to have a small number of mismatching letters, then see the "Allowing a small number of mismatching letters" section below. Two preprocessing algorithms are currently supported: \code{algorithm="ACtree2"} (the default) and \code{algorithm="Twobit"}. With the \code{"ACtree2"} algorithm, all the oligonucleotides in the Trusted Band are stored in a 4-ary Aho-Corasick tree. With the \code{"Twobit"} algorithm, the 2-bit-per-letter signatures of all the oligonucleotides in the Trusted Band are computed and the mapping from these signatures to the 1-based position of the corresponding oligonucleotide in the Trusted Band is stored in a way that allows very fast lookup. Only PDict objects preprocessed with the \code{"ACtree2"} algo can then be used with \code{matchPdict} (and family) and with \code{fixed="pattern"} (instead of \code{fixed=TRUE}, the default), so that IUPAC ambiguity codes in the subject are treated as ambiguities. PDict objects obtained with the \code{"Twobit"} algo don't allow this. See \code{?`\link{matchPDict-inexact}`} for more information about support of IUPAC ambiguity codes in the subject. } \section{Trusted Band}{ What's a Trusted Band? A Trusted Band is a region defined in the original dictionary where the limitations described above will apply. Why use a Trusted Band? Because the limitations described above will apply to the Trusted Band only! For example the Trusted Band cannot contain IUPAC ambiguity codes but the "head" and the "tail" can (see below for what those are). Also with a Trusted Band, if \code{matchPdict} is called with a non-null \code{max.mismatch} value then mismatching letters will be allowed in the head and the tail. Or, if \code{matchPdict} is called with \code{fixed="subject"}, then IUPAC ambiguity codes in the head and the tail will be treated as ambiguities. How to specify a Trusted Band? Use the \code{tb.start}, \code{tb.end} and \code{tb.width} arguments of the \code{PDict} constructor in order to specify a Trusted Band. This will divide each pattern in the original dictionary into three parts: a left part, a middle part and a right part. The middle part is defined by its starting and ending nucleotide positions given relatively to each pattern thru the \code{tb.start}, \code{tb.end} and \code{tb.width} arguments. It must have the same length for all patterns (this common length is called the width of the Trusted Band). The left and right parts are defined implicitely: they are the parts that remain before (prefix) and after (suffix) the middle part, respectively. Therefore three \link{DNAStringSet} objects result from this division: the first one is made of all the left parts and forms the head of the PDict object, the second one is made of all the middle parts and forms the Trusted Band of the PDict object, and the third one is made of all the right parts and forms the tail of the PDict object. In other words you can think of the process of specifying a Trusted Band as drawing 2 vertical lines on the original dictionary (note that these 2 lines are not necessarily straight lines but the horizontal space between them must be constant). When doing this, you are dividing the dictionary into three regions (from left to right): the head, the Trusted Band and the tail. Each of them is a \link{DNAStringSet} object with the same number of elements than the original dictionary and the original dictionary could easily be reconstructed from those three regions. The width of the Trusted Band must be >= 1 because Trusted Bands of width 0 are not supported. Finally note that calling \code{PDict} with \code{tb.start=NA}, \code{tb.end=NA} and \code{tb.width=NA} (the default) is equivalent to calling it with \code{tb.start=1}, \code{tb.end=-1} and \code{tb.width=NA}, which results in a full-width Trusted Band i.e. a Trusted Band that covers the entire dictionary (no head and no tail). } \section{Allowing a small number of mismatching letters}{ [TODO] } \section{Accessor methods}{ In the code snippets below, \code{x} is a PDict object. \describe{ \item{}{ \code{length(x)}: The number of patterns in \code{x}. } \item{}{ \code{width(x)}: A vector of non-negative integers containing the number of letters for each pattern in \code{x}. } \item{}{ \code{names(x)}: The names of the patterns in \code{x}. } \item{}{ \code{head(x)}: The head of \code{x} or \code{NULL} if \code{x} has no head. } \item{}{ \code{tb(x)}: The Trusted Band defined on \code{x}. } \item{}{ \code{tb.width(x)}: The width of the Trusted Band defined on \code{x}. Note that, unlike \code{width(tb(x))}, this is a single integer. And because the Trusted Band has a constant width, \code{tb.width(x)} is in fact equivalent to \code{unique(width(tb(x)))}, or to \code{width(tb(x))[1]}. } \item{}{ \code{tail(x)}: The tail of \code{x} or \code{NULL} if \code{x} has no tail. } } } \section{Subsetting methods}{ In the code snippets below, \code{x} is a PDict object. \describe{ \item{}{ \code{x[[i]]}: Extract the i-th pattern from \code{x} as a \link{DNAString} object. } } } \section{Other methods}{ In the code snippet below, \code{x} is a PDict object. \describe{ \item{}{ \code{duplicated(x)}: [TODO] } \item{}{ \code{patternFrequency(x)}: [TODO] } } } \author{H. Pages} \references{ Aho, Alfred V.; Margaret J. Corasick (June 1975). "Efficient string matching: An aid to bibliographic search". Communications of the ACM 18 (6): 333-340. } \seealso{ \code{\link{matchPDict}}, \code{\link{DNA_ALPHABET}}, \code{\link{IUPAC_CODE_MAP}}, \link{DNAStringSet-class}, \link{XStringViews-class} } \examples{ ## --------------------------------------------------------------------- ## A. NO HEAD AND NO TAIL (THE DEFAULT) ## --------------------------------------------------------------------- library(drosophila2probe) dict0 <- DNAStringSet(drosophila2probe) dict0 # The original dictionary. length(dict0) # Hundreds of thousands of patterns. unique(nchar(dict0)) # Patterns are 25-mers. pdict0 <- PDict(dict0) # Store the original dictionary in # a PDict object (preprocessing). pdict0 class(pdict0) length(pdict0) # Same as length(dict0). tb.width(pdict0) # The width of the (implicit) # Trusted Band. sum(duplicated(pdict0)) table(patternFrequency(pdict0)) # 9 patterns are repeated 3 times. pdict0[[1]] pdict0[[5]] ## --------------------------------------------------------------------- ## B. NO HEAD AND A TAIL ## --------------------------------------------------------------------- dict1 <- c("ACNG", "GT", "CGT", "AC") pdict1 <- PDict(dict1, tb.end=2) pdict1 class(pdict1) length(pdict1) width(pdict1) head(pdict1) tb(pdict1) tb.width(pdict1) width(tb(pdict1)) tail(pdict1) pdict1[[3]] } \keyword{methods} \keyword{classes} Biostrings/man/PairwiseAlignments-class.Rd0000644000126300012640000002713012227063320022232 0ustar00biocbuildphs_compbio\name{PairwiseAlignments-class} \docType{class} % Classes \alias{class:PairwiseAlignments} \alias{PairwiseAlignments-class} \alias{PairwiseAlignments} \alias{class:PairwiseAlignmentsSingleSubject} \alias{PairwiseAlignmentsSingleSubject-class} \alias{PairwiseAlignmentsSingleSubject} \alias{class:PairwiseAlignmentsSingleSubjectSummary} \alias{PairwiseAlignmentsSingleSubjectSummary-class} \alias{PairwiseAlignmentsSingleSubjectSummary} % Constructor-like functions and generics: \alias{PairwiseAlignments,XString,XString-method} \alias{PairwiseAlignments,XStringSet,missing-method} \alias{PairwiseAlignments,character,missing-method} \alias{PairwiseAlignments,character,character-method} \alias{PairwiseAlignmentsSingleSubject,XString,XString-method} \alias{PairwiseAlignmentsSingleSubject,XStringSet,missing-method} \alias{PairwiseAlignmentsSingleSubject,character,missing-method} \alias{PairwiseAlignmentsSingleSubject,character,character-method} % Accessor methods: \alias{pattern,PairwiseAlignments-method} \alias{subject,PairwiseAlignments-method} \alias{type} \alias{type,PairwiseAlignments-method} \alias{score,PairwiseAlignments-method} \alias{insertion,PairwiseAlignments-method} \alias{deletion,PairwiseAlignments-method} \alias{indel,PairwiseAlignments-method} \alias{nindel,PairwiseAlignments-method} \alias{length,PairwiseAlignments-method} \alias{nchar,PairwiseAlignments-method} \alias{seqtype,PairwiseAlignments-method} % Standard generic methods: \alias{show,PairwiseAlignments-method} \alias{[,PairwiseAlignments-method} \alias{[<-,PairwiseAlignments-method} \alias{rep,PairwiseAlignments-method} % Methods for PairwiseAlignmentsSingleSubject: \alias{summary,PairwiseAlignmentsSingleSubject-method} \alias{Views,PairwiseAlignmentsSingleSubject-method} \alias{aligned,PairwiseAlignmentsSingleSubject-method} \alias{as.character,PairwiseAlignmentsSingleSubject-method} \alias{toString,PairwiseAlignmentsSingleSubject-method} \alias{as.matrix,PairwiseAlignmentsSingleSubject-method} % Methods for PairwiseAlignmentsSingleSubjectSummary: \alias{type,PairwiseAlignmentsSingleSubjectSummary-method} \alias{score,PairwiseAlignmentsSingleSubjectSummary-method} \alias{nindel,PairwiseAlignmentsSingleSubjectSummary-method} \alias{length,PairwiseAlignmentsSingleSubjectSummary-method} \alias{nchar,PairwiseAlignmentsSingleSubjectSummary-method} \alias{show,PairwiseAlignmentsSingleSubjectSummary-method} \title{PairwiseAlignments, PairwiseAlignmentsSingleSubject, and PairwiseAlignmentsSingleSubjectSummary objects} \description{ The \code{PairwiseAlignments} class is a container for storing a set of pairwise alignments. The \code{PairwiseAlignmentsSingleSubject} class is a container for storing a set of pairwise alignments with a single subject. The \code{PairwiseAlignmentsSingleSubjectSummary} class is a container for storing the summary of a set of pairwise alignments. } \usage{ ## Constructors: ## When subject is missing, pattern must be of length 2 \S4method{PairwiseAlignments}{XString,XString}(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1) \S4method{PairwiseAlignments}{XStringSet,missing}(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1) \S4method{PairwiseAlignments}{character,character}(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, baseClass = "BString") \S4method{PairwiseAlignments}{character,missing}(pattern, subject, type = "global", substitutionMatrix = NULL, gapOpening = 0, gapExtension = -1, baseClass = "BString") } \arguments{ \item{pattern}{a character vector of length 1 or 2, an \code{\link{XString}}, or an \code{\link{XStringSet}} object of length 1 or 2.} \item{subject}{a character vector of length 1 or an \code{\link{XString}} object.} \item{type}{type of alignment. One of \code{"global"}, \code{"local"}, \code{"overlap"}, \code{"global-local"}, and \code{"local-global"} where \code{"global"} = align whole strings with end gap penalties, \code{"local"} = align string fragments, \code{"overlap"} = align whole strings without end gap penalties, \code{"global-local"} = align whole strings in \code{pattern} with consecutive subsequence of \code{subject}, \code{"local-global"} = align consecutive subsequence of \code{pattern} with whole strings in \code{subject}.} \item{substitutionMatrix}{substitution matrix for the alignment. If NULL, the diagonal values and off-diagonal values are set to 0 and 1 respectively.} \item{gapOpening}{the cost for opening a gap in the alignment.} \item{gapExtension}{the incremental cost incurred along the length of the gap in the alignment.} \item{baseClass}{the base \code{\link{XString}} class to use in the alignment.} } \details{ Before we define the notion of alignment, we introduce the notion of "filled-with-gaps subsequence". A "filled-with-gaps subsequence" of a string string1 is obtained by inserting 0 or any number of gaps in a subsequence of s1. For example L-A--ND and A--N-D are "filled-with-gaps subsequences" of LAND. An alignment between two strings string1 and string2 results in two strings (align1 and align2) that have the same length and are "filled-with-gaps subsequences" of string1 and string2. For example, this is an alignment between LAND and LEAVES: \preformatted{ L-A LEA } An alignment can be seen as a compact representation of one set of basic operations that transforms string1 into align1. There are 3 different kinds of basic operations: "insertions" (gaps in align1), "deletions" (gaps in align2), "replacements". The above alignment represents the following basic operations: \preformatted{ insert E at pos 2 insert V at pos 4 insert E at pos 5 replace by S at pos 6 (N is replaced by S) delete at pos 7 (D is deleted) } Note that "insert X at pos i" means that all letters at a position >= i are moved 1 place to the right before X is actually inserted. There are many possible alignments between two given strings string1 and string2 and a common problem is to find the one (or those ones) with the highest score, i.e. with the lower total cost in terms of basic operations. } \section{Object extraction methods}{ In the code snippets below, \code{x} is a \code{PairwiseAlignments} object, except otherwise noted. \describe{ \item{}{ \code{pattern(x)}: The \code{AlignedXStringSet} object for the pattern. } \item{}{ \code{subject(x)}: The \code{AlignedXStringSet} object for the subject. } \item{}{ \code{summary(object, ...)}: Generates a summary for the \code{PairwiseAlignments}. } } } \section{General information methods}{ In the code snippets below, \code{x} is a \code{PairwiseAlignments} object, except otherwise noted. \describe{ \item{}{ \code{alphabet(x)}: Equivalent to \code{alphabet(unaligned(subject(x)))}. } \item{}{ \code{length(x)}: The length of the \code{aligned(pattern(x))} and \code{aligned(subject(x))}. There is a method for \code{PairwiseAlignmentsSingleSubjectSummary} as well. } \item{}{ \code{type(x)}: The type of the alignment (\code{"global"}, \code{"local"}, \code{"overlap"}, \code{"global-local"}, or \code{"local-global"}). There is a method for \code{PairwiseAlignmentsSingleSubjectSummary} as well. } } } \section{Aligned sequence methods}{ In the code snippets below, \code{x} is a \code{PairwiseAlignmentsSingleSubject} object, except otherwise noted. \describe{ \item{}{ \code{aligned(x, degap = FALSE, gapCode="-", endgapCode="-")}: If \code{degap = FALSE}, "align" the alignments by returning an \code{XStringSet} object containing the aligned patterns without insertions. If \code{degap = TRUE}, returns \code{aligned(pattern(x), degap=TRUE)}. The \code{gapCode} and \code{endgapCode} arguments denote the code in the appropriate \code{\link{alphabet}} to use for the internal and end gaps. } \item{}{ \code{as.character(x)}: Converts \code{aligned(x)} to a character vector. } \item{}{ \code{as.matrix(x)}: Returns an "exploded" character matrix representation of \code{aligned(x)}. } \item{}{ \code{toString(x)}: Equivalent to \code{toString(as.character(x))}. } } } \section{Subject position methods}{ In the code snippets below, \code{x} is a \code{PairwiseAlignmentsSingleSubject} object, except otherwise noted. \describe{ \item{}{ \code{consensusMatrix(x, as.prob=FALSE, baseOnly=FALSE, gapCode="-", endgapCode="-")} See `\link{consensusMatrix}` for more information. } \item{}{ \code{consensusString(x)} See `\link{consensusString}` for more information. } \item{}{ \code{coverage(x, shift=0L, width=NULL, weight=1L)} See `\link{coverage,PairwiseAlignmentsSingleSubject-method}` for more information. } \item{}{ \code{Views(subject, start=NULL, end=NULL, width=NULL, names=NULL)}: The \code{XStringViews} object that represents the pairwise alignments along \code{unaligned(subject(subject))}. The \code{start} and \code{end} arguments must be either \code{NULL}/\code{NA} or an integer vector of length 1 that denotes the offset from \code{start(subject(subject))}. } } } \section{Numeric summary methods}{ In the code snippets below, \code{x} is a \code{PairwiseAlignments} object, except otherwise noted. \describe{ \item{}{ \code{nchar(x)}: The nchar of the \code{aligned(pattern(x))} and \code{aligned(subject(x))}. There is a method for \code{PairwiseAlignmentsSingleSubjectSummary} as well. } \item{}{ \code{insertion(x)}: An \code{\link[IRanges:IRangesList-class]{CompressedIRangesList}} object containing the locations of the insertions from the perspective of the \code{pattern}. } \item{}{ \code{deletion(x)}: An \code{\link[IRanges:IRangesList-class]{CompressedIRangesList}} object containing the locations of the deletions from the perspective of the \code{pattern}. } \item{}{ \code{indel(x)}: An \code{InDel} object containing the locations of the insertions and deletions from the perspective of the \code{pattern}. } \item{}{ \code{nindel(x)}: An \code{InDel} object containing the number of insertions and deletions. } \item{}{ \code{score(x)}: The score of the alignment. There is a method for \code{PairwiseAlignmentsSingleSubjectSummary} as well. } } } \section{Subsetting methods}{ \describe{ \item{}{ \code{x[i]}: Returns a new \code{PairwiseAlignments} object made of the selected elements. } \item{}{ \code{rep(x, times)}: Returns a new \code{PairwiseAlignments} object made of the repeated elements. } } } \author{P. Aboyoun} \seealso{ \code{\link{pairwiseAlignment}}, \code{\link{writePairwiseAlignments}}, \link{AlignedXStringSet-class}, \link{XString-class}, \link{XStringViews-class}, \link{align-utils}, \code{\link{pid}} } \examples{ PairwiseAlignments("-PA--W-HEAE", "HEAGAWGHE-E") pattern <- AAStringSet(c("HLDNLKGTF", "HVDDMPNAL")) subject <- AAString("SMDDTEKMSMKL") nw1 <- pairwiseAlignment(pattern, subject, substitutionMatrix = "BLOSUM50", gapOpening = -3, gapExtension = -1) pattern(nw1) subject(nw1) aligned(nw1) as.character(nw1) as.matrix(nw1) nchar(nw1) score(nw1) nw1 } \keyword{methods} \keyword{classes} Biostrings/man/PairwiseAlignments-io.Rd0000644000126300012640000001337412227063320021541 0ustar00biocbuildphs_compbio\name{PairwiseAlignments-io} \alias{PairwiseAlignments-io} \alias{writePairwiseAlignments} \title{Write a PairwiseAlignments object to a file} \description{ The \code{writePairwiseAlignments} function writes a \link{PairwiseAlignments} object to a file. Only the "pair" format is supported at the moment. } \usage{ writePairwiseAlignments(x, file="", Matrix=NA, block.width=50) } \arguments{ \item{x}{ A \link{PairwiseAlignments} object, typically returned by the \code{\link{pairwiseAlignment}} function. } \item{file}{ A connection, or a character string naming the file to print to. If \code{""} (the default), \code{writePairwiseAlignments} prints to the standard output connection (aka the console) unless redirected by \code{sink}. If it is \code{"|cmd"}, the output is piped to the command given by \code{cmd}, by opening a pipe connection. } \item{Matrix}{ A single string containing the name of the substitution matrix (e.g. \code{"BLOSUM50"}) used for the alignment. See the \code{substitutionMatrix} argument of the \code{\link{pairwiseAlignment}} function for the details. See \code{?\link{substitution.matrices}} for a list of predefined substitution matrices available in the Biostrings package. } \item{block.width}{ A single integer specifying the maximum number of sequence letters (including the "-" letter, which represents gaps) per line. } } \details{ The "pair" format is one of the numerous pairwise sequence alignment formats supported by the EMBOSS software. See \url{http://emboss.sourceforge.net/docs/themes/AlignFormats.html} for a brief (and rather informal) description of this format. } \note{ This brief description of the "pair" format suggests that it is best suited for \emph{global} pairwise alignments, because, in that case, the original pattern and subject sequences can be inferred (by just removing the gaps). However, even though the "pair" format can also be used for non global pairwise alignments (i.e. for \emph{global-local}, \emph{local-global}, and \emph{local} pairwise alignments), in that case the original pattern and subject sequences \emph{cannot} be inferred. This is because the alignment written to the file doesn't necessarily span the entire pattern (if \code{type(x)} is \code{local-global} or \code{local}) or the entire subject (if \code{type(x)} is \code{global-local} or \code{local}). As a consequence, the \code{writePairwiseAlignments} function can be used on a \link{PairwiseAlignments} object \code{x} containing non global alignments (i.e. with \code{type(x) != "global"}), but with the 2 following caveats: \enumerate{ \item The type of the alignments (\code{type(x)}) is not written to the file. \item The original pattern and subject sequences cannot be inferred. Furthermore, there is no way to infer their lengths (because we don't know whether they were trimmed or not). } Also note that the \code{\link{pairwiseAlignment}} function interprets the \code{gapOpening} and \code{gapExtension} arguments differently than most other alignment tools. As a consequence the values of the Gap_penalty and Extend_penalty fields written to the file are not the same as the values that were passed to the \code{gapOpening} and \code{gapExtension} arguments. With the following relationship: \itemize{ \item Gap_penalty = - gapOpening - gapExtension \item Extend_penalty = - gapExtension } } \author{ H. Pages } \references{ \url{http://emboss.sourceforge.net/docs/themes/AlignFormats.html} } \seealso{ \itemize{ \item \code{\link{pairwiseAlignment}} \item \link{PairwiseAlignments-class} \item \link{substitution.matrices} } } \examples{ ## --------------------------------------------------------------------- ## A. WITH ONE PAIR ## --------------------------------------------------------------------- pattern <- DNAString("CGTACGTAACGTTCGT") subject <- DNAString("CGTCGTCGTCCGTAA") x1 <- pairwiseAlignment(pattern, subject) x1 writePairwiseAlignments(x1) writePairwiseAlignments(x1, block.width=10) ## The 2 bottom-right numbers (16 and 15) are the lengths of ## the original pattern and subject, respectively. x2 <- pairwiseAlignment(pattern, subject, type="global-local") x2 # score is different! writePairwiseAlignments(x2) ## By just looking at the file, we can't tell the length of the ## original subject! Could be 13, could be more... ## --------------------------------------------------------------------- ## B. WITH MORE THAN ONE PAIR (AND NAMED PATTERNS) ## --------------------------------------------------------------------- pattern <- DNAStringSet(c(myp1="ACCA", myp2="ACGCA", myp3="ACGGCA")) x3 <- pairwiseAlignment(pattern, subject) x3 writePairwiseAlignments(x3) ## --------------------------------------------------------------------- ## C. REPRODUCING THE ALIGNMENT SHOWN AT ## http://emboss.sourceforge.net/docs/themes/alnformats/align.pair ## --------------------------------------------------------------------- pattern <- c("TSPASIRPPAGPSSRPAMVSSRRTRPSPPGPRRPTGRPCCSAAPRRPQAT", "GGWKTCSGTCTTSTSTRHRGRSGWSARTTTAACLRASRKSMRAACSRSAG", "SRPNRFAPTLMSSCITSTTGPPAWAGDRSHE") subject <- c("TSPASIRPPAGPSSRRPSPPGPRRPTGRPCCSAAPRRPQATGGWKTCSGT", "CTTSTSTRHRGRSGWRASRKSMRAACSRSAGSRPNRFAPTLMSSCITSTT", "GPPAWAGDRSHE") pattern <- unlist(AAStringSet(pattern)) subject <- unlist(AAStringSet(subject)) pattern # original pattern subject # original subject data(BLOSUM62) x4 <- pairwiseAlignment(pattern, subject, substitutionMatrix=BLOSUM62, gapOpening=-9.5, gapExtension=-0.5) x4 writePairwiseAlignments(x4, Matrix="BLOSUM62") } \keyword{utilities} \keyword{manip} Biostrings/man/QualityScaledXStringSet-class.Rd0000644000126300012640000000740412227063320023166 0ustar00biocbuildphs_compbio\name{QualityScaledXStringSet-class} \docType{class} % Classes: \alias{class:QualityScaledXStringSet} \alias{QualityScaledXStringSet-class} \alias{QualityScaledXStringSet} \alias{class:QualityScaledBStringSet} \alias{QualityScaledBStringSet-class} \alias{QualityScaledBStringSet} \alias{class:QualityScaledDNAStringSet} \alias{QualityScaledDNAStringSet-class} \alias{QualityScaledDNAStringSet} \alias{class:QualityScaledRNAStringSet} \alias{QualityScaledRNAStringSet-class} \alias{QualityScaledRNAStringSet} \alias{class:QualityScaledAAStringSet} \alias{QualityScaledAAStringSet-class} \alias{QualityScaledAAStringSet} % Accessor methods: \alias{quality} \alias{quality,QualityScaledXStringSet-method} % Inherited method: \alias{narrow,QualityScaledXStringSet-method} \alias{append,QualityScaledXStringSet,QualityScaledXStringSet-method} % Standard generic methods: \alias{show,QualityScaledXStringSet-method} \alias{[,QualityScaledXStringSet-method} \title{QualityScaledBStringSet, QualityScaledDNAStringSet, QualityScaledRNAStringSet and QualityScaledAAStringSet objects} \description{ The QualityScaledBStringSet class is a container for storing a \code{\link{BStringSet}} object with an \code{\link{XStringQuality}} object. Similarly, the QualityScaledDNAStringSet (or QualityScaledRNAStringSet, or QualityScaledAAStringSet) class is a container for storing a \code{\link{DNAStringSet}} (or \code{\link{RNAStringSet}}, or \code{\link{AAStringSet}}) objects with an \code{\link{XStringQuality}} object. } \usage{ ## Constructors: QualityScaledBStringSet(x, quality) QualityScaledDNAStringSet(x, quality) QualityScaledRNAStringSet(x, quality) QualityScaledAAStringSet(x, quality) } \arguments{ \item{x}{ Either a character vector, or an \link{XString}, \link{XStringSet} or \link{XStringViews} object. } \item{quality}{ An \link{XStringQuality} object. } } \details{ The \code{QualityScaledBStringSet}, \code{QualityScaledDNAStringSet}, \code{QualityScaledRNAStringSet} and \code{QualityScaledAAStringSet} functions are constructors that can be used to "naturally" turn \code{x} into an QualityScaledXStringSet object of the desired base type. } \section{Accessor methods}{ The QualityScaledXStringSet class derives from the \link{XStringSet} class hence all the accessor methods defined for an \link{XStringSet} object can also be used on an QualityScaledXStringSet object. Common methods include (in the code snippets below, \code{x} is an QualityScaledXStringSet object): \describe{ \item{}{ \code{length(x)}: The number of sequences in \code{x}. } \item{}{ \code{width(x)}: A vector of non-negative integers containing the number of letters for each element in \code{x}. } \item{}{ \code{nchar(x)}: The same as \code{width(x)}. } \item{}{ \code{names(x)}: \code{NULL} or a character vector of the same length as \code{x} containing a short user-provided description or comment for each element in \code{x}. } \item{}{ \code{quality(x)}: The quality of the strings. } } } \section{Subsetting and appending}{ In the code snippets below, \code{x} and \code{values} are XStringSet objects, and \code{i} should be an index specifying the elements to extract. \describe{ \item{}{ \code{x[i]}: Return a new QualityScaledXStringSet object made of the selected elements. } } } \author{P. Aboyoun} \seealso{ \link{BStringSet-class}, \link{DNAStringSet-class}, \link{RNAStringSet-class}, \link{AAStringSet-class}, \link{XStringQuality-class} } \examples{ x1 <- DNAStringSet(c("TTGA", "CTCN")) q1 <- PhredQuality(c("*+,-", "6789")) qx1 <- QualityScaledDNAStringSet(x1, q1) qx1 } \keyword{methods} \keyword{classes} Biostrings/man/RNAString-class.Rd0000644000126300012640000000527612227063320020243 0ustar00biocbuildphs_compbio\name{RNAString-class} \docType{class} % Classes \alias{class:RNAString} \alias{RNAString-class} % Constants: \alias{RNA_BASES} \alias{RNA_ALPHABET} % Constructor-like functions and generics: \alias{RNAString} \title{RNAString objects} \description{ An RNAString object allows efficient storage and manipulation of a long RNA sequence. } \details{ The RNAString class is a direct \link{XString} subclass (with no additional slot). Therefore all functions and methods described in the \link{XString} man page also work with an RNAString object (inheritance). Unlike the \link{BString} container that allows storage of any single string (based on a single-byte character set) the RNAString container can only store a string based on the RNA alphabet (see below). In addition, the letters stored in an RNAString object are encoded in a way that optimizes fast search algorithms. } \section{The RNA alphabet}{ This alphabet contains all letters from the IUPAC Extended Genetic Alphabet (see \code{?\link{IUPAC_CODE_MAP}}) where \code{"T"} is replaced by \code{"U"} + the gap (\code{"-"}) and the hard masking (\code{"+"}) letters. It is stored in the \code{RNA_ALPHABET} constant (character vector). The \code{alphabet} method also returns \code{RNA_ALPHABET} when applied to an RNAString object and is provided for convenience only. } \section{Constructor-like functions and generics}{ In the code snippet below, \code{x} can be a single string (character vector of length 1), a \link{BString} object or a \link{DNAString} object. \describe{ \item{}{ \code{RNAString(x="", start=1, nchar=NA)}: Tries to convert \code{x} into an RNAString object by reading \code{nchar} letters starting at position \code{start} in \code{x}. } } } \section{Accessor methods}{ In the code snippet below, \code{x} is an RNAString object. \describe{ \item{}{ \code{alphabet(x, baseOnly=FALSE)}: If \code{x} is an RNAString object, then return the RNA alphabet (see above). See the corresponding man pages when \code{x} is a \link{BString}, \link{DNAString} or \link{AAString} object. } } } \author{H. Pages} \seealso{ \code{\link{IUPAC_CODE_MAP}}, \code{\link{letter}}, \link{XString-class}, \link{DNAString-class}, \code{\link{reverseComplement}}, \code{\link{alphabetFrequency}} } \examples{ RNA_BASES RNA_ALPHABET d <- DNAString("TTGAAAA-CTC-N") r <- RNAString(d) r alphabet(r) # RNA_ALPHABET alphabet(r, baseOnly=TRUE) # RNA_BASES ## When comparing an RNAString object with a DNAString object, ## U and T are considered equals: r == d # TRUE } \keyword{methods} \keyword{classes} Biostrings/man/XString-class.Rd0000644000126300012640000001434612227063320020030 0ustar00biocbuildphs_compbio\name{XString-class} \docType{class} % Classes: \alias{class:XString} \alias{XString-class} \alias{class:BString} \alias{BString-class} % Constructor-like functions and generics: \alias{XString} \alias{BString} % Accessor methods: \alias{alphabet} \alias{alphabet,ANY-method} \alias{nchar,XString-method} % Coercion: \alias{seqtype,BString-method} \alias{seqtype,DNAString-method} \alias{seqtype,RNAString-method} \alias{seqtype,AAString-method} \alias{seqtype<-,XString-method} \alias{coerce,XString,BString-method} \alias{coerce,XString,DNAString-method} \alias{coerce,XString,RNAString-method} \alias{coerce,XString,AAString-method} \alias{coerce,character,BString-method} \alias{coerce,character,DNAString-method} \alias{coerce,character,RNAString-method} \alias{coerce,character,AAString-method} \alias{coerce,character,XString-method} \alias{as.character,XString-method} \alias{toString,XString-method} % "show" method: \alias{show,XString-method} % Equality: \alias{==,XString,XString-method} \alias{==,BString,character-method} \alias{==,character,BString-method} \alias{!=,XString,XString-method} \alias{!=,BString,character-method} \alias{!=,character,BString-method} % "substr" and "substring" methods: \alias{substr,XString-method} \alias{substring,XString-method} % "updateObject" method: \alias{updateObject,XString-method} \title{BString objects} \description{ The BString class is a general container for storing a big string (a long sequence of characters) and for making its manipulation easy and efficient. The \link{DNAString}, \link{RNAString} and \link{AAString} classes are similar containers but with the more biology-oriented purpose of storing a DNA sequence (\link{DNAString}), an RNA sequence (\link{RNAString}), or a sequence of amino acids (\link{AAString}). All those containers derive directly (and with no additional slots) from the XString virtual class. } \details{ The 2 main differences between an XString object and a standard character vector are: (1) the data stored in an XString object are not copied on object duplication and (2) an XString object can only store a single string (see the \link{XStringSet} container for an efficient way to store a big collection of strings in a single object). Unlike the \link{DNAString}, \link{RNAString} and \link{AAString} containers that accept only a predefined set of letters (the alphabet), a BString object can be used for storing any single string based on a single-byte character set. } \section{Constructor-like functions and generics}{ In the code snippet below, \code{x} can be a single string (character vector of length 1) or an XString object. \describe{ \item{}{ \code{BString(x="", start=1, nchar=NA)}: Tries to convert \code{x} into a BString object by reading \code{nchar} letters starting at position \code{start} in \code{x}. } } } \section{Accessor methods}{ In the code snippets below, \code{x} is an XString object. \describe{ \item{}{ \code{alphabet(x)}: \code{NULL} for a \code{BString} object. See the corresponding man pages when \code{x} is a \link{DNAString}, \link{RNAString} or \link{AAString} object. } \item{}{ \code{length(x)} or \code{nchar(x)}: Get the length of an XString object, i.e., its number of letters. } } } \section{Coercion}{ In the code snippets below, \code{x} is an XString object. \describe{ \item{}{ \code{as.character(x)}: Converts \code{x} to a character string. } \item{}{ \code{toString(x)}: Equivalent to \code{as.character(x)}. } } } \section{Subsetting}{ In the code snippets below, \code{x} is an XString object. \describe{ \item{}{ \code{x[i]}: Return a new XString object made of the selected letters (subscript \code{i} must be an NA-free numeric vector specifying the positions of the letters to select). The returned object belongs to the same class as \code{x}. Note that, unlike \code{subseq}, \code{x[i]} does copy the sequence data and therefore will be very inefficient for extracting a big number of letters (e.g. when \code{i} contains millions of positions). } } } \section{Equality}{ In the code snippets below, \code{e1} and \code{e2} are XString objects. \describe{ \item{}{ \code{e1 == e2}: \code{TRUE} if \code{e1} is equal to \code{e2}. \code{FALSE} otherwise. Comparison between two XString objects of different base types (e.g. a BString object and a \link{DNAString} object) is not supported with one exception: a \link{DNAString} object and an \link{RNAString} object can be compared (see \link{RNAString-class} for more details about this). Comparison between a BString object and a character string is also supported (see examples below). } \item{}{ \code{e1 != e2}: Equivalent to \code{!(e1 == e2)}. } } } \author{H. Pages} \seealso{ \code{\link[XVector]{subseq}}, \code{\link{letter}}, \link{DNAString-class}, \link{RNAString-class}, \link{AAString-class}, \link{XStringSet-class}, \link{XStringViews-class}, \code{\link{reverseComplement}}, \code{\link[XVector]{compact}}, \link[XVector]{XVector-class} } \examples{ b <- BString("I am a BString object") b length(b) ## Extracting a linear subsequence: subseq(b) subseq(b, start=3) subseq(b, start=-3) subseq(b, end=-3) subseq(b, end=-3, width=5) ## Subsetting: b2 <- b[length(b):1] # better done with reverse(b) as.character(b2) b2 == b # FALSE b2 == as.character(b2) # TRUE ## b[1:length(b)] is equal but not identical to b! b == b[1:length(b)] # TRUE identical(b, 1:length(b)) # FALSE ## This is because subsetting an XString object with [ makes a copy ## of part or all its sequence data. Hence, for the resulting object, ## the internal slot containing the memory address of the sequence ## data differs from the original. This is enough for identical() to ## see the 2 objects as different. ## Compacting. As a particular type of XVector objects, XString ## objects can optionally be compacted. Compacting is done typically ## before serialization. See ?compact for more information. } \keyword{methods} \keyword{classes} Biostrings/man/XStringPartialMatches-class.Rd0000644000126300012640000000272212227063320022645 0ustar00biocbuildphs_compbio\name{XStringPartialMatches-class} \docType{class} % Classes: \alias{class:XStringPartialMatches} \alias{XStringPartialMatches-class} % Accessor methods: \alias{subpatterns} \alias{subpatterns,XStringPartialMatches-method} \alias{pattern} \alias{pattern,XStringPartialMatches-method} % Standard generic methods: \alias{show,XStringPartialMatches-method} \alias{[,XStringPartialMatches-method} \title{XStringPartialMatches objects} \description{ WARNING: This class is currently under development and might not work properly! Full documentation will come later. Please DO NOT TRY TO USE it for now. Thanks for your comprehension! } \section{Accessor methods}{ In the code snippets below, \code{x} is an XStringPartialMatches object. \describe{ \item{}{ \code{subpatterns(x)}: Not ready yet. } \item{}{ \code{pattern(x)}: Not ready yet. } } } \section{Standard generic methods}{ In the code snippets below, \code{x} is an XStringPartialMatches objects, and \code{i} can be a numeric or logical vector. \describe{ \item{}{ \code{x[i]}: Return a new XStringPartialMatches object made of the selected views. \code{i} can be a numeric vector, a logical vector, \code{NULL} or missing. The returned object has the same subject as \code{x}. } } } \author{H. Pages} \seealso{ \link{XStringViews-class}, \link{XString-class}, \code{\link{letter}} } \keyword{methods} \keyword{classes} Biostrings/man/XStringQuality-class.Rd0000644000126300012640000000770012227063320021375 0ustar00biocbuildphs_compbio\name{XStringQuality-class} \docType{class} % Classes: \alias{class:XStringQuality} \alias{XStringQuality-class} \alias{XStringQuality} \alias{class:PhredQuality} \alias{PhredQuality-class} \alias{PhredQuality} \alias{class:SolexaQuality} \alias{SolexaQuality-class} \alias{SolexaQuality} \alias{class:IlluminaQuality} \alias{IlluminaQuality-class} \alias{IlluminaQuality} % Coercion: \alias{coerce,character,PhredQuality-method} \alias{coerce,BString,PhredQuality-method} \alias{coerce,BStringSet,PhredQuality-method} \alias{coerce,integer,PhredQuality-method} \alias{coerce,numeric,PhredQuality-method} \alias{coerce,PhredQuality,integer-method} \alias{as.integer,PhredQuality-method} \alias{coerce,PhredQuality,numeric-method} \alias{as.numeric,PhredQuality-method} \alias{coerce,character,SolexaQuality-method} \alias{coerce,BString,SolexaQuality-method} \alias{coerce,BStringSet,SolexaQuality-method} \alias{coerce,integer,SolexaQuality-method} \alias{coerce,numeric,SolexaQuality-method} \alias{coerce,SolexaQuality,integer-method} \alias{as.integer,SolexaQuality-method} \alias{coerce,SolexaQuality,numeric-method} \alias{as.numeric,SolexaQuality-method} \alias{coerce,character,IlluminaQuality-method} \alias{coerce,BString,IlluminaQuality-method} \alias{coerce,BStringSet,IlluminaQuality-method} \alias{coerce,integer,IlluminaQuality-method} \alias{coerce,numeric,IlluminaQuality-method} \alias{coerce,IlluminaQuality,integer-method} \alias{as.integer,IlluminaQuality-method} \alias{coerce,IlluminaQuality,numeric-method} \alias{as.numeric,IlluminaQuality-method} \alias{as.matrix,XStringQuality-method} \alias{coerce,XStringQuality,matrix-method} %% alphabet & encoding \alias{alphabet,XStringQuality-method} \alias{encoding,XStringQuality-method} \title{PhredQuality, SolexaQuality and IlluminaQuality objects} \description{ Objects for storing string quality measures. } \usage{ ## Constructors: PhredQuality(x) SolexaQuality(x) IlluminaQuality(x) ## alphabet and encoding \S4method{alphabet}{XStringQuality}(x) \S4method{encoding}{XStringQuality}(x) } \arguments{ \item{x}{ Either a character vector, \link{BString}, \link{BStringSet}, integer vector, or number vector of error probabilities. } } \details{ \code{PhredQuality} objects store characters that are interpreted as [0 - 99] quality measures by subtracting 33 from their ASCII decimal representation (e.g. ! = 0, " = 1, \# = 2, ...). Quality measures q encode probabilities as \code{-10 * log10(p)}. \code{SolexaQuality} objects store characters that are interpreted as [-5 - 99] quality measures by subtracting 64 from their ASCII decimal representation (e.g. ; = -5, < = -4, = = -3, ...). Quality measures q encode probabilities as \code{-10 * (log10(p) - log10(1 - p))}. \code{IlluminaQuality} objects store characters that are interpreted as [0 - 99] quality measures by subtracting 64 from their ASCII decimal representation (e.g. @ = 0, A = 1, B = 2, ...). Quality measures q encode probabilities as \code{-10 * log10(p)} } \section{Alphabet and encoding}{ In the code snippets below, \code{x} is an XStringQuality object. \describe{ \item{}{ \code{alphabet(x)}: Valid letters in this quality score; not all letters are encountered in actual sequencing runs. } \item{}{ \code{encoding(x)}: Map between letters and their corresponding integer encoding. Use \code{as.integer} and \code{as.numeric} to coerce objects to their integer and probability representations. } } } \author{P. Aboyoun} \seealso{ \code{\link{pairwiseAlignment}}, \link{PairwiseAlignments-class}, \link{DNAString-class}, \link{BStringSet-class} } \examples{ PhredQuality(0:40) SolexaQuality(0:40) IlluminaQuality(0:40) PhredQuality(seq(1e-4,0.5,length=10)) SolexaQuality(seq(1e-4,0.5,length=10)) IlluminaQuality(seq(1e-4,0.5,length=10)) x <- SolexaQuality(BStringSet(c(a="@ABC", b="abcd"))) as.matrix(x) } \keyword{methods} \keyword{classes} Biostrings/man/XStringSet-class.Rd0000644000126300012640000003711012227063320020476 0ustar00biocbuildphs_compbio\name{XStringSet-class} \docType{class} % Classes: \alias{class:XStringSet} \alias{XStringSet-class} \alias{XStringSet} \alias{class:BStringSet} \alias{BStringSet-class} \alias{BStringSet} \alias{class:DNAStringSet} \alias{DNAStringSet-class} \alias{DNAStringSet} \alias{class:RNAStringSet} \alias{RNAStringSet-class} \alias{RNAStringSet} \alias{class:AAStringSet} \alias{AAStringSet-class} \alias{AAStringSet} % Methods: \alias{width,character-method} \alias{nchar,XStringSet-method} \alias{narrow,character-method} \alias{subseq,character-method} \alias{threebands,character-method} \alias{subseq<-,character-method} \alias{subseq<-,XStringSet-method} \alias{seqtype,XStringSet-method} \alias{seqtype<-,XStringSet-method} \alias{coerce,ANY,BStringSet-method} \alias{coerce,ANY,DNAStringSet-method} \alias{coerce,ANY,RNAStringSet-method} \alias{coerce,ANY,AAStringSet-method} \alias{coerce,ANY,XStringSet-method} \alias{show,XStringSet-method} \alias{union,XStringSet,XStringSet-method} \alias{intersect,XStringSet,XStringSet-method} \alias{setdiff,XStringSet,XStringSet-method} \alias{setequal,XStringSet,XStringSet-method} \alias{unlist,XStringSet-method} \alias{as.character,XStringSet-method} \alias{as.vector,XStringSet-method} \alias{toString,XStringSet-method} \alias{as.matrix,XStringSet-method} \alias{updateObject,XStringSet-method} \title{XStringSet objects} \description{ The BStringSet class is a container for storing a set of \code{\link{BString}} objects and for making its manipulation easy and efficient. Similarly, the DNAStringSet (or RNAStringSet, or AAStringSet) class is a container for storing a set of \code{\link{DNAString}} (or \code{\link{RNAString}}, or \code{\link{AAString}}) objects. All those containers derive directly (and with no additional slots) from the XStringSet virtual class. } \usage{ ## Constructors: BStringSet(x=character(), start=NA, end=NA, width=NA, use.names=TRUE) DNAStringSet(x=character(), start=NA, end=NA, width=NA, use.names=TRUE) RNAStringSet(x=character(), start=NA, end=NA, width=NA, use.names=TRUE) AAStringSet(x=character(), start=NA, end=NA, width=NA, use.names=TRUE) ## Accessor-like methods: \S4method{width}{character}(x) \S4method{nchar}{XStringSet}(x, type="chars", allowNA=FALSE) ## ... and more (see below) } \arguments{ \item{x}{ Either a character vector (with no NAs), or an \link{XString}, XStringSet or \link{XStringViews} object. } \item{start,end,width}{ Either \code{NA}, a single integer, or an integer vector of the same length as \code{x} specifying how \code{x} should be "narrowed" (see \code{?\link[IRanges]{narrow}} for the details). } \item{use.names}{ \code{TRUE} or \code{FALSE}. Should names be preserved? } \item{type,allowNA}{ Ignored. } } \details{ The \code{BStringSet}, \code{DNAStringSet}, \code{RNAStringSet} and \code{AAStringSet} functions are constructors that can be used to turn input \code{x} into an XStringSet object of the desired base type. They also allow the user to "narrow" the sequences contained in \code{x} via proper use of the \code{start}, \code{end} and/or \code{width} arguments. In this context, "narrowing" means dropping a prefix or/and a suffix of each sequence in \code{x}. The "narrowing" capabilities of these constructors can be illustrated by the following property: if \code{x} is a character vector (with no NAs), or an XStringSet (or \link{XStringViews}) object, then the 3 following transformations are equivalent: \describe{ \item{}{ \code{BStringSet(x, start=mystart, end=myend, width=mywidth)} } \item{}{ \code{subseq(BStringSet(x), start=mystart, end=myend, width=mywidth)} } \item{}{ \code{BStringSet(subseq(x, start=mystart, end=myend, width=mywidth))} } } Note that, besides being more convenient, the first form is also more efficient on character vectors. } \section{Accessor-like methods}{ In the code snippets below, \code{x} is an XStringSet object. \describe{ \item{}{ \code{length(x)}: The number of sequences in \code{x}. } \item{}{ \code{width(x)}: A vector of non-negative integers containing the number of letters for each element in \code{x}. Note that \code{width(x)} is also defined for a character vector with no NAs and is equivalent to \code{nchar(x, type="bytes")}. } \item{}{ \code{names(x)}: \code{NULL} or a character vector of the same length as \code{x} containing a short user-provided description or comment for each element in \code{x}. These are the only data in an XStringSet object that can safely be changed by the user. All the other data are immutable! As a general recommendation, the user should never try to modify an object by accessing its slots directly. } \item{}{ \code{alphabet(x)}: Return \code{NULL}, \code{\link{DNA_ALPHABET}}, \code{\link{RNA_ALPHABET}} or \code{\link{AA_ALPHABET}} depending on whether \code{x} is a BStringSet, DNAStringSet, RNAStringSet or AAStringSet object. } \item{}{ \code{nchar(x)}: The same as \code{width(x)}. } } } \section{Subsequence extraction and related transformations}{ In the code snippets below, \code{x} is a character vector (with no NAs), or an XStringSet (or \link{XStringViews}) object. \describe{ \item{}{ \code{subseq(x, start=NA, end=NA, width=NA)}: Applies \code{subseq} on each element in \code{x}. See \code{?\link[XVector]{subseq}} for the details. Note that this is similar to what \code{\link{substr}} does on a character vector. However there are some noticeable differences: (1) the arguments are \code{start} and \code{stop} for \code{\link{substr}}; (2) the SEW interface (start/end/width) interface of \code{subseq} is richer (e.g. support for negative start or end values); and (3) \code{subseq} checks that the specified start/end/width values are valid i.e., unlike \code{\link{substr}}, it throws an error if they define "out of limits" subsequences or subsequences with a negative width. } \item{}{ \code{narrow(x, start=NA, end=NA, width=NA, use.names=TRUE)}: Same as \code{subseq}. The only differences are: (1) \code{narrow} has a \code{use.names} argument; and (2) all the things \code{narrow} and \code{subseq} work on (\link[IRanges]{IRanges}, XStringSet or \link{XStringViews} objects for \code{narrow}, \link[XVector]{XVector} or XStringSet objects for \code{subseq}). But they both work and do the same thing on an XStringSet object. } \item{}{ \code{threebands(x, start=NA, end=NA, width=NA)}: Like the method for \link[IRanges]{IRanges} objects, the \code{threebands} methods for character vectors and XStringSet objects extend the capability of \code{narrow} by returning the 3 set of subsequences (the left, middle and right subsequences) associated to the narrowing operation. See \code{?\link[IRanges]{threebands}} in the IRanges package for the details. } \item{}{ \code{subseq(x, start=NA, end=NA, width=NA) <- value}: A vectorized version of the \code{\link[XVector]{subseq<-}} method for \link[XVector]{XVector} objects. See \code{?`\link[XVector]{subseq<-}`} for the details. } } } \section{Subsetting and appending}{ In the code snippets below, \code{x} and \code{values} are XStringSet objects, and \code{i} should be an index specifying the elements to extract. \describe{ \item{}{ \code{x[i]}: Return a new XStringSet object made of the selected elements. } \item{}{ \code{x[[i]]}: Extract the i-th \code{\link{XString}} object from \code{x}. } \item{}{ \code{append(x, values, after=length(x))}: Add sequences in \code{values} to \code{x}. } } } \section{Set operations}{ In the code snippets below, \code{x} and \code{y} are XStringSet objects \describe{ \item{}{ \code{union(x, y, ...)}: Union of \code{x} and \code{y}. } \item{}{ \code{intersect(x, y, ...)}: Intersection of \code{x} and \code{y}. } \item{}{ \code{setdiff(x, y, ...)}: Asymmetric set difference of \code{x} and \code{y}. } \item{}{ \code{setequal(x, y)}: Set equality of \code{x} to \code{y}. } } } \section{Other methods}{ In the code snippets below, \code{x} is an XStringSet object. \describe{ \item{}{ \code{unlist(x)}: Turns \code{x} into an \link{XString} object by combining the sequences in \code{x} together. Fast equivalent to \code{do.call(c, as.list(x))}. } \item{}{ \code{as.character(x, use.names=TRUE)}: Converts \code{x} to a character vector of the same length as \code{x}. The \code{use.names} argument controls whether or not \code{names(x)} should be propagated to the names of the returned vector. } \item{}{ \code{as.matrix(x, use.names=TRUE)}: Returns a character matrix containing the "exploded" representation of the strings. Can only be used on an XStringSet object with equal-width strings. The \code{use.names} argument controls whether or not \code{names(x)} should be propagated to the row names of the returned matrix. } \item{}{ \code{toString(x)}: Equivalent to \code{toString(as.character(x))}. } \item{}{ \code{show(x)}: By default the \code{show} method displays 5 head and 5 tail lines. The number of lines can be altered by setting the global options \code{showHeadLines} and \code{showTailLines}. If the object length is less than the sum of the options, the full object is displayed. These options affect GRanges, GappedAlignments, Ranges and XString objects. } } } \author{H. Pages} \seealso{ \link{XStringSet-comparison}, \link{XString-class}, \link{XStringViews-class}, \link{XStringSetList-class}, \code{\link[XVector]{subseq}}, \code{\link[IRanges]{narrow}}, \code{\link{substr}}, \code{\link[XVector]{compact}}, \link[XVector]{XVectorList-class} } \examples{ ## --------------------------------------------------------------------- ## A. USING THE XStringSet CONSTRUCTORS ON A CHARACTER VECTOR OR FACTOR ## --------------------------------------------------------------------- ## Note that there is no XStringSet() constructor, but an XStringSet ## family of constructors: BStringSet(), DNAStringSet(), RNAStringSet(), ## etc... x0 <- c("#CTC-NACCAGTAT", "#TTGA", "TACCTAGAG") width(x0) x1 <- BStringSet(x0) x1 ## 3 equivalent ways to obtain the same BStringSet object: BStringSet(x0, start=4, end=-3) subseq(x1, start=4, end=-3) BStringSet(subseq(x0, start=4, end=-3)) dna0 <- DNAStringSet(x0, start=4, end=-3) dna0 names(dna0) names(dna0)[2] <- "seqB" dna0 ## When the input vector contains a lot of duplicates, turning it into ## a factor first before passing it to the constructor will produce an ## XStringSet object that is more compact in memory: library(hgu95av2probe) x2 <- sample(hgu95av2probe$sequence, 999000, replace=TRUE) dna2a <- DNAStringSet(x2) dna2b <- DNAStringSet(factor(x2)) # slower but result is more compact object.size(dna2a) object.size(dna2b) ## --------------------------------------------------------------------- ## B. USING THE XStringSet CONSTRUCTORS ON A SINGLE SEQUENCE (XString ## OBJECT OR CHARACTER STRING) ## --------------------------------------------------------------------- x3 <- "abcdefghij" BStringSet(x3, start=2, end=6:2) # behaves like 'substring(x3, 2, 6:2)' BStringSet(x3, start=-(1:6)) x4 <- BString(x3) BStringSet(x4, end=-(1:6), width=3) ## Randomly extract 1 million 40-mers from C. elegans chrI: extractRandomReads <- function(subject, nread, readlength) { if (!is.integer(readlength)) readlength <- as.integer(readlength) start <- sample(length(subject) - readlength + 1L, nread, replace=TRUE) DNAStringSet(subject, start=start, width=readlength) } library(BSgenome.Celegans.UCSC.ce2) rndreads <- extractRandomReads(Celegans$chrI, 1000000, 40) ## Notes: ## - This takes only 2 or 3 seconds versus several hours for a solution ## using substring() on a standard character string. ## - The short sequences in 'rndreads' can be seen as the result of a ## simulated high-throughput sequencing experiment. A non-realistic ## one though because: ## (a) It assumes that the underlying technology is perfect (the ## generated reads have no technology induced errors). ## (b) It assumes that the sequenced genome is exactly the same as the ## reference genome. ## (c) The simulated reads can contain IUPAC ambiguity letters only ## because the reference genome contains them. In a real ## high-throughput sequencing experiment, the sequenced genome ## of course doesn't contain those letters, but the sequencer ## can introduce them in the generated reads to indicate ambiguous ## base-calling. ## (d) The simulated reads come from the plus strand only of a single ## chromosome. ## - See the getSeq() function in the BSgenome package for how to ## circumvent (d) i.e. how to generate reads that come from the whole ## genome (plus and minus strands of all chromosomes). ## --------------------------------------------------------------------- ## C. USING THE XStringSet CONSTRUCTORS ON AN XStringSet OBJECT ## --------------------------------------------------------------------- library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) probes RNAStringSet(probes, start=2, end=-5) # does NOT copy the sequence data! ## --------------------------------------------------------------------- ## D. USING THE XStringSet CONSTRUCTORS ON AN ORDINARY list OF XString ## OBJECTS ## --------------------------------------------------------------------- probes10 <- head(probes, n=10) set.seed(33) shuffled_nucleotides <- lapply(probes10, sample) shuffled_nucleotides DNAStringSet(shuffled_nucleotides) # does NOT copy the sequence data! ## Note that the same result can be obtained in a more compact way with ## just: set.seed(33) endoapply(probes10, sample) ## --------------------------------------------------------------------- ## E. USING subseq() ON AN XStringSet OBJECT ## --------------------------------------------------------------------- subseq(probes, start=2, end=-5) subseq(probes, start=13, end=13) <- "N" probes ## Add/remove a prefix: subseq(probes, start=1, end=0) <- "--" probes subseq(probes, end=2) <- "" probes ## Do more complicated things: subseq(probes, start=4:7, end=7) <- c("YYYY", "YYY", "YY", "Y") subseq(probes, start=4, end=6) <- subseq(probes, start=-2:-5) probes ## --------------------------------------------------------------------- ## F. UNLISTING AN XStringSet OBJECT ## --------------------------------------------------------------------- library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) unlist(probes) ## --------------------------------------------------------------------- ## G. COMPACTING AN XStringSet OBJECT ## --------------------------------------------------------------------- ## As a particular type of XVectorList objects, XStringSet objects can ## optionally be compacted. Compacting is done typically before ## serialization. See ?compact for more information. library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) y <- subseq(probes[1:12], start=5) probes@pool y@pool object.size(probes) object.size(y) y0 <- compact(y) y0@pool object.size(y0) } \keyword{methods} \keyword{classes} Biostrings/man/XStringSet-comparison.Rd0000644000126300012640000001577012227063320021553 0ustar00biocbuildphs_compbio\name{XStringSet-comparison} \alias{XStringSet-comparison} \alias{compare,XStringSet,XStringSet-method} \alias{compare,XStringSet,ANY-method} \alias{compare,ANY,XStringSet-method} \alias{match,XStringSet,XStringSet-method} \alias{match,XStringSet,ANY-method} \alias{match,ANY,XStringSet-method} \title{Comparing and ordering the elements in one or more XStringSet objects} \description{ Methods for comparing and ordering the elements in one or more \link{XStringSet} objects. } \details{ Element-wise (aka "parallel") comparison of 2 \link{XStringSet} objects is based on the lexicographic order between 2 \link{BString}, \link{DNAString}, \link{RNAString}, or \link{AAString} objects. For \link{DNAStringSet} and \link{RNAStringSet} objects, the letters in the respective alphabets (i.e. \link{DNA_ALPHABET} and \link{RNA_ALPHABET}) are ordered based on a predefined code assigned to each letter. The code assigned to each letter can be retrieved with: \preformatted{ dna_codes <- as.integer(DNAString(paste(DNA_ALPHABET, collapse=""))) names(dna_codes) <- DNA_ALPHABET rna_codes <- as.integer(RNAString(paste(RNA_ALPHABET, collapse=""))) names(rna_codes) <- RNA_ALPHABET } Note that this order does NOT depend on the locale in use. Also note that comparing DNA sequences with RNA sequences is supported and in that case T and U are considered to be the same letter. For \link{BStringSet} and \link{AAStringSet} objects, the alphabetical order is defined by the C collation. Note that, at the moment, \link{AAStringSet} objects are treated like \link{BStringSet} objects i.e. the alphabetical order is NOT defined by the order of the letters in \link{AA_ALPHABET}. This might change at some point. } \section{\code{compare()} and related methods}{ In the code snippets below, \code{x} and \code{y} are \link{XStringSet} objects. \describe{ \item{}{ \code{compare(x, y)}: Performs element-wise (aka "parallel") comparison of \code{x} and \code{y}, that is, returns an integer vector where the i-th element is less than, equal to, or greater than zero if the i-th element in \code{x} is considered to be respectively less than, equal to, or greater than the i-th element in \code{y}. If \code{x} and \code{y} don't have the same length, then the shortest is recycled to the length of the longest (the standard recycling rules apply). } \item{}{ \code{x == y}, \code{x != y}, \code{x <= y}, \code{x >= y}, \code{x < y}, \code{x > y}: Equivalent to \code{compare(x, y) == 0}, \code{compare(x, y) != 0}, \code{compare(x, y) <= 0}, \code{compare(x, y) >= 0}, \code{compare(x, y) < 0}, and \code{compare(x, y) > 0}, respectively. } } } \section{\code{order()} and related methods}{ In the code snippets below, \code{x} is an \link{XStringSet} object. \describe{ \item{}{ \code{is.unsorted(x, strictly=FALSE)}: Return a logical values specifying if \code{x} is unsorted. The \code{strictly} argument takes logical value indicating if the check should be for _strictly_ increasing values. } \item{}{ \code{order(x, decreasing=FALSE)}: Return a permutation which rearranges \code{x} into ascending or descending order. } \item{}{ \code{rank(x, ties.method=c("first", "min"))}: Rank \code{x} in ascending order. } \item{}{ \code{sort(x, decreasing=FALSE)}: Sort \code{x} into ascending or descending order. } } } \section{\code{duplicated()} and \code{unique()}}{ In the code snippets below, \code{x} is an \link{XStringSet} object. \describe{ \item{}{ \code{duplicated(x)}: Return a logical vector whose elements denotes duplicates in \code{x}. } \item{}{ \code{unique(x)}: Return the subset of \code{x} made of its unique elements. } } } \section{\code{match()} and \code{\%in\%}}{ In the code snippets below, \code{x} and \code{table} are \link{XStringSet} objects. \describe{ \item{}{ \code{match(x, table, nomatch=NA_integer_)}: Returns an integer vector containing the first positions of an identical match in \code{table} for the elements in \code{x}. } \item{}{ \code{x \%in\% table}: Returns a logical vector indicating which elements in \code{x} match identically with an element in \code{table}. } } } \author{H. Pages} \seealso{ \link{XStringSet-class}, \code{\link{==}}, \code{\link{is.unsorted}}, \code{\link{order}}, \code{\link{rank}}, \code{\link{sort}}, \code{\link{duplicated}}, \code{\link{unique}}, \code{\link{match}}, \code{\link{\%in\%}} } \examples{ ## --------------------------------------------------------------------- ## A. SIMPLE EXAMPLES ## --------------------------------------------------------------------- dna <- DNAStringSet(c("AAA", "TC", "", "TC", "AAA", "CAAC", "G")) match(c("", "G", "AA", "TC"), dna) library(drosophila2probe) fly_probes <- DNAStringSet(drosophila2probe) sum(duplicated(fly_probes)) # 481 duplicated probes is.unsorted(fly_probes) # TRUE fly_probes <- sort(fly_probes) is.unsorted(fly_probes) # FALSE is.unsorted(fly_probes, strictly=TRUE) # TRUE, because of duplicates is.unsorted(unique(fly_probes), strictly=TRUE) # FALSE ## Nb of probes that are the reverse complement of another probe: nb1 <- sum(reverseComplement(fly_probes) \%in\% fly_probes) stopifnot(identical(nb1, 455L)) # 455 probes ## Probes shared between drosophila2probe and hgu95av2probe: library(hgu95av2probe) human_probes <- DNAStringSet(hgu95av2probe) m <- match(fly_probes, human_probes) stopifnot(identical(sum(!is.na(m)), 493L)) # 493 shared probes ## --------------------------------------------------------------------- ## B. AN ADVANCED EXAMPLE ## --------------------------------------------------------------------- ## We want to compare the first 5 bases with the 5 last bases of each ## probe in drosophila2probe. More precisely, we want to compute the ## percentage of probes for which the first 5 bases are the reverse ## complement of the 5 last bases. library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) first5 <- narrow(probes, end=5) last5 <- narrow(probes, start=-5) nb2 <- sum(first5 == reverseComplement(last5)) stopifnot(identical(nb2, 17L)) ## Percentage: 100 * nb2 / length(probes) # 0.0064 % ## If the probes were random DNA sequences, a probe would have 1 chance ## out of 4^5 to have this property so the percentage would be: 100 / 4^5 # 0.098 % ## With randomly generated probes: set.seed(33) random_dna <- sample(DNAString(paste(DNA_BASES, collapse="")), sum(width(probes)), replace=TRUE) random_probes <- successiveViews(random_dna, width(probes)) random_probes random_probes <- as(random_probes, "XStringSet") random_probes random_first5 <- narrow(random_probes, end=5) random_last5 <- narrow(random_probes, start=-5) nb3 <- sum(random_first5 == reverseComplement(random_last5)) 100 * nb3 / length(random_probes) # 0.099 % } \keyword{methods} Biostrings/man/XStringSet-io.Rd0000644000126300012640000002047712227063320020010 0ustar00biocbuildphs_compbio\name{XStringSet-io} \alias{XStringSet-io} \alias{readBStringSet} \alias{readDNAStringSet} \alias{readRNAStringSet} \alias{readAAStringSet} \alias{fasta.info} \alias{fastq.geometry} \alias{writeXStringSet} \alias{saveXStringSet} \title{Read/write an XStringSet object from/to a file} \description{ Functions to read/write an \link{XStringSet} object from/to a file. } \usage{ ## Read FASTA (or FASTQ) files in an XStringSet object: readBStringSet(filepath, format="fasta", nrec=-1L, skip=0L, use.names=TRUE) readDNAStringSet(filepath, format="fasta", nrec=-1L, skip=0L, use.names=TRUE) readRNAStringSet(filepath, format="fasta", nrec=-1L, skip=0L, use.names=TRUE) readAAStringSet(filepath, format="fasta", nrec=-1L, skip=0L, use.names=TRUE) ## Extract basic information about FASTA (or FASTQ) files ## without actually loading the sequence data: fasta.info(filepath, nrec=-1L, skip=0L, use.names=TRUE, seqtype="B") fastq.geometry(filepath, nrec=-1L, skip=0L) ## Write an XStringSet object to a FASTA (or FASTQ) file: writeXStringSet(x, filepath, append=FALSE, format="fasta", ...) ## Serialize an XStringSet object: saveXStringSet(x, objname, dirpath=".", save.dups=FALSE, verbose=TRUE) } \arguments{ \item{filepath}{ A character vector (of arbitrary length when reading, of length 1 when writing) containing the path(s) to the file(s) to read or write. Note that special values like \code{""} or \code{"|cmd"} (typically supported by other I/O functions in R) are not supported here. Also \code{filepath} cannot be a connection. } \item{format}{ Either \code{"fasta"} (the default) or \code{"fastq"}. } \item{nrec}{ Single integer. The maximum of number of records to read in. Negative values are ignored. } \item{skip}{ Single non-negative integer. The number of records of the data file(s) to skip before beginning to read in records. } \item{use.names}{ Should the returned vector be named? For FASTA the names are taken from the record description lines. For FASTQ they are taken from the record sequence ids. Dropping the names can help reducing memory footprint e.g. for a FASTQ file containing millions of reads. } \item{seqtype}{ A single string specifying the type of sequences contained in the FASTA file(s). Supported sequence types: \itemize{ \item \code{"B"} for anything i.e. any letter is a valid one-letter sequence code. \item \code{"DNA"} for DNA sequences i.e. only letters in \code{\link{DNA_ALPHABET}} (case ignored) are valid one-letter sequence codes. \item \code{"RNA"} for RNA sequences i.e. only letters in \code{\link{RNA_ALPHABET}} (case ignored) are valid one-letter sequence codes. \item \code{"AA"} for Amino Acid sequences. Currently treated as \code{"B"} but this will change in the near future i.e. only letters in \code{\link{AA_ALPHABET}} (case ignored) will be valid one-letter sequence codes. } Invalid one-letter sequence codes are ignored with a warning. } \item{x}{ For \code{writeXStringSet}, the object to write to \code{file}. For \code{saveXStringSet}, the object to serialize. } \item{append}{ \code{TRUE} or \code{FALSE}. If \code{TRUE} output will be appended to \code{file}; otherwise, it will overwrite the contents of \code{file}. See \code{?\link[base]{cat}} for the details. } \item{...}{ Further format-specific arguments. If \code{format="fasta"}, the \code{width} argument (single integer) can be used to specify the maximum number of letters per line of sequence. If \code{format="fastq"}, the \code{qualities} argument (\link{BStringSet} object) can be used to specify the qualities. If the qualities are omitted, then the fake quality ';' is assigned to each letter in \code{x} and written to the file. } \item{objname}{ The name of the serialized object. } \item{dirpath}{ The path to the directory where to save the serialized object. } \item{save.dups}{ \code{TRUE} or \code{FALSE}. If \code{TRUE} then the \code{\link[IRanges:Grouping-class]{Dups}} object describing how duplicated elements in \code{x} are related to each other is saved too. For advanced users only. } \item{verbose}{ \code{TRUE} or \code{FALSE}. } } \details{ Only FASTA and FASTQ files are supported for now. The qualities stored in the FASTQ records are ignored. Reading functions \code{readBStringSet}, \code{readDNAStringSet}, \code{readRNAStringSet} and \code{readAAStringSet} load sequences from an input file (or set of input files) into an \link{XStringSet} object. When multiple input files are specified, they are read in the corresponding order and their data are stored in the returned object in that order. Note that when multiple input FASTQ files are specified, all must have the same "width" (i.e. all their sequences must have the same length). The \code{fasta.info} utility returns an integer vector with one element per FASTA record in the input files. Each element is the length of the sequence found in the corresponding record, that is, the number of valid one-letter sequence codes in the record. See description of the \code{seqtype} argument above for how to control the set of valid one-letter sequence codes. The \code{fastq.geometry} utility returns an integer vector describing the "geometry" of the FASTQ files i.e. a vector of length 2 where the first element is the total number of FASTQ records in the files and the second element the common "width" of these files (this width is \code{NA} if the files contain no FASTQ records or records with different widths). \code{writeXStringSet} writes an \link{XStringSet} object to a file. WARNING: Please be aware that using \code{writeXStringSet} on a \link{BStringSet} object that contains the '\\n' (LF) or '\\r' (CR) characters or the FASTA markup characters '>' or ';' is almost guaranteed to produce a broken FASTA file! Serializing an \link{XStringSet} object with \code{saveXStringSet} is equivalent to using the standard \code{save} mechanism. But it will try to reduce the size of \code{x} in memory first before calling \code{save}. Most of the times this leads to a much reduced size on disk. } \references{ \url{http://en.wikipedia.org/wiki/FASTA_format} } \seealso{ \link{XStringSet-class}, \link{BString-class}, \link{DNAString-class}, \link{RNAString-class}, \link{AAString-class} } \examples{ ## --------------------------------------------------------------------- ## A. READ/WRITE FASTA FILES ## --------------------------------------------------------------------- filepath <- system.file("extdata", "someORF.fa", package="Biostrings") fasta.info(filepath, seqtype="DNA") x <- readDNAStringSet(filepath) x out1 <- tempfile() writeXStringSet(x, out1) ## --------------------------------------------------------------------- ## B. READ/WRITE FASTQ FILES ## --------------------------------------------------------------------- filepath <- system.file("extdata", "s_1_sequence.txt", package="Biostrings") fastq.geometry(filepath) readDNAStringSet(filepath, format="fastq") library(BSgenome.Celegans.UCSC.ce2) ## Create a "sliding window" on chr I: sw_start <- seq.int(1, length(Celegans$chrI)-50, by=50) sw <- Views(Celegans$chrI, start=sw_start, width=10) my_fake_shortreads <- as(sw, "XStringSet") my_fake_ids <- sprintf("ID\%06d", seq_len(length(my_fake_shortreads))) names(my_fake_shortreads) <- my_fake_ids my_fake_shortreads ## Fake quality ';' will be assigned to each base in 'my_fake_shortreads': out2 <- tempfile() writeXStringSet(my_fake_shortreads, out2, format="fastq") ## Passing qualities thru the 'qualities' argument: my_fake_quals <- rep.int(BStringSet("DCBA@?>=<;"), length(my_fake_shortreads)) my_fake_quals out3 <- tempfile() writeXStringSet(my_fake_shortreads, out3, format="fastq", qualities=my_fake_quals) ## --------------------------------------------------------------------- ## C. SERIALIZATION ## --------------------------------------------------------------------- saveXStringSet(my_fake_shortreads, "my_fake_shortreads", dirpath=tempdir()) } \keyword{utilities} \keyword{manip} Biostrings/man/XStringSetList-class.Rd0000644000126300012640000001052712227063320021335 0ustar00biocbuildphs_compbio\name{XStringSetList-class} \docType{class} % Classes: \alias{class:XStringSetList} \alias{XStringSetList-class} \alias{XStringSetList} \alias{class:BStringSetList} \alias{BStringSetList-class} \alias{BStringSetList} \alias{class:DNAStringSetList} \alias{DNAStringSetList-class} \alias{DNAStringSetList} \alias{class:RNAStringSetList} \alias{RNAStringSetList-class} \alias{RNAStringSetList} \alias{class:AAStringSetList} \alias{AAStringSetList-class} \alias{AAStringSetList} % Methods: \alias{seqtype,XStringSetList-method} \alias{seqtype<-,XStringSetList-method} \alias{show,XStringSetList-method} % Old stuff (Deprecated or Defunct): \alias{partitioning} \title{XStringSetList objects} \description{ The XStringSetList class is a virtual container for storing a list of \link{XStringSet} objects. } \details{ Concrete flavors of the XStringSetList container are the BStringSetList, DNAStringSetList, RNAStringSetList and AAStringSetList containers for storing a list of \link{BStringSet}, \link{DNAStringSet}, \link{RNAStringSet} and \link{AAStringSet} objects, respectively. These four containers are direct subclasses of XStringSetList with no additional slots. Currently \code{DNAStringSetList()} and \code{AAStringSetList()} are the only XStringSetList constructors. The XStringSetList class itself is virtual and has no constructor. } \usage{ ## Constructors: DNAStringSetList(..., use.names=TRUE) AAStringSetList(..., use.names=TRUE) } \arguments{ \item{\dots}{ Character vector(s) (with no NAs), or \link{XStringSet} object(s), or \link{XStringViews} object(s) to be concatenated into a \link{XStringSetList}. } \item{use.names}{ \code{TRUE} or \code{FALSE}. Should names be preserved? } } \section{Methods}{ The XStringSetList class extends the \link[IRanges]{List} class defined in the \pkg{IRanges} package. Using a less technical jargon, this just means that an XStringSetList object is a list-like object that can be manipulated like an ordinary list. Or, said otherwise, most of the operations that work on an ordinary list (e.g. \code{length}, \code{names}, \code{[}, \code{[[}, \code{c}, \code{unlist}, etc...) should work on an XStringSetList object. In addition, Bioconductor specific list operations like \code{\link[IRanges]{elementLengths}} and \code{\link[IRanges]{PartitioningByEnd}} (defined in the \pkg{IRanges} package) are supported too. } \author{H. Pages} \seealso{ \link{XStringSet-class}, \link[IRanges]{List-class} } \examples{ ## ------------------------------------------------------------------------ ## A. THE XStringSetList CONSTRUCTORS ## ------------------------------------------------------------------------ ## Currently DNAStringSetList() and AAStringSetList() are the only ## constructors. Others will be developed when the use case arises. dna1 <- c("AAA", "AC", "", "T", "GGATA") dna2 <- c("G", "TT", "C") x <- DNAStringSetList(dna1, dna2) x DNAStringSetList(DNAStringSet(dna1), DNAStringSet(dna2)) DNAStringSetList(dna1, DNAStringSet(dna2)) DNAStringSetList(DNAStringSet(dna1), dna2) DNAStringSetList(dna1, RNAStringSet(DNAStringSet(dna2))) DNAStringSetList(list(dna1, dna2)) DNAStringSetList(CharacterList(dna1, dna2)) ## Empty object (i.e. zero-length): DNAStringSetList() ## Not empty (length is 1): DNAStringSetList(character(0)) ## --------------------------------------------------------------------- ## B. UNLISTING AN XStringSetList OBJECT ## --------------------------------------------------------------------- length(x) elementLengths(x) unlist(x) x[[1]] x[[2]] as.list(x) names(x) <- LETTERS[1:length(x)] x[["A"]] x[["B"]] as.list(x) # named list ## --------------------------------------------------------------------- ## B. USING THE GROUPING CORE API ON 'PartitioningByEnd(x)' ## --------------------------------------------------------------------- PartitioningByEnd(x) length(PartitioningByEnd(x)) nobj(PartitioningByEnd(x)) grouplength(PartitioningByEnd(x)) # same as 'unname(sapply(x, length))' ## --------------------------------------------------------------------- ## C. USING THE RANGES CORE API ON 'PartitioningByEnd(x)' ## --------------------------------------------------------------------- start(PartitioningByEnd(x)) end(PartitioningByEnd(x)) width(PartitioningByEnd(x)) # same as 'grouplength(PartitioningByEnd(x))' } \keyword{methods} \keyword{classes} Biostrings/man/XStringViews-class.Rd0000644000126300012640000001470012227063320021040 0ustar00biocbuildphs_compbio\name{XStringViews-class} \docType{class} % Classes: \alias{class:XStringViews} \alias{XStringViews-class} \alias{XStringViews} % Methods: \alias{Views,XString-method} \alias{Views,character-method} \alias{nchar,XStringViews-method} \alias{seqtype,XStringViews-method} \alias{seqtype<-,XStringViews-method} \alias{coerce,XStringViews,XStringSet-method} \alias{coerce,XStringViews,BStringSet-method} \alias{coerce,XStringViews,DNAStringSet-method} \alias{coerce,XStringViews,RNAStringSet-method} \alias{coerce,XStringViews,AAStringSet-method} \alias{coerce,XStringSet,Views-method} \alias{coerce,XStringSet,XStringViews-method} \alias{show,XStringViews-method} \alias{==,XStringViews,XStringViews-method} \alias{==,XStringViews,XString-method} \alias{==,XStringViews,character-method} \alias{==,XString,XStringViews-method} \alias{==,character,XStringViews-method} \alias{!=,XStringViews,XStringViews-method} \alias{!=,XStringViews,XString-method} \alias{!=,XStringViews,character-method} \alias{!=,XString,XStringViews-method} \alias{!=,character,XStringViews-method} \alias{as.character,XStringViews-method} \alias{as.matrix,XStringViews-method} \alias{toString,XStringViews-method} \title{The XStringViews class} \description{ The XStringViews class is the basic container for storing a set of views (start/end locations) on the same sequence (an \link{XString} object). } \details{ An XStringViews object contains a set of views (start/end locations) on the same \link{XString} object called "the subject string" or "the subject sequence" or simply "the subject". Each view is defined by its start and end locations: both are integers such that start <= end. An XStringViews object is in fact a particular case of an \link[IRanges:Views-class]{Views} object (the XStringViews class contains the \link[IRanges:Views-class]{Views} class) so it can be manipulated in a similar manner: see \code{?\link[IRanges:Views-class]{Views}} for more information. Note that two views can overlap and that a view can be "out of limits" i.e. it can start before the first letter of the subject or/and end after its last letter. } \section{Constructor}{ \describe{ \item{}{ \code{Views(subject, start=NULL, end=NULL, width=NULL, names=NULL)}: See \code{?\link[IRanges:Views-class]{Views}} in the IRanges package for the details. } } } \section{Accessor-like methods}{ All the accessor-like methods defined for \code{Views} objects work on XStringViews objects. In addition, the following accessors are defined for XStringViews objects: \describe{ \item{}{ \code{nchar(x)}: A vector of non-negative integers containing the number of letters in each view. Values in \code{nchar(x)} coincide with values in \code{width(x)} except for "out of limits" views where they are lower. } } } \section{Other methods}{ In the code snippets below, \code{x}, \code{object}, \code{e1} and \code{e2} are XStringViews objects, and \code{i} can be a numeric or logical vector. \describe{ \item{}{ \code{e1 == e2}: A vector of logicals indicating the result of the view by view comparison. The views in the shorter of the two XStringViews object being compared are recycled as necessary. Like for comparison between \link{XString} objects, comparison between two XStringViews objects with subjects of different classes is not supported with one exception: when the subjects are \link{DNAString} and \link{RNAString} instances. Also, like with \link{XString} objects, comparison between an XStringViews object with a BString subject and a character vector is supported (see examples below). } \item{}{ \code{e1 != e2}: Equivalent to \code{!(e1 == e2)}. } \item{}{ \code{as.character(x, use.names=TRUE, check.limits=TRUE)}: Converts \code{x} to a character vector of the same length as \code{x}. The \code{use.names} argument controls whether or not \code{names(x)} should be propagated to the names of the returned vector. The \code{check.limits} argument controls whether or not an error should be raised if \code{x} has "out of limit" views. If \code{check.limits} is \code{FALSE} then "out of limit" views are trimmed with a warning. } \item{}{ \code{as.matrix(x, use.names=TRUE)}: Returns a character matrix containing the "exploded" representation of the views. Can only be used on an XStringViews object with equal-width views. The \code{use.names} argument controls whether or not \code{names(x)} should be propagated to the row names of the returned matrix. } \item{}{ \code{toString(x)}: Equivalent to \code{toString(as.character(x))}. } } } \author{H. Pages} \seealso{ \link[IRanges]{Views-class}, \code{\link[IRanges]{gaps}}, \link{XString-class}, \link{XStringSet-class}, \code{\link{letter}}, \link{MIndex-class} } \examples{ ## One standard way to create an XStringViews object is to use ## the Views() constructor. ## Views on a DNAString object: s <- DNAString("-CTC-N") v4 <- Views(s, start=3:0, end=5:8) v4 subject(v4) length(v4) start(v4) end(v4) width(v4) ## Attach a comment to views #3 and #4: names(v4)[3:4] <- "out of limits" names(v4) ## A more programatical way to "tag" the "out of limits" views: names(v4)[start(v4) < 1 | nchar(subject(v4)) < end(v4)] <- "out of limits" ## or just: names(v4)[nchar(v4) < width(v4)] <- "out of limits" ## Two equivalent ways to extract a view as an XString object: s2a <- v4[[2]] s2b <- subseq(subject(v4), start=start(v4)[2], end=end(v4)[2]) identical(s2a, s2b) # TRUE ## It is an error to try to extract an "out of limits" view: #v4[[3]] # Error! v12 <- Views(DNAString("TAATAATG"), start=-2:9, end=0:11) v12 == DNAString("TAA") v12[v12 == v12[4]] v12[v12 == v12[1]] v12[3] == Views(RNAString("AU"), start=0, end=2) ## Here the first view doesn't even overlap with the subject: Views(BString("aaa--b"), start=-3:4, end=-3:4 + c(3:6, 6:3)) ## 'start' and 'end' are recycled: subject <- "abcdefghij" Views(subject, start=2:1, end=4) Views(subject, start=5:7, end=nchar(subject)) Views(subject, start=1, end=5:7) ## Applying gaps() to an XStringViews object: v2 <- Views("abCDefgHIJK", start=c(8, 3), end=c(14, 4)) gaps(v2) ## Coercion: as(v12, "XStringSet") # same as 'as(v12, "DNAStringSet")' rna <- as(v12, "RNAStringSet") as(rna, "Views") } \keyword{methods} \keyword{classes} Biostrings/man/align-utils.Rd0000644000126300012640000001253212227063320017552 0ustar00biocbuildphs_compbio\name{align-utils} \alias{align-utils} \alias{mismatch,AlignedXStringSet0,missing-method} \alias{nmatch,PairwiseAlignments,missing-method} \alias{nmatch,PairwiseAlignmentsSingleSubjectSummary,missing-method} \alias{nmismatch,AlignedXStringSet0,missing-method} \alias{nmismatch,PairwiseAlignments,missing-method} \alias{nmismatch,PairwiseAlignmentsSingleSubjectSummary,missing-method} \alias{nedit} \alias{nedit,PairwiseAlignments-method} \alias{nedit,PairwiseAlignmentsSingleSubjectSummary-method} \alias{mismatchTable} \alias{mismatchTable,AlignedXStringSet0-method} \alias{mismatchTable,QualityAlignedXStringSet-method} \alias{mismatchTable,PairwiseAlignments-method} \alias{mismatchSummary} \alias{mismatchSummary,AlignedXStringSet0-method} \alias{mismatchSummary,QualityAlignedXStringSet-method} \alias{mismatchSummary,PairwiseAlignmentsSingleSubject-method} \alias{mismatchSummary,PairwiseAlignmentsSingleSubjectSummary-method} \alias{coverage,AlignedXStringSet0-method} \alias{coverage,PairwiseAlignmentsSingleSubject-method} \alias{coverage,PairwiseAlignmentsSingleSubjectSummary-method} \alias{compareStrings} \alias{compareStrings,character,character-method} \alias{compareStrings,XString,XString-method} \alias{compareStrings,XStringSet,XStringSet-method} \alias{compareStrings,AlignedXStringSet0,AlignedXStringSet0-method} \alias{compareStrings,PairwiseAlignments,missing-method} \alias{consensusMatrix,PairwiseAlignmentsSingleSubject-method} \title{Utility functions related to sequence alignment} \description{ A variety of different functions used to deal with sequence alignments. } \usage{ nedit(x) # also nmatch and nmismatch mismatchTable(x, shiftLeft=0L, shiftRight=0L, \dots) mismatchSummary(x, \dots) \S4method{coverage}{AlignedXStringSet0}(x, shift=0L, width=NULL, weight=1L) \S4method{coverage}{PairwiseAlignmentsSingleSubject}(x, shift=0L, width=NULL, weight=1L) compareStrings(pattern, subject) \S4method{consensusMatrix}{PairwiseAlignmentsSingleSubject}(x, as.prob=FALSE, shift=0L, width=NULL, baseOnly=FALSE, gapCode="-", endgapCode="-") } \details{ \code{mismatchTable}: a data.frame containing the positions and substrings of the mismatches for the \code{AlignedXStringSet} or \code{PairwiseAlignments} object. \code{mismatchSummary}: a list of data.frame objects containing counts and frequencies of the mismatches for the \code{AlignedXStringSet} or \code{PairwiseAlignmentsSingleSubject} object. \code{compareStrings} combines two equal-length strings that are assumed to be aligned into a single character string containing that replaces mismatches with \code{"?"}, insertions with \code{"+"}, and deletions with \code{"-"}. } \arguments{ \item{x}{ A \code{character} vector or matrix, \code{XStringSet}, \code{XStringViews}, \code{PairwiseAlignments}, or \code{list} of FASTA records containing the equal-length strings. } \item{shiftLeft, shiftRight}{ Non-positive and non-negative integers respectively that specify how many preceding and succeeding characters to and from the mismatch position to include in the mismatch substrings. } \item{\dots}{ Further arguments to be passed to or from other methods. } \item{shift, width}{ See \code{?\link[IRanges]{coverage}}. } \item{weight}{ An integer vector specifying how much each element in \code{x} counts. } \item{pattern, subject}{ The strings to compare. Can be of type \code{character}, \code{XString}, \code{XStringSet}, \code{AlignedXStringSet}, or, in the case of \code{pattern}, \code{PairwiseAlignments}. If \code{pattern} is a \code{PairwiseAlignments} object, then \code{subject} must be missing. } \item{as.prob}{ If \code{TRUE} then probabilities are reported, otherwise counts (the default). } \item{baseOnly}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, the returned vector only contains frequencies for the letters in the "base" alphabet i.e. "A", "C", "G", "T" if \code{x} is a "DNA input", and "A", "C", "G", "U" if \code{x} is "RNA input". When \code{x} is a \link{BString} object (or an \link{XStringViews} object with a \link{BString} subject, or a \link{BStringSet} object), then the \code{baseOnly} argument is ignored. } \item{gapCode, endgapCode}{ The codes in the appropriate \code{\link{alphabet}} to use for the internal and end gaps. } } \seealso{ \code{\link{pairwiseAlignment}}, \code{\link{consensusMatrix}}, \link{XString-class}, \link{XStringSet-class}, \link{XStringViews-class}, \link{AlignedXStringSet-class}, \link{PairwiseAlignments-class}, \link{match-utils} } \examples{ ## Compare two globally aligned strings string1 <- "ACTTCACCAGCTCCCTGGCGGTAAGTTGATC---AAAGG---AAACGCAAAGTTTTCAAG" string2 <- "GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC" compareStrings(string1, string2) ## Create a consensus matrix nw1 <- pairwiseAlignment(AAStringSet(c("HLDNLKGTF", "HVDDMPNAL")), AAString("SMDDTEKMSMKL"), substitutionMatrix = "BLOSUM50", gapOpening = -3, gapExtension = -1) consensusMatrix(nw1) ## Examine the consensus between the bacteriophage phi X174 genomes data(phiX174Phage) phageConsmat <- consensusMatrix(phiX174Phage, baseOnly = TRUE) phageDiffs <- which(apply(phageConsmat, 2, max) < length(phiX174Phage)) phageDiffs phageConsmat[,phageDiffs] } \keyword{methods} Biostrings/man/chartr.Rd0000644000126300012640000000446112227063320016607 0ustar00biocbuildphs_compbio\name{chartr} \alias{chartr,ANY,ANY,XString-method} \alias{chartr,ANY,ANY,XStringSet-method} \alias{chartr,ANY,ANY,XStringViews-method} \alias{chartr,ANY,ANY,MaskedXString-method} \title{Translating letters of a sequence} \description{ Translate letters of a sequence. } \usage{ \S4method{chartr}{ANY,ANY,XString}(old, new, x) } \arguments{ \item{old}{ A character string specifying the characters to be translated. } \item{new}{ A character string specifying the translations. } \item{x}{ The sequence or set of sequences to translate. If \code{x} is an \link{XString}, \link{XStringSet}, \link{XStringViews} or \link{MaskedXString} object, then the appropriate \code{chartr} method is called, otherwise the standard \code{\link[base]{chartr}} R function is called. } } \details{ See \code{?\link[base]{chartr}} for the details. Note that, unlike the standard \code{\link[base]{chartr}} R function, the methods for \link{XString}, \link{XStringSet}, \link{XStringViews} and \link{MaskedXString} objects do NOT support character ranges in the specifications. } \value{ An object of the same class and length as the original object. } \seealso{ \code{\link[base]{chartr}}, \code{\link{replaceLetterAt}}, \link{XString-class}, \link{XStringSet-class}, \link{XStringViews-class}, \link{MaskedXString-class}, \code{\link{alphabetFrequency}}, \code{\link{matchPattern}}, \code{\link{reverseComplement}} } \examples{ x <- BString("MiXeD cAsE 123") chartr("iXs", "why", x) ## --------------------------------------------------------------------- ## TRANSFORMING DNA WITH BISULFITE (AND SEARCHING IT...) ## --------------------------------------------------------------------- library(BSgenome.Celegans.UCSC.ce2) chrII <- Celegans[["chrII"]] alphabetFrequency(chrII) pattern <- DNAString("TGGGTGTATTTA") ## Transforming and searching the + strand plus_strand <- chartr("C", "T", chrII) alphabetFrequency(plus_strand) matchPattern(pattern, plus_strand) matchPattern(pattern, chrII) ## Transforming and searching the - strand minus_strand <- chartr("G", "A", chrII) alphabetFrequency(minus_strand) matchPattern(reverseComplement(pattern), minus_strand) matchPattern(reverseComplement(pattern), chrII) } \keyword{methods} \keyword{manip} Biostrings/man/detail.Rd0000644000126300012640000000151712227063320016565 0ustar00biocbuildphs_compbio\name{detail} \alias{detail} \title{Show (display) detailed object content} \description{ This is a variant of \code{\link{show}}, offering a more detailed display of object content. } \usage{ detail(x, ...) } \arguments{ \item{x}{An object. The default simply invokes \code{\link{show}}.} \item{...}{Additional arguments. The default definition makes no use of these arguments.} } \value{ None; the function is invoked for its side effect (detailed display of object content). } \author{Martin Morgan} \examples{ origMAlign <- readDNAMultipleAlignment(filepath = system.file("extdata", "msx2_mRNA.aln", package="Biostrings"), format="clustal") detail(origMAlign) } \keyword{manip} Biostrings/man/dinucleotideFrequencyTest.Rd0000644000126300012640000000555112227063320022517 0ustar00biocbuildphs_compbio\name{dinucleotideFrequencyTest} \alias{dinucleotideFrequencyTest} \alias{dinucleotideFrequencyTest,DNAStringSet-method} \alias{dinucleotideFrequencyTest,RNAStringSet-method} \title{Pearson's chi-squared Test and G-tests for String Position Dependence} \description{ Performs Person's chi-squared test, G-test, or William's corrected G-test to determine dependence between two nucleotide positions. } \usage{ dinucleotideFrequencyTest(x, i, j, test = c("chisq", "G", "adjG"), simulate.p.value = FALSE, B = 2000) } \arguments{ \item{x}{ A \link{DNAStringSet} or \link{RNAStringSet} object. } \item{i, j}{ Single integer values for positions to test for dependence. } \item{test}{ One of \code{"chisq"} (Person's chi-squared test), \code{"G"} (G-test), or \code{"adjG"} (William's corrected G-test). See Details section. } \item{simulate.p.value}{a logical indicating whether to compute p-values by Monte Carlo simulation. } \item{B}{an integer specifying the number of replicates used in the Monte Carlo test. } } \details{ The null and alternative hypotheses for this function are: \describe{ \item{H0: }{positions \code{i} and \code{j} are independent} \item{H1: }{otherwise} } Let O and E be the observed and expected probabilities for base pair combinations at positions \code{i} and \code{j} respectively. Then the test statistics are calculated as: \describe{ \item{\code{test="chisq"}: }{stat = sum(abs(O - E)^2/E)} \item{\code{test="G"}: }{stat = 2 * sum(O * log(O/E))} \item{\code{test="adjG"}: }{stat = 2 * sum(O * log(O/E))/q, where q = 1 + ((df - 1)^2 - 1)/(6*length(x)*(df - 2))} } Under the null hypothesis, these test statistics are approximately distributed chi-squared(df = ((distinct bases at i) - 1) * ((distinct bases at j) - 1)). } \value{ An htest object. See help(chisq.test) for more details. } \references{ Ellrott, K., Yang, C., Sladek, F.M., Jiang, T. (2002) "Identifying transcription factor binding sites through Markov chain optimations", Bioinformatics, 18 (Suppl. 2), S100-S109. Sokal, R.R., Rohlf, F.J. (2003) "Biometry: The Principle and Practice of Statistics in Biological Research", W.H. Freeman and Company, New York. Tomovic, A., Oakeley, E. (2007) "Position dependencies in transcription factor binding sites", Bioinformatics, 23, 933-941. Williams, D.A. (1976) "Improved Likelihood ratio tests for complete contingency tables", Biometrika, 63, 33-37. } \author{P. Aboyoun} \seealso{ \code{\link{nucleotideFrequencyAt}}, \link{XStringSet-class}, \code{\link[stats]{chisq.test}} } \examples{ data(HNF4alpha) dinucleotideFrequencyTest(HNF4alpha, 1, 2) dinucleotideFrequencyTest(HNF4alpha, 1, 2, test = "G") dinucleotideFrequencyTest(HNF4alpha, 1, 2, test = "adjG") } \keyword{htest} \keyword{distribution} Biostrings/man/findPalindromes.Rd0000644000126300012640000001474712227063320020452 0ustar00biocbuildphs_compbio\name{findPalindromes} \alias{findPalindromes} \alias{findPalindromes,XString-method} \alias{findPalindromes,XStringViews-method} \alias{findPalindromes,MaskedXString-method} \alias{palindromeArmLength} \alias{palindromeArmLength,XString-method} \alias{palindromeArmLength,XStringViews-method} \alias{palindromeLeftArm} \alias{palindromeLeftArm,XString-method} \alias{palindromeLeftArm,XStringViews-method} \alias{palindromeRightArm} \alias{palindromeRightArm,XString-method} \alias{palindromeRightArm,XStringViews-method} \alias{findComplementedPalindromes} \alias{findComplementedPalindromes,DNAString-method} \alias{findComplementedPalindromes,XStringViews-method} \alias{findComplementedPalindromes,MaskedXString-method} \alias{complementedPalindromeArmLength} \alias{complementedPalindromeArmLength,DNAString-method} \alias{complementedPalindromeArmLength,XStringViews-method} \alias{complementedPalindromeLeftArm} \alias{complementedPalindromeLeftArm,DNAString-method} \alias{complementedPalindromeLeftArm,XStringViews-method} \alias{complementedPalindromeRightArm} \alias{complementedPalindromeRightArm,DNAString-method} \alias{complementedPalindromeRightArm,XStringViews-method} \title{Searching a sequence for palindromes or complemented palindromes} \description{ The \code{findPalindromes} and \code{findComplementedPalindromes} functions can be used to find palindromic or complemented palindromic regions in a sequence. \code{palindromeArmLength}, \code{palindromeLeftArm}, \code{palindromeRightArm}, \code{complementedPalindromeArmLength}, \code{complementedPalindromeLeftArm} and \code{complementedPalindromeRightArm} are utility functions for operating on palindromic or complemented palindromic sequences. } \usage{ findPalindromes(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) palindromeArmLength(x, max.mismatch=0, ...) palindromeLeftArm(x, max.mismatch=0, ...) palindromeRightArm(x, max.mismatch=0, ...) findComplementedPalindromes(subject, min.armlength=4, max.looplength=1, min.looplength=0, max.mismatch=0) complementedPalindromeArmLength(x, max.mismatch=0, ...) complementedPalindromeLeftArm(x, max.mismatch=0, ...) complementedPalindromeRightArm(x, max.mismatch=0, ...) } \arguments{ \item{subject}{ An \link{XString} object containing the subject string, or an \link{XStringViews} object. } \item{min.armlength}{ An integer giving the minimum length of the arms of the palindromes (or complemented palindromes) to search for. } \item{max.looplength}{ An integer giving the maximum length of "the loop" (i.e the sequence separating the 2 arms) of the palindromes (or complemented palindromes) to search for. Note that by default (\code{max.looplength=1}), \code{findPalindromes} will search for strict palindromes (or complemented palindromes) only. } \item{min.looplength}{ An integer giving the minimum length of "the loop" of the palindromes (or complemented palindromes) to search for. } \item{max.mismatch}{ The maximum number of mismatching letters allowed between the 2 arms of the palindromes (or complemented palindromes) to search for. } \item{x}{ An \link{XString} object containing a 2-arm palindrome or complemented palindrome, or an \link{XStringViews} object containing a set of 2-arm palindromes or complemented palindromes. } \item{...}{ Additional arguments to be passed to or from methods. } } \details{ The \code{findPalindromes} function finds palindromic substrings in a subject string. The palindromes that can be searched for are either strict palindromes or 2-arm palindromes (the former being a particular case of the latter) i.e. palindromes where the 2 arms are separated by an arbitrary sequence called "the loop". Use the \code{findComplementedPalindromes} function to find complemented palindromic substrings in a \link{DNAString} subject (in a complemented palindrome the 2 arms are reverse-complementary sequences). } \value{ \code{findPalindromes} and \code{findComplementedPalindromes} return an \link{XStringViews} object containing all palindromes (or complemented palindromes) found in \code{subject} (one view per palindromic substring found). \code{palindromeArmLength} and \code{complementedPalindromeArmLength} return the arm length (integer) of the 2-arm palindrome (or complemented palindrome) \code{x}. It will raise an error if \code{x} has no arms. Note that any sequence could be considered a 2-arm palindrome if we were OK with arms of length 0 but we are not: \code{x} must have arms of length greater or equal to 1 in order to be considered a 2-arm palindrome. The same apply to 2-arm complemented palindromes. When applied to an \link{XStringViews} object \code{x}, \code{palindromeArmLength} and \code{complementedPalindromeArmLength} behave in a vectorized fashion by returning an integer vector of the same length as \code{x}. \code{palindromeLeftArm} and \code{complementedPalindromeLeftArm} return an object of the same class as the original object \code{x} and containing the left arm of \code{x}. \code{palindromeRightArm} does the same as \code{palindromeLeftArm} but on the right arm of \code{x}. Like \code{palindromeArmLength}, both \code{palindromeLeftArm} and \code{palindromeRightArm} will raise an error if \code{x} has no arms. Also, when applied to an \link{XStringViews} object \code{x}, both behave in a vectorized fashion by returning an \link{XStringViews} object of the same length as \code{x}. } \author{H. Pages} \seealso{ \code{\link{maskMotif}}, \code{\link{matchPattern}}, \code{\link{matchLRPatterns}}, \code{\link{matchProbePair}}, \link{XStringViews-class}, \link{DNAString-class} } \examples{ ## Note that complemented palindromes (like palindromes) can be nested findComplementedPalindromes(DNAString("ACGTTNAACGT-ACGTTNAACGT")) ## A real use case library(BSgenome.Dmelanogaster.UCSC.dm3) chrX <- Dmelanogaster$chrX chrX_pals <- findComplementedPalindromes(chrX, min.armlength=50, max.looplength=20) complementedPalindromeArmLength(chrX_pals) # 251 ## Of course, whitespaces matter palindromeArmLength(BString("was it a car or a cat I saw")) ## Note that the 2 arms of a strict palindrome (or strict complemented ## palindrome) are equal to the full sequence. palindromeLeftArm(BString("Delia saw I was aileD")) complementedPalindromeLeftArm(DNAString("N-ACGTT-AACGT-N")) palindromeLeftArm(DNAString("N-AAA-N-N-TTT-N")) } \keyword{methods} Biostrings/man/getSeq.Rd0000644000126300012640000000232612227063320016552 0ustar00biocbuildphs_compbio\name{getSeq} \alias{getSeq} \title{getSeq} \description{ A generic function for extracting a set of sequences (or subsequences) from a sequence container like a \link[BSgenome]{BSgenome} object or other. } \usage{ getSeq(x, ...) } \arguments{ \item{x}{ A \link[BSgenome]{BSgenome} object or any other supported object. Do \code{showMethods("getSeq")} to get the list of all supported types for \code{x}. } \item{...}{ Any additional arguments needed by the specialized methods. } } \value{ An \link{XString} object or an \link{XStringSet} object or a character vector containing the extracted sequence(s). See man pages of individual methods for the details e.g. with \code{?`\link[BSgenome]{getSeq,BSgenome-method}`} to access the man page of the method for \link[BSgenome]{BSgenome} objects (make sure the BSgenome package is loaded first). } \seealso{ \link[BSgenome]{getSeq,BSgenome-method}, \link{XString-class}, \link{XStringSet-class} } \examples{ ## Note that you need to load the package(s) defining the specialized ## methods to have showMethods() display them and to be able to access ## their man pages: library(BSgenome) showMethods("getSeq") } \keyword{manip} Biostrings/man/gregexpr2.Rd0000644000126300012640000000256212227063320017231 0ustar00biocbuildphs_compbio\name{gregexpr2} \alias{gregexpr2} \title{A replacement for R standard gregexpr function} \description{ This is a replacement for the standard gregexpr function that does exact matching only. Standard gregexpr() misses matches when they are overlapping. The gregexpr2 function finds all matches but it only works in "fixed" mode i.e. for exact matching (regular expressions are not supported). } \usage{ gregexpr2(pattern, text) } \arguments{ \item{pattern}{ character string to be matched in the given character vector } \item{text}{ a character vector where matches are sought } } \value{ A list of the same length as \code{text} each element of which is an integer vector as in \code{gregexpr}, except that the starting positions of all (even overlapping) matches are given. Note that, unlike \code{gregexpr}, \code{gregexpr2} doesn't attach a "match.length" attribute to each element of the returned list because, since it only works in "fixed" mode, then all the matches have the length of the pattern. Another difference with \code{gregexpr} is that with \code{gregexpr2}, the \code{pattern} argument must be a single (non-NA, non-empty) string. } \author{H. Pages} \seealso{\code{\link{gregexpr}}, \code{\link{matchPattern}}} \examples{ gregexpr("aa", c("XaaaYaa", "a"), fixed=TRUE) gregexpr2("aa", c("XaaaYaa", "a")) } \keyword{manip} Biostrings/man/injectHardMask.Rd0000644000126300012640000001022512227063320020206 0ustar00biocbuildphs_compbio\name{injectHardMask} \alias{injectHardMask} \alias{injectHardMask,XStringViews-method} \alias{injectHardMask,MaskedXString-method} \title{Injecting a hard mask in a sequence} \description{ \code{injectHardMask} allows the user to "fill" the masked regions of a sequence with an arbitrary letter (typically the \code{"+"} letter). } \usage{ injectHardMask(x, letter="+") } \arguments{ \item{x}{ A \link{MaskedXString} or \link{XStringViews} object. } \item{letter}{ A single letter. } } \details{ The name of the \code{injectHardMask} function was chosen because of the primary use that it is intended for: converting a pile of active "soft masks" into a "hard mask". Here the pile of active "soft masks" refers to the active masks that have been put on top of a sequence. In Biostrings, the original sequence and the masks defined on top of it are bundled together in one of the dedicated containers for this: the \link{MaskedBString}, \link{MaskedDNAString}, \link{MaskedRNAString} and \link{MaskedAAString} containers (this is the \link{MaskedXString} family of containers). The original sequence is always stored unmodified in a \link{MaskedXString} object so no information is lost. This allows the user to activate/deactivate masks without having to worry about losing the letters that are in the regions that are masked/unmasked. Also this allows better memory management since the original sequence never needs to be copied, even when the set of active/inactive masks changes. However, there are situations where the user might want to \emph{really} get rid of the letters that are in some particular regions by replacing them with a junk letter (e.g. \code{"+"}) that is guaranteed to not interfer with the analysis that s/he is currently doing. For example, it's very likely that a set of motifs or short reads will not contain the \code{"+"} letter (this could easily be checked) so they will never hit the regions filled with \code{"+"}. In a way, it's like the regions filled with \code{"+"} were masked but we call this kind of masking "hard masking". Some important differences between "soft" and "hard" masking: \describe{ \item{}{ \code{injectHardMask} creates a (modified) copy of the original sequence. Using "soft masking" does not. } \item{}{ A function that is "mask aware" like \code{alphabetFrequency} or \code{matchPattern} will really skip the masked regions when "soft masking" is used i.e. they will not walk thru the regions that are under active masks. This might lead to some speed improvements when a high percentage of the original sequence is masked. With "hard masking", the entire sequence is walked thru. } \item{}{ Matches cannot span over masked regions with "soft masking". With "hard masking" they can. } } } \value{ An \link{XString} object of the same length as the orignal object \code{x} if \code{x} is a \link{MaskedXString} object, or of the same length as \code{subject(x)} if it's an \link{XStringViews} object. } \author{H. Pages} \seealso{ \code{\link{maskMotif}}, \link{MaskedXString-class}, \code{\link{replaceLetterAt}}, \code{\link{chartr}}, \link{XString}, \link{XStringViews-class} } \examples{ ## --------------------------------------------------------------------- ## A. WITH AN XStringViews OBJECT ## --------------------------------------------------------------------- v2 <- Views("abCDefgHIJK", start=c(8, 3), end=c(14, 4)) injectHardMask(v2) injectHardMask(v2, letter="=") ## --------------------------------------------------------------------- ## B. WITH A MaskedXString OBJECT ## --------------------------------------------------------------------- mask0 <- Mask(mask.width=29, start=c(3, 10, 25), width=c(6, 8, 5)) x <- DNAString("ACACAACTAGATAGNACTNNGAGAGACGC") masks(x) <- mask0 x subject <- injectHardMask(x) ## Matches can span over masked regions with "hard masking": matchPattern("ACggggggA", subject, max.mismatch=6) ## but not with "soft masking": matchPattern("ACggggggA", x, max.mismatch=6) } \keyword{utilities} \keyword{manip} Biostrings/man/letter.Rd0000644000126300012640000000306512227063320016622 0ustar00biocbuildphs_compbio\name{letter} \alias{letter} \alias{letter,character-method} \alias{letter,XString-method} \alias{letter,XStringViews-method} \alias{letter,MaskedXString-method} \title{Subsetting a string} \description{ Extract a substring from a string by picking up individual letters by their position. } \usage{ letter(x, i) } \arguments{ \item{x}{ A character vector, or an \link{XString}, \link{XStringViews} or \link{MaskedXString} object. } \item{i}{ An integer vector with no NAs. } } \details{ Unlike with the \code{substr} or \code{substring} functions, \code{i} must contain valid positions. } \value{ A character vector of length 1 when \code{x} is an \link{XString} or \link{MaskedXString} object (the masks are ignored for the latter). A character vector of the same length as \code{x} when \code{x} is a character vector or an \link{XStringViews} object. Note that, because \code{i} must contain valid positions, all non-NA elements in the result are guaranteed to have exactly \code{length(i)} characters. } \seealso{ \code{\link[XVector]{subseq}}, \link{XString-class}, \link{XStringViews-class}, \link{MaskedXString-class} } \examples{ x <- c("abcd", "ABC") i <- c(3, 1, 1, 2, 1) ## With a character vector: letter(x[1], 3:1) letter(x, 3) letter(x, i) #letter(x, 4) # Error! ## With a BString object: letter(BString(x[1]), i) # returns a character vector BString(x[1])[i] # returns a BString object ## With an XStringViews object: x2 <- as(BStringSet(x), "Views") letter(x2, i) } \keyword{methods} Biostrings/man/letterFrequency.Rd0000644000126300012640000004221112227063320020500 0ustar00biocbuildphs_compbio\name{letterFrequency} \alias{letterFrequency} \alias{letterFrequency,MaskedXString-method} \alias{letterFrequency,XString-method} \alias{letterFrequency,XStringSet-method} \alias{letterFrequency,XStringViews-method} \alias{alphabetFrequency} \alias{alphabetFrequency,XString-method} \alias{alphabetFrequency,DNAString-method} \alias{alphabetFrequency,RNAString-method} \alias{alphabetFrequency,XStringSet-method} \alias{alphabetFrequency,DNAStringSet-method} \alias{alphabetFrequency,RNAStringSet-method} \alias{alphabetFrequency,XStringViews-method} \alias{alphabetFrequency,MaskedXString-method} \alias{hasOnlyBaseLetters} \alias{hasOnlyBaseLetters,DNAString-method} \alias{hasOnlyBaseLetters,DNAStringSet-method} \alias{hasOnlyBaseLetters,RNAString-method} \alias{hasOnlyBaseLetters,RNAStringSet-method} \alias{hasOnlyBaseLetters,XStringViews-method} \alias{hasOnlyBaseLetters,MaskedXString-method} \alias{uniqueLetters} \alias{uniqueLetters,XString-method} \alias{uniqueLetters,XStringSet-method} \alias{uniqueLetters,XStringViews-method} \alias{uniqueLetters,MaskedXString-method} \alias{letterFrequencyInSlidingView} \alias{letterFrequencyInSlidingView,XString-method} %\alias{letterFrequencyInSlidingView,XStringSet-method} %\alias{letterFrequencyInSlidingView,XStringViews-method} %\alias{letterFrequencyInSlidingView,MaskedXString-method} \alias{consensusMatrix} \alias{consensusMatrix,character-method} \alias{consensusMatrix,matrix-method} \alias{consensusMatrix,XStringSet-method} \alias{consensusMatrix,XStringViews-method} \alias{consensusString} \alias{consensusString,matrix-method} \alias{consensusString,BStringSet-method} \alias{consensusString,DNAStringSet-method} \alias{consensusString,RNAStringSet-method} \alias{consensusString,XStringViews-method} \alias{consensusString,ANY-method} \title{Calculate the frequency of letters in a biological sequence, or the consensus matrix of a set of sequences} \description{ Given a biological sequence (or a set of biological sequences), the \code{alphabetFrequency} function computes the frequency of each letter of the relevant \link{alphabet}. \code{letterFrequency} is similar, but more compact if one is only interested in certain letters. It can also tabulate letters "in common". \code{letterFrequencyInSlidingView} is a more specialized version of \code{letterFrequency} for (non-masked) \link{XString} objects. It tallys the requested letter frequencies for a fixed-width view, or window, that is conceptually slid along the entire input sequence. The \code{consensusMatrix} function computes the consensus matrix of a set of sequences, and the \code{consensusString} function creates the consensus sequence from the consensus matrix based upon specified criteria. In this man page we call "DNA input" (or "RNA input") an \link{XString}, \link{XStringSet}, \link{XStringViews} or \link{MaskedXString} object of base type DNA (or RNA). } \usage{ alphabetFrequency(x, as.prob=FALSE, ...) hasOnlyBaseLetters(x) uniqueLetters(x) letterFrequency(x, letters, OR="|", as.prob=FALSE, ...) letterFrequencyInSlidingView(x, view.width, letters, OR="|", as.prob=FALSE) consensusMatrix(x, as.prob=FALSE, shift=0L, width=NULL, ...) \S4method{consensusString}{matrix}(x, ambiguityMap="?", threshold=0.5) \S4method{consensusString}{DNAStringSet}(x, ambiguityMap=IUPAC_CODE_MAP, threshold=0.25, shift=0L, width=NULL) \S4method{consensusString}{RNAStringSet}(x, ambiguityMap= structure(as.character(RNAStringSet(DNAStringSet(IUPAC_CODE_MAP))), names= as.character(RNAStringSet(DNAStringSet(names(IUPAC_CODE_MAP))))), threshold=0.25, shift=0L, width=NULL) } \arguments{ \item{x}{ An \link{XString}, \link{XStringSet}, \link{XStringViews} or \link{MaskedXString} object for \code{alphabetFrequency}, \code{letterFrequency}, or \code{uniqueLetters}. DNA or RNA input for \code{hasOnlyBaseLetters}. An \link{XString} object for \code{letterFrequencyInSlidingView}. A character vector, or an \link{XStringSet} or \link{XStringViews} object for \code{consensusMatrix}. A consensus matrix (as returned by \code{consensusMatrix}), or an \link{XStringSet} or \link{XStringViews} object for \code{consensusString}. } \item{as.prob}{ If \code{TRUE} then probabilities are reported, otherwise counts (the default). } \item{view.width}{ For \code{letterFrequencyInSlidingView}, the constant (e.g. 35, 48, 1000) size of the "window" to slide along \code{x}. The specified \code{letters} are tabulated in each window of length \code{view.width}. The rows of the result (see value) correspond to the various windows. } \item{letters}{ For \code{letterFrequency} or \code{letterFrequencyInSlidingView}, a character vector (e.g. "C", "CG", \link{c}("C", "G")) giving the letters to tabulate. When \code{x} is DNA or RNA input, \code{letters} must come from \code{\link{alphabet}(x)}. Except with \code{OR=0}, multi-character elements of letters ('nchar' > 1) are taken as groupings of letters into subsets, to be tabulated in common ("or"'d), as if their alphabetFrequency's were added (\link{Arithmetic}). The columns of the result (see value) correspond to the individual and sets of letters which are counted separately. Unrelated (and, with some post-processing, related) counts may of course be obtained in separate calls. } \item{OR}{ For \code{letterFrequency} or \code{letterFrequencyInSlidingView}, the string (default \code{|}) to use as a separator in forming names for the "grouped" columns, e.g. "C|G". The otherwise exceptional value \code{0} (zero) disables or'ing and is provided for convenience, allowing a single multi-character string (or several strings) of letters that should be counted separately. If some but not all letters are to be counted separately, they must reside in separate elements of letters (with 'nchar' 1 unless they are to be grouped with other letters), and \code{OR} cannot be 0. } \item{ambiguityMap}{ Either a single character to use when agreement is not reached or a named character vector where the names are the ambiguity characters and the values are the combinations of letters that comprise the ambiguity (e.g. \code{link{IUPAC_CODE_MAP}}). When \code{ambiguityMap} is a named character vector, occurrences of ambiguous letters in \code{x} are replaced with their base alphabet letters that have been equally weighted to sum to 1. (See Details for some examples.) } \item{threshold}{ The minimum probability threshold for an agreement to be declared. When \code{ambiguityMap} is a single character, \code{threshold} is a single number in (0, 1]. When \code{ambiguityMap} is a named character vector (e.g. \code{link{IUPAC_CODE_MAP}}), \code{threshold} is a single number in (0, 1/sum(nchar(ambiguityMap) == 1)]. } \item{...}{ Further arguments to be passed to or from other methods. For the \link{XStringViews} and \link{XStringSet} methods, the \code{collapse} argument is accepted. Except for \code{letterFrequency} or \code{letterFrequencyInSlidingView}, and with DNA or RNA input, the \code{baseOnly} argument is accepted. If \code{baseOnly} is \code{TRUE}, the returned vector (or matrix) only contains the frequencies of the letters that belong to the "base" alphabet of \code{x} i.e. to the alphabet returned by \code{alphabet(x, baseOnly=TRUE)}. } \item{shift}{ An integer vector (recycled to the length of \code{x}) specifying how each sequence in \code{x} should be (horizontally) shifted with respect to the first column of the consensus matrix to be returned. By default (\code{shift=0}), each sequence in \code{x} has its first letter aligned with the first column of the matrix. A positive \code{shift} value means that the corresponding sequence must be shifted to the right, and a negative \code{shift} value that it must be shifted to the left. For example, a shift of 5 means that it must be shifted 5 positions to the right (i.e. the first letter in the sequence must be aligned with the 6th column of the matrix), and a shift of -3 means that it must be shifted 3 positions to the left (i.e. the 4th letter in the sequence must be aligned with the first column of the matrix). } \item{width}{ The number of columns of the returned matrix for the \code{consensusMatrix} method for \link{XStringSet} objects. When \code{width=NULL} (the default), then this method returns a matrix that has just enough columns to have its last column aligned with the rightmost letter of all the sequences in \code{x} after those sequences have been shifted (see the \code{shift} argument above). This ensures that any wider consensus matrix would be a "padded with zeros" version of the matrix returned when \code{width=NULL}. The length of the returned sequence for the \code{consensusString} method for \link{XStringSet} objects. } } \details{ \code{alphabetFrequency}, \code{letterFrequency}, and \code{letterFrequencyInSlidingView} are generic functions defined in the Biostrings package. \code{letterFrequency} is similar to \code{alphabetFrequency} but specific to the letters of interest, hence more compact, especially with \code{OR} non-zero. \code{letterFrequencyInSlidingView} yields the same result, on the sequence \code{x}, that \code{letterFrequency} would, if applied to the hypothetical (and possibly huge) \code{\link{XStringViews}} object consisting of all the intervals of length \code{view.width} on \code{x}. Taking advantage of the knowledge that successive "views" are nearly identical, for letter counting purposes, it is both lighter and faster. For \code{letterFrequencyInSlidingView}, a masked (\link{MaskedXString}) object \code{x} is only supported through a cast to an (ordinary) \link{XString} such as \code{\link{unmasked}} (which includes its masked regions). When \code{consensusString} is executed with a named character \code{ambiguityMap} argument, it weights each input string equally and assigns an equal probability to each of the base letters represented by an ambiguity letter. So for DNA and a \code{threshold} of 0.25, a "G" and an "R" would result in an "R" since 1/2 "G" + 1/2 "R" = 3/4 "G" + 1/4 "A" => "R"; two "G"'s and one "R" would result in a "G" since 2/3 "G" + 1/3 "R" = 5/6 "G" + 1/6 "A" => "G"; and one "A" and one "N" would result in an "N" since 1/2 "A" + 1/2 "N" = 5/8 "A" + 1/8 "C" + 1/8 "G" + 1/8 "T" => "N". } \value{ \code{alphabetFrequency} returns an integer vector when \code{x} is an \link{XString} or \link{MaskedXString} object. When \code{x} is an \link{XStringSet} or \link{XStringViews} object, then it returns an integer matrix with \code{length(x)} rows where the \code{i}-th row contains the frequencies for \code{x[[i]]}. If \code{x} is a DNA or RNA input, then the returned vector is named with the letters in the alphabet. If the \code{baseOnly} argument is \code{TRUE}, then the returned vector has only 5 elements: 4 elements corresponding to the 4 nucleotides + the 'other' element. \code{letterFrequency} returns, similarly, an integer vector or matrix, but restricted and/or collated according to \code{letters} and \code{OR}. \code{letterFrequencyInSlidingView} returns, for an \link{XString} object \code{x} of length (\code{\link{nchar}}) L, an integer matrix with \code{L-view.width+1} rows, the \code{i}-th of which holding the letter frequencies of \code{\link{substring}(x, i, i+view.width-1)}. \code{hasOnlyBaseLetters} returns \code{TRUE} or \code{FALSE} indicating whether or not \code{x} contains only base letters (i.e. As, Cs, Gs and Ts for DNA input and As, Cs, Gs and Us for RNA input). \code{uniqueLetters} returns a vector of 1-letter or empty strings. The empty string is used to represent the nul character if \code{x} happens to contain any. Note that this can only happen if the base class of \code{x} is \link{BString}. An integer matrix with letters as row names for \code{consensusMatrix}. A standard character string for \code{consensusString}. } \author{H. Pages and P. Aboyoun; H. Jaffee for letterFrequency and letterFrequencyInSlidingView} \seealso{ \code{\link{alphabet}}, \code{\link[IRanges]{coverage}}, \code{\link{oligonucleotideFrequency}}, \code{\link{countPDict}}, \link{XString-class}, \link{XStringSet-class}, \link{XStringViews-class}, \link{MaskedXString-class}, \code{\link{strsplit}} } \examples{ ## --------------------------------------------------------------------- ## alphabetFrequency() ## --------------------------------------------------------------------- data(yeastSEQCHR1) yeast1 <- DNAString(yeastSEQCHR1) alphabetFrequency(yeast1) alphabetFrequency(yeast1, baseOnly=TRUE) hasOnlyBaseLetters(yeast1) uniqueLetters(yeast1) ## With input made of multiple sequences: library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) alphabetFrequency(probes[1:50], baseOnly=TRUE) alphabetFrequency(probes, baseOnly=TRUE, collapse=TRUE) ## --------------------------------------------------------------------- ## letterFrequency() ## --------------------------------------------------------------------- letterFrequency(probes[[1]], letters="ACGT", OR=0) base_letters <- alphabet(probes, baseOnly=TRUE) base_letters letterFrequency(probes[[1]], letters=base_letters, OR=0) base_letter_freqs <- letterFrequency(probes, letters=base_letters, OR=0) head(base_letter_freqs) GC_content <- letterFrequency(probes, letters="CG") head(GC_content) letterFrequency(probes, letters="CG", collapse=TRUE) ## --------------------------------------------------------------------- ## letterFrequencyInSlidingView() ## --------------------------------------------------------------------- data(yeastSEQCHR1) x <- DNAString(yeastSEQCHR1) view.width <- 48 letters <- c("A", "CG") two_columns <- letterFrequencyInSlidingView(x, view.width, letters) head(two_columns) tail(two_columns) three_columns <- letterFrequencyInSlidingView(x, view.width, letters, OR=0) head(three_columns) tail(three_columns) stopifnot(identical(two_columns[ , "C|G"], three_columns[ , "C"] + three_columns[ , "G"])) ## Note that, alternatively, 'three_columns' can also be obtained by ## creating the views on 'x' (as a Views object) and by calling ## alphabetFrequency() on it. But, of course, that is be *much* less ## efficient (both, in terms of memory and speed) than using ## letterFrequencyInSlidingView(): v <- Views(x, start=seq_len(length(x) - view.width + 1), width=view.width) v three_columns2 <- alphabetFrequency(v, baseOnly=TRUE)[ , c("A", "C", "G")] stopifnot(identical(three_columns2, three_columns)) ## Set the width of the view to length(x) to get the global frequencies: letterFrequencyInSlidingView(x, letters="ACGTN", view.width=length(x), OR=0) ## --------------------------------------------------------------------- ## consensus*() ## --------------------------------------------------------------------- ## Read in ORF data: file <- system.file("extdata", "someORF.fa", package="Biostrings") orf <- readDNAStringSet(file) ## To illustrate, the following example assumes the ORF data ## to be aligned for the first 10 positions (patently false): orf10 <- DNAStringSet(orf, end=10) consensusMatrix(orf10, baseOnly=TRUE) ## The following example assumes the first 10 positions to be aligned ## after some incremental shifting to the right (patently false): consensusMatrix(orf10, baseOnly=TRUE, shift=0:6) consensusMatrix(orf10, baseOnly=TRUE, shift=0:6, width=10) ## For the character matrix containing the "exploded" representation ## of the strings, do: as.matrix(orf10, use.names=FALSE) ## consensusMatrix() can be used to just compute the alphabet frequency ## for each position in the input sequences: consensusMatrix(probes, baseOnly=TRUE) ## After sorting, the first 5 probes might look similar (at least on ## their first bases): consensusString(sort(probes)[1:5]) consensusString(sort(probes)[1:5], ambiguityMap = "N", threshold = 0.5) ## Consensus involving ambiguity letters in the input strings consensusString(DNAStringSet(c("NNNN","ACTG"))) consensusString(DNAStringSet(c("AANN","ACTG"))) consensusString(DNAStringSet(c("ACAG","ACAR"))) consensusString(DNAStringSet(c("ACAG","ACAR", "ACAG"))) ## --------------------------------------------------------------------- ## C. RELATIONSHIP BETWEEN consensusMatrix() AND coverage() ## --------------------------------------------------------------------- ## Applying colSums() on a consensus matrix gives the coverage that ## would be obtained by piling up (after shifting) the input sequences ## on top of an (imaginary) reference sequence: cm <- consensusMatrix(orf10, shift=0:6, width=10) colSums(cm) ## Note that this coverage can also be obtained with: as.integer(coverage(IRanges(rep(1, length(orf)), width(orf)), shift=0:6, width=10)) } \keyword{methods} \keyword{manip} Biostrings/man/longestConsecutive.Rd0000644000126300012640000000137112227063320021204 0ustar00biocbuildphs_compbio\name{longestConsecutive} \alias{longestConsecutive} \title{Obtain the length of the longest substring containing only 'letter'} \description{ This function accepts a character vector and computes the length of the longest substring containing only \code{letter} for each element of \code{x}. } \usage{ longestConsecutive(seq, letter) } \arguments{ \item{seq}{Character vector.} \item{letter}{Character vector of length 1, containing one single character.} } \details{ The elements of \code{x} can be in upper case, lower case or mixed. NAs are handled. } \value{ An integer vector of the same length as \code{x}. } \author{W. Huber} \examples{ v = c("AAACTGTGFG", "GGGAATT", "CCAAAAAAAAAATT") longestConsecutive(v, "A") } \keyword{manip} Biostrings/man/lowlevel-matching.Rd0000644000126300012640000003322612227063320020746 0ustar00biocbuildphs_compbio\name{lowlevel-matching} \alias{lowlevel-matching} \alias{neditStartingAt} \alias{neditEndingAt} \alias{neditAt} \alias{neditStartingAt,character-method} \alias{neditStartingAt,XString-method} \alias{neditStartingAt,XStringSet-method} \alias{neditEndingAt,character-method} \alias{neditEndingAt,XString-method} \alias{neditEndingAt,XStringSet-method} \alias{isMatchingStartingAt} \alias{isMatchingEndingAt} \alias{isMatchingAt} \alias{isMatchingStartingAt,character-method} \alias{isMatchingStartingAt,XString-method} \alias{isMatchingStartingAt,XStringSet-method} \alias{isMatchingEndingAt,character-method} \alias{isMatchingEndingAt,XString-method} \alias{isMatchingEndingAt,XStringSet-method} \alias{which.isMatchingStartingAt} \alias{which.isMatchingEndingAt} \alias{which.isMatchingAt} \alias{which.isMatchingStartingAt,character-method} \alias{which.isMatchingStartingAt,XString-method} \alias{which.isMatchingStartingAt,XStringSet-method} \alias{which.isMatchingEndingAt,character-method} \alias{which.isMatchingEndingAt,XString-method} \alias{which.isMatchingEndingAt,XStringSet-method} \alias{hasLetterAt} \title{Low-level matching functions} \description{ In this man page we define precisely and illustrate what a "match" of a pattern P in a subject S is in the context of the Biostrings package. This definition of a "match" is central to most pattern matching functions available in this package: unless specified otherwise, most of them will adhere to the definition provided here. \code{hasLetterAt} checks whether a sequence or set of sequences has the specified letters at the specified positions. \code{neditAt}, \code{isMatchingAt} and \code{which.isMatchingAt} are low-level matching functions that only look for matches at the specified positions in the subject. } \usage{ hasLetterAt(x, letter, at, fixed=TRUE) ## neditAt() and related utils: neditAt(pattern, subject, at=1, with.indels=FALSE, fixed=TRUE) neditStartingAt(pattern, subject, starting.at=1, with.indels=FALSE, fixed=TRUE) neditEndingAt(pattern, subject, ending.at=1, with.indels=FALSE, fixed=TRUE) ## isMatchingAt() and related utils: isMatchingAt(pattern, subject, at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) isMatchingStartingAt(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) isMatchingEndingAt(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE) ## which.isMatchingAt() and related utils: which.isMatchingAt(pattern, subject, at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) which.isMatchingStartingAt(pattern, subject, starting.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) which.isMatchingEndingAt(pattern, subject, ending.at=1, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, follow.index=FALSE, auto.reduce.pattern=FALSE) } \arguments{ \item{x}{ A character vector, or an \link{XString} or \link{XStringSet} object. } \item{letter}{ A character string or an \link{XString} object containing the letters to check. } \item{at, starting.at, ending.at}{ An integer vector specifying the starting (for \code{starting.at} and \code{at}) or ending (for \code{ending.at}) positions of the pattern relatively to the subject. With \code{auto.reduce.pattern} (below), either a single integer or a constant vector of length \code{nchar(pattern)} (below), to which the former is immediately converted. For the \code{hasLetterAt} function, \code{letter} and \code{at} must have the same length. } \item{pattern}{ The pattern string (but see \code{auto.reduce.pattern}, below). } \item{subject}{ A character vector, or an \link{XString} or \link{XStringSet} object containing the subject sequence(s). } \item{max.mismatch, min.mismatch}{ Integer vectors of length >= 1 recycled to the length of the \code{at} (or \code{starting.at}, or \code{ending.at}) argument. More details below. } \item{with.indels}{ See details below. } \item{fixed}{ Only with a \link{DNAString} or \link{RNAString}-based subject can a \code{fixed} value other than the default (\code{TRUE}) be used. If \code{TRUE} (the default), an IUPAC ambiguity code in the pattern can only match the same code in the subject, and vice versa. If \code{FALSE}, an IUPAC ambiguity code in the pattern can match any letter in the subject that is associated with the code, and vice versa. See \code{\link{IUPAC_CODE_MAP}} for more information about the IUPAC Extended Genetic Alphabet. \code{fixed} can also be a character vector, a subset of \code{c("pattern", "subject")}. \code{fixed=c("pattern", "subject")} is equivalent to \code{fixed=TRUE} (the default). An empty vector is equivalent to \code{fixed=FALSE}. With \code{fixed="subject"}, ambiguities in the pattern only are interpreted as wildcards. With \code{fixed="pattern"}, ambiguities in the subject only are interpreted as wildcards. } \item{follow.index}{ Whether the single integer returned by \code{which.isMatchingAt} (and related utils) should be the first *value* in \code{at} for which a match occurred, or its *index* in \code{at} (the default). } \item{auto.reduce.pattern}{ Whether \code{pattern} should be effectively shortened by 1 letter, from its beginning for \code{which.isMatchingStartingAt} and from its end for \code{which.isMatchingEndingAt}, for each successive \code{(at, max.mismatch)} "pair". } } \details{ A "match" of pattern P in subject S is a substring S' of S that is considered similar enough to P according to some distance (or metric) specified by the user. 2 distances are supported by most pattern matching functions in the Biostrings package. The first (and simplest) one is the "number of mismatching letters". It is defined only when the 2 strings to compare have the same length, so when this distance is used, only matches that have the same number of letters as P are considered. The second one is the "edit distance" (aka Levenshtein distance): it's the minimum number of operations needed to transform P into S', where an operation is an insertion, deletion, or substitution of a single letter. When this metric is used, matches can have a different number of letters than P. The \code{neditAt} function implements these 2 distances. If \code{with.indels} is \code{FALSE} (the default), then the first distance is used i.e. \code{neditAt} returns the "number of mismatching letters" between the pattern P and the substring S' of S starting at the positions specified in \code{at} (note that \code{neditAt} is vectorized so a long vector of integers can be passed thru the \code{at} argument). If \code{with.indels} is \code{TRUE}, then the "edit distance" is used: for each position specified in \code{at}, P is compared to all the substrings S' of S starting at this position and the smallest distance is returned. Note that this distance is guaranteed to be reached for a substring of length < 2*length(P) so, of course, in practice, P only needs to be compared to a small number of substrings for every starting position. } \value{ \code{hasLetterAt}: A logical matrix with one row per element in \code{x} and one column per letter/position to check. When a specified position is invalid with respect to an element in \code{x} then the corresponding matrix element is set to NA. \code{neditAt}: If \code{subject} is an \link{XString} object, then return an integer vector of the same length as \code{at}. If \code{subject} is an \link{XStringSet} object, then return the integer matrix with \code{length(at)} rows and \code{length(subject)} columns defined by: \preformatted{ sapply(unname(subject), function(x) neditAt(pattern, x, ...)) } \code{neditStartingAt} is identical to \code{neditAt} except that the \code{at} argument is now called \code{starting.at}. \code{neditEndingAt} is similar to \code{neditAt} except that the \code{at} argument is now called \code{ending.at} and must contain the ending positions of the pattern relatively to the subject. \code{isMatchingAt}: If \code{subject} is an \link{XString} object, then return the logical vector defined by: \preformatted{ min.mismatch <= neditAt(...) <= max.mismatch } If \code{subject} is an \link{XStringSet} object, then return the logical matrix with \code{length(at)} rows and \code{length(subject)} columns defined by: \preformatted{ sapply(unname(subject), function(x) isMatchingAt(pattern, x, ...)) } \code{isMatchingStartingAt} is identical to \code{isMatchingAt} except that the \code{at} argument is now called \code{starting.at}. \code{isMatchingEndingAt} is similar to \code{isMatchingAt} except that the \code{at} argument is now called \code{ending.at} and must contain the ending positions of the pattern relatively to the subject. \code{which.isMatchingAt}: The default behavior (\code{follow.index=FALSE}) is as follow. If \code{subject} is an \link{XString} object, then return the single integer defined by: \preformatted{ which(isMatchingAt(...))[1] } If \code{subject} is an \link{XStringSet} object, then return the integer vector defined by: \preformatted{ sapply(unname(subject), function(x) which.isMatchingAt(pattern, x, ...)) } If \code{follow.index=TRUE}, then the returned value is defined by: \preformatted{ at[which.isMatchingAt(..., follow.index=FALSE)] } \code{which.isMatchingStartingAt} is identical to \code{which.isMatchingAt} except that the \code{at} argument is now called \code{starting.at}. \code{which.isMatchingEndingAt} is similar to \code{which.isMatchingAt} except that the \code{at} argument is now called \code{ending.at} and must contain the ending positions of the pattern relatively to the subject. } \seealso{ \code{\link{nucleotideFrequencyAt}}, \code{\link{matchPattern}}, \code{\link{matchPDict}}, \code{\link{matchLRPatterns}}, \code{\link{trimLRPatterns}}, \code{\link{IUPAC_CODE_MAP}}, \link{XString-class}, \link{align-utils} } \examples{ ## --------------------------------------------------------------------- ## hasLetterAt() ## --------------------------------------------------------------------- x <- DNAStringSet(c("AAACGT", "AACGT", "ACGT", "TAGGA")) hasLetterAt(x, "AAAAAA", 1:6) ## hasLetterAt() can be used to answer questions like: "which elements ## in 'x' have an A at position 2 and a G at position 4?" q1 <- hasLetterAt(x, "AG", c(2, 4)) which(rowSums(q1) == 2) ## or "how many probes in the drosophila2 chip have T, G, T, A at ## position 2, 4, 13 and 20, respectively?" library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) q2 <- hasLetterAt(probes, "TGTA", c(2, 4, 13, 20)) sum(rowSums(q2) == 4) ## or "what's the probability to have an A at position 25 if there is ## one at position 13?" q3 <- hasLetterAt(probes, "AACGT", c(13, 25, 25, 25, 25)) sum(q3[ , 1] & q3[ , 2]) / sum(q3[ , 1]) ## Probabilities to have other bases at position 25 if there is an A ## at position 13: sum(q3[ , 1] & q3[ , 3]) / sum(q3[ , 1]) # C sum(q3[ , 1] & q3[ , 4]) / sum(q3[ , 1]) # G sum(q3[ , 1] & q3[ , 5]) / sum(q3[ , 1]) # T ## See ?nucleotideFrequencyAt for another way to get those results. ## --------------------------------------------------------------------- ## neditAt() / isMatchingAt() / which.isMatchingAt() ## --------------------------------------------------------------------- subject <- DNAString("GTATA") ## Pattern "AT" matches subject "GTATA" at position 3 (exact match) neditAt("AT", subject, at=3) isMatchingAt("AT", subject, at=3) ## ... but not at position 1 neditAt("AT", subject) isMatchingAt("AT", subject) ## ... unless we allow 1 mismatching letter (inexact match) isMatchingAt("AT", subject, max.mismatch=1) ## Here we look at 6 different starting positions and find 3 matches if ## we allow 1 mismatching letter isMatchingAt("AT", subject, at=0:5, max.mismatch=1) ## No match neditAt("NT", subject, at=1:4) isMatchingAt("NT", subject, at=1:4) ## 2 matches if N is interpreted as an ambiguity (fixed=FALSE) neditAt("NT", subject, at=1:4, fixed=FALSE) isMatchingAt("NT", subject, at=1:4, fixed=FALSE) ## max.mismatch != 0 and fixed=FALSE can be used together neditAt("NCA", subject, at=0:5, fixed=FALSE) isMatchingAt("NCA", subject, at=0:5, max.mismatch=1, fixed=FALSE) some_starts <- c(10:-10, NA, 6) subject <- DNAString("ACGTGCA") is_matching <- isMatchingAt("CAT", subject, at=some_starts, max.mismatch=1) some_starts[is_matching] which.isMatchingAt("CAT", subject, at=some_starts, max.mismatch=1) which.isMatchingAt("CAT", subject, at=some_starts, max.mismatch=1, follow.index=TRUE) ## --------------------------------------------------------------------- ## WITH INDELS ## --------------------------------------------------------------------- subject <- BString("ABCDEFxxxCDEFxxxABBCDE") neditAt("ABCDEF", subject, at=9) neditAt("ABCDEF", subject, at=9, with.indels=TRUE) isMatchingAt("ABCDEF", subject, at=9, max.mismatch=1, with.indels=TRUE) isMatchingAt("ABCDEF", subject, at=9, max.mismatch=2, with.indels=TRUE) neditAt("ABCDEF", subject, at=17) neditAt("ABCDEF", subject, at=17, with.indels=TRUE) neditEndingAt("ABCDEF", subject, ending.at=22) neditEndingAt("ABCDEF", subject, ending.at=22, with.indels=TRUE) } \keyword{methods} Biostrings/man/maskMotif.Rd0000644000126300012640000000765312227063320017264 0ustar00biocbuildphs_compbio\name{maskMotif} \alias{maskMotif} \alias{maskMotif,MaskedXString,XString-method} \alias{maskMotif,MaskedXString,character-method} \alias{maskMotif,XString,ANY-method} \alias{mask} \title{Masking by content (or by position)} \description{ Functions for masking a sequence by content (or by position). } \usage{ maskMotif(x, motif, min.block.width=1, ...) mask(x, start=NA, end=NA, pattern) } \arguments{ \item{x}{ The sequence to mask. } \item{motif}{ The motif to mask in the sequence. } \item{min.block.width}{ The minimum width of the blocks to mask. } \item{...}{ Additional arguments for \code{matchPattern}. } \item{start}{ An integer vector containing the starting positions of the regions to mask. } \item{end}{ An integer vector containing the ending positions of the regions to mask. } \item{pattern}{ The motif to mask in the sequence. } } \value{ A \link{MaskedXString} object for \code{maskMotif} and an \link{XStringViews} object for \code{mask}. } \author{H. Pages} \seealso{ \code{\link[IRanges]{read.Mask}}, \code{\link{matchPattern}}, \link{XString-class}, \link{MaskedXString-class}, \link{XStringViews-class}, \link[IRanges]{MaskCollection-class} } \examples{ ## --------------------------------------------------------------------- ## EXAMPLE 1 ## --------------------------------------------------------------------- maskMotif(BString("AbcbbcbEEE"), "bcb") maskMotif(BString("AbcbcbEEE"), "bcb") ## maskMotif() can be used in an incremental way to mask more than 1 ## motif. Note that maskMotif() does not try to mask again what's ## already masked (i.e. the new mask will never overlaps with the ## previous masks) so the order in which the motifs are masked actually ## matters as it will affect the total set of masked positions. x0 <- BString("AbcbEEEEEbcbbEEEcbbcbc") x1 <- maskMotif(x0, "E") x1 x2 <- maskMotif(x1, "bcb") x2 x3 <- maskMotif(x2, "b") x3 ## Note that inverting the order in which "b" and "bcb" are masked would ## lead to a different final set of masked positions. ## Also note that the order doesn't matter if the motifs to mask don't ## overlap (we assume that the motifs are unique) i.e. if the prefix of ## each motif is not the suffix of any other motif. This is of course ## the case when all the motifs have only 1 letter. ## --------------------------------------------------------------------- ## EXAMPLE 2 ## --------------------------------------------------------------------- x <- DNAString("ACACAACTAGATAGNACTNNGAGAGACGC") ## Mask the N-blocks x1 <- maskMotif(x, "N") x1 as(x1, "Views") gaps(x1) as(gaps(x1), "Views") ## Mask the AC-blocks x2 <- maskMotif(x1, "AC") x2 gaps(x2) ## Mask the GA-blocks x3 <- maskMotif(x2, "GA", min.block.width=5) x3 # masks 2 and 3 overlap gaps(x3) ## --------------------------------------------------------------------- ## EXAMPLE 3 ## --------------------------------------------------------------------- library(BSgenome.Dmelanogaster.UCSC.dm3) chrU <- Dmelanogaster$chrU chrU alphabetFrequency(chrU) chrU <- maskMotif(chrU, "N") chrU alphabetFrequency(chrU) as(chrU, "Views") as(gaps(chrU), "Views") mask2 <- Mask(mask.width=length(chrU), start=c(50000, 350000, 543900), width=25000) names(mask2) <- "some ugly regions" masks(chrU) <- append(masks(chrU), mask2) chrU as(chrU, "Views") as(gaps(chrU), "Views") ## --------------------------------------------------------------------- ## EXAMPLE 4 ## --------------------------------------------------------------------- ## Note that unlike maskMotif(), mask() returns an XStringViews object! ## masking "by position" mask("AxyxyxBC", 2, 6) ## masking "by content" mask("AxyxyxBC", "xyx") noN_chrU <- mask(chrU, "N") noN_chrU alphabetFrequency(noN_chrU, collapse=TRUE) } \keyword{methods} \keyword{manip} Biostrings/man/match-utils.Rd0000644000126300012640000000620312227063320017552 0ustar00biocbuildphs_compbio\name{match-utils} \alias{match-utils} \alias{mismatch} \alias{mismatch,ANY,XStringViews-method} \alias{nmatch} \alias{nmatch,ANY,XStringViews-method} \alias{nmismatch} \alias{nmismatch,ANY,XStringViews-method} \alias{coverage,MaskedXString-method} \alias{coverage,MIndex-method} \title{Utility functions operating on the matches returned by a high-level matching function} \description{ Miscellaneous utility functions operating on the matches returned by a high-level matching function like \code{\link{matchPattern}}, \code{\link{matchPDict}}, etc... } \usage{ mismatch(pattern, x, fixed=TRUE) nmatch(pattern, x, fixed=TRUE) nmismatch(pattern, x, fixed=TRUE) \S4method{coverage}{MIndex}(x, shift=0L, width=NULL, weight=1L) \S4method{coverage}{MaskedXString}(x, shift=0L, width=NULL, weight=1L) } \arguments{ \item{pattern}{ The pattern string. } \item{x}{ An \link{XStringViews} object for \code{mismatch} (typically, one returned by \code{matchPattern(pattern, subject)}). An \link{MIndex} object for \code{coverage}, or any object for which a \code{coverage} method is defined. See \code{?\link[IRanges]{coverage}}. } \item{fixed}{ See \code{?`\link{lowlevel-matching}`}. } \item{shift, width}{ See \code{?\link[IRanges]{coverage}}. } \item{weight}{ An integer vector specifying how much each element in \code{x} counts. } } \details{ The \code{mismatch} function gives the positions of the mismatching letters of a given pattern relatively to its matches in a given subject. The \code{nmatch} and \code{nmismatch} functions give the number of matching and mismatching letters produced by the \code{mismatch} function. The \code{coverage} function computes the "coverage" of a subject by a given pattern or set of patterns. } \value{ \code{mismatch}: a list of integer vectors. \code{nmismatch}: an integer vector containing the length of the vectors produced by \code{mismatch}. \code{coverage}: an \link[IRanges:Rle-class]{Rle} object indicating the coverage of \code{x}. See \code{?\link[IRanges]{coverage}} for the details. If \code{x} is an \link{MIndex} object, the coverage of a given position in the underlying sequence (typically the subject used during the search that returned \code{x}) is the number of matches (or hits) it belongs to. } \seealso{ \link{lowlevel-matching}, \code{\link{matchPattern}}, \code{\link{matchPDict}}, \link{XString-class}, \link{XStringViews-class}, \link{MIndex-class}, \link[IRanges]{coverage}, \link{align-utils} } \examples{ ## --------------------------------------------------------------------- ## mismatch() / nmismatch() ## --------------------------------------------------------------------- subject <- DNAString("ACGTGCA") m <- matchPattern("NCA", subject, max.mismatch=1, fixed=FALSE) mismatch("NCA", m) nmismatch("NCA", m) ## --------------------------------------------------------------------- ## coverage() ## --------------------------------------------------------------------- coverage(m) ## See ?matchPDict for examples of using coverage() on an MIndex object... } \keyword{methods} Biostrings/man/matchLRPatterns.Rd0000644000126300012640000000753512227063320020404 0ustar00biocbuildphs_compbio\name{matchLRPatterns} \alias{matchLRPatterns} \alias{matchLRPatterns,XString-method} \alias{matchLRPatterns,XStringViews-method} \alias{matchLRPatterns,MaskedXString-method} \title{Find paired matches in a sequence} \description{ The \code{matchLRPatterns} function finds paired matches in a sequence i.e. matches specified by a left pattern, a right pattern and a maximum distance between the left pattern and the right pattern. } \usage{ matchLRPatterns(Lpattern, Rpattern, max.gaplength, subject, max.Lmismatch=0, max.Rmismatch=0, with.Lindels=FALSE, with.Rindels=FALSE, Lfixed=TRUE, Rfixed=TRUE) } \arguments{ \item{Lpattern}{ The left part of the pattern. } \item{Rpattern}{ The right part of the pattern. } \item{max.gaplength}{ The max length of the gap in the middle i.e the max distance between the left and right parts of the pattern. } \item{subject}{ An \link{XString}, \link{XStringViews} or \link{MaskedXString} object containing the target sequence. } \item{max.Lmismatch}{ The maximum number of mismatching letters allowed in the left part of the pattern. If non-zero, an inexact matching algorithm is used (see the \code{\link{matchPattern}} function for more information). } \item{max.Rmismatch}{ Same as \code{max.Lmismatch} but for the right part of the pattern. } \item{with.Lindels}{ If \code{TRUE} then indels are allowed in the left part of the pattern. In that case \code{max.Lmismatch} is interpreted as the maximum "edit distance" allowed in the left part of the pattern. See the \code{with.indels} argument of the \code{\link{matchPattern}} function for more information. } \item{with.Rindels}{ Same as \code{with.Lindels} but for the right part of the pattern. } \item{Lfixed}{ Only with a \link{DNAString} or \link{RNAString} subject can a \code{Lfixed} value other than the default (\code{TRUE}) be used. With \code{Lfixed=FALSE}, ambiguities (i.e. letters from the IUPAC Extended Genetic Alphabet (see \code{\link{IUPAC_CODE_MAP}}) that are not from the base alphabet) in the left pattern \_and\_ in the subject are interpreted as wildcards i.e. they match any letter that they stand for. \code{Lfixed} can also be a character vector, a subset of \code{c("pattern", "subject")}. \code{Lfixed=c("pattern", "subject")} is equivalent to \code{Lfixed=TRUE} (the default). An empty vector is equivalent to \code{Lfixed=FALSE}. With \code{Lfixed="subject"}, ambiguities in the pattern only are interpreted as wildcards. With \code{Lfixed="pattern"}, ambiguities in the subject only are interpreted as wildcards. } \item{Rfixed}{ Same as \code{Lfixed} but for the right part of the pattern. } } \value{ An \link{XStringViews} object containing all the matches, even when they are overlapping (see the examples below), and where the matches are ordered from left to right (i.e. by ascending starting position). } \author{H. Pages} \seealso{ \code{\link{matchPattern}}, \code{\link{matchProbePair}}, \code{\link{trimLRPatterns}}, \code{\link{findPalindromes}}, \code{\link{reverseComplement}}, \link{XString-class}, \link{XStringViews-class}, \link{MaskedXString-class} } \examples{ library(BSgenome.Dmelanogaster.UCSC.dm3) subject <- Dmelanogaster$chr3R Lpattern <- "AGCTCCGAG" Rpattern <- "TTGTTCACA" matchLRPatterns(Lpattern, Rpattern, 500, subject) # 1 match ## Note that matchLRPatterns() will return all matches, even when they are ## overlapping: subject <- DNAString("AAATTAACCCTT") matchLRPatterns("AA", "TT", 0, subject) # 1 match matchLRPatterns("AA", "TT", 1, subject) # 2 matches matchLRPatterns("AA", "TT", 3, subject) # 3 matches matchLRPatterns("AA", "TT", 7, subject) # 4 matches } \keyword{methods} Biostrings/man/matchPDict-exact.Rd0000644000126300012640000005226312227063320020451 0ustar00biocbuildphs_compbio\name{matchPDict} \alias{matchPDict-exact} \alias{matchPDict} \alias{matchPDict,XString-method} \alias{matchPDict,XStringSet-method} \alias{matchPDict,XStringViews-method} \alias{matchPDict,MaskedXString-method} \alias{countPDict} \alias{countPDict,XString-method} \alias{countPDict,XStringSet-method} \alias{countPDict,XStringViews-method} \alias{countPDict,MaskedXString-method} \alias{whichPDict} \alias{whichPDict,XString-method} \alias{whichPDict,XStringSet-method} \alias{whichPDict,XStringViews-method} \alias{whichPDict,MaskedXString-method} \alias{vmatchPDict} \alias{vmatchPDict,ANY-method} \alias{vmatchPDict,XString-method} \alias{vmatchPDict,MaskedXString-method} \alias{vcountPDict} \alias{vcountPDict,XString-method} \alias{vcountPDict,XStringSet-method} \alias{vcountPDict,XStringViews-method} \alias{vcountPDict,MaskedXString-method} \alias{vwhichPDict} \alias{vwhichPDict,XString-method} \alias{vwhichPDict,XStringSet-method} \alias{vwhichPDict,XStringViews-method} \alias{vwhichPDict,MaskedXString-method} % Functions: \alias{extractAllMatches} \title{Matching a dictionary of patterns against a reference} \description{ A set of functions for finding all the occurrences (aka "matches" or "hits") of a set of patterns (aka the dictionary) in a reference sequence or set of reference sequences (aka the subject) The following functions differ in what they return: \code{matchPDict} returns the "where" information i.e. the positions in the subject of all the occurrences of every pattern; \code{countPDict} returns the "how many times" information i.e. the number of occurrences for each pattern; and \code{whichPDict} returns the "who" information i.e. which patterns in the input dictionary have at least one match. \code{vcountPDict} and \code{vwhichPDict} are vectorized versions of \code{countPDict} and \code{whichPDict}, respectively, that is, they work on a set of reference sequences in a vectorized fashion. This man page shows how to use these functions (aka the \code{*PDict} functions) for exact matching of a constant width dictionary i.e. a dictionary where all the patterns have the same length (same number of nucleotides). See \code{?`\link{matchPDict-inexact}`} for how to use these functions for inexact matching or when the original dictionary has a variable width. } \usage{ matchPDict(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) countPDict(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) whichPDict(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) vcountPDict(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", collapse=FALSE, weight=1L, verbose=FALSE, ...) vwhichPDict(pdict, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", verbose=FALSE) } \arguments{ \item{pdict}{ A \link{PDict} object containing the preprocessed dictionary. All these functions also work with a dictionary that has not been preprocessed (in other words, the \code{pdict} argument can receive an \link{XStringSet} object). Of course, it won't be as fast as with a preprocessed dictionary, but it will generally be slightly faster than using \code{\link{matchPattern}}/\code{\link{countPattern}} or \code{\link{vmatchPattern}}/\code{\link{vcountPattern}} in a "lapply/sapply loop", because, here, looping is done at the C-level. However, by using a non-preprocessed dictionary, many of the restrictions that apply to preprocessed dictionaries don't apply anymore. For example, the dictionary doesn't need to be rectangular or to be a \link{DNAStringSet} object: it can be any type of \link{XStringSet} object and have a variable width. } \item{subject}{ An \link{XString} or \link{MaskedXString} object containing the subject sequence for \code{matchPDict}, \code{countPDict} and \code{whichPDict}. An \link{XStringSet} object containing the subject sequences for \code{vcountPDict} and \code{vwhichPDict}. For now, only subjects of base class \link{DNAString} are supported. } \item{max.mismatch, min.mismatch}{ The maximum and minimum number of mismatching letters allowed (see \code{?\link{isMatchingAt}} for the details). This man page focuses on exact matching of a constant width dictionary so \code{max.mismatch=0} in the examples below. See \code{?`\link{matchPDict-inexact}`} for inexact matching. } \item{with.indels}{ Only supported by \code{countPDict}, \code{whichPDict}, \code{vcountPDict} and \code{vwhichPDict} at the moment, and only when the input dictionary is non-preprocessed (i.e. XStringSet). If \code{TRUE} then indels are allowed. In that case, \code{min.mismatch} must be \code{0} and \code{max.mismatch} is interpreted as the maximum "edit distance" allowed between any pattern and any of its matches. See \code{?`\link{matchPattern}`} for more information. } \item{fixed}{ Whether IUPAC ambiguity codes should be interpreted literally or not (see \code{?\link{isMatchingAt}} for more information). This man page focuses on exact matching of a constant width dictionary so \code{fixed=TRUE} in the examples below. See \code{?`\link{matchPDict-inexact}`} for inexact matching. } \item{algorithm}{ Ignored if \code{pdict} is a preprocessed dictionary (i.e. a \link{PDict} object). Otherwise, can be one of the following: \code{"auto"}, \code{"naive-exact"}, \code{"naive-inexact"}, \code{"boyer-moore"} or \code{"shift-or"}. See \code{?\link{matchPattern}} for more information. Note that \code{"indels"} is not supported for now. } \item{verbose}{ \code{TRUE} or \code{FALSE}. } \item{collapse, weight}{ \code{collapse} must be \code{FALSE}, \code{1}, or \code{2}. If \code{collapse=FALSE} (the default), then \code{weight} is ignored and \code{vcountPDict} returns the full matrix of counts (\code{M0}). If \code{collapse=1}, then \code{M0} is collapsed "horizontally" i.e. it is turned into a vector with \code{length} equal to \code{length(pdict)}. If \code{weight=1L} (the default), then this vector is defined by \code{rowSums(M0)}. If \code{collapse=2}, then \code{M0} is collapsed "vertically" i.e. it is turned into a vector with \code{length} equal to \code{length(subject)}. If \code{weight=1L} (the default), then this vector is defined by \code{colSums(M0)}. If \code{collapse=1} or \code{collapse=2}, then the elements in \code{subject} (\code{collapse=1}) or in \code{pdict} (\code{collapse=2}) can be weighted thru the \code{weight} argument. In that case, the returned vector is defined by \code{M0 \%*\% rep(weight, length.out=length(subject))} and \code{rep(weight, length.out=length(pdict)) \%*\% M0}, respectively. } \item{...}{ Additional arguments for methods. } } \details{ In this man page, we assume that you know how to preprocess a dictionary of DNA patterns that can then be used with any of the \code{*PDict} functions described here. Please see \code{?\link{PDict}} if you don't. When using the \code{*PDict} functions for exact matching of a constant width dictionary, the standard way to preprocess the original dictionary is by calling the \code{\link{PDict}} constructor on it with no extra arguments. This returns the preprocessed dictionary in a \link{PDict} object that can be used with any of the \code{*PDict} functions. } \value{ If \code{M} denotes the number of patterns in the \code{pdict} argument (\code{M <- length(pdict)}), then \code{matchPDict} returns an \link{MIndex} object of length \code{M}, and \code{countPDict} an integer vector of length \code{M}. \code{whichPDict} returns an integer vector made of the indices of the patterns in the \code{pdict} argument that have at least one match. If \code{N} denotes the number of sequences in the \code{subject} argument (\code{N <- length(subject)}), then \code{vcountPDict} returns an integer matrix with \code{M} rows and \code{N} columns, unless the \code{collapse} argument is used. In that case, depending on the type of \code{weight}, an integer or numeric vector is returned (see above for the details). \code{vwhichPDict} returns a list of \code{N} integer vectors. } \author{H. Pages} \references{ Aho, Alfred V.; Margaret J. Corasick (June 1975). "Efficient string matching: An aid to bibliographic search". Communications of the ACM 18 (6): 333-340. } \seealso{ \link{PDict-class}, \link{MIndex-class}, \link{matchPDict-inexact}, \code{\link{isMatchingAt}}, \code{\link{coverage,MIndex-method}}, \code{\link{matchPattern}}, \code{\link{alphabetFrequency}}, \link{DNAStringSet-class}, \link{XStringViews-class}, \link{MaskedDNAString-class} } \examples{ ## --------------------------------------------------------------------- ## A. A SIMPLE EXAMPLE OF EXACT MATCHING ## --------------------------------------------------------------------- ## Creating the pattern dictionary: library(drosophila2probe) dict0 <- DNAStringSet(drosophila2probe) dict0 # The original dictionary. length(dict0) # Hundreds of thousands of patterns. pdict0 <- PDict(dict0) # Store the original dictionary in # a PDict object (preprocessing). ## Using the pattern dictionary on chromosome 3R: library(BSgenome.Dmelanogaster.UCSC.dm3) chr3R <- Dmelanogaster$chr3R # Load chromosome 3R chr3R mi0 <- matchPDict(pdict0, chr3R) # Search... ## Looking at the matches: start_index <- startIndex(mi0) # Get the start index. length(start_index) # Same as the original dictionary. start_index[[8220]] # Starts of the 8220th pattern. end_index <- endIndex(mi0) # Get the end index. end_index[[8220]] # Ends of the 8220th pattern. count_index <- countIndex(mi0) # Get the number of matches per pattern. count_index[[8220]] mi0[[8220]] # Get the matches for the 8220th pattern. start(mi0[[8220]]) # Equivalent to startIndex(mi0)[[8220]]. sum(count_index) # Total number of matches. table(count_index) i0 <- which(count_index == max(count_index)) pdict0[[i0]] # The pattern with most occurrences. mi0[[i0]] # Its matches as an IRanges object. Views(chr3R, mi0[[i0]]) # And as an XStringViews object. ## Get the coverage of the original subject: cov3R <- as.integer(coverage(mi0, width=length(chr3R))) max(cov3R) mean(cov3R) sum(cov3R != 0) / length(cov3R) # Only 2.44\% of chr3R is covered. if (interactive()) { plotCoverage <- function(cx, start, end) { plot.new() plot.window(c(start, end), c(0, 20)) axis(1) axis(2) axis(4) lines(start:end, cx[start:end], type="l") } plotCoverage(cov3R, 27600000, 27900000) } ## --------------------------------------------------------------------- ## B. NAMING THE PATTERNS ## --------------------------------------------------------------------- ## The names of the original patterns, if any, are propagated to the ## PDict and MIndex objects: names(dict0) <- mkAllStrings(letters, 4)[seq_len(length(dict0))] dict0 dict0[["abcd"]] pdict0n <- PDict(dict0) names(pdict0n)[1:30] pdict0n[["abcd"]] mi0n <- matchPDict(pdict0n, chr3R) names(mi0n)[1:30] mi0n[["abcd"]] ## This is particularly useful when unlisting an MIndex object: unlist(mi0)[1:10] unlist(mi0n)[1:10] # keep track of where the matches are coming from ## --------------------------------------------------------------------- ## C. PERFORMANCE ## --------------------------------------------------------------------- ## If getting the number of matches is what matters only (without ## regarding their positions), then countPDict() will be faster, ## especially when there is a high number of matches: count_index0 <- countPDict(pdict0, chr3R) stopifnot(identical(count_index0, count_index)) if (interactive()) { ## What's the impact of the dictionary width on performance? ## Below is some code that can be used to figure out (will take a long ## time to run). For different widths of the original dictionary, we ## look at: ## o pptime: preprocessing time (in sec.) i.e. time needed for ## building the PDict object from the truncated input ## sequences; ## o nnodes: nb of nodes in the resulting Aho-Corasick tree; ## o nupatt: nb of unique truncated input sequences; ## o matchtime: time (in sec.) needed to find all the matches; ## o totalcount: total number of matches. getPDictStats <- function(dict, subject) { ans_width <- width(dict[1]) ans_pptime <- system.time(pdict <- PDict(dict))[["elapsed"]] pptb <- pdict@threeparts@pptb ans_nnodes <- nnodes(pptb) ans_nupatt <- sum(!duplicated(pdict)) ans_matchtime <- system.time( mi0 <- matchPDict(pdict, subject) )[["elapsed"]] ans_totalcount <- sum(countIndex(mi0)) list( width=ans_width, pptime=ans_pptime, nnodes=ans_nnodes, nupatt=ans_nupatt, matchtime=ans_matchtime, totalcount=ans_totalcount ) } stats <- lapply(8:25, function(width) getPDictStats(DNAStringSet(dict0, end=width), chr3R)) stats <- data.frame(do.call(rbind, stats)) stats } ## --------------------------------------------------------------------- ## D. USING A NON-PREPROCESSED DICTIONARY ## --------------------------------------------------------------------- dict3 <- DNAStringSet(mkAllStrings(DNA_BASES, 3)) # all trinucleotides dict3 pdict3 <- PDict(dict3) ## The 3 following calls are equivalent (from faster to slower): res3a <- countPDict(pdict3, chr3R) res3b <- countPDict(dict3, chr3R) res3c <- sapply(dict3, function(pattern) countPattern(pattern, chr3R)) stopifnot(identical(res3a, res3b)) stopifnot(identical(res3a, res3c)) ## One reason for using a non-preprocessed dictionary is to get rid of ## all the constraints associated with preprocessing, e.g., when ## preprocessing with \code{\link{PDict}}, the input dictionary must ## be DNA and a Trusted Band must be defined (explicitly or implicitly). ## See \code{?\link{PDict}} for more information about these constraints. ## In particular, using a non-preprocessed dictionary can be ## useful for the kind of inexact matching that can't be achieved ## with a \link{PDict} object (if performance is not an issue). ## See \code{?`\link{matchPDict-inexact}`} for more information about ## inexact matching. dictD <- xscat(dict3, "N", reverseComplement(dict3)) ## The 2 following calls are equivalent (from faster to slower): resDa <- matchPDict(dictD, chr3R, fixed=FALSE) resDb <- sapply(dictD, function(pattern) matchPattern(pattern, chr3R, fixed=FALSE)) stopifnot(all(sapply(seq_len(length(dictD)), function(i) identical(resDa[[i]], as(resDb[[i]], "IRanges"))))) ## --------------------------------------------------------------------- ## E. vcountPDict() ## --------------------------------------------------------------------- subject <- Dmelanogaster$upstream1000[1:100] subject mat1 <- vcountPDict(pdict0, subject) dim(mat1) # length(pdict0) x length(subject) nhit_per_probe <- rowSums(mat1) table(nhit_per_probe) ## Without vcountPDict(), 'mat1' could have been computed with: mat2 <- sapply(unname(subject), function(x) countPDict(pdict0, x)) stopifnot(identical(mat1, mat2)) ## but using vcountPDict() is faster (10x or more, depending of the ## average length of the sequences in 'subject'). if (interactive()) { ## This will fail (with message "allocMatrix: too many elements ## specified") because, on most platforms, vectors and matrices in R ## are limited to 2^31 elements: subject <- Dmelanogaster$upstream1000 vcountPDict(pdict0, subject) length(pdict0) * length(Dmelanogaster$upstream1000) 1 * length(pdict0) * length(Dmelanogaster$upstream1000) # > 2^31 ## But this will work: nhit_per_seq <- vcountPDict(pdict0, subject, collapse=2) sum(nhit_per_seq >= 1) # nb of subject sequences with at least 1 hit table(nhit_per_seq) which(nhit_per_seq == 37) # 603 sum(countPDict(pdict0, subject[[603]])) # 37 } ## --------------------------------------------------------------------- ## F. RELATIONSHIP BETWEEN vcountPDict(), countPDict() AND ## vcountPattern() ## --------------------------------------------------------------------- pdict3 <- PDict(dict3) subject <- Dmelanogaster$upstream1000 subject ## The 4 following calls are equivalent (from faster to slower): mat3a <- vcountPDict(pdict3, subject) mat3b <- vcountPDict(dict3, subject) mat3c <- sapply(dict3, function(pattern) vcountPattern(pattern, subject)) mat3d <- sapply(unname(subject), function(x) countPDict(pdict3, x)) stopifnot(identical(mat3a, mat3b)) stopifnot(identical(mat3a, t(mat3c))) stopifnot(identical(mat3a, mat3d)) ## The 3 following calls are equivalent (from faster to slower): nhitpp3a <- vcountPDict(pdict3, subject, collapse=1) # rowSums(mat3a) nhitpp3b <- vcountPDict(dict3, subject, collapse=1) nhitpp3c <- sapply(dict3, function(pattern) sum(vcountPattern(pattern, subject))) stopifnot(identical(nhitpp3a, nhitpp3b)) stopifnot(identical(nhitpp3a, nhitpp3c)) ## The 3 following calls are equivalent (from faster to slower): nhitps3a <- vcountPDict(pdict3, subject, collapse=2) # colSums(mat3a) nhitps3b <- vcountPDict(dict3, subject, collapse=2) nhitps3c <- sapply(unname(subject), function(x) sum(countPDict(pdict3, x))) stopifnot(identical(nhitps3a, nhitps3b)) stopifnot(identical(nhitps3a, nhitps3c)) ## --------------------------------------------------------------------- ## G. vwhichPDict() ## --------------------------------------------------------------------- ## The 4 following calls are equivalent (from faster to slower): vwp3a <- vwhichPDict(pdict3, subject) vwp3b <- vwhichPDict(dict3, subject) vwp3c <- lapply(seq_len(ncol(mat3a)), function(j) which(mat3a[ , j] != 0L)) vwp3d <- lapply(unname(subject), function(x) whichPDict(pdict3, x)) stopifnot(identical(vwp3a, vwp3b)) stopifnot(identical(vwp3a, vwp3c)) stopifnot(identical(vwp3a, vwp3d)) table(sapply(vwp3a, length)) which.min(sapply(vwp3a, length)) ## Get the trinucleotides not represented in reference sequence 9181: dict3[-vwp3a[[9181]]] # 21 trinucleotides ## --------------------------------------------------------------------- ## H. MAPPING PROBE SET IDS BETWEEN CHIPS WITH vwhichPDict() ## --------------------------------------------------------------------- ## Here we show a simple (and very naive) algorithm for mapping probe ## set IDs between the hgu95av2 and hgu133a chips (Affymetrix). ## 2 probe set IDs are considered mapped iff they share at least one ## probe. ## WARNING: This example takes about 25 minutes to run. if (interactive()) { library(hgu95av2probe) library(hgu133aprobe) probes1 <- DNAStringSet(hgu95av2probe) probes2 <- DNAStringSet(hgu133aprobe) pdict2 <- PDict(probes2) ## Get the mapping from probes1 to probes2 (based on exact matching): map1to2 <- vwhichPDict(pdict2, probes1) # takes about 10 minutes ## The following helper function uses the probe level mapping to induce ## the mapping at the probe set IDs level (from hgu95av2 to hgu133a). ## To keep things simple, 2 probe set IDs are considered mapped iff ## each of them contains at least one probe mapped to one probe of ## the other: mapProbeSetIDs1to2 <- function(psID) unique(hgu133aprobe$Probe.Set.Name[unlist( map1to2[hgu95av2probe$Probe.Set.Name == psID] )]) ## Use the helper function to build the complete mapping: psIDs1 <- unique(hgu95av2probe$Probe.Set.Name) mapPSIDs1to2 <- lapply(psIDs1, mapProbeSetIDs1to2) # about 3 min. names(mapPSIDs1to2) <- psIDs1 ## Do some basic stats: table(sapply(mapPSIDs1to2, length)) ## [ADVANCED USERS ONLY] ## An alternative that is slightly faster is to put all the probes ## (hgu95av2 + hgu133a) in a single PDict object and then query its ## 'dups0' slot directly. This slot is a Dups object containing the ## mapping between duplicated patterns. ## Note that we can do this only because all the probes have the ## same length (25) and because we are doing exact matching: probes12 <- DNAStringSet(c(hgu95av2probe$sequence, hgu133aprobe$sequence)) pdict12 <- PDict(probes12) dups0 <- pdict12@dups0 mapProbeSetIDs1to2alt <- function(psID) { ii1 <- unique(togroup(dups0, which(hgu95av2probe$Probe.Set.Name == psID))) ii2 <- members(dups0, ii1) - length(probes1) ii2 <- ii2[ii2 >= 1L] unique(hgu133aprobe$Probe.Set.Name[ii2]) } mapPSIDs1to2alt <- lapply(psIDs1, mapProbeSetIDs1to2alt) # about 10 min. names(mapPSIDs1to2alt) <- psIDs1 ## 'mapPSIDs1to2alt' and 'mapPSIDs1to2' contain the same mapping: stopifnot(identical(lapply(mapPSIDs1to2alt, sort), lapply(mapPSIDs1to2, sort))) } } \keyword{methods} Biostrings/man/matchPDict-inexact.Rd0000644000126300012640000001615412227063320020777 0ustar00biocbuildphs_compbio\name{matchPDict-inexact} \alias{matchPDict-inexact} \title{Inexact matching with matchPDict()/countPDict()/whichPDict()} \description{ The \code{matchPDict}, \code{countPDict} and \code{whichPDict} functions efficiently find the occurrences in a text (the subject) of all patterns stored in a preprocessed dictionary. This man page shows how to use these functions for inexact (or fuzzy) matching or when the original dictionary has a variable width. See \code{?\link{matchPDict}} for how to use these functions for exact matching of a constant width dictionary i.e. a dictionary where all the patterns have the same length (same number of nucleotides). } \details{ In this man page, we assume that you know how to preprocess a dictionary of DNA patterns that can then be used with \code{matchPDict}, \code{countPDict} or \code{\link{whichPDict}}. Please see \code{?\link{PDict}} if you don't. \code{matchPDict} and family support different kinds of inexact matching but with some restrictions. Inexact matching is controlled via the definition of a Trusted Band during the preprocessing step and/or via the \code{max.mismatch}, \code{min.mismatch} and \code{fixed} arguments. Defining a Trusted Band is also required when the original dictionary is not rectangular (variable width), even for exact matching. See \code{?\link{PDict}} for how to define a Trusted Band. Here is how \code{matchPDict} and family handle the Trusted Band defined on \code{pdict}: \itemize{ \item (1) Find all the exact matches of all the elements in the Trusted Band. \item (2) For each element in the Trusted Band that has at least one exact match, compare the head and the tail of this element with the flanking sequences of the matches found in (1). } Note that the number of exact matches found in (1) will decrease exponentially with the width of the Trusted Band. Here is a simple guideline in order to get reasonably good performance: if TBW is the width of the Trusted Band (\code{TBW <- tb.width(pdict)}) and L the number of letters in the subject (\code{L <- nchar(subject)}), then \code{L / (4^TBW)} should be kept as small as possible, typically < 10 or 20. In addition, when a Trusted Band has been defined during preprocessing, then \code{matchPDict} and family can be called with \code{fixed=FALSE}. In this case, IUPAC ambiguity codes in the head or the tail of the \link{PDict} object are treated as ambiguities. Finally, \code{fixed="pattern"} can be used to indicate that IUPAC ambiguity codes in the subject should be treated as ambiguities. It only works if the density of codes is not too high. It works whether or not a Trusted Band has been defined on \code{pdict}. } \author{H. Pages} \references{ Aho, Alfred V.; Margaret J. Corasick (June 1975). "Efficient string matching: An aid to bibliographic search". Communications of the ACM 18 (6): 333-340. } \seealso{ \link{PDict-class}, \link{MIndex-class}, \link{matchPDict} } \examples{ ## --------------------------------------------------------------------- ## A. USING AN EXPLICIT TRUSTED BAND ## --------------------------------------------------------------------- library(drosophila2probe) dict0 <- DNAStringSet(drosophila2probe) dict0 # the original dictionary ## Preprocess the original dictionary by defining a Trusted Band that ## spans nucleotides 1 to 9 of each pattern. pdict9 <- PDict(dict0, tb.end=9) pdict9 tail(pdict9) sum(duplicated(pdict9)) table(patternFrequency(pdict9)) library(BSgenome.Dmelanogaster.UCSC.dm3) chr3R <- Dmelanogaster$chr3R chr3R table(countPDict(pdict9, chr3R, max.mismatch=1)) table(countPDict(pdict9, chr3R, max.mismatch=3)) table(countPDict(pdict9, chr3R, max.mismatch=5)) ## --------------------------------------------------------------------- ## B. COMPARISON WITH EXACT MATCHING ## --------------------------------------------------------------------- ## When the original dictionary is of constant width, exact matching ## (i.e. 'max.mismatch=0' and 'fixed=TRUE) will be more efficient with ## a full-width Trusted Band (i.e. a Trusted Band that covers the entire ## dictionary) than with a Trusted Band of width < width(dict0). pdict0 <- PDict(dict0) count0 <- countPDict(pdict0, chr3R) count0b <- countPDict(pdict9, chr3R, max.mismatch=0) identical(count0b, count0) # TRUE ## --------------------------------------------------------------------- ## C. USING AN EXPLICIT TRUSTED BAND ON A VARIABLE WIDTH DICTIONARY ## --------------------------------------------------------------------- ## Here is a small variable width dictionary that contains IUPAC ## ambiguities (pattern 1 and 3 contain an N): dict0 <- DNAStringSet(c("TACCNG", "TAGT", "CGGNT", "AGTAG", "TAGT")) ## (Note that pattern 2 and 5 are identical.) ## If we only want to do exact matching, then it is recommended to use ## the widest possible Trusted Band i.e. to set its width to ## 'min(width(dict0))' because this is what will give the best ## performance. However, when 'dict0' contains IUPAC ambiguities (like ## in our case), it could be that one of them is falling into the ## Trusted Band so we get an error (only base letters can go in the ## Trusted Band for now): \dontrun{ PDict(dict0, tb.end=min(width(dict0))) # Error! } ## In our case, the Trusted Band cannot be wider than 3: pdict <- PDict(dict0, tb.end=3) tail(pdict) subject <- DNAString("TAGTACCAGTTTCGGG") m <- matchPDict(pdict, subject) countIndex(m) # pattern 2 and 5 have 1 exact match m[[2]] ## We can take advantage of the fact that our Trusted Band doesn't cover ## the entire dictionary to allow inexact matching on the uncovered parts ## (the tail in our case): m <- matchPDict(pdict, subject, fixed=FALSE) countIndex(m) # now pattern 1 has 1 match too m[[1]] m <- matchPDict(pdict, subject, max.mismatch=1) countIndex(m) # now pattern 4 has 1 match too m[[4]] m <- matchPDict(pdict, subject, max.mismatch=1, fixed=FALSE) countIndex(m) # now pattern 3 has 1 match too m[[3]] # note that this match is "out of limit" Views(subject, m[[3]]) m <- matchPDict(pdict, subject, max.mismatch=2) countIndex(m) # pattern 4 gets 1 additional match m[[4]] ## Unlist all matches: unlist(m) ## --------------------------------------------------------------------- ## D. WITH IUPAC AMBIGUITY CODES IN THE SUBJECT ## --------------------------------------------------------------------- pdict <- PDict(c("ACAC", "TCCG")) as.list(matchPDict(pdict, DNAString("ACNCCGT"))) as.list(matchPDict(pdict, DNAString("ACNCCGT"), fixed="pattern")) as.list(matchPDict(pdict, DNAString("ACWCCGT"), fixed="pattern")) as.list(matchPDict(pdict, DNAString("ACRCCGT"), fixed="pattern")) as.list(matchPDict(pdict, DNAString("ACKCCGT"), fixed="pattern")) dict <- DNAStringSet(c("TTC", "CTT")) pdict <- PDict(dict) subject <- DNAString("CYTCACTTC") mi1 <- matchPDict(pdict, subject, fixed="pattern") mi2 <- matchPDict(dict, subject, fixed="pattern") stopifnot(identical(as.list(mi1), as.list(mi2))) } \keyword{methods} Biostrings/man/matchPWM.Rd0000644000126300012640000001500312227063320016776 0ustar00biocbuildphs_compbio\name{matchPWM} \alias{maxWeights} \alias{maxWeights,matrix-method} \alias{minWeights} \alias{minWeights,matrix-method} \alias{maxScore} \alias{maxScore,ANY-method} \alias{minScore} \alias{minScore,ANY-method} \alias{unitScale} \alias{reverseComplement,matrix-method} \alias{PWM} \alias{PWM,character-method} \alias{PWM,DNAStringSet-method} \alias{PWM,matrix-method} \alias{PWMscoreStartingAt} \alias{matchPWM} \alias{matchPWM,character-method} \alias{matchPWM,DNAString-method} \alias{matchPWM,XStringViews-method} \alias{matchPWM,MaskedDNAString-method} \alias{countPWM} \alias{countPWM,character-method} \alias{countPWM,DNAString-method} \alias{countPWM,XStringViews-method} \alias{countPWM,MaskedDNAString-method} \title{PWM creating, matching, and related utilities} \description{ Position Weight Matrix (PWM) creating, matching, and related utilities for DNA data. (PWM for amino acid sequences are not supported.) } \usage{ PWM(x, type = c("log2probratio", "prob"), prior.params = c(A=0.25, C=0.25, G=0.25, T=0.25)) matchPWM(pwm, subject, min.score="80\%", with.score=FALSE, ...) countPWM(pwm, subject, min.score="80\%", ...) PWMscoreStartingAt(pwm, subject, starting.at=1) ## Utility functions for basic manipulation of the Position Weight Matrix maxWeights(x) minWeights(x) maxScore(x) minScore(x) unitScale(x) \S4method{reverseComplement}{matrix}(x, ...) } \arguments{ \item{x}{ For \code{PWM}: a rectangular character vector or rectangular DNAStringSet object ("rectangular" means that all elements have the same number of characters) with no IUPAC ambiguity letters, or a Position Frequency Matrix represented as an integer matrix with row names containing at least A, C, G and T (typically the result of a call to \code{\link{consensusMatrix}}). For \code{maxWeights}, \code{minWeights}, \code{maxScore}, \code{minScore}, \code{unitScale} and \code{reverseComplement}: a Position Weight Matrix represented as a numeric matrix with row names A, C, G and T. } \item{type}{ The type of Position Weight Matrix, either "log2probratio" or "prob". See Details section for more information. } \item{prior.params}{ A positive numeric vector, which represents the parameters of the Dirichlet conjugate prior, with names A, C, G, and T. See Details section for more information. } \item{pwm}{ A Position Weight Matrix represented as a numeric matrix with row names A, C, G and T. } \item{subject}{ Typically a \link{DNAString} object. A \link[IRanges]{Views} object on a \link{DNAString} subject, a \link{MaskedDNAString} object, or a single character string, are also supported. IUPAC ambiguity letters in \code{subject} are ignored (i.e. assigned weight 0) with a warning. } \item{min.score}{ The minimum score for counting a match. Can be given as a character string containing a percentage (e.g. \code{"85\%"}) of the highest possible score or as a single number. } \item{with.score}{ \code{TRUE} or \code{FALSE}. If \code{TRUE}, then the score of each hit is included in the returned object in a metadata column named \code{score}. Say the returned object is \code{hits}, this metadata column can then be accessed with \code{mcols(hits)$score}. } \item{starting.at}{ An integer vector specifying the starting positions of the Position Weight Matrix relatively to the subject. } \item{...}{ Additional arguments for methods. } } \details{ The \code{PWM} function uses a multinomial model with a Dirichlet conjugate prior to calculate the estimated probability of base b at position i. As mentioned in the Arguments section, \code{prior.params} supplies the parameters for the DNA bases A, C, G, and T in the Dirichlet prior. These values result in a position independent initial estimate of the probabilities for the bases to be \code{priorProbs = prior.params/sum(prior.params)} and the posterior (data infused) estimate for the probabilities for the bases in each of the positions to be \code{postProbs = (consensusMatrix(x) + prior.params)/(length(x) + sum(prior.params))}. When \code{type = "log2probratio"}, the PWM = \code{unitScale(log2(postProbs/priorProbs))}. When \code{type = "prob"}, the PWM = \code{unitScale(postProbs)}. } \value{ A numeric matrix representing the Position Weight Matrix for \code{PWM}. A numeric vector containing the Position Weight Matrix-based scores for \code{PWMscoreStartingAt}. An \link{XStringViews} object for \code{matchPWM}. A single integer for \code{countPWM}. A vector containing the max weight for each position in \code{pwm} for \code{maxWeights}. A vector containing the min weight for each position in \code{pwm} for \code{minWeights}. The highest possible score for a given Position Weight Matrix for \code{maxScore}. The lowest possible score for a given Position Weight Matrix for \code{minScore}. The modified numeric matrix given by \code{(x - minScore(x)/ncol(x))/(maxScore(x) - minScore(x))} for \code{unitScale}. A PWM obtained by reverting the column order in PWM \code{x} and by reassigning each row to its complementary nucleotide for \code{reverseComplement}. } \references{ Wasserman, WW, Sandelin, A., (2004) Applied bioinformatics for the identification of regulatory elements, Nat Rev Genet., 5(4):276-87. } \author{H. Pages and P. Aboyoun} \seealso{ \code{\link{consensusMatrix}}, \code{\link{matchPattern}}, \code{\link{reverseComplement}}, \link{DNAString-class}, \link{XStringViews-class} } \examples{ ## Data setup: data(HNF4alpha) library(BSgenome.Dmelanogaster.UCSC.dm3) chr3R <- Dmelanogaster$chr3R chr3R ## Create a PWM from a PFM or directly from a rectangular ## DNAStringSet object: pfm <- consensusMatrix(HNF4alpha) pwm <- PWM(pfm) # same as 'PWM(HNF4alpha)' ## Perform some general routines on the PWM: round(pwm, 2) maxWeights(pwm) maxScore(pwm) reverseComplement(pwm) ## Score the first 5 positions: PWMscoreStartingAt(pwm, unmasked(chr3R), starting.at=1:5) ## Match the plus strand: hits <- matchPWM(pwm, chr3R) nhit <- countPWM(pwm, chr3R) # same as 'length(hits)' ## Use 'with.score=TRUE' to get the scores of the hits: hits <- matchPWM(pwm, chr3R, with.score=TRUE) head(mcols(hits)$score) min(mcols(hits)$score / maxScore(pwm)) # should be >= 0.8 ## The scores can also easily be post-calculated: scores <- PWMscoreStartingAt(pwm, subject(hits), start(hits)) ## Match the minus strand: matchPWM(reverseComplement(pwm), chr3R) } \keyword{methods} \keyword{manip} \keyword{utilities} Biostrings/man/matchPattern.Rd0000644000126300012640000002430112227063320017751 0ustar00biocbuildphs_compbio\name{matchPattern} \alias{matchPattern} \alias{matchPattern,character-method} \alias{matchPattern,XString-method} \alias{matchPattern,XStringSet-method} \alias{matchPattern,XStringViews-method} \alias{matchPattern,MaskedXString-method} \alias{countPattern} \alias{countPattern,character-method} \alias{countPattern,XString-method} \alias{countPattern,XStringSet-method} \alias{countPattern,XStringViews-method} \alias{countPattern,MaskedXString-method} \alias{vmatchPattern} \alias{vmatchPattern,character-method} \alias{vmatchPattern,XString-method} \alias{vmatchPattern,XStringSet-method} \alias{vmatchPattern,XStringViews-method} \alias{vmatchPattern,MaskedXString-method} \alias{vcountPattern} \alias{vcountPattern,character-method} \alias{vcountPattern,XString-method} \alias{vcountPattern,XStringSet-method} \alias{vcountPattern,XStringViews-method} \alias{vcountPattern,MaskedXString-method} \title{String searching functions} \description{ A set of functions for finding all the occurrences (aka "matches" or "hits") of a given pattern (typically short) in a (typically long) reference sequence or set of reference sequences (aka the subject) } \usage{ matchPattern(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") countPattern(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto") vmatchPattern(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", ...) vcountPattern(pattern, subject, max.mismatch=0, min.mismatch=0, with.indels=FALSE, fixed=TRUE, algorithm="auto", ...) } \arguments{ \item{pattern}{ The pattern string. } \item{subject}{ An \link{XString}, \link{XStringViews} or \link{MaskedXString} object for \code{matchPattern} and \code{countPattern}. An \link{XStringSet} or \link{XStringViews} object for \code{vmatchPattern} and \code{vcountPattern}. } \item{max.mismatch, min.mismatch}{ The maximum and minimum number of mismatching letters allowed (see \code{?`\link{lowlevel-matching}`} for the details). If non-zero, an algorithm that supports inexact matching is used. } \item{with.indels}{ If \code{TRUE} then indels are allowed. In that case, \code{min.mismatch} must be \code{0} and \code{max.mismatch} is interpreted as the maximum "edit distance" allowed between the pattern and a match. Note that in order to avoid pollution by redundant matches, only the "best local matches" are returned. Roughly speaking, a "best local match" is a match that is locally both the closest (to the pattern P) and the shortest. More precisely, a substring S' of the subject S is a "best local match" iff: \preformatted{ (a) nedit(P, S') <= max.mismatch (b) for every substring S1 of S': nedit(P, S1) > nedit(P, S') (c) for every substring S2 of S that contains S': nedit(P, S2) >= nedit(P, S') } One nice property of "best local matches" is that their first and last letters are guaranteed to match the letters in P that they align with. } \item{fixed}{ If \code{TRUE} (the default), an IUPAC ambiguity code in the pattern can only match the same code in the subject, and vice versa. If \code{FALSE}, an IUPAC ambiguity code in the pattern can match any letter in the subject that is associated with the code, and vice versa. See \code{?`\link{lowlevel-matching}`} for more information. } \item{algorithm}{ One of the following: \code{"auto"}, \code{"naive-exact"}, \code{"naive-inexact"}, \code{"boyer-moore"}, \code{"shift-or"} or \code{"indels"}. } \item{...}{ Additional arguments for methods. } } \details{ Available algorithms are: ``naive exact'', ``naive inexact'', ``Boyer-Moore-like'', ``shift-or'' and ``indels''. Not all of them can be used in all situations: restrictions apply depending on the "search criteria" i.e. on the values of the \code{pattern}, \code{subject}, \code{max.mismatch}, \code{min.mismatch}, \code{with.indels} and \code{fixed} arguments. It is important to note that the \code{algorithm} argument is not part of the search criteria. This is because the supported algorithms are interchangeable, that is, if 2 different algorithms are compatible with a given search criteria, then choosing one or the other will not affect the result (but will most likely affect the performance). So there is no "wrong choice" of algorithm (strictly speaking). Using \code{algorithm="auto"} (the default) is recommended because then the best suited algorithm will automatically be selected among the set of algorithms that are valid for the given search criteria. } \value{ An \link{XStringViews} object for \code{matchPattern}. A single integer for \code{countPattern}. An \link{MIndex} object for \code{vmatchPattern}. An integer vector for \code{vcountPattern}, with each element in the vector corresponding to the number of matches in the corresponding element of \code{subject}. } \note{ Use \code{\link{matchPDict}} if you need to match a (big) set of patterns against a reference sequence. Use \code{\link{pairwiseAlignment}} if you need to solve a (Needleman-Wunsch) global alignment, a (Smith-Waterman) local alignment, or an (ends-free) overlap alignment problem. } \seealso{ \link{lowlevel-matching}, \code{\link{matchPDict}}, \code{\link{pairwiseAlignment}}, \code{\link{mismatch}}, \code{\link{matchLRPatterns}}, \code{\link{matchProbePair}}, \code{\link{maskMotif}}, \code{\link{alphabetFrequency}}, \link{XStringViews-class}, \link{MIndex-class} } \examples{ ## --------------------------------------------------------------------- ## A. matchPattern()/countPattern() ## --------------------------------------------------------------------- ## A simple inexact matching example with a short subject: x <- DNAString("AAGCGCGATATG") m1 <- matchPattern("GCNNNAT", x) m1 m2 <- matchPattern("GCNNNAT", x, fixed=FALSE) m2 as.matrix(m2) ## With DNA sequence of yeast chromosome number 1: data(yeastSEQCHR1) yeast1 <- DNAString(yeastSEQCHR1) PpiI <- "GAACNNNNNCTC" # a restriction enzyme pattern match1.PpiI <- matchPattern(PpiI, yeast1, fixed=FALSE) match2.PpiI <- matchPattern(PpiI, yeast1, max.mismatch=1, fixed=FALSE) ## With a genome containing isolated Ns: library(BSgenome.Celegans.UCSC.ce2) chrII <- Celegans[["chrII"]] alphabetFrequency(chrII) matchPattern("N", chrII) matchPattern("TGGGTGTCTTT", chrII) # no match matchPattern("TGGGTGTCTTT", chrII, fixed=FALSE) # 1 match ## Using wildcards ("N") in the pattern on a genome containing N-blocks: library(BSgenome.Dmelanogaster.UCSC.dm3) chrX <- maskMotif(Dmelanogaster$chrX, "N") as(chrX, "Views") # 4 non masked regions matchPattern("TTTATGNTTGGTA", chrX, fixed=FALSE) ## Can also be achieved with no mask: masks(chrX) <- NULL matchPattern("TTTATGNTTGGTA", chrX, fixed="subject") ## --------------------------------------------------------------------- ## B. vmatchPattern()/vcountPattern() ## --------------------------------------------------------------------- Ebox <- DNAString("CANNTG") subject <- Celegans$upstream5000 mindex <- vmatchPattern(Ebox, subject, fixed=FALSE) count_index <- countIndex(mindex) # Get the number of matches per # subject element. sum(count_index) # Total number of matches. table(count_index) i0 <- which(count_index == max(count_index)) subject[i0] # The subject element with most matches. ## The matches in 'subject[i0]' as an IRanges object: mindex[[i0]] ## The matches in 'subject[i0]' as an XStringViews object: Views(subject[[i0]], mindex[[i0]]) ## --------------------------------------------------------------------- ## C. WITH INDELS ## --------------------------------------------------------------------- library(BSgenome.Celegans.UCSC.ce2) subject <- Celegans$chrI pattern1 <- DNAString("ACGGACCTAATGTTATC") pattern2 <- DNAString("ACGGACCTVATGTTRTC") ## Allowing up to 2 mismatching letters doesn't give any match: m1a <- matchPattern(pattern1, subject, max.mismatch=2) ## But allowing up to 2 edit operations gives 3 matches: system.time(m1b <- matchPattern(pattern1, subject, max.mismatch=2, with.indels=TRUE)) m1b ## pairwiseAlignment() returns the (first) best match only: if (interactive()) { mat <- nucleotideSubstitutionMatrix(match=1, mismatch=0, baseOnly=TRUE) ## Note that this call to pairwiseAlignment() will need to ## allocate 733.5 Mb of memory (i.e. length(pattern) * length(subject) ## * 3 bytes). system.time(pwa <- pairwiseAlignment(pattern1, subject, type="local", substitutionMatrix=mat, gapOpening=0, gapExtension=1)) pwa } ## With IUPAC ambiguities in the pattern: m2a <- matchPattern(pattern2, subject, max.mismatch=2, fixed="subject") m2b <- matchPattern(pattern2, subject, max.mismatch=2, with.indels=TRUE, fixed="subject") ## All the matches in 'm1b' and 'm2a' should also appear in 'm2b': stopifnot(suppressWarnings(all(ranges(m1b) \%in\% ranges(m2b)))) stopifnot(suppressWarnings(all(ranges(m2a) \%in\% ranges(m2b)))) ## --------------------------------------------------------------------- ## D. WHEN 'with.indels=TRUE', ONLY "BEST LOCAL MATCHES" ARE REPORTED ## --------------------------------------------------------------------- ## With deletions in the subject: subject <- BString("ACDEFxxxCDEFxxxABCE") matchPattern("ABCDEF", subject, max.mismatch=2, with.indels=TRUE) matchPattern("ABCDEF", subject, max.mismatch=2) ## With insertions in the subject: subject <- BString("AiBCDiEFxxxABCDiiFxxxAiBCDEFxxxABCiDEF") matchPattern("ABCDEF", subject, max.mismatch=2, with.indels=TRUE) matchPattern("ABCDEF", subject, max.mismatch=2) ## With substitutions (note that the "best local matches" can introduce ## indels and therefore be shorter than 6): subject <- BString("AsCDEFxxxABDCEFxxxBACDEFxxxABCEDF") matchPattern("ABCDEF", subject, max.mismatch=2, with.indels=TRUE) matchPattern("ABCDEF", subject, max.mismatch=2) } \keyword{methods} Biostrings/man/matchProbePair.Rd0000644000126300012640000000561112227063320020222 0ustar00biocbuildphs_compbio\name{matchProbePair} \alias{matchProbePair} \alias{matchProbePair,DNAString-method} \alias{matchProbePair,XStringViews-method} \alias{matchProbePair,MaskedDNAString-method} \title{Find "theoretical amplicons" mapped to a probe pair} \description{ In the context of a computer-simulated PCR experiment, one wants to find the amplicons mapped to a given primer pair. The \code{matchProbePair} function can be used for this: given a forward and a reverse probe (i.e. the chromosome-specific sequences of the forward and reverse primers used for the experiment) and a target sequence (generally a chromosome sequence), the \code{matchProbePair} function will return all the "theoretical amplicons" mapped to this probe pair. } \usage{ matchProbePair(Fprobe, Rprobe, subject, algorithm="auto", logfile=NULL, verbose=FALSE) } \arguments{ \item{Fprobe}{ The forward probe. } \item{Rprobe}{ The reverse probe. } \item{subject}{ A \link{DNAString} object (or an \link{XStringViews} object with a \link{DNAString} subject) containing the target sequence. } \item{algorithm}{ One of the following: \code{"auto"}, \code{"naive-exact"}, \code{"naive-inexact"}, \code{"boyer-moore"} or \code{"shift-or"}. See \code{\link{matchPattern}} for more information. } \item{logfile}{ A file used for logging. } \item{verbose}{ \code{TRUE} or \code{FALSE}. } } \details{ The \code{matchProbePair} function does the following: (1) find all the "plus hits" i.e. the Fprobe and Rprobe matches on the "plus" strand, (2) find all the "minus hits" i.e. the Fprobe and Rprobe matches on the "minus" strand and (3) from the set of all (plus\_hit, minus\_hit) pairs, extract and return the subset of "reduced matches" i.e. the (plus\_hit, minus\_hit) pairs such that (a) plus\_hit <= minus\_hit and (b) there are no hits (plus or minus) between plus\_hit and minus\_hit. This set of "reduced matches" is the set of "theoretical amplicons". } \value{ An \link{XStringViews} object containing the set of "theoretical amplicons". } \author{H. Pages} \seealso{ \code{\link{matchPattern}}, \code{\link{matchLRPatterns}}, \code{\link{findPalindromes}}, \code{\link{reverseComplement}}, \link{XStringViews-class} } \examples{ library(BSgenome.Dmelanogaster.UCSC.dm3) subject <- Dmelanogaster$chr3R ## With 20-nucleotide forward and reverse probes: Fprobe <- "AGCTCCGAGTTCCTGCAATA" Rprobe <- "CGTTGTTCACAAATATGCGG" matchProbePair(Fprobe, Rprobe, subject) # 1 "theoretical amplicon" ## With shorter forward and reverse probes, the risk of having multiple ## "theoretical amplicons" increases: Fprobe <- "AGCTCCGAGTTCC" Rprobe <- "CGTTGTTCACAA" matchProbePair(Fprobe, Rprobe, subject) # 2 "theoretical amplicons" Fprobe <- "AGCTCCGAGTT" Rprobe <- "CGTTGTTCACA" matchProbePair(Fprobe, Rprobe, subject) # 9 "theoretical amplicons" } \keyword{methods} Biostrings/man/matchprobes.Rd0000644000126300012640000000421712227063320017632 0ustar00biocbuildphs_compbio\name{matchprobes} \alias{matchprobes} \title{A function to match a query sequence to the sequences of a set of probes.} \description{ The \code{query} sequence, a character string (probably representing a transcript of interest), is scanned for the presence of exact matches to the sequences in the character vector \code{records}. The indices of the set of matches are returned. The function is inefficient: it works on R's character vectors, and the actual matching algorithm is of time complexity \code{length(query)} times \code{length(records)}! See \code{\link{matchPattern}}, \code{\link{vmatchPattern}} and \code{\link{matchPDict}} for more efficient sequence matching functions. } \usage{ matchprobes(query, records, probepos=FALSE) } \arguments{ \item{query}{A character vector. For example, each element may represent a gene (transcript) of interest. See Details.} \item{records}{A character vector. For example, each element may represent the probes on a DNA array.} \item{probepos}{A logical value. If TRUE, return also the start positions of the matches in the query sequence.} } \details{ \code{\link{toupper}} is applied to the arguments \code{query} and \code{records} before matching. The intention of this is to make the matching case-insensitive. The function is embarrassingly naive. The matching is done using the C library function \code{strstr}. } \value{ A list. Its first element is a list of the same length as the input vector. Each element of the list is a numeric vector containing the indices of the probes that have a perfect match in the query sequence. If \code{probepos} is TRUE, the returned list has a second element: it is of the same shape as described above, and gives the respective positions of the matches. } \author{R. Gentleman, Laurent Gautier, Wolfgang Huber} \seealso{\code{\link{matchPattern}}, \code{\link{vmatchPattern}}, \code{\link{matchPDict}}} \examples{ if(require("hgu95av2probe")){ data("hgu95av2probe") seq <- hgu95av2probe$sequence[1:20] target <- paste(seq, collapse="") matchprobes(target, seq, probepos=TRUE) } } \keyword{manip} Biostrings/man/misc.Rd0000644000126300012640000000271512227063320016257 0ustar00biocbuildphs_compbio\name{misc} \alias{misc} \alias{N50} \title{Some miscellaneous stuff} \description{ Some miscellaneous stuff. } \usage{ N50(csizes) } \arguments{ \item{csizes}{ A vector containing the contig sizes. } } \section{The N50 contig size}{ \bold{Definition} The N50 contig size of an assembly (aka the N50 value) is the size of the largest contig such that the contigs larger than that have at least 50\% the bases of the assembly. \bold{How is it calculated?} It is calculated by adding the sizes of the biggest contigs until you reach half the total size of the contigs. The N50 value is then the size of the contig that was added last (i.e. the smallest of the big contigs covering 50\% of the genome). \bold{What for?} The N50 value is a standard measure of the quality of a de novo assembly. } \value{ \code{N50}: The N50 value as an integer. } \author{Nicolas Delhomme } \seealso{ \link{XStringSet-class} } \examples{ # Generate 10 random contigs of sizes comprised between 100 and 10000: my.contig <- DNAStringSet( sapply( sample(c(100:10000), 10), function(size) paste(sample(DNA_BASES, size, replace=TRUE), collapse="") ) ) # Get their sizes: my.size <- width(my.contig) # Calculate the N50 value of this set of contigs: my.contig.N50 <- N50(my.size) } \keyword{methods} \keyword{manip} Biostrings/man/needwunsQS.Rd0000644000126300012640000000354312227063320017420 0ustar00biocbuildphs_compbio\name{needwunsQS} \alias{needwunsQS} \alias{needwunsQS,character,character-method} \alias{needwunsQS,character,XString-method} \alias{needwunsQS,XString,character-method} \alias{needwunsQS,XString,XString-method} \alias{print.needwunsQS} \title{(Deprecated) Needleman-Wunsch Global Alignment} \description{Simple gap implementation of Needleman-Wunsch global alignment algorithm.} \usage{ needwunsQS(s1, s2, substmat, gappen = 8) } \arguments{ \item{s1, s2}{an R character vector of length 1 or an \link{XString} object.} \item{substmat}{matrix of alignment score values.} \item{gappen}{penalty for introducing a gap in the alignment.} } \details{ Follows specification of Durbin, Eddy, Krogh, Mitchison (1998). This function has been deprecated and is being replaced by \code{pairwiseAlignment}. } \value{ An instance of class \code{"PairwiseAlignments"}. } \references{R. Durbin, S. Eddy, A. Krogh, G. Mitchison, Biological Sequence Analysis, Cambridge UP 1998, sec 2.3.} \author{Vince Carey (\email{stvjc@channing.harvard.edu}) (original author) and H. Pages (current maintainer).} \seealso{ \link{pairwiseAlignment}, \link{PairwiseAlignments-class}, \link{substitution.matrices} } \examples{ \dontrun{ ## This function has been deprecated ## Use 'pairwiseAlignment' instead. ## nucleotide alignment mat <- matrix(-5L, nrow = 4, ncol = 4) for (i in seq_len(4)) mat[i, i] <- 0L rownames(mat) <- colnames(mat) <- DNA_ALPHABET[1:4] s1 <- DNAString(paste(sample(DNA_ALPHABET[1:4], 1000, replace=TRUE), collapse="")) s2 <- DNAString(paste(sample(DNA_ALPHABET[1:4], 1000, replace=TRUE), collapse="")) nw0 <- needwunsQS(s1, s2, mat, gappen = 0) nw1 <- needwunsQS(s1, s2, mat, gappen = 1) nw5 <- needwunsQS(s1, s2, mat, gappen = 5) ## amino acid alignment needwunsQS("PAWHEAE", "HEAGAWGHEE", substmat = "BLOSUM50") } } \keyword{models} \keyword{methods} Biostrings/man/nucleotideFrequency.Rd0000644000126300012640000003050412227063320021336 0ustar00biocbuildphs_compbio\name{nucleotideFrequency} \alias{oligonucleotideFrequency} \alias{oligonucleotideFrequency} \alias{oligonucleotideFrequency,XString-method} \alias{oligonucleotideFrequency,XStringSet-method} \alias{oligonucleotideFrequency,XStringViews-method} \alias{oligonucleotideFrequency,MaskedXString-method} \alias{dinucleotideFrequency} \alias{trinucleotideFrequency} \alias{nucleotideFrequencyAt} \alias{nucleotideFrequencyAt,XStringSet-method} \alias{nucleotideFrequencyAt,XStringViews-method} \alias{oligonucleotideTransitions} \alias{mkAllStrings} \title{Calculate the frequency of oligonucleotides in a DNA or RNA sequence (and other related functions)} \description{ Given a DNA or RNA sequence (or a set of DNA or RNA sequences), the \code{oligonucleotideFrequency} function computes the frequency of all possible oligonucleotides of a given length (called the "width" in this particular context) in a sliding window that is shifted \code{step} nucleotides at a time. The \code{dinucleotideFrequency} and \code{trinucleotideFrequency} functions are convenient wrappers for calling \code{oligonucleotideFrequency} with \code{width=2} and \code{width=3}, respectively. The \code{nucleotideFrequencyAt} function computes the frequency of the short sequences formed by extracting the nucleotides found at some fixed positions from each sequence of a set of DNA or RNA sequences. In this man page we call "DNA input" (or "RNA input") an \link{XString}, \link{XStringSet}, \link{XStringViews} or \link{MaskedXString} object of base type DNA (or RNA). } \usage{ oligonucleotideFrequency(x, width, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE, ...) \S4method{oligonucleotideFrequency}{XStringSet}(x, width, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE, simplify.as="matrix") dinucleotideFrequency(x, step=1, as.prob=FALSE, as.matrix=FALSE, fast.moving.side="right", with.labels=TRUE, ...) trinucleotideFrequency(x, step=1, as.prob=FALSE, as.array=FALSE, fast.moving.side="right", with.labels=TRUE, ...) nucleotideFrequencyAt(x, at, as.prob=FALSE, as.array=TRUE, fast.moving.side="right", with.labels=TRUE, ...) ## Some related functions: oligonucleotideTransitions(x, left=1, right=1, as.prob=FALSE) mkAllStrings(alphabet, width, fast.moving.side="right") } \arguments{ \item{x}{ Any DNA or RNA input for the \code{*Frequency} and \code{oligonucleotideTransitions} functions. An \link{XStringSet} or \link{XStringViews} object of base type DNA or RNA for \code{nucleotideFrequencyAt}. } \item{width}{ The number of nucleotides per oligonucleotide for \code{oligonucleotideFrequency}. The number of letters per string for \code{mkAllStrings}. } \item{step}{ How many nucleotides should the window be shifted before counting the next oligonucleotide (i.e. the sliding window step; default 1). If \code{step} is smaller than \code{width}, oligonucleotides will overlap; if the two arguments are equal, adjacent oligonucleotides will be counted (an efficient way to count codons in an ORF); and if \code{step} is larger than \code{width}, nucleotides will be sampled \code{step} nucleotides apart. } \item{at}{ An integer vector containing the positions to look at in each element of \code{x}. } \item{as.prob}{ If \code{TRUE} then probabilities are reported, otherwise counts (the default). } \item{as.array,as.matrix}{ Controls the "shape" of the returned object. If \code{TRUE} (the default for \code{nucleotideFrequencyAt}) then it's a numeric matrix (or array), otherwise it's just a "flat" numeric vector i.e. a vector with no dim attribute (the default for the \code{*Frequency} functions). } \item{fast.moving.side}{ Which side of the strings should move fastest? Note that, when \code{as.array} is TRUE, then the supplied value is ignored and the effective value is \code{"left"}. } \item{with.labels}{ If \code{TRUE} then the returned object is named. } \item{...}{ Further arguments to be passed to or from other methods. } \item{simplify.as}{ Together with the \code{as.array} and \code{as.matrix} arguments, controls the "shape" of the returned object when the input \code{x} is an \link{XStringSet} or \link{XStringViews} object. Supported \code{simplify.as} values are \code{"matrix"} (the default), \code{"list"} and \code{"collapsed"}. If \code{simplify.as} is \code{"matrix"}, the returned object is a matrix with \code{length(x)} rows where the \code{i}-th row contains the frequencies for \code{x[[i]]}. If \code{simplify.as} is \code{"list"}, the returned object is a list of the same length as \code{length(x)} where the \code{i}-th element contains the frequencies for \code{x[[i]]}. If \code{simplify.as} is \code{"collapsed"}, then the the frequencies are computed for the entire object \code{x} as a whole (i.e. frequencies cumulated across all sequences in \code{x}). } \item{left, right}{ The number of nucleotides per oligonucleotide for the rows and columns respectively in the transition matrix created by \code{oligonucleotideTransitions}. } \item{alphabet}{ The alphabet to use to make the strings. } } \value{ If \code{x} is an \link{XString} or \link{MaskedXString} object, the \code{*Frequency} functions return a numeric vector of length \code{4^width}. If \code{as.array} (or \code{as.matrix}) is \code{TRUE}, then this vector is formatted as an array (or matrix). If \code{x} is an \link{XStringSet} or \link{XStringViews} object, the returned object has the shape specified by the \code{simplify.as} argument. } \author{H. Pages and P. Aboyoun; K. Vlahovicek for the \code{step} argument} \seealso{ \code{\link{alphabetFrequency}}, \code{\link{alphabet}}, \code{\link{hasLetterAt}}, \link{XString-class}, \link{XStringSet-class}, \link{XStringViews-class}, \link{MaskedXString-class}, \code{\link{GENETIC_CODE}}, \code{\link{AMINO_ACID_CODE}}, \code{\link{reverseComplement}}, \code{\link{rev}} } \examples{ ## --------------------------------------------------------------------- ## A. BASIC *Frequency() EXAMPLES ## --------------------------------------------------------------------- data(yeastSEQCHR1) yeast1 <- DNAString(yeastSEQCHR1) dinucleotideFrequency(yeast1) trinucleotideFrequency(yeast1) oligonucleotideFrequency(yeast1, 4) ## Get the counts of tetranucleotides overlapping by one nucleotide: oligonucleotideFrequency(yeast1, 4, step=3) ## Get the counts of adjacent tetranucleotides, starting from the first ## nucleotide: oligonucleotideFrequency(yeast1, 4, step=4) ## Subset the sequence to change the starting nucleotide (here we start ## counting from third nucleotide): yeast2 <- subseq(yeast1, start=3) oligonucleotideFrequency(yeast2, 4, step=4) ## Get the less and most represented 6-mers: f6 <- oligonucleotideFrequency(yeast1, 6) f6[f6 == min(f6)] f6[f6 == max(f6)] ## Get the result as an array: tri <- trinucleotideFrequency(yeast1, as.array=TRUE) tri["A", "A", "C"] # == trinucleotideFrequency(yeast1)["AAC"] tri["T", , ] # frequencies of trinucleotides starting with a "T" ## With input made of multiple sequences: library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) dfmat <- dinucleotideFrequency(probes) # a big matrix dinucleotideFrequency(probes, simplify.as="collapsed") dinucleotideFrequency(probes, simplify.as="collapsed", as.matrix=TRUE) ## --------------------------------------------------------------------- ## B. OBSERVED DINUCLEOTIDE FREQUENCY VERSUS EXPECTED DINUCLEOTIDE ## FREQUENCY ## --------------------------------------------------------------------- ## The expected frequency of dinucleotide "ab" based on the frequencies ## of its individual letters "a" and "b" is: ## exp_Fab = Fa * Fb / N if the 2 letters are different (e.g. CG) ## exp_Faa = Fa * (Fa-1) / N if the 2 letters are the same (e.g. TT) ## where Fa and Fb are the frequencies of "a" and "b" (respectively) and ## N the length of the sequence. ## Here is a simple function that implements the above formula for a ## DNAString object 'x'. The expected frequencies are returned in a 4x4 ## matrix where the rownames and colnames correspond to the 1st and 2nd ## base in the dinucleotide: expectedDinucleotideFrequency <- function(x) { # Individual base frequencies. bf <- alphabetFrequency(x, baseOnly=TRUE)[DNA_BASES] (as.matrix(bf) \%*\% t(bf) - diag(bf)) / length(x) } ## On Celegans chrI: library(BSgenome.Celegans.UCSC.ce2) chrI <- Celegans$chrI obs_df <- dinucleotideFrequency(chrI, as.matrix=TRUE) obs_df # CG has the lowest frequency exp_df <- expectedDinucleotideFrequency(chrI) ## A sanity check: stopifnot(as.integer(sum(exp_df)) == sum(obs_df)) ## Ratio of observed frequency to expected frequency: obs_df / exp_df # TA has the lowest ratio, not CG! ## --------------------------------------------------------------------- ## C. nucleotideFrequencyAt() ## --------------------------------------------------------------------- nucleotideFrequencyAt(probes, 13) nucleotideFrequencyAt(probes, c(13, 20)) nucleotideFrequencyAt(probes, c(13, 20), as.array=FALSE) ## nucleotideFrequencyAt() can be used to answer questions like: "how ## many probes in the drosophila2 chip have T, G, T, A at position ## 2, 4, 13 and 20, respectively?" nucleotideFrequencyAt(probes, c(2, 4, 13, 20))["T", "G", "T", "A"] ## or "what's the probability to have an A at position 25 if there is ## one at position 13?" nf <- nucleotideFrequencyAt(probes, c(13, 25)) sum(nf["A", "A"]) / sum(nf["A", ]) ## Probabilities to have other bases at position 25 if there is an A ## at position 13: sum(nf["A", "C"]) / sum(nf["A", ]) # C sum(nf["A", "G"]) / sum(nf["A", ]) # G sum(nf["A", "T"]) / sum(nf["A", ]) # T ## See ?hasLetterAt for another way to get those results. ## --------------------------------------------------------------------- ## D. oligonucleotideTransitions() ## --------------------------------------------------------------------- ## Get nucleotide transition matrices for yeast1 oligonucleotideTransitions(yeast1) oligonucleotideTransitions(yeast1, 2, as.prob=TRUE) ## --------------------------------------------------------------------- ## E. ADVANCED *Frequency() EXAMPLES ## --------------------------------------------------------------------- ## Note that when dropping the dimensions of the 'tri' array, elements ## in the resulting vector are ordered as if they were obtained with ## 'fast.moving.side="left"': triL <- trinucleotideFrequency(yeast1, fast.moving.side="left") all(as.vector(tri) == triL) # TRUE ## Convert the trinucleotide frequency into the amino acid frequency ## based on translation: tri1 <- trinucleotideFrequency(yeast1) names(tri1) <- GENETIC_CODE[names(tri1)] sapply(split(tri1, names(tri1)), sum) # 12512 occurrences of the stop codon ## When the returned vector is very long (e.g. width >= 10), using ## 'with.labels=FALSE' can improve performance significantly. ## Here for example, the observed speed up is between 25x and 500x: f12 <- oligonucleotideFrequency(yeast1, 12, with.labels=FALSE) # very fast! ## With the use of 'step', trinucleotideFrequency() is a very fast way to ## calculate the codon usage table in an ORF (or a set of ORFs). ## Taking the same example as in '?codons': file <- system.file("extdata", "someORF.fa", package="Biostrings") my_ORFs <- readDNAStringSet(file) ## Strip flanking 1000 nucleotides around each ORF and remove first ## sequence as it contains an intron: my_ORFs <- DNAStringSet(my_ORFs, start=1001, end=-1001)[-1] ## Codon usage for each ORF: codon_usage <- trinucleotideFrequency(my_ORFs, step=3) ## Codon usage across all ORFs: global_codon_usage <- trinucleotideFrequency(my_ORFs, step=3, simplify.as="collapsed") stopifnot(all(colSums(codon_usage) == global_codon_usage)) # sanity check ## Some related functions: dict1 <- mkAllStrings(LETTERS[1:3], 4) dict2 <- mkAllStrings(LETTERS[1:3], 4, fast.moving.side="left") stopifnot(identical(reverse(dict1), dict2)) } \keyword{methods} \keyword{manip} Biostrings/man/padAndClip.Rd0000644000126300012640000001231012227063320017313 0ustar00biocbuildphs_compbio\name{padAndClip} \alias{padAndClip} \alias{stackStrings} \title{Pad and clip strings} \description{ \code{padAndClip} first conceptually pads the supplied strings with an infinite number of padding letters on both sides, then clip them. \code{stackStrings} is a convenience wrapper to \code{padAndClip} that turns a variable-width set of strings into a rectangular (i.e. constant-width) set, by padding and clipping the strings, after conceptually shifting them horizontally. } \usage{ padAndClip(x, views, Lpadding.letter=" ", Rpadding.letter=" ", remove.out.of.view.strings=FALSE) stackStrings(x, from, to, shift=0L, Lpadding.letter=" ", Rpadding.letter=" ", remove.out.of.view.strings=FALSE) } \arguments{ \item{x}{ An \link{XStringSet} object containing the strings to pad and clip. } \item{views}{ A \link[IRanges]{Ranges} object (recycled to the length of \code{x} if necessary) defining the region to keep for each string. Because the strings are first conceptually padded with an infinite number of padding letters on both sides, regions can go beyond string limits. } \item{Lpadding.letter, Rpadding.letter}{ A single letter to use for padding on the left, and another one to use for padding on the right. Note that the default letter (\code{" "}) does not work if, for example, \code{x} is a \link{DNAStringSet} object, because the space is not a valid DNA letter (see \code{?\link{DNA_ALPHABET}}). So the \code{Lpadding.letter} and \code{Rpadding.letter} arguments \emph{must} be supplied if \code{x} is not a \link{BStringSet} object. For example, if \code{x} is a \link{DNAStringSet} object, a typical choice is to use \code{"+"}. } \item{remove.out.of.view.strings}{ \code{TRUE} or \code{FALSE}. Whether or not to remove the strings that are out of view in the returned object. } \item{from, to}{ Another way to specify the region to keep for each string, but with the restriction that \code{from} and \code{to} must be single integers. So only 1 region can be specified, and the same region is used for all the strings. } \item{shift}{ An integer vector (recycled to the length of \code{x} if necessary) specifying the amount of shifting (in number of letters) to apply to each string before doing pad and clip. Positive values shift to the right and negative values to the left. } } \value{ For \code{padAndClip}: An \link{XStringSet} object. If \code{remove.out.of.view.strings} is \code{FALSE}, it has the same length and names as \code{x}, and its "shape", which is described by the integer vector returned by \code{width()}, is the same as the shape of the \code{views} argument after recycling. The class of the returned object is the direct concrete subclass of \link{XStringSet} that \code{x} belongs to or derives from. There are 4 direct concrete subclasses of the \link{XStringSet} virtual class: \link{BStringSet}, \link{DNAStringSet}, \link{RNAStringSet}, and \link{AAStringSet}. If \code{x} is an \emph{instance} of one of those classes, then the returned object has the same class as \code{x} (i.e. in that case, \code{padAndClip} acts as an endomorphism). But if \code{x} \emph{derives} from one of those 4 classes, then the returned object is downgraded to the class \code{x} derives from. In that case, \code{padAndClip} does not act as an endomorphism. For \code{stackStrings}: Same as \code{padAndClip}. In addition it is guaranteed to have a rectangular shape i.e. to be a constant-width \link{XStringSet} object. } \author{H. Pages} \seealso{ \itemize{ \item The \code{\link[Rsamtools]{stackStringsFromBam}} function in the \pkg{Rsamtools} package for stacking the read sequences (or their quality strings) stored in a BAM file on a region of interest. \item The \link{XStringViews} class to formally represent a set of views on a single string. \item The \code{\link{extractAt}} and \code{\link{replaceAt}} functions for extracting/replacing arbitrary substrings from/in a string or set of strings. \item The \link{XStringSet} class. \item The \link[IRanges]{Ranges} class in the \pkg{IRanges} package. } } \examples{ x <- BStringSet(c(seq1="ABCD", seq2="abcdefghijk", seq3="", seq4="XYZ")) padAndClip(x, IRanges(3, 8:5), Lpadding.letter=">", Rpadding.letter="<") padAndClip(x, IRanges(1:-2, 7), Lpadding.letter=">", Rpadding.letter="<") stackStrings(x, 2, 8) stackStrings(x, -2, 8, shift=c(0, -11, 6, 7), Lpadding.letter="#", Rpadding.letter=".") stackStrings(x, -2, 8, shift=c(0, -14, 6, 7), Lpadding.letter="#", Rpadding.letter=".") stackStrings(x, -2, 8, shift=c(0, -14, 6, 7), Lpadding.letter="#", Rpadding.letter=".", remove.out.of.view.strings=TRUE) library(hgu95av2probe) probes <- DNAStringSet(hgu95av2probe) probes stackStrings(probes, 0, 26, Lpadding.letter="+", Rpadding.letter="-") options(showHeadLines=15) stackStrings(probes, 3, 23, shift=6*c(1:5, -(1:5)), Lpadding.letter="+", Rpadding.letter="N", remove.out.of.view.strings=TRUE) } \keyword{methods} \keyword{manip} Biostrings/man/pairwiseAlignment.Rd0000644000126300012640000002064012227063320021003 0ustar00biocbuildphs_compbio\name{pairwiseAlignment} \alias{pairwiseAlignment} \alias{pairwiseAlignment,ANY,ANY-method} \alias{pairwiseAlignment,ANY,QualityScaledXStringSet-method} \alias{pairwiseAlignment,QualityScaledXStringSet,ANY-method} \alias{pairwiseAlignment,QualityScaledXStringSet,QualityScaledXStringSet-method} \title{Optimal Pairwise Alignment} \description{ Solves (Needleman-Wunsch) global alignment, (Smith-Waterman) local alignment, and (ends-free) overlap alignment problems. } \usage{ pairwiseAlignment(pattern, subject, \dots) \S4method{pairwiseAlignment}{ANY,ANY}(pattern, subject, patternQuality=PhredQuality(22L), subjectQuality=PhredQuality(22L), type="global", substitutionMatrix=NULL, fuzzyMatrix=NULL, gapOpening=-10, gapExtension=-4, scoreOnly=FALSE) \S4method{pairwiseAlignment}{QualityScaledXStringSet,QualityScaledXStringSet}(pattern, subject, type="global", substitutionMatrix=NULL, fuzzyMatrix=NULL, gapOpening=-10, gapExtension=-4, scoreOnly=FALSE) } \arguments{ \item{pattern}{a character vector of any length, an \code{\link{XString}}, or an \code{\link{XStringSet}} object.} \item{subject}{a character vector of length 1, an \code{\link{XString}}, or an \code{\link{XStringSet}} object of length 1.} \item{patternQuality, subjectQuality}{objects of class \code{\link{XStringQuality}} representing the respective quality scores for \code{pattern} and \code{subject} that are used in a quality-based method for generating a substitution matrix. These two arguments are ignored if \code{!is.null(substitutionMatrix)} or if its respective string set (\code{pattern}, \code{subject}) is of class \code{\link{QualityScaledXStringSet}}.} \item{type}{type of alignment. One of \code{"global"}, \code{"local"}, \code{"overlap"}, \code{"global-local"}, and \code{"local-global"} where \code{"global"} = align whole strings with end gap penalties, \code{"local"} = align string fragments, \code{"overlap"} = align whole strings without end gap penalties, \code{"global-local"} = align whole strings in \code{pattern} with consecutive subsequence of \code{subject}, \code{"local-global"} = align consecutive subsequence of \code{pattern} with whole strings in \code{subject}.} \item{substitutionMatrix}{substitution matrix representing the fixed substitution scores for an alignment. It cannot be used in conjunction with \code{patternQuality} and \code{subjectQuality} arguments.} \item{fuzzyMatrix}{fuzzy match matrix for quality-based alignments. It takes values between 0 and 1; where 0 is an unambiguous mismatch, 1 is an unambiguous match, and values in between represent a fraction of "matchiness". (See details section below.)} \item{gapOpening}{the cost for opening a gap in the alignment.} \item{gapExtension}{the incremental cost incurred along the length of the gap in the alignment.} \item{scoreOnly}{logical to denote whether or not to return just the scores of the optimal pairwise alignment.} \item{\dots}{optional arguments to generic function to support additional methods.} } \details{ Quality-based alignments are based on the paper the Bioinformatics article by Ketil Malde listed in the Reference section below. Let \eqn{\epsilon_i} be the probability of an error in the base read. For \code{"Phred"} quality measures \eqn{Q} in \eqn{[0, 99]}, these error probabilities are given by \eqn{\epsilon_i = 10^{-Q/10}}. For \code{"Solexa"} quality measures \eqn{Q} in \eqn{[-5, 99]}, they are given by \eqn{\epsilon_i = 1 - 1/(1 + 10^{-Q/10})}. Assuming independence within and between base reads, the combined error probability of a mismatch when the underlying bases do match is \eqn{\epsilon_c = \epsilon_1 + \epsilon_2 - (n/(n-1)) * \epsilon_1 * \epsilon_2}, where \eqn{n} is the number of letters in the underlying alphabet (i.e. \eqn{n = 4} for DNA input, \eqn{n = 20} for amino acid input, otherwise \eqn{n} is the number of distinct letters in the input). Using \eqn{\epsilon_c}, the substitution score is given by \eqn{b * \log_2(\gamma_{x,y} * (1 - \epsilon_c) * n + (1 - \gamma_{x,y}) * \epsilon_c * (n/(n-1)))}, where \eqn{b} is the bit-scaling for the scoring and \eqn{\gamma_{x,y}} is the probability that characters \eqn{x} and \eqn{y} represents the same underlying information (e.g. using IUPAC, \eqn{\gamma_{A,A} = 1} and \eqn{\gamma_{A,N} = 1/4}. In the arguments listed above \code{fuzzyMatch} represents \eqn{\gamma_{x,y}} and \code{patternQuality} and \code{subjectQuality} represents \eqn{\epsilon_1} and \eqn{\epsilon_2} respectively. If \code{scoreOnly == FALSE}, a pairwise alignment with the maximum alignment score is returned. If more than one pairwise alignment produces the maximum alignment score, then the alignment with the smallest initial deletion whose mismatches occur before its insertions and deletions is chosen. For example, if \code{pattern = "AGTA"} and \code{subject = "AACTAACTA"}, then the alignment \code{pattern: [1] AG-TA; subject: [1] AACTA} is chosen over \code{pattern: [1] A-GTA; subject: [1] AACTA} or \code{pattern: [1] AG-TA; subject: [5] AACTA} if they all achieve the maximum alignment score. } \value{ If \code{scoreOnly == FALSE}, an instance of class \code{\link{PairwiseAlignments}} or \code{\link{PairwiseAlignmentsSingleSubject}} is returned. If \code{scoreOnly == TRUE}, a numeric vector containing the scores for the optimal pairwise alignments is returned. } \references{ R. Durbin, S. Eddy, A. Krogh, G. Mitchison, Biological Sequence Analysis, Cambridge UP 1998, sec 2.3. B. Haubold, T. Wiehe, Introduction to Computational Biology, Birkhauser Verlag 2006, Chapter 2. K. Malde, The effect of sequence quality on sequence alignment, Bioinformatics 2008 24(7):897-900. } \note{ Use \code{\link{matchPattern}} or \code{\link{vmatchPattern}} if you need to find all the occurrences (eventually with indels) of a given pattern in a reference sequence or set of sequences. Use \code{\link{matchPDict}} if you need to match a (big) set of patterns against a reference sequence. } \author{P. Aboyoun and H. Pages} \seealso{ \code{\link{writePairwiseAlignments}}, \code{\link{stringDist}}, \link{PairwiseAlignments-class}, \link{XStringQuality-class}, \link{substitution.matrices}, \code{\link{matchPattern}} } \examples{ ## Nucleotide global, local, and overlap alignments s1 <- DNAString("ACTTCACCAGCTCCCTGGCGGTAAGTTGATCAAAGGAAACGCAAAGTTTTCAAG") s2 <- DNAString("GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") # First use a fixed substitution matrix mat <- nucleotideSubstitutionMatrix(match = 1, mismatch = -3, baseOnly = TRUE) globalAlign <- pairwiseAlignment(s1, s2, substitutionMatrix = mat, gapOpening = -5, gapExtension = -2) localAlign <- pairwiseAlignment(s1, s2, type = "local", substitutionMatrix = mat, gapOpening = -5, gapExtension = -2) overlapAlign <- pairwiseAlignment(s1, s2, type = "overlap", substitutionMatrix = mat, gapOpening = -5, gapExtension = -2) # Then use quality-based method for generating a substitution matrix pairwiseAlignment(s1, s2, patternQuality = SolexaQuality(rep(c(22L, 12L), times = c(36, 18))), subjectQuality = SolexaQuality(rep(c(22L, 12L), times = c(40, 20))), scoreOnly = TRUE) # Now assume can't distinguish between C/T and G/A pairwiseAlignment(s1, s2, patternQuality = SolexaQuality(rep(c(22L, 12L), times = c(36, 18))), subjectQuality = SolexaQuality(rep(c(22L, 12L), times = c(40, 20))), type = "local") mapping <- diag(4) dimnames(mapping) <- list(DNA_BASES, DNA_BASES) mapping["C", "T"] <- mapping["T", "C"] <- 1 mapping["G", "A"] <- mapping["A", "G"] <- 1 pairwiseAlignment(s1, s2, patternQuality = SolexaQuality(rep(c(22L, 12L), times = c(36, 18))), subjectQuality = SolexaQuality(rep(c(22L, 12L), times = c(40, 20))), fuzzyMatrix = mapping, type = "local") ## Amino acid global alignment pairwiseAlignment(AAString("PAWHEAE"), AAString("HEAGAWGHEE"), substitutionMatrix = "BLOSUM50", gapOpening = 0, gapExtension = -8) } \keyword{models} \keyword{methods} Biostrings/man/phiX174Phage.Rd0000644000126300012640000000473612227063320017442 0ustar00biocbuildphs_compbio\name{phiX174Phage} \alias{phiX174Phage} \alias{srPhiX174} \alias{quPhiX174} \alias{wtPhiX174} \title{Versions of bacteriophage phiX174 complete genome and sample short reads} \description{ Six versions of the complete genome for bacteriophage \eqn{\phi} X174 as well as a small number of Solexa short reads, qualities associated with those short reads, and counts for the number times those short reads occurred. } \details{ The \code{phiX174Phage} object is a \code{DNAStringSet} containing the following six naturally occurring versions of the bacteriophage \eqn{\phi} X174 genome cited in Smith et al.: \describe{ \item{Genbank:}{The version of the genome from GenBank (NC\_001422.1, GI:9626372).} \item{RF70s:}{A preparation of \eqn{\phi} X double-stranded replicative form (RF) of DNA by Clyde A. Hutchison III from the late 1970s.} \item{SS78:}{A preparation of \eqn{\phi} X virion single-stranded DNA from 1978.} \item{Bull:}{The sequence of wild-type \eqn{\phi} X used by Bull et al.} \item{G'97:}{The \eqn{\phi} X replicative form (RF) of DNA from Bull et al.} \item{NEB'03:}{A \eqn{\phi} X replicative form (RF) of DNA from New England BioLabs (NEB).} } The \code{srPhiX174} object is a \code{DNAStringSet} containing short reads from a Solexa machine. The \code{quPhiX174} object is a \code{BStringSet} containing Solexa quality scores associated with \code{srPhiX174}. The \code{wtPhiX174} object is an integer vector containing counts associated with \code{srPhiX174}. } \references{ \url{http://www.genome.jp/dbget-bin/www_bget?refseq+NC_001422} Bull, J. J., Badgett, M. R., Wichman, H. A., Huelsenbeck, Hillis, D. M., Gulati, A., Ho, C. & Molineux, J. (1997) Genetics 147, 1497-1507. Smith, Hamilton O.; Clyde A. Hutchison, Cynthia Pfannkoch, J. Craig Venter (2003-12-23). "Generating a synthetic genome by whole genome assembly: \{phi\}X174 bacteriophage from synthetic oligonucleotides". Proceedings of the National Academy of Sciences 100 (26): 15440-15445. doi:10.1073/pnas.2237126100. } \examples{ data(phiX174Phage) nchar(phiX174Phage) genBankPhage <- phiX174Phage[[1]] genBankSubstring <- substring(genBankPhage, 2793-34, 2811+34) data(srPhiX174) srPhiX174 quPhiX174 summary(wtPhiX174) alignPhiX174 <- pairwiseAlignment(srPhiX174, genBankSubstring, patternQuality = SolexaQuality(quPhiX174), subjectQuality = SolexaQuality(99L), type = "global-local") summary(alignPhiX174, weight = wtPhiX174) } \keyword{datasets} Biostrings/man/pid.Rd0000644000126300012640000000342112227063320016073 0ustar00biocbuildphs_compbio\name{pid} \alias{pid} \alias{pid,PairwiseAlignments-method} \title{Percent Sequence Identity} \description{ Calculates the percent sequence identity for a pairwise sequence alignment. } \usage{ pid(x, type="PID1") } \arguments{ \item{x}{a \code{\link{PairwiseAlignments}} object.} \item{type}{one of percent sequence identity. One of \code{"PID1"}, \code{"PID2"}, \code{"PID3"}, and \code{"PID4"}. See Details for more information.} } \details{ Since there is no universal definition of percent sequence identity, the \code{pid} function calculates this statistic in the following types: \describe{ \item{\code{"PID1"}:}{ 100 * (identical positions) / (aligned positions + internal gap positions) } \item{\code{"PID2"}:}{ 100 * (identical positions) / (aligned positions) } \item{\code{"PID3"}:}{ 100 * (identical positions) / (length shorter sequence) } \item{\code{"PID4"}:}{ 100 * (identical positions) / (average length of the two sequences) } } } \value{ A numeric vector containing the specified sequence identity measures. } \references{ A. May, Percent Sequence Identity: The Need to Be Explicit, Structure 2004, 12(5):737. G. Raghava and G. Barton, Quantification of the variation in percentage identity for protein sequence alignments, BMC Bioinformatics 2006, 7:415. } \author{P. Aboyoun} \seealso{ \link{pairwiseAlignment}, \link{PairwiseAlignments-class}, \link{match-utils} } \examples{ s1 <- DNAString("AGTATAGATGATAGAT") s2 <- DNAString("AGTAGATAGATGGATGATAGATA") palign1 <- pairwiseAlignment(s1, s2) palign1 pid(palign1) palign2 <- pairwiseAlignment(s1, s2, substitutionMatrix = nucleotideSubstitutionMatrix(match = 2, mismatch = 10, baseOnly = TRUE)) palign2 pid(palign2, type = "PID4") } \keyword{methods} Biostrings/man/pmatchPattern.Rd0000644000126300012640000000331712227063320020135 0ustar00biocbuildphs_compbio\name{pmatchPattern} \alias{lcprefix} \alias{lcprefix,character,character-method} \alias{lcprefix,character,XString-method} \alias{lcprefix,XString,character-method} \alias{lcprefix,XString,XString-method} \alias{lcsuffix} \alias{lcsuffix,character,character-method} \alias{lcsuffix,character,XString-method} \alias{lcsuffix,XString,character-method} \alias{lcsuffix,XString,XString-method} \alias{lcsubstr} \alias{lcsubstr,character,character-method} \alias{lcsubstr,character,XString-method} \alias{lcsubstr,XString,character-method} \alias{lcsubstr,XString,XString-method} \alias{pmatchPattern} \alias{pmatchPattern,character-method} \alias{pmatchPattern,XString-method} \alias{pmatchPattern,XStringViews-method} \title{Longest Common Prefix/Suffix/Substring searching functions} \description{ Functions for searching the Longest Common Prefix/Suffix/Substring of two strings. WARNING: These functions are experimental and might not work properly! Full documentation will come later. Please send questions/comments to hpages@fhcrc.org Thanks for your comprehension! } \usage{ lcprefix(s1, s2) lcsuffix(s1, s2) lcsubstr(s1, s2) pmatchPattern(pattern, subject, maxlength.out=1L) } \arguments{ \item{s1}{ 1st string, a character string or an \link{XString} object. } \item{s2}{ 2nd string, a character string or an \link{XString} object. } \item{pattern}{ The pattern string. } \item{subject}{ An \link{XString} object containing the subject string. } \item{maxlength.out}{ The maximum length of the output i.e. the maximum number of views in the returned object. } } \seealso{ \link{matchPattern}, \link{XStringViews-class}, \link{XString-class} } \keyword{methods} Biostrings/man/replaceAt.Rd0000644000126300012640000002123112227063320017216 0ustar00biocbuildphs_compbio\name{replaceAt} \alias{extractAt} \alias{replaceAt} \alias{extractAt,XString-method} \alias{extractAt,XStringSet-method} \alias{replaceAt,XString-method} \alias{replaceAt,XStringSet-method} \title{Extract/replace arbitrary substrings from/in a string or set of strings.} \description{ \code{extractAt} extracts multiple subsequences from \link{XString} object \code{x}, or from the individual sequences of \link{XStringSet} object \code{x}, at the ranges of positions specified thru \code{at}. \code{replaceAt} performs multiple subsequence replacements (a.k.a. substitutions) in \link{XString} object \code{x}, or in the individual sequences of \link{XStringSet} object \code{x}, at the ranges of positions specified thru \code{at}. } \usage{ extractAt(x, at) replaceAt(x, at, value="") } \arguments{ \item{x}{ An \link{XString} or \link{XStringSet} object. } \item{at}{ Typically a \link[IRanges]{Ranges} object if \code{x} is an \link{XString} object, and a \link[IRanges]{RangesList} object if \code{x} is an \link{XStringSet} object. Alternatively, the ranges can be specified with only 1 number per range (its start position), in which case they are considered to be empty ranges (a.k.a. zero-width ranges). So if \code{at} is a numeric vector, an \link[IRanges]{IntegerList} object, or a list of numeric vectors, each number in it is interpreted as the start position of a zero-width range. This is useful when using \code{replaceAt} to perform insertions. The following applies only if \code{x} is an \link{XStringSet} object: \code{at} is recycled to the length of \code{x} if necessary. If \code{at} is a \link[IRanges]{Ranges} object (or a numeric vector), it is first turned into a \link[IRanges]{RangesList} object of length 1 and then this \link[IRanges]{RangesList} object is recycled to the length of \code{x}. This is useful for specifying the same ranges across all sequences in \code{x}. The \emph{effective shape} of \code{at} is described by its length together with the lengths of its list elements \emph{after} recycling. As a special case, \code{extractAt} accepts \code{at} and \code{value} to be both of length 0, in which case it just returns \code{x} unmodified (no-op). } \item{value}{ The replacement sequences. If \code{x} is an \link{XString} object, \code{value} is typically a character vector or an \link{XStringSet} object that is recycled to the length of \code{at} (if necessary). If \code{x} is an \link{XStringSet} object, \code{value} is typically a list of character vectors or a \link[IRanges]{CharacterList} or \link{XStringSetList} object. If necessary, it is recycled "vertically" first and then "horizontally" to bring it into the \emph{effective shape} of \code{at} (see above). "Vertical recycling" is the usual recycling whereas "horizontal recycling" recycles the individual list elements . As a special case, \code{extractAt} accepts \code{at} and \code{value} to be both of length 0, in which case it just returns \code{x} unmodified (no-op). } } \value{ For \code{extractAt}: An \link{XStringSet} object of the same length as \code{at} if \code{x} is an \link{XString} object. An \link{XStringSetList} object of the same length as \code{x} (and same \emph{effective shape} as \code{at}) if \code{x} is an \link{XStringSet} object. For \code{replaceAt}: An object of the same class as \code{x}. If \code{x} is an \link{XStringSet} object, its length and names and metadata columns are preserved. } \author{H. Pages} \seealso{ \itemize{ \item The \code{\link[XVector]{subseq}} and \code{\link[XVector]{subseq<-}} functions in the \pkg{XVector} package for simpler forms of subsequence extractions or replacements. \item The \code{\link{replaceLetterAt}} function for a DNA-specific single-letter replacement functions useful for SNP injections. \item The \code{\link{padAndClip}} function for padding and clipping strings. \item The \link{XString}, \link{XStringSet}, and \link{XStringSetList} classes. \item The \link[IRanges]{Ranges}, \link[IRanges]{RangesList}, \link[IRanges]{IntegerList}, and \link[IRanges]{CharacterList} classes in the \pkg{IRanges} package. } } \examples{ ## --------------------------------------------------------------------- ## (A) ON AN XString OBJECT ## --------------------------------------------------------------------- x <- BString("abcdefghijklm") at1 <- IRanges(5:1, width=3) extractAt(x, at1) names(at1) <- LETTERS[22:26] extractAt(x, at1) at2 <- IRanges(c(1, 5, 12), c(3, 4, 12), names=c("X", "Y", "Z")) extractAt(x, at2) extractAt(x, rev(at2)) value <- c("+", "-", "*") replaceAt(x, at2, value=value) replaceAt(x, rev(at2), value=rev(value)) at3 <- IRanges(c(14, 1, 1, 1, 1, 11), c(13, 0, 10, 0, 0, 10)) value <- 1:6 replaceAt(x, at3, value=value) # "24536klm1" replaceAt(x, rev(at3), value=rev(value)) # "54236klm1" ## Deletions: stopifnot(replaceAt(x, at2) == "defghijkm") stopifnot(replaceAt(x, rev(at2)) == "defghijkm") stopifnot(replaceAt(x, at3) == "klm") stopifnot(replaceAt(x, rev(at3)) == "klm") ## Insertions: at4 <- IRanges(c(6, 10, 2, 5), width=0) stopifnot(replaceAt(x, at4, value="-") == "a-bcd-e-fghi-jklm") stopifnot(replaceAt(x, start(at4), value="-") == "a-bcd-e-fghi-jklm") at5 <- c(5, 1, 6, 5) # 2 insertions before position 5 replaceAt(x, at5, value=c("+", "-", "*", "/")) ## No-ops: stopifnot(replaceAt(x, NULL, value=NULL) == x) stopifnot(replaceAt(x, at2, value=extractAt(x, at2)) == x) stopifnot(replaceAt(x, at3, value=extractAt(x, at3)) == x) stopifnot(replaceAt(x, at4, value=extractAt(x, at4)) == x) stopifnot(replaceAt(x, at5, value=extractAt(x, at5)) == x) ## The order of successive transformations matters: ## T1: insert "+" before position 1 and 4 ## T2: insert "-" before position 3 ## T1 followed by T2 x2a <- replaceAt(x, c(1, 4), value="+") x3a <- replaceAt(x2a, 3, value="-") ## T2 followed by T1 x2b <- replaceAt(x, 3, value="-") x3b <- replaceAt(x2b, c(1, 4), value="+") ## T1 and T2 simultaneously: x3c <- replaceAt(x, c(1, 3, 4), value=c("+", "-", "+")) ## ==> 'x3a', 'x3b', and 'x3c' are all different! ## Append "**" to 'x3c': replaceAt(x3c, length(x3c) + 1L, value="**") ## --------------------------------------------------------------------- ## (B) ON AN XStringSet OBJECT ## --------------------------------------------------------------------- x <- BStringSet(c(seq1="ABCD", seq2="abcdefghijk", seq3="XYZ")) at5 <- IRangesList(IRanges(c(2, 1), c(3, 0)), IRanges(c(7, 2, 12, 7), c(6, 5, 11, 8)), IRanges(2, 2)) ## Set inner names on 'at5'. unlisted_at5 <- unlist(at5) names(unlisted_at5) <- paste0("rg", sprintf("\%02d", seq_along(unlisted_at5))) at5 <- relist(unlisted_at5, at5) extractAt(x, at5) # same as 'as(mapply(extractAt, x, at5), "List")' extractAt(x, at5[3]) # same as 'as(mapply(extractAt, x, at5[3]), "List")' replaceAt(x, at5, value=extractAt(x, at5)) # no-op replaceAt(x, at5) # deletions at6 <- IRangesList(IRanges(1:5, width=0), IRanges(c(6, 8, 10, 7, 2, 5), width=c(0, 2, 0, 0, 0, 0)), IRanges(c(1, 2, 1), width=c(0, 1, 0))) replaceAt(x, at6, value="-") value6 <- relist(paste0("[", seq_along(unlist(at6)), "]"), at6) replaceAt(x, at6, value=value6) replaceAt(x, at6, value=as(c("+", "-", "*"), "List")) ## Append "**" to all sequences: replaceAt(x, as(width(x) + 1L, "List"), value="**") ## --------------------------------------------------------------------- ## (C) ADVANCED EXAMPLES ## --------------------------------------------------------------------- library(hgu95av2probe) probes <- DNAStringSet(hgu95av2probe) ## Split the probes in 5-mer chunks: at <- successiveIRanges(rep(5, 5)) extractAt(probes, at) ## Replace base 13 by its complement: at <- IRanges(13, width=1) base13 <- extractAt(probes, at) base13comp <- relist(complement(unlist(base13)), base13) replaceAt(probes, at, value=base13comp) ## See ?xscat for a more efficient way to do this. ## Replace all the occurences of a given pattern with another pattern: midx <- vmatchPattern("VCGTT", probes, fixed=FALSE) matches <- extractAt(probes, midx) unlist(matches) unique(unlist(matches)) probes2 <- replaceAt(probes, midx, value="-++-") ## See strings with 2 or more susbtitutions: probes2[elementLengths(midx) >= 2] ## 2 sanity checks: stopifnot(all(replaceAt(probes, midx, value=matches) == probes)) probes2b <- gsub("[ACG]CGTT", "-++-", as.character(probes)) stopifnot(identical(as.character(probes2), probes2b)) } \keyword{methods} \keyword{manip} Biostrings/man/replaceLetterAt.Rd0000644000126300012640000001335312227063320020404 0ustar00biocbuildphs_compbio\name{replaceLetterAt} \alias{replaceLetterAt} \alias{replaceLetterAt,DNAString-method} \alias{replaceLetterAt,DNAStringSet-method} \alias{.inplaceReplaceLetterAt} \title{Replacing letters in a sequence (or set of sequences) at some specified locations} \description{ \code{replaceLetterAt} first makes a copy of a sequence (or set of sequences) and then replaces some of the original letters by new letters at the specified locations. \code{.inplaceReplaceLetterAt} is the IN PLACE version of \code{replaceLetterAt}: it will modify the original sequence in place i.e. without copying it first. Note that in place modification of a sequence is fundamentally dangerous because it alters all objects defined in your session that make reference to the modified sequence. NEVER use \code{.inplaceReplaceLetterAt}, unless you know what you are doing! } \usage{ replaceLetterAt(x, at, letter, if.not.extending="replace", verbose=FALSE) ## NEVER USE THIS FUNCTION! .inplaceReplaceLetterAt(x, at, letter) } \arguments{ \item{x}{ A \link{DNAString} or rectangular \link{DNAStringSet} object. } \item{at}{ The locations where the replacements must occur. If \code{x} is a \link{DNAString} object, then \code{at} is typically an integer vector with no NAs but a logical vector or \link[IRanges:Rle-class]{Rle} object is valid too. Locations can be repeated and in this case the last replacement to occur at a given location prevails. If \code{x} is a rectangular \link{DNAStringSet} object, then \code{at} must be a matrix of logicals with the same dimensions as \code{x}. } \item{letter}{ The new letters. If \code{x} is a \link{DNAString} object, then \code{letter} must be a \link{DNAString} object or a character vector (with no NAs) with a total number of letters (\code{sum(nchar(letter))}) equal to the number of locations specified in \code{at}. If \code{x} is a rectangular \link{DNAStringSet} object, then \code{letter} must be a \link{DNAStringSet} object or a character vector of the same length as \code{x}. In addition, the number of letters in each element of \code{letter} must match the number of locations specified in the corresponding row of \code{at} (\code{all(width(letter) == rowSums(at))}). } \item{if.not.extending}{ What to do if the new letter is not "extending" the old letter? The new letter "extends" the old letter if both are IUPAC letters and the new letter is as specific or less specific than the old one (e.g. M extends A, Y extends Y, but Y doesn't extend S). Possible values are \code{"replace"} (the default) for replacing in all cases, \code{"skip"} for not replacing when the new letter does not extend the old letter, \code{"merge"} for merging the new IUPAC letter with the old one, and \code{"error"} for raising an error. Note that the gap (\code{"-"}) and hard masking (\code{"+"}) letters are not extending or extended by any other letter. Also note that \code{"merge"} is the only value for the \code{if.not.extending} argument that guarantees the final result to be independent on the order the replacement is performed (although this is only relevant when \code{at} contains duplicated locations, otherwise the result is of course always independent on the order, whatever the value of \code{if.not.extending} is). } \item{verbose}{ When \code{TRUE}, a warning will report the number of skipped or merged letters. } } \details{ \code{.inplaceReplaceLetterAt} semantic is equivalent to calling \code{replaceLetterAt} with \code{if.not.extending="merge"} and \code{verbose=FALSE}. Never use \code{.inplaceReplaceLetterAt}! It is used by the \code{\link[BSgenome]{injectSNPs}} function in the BSgenome package, as part of the "lazy sequence loading" mechanism, for altering the original sequences of a \link[BSgenome:BSgenome-class]{BSgenome} object at "sequence-load time". This alteration consists in injecting the IUPAC ambiguity letters representing the SNPs into the just loaded sequence, which is the only time where in place modification of the external data of an \link{XString} object is safe. } \value{ A \link{DNAString} or \link{DNAStringSet} object of the same shape (i.e. length and width) as the orignal object \code{x} for \code{replaceLetterAt}. } \author{H. Pages} \seealso{ \itemize{ \item The \code{\link{replaceAt}} function for extracting or replacing arbitrary subsequences from/in a sequence or set of sequences. \item \code{\link{IUPAC_CODE_MAP}} for the mapping between IUPAC nucleotide ambiguity codes and their meaning. \item The \code{\link{chartr}} and \code{\link{injectHardMask}} functions. \item The \link{DNAString} and \link{DNAStringSet} class. \item The \code{\link[BSgenome]{injectSNPs}} function and the \link[BSgenome]{BSgenome} class in the \pkg{BSgenome} package. } } \examples{ ## Replace letters of a DNAString object: replaceLetterAt(DNAString("AAMAA"), c(5, 1, 3, 1), "TYNC") replaceLetterAt(DNAString("AAMAA"), c(5, 1, 3, 1), "TYNC", if.not.extending="merge") ## Replace letters of a DNAStringSet object (sorry for the totally ## artificial example with absolutely no biological meaning): library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) at <- matrix(c(TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE), nrow=length(probes), ncol=width(probes)[1], byrow=TRUE) letter_subject <- DNAString(paste(rep.int("-", width(probes)[1]), collapse="")) letter <- as(Views(letter_subject, start=1, end=rowSums(at)), "XStringSet") replaceLetterAt(probes, at, letter) } \keyword{utilities} \keyword{manip} Biostrings/man/reverseComplement.Rd0000644000126300012640000001252112227063320021017 0ustar00biocbuildphs_compbio\name{reverseComplement} \alias{reverse,MaskedXString-method} \alias{complement} \alias{complement,DNAString-method} \alias{complement,RNAString-method} \alias{complement,DNAStringSet-method} \alias{complement,RNAStringSet-method} \alias{complement,XStringViews-method} \alias{complement,MaskedDNAString-method} \alias{complement,MaskedRNAString-method} \alias{reverseComplement} \alias{reverseComplement,DNAString-method} \alias{reverseComplement,RNAString-method} \alias{reverseComplement,DNAStringSet-method} \alias{reverseComplement,RNAStringSet-method} \alias{reverseComplement,XStringViews-method} \alias{reverseComplement,MaskedDNAString-method} \alias{reverseComplement,MaskedRNAString-method} \title{Sequence reversing and complementing} \description{ Use these functions for reversing sequences and/or complementing DNA or RNA sequences. } \usage{ complement(x, \dots) reverseComplement(x, \dots) } \arguments{ \item{x}{ A \link{DNAString}, \link{RNAString}, \link{DNAStringSet}, \link{RNAStringSet}, \link{XStringViews} (with \link{DNAString} or \link{RNAString} subject), \link{MaskedDNAString} or \link{MaskedRNAString} object for \code{complement} and \code{reverseComplement}. } \item{\dots}{ Additional arguments to be passed to or from methods. } } \details{ See \code{?\link[IRanges]{reverse}} for reversing an \link{XString}, \link{XStringSet} or \link{XStringViews} object. If \code{x} is a \link{DNAString} or \link{RNAString} object, \code{complement(x)} returns an object where each base in \code{x} is "complemented" i.e. A, C, G, T in a \link{DNAString} object are replaced by T, G, C, A respectively and A, C, G, U in a \link{RNAString} object are replaced by U, G, C, A respectively. Letters belonging to the IUPAC Extended Genetic Alphabet are also replaced by their complement (M <-> K, R <-> Y, S <-> S, V <-> B, W <-> W, H <-> D, N <-> N) and the gap (\code{"-"}) and hard masking (\code{"+"}) letters are unchanged. \code{reverseComplement(x)} is equivalent to \code{reverse(complement(x))} but is faster and more memory efficient. } \value{ An object of the same class and length as the original object. } \seealso{ \link[IRanges]{reverse}, \link{DNAString-class}, \link{RNAString-class}, \link{DNAStringSet-class}, \link{RNAStringSet-class}, \link{XStringViews-class}, \link{MaskedXString-class}, \code{\link{chartr}}, \code{\link{findPalindromes}}, \code{\link{IUPAC_CODE_MAP}} } \examples{ ## --------------------------------------------------------------------- ## A. SOME SIMPLE EXAMPLES ## --------------------------------------------------------------------- x <- DNAString("ACGT-YN-") reverseComplement(x) library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) probes alphabetFrequency(probes, collapse=TRUE) rcprobes <- reverseComplement(probes) rcprobes alphabetFrequency(rcprobes, collapse=TRUE) ## --------------------------------------------------------------------- ## B. OBTAINING THE MISMATCH PROBES OF A CHIP ## --------------------------------------------------------------------- pm2mm <- function(probes) { probes <- DNAStringSet(probes) subseq(probes, start=13, end=13) <- complement(subseq(probes, start=13, end=13)) probes } mmprobes <- pm2mm(probes) mmprobes alphabetFrequency(mmprobes, collapse=TRUE) ## --------------------------------------------------------------------- ## C. SEARCHING THE MINUS STRAND OF A CHROMOSOME ## --------------------------------------------------------------------- ## Applying reverseComplement() to the pattern before calling ## matchPattern() is the recommended way of searching hits on the ## minus strand of a chromosome. library(BSgenome.Dmelanogaster.UCSC.dm3) chrX <- Dmelanogaster$chrX pattern <- DNAString("ACCAACNNGGTTG") matchPattern(pattern, chrX, fixed=FALSE) # 3 hits on strand + rcpattern <- reverseComplement(pattern) rcpattern m0 <- matchPattern(rcpattern, chrX, fixed=FALSE) m0 # 5 hits on strand - ## Applying reverseComplement() to the subject instead of the pattern is not ## a good idea for 2 reasons: ## (1) Chromosome sequences are generally big and sometimes very big ## so computing the reverse complement of the positive strand will ## take time and memory proportional to its length. chrXminus <- reverseComplement(chrX) # needs to allocate 22M of memory! chrXminus ## (2) Chromosome locations are generally given relatively to the positive ## strand, even for features located in the negative strand, so after ## doing this: m1 <- matchPattern(pattern, chrXminus, fixed=FALSE) ## the start/end of the matches are now relative to the negative strand. ## You need to apply reverseComplement() again on the result if you want ## them to be relative to the positive strand: m2 <- reverseComplement(m1) # allocates 22M of memory, again! ## and finally to apply rev() to sort the matches from left to right ## (5'3' direction) like in m0: m3 <- rev(m2) # same as m0, finally! ## WARNING: Before you try the example below on human chromosome 1, be aware ## that it will require the allocation of about 500Mb of memory! if (interactive()) { library(BSgenome.Hsapiens.UCSC.hg18) chr1 <- Hsapiens$chr1 matchPattern(pattern, reverseComplement(chr1)) # DON'T DO THIS! matchPattern(reverseComplement(pattern), chr1) # DO THIS INSTEAD } } \keyword{methods} \keyword{manip} Biostrings/man/stringDist.Rd0000644000126300012640000000765112227063320017462 0ustar00biocbuildphs_compbio\name{stringDist} \alias{stringDist} \alias{stringDist,character-method} \alias{stringDist,XStringSet-method} \alias{stringDist,QualityScaledXStringSet-method} \title{String Distance/Alignment Score Matrix} \description{ Computes the Levenshtein edit distance or pairwise alignment score matrix for a set of strings. } \usage{ stringDist(x, method = "levenshtein", ignoreCase = FALSE, diag = FALSE, upper = FALSE, \dots) \S4method{stringDist}{XStringSet}(x, method = "levenshtein", ignoreCase = FALSE, diag = FALSE, upper = FALSE, type = "global", quality = PhredQuality(22L), substitutionMatrix = NULL, fuzzyMatrix = NULL, gapOpening = 0, gapExtension = -1) \S4method{stringDist}{QualityScaledXStringSet}(x, method = "quality", ignoreCase = FALSE, diag = FALSE, upper = FALSE, type = "global", substitutionMatrix = NULL, fuzzyMatrix = NULL, gapOpening = 0, gapExtension = -1) } \arguments{ \item{x}{a character vector or an \code{\link{XStringSet}} object.} \item{method}{calculation method. One of \code{"levenshtein"}, \code{"hamming"}, \code{"quality"}, or \code{"substitutionMatrix"}.} \item{ignoreCase}{logical value indicating whether to ignore case during scoring.} \item{diag}{logical value indicating whether the diagonal of the matrix should be printed by \code{print.dist}.} \item{upper}{logical value indicating whether the upper triangle of the matrix should be printed by \code{print.dist}.} \item{type}{(applicable when \code{method = "quality"} or \code{method = "substitutionMatrix"}). type of alignment. One of \code{"global"}, \code{"local"}, and \code{"overlap"}, where \code{"global"} = align whole strings with end gap penalties, \code{"local"} = align string fragments, \code{"overlap"} = align whole strings without end gap penalties.} \item{quality}{(applicable when \code{method = "quality"}). object of class \code{\link{XStringQuality}} representing the quality scores for \code{x} that are used in a quality-based method for generating a substitution matrix.} \item{substitutionMatrix}{(applicable when \code{method = "substitutionMatrix"}). symmetric matrix representing the fixed substitution scores in the alignment.} \item{fuzzyMatrix}{(applicable when \code{method = "quality"}). fuzzy match matrix for quality-based alignments. It takes values between 0 and 1; where 0 is an unambiguous mismatch, 1 is an unambiguous match, and values in between represent a fraction of "matchiness".} \item{gapOpening}{(applicable when \code{method = "quality"} or \code{method = "substitutionMatrix"}). penalty for opening a gap in the alignment.} \item{gapExtension}{(applicable when \code{method = "quality"} or \code{method = "substitutionMatrix"}). penalty for extending a gap in the alignment} \item{\dots}{optional arguments to generic function to support additional methods.} } \details{ When \code{method = "hamming"}, uses the underlying \code{neditStartingAt} code to calculate the distances, where the Hamming distance is defined as the number of substitutions between two strings of equal length. Otherwise, uses the underlying \code{pairwiseAlignment} code to compute the distance/alignment score matrix. } \value{ Returns an object of class \code{"dist"}. } \author{P. Aboyoun} \seealso{ \link[stats]{dist}, \link[base]{agrep}, \link{pairwiseAlignment}, \link{substitution.matrices} } \examples{ stringDist(c("lazy", "HaZy", "crAzY")) stringDist(c("lazy", "HaZy", "crAzY"), ignoreCase = TRUE) data(phiX174Phage) plot(hclust(stringDist(phiX174Phage), method = "single")) data(srPhiX174) stringDist(srPhiX174[1:4]) stringDist(srPhiX174[1:4], method = "quality", quality = SolexaQuality(quPhiX174[1:4]), gapOpening = -10, gapExtension = -4) } \keyword{character} \keyword{multivariate} \keyword{cluster} Biostrings/man/substitution_matrices.Rd0000644000126300012640000001541712227063320021772 0ustar00biocbuildphs_compbio\name{substitution.matrices} \docType{data} \alias{substitution.matrices} \alias{BLOSUM45} \alias{BLOSUM50} \alias{BLOSUM62} \alias{BLOSUM80} \alias{BLOSUM100} \alias{PAM30} \alias{PAM40} \alias{PAM70} \alias{PAM120} \alias{PAM250} \alias{nucleotideSubstitutionMatrix} \alias{qualitySubstitutionMatrices} \alias{errorSubstitutionMatrices} \title{Scoring matrices} \description{ Predefined substitution matrices for nucleotide and amino acid alignments. } \usage{ data(BLOSUM45) data(BLOSUM50) data(BLOSUM62) data(BLOSUM80) data(BLOSUM100) data(PAM30) data(PAM40) data(PAM70) data(PAM120) data(PAM250) nucleotideSubstitutionMatrix(match = 1, mismatch = 0, baseOnly = FALSE, type = "DNA") qualitySubstitutionMatrices(fuzzyMatch = c(0, 1), alphabetLength = 4L, qualityClass = "PhredQuality", bitScale = 1) errorSubstitutionMatrices(errorProbability, fuzzyMatch = c(0, 1), alphabetLength = 4L, bitScale = 1) } \arguments{ \item{match}{the scoring for a nucleotide match.} \item{mismatch}{the scoring for a nucleotide mismatch.} \item{baseOnly}{\code{TRUE} or \code{FALSE}. If \code{TRUE}, only uses the letters in the "base" alphabet i.e. "A", "C", "G", "T".} \item{type}{either "DNA" or "RNA".} \item{fuzzyMatch}{a named or unnamed numeric vector representing the base match probability.} \item{errorProbability}{a named or unnamed numeric vector representing the error probability.} \item{alphabetLength}{an integer representing the number of letters in the underlying string alphabet. For DNA and RNA, this would be 4L. For Amino Acids, this could be 20L.} \item{qualityClass}{a character string of \code{"PhredQuality"}, \code{"SolexaQuality"}, or \code{"IlluminaQuality"}.} \item{bitScale}{a numeric value to scale the quality-based substitution matrices. By default, this is 1, representing bit-scale scoring.} } \format{ The BLOSUM and PAM matrices are square symmetric matrices with integer coefficients, whose row and column names are identical and unique: each name is a single letter representing a nucleotide or an amino acid. \code{nucleotideSubstitutionMatrix} produces a substitution matrix for all IUPAC nucleic acid codes based upon match and mismatch parameters. \code{errorSubstitutionMatrices} produces a two element list of numeric square symmetric matrices, one for matches and one for mismatches. \code{qualitySubstitutionMatrices} produces the substitution matrices for Phred or Solexa quality-based reads. } \details{ The BLOSUM and PAM matrices are not unique. For example, the definition of the widely used BLOSUM62 matrix varies depending on the source, and even a given source can provide different versions of "BLOSUM62" without keeping track of the changes over time. NCBI provides many matrices here ftp://ftp.ncbi.nih.gov/blast/matrices/ but their definitions don't match those of the matrices bundled with their stand-alone BLAST software available here ftp://ftp.ncbi.nih.gov/blast/ The BLOSUM45, BLOSUM62, BLOSUM80, PAM30 and PAM70 matrices were taken from NCBI stand-alone BLAST software. The BLOSUM50, BLOSUM100, PAM40, PAM120 and PAM250 matrices were taken from ftp://ftp.ncbi.nih.gov/blast/matrices/ The quality matrices computed in \code{qualitySubstitutionMatrices} are based on the paper by Ketil Malde. Let \eqn{\epsilon_i} be the probability of an error in the base read. For \code{"Phred"} quality measures \eqn{Q} in \eqn{[0, 99]}, these error probabilities are given by \eqn{\epsilon_i = 10^{-Q/10}}. For \code{"Solexa"} quality measures \eqn{Q} in \eqn{[-5, 99]}, they are given by \eqn{\epsilon_i = 1 - 1/(1 + 10^{-Q/10})}. Assuming independence within and between base reads, the combined error probability of a mismatch when the underlying bases do match is \eqn{\epsilon_c = \epsilon_1 + \epsilon_2 - (n/(n-1)) * \epsilon_1 * \epsilon_2}, where \eqn{n} is the number of letters in the underlying alphabet. Using \eqn{\epsilon_c}, the substitution score is given by when two bases match is given by \eqn{b * \log_2(\gamma_{x,y} * (1 - \epsilon_c) * n + (1 - \gamma_{x,y}) * \epsilon_c * (n/(n-1)))}, where \eqn{b} is the bit-scaling for the scoring and \eqn{\gamma_{x,y}} is the probability that characters \eqn{x} and \eqn{y} represents the same underlying information (e.g. using IUPAC, \eqn{\gamma_{A,A} = 1} and \eqn{\gamma_{A,N} = 1/4}. In the arguments listed above \code{fuzzyMatch} represents \eqn{\gamma_{x,y}} and \code{errorProbability} represents \eqn{\epsilon_i}. } \references{ K. Malde, The effect of sequence quality on sequence alignment, Bioinformatics, Feb 23, 2008. } \author{H. Pages and P. Aboyoun} \seealso{ \code{\link{pairwiseAlignment}}, \link{PairwiseAlignments-class}, \link{DNAString-class}, \link{AAString-class}, \link{PhredQuality-class}, \link{SolexaQuality-class}, \link{IlluminaQuality-class} } \examples{ s1 <- DNAString("ACTTCACCAGCTCCCTGGCGGTAAGTTGATCAAAGGAAACGCAAAGTTTTCAAG") s2 <- DNAString("GTTTCACTACTTCCTTTCGGGTAAGTAAATATATAAATATATAAAAATATAATTTTCATC") ## Fit a global pairwise alignment using edit distance scoring pairwiseAlignment(s1, s2, substitutionMatrix = nucleotideSubstitutionMatrix(0, -1, TRUE), gapOpening = 0, gapExtension = -1) ## Examine quality-based match and mismatch bit scores for DNA/RNA ## strings in pairwiseAlignment. ## By default patternQuality and subjectQuality are PhredQuality(22L). qualityMatrices <- qualitySubstitutionMatrices() qualityMatrices["22", "22", "1"] qualityMatrices["22", "22", "0"] pairwiseAlignment(s1, s2) ## Get the substitution scores when the error probability is 0.1 subscores <- errorSubstitutionMatrices(errorProbability = 0.1) submat <- matrix(subscores[,,"0"], 4, 4) diag(submat) <- subscores[,,"1"] dimnames(submat) <- list(DNA_ALPHABET[1:4], DNA_ALPHABET[1:4]) submat pairwiseAlignment(s1, s2, substitutionMatrix = submat) ## Align two amino acid sequences with the BLOSUM62 matrix aa1 <- AAString("HXBLVYMGCHFDCXVBEHIKQZ") aa2 <- AAString("QRNYMYCFQCISGNEYKQN") pairwiseAlignment(aa1, aa2, substitutionMatrix = "BLOSUM62", gapOpening = -3, gapExtension = -1) ## See how the gap penalty influences the alignment pairwiseAlignment(aa1, aa2, substitutionMatrix = "BLOSUM62", gapOpening = -6, gapExtension = -2) ## See how the substitution matrix influences the alignment pairwiseAlignment(aa1, aa2, substitutionMatrix = "BLOSUM50", gapOpening = -3, gapExtension = -1) if (interactive()) { ## Compare our BLOSUM62 with BLOSUM62 from ftp://ftp.ncbi.nih.gov/blast/matrices/ data(BLOSUM62) BLOSUM62["Q", "Z"] file <- "ftp://ftp.ncbi.nih.gov/blast/matrices/BLOSUM62" b62 <- as.matrix(read.table(file, check.names=FALSE)) b62["Q", "Z"] } } \keyword{utilities} \keyword{data} \keyword{datasets} Biostrings/man/toComplex.Rd0000644000126300012640000000166712227063320017303 0ustar00biocbuildphs_compbio\name{toComplex} \alias{toComplex} \alias{toComplex,DNAString-method} \title{Turning a DNA sequence into a vector of complex numbers} \description{ The \code{toComplex} utility function turns a \link{DNAString} object into a complex vector. } \usage{ toComplex(x, baseValues) } \arguments{ \item{x}{ A \link{DNAString} object. } \item{baseValues}{ A named complex vector containing the values associated to each base e.g. \code{c(A=1+0i, G=0+1i, T=-1+0i, C=0-1i)} } } \value{ A complex vector of the same length as \code{x}. } \author{H. Pages} \seealso{ \link{DNAString} } \examples{ seq <- DNAString("accacctgaccattgtcct") baseValues1 <- c(A=1+0i, G=0+1i, T=-1+0i, C=0-1i) toComplex(seq, baseValues1) ## GC content: baseValues2 <- c(A=0, C=1, G=1, T=0) sum(as.integer(toComplex(seq, baseValues2))) ## Note that there are better ways to do this (see ?alphabetFrequency) } \keyword{methods} Biostrings/man/translate.Rd0000644000126300012640000001167712227063320017330 0ustar00biocbuildphs_compbio\name{translate} \alias{transcribe} \alias{cDNA} \alias{dna2rna} \alias{rna2dna} \alias{codons} \alias{codons,DNAString-method} \alias{codons,RNAString-method} \alias{codons,MaskedDNAString-method} \alias{codons,MaskedRNAString-method} \alias{translate} \alias{translate,DNAString-method} \alias{translate,RNAString-method} \alias{translate,DNAStringSet-method} \alias{translate,RNAStringSet-method} \alias{translate,MaskedDNAString-method} \alias{translate,MaskedRNAString-method} \title{DNA/RNA transcription and translation} \description{ Functions for transcription and/or translation of DNA or RNA sequences, and related utilities. } \usage{ ## Transcription: transcribe(x) cDNA(x) ## Translation: codons(x) translate(x) ## Related utilities: dna2rna(x) rna2dna(x) } \arguments{ \item{x}{ A \link{DNAString} object for \code{transcribe} and \code{dna2rna}. An \link{RNAString} object for \code{cDNA} and \code{rna2dna}. A \link{DNAString}, \link{RNAString}, \link{MaskedDNAString} or \link{MaskedRNAString} object for \code{codons}. A \link{DNAString}, \link{RNAString}, \link{DNAStringSet}, \link{RNAStringSet}, \link{MaskedDNAString} or \link{MaskedRNAString} object for \code{translate}. } } \details{ \code{transcribe} reproduces the biological process of DNA transcription that occurs in the cell. It takes the naive approach to treat the whole sequence \code{x} as if it was a single exon. See \code{\link[GenomicFeatures]{extractTranscripts}} for a more powerful version that allows the user to extract a set of transcripts specified by the starts and ends of their exons as well as the strand from which the transcript is coming. \code{cDNA} reproduces the process of synthesizing complementary DNA from a mature mRNA template. \code{translate} reproduces the biological process of RNA translation that occurs in the cell. The input of the function can be either RNA or coding DNA. The Standard Genetic Code (see \code{?\link{GENETIC_CODE}}) is used to translate codons into amino acids. \code{codons} is a utility for extracting the codons involved in this translation without translating them. \code{dna2rna} and \code{rna2dna} are low-level utilities for converting sequences from DNA to RNA and vice-versa. All what this converstion does is to replace each occurrence of T by a U and vice-versa. } \value{ An \link{RNAString} object for \code{transcribe} and \code{dna2rna}. A \link{DNAString} object for \code{cDNA} and \code{rna2dna}. Note that if the sequence passed to \code{transcribe} or \code{cDNA} is considered to be oriented 5'-3', then the returned sequence is oriented 3'-5'. An \link{XStringViews} object with 1 view per codon for \code{codons}. When \code{x} is a \link{MaskedDNAString} or \link{MaskedRNAString} object, its masked parts are interpreted as introns and filled with the + letter in the returned object. Therefore codons that span across masked regions are represented by views that have a width > 3 and contain the + letter. Note that each view is guaranteed to contain exactly 3 base letters. An \link{AAString} object for \code{translate}. } \seealso{ \code{\link{reverseComplement}}, \code{\link{GENETIC_CODE}}, \link{DNAString-class}, \link{RNAString-class}, \link{AAString-class}, \link{XStringSet-class}, \link{XStringViews-class}, \link{MaskedXString-class} } \examples{ file <- system.file("extdata", "someORF.fa", package="Biostrings") x <- readDNAStringSet(file) x ## The first and last 1000 nucleotides are not part of the ORFs: x <- DNAStringSet(x, start=1001, end=-1001) ## Before calling translate() on an ORF, we need to mask the introns ## if any. We can get this information fron the SGD database ## (http://www.yeastgenome.org/). ## According to SGD, the 1st ORF (YAL001C) has an intron at 71..160 ## (see http://db.yeastgenome.org/cgi-bin/locus.pl?locus=YAL001C) y1 <- x[[1]] mask1 <- Mask(length(y1), start=71, end=160) masks(y1) <- mask1 y1 translate(y1) ## Codons codons(y1) which(width(codons(y1)) != 3) codons(y1)[20:28] ## Translation on the '-' strand: dna <- DNAStringSet(c("ATC", "GCTG", "CGACT")) translate(reverseComplement(dna)) ## Translate sequences on both '+' and '-' strand across all ## possible reading frames (i.e., codon position 1, 2 or 3): ## First create a DNAStringSet of '+' and '-' strand sequences, ## removing the nucleotides prior to the reading frame start position. dnaSubseq <- lapply(1:3, function(pos, dna) subseq(c(dna, reverseComplement(dna)), start=pos), dna) ## Translation of 'dnaSubseq' produces a list of length 3, each with 6 ## elements (3 '+' strand results followed by 3 '-' strand results). lapply(dnaSubseq, translate) ## translate() throws a warning when the length of the sequence is not ## divisible by 3. To avoid this warning wrap the function in ## suppressWarnings(). } \keyword{methods} \keyword{manip} Biostrings/man/trimLRPatterns.Rd0000644000126300012640000001363212227063320020256 0ustar00biocbuildphs_compbio\name{trimLRPatterns} \alias{trimLRPatterns} \alias{trimLRPatterns,XString-method} \alias{trimLRPatterns,XStringSet-method} \alias{trimLRPatterns,character-method} \title{Trim Flanking Patterns from Sequences} \description{ The \code{trimLRPatterns} function trims left and/or right flanking patterns from sequences. } \usage{ trimLRPatterns(Lpattern = "", Rpattern = "", subject, max.Lmismatch = 0, max.Rmismatch = 0, with.Lindels = FALSE, with.Rindels = FALSE, Lfixed = TRUE, Rfixed = TRUE, ranges = FALSE) } \arguments{ \item{Lpattern}{ The left pattern. } \item{Rpattern}{ The right pattern. } \item{subject}{ An \link{XString} object, \link{XStringSet} object, or character vector containing the target sequence(s). } \item{max.Lmismatch}{ Either an integer vector of length \code{nLp = nchar(Lpattern)} representing an absolute number of mismatches (or edit distance if \code{with.Lindels} is \code{TRUE}) or a single numeric value in the interval \code{[0, 1)} representing a mismatch rate when aligning terminal substrings (suffixes) of \code{Lpattern} with the beginning (prefix) of \code{subject} following the conventions set by \code{\link{neditStartingAt}}, \code{\link{isMatchingStartingAt}}, etc. When \code{max.Lmismatch} is \code{0L} or a numeric value in the interval \code{[0, 1)}, it is taken as a "rate" and is converted to \code{as.integer(1:nLp * max.Lmismatch)}, analogous to \link{agrep} (which, however, employs \code{\link{ceiling}}). Otherwise, \code{max.Lmismatch} is treated as an integer vector where negative numbers are used to prevent trimming at the \code{i}-th location. When an input integer vector is shorter than \code{nLp}, it is augmented with enough \code{-1}s at the beginning to bring its length up to \code{nLp}. Elements of \code{max.Lmismatch} beyond the first \code{nLp} are ignored. Once the integer vector is constructed using the rules given above, when \code{with.Lindels} is \code{FALSE}, \code{max.Lmismatch[i]} is the number of acceptable mismatches (errors) between the suffix \code{substring(Lpattern, nLp - i + 1, nLp)} of \code{Lpattern} and the first \code{i} letters of \code{subject}. When \code{with.Lindels} is \code{TRUE}, \code{max.Lmismatch[i]} represents the allowed "edit distance" between that suffix of \code{Lpattern} and \code{subject}, starting at position \code{1} of \code{subject} (as in \code{\link{matchPattern}} and \code{\link{isMatchingStartingAt}}). For a given element \code{s} of the \code{subject}, the initial segment (prefix) \code{substring(s, 1, j)} of \code{s} is trimmed if \code{j} is the largest \code{i} for which there is an acceptable match, if any. } \item{max.Rmismatch}{ Same as \code{max.Lmismatch} but with \code{Rpattern}, along with \code{with.Rindels} (below), and its initial segments (prefixes) \code{substring(Rpattern, 1, i)}. For a given element \code{s} of the subject, with \code{nS = nchar(s)}, the terminal segment (suffix) \code{substring(s, nS - j + 1, nS)} of \code{s} is trimmed if \code{j} is the largest \code{i} for which there is an acceptable match, if any. } \item{with.Lindels}{ If \code{TRUE}, indels are allowed in the alignments of the suffixes of \code{Lpattern} with the subject, at its beginning. See the \code{with.indels} arguments of the \code{\link{matchPattern}} and \code{\link{neditStartingAt}} functions for detailed information. } \item{with.Rindels}{ Same as \code{with.Lindels} but for alignments of the prefixes of \code{Rpattern} with the subject, at its end. See the \code{with.indels} arguments of the \code{\link{matchPattern}} and \code{\link{neditEndingAt}} functions for detailed information. } \item{Lfixed, Rfixed}{ Whether IUPAC extended letters in the left or right pattern should be interpreted as ambiguities (see \code{?`\link{lowlevel-matching}`} for the details). } \item{ranges}{ If \code{TRUE}, then return the ranges to use to trim \code{subject}. If \code{FALSE}, then returned the trimmed \code{subject}. } } \value{ A new \link{XString} object, \link{XStringSet} object, or character vector with the "longest" flanking matches removed, as described above. } \author{P. Aboyoun and H. Jaffee} \seealso{ \code{\link{matchPattern}}, \code{\link{matchLRPatterns}}, \link{lowlevel-matching}, \link{XString-class}, \link{XStringSet-class} } \examples{ Lpattern <- "TTCTGCTTG" Rpattern <- "GATCGGAAG" subject <- DNAString("TTCTGCTTGACGTGATCGGA") subjectSet <- DNAStringSet(c("TGCTTGACGGCAGATCGG", "TTCTGCTTGGATCGGAAG")) ## Only allow for perfect matches on the flanks trimLRPatterns(Lpattern = Lpattern, subject = subject) trimLRPatterns(Rpattern = Rpattern, subject = subject) trimLRPatterns(Lpattern = Lpattern, Rpattern = Rpattern, subject = subjectSet) ## Allow for perfect matches on the flanking overlaps trimLRPatterns(Lpattern = Lpattern, Rpattern = Rpattern, subject = subjectSet, max.Lmismatch = 0, max.Rmismatch = 0) ## Allow for mismatches on the flanks trimLRPatterns(Lpattern = Lpattern, Rpattern = Rpattern, subject = subject, max.Lmismatch = 0.2, max.Rmismatch = 0.2) maxMismatches <- as.integer(0.2 * 1:9) maxMismatches trimLRPatterns(Lpattern = Lpattern, Rpattern = Rpattern, subject = subjectSet, max.Lmismatch = maxMismatches, max.Rmismatch = maxMismatches) ## Produce ranges that can be an input into other functions trimLRPatterns(Lpattern = Lpattern, Rpattern = Rpattern, subject = subjectSet, max.Lmismatch = 0, max.Rmismatch = 0, ranges = TRUE) trimLRPatterns(Lpattern = Lpattern, Rpattern = Rpattern, subject = subject, max.Lmismatch = 0.2, max.Rmismatch = 0.2, ranges = TRUE) } \keyword{methods} Biostrings/man/xscat.Rd0000644000126300012640000000420212227063320016437 0ustar00biocbuildphs_compbio\name{xscat} \alias{xscat} \title{Concatenate sequences contained in XString, XStringSet and/or XStringViews objects} \description{ This function mimics the semantic of \code{paste(..., sep="")} but accepts \link{XString}, \link{XStringSet} or \link{XStringViews} arguments and returns an \link{XString} or \link{XStringSet} object. } \usage{ xscat(...) } \arguments{ \item{\dots}{ One or more character vectors (with no NAs), \link{XString}, \link{XStringSet} or \link{XStringViews} objects. } } \value{ An \link{XString} object if all the arguments are either \link{XString} objects or character strings. An \link{XStringSet} object otherwise. } \author{H. Pages} \seealso{ \link{XString-class}, \link{XStringSet-class}, \link{XStringViews-class}, \code{\link[base]{paste}} } \examples{ ## Return a BString object: xscat(BString("abc"), BString("EF")) xscat(BString("abc"), "EF") xscat("abc", "EF") ## Return a BStringSet object: xscat(BStringSet("abc"), "EF") ## Return a DNAStringSet object: xscat(c("t", "a"), DNAString("N")) ## Arguments are recycled to the length of the longest argument: res1a <- xscat("x", LETTERS, c("3", "44", "555")) res1b <- paste0("x", LETTERS, c("3", "44", "555")) stopifnot(identical(as.character(res1a), as.character(res1b))) ## Concatenating big XStringSet objects: library(drosophila2probe) probes <- DNAStringSet(drosophila2probe) mm <- complement(narrow(probes, start=13, end=13)) left <- narrow(probes, end=12) right <- narrow(probes, start=14) xscat(left, mm, right) ## Collapsing an XStringSet (or XStringViews) object with a small ## number of elements: probes1000 <- as.list(probes[1:1000]) y1 <- do.call(xscat, probes1000) y2 <- do.call(c, probes1000) # slightly faster than the above y1 == y2 # TRUE ## Note that this method won't be efficient when the number of ## elements to collapse is big (> 10000) so we need to provide a ## collapse() (or xscollapse()) function in Biostrings that will be ## efficient at doing this. Please request this on the Bioconductor ## mailing list (http://bioconductor.org/help/mailing-list/) if you ## need it. } \keyword{methods} \keyword{manip} Biostrings/man/yeastSEQCHR1.Rd0000644000126300012640000000137512227063320017441 0ustar00biocbuildphs_compbio\name{yeastSEQCHR1} \alias{yeastSEQCHR1} \title{An annotation data file for CHR1 in the yeastSEQ package} \description{ This is a single character string containing DNA sequence of yeast chromosome number 1. The data were obtained from the Saccharomyces Genome Database (\url{ftp://genome-ftp.stanford.edu/pub/yeast/data\_download/sequence/genomic\_sequence/chromosomes/fasta/}). } \details{ Annotation based on data provided by Yeast Genome project. Source data built:Yeast Genome data are built at various time intervals. Sources used were downloaded Fri Nov 21 14:00:47 2003 Package built: Fri Nov 21 14:00:47 2003 } \references{ \url{http://www.yeastgenome.org/DownloadContents.shtml} } \examples{ data(yeastSEQCHR1) nchar(yeastSEQCHR1) } \keyword{datasets} Biostrings/src/0000755000126300012640000000000012241047607015052 5ustar00biocbuildphs_compbioBiostrings/src/BAB_class.c0000644000126300012640000000361512241047607016774 0ustar00biocbuildphs_compbio/**************************************************************************** * Basic manipulation of BAB objects * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" static int debug = 0; SEXP debug_BAB_class() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } SEXP IntegerBAB_new(SEXP max_nblock) { SEXP blocks, prot, xp, classdef, ans; PROTECT(blocks = NEW_LIST(INTEGER(max_nblock)[0])); PROTECT(prot = NEW_INTEGER(2)); INTEGER(prot)[0] = 0; // nblock PROTECT(xp = R_MakeExternalPtr(NULL, blocks, prot)); PROTECT(classdef = MAKE_CLASS("IntegerBAB")); PROTECT(ans = NEW_OBJECT(classdef)); SET_SLOT(ans, mkChar("xp"), xp); UNPROTECT(5); return ans; } int *_get_BAB_nblock_ptr(SEXP x) { SEXP xp, prot; xp = GET_SLOT(x, install("xp")); prot = R_ExternalPtrProtected(xp); return INTEGER(prot); } int *_get_BAB_lastblock_nelt_ptr(SEXP x) { return _get_BAB_nblock_ptr(x) + 1; } SEXP _get_BAB_blocks(SEXP x) { SEXP xp; xp = GET_SLOT(x, install("xp")); return R_ExternalPtrTag(xp); } SEXP _IntegerBAB_addblock(SEXP x, int block_length) { SEXP xp, blocks, prot, block; int max_nblock, nblock; xp = GET_SLOT(x, install("xp")); blocks = R_ExternalPtrTag(xp); max_nblock = LENGTH(blocks); prot = R_ExternalPtrProtected(xp); nblock = INTEGER(prot)[0]; if (nblock >= max_nblock) error("_IntegerBAB_addblock(): reached max buffer size"); PROTECT(block = NEW_INTEGER(block_length)); SET_ELEMENT(blocks, nblock, block); UNPROTECT(1); nblock++; INTEGER(prot)[0] = nblock; INTEGER(prot)[1] = 0; // lastblock_nelt return block; } Biostrings/src/Biostrings.h0000644000126300012640000004500612241047607017353 0ustar00biocbuildphs_compbio#include "../inst/include/Biostrings_defines.h" #include #define DEBUG_BIOSTRINGS 1 #define INIT_STATIC_SYMBOL(NAME) \ { \ if (NAME ## _symbol == NULL) \ NAME ## _symbol = install(# NAME); \ } /* utils.c */ SEXP debug_utils(); void _init_ByteTrTable_with_lkup( ByteTrTable *byte_tr_table, SEXP lkup ); SEXP _new_lkup_from_ByteTrTable(const ByteTrTable *byte_tr_table); void _init_byte2offset_with_INTEGER( ByteTrTable *byte2offset, SEXP bytes, int error_on_dup ); void _init_byte2offset_with_cachedCharSeq( ByteTrTable *byte2offset, const cachedCharSeq *seq, const BytewiseOpTable *bytewise_match_table ); TwobitEncodingBuffer _new_TwobitEncodingBuffer( SEXP base_codes, int buflength, int endianness ); void _reset_twobit_signature(TwobitEncodingBuffer *teb); int _shift_twobit_signature( TwobitEncodingBuffer *teb, char c ); int _get_twobit_signature( TwobitEncodingBuffer *teb, const cachedCharSeq *seq ); int _get_twobit_signature_at( TwobitEncodingBuffer *teb, const cachedCharSeq *seq, const int *at, int at_length ); /* io_utils.c */ SEXP new_input_ExternalFilePtr(SEXP filepath); SEXP new_output_ExternalFilePtr(SEXP filepath, SEXP append); SEXP ExternalFilePtr_close(SEXP x); int delete_trailing_LF_or_CRLF( const char *buf, int size ); /* RoSeqs_utils.c */ SEXP debug_RoSeqs_utils(); RoSeqs _alloc_RoSeqs(int nelt); /* XString_class.c */ SEXP debug_XString_class(); const ByteTrTable *get_enc_byte2code(const char *classname); const ByteTrTable *get_dec_byte2code(const char *classname); SEXP init_DNAlkups(SEXP enc_lkup, SEXP dec_lkup); char _DNAencode(char c); char _DNAdecode(char code); SEXP init_RNAlkups(SEXP enc_lkup, SEXP dec_lkup); char _RNAencode(char c); char _RNAdecode(char code); void _copy_CHARSXP_to_cachedCharSeq( cachedCharSeq *dest, SEXP src, int start_in_src, const int *lkup, int lkup_length ); SEXP _new_CHARSXP_from_cachedCharSeq( const cachedCharSeq *x, SEXP lkup ); SEXP new_XString_from_CHARACTER( SEXP classname, SEXP x, SEXP start, SEXP width, SEXP lkup ); SEXP new_CHARACTER_from_XString( SEXP x, SEXP lkup ); /* XStringSet_class.c */ SEXP debug_XStringSet_class(); int _get_XStringSet_length(SEXP x); SEXP _get_XStringSet_width(SEXP x); const char *_get_XStringSet_xsbaseclassname(SEXP x); cachedXStringSet _cache_XStringSet(SEXP x); int _get_cachedXStringSet_length(const cachedXStringSet *cached_x); cachedCharSeq _get_cachedXStringSet_elt( const cachedXStringSet *cached_x, int i ); void _set_XStringSet_names( SEXP x, SEXP names ); SEXP new_XStringSet_from_CHARACTER( SEXP classname, SEXP element_type, SEXP x, SEXP start, SEXP width, SEXP lkup ); SEXP new_CHARACTER_from_XStringSet( SEXP x, SEXP lkup ); RoSeqs _new_RoSeqs_from_XStringSet( int nelt, SEXP x ); SEXP XStringSet_unlist(SEXP x); /* xscat.c */ SEXP XString_xscat(SEXP args); SEXP XStringSet_xscat(SEXP args); /* XStringSet_io.c */ SEXP debug_XStringSet_io(); SEXP fasta_info( SEXP efp_list, SEXP nrec, SEXP skip, SEXP use_names, SEXP lkup ); SEXP read_fasta_in_XStringSet( SEXP efp_list, SEXP nrec, SEXP skip, SEXP use_names, SEXP elementType, SEXP lkup ); SEXP write_XStringSet_to_fasta( SEXP x, SEXP efp_list, SEXP width, SEXP lkup ); SEXP fastq_geometry( SEXP efp_list, SEXP nrec, SEXP skip ); SEXP read_fastq_in_XStringSet( SEXP efp_list, SEXP nrec, SEXP skip, SEXP use_names, SEXP elementType, SEXP lkup ); SEXP write_XStringSet_to_fastq( SEXP x, SEXP efp_list, SEXP qualities, SEXP lkup ); /* letter_frequency.c */ SEXP XString_letter_frequency( SEXP x, SEXP codes, SEXP with_other ); SEXP XStringSet_letter_frequency( SEXP x, SEXP collapse, SEXP codes, SEXP with_other ); SEXP XString_letterFrequencyInSlidingView( SEXP x, SEXP view_width, SEXP single_codes, SEXP colmap, SEXP colnames ); SEXP XStringSet_letterFrequency( SEXP x, SEXP single_codes, SEXP colmap, SEXP colnames, SEXP collapse ); SEXP XString_oligo_frequency( SEXP x, SEXP width, SEXP step, SEXP as_prob, SEXP as_array, SEXP fast_moving_side, SEXP with_labels, SEXP base_codes ); SEXP XStringSet_oligo_frequency( SEXP x, SEXP width, SEXP step, SEXP as_prob, SEXP as_array, SEXP fast_moving_side, SEXP with_labels, SEXP simplify_as, SEXP base_codes ); SEXP XStringSet_nucleotide_frequency_at( SEXP x, SEXP at, SEXP as_prob, SEXP as_array, SEXP fast_moving_side, SEXP with_labels, SEXP base_codes ); SEXP XStringSet_consensus_matrix( SEXP x, SEXP shift, SEXP width, SEXP with_other, SEXP codes ); SEXP XString_two_way_letter_frequency( SEXP x, SEXP y, SEXP x_codes, SEXP y_codes, SEXP with_other ); SEXP XStringSet_two_way_letter_frequency( SEXP x, SEXP y, SEXP collapse, SEXP x_codes, SEXP y_codes, SEXP with_other ); SEXP XStringSet_two_way_letter_frequency_by_quality( SEXP x, SEXP y, SEXP x_quality, SEXP y_quality, SEXP codes, SEXP quality_codes, SEXP with_other ); /* gtestsim.c */ void gtestsim( int *nrow, int *ncol, int *nrowt, int *ncolt, int *n, int *b, double *expected, int *observed, double *fact, int *jwork, double *results ); /* translate.c */ SEXP DNAStringSet_translate( SEXP x, SEXP base_codes, SEXP lkup, SEXP skipcode ); /* replace_letter_at.c */ SEXP XString_replace_letter_at( SEXP x, SEXP at, SEXP letter, SEXP lkup, SEXP if_not_extending, SEXP verbose ); SEXP XString_inplace_replace_letter_at( SEXP x, SEXP at, SEXP letter, SEXP lkup ); /* inject_code.c */ SEXP XString_inject_code( SEXP x, SEXP start, SEXP width, SEXP code ); /* SparseList_utils.c */ SEXP debug_SparseList_utils(); SEXP _SparseList_int2symb(int symb_as_int); int _SparseList_symb2int(SEXP symbol); SEXP _get_val_from_env( SEXP symbol, SEXP env, int error_on_unbound_value ); SEXP _get_val_from_SparseList( int symb_as_int, SEXP env, int error_on_unbound_value ); int _get_int_from_SparseList( int symb_as_int, SEXP env ); void _set_env_from_IntAE( SEXP env, const IntAE *int_ae ); void _set_env_from_IntAEAE( SEXP env, const IntAEAE *int_aeae ); /* match_reporting.c */ SEXP debug_match_reporting(); int _get_match_storing_code(const char *ms_mode); MatchBuf _new_MatchBuf( int ms_code, int nPSpair ); void _MatchBuf_report_match( MatchBuf *match_buf, int PSpair_id, int start, int width ); void _MatchBuf_flush(MatchBuf *match_buf); void _MatchBuf_append_and_flush( MatchBuf *match_buf1, MatchBuf *match_buf2, int view_offset ); SEXP _MatchBuf_which_asINTEGER(const MatchBuf *match_buf); SEXP _MatchBuf_counts_asINTEGER(const MatchBuf *match_buf); SEXP _MatchBuf_starts_asLIST(const MatchBuf *match_buf); SEXP _MatchBuf_ends_asLIST(const MatchBuf *match_buf); SEXP _MatchBuf_as_MIndex(const MatchBuf *match_buf); SEXP _MatchBuf_as_SEXP( const MatchBuf *match_buf, SEXP env ); void _init_match_reporting(const char *ms_mode, int nPSpair); void _set_active_PSpair(int PSpair_id); void _set_match_shift(int shift); void _report_match(int start, int width); void _drop_reported_matches(); int _get_match_count(); SEXP _reported_matches_asSEXP(); MatchBuf *_get_internal_match_buf(); /* MIndex_class.c */ SEXP debug_MIndex_class(); cachedMIndex _cache_MIndex(SEXP x); int _get_cachedMIndex_length(const cachedMIndex *cached_x); int _get_cachedMIndex_elt_width0(const cachedMIndex *cached_x, int i); cachedIRanges _get_cachedMIndex_elt(const cachedMIndex *cached_x, int i); SEXP ByPos_MIndex_endIndex( SEXP x_high2low, SEXP x_ends, SEXP x_width0 ); SEXP SparseMIndex_endIndex( SEXP x_ends_envir, SEXP x_width0, SEXP x_names, SEXP all_names ); SEXP ByPos_MIndex_combine(SEXP ends_listlist); /* lowlevel_matching.c */ SEXP debug_lowlevel_matching(); void _init_bytewise_match_tables(); const BytewiseOpTable *_select_bytewise_match_table(int fixedP, int fixedS); int _nmismatch_at_Pshift( const cachedCharSeq *P, const cachedCharSeq *S, int Pshift, int max_nmis, const BytewiseOpTable *bytewise_match_table ); int _nedit_for_Ploffset( const cachedCharSeq *P, const cachedCharSeq *S, int Ploffset, int max_nedit, int loose_Ploffset, int *min_width, const BytewiseOpTable *bytewise_match_table ); int _nedit_for_Proffset( const cachedCharSeq *P, const cachedCharSeq *S, int Proffset, int max_nedit, int loose_Proffset, int *min_width, const BytewiseOpTable *bytewise_match_table ); SEXP XString_match_pattern_at( SEXP pattern, SEXP subject, SEXP at, SEXP at_type, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP ans_type, SEXP auto_reduce_pattern ); SEXP XStringSet_vmatch_pattern_at( SEXP pattern, SEXP subject, SEXP at, SEXP at_type, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP ans_type, SEXP auto_reduce_pattern ); SEXP XStringSet_dist_hamming(SEXP x); /* match_pattern_boyermoore.c */ SEXP debug_match_pattern_boyermoore(); int _match_pattern_boyermoore( const cachedCharSeq *P, const cachedCharSeq *S, int nfirstmatches, int walk_backward ); /* match_pattern_shiftor.c */ SEXP debug_match_pattern_shiftor(); SEXP bits_per_long(); void _match_pattern_shiftor( const cachedCharSeq *P, const cachedCharSeq *S, int max_nmis, int fixedP, int fixedS ); /* match_pattern_indels.c */ SEXP debug_match_pattern_indels(); void _match_pattern_indels( const cachedCharSeq *P, const cachedCharSeq *S, int max_nmis, int fixedP, int fixedS ); /* match_pattern.c */ SEXP debug_match_pattern(); void _match_pattern_XString( const cachedCharSeq *P, const cachedCharSeq *S, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, const char *algo ); void _match_pattern_XStringViews( const cachedCharSeq *P, const cachedCharSeq *S, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, const char *algo ); SEXP XString_match_pattern( SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP count_only ); SEXP XStringViews_match_pattern( SEXP pattern, SEXP subject, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP count_only ); SEXP XStringSet_vmatch_pattern( SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP count_only ); /* match_BOC.c */ SEXP debug_match_BOC(); SEXP match_BOC_preprocess( SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP p_length, SEXP code1, SEXP code2, SEXP code3, SEXP code4, SEXP buf1_xp, SEXP buf2_xp, SEXP buf3_xp, SEXP pre4buf_xp ); SEXP match_BOC_exact( SEXP p_xp, SEXP p_offset, SEXP p_length, SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP code1, SEXP code2, SEXP code3, SEXP code4, SEXP buf1_xp, SEXP buf2_xp, SEXP buf3_xp, SEXP pre4buf_xp, SEXP stats, SEXP count_only ); /* match_BOC2.c */ SEXP debug_match_BOC2(); SEXP match_BOC2_preprocess( SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP p_length, SEXP code1, SEXP code2, SEXP code3, SEXP code4, SEXP buf_xp ); SEXP match_BOC2_exact( SEXP p_xp, SEXP p_offset, SEXP p_length, SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP code1, SEXP code2, SEXP code3, SEXP code4, SEXP buf_xp, SEXP stats, SEXP count_only ); /* match_PWM.c */ SEXP PWM_score_starting_at( SEXP pwm, SEXP subject, SEXP starting_at, SEXP base_codes ); SEXP XString_match_PWM( SEXP pwm, SEXP subject, SEXP min_score, SEXP count_only, SEXP base_codes ); SEXP XStringViews_match_PWM( SEXP pwm, SEXP subject, SEXP views_start, SEXP views_width, SEXP min_score, SEXP count_only, SEXP base_codes ); /* find_palindromes.c */ SEXP debug_find_palindromes(); SEXP find_palindromes( SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP min_armlength, SEXP max_looplength, SEXP L2R_lkup ); /* BitMatrix.c */ void _BitCol_set_val( BitCol *bitcol, BitWord val ); BitCol _new_BitCol( int nbit, BitWord val ); int _BitCol_get_bit( const BitCol *bitcol, int i ); void _BitCol_set_bit( BitCol *bitcol, int i, int bit ); void _BitCol_A_gets_BimpliesA( BitCol *A, const BitCol *B ); BitCol _BitMatrix_get_col( const BitMatrix *bitmat, int j ); void _BitMatrix_set_col( BitMatrix *bitmat, int j, const BitCol *bitcol ); void _BitMatrix_set_val( BitMatrix *bitmat, BitWord val ); BitMatrix _new_BitMatrix( int nrow, int ncol, BitWord val ); int _BitMatrix_get_bit( const BitMatrix *bitmat, int i, int j ); void _BitMatrix_set_bit( BitMatrix *bitmat, int i, int j, int bit ); void _BitMatrix_Rrot1(BitMatrix *bitmat); void _BitMatrix_grow1rows( BitMatrix *bitmat, const BitCol *bitcol ); SEXP debug_BitMatrix(); /* PreprocessedTB_class.c */ SEXP debug_PreprocessedTB_class(); SEXP _get_PreprocessedTB_tb(SEXP x); SEXP _get_PreprocessedTB_dups(SEXP x); SEXP _get_PreprocessedTB_base_codes(SEXP x); int _get_PreprocessedTB_length(SEXP x); int _get_PreprocessedTB_width(SEXP x); SEXP _get_PreprocessedTB_low2high(SEXP x); SEXP _get_Twobit_sign2pos_tag(SEXP x); SEXP _get_ACtree2_nodebuf_ptr(SEXP x); SEXP _get_ACtree2_nodeextbuf_ptr(SEXP x); void _init_ppdups_buf(int length); void _report_ppdup( int poffset, int P_id ); SEXP _get_ppdups_buf_asINTEGER(); /* match_pdict_utils.c */ SEXP debug_match_pdict_utils(); TBMatchBuf _new_TBMatchBuf( int tb_length, int tb_width, const int *head_widths, const int *tail_widths ); void _TBMatchBuf_report_match( TBMatchBuf *buf, int PSpair_id, int end ); void _TBMatchBuf_flush(TBMatchBuf *buf); MatchPDictBuf _new_MatchPDictBuf( SEXP matches_as, int tb_length, int tb_width, const int *head_widths, const int *tail_widths ); void _MatchPDictBuf_report_match( MatchPDictBuf *buf, int PSpair_id, int tb_end ); void _MatchPDictBuf_flush(MatchPDictBuf *buf); void _MatchPDictBuf_append_and_flush( MatchBuf *buf1, MatchPDictBuf *buf2, int view_offset ); HeadTail _new_HeadTail( SEXP pdict_head, SEXP pdict_tail, SEXP pptb, SEXP max_mismatch, SEXP fixed, int with_ppheadtail ); void _match_pdict_flanks_at( int key0, SEXP low2high, HeadTail *headtail, const cachedCharSeq *S, int tb_end, int max_nmis, int min_nmis, int fixedP, MatchPDictBuf *matchpdict_buf ); void _match_pdict_all_flanks( SEXP low2high, HeadTail *headtail, const cachedCharSeq *S, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf ); /* match_pdict_Twobit.c */ SEXP debug_match_pdict_Twobit(); SEXP build_Twobit( SEXP tb, SEXP pp_exclude, SEXP base_codes ); void _match_Twobit( SEXP pptb, const cachedCharSeq *S, int fixedS, TBMatchBuf *tb_matches ); /* BAB_class.c */ SEXP debug_BAB_class(); SEXP IntegerBAB_new(SEXP max_nblock); int *_get_BAB_nblock_ptr(SEXP x); int *_get_BAB_lastblock_nelt_ptr(SEXP x); SEXP _get_BAB_blocks(SEXP x); SEXP _IntegerBAB_addblock( SEXP x, int block_length ); /* match_pdict_ACtree2.c */ SEXP debug_match_pdict_ACtree2(); SEXP ACtree2_nodebuf_max_nblock(); SEXP ACtree2_nodeextbuf_max_nblock(); SEXP ACtree2_nnodes(SEXP pptb); SEXP ACtree2_print_nodes(SEXP pptb); SEXP ACtree2_summary(SEXP pptb); SEXP ACtree2_build( SEXP tb, SEXP pp_exclude, SEXP base_codes, SEXP nodebuf_ptr, SEXP nodeextbuf_ptr ); SEXP ACtree2_has_all_flinks(SEXP pptb); SEXP ACtree2_compute_all_flinks(SEXP pptb); void _match_tbACtree2( SEXP pptb, const cachedCharSeq *S, int fixedS, TBMatchBuf *tb_matches ); void _match_pdictACtree2( SEXP pptb, HeadTail *headtail, const cachedCharSeq *S, int max_nmis, int min_nmis, int fixedP, int fixedS, MatchPDictBuf *matchpdict_buf ); /* match_pdict.c */ SEXP debug_match_pdict(); SEXP match_PDict3Parts_XString( SEXP pptb, SEXP pdict_head, SEXP pdict_tail, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP matches_as, SEXP envir ); SEXP match_XStringSet_XString( SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP matches_as, SEXP envir ); SEXP match_PDict3Parts_XStringViews( SEXP pptb, SEXP pdict_head, SEXP pdict_tail, SEXP subject, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP matches_as, SEXP envir ); SEXP match_XStringSet_XStringViews( SEXP pattern, SEXP subject, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP matches_as, SEXP envir ); SEXP vmatch_PDict3Parts_XStringSet( SEXP pptb, SEXP pdict_head, SEXP pdict_tail, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP collapse, SEXP weight, SEXP matches_as, SEXP envir ); SEXP vmatch_XStringSet_XStringSet( SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP collapse, SEXP weight, SEXP matches_as, SEXP envir ); /* align_utils.c */ SEXP PairwiseAlignments_nmatch( SEXP nchar, SEXP nmismatch, SEXP ninsertion, SEXP ndeletion ); SEXP AlignedXStringSet_nchar(SEXP alignedXStringSet); SEXP AlignedXStringSet_align_aligned( SEXP alignedXStringSet, SEXP gapCode ); SEXP PairwiseAlignmentsSingleSubject_align_aligned( SEXP alignment, SEXP gapCode, SEXP endgapCode ); SEXP align_compareStrings( SEXP patternStrings, SEXP subjectStrings, SEXP maxNChar, SEXP insertionCode, SEXP deletionCode, SEXP mismatchCode ); /* pmatchPattern.c */ SEXP lcprefix( SEXP s1_xp, SEXP s1_offset, SEXP s1_length, SEXP s2_xp, SEXP s2_offset, SEXP s2_length ); SEXP lcsuffix( SEXP s1_xp, SEXP s1_offset, SEXP s1_length, SEXP s2_xp, SEXP s2_offset, SEXP s2_length ); /* align_pairwiseAlignment.c */ SEXP XStringSet_align_pairwiseAlignment( SEXP pattern, SEXP subject, SEXP type, SEXP typeCode, SEXP scoreOnly, SEXP gapOpening, SEXP gapExtension, SEXP useQuality, SEXP substitutionArray, SEXP substitutionArrayDim, SEXP substitutionLookupTable, SEXP fuzzyMatrix, SEXP fuzzyMatrixDim, SEXP fuzzyLookupTable ); SEXP XStringSet_align_distance( SEXP string, SEXP type, SEXP typeCode, SEXP gapOpening, SEXP gapExtension, SEXP useQuality, SEXP substitutionArray, SEXP substitutionArrayDim, SEXP substitutionLookupTable, SEXP fuzzyMatrix, SEXP fuzzyMatrixDim, SEXP fuzzyLookupTable ); /* align_needwunsQS.c */ SEXP align_needwunsQS( SEXP s1, SEXP s2, SEXP mat, SEXP mat_nrow, SEXP lkup, SEXP gap_cost, SEXP gap_code ); /* strutils.c (belonged originally to old matchprobes package) */ char compbase(char c); SEXP MP_longestConsecutive(SEXP x, SEXP letter); /* matchprobes.c (belonged originally to old matchprobes package) */ SEXP MP_matchprobes(SEXP query, SEXP records, SEXP probepos); Biostrings/src/BitMatrix.c0000644000126300012640000002434012241047607017124 0ustar00biocbuildphs_compbio/**************************************************************************** * * * Routines for BitMatrix manipulation * * Author: Herve Pages * * * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include /* for Salloc() */ #include #include /* for CHAR_BIT and ULONG_MAX */ #include /* for div() */ static int debug = 0; #define BITMATBYROW_NCOL (sizeof(int) * CHAR_BIT) typedef IntAE BitMatByRow; void _BitCol_set_val(BitCol *bitcol, BitWord val) { div_t q; BitWord *bitword; int i1; q = div(bitcol->nbit, NBIT_PER_BITWORD); if (q.rem != 0) q.quot++; bitword = bitcol->bitword0; for (i1 = 0; i1 < q.quot; i1++) *(bitword++) = val; return; } BitCol _new_BitCol(int nbit, BitWord val) { BitCol bitcol; div_t q; int nword; if (nbit <= 0) error("_new_BitCol(): nbit <= 0"); q = div(nbit, NBIT_PER_BITWORD); nword = q.quot; if (q.rem != 0) nword++; bitcol.bitword0 = Salloc((long) nword, BitWord); bitcol.nword = nword; bitcol.nbit = nbit; _BitCol_set_val(&bitcol, val); return bitcol; } int _BitCol_get_bit(const BitCol *bitcol, int i) { div_t q; BitWord *bitword; q = div(i, NBIT_PER_BITWORD); bitword = bitcol->bitword0 + q.quot; return (*bitword >> q.rem) & 1UL; } void _BitCol_set_bit(BitCol *bitcol, int i, int bit) { div_t q; BitWord *bitword, mask; q = div(i, NBIT_PER_BITWORD); bitword = bitcol->bitword0 + q.quot; mask = 1UL << q.rem; if (bit) *bitword |= mask; else *bitword &= ~mask; return; } void _BitCol_A_gets_BimpliesA(BitCol *A, const BitCol *B) { div_t q; BitWord *Abitword; const BitWord *Bbitword; int i1; if (A->nbit != B->nbit) error("_BitCol_A_gets_BimpliesA(): " "'A' and 'B' are incompatible"); q = div(A->nbit, NBIT_PER_BITWORD); if (q.rem != 0) q.quot++; Abitword = A->bitword0; Bbitword = B->bitword0; for (i1 = 0; i1 < q.quot; i1++) *(Abitword++) |= ~(*(Bbitword++)); return; } /* WARNING: This is a 0-copy column extraction! */ BitCol _BitMatrix_get_col(const BitMatrix *bitmat, int j) { BitCol bitcol; bitcol.bitword0 = bitmat->bitword00 + j * bitmat->nword_per_col; bitcol.nword = bitmat->nword_per_col; bitcol.nbit = bitmat->nrow; return bitcol; } void _BitMatrix_set_col(BitMatrix *bitmat, int j, const BitCol *bitcol) { div_t q; BitWord *Lbitword; const BitWord *Rbitword; int i1; if (bitmat->nrow != bitcol->nbit) error("_BitMatrix_set_col(): " "'bitmat' and 'bitcol' are incompatible"); q = div(bitmat->nrow, NBIT_PER_BITWORD); if (q.rem != 0) q.quot++; Lbitword = bitmat->bitword00 + j * bitmat->nword_per_col; Rbitword = bitcol->bitword0; for (i1 = 0; i1 < q.quot; i1++) *(Lbitword++) = *(Rbitword++); return; } /* * _BitMatrix_set_val() could also be implemented as: * for (j = 0; j < bitmat->ncol; j++) { * bitcol = _BitMatrix_get_col(bitmat, j); * _BitCol_set_val(&bitcol, val); * } * but the implementation below is faster (only 1 call to div()). */ void _BitMatrix_set_val(BitMatrix *bitmat, BitWord val) { div_t q; int i1, j; BitWord *bitword0, *bitword; q = div(bitmat->nrow, NBIT_PER_BITWORD); if (q.rem != 0) q.quot++; for (j = 0, bitword0 = bitmat->bitword00; j < bitmat->ncol; j++, bitword0 += bitmat->nword_per_col) { bitword = bitword0; for (i1 = 0; i1 < q.quot; i1++) *(bitword++) = val; } return; } BitMatrix _new_BitMatrix(int nrow, int ncol, BitWord val) { BitMatrix bitmat; div_t q; int nword_per_col, nword; if (nrow <= 0 || ncol <= 0) error("_new_BitMatrix(): nrow <= 0 || ncol <= 0"); q = div(nrow, NBIT_PER_BITWORD); nword_per_col = q.quot; if (q.rem != 0) nword_per_col++; nword = nword_per_col * ncol; bitmat.bitword00 = Salloc((long) nword, BitWord); bitmat.nword_per_col = nword_per_col; bitmat.nrow = nrow; bitmat.ncol = ncol; _BitMatrix_set_val(&bitmat, val); return bitmat; } /* * _BitMatrix_get_bit() could also be implemented as: * bitcol = _BitMatrix_get_col(bitmat, j); * return _BitCol_get_bit(&bitcol, i); */ int _BitMatrix_get_bit(const BitMatrix *bitmat, int i, int j) { div_t q; BitWord *bitword; q = div(i, NBIT_PER_BITWORD); bitword = bitmat->bitword00 + j * bitmat->nword_per_col + q.quot; return (*bitword >> q.rem) & 1UL; } /* * _BitMatrix_set_bit() could also be implemented as: * bitcol = _BitMatrix_get_col(bitmat, j); * _BitCol_set_bit(&bitcol, i, bit); */ void _BitMatrix_set_bit(BitMatrix *bitmat, int i, int j, int bit) { div_t q; BitWord *bitword, mask; q = div(i, NBIT_PER_BITWORD); bitword = bitmat->bitword00 + j * bitmat->nword_per_col + q.quot; mask = 1UL << q.rem; if (bit) *bitword |= mask; else *bitword &= ~mask; return; } void _BitMatrix_Rrot1(BitMatrix *bitmat) { div_t q; BitWord *bitwordNE, *Lbitword, *Rbitword; int i1, j; if (bitmat->ncol == 0) error("_BitMatrix_Rrot1(): bitmat->ncol == 0"); q = div(bitmat->nrow, NBIT_PER_BITWORD); if (q.rem != 0) q.quot++; bitwordNE = bitmat->bitword00 + (bitmat->ncol - 1) * bitmat->nword_per_col; for (i1 = 0; i1 < q.quot; i1++) { Rbitword = bitwordNE + i1; Lbitword = Rbitword - bitmat->nword_per_col; for (j = 1; j < bitmat->ncol; j++) { *Rbitword = *Lbitword; Rbitword = Lbitword; Lbitword -= bitmat->nword_per_col; } *Rbitword = ULONG_MAX; } return; } void _BitMatrix_grow1rows(BitMatrix *bitmat, const BitCol *bitcol) { div_t q; BitWord *Lbitword, Rbitword, ret; int i1, j; if (bitmat->nrow != bitcol->nbit) error("_BitMatrix_grow1rows(): " "'bitmat' and 'bitcol' are incompatible"); q = div(bitmat->nrow, NBIT_PER_BITWORD); if (q.rem != 0) q.quot++; for (i1 = 0; i1 < q.quot; i1++) { Lbitword = bitmat->bitword00 + i1; Rbitword = bitcol->bitword0[i1]; for (j = 0; j < bitmat->ncol; j++) { ret = *Lbitword & Rbitword; // and *Lbitword |= Rbitword; // or Rbitword = ret; Lbitword += bitmat->nword_per_col; } } return; } /***************************************************************************** * Testing and debugging stuff */ static void BitMatrix_tr(BitMatrix *in, BitMatByRow *out) { BitWord rbit, *bitword; int i1, i2, i, j, cbit; if (in->nrow != IntAE_get_nelt(out)) error("BitMatrix_tr(): 'in' and 'out' are incompatible"); if (in->ncol >= BITMATBYROW_NCOL) error("BitMatrix_tr(): 'in' has too many columns"); for (i1 = i = 0; i1 < in->nword_per_col; i1++) { for (i2 = 0, rbit = 1UL; i2 < NBIT_PER_BITWORD; i2++, i++, rbit <<= 1) { if (i >= in->nrow) return; out->elts[i] = 0; for (j = 0, bitword = in->bitword00 + i1, cbit = 1; j < in->ncol; j++, bitword += in->nword_per_col, cbit <<= 1) { if (*bitword & rbit) out->elts[i] += cbit; } } } return; } static void BitMatrix_print(BitMatrix *bitmat) { BitMatByRow bitmat_byrow; int i, *row, j, cbit, bit; bitmat_byrow = new_IntAE(bitmat->nrow, bitmat->nrow, 0); BitMatrix_tr(bitmat, &bitmat_byrow); for (i = 0, row = bitmat_byrow.elts; i < bitmat->nrow; i++, row++) { Rprintf("%4d: ", i); for (j = 0, cbit = 1; j < bitmat->ncol; j++, cbit <<= 1) { bit = (*row & cbit) != 0; Rprintf("%d", bit); } Rprintf(" (%d)\n", *row); } return; } /* static void BitMatrix_addcol(BitMatrix *bitmat, const BitCol *bitcol) { BitWord *Lbitword, Rbitword, ret; int i1, j; if (bitmat->nrow != bitcol->nbit) error("BitMatrix_addcol(): " "'bitmat' and 'bitcol' are incompatible"); for (i1 = 0; i1 < bitmat->nword_per_col; i1++) { Lbitword = bitmat->bitword00 + i1; Rbitword = bitcol->bitword0[i1]; for (j = 0; j < bitmat->ncol; j++) { ret = *Lbitword & Rbitword; // and *Lbitword ^= Rbitword; // xor Rbitword = ret; Lbitword += bitmat->nword_per_col; } if (Rbitword) warning("integer overflow in BitMatrix_addcol()"); } return; } static void testing1(BitMatrix *bitmat, BitCol *bitcol) { int n, p; for (n = 0; n < 1000000; n++) { _BitMatrix_set_val(bitmat, 0UL); for (p = 0; p < 25; p++) BitMatrix_addcol(bitmat, bitcol); } //BitMatrix_print(&bitmat); return; } static void testing2(BitMatByRow *bitmat_byrow) { int n, p, i, *row; for (n = 0; n < 1000000; n++) { IntAE_set_val(bitmat_byrow, 0); for (i = 0, row = bitmat_byrow->elts; i < bitmat_byrow->nelt; i++) for (p = 0; p < 25; p++) (*row)++; } return; } */ SEXP debug_BitMatrix() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); if (debug) { BitMatrix bitmat0; BitCol bitcol0; //BitMatByRow bitmat_byrow0; bitmat0 = _new_BitMatrix(40, 5, 0UL); bitcol0 = _new_BitCol(40, 33UL + (1UL << 39)); BitMatrix_print(&bitmat0); _BitMatrix_set_bit(&bitmat0, 0, 0, 1); BitMatrix_print(&bitmat0); _BitMatrix_set_bit(&bitmat0, 39, 4, 1); BitMatrix_print(&bitmat0); _BitMatrix_set_bit(&bitmat0, 39, 4, 0); BitMatrix_print(&bitmat0); _BitMatrix_grow1rows(&bitmat0, &bitcol0); BitMatrix_print(&bitmat0); _BitMatrix_grow1rows(&bitmat0, &bitcol0); BitMatrix_print(&bitmat0); _BitMatrix_grow1rows(&bitmat0, &bitcol0); BitMatrix_print(&bitmat0); _BitMatrix_grow1rows(&bitmat0, &bitcol0); BitMatrix_print(&bitmat0); _BitMatrix_Rrot1(&bitmat0); BitMatrix_print(&bitmat0); _BitMatrix_Rrot1(&bitmat0); BitMatrix_print(&bitmat0); _BitMatrix_Rrot1(&bitmat0); BitMatrix_print(&bitmat0); _BitMatrix_Rrot1(&bitmat0); BitMatrix_print(&bitmat0); _BitMatrix_Rrot1(&bitmat0); BitMatrix_print(&bitmat0); /* BitMatrix_print(&bitmat0); BitMatrix_addcol(&bitmat0, &bitcol0); BitMatrix_print(&bitmat0); BitMatrix_addcol(&bitmat0, &bitcol0); BitMatrix_print(&bitmat0); BitMatrix_addcol(&bitmat0, &bitcol0); BitMatrix_print(&bitmat0); BitMatrix_addcol(&bitmat0, &bitcol0); BitMatrix_print(&bitmat0); */ /* bitmat0 = _new_BitMatrix(3000, 5, 0UL); bitcol0 = _new_BitCol(3000, 0UL); bitcol0.bitword0[0] = 33UL; bitcol0.bitword0[4] = 1UL << 43; bitmat_byrow0 = new_IntAE(3000, 3000, 0); testing1(&bitmat0, &bitcol0); //testing2(&bitmat_byrow0); */ } #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } Biostrings/src/IRanges_stubs.c0000644000126300012640000000003412241047607017763 0ustar00biocbuildphs_compbio#include "_IRanges_stubs.c" Biostrings/src/MIndex_class.c0000644000126300012640000001651012241047607017572 0ustar00biocbuildphs_compbio/**************************************************************************** * Basic manipulation of MIndex objects * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" static int debug = 0; SEXP debug_MIndex_class() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } /**************************************************************************** * C-level slot getters. * * Be careful that these functions do NOT duplicate the returned slot. * Thus they cannot be made .Call() entry points! */ static SEXP width0_symbol = NULL, NAMES_symbol = NULL, dups0_symbol = NULL, ends_symbol = NULL; static SEXP get_MIndex_width0(SEXP x) { INIT_STATIC_SYMBOL(width0) return GET_SLOT(x, width0_symbol); } static SEXP get_MIndex_names(SEXP x) { INIT_STATIC_SYMBOL(NAMES) return GET_SLOT(x, NAMES_symbol); } static SEXP get_MIndex_dups0(SEXP x) { INIT_STATIC_SYMBOL(dups0) return GET_SLOT(x, dups0_symbol); } static SEXP get_MIndex_ends(SEXP x) { INIT_STATIC_SYMBOL(ends) return GET_SLOT(x, ends_symbol); } /**************************************************************************** * C-level abstract getters. */ cachedMIndex _cache_MIndex(SEXP x) { cachedMIndex cached_x; SEXP dups0; cached_x.classname = get_classname(x); cached_x.width0 = get_MIndex_width0(x); cached_x.names = get_MIndex_names(x); cached_x.length = LENGTH(cached_x.width0); cached_x.ends = get_MIndex_ends(x); dups0 = get_MIndex_dups0(x); cached_x.dups0_high2low = get_H2LGrouping_high2low(dups0); cached_x.dups0_low2high = get_H2LGrouping_low2high(dups0); return cached_x; } int _get_cachedMIndex_length(const cachedMIndex *cached_x) { return cached_x->length; } int _get_cachedMIndex_elt_width0(const cachedMIndex *cached_x, int i) { return INTEGER(cached_x->width0)[i]; } cachedIRanges _get_cachedMIndex_elt(const cachedMIndex *cached_x, int i) { cachedIRanges cached_iranges; int low; SEXP ends_elt; if (cached_x->dups0_high2low != R_NilValue && LENGTH(cached_x->dups0_high2low) != 0 && (low = INTEGER(cached_x->dups0_high2low)[i]) != NA_INTEGER) i = low - 1; cached_iranges.classname = "IRanges"; cached_iranges.is_constant_width = 1; cached_iranges.offset = 0; cached_iranges.width = INTEGER(cached_x->width0) + i; cached_iranges.start = NULL; cached_iranges.names = R_NilValue; ends_elt = VECTOR_ELT(cached_x->ends, i); if (ends_elt == R_NilValue) { /* No need to initialize cached_iranges.end */ cached_iranges.length = 0; } else { cached_iranges.length = LENGTH(ends_elt); cached_iranges.end = INTEGER(ends_elt); } return cached_iranges; } /**************************************************************************** * Other MIndex utilities. */ /* * Does *inplace* addition of 'val' to all the elements in 'x' (INTSXP). * Never use it if 'x' is coming from the user space! */ static void add_val_to_INTEGER(SEXP x, int val) { int i, *x_elt; for (i = 0, x_elt = INTEGER(x); i < LENGTH(x); i++, x_elt++) *x_elt += val; return; } /* * --- .Call ENTRY POINT --- * If 'x_width0' is NULL => returns the endIndex (list). * Otherwise 'x_width0' must be an integer vector of same length as the * 'x_ends' list and the startIndex is returned. */ SEXP ByPos_MIndex_endIndex(SEXP x_high2low, SEXP x_ends, SEXP x_width0) { SEXP ans, ans_elt; int i, low; PROTECT(ans = duplicate(x_ends)); for (i = 0; i < LENGTH(ans); i++) { if (x_high2low != R_NilValue && LENGTH(x_high2low) != 0 && (low = INTEGER(x_high2low)[i]) != NA_INTEGER) { PROTECT(ans_elt = duplicate(VECTOR_ELT(ans, low - 1))); SET_ELEMENT(ans, i, ans_elt); UNPROTECT(1); continue; } if (x_width0 == R_NilValue) continue; ans_elt = VECTOR_ELT(ans, i); if (!IS_INTEGER(ans_elt)) // could be NULL continue; add_val_to_INTEGER(ans_elt, 1 - INTEGER(x_width0)[i]); } UNPROTECT(1); return ans; } /* * --- .Call ENTRY POINT --- * All the keys in 'x_ends_envir' must be representing integers left-padded with 0s * so they have the same length. This works properly: library(Biostrings) ends_envir <- new.env(parent=emptyenv()) ends_envir[['0000000010']] <- -2:1 ends_envir[['0000000004']] <- 9:6 .Call("SparseMIndex_endIndex", ends_envir, NULL, letters[1:10], TRUE, PACKAGE="Biostrings") .Call("SparseMIndex_endIndex", ends_envir, NULL, letters[1:10], FALSE, PACKAGE="Biostrings") * but this doesn't: ends_envir[['3']] <- 33L .Call("SparseMIndex_endIndex", ends_envir, NULL, letters[1:10], FALSE, PACKAGE="Biostrings") */ SEXP SparseMIndex_endIndex(SEXP x_ends_envir, SEXP x_width0, SEXP x_names, SEXP all_names) { SEXP ans, ans_elt, ans_names, symbols, end; int nelt, i, j; IntAE poffsets, poffsets_order; PROTECT(symbols = R_lsInternal(x_ends_envir, 1)); poffsets = new_IntAE_from_CHARACTER(symbols, -1); nelt = IntAE_get_nelt(&poffsets); if (LOGICAL(all_names)[0]) { PROTECT(ans = NEW_LIST(LENGTH(x_names))); for (i = 0; i < nelt; i++) { j = poffsets.elts[i]; end = _get_val_from_env(STRING_ELT(symbols, i), x_ends_envir, 1); PROTECT(ans_elt = duplicate(end)); if (x_width0 != R_NilValue) add_val_to_INTEGER(ans_elt, 1 - INTEGER(x_width0)[j]); SET_ELEMENT(ans, j, ans_elt); UNPROTECT(1); } SET_NAMES(ans, duplicate(x_names)); UNPROTECT(1); } else { //poffsets_order = new_IntAE(nelt, 0, 0); //get_order_of_int_array(poffsets.elts, nelt, 0, poffsets_order.elts, 0); //IntAE_set_nelt(&poffsets_order) = nelt; /* = poffsets_order.buflength */ PROTECT(ans = NEW_LIST(nelt)); PROTECT(ans_names = NEW_CHARACTER(nelt)); for (i = 0; i < nelt; i++) { //j = poffsets_order.elts[i]; j = i; end = _get_val_from_env(STRING_ELT(symbols, j), x_ends_envir, 1); PROTECT(ans_elt = duplicate(end)); if (x_width0 != R_NilValue) add_val_to_INTEGER(ans_elt, 1 - INTEGER(x_width0)[i]); SET_ELEMENT(ans, i, ans_elt); UNPROTECT(1); SET_STRING_ELT(ans_names, i, duplicate(STRING_ELT(x_names, poffsets.elts[j]))); } SET_NAMES(ans, ans_names); UNPROTECT(2); } UNPROTECT(1); return ans; } /* * --- .Call ENTRY POINT --- */ SEXP ByPos_MIndex_combine(SEXP ends_listlist) { int NTB, ans_length, i, j; SEXP ans, ans_elt, ends; IntAE ends_buf; NTB = LENGTH(ends_listlist); if (NTB == 0) error("nothing to combine"); ans_length = LENGTH(VECTOR_ELT(ends_listlist, 0)); for (j = 1; j < NTB; j++) if (LENGTH(VECTOR_ELT(ends_listlist, j)) != ans_length) error("cannot combine MIndex objects of different lengths"); ends_buf = new_IntAE(0, 0, 0); PROTECT(ans = NEW_LIST(ans_length)); for (i = 0; i < ans_length; i++) { IntAE_set_nelt(&ends_buf, 0); for (j = 0; j < NTB; j++) { ends = VECTOR_ELT(VECTOR_ELT(ends_listlist, j), i); if (ends == R_NilValue) continue; IntAE_append(&ends_buf, INTEGER(ends), LENGTH(ends)); } if (IntAE_get_nelt(&ends_buf) == 0) continue; IntAE_qsort(&ends_buf, 0); IntAE_delete_adjdups(&ends_buf); PROTECT(ans_elt = new_INTEGER_from_IntAE(&ends_buf)); SET_ELEMENT(ans, i, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } Biostrings/src/PreprocessedTB_class.c0000644000126300012640000000627712241047607021303 0ustar00biocbuildphs_compbio/**************************************************************************** * Basic manipulation of PreprocessedTB objects * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static int debug = 0; SEXP debug_PreprocessedTB_class() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } /**************************************************************************** * C-level slot getters for PreprocessedTB objects. * * Be careful that these functions do NOT duplicate the returned slot. * Thus they cannot be made .Call() entry points! */ static SEXP tb_symbol = NULL, dups_symbol = NULL, base_codes_symbol = NULL; SEXP _get_PreprocessedTB_tb(SEXP x) { INIT_STATIC_SYMBOL(tb) return GET_SLOT(x, tb_symbol); } SEXP _get_PreprocessedTB_dups(SEXP x) { INIT_STATIC_SYMBOL(dups) return GET_SLOT(x, dups_symbol); } SEXP _get_PreprocessedTB_base_codes(SEXP x) { INIT_STATIC_SYMBOL(base_codes) return GET_SLOT(x, base_codes_symbol); } /* Not strict "slot getters" but very much like. */ int _get_PreprocessedTB_length(SEXP x) { return _get_XStringSet_length(_get_PreprocessedTB_tb(x)); } int _get_PreprocessedTB_width(SEXP x) { SEXP tb; tb = _get_PreprocessedTB_tb(x); return INTEGER(_get_XStringSet_width(tb))[0]; } SEXP _get_PreprocessedTB_low2high(SEXP x) { return get_H2LGrouping_low2high(_get_PreprocessedTB_dups(x)); } /**************************************************************************** * C-level slot getters for Twobit objects. * * Be careful that these functions do NOT duplicate the returned slot. * Thus they cannot be made .Call() entry points! */ static SEXP sign2pos_symbol = NULL; static SEXP get_Twobit_sign2pos(SEXP x) { INIT_STATIC_SYMBOL(sign2pos) return GET_SLOT(x, sign2pos_symbol); } /* Not a strict "slot getter" but very much like. */ SEXP _get_Twobit_sign2pos_tag(SEXP x) { return get_XVector_tag(get_Twobit_sign2pos(x)); } /**************************************************************************** * C-level slot getters for ACtree2 objects. * * Be careful that these functions do NOT duplicate the returned slot. * Thus they cannot be made .Call() entry points! */ static SEXP nodebuf_ptr_symbol = NULL, nodeextbuf_ptr_symbol = NULL; SEXP _get_ACtree2_nodebuf_ptr(SEXP x) { INIT_STATIC_SYMBOL(nodebuf_ptr) return GET_SLOT(x, nodebuf_ptr_symbol); } SEXP _get_ACtree2_nodeextbuf_ptr(SEXP x) { INIT_STATIC_SYMBOL(nodeextbuf_ptr) return GET_SLOT(x, nodeextbuf_ptr_symbol); } /**************************************************************************** * Buffer of duplicates. */ static IntAE ppdups_buf; void _init_ppdups_buf(int length) { ppdups_buf = new_IntAE(length, length, NA_INTEGER); return; } void _report_ppdup(int poffset, int P_id) { ppdups_buf.elts[poffset] = P_id; return; } SEXP _get_ppdups_buf_asINTEGER() { return new_INTEGER_from_IntAE(&ppdups_buf); } Biostrings/src/R_init_Biostrings.c0000644000126300012640000001670412241047607020655 0ustar00biocbuildphs_compbio#include "Biostrings.h" #define CALLMETHOD_DEF(fun, numArgs) {#fun, (DL_FUNC) &fun, numArgs} #define REGISTER_CCALLABLE(fun) \ R_RegisterCCallable("Biostrings", #fun, (DL_FUNC) &fun) static R_NativePrimitiveArgType gtestsim_t[11] = { INTSXP, /* int *nrow */ INTSXP, /* int *ncol */ INTSXP, /* int *nrowt */ INTSXP, /* int *ncolt */ INTSXP, /* int *n */ INTSXP, /* int *b */ REALSXP, /* double *expected */ INTSXP, /* int *observed */ REALSXP, /* double *fact */ INTSXP, /* int *jwork */ REALSXP /* double *results */ }; static const R_CMethodDef cMethods[] = { {"gtestsim", (DL_FUNC) >estsim, 11, gtestsim_t}, {NULL, NULL, 0} }; static const R_CallMethodDef callMethods[] = { /* utils.c */ CALLMETHOD_DEF(debug_utils, 0), /* io_utils.c */ CALLMETHOD_DEF(new_input_ExternalFilePtr, 1), CALLMETHOD_DEF(new_output_ExternalFilePtr, 2), CALLMETHOD_DEF(ExternalFilePtr_close, 1), /* RoSeqs_utils.c */ CALLMETHOD_DEF(debug_RoSeqs_utils, 0), /* XString_class.c */ CALLMETHOD_DEF(debug_XString_class, 0), CALLMETHOD_DEF(init_DNAlkups, 2), CALLMETHOD_DEF(init_RNAlkups, 2), CALLMETHOD_DEF(new_XString_from_CHARACTER, 5), CALLMETHOD_DEF(new_CHARACTER_from_XString, 2), /* XStringSet_class.c */ CALLMETHOD_DEF(debug_XStringSet_class, 0), CALLMETHOD_DEF(new_XStringSet_from_CHARACTER, 6), CALLMETHOD_DEF(new_CHARACTER_from_XStringSet, 2), CALLMETHOD_DEF(XStringSet_unlist, 1), /* xscat.c */ CALLMETHOD_DEF(XString_xscat, 1), CALLMETHOD_DEF(XStringSet_xscat, 1), /* XStringSet_io.c */ CALLMETHOD_DEF(debug_XStringSet_io, 0), CALLMETHOD_DEF(fasta_info, 5), CALLMETHOD_DEF(read_fasta_in_XStringSet, 6), CALLMETHOD_DEF(write_XStringSet_to_fasta, 4), CALLMETHOD_DEF(fastq_geometry, 3), CALLMETHOD_DEF(read_fastq_in_XStringSet, 6), CALLMETHOD_DEF(write_XStringSet_to_fastq, 4), /* letter_frequency.c */ CALLMETHOD_DEF(XString_letter_frequency, 3), CALLMETHOD_DEF(XStringSet_letter_frequency, 4), CALLMETHOD_DEF(XString_letterFrequencyInSlidingView, 5), CALLMETHOD_DEF(XStringSet_letterFrequency, 5), CALLMETHOD_DEF(XString_oligo_frequency, 8), CALLMETHOD_DEF(XStringSet_oligo_frequency, 9), CALLMETHOD_DEF(XStringSet_nucleotide_frequency_at, 7), CALLMETHOD_DEF(XStringSet_consensus_matrix, 5), CALLMETHOD_DEF(XString_two_way_letter_frequency, 5), CALLMETHOD_DEF(XStringSet_two_way_letter_frequency, 6), CALLMETHOD_DEF(XStringSet_two_way_letter_frequency_by_quality, 7), /* translate.c */ CALLMETHOD_DEF(DNAStringSet_translate, 4), /* replace_letter_at.c */ CALLMETHOD_DEF(XString_replace_letter_at, 6), CALLMETHOD_DEF(XString_inplace_replace_letter_at, 4), /* inject_code.c */ CALLMETHOD_DEF(XString_inject_code, 4), /* SparseList_utils.c */ CALLMETHOD_DEF(debug_SparseList_utils, 0), /* match_reporting.c */ CALLMETHOD_DEF(debug_match_reporting, 0), /* MIndex_class.c */ CALLMETHOD_DEF(debug_MIndex_class, 0), CALLMETHOD_DEF(ByPos_MIndex_endIndex, 3), CALLMETHOD_DEF(SparseMIndex_endIndex, 4), CALLMETHOD_DEF(ByPos_MIndex_combine, 1), /* lowlevel_matching.c */ CALLMETHOD_DEF(debug_lowlevel_matching, 0), CALLMETHOD_DEF(XString_match_pattern_at, 10), CALLMETHOD_DEF(XStringSet_vmatch_pattern_at, 10), CALLMETHOD_DEF(XStringSet_dist_hamming, 1), /* match_pattern_boyermoore.c */ CALLMETHOD_DEF(debug_match_pattern_boyermoore, 0), /* match_pattern_shiftor.c */ CALLMETHOD_DEF(debug_match_pattern_shiftor, 0), CALLMETHOD_DEF(bits_per_long, 0), /* match_pattern_indels.c */ CALLMETHOD_DEF(debug_match_pattern_indels, 0), /* match_pattern.c */ CALLMETHOD_DEF(debug_match_pattern, 0), CALLMETHOD_DEF(XString_match_pattern, 8), CALLMETHOD_DEF(XStringViews_match_pattern, 10), CALLMETHOD_DEF(XStringSet_vmatch_pattern, 8), /* match_BOC.c */ CALLMETHOD_DEF(debug_match_BOC, 0), CALLMETHOD_DEF(match_BOC_preprocess, 12), CALLMETHOD_DEF(match_BOC_exact, 16), /* match_BOC2.c */ CALLMETHOD_DEF(debug_match_BOC2, 0), CALLMETHOD_DEF(match_BOC2_preprocess, 9), CALLMETHOD_DEF(match_BOC2_exact, 13), /* match_PWM.c */ CALLMETHOD_DEF(PWM_score_starting_at, 4), CALLMETHOD_DEF(XString_match_PWM, 5), CALLMETHOD_DEF(XStringViews_match_PWM, 7), /* find_palindromes.c */ CALLMETHOD_DEF(debug_find_palindromes, 0), CALLMETHOD_DEF(find_palindromes, 6), /* BitMatrix.c */ CALLMETHOD_DEF(debug_BitMatrix, 0), /* PreprocessedTB_class.c */ CALLMETHOD_DEF(debug_PreprocessedTB_class, 0), /* match_pdict_utils.c */ CALLMETHOD_DEF(debug_match_pdict_utils, 0), /* match_pdict_Twobit.c */ CALLMETHOD_DEF(debug_match_pdict_Twobit, 0), CALLMETHOD_DEF(build_Twobit, 3), /* BAB_class.c */ CALLMETHOD_DEF(debug_BAB_class, 0), CALLMETHOD_DEF(IntegerBAB_new, 1), /* match_pdict_ACtree2.c */ CALLMETHOD_DEF(debug_match_pdict_ACtree2, 0), CALLMETHOD_DEF(ACtree2_nodebuf_max_nblock, 0), CALLMETHOD_DEF(ACtree2_nodeextbuf_max_nblock, 0), CALLMETHOD_DEF(ACtree2_nnodes, 1), CALLMETHOD_DEF(ACtree2_print_nodes, 1), CALLMETHOD_DEF(ACtree2_summary, 1), CALLMETHOD_DEF(ACtree2_build, 5), CALLMETHOD_DEF(ACtree2_has_all_flinks, 1), CALLMETHOD_DEF(ACtree2_compute_all_flinks, 1), /* match_pdict.c */ CALLMETHOD_DEF(debug_match_pdict, 0), CALLMETHOD_DEF(match_PDict3Parts_XString, 9), CALLMETHOD_DEF(match_XStringSet_XString, 9), CALLMETHOD_DEF(match_PDict3Parts_XStringViews, 11), CALLMETHOD_DEF(match_XStringSet_XStringViews, 11), CALLMETHOD_DEF(vmatch_PDict3Parts_XStringSet, 11), CALLMETHOD_DEF(vmatch_XStringSet_XStringSet, 11), /* align_utils.c */ CALLMETHOD_DEF(PairwiseAlignments_nmatch, 4), CALLMETHOD_DEF(AlignedXStringSet_nchar, 1), CALLMETHOD_DEF(AlignedXStringSet_align_aligned, 2), CALLMETHOD_DEF(PairwiseAlignmentsSingleSubject_align_aligned, 3), CALLMETHOD_DEF(align_compareStrings, 6), /* pmatchPattern.c */ CALLMETHOD_DEF(lcprefix, 6), CALLMETHOD_DEF(lcsuffix, 6), /* align_pairwiseAlignment.c */ CALLMETHOD_DEF(XStringSet_align_pairwiseAlignment, 14), CALLMETHOD_DEF(XStringSet_align_distance, 12), /* align_needwunsQS.c */ CALLMETHOD_DEF(align_needwunsQS, 7), /* strutils.c (belonged originally to old matchprobes package) */ CALLMETHOD_DEF(MP_longestConsecutive, 2), /* matchprobes.c (belonged originally to old matchprobes package) */ CALLMETHOD_DEF(MP_matchprobes, 3), {NULL, NULL, 0} }; void R_init_Biostrings(DllInfo *info) { /* Lots of code around assumes that sizeof(Rbyte) == sizeof(char) */ if (sizeof(Rbyte) != sizeof(char)) error("sizeof(Rbyte) != sizeof(char)"); _init_bytewise_match_tables(); R_registerRoutines(info, cMethods, NULL, NULL, NULL); R_registerRoutines(info, NULL, callMethods, NULL, NULL); /* XString_class.c */ REGISTER_CCALLABLE(_DNAencode); REGISTER_CCALLABLE(_DNAdecode); REGISTER_CCALLABLE(_RNAencode); REGISTER_CCALLABLE(_RNAdecode); /* XStringSet_class.c */ REGISTER_CCALLABLE(_get_XStringSet_length); REGISTER_CCALLABLE(_get_XStringSet_xsbaseclassname); REGISTER_CCALLABLE(_cache_XStringSet); REGISTER_CCALLABLE(_get_cachedXStringSet_length); REGISTER_CCALLABLE(_get_cachedXStringSet_elt); REGISTER_CCALLABLE(_set_XStringSet_names); /* match_reporting.c */ REGISTER_CCALLABLE(_init_match_reporting); REGISTER_CCALLABLE(_set_active_PSpair); REGISTER_CCALLABLE(_set_match_shift); REGISTER_CCALLABLE(_report_match); REGISTER_CCALLABLE(_drop_reported_matches); REGISTER_CCALLABLE(_get_match_count); REGISTER_CCALLABLE(_reported_matches_asSEXP); /* MIndex_class.c */ REGISTER_CCALLABLE(_cache_MIndex); REGISTER_CCALLABLE(_get_cachedMIndex_length); REGISTER_CCALLABLE(_get_cachedMIndex_elt_width0); REGISTER_CCALLABLE(_get_cachedMIndex_elt); /* match_pattern_boyermoore.c */ REGISTER_CCALLABLE(_match_pattern_boyermoore); return; } Biostrings/src/RoSeqs_utils.c0000644000126300012640000000144412241047607017655 0ustar00biocbuildphs_compbio/**************************************************************************** * RoSeqs low-level utilities * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include /* for Salloc() */ static int debug = 0; SEXP debug_RoSeqs_utils() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'RoSeqs_utils.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'RoSeqs_utils.c'\n"); #endif return R_NilValue; } RoSeqs _alloc_RoSeqs(int nelt) { RoSeqs seqs; seqs.elts = Salloc((long) nelt, cachedCharSeq); seqs.nelt = nelt; return seqs; } Biostrings/src/SparseList_utils.c0000644000126300012640000000627312241047607020537 0ustar00biocbuildphs_compbio/**************************************************************************** * Fast SparseList utilities * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" static int debug = 0; SEXP debug_SparseList_utils() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'SparseList_utils.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'SparseList_utils.c'\n"); #endif return R_NilValue; } SEXP _SparseList_int2symb(int symb_as_int) { char symbbuf[11]; snprintf(symbbuf, sizeof(symbbuf), "%010d", symb_as_int); return mkChar(symbbuf); /* UNPROTECTED! */ } int _SparseList_symb2int(SEXP symbol) { int symb_as_int; sscanf(CHAR(symbol), "%d", &symb_as_int); return symb_as_int; } /* 'symbol' must be a CHARSXP */ SEXP _get_val_from_env(SEXP symbol, SEXP env, int error_on_unbound_value) { SEXP ans; /* The following code was inspired by R's do_get() code. * Note that do_get() doesn't use PROTECT at all and so do we... */ ans = findVar(install(translateChar(symbol)), env); if (ans == R_UnboundValue) { if (error_on_unbound_value) error("Biostrings internal error in _get_val_from_env(): " "unbound value"); return R_UnboundValue; } if (TYPEOF(ans) == PROMSXP) ans = eval(ans, env); if (ans != R_NilValue && NAMED(ans) == 0) SET_NAMED(ans, 1); return ans; } SEXP _get_val_from_SparseList(int symb_as_int, SEXP env, int error_on_unbound_value) { SEXP symbol, ans; PROTECT(symbol = _SparseList_int2symb(symb_as_int)); ans = _get_val_from_env(symbol, env, error_on_unbound_value); UNPROTECT(1); return ans; } int _get_int_from_SparseList(int symb_as_int, SEXP env) { SEXP value; int val; value = _get_val_from_SparseList(symb_as_int, env, 0); if (value == R_UnboundValue) return NA_INTEGER; if (LENGTH(value) != 1) error("Biostrings internal error in _get_int_from_SparseList(): " "value is not a single integer"); val = INTEGER(value)[0]; if (val == NA_INTEGER) error("Biostrings internal error in _get_int_from_SparseList(): " "value is NA"); return val; } void _set_env_from_IntAE(SEXP env, const IntAE *int_ae) { int nelt, symb_as_int, *elt; SEXP symbol, value; nelt = IntAE_get_nelt(int_ae); for (symb_as_int = 1, elt = int_ae->elts; symb_as_int <= nelt; symb_as_int++, elt++) { if (*elt == NA_INTEGER) continue; PROTECT(symbol = _SparseList_int2symb(symb_as_int)); PROTECT(value = ScalarInteger(*elt)); defineVar(install(translateChar(symbol)), value, env); UNPROTECT(2); } return; } void _set_env_from_IntAEAE(SEXP env, const IntAEAE *int_aeae) { int nelt, symb_as_int; IntAE *elt; SEXP symbol, value; nelt = IntAEAE_get_nelt(int_aeae); for (symb_as_int = 1, elt = int_aeae->elts; symb_as_int <= nelt; symb_as_int++, elt++) { if (IntAE_get_nelt(elt) == 0) continue; PROTECT(symbol = _SparseList_int2symb(symb_as_int)); PROTECT(value = new_INTEGER_from_IntAE(elt)); defineVar(install(translateChar(symbol)), value, env); UNPROTECT(2); } return; } Biostrings/src/XStringSet_class.c0000644000126300012640000001226212241047607020460 0ustar00biocbuildphs_compbio/**************************************************************************** * Basic manipulation of XStringSet objects * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static int debug = 0; SEXP debug_XStringSet_class() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } /**************************************************************************** * C-level slot getters. * * Be careful that these functions do NOT duplicate the returned slot. * Thus they cannot be made .Call() entry points! */ /* Not strict "slot getters" but very much like. */ int _get_XStringSet_length(SEXP x) { return get_XVectorList_length(x); } SEXP _get_XStringSet_width(SEXP x) { return get_XVectorList_width(x); } const char *_get_XStringSet_xsbaseclassname(SEXP x) { return get_List_elementType(x); } /**************************************************************************** * C-level abstract getters. */ cachedXStringSet _cache_XStringSet(SEXP x) { return cache_XVectorList(x); } int _get_cachedXStringSet_length(const cachedXStringSet *cached_x) { return get_cachedXVectorList_length(cached_x); } cachedCharSeq _get_cachedXStringSet_elt(const cachedXStringSet *cached_x, int i) { return get_cachedXRawList_elt(cached_x, i); } /**************************************************************************** * C-level slot setters. * */ /* WARNING: x@ranges@NAMES is modified in-place! */ void _set_XStringSet_names(SEXP x, SEXP names) { set_XVectorList_names(x, names); return; } /**************************************************************************** * From CHARACTER to XStringSet and vice-versa. */ /* --- .Call ENTRY POINT --- */ SEXP new_XStringSet_from_CHARACTER(SEXP classname, SEXP element_type, SEXP x, SEXP start, SEXP width, SEXP lkup) { SEXP ans, x_elt; cachedXVectorList cached_ans; const int *lkup0; int ans_length, lkup_length, i; cachedCharSeq cached_ans_elt; PROTECT(ans = alloc_XRawList(CHAR(STRING_ELT(classname, 0)), CHAR(STRING_ELT(element_type, 0)), width)); cached_ans = cache_XVectorList(ans); ans_length = get_cachedXVectorList_length(&cached_ans); if (lkup == R_NilValue) { lkup0 = NULL; } else { lkup0 = INTEGER(lkup); lkup_length = LENGTH(lkup); } for (i = 0; i < ans_length; i++) { cached_ans_elt = get_cachedXRawList_elt(&cached_ans, i); x_elt = STRING_ELT(x, i); if (x_elt == NA_STRING) { UNPROTECT(1); error("input sequence %d is NA", i + 1); } _copy_CHARSXP_to_cachedCharSeq(&cached_ans_elt, x_elt, INTEGER(start)[i], lkup0, lkup_length); } UNPROTECT(1); return ans; } /* --- .Call ENTRY POINT --- */ SEXP new_CHARACTER_from_XStringSet(SEXP x, SEXP lkup) { cachedXStringSet cached_x; int x_length, i; SEXP ans, ans_elt; cachedCharSeq cached_x_elt; cached_x = cache_XVectorList(x); x_length = get_cachedXVectorList_length(&cached_x); PROTECT(ans = NEW_CHARACTER(x_length)); for (i = 0; i < x_length; i++) { cached_x_elt = get_cachedXRawList_elt(&cached_x, i); PROTECT(ans_elt = _new_CHARSXP_from_cachedCharSeq( &cached_x_elt, lkup)); SET_STRING_ELT(ans, i, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } /**************************************************************************** * Creating a set of sequences (RoSeqs struct) from an XStringSet object. */ RoSeqs _new_RoSeqs_from_XStringSet(int nelt, SEXP x) { RoSeqs seqs; cachedXStringSet cached_x; cachedCharSeq *elt1; int i; if (nelt > _get_XStringSet_length(x)) error("_new_RoSeqs_from_XStringSet(): " "'nelt' must be <= '_get_XStringSet_length(x)'"); seqs = _alloc_RoSeqs(nelt); cached_x = _cache_XStringSet(x); for (i = 0, elt1 = seqs.elts; i < nelt; i++, elt1++) *elt1 = _get_cachedXStringSet_elt(&cached_x, i); return seqs; } /**************************************************************************** * unlist(). */ /* Note that XStringSet_unlist() is VERY similar to XString_xscat(). Maybe both could be unified under a fast c() for XRaw objects. */ SEXP XStringSet_unlist(SEXP x) { SEXP ans_tag, ans; int x_length, ans_length, tag_offset, i; cachedXStringSet cached_x; cachedCharSeq xx; cached_x = _cache_XStringSet(x); x_length = _get_cachedXStringSet_length(&cached_x); /* 1st pass: determine 'ans_length' */ ans_length = 0; for (i = 0; i < x_length; i++) { xx = _get_cachedXStringSet_elt(&cached_x, i); ans_length += xx.length; } PROTECT(ans_tag = NEW_RAW(ans_length)); /* 2nd pass: fill 'ans' */ tag_offset = 0; for (i = 0; i < x_length; i++) { xx = _get_cachedXStringSet_elt(&cached_x, i); Ocopy_bytes_to_i1i2_with_lkup(tag_offset, tag_offset + xx.length - 1, (char *) RAW(ans_tag), LENGTH(ans_tag), xx.seq, xx.length, NULL, 0); tag_offset += xx.length; } /* Make 'ans' */ PROTECT(ans = new_XRaw_from_tag(_get_XStringSet_xsbaseclassname(x), ans_tag)); UNPROTECT(2); return ans; } Biostrings/src/XStringSet_io.c0000644000126300012640000005776212241047607020000 0ustar00biocbuildphs_compbio/**************************************************************************** * Read/write FASTA/FASTQ files * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static int debug = 0; SEXP debug_XStringSet_io() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } #define IOBUF_SIZE 20002 static char errmsg_buf[200]; /**************************************************************************** * A. FASTA FORMAT * ****************************************************************************/ /* * Even if the standard FASTA markup is made of 1-letter sympols, we want to * be able to eventually support longer sympols. */ static const char *FASTA_comment_markup = ";", *FASTA_desc_markup = ">"; /**************************************************************************** * Reading FASTA files. */ typedef struct fasta_loader { const int *lkup; int lkup_length; void (*load_desc_line)(struct fasta_loader *loader, const cachedCharSeq *desc_line); void (*load_empty_seq)(struct fasta_loader *loader); void (*load_seq_data)(struct fasta_loader *loader, const cachedCharSeq *seq_data); int nrec; void *ext; /* loader extension (optional) */ } FASTAloader; /* * The FASTAINFO loader only loads the lengths (and optionally the names) * of the sequences. */ typedef struct fastainfo_loader_ext { CharAEAE ans_names_buf; IntAE seqlengths_buf; } FASTAINFO_loaderExt; static void FASTAINFO_load_desc_line(FASTAloader *loader, const cachedCharSeq *desc_line) { FASTAINFO_loaderExt *loader_ext; CharAEAE *ans_names_buf; loader_ext = loader->ext; ans_names_buf = &(loader_ext->ans_names_buf); // This works only because desc_line->seq is nul-terminated! append_string_to_CharAEAE(ans_names_buf, desc_line->seq); return; } static void FASTAINFO_load_empty_seq(FASTAloader *loader) { FASTAINFO_loaderExt *loader_ext; IntAE *seqlengths_buf; loader_ext = loader->ext; seqlengths_buf = &(loader_ext->seqlengths_buf); IntAE_insert_at(seqlengths_buf, IntAE_get_nelt(seqlengths_buf), 0); return; } static void FASTAINFO_load_seq_data(FASTAloader *loader, const cachedCharSeq *seq_data) { FASTAINFO_loaderExt *loader_ext; IntAE *seqlengths_buf; loader_ext = loader->ext; seqlengths_buf = &(loader_ext->seqlengths_buf); seqlengths_buf->elts[IntAE_get_nelt(seqlengths_buf) - 1] += seq_data->length; return; } static FASTAINFO_loaderExt new_FASTAINFO_loaderExt() { FASTAINFO_loaderExt loader_ext; loader_ext.ans_names_buf = new_CharAEAE(0, 0); loader_ext.seqlengths_buf = new_IntAE(0, 0, 0); return loader_ext; } static FASTAloader new_FASTAINFO_loader(SEXP lkup, int load_descs, FASTAINFO_loaderExt *loader_ext) { FASTAloader loader; if (lkup == R_NilValue) { loader.lkup = NULL; } else { loader.lkup = INTEGER(lkup); loader.lkup_length = LENGTH(lkup); } loader.load_desc_line = load_descs ? &FASTAINFO_load_desc_line : NULL; loader.load_empty_seq = &FASTAINFO_load_empty_seq; loader.load_seq_data = &FASTAINFO_load_seq_data; loader.nrec = 0; loader.ext = loader_ext; return loader; } /* * The FASTA loader. */ typedef struct fasta_loader_ext { cachedXVectorList cached_ans; cachedCharSeq cached_ans_elt; } FASTA_loaderExt; static void FASTA_load_empty_seq(FASTAloader *loader) { FASTA_loaderExt *loader_ext; cachedCharSeq *cached_ans_elt; loader_ext = loader->ext; cached_ans_elt = &(loader_ext->cached_ans_elt); *cached_ans_elt = get_cachedXRawList_elt(&(loader_ext->cached_ans), loader->nrec); cached_ans_elt->length = 0; return; } static void FASTA_load_seq_data(FASTAloader *loader, const cachedCharSeq *seq_data) { FASTA_loaderExt *loader_ext; cachedCharSeq *cached_ans_elt; loader_ext = loader->ext; cached_ans_elt = &(loader_ext->cached_ans_elt); /* cached_ans_elt->seq is a const char * so we need to cast it to char * in order to write to it */ memcpy((char *) cached_ans_elt->seq + cached_ans_elt->length, seq_data->seq, seq_data->length * sizeof(char)); cached_ans_elt->length += seq_data->length; return; } static FASTA_loaderExt new_FASTA_loaderExt(SEXP ans) { FASTA_loaderExt loader_ext; loader_ext.cached_ans = cache_XVectorList(ans); return loader_ext; } static FASTAloader new_FASTA_loader(SEXP lkup, FASTA_loaderExt *loader_ext) { FASTAloader loader; if (lkup == R_NilValue) { loader.lkup = NULL; } else { loader.lkup = INTEGER(lkup); loader.lkup_length = LENGTH(lkup); } loader.load_desc_line = NULL; loader.load_empty_seq = &FASTA_load_empty_seq; loader.load_seq_data = &FASTA_load_seq_data; loader.nrec = 0; loader.ext = loader_ext; return loader; } static int translate(cachedCharSeq *seq_data, const int *lkup, int lkup_length) { char *dest; int nbinvalid, i, j, key, val; /* seq_data->seq is a const char * so we need to cast it to char * before we can write to it */ dest = (char *) seq_data->seq; nbinvalid = j = 0; for (i = 0; i < seq_data->length; i++) { key = (unsigned char) seq_data->seq[i]; if (key >= lkup_length || (val = lkup[key]) == NA_INTEGER) { nbinvalid++; continue; } dest[j++] = val; } seq_data->length = j; return nbinvalid; } /* * Ignore empty lines and lines starting with 'FASTA_comment_markup' like in * the original Pearson FASTA format. */ static const char *parse_FASTA_file(FILE *stream, int *recno, int *ninvalid, int nrec, int skip, FASTAloader *loader) { int FASTA_comment_markup_length, FASTA_desc_markup_length, lineno, previous_line_not_complete, load_record, current_line_not_complete, new_record; char buf[IOBUF_SIZE]; cachedCharSeq data; FASTA_comment_markup_length = strlen(FASTA_comment_markup); FASTA_desc_markup_length = strlen(FASTA_desc_markup); lineno = 0; previous_line_not_complete = 0; load_record = -1; while (fgets(buf, IOBUF_SIZE, stream) != NULL) { data.length = delete_trailing_LF_or_CRLF(buf, -1); data.seq = buf; // data.length >= IOBUF_SIZE should never happen current_line_not_complete = data.length >= IOBUF_SIZE - 1; if (previous_line_not_complete) goto parse_seq_data; lineno++; if (data.length == 0) continue; // we ignore empty lines if (data.length >= FASTA_comment_markup_length && strncmp(data.seq, FASTA_comment_markup, FASTA_comment_markup_length) == 0) { if (current_line_not_complete) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, " "line is too long", lineno); return errmsg_buf; } continue; // we ignore comment lines } buf[data.length] = '\0'; new_record = strncmp(data.seq, FASTA_desc_markup, FASTA_desc_markup_length) == 0; if (new_record) { if (current_line_not_complete) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, " "line is too long", lineno); return errmsg_buf; } load_record = *recno >= skip; if (load_record && nrec >= 0 && *recno >= skip + nrec) return NULL; load_record = load_record && loader != NULL; if (load_record && loader->load_desc_line != NULL) { data.seq += FASTA_desc_markup_length; data.length -= FASTA_desc_markup_length; loader->load_desc_line(loader, &data); } if (load_record && loader->load_empty_seq != NULL) loader->load_empty_seq(loader); if (load_record) loader->nrec++; (*recno)++; continue; } if (load_record == -1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "\"%s\" expected at beginning of line %d", FASTA_desc_markup, lineno); return errmsg_buf; } parse_seq_data: if (load_record && loader->load_seq_data != NULL) { if (loader->lkup != NULL) *ninvalid += translate(&data, loader->lkup, loader->lkup_length); loader->load_seq_data(loader, &data); } previous_line_not_complete = current_line_not_complete; } return NULL; } /* --- .Call ENTRY POINT --- */ SEXP fasta_info(SEXP efp_list, SEXP nrec, SEXP skip, SEXP use_names, SEXP lkup) { int nrec0, skip0, load_descs, i, recno, ninvalid; FASTAINFO_loaderExt loader_ext; FASTAloader loader; FILE *stream; SEXP ans, ans_names; const char *errmsg; nrec0 = INTEGER(nrec)[0]; skip0 = INTEGER(skip)[0]; load_descs = LOGICAL(use_names)[0]; loader_ext = new_FASTAINFO_loaderExt(); loader = new_FASTAINFO_loader(lkup, load_descs, &loader_ext); recno = 0; for (i = 0; i < LENGTH(efp_list); i++) { stream = R_ExternalPtrAddr(VECTOR_ELT(efp_list, i)); ninvalid = 0; errmsg = parse_FASTA_file(stream, &recno, &ninvalid, nrec0, skip0, &loader); if (errmsg != NULL) error("reading FASTA file %s: %s", CHAR(STRING_ELT(GET_NAMES(efp_list), i)), errmsg_buf); if (ninvalid != 0) warning("reading FASTA file %s: ignored %d " "invalid one-letter sequence codes", CHAR(STRING_ELT(GET_NAMES(efp_list), i)), ninvalid); } PROTECT(ans = new_INTEGER_from_IntAE(&(loader_ext.seqlengths_buf))); if (load_descs) { PROTECT(ans_names = new_CHARACTER_from_CharAEAE(&(loader_ext.ans_names_buf))); SET_NAMES(ans, ans_names); UNPROTECT(1); } UNPROTECT(1); return ans; } /* --- .Call ENTRY POINT --- */ SEXP read_fasta_in_XStringSet(SEXP efp_list, SEXP nrec, SEXP skip, SEXP use_names, SEXP elementType, SEXP lkup) { int nrec0, skip0, i, recno, ninvalid; SEXP ans_width, ans_names, ans; const char *element_type; char classname[40]; /* longest string should be "DNAStringSet" */ FASTA_loaderExt loader_ext; FASTAloader loader; FILE *stream; nrec0 = INTEGER(nrec)[0]; skip0 = INTEGER(skip)[0]; PROTECT(ans_width = fasta_info(efp_list, nrec, skip, use_names, lkup)); PROTECT(ans_names = GET_NAMES(ans_width)); SET_NAMES(ans_width, R_NilValue); element_type = CHAR(STRING_ELT(elementType, 0)); if (snprintf(classname, sizeof(classname), "%sSet", element_type) >= sizeof(classname)) { UNPROTECT(2); error("Biostrings internal error in " "read_fasta_in_XStringSet(): " "'classname' buffer too small"); } PROTECT(ans = alloc_XRawList(classname, element_type, ans_width)); _set_XStringSet_names(ans, ans_names); loader_ext = new_FASTA_loaderExt(ans); loader = new_FASTA_loader(lkup, &loader_ext); recno = ninvalid = 0; for (i = 0; i < LENGTH(efp_list); i++) { stream = R_ExternalPtrAddr(VECTOR_ELT(efp_list, i)); rewind(stream); parse_FASTA_file(stream, &recno, &ninvalid, nrec0, skip0, &loader); } UNPROTECT(3); return ans; } /**************************************************************************** * Writing FASTA files. */ /* --- .Call ENTRY POINT --- */ SEXP write_XStringSet_to_fasta(SEXP x, SEXP efp_list, SEXP width, SEXP lkup) { cachedXStringSet X; int x_length, width0, lkup_length, i, j1, j2, dest_nbytes; FILE *stream; const int *lkup0; SEXP x_names, desc; cachedCharSeq X_elt; char buf[IOBUF_SIZE]; X = _cache_XStringSet(x); x_length = _get_cachedXStringSet_length(&X); stream = R_ExternalPtrAddr(VECTOR_ELT(efp_list, 0)); width0 = INTEGER(width)[0]; if (width0 >= IOBUF_SIZE) error("'width' must be <= %d", IOBUF_SIZE - 1); buf[width0] = 0; if (lkup == R_NilValue) { lkup0 = NULL; lkup_length = 0; } else { lkup0 = INTEGER(lkup); lkup_length = LENGTH(lkup); } x_names = get_XVectorList_names(x); for (i = 0; i < x_length; i++) { if (fputs(FASTA_desc_markup, stream) == EOF) error("write error"); if (x_names != R_NilValue) { desc = STRING_ELT(x_names, i); if (desc == NA_STRING) error("'names(x)' contains NAs"); if (fputs(CHAR(desc), stream) == EOF) error("write error"); } if (fputs("\n", stream) == EOF) error("write error"); X_elt = _get_cachedXStringSet_elt(&X, i); for (j1 = 0; j1 < X_elt.length; j1 += width0) { j2 = j1 + width0; if (j2 > X_elt.length) j2 = X_elt.length; dest_nbytes = j2 - j1; j2--; Ocopy_bytes_from_i1i2_with_lkup(j1, j2, buf, dest_nbytes, X_elt.seq, X_elt.length, lkup0, lkup_length); buf[dest_nbytes] = 0; if (fputs(buf, stream) == EOF || fputs("\n", stream) == EOF) error("write error"); } } return R_NilValue; } /**************************************************************************** * B. FASTQ FORMAT * ****************************************************************************/ static const char *FASTQ_line1_markup = "@", *FASTQ_line3_markup = "+"; /**************************************************************************** * Reading FASTQ files. */ typedef struct fastq_loader { void (*load_seqid)(struct fastq_loader *loader, const cachedCharSeq *seqid); void (*load_seq)(struct fastq_loader *loader, const cachedCharSeq *seq); void (*load_qualid)(struct fastq_loader *loader, const cachedCharSeq *qualid); void (*load_qual)(struct fastq_loader *loader, const cachedCharSeq *qual); int nrec; void *ext; /* loader extension (optional) */ } FASTQloader; /* * The FASTQGEOM loader keeps only the common width of the sequences * (NA if the set of sequences is not rectangular). */ typedef struct fastqgeom_loader_ext { int width; } FASTQGEOM_loaderExt; static void FASTQGEOM_load_seq(FASTQloader *loader, const cachedCharSeq *seq) { FASTQGEOM_loaderExt *loader_ext; loader_ext = loader->ext; if (loader->nrec == 0) { loader_ext->width = seq->length; return; } if (loader_ext->width == NA_INTEGER || seq->length == loader_ext->width) return; loader_ext->width = NA_INTEGER; return; } static FASTQGEOM_loaderExt new_FASTQGEOM_loaderExt() { FASTQGEOM_loaderExt loader_ext; loader_ext.width = NA_INTEGER; return loader_ext; } static FASTQloader new_FASTQGEOM_loader(FASTQGEOM_loaderExt *loader_ext) { FASTQloader loader; loader.load_seqid = NULL; loader.load_seq = FASTQGEOM_load_seq; loader.load_qualid = NULL; loader.load_qual = NULL; loader.nrec = 0; loader.ext = loader_ext; return loader; } /* * The FASTQ loader. */ typedef struct fastq_loader_ext { CharAEAE ans_names_buf; cachedXVectorList cached_ans; const int *lkup; int lkup_length; } FASTQ_loaderExt; static void FASTQ_load_seqid(FASTQloader *loader, const cachedCharSeq *seqid) { FASTQ_loaderExt *loader_ext; CharAEAE *ans_names_buf; loader_ext = loader->ext; ans_names_buf = &(loader_ext->ans_names_buf); // This works only because seqid->seq is nul-terminated! append_string_to_CharAEAE(ans_names_buf, seqid->seq); return; } static void FASTQ_load_seq(FASTQloader *loader, const cachedCharSeq *seq) { FASTQ_loaderExt *loader_ext; cachedCharSeq cached_ans_elt; loader_ext = loader->ext; cached_ans_elt = get_cachedXRawList_elt(&(loader_ext->cached_ans), loader->nrec); /* cached_ans_elt.seq 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, cached_ans_elt.length - 1, (char *) cached_ans_elt.seq, cached_ans_elt.length, seq->seq, seq->length, loader_ext->lkup, loader_ext->lkup_length); return; } static FASTQ_loaderExt new_FASTQ_loaderExt(SEXP ans, SEXP lkup) { FASTQ_loaderExt loader_ext; loader_ext.ans_names_buf = new_CharAEAE(_get_XStringSet_length(ans), 0); loader_ext.cached_ans = cache_XVectorList(ans); if (lkup == R_NilValue) { loader_ext.lkup = NULL; } else { loader_ext.lkup = INTEGER(lkup); loader_ext.lkup_length = LENGTH(lkup); } return loader_ext; } static FASTQloader new_FASTQ_loader(int load_seqids, FASTQ_loaderExt *loader_ext) { FASTQloader loader; loader.load_seqid = load_seqids ? &FASTQ_load_seqid : NULL; loader.load_seq = FASTQ_load_seq; loader.load_qualid = NULL; loader.load_qual = NULL; loader.nrec = 0; loader.ext = loader_ext; return loader; } /* * Ignore empty lines. */ static const char *parse_FASTQ_file(FILE *stream, int *recno, int nrec, int skip, FASTQloader *loader) { int FASTQ_line1_markup_length, FASTQ_line3_markup_length, lineno, lineinrecno, load_record; char buf[IOBUF_SIZE]; cachedCharSeq data; FASTQ_line1_markup_length = strlen(FASTQ_line1_markup); FASTQ_line3_markup_length = strlen(FASTQ_line3_markup); lineno = lineinrecno = 0; while (fgets(buf, IOBUF_SIZE, stream) != NULL) { lineno++; data.length = delete_trailing_LF_or_CRLF(buf, -1); // data.length >= IOBUF_SIZE should never happen if (data.length >= IOBUF_SIZE - 1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, line is too long", lineno); return errmsg_buf; } if (data.length == 0) continue; // we ignore empty lines buf[data.length] = '\0'; data.seq = buf; lineinrecno++; if (lineinrecno > 4) lineinrecno = 1; switch (lineinrecno) { case 1: if (strncmp(buf, FASTQ_line1_markup, FASTQ_line1_markup_length) != 0) { snprintf(errmsg_buf, sizeof(errmsg_buf), "\"%s\" expected at beginning of line %d", FASTQ_line1_markup, lineno); return errmsg_buf; } load_record = *recno >= skip; if (load_record && nrec >= 0 && *recno >= skip + nrec) return NULL; load_record = load_record && loader != NULL; if (load_record && nrec >= 0) load_record = *recno < skip + nrec; if (load_record && loader->load_seqid != NULL) { data.seq += FASTQ_line1_markup_length; data.length -= FASTQ_line1_markup_length; loader->load_seqid(loader, &data); } break; case 2: if (load_record && loader->load_seq != NULL) loader->load_seq(loader, &data); break; case 3: if (strncmp(buf, FASTQ_line3_markup, FASTQ_line3_markup_length) != 0) { snprintf(errmsg_buf, sizeof(errmsg_buf), "\"%s\" expected at beginning of " "line %d", FASTQ_line3_markup, lineno); return errmsg_buf; } if (load_record && loader->load_qualid != NULL) { data.seq += FASTQ_line3_markup_length; data.length -= FASTQ_line3_markup_length; loader->load_qualid(loader, &data); } break; case 4: if (load_record && loader->load_qual != NULL) loader->load_qual(loader, &data); if (load_record) loader->nrec++; (*recno)++; break; } } return NULL; } /* --- .Call ENTRY POINT --- */ SEXP fastq_geometry(SEXP efp_list, SEXP nrec, SEXP skip) { int nrec0, skip0, i, recno; FASTQGEOM_loaderExt loader_ext; FASTQloader loader; FILE *stream; const char *errmsg; SEXP ans; nrec0 = INTEGER(nrec)[0]; skip0 = INTEGER(skip)[0]; loader_ext = new_FASTQGEOM_loaderExt(); loader = new_FASTQGEOM_loader(&loader_ext); recno = 0; for (i = 0; i < LENGTH(efp_list); i++) { stream = R_ExternalPtrAddr(VECTOR_ELT(efp_list, i)); errmsg = parse_FASTQ_file(stream, &recno, nrec0, skip0, &loader); if (errmsg != NULL) error("reading FASTQ file %s: %s", CHAR(STRING_ELT(GET_NAMES(efp_list), i)), errmsg_buf); } PROTECT(ans = NEW_INTEGER(2)); INTEGER(ans)[0] = loader.nrec; INTEGER(ans)[1] = loader_ext.width; UNPROTECT(1); return ans; } /* --- .Call ENTRY POINT --- */ SEXP read_fastq_in_XStringSet(SEXP efp_list, SEXP nrec, SEXP skip, SEXP use_names, SEXP elementType, SEXP lkup) { int nrec0, skip0, load_seqids, ans_length, i, recno; SEXP ans_geom, ans_width, ans, ans_names; const char *element_type; char classname[40]; /* longest string should be "DNAStringSet" */ FASTQ_loaderExt loader_ext; FASTQloader loader; FILE *stream; nrec0 = INTEGER(nrec)[0]; skip0 = INTEGER(skip)[0]; load_seqids = LOGICAL(use_names)[0]; PROTECT(ans_geom = fastq_geometry(efp_list, nrec, skip)); ans_length = INTEGER(ans_geom)[0]; PROTECT(ans_width = NEW_INTEGER(ans_length)); if (ans_length != 0) { if (INTEGER(ans_geom)[1] == NA_INTEGER) { UNPROTECT(2); error("read_fastq_in_XStringSet(): FASTQ files with " "variable sequence lengths are not supported yet"); } for (recno = 0; recno < ans_length; recno++) INTEGER(ans_width)[recno] = INTEGER(ans_geom)[1]; } element_type = CHAR(STRING_ELT(elementType, 0)); if (snprintf(classname, sizeof(classname), "%sSet", element_type) >= sizeof(classname)) { UNPROTECT(2); error("Biostrings internal error in " "read_fastq_in_XStringSet(): " "'classname' buffer too small"); } PROTECT(ans = alloc_XRawList(classname, element_type, ans_width)); loader_ext = new_FASTQ_loaderExt(ans, lkup); loader = new_FASTQ_loader(load_seqids, &loader_ext); recno = 0; for (i = 0; i < LENGTH(efp_list); i++) { stream = R_ExternalPtrAddr(VECTOR_ELT(efp_list, i)); rewind(stream); parse_FASTQ_file(stream, &recno, nrec0, skip0, &loader); } if (load_seqids) { PROTECT(ans_names = new_CHARACTER_from_CharAEAE(&(loader_ext.ans_names_buf))); _set_XStringSet_names(ans, ans_names); UNPROTECT(1); } UNPROTECT(3); return ans; } /**************************************************************************** * Writing FASTQ files. */ static const char *get_FASTQ_rec_id(SEXP x_names, SEXP q_names, int i) { SEXP seqid, qualid; seqid = NA_STRING; if (x_names != R_NilValue) { seqid = STRING_ELT(x_names, i); if (seqid == NA_STRING) error("'names(x)' contains NAs"); } if (q_names != R_NilValue) { qualid = STRING_ELT(q_names, i); if (qualid == NA_STRING) error("'names(qualities)' contains NAs"); if (seqid == NA_STRING) seqid = qualid; /* Comparing the *content* of 2 CHARSXP's with 'qualid != seqid' only works because of the global CHARSXP cache. Otherwise we would need to do: LENGTH(qualid) != LENGTH(seqid) || memcmp(CHAR(qualid), CHAR(seqid), LENGTH(seqid)) */ else if (qualid != seqid) error("when 'x' and 'qualities' both have " "names, they must be identical"); } if (seqid == NA_STRING) error("either 'x' or 'qualities' must have names"); return CHAR(seqid); } static int write_FASTQ_id(FILE *stream, const char *markup, const char *id) { return fputs(markup, stream) == EOF || fputs(id, stream) == EOF || fputs("\n", stream) == EOF; } static int write_FASTQ_seq(FILE *stream, const char *buf) { return fputs(buf, stream) == EOF || fputs("\n", stream) == EOF; } static int write_FASTQ_qual(FILE *stream, int seqlen, const cachedXStringSet *Q, int i) { cachedCharSeq Q_elt; int j; Q_elt = _get_cachedXStringSet_elt(Q, i); if (Q_elt.length != seqlen) error("'x' and 'quality' must have the same width"); for (j = 0; j < seqlen; j++) { if (fputc((int) *(Q_elt.seq++), stream) == EOF) return 1; } return fputs("\n", stream) == EOF; } static int write_FASTQ_fakequal(FILE *stream, int seqlen) { int j; for (j = 0; j < seqlen; j++) { if (fputc((int) ';', stream) == EOF) return 1; } return fputs("\n", stream) == EOF; } /* --- .Call ENTRY POINT --- */ SEXP write_XStringSet_to_fastq(SEXP x, SEXP efp_list, SEXP qualities, SEXP lkup) { cachedXStringSet X, Q; int x_length, lkup_length, i; FILE *stream; const int *lkup0; SEXP x_names, q_names; const char *id; cachedCharSeq X_elt; char buf[IOBUF_SIZE]; X = _cache_XStringSet(x); x_length = _get_cachedXStringSet_length(&X); if (qualities != R_NilValue) { Q = _cache_XStringSet(qualities); if (_get_cachedXStringSet_length(&Q) != x_length) error("'x' and 'qualities' must have the same length"); q_names = get_XVectorList_names(qualities); } else { q_names = R_NilValue; } stream = R_ExternalPtrAddr(VECTOR_ELT(efp_list, 0)); if (lkup == R_NilValue) { lkup0 = NULL; lkup_length = 0; } else { lkup0 = INTEGER(lkup); lkup_length = LENGTH(lkup); } x_names = get_XVectorList_names(x); for (i = 0; i < x_length; i++) { id = get_FASTQ_rec_id(x_names, q_names, i); X_elt = _get_cachedXStringSet_elt(&X, i); Ocopy_bytes_from_i1i2_with_lkup(0, X_elt.length - 1, buf, X_elt.length, X_elt.seq, X_elt.length, lkup0, lkup_length); buf[X_elt.length] = 0; if (write_FASTQ_id(stream, FASTQ_line1_markup, id) || write_FASTQ_seq(stream, buf) || write_FASTQ_id(stream, FASTQ_line3_markup, id)) error("write error"); if (qualities != R_NilValue) { if (write_FASTQ_qual(stream, X_elt.length, &Q, i)) error("write error"); } else { if (write_FASTQ_fakequal(stream, X_elt.length)) error("write error"); } } return R_NilValue; } Biostrings/src/XString_class.c0000644000126300012640000001213312241047607020001 0ustar00biocbuildphs_compbio/**************************************************************************** * Basic manipulation of XString objects * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" #include /* for realloc() */ static int debug = 0; SEXP debug_XString_class() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } /**************************************************************************** * Encoding/decoding XString data. */ static ByteTrTable DNA_enc_byte2code, DNA_dec_byte2code, RNA_enc_byte2code, RNA_dec_byte2code; const ByteTrTable *get_enc_byte2code(const char *classname) { if (strcmp(classname, "DNAString") == 0) return (const ByteTrTable *) &DNA_enc_byte2code; else if (strcmp(classname, "RNAString") == 0) return (const ByteTrTable *) &RNA_enc_byte2code; return NULL; } const ByteTrTable *get_dec_byte2code(const char *classname) { if (strcmp(classname, "DNAString") == 0) return (const ByteTrTable *) &DNA_dec_byte2code; else if (strcmp(classname, "RNAString") == 0) return (const ByteTrTable *) &RNA_dec_byte2code; return NULL; } /* --- .Call ENTRY POINT --- */ SEXP init_DNAlkups(SEXP enc_lkup, SEXP dec_lkup) { _init_ByteTrTable_with_lkup(&DNA_enc_byte2code, enc_lkup); _init_ByteTrTable_with_lkup(&DNA_dec_byte2code, dec_lkup); return R_NilValue; } char _DNAencode(char c) { int code; code = DNA_enc_byte2code.byte2code[(unsigned char) c]; if (code == NA_INTEGER) error("_DNAencode(): key %d not in lookup table", (int) c); return code; } char _DNAdecode(char code) { int c; c = DNA_dec_byte2code.byte2code[(unsigned char) code]; if (c == NA_INTEGER) error("_DNAdecode(): key %d not in lookup table", (int) code); return c; } /* --- .Call ENTRY POINT --- */ SEXP init_RNAlkups(SEXP enc_lkup, SEXP dec_lkup) { _init_ByteTrTable_with_lkup(&RNA_enc_byte2code, enc_lkup); _init_ByteTrTable_with_lkup(&RNA_dec_byte2code, dec_lkup); return R_NilValue; } char _RNAencode(char c) { int code; code = RNA_enc_byte2code.byte2code[(unsigned char) c]; if (code == NA_INTEGER) error("_RNAencode(): key %d not in lookup table", (int) c); return code; } char _RNAdecode(char code) { int c; c = RNA_dec_byte2code.byte2code[(unsigned char) code]; if (c == NA_INTEGER) error("_RNAdecode(): key %d not in lookup table", (int) code); return (char) c; } /**************************************************************************** * From CHARACTER to XString and vice-versa. */ void _copy_CHARSXP_to_cachedCharSeq(cachedCharSeq *dest, SEXP src, int start_in_src, const int *lkup, int lkup_length) { int i1, i2; i1 = start_in_src - 1; i2 = i1 + dest->length - 1; /* dest.seq is a const char * so we need to cast it to char * before we can write to it */ Ocopy_bytes_from_i1i2_with_lkup(i1, i2, (char *) dest->seq, dest->length, CHAR(src), LENGTH(src), lkup, lkup_length); return; } SEXP _new_CHARSXP_from_cachedCharSeq(const cachedCharSeq *x, SEXP lkup) { // IMPORTANT: We use user-controlled memory for this private memory // pool so it is persistent between calls to .Call(). // It will last until the end of the R session and can only grow // during the session. It is NOT a memory leak! static int buflength = 0; static char *buf = NULL; int new_buflength; char *new_buf; if (lkup == R_NilValue) return mkCharLen(x->seq, x->length); new_buflength = x->length; if (new_buflength > buflength) { new_buf = (char *) realloc(buf, new_buflength); if (new_buf == NULL) error("_new_CHARSXP_from_cachedCharSeq(): " "call to realloc() failed"); buf = new_buf; buflength = new_buflength; } Ocopy_bytes_to_i1i2_with_lkup(0, x->length - 1, buf, buflength, x->seq, x->length, INTEGER(lkup), LENGTH(lkup)); return mkCharLen(buf, x->length); } /* --- .Call ENTRY POINT --- */ SEXP new_XString_from_CHARACTER(SEXP classname, SEXP x, SEXP start, SEXP width, SEXP lkup) { SEXP x_elt, ans; cachedCharSeq cached_ans; const int *lkup0; int lkup_length; if (LENGTH(x) != 1) error("zero or more than one input sequence"); x_elt = STRING_ELT(x, 0); if (x_elt == NA_STRING) error("input sequence is NA"); PROTECT(ans = alloc_XRaw(CHAR(STRING_ELT(classname, 0)), INTEGER(width)[0])); cached_ans = cache_XRaw(ans); if (lkup == R_NilValue) { lkup0 = NULL; } else { lkup0 = INTEGER(lkup); lkup_length = LENGTH(lkup); } _copy_CHARSXP_to_cachedCharSeq(&cached_ans, x_elt, INTEGER(start)[0], lkup0, lkup_length); UNPROTECT(1); return ans; } /* --- .Call ENTRY POINT --- */ SEXP new_CHARACTER_from_XString(SEXP x, SEXP lkup) { cachedCharSeq cached_x; SEXP ans, ans_elt; cached_x = cache_XRaw(x); PROTECT(ans = NEW_CHARACTER(1)); PROTECT(ans_elt = _new_CHARSXP_from_cachedCharSeq(&cached_x, lkup)); SET_STRING_ELT(ans, 0, ans_elt); UNPROTECT(2); return ans; } Biostrings/src/XVector_stubs.c0000644000126300012640000000003412241047607020025 0ustar00biocbuildphs_compbio#include "_XVector_stubs.c" Biostrings/src/align_needwunsQS.c0000644000126300012640000001125312241047607020466 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" #include #define SCO(i1, i2) (sco[n2 * (i1) + (i2)]) #define TRA(i1, i2) (tra[n2 * (i1) + (i2)]) #define SET_LKUP_VAL_INT(lkup, length, key) \ { \ unsigned char lkup_key = (unsigned char) (key); \ if (lkup_key >= (length) || (lkup_val = (lkup)[lkup_key]) == NA_INTEGER) { \ error("key %d not in lookup table", (int) lkup_key); \ } \ } static int nal = 0; static char *al1_buf, *al2_buf, *al1, *al2; /* Returns the score of the alignment */ static int needwunsQS(const cachedCharSeq *S1, const cachedCharSeq *S2, const int *mat, int mat_nrow, const int *lkup, int lkup_length, int gap_cost, char gap_code) { int *sco, sc, n1, n2, i1, i2, j1, j2, al_buf_size; char *tra, tr; n1 = S1->length + 1; n2 = S2->length + 1; sco = (int *) R_alloc((long) n1 * n2, sizeof(int)); tra = (char *) R_alloc((long) n1 * n2, sizeof(char)); for (i1 = 0; i1 <= S1->length; i1++) SCO(i1, 0) = - i1 * gap_cost; for (i2 = 1; i2 <= S2->length; i2++) SCO(0, i2) = - i2 * gap_cost; for (i1 = 1, j1 = 0; i1 <= S1->length; i1++, j1++) { for (i2 = 1, j2 = 0; i2 <= S2->length; i2++, j2++) { int lkup_val, m1, m2, scR, scD, scI; SET_LKUP_VAL_INT(lkup, lkup_length, S1->seq[j1]); m1 = lkup_val; SET_LKUP_VAL_INT(lkup, lkup_length, S2->seq[j2]); m2 = lkup_val; scR = SCO(j1, j2) + mat[mat_nrow * m1 + m2]; scD = SCO(j1, i2) - gap_cost; scI = SCO(i1, j2) - gap_cost; if (scD >= scI) { sc = scD; tr = 'D'; /* Deletion (gap in aligned string 2) */ } else { sc = scI; tr = 'I'; /* Insertion (gap in aligned string 1) */ } if (scR >= sc) { sc = scR; tr = 'R'; /* Replacement (can be an exact match) */ } SCO(i1, i2) = sc; TRA(i1, i2) = tr; } } /* #ifdef DEBUG_BIOSTRINGS Rprintf("sco:\n"); for (i1 = 0; i1 <= S1->length; i1++) { for (i2 = 0; i2 <= S2->length; i2++) { Rprintf("%4d", SCO(i1, i2)); } Rprintf("\n"); } Rprintf("tra:\n"); for (i1 = 1; i1 <= S1->length; i1++) { for (i2 = 1; i2 <= S2->length; i2++) { Rprintf(" %c", TRA(i1, i2)); } Rprintf("\n"); } #endif */ al_buf_size = S1->length + S2->length; al1_buf = (char *) R_alloc((long) al_buf_size, sizeof(char)); al2_buf = (char *) R_alloc((long) al_buf_size, sizeof(char)); nal = 0; al1 = al1_buf + al_buf_size; al2 = al2_buf + al_buf_size; i1 = S1->length; i2 = S2->length; while (i1 >= 1 || i2 >= 1) { nal++; al1--; al2--; j1 = i1 - 1; j2 = i2 - 1; if (i2 == 0) tr = 'D'; else if (i1 == 0) tr = 'I'; else tr = TRA(i1, i2); switch (tr) { case 'D': *al1 = S1->seq[j1]; *al2 = gap_code; i1--; break; case 'I': *al1 = gap_code; *al2 = S2->seq[j2]; i2--; break; case 'R': *al1 = S1->seq[j1]; *al2 = S2->seq[j2]; i1--; i2--; break; default: error("unknown traceback code %d", (int) tr); break; } } return sc; } /* * 's1', 's2': left and right XString objects * 'mat': scoring matrix (integer square matrix) * 'lkup': lookup table for translating XString bytes to scoring matrix * indices (integer vector) * 'gap_cost': gap cost or penalty (integer vector of length 1) * 'gap_code': encoded value of the '-' letter (raw vector of length 1) * Return a named list with 3 elements: 2 "externalptr" objects describing * the alignments + the score. * Note that the 2 XString objects to align should contain no gaps. */ SEXP align_needwunsQS(SEXP s1, SEXP s2, SEXP mat, SEXP mat_nrow, SEXP lkup, SEXP gap_cost, SEXP gap_code) { cachedCharSeq S1, S2; int nrow, score; SEXP ans, ans_names, tag, ans_elt; S1 = cache_XRaw(s1); S2 = cache_XRaw(s2); nrow = INTEGER(mat_nrow)[0]; score = needwunsQS(&S1, &S2, INTEGER(mat), nrow, INTEGER(lkup), LENGTH(lkup), INTEGER(gap_cost)[0], (char) RAW(gap_code)[0]); PROTECT(ans = NEW_LIST(3)); /* set the names */ PROTECT(ans_names = NEW_CHARACTER(3)); SET_STRING_ELT(ans_names, 0, mkChar("al1")); SET_STRING_ELT(ans_names, 1, mkChar("al2")); SET_STRING_ELT(ans_names, 2, mkChar("score")); SET_NAMES(ans, ans_names); UNPROTECT(1); /* set the "al1" element */ PROTECT(tag = NEW_RAW(nal)); memcpy((char *) RAW(tag), al1, nal * sizeof(char)); PROTECT(ans_elt = new_SharedVector("SharedRaw", tag)); SET_ELEMENT(ans, 0, ans_elt); UNPROTECT(2); /* set the "al2" element */ PROTECT(tag = NEW_RAW(nal)); memcpy((char *) RAW(tag), al2, nal * sizeof(char)); PROTECT(ans_elt = new_SharedVector("SharedRaw", tag)); SET_ELEMENT(ans, 1, ans_elt); UNPROTECT(2); /* set the "score" element */ PROTECT(ans_elt = NEW_INTEGER(1)); INTEGER(ans_elt)[0] = score; SET_ELEMENT(ans, 2, ans_elt); UNPROTECT(1); /* ans is ready */ UNPROTECT(1); return ans; } Biostrings/src/align_pairwiseAlignment.c0000644000126300012640000013743612241047607022070 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include "IRanges_interface.h" #include /* R_CheckUserInterrupt */ #include #include #define MAX(x, y) (x > y ? x : y) #define MIN(x, y) (x < y ? x : y) #define NEGATIVE_INFINITY R_NegInf #define MAX_BUF_SIZE 1048576 #define GLOBAL_ALIGNMENT 1 #define LOCAL_ALIGNMENT 2 #define OVERLAP_ALIGNMENT 3 #define GLOBAL_LOCAL_ALIGNMENT 4 #define LOCAL_GLOBAL_ALIGNMENT 5 #define SUBSTITUTION 'S' #define DELETION 'D' #define INSERTION 'I' #define TERMINATION 'T' #define CURR_MATRIX(i, j) (currMatrix[i + nCharString1Plus1 * j]) #define PREV_MATRIX(i, j) (prevMatrix[i + nCharString1Plus1 * j]) #define S_TRACE_MATRIX(i, j) (sTraceMatrix[i + nCharString1 * j]) #define D_TRACE_MATRIX(i, j) (dTraceMatrix[i + nCharString1 * j]) #define I_TRACE_MATRIX(i, j) (iTraceMatrix[i + nCharString1 * j]) #define FUZZY_MATRIX(i, j) (fuzzyMatrix[i + fuzzyMatrixDim[0] * j]) #define SUBSTITUTION_ARRAY(i, j, k) (substitutionArray[i + substitutionArrayDim[0] * (j + substitutionArrayDim[1] * k)]) #define SET_LOOKUP_VALUE(lookupTable, length, key) \ { \ unsigned char lookupKey = (unsigned char) (key); \ if (lookupKey >= (length) || (lookupValue = (lookupTable)[lookupKey]) == NA_INTEGER) { \ error("key %d not in lookup table", (int) lookupKey); \ } \ } /* Structure to hold alignment information */ struct AlignInfo { /* Initialized before passing the AlignInfo structure to * pairwiseAlignment(). Not modified by pairwiseAlignment(). */ cachedCharSeq string; cachedCharSeq quality; int endGap; /* Allocated (but not initialized) before passing the AlignInfo * structure to pairwiseAlignment(). Filled by pairwiseAlignment(). */ int* mismatch; int* startIndel; int* widthIndel; /* Not initialized before passing the AlignInfo structure to * pairwiseAlignment(). Set by pairwiseAlignment(). */ int lengthMismatch; int lengthIndel; int startRange; int widthRange; }; void function1(struct AlignInfo *); void print_AlignInfo(const struct AlignInfo *alignInfoPtr) { int string_len, i; const char *string_seq, *c; printf("- string: "); string_len = alignInfoPtr->string.length; string_seq = alignInfoPtr->string.seq; for (i = 0, c = string_seq; i < string_len; i++, c++) printf("%c", *c); printf("\n"); printf("- quality: "); string_len = alignInfoPtr->quality.length; string_seq = alignInfoPtr->quality.seq; for (i = 0, c = string_seq; i < string_len; i++, c++) printf("%c", *c); printf("\n"); printf("- endGap: %d\n", alignInfoPtr->endGap); printf("- lengthMismatch: %d\n", alignInfoPtr->lengthMismatch); printf("- lengthIndel: %d\n", alignInfoPtr->lengthIndel); printf("- startRange: %d\n", alignInfoPtr->startRange); printf("- widthRange: %d\n", alignInfoPtr->widthRange); return; } /* Structure to hold alignment buffers */ struct AlignBuffer { float *currMatrix; float *prevMatrix; char *sTraceMatrix; char *iTraceMatrix; char *dTraceMatrix; }; void function2(struct AlignBuffer *); /* Structure to hold mismatch buffers */ struct MismatchBuffer { int *pattern; int *subject; int usedSpace; int totalSpace; }; void function3(struct MismatchBuffer *); /* Structure to hold indel buffers */ struct IndelBuffer { int *start; int *width; int usedSpace; int totalSpace; }; void function4(struct IndelBuffer *); /* Returns the score of the optimal pairwise alignment */ static double pairwiseAlignment( struct AlignInfo *align1InfoPtr, struct AlignInfo *align2InfoPtr, const int localAlignment, const int scoreOnly, const float gapOpening, const float gapExtension, const int useQuality, const double *substitutionArray, const int *substitutionArrayDim, const int *substitutionLookupTable, const int substitutionLookupTableLength, const int *fuzzyMatrix, const int *fuzzyMatrixDim, const int *fuzzyLookupTable, const int fuzzyLookupTableLength, struct AlignBuffer *alignBufferPtr) { int i, j, iMinus1, jMinus1; //printf("align1InfoPtr:\n"); //print_AlignInfo(align1InfoPtr); //printf("align2InfoPtr:\n"); //print_AlignInfo(align2InfoPtr); /* Step 1: Get information on input XString objects */ const int nCharString1 = align1InfoPtr->string.length; const int nCharString2 = align2InfoPtr->string.length; const int nCharString1Plus1 = nCharString1 + 1; const int nCharString1Minus1 = nCharString1 - 1; const int nCharString2Minus1 = nCharString2 - 1; if (nCharString1 < 1 || nCharString2 < 1) { double zeroCharScore; if (nCharString1 >= 1 && align1InfoPtr->endGap) zeroCharScore = gapOpening + nCharString1 * gapExtension; else if (nCharString2 >= 1 && align2InfoPtr->endGap) zeroCharScore = gapOpening + nCharString2 * gapExtension; else zeroCharScore = 0.0; align1InfoPtr->lengthMismatch = 0; align2InfoPtr->lengthMismatch = 0; align1InfoPtr->lengthIndel = 0; align2InfoPtr->lengthIndel = 0; return zeroCharScore; } /* Step 2: Create objects for scores values */ /* Rows of currMatrix and prevMatrix = (0) substitution, (1) deletion, and (2) insertion */ float *currMatrix = alignBufferPtr->currMatrix; float *prevMatrix = alignBufferPtr->prevMatrix; CURR_MATRIX(0, 0) = 0.0; CURR_MATRIX(0, 1) = (align2InfoPtr->endGap ? gapOpening : 0.0); for (i = 1, iMinus1 = 0; i <= nCharString1; i++, iMinus1++) { CURR_MATRIX(i, 0) = NEGATIVE_INFINITY; CURR_MATRIX(i, 1) = NEGATIVE_INFINITY; } if (align1InfoPtr->endGap) { for (i = 0; i <= nCharString1; i++) CURR_MATRIX(i, 2) = gapOpening + i * gapExtension; } else { for (i = 0; i <= nCharString1; i++) CURR_MATRIX(i, 2) = 0.0; } /* Step 3: Perform main alignment operations */ cachedCharSeq sequence1, sequence2; int scalar1, scalar2; if (useQuality) { sequence1 = align1InfoPtr->quality; sequence2 = align2InfoPtr->quality; scalar1 = (align1InfoPtr->quality.length == 1); scalar2 = (align2InfoPtr->quality.length == 1); } else { sequence1 = align1InfoPtr->string; sequence2 = align2InfoPtr->string; scalar1 = (nCharString1 == 1); scalar2 = (nCharString2 == 1); } int lookupValue = 0, element1, element2, stringElt1, stringElt2, fuzzy, iElt, jElt; const int noEndGap1 = !align1InfoPtr->endGap; const int noEndGap2 = !align2InfoPtr->endGap; const float gapOpeningPlusExtension = gapOpening + gapExtension; const float endGapAddend = (align2InfoPtr->endGap ? gapExtension : 0.0); float *tempMatrix, substitutionValue; double maxScore = NEGATIVE_INFINITY; if (scoreOnly) { /* Simplified calculations when only need the alignment score */ for (j = 1, jElt = nCharString2Minus1; j <= nCharString2; j++, jElt--) { tempMatrix = prevMatrix; prevMatrix = currMatrix; currMatrix = tempMatrix; CURR_MATRIX(0, 0) = NEGATIVE_INFINITY; CURR_MATRIX(0, 1) = PREV_MATRIX(0, 1) + endGapAddend; CURR_MATRIX(0, 2) = NEGATIVE_INFINITY; SET_LOOKUP_VALUE(fuzzyLookupTable, fuzzyLookupTableLength, align2InfoPtr->string.seq[jElt]); stringElt2 = lookupValue; SET_LOOKUP_VALUE(substitutionLookupTable, substitutionLookupTableLength, sequence2.seq[scalar2 ? 0 : jElt]); element2 = lookupValue; if (localAlignment) { for (i = 1, iMinus1 = 0, iElt = nCharString1Minus1; i <= nCharString1; i++, iMinus1++, iElt--) { SET_LOOKUP_VALUE(fuzzyLookupTable, fuzzyLookupTableLength, align1InfoPtr->string.seq[iElt]); stringElt1 = lookupValue; SET_LOOKUP_VALUE(substitutionLookupTable, substitutionLookupTableLength, sequence1.seq[scalar1 ? 0 : iElt]); element1 = lookupValue; fuzzy = FUZZY_MATRIX(stringElt1, stringElt2); substitutionValue = (float) SUBSTITUTION_ARRAY(element1, element2, fuzzy); CURR_MATRIX(i, 0) = MAX(0.0, MAX(PREV_MATRIX(iMinus1, 0), MAX(PREV_MATRIX(iMinus1, 1), PREV_MATRIX(iMinus1, 2))) + substitutionValue); CURR_MATRIX(i, 1) = MAX(MAX(PREV_MATRIX(i, 0), PREV_MATRIX(i, 2)) + gapOpeningPlusExtension, PREV_MATRIX(i, 1) + gapExtension); CURR_MATRIX(i, 2) = MAX(MAX(CURR_MATRIX(iMinus1, 0), CURR_MATRIX(iMinus1, 1)) + gapOpeningPlusExtension, CURR_MATRIX(iMinus1, 2) + gapExtension); maxScore = MAX(CURR_MATRIX(i, 0), maxScore); } } else { for (i = 1, iMinus1 = 0, iElt = nCharString1Minus1; i <= nCharString1; i++, iMinus1++, iElt--) { SET_LOOKUP_VALUE(fuzzyLookupTable, fuzzyLookupTableLength, align1InfoPtr->string.seq[iElt]); stringElt1 = lookupValue; SET_LOOKUP_VALUE(substitutionLookupTable, substitutionLookupTableLength, sequence1.seq[scalar1 ? 0 : iElt]); element1 = lookupValue; fuzzy = FUZZY_MATRIX(stringElt1, stringElt2); substitutionValue = (float) SUBSTITUTION_ARRAY(element1, element2, fuzzy); CURR_MATRIX(i, 0) = MAX(PREV_MATRIX(iMinus1, 0), MAX(PREV_MATRIX(iMinus1, 1), PREV_MATRIX(iMinus1, 2))) + substitutionValue; CURR_MATRIX(i, 1) = MAX(MAX(PREV_MATRIX(i, 0), PREV_MATRIX(i, 2)) + gapOpeningPlusExtension, PREV_MATRIX(i, 1) + gapExtension); CURR_MATRIX(i, 2) = MAX(MAX(CURR_MATRIX(iMinus1, 0), CURR_MATRIX(iMinus1, 1)) + gapOpeningPlusExtension, CURR_MATRIX(iMinus1, 2) + gapExtension); } if (noEndGap2) { CURR_MATRIX(nCharString1, 1) = MAX(PREV_MATRIX(nCharString1, 0), MAX(PREV_MATRIX(nCharString1, 1), PREV_MATRIX(nCharString1, 2))); } if (noEndGap1 && j == nCharString2) { for (i = 1, iMinus1 = 0; i <= nCharString1; i++, iMinus1++) { CURR_MATRIX(i, 2) = MAX(MAX(CURR_MATRIX(iMinus1, 0), CURR_MATRIX(iMinus1, 1)), CURR_MATRIX(iMinus1, 2)); } } } } if (!localAlignment) { maxScore = MAX(CURR_MATRIX(nCharString1, 0), MAX(CURR_MATRIX(nCharString1, 1), CURR_MATRIX(nCharString1, 2))); } } else { /* Step 3a: Create objects for traceback values */ char *sTraceMatrix = alignBufferPtr->sTraceMatrix; char *iTraceMatrix = alignBufferPtr->iTraceMatrix; char *dTraceMatrix = alignBufferPtr->dTraceMatrix; /* Step 3b: Prepare the alignment info object for alignment */ const int alignmentBufferSize = nCharString1Plus1; align1InfoPtr->lengthMismatch = 0; align2InfoPtr->lengthMismatch = 0; align1InfoPtr->lengthIndel = 0; align2InfoPtr->lengthIndel = 0; memset(align1InfoPtr->mismatch, 0, alignmentBufferSize * sizeof(int)); memset(align2InfoPtr->mismatch, 0, alignmentBufferSize * sizeof(int)); memset(align1InfoPtr->startIndel, 0, alignmentBufferSize * sizeof(int)); memset(align2InfoPtr->startIndel, 0, alignmentBufferSize * sizeof(int)); memset(align1InfoPtr->widthIndel, 0, alignmentBufferSize * sizeof(int)); memset(align2InfoPtr->widthIndel, 0, alignmentBufferSize * sizeof(int)); align1InfoPtr->startRange = -1; align2InfoPtr->startRange = -1; align1InfoPtr->widthRange = 0; align2InfoPtr->widthRange = 0; for (j = 1, jMinus1 = 0, jElt = nCharString2Minus1; j <= nCharString2; j++, jMinus1++, jElt--) { tempMatrix = prevMatrix; prevMatrix = currMatrix; currMatrix = tempMatrix; CURR_MATRIX(0, 0) = NEGATIVE_INFINITY; CURR_MATRIX(0, 1) = PREV_MATRIX(0, 1) + endGapAddend; CURR_MATRIX(0, 2) = NEGATIVE_INFINITY; SET_LOOKUP_VALUE(fuzzyLookupTable, fuzzyLookupTableLength, align2InfoPtr->string.seq[jElt]); stringElt2 = lookupValue; SET_LOOKUP_VALUE(substitutionLookupTable, substitutionLookupTableLength, sequence2.seq[scalar2 ? 0 : jElt]); element2 = lookupValue; if (localAlignment) { for (i = 1, iMinus1 = 0, iElt = nCharString1Minus1; i <= nCharString1; i++, iMinus1++, iElt--) { SET_LOOKUP_VALUE(fuzzyLookupTable, fuzzyLookupTableLength, align1InfoPtr->string.seq[iElt]); stringElt1 = lookupValue; SET_LOOKUP_VALUE(substitutionLookupTable, substitutionLookupTableLength, sequence1.seq[scalar1 ? 0 : iElt]); element1 = lookupValue; fuzzy = FUZZY_MATRIX(stringElt1, stringElt2); substitutionValue = (float) SUBSTITUTION_ARRAY(element1, element2, fuzzy); /* Step 3c: Generate (0) substitution, (1) deletion, and (2) insertion scores * and traceback values */ if (PREV_MATRIX(iMinus1, 0) >= MAX(PREV_MATRIX(iMinus1, 1), PREV_MATRIX(iMinus1, 2))) { S_TRACE_MATRIX(iMinus1, jMinus1) = SUBSTITUTION; CURR_MATRIX(i, 0) = PREV_MATRIX(iMinus1, 0) + substitutionValue; } else if (PREV_MATRIX(iMinus1, 1) >= PREV_MATRIX(iMinus1, 2)) { S_TRACE_MATRIX(iMinus1, jMinus1) = DELETION; CURR_MATRIX(i, 0) = PREV_MATRIX(iMinus1, 1) + substitutionValue; } else { S_TRACE_MATRIX(iMinus1, jMinus1) = INSERTION; CURR_MATRIX(i, 0) = PREV_MATRIX(iMinus1, 2) + substitutionValue; } if (PREV_MATRIX(i, 1) > (MAX(PREV_MATRIX(i, 0), PREV_MATRIX(i, 2)) + gapOpening)) { D_TRACE_MATRIX(iMinus1, jMinus1) = DELETION; CURR_MATRIX(i, 1) = PREV_MATRIX(i, 1) + gapExtension; } else if (PREV_MATRIX(i, 0) >= PREV_MATRIX(i, 2)) { D_TRACE_MATRIX(iMinus1, jMinus1) = SUBSTITUTION; CURR_MATRIX(i, 1) = PREV_MATRIX(i, 0) + gapOpeningPlusExtension; } else { D_TRACE_MATRIX(iMinus1, jMinus1) = INSERTION; CURR_MATRIX(i, 1) = PREV_MATRIX(i, 2) + gapOpeningPlusExtension; } if (CURR_MATRIX(iMinus1, 2) > (MAX(CURR_MATRIX(iMinus1, 0), CURR_MATRIX(iMinus1, 1)) + gapOpening)) { I_TRACE_MATRIX(iMinus1, jMinus1) = INSERTION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 2) + gapExtension; } else if (CURR_MATRIX(iMinus1, 0) >= CURR_MATRIX(iMinus1, 1)) { I_TRACE_MATRIX(iMinus1, jMinus1) = SUBSTITUTION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 0) + gapOpeningPlusExtension; } else { I_TRACE_MATRIX(iMinus1, jMinus1) = DELETION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 1) + gapOpeningPlusExtension; } CURR_MATRIX(i, 0) = MAX(0.0, CURR_MATRIX(i, 0)); if (CURR_MATRIX(i, 0) == 0.0) S_TRACE_MATRIX(iMinus1, jMinus1) = TERMINATION; CURR_MATRIX(i, 1) = MAX(0.0, CURR_MATRIX(i, 1)); if (CURR_MATRIX(i, 1) == 0.0) D_TRACE_MATRIX(iMinus1, jMinus1) = TERMINATION; CURR_MATRIX(i, 2) = MAX(0.0, CURR_MATRIX(i, 2)); if (CURR_MATRIX(i, 2) == 0.0) I_TRACE_MATRIX(iMinus1, jMinus1) = TERMINATION; /* Step 3d: Get the optimal score for local alignments */ if (CURR_MATRIX(i, 0) >= maxScore) { align1InfoPtr->startRange = iElt + 1; align2InfoPtr->startRange = jElt + 1; maxScore = CURR_MATRIX(i, 0); } } } else { for (i = 1, iMinus1 = 0, iElt = nCharString1Minus1; i <= nCharString1; i++, iMinus1++, iElt--) { SET_LOOKUP_VALUE(fuzzyLookupTable, fuzzyLookupTableLength, align1InfoPtr->string.seq[iElt]); stringElt1 = lookupValue; SET_LOOKUP_VALUE(substitutionLookupTable, substitutionLookupTableLength, sequence1.seq[scalar1 ? 0 : iElt]); element1 = lookupValue; fuzzy = FUZZY_MATRIX(stringElt1, stringElt2); substitutionValue = (float) SUBSTITUTION_ARRAY(element1, element2, fuzzy); /* Step 3c: Generate (0) substitution, (1) deletion, and (2) insertion scores * and traceback values */ if (PREV_MATRIX(iMinus1, 0) >= MAX(PREV_MATRIX(iMinus1, 1), PREV_MATRIX(iMinus1, 2))) { S_TRACE_MATRIX(iMinus1, jMinus1) = SUBSTITUTION; CURR_MATRIX(i, 0) = PREV_MATRIX(iMinus1, 0) + substitutionValue; } else if (PREV_MATRIX(iMinus1, 1) >= PREV_MATRIX(iMinus1, 2)) { S_TRACE_MATRIX(iMinus1, jMinus1) = DELETION; CURR_MATRIX(i, 0) = PREV_MATRIX(iMinus1, 1) + substitutionValue; } else { S_TRACE_MATRIX(iMinus1, jMinus1) = INSERTION; CURR_MATRIX(i, 0) = PREV_MATRIX(iMinus1, 2) + substitutionValue; } if (PREV_MATRIX(i, 1) > (MAX(PREV_MATRIX(i, 0), PREV_MATRIX(i, 2)) + gapOpening)) { D_TRACE_MATRIX(iMinus1, jMinus1) = DELETION; CURR_MATRIX(i, 1) = PREV_MATRIX(i, 1) + gapExtension; } else if (PREV_MATRIX(i, 0) >= PREV_MATRIX(i, 2)) { D_TRACE_MATRIX(iMinus1, jMinus1) = SUBSTITUTION; CURR_MATRIX(i, 1) = PREV_MATRIX(i, 0) + gapOpeningPlusExtension; } else { D_TRACE_MATRIX(iMinus1, jMinus1) = INSERTION; CURR_MATRIX(i, 1) = PREV_MATRIX(i, 2) + gapOpeningPlusExtension; } if (CURR_MATRIX(iMinus1, 2) > (MAX(CURR_MATRIX(iMinus1, 0), CURR_MATRIX(iMinus1, 1)) + gapOpening)) { I_TRACE_MATRIX(iMinus1, jMinus1) = INSERTION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 2) + gapExtension; } else if (CURR_MATRIX(iMinus1, 0) >= CURR_MATRIX(iMinus1, 1)) { I_TRACE_MATRIX(iMinus1, jMinus1) = SUBSTITUTION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 0) + gapOpeningPlusExtension; } else { I_TRACE_MATRIX(iMinus1, jMinus1) = DELETION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 1) + gapOpeningPlusExtension; } } } if (noEndGap2) { if (PREV_MATRIX(nCharString1, 1) >= MAX(PREV_MATRIX(nCharString1, 0), PREV_MATRIX(nCharString1, 2))) { D_TRACE_MATRIX(nCharString1Minus1, jMinus1) = DELETION; CURR_MATRIX(nCharString1, 1) = PREV_MATRIX(nCharString1, 1); } else if (PREV_MATRIX(nCharString1, 0) >= PREV_MATRIX(nCharString1, 2)) { D_TRACE_MATRIX(nCharString1Minus1, jMinus1) = SUBSTITUTION; CURR_MATRIX(nCharString1, 1) = PREV_MATRIX(nCharString1, 0); } else { D_TRACE_MATRIX(nCharString1Minus1, jMinus1) = INSERTION; CURR_MATRIX(nCharString1, 1) = PREV_MATRIX(nCharString1, 2); } } if (noEndGap1 && j == nCharString2) { for (i = 1, iMinus1 = 0; i <= nCharString1; i++, iMinus1++) { if (CURR_MATRIX(iMinus1, 2) >= MAX(CURR_MATRIX(iMinus1, 0), CURR_MATRIX(iMinus1, 1))) { I_TRACE_MATRIX(iMinus1, jMinus1) = INSERTION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 2); } else if (CURR_MATRIX(iMinus1, 0) >= CURR_MATRIX(iMinus1, 1)) { I_TRACE_MATRIX(iMinus1, jMinus1) = SUBSTITUTION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 0); } else { I_TRACE_MATRIX(iMinus1, jMinus1) = DELETION; CURR_MATRIX(i, 2) = CURR_MATRIX(iMinus1, 1); } } } } char currTraceMatrix = '?'; if (localAlignment) { if (maxScore == 0.0) currTraceMatrix = TERMINATION; else currTraceMatrix = SUBSTITUTION; } else { /* Step 3g: Get the optimal score for non-local alignments */ align1InfoPtr->startRange = 1; align2InfoPtr->startRange = 1; if (CURR_MATRIX(nCharString1, 0) >= MAX(CURR_MATRIX(nCharString1, 1), CURR_MATRIX(nCharString1, 2))) { currTraceMatrix = SUBSTITUTION; maxScore = CURR_MATRIX(nCharString1, 0); } else if (CURR_MATRIX(nCharString1, 1) >= CURR_MATRIX(nCharString1, 2)) { currTraceMatrix = DELETION; maxScore = CURR_MATRIX(nCharString1, 1); } else { currTraceMatrix = INSERTION; maxScore = CURR_MATRIX(nCharString1, 2); } } /* Step 4: Traceback through the score matrices */ i = nCharString1 - align1InfoPtr->startRange; j = nCharString2 - align2InfoPtr->startRange; char prevTraceMatrix = '?'; while (currTraceMatrix != TERMINATION && i >= 0 && j >= 0) { switch (currTraceMatrix) { case INSERTION: if (I_TRACE_MATRIX(i, j) != TERMINATION) { if (j == nCharString2Minus1) { align1InfoPtr->startRange++; } else { align1InfoPtr->widthRange++; if (prevTraceMatrix != INSERTION) { align2InfoPtr->startIndel[align2InfoPtr->lengthIndel] = nCharString2 - j; align2InfoPtr->lengthIndel++; } align2InfoPtr->widthIndel[align2InfoPtr->lengthIndel - 1] += 1; } } prevTraceMatrix = currTraceMatrix; currTraceMatrix = I_TRACE_MATRIX(i, j); i--; break; case DELETION: if (D_TRACE_MATRIX(i, j) != TERMINATION) { if (i == nCharString1Minus1) { align2InfoPtr->startRange++; } else { align2InfoPtr->widthRange++; if (prevTraceMatrix != DELETION) { align1InfoPtr->startIndel[align1InfoPtr->lengthIndel] = nCharString1 - i; align1InfoPtr->lengthIndel++; } align1InfoPtr->widthIndel[align1InfoPtr->lengthIndel - 1] += 1; } } prevTraceMatrix = currTraceMatrix; currTraceMatrix = D_TRACE_MATRIX(i, j); j--; break; case SUBSTITUTION: prevTraceMatrix = currTraceMatrix; currTraceMatrix = S_TRACE_MATRIX(i, j); if (currTraceMatrix != TERMINATION) { align1InfoPtr->widthRange++; align2InfoPtr->widthRange++; } if (currTraceMatrix != TERMINATION && align1InfoPtr->string.seq[nCharString1Minus1 - i] != align2InfoPtr->string.seq[nCharString2Minus1 - j]) { align1InfoPtr->mismatch[align1InfoPtr->lengthMismatch] = nCharString1 - i; align2InfoPtr->mismatch[align2InfoPtr->lengthMismatch] = nCharString2 - j; align1InfoPtr->lengthMismatch++; align2InfoPtr->lengthMismatch++; } i--; j--; break; default: error("unknown traceback code %d", currTraceMatrix); break; } } const int offset1 = align1InfoPtr->startRange - 1; if (offset1 > 0 && align1InfoPtr->lengthIndel > 0) { for (i = 0; i < align1InfoPtr->lengthIndel; i++) align1InfoPtr->startIndel[i] -= offset1; } const int offset2 = align2InfoPtr->startRange - 1; if (offset2 > 0 && align2InfoPtr->lengthIndel > 0) { for (j = 0; j < align2InfoPtr->lengthIndel; j++) align2InfoPtr->startIndel[j] -= offset2; } } return (double) maxScore; } /* * INPUTS * 'pattern': XStringSet or QualityScaledXStringSet object for patterns * 'subject': XStringSet or QualityScaledXStringSet object for subject * 'type': type of pairwise alignment * (character vector of length 1; * 'global', 'local', 'overlap', 'global-local', * 'local-global') * 'typeCode': type of pairwise alignment * (integer vector of length 1; * 1 = 'global', 2 = 'local', 3 = 'overlap', * 4 = 'global-local', 5 = 'local-global') * 'scoreOnly': denotes whether or not to only return the scores * of the optimal pairwise alignment * (logical vector of length 1) * 'gapOpening': gap opening cost or penalty * (double vector of length 1) * 'gapExtension': gap extension cost or penalty * (double vector of length 1) * 'useQuality': denotes whether or not to use quality measures * in the optimal pairwise alignment * (logical vector of length 1) * 'substitutionArray': a three-dimensional double array where the first two * dimensions are for substitutions and the * third is for fuzziness of matches * 'substitutionArrayDim': dimension of 'substitutionArray' * (integer vector of length 3) * 'substitutionLookupTable': lookup table for translating XString bytes to * substitution indices * (integer vector) * 'fuzzyMatrix': fuzzy matrix for matches * (double matrix) * 'fuzzyMatrixDim': dimension of 'fuzzyMatrix' * (integer vector of length 2) * 'fuzzyLookupTable': lookup table for translating XString bytes to * fuzzy indices * (integer vector) * * OUTPUT * If scoreOnly = TRUE, returns either a vector of scores * If scoreOnly = FALSE, returns an S4 PairwiseAlignments or * PairwiseAlignmentsSingleSubject object. */ SEXP XStringSet_align_pairwiseAlignment( SEXP pattern, SEXP subject, SEXP type, SEXP typeCode, SEXP scoreOnly, SEXP gapOpening, SEXP gapExtension, SEXP useQuality, SEXP substitutionArray, SEXP substitutionArrayDim, SEXP substitutionLookupTable, SEXP fuzzyMatrix, SEXP fuzzyMatrixDim, SEXP fuzzyLookupTable) { const int scoreOnlyValue = LOGICAL(scoreOnly)[0]; const int useQualityValue = LOGICAL(useQuality)[0]; const int localAlignment = (INTEGER(typeCode)[0] == LOCAL_ALIGNMENT); float gapOpeningValue = REAL(gapOpening)[0]; float gapExtensionValue = REAL(gapExtension)[0]; if (gapOpeningValue == NEGATIVE_INFINITY || gapExtensionValue == NEGATIVE_INFINITY) { gapOpeningValue = 0.0; gapExtensionValue = NEGATIVE_INFINITY; } cachedXStringSet cached_pattern = _cache_XStringSet(pattern); cachedXStringSet cached_subject = _cache_XStringSet(subject); const int numberOfStrings = _get_cachedXStringSet_length(&cached_pattern); const int multipleSubjects = _get_cachedXStringSet_length(&cached_subject) > 1; int lengthOfPatternQualitySet = 0; int lengthOfSubjectQualitySet = 0; SEXP patternQuality, subjectQuality; cachedXStringSet cached_patternQuality, cached_subjectQuality; if (useQualityValue) { patternQuality = GET_SLOT(pattern, install("quality")); subjectQuality = GET_SLOT(subject, install("quality")); cached_patternQuality = _cache_XStringSet(patternQuality); lengthOfPatternQualitySet = _get_XStringSet_length(patternQuality); cached_subjectQuality = _cache_XStringSet(subjectQuality); lengthOfSubjectQualitySet = _get_cachedXStringSet_length(&cached_subjectQuality); } else { patternQuality = R_NilValue; subjectQuality = R_NilValue; } /* Create the alignment info objects */ struct AlignInfo align1Info, align2Info; align2Info.string = _get_cachedXStringSet_elt(&cached_subject, 0); if (useQualityValue) align2Info.quality = _get_cachedXStringSet_elt(&cached_subjectQuality, 0); align1Info.endGap = (INTEGER(typeCode)[0] == GLOBAL_ALIGNMENT || INTEGER(typeCode)[0] == GLOBAL_LOCAL_ALIGNMENT); align2Info.endGap = (INTEGER(typeCode)[0] == GLOBAL_ALIGNMENT || INTEGER(typeCode)[0] == LOCAL_GLOBAL_ALIGNMENT); SEXP output; int i, quality1Element = 0, quality2Element = 0; const int quality1Increment = ((lengthOfPatternQualitySet < numberOfStrings) ? 0 : 1); const int quality2Increment = ((lengthOfSubjectQualitySet < numberOfStrings) ? 0 : 1); /* Create the alignment buffer object */ struct AlignBuffer alignBuffer; int nCharString1 = 0, nCharString2 = 0, nCharProduct = 0; if (multipleSubjects) { for (i = 0; i < numberOfStrings; i++) { int nchar1 = _get_cachedXStringSet_elt(&cached_pattern, i).length; int nchar2 = _get_cachedXStringSet_elt(&cached_subject, i).length; nCharString1 = MAX(nCharString1, nchar1); nCharString2 = MAX(nCharString2, nchar2); nCharProduct = MAX(nCharProduct, nchar1 * nchar2); } } else { for (i = 0; i < numberOfStrings; i++) { nCharString1 = MAX(nCharString1, _get_cachedXStringSet_elt(&cached_pattern, i).length); } nCharString2 = align2Info.string.length; nCharProduct = nCharString1 * nCharString2; } const int alignmentBufferSize = nCharString1 + 1; alignBuffer.currMatrix = (float *) R_alloc((long) 3 * alignmentBufferSize, sizeof(float)); alignBuffer.prevMatrix = (float *) R_alloc((long) 3 * alignmentBufferSize, sizeof(float)); struct MismatchBuffer mismatchBuffer; struct IndelBuffer indel1Buffer; struct IndelBuffer indel2Buffer; int mismatchBufferSize = 0, indelBufferSize = 0; if (!scoreOnlyValue) { align1Info.mismatch = (int *) R_alloc((long) alignmentBufferSize, sizeof(int)); align2Info.mismatch = (int *) R_alloc((long) alignmentBufferSize, sizeof(int)); align1Info.startIndel = (int *) R_alloc((long) alignmentBufferSize, sizeof(int)); align2Info.startIndel = (int *) R_alloc((long) alignmentBufferSize, sizeof(int)); align1Info.widthIndel = (int *) R_alloc((long) alignmentBufferSize, sizeof(int)); align2Info.widthIndel = (int *) R_alloc((long) alignmentBufferSize, sizeof(int)); alignBuffer.sTraceMatrix = (char *) R_alloc((long) nCharProduct, sizeof(char)); alignBuffer.iTraceMatrix = (char *) R_alloc((long) nCharProduct, sizeof(char)); alignBuffer.dTraceMatrix = (char *) R_alloc((long) nCharProduct, sizeof(char)); mismatchBufferSize = MIN(MAX_BUF_SIZE, alignmentBufferSize + numberOfStrings * (alignmentBufferSize/4)); mismatchBuffer.pattern = (int *) R_alloc((long) mismatchBufferSize, sizeof(int)); mismatchBuffer.subject = (int *) R_alloc((long) mismatchBufferSize, sizeof(int)); mismatchBuffer.usedSpace = 0; mismatchBuffer.totalSpace = mismatchBufferSize; indelBufferSize = MIN(MAX_BUF_SIZE, alignmentBufferSize + numberOfStrings * (alignmentBufferSize/12)); indel1Buffer.start = (int *) R_alloc((long) indelBufferSize, sizeof(int)); indel1Buffer.width = (int *) R_alloc((long) indelBufferSize, sizeof(int)); indel1Buffer.usedSpace = 0; indel1Buffer.totalSpace = indelBufferSize; indel2Buffer.start = (int *) R_alloc((long) indelBufferSize, sizeof(int)); indel2Buffer.width = (int *) R_alloc((long) indelBufferSize, sizeof(int)); indel2Buffer.usedSpace = 0; indel2Buffer.totalSpace = indelBufferSize; } double *score; if (scoreOnlyValue) { PROTECT(output = NEW_NUMERIC(numberOfStrings)); for (i = 0, score = REAL(output); i < numberOfStrings; i++, score++) { R_CheckUserInterrupt(); align1Info.string = _get_cachedXStringSet_elt(&cached_pattern, i); if (useQualityValue) { align1Info.quality = _get_cachedXStringSet_elt(&cached_patternQuality, quality1Element); quality1Element += quality1Increment; } if (multipleSubjects) { align2Info.string = _get_cachedXStringSet_elt(&cached_subject, i); if (useQualityValue) { align2Info.quality = _get_cachedXStringSet_elt(&cached_subjectQuality, quality2Element); quality2Element += quality2Increment; } } *score = pairwiseAlignment( &align1Info, &align2Info, localAlignment, scoreOnlyValue, gapOpeningValue, gapExtensionValue, useQualityValue, REAL(substitutionArray), INTEGER(substitutionArrayDim), INTEGER(substitutionLookupTable), LENGTH(substitutionLookupTable), INTEGER(fuzzyMatrix), INTEGER(fuzzyMatrixDim), INTEGER(fuzzyLookupTable), LENGTH(fuzzyLookupTable), &alignBuffer); } UNPROTECT(1); } else { SEXP alignedPattern; SEXP alignedPatternRange, alignedPatternRangeStart, alignedPatternRangeWidth; SEXP alignedPatternMismatch; SEXP alignedPatternMismatchPartitioning, alignedPatternMismatchValues; SEXP alignedPatternMismatchEnds; SEXP alignedPatternIndel; SEXP alignedPatternIndelPartitioning, alignedPatternIndelRange; SEXP alignedPatternIndelRangeStart, alignedPatternIndelRangeWidth; SEXP alignedPatternIndelEnds; SEXP alignedSubject; SEXP alignedSubjectRange, alignedSubjectRangeStart, alignedSubjectRangeWidth; SEXP alignedSubjectMismatch; SEXP alignedSubjectMismatchPartitioning, alignedSubjectMismatchValues; SEXP alignedSubjectMismatchEnds; SEXP alignedSubjectIndel; SEXP alignedSubjectIndelPartitioning, alignedSubjectIndelRange; SEXP alignedSubjectIndelRangeStart, alignedSubjectIndelRangeWidth; SEXP alignedSubjectIndelEnds; SEXP alignedScore; PROTECT(alignedPatternRangeStart = NEW_INTEGER(numberOfStrings)); PROTECT(alignedPatternRangeWidth = NEW_INTEGER(numberOfStrings)); PROTECT(alignedPatternMismatchEnds = NEW_INTEGER(numberOfStrings)); PROTECT(alignedPatternIndelEnds = NEW_INTEGER(numberOfStrings)); PROTECT(alignedSubjectRangeStart = NEW_INTEGER(numberOfStrings)); PROTECT(alignedSubjectRangeWidth = NEW_INTEGER(numberOfStrings)); PROTECT(alignedSubjectMismatchEnds = NEW_INTEGER(numberOfStrings)); PROTECT(alignedSubjectIndelEnds = NEW_INTEGER(numberOfStrings)); PROTECT(alignedScore = NEW_NUMERIC(numberOfStrings)); int align1MismatchPrevEnd = 0, align1IndelPrevEnd = 0; int align2MismatchPrevEnd = 0, align2IndelPrevEnd = 0; int *tempIntPtr; int *align1RangeStart, *align1RangeWidth, *align1MismatchEnds, *align1IndelEnds; int *align2RangeStart, *align2RangeWidth, *align2MismatchEnds, *align2IndelEnds; for (i = 0, score = REAL(alignedScore), align1RangeStart = INTEGER(alignedPatternRangeStart), align1RangeWidth = INTEGER(alignedPatternRangeWidth), align1MismatchEnds = INTEGER(alignedPatternMismatchEnds), align1IndelEnds = INTEGER(alignedPatternIndelEnds), align2RangeStart = INTEGER(alignedSubjectRangeStart), align2RangeWidth = INTEGER(alignedSubjectRangeWidth), align2MismatchEnds = INTEGER(alignedSubjectMismatchEnds), align2IndelEnds = INTEGER(alignedSubjectIndelEnds); i < numberOfStrings; i++, score++, align1RangeStart++, align1RangeWidth++, align1MismatchEnds++, align1IndelEnds++, align2RangeStart++, align2RangeWidth++, align2MismatchEnds++, align2IndelEnds++) { R_CheckUserInterrupt(); align1Info.string = _get_cachedXStringSet_elt(&cached_pattern, i); if (useQualityValue) { align1Info.quality = _get_cachedXStringSet_elt(&cached_patternQuality, quality1Element); quality1Element += quality1Increment; } if (multipleSubjects) { align2Info.string = _get_cachedXStringSet_elt(&cached_subject, i); if (useQualityValue) { align2Info.quality = _get_cachedXStringSet_elt(&cached_subjectQuality, quality2Element); quality2Element += quality2Increment; } } *score = pairwiseAlignment( &align1Info, &align2Info, localAlignment, scoreOnlyValue, gapOpeningValue, gapExtensionValue, useQualityValue, REAL(substitutionArray), INTEGER(substitutionArrayDim), INTEGER(substitutionLookupTable), LENGTH(substitutionLookupTable), INTEGER(fuzzyMatrix), INTEGER(fuzzyMatrixDim), INTEGER(fuzzyLookupTable), LENGTH(fuzzyLookupTable), &alignBuffer); *align1MismatchEnds = align1Info.lengthMismatch + align1MismatchPrevEnd; *align2MismatchEnds = align2Info.lengthMismatch + align2MismatchPrevEnd; if (align1Info.lengthMismatch > 0) { if ((mismatchBuffer.usedSpace + align1Info.lengthMismatch) > mismatchBuffer.totalSpace) { mismatchBuffer.totalSpace = mismatchBuffer.totalSpace + MIN(MAX_BUF_SIZE, alignmentBufferSize + (numberOfStrings - (i+1)) * (alignmentBufferSize/4)); tempIntPtr = (int *) R_alloc((long) mismatchBuffer.totalSpace, sizeof(int)); memcpy(tempIntPtr, mismatchBuffer.pattern, mismatchBuffer.usedSpace * sizeof(int)); mismatchBuffer.pattern = tempIntPtr; tempIntPtr = (int *) R_alloc((long) mismatchBuffer.totalSpace, sizeof(int)); memcpy(tempIntPtr, mismatchBuffer.subject, mismatchBuffer.usedSpace * sizeof(int)); mismatchBuffer.subject = tempIntPtr; } memcpy(&mismatchBuffer.pattern[mismatchBuffer.usedSpace], align1Info.mismatch, align1Info.lengthMismatch * sizeof(int)); memcpy(&mismatchBuffer.subject[mismatchBuffer.usedSpace], align2Info.mismatch, align1Info.lengthMismatch * sizeof(int)); mismatchBuffer.usedSpace = mismatchBuffer.usedSpace + align1Info.lengthMismatch; } *align1RangeStart = align1Info.startRange; *align1RangeWidth = align1Info.widthRange; *align1IndelEnds = align1Info.lengthIndel + align1IndelPrevEnd; if (align1Info.lengthIndel > 0) { if ((indel1Buffer.usedSpace + align1Info.lengthIndel) > indel1Buffer.totalSpace) { indel1Buffer.totalSpace = indel1Buffer.totalSpace + MIN(MAX_BUF_SIZE, alignmentBufferSize + (numberOfStrings - (i+1)) * (alignmentBufferSize/12)); tempIntPtr = (int *) R_alloc((long) indel1Buffer.totalSpace, sizeof(int)); memcpy(tempIntPtr, indel1Buffer.start, indel1Buffer.usedSpace * sizeof(int)); indel1Buffer.start = tempIntPtr; tempIntPtr = (int *) R_alloc((long) indel1Buffer.totalSpace, sizeof(int)); memcpy(tempIntPtr, indel1Buffer.width, indel1Buffer.usedSpace * sizeof(int)); indel1Buffer.width = tempIntPtr; } memcpy(&indel1Buffer.start[indel1Buffer.usedSpace], align1Info.startIndel, align1Info.lengthIndel * sizeof(int)); memcpy(&indel1Buffer.width[indel1Buffer.usedSpace], align1Info.widthIndel, align1Info.lengthIndel * sizeof(int)); indel1Buffer.usedSpace = indel1Buffer.usedSpace + align1Info.lengthIndel; } *align2RangeStart = align2Info.startRange; *align2RangeWidth = align2Info.widthRange; *align2IndelEnds = align2Info.lengthIndel + align2IndelPrevEnd; if (align2Info.lengthIndel > 0) { if ((indel2Buffer.usedSpace + align2Info.lengthIndel) > indel2Buffer.totalSpace) { indel2Buffer.totalSpace = indel2Buffer.totalSpace + MIN(MAX_BUF_SIZE, alignmentBufferSize + (numberOfStrings - (i+1)) * (alignmentBufferSize/12)); tempIntPtr = (int *) R_alloc((long) indel2Buffer.totalSpace, sizeof(int)); memcpy(tempIntPtr, indel2Buffer.start, indel2Buffer.usedSpace * sizeof(int)); indel2Buffer.start = tempIntPtr; tempIntPtr = (int *) R_alloc((long) indel2Buffer.totalSpace, sizeof(int)); memcpy(tempIntPtr, indel2Buffer.width, indel2Buffer.usedSpace * sizeof(int)); indel2Buffer.width = tempIntPtr; } memcpy(&indel2Buffer.start[indel2Buffer.usedSpace], align2Info.startIndel, align2Info.lengthIndel * sizeof(int)); memcpy(&indel2Buffer.width[indel2Buffer.usedSpace], align2Info.widthIndel, align2Info.lengthIndel * sizeof(int)); indel2Buffer.usedSpace = indel2Buffer.usedSpace + align2Info.lengthIndel; } align1MismatchPrevEnd = *align1MismatchEnds; align2MismatchPrevEnd = *align2MismatchEnds; align1IndelPrevEnd = *align1IndelEnds; align2IndelPrevEnd = *align2IndelEnds; } /* Create the output object */ if (multipleSubjects) { PROTECT(output = NEW_OBJECT(MAKE_CLASS("PairwiseAlignments"))); } else { PROTECT(output = NEW_OBJECT(MAKE_CLASS("PairwiseAlignmentsSingleSubject"))); } /* Set the "pattern" slot */ if (useQualityValue) { PROTECT(alignedPattern = NEW_OBJECT(MAKE_CLASS("QualityAlignedXStringSet"))); } else { PROTECT(alignedPattern = NEW_OBJECT(MAKE_CLASS("AlignedXStringSet"))); } SET_SLOT(alignedPattern, mkChar("unaligned"), pattern); /* Set the "range" sub-slot */ PROTECT(alignedPatternRange = new_IRanges("IRanges", alignedPatternRangeStart, alignedPatternRangeWidth, R_NilValue)); SET_SLOT(alignedPattern, mkChar("range"), alignedPatternRange); /* Set the "mismatch" sub-slot */ PROTECT(alignedPatternMismatch = NEW_OBJECT(MAKE_CLASS("CompressedIntegerList"))); PROTECT(alignedPatternMismatchPartitioning = NEW_OBJECT(MAKE_CLASS("PartitioningByEnd"))); PROTECT(alignedPatternMismatchValues = NEW_INTEGER(mismatchBuffer.usedSpace)); memcpy(INTEGER(alignedPatternMismatchValues), mismatchBuffer.pattern, mismatchBuffer.usedSpace * sizeof(int)); SET_SLOT(alignedPatternMismatchPartitioning, mkChar("end"), alignedPatternMismatchEnds); SET_SLOT(alignedPatternMismatch, mkChar("partitioning"), alignedPatternMismatchPartitioning); SET_SLOT(alignedPatternMismatch, mkChar("unlistData"), alignedPatternMismatchValues); SET_SLOT(alignedPattern, mkChar("mismatch"), alignedPatternMismatch); /* Set the "indel" sub-slot */ PROTECT(alignedPatternIndel = NEW_OBJECT(MAKE_CLASS("CompressedIRangesList"))); PROTECT(alignedPatternIndelPartitioning = NEW_OBJECT(MAKE_CLASS("PartitioningByEnd"))); PROTECT(alignedPatternIndelRangeStart = NEW_INTEGER(indel1Buffer.usedSpace)); PROTECT(alignedPatternIndelRangeWidth = NEW_INTEGER(indel1Buffer.usedSpace)); memcpy(INTEGER(alignedPatternIndelRangeStart), indel1Buffer.start, indel1Buffer.usedSpace * sizeof(int)); memcpy(INTEGER(alignedPatternIndelRangeWidth), indel1Buffer.width, indel1Buffer.usedSpace * sizeof(int)); PROTECT(alignedPatternIndelRange = new_IRanges("IRanges", alignedPatternIndelRangeStart, alignedPatternIndelRangeWidth, R_NilValue)); SET_SLOT(alignedPatternIndelPartitioning, mkChar("end"), alignedPatternIndelEnds); SET_SLOT(alignedPatternIndel, mkChar("partitioning"), alignedPatternIndelPartitioning); SET_SLOT(alignedPatternIndel, mkChar("unlistData"), alignedPatternIndelRange); SET_SLOT(alignedPattern, mkChar("indel"), alignedPatternIndel); SET_SLOT(output, mkChar("pattern"), alignedPattern); /* Set the "subject" slot */ if (useQualityValue) { PROTECT(alignedSubject = NEW_OBJECT(MAKE_CLASS("QualityAlignedXStringSet"))); } else { PROTECT(alignedSubject = NEW_OBJECT(MAKE_CLASS("AlignedXStringSet"))); } SET_SLOT(alignedSubject, mkChar("unaligned"), subject); /* Set the "range" sub-slot */ PROTECT(alignedSubjectRange = new_IRanges("IRanges", alignedSubjectRangeStart, alignedSubjectRangeWidth, R_NilValue)); SET_SLOT(alignedSubject, mkChar("range"), alignedSubjectRange); /* Set the "mismatch" sub-slot */ PROTECT(alignedSubjectMismatch = NEW_OBJECT(MAKE_CLASS("CompressedIntegerList"))); PROTECT(alignedSubjectMismatchPartitioning = NEW_OBJECT(MAKE_CLASS("PartitioningByEnd"))); PROTECT(alignedSubjectMismatchValues = NEW_INTEGER(mismatchBuffer.usedSpace)); memcpy(INTEGER(alignedSubjectMismatchValues), mismatchBuffer.subject, mismatchBuffer.usedSpace * sizeof(int)); SET_SLOT(alignedSubjectMismatchPartitioning, mkChar("end"), alignedSubjectMismatchEnds); SET_SLOT(alignedSubjectMismatch, mkChar("partitioning"), alignedSubjectMismatchPartitioning); SET_SLOT(alignedSubjectMismatch, mkChar("unlistData"), alignedSubjectMismatchValues); SET_SLOT(alignedSubject, mkChar("mismatch"), alignedSubjectMismatch); /* Set the "indel" sub-slot */ PROTECT(alignedSubjectIndel = NEW_OBJECT(MAKE_CLASS("CompressedIRangesList"))); PROTECT(alignedSubjectIndelPartitioning = NEW_OBJECT(MAKE_CLASS("PartitioningByEnd"))); PROTECT(alignedSubjectIndelRangeStart = NEW_INTEGER(indel2Buffer.usedSpace)); PROTECT(alignedSubjectIndelRangeWidth = NEW_INTEGER(indel2Buffer.usedSpace)); memcpy(INTEGER(alignedSubjectIndelRangeStart), indel2Buffer.start, indel2Buffer.usedSpace * sizeof(int)); memcpy(INTEGER(alignedSubjectIndelRangeWidth), indel2Buffer.width, indel2Buffer.usedSpace * sizeof(int)); PROTECT(alignedSubjectIndelRange = new_IRanges("IRanges", alignedSubjectIndelRangeStart, alignedSubjectIndelRangeWidth, R_NilValue)); SET_SLOT(alignedSubjectIndelPartitioning, mkChar("end"), alignedSubjectIndelEnds); SET_SLOT(alignedSubjectIndel, mkChar("partitioning"), alignedSubjectIndelPartitioning); SET_SLOT(alignedSubjectIndel, mkChar("unlistData"), alignedSubjectIndelRange); SET_SLOT(alignedSubject, mkChar("indel"), alignedSubjectIndel); SET_SLOT(output, mkChar("subject"), alignedSubject); /* Set the "score" slot */ SET_SLOT(output, mkChar("score"), alignedScore); /* Set the "type" slot */ SET_SLOT(output, mkChar("type"), type); /* Set the "gapOpening" slot */ SET_SLOT(output, mkChar("gapOpening"), gapOpening); /* Set the "gapExtension" slot */ SET_SLOT(output, mkChar("gapExtension"), gapExtension); /* Output is ready */ UNPROTECT(30); } return output; } /* * INPUTS * 'string': XStringSet object for strings * 'type': type of pairwise alignment * (character vector of length 1; * 'global', 'local', 'overlap') * 'typeCode': type of pairwise alignment * (integer vector of length 1; * 1 = 'global', 2 = 'local', 3 = 'overlap') * 'gapOpening': gap opening cost or penalty * (double vector of length 1) * 'gapExtension': gap extension cost or penalty * (double vector of length 1) * 'useQuality': denotes whether or not to use quality measures * in the optimal pairwise alignment * (logical vector of length 1) * 'substitutionArray': a three-dimensional double array where the first two * dimensions are for substitutions and the * third is for fuzziness of matches * 'substitutionArrayDim': dimension of 'substitutionArray' * (integer vector of length 3) * 'substitutionLookupTable': lookup table for translating XString bytes to * substitution indices * (integer vector) * 'fuzzyMatrix': fuzzy matrix for matches * (double matrix) * 'fuzzyMatrixDim': dimension of 'fuzzyMatrix' * (integer vector of length 2) * 'fuzzyLookupTable': lookup table for translating XString bytes to * fuzzy indices * (integer vector) * * OUTPUT * Return a numeric vector containing the lower triangle of the score matrix. */ SEXP XStringSet_align_distance( SEXP string, SEXP type, SEXP typeCode, SEXP gapOpening, SEXP gapExtension, SEXP useQuality, SEXP substitutionArray, SEXP substitutionArrayDim, SEXP substitutionLookupTable, SEXP fuzzyMatrix, SEXP fuzzyMatrixDim, SEXP fuzzyLookupTable) { int scoreOnlyValue = 1; int useQualityValue = LOGICAL(useQuality)[0]; float gapOpeningValue = REAL(gapOpening)[0]; float gapExtensionValue = REAL(gapExtension)[0]; if (gapOpeningValue == NEGATIVE_INFINITY || gapExtensionValue == NEGATIVE_INFINITY) { gapOpeningValue = 0.0; gapExtensionValue = NEGATIVE_INFINITY; } int localAlignment = (INTEGER(typeCode)[0] == LOCAL_ALIGNMENT); /* Create the alignment info objects */ struct AlignInfo align1Info, align2Info; align1Info.endGap = (INTEGER(typeCode)[0] == GLOBAL_ALIGNMENT); align2Info.endGap = (INTEGER(typeCode)[0] == GLOBAL_ALIGNMENT); int numberOfStrings = _get_XStringSet_length(string); int lengthOfStringQualitySet = 0; SEXP stringQuality = R_NilValue; cachedXStringSet cached_string = _cache_XStringSet(string); cachedXStringSet cached_stringQuality; if (useQualityValue) { stringQuality = GET_SLOT(string, install("quality")); cached_stringQuality = _cache_XStringSet(stringQuality); lengthOfStringQualitySet = _get_XStringSet_length(stringQuality); } SEXP output; int i, j, iQualityElement = 0, jQualityElement = 0; int qualityIncrement = ((lengthOfStringQualitySet < numberOfStrings) ? 0 : 1); /* Create the alignment buffer object */ struct AlignBuffer alignBuffer; int nCharString = 0; for (i = 0; i < numberOfStrings; i++) { nCharString = MAX(nCharString, _get_cachedXStringSet_elt(&cached_string, i).length); } int alignmentBufferSize = nCharString + 1; alignBuffer.currMatrix = (float *) R_alloc((long) 3 * alignmentBufferSize, sizeof(float)); alignBuffer.prevMatrix = (float *) R_alloc((long) 3 * alignmentBufferSize, sizeof(float)); double *score; PROTECT(output = NEW_NUMERIC((numberOfStrings * (numberOfStrings - 1)) / 2)); score = REAL(output); if (!useQualityValue) { for (i = 0; i < numberOfStrings; i++) { R_CheckUserInterrupt(); align1Info.string = _get_cachedXStringSet_elt(&cached_string, i); for (j = i + 1; j < numberOfStrings; j++) { align2Info.string = _get_cachedXStringSet_elt(&cached_string, j); *score = pairwiseAlignment( &align1Info, &align2Info, localAlignment, scoreOnlyValue, gapOpeningValue, gapExtensionValue, useQualityValue, REAL(substitutionArray), INTEGER(substitutionArrayDim), INTEGER(substitutionLookupTable), LENGTH(substitutionLookupTable), INTEGER(fuzzyMatrix), INTEGER(fuzzyMatrixDim), INTEGER(fuzzyLookupTable), LENGTH(fuzzyLookupTable), &alignBuffer); score++; } } } else { for (i = 0; i < numberOfStrings; i++) { R_CheckUserInterrupt(); align1Info.string = _get_cachedXStringSet_elt(&cached_string, i); align1Info.quality = _get_cachedXStringSet_elt(&cached_stringQuality, iQualityElement); jQualityElement = iQualityElement + qualityIncrement; iQualityElement += qualityIncrement; for (j = i + 1; j < numberOfStrings; j++) { align2Info.string = _get_cachedXStringSet_elt(&cached_string, j); align2Info.quality = _get_cachedXStringSet_elt(&cached_stringQuality, jQualityElement); jQualityElement += qualityIncrement; *score = pairwiseAlignment( &align1Info, &align2Info, localAlignment, scoreOnlyValue, gapOpeningValue, gapExtensionValue, useQualityValue, REAL(substitutionArray), INTEGER(substitutionArrayDim), INTEGER(substitutionLookupTable), LENGTH(substitutionLookupTable), INTEGER(fuzzyMatrix), INTEGER(fuzzyMatrixDim), INTEGER(fuzzyLookupTable), LENGTH(fuzzyLookupTable), &alignBuffer); score++; } } } UNPROTECT(1); return output; } Biostrings/src/align_utils.c0000644000126300012640000002667612241047607017551 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" const char* get_qualityless_classname(SEXP object) { const char *classname = get_classname(object); const char *outputClassname; if (strcmp(classname, "QualityScaledBStringSet") == 0) { outputClassname = "BStringSet"; } else if (strcmp(classname, "QualityScaledDNAStringSet") == 0) { outputClassname = "DNAStringSet"; } else if (strcmp(classname, "QualityScaledRNAStringSet") == 0) { outputClassname = "RNAStringSet"; } else { outputClassname = classname; } return outputClassname; } /* * --- .Call ENTRY POINT --- */ SEXP PairwiseAlignments_nmatch(SEXP nchar, SEXP nmismatch, SEXP ninsertion, SEXP ndeletion) { int ans_len, i, *ans_elt; const int *nchar_elt, *nmismatch_elt, *ninsertion_elt, *ndeletion_elt; SEXP ans; ans_len = LENGTH(nchar); PROTECT(ans = NEW_INTEGER(ans_len)); for (i = 0, nchar_elt = INTEGER(nchar), nmismatch_elt = INTEGER(nmismatch), ninsertion_elt = INTEGER(ninsertion), ndeletion_elt = INTEGER(ndeletion), ans_elt = INTEGER(ans); i < ans_len; i++, nchar_elt++, nmismatch_elt++, ninsertion_elt++, ndeletion_elt++, ans_elt++) { *ans_elt = *nchar_elt - *nmismatch_elt - *ninsertion_elt - *ndeletion_elt; } UNPROTECT(1); return ans; } SEXP AlignedXStringSet_nchar(SEXP alignedXStringSet) { SEXP range = GET_SLOT(alignedXStringSet, install("range")); int numberOfAlignments = get_IRanges_length(range); SEXP indel = GET_SLOT(alignedXStringSet, install("indel")); cachedCompressedIRangesList cached_indel = cache_CompressedIRangesList(indel); SEXP output; PROTECT(output = NEW_INTEGER(numberOfAlignments)); int i, j, *outputPtr; const int *rangeWidth; for (i = 0, rangeWidth = INTEGER(get_IRanges_width(range)), outputPtr = INTEGER(output); i < numberOfAlignments; i++, rangeWidth++, outputPtr++) { cachedIRanges indelElement = get_cachedCompressedIRangesList_elt(&cached_indel, i); int numberOfIndels = get_cachedIRanges_length(&indelElement); *outputPtr = *rangeWidth; for (j = 0; j < numberOfIndels; j++) *outputPtr += get_cachedIRanges_elt_width(&indelElement, j); } UNPROTECT(1); return output; } SEXP AlignedXStringSet_align_aligned(SEXP alignedXStringSet, SEXP gapCode) { int i, j, k; char gapCodeValue = (char) RAW(gapCode)[0]; SEXP unaligned = GET_SLOT(alignedXStringSet, install("unaligned")); cachedXStringSet cached_unaligned = _cache_XStringSet(unaligned); SEXP range = GET_SLOT(alignedXStringSet, install("range")); int numberOfAlignments = get_IRanges_length(range); SEXP indel = GET_SLOT(alignedXStringSet, install("indel")); cachedCompressedIRangesList cached_indel = cache_CompressedIRangesList(indel); const char *stringSetClass = get_qualityless_classname(unaligned); const char *stringClass = _get_XStringSet_xsbaseclassname(unaligned); int numberOfStrings = _get_XStringSet_length(unaligned); SEXP output; SEXP alignedRanges, alignedStart, alignedWidth; PROTECT(alignedWidth = AlignedXStringSet_nchar(alignedXStringSet)); PROTECT(alignedStart = NEW_INTEGER(LENGTH(alignedWidth))); int totalNChars = 0; const int *width_i, *start_i; int *start_iPlus1; for (i = 0, width_i = INTEGER(alignedWidth); i < LENGTH(alignedWidth); i++, width_i++) { totalNChars += *width_i; } if (totalNChars > 0) { INTEGER(alignedStart)[0] = 1; for (i = 0, start_i = INTEGER(alignedStart), width_i = INTEGER(alignedWidth), start_iPlus1 = INTEGER(alignedStart) + 1; i < LENGTH(alignedWidth) - 1; i++, start_i++, width_i++, start_iPlus1++) { *start_iPlus1 = *start_i + *width_i; } } SEXP alignedStringTag; PROTECT(alignedStringTag = NEW_RAW(totalNChars)); PROTECT(alignedRanges = new_IRanges("IRanges", alignedStart, alignedWidth, R_NilValue)); char *alignedStringPtr = (char *) RAW(alignedStringTag); PROTECT(output = new_XRawList_from_tag(stringSetClass, stringClass, alignedStringTag, alignedRanges)); int stringIncrement = (numberOfStrings == 1 ? 0 : 1); int index = 0, stringElement = 0; const int *rangeStart, *rangeWidth; for (i = 0, rangeStart = INTEGER(get_IRanges_start(range)), rangeWidth = INTEGER(get_IRanges_width(range)); i < numberOfAlignments; i++, rangeStart++, rangeWidth++) { cachedCharSeq origString = _get_cachedXStringSet_elt(&cached_unaligned, stringElement); char *origStringPtr = (char *) (origString.seq + (*rangeStart - 1)); cachedIRanges indelElement = get_cachedCompressedIRangesList_elt(&cached_indel, i); int numberOfIndel = get_cachedIRanges_length(&indelElement); if (numberOfIndel == 0) { memcpy(&alignedStringPtr[index], origStringPtr, *rangeWidth * sizeof(char)); index += *rangeWidth; } else { int prevStart = 0; for (j = 0; j < numberOfIndel; j++) { int currStart = get_cachedIRanges_elt_start(&indelElement, j) - 1; int currWidth = get_cachedIRanges_elt_width(&indelElement, j); int copyElements = currStart - prevStart; if (copyElements > 0) { memcpy(&alignedStringPtr[index], origStringPtr, copyElements * sizeof(char)); index += copyElements; origStringPtr += copyElements; } for (k = 0; k < currWidth; k++) { alignedStringPtr[index] = gapCodeValue; index++; } prevStart = currStart; } int copyElements = *rangeWidth - prevStart; memcpy(&alignedStringPtr[index], origStringPtr, copyElements * sizeof(char)); index += copyElements; } stringElement += stringIncrement; } UNPROTECT(5); return output; } SEXP PairwiseAlignmentsSingleSubject_align_aligned(SEXP alignment, SEXP gapCode, SEXP endgapCode) { int i, j, k; char gapCodeValue = (char) RAW(gapCode)[0]; char endgapCodeValue = (char) RAW(endgapCode)[0]; SEXP pattern = GET_SLOT(alignment, install("pattern")); SEXP unalignedPattern = GET_SLOT(pattern, install("unaligned")); cachedXStringSet cached_unalignedPattern = _cache_XStringSet(unalignedPattern); SEXP rangePattern = GET_SLOT(pattern, install("range")); SEXP namesPattern = get_IRanges_names(rangePattern); SEXP indelPattern = GET_SLOT(pattern, install("indel")); cachedCompressedIRangesList cached_indelPattern = cache_CompressedIRangesList(indelPattern); SEXP subject = GET_SLOT(alignment, install("subject")); SEXP rangeSubject = GET_SLOT(subject, install("range")); SEXP indelSubject = GET_SLOT(subject, install("indel")); cachedCompressedIRangesList cached_indelSubject = cache_CompressedIRangesList(indelSubject); const char *stringSetClass = get_qualityless_classname(unalignedPattern); const char *stringClass = _get_XStringSet_xsbaseclassname(unalignedPattern); int numberOfAlignments = get_IRanges_length(rangePattern); int numberOfChars = INTEGER(_get_XStringSet_width(GET_SLOT(subject, install("unaligned"))))[0]; SEXP output; SEXP mappedRanges, mappedStart, mappedWidth; PROTECT(mappedWidth = NEW_INTEGER(numberOfAlignments)); PROTECT(mappedStart = NEW_INTEGER(numberOfAlignments)); int totalNChars = numberOfAlignments * numberOfChars; int *width_i, *start_i; if (totalNChars > 0) { for (i = 0, start_i = INTEGER(mappedStart), width_i = INTEGER(mappedWidth); i < numberOfAlignments; i++, start_i++, width_i++) { *start_i = i * numberOfChars + 1; *width_i = numberOfChars; } } SEXP mappedStringTag; PROTECT(mappedStringTag = NEW_RAW(totalNChars)); PROTECT(mappedRanges = new_IRanges("IRanges", mappedStart, mappedWidth, namesPattern)); char *mappedStringPtr = (char *) RAW(mappedStringTag); PROTECT(output = new_XRawList_from_tag(stringSetClass, stringClass, mappedStringTag, mappedRanges)); int index = 0; const int *rangeStartPattern, *rangeWidthPattern, *rangeStartSubject, *rangeWidthSubject; for (i = 0, rangeStartPattern = INTEGER(get_IRanges_start(rangePattern)), rangeWidthPattern = INTEGER(get_IRanges_width(rangePattern)), rangeStartSubject = INTEGER(get_IRanges_start(rangeSubject)), rangeWidthSubject = INTEGER(get_IRanges_width(rangeSubject)); i < numberOfAlignments; i++, rangeStartPattern++, rangeWidthPattern++, rangeStartSubject++, rangeWidthSubject++) { cachedCharSeq origString = _get_cachedXStringSet_elt(&cached_unalignedPattern, i); char *origStringPtr = (char *) (origString.seq + (*rangeStartPattern - 1)); cachedIRanges indelElementPattern = get_cachedCompressedIRangesList_elt(&cached_indelPattern, i); cachedIRanges indelElementSubject = get_cachedCompressedIRangesList_elt(&cached_indelSubject, i); int numberOfIndelPattern = get_cachedIRanges_length(&indelElementPattern); int numberOfIndelSubject = get_cachedIRanges_length(&indelElementSubject); for (j = 0; j < *rangeStartSubject - 1; j++) { mappedStringPtr[index] = endgapCodeValue; index++; } int jPattern = 1, jp = 0, js = 0; int indelStartPattern, indelWidthPattern, indelStartSubject, indelWidthSubject; if (numberOfIndelPattern > 0) { indelStartPattern = get_cachedIRanges_elt_start(&indelElementPattern, jp); indelWidthPattern = get_cachedIRanges_elt_width(&indelElementPattern, jp); } if (numberOfIndelSubject > 0) { indelStartSubject = get_cachedIRanges_elt_start(&indelElementSubject, js); indelWidthSubject = get_cachedIRanges_elt_width(&indelElementSubject, js); } for (j = 1; j <= *rangeWidthSubject; j++) { if ((numberOfIndelSubject == 0) || (j < indelStartSubject)) { if ((numberOfIndelPattern == 0) || (jPattern < indelStartPattern)) { mappedStringPtr[index] = *origStringPtr; index++; origStringPtr++; jPattern++; } else { for (k = 0; k < indelWidthPattern; k++) { mappedStringPtr[index] = gapCodeValue; index++; } j += indelWidthPattern - 1; jp++; indelStartPattern = get_cachedIRanges_elt_start(&indelElementPattern, jp); indelWidthPattern = get_cachedIRanges_elt_width(&indelElementPattern, jp); numberOfIndelPattern--; } } else { origStringPtr += indelWidthSubject; jPattern += indelWidthSubject; j--; js++; indelStartSubject = get_cachedIRanges_elt_start(&indelElementSubject, js); indelWidthSubject = get_cachedIRanges_elt_width(&indelElementSubject, js); numberOfIndelSubject--; } } for (j = *rangeStartSubject + (*rangeWidthSubject - 1); j < numberOfChars; j++) { mappedStringPtr[index] = endgapCodeValue; index++; } } UNPROTECT(5); return(output); } SEXP align_compareStrings(SEXP patternStrings, SEXP subjectStrings, SEXP maxNChar, SEXP insertionCode, SEXP deletionCode, SEXP mismatchCode) { char insertionChar = CHAR(STRING_ELT(insertionCode, 0))[0]; char deletionChar = CHAR(STRING_ELT(deletionCode, 0))[0]; char mismatchChar = CHAR(STRING_ELT(mismatchCode, 0))[0]; int numberOfStrings = LENGTH(patternStrings); char *outputPtr = (char *) R_alloc((long) (INTEGER(maxNChar)[0] + 1), sizeof(char)); SEXP output; PROTECT(output = NEW_CHARACTER(numberOfStrings)); int i, j; char *output_j; const char *subject_j; for (i = 0; i < numberOfStrings; i++) { const char *patternPtr = (char *) CHAR(STRING_ELT(patternStrings, i)); const char *subjectPtr = (char *) CHAR(STRING_ELT(subjectStrings, i)); int numberOfChars = strlen(patternPtr); memcpy(outputPtr, patternPtr, numberOfChars * sizeof(char)); outputPtr[numberOfChars] = '\0'; for (j = 0, output_j = outputPtr, subject_j = subjectPtr; j < numberOfChars; j++, output_j++, subject_j++) { if (*output_j != deletionChar) { if (*subject_j == deletionChar) { *output_j = insertionChar; } else if (*subject_j != *output_j) { *output_j = mismatchChar; } } } SET_STRING_ELT(output, i, mkChar(outputPtr)); } UNPROTECT(1); return(output); } Biostrings/src/find_palindromes.c0000644000126300012640000001035612241047607020540 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include /****************************************************************************/ static int debug = 0; SEXP debug_find_palindromes() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'find_palindromes.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'find_palindromes.c'\n"); #endif return R_NilValue; } /****************************************************************************/ static void naive_palindrome_search(const char *S, int nS, int armlen_min, int looplen_max) { int n1, n2, armlen, looplen, Lpos, Rpos, all_letter0; char letter0; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] naive_palindrome_search(): " "nS=%d armlen_min=%d looplen_max=%d\n", nS, armlen_min, looplen_max); } #endif for (n1 = armlen_min, n2 = 2 * armlen_min; n2 <= nS; n1++, n2++) { for (looplen = 0; looplen <= looplen_max; looplen++) { armlen = 0; Lpos = n1 - 1; Rpos = n1 + looplen; while (0 <= Lpos && Rpos < nS && S[Lpos] == S[Rpos]) { if (looplen == 0) { if (armlen == 0) { letter0 = S[Rpos]; all_letter0 = 1; } else { if (S[Rpos] != letter0) all_letter0 = 0; } } armlen++; Lpos--; Rpos++; } Lpos++; if (looplen == 0 && armlen != 0 && all_letter0) { // The current palindrome is in fact the left part of a region where the // same letter (letter0) is repeated. We move to the right end of this region. while (Rpos < nS && S[Rpos] == letter0) Rpos++; if (Rpos - Lpos < 2 * armlen_min) continue; Rpos--; n1 = Rpos; n2 = Rpos + armlen_min; } else { if (armlen < armlen_min) continue; Rpos--; } _report_match(Lpos + 1, Rpos - Lpos + 1); break; } } return; } static void naive_antipalindrome_search(const char *S, int nS, int armlen_min, int looplen_max, const int *lkup, int lkup_length) { int n1, n2, armlen, looplen, Lpos, Rpos, all_letter0, lkup_key, lkup_val; char letter0; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] naive_antipalindrome_search(): " "nS=%d armlen_min=%d looplen_max=%d\n", nS, armlen_min, looplen_max); } #endif for (n1 = armlen_min, n2 = 2 * armlen_min; n2 <= nS; n1++, n2++) { for (looplen = 0; looplen <= looplen_max; looplen++) { armlen = 0; Lpos = n1 - 1; Rpos = n1 + looplen; while (0 <= Lpos && Rpos < nS) { lkup_key = (unsigned char) S[Lpos]; if (lkup_key >= lkup_length || (lkup_val = lkup[lkup_key]) == NA_INTEGER) { error("key %d not in lookup table", lkup_key); } if (((char) lkup_val) != S[Rpos]) break; if (looplen == 0) { if (armlen == 0) { letter0 = S[Rpos]; // Will be 1 iff S[Rpos] is its own complementary (only // IUPAC letter N and the gap letter - have this property) all_letter0 = S[Lpos] == S[Rpos]; } else { if (S[Rpos] != letter0) all_letter0 = 0; } } armlen++; Lpos--; Rpos++; } Lpos++; if (looplen == 0 && armlen != 0 && all_letter0) { // The current palindrome is in fact the left part of a region where the // same letter (letter0) is repeated. We move to the right end of this region. while (Rpos < nS && S[Rpos] == letter0) Rpos++; if (Rpos - Lpos < 2 * armlen_min) continue; Rpos--; n1 = Rpos; n2 = Rpos + armlen_min; } else { if (armlen < armlen_min) continue; Rpos--; } _report_match(Lpos + 1, Rpos - Lpos + 1); break; } } return; } /* * */ SEXP find_palindromes(SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP min_armlength, SEXP max_looplength, SEXP L2R_lkup) { int subj_offset, subj_length, armlen_min, looplen_max; const Rbyte *subj; subj_offset = INTEGER(s_offset)[0]; subj_length = INTEGER(s_length)[0]; subj = RAW(R_ExternalPtrTag(s_xp)) + subj_offset; armlen_min = INTEGER(min_armlength)[0]; looplen_max = INTEGER(max_looplength)[0]; _init_match_reporting("MATCHES_AS_RANGES", 1); if (L2R_lkup == R_NilValue) naive_palindrome_search((char *) subj, subj_length, armlen_min, looplen_max); else naive_antipalindrome_search((char *) subj, subj_length, armlen_min, looplen_max, INTEGER(L2R_lkup), LENGTH(L2R_lkup)); return _reported_matches_asSEXP(); } Biostrings/src/gtestsim.c0000644000126300012640000001123212241047607017054 0ustar00biocbuildphs_compbio#include #include #include #include /* rcont2 function copy'n'pasted from R/src/library/stats/src/rcont.c */ static void rcont2(int *nrow, int *ncol, /* vectors of row and column totals, and their sum ntotal: */ int *nrowt, int *ncolt, int *ntotal, double *fact, int *jwork, int *matrix) { int j, l, m, ia, ib, ic, jc, id, ie, ii, nll, nlm, nr_1, nc_1; double x, y, dummy, sumprb; Rboolean lsm, lsp; nr_1 = *nrow - 1; nc_1 = *ncol - 1; ib = 0; /* -Wall */ /* Construct random matrix */ for (j = 0; j < nc_1; ++j) jwork[j] = ncolt[j]; jc = *ntotal; for (l = 0; l < nr_1; ++l) { /* ----- matrix[ l, * ] ----- */ ia = nrowt[l]; ic = jc; jc -= ia;/* = n_tot - sum(nr[0:l]) */ for (m = 0; m < nc_1; ++m) { id = jwork[m]; ie = ic; ic -= id; ib = ie - ia; ii = ib - id; if (ie == 0) { /* Row [l,] is full, fill rest with zero entries */ for (j = m; j < nc_1; ++j) matrix[l + j * *nrow] = 0; ia = 0; break; } /* Generate pseudo-random number */ dummy = unif_rand(); do {/* Outer Loop */ /* Compute conditional expected value of MATRIX(L, M) */ nlm = (int)(ia * (id / (double) ie) + 0.5); x = exp(fact[ia] + fact[ib] + fact[ic] + fact[id] - fact[ie] - fact[nlm] - fact[id - nlm] - fact[ia - nlm] - fact[ii + nlm]); if (x >= dummy) break; if (x == 0.)/* MM: I haven't seen this anymore */ error("rcont2 [%d,%d]: exp underflow to 0; algorithm failure", l, m); sumprb = x; y = x; nll = nlm; do { /* Increment entry in row L, column M */ j = (int)((id - nlm) * (double)(ia - nlm)); lsp = (j == 0); if (!lsp) { ++nlm; x = x * j / ((double) nlm * (ii + nlm)); sumprb += x; if (sumprb >= dummy) goto L160; } do { R_CheckUserInterrupt(); /* Decrement entry in row L, column M */ j = (int)(nll * (double)(ii + nll)); lsm = (j == 0); if (!lsm) { --nll; y = y * j / ((double) (id - nll) * (ia - nll)); sumprb += y; if (sumprb >= dummy) { nlm = nll; goto L160; } /* else */ if (!lsp) break;/* to while (!lsp) */ } } while (!lsm); } while (!lsp); dummy = sumprb * unif_rand(); } while (1); L160: matrix[l + m * *nrow] = nlm; ia -= nlm; jwork[m] -= nlm; } matrix[l + nc_1 * *nrow] = ia;/* last column in row l */ } /* Compute entries in last row of MATRIX */ for (m = 0; m < nc_1; ++m) matrix[nr_1 + m * *nrow] = jwork[m]; matrix[nr_1 + nc_1 * *nrow] = ib - matrix[nr_1 + (nc_1-1) * *nrow]; return; } /* Driver routine to call RCONT2 from R, B times. Calculates the log-likelihood ratio for each generated table. Largely a cut'n'paste translation of chisqsim() Append this file to []/R-x.x.x/src/library/ctest/chisqsim.c Pete Hurd - Sept 29 2001 */ void gtestsim(int *nrow, int *ncol, int *nrowt, int *ncolt, int *n, int *b, double *expected, int *observed, double *fact, int *jwork, double *results) { /* Local variables */ int i, j, iter; double g, e, o, x; /* Calculate log-factorials */ x = 0.; fact[0] = 0.; for (i = 1; i <= *n; ++i) { x += log((double) i); fact[i] = x; } GetRNGstate(); for (iter = 0; iter < *b; ++iter) { rcont2(nrow, ncol, nrowt, ncolt, n, fact, jwork, observed); /* Calculate G value from the random table: */ g = 0.; for (i = 0; i < *nrow; ++i) { for (j = 0; j < *ncol; ++j) { e = expected[i + j * *nrow]; o = observed[i + j * *nrow]; if (o!=0) g += o * log(o / e); } } g = 2 * g; results[iter] = g; } PutRNGstate(); return; } Biostrings/src/inject_code.c0000644000126300012640000000212712241047607017466 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" /* * --- .Call ENTRY POINT --- * Return an XString object. */ SEXP XString_inject_code(SEXP x, SEXP start, SEXP width, SEXP code) { const char *x_classname; cachedCharSeq X; int nranges, i, s, w; const int *s_p, *w_p; SEXP tag, ans; x_classname = get_classname(x); X = cache_XRaw(x); nranges = LENGTH(start); /* must be == LENGTH(width) */ PROTECT(tag = NEW_RAW(X.length)); memcpy(RAW(tag), X.seq, X.length); for (i = 0, s_p = INTEGER(start), w_p = INTEGER(width); i < nranges; i++, s_p++, w_p++) { s = *s_p; w = *w_p; if (s == NA_INTEGER || w == NA_INTEGER) error("Biostrings internal error in XString_inject_code():" "NAs in 'start' or 'width' are not supported"); s--; // 0-based start (offset) if (s < 0 || w < 0 || s + w > X.length) error("Biostrings internal error in XString_inject_code():" "invalid start/width values"); memset(RAW(tag) + s, INTEGER(code)[0], w); } PROTECT(ans = new_XRaw_from_tag(x_classname, tag)); UNPROTECT(2); return ans; } Biostrings/src/io_utils.c0000644000126300012640000001200112241047607017037 0ustar00biocbuildphs_compbio/**************************************************************************** * I/O low-level utils * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include /* for isspace() */ #include #include /* for fstat() */ /* Code taken from do_url() in R/src/main/connections.c */ static void get_file_ztype(const char *path, int *ztype, int *subtype) { FILE *fp; char buf[7]; int res; *ztype = -1; *subtype = 0; if ((fp = fopen(path, "rb")) == NULL) return; memset(buf, 0, 7); res = fread(buf, 5, 1, fp); fclose(fp); if (res != 1) return; if (buf[0] == '\x1f' && buf[1] == '\x8b') *ztype = 0; else if (strncmp(buf, "BZh", 3) == 0) *ztype = 1; else if (buf[0] == '\xFD' && strncmp(buf+1, "7zXZ", 4) == 0) *ztype = 2; else if ((buf[0] == '\xFF') && strncmp(buf+1, "LZMA", 4) == 0) { *ztype = 2; *subtype = 1; } else if (memcmp(buf, "]\0\0\200\0", 5) == 0) { *ztype = 2; *subtype = 1; } return; } static FILE *open_file(const char *path, const char *mode) { FILE *fp; int ret; struct stat buf; fp = fopen(path, mode); if (fp == NULL) error("cannot open file '%s'", path); ret = fstat(fileno(fp), &buf); if (ret != 0) { fclose(fp); error("Biostrings internal error in open_input_file(): " "cannot stat file '%s'", path); } if (S_ISDIR(buf.st_mode)) { fclose(fp); error("file '%s' is a directory", path); } return fp; } static FILE *open_input_file(const char *path) { FILE *fp; int ret, ztype, subtype; struct stat buf; get_file_ztype(path, &ztype, &subtype); switch (ztype) { /* No compression */ case -1: fp = open_file(path, "r"); break; /* gzfile */ case 0: error("cannot open file '%s' (gzip-compressed files " "are not supported yet, sorry!)", path); //open the file with gzFile gfp = gzopen(path, "r"); //close it with gzclose(); break; /* bzfile */ case 1: error("cannot open file '%s' (bzip2-compressed files " "are not supported yet, sorry!)", path); //requires #include //open the file with BZFILE* bfp = BZ2_bzReadOpen(...); //close it with BZ2_bzReadClose(); break; /* xzfile */ case 2: error("cannot open file '%s' (LZMA-compressed files " "are not supported yet, sorry!)", path); //requires #include //opening/closing this type of file seems quite complicated break; default: error("Biostrings internal error in open_input_file(): ", "invalid ztype value %d", ztype); } return fp; } /* --- .Call ENTRY POINT --- * Returns an external pointer. * From R: * x <- .Call("new_input_ExternalFilePtr", "path/to/some/file", * PACKAGE="Biostrings") * reg.finalizer(x, * function(e) .Call("ExternalFilePtr_close", e, PACKAGE="Biostrings"), * onexit=TRUE) */ SEXP new_input_ExternalFilePtr(SEXP filepath) { SEXP filepath_elt; const char *expath; FILE *fp; if (!IS_CHARACTER(filepath) || LENGTH(filepath) != 1) error("'filepath' must be a single string"); filepath_elt = STRING_ELT(filepath, 0); if (filepath_elt == NA_STRING) error("'filepath' is NA"); // Maybe do this in R, not here. expath = R_ExpandFileName(translateChar(filepath_elt)); fp = open_input_file(expath); return R_MakeExternalPtr(fp, R_NilValue, R_NilValue); } /* --- .Call ENTRY POINT --- * Returns an external pointer. */ SEXP new_output_ExternalFilePtr(SEXP filepath, SEXP append) { SEXP filepath_elt, ans, string; const char *expath, *mode; FILE *fp; if (!IS_CHARACTER(filepath) || LENGTH(filepath) != 1) error("'filepath' must be a single string"); filepath_elt = STRING_ELT(filepath, 0); if (filepath_elt == NA_STRING) error("'filepath' is NA"); // Maybe do this in R, not here. expath = R_ExpandFileName(translateChar(filepath_elt)); mode = LOGICAL(append)[0] ? "a" : "w"; fp = open_file(expath, mode); PROTECT(ans = R_MakeExternalPtr(fp, R_NilValue, R_NilValue)); PROTECT(string = mkString(expath)); setAttrib(ans, install("expath"), string); UNPROTECT(2); return ans; } /* --- .Call ENTRY POINT --- * Closes the file pointed to by e. */ SEXP ExternalFilePtr_close(SEXP e) { if (R_ExternalPtrAddr(e) != NULL) { //Rprintf("closing file...\n"); fclose(R_ExternalPtrAddr(e)); R_SetExternalPtrAddr(e, NULL); } return R_NilValue; } /**************************************************************************** * Other stuff. */ /* * Doesn't actually delete anything but returns the size the 'buf' char * array would have after deletion of the LF ("\n") or CRLF ("\r\n") chars * located at its end. * If 'size' is -1, then 'buf' must be a C string (i.e. null-terminated). */ int delete_trailing_LF_or_CRLF(const char *buf, int size) { if (size == -1) size = strlen(buf); if (size == 0) return 0; if (buf[--size] != '\n') return ++size; if (size == 0) return 0; if (buf[--size] != '\r') return ++size; return size; } Biostrings/src/letter_frequency.c0000644000126300012640000007664712241047607020622 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static ByteTrTable byte2offset; static SEXP init_numeric_vector(int n, double val, int as_integer) { SEXP ans; int i; if (as_integer) { PROTECT(ans = NEW_INTEGER(n)); for (i = 0; i < n; i++) INTEGER(ans)[i] = (int) val; } else { PROTECT(ans = NEW_NUMERIC(n)); for (i = 0; i < n; i++) REAL(ans)[i] = val; } UNPROTECT(1); return ans; } static SEXP init_numeric_matrix(int nrow, int ncol, double val, int as_integer) { SEXP ans; int i, n; n = nrow * ncol; if (as_integer) { PROTECT(ans = allocMatrix(INTSXP, nrow, ncol)); for (i = 0; i < n; i++) INTEGER(ans)[i] = (int) val; } else { PROTECT(ans = allocMatrix(REALSXP, nrow, ncol)); for (i = 0; i < n; i++) REAL(ans)[i] = val; } UNPROTECT(1); return ans; } static int get_ans_width(SEXP codes, int with_other) { int width, i; if (codes == R_NilValue) { return 256; } _init_byte2offset_with_INTEGER(&byte2offset, codes, 1); width = LENGTH(codes); if (with_other) { for (i = 0; i < BYTETRTABLE_LENGTH; i++) if (byte2offset.byte2code[i] == NA_INTEGER) byte2offset.byte2code[i] = width; width++; } return width; } static void update_letter_freqs(int *row, int nrow, const cachedCharSeq *X, SEXP codes) { int i, offset; const char *c; for (i = 0, c = X->seq; i < X->length; i++, c++) { offset = (unsigned char) *c; if (codes != R_NilValue) { offset = byte2offset.byte2code[offset]; if (offset == NA_INTEGER) continue; } row[offset * nrow]++; } return; } // HJ -- faster version of the above, without 'codes' to consider static void update_letter_freqs_without_codes(int *row, int nrow, const cachedCharSeq *X) { int i, offset; const char *c; int k = X->length; for (i = 0, c = X->seq; i < k; i++, c++) { offset = byte2offset.byte2code[(unsigned char) *c]; if (offset != NA_INTEGER) row[offset * nrow]++; } return; } /* Author: HJ * This function has two modes. On the 1st call (old=-1), we test k letters * starting at c, returning the first in the form of its offset. On subsequent * calls, we copy all the results from the last call, correct for the letter * that has dropped off, compute (and return) the offset for the letter at c, * and test the letter at c+k-1. */ static int letter_freq_in_sliding_view(int *row, const int nrow, const char *c, const int old, const int ncol, const int k) { int i, j, J, offset, rtn; if (old == -1) // initialize 1st row of results for (j = J = 0; j < ncol; j++, J += nrow) row[J] = 0; else // copy results for the last k-mer, // to be corrected (twice) below for (j = J = 0; j < ncol; j++, J += nrow) row[J] = (row - 1)[J]; // look up offset for the first letter and set return offset = byte2offset.byte2code[(unsigned char) *c]; rtn = offset; // on the 1st call, set count for this offset // and prepare to test the next k-1 letters if (old == -1) { if (offset != NA_INTEGER) row[offset * nrow] = 1; i = 1; c++; } else { // fix count for the first letter of the last k-mer, offset = old; if (offset != NA_INTEGER) row[offset * nrow]--; // set up for the last letter of the current one i = k - 1; c += i; } for ( ; i < k; i++, c++) { offset = byte2offset.byte2code[(unsigned char) *c]; if (offset != NA_INTEGER) row[offset * nrow]++; } return rtn; } /* Note that calling update_letter_freqs2() with shift = 0, mat_nrow = 0 and mat_ncol = X->length is equivalent to calling update_letter_freqs() */ static void update_letter_freqs2(int *mat, const cachedCharSeq *X, SEXP codes, int shift, int mat_nrow, int mat_ncol) { int i1, i2, j1, j2, *col, i, offset; const char *c; /* i1, i2 are 0-based indices in X->seq (range i1 <= i < i2 must be safe) */ i1 = 0; i2 = X->length; /* j1, j2 are 0-based column indices in the freqs matrix (range j1 <= j < j2 must be safe) */ j1 = i1 + shift; j2 = i2 + shift; if (j1 < 0) { i1 -= j1; j1 = 0; } if (j2 > mat_ncol) { i2 -= j2 - mat_ncol; /* j2 = mat_ncol; not needed */ } c = X->seq + i1; col = mat + j1 * mat_nrow; for (i = i1; i < i2; i++, c++, col += mat_nrow) { offset = (unsigned char) *c; if (codes != R_NilValue) { offset = byte2offset.byte2code[offset]; if (offset == NA_INTEGER) continue; } col[offset]++; } return; } static void update_int_oligo_freqs(int *mat, int mat_nrow, int width, int step, TwobitEncodingBuffer *teb, const cachedCharSeq *X) { int max_start, start, offset, i; const char *c; max_start = X->length - width; if (step == 1) { _reset_twobit_signature(teb); for (start = 1 - width, c = X->seq; start <= max_start; start++, c++) { offset = _shift_twobit_signature(teb, *c); if (offset != NA_INTEGER) mat[offset * mat_nrow]++; } } else if (step < width) { /* 1 < step < width */ _reset_twobit_signature(teb); for (start = 1 - width, c = X->seq; start <= max_start; start++, c++) { offset = _shift_twobit_signature(teb, *c); if (start % step == 0 && offset != NA_INTEGER) mat[offset * mat_nrow]++; } } else { /* 1 <= width <= step */ for (start = 0; start <= max_start; start += step) { _reset_twobit_signature(teb); for (i = 1, c = X->seq + start; i < width; i++, c++) _shift_twobit_signature(teb, *c); offset = _shift_twobit_signature(teb, *c); if (offset != NA_INTEGER) mat[offset * mat_nrow]++; } } return; } static void update_double_oligo_freqs(double *mat, int mat_nrow, int width, int step, TwobitEncodingBuffer *teb, const cachedCharSeq *X) { int max_start, start, offset, i; const char *c; max_start = X->length - width; if (step == 1) { _reset_twobit_signature(teb); for (start = 1 - width, c = X->seq; start <= max_start; start++, c++) { offset = _shift_twobit_signature(teb, *c); if (offset != NA_INTEGER) mat[offset * mat_nrow] += 1.00; } } else if (step < width) { /* 1 < step < width */ _reset_twobit_signature(teb); for (start = 1 - width, c = X->seq; start <= max_start; start++, c++) { offset = _shift_twobit_signature(teb, *c); if (start % step == 0 && offset != NA_INTEGER) mat[offset * mat_nrow] += 1.00; } } else { /* 1 <= width <= step */ for (start = 0; start <= max_start; start += step) { _reset_twobit_signature(teb); for (i = 1, c = X->seq + start; i < width; i++, c++) _shift_twobit_signature(teb, *c); offset = _shift_twobit_signature(teb, *c); if (offset != NA_INTEGER) mat[offset * mat_nrow] += 1.00; } } return; } static void update_oligo_freqs(SEXP mat, int mat_row, int mat_nrow, int width, int step, TwobitEncodingBuffer *teb, const cachedCharSeq *X) { switch (TYPEOF(mat)) { case INTSXP: update_int_oligo_freqs(INTEGER(mat) + mat_row, mat_nrow, width, step, teb, X); break; case REALSXP: update_double_oligo_freqs(REAL(mat) + mat_row, mat_nrow, width, step, teb, X); break; } return; } static void normalize_oligo_freqs(SEXP mat, int mat_nrow, int mat_ncol) { int i, j; double sum; for (i = 0; i < mat_nrow; i++) { sum = 0.00; for (j = 0; j < mat_ncol; j++) sum += REAL(mat)[i + j * mat_nrow]; if (sum == 0.00) continue; for (j = 0; j < mat_ncol; j++) REAL(mat)[i + j * mat_nrow] /= sum; } return; } static SEXP append_other_to_names(SEXP codes) { SEXP names, name, codes_names; int i; PROTECT(names = NEW_CHARACTER(LENGTH(codes) + 1)); codes_names = GET_NAMES(codes); for (i = 0; i < LENGTH(codes); i++) { if (codes_names == R_NilValue) PROTECT(name = mkChar("")); else PROTECT(name = duplicate(STRING_ELT(codes_names, i))); SET_STRING_ELT(names, i, name); UNPROTECT(1); } SET_STRING_ELT(names, i, mkChar("other")); UNPROTECT(1); return names; } static void set_names(SEXP x, SEXP codes, int with_other, int collapse, int which_names) { SEXP names, codes_names, dim_names; if (codes == R_NilValue) return; if (with_other) { PROTECT(names = append_other_to_names(codes)); } else { codes_names = GET_NAMES(codes); PROTECT(names = duplicate(codes_names)); } if (collapse) { SET_NAMES(x, names); } else { PROTECT(dim_names = NEW_LIST(2)); SET_ELEMENT(dim_names, 1 - which_names, R_NilValue); SET_ELEMENT(dim_names, which_names, names); SET_DIMNAMES(x, dim_names); UNPROTECT(1); } UNPROTECT(1); return; } static void oligo_freqs_as_array(SEXP x, int width, SEXP base_labels) { SEXP dim, dim_names; int i; PROTECT(dim = NEW_INTEGER(width)); for (i = 0; i < width; i++) INTEGER(dim)[i] = 4; SET_DIM(x, dim); UNPROTECT(1); if (base_labels == R_NilValue) return; PROTECT(dim_names = NEW_LIST(width)); for (i = 0; i < width; i++) SET_ELEMENT(dim_names, i, duplicate(base_labels)); SET_DIMNAMES(x, dim_names); UNPROTECT(1); return; } static SEXP mk_all_oligos(int width, SEXP base_letters, int invert_twobit_order) { SEXP ans; int ans_length, i, j, k, twobit_sign; char ans_elt_buf[16]; if (width >= sizeof(ans_elt_buf)) error("mk_all_oligos(): width >= sizeof(ans_elt_buf))"); if (LENGTH(base_letters) != 4) error("mk_all_oligos(): 'base_letters' must be of length 4"); ans_length = 1 << (width * 2); /* 4^width */ /* Disabled since this trick doesn't seem to make any significant difference. if (width != 0) { // This is an attempt to get the memory early and in a more // efficient way than if we let R grow the pool of Vcells // during the construction of the big character string below. // Note that this fake 'ans' must NOT be protected so the // memory can then be claimed and used by the real 'ans'. ans = NEW_INTEGER(ans_length / sizeof(int) * sizeof(char) * (width + 1)); } */ PROTECT(ans = NEW_CHARACTER(ans_length)); ans_elt_buf[width] = 0; for (i = 0; i < ans_length; i++) { twobit_sign = i; if (invert_twobit_order) { for (j = 0; j < width; j++) { k = twobit_sign & 3; ans_elt_buf[j] = CHAR(STRING_ELT(base_letters, k))[0]; twobit_sign >>= 2; } } else { for (j = width - 1; j >= 0; j--) { k = twobit_sign & 3; ans_elt_buf[j] = CHAR(STRING_ELT(base_letters, k))[0]; twobit_sign >>= 2; } } SET_STRING_ELT(ans, i, mkChar(ans_elt_buf)); } UNPROTECT(1); return ans; } static void format_oligo_freqs(SEXP x, int width, SEXP base_labels, int invert_twobit_order, int as_array) { SEXP flat_names; if (as_array) { oligo_freqs_as_array(x, width, base_labels); return; } if (base_labels == R_NilValue) return; PROTECT(flat_names = mk_all_oligos(width, base_labels, invert_twobit_order)); SET_NAMES(x, flat_names); UNPROTECT(1); return; } static void set_oligo_freqs_colnames(SEXP x, int width, SEXP base_labels, int invert_twobit_order) { SEXP flat_names, dim_names; if (base_labels == R_NilValue) return; PROTECT(flat_names = mk_all_oligos(width, base_labels, invert_twobit_order)); PROTECT(dim_names = NEW_LIST(2)); SET_ELEMENT(dim_names, 0, R_NilValue); SET_ELEMENT(dim_names, 1, flat_names); SET_DIMNAMES(x, dim_names); UNPROTECT(2); return; } /**************************************************************************** * --- .Call ENTRY POINTS --- * ****************************************************************************/ SEXP XString_letter_frequency(SEXP x, SEXP codes, SEXP with_other) { SEXP ans; int ans_width; cachedCharSeq X; ans_width = get_ans_width(codes, LOGICAL(with_other)[0]); PROTECT(ans = NEW_INTEGER(ans_width)); memset(INTEGER(ans), 0, LENGTH(ans) * sizeof(int)); X = cache_XRaw(x); update_letter_freqs(INTEGER(ans), 1, &X, codes); set_names(ans, codes, LOGICAL(with_other)[0], 1, 1); UNPROTECT(1); return ans; } SEXP XStringSet_letter_frequency(SEXP x, SEXP collapse, SEXP codes, SEXP with_other) { SEXP ans; int ans_width, x_length, *ans_row, i; cachedXStringSet cached_x; cachedCharSeq x_elt; ans_width = get_ans_width(codes, LOGICAL(with_other)[0]); x_length = _get_XStringSet_length(x); cached_x = _cache_XStringSet(x); if (LOGICAL(collapse)[0]) { PROTECT(ans = NEW_INTEGER(ans_width)); ans_row = INTEGER(ans); memset(ans_row, 0, LENGTH(ans) * sizeof(int)); for (i = 0; i < x_length; i++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); update_letter_freqs(ans_row, 1, &x_elt, codes); } } else { PROTECT(ans = allocMatrix(INTSXP, x_length, ans_width)); ans_row = INTEGER(ans); memset(ans_row, 0, LENGTH(ans) * sizeof(int)); for (i = 0; i < x_length; i++, ans_row++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); update_letter_freqs(ans_row, x_length, &x_elt, codes); } } set_names(ans, codes, LOGICAL(with_other)[0], LOGICAL(collapse)[0], 1); UNPROTECT(1); return ans; } /* Author: HJ * Tests, for the specified codes, the virtual XStringSet formed by "sliding * a window of length k" along a whole XString. * * input: the subject XString, the window size, the letter-code(s) to count, * and a vector indicating how to tabulate each of the actual codes * output: an integer matrix with length(x)-k+1 rows and max(colmap) columns * * The result is identical to what XStringSet_letter_frequency(), without * 'collapse' or 'other', would return, except for the fancy tabulation and * except that the XStringSet never has to be, and is not, realized. * */ SEXP XString_letterFrequencyInSlidingView(SEXP x, SEXP view_width, SEXP single_codes, SEXP colmap, SEXP colnames) { SEXP dim_names, ans; int ans_width, *ans_row, i, k, ans_nrow, *colmap0; int first; /* first letter of the last k-mer, as column offset */ cachedCharSeq X; const char *c; X = cache_XRaw(x); k = INTEGER(view_width)[0]; ans_nrow = X.length - k + 1; if (ans_nrow < 1) error("'x' is too short or 'view.width' is too big"); ans_width = get_ans_width(single_codes, 0); // 'byte2offset.byte2code[code]' is now set for each code // in 'single_codes'. // If 'colmap' is non-NULL, we edit these settings accordingly. if (colmap != R_NilValue) { if (LENGTH(single_codes) != LENGTH(colmap)) error("Biostrings internal error in " "XString_letterFrequencyInSlidingView(): ", "lengths of 'single_codes' and 'colmap' differ"); ans_width = 0; colmap0 = INTEGER(colmap); for (i = 0; i < LENGTH(colmap); i++) { ans_width = colmap0[i]; byte2offset.byte2code[INTEGER(single_codes)[i]] = ans_width - 1; } } PROTECT(ans = allocMatrix(INTSXP, ans_nrow, ans_width)); ans_row = INTEGER(ans); // memset unnecessary -- done in letter_freq_in_sliding_view() for (i = 0, c = X.seq, first = -1; i < ans_nrow; i++, ans_row++, c++) first = letter_freq_in_sliding_view(ans_row, ans_nrow, c, first, ans_width, k); // set names PROTECT(dim_names = NEW_LIST(2)); SET_ELEMENT(dim_names, 0, R_NilValue); SET_ELEMENT(dim_names, 1, colnames); SET_DIMNAMES(ans, dim_names); UNPROTECT(2); return ans; } /* Author: HJ * Like above except that an actual XString*Set* is supplied. The "view * width", as it were, is automatically and implicitly taken as nchar(x). * * input: the subject XStringSet, the letter-code(s) to count, and a vector * indicating how to tabulate each of the actual codes * output: an integer matrix with length(x) rows and max(colmap) columns * * The result is identical to what XStringSet_letter_frequency(), without * 'other', would return, except for the fancy tabulation. */ SEXP XStringSet_letterFrequency(SEXP x, SEXP single_codes, SEXP colmap, SEXP colnames, SEXP collapse) { SEXP dim_names, ans; int ans_width, *ans_row, i, *colmap0; cachedCharSeq x_elt; cachedXStringSet cached_x = _cache_XStringSet(x); int x_length = _get_XStringSet_length(x); ans_width = get_ans_width(single_codes, 0); // 'byte2offset.byte2code[code]' is now set for each code // in 'single_codes'. // If 'colmap' is non-NULL, we edit these settings accordingly. if (colmap != R_NilValue) { if (LENGTH(single_codes) != LENGTH(colmap)) error("Biostrings internal error in " "XStringSet_letterFrequency(): ", "lengths of 'single_codes' and 'colmap' differ"); ans_width = 0; colmap0 = INTEGER(colmap); for (i = 0; i < LENGTH(colmap); i++) { ans_width = colmap0[i]; byte2offset.byte2code[INTEGER(single_codes)[i]] = ans_width - 1; } } if (LOGICAL(collapse)[0]) { PROTECT(ans = NEW_INTEGER(ans_width)); ans_row = INTEGER(ans); memset(ans_row, 0, LENGTH(ans) * sizeof(int)); for (i = 0; i < x_length; i++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); update_letter_freqs_without_codes(ans_row, 1, &x_elt); } } else { PROTECT(ans = allocMatrix(INTSXP, x_length, ans_width)); ans_row = INTEGER(ans); memset(ans_row, 0, LENGTH(ans) * sizeof(int)); for (i = 0; i < x_length; i++, ans_row++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); update_letter_freqs_without_codes(ans_row, x_length, &x_elt); } } // set names if (LOGICAL(collapse)[0]) { SET_NAMES(ans, colnames); } else { PROTECT(dim_names = NEW_LIST(2)); SET_ELEMENT(dim_names, 0, R_NilValue); SET_ELEMENT(dim_names, 1, colnames); SET_DIMNAMES(ans, dim_names); UNPROTECT(1); } UNPROTECT(1); return ans; } SEXP XString_oligo_frequency(SEXP x, SEXP width, SEXP step, SEXP as_prob, SEXP as_array, SEXP fast_moving_side, SEXP with_labels, SEXP base_codes) { SEXP ans, base_labels; TwobitEncodingBuffer teb; int width0, step0, as_integer, as_array0, invert_twobit_order, ans_width; cachedCharSeq X; width0 = INTEGER(width)[0]; step0 = INTEGER(step)[0]; as_integer = !LOGICAL(as_prob)[0]; as_array0 = LOGICAL(as_array)[0]; invert_twobit_order = strcmp(CHAR(STRING_ELT(fast_moving_side, 0)), "right") != 0; teb = _new_TwobitEncodingBuffer(base_codes, width0, invert_twobit_order); base_labels = LOGICAL(with_labels)[0] ? GET_NAMES(base_codes) : R_NilValue; ans_width = 1 << (width0 * 2); /* 4^width0 */ PROTECT(ans = init_numeric_vector(ans_width, 0.00, as_integer)); X = cache_XRaw(x); update_oligo_freqs(ans, 0, 1, width0, step0, &teb, &X); if (!as_integer) normalize_oligo_freqs(ans, 1, ans_width); format_oligo_freqs(ans, width0, base_labels, invert_twobit_order, as_array0); UNPROTECT(1); return ans; } SEXP XStringSet_oligo_frequency(SEXP x, SEXP width, SEXP step, SEXP as_prob, SEXP as_array, SEXP fast_moving_side, SEXP with_labels, SEXP simplify_as, SEXP base_codes) { SEXP ans, base_labels, ans_elt; TwobitEncodingBuffer teb; int width0, step0, as_integer, as_array0, invert_twobit_order, ans_width, x_length, i; const char *simplify_as0; cachedXStringSet cached_x; cachedCharSeq x_elt; width0 = INTEGER(width)[0]; step0 = INTEGER(step)[0]; as_integer = !LOGICAL(as_prob)[0]; as_array0 = LOGICAL(as_array)[0]; invert_twobit_order = strcmp(CHAR(STRING_ELT(fast_moving_side, 0)), "right") != 0; teb = _new_TwobitEncodingBuffer(base_codes, width0, invert_twobit_order); base_labels = LOGICAL(with_labels)[0] ? GET_NAMES(base_codes) : R_NilValue; simplify_as0 = CHAR(STRING_ELT(simplify_as, 0)); ans_width = 1 << (width0 * 2); /* 4^width0 */ x_length = _get_XStringSet_length(x); cached_x = _cache_XStringSet(x); if (strcmp(simplify_as0, "matrix") == 0) { /* the default */ PROTECT(ans = init_numeric_matrix(x_length, ans_width, 0.00, as_integer)); for (i = 0; i < x_length; i++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); update_oligo_freqs(ans, i, x_length, width0, step0, &teb, &x_elt); } if (!as_integer) normalize_oligo_freqs(ans, x_length, ans_width); set_oligo_freqs_colnames(ans, width0, base_labels, invert_twobit_order); UNPROTECT(1); return ans; } if (strcmp(simplify_as0, "collapsed") == 0) { PROTECT(ans = init_numeric_vector(ans_width, 0.00, as_integer)); for (i = 0; i < x_length; i++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); update_oligo_freqs(ans, 0, 1, width0, step0, &teb, &x_elt); } if (!as_integer) normalize_oligo_freqs(ans, 1, ans_width); format_oligo_freqs(ans, width0, base_labels, invert_twobit_order, as_array0); UNPROTECT(1); return ans; } PROTECT(ans = NEW_LIST(x_length)); for (i = 0; i < x_length; i++) { PROTECT(ans_elt = init_numeric_vector(ans_width, 0.00, as_integer)); x_elt = _get_cachedXStringSet_elt(&cached_x, i); update_oligo_freqs(ans_elt, 0, 1, width0, step0, &teb, &x_elt); if (!as_integer) normalize_oligo_freqs(ans_elt, 1, ans_width); format_oligo_freqs(ans_elt, width0, base_labels, invert_twobit_order, as_array0); SET_ELEMENT(ans, i, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } SEXP XStringSet_nucleotide_frequency_at(SEXP x, SEXP at, SEXP as_prob, SEXP as_array, SEXP fast_moving_side, SEXP with_labels, SEXP base_codes) { SEXP ans, base_labels; TwobitEncodingBuffer teb; int as_integer, as_array0, invert_twobit_order, ans_width, x_length, i, offset, print_warning1, print_warning2; cachedXStringSet cached_x; cachedCharSeq x_elt; as_integer = !LOGICAL(as_prob)[0]; as_array0 = LOGICAL(as_array)[0]; invert_twobit_order = strcmp(CHAR(STRING_ELT(fast_moving_side, 0)), "right") != 0; teb = _new_TwobitEncodingBuffer(base_codes, LENGTH(at), invert_twobit_order); base_labels = LOGICAL(with_labels)[0] ? GET_NAMES(base_codes) : R_NilValue; ans_width = 1 << (LENGTH(at) * 2); /* 4^LENGTH(at) */ x_length = _get_XStringSet_length(x); cached_x = _cache_XStringSet(x); PROTECT(ans = init_numeric_vector(ans_width, 0.00, as_integer)); print_warning1 = print_warning2 = TRUE; for (i = 0; i < x_length; i++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); offset = _get_twobit_signature_at(&teb, &x_elt, INTEGER(at), LENGTH(at)); if (offset == -1) { if (print_warning1) warning("'at' contains NAs or \"out of limits\" locations"); print_warning1 = FALSE; continue; } else if (offset == NA_INTEGER) { if (print_warning2) warning("'at' points at non DNA/RNA base letters"); print_warning2 = FALSE; continue; } if (as_integer) INTEGER(ans)[offset]++; else REAL(ans)[offset] += 1.00; } if (!as_integer) normalize_oligo_freqs(ans, 1, ans_width); format_oligo_freqs(ans, LENGTH(at), base_labels, invert_twobit_order, as_array0); UNPROTECT(1); return ans; } SEXP XStringSet_consensus_matrix(SEXP x, SEXP shift, SEXP width, SEXP with_other, SEXP codes) { SEXP ans; int ans_nrow, ans_ncol, ans_length, x_length, i, k, s, x_elt_end; cachedXStringSet cached_x; cachedCharSeq x_elt; ans_nrow = get_ans_width(codes, LOGICAL(with_other)[0]); x_length = _get_XStringSet_length(x); cached_x = _cache_XStringSet(x); if (width == R_NilValue) { if (x_length == 0) error("'x' has no element and 'width' is NULL"); if (LENGTH(shift) == 0) error("'shift' has no element"); ans_ncol = 0; for (i = k = 0; i < x_length; i++, k++) { if (k >= LENGTH(shift)) k = 0; /* recycle */ s = INTEGER(shift)[k]; if (s == NA_INTEGER) error("'shift' contains NAs"); x_elt = _get_cachedXStringSet_elt(&cached_x, i); x_elt_end = x_elt.length + s; if (x_elt_end > ans_ncol) ans_ncol = x_elt_end; } } else { if (x_length != 0 && LENGTH(shift) == 0) error("'shift' has no element"); ans_ncol = INTEGER(width)[0]; } ans_length = ans_nrow * ans_ncol; PROTECT(ans = allocMatrix(INTSXP, ans_nrow, ans_ncol)); memset(INTEGER(ans), 0, ans_length * sizeof(int)); for (i = k = 0; i < x_length; i++, k++) { if (k >= LENGTH(shift)) k = 0; /* recycle */ s = INTEGER(shift)[k]; if (s == NA_INTEGER) error("'shift' contains NAs"); x_elt = _get_cachedXStringSet_elt(&cached_x, i); update_letter_freqs2(INTEGER(ans), &x_elt, codes, s, ans_nrow, ans_ncol); } set_names(ans, codes, LOGICAL(with_other)[0], 0, 0); UNPROTECT(1); return ans; } /**************************************************************************** * --- Two-way Alphabet Frequency --- * ****************************************************************************/ static ByteTrTable xbyte2offset; static ByteTrTable ybyte2offset; static void copy_codes_into(ByteTrTable *dest) { int i; for (i = 0; i < BYTETRTABLE_LENGTH; i++) { dest->byte2code[i] = byte2offset.byte2code[i]; } } static void update_two_way_letter_freqs(int *mat, int ans_nrow, const cachedCharSeq *X, const cachedCharSeq *Y) { int i, x_offset, y_offset; const char *xc, *yc; if (X->length != Y->length) { error("Strings 'x' and 'y' must have the same length"); } for (i = 0, xc = X->seq, yc = Y->seq; i < X->length; i++, xc++, yc++) { x_offset = xbyte2offset.byte2code[(unsigned char) *xc]; y_offset = ybyte2offset.byte2code[(unsigned char) *yc]; if (x_offset != NA_INTEGER && y_offset != NA_INTEGER) { mat[x_offset + y_offset * ans_nrow]++; } } return; } static SEXP get_names_for_codes(SEXP codes, int with_other) { SEXP codes_names; if (codes == R_NilValue) return R_NilValue; codes_names = GET_NAMES(codes); if (codes_names == R_NilValue) return R_NilValue; if (with_other) { return append_other_to_names(codes); } else { return duplicate(codes_names); } } static void set_two_way_names(SEXP x, SEXP x_codes, SEXP y_codes, int with_other, int collapse) { SEXP x_names, y_names, dimnames; PROTECT(x_names = get_names_for_codes(x_codes, with_other)); PROTECT(y_names = get_names_for_codes(y_codes, with_other)); if (collapse) { dimnames = list2(x_names, y_names); } else { dimnames = list3(x_names, y_names, R_NilValue); } SET_DIMNAMES(x, dimnames); UNPROTECT(2); return; } /* Similar to ShortRead:::alphabet_pair_by_cycle(), except we are not interested in per-cycle counts. That function is used by ShortRead to create a two-way table of nucleotide counts and qualities. Tabulating by quality might actually be a good idea, when we have it. Another similar function is Biostrings::mismatchSummary(), which tabulates position X pattern X subject. Again, we are not so interested in the per-position counts, so this would require an additional summarization step. Also, the implementation does not appear to be very efficient. */ /* * --- .Call ENTRY POINT --- */ SEXP XString_two_way_letter_frequency(SEXP x, SEXP y, SEXP x_codes, SEXP y_codes, SEXP with_other) { SEXP ans; int x_width, y_width; cachedCharSeq X, Y; x_width = get_ans_width(x_codes, LOGICAL(with_other)[0]); copy_codes_into(&xbyte2offset); y_width = get_ans_width(y_codes, LOGICAL(with_other)[0]); copy_codes_into(&ybyte2offset); PROTECT(ans = allocMatrix(INTSXP, x_width, y_width)); memset(INTEGER(ans), 0, LENGTH(ans) * sizeof(int)); X = cache_XRaw(x); Y = cache_XRaw(y); update_two_way_letter_freqs(INTEGER(ans), x_width, &X, &Y); set_two_way_names(ans, x_codes, y_codes, LOGICAL(with_other)[0], 1); UNPROTECT(1); return ans; } /* * --- .Call ENTRY POINT --- */ SEXP XStringSet_two_way_letter_frequency(SEXP x, SEXP y, SEXP collapse, SEXP x_codes, SEXP y_codes, SEXP with_other) { SEXP ans, ans_dimnames; int x_width, y_width, x_length, *ans_mat, i, x_pos; cachedXStringSet cached_x, cached_y; cachedCharSeq x_elt, y_elt; Rboolean _collapse = asLogical(collapse); x_width = get_ans_width(x_codes, LOGICAL(with_other)[0]); copy_codes_into(&xbyte2offset); y_width = get_ans_width(y_codes, LOGICAL(with_other)[0]); copy_codes_into(&ybyte2offset); x_length = _get_XStringSet_length(x); if (x_length != _get_XStringSet_length(y)) error("'x' and 'y' must have the same length"); cached_x = _cache_XStringSet(x); cached_y = _cache_XStringSet(y); if (_collapse) { PROTECT(ans = allocMatrix(INTSXP, x_width, y_width)); } else { PROTECT(ans = alloc3DArray(INTSXP, x_width, y_width, x_length)); } ans_mat = INTEGER(ans); memset(ans_mat, 0, LENGTH(ans) * sizeof(int)); for (i = 0; i < x_length; i++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); y_elt = _get_cachedXStringSet_elt(&cached_y, i); update_two_way_letter_freqs(ans_mat, x_width, &x_elt, &y_elt); if (!_collapse) ans_mat += x_width * y_width; } set_two_way_names(ans, x_codes, y_codes, asLogical(with_other), _collapse); UNPROTECT(1); return ans; } static ByteTrTable quality_byte2offset; static void update_two_way_letter_freqs_by_quality(int *mat, int seq_width, const cachedCharSeq *X, const cachedCharSeq *Y, const cachedCharSeq *QX, const cachedCharSeq *QY ) { int i, x_offset, y_offset, qx_offset, qy_offset, min_q_offset; int seq_width_squared = seq_width * seq_width; if (X->length != Y->length) { error("Strings 'x' and 'y' must have the same length"); } if (X->length != QX->length || Y->length != QY->length) { error("Qualities must have the same length as corresponding sequence"); } for (i = 0; i < X->length; i++) { x_offset = byte2offset.byte2code[(unsigned char) X->seq[i]]; y_offset = byte2offset.byte2code[(unsigned char) Y->seq[i]]; qx_offset = quality_byte2offset.byte2code[(unsigned char) QX->seq[i]]; qy_offset = quality_byte2offset.byte2code[(unsigned char) QY->seq[i]]; min_q_offset = qx_offset < qy_offset ? qx_offset : qy_offset; if (x_offset != NA_INTEGER && y_offset != NA_INTEGER) { mat[x_offset + y_offset * seq_width + min_q_offset * seq_width_squared]++; } } return; } /* * --- .Call ENTRY POINT --- */ SEXP XStringSet_two_way_letter_frequency_by_quality(SEXP x, SEXP y, SEXP x_quality, SEXP y_quality, SEXP codes, SEXP quality_codes, SEXP with_other) { SEXP ans; int ans_width, quality_width, x_length, *ans_mat, i; cachedXStringSet cached_x, cached_y, cached_x_quality, cached_y_quality; cachedCharSeq x_elt, y_elt, x_elt_quality, y_elt_quality; ans_width = get_ans_width(codes, asLogical(with_other)); x_length = _get_XStringSet_length(x); if (x_length != _get_XStringSet_length(y) || x_length != _get_XStringSet_length(x_quality) || x_length != _get_XStringSet_length(y_quality)) error("'x', 'y' and qualities must have the same length"); cached_x = _cache_XStringSet(x); cached_y = _cache_XStringSet(y); cached_x_quality = _cache_XStringSet(x_quality); cached_y_quality = _cache_XStringSet(y_quality); _init_byte2offset_with_INTEGER(&quality_byte2offset, quality_codes, 1); quality_width = LENGTH(quality_codes); PROTECT(ans = alloc3DArray(INTSXP, ans_width, ans_width, quality_width)); ans_mat = INTEGER(ans); memset(ans_mat, 0, LENGTH(ans) * sizeof(int)); for (i = 0; i < x_length; i++) { x_elt = _get_cachedXStringSet_elt(&cached_x, i); y_elt = _get_cachedXStringSet_elt(&cached_y, i); x_elt_quality = _get_cachedXStringSet_elt(&cached_x_quality, i); y_elt_quality = _get_cachedXStringSet_elt(&cached_y_quality, i); update_two_way_letter_freqs_by_quality(ans_mat, ans_width, &x_elt, &y_elt, &x_elt_quality, &y_elt_quality); } /* FIXME set_two_way_names(ans, codes, asLogical(with_other), 0); */ SET_VECTOR_ELT(GET_DIMNAMES(ans), 2, GET_NAMES(quality_codes)); UNPROTECT(1); return ans; } Biostrings/src/lowlevel_matching.c0000644000126300012640000005011312241047607020721 0ustar00biocbuildphs_compbio/**************************************************************************** * Low-level matching functions * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static int debug = 0; SEXP debug_lowlevel_matching() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } /**************************************************************************** * 4 predefined global "bytewise match tables". * * fixedP | fixedS | letters 'p' and 's' match iff... * -------------------------------------------------------- * TRUE | TRUE | ...they are equal * TRUE | FALSE | ...bits at 1 in 'p' are also at 1 in 's' * FALSE | TRUE | ...bits at 1 in 's' are also at 1 in 'p' * FALSE | FALSE | ...they share at least one bit at 1 */ static BytewiseOpTable fixedPfixedS_match_table, fixedPnonfixedS_match_table, nonfixedPfixedS_match_table, nonfixedPnonfixedS_match_table; void _init_bytewise_match_tables() { int i, j; unsigned char *val1, *val2, *val3, *val4, x, y; val1 = fixedPfixedS_match_table.xy2val[0]; val2 = fixedPnonfixedS_match_table.xy2val[0]; val3 = nonfixedPfixedS_match_table.xy2val[0]; val4 = nonfixedPnonfixedS_match_table.xy2val[0]; for (i = 0; i < 256; i++) { x = (unsigned char) i; for (j = 0; j < 256; j++) { y = (unsigned char) j; *(val1++) = x == y; *(val2++) = (x & ~y) == 0; *(val3++) = (~x & y) == 0; *(val4++) = (x & y) != 0; } } return; } const BytewiseOpTable *_select_bytewise_match_table(int fixedP, int fixedS) { if (fixedP) { return fixedS ? &fixedPfixedS_match_table : &fixedPnonfixedS_match_table; } return fixedS ? &nonfixedPfixedS_match_table : &nonfixedPnonfixedS_match_table; } /**************************************************************************** * _nmismatch_at_Pshift() * * Stops counting mismatches if their number exceeds 'max_nmis'. The caller * can disable this by passing 'P->length' to the 'max_nmis' arg. */ int _nmismatch_at_Pshift(const cachedCharSeq *P, const cachedCharSeq *S, int Pshift, int max_nmis, const BytewiseOpTable *bytewise_match_table) { int nmis, i, j; const char *p, *s; unsigned char x, y; if (bytewise_match_table == NULL) bytewise_match_table = &fixedPfixedS_match_table; nmis = 0; for (i = 0, j = Pshift, p = P->seq, s = S->seq + Pshift; i < P->length; i++, j++, p++, s++) { x = (unsigned char) *p; y = (unsigned char) *s; if (j >= 0 && j < S->length && bytewise_match_table->xy2val[x][y]) continue; if (nmis++ >= max_nmis) break; } return nmis; } /**************************************************************************** * An edit distance implementation with early bailout. */ /* * TODO: (maybe) replace static alloc of buffers by dynamic alloc. */ #define MAX_NEDIT 100 #define MAX_ROW_LENGTH (2*MAX_NEDIT+1) static int row1_buf[MAX_ROW_LENGTH], row2_buf[MAX_ROW_LENGTH]; #define SWAP_NEDIT_BUFS(prev_row, curr_row) \ { \ int *tmp; \ tmp = (prev_row); \ (prev_row) = (curr_row); \ (curr_row) = tmp; \ } #define PROPAGATE_NEDIT(curr_row, B, prev_row, S, Si, y2val, row_length) \ { \ int nedit, B2, nedit2; \ nedit = (prev_row)[(B)] + ((Si) < 0 || (Si) >= (S)->length || !y2val[(unsigned char) (S)->seq[(Si)]]); \ if ((B2 = (B) - 1) >= 0 && (nedit2 = (curr_row)[B2] + 1) < nedit) \ nedit = nedit2; \ if ((B2 = (B) + 1) < (row_length) && (nedit2 = (prev_row)[B2] + 1) < nedit) \ nedit = nedit2; \ (curr_row)[(B)] = nedit; \ } #ifdef DEBUG_BIOSTRINGS static void print_curr_row(const char* margin, const int *curr_row, int Bmin, int row_length) { int B; Rprintf("[DEBUG] %s: ", margin); for (B = 0; B < row_length; B++) { if (B < Bmin) Rprintf("%3s", ""); else Rprintf("%3d", curr_row[B]); } Rprintf("\n"); return; } #endif /* * P left-offset (Ploffset) is the offset of P's first letter in S. * P right-offset (Proffset) is the offset of P's last letter in S. * The min width (min_width) is the length of the shortest substring S' * of S starting at Ploffset (or ending at Proffset) for which nedit(P, S') * is minimal. * TODO: Implement the 'loose_Ploffset' feature (allowing or not an indel * on the first letter of the local alignement). */ int _nedit_for_Ploffset(const cachedCharSeq *P, const cachedCharSeq *S, int Ploffset, int max_nedit, int loose_Ploffset, int *min_width, const BytewiseOpTable *bytewise_match_table) { int max_nedit_plus1, *prev_row, *curr_row, row_length, a, B, b, min_Si, min_nedit, Pi, Si; // 0-based letter pos in P and S, respectively char Pc; const unsigned char *y2val; #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] _nedit_for_Ploffset():\n"); #endif if (P->length == 0) return 0; if (max_nedit == 0) error("Biostrings internal error in _nedit_for_Ploffset(): " "use _nmismatch_at_Pshift() when 'max_nedit' is 0"); max_nedit_plus1 = max_nedit + 1; if (max_nedit > P->length) max_nedit = P->length; // from now max_nedit <= P->length if (max_nedit > MAX_NEDIT) error("'max.nedit' too big"); if (bytewise_match_table == NULL) bytewise_match_table = &fixedPfixedS_match_table; prev_row = row1_buf; curr_row = row2_buf; row_length = 2 * max_nedit + 1; min_Si = Ploffset; // STAGE 0: for (B = max_nedit, b = 0; B < row_length; B++, b++) curr_row[B] = b; #ifdef DEBUG_BIOSTRINGS if (debug) print_curr_row("STAGE0", curr_row, max_nedit, row_length); #endif // STAGE 1 (1st for() loop): no attempt is made to bailout during // this stage because the smallest value in curr_row is guaranteed // to be <= a < max_nedit. for (a = 1, Pi = 0; a < max_nedit; a++, Pi++) { Pc = P->seq[Pi]; // Pi < a < max_nedit <= P->length y2val = bytewise_match_table->xy2val[(unsigned char) Pc]; SWAP_NEDIT_BUFS(prev_row, curr_row); B = max_nedit - a; curr_row[B++] = a; for (Si = min_Si; B < row_length; B++, Si++) PROPAGATE_NEDIT(curr_row, B, prev_row, S, Si, y2val, row_length); #ifdef DEBUG_BIOSTRINGS if (debug) print_curr_row("STAGE1", curr_row, max_nedit - a, row_length); #endif } // STAGE 2: no attempt is made to bailout during this stage either. Pc = P->seq[Pi]; y2val = bytewise_match_table->xy2val[(unsigned char) Pc]; SWAP_NEDIT_BUFS(prev_row, curr_row); B = 0; curr_row[B++] = min_nedit = a; *min_width = 0; for (Si = min_Si; B < row_length; B++, Si++) { PROPAGATE_NEDIT(curr_row, B, prev_row, S, Si, y2val, row_length); if (curr_row[B] < min_nedit) { min_nedit = curr_row[B]; *min_width = Si - Ploffset + 1; } } #ifdef DEBUG_BIOSTRINGS if (debug) print_curr_row("STAGE2", curr_row, 0, row_length); #endif a++; Pi++; // STAGE 3 (2nd for() loop): with attempt to bailout. for ( ; Pi < P->length; Pi++, a++, min_Si++) { Pc = P->seq[Pi]; y2val = bytewise_match_table->xy2val[(unsigned char) Pc]; SWAP_NEDIT_BUFS(prev_row, curr_row); min_nedit = a; *min_width = 0; for (B = 0, Si = min_Si; B < row_length; B++, Si++) { PROPAGATE_NEDIT(curr_row, B, prev_row, S, Si, y2val, row_length); if (curr_row[B] < min_nedit) { min_nedit = curr_row[B]; *min_width = Si - Ploffset + 1; } } #ifdef DEBUG_BIOSTRINGS if (debug) print_curr_row("STAGE3", curr_row, 0, row_length); #endif // 'min_nedit > max_nedit_plus1' should actually never happen. if (min_nedit >= max_nedit_plus1) break; // bailout } return min_nedit; } int _nedit_for_Proffset(const cachedCharSeq *P, const cachedCharSeq *S, int Proffset, int max_nedit, int loose_Proffset, int *min_width, const BytewiseOpTable *bytewise_match_table) { int max_nedit_plus1, *prev_row, *curr_row, row_length, a, B, b, max_Si, min_nedit, Pi, Si; // 0-based letter pos in P and S, respectively char Pc; const unsigned char *y2val; #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] _nedit_for_Proffset():\n"); #endif if (P->length == 0) return 0; if (max_nedit == 0) error("Biostrings internal error in _nedit_for_Proffset(): " "use _nmismatch_at_Pshift() when 'max_nedit' is 0"); max_nedit_plus1 = max_nedit + 1; if (max_nedit > P->length) max_nedit = P->length; // from now max_nedit <= P->length if (max_nedit > MAX_NEDIT) error("'max.nedit' too big"); if (bytewise_match_table == NULL) bytewise_match_table = &fixedPfixedS_match_table; prev_row = row1_buf; curr_row = row2_buf; row_length = 2 * max_nedit + 1; max_Si = Proffset; min_nedit = 0; // STAGE 0: for (B = max_nedit, b = 0; B < row_length; B++, b++) curr_row[B] = b; #ifdef DEBUG_BIOSTRINGS if (debug) print_curr_row("STAGE0", curr_row, max_nedit, row_length); #endif // STAGE 1 (1st for() loop): no attempt is made to bailout during // this stage because the smallest value in curr_row is guaranteed // to be <= a < max_nedit. for (a = 1, Pi = P->length - 1; a < max_nedit; a++, Pi--) { Pc = P->seq[Pi]; y2val = bytewise_match_table->xy2val[(unsigned char) Pc]; SWAP_NEDIT_BUFS(prev_row, curr_row); B = max_nedit - a; curr_row[B++] = a; for (Si = max_Si; B < row_length; B++, Si--) PROPAGATE_NEDIT(curr_row, B, prev_row, S, Si, y2val, row_length); #ifdef DEBUG_BIOSTRINGS if (debug) print_curr_row("STAGE1", curr_row, max_nedit - a, row_length); #endif } // STAGE 2: no attempt is made to bailout during this stage either. Pc = P->seq[Pi]; y2val = bytewise_match_table->xy2val[(unsigned char) Pc]; SWAP_NEDIT_BUFS(prev_row, curr_row); B = 0; curr_row[B++] = min_nedit = a; *min_width = 0; for (Si = max_Si; B < row_length; B++, Si--) { PROPAGATE_NEDIT(curr_row, B, prev_row, S, Si, y2val, row_length); if (curr_row[B] < min_nedit) { min_nedit = curr_row[B]; *min_width = Proffset - Si + 1; } } #ifdef DEBUG_BIOSTRINGS if (debug) print_curr_row("STAGE2", curr_row, 0, row_length); #endif a++; Pi--; // STAGE 3 (2nd for() loop): with attempt to bailout. for ( ; Pi >= 0; Pi--, a++, max_Si--) { Pc = P->seq[Pi]; y2val = bytewise_match_table->xy2val[(unsigned char) Pc]; SWAP_NEDIT_BUFS(prev_row, curr_row); min_nedit = a; *min_width = 0; for (B = 0, Si = max_Si; B < row_length; B++, Si--) { PROPAGATE_NEDIT(curr_row, B, prev_row, S, Si, y2val, row_length); if (curr_row[B] < min_nedit) { min_nedit = curr_row[B]; *min_width = Proffset - Si + 1; } } #ifdef DEBUG_BIOSTRINGS if (debug) print_curr_row("STAGE3", curr_row, 0, row_length); #endif // 'min_nedit > max_nedit_plus1' should actually never happen. if (min_nedit >= max_nedit_plus1) break; // bailout } return min_nedit; } /**************************************************************************** * nedit_at() */ static int nedit_at(const cachedCharSeq *P, const cachedCharSeq *S, int at, int at_type0, int max_nmis, int with_indels0, int fixedP, int fixedS) { int offset, nmis, min_width; const BytewiseOpTable *bytewise_match_table; bytewise_match_table = _select_bytewise_match_table(fixedP, fixedS); if (!with_indels0 || max_nmis == 0) { if (at_type0 == 0) offset = at - 1; else offset = at - P->length; return _nmismatch_at_Pshift(P, S, offset, max_nmis, bytewise_match_table); } offset = at - 1; if (at_type0 == 0) nmis = _nedit_for_Ploffset(P, S, offset, max_nmis, 1, &min_width, bytewise_match_table); else nmis = _nedit_for_Proffset(P, S, offset, max_nmis, 1, &min_width, bytewise_match_table); return nmis; } /**************************************************************************** * match_pattern_at() */ static void check_mismatch_lengths(int at_length, SEXP max_mismatch, SEXP min_mismatch, int ans_type0) { if ((at_length == 0 && LENGTH(max_mismatch) > 1) || (at_length != 0 && LENGTH(max_mismatch) > at_length)) warning("'max_mismatch' is longer than 'at' " "(remaining elements are ignored)"); if ((at_length == 0 && LENGTH(min_mismatch) > 1) || (at_length != 0 && LENGTH(min_mismatch) > at_length)) warning("'min_mismatch' is longer than 'at' " "(remaining elements are ignored)"); if (at_length == 0) return; if (LENGTH(max_mismatch) == 0) error("'max_mismatch' must have at least 1 element"); if (ans_type0 == 0) return; if (LENGTH(min_mismatch) == 0) error("'min_mismatch' must have at least 1 element"); return; } static void match_pattern_at(const cachedCharSeq *P, const cachedCharSeq *S, SEXP at, int at_type0, SEXP max_mismatch, SEXP min_mismatch, int with_indels0, int fixedP, int fixedS, int ans_type0, int *ans_elt, int auto_reduce_pattern0) { int at_length, i, k1, k2, *at_elt, max_nmis, min_nmis, nmis, is_matching; cachedCharSeq my_p = *P; at_length = LENGTH(at); if (ans_type0 >= 2) *ans_elt = NA_INTEGER; for (i = 1, k1 = k2 = 0, at_elt = INTEGER(at); i <= at_length; i++, k1++, k2++, at_elt++) { if (k1 >= LENGTH(max_mismatch)) k1 = 0; /* recycle */ if (k2 >= LENGTH(min_mismatch)) k2 = 0; /* recycle */ if (*at_elt == NA_INTEGER) { switch (ans_type0) { case 0: *(ans_elt++) = NA_INTEGER; break; case 1: *(ans_elt++) = NA_LOGICAL; break; } continue; } max_nmis = INTEGER(max_mismatch)[k1]; if (max_nmis == NA_INTEGER) max_nmis = my_p.length; nmis = nedit_at(&my_p, S, *at_elt, at_type0, max_nmis, with_indels0, fixedP, fixedS); if (auto_reduce_pattern0 && i < at_length) { if (at_type0 == 0) my_p.seq++; my_p.length--; } if (ans_type0 == 0) { *(ans_elt++) = nmis; continue; } min_nmis = INTEGER(min_mismatch)[k2]; if (min_nmis == NA_INTEGER) min_nmis = 0; is_matching = nmis <= max_nmis && nmis >= min_nmis; if (ans_type0 == 1) { *(ans_elt++) = is_matching; continue; } if (is_matching) { *ans_elt = ans_type0 == 2 ? i : *at_elt; break; } } return; } /**************************************************************************** * --- .Call ENTRY POINTS --- * ****************************************************************************/ /* * XString_match_pattern_at() arguments: * pattern: XString object of same base type as 'subject'. * subject: XString object. * at: the 1-based positions of 'pattern' with respect to 'subject'. * at_type: how to interpret the positions in 'at'. If 0, then they are * those of the first letter of 'pattern'. If 1, then they are * those of its last letter. * max_mismatch, min_mismatch: integer vectors of length >= 1 recycled to * the length of 'at'. If the number of effective mismatches is * <= 'max_mismatch', then it is reported accurately. Otherwise * any number > 'max_mismatch' could be reported. This is to allow * the matching functions used as backends to which * XString_match_pattern_at() delegates to implement early bailout * strategies. * with_indels: TRUE or FALSE. If TRUE, then the "number of mismatches" at * a given position means the smallest edit distance between the * 'pattern' and all the substrings in 'subject' that start (if * 'at_type' is 0) or end (if 'at_type' is 1) at this position. * fixed: a logical of length 2. * ans_type: a single integer specifying the type of answer to return: * 0: ans is an integer vector of the same length as 'at'; * 1: ans is a logical vector of the same length as 'at'; * 2: ans is the lowest *index* (1-based position) in 'at' for which * a match occurred (or NA if no match occurred); * 3: ans is the first *value* in 'at' for which a match occurred * (or NA if no match occurred). * auto_reduce_pattern: a logical scalar passed to match_pattern_at * instructing it whether to reduce the pattern by 1 letter * for each successive (at, max_mismatch) "pair", from its * beginning with at_type 0 and from its end with at_type 1. * Currently, the at vector is always constant of length * nchar(pattern), and furthermore equal to 1 with at_type 0, * i.e. "starting.at=1", and equal to the subject length with * at_type 1, i.e. "ending.at=nchar(subject)". */ SEXP XString_match_pattern_at(SEXP pattern, SEXP subject, SEXP at, SEXP at_type, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP ans_type, SEXP auto_reduce_pattern) { cachedCharSeq P, S; int at_length, at_type0, with_indels0, fixedP, fixedS, ans_type0, *ans_elt; int auto_reduce_pattern0 = LOGICAL(auto_reduce_pattern)[0]; SEXP ans; P = cache_XRaw(pattern); S = cache_XRaw(subject); at_length = LENGTH(at); at_type0 = INTEGER(at_type)[0]; with_indels0 = LOGICAL(with_indels)[0]; fixedP = LOGICAL(fixed)[0]; fixedS = LOGICAL(fixed)[1]; ans_type0 = INTEGER(ans_type)[0]; check_mismatch_lengths(at_length, max_mismatch, min_mismatch, ans_type0); switch (ans_type0) { case 0: PROTECT(ans = NEW_INTEGER(at_length)); ans_elt = INTEGER(ans); break; case 1: PROTECT(ans = NEW_LOGICAL(at_length)); ans_elt = LOGICAL(ans); break; case 2: case 3: PROTECT(ans = NEW_INTEGER(1)); ans_elt = INTEGER(ans); break; default: error("invalid 'ans_type' value (%d)", ans_type0); } match_pattern_at(&P, &S, at, at_type0, max_mismatch, min_mismatch, with_indels0, fixedP, fixedS, ans_type0, ans_elt, auto_reduce_pattern0); UNPROTECT(1); return ans; } /* * XStringSet_vmatch_pattern_at() arguments are the same as for * XString_match_pattern_at() except for: * subject: XStringSet object. */ SEXP XStringSet_vmatch_pattern_at(SEXP pattern, SEXP subject, SEXP at, SEXP at_type, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP ans_type, SEXP auto_reduce_pattern) { cachedCharSeq P, S_elt; cachedXStringSet S; int S_length, at_length, at_type0, with_indels0, fixedP, fixedS, ans_type0, *ans_elt, ans_nrow, i; int auto_reduce_pattern0 = LOGICAL(auto_reduce_pattern)[0]; SEXP ans; P = cache_XRaw(pattern); S = _cache_XStringSet(subject); S_length = _get_cachedXStringSet_length(&S); at_length = LENGTH(at); at_type0 = INTEGER(at_type)[0]; with_indels0 = LOGICAL(with_indels)[0]; fixedP = LOGICAL(fixed)[0]; fixedS = LOGICAL(fixed)[1]; ans_type0 = INTEGER(ans_type)[0]; check_mismatch_lengths(at_length, max_mismatch, min_mismatch, ans_type0); switch (ans_type0) { case 0: PROTECT(ans = allocMatrix(INTSXP, at_length, S_length)); ans_elt = INTEGER(ans); ans_nrow = at_length; break; case 1: PROTECT(ans = allocMatrix(LGLSXP, at_length, S_length)); ans_elt = LOGICAL(ans); ans_nrow = at_length; break; case 2: case 3: PROTECT(ans = NEW_INTEGER(S_length)); ans_elt = INTEGER(ans); ans_nrow = 1; break; default: error("invalid 'ans_type' value (%d)", ans_type0); } for (i = 0; i < S_length; i++, ans_elt += ans_nrow) { S_elt = _get_cachedXStringSet_elt(&S, i); match_pattern_at(&P, &S_elt, at, at_type0, max_mismatch, min_mismatch, with_indels0, fixedP, fixedS, ans_type0, ans_elt, auto_reduce_pattern0); } UNPROTECT(1); return ans; } /* * XStringSet_dist_hamming() used by stringDist, method = "hamming". */ SEXP XStringSet_dist_hamming(SEXP x) { cachedCharSeq x_i, x_j; cachedXStringSet X; int X_length, *ans_elt, i, j, max_nmis; unsigned long ans_length; SEXP ans; X = _cache_XStringSet(x); X_length = _get_cachedXStringSet_length(&X); if (X_length < 2) return NEW_INTEGER(0); x_i = _get_cachedXStringSet_elt(&X, 0); for (j = 1; j < X_length; j++) { x_j = _get_cachedXStringSet_elt(&X, j); if (x_i.length != x_j.length) error("Hamming distance requires equal length strings"); } ans_length = ((unsigned long) X_length) * ((unsigned long) X_length - 1) / 2; if (ans_length > INT_MAX) error("result would be too big an object"); PROTECT(ans = NEW_INTEGER((int) ans_length)); ans_elt = INTEGER(ans); max_nmis = _get_cachedXStringSet_elt(&X, 0).length; for (i = 0; i < (X_length - 1); i++) { x_i = _get_cachedXStringSet_elt(&X, i); for (j = (i+1); j < X_length; j++, ans_elt++) { x_j = _get_cachedXStringSet_elt(&X, j); *ans_elt = nedit_at(&x_i, &x_j, 1, 0, max_nmis, 0, 1, 1); } } UNPROTECT(1); return ans; } Biostrings/src/match_BOC.c0000644000126300012640000003325112241047607017001 0ustar00biocbuildphs_compbio/**************************************************************************** * Base Occurrence Count algorithm for exact and inexact matching * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include /* for Salloc() */ #include #include /****************************************************************************/ static int debug = 0; SEXP debug_match_BOC() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'match_BOC.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'match_BOC.c'\n"); #endif return R_NilValue; } static char get_pre4(const char *s, char c1, char c2, char c3, char c4) { char pre4, c, twobit_code; int i; pre4 = 0; for (i = 0; i < 4; i++, s++) { c = *s; if (c == c1) twobit_code = 0; else if (c == c2) twobit_code = 1; else if (c == c3) twobit_code = 2; else twobit_code = 3; pre4 <<= 2; pre4 += twobit_code; } return pre4; } /**************************************************************************** * Initialization of the BOC_SubjectString object * ============================================== * - nP is assumed to be >= 1 and <= min(254, nS). * - The 3 buffers are assumed to be long enough for the preprocessing i.e. to * have a length >= nS - nP + 1. * - The 4 tables are of length nP + 1. */ static void BOC_preprocess(const char *S, int nS, int nP, char c1, char c2, char c3, char c4, char *buf1, char *buf2, char *buf3, char *pre4buf, double *means, int *table1, int *table2, int *table3, int *table4) { int c1_oc, c2_oc, c3_oc, n1, n2, last_nonbase_pos, total, i, partsum1, partsum2, partsum3; char c; /* Rprintf("nS=%d nP=%d c1=%d c2=%d c3=%d c4=%d\n", nS, nP, c1, c2, c3, c4); */ for (i = 0; i <= nP; i++) table1[i] = table2[i] = table3[i] = table4[i] = 0; c1_oc = c2_oc = c3_oc = total = i = partsum1 = partsum2 = partsum3 = 0; last_nonbase_pos = -1; means[0] = means[1] = means[2] = 0.0; for (n1 = -nP + 1, n2 = 0; n2 < nS; n1++, n2++) { c = S[n2]; if (c == c1) c1_oc++; else if (c == c2) c2_oc++; else if (c == c3) c3_oc++; else if (c != c4) { last_nonbase_pos = n2; c1_oc = c2_oc = c3_oc = 0; } if (n1 < 0) continue; if (n1 <= last_nonbase_pos) { buf1[n1] = buf2[n1] = buf3[n1] = 255; continue; } if (n1 >= 1) { c = S[n1 - 1]; if (c == c1) c1_oc--; else if (c == c2) c2_oc--; else if (c == c3) c3_oc--; } total++; partsum1 += buf1[n1] = c1_oc; partsum2 += buf2[n1] = c2_oc; partsum3 += buf3[n1] = c3_oc; pre4buf[n1] = get_pre4(S + n1, c1, c2, c3, c4); table1[c1_oc]++; table2[c2_oc]++; table3[c3_oc]++; table4[nP - c1_oc - c2_oc - c3_oc]++; if (i++ < 5000000) continue; i = 0; means[0] += partsum1; means[1] += partsum2; means[2] += partsum3; partsum1 = partsum2 = partsum3 = 0; } means[0] += partsum1; means[1] += partsum2; means[2] += partsum3; means[0] /= total; means[1] /= total; means[2] /= total; means[3] = nP - means[0] - means[1] - means[2]; return; } /**************************************************************************** * An implementation of the "BOC" algo for exact matching * ====================================================== */ /* 'order' and 'x' must be int arrays of length 3 */ static void order3(int *order, const int *x) { if (x[1] < x[0]) { if (x[2] < x[0]) { order[2] = 0; if (x[1] < x[2]) { order[0] = 1; order[1] = 2; } else { order[0] = 2; order[1] = 1; } } else { order[0] = 1; order[1] = 0; order[2] = 2; } } else { if (x[2] < x[1]) { order[2] = 1; if (x[0] < x[2]) { order[0] = 0; order[1] = 2; } else { order[0] = 2; order[1] = 0; } } else { order[0] = 0; order[1] = 1; order[2] = 2; } } return; } static int switch_oc(int i, int c1_oc, int c2_oc, int c3_oc, int c4_oc) { switch (i) { case 0: return c1_oc; case 1: return c2_oc; case 2: return c3_oc; } return c4_oc; } static const char *switch_buf(int i, const char *buf1, const char *buf2, const char *buf3, const char *buf4) { switch (i) { case 0: return buf1; case 1: return buf2; case 2: return buf3; } return buf4; } static void order_bases(char *p_ocX, char *p_ocY, char *p_ocZ, const char **p_bufX, const char **p_bufY, const char **p_bufZ, int c1_oc, int c2_oc, int c3_oc, const char *buf1, const char *buf2, const char *buf3, int *nmers) { int order[3]; order3(order, nmers); // To turn off reordering, uncomment the following 3 lines /* order[0] = 0; order[1] = 1; order[2] = 2; */ #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] order_bases: order[0]=%d order[1]=%d order[2]=%d\n", order[0], order[1], order[2]); #endif *p_ocX = (char) switch_oc(order[0], c1_oc, c2_oc, c3_oc, -1); *p_ocY = (char) switch_oc(order[1], c1_oc, c2_oc, c3_oc, -1); *p_ocZ = (char) switch_oc(order[2], c1_oc, c2_oc, c3_oc, -1); *p_bufX = switch_buf(order[0], buf1, buf2, buf3, NULL); *p_bufY = switch_buf(order[1], buf1, buf2, buf3, NULL); *p_bufZ = switch_buf(order[2], buf1, buf2, buf3, NULL); return; } static int split4_offsets(char codes[4], int *offsets[4], int noffsets[4], const char *P, int nP) { int tmp_codes[4], *tmp_offsets[4], tmp_noffsets[4], order[4], i, offset, ii, j; char c; for (i = 0; i < 4; i++) noffsets[i] = 0; for (offset = 0; offset < nP; offset++) { c = P[offset]; for (i = 0; i < 4; i++) { if (c != codes[i]) continue; offsets[i][noffsets[i]++] = offset; goto continue0; } return 1; continue0: ; } order3(order, noffsets); for (i = 3; i >= 1; i--) { if (noffsets[3] >= noffsets[order[i-1]]) break; order[i] = order[i-1]; } order[i] = 3; // Would be neat to perform in-place reordering. Something like this: // http://www.priorartdatabase.com/IPCOM/000104324/ for (i = 0; i < 4; i++) { tmp_codes[i] = codes[i]; tmp_offsets[i] = offsets[i]; tmp_noffsets[i] = noffsets[i]; } for (i = 0; i < 4; i++) { ii = order[i]; codes[i] = tmp_codes[ii]; offsets[i] = tmp_offsets[ii]; noffsets[i] = tmp_noffsets[ii]; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] split4_offsets: codes[%d]=%d\n", i, codes[i]); Rprintf("[DEBUG] split4_offsets: noffsets[%d]=%d\n", i, noffsets[i]); Rprintf("[DEBUG] split4_offsets: offsets[%d]=", i); for (j = 0; j < noffsets[i]; j++) Rprintf(" %d", offsets[i][j]); Rprintf("\n"); } #endif } return 0; } static void BOC_exact_search(const char *P, int nP, const char *S, int nS, char c1, char c2, char c3, char c4, const char *buf1, const char *buf2, const char *buf3, const char *pre4buf, const double *means, const int *table1, const int *table2, const int *table3, const int *table4) { int n1, n1max, n2, c1_oc, c2_oc, c3_oc, nmers[3], nPsuf4, *Psuf4_offsets[4], Psuf4_noffsets[4], i, j, *offsets, noffsets; char c, ocX, ocY, ocZ, Ppre4, codes[4]; const char *bufX, *bufY, *bufZ, *Psuf4, *Ssuf4; #ifdef DEBUG_BIOSTRINGS int count_preapprovals = 0; #endif c1_oc = c2_oc = c3_oc = 0; for (n2 = 0; n2 < nP; n2++) { c = P[n2]; if (c == c1) c1_oc++; else if (c == c2) c2_oc++; else if (c == c3) c3_oc++; else if (c != c4) error("'pattern' contains non-base DNA letters"); } #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] pattern: c1_oc=%d c2_oc=%d c3_oc=%d\n", c1_oc, c2_oc, c3_oc); #endif nmers[0] = table1[c1_oc]; nmers[1] = table2[c2_oc]; nmers[2] = table3[c3_oc]; order_bases(&ocX, &ocY, &ocZ, &bufX, &bufY, &bufZ, c1_oc, c2_oc, c3_oc, buf1, buf2, buf3, nmers); Ppre4 = get_pre4(P, c1, c2, c3, c4); Psuf4 = P + 4; nPsuf4 = nP - 4; codes[0] = c1; codes[1] = c2; codes[2] = c3; codes[3] = c4; for (i = 0; i < 4; i++) Psuf4_offsets[i] = Salloc((long) nP, int); split4_offsets(codes, Psuf4_offsets, Psuf4_noffsets, Psuf4, nPsuf4); n1max = nS - nP; for (n1 = 0, Ssuf4 = S + 4; n1 <= n1max; n1++, Ssuf4++, pre4buf++, bufX++, bufY++, bufZ++) { if (Ppre4 != *pre4buf) continue; if (ocX != *bufX) continue; if (ocY != *bufY) continue; if (ocZ != *bufZ) continue; #ifdef DEBUG_BIOSTRINGS count_preapprovals++; #endif if (memcmp(Psuf4, Ssuf4, nPsuf4) != 0) continue; // same as goto continue0; /* // Uncomment the 2 lines above if you want to use the fancy // comparison method below. for (i = 0; i < 3; i++) { c = codes[i]; offsets = Psuf4_offsets[i]; noffsets = Psuf4_noffsets[i]; for (j = 0; j < noffsets; j++) if (c != Ssuf4[offsets[j]]) goto continue0; } */ _report_match(n1 + 1, nP); continue0: ; } #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] count_preapprovals=%d\n", count_preapprovals); #endif return; } /**************************************************************************** * .Call entry point: "match_BOC_preprocess" * * Arguments: * 's_xp': subject@shared@xp * 's_offset': subject@offset * 's_length': subject@length * 'p_length': pattern_length * 'code1': base1_code * 'code2': base2_code * 'code3': base3_code * 'code4': base4_code * 'buf1_xp': base1_OCbuffer@xp * 'buf2_xp': base2_OCbuffer@xp * 'buf3_xp': base3_OCbuffer@xp * 'pre4buf_xp': pre4buffer@xp * * Return an R list with the following elements: * - means: atomic vector of 4 doubles * - table1, table2, table3, table4: atomic vectors of (p_length + 1) integers * ****************************************************************************/ SEXP match_BOC_preprocess(SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP p_length, SEXP code1, SEXP code2, SEXP code3, SEXP code4, SEXP buf1_xp, SEXP buf2_xp, SEXP buf3_xp, SEXP pre4buf_xp) { int subj_offset, subj_length, pat_length, c1, c2, c3, c4; const Rbyte *subj; SEXP buf1, buf2, buf3, pre4buf, ans, ans_names, ans_elt; subj_offset = INTEGER(s_offset)[0]; subj_length = INTEGER(s_length)[0]; subj = RAW(R_ExternalPtrTag(s_xp)) + subj_offset; pat_length = INTEGER(p_length)[0]; c1 = INTEGER(code1)[0]; c2 = INTEGER(code2)[0]; c3 = INTEGER(code3)[0]; c4 = INTEGER(code4)[0]; buf1 = R_ExternalPtrTag(buf1_xp); buf2 = R_ExternalPtrTag(buf2_xp); buf3 = R_ExternalPtrTag(buf3_xp); pre4buf = R_ExternalPtrTag(pre4buf_xp); PROTECT(ans = NEW_LIST(5)); /* set the names */ PROTECT(ans_names = NEW_CHARACTER(5)); SET_STRING_ELT(ans_names, 0, mkChar("means")); SET_STRING_ELT(ans_names, 1, mkChar("table1")); SET_STRING_ELT(ans_names, 2, mkChar("table2")); SET_STRING_ELT(ans_names, 3, mkChar("table3")); SET_STRING_ELT(ans_names, 4, mkChar("table4")); SET_NAMES(ans, ans_names); UNPROTECT(1); /* set the "means" element */ PROTECT(ans_elt = NEW_NUMERIC(4)); SET_ELEMENT(ans, 0, ans_elt); UNPROTECT(1); /* set the "table1" element */ PROTECT(ans_elt = NEW_INTEGER(pat_length + 1)); SET_ELEMENT(ans, 1, ans_elt); UNPROTECT(1); /* set the "table2" element */ PROTECT(ans_elt = NEW_INTEGER(pat_length + 1)); SET_ELEMENT(ans, 2, ans_elt); UNPROTECT(1); /* set the "table3" element */ PROTECT(ans_elt = NEW_INTEGER(pat_length + 1)); SET_ELEMENT(ans, 3, ans_elt); UNPROTECT(1); /* set the "table4" element */ PROTECT(ans_elt = NEW_INTEGER(pat_length + 1)); SET_ELEMENT(ans, 4, ans_elt); UNPROTECT(1); BOC_preprocess((char *) subj, subj_length, pat_length, (char) c1, (char) c2, (char) c3, (char) c4, (char *) RAW(buf1), (char *) RAW(buf2), (char *) RAW(buf3), (char *) RAW(pre4buf), REAL(VECTOR_ELT(ans, 0)), INTEGER(VECTOR_ELT(ans, 1)), INTEGER(VECTOR_ELT(ans, 2)), INTEGER(VECTOR_ELT(ans, 3)), INTEGER(VECTOR_ELT(ans, 4))); UNPROTECT(1); return ans; } /**************************************************************************** * .Call entry point: "match_BOC_exact" * * Arguments: * 'p_xp': pattern@shared@xp * 'p_offset': pattern@offset * 'p_length': pattern@length * 's_xp': boc_subject@subject@shared@xp * 's_offset': boc_subject@subject@offset * 's_length': boc_subject@subject@length * 'code1': boc_subject@base1_code * 'code2': boc_subject@base2_code * 'code3': boc_subject@base3_code * 'code4': boc_subject@base4_code * 'buf1_xp': boc_subject@base1_OCbuffer@xp * 'buf2_xp': boc_subject@base2_OCbuffer@xp * 'buf3_xp': boc_subject@base3_OCbuffer@xp * 'pre4buf_xp': boc_subject@pre4buffer@xp * 'stats': boc_subject@stats * 'count_only': single logical * ****************************************************************************/ SEXP match_BOC_exact(SEXP p_xp, SEXP p_offset, SEXP p_length, SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP code1, SEXP code2, SEXP code3, SEXP code4, SEXP buf1_xp, SEXP buf2_xp, SEXP buf3_xp, SEXP pre4buf_xp, SEXP stats, SEXP count_only) { int pat_offset, pat_length, subj_offset, subj_length, c1, c2, c3, c4, is_count_only; const Rbyte *pat, *subj; SEXP buf1, buf2, buf3, pre4buf; pat_offset = INTEGER(p_offset)[0]; pat_length = INTEGER(p_length)[0]; pat = RAW(R_ExternalPtrTag(p_xp)) + pat_offset; subj_offset = INTEGER(s_offset)[0]; subj_length = INTEGER(s_length)[0]; subj = RAW(R_ExternalPtrTag(s_xp)) + subj_offset; c1 = INTEGER(code1)[0]; c2 = INTEGER(code2)[0]; c3 = INTEGER(code3)[0]; c4 = INTEGER(code4)[0]; buf1 = R_ExternalPtrTag(buf1_xp); buf2 = R_ExternalPtrTag(buf2_xp); buf3 = R_ExternalPtrTag(buf3_xp); pre4buf = R_ExternalPtrTag(pre4buf_xp); is_count_only = LOGICAL(count_only)[0]; _init_match_reporting(is_count_only ? "MATCHES_AS_COUNTS" : "MATCHES_AS_RANGES", 1); BOC_exact_search( (char *) pat, pat_length, (char *) subj, subj_length, (char) c1, (char) c2, (char) c3, (char) c4, (char *) RAW(buf1), (char *) RAW(buf2), (char *) RAW(buf3), (char *) RAW(pre4buf), REAL(VECTOR_ELT(stats, 0)), INTEGER(VECTOR_ELT(stats, 1)), INTEGER(VECTOR_ELT(stats, 2)), INTEGER(VECTOR_ELT(stats, 3)), INTEGER(VECTOR_ELT(stats, 4))); return _reported_matches_asSEXP(); } Biostrings/src/match_BOC2.c0000644000126300012640000002742512241047607017071 0ustar00biocbuildphs_compbio/**************************************************************************** * Version 2 * * of the * * Base Occurrence Count algorithm for exact and inexact matching * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include /* for Salloc() */ #include #include /****************************************************************************/ static int debug = 0; SEXP debug_match_BOC2() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'match_BOC2.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'match_BOC2.c'\n"); #endif return R_NilValue; } static int make_32bit_signature(int c1_oc, int c2_oc, int c3_oc, char pre4) { int signature = 0; signature += c1_oc; signature <<= 8; signature += c2_oc; signature <<= 8; signature += c3_oc; signature <<= 8; signature += (unsigned char) pre4; return signature; } static char make_pre4(const char *s, char c1, char c2, char c3, char c4) { char pre4, c, twobit_code; int i; pre4 = 0; for (i = 0; i < 4; i++, s++) { c = *s; if (c == c1) twobit_code = 0; else if (c == c2) twobit_code = 1; else if (c == c3) twobit_code = 2; else twobit_code = 3; pre4 <<= 2; pre4 += twobit_code; } return pre4; } /**************************************************************************** * Initialization of the BOC2_SubjectString object * =============================================== * - nP is assumed to be >= 1 and <= min(254, nS). * - The buffer is assumed to be long enough for the preprocessing i.e. to * have a length >= nS - nP + 1. * - The 4 tables are of length nP + 1. */ static void BOC2_preprocess(const char *S, int nS, int nP, char c1, char c2, char c3, char c4, int *buf, double *means, int *table1, int *table2, int *table3, int *table4) { int c1_oc, c2_oc, c3_oc, n1, n2, last_nonbase_pos, total, i, partsum1, partsum2, partsum3; char c, pre4; /* Rprintf("nS=%d nP=%d c1=%d c2=%d c3=%d c4=%d\n", nS, nP, c1, c2, c3, c4); */ for (i = 0; i <= nP; i++) table1[i] = table2[i] = table3[i] = table4[i] = 0; c1_oc = c2_oc = c3_oc = total = i = partsum1 = partsum2 = partsum3 = 0; last_nonbase_pos = -1; means[0] = means[1] = means[2] = 0.0; for (n1 = -nP + 1, n2 = 0; n2 < nS; n1++, n2++) { c = S[n2]; if (c == c1) c1_oc++; else if (c == c2) c2_oc++; else if (c == c3) c3_oc++; else if (c != c4) { last_nonbase_pos = n2; c1_oc = c2_oc = c3_oc = 0; } if (n1 < 0) continue; if (n1 <= last_nonbase_pos) { buf[n1] = make_32bit_signature(255, 255, 255, 0); continue; } if (n1 >= 1) { c = S[n1 - 1]; if (c == c1) c1_oc--; else if (c == c2) c2_oc--; else if (c == c3) c3_oc--; } total++; pre4 = make_pre4(S + n1, c1, c2, c3, c4); buf[n1] = make_32bit_signature(c1_oc, c2_oc, c3_oc, pre4); partsum1 += c1_oc; partsum2 += c2_oc; partsum3 += c3_oc; table1[c1_oc]++; table2[c2_oc]++; table3[c3_oc]++; table4[nP - c1_oc - c2_oc - c3_oc]++; if (i++ < 5000000) continue; i = 0; means[0] += partsum1; means[1] += partsum2; means[2] += partsum3; partsum1 = partsum2 = partsum3 = 0; } means[0] += partsum1; means[1] += partsum2; means[2] += partsum3; means[0] /= total; means[1] /= total; means[2] /= total; means[3] = nP - means[0] - means[1] - means[2]; return; } /**************************************************************************** * An implementation of the "BOC2" algo for exact matching * ====================================================== */ /* 'order' and 'x' must be int arrays of length 3 */ static void order3(int *order, const int *x) { if (x[1] < x[0]) { if (x[2] < x[0]) { order[2] = 0; if (x[1] < x[2]) { order[0] = 1; order[1] = 2; } else { order[0] = 2; order[1] = 1; } } else { order[0] = 1; order[1] = 0; order[2] = 2; } } else { if (x[2] < x[1]) { order[2] = 1; if (x[0] < x[2]) { order[0] = 0; order[1] = 2; } else { order[0] = 2; order[1] = 0; } } else { order[0] = 0; order[1] = 1; order[2] = 2; } } return; } static int split4_offsets(char codes[4], int *offsets[4], int noffsets[4], const char *P, int nP) { int tmp_codes[4], *tmp_offsets[4], tmp_noffsets[4], order[4], i, offset, ii, j; char c; for (i = 0; i < 4; i++) noffsets[i] = 0; for (offset = 0; offset < nP; offset++) { c = P[offset]; for (i = 0; i < 4; i++) { if (c != codes[i]) continue; offsets[i][noffsets[i]++] = offset; goto continue0; } return 1; continue0: ; } order3(order, noffsets); for (i = 3; i >= 1; i--) { if (noffsets[3] >= noffsets[order[i-1]]) break; order[i] = order[i-1]; } order[i] = 3; // Would be neat to perform in-place reordering. Something like this: // http://www.priorartdatabase.com/IPCOM/000104324/ for (i = 0; i < 4; i++) { tmp_codes[i] = codes[i]; tmp_offsets[i] = offsets[i]; tmp_noffsets[i] = noffsets[i]; } for (i = 0; i < 4; i++) { ii = order[i]; codes[i] = tmp_codes[ii]; offsets[i] = tmp_offsets[ii]; noffsets[i] = tmp_noffsets[ii]; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] split4_offsets: codes[%d]=%d\n", i, codes[i]); Rprintf("[DEBUG] split4_offsets: noffsets[%d]=%d\n", i, noffsets[i]); Rprintf("[DEBUG] split4_offsets: offsets[%d]=", i); for (j = 0; j < noffsets[i]; j++) Rprintf(" %d", offsets[i][j]); Rprintf("\n"); } #endif } return 0; } static void BOC2_exact_search(const char *P, int nP, const char *S, int nS, char c1, char c2, char c3, char c4, const int *buf, const double *means, const int *table1, const int *table2, const int *table3, const int *table4) { int n1, n1max, n2, c1_oc, c2_oc, c3_oc, Psignature, nPsuf4, *Psuf4_offsets[4], Psuf4_noffsets[4], i, j, *offsets, noffsets; char c, Ppre4, codes[4]; const char *Psuf4, *Ssuf4; #ifdef DEBUG_BIOSTRINGS int count_preapprovals = 0; #endif c1_oc = c2_oc = c3_oc = 0; for (n2 = 0; n2 < nP; n2++) { c = P[n2]; if (c == c1) c1_oc++; else if (c == c2) c2_oc++; else if (c == c3) c3_oc++; else if (c != c4) error("'pattern' contains non-base DNA letters"); } Ppre4 = make_pre4(P, c1, c2, c3, c4); Psignature = make_32bit_signature(c1_oc, c2_oc, c3_oc, Ppre4); #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] pattern: c1_oc=%d c2_oc=%d c3_oc=%d Ppre4=%d\n", c1_oc, c2_oc, c3_oc, Ppre4); #endif Psuf4 = P + 4; nPsuf4 = nP - 4; codes[0] = c1; codes[1] = c2; codes[2] = c3; codes[3] = c4; for (i = 0; i < 4; i++) Psuf4_offsets[i] = Salloc((long) nP, int); split4_offsets(codes, Psuf4_offsets, Psuf4_noffsets, Psuf4, nPsuf4); n1max = nS - nP; for (n1 = 0, Ssuf4 = S + 4; n1 <= n1max; n1++, Ssuf4++, buf++) { if (Psignature != *buf) continue; #ifdef DEBUG_BIOSTRINGS count_preapprovals++; #endif if (memcmp(Psuf4, Ssuf4, nPsuf4) != 0) continue; // same as goto continue0; /* // Uncomment the 2 lines above if you want to use the fancy // comparison method below. for (i = 0; i < 3; i++) { c = codes[i]; offsets = Psuf4_offsets[i]; noffsets = Psuf4_noffsets[i]; for (j = 0; j < noffsets; j++) if (c != Ssuf4[offsets[j]]) goto continue0; } */ _report_match(n1 + 1, nP); continue0: ; } #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] count_preapprovals=%d\n", count_preapprovals); #endif return; } /**************************************************************************** * .Call entry point: "match_BOC2_preprocess" * * Arguments: * 's_xp': subject@shared@xp * 's_offset': subject@offset * 's_length': subject@length * 'p_length': pattern_length * 'code1': base1_code * 'code2': base2_code * 'code3': base3_code * 'code4': base4_code * 'buf_xp': buffer@xp * * Return an R list with the following elements: * - means: atomic vector of 4 doubles * - table1, table2, table3, table4: atomic vectors of (p_length + 1) integers * ****************************************************************************/ SEXP match_BOC2_preprocess(SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP p_length, SEXP code1, SEXP code2, SEXP code3, SEXP code4, SEXP buf_xp) { int subj_offset, subj_length, pat_length, c1, c2, c3, c4; const Rbyte *subj; SEXP buf, ans, ans_names, ans_elt; subj_offset = INTEGER(s_offset)[0]; subj_length = INTEGER(s_length)[0]; subj = RAW(R_ExternalPtrTag(s_xp)) + subj_offset; pat_length = INTEGER(p_length)[0]; c1 = INTEGER(code1)[0]; c2 = INTEGER(code2)[0]; c3 = INTEGER(code3)[0]; c4 = INTEGER(code4)[0]; buf = R_ExternalPtrTag(buf_xp); PROTECT(ans = NEW_LIST(5)); /* set the names */ PROTECT(ans_names = NEW_CHARACTER(5)); SET_STRING_ELT(ans_names, 0, mkChar("means")); SET_STRING_ELT(ans_names, 1, mkChar("table1")); SET_STRING_ELT(ans_names, 2, mkChar("table2")); SET_STRING_ELT(ans_names, 3, mkChar("table3")); SET_STRING_ELT(ans_names, 4, mkChar("table4")); SET_NAMES(ans, ans_names); UNPROTECT(1); /* set the "means" element */ PROTECT(ans_elt = NEW_NUMERIC(4)); SET_ELEMENT(ans, 0, ans_elt); UNPROTECT(1); /* set the "table1" element */ PROTECT(ans_elt = NEW_INTEGER(pat_length + 1)); SET_ELEMENT(ans, 1, ans_elt); UNPROTECT(1); /* set the "table2" element */ PROTECT(ans_elt = NEW_INTEGER(pat_length + 1)); SET_ELEMENT(ans, 2, ans_elt); UNPROTECT(1); /* set the "table3" element */ PROTECT(ans_elt = NEW_INTEGER(pat_length + 1)); SET_ELEMENT(ans, 3, ans_elt); UNPROTECT(1); /* set the "table4" element */ PROTECT(ans_elt = NEW_INTEGER(pat_length + 1)); SET_ELEMENT(ans, 4, ans_elt); UNPROTECT(1); BOC2_preprocess((char *) subj, subj_length, pat_length, (char) c1, (char) c2, (char) c3, (char) c4, INTEGER(buf), REAL(VECTOR_ELT(ans, 0)), INTEGER(VECTOR_ELT(ans, 1)), INTEGER(VECTOR_ELT(ans, 2)), INTEGER(VECTOR_ELT(ans, 3)), INTEGER(VECTOR_ELT(ans, 4))); UNPROTECT(1); return ans; } /**************************************************************************** * .Call entry point: "match_BOC2_exact" * * Arguments: * 'p_xp': pattern@shared@xp * 'p_offset': pattern@offset * 'p_length': pattern@length * 's_xp': boc_subject@subject@shared@xp * 's_offset': boc_subject@subject@offset * 's_length': boc_subject@subject@length * 'code1': boc_subject@base1_code * 'code2': boc_subject@base2_code * 'code3': boc_subject@base3_code * 'code4': boc_subject@base4_code * 'buf_xp': boc_subject@buffer@xp * 'stats': boc_subject@stats * 'count_only': single logical * ****************************************************************************/ SEXP match_BOC2_exact(SEXP p_xp, SEXP p_offset, SEXP p_length, SEXP s_xp, SEXP s_offset, SEXP s_length, SEXP code1, SEXP code2, SEXP code3, SEXP code4, SEXP buf_xp, SEXP stats, SEXP count_only) { int pat_offset, pat_length, subj_offset, subj_length, c1, c2, c3, c4, is_count_only; const Rbyte *pat, *subj; SEXP buf; pat_offset = INTEGER(p_offset)[0]; pat_length = INTEGER(p_length)[0]; pat = RAW(R_ExternalPtrTag(p_xp)) + pat_offset; subj_offset = INTEGER(s_offset)[0]; subj_length = INTEGER(s_length)[0]; subj = RAW(R_ExternalPtrTag(s_xp)) + subj_offset; c1 = INTEGER(code1)[0]; c2 = INTEGER(code2)[0]; c3 = INTEGER(code3)[0]; c4 = INTEGER(code4)[0]; buf = R_ExternalPtrTag(buf_xp); is_count_only = LOGICAL(count_only)[0]; _init_match_reporting(is_count_only ? "MATCHES_AS_COUNTS" : "MATCHES_AS_RANGES", 1); BOC2_exact_search( (char *) pat, pat_length, (char *) subj, subj_length, (char) c1, (char) c2, (char) c3, (char) c4, INTEGER(buf), REAL(VECTOR_ELT(stats, 0)), INTEGER(VECTOR_ELT(stats, 1)), INTEGER(VECTOR_ELT(stats, 2)), INTEGER(VECTOR_ELT(stats, 3)), INTEGER(VECTOR_ELT(stats, 4))); return _reported_matches_asSEXP(); } Biostrings/src/match_PWM.c0000644000126300012640000001270612241047607017043 0ustar00biocbuildphs_compbio/**************************************************************************** A SIMPLE POSITION WEIGHT MATRIX MATCHING ALGO Author: Herve Pages ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" /* * Table used for fast look up between A, C, G, T internal codes and the * corresponding 0-based row index (the row offset) in the PWM: * A internal code -> 0 * C internal code -> 1 * G internal code -> 2 * T internal code -> 3 * other internal code -> NA_INTEGER */ static ByteTrTable byte2offset; static int no_warning_yet; static double compute_pwm_score(const double *pwm, int pwm_ncol, const char *S, int nS, int pwm_shift) { int i, rowoffset; double score; S += pwm_shift; nS -= pwm_shift; if (pwm_shift < 0 || nS < pwm_ncol) error("'starting.at' contains invalid values"); score = 0.00; for (i = 0; i < pwm_ncol; i++, pwm += 4, S++) { rowoffset = byte2offset.byte2code[(unsigned char) *S]; if (rowoffset == NA_INTEGER) { if (no_warning_yet) { warning("'subject' contains letters not in " "[ACGT] ==> assigned weight 0 to them"); no_warning_yet = 0; } continue; } score += pwm[rowoffset]; } return score; } static void _match_PWM_XString(const double *pwm, int pwm_ncol, const cachedCharSeq *S, double minscore) { int n1, n2; double score; for (n1 = 0, n2 = pwm_ncol; n2 <= S->length; n1++, n2++) { score = compute_pwm_score(pwm, pwm_ncol, S->seq, S->length, n1); if (score >= minscore) _report_match(n1 + 1, pwm_ncol); } return; } /* * --- .Call ENTRY POINT --- * PWM_score_starting_at() arguments are assumed to be: * pwm: matrix of doubles with row names A, C, G and T; * subject: DNAString object containing the subject sequence; * starting_at: an integer vector of arbitrary length (NAs accepted); * base_codes: named integer vector of length 4 obtained with * 'xscodes(subject, baseOnly=TRUE)'. */ SEXP PWM_score_starting_at(SEXP pwm, SEXP subject, SEXP starting_at, SEXP base_codes) { cachedCharSeq S; int pwm_ncol, ans_length, i, *start_elt; SEXP ans; double *ans_elt; if (INTEGER(GET_DIM(pwm))[0] != 4) error("'pwm' must have 4 rows"); pwm_ncol = INTEGER(GET_DIM(pwm))[1]; S = cache_XRaw(subject); _init_byte2offset_with_INTEGER(&byte2offset, base_codes, 1); no_warning_yet = 1; ans_length = LENGTH(starting_at); PROTECT(ans = NEW_NUMERIC(ans_length)); for (i = 0, start_elt = INTEGER(starting_at), ans_elt = REAL(ans); i < ans_length; i++, start_elt++, ans_elt++) { if (*start_elt == NA_INTEGER) { *ans_elt = NA_REAL; continue; } *ans_elt = compute_pwm_score(REAL(pwm), pwm_ncol, S.seq, S.length, *start_elt - 1); } UNPROTECT(1); return ans; } /* * --- .Call ENTRY POINT --- * XString_match_PWM() arguments are assumed to be: * pwm: matrix of doubles with row names A, C, G and T; * subject: DNAString object containing the subject sequence; * min_score: single double (not NA); * count_only: single logical (not NA); * base_codes: named integer vector of length 4 obtained with * 'xscodes(subject, baseOnly=TRUE)'. */ SEXP XString_match_PWM(SEXP pwm, SEXP subject, SEXP min_score, SEXP count_only, SEXP base_codes) { cachedCharSeq S; int pwm_ncol, is_count_only; double minscore; if (INTEGER(GET_DIM(pwm))[0] != 4) error("'pwm' must have 4 rows"); pwm_ncol = INTEGER(GET_DIM(pwm))[1]; S = cache_XRaw(subject); minscore = REAL(min_score)[0]; is_count_only = LOGICAL(count_only)[0]; _init_byte2offset_with_INTEGER(&byte2offset, base_codes, 1); no_warning_yet = 1; _init_match_reporting(is_count_only ? "MATCHES_AS_COUNTS" : "MATCHES_AS_RANGES", 1); _match_PWM_XString(REAL(pwm), pwm_ncol, &S, minscore); return _reported_matches_asSEXP(); } /* * --- .Call ENTRY POINT --- * XStringViews_match_PWM() arguments are assumed to be: * pwm: matrix of doubles with row names A, C, G and T; * subject: DNAString object containing the subject sequence; * views_start, views_width: integer vectors describing views on 'subject'; * min_score: single double (not NA); * count_only: single logical (not NA); * base_codes: named integer vector of length 4 obtained with * 'xscodes(subject, baseOnly=TRUE)'. */ SEXP XStringViews_match_PWM(SEXP pwm, SEXP subject, SEXP views_start, SEXP views_width, SEXP min_score, SEXP count_only, SEXP base_codes) { cachedCharSeq S, S_view; int pwm_ncol, is_count_only; int nviews, v, *start_p, *width_p, view_offset; double minscore; if (INTEGER(GET_DIM(pwm))[0] != 4) error("'pwm' must have 4 rows"); pwm_ncol = INTEGER(GET_DIM(pwm))[1]; S = cache_XRaw(subject); minscore = REAL(min_score)[0]; is_count_only = LOGICAL(count_only)[0]; _init_byte2offset_with_INTEGER(&byte2offset, base_codes, 1); no_warning_yet = 1; _init_match_reporting(is_count_only ? "MATCHES_AS_COUNTS" : "MATCHES_AS_RANGES", 1); nviews = LENGTH(views_start); for (v = 0, start_p = INTEGER(views_start), width_p = INTEGER(views_width); v < nviews; v++, start_p++, width_p++) { view_offset = *start_p - 1; if (view_offset < 0 || view_offset + *width_p > S.length) error("'subject' has \"out of limits\" views"); S_view.seq = S.seq + view_offset; S_view.length = *width_p; _set_match_shift(view_offset); _match_PWM_XString(REAL(pwm), pwm_ncol, &S_view, minscore); } return _reported_matches_asSEXP(); } Biostrings/src/match_pattern.c0000644000126300012640000002002512241047607020046 0ustar00biocbuildphs_compbio/**************************************************************************** * EXACT AND INEXACT PATTERN MATCHING * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static int debug = 0; SEXP debug_match_pattern() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'match_pattern.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'match_pattern.c'\n"); #endif return R_NilValue; } /**************************************************************************** * A memcmp-based implementation of the "naive" method for exact matching. * * Here is how the "naive" (aka "memcmp", aka "blunt") method for finding * exact matches is described in Dan Gusfield book "Algorithms on strings, * trees, and sequences" (slightly modified): * The naive method aligns the left end of P (the pattern) with the left * end of S (the subject) and then compares the characters of P and S left * to right until either two unequal characters are found or until P is * exhausted, in which case an occurrence of P is reported. In either case, * P is then shifted one place to the right, and the comparisons are * restarted from the left end of P. This process repeats until the right * end of P shifts past the right end of S. * * Why implement this inefficient "naive" method? * - For QC: we can validate other more sophisticated matching algo by * comparing their results to those obtains with the "naive" method. * - To use as a reference when comparing performance. */ static void match_naive_exact(const cachedCharSeq *P, const cachedCharSeq *S) { const char *p, *s; int plen, slen, start, n2; if (P->length <= 0) error("empty pattern"); p = P->seq; plen = P->length; s = S->seq; slen = S->length; for (start = 1, n2 = plen; n2 <= slen; start++, n2++, s++) { if (memcmp(p, s, plen) == 0) _report_match(start, P->length); } return; } /**************************************************************************** * An implementation of the "naive" method for inexact matching. */ static void match_naive_inexact(const cachedCharSeq *P, const cachedCharSeq *S, int max_nmis, int min_nmis, int fixedP, int fixedS) { int Pshift, // position of pattern left-most char relative to the subject n2, // 1 + position of pattern right-most char relative to the subject min_Pshift, max_n2, nmis; const BytewiseOpTable *bytewise_match_table; if (P->length <= 0) error("empty pattern"); bytewise_match_table = _select_bytewise_match_table(fixedP, fixedS); min_Pshift = P->length <= max_nmis ? 1 - P->length : -max_nmis; max_n2 = S->length - min_Pshift; for (Pshift = min_Pshift, n2 = min_Pshift + P->length; n2 <= max_n2; Pshift++, n2++) { nmis = _nmismatch_at_Pshift(P, S, Pshift, max_nmis, bytewise_match_table); if (nmis <= max_nmis && nmis >= min_nmis) _report_match(Pshift + 1, P->length); } return; } /**************************************************************************** * _match_pattern_XString() and _match_pattern_XStringViews() */ void _match_pattern_XString(const cachedCharSeq *P, const cachedCharSeq *S, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, const char *algo) { int max_nmis, min_nmis, fixedP, fixedS; max_nmis = INTEGER(max_mismatch)[0]; min_nmis = INTEGER(min_mismatch)[0]; if (max_nmis < P->length - S->length || min_nmis > P->length) return; fixedP = LOGICAL(fixed)[0]; fixedS = LOGICAL(fixed)[1]; if (P->length <= max_nmis || strcmp(algo, "naive-inexact") == 0) match_naive_inexact(P, S, max_nmis, min_nmis, fixedP, fixedS); else if (strcmp(algo, "naive-exact") == 0) match_naive_exact(P, S); else if (strcmp(algo, "boyer-moore") == 0) _match_pattern_boyermoore(P, S, -1, 0); else if (strcmp(algo, "shift-or") == 0) _match_pattern_shiftor(P, S, max_nmis, fixedP, fixedS); else if (strcmp(algo, "indels") == 0) _match_pattern_indels(P, S, max_nmis, fixedP, fixedS); else error("\"%s\": unknown algorithm", algo); return; } void _match_pattern_XStringViews(const cachedCharSeq *P, const cachedCharSeq *S, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, const char *algo) { cachedCharSeq S_view; int nviews, v, *view_start, *view_width, view_offset; nviews = LENGTH(views_start); for (v = 0, view_start = INTEGER(views_start), view_width = INTEGER(views_width); v < nviews; v++, view_start++, view_width++) { view_offset = *view_start - 1; if (view_offset < 0 || view_offset + *view_width > S->length) error("'subject' has \"out of limits\" views"); S_view.seq = S->seq + view_offset; S_view.length = *view_width; _set_match_shift(view_offset); _match_pattern_XString(P, &S_view, max_mismatch, min_mismatch, with_indels, fixed, algo); } return; } /**************************************************************************** * --- .Call ENTRY POINTS --- * * Arguments: * pattern, subject: XString objects; * max_mismatch: (single integer) the max number of mismatching letters; * min_mismatch: (single integer) the min number of mismatching letters; * with_indels: single logical; * fixed: logical vector of length 2; * algorithm: single string; * count_only: single logical. * * If with_indels is FALSE: all matches have the length of the pattern. * Otherwise, matches are of variable length (>= length(pattern) - max_mismatch * and <= length(pattern) + max_mismatch). */ /* --- .Call ENTRY POINT --- */ SEXP XString_match_pattern(SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP count_only) { cachedCharSeq P, S; const char *algo; int is_count_only; P = cache_XRaw(pattern); S = cache_XRaw(subject); algo = CHAR(STRING_ELT(algorithm, 0)); is_count_only = LOGICAL(count_only)[0]; _init_match_reporting(is_count_only ? "MATCHES_AS_COUNTS" : "MATCHES_AS_RANGES", 1); _match_pattern_XString(&P, &S, max_mismatch, min_mismatch, with_indels, fixed, algo); return _reported_matches_asSEXP(); } /* --- .Call ENTRY POINT --- * Arguments are the same as for XString_match_pattern() except for: * subject: XString object; * views_start, views_width: 2 integer vectors describing views on 'subject'. */ SEXP XStringViews_match_pattern(SEXP pattern, SEXP subject, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP count_only) { cachedCharSeq P, S; const char *algo; int is_count_only; P = cache_XRaw(pattern); S = cache_XRaw(subject); algo = CHAR(STRING_ELT(algorithm, 0)); is_count_only = LOGICAL(count_only)[0]; _init_match_reporting(is_count_only ? "MATCHES_AS_COUNTS" : "MATCHES_AS_RANGES", 1); _match_pattern_XStringViews(&P, &S, views_start, views_width, max_mismatch, min_mismatch, with_indels, fixed, algo); return _reported_matches_asSEXP(); } /* --- .Call ENTRY POINT --- * Arguments are the same as for XString_match_pattern() except for: * subject: XStringSet object. */ SEXP XStringSet_vmatch_pattern(SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP count_only) { cachedCharSeq P, S_elt; cachedXStringSet S; int S_length, is_count_only, j; const char *algo; P = cache_XRaw(pattern); S = _cache_XStringSet(subject); S_length = _get_XStringSet_length(subject); algo = CHAR(STRING_ELT(algorithm, 0)); is_count_only = LOGICAL(count_only)[0]; _init_match_reporting(is_count_only ? "MATCHES_AS_COUNTS" : "MATCHES_AS_ENDS", S_length); for (j = 0; j < S_length; j++) { S_elt = _get_cachedXStringSet_elt(&S, j); _set_active_PSpair(j); _match_pattern_XString(&P, &S_elt, max_mismatch, min_mismatch, with_indels, fixed, algo); } return _MatchBuf_as_SEXP(_get_internal_match_buf(), R_NilValue); } Biostrings/src/match_pattern_boyermoore.c0000644000126300012640000003530612241047607022320 0ustar00biocbuildphs_compbio/**************************************************************************** A BOYER-MOORE-LIKE MATCHING ALGO Author: Herve Pages ****************************************************************************/ #include "Biostrings.h" #include #include /* I've turned off the "MWshift feature". Doesn't seem to give very good * results :-( To turn it on, set MWSHIFT_NPMAX to a positive integer * (typically 128, 256 or 512, doesn't have to be a power of 2). * The original idea of this feature was to try to boost the boyermoore() * function when the pattern is small. */ #define MWSHIFT_NPMAX 0 /****************************************************************************/ static int debug = 0; SEXP debug_match_pattern_boyermoore() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'match_pattern_boyermoore.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'match_pattern_boyermoore.c'\n"); #endif return R_NilValue; } /**************************************************************************** * The 'ppP' (Preprocessed Pattern) struct holds a copy of the current * pattern (eventually reverted if init_ppP_seq() was called with * walk_backward = 1) + the results of some preprocessing operations on it. * IMPORTANT: All members in 'ppP' that point to dynamically allocated * memory must be *persistent* buffers so they must point to user-controlled * memory (i.e. memory that is not reclaimed by R at the end of the .Call() * call). Hence the use of malloc()/free() instead of Salloc() for memory * allocation. * Members of 'ppP' are: * buflength: the size of the buffer pointed by the 'seq' member, which, in * the current implemenation, is also the length of the longest * pattern seen so far (i.e. since the beginning of the current * R session); * seq: the letters of the current pattern (eventually in reverse order * if init_ppP_seq() was called with walk_backward = 1); * seqlength: the length of the current pattern (must be <= 'buflength'); * LCP: see init_ppP_seq() below; * j0, shift0: see "j0/shift0" section below; * VSGSshift_table: see "The Very Strong Good Suffix shifts" section below; * MWshift_table: see "The Matching Window shifts" section below. */ static struct { int buflength; char *seq; int seqlength; int LCP; int j0, shift0; int *VSGSshift_table; int *MWshift_table; } ppP = {0, NULL, 0, -1, 0, 0, NULL, NULL}; /* The 'LCP' member: * -1: init_ppP_seq() changed the value of ppP.buflength. * >= 0: init_ppP_seq() didn't change the value of ppP.buflength. * The non-negative integer is the length of the Longest Common * Prefix between old and new current pattern (LCP will always be <= * min(P->length, ppP.seqlength)). */ static void init_ppP_seq(const cachedCharSeq *P, int walk_backward) { int LCP, j1, j2; char c; if (P->length == 0) { /* should never happen but safer anyway... */ ppP.LCP = 0; return; } if (P->length > 20000) error("pattern is too long"); if (P->length > ppP.buflength) { /* We need to extend the size of 'ppP'. In that case, we don't need to compute the LCP and we set it to -1. */ if (ppP.seq != NULL) free(ppP.seq); ppP.buflength = 0; ppP.seq = (char *) malloc(P->length * sizeof(char)); if (ppP.seq == NULL) error("can't allocate memory for ppP.seq"); ppP.buflength = P->length; LCP = -1; } else { /* We don't need to extend the size of 'ppP'. In that case, we compute the LCP. */ LCP = 0; } for (j1 = 0, j2 = P->length - 1; j1 < P->length; j1++, j2--) { c = P->seq[walk_backward ? j2 : j1]; if (LCP != -1 && j1 < ppP.seqlength && c == ppP.seq[j1]) LCP++; else ppP.seq[j1] = c; } ppP.seqlength = P->length; ppP.LCP = LCP; return; } /**************************************************************************** * j0/shift0 * ========= * * For any j1 and j2 such that 0 <= j1 < j2 <= nP (nP being the length of * the pattern P), we note P(j1, j2) the subpattern of P starting at * position j1 and ending at position j2-1. * Note that with this definition: P(0, nP) = P. * * Definition of j0 and shift0 * --------------------------- * j0 = start position in P of the smallest suffix of P that is not a * substring of P(1, nP-1) * Note that j0 can also be defined by using the MWshift function (see * section "The Matching Window shifts" below): * j0 = max{j1 | MWshift(j1, nP) >= j} * * shift0 = MWshift(j0, nP) * * Properties * ---------- * * (a) If j1 <= j0, then MWshift(j1, nP) = shift0 >= j0 * (b) If j1 > j0, then MWshift(j1, nP) < j1 * (c) MWshift(j1, j2) <= shift0 * (d) If j < j0, VSGSshift(c, j) = shift0 * (e) VSGSshift(P[0], 0) = shift0 */ static void init_ppP_j0shift0() { int j0, shift0, length, j; length = 1; j0 = ppP.seqlength - 1; for (j = j0 - 1; j >= 1; j--) { if (memcmp(ppP.seq + j, ppP.seq + j0, length) == 0) { length++; j0--; } } for (shift0 = j0 - j; shift0 < ppP.seqlength; shift0++, length--) { if (memcmp(ppP.seq, ppP.seq + shift0, length) == 0) break; } ppP.j0 = j0; ppP.shift0 = shift0; /*Rprintf("j0=%d shift0=%d\n", j0, shift0);*/ } /**************************************************************************** * The Very Strong Good Suffix shifts * ================================== * * ppP.VSGSshift_table is a 256 x ppP.buflength matrix. * Its layout is (only the values marked with an "x" will be potentially * used): * * 0 1 2 3 4 5 j * 0 x x x x - - * 1 x x x x - - * 2 x x x x - - ppP.seqlength = 4 <= ppP.buflength = 6 * ............. * 256 x x x x - - * c * * The "x" region is defined by 0 <= j < ppP.seqlength */ #define VSGS_SHIFT(c, j) (ppP.VSGSshift_table[ppP.buflength * ((unsigned char) (c)) + (j)]) static int get_VSGSshift(char c, int j) { int shift, k, k1, k2, length; const char *tmp; if (j < ppP.j0) return ppP.shift0; shift = VSGS_SHIFT(c, j); if (shift != 0) return shift; for (shift = 1; shift < ppP.seqlength; shift++) { if (shift <= j) { k = j - shift; if (ppP.seq[k] != c) continue; k1 = k + 1; } else { k1 = 0; } k2 = ppP.seqlength - shift; if (k1 == k2) break; length = k2 - k1; tmp = ppP.seq + k1; if (memcmp(tmp, tmp + shift, length) == 0) break; } /* shift is ppP.seqlength when the "for" loop is not interrupted by "break" */ /*Rprintf("VSGSshift(c=%c, j=%d) = %d\n", c, j, shift);*/ return VSGS_SHIFT(c, j) = shift; } static void init_ppP_VSGSshift_table() { int u, j; char c; if (ppP.LCP == -1 && ppP.VSGSshift_table != NULL) { free(ppP.VSGSshift_table); ppP.VSGSshift_table = NULL; } if (ppP.buflength != 0 && ppP.VSGSshift_table == NULL) { ppP.VSGSshift_table = (int *) malloc(256 * ppP.buflength * sizeof(int)); if (ppP.VSGSshift_table == NULL) error("can't allocate memory for ppP.VSGSshift_table"); } for (u = 0; u < 256; u++) { for (j = 0; j < ppP.seqlength; j++) { c = (char) u; VSGS_SHIFT(c, j) = 0; } } } /**************************************************************************** * The Matching Window shifts * ========================== * * Definition * ---------- * * MWshift(j1, j2), the "Matching Window shift" for P(j1, j2), is defined by: * Imagine that, for a given alignement of P with the subject S, all * letters in subpattern P(j1, j2) are matching S (we say that the current * Matching Window is (j1, j2)). Then MWshift(j1, j2) is the smallest * (non-zero) amount of letters that we can shift P to the right without * introducing an immediate mismatch. * * How to compute the MWshift function * ----------------------------------- * * The MWshift function depends only on the pattern and therefore can be * preprocessed. * To compute MWshift(j1, j2) we need to solve a matching problem again but * within P itself i.e. we must find the smallest (non-zero) amount of letters * that we need to shift P(j1, j2) to the _left_ until it matches P again. * IMPORTANT: This match must be a "full" match (when we are still within the * limits of P) and a "partial" match (when we are out of limits i.e. we've * moved to far to the left). For a "partial" match, all letters that are * still within P limits must match. When we have moved so far that all * letters are out of limits, then we have a "partial" match too. * This ensure that MWshift(j1, j2) is always <= j2. * * Example: P = acbaba * 012345 * * MWshift(0,1) = 1 * MWshift(1,2) = 2 * MWshift(2,3) = 3 * MWshift(3.4) = MWshift(2,4) = MWshift(1,4) = MWshift(0,4) = 3 * ... * MWshift(4,5) = MWshift(5,6) = MWshift(4,6) = 2 * MWshift(0,6) = 5 (MWshift max) * * A nice property of the MWshift function is that: * if j1 <= j1' < j2' <= j2, then MWshift(j1', j2') <= MWshift(j1, j2) * Therefore the biggest value for MWshift is reached for j1 = 0 and j2 = nP. * To summarize: * 1 <= MWshift(j1, j2) <= min(j2, MWshift(0, nP)) * Another property of the MWshift function is that if P1 and P2 are 2 * patterns such that P1 is a prefix of P2 then MWshift1 and MWshift2 (their * respective MWshift functions) are equal on the set of points (j1, j2) that * are valid for MWshift1. * This last property is used by the init_MWshift_table() C function below. * * No need to preprocess the MWshift function * ------------------------------------------ * * However this preprocessing would be too expensive since it requires the * evaluation of nP * (nP + 1) / 2 values, and each evaluation itself is a * string matching sub-problem with a cost of its own. So the trick is to * delay those evaluations until they are needed, and the fact is that, in * practise, very few of them are actually needed compared to the total * number of possible MWshift(j1, j2) values. * * ppP.MWshift_table is a 2-dim array with nrow = ncol = ppP.buflength. * The layout of ppP.MWshift_table is (only the values marked with an "x" * will be potentially used): * * 1 2 3 4 5 6 j2 * 0 x x x x - - * 1 - x x x - - * 2 - - x x - - ppP.seqlength = 4 <= ppP.buflength = 6 * 3 - - - x - - * 4 - - - - - - * 5 - - - - - - * j1 * * The "x" region is defined by 0 <= j1 < j2 <= ppP.seqlength */ #define MWSHIFT(j1, j2) (ppP.MWshift_table[ppP.buflength * (j1) + (j2) - 1]) static int get_MWshift(int j1, int j2) { int shift, k1, k2, length; const char *tmp; shift = MWSHIFT(j1, j2); if (shift != 0) return shift; for (shift = 1; shift < j2; shift++) { if (shift < j1) k1 = j1 - shift; else k1 = 0; k2 = j2 - shift; length = k2 - k1; tmp = ppP.seq + k1; if (memcmp(tmp, tmp + shift, length) == 0) break; } /* shift is j2 when the "for" loop is not interrupted by "break" */ return MWSHIFT(j1, j2) = shift; } static void init_ppP_MWshift_table() { int j1, j2 = 1; if (ppP.LCP == -1 && ppP.MWshift_table != NULL) { free(ppP.MWshift_table); ppP.MWshift_table = NULL; } if (ppP.buflength != 0 && ppP.MWshift_table == NULL) { ppP.MWshift_table = (int *) malloc(ppP.buflength * ppP.buflength * sizeof(int)); if (ppP.MWshift_table == NULL) error("can't allocate memory for ppP.MWshift_table"); } if (ppP.LCP != -1) j2 = ppP.LCP + 1; for ( ; j2 <= ppP.seqlength; j2++) { for (j1 = 0; j1 < j2; j1++) { MWSHIFT(j1, j2) = 0; } } } /**************************************************************************** * The boyermoore() function * ========================= * * My poor understanding of the original Boyer-Moore algo as explained in Dan * Gusfield book "Algorithms on strings, trees, and sequences", is that it * will be inefficent in this situation: * S = "Xbabababababab" * P = "abababababab" * because after it has applied the "strong good suffix rule" and shifted P 2 * letters to the right, it will start comparing P and S suffixes again which * is a waste of time. * The original idea behind our "MWshift feature" is to address this problem. * By using this "feature", our boyermoore() function below never compares * twice the letters that are in the current Matching Window (defined by * (j1, j2) in P and (i1, i2) in S). */ #define GET_S_LETTER(S, n, walk_backward) \ ((walk_backward) ? (S)->seq[(S)->length - 1 - (n)] : (S)->seq[(n)]) #define ADJUST_MW(i, j, shift) \ { \ if ((shift) <= (j)) \ (j) -= (shift); \ else { \ (i) += (shift) - (j); \ (j) = 0; \ } \ } /* Return 1-based end of last match or -1 if no match */ int _match_pattern_boyermoore(const cachedCharSeq *P, const cachedCharSeq *S, int nfirstmatches, int walk_backward) { int nmatches, last_match_end, n, i1, i2, j1, j2, shift, shift1, i, j, match_start; char ppP_rmc, c; /* ppP_rmc is 'ppP.seq' right-most char */ if (P->length <= 0) error("empty pattern"); nmatches = 0; last_match_end = -1; init_ppP_seq(P, walk_backward); init_ppP_j0shift0(); init_ppP_VSGSshift_table(); if (ppP.seqlength <= MWSHIFT_NPMAX) init_ppP_MWshift_table(); n = ppP.seqlength - 1; ppP_rmc = ppP.seq[n]; j2 = 0; while (n < S->length) { if (j2 == 0) { /* No Matching Window yet, we need to find one */ c = GET_S_LETTER(S, n, walk_backward); if (c != ppP_rmc) { shift = get_VSGSshift(c, ppP.seqlength - 1); n += shift; continue; } i1 = n; i2 = i1 + 1; j2 = ppP.seqlength; j1 = j2 - 1; /* Now we have a Matching Window (1-letter suffix) */ } /* We try to extend the current Matching Window... */ if (j1 > 0) { /* ... to the left */ for (i = i1-1, j = j1-1; j >= 0; i--, j--) if ((c = GET_S_LETTER(S, i, walk_backward)) != ppP.seq[j]) break; i1 = i + 1; j1 = j + 1; } if (j2 < ppP.seqlength) { /* ... to the right */ for ( ; j2 < ppP.seqlength; i2++, j2++) if (GET_S_LETTER(S, i2, walk_backward) != ppP.seq[j2]) break; } if (j2 == ppP.seqlength) { /* the Matching Window is a suffix */ if (j1 == 0) { /* we have a full match! */ if (walk_backward) { last_match_end = S->length - i1; match_start = last_match_end - ppP.seqlength + 1; } else { match_start = i1 + 1; last_match_end = i1 + ppP.seqlength; } _report_match(match_start, ppP.seqlength); nmatches++; if (nfirstmatches >= 0 && nmatches >= nfirstmatches) break; shift = ppP.shift0; } else { shift = get_VSGSshift(c, j1 - 1); } } else { shift = get_MWshift(j1, j2); c = GET_S_LETTER(S, n, walk_backward); if (c != ppP_rmc) { shift1 = get_VSGSshift(c, ppP.seqlength - 1); if (shift1 > shift) shift = shift1; } } n += shift; if (ppP.seqlength <= MWSHIFT_NPMAX) { ADJUST_MW(i1, j1, shift) ADJUST_MW(i2, j2, shift) } else { j2 = 0; /* forget the current Matching Window */ } } return last_match_end; } Biostrings/src/match_pattern_indels.c0000644000126300012640000001134212241047607021406 0ustar00biocbuildphs_compbio/**************************************************************************** A SIMPLE MATCHING ALGO WITH SUPPORT FOR INDELS Author: Herve Pages ****************************************************************************/ #include "Biostrings.h" static void test_match_pattern_indels(const char *p, const char *s, int max_nmis, const char *expected_matches) { cachedCharSeq P, S; Rprintf("P=%s S=%s max_nmis=%d expected_matches=%s\n", p, s, max_nmis, expected_matches); P.seq = p; P.length = strlen(P.seq); S.seq = s; S.length = strlen(S.seq); _match_pattern_indels(&P, &S, max_nmis, 1, 1); return; } static int debug = 0; SEXP debug_match_pattern_indels() { #ifdef DEBUG_BIOSTRINGS const char *p = "ABCDE", *s = "BCDExAxBCDDxDABCxExxABDCExExAABCDEE"; debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); if (debug == 1) { _init_match_reporting("MATCHES_AS_NULL", 1); test_match_pattern_indels(p, s, 0, "30:34"); test_match_pattern_indels(p, s, 1, "1:4, 14:18, 30:34"); test_match_pattern_indels(p, s, 2, "1:4, 8:10, 14:18, 21:23, 30:34"); } #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } #ifdef DEBUG_BIOSTRINGS static void print_match(int start, int width, const cachedCharSeq *P, const cachedCharSeq *S, const BytewiseOpTable *bytewise_match_table) { int end, j0, nedit0, width0; char mbuf[1001]; if (width >= sizeof(mbuf)) error("sizeof(mbuf) too small"); j0 = start - 1; end = j0 + width; snprintf(mbuf, width + 1, "%s", S->seq + j0); nedit0 = _nedit_for_Ploffset(P, S, j0, P->length, 1, &width0, bytewise_match_table); Rprintf("start=%d end=%d (%s) nedit0=%d\n", start, end, mbuf, nedit0); return; } #endif /* * In order to avoid pollution by redundant matches, we report only the "best * local matches". A substring S' of S is a best local match iff: * (a) nedit(P, S') <= max_nmis * (b) for every substring S1 of S', nedit(P, S1) > nedit(P, S') * (c) for every substring S2 of S that contains S', nedit(P, S2) >= nedit(P, S') * One nice property of best local matches is that their first and last letters * are guaranteed to match letters in P. * The report_provisory_match() function will store a provisory match and will * hold it until it is replaced by a better one or until it's guaranteed to be * a best local match (then it's reported as a match). */ static int provisory_match_start, provisory_match_end, provisory_match_width, provisory_match_nedit; static void report_provisory_match(int start, int width, int nedit) { int end; end = start + width - 1; if (provisory_match_nedit != -1) { // Given how we walk on S, 'start' is always guaranteed to be > // 'provisory_match_start'. if (end > provisory_match_end) _report_match(provisory_match_start, provisory_match_width); else if (nedit > provisory_match_nedit) return; } provisory_match_start = start; provisory_match_end = end; provisory_match_width = width; provisory_match_nedit = nedit; return; } static ByteTrTable byte2offset; void _match_pattern_indels(const cachedCharSeq *P, const cachedCharSeq *S, int max_nmis, int fixedP, int fixedS) { int i0, j0, max_nmis1, nedit1, width1; char c0; const BytewiseOpTable *bytewise_match_table; cachedCharSeq P1; if (P->length <= 0) error("empty pattern"); bytewise_match_table = _select_bytewise_match_table(fixedP, fixedS); _init_byte2offset_with_cachedCharSeq(&byte2offset, P, bytewise_match_table); provisory_match_nedit = -1; // means no provisory match yet j0 = 0; while (j0 < S->length) { while (1) { c0 = S->seq[j0]; i0 = byte2offset.byte2code[(unsigned char) c0]; if (i0 != NA_INTEGER) break; j0++; if (j0 >= S->length) goto done; } P1.seq = P->seq + i0 + 1; P1.length = P->length - i0 - 1; max_nmis1 = max_nmis - i0; /* #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] _match_pattern_indels(): " "j0=%d c0=%c i0=%d max_nmis1=%d\n", j0, c0, i0, max_nmis1); } #endif */ if (max_nmis1 >= 0) { if (max_nmis1 == 0) { nedit1 = _nmismatch_at_Pshift(&P1, S, j0 + 1, max_nmis1, bytewise_match_table); width1 = P1.length; } else { nedit1 = _nedit_for_Ploffset(&P1, S, j0 + 1, max_nmis1, 1, &width1, bytewise_match_table); } if (nedit1 <= max_nmis1) { #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] _match_pattern_indels(): " "provisory match found at "); print_match(j0 + 1, width1 + 1, P, S, bytewise_match_table); } #endif report_provisory_match(j0 + 1, width1 + 1, nedit1 + i0); } } j0++; } done: if (provisory_match_nedit != -1) _report_match(provisory_match_start, provisory_match_width); return; } Biostrings/src/match_pattern_shiftor.c0000644000126300012640000001737112241047607021616 0ustar00biocbuildphs_compbio/**************************************************************************** THE SHIFT-OR ALGORITHM aka THE BITAP ALGORITHM Author: H. Pages This is a complete rewrite from Biostrings 1. References: - Wikipedia: http://en.wikipedia.org/wiki/Shift-or_algorithm - other: http://www-igm.univ-mlv.fr/~lecroq/string/node6.html - For all kind of string algorithms with animation in Java, see also: http://www-igm.univ-mlv.fr/~lecroq/string/index.html - The agrep homepage (DOS, Windows and OS/2 only): http://www.tgries.de/agrep Note that in Biostrings 1 (1.4.0) the "shift-or" algo was almost always returning wrong results for 'max_mismatch' != 0 ("inexact searching"). The bug was in the C function ShiftOr_matchInternal() which was using the following formula for computing the "pattern bitmasks": ShiftOrWord_t tmp = M_k[0]; M_k[0] = (tmp << 1) | U[xptr[k]]; M_k[1] = ((M_k[1] << 1) | U[xptr[k]]) & tmp & (tmp << 1) & (M_k[0] << 1); where the correct formula would have been to replace the last line by: M_k[1] = ((M_k[1] << 1) | U[xptr[k]]) & (tmp << 1) & (M_k[0]); Also note that using the formula given in D. Gusfield's book (Algorithms on strings, trees, and sequences), p. 73, would result in doing: M_k[1] = ((M_k[1] << 1) | U[xptr[k]]) & (tmp) & (M_k[0]); which is wrong too. In this complete rewrite of the "shift-or" algo, we use a more general version of the correct formula. The code doing this is in the update_PMmasks() function: for (e = 1; e < PMmask_length; e++) { PMmaskB = PMmaskA; PMmaskA = PMmask[e] >> 1; PMmask[e] = (PMmaskA | pmask) & PMmaskB & PMmask[e-1]; } Note that the bit order in those bitmasks is reverted relatively to the order used in Biostrings 1. In Biostrings 1 the first position in the pattern (the most left) was mapped to the most right bit (the weak bit) of the bitmask. Now it is the last position in the pattern (the most right) that is mapped to the most right bit of the bitmask which is more intuitive. In addition to the "inexact matching" bug previously described, the following problems have been addressed: - The 'kerr' arg of ShiftOr_matchInternal() (nb of mismatches) is no longer required to be <= 3. Now it can be whatever positive int. - The "border problem" occuring with "inexact matching" is fixed. This new version of the "shift-or" algo should find ALL matches, even those that are out of bounds (i.e. that start before the first or end after the last character of the subject). - The bus-error that occured on Solaris 2.9 and Mac OS X for: > pattern <- DNAString("AAAA") > subject <- DNAString("AAAAC") > matchDNAPattern(pattern, subject, mis=2) is gone. ****************************************************************************/ #include "Biostrings.h" #include #include #define CHAR_SIZE (sizeof(char)) #define LONG_SIZE (sizeof(long)) #define BITS_PER_CHAR CHAR_BIT #define BITS_PER_SIZEOF_UNIT (BITS_PER_CHAR / (int) CHAR_SIZE) #define BITS_PER_LONG ((int) LONG_SIZE * BITS_PER_SIZEOF_UNIT) /* * Expected to be 32-bit on 32-bit machines and 64-bit on 64-bit machines */ typedef unsigned long ShiftOrWord_t; int shiftor_maxbits = sizeof(ShiftOrWord_t) * CHAR_BIT; /****************************************************************************/ static int debug = 0; SEXP debug_match_pattern_shiftor() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'match_pattern_shiftor.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'match_pattern_shiftor.c'\n"); #endif return R_NilValue; } #ifdef DEBUG_BIOSTRINGS static void debug_printULBits(unsigned long bits) { unsigned long current_bit = 1UL << (BITS_PER_LONG-1); int i; for (i = 0; i < BITS_PER_LONG; i++) { Rprintf("%d", (bits & current_bit) != 0UL); if ((i % 8) == 7) { Rprintf(" "); } current_bit >>= 1; } Rprintf("-> %lu\n", bits); return; } #endif SEXP bits_per_long() { SEXP ans; PROTECT(ans = NEW_INTEGER(1)); INTEGER(ans)[0] = BITS_PER_LONG; UNPROTECT(1); return ans; } /****************************************************************************/ static void set_pmaskmap( int is_fixed, int pmaskmap_length, ShiftOrWord_t *pmaskmap, const cachedCharSeq *P) { ShiftOrWord_t pmask; int nncode, i; /* Why go to 255? Only pmaskmap[nncode] will be used, where nncode is a numerical nucleotide code. nncode can only have 16 possible values: 1, 2, 4, 6, ..., 30. Not even all values <= 30 are used! */ for (nncode = 0; nncode < pmaskmap_length; nncode++) { pmask = 0LU; for (i = 0; i < P->length; i++) { pmask <<= 1; if (is_fixed) { if (((unsigned char) P->seq[i]) != nncode) pmask |= 1UL; } else { if ((((unsigned char) P->seq[i]) & nncode) == 0) pmask |= 1UL; } } pmaskmap[nncode] = pmask; } return; } static void update_PMmasks( int PMmask_length, ShiftOrWord_t *PMmask, ShiftOrWord_t pmask) { static ShiftOrWord_t PMmaskA, PMmaskB; static int e; PMmaskA = PMmask[0] >> 1; PMmask[0] = PMmaskA | pmask; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] update_PMmasks(): PMmask[%d]=", 0); debug_printULBits(PMmask[0]); } #endif for (e = 1; e < PMmask_length; e++) { PMmaskB = PMmaskA; PMmaskA = PMmask[e] >> 1; PMmask[e] = (PMmaskA | pmask) & PMmaskB & PMmask[e-1]; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] update_PMmasks(): PMmask[%d]=", e); debug_printULBits(PMmask[e]); } #endif } return; } /* * Returns -1 if no match is found. * Returns nb of mismatches (>= 0) if an inexact match is found. */ static int next_match( int *Lpos, int *Rpos, const cachedCharSeq *S, ShiftOrWord_t *pmaskmap, int PMmask_length, /* PMmask_length = kerr+1 */ ShiftOrWord_t *PMmask) { static ShiftOrWord_t pmask; static int nncode; static int e; while (*Lpos < S->length) { if (*Rpos < S->length) { nncode = (unsigned char) S->seq[*Rpos]; pmask = pmaskmap[nncode]; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] next_match(): "); Rprintf("pmaskmap[%d]=", nncode); debug_printULBits(pmask); } #endif } else { pmask = ~0UL; } update_PMmasks(PMmask_length, PMmask, pmask); (*Lpos)++; (*Rpos)++; for (e = 0; e < PMmask_length; e++) { if ((PMmask[e] & 1UL) == 0UL) { return e; } } } return -1; } static void shiftor(const cachedCharSeq *P, const cachedCharSeq *S, int PMmask_length, int is_fixed) { ShiftOrWord_t *PMmask, pmaskmap[256]; int i, e, Lpos, Rpos, ret; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] shiftor(): BEGIN\n"); } #endif if (P->length <= 0) error("empty pattern"); set_pmaskmap(is_fixed, 256, pmaskmap, P); PMmask = (ShiftOrWord_t *) R_alloc(PMmask_length, sizeof(ShiftOrWord_t)); PMmask[0] = 1UL; for (i = 1; i < P->length; i++) { PMmask[0] <<= 1; PMmask[0] |= 1UL; } for (e = 1; e < PMmask_length; e++) { PMmask[e] = PMmask[e-1] >> 1; } Lpos = 1 - P->length; Rpos = 0; while (1) { ret = next_match( &Lpos, &Rpos, S, pmaskmap, PMmask_length, PMmask); if (ret == -1) { break; } _report_match(Lpos, P->length); } /* No need to free PMmask, R does that for us */ #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] shiftor(): END\n"); } #endif return; } void _match_pattern_shiftor(const cachedCharSeq *P, const cachedCharSeq *S, int max_nmis, int fixedP, int fixedS) { if (P->length > shiftor_maxbits) error("pattern is too long"); if (fixedP != fixedS) error("fixedP != fixedS not supported by shift-or algo"); shiftor(P, S, max_nmis + 1, fixedP); } Biostrings/src/match_pdict.c0000644000126300012640000004300012241047607017472 0ustar00biocbuildphs_compbio/**************************************************************************** * * * Inexact matching of a DNA dictionary using a Trusted Band * * Author: Herve Pages * * * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static int debug = 0; SEXP debug_match_pdict() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'match_pdict.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'match_pdict.c'\n"); #endif return R_NilValue; } /**************************************************************************** * Helper functions for all the *match_pdict() .Call entry points. */ // FIXME: Pass 'const HeadTail *' instead of 'pdict_head' // and 'pdict_tail'. Also change MatchPDictBuf struct so the // head_widths and tail_widths members are IntAE buffers. static MatchPDictBuf new_MatchPDictBuf_from_PDict3Parts(SEXP matches_as, SEXP pptb, SEXP pdict_head, SEXP pdict_tail) { int tb_length, tb_width; const int *head_widths, *tail_widths; tb_length = _get_PreprocessedTB_length(pptb); tb_width = _get_PreprocessedTB_width(pptb); if (pdict_head == R_NilValue) head_widths = NULL; else head_widths = INTEGER(_get_XStringSet_width(pdict_head)); if (pdict_tail == R_NilValue) tail_widths = NULL; else tail_widths = INTEGER(_get_XStringSet_width(pdict_tail)); return _new_MatchPDictBuf(matches_as, tb_length, tb_width, head_widths, tail_widths); } static void match_pdict(SEXP pptb, HeadTail *headtail, const cachedCharSeq *S, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, MatchPDictBuf *matchpdict_buf) { int max_nmis, min_nmis, fixedP, fixedS; SEXP low2high; const char *type; TBMatchBuf *tb_matches; max_nmis = INTEGER(max_mismatch)[0]; min_nmis = INTEGER(min_mismatch)[0]; fixedP = LOGICAL(fixed)[0]; fixedS = LOGICAL(fixed)[1]; type = get_classname(pptb); /* if (strcmp(type, "ACtree2") == 0) { _match_pdictACtree2(pptb, headtail, S, max_nmis, min_nmis, fixedP, fixedS, matchpdict_buf); return; } */ #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] ENTERING match_pdict()\n"); #endif low2high = _get_PreprocessedTB_low2high(pptb); tb_matches = &(matchpdict_buf->tb_matches); if (strcmp(type, "Twobit") == 0) _match_Twobit(pptb, S, fixedS, tb_matches); else if (strcmp(type, "ACtree2") == 0) _match_tbACtree2(pptb, S, fixedS, tb_matches); else error("%s: unsupported Trusted Band type in 'pdict'", type); /* Call _match_pdict_all_flanks() even if 'headtail' is empty * (i.e. headtail->max_HTwidth == 0) because we need to propagate * the matches to the duplicates anyway */ _match_pdict_all_flanks(low2high, headtail, S, max_nmis, min_nmis, matchpdict_buf); #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] LEAVING match_pdict()\n"); #endif return; } /**************************************************************************** * Helper functions for the vcount_*_XStringSet all() functions. */ static SEXP init_vcount_collapsed_ans(int np, int ns, int collapse, SEXP weight) { int ans_length, i; SEXP ans; switch (collapse) { case 1: ans_length = np; break; case 2: ans_length = ns; break; default: error("'collapse' must be FALSE, 1 or 2"); } if (IS_INTEGER(weight)) { PROTECT(ans = NEW_INTEGER(ans_length)); memset(INTEGER(ans), 0, ans_length * sizeof(int)); } else { PROTECT(ans = NEW_NUMERIC(ans_length)); for (i = 0; i < ans_length; i++) REAL(ans)[i] = 0.00; } UNPROTECT(1); return ans; } static void update_vcount_collapsed_ans(SEXP ans, int match_count, int i, int j, int collapse, SEXP weight) { int tmp; /* If 'collapse' is 1, then collapse the matrix of match counts horizontally by summing all the (weighted) columns together. */ if (collapse != 1) { /* Otherwise, collapse vertically. */ tmp = i; i = j; j = tmp; } if (IS_INTEGER(weight)) INTEGER(ans)[i] += match_count * INTEGER(weight)[j]; else REAL(ans)[i] += match_count * REAL(weight)[j]; return; } /**************************************************************************** * .Call entry points: match_PDict3Parts_XString() * match_XStringSet_XString() * * Arguments: * o match_PDict3Parts_XString() only: * - pptb: a PreprocessedTB object; * - pdict_head: head(pdict) (XStringSet or NULL); * - pdict_tail: tail(pdict) (XStringSet or NULL); * o match_XStringSet_XString() only: * - pattern: non-preprocessed pattern dict (XStringSet); * o common arguments: * - subject: reference sequence (XString); * - max_mismatch: max.mismatch (max nb of mismatches *outside* the TB); * - min_mismatch: min.mismatch (min nb of mismatches *outside* the TB); * - fixed: logical vector of length 2; * - matches_as: "MATCHES_AS_NULL", "MATCHES_AS_WHICH", * "MATCHES_AS_COUNTS" or "MATCHES_AS_ENDS"; * - envir: NULL or environment to be populated with the matches. */ /* --- .Call ENTRY POINT --- */ SEXP match_PDict3Parts_XString(SEXP pptb, SEXP pdict_head, SEXP pdict_tail, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP matches_as, SEXP envir) { HeadTail headtail; cachedCharSeq S; MatchPDictBuf matchpdict_buf; headtail = _new_HeadTail(pdict_head, pdict_tail, pptb, max_mismatch, fixed, 1); S = cache_XRaw(subject); matchpdict_buf = new_MatchPDictBuf_from_PDict3Parts(matches_as, pptb, pdict_head, pdict_tail); match_pdict(pptb, &headtail, &S, max_mismatch, min_mismatch, fixed, &matchpdict_buf); return _MatchBuf_as_SEXP(&(matchpdict_buf.matches), envir); } /* --- .Call ENTRY POINT --- */ SEXP match_XStringSet_XString(SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP matches_as, SEXP envir) { cachedXStringSet P; int P_length, i; cachedCharSeq S, P_elt; const char *algo, *ms_mode; P = _cache_XStringSet(pattern); P_length = _get_cachedXStringSet_length(&P); S = cache_XRaw(subject); algo = CHAR(STRING_ELT(algorithm, 0)); ms_mode = CHAR(STRING_ELT(matches_as, 0)); _init_match_reporting(ms_mode, P_length); for (i = 0; i < P_length; i++) { P_elt = _get_cachedXStringSet_elt(&P, i); _set_active_PSpair(i); _match_pattern_XString(&P_elt, &S, max_mismatch, min_mismatch, with_indels, fixed, algo); } return _MatchBuf_as_SEXP(_get_internal_match_buf(), envir); } /**************************************************************************** * .Call entry points: match_PDict3Parts_XStringViews() * match_XStringSet_XStringViews() * * Arguments: * o match_PDict3Parts_XStringViews() only: * - pptb: a PreprocessedTB object; * - pdict_head: head(pdict) (XStringSet or NULL); * - pdict_tail: tail(pdict) (XStringSet or NULL); * o match_XStringSet_XStringViews() only: * - pattern: non-preprocessed pattern dict (XStringSet); * o common arguments: * - subject: reference sequence (XString); * - views_start, views_width: views defined on the subject; * - max_mismatch: max.mismatch (max nb of mismatches *outside* the TB); * - min_mismatch: min.mismatch (min nb of mismatches *outside* the TB); * - fixed: logical vector of length 2; * - matches_as: "MATCHES_AS_NULL", "MATCHES_AS_WHICH", * "MATCHES_AS_COUNTS" or "MATCHES_AS_ENDS"; * - envir: NULL or environment to be populated with the matches. */ /* --- .Call ENTRY POINT --- */ SEXP match_PDict3Parts_XStringViews(SEXP pptb, SEXP pdict_head, SEXP pdict_tail, SEXP subject, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP matches_as, SEXP envir) { HeadTail headtail; int tb_length; cachedCharSeq S, S_view; int nviews, v, *view_start, *view_width, view_offset; MatchPDictBuf matchpdict_buf; MatchBuf global_match_buf; tb_length = _get_PreprocessedTB_length(pptb); headtail = _new_HeadTail(pdict_head, pdict_tail, pptb, max_mismatch, fixed, 1); S = cache_XRaw(subject); matchpdict_buf = new_MatchPDictBuf_from_PDict3Parts(matches_as, pptb, pdict_head, pdict_tail); global_match_buf = _new_MatchBuf(matchpdict_buf.matches.ms_code, tb_length); nviews = LENGTH(views_start); for (v = 0, view_start = INTEGER(views_start), view_width = INTEGER(views_width); v < nviews; v++, view_start++, view_width++) { view_offset = *view_start - 1; if (view_offset < 0 || view_offset + *view_width > S.length) error("'subject' has \"out of limits\" views"); S_view.seq = S.seq + view_offset; S_view.length = *view_width; match_pdict(pptb, &headtail, &S_view, max_mismatch, min_mismatch, fixed, &matchpdict_buf); _MatchPDictBuf_append_and_flush(&global_match_buf, &matchpdict_buf, view_offset); } return _MatchBuf_as_SEXP(&global_match_buf, envir); } /* --- .Call ENTRY POINT --- */ SEXP match_XStringSet_XStringViews(SEXP pattern, SEXP subject, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP matches_as, SEXP envir) { cachedXStringSet P; int P_length, i; cachedCharSeq S, P_elt; const char *algo, *ms_mode; P = _cache_XStringSet(pattern); P_length = _get_cachedXStringSet_length(&P); S = cache_XRaw(subject); algo = CHAR(STRING_ELT(algorithm, 0)); ms_mode = CHAR(STRING_ELT(matches_as, 0)); _init_match_reporting(ms_mode, P_length); for (i = 0; i < P_length; i++) { P_elt = _get_cachedXStringSet_elt(&P, i); _set_active_PSpair(i); _match_pattern_XStringViews(&P_elt, &S, views_start, views_width, max_mismatch, min_mismatch, with_indels, fixed, algo); } return _MatchBuf_as_SEXP(_get_internal_match_buf(), envir); } /**************************************************************************** * .Call entry points: vmatch_PDict3Parts_XStringSet() * vmatch_XStringSet_XStringSet() * * Arguments: * o vmatch_PDict3Parts_XStringSet() only: * - pptb: a PreprocessedTB object; * - pdict_head: head(pdict) (XStringSet or NULL); * - pdict_tail: tail(pdict) (XStringSet or NULL); * o vmatch_XStringSet_XStringSet() only: * - pattern: non-preprocessed pattern dict (XStringSet); * o common arguments: * - subject: reference sequences (XStringSet); * - max_mismatch: max.mismatch (max nb of mismatches *outside* the TB); * - min_mismatch: min.mismatch (min nb of mismatches *outside* the TB); * - fixed: logical vector of length 2; * - collapse, weight: controls how the matrix of match counts must be * collapsed before it's returned to the user (ignored if * 'matches_as' != MATCHES_AS_COUNTS); * - matches_as: "MATCHES_AS_NULL", "MATCHES_AS_WHICH", * "MATCHES_AS_COUNTS" or "MATCHES_AS_ENDS"; * - envir: NULL or environment to be populated with the matches. */ static SEXP vwhich_PDict3Parts_XStringSet(SEXP pptb, HeadTail *headtail, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, MatchPDictBuf *matchpdict_buf) { int S_length, j; cachedXStringSet S; SEXP ans, ans_elt; cachedCharSeq S_elt; S = _cache_XStringSet(subject); S_length = _get_cachedXStringSet_length(&S); PROTECT(ans = NEW_LIST(S_length)); for (j = 0; j < S_length; j++) { S_elt = _get_cachedXStringSet_elt(&S, j); match_pdict(pptb, headtail, &S_elt, max_mismatch, min_mismatch, fixed, matchpdict_buf); PROTECT(ans_elt = _MatchBuf_which_asINTEGER( &(matchpdict_buf->matches))); SET_ELEMENT(ans, j, ans_elt); UNPROTECT(1); _MatchPDictBuf_flush(matchpdict_buf); } UNPROTECT(1); return ans; } static SEXP vwhich_XStringSet_XStringSet(SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm) { cachedXStringSet P, S; int P_length, S_length, i, j; cachedCharSeq P_elt, S_elt; const char *algo; IntAEAE ans_buf; P = _cache_XStringSet(pattern); P_length = _get_cachedXStringSet_length(&P); S = _cache_XStringSet(subject); S_length = _get_cachedXStringSet_length(&S); algo = CHAR(STRING_ELT(algorithm, 0)); ans_buf = new_IntAEAE(S_length, S_length); for (j = 0; j < S_length; j++) IntAE_set_nelt(ans_buf.elts + j, 0); _init_match_reporting("MATCHES_AS_COUNTS", 1); for (i = 0; i < P_length; i++) { P_elt = _get_cachedXStringSet_elt(&P, i); for (j = 0; j < S_length; j++) { S_elt = _get_cachedXStringSet_elt(&S, j); _match_pattern_XString(&P_elt, &S_elt, max_mismatch, min_mismatch, with_indels, fixed, algo); if (_get_match_count() != 0) IntAE_insert_at(ans_buf.elts + j, IntAE_get_nelt(ans_buf.elts + j), i + 1); _drop_reported_matches(); } } return new_LIST_from_IntAEAE(&ans_buf, 1); } static SEXP vcount_PDict3Parts_XStringSet(SEXP pptb, HeadTail *headtail, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP collapse, SEXP weight, MatchPDictBuf *matchpdict_buf) { int tb_length, S_length, collapse0, i, j, match_count, *ans_col; cachedXStringSet S; SEXP ans; cachedCharSeq S_elt; const IntAE *count_buf; tb_length = _get_PreprocessedTB_length(pptb); S = _cache_XStringSet(subject); S_length = _get_cachedXStringSet_length(&S); collapse0 = INTEGER(collapse)[0]; if (collapse0 == 0) { PROTECT(ans = allocMatrix(INTSXP, tb_length, S_length)); ans_col = INTEGER(ans); } else { PROTECT(ans = init_vcount_collapsed_ans(tb_length, S_length, collapse0, weight)); } for (j = 0; j < S_length; j++) { S_elt = _get_cachedXStringSet_elt(&S, j); match_pdict(pptb, headtail, &S_elt, max_mismatch, min_mismatch, fixed, matchpdict_buf); count_buf = &(matchpdict_buf->matches.match_counts); /* 'IntAE_get_nelt(count_buf)' is 'tb_length' */ if (collapse0 == 0) { memcpy(ans_col, count_buf->elts, sizeof(int) * tb_length); ans_col += tb_length; } else { for (i = 0; i < tb_length; i++) { match_count = count_buf->elts[i]; update_vcount_collapsed_ans(ans, match_count, i, j, collapse0, weight); } } _MatchPDictBuf_flush(matchpdict_buf); } UNPROTECT(1); return ans; } static SEXP vcount_XStringSet_XStringSet(SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP collapse, SEXP weight) { cachedXStringSet P, S; int P_length, S_length, collapse0, i, j, match_count, *ans_elt; const char *algo; SEXP ans; cachedCharSeq P_elt, S_elt; P = _cache_XStringSet(pattern); P_length = _get_cachedXStringSet_length(&P); S = _cache_XStringSet(subject); S_length = _get_cachedXStringSet_length(&S); algo = CHAR(STRING_ELT(algorithm, 0)); collapse0 = INTEGER(collapse)[0]; if (collapse0 == 0) PROTECT(ans = allocMatrix(INTSXP, P_length, S_length)); else PROTECT(ans = init_vcount_collapsed_ans(P_length, S_length, collapse0, weight)); _init_match_reporting("MATCHES_AS_COUNTS", 1); for (i = 0; i < P_length; i++) { P_elt = _get_cachedXStringSet_elt(&P, i); if (collapse0 == 0) ans_elt = INTEGER(ans) + i; for (j = 0; j < S_length; j++) { S_elt = _get_cachedXStringSet_elt(&S, j); _match_pattern_XString(&P_elt, &S_elt, max_mismatch, min_mismatch, with_indels, fixed, algo); match_count = _get_match_count(); if (collapse0 == 0) { *ans_elt = match_count; ans_elt += P_length; } else { update_vcount_collapsed_ans(ans, match_count, i, j, collapse0, weight); } _drop_reported_matches(); } } UNPROTECT(1); return ans; } /* --- .Call ENTRY POINT --- */ SEXP vmatch_PDict3Parts_XStringSet(SEXP pptb, SEXP pdict_head, SEXP pdict_tail, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP collapse, SEXP weight, SEXP matches_as, SEXP envir) { HeadTail headtail; MatchPDictBuf matchpdict_buf; headtail = _new_HeadTail(pdict_head, pdict_tail, pptb, max_mismatch, fixed, 1); matchpdict_buf = new_MatchPDictBuf_from_PDict3Parts(matches_as, pptb, pdict_head, pdict_tail); switch (matchpdict_buf.matches.ms_code) { case MATCHES_AS_NULL: error("vmatch_PDict3Parts_XStringSet() does not support " "'matches_as=\"%s\"' yet, sorry", CHAR(STRING_ELT(matches_as, 0))); case MATCHES_AS_WHICH: return vwhich_PDict3Parts_XStringSet(pptb, &headtail, subject, max_mismatch, min_mismatch, fixed, &matchpdict_buf); case MATCHES_AS_COUNTS: return vcount_PDict3Parts_XStringSet(pptb, &headtail, subject, max_mismatch, min_mismatch, fixed, collapse, weight, &matchpdict_buf); } error("vmatchPDict() is not supported yet, sorry"); return R_NilValue; } /* --- .Call ENTRY POINT --- */ SEXP vmatch_XStringSet_XStringSet(SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP collapse, SEXP weight, SEXP matches_as, SEXP envir) { const char *ms_mode; int ms_code; ms_mode = CHAR(STRING_ELT(matches_as, 0)); ms_code = _get_match_storing_code(ms_mode); switch (ms_code) { case MATCHES_AS_NULL: error("vmatch_XStringSet_XStringSet() does not support " "'matches_as=\"%s\"' yet, sorry", ms_mode); case MATCHES_AS_WHICH: return vwhich_XStringSet_XStringSet(pattern, subject, max_mismatch, min_mismatch, with_indels, fixed, algorithm); case MATCHES_AS_COUNTS: return vcount_XStringSet_XStringSet(pattern, subject, max_mismatch, min_mismatch, with_indels, fixed, algorithm, collapse, weight); } error("vmatchPDict() is not supported yet, sorry"); return R_NilValue; } Biostrings/src/match_pdict_ACtree2.c0000644000126300012640000011045412241047607021007 0ustar00biocbuildphs_compbio/**************************************************************************** * A fast and compact implementation of the Aho-Corasick algorithm * * for rectangular DNA dictionaries * * * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include /* for div() */ #include /* for UINT_MAX */ static int debug = 0; /* * Internal representation of the Aho-Corasick tree * ------------------------------------------------ * * For this Aho-Corasick implementation, we take advantage of 2 important * properties of the input dictionary (aka pattern set): * 1. It's rectangular (i.e. all patterns have the same length). * 2. It's based on a 4-letter alphabet (4-ary tree). Note that this tree * becomes an oriented graph when we start adding the failure links (or * the shortcut links) to it. * Failure/shortcut links are not precomputed, but computed on-the-fly when * the tree is used to walk along a subject. * A node is represented with either 2 ints (8 bytes) before extension, * or 7 ints (28 bytes) once it has been extended. Extending a node is done * by linking its 2-int part to a 5-int extension (so the 2-int part doesn't * need to be reallocated). * Two separate buffers are used to store the nodes: one for the 2-int parts * of the nodes (every node has one, whether it's extended or not) and one for * the 5-int extensions. Since the number of nodes doesn't change during the * life of the tree, the first buffer will grow only while we are building the * tree (preprocessing) and then it will not change anymore (i.e. when the tree * is used to walk along a subject). However, since failure/shortcut links are * not precomputed, some nodes will need to be extended (and therefore the * second buffer will grow) in order to store the links that are computed * on-the-fly. * The two node buffers are made of R integer vectors so they can be * serialized. * Some testing with real data shows that, typically, less than 10% of the * nodes are already extended right after preprocessing (i.e. before any use * of the PDict object), and that this percentage grows up to 30% or 40% * during the typical life of the PDict object (e.g. after it has been used * to walk along a full genome). * Using node extensions makes the tree more compact in memory than with * fixed-size nodes. The latter tend to waste memory when a high percentage * of them have 1 child only. Also the two buffer approach allows the tree to * grow smoothly without any reallocations while links are added to it. * We use unsigned ints for the node ids so, on Intel i386/x86_64 platforms, * the maximum number of nodes in a tree is 2^32-1 nodes (UINT_MAX is used as * a special value). */ #define MAX_CHILDREN_PER_NODE 4 /* do NOT change this */ /**************************************************************************** * A. GENERAL UTILITIES FOR COMPUTING THE NB OF NODES AND NODE EXTENSIONS * ****************************************************************************/ /* * nleaves = number of leaves in the tree (it's also the number of unique * patterns so 'nleaves' <= 'tb_length'); * depth = depth of the tree (it's also the length of each pattern so 'depth' * = 'tb_width'). * 'nleaves' is assumed to be '<= 4^depth'. The functions below do not check * this and will return invalid results if this is not true. */ static unsigned int count_max_needed_nnodes(int nleaves, int depth) { unsigned int res; int inc, d; res = 0U; inc = 1; for (d = 0; d <= depth; d++) { if (inc >= nleaves) { res += (unsigned int) (depth + 1 - d) * nleaves; break; } res += (unsigned int) inc; inc *= MAX_CHILDREN_PER_NODE; } return res; } static unsigned int count_min_needed_nnodes(int nleaves, int depth) { unsigned int res; int inc, d; div_t q; res = 0U; inc = nleaves; for (d = depth; d >= 0; d--) { if (inc == 1) { res += (unsigned int) (d + 1); break; } res += (unsigned int) inc; q = div(inc, MAX_CHILDREN_PER_NODE); inc = q.quot; if (q.rem != 0) inc++; } return res; } static unsigned int count_max_needed_nnodeexts_at_pp_time(int nleaves, int depth) { unsigned int res; int inc, d, four_power_d; div_t q; res = 0U; for (d = depth - 1; d >= 0; d--) { q = div(nleaves, 2); inc = q.quot; nleaves = inc + q.rem; if (d >= 16) { res += (unsigned int) inc; continue; } four_power_d = 1 << (2 * d); /* = MAX_CHILDREN_PER_NODE ^ d */ if (nleaves <= four_power_d) { res += (unsigned int) inc; continue; } res += count_max_needed_nnodes(four_power_d, d); break; } return res; } #ifdef DEBUG_BIOSTRINGS /* I've checked by hand the output of this function up to depth=3 nleaves=17 * and it looked correct... pffff!!! :-b */ static void debug_node_counting_functions(int maxdepth) { int depth, four_power_d, nleaves, delta; unsigned int max_nn, min_nn, n2; Rprintf("[DEBUG] debug_node_counting_functions():\n"); for (depth = 1; depth <= maxdepth; depth++) { four_power_d = 1 << (2 * depth); /* = MAX_CHILDREN_PER_NODE ^ depth */ for (nleaves = 1; nleaves <= four_power_d; nleaves++) { max_nn = count_max_needed_nnodes(nleaves, depth); min_nn = count_min_needed_nnodes(nleaves, depth); n2 = count_max_needed_nnodeexts_at_pp_time(nleaves, depth); delta = max_nn - nleaves - n2; /* should always be >= 0 */ Rprintf(" depth=%d nleaves=%d --> ", depth, nleaves); Rprintf("max_nn=%u min_nn=%u n2=%u max_nn-nleaves-n2=%d\n", max_nn, min_nn, n2, delta); if (delta < 0) error("max_nn-nleaves-n2 < 0"); } } return; } #endif /**************************************************************************** * B. ACnode AND ACnodeBuf * ****************************************************************************/ #define NOT_AN_ID UINT_MAX /* * A node id (nid) is represented by an unsigned int. The ANSI C standard only * guarantees that an (unsigned) int will take at least 2 bytes in memory i.e. * that UINT_MAX will always be >= 2^16-1 even though, on most modern * platforms (including PC and Mac), an int will take at least 4 bytes in * memory i.e. UINT_MAX will be 2^32-1 or more. * The same apply to nodeext ids (eid). */ typedef struct acnode { int attribs; unsigned int nid_or_eid; } ACnode; #define INTS_PER_NODE (sizeof(ACnode) / sizeof(int)) /* * We must have: * (a) ACNODEBUF_MAX_NBLOCK * ACNODEBUF_MAX_NELT_PER_BLOCK <= UINT_MAX + 1 * (b) ACNODEBUF_MAX_NELT_PER_BLOCK * INTS_PER_NODE <= INT_MAX * On 64-bit Unix/Linux (4 bytes per int): * UINT_MAX = 2^32-1 = 4294967295U * INT_MAX = 2^31-1 = 2147483647 * The following settings are assuming UINT_MAX >= 2^32-1 and * INT_MAX >= 2^31-1. They result in blocks of size 32 MB. */ #define ACNODEBUF_MAX_NBLOCK 1024 /* = 2^10 */ #define ACNODEBUF_MAX_NELT_PER_BLOCK 4194304U /* = 2^22 */ typedef struct acnodebuf { SEXP bab; /* Big Atomic Buffer */ int *nblock; int *lastblock_nelt; ACnode *block[ACNODEBUF_MAX_NBLOCK]; } ACnodeBuf; #define _IS_ROOTNODE(nodebuf, node) ((nodebuf)->block[0] == (node)) static ACnode *get_node_from_buf(ACnodeBuf *buf, unsigned int nid) { unsigned int b, i; b = nid >> 22U; i = nid & (ACNODEBUF_MAX_NELT_PER_BLOCK - 1U); return buf->block[b] + i; } /* --- .Call ENTRY POINT --- */ SEXP ACtree2_nodebuf_max_nblock() { return ScalarInteger(ACNODEBUF_MAX_NBLOCK); } static int ACnodeBuf_is_full(ACnodeBuf *buf) { return *(buf->nblock) == 0 || *(buf->lastblock_nelt) >= ACNODEBUF_MAX_NELT_PER_BLOCK; } static unsigned int get_ACnodeBuf_nelt(const ACnodeBuf *buf) { int nblock; nblock = *(buf->nblock); if (nblock == 0) return 0U; return (unsigned int) (nblock - 1) * ACNODEBUF_MAX_NELT_PER_BLOCK + *(buf->lastblock_nelt); } static ACnodeBuf new_ACnodeBuf(SEXP bab) { ACnodeBuf buf; SEXP bab_blocks; int nblock, b; buf.bab = bab; nblock = *(buf.nblock = _get_BAB_nblock_ptr(bab)); buf.lastblock_nelt = _get_BAB_lastblock_nelt_ptr(bab); bab_blocks = _get_BAB_blocks(bab); for (b = 0; b < nblock; b++) buf.block[b] = (ACnode *) INTEGER(VECTOR_ELT(bab_blocks, b)); return buf; } static void extend_ACnodeBuf(ACnodeBuf *buf) { int length; SEXP bab_block; length = ACNODEBUF_MAX_NELT_PER_BLOCK * INTS_PER_NODE; bab_block = _IntegerBAB_addblock(buf->bab, length); /* sync 'buf->block' with 'buf->bab' */ buf->block[*(buf->nblock) - 1] = (ACnode *) INTEGER(bab_block); return; } static unsigned int new_nid(ACnodeBuf *buf) { unsigned int nid; if (ACnodeBuf_is_full(buf)) extend_ACnodeBuf(buf); nid = get_ACnodeBuf_nelt(buf); if (nid == NOT_AN_ID) error("reached max number of nodes (%u)", NOT_AN_ID); (*(buf->lastblock_nelt))++; return nid; } /**************************************************************************** * C. ACnodeext AND ACnodeextBuf * ****************************************************************************/ typedef struct acnodeext { unsigned int link_nid[MAX_CHILDREN_PER_NODE]; unsigned int flink_nid; } ACnodeext; #define INTS_PER_NODEEXT (sizeof(ACnodeext) / sizeof(int)) /* * We must have: * (a) ACNODEEXTBUF_MAX_NBLOCK * ACNODEEXTBUF_MAX_NELT_PER_BLOCK <= * UINT_MAX + 1 * (b) ACNODEEXTBUF_MAX_NELT_PER_BLOCK * INTS_PER_NODEEXT <= INT_MAX * The following settings are assuming UINT_MAX >= 2^32-1 and * INT_MAX >= 2^31-1. They result in blocks of size 80 MB. */ #define ACNODEEXTBUF_MAX_NBLOCK 1024 /* = 2^10 */ #define ACNODEEXTBUF_MAX_NELT_PER_BLOCK 4194304U /* = 2^22 */ typedef struct acnodeextbuf { SEXP bab; /* Big Atomic Buffer */ int *nblock; int *lastblock_nelt; ACnodeext *block[ACNODEEXTBUF_MAX_NBLOCK]; } ACnodeextBuf; static ACnodeext *get_nodeext_from_buf(ACnodeextBuf *buf, unsigned int eid) { unsigned int b, i; b = eid >> 22U; i = eid & (ACNODEEXTBUF_MAX_NELT_PER_BLOCK - 1U); return buf->block[b] + i; } /* --- .Call ENTRY POINT --- */ SEXP ACtree2_nodeextbuf_max_nblock() { return ScalarInteger(ACNODEEXTBUF_MAX_NBLOCK); } static int ACnodeextBuf_isfull(ACnodeextBuf *buf) { return *(buf->nblock) == 0 || *(buf->lastblock_nelt) >= ACNODEEXTBUF_MAX_NELT_PER_BLOCK; } static unsigned int get_ACnodeextBuf_nelt(ACnodeextBuf *buf) { int nblock; nblock = *(buf->nblock); if (nblock == 0) return 0U; return (unsigned int) (nblock - 1) * ACNODEEXTBUF_MAX_NELT_PER_BLOCK + *(buf->lastblock_nelt); } static ACnodeextBuf new_ACnodeextBuf(SEXP bab) { ACnodeextBuf buf; SEXP bab_blocks; int nblock, b; buf.bab = bab; nblock = *(buf.nblock = _get_BAB_nblock_ptr(bab)); buf.lastblock_nelt = _get_BAB_lastblock_nelt_ptr(bab); bab_blocks = _get_BAB_blocks(bab); for (b = 0; b < nblock; b++) buf.block[b] = (ACnodeext *) INTEGER(VECTOR_ELT(bab_blocks, b)); return buf; } static void extend_ACnodeextBuf(ACnodeextBuf *buf) { int length; SEXP bab_block; length = ACNODEEXTBUF_MAX_NELT_PER_BLOCK * INTS_PER_NODEEXT; bab_block = _IntegerBAB_addblock(buf->bab, length); /* sync 'buf->block' with 'buf->bab' */ buf->block[*(buf->nblock) - 1] = (ACnodeext *) INTEGER(bab_block); return; } static unsigned int new_eid(ACnodeextBuf *buf) { unsigned int eid; if (ACnodeextBuf_isfull(buf)) extend_ACnodeextBuf(buf); eid = get_ACnodeextBuf_nelt(buf); (*(buf->lastblock_nelt))++; return eid; } /**************************************************************************** * D. ACtree * ****************************************************************************/ #define LINKTAG_BITSHIFT 28 #define MAX_DEPTH ((1 << LINKTAG_BITSHIFT) - 1) #define ISLEAF_BIT (1 << 30) #define ISEXTENDED_BIT (ISLEAF_BIT << 1) /* strongest bit for 32-bit integers */ #define MAX_P_ID (ISLEAF_BIT - 1) /* P_id values are encoded on 30 bits */ #define IS_EXTENDEDNODE(node) ((node)->attribs & ISEXTENDED_BIT) #define _NODE_DEPTH(node) ((node)->attribs & MAX_DEPTH) /* result of NODE_P_ID() is undefined on a non-leaf node */ #define NODE_P_ID(node) ((node)->attribs & MAX_P_ID) /* --- .Call ENTRY POINT --- */ SEXP debug_match_pdict_ACtree2() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); if (debug) { Rprintf("[DEBUG] debug_match_pdict_ACtree2():\n"); Rprintf(" INTS_PER_NODE=%d INTS_PER_NODEEXT=%d\n", INTS_PER_NODE, INTS_PER_NODEEXT); Rprintf(" LINKTAG_BITSHIFT=%d\n" " MAX_DEPTH=%d\n" " ISLEAF_BIT=%d ISEXTENDED_BIT=%d\n" " MAX_P_ID=%d\n", LINKTAG_BITSHIFT, MAX_DEPTH, ISLEAF_BIT, ISEXTENDED_BIT, MAX_P_ID); debug_node_counting_functions(3); } #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } /* * Always set 'max_nodeextbuf_nelt' to 0U (no max) and 'dont_extend_nodes' to * 0 during preprocessing. */ typedef struct actree { int depth; /* this is the depth of all leaf nodes */ ACnodeBuf nodebuf; ACnodeextBuf nodeextbuf; ByteTrTable char2linktag; unsigned int max_nodeextbuf_nelt; /* 0U means "no max" */ int dont_extend_nodes; /* always at 0 during preprocessing */ } ACtree; #define GET_NODEEXT(tree, eid) get_nodeext_from_buf(&((tree)->nodeextbuf), eid) static void extend_ACnode(ACtree *tree, ACnode *node) { ACnodeext *nodeext; unsigned int eid; int i, linktag; eid = new_eid(&(tree->nodeextbuf)); if (eid + 1U == tree->max_nodeextbuf_nelt) { tree->dont_extend_nodes = 1; warning("Reached max nb of node extensions (%u) so I will\n" "stop extending the nodes of this ACtree2 object.\n" "As a consequence not all new links and failure\n" "links will be set. This might (slightly) affect\n" "speed but not the results.", tree->max_nodeextbuf_nelt); } nodeext = GET_NODEEXT(tree, eid); for (i = 0; i < MAX_CHILDREN_PER_NODE; i++) nodeext->link_nid[i] = NOT_AN_ID; nodeext->flink_nid = NOT_AN_ID; if (node->nid_or_eid != NOT_AN_ID) { /* this is correct because 'node' cannot be a leaf node */ linktag = node->attribs >> LINKTAG_BITSHIFT; nodeext->link_nid[linktag] = node->nid_or_eid; } node->nid_or_eid = eid; /* sets the ISEXTENDED_BIT bit to 1 */ node->attribs |= ISEXTENDED_BIT; return; } /**************************************************************************** * E. Aho-Corasick tree API * ****************************************************************************/ /* * Formal API */ #define TREE_SIZE(tree) get_ACnodeBuf_nelt(&((tree)->nodebuf)) /* nb nodes */ #define TREE_DEPTH(tree) ((tree)->depth) #define GET_NODE(tree, nid) get_node_from_buf(&((tree)->nodebuf), nid) #define IS_ROOTNODE(tree, node) _IS_ROOTNODE(&((tree)->nodebuf), node) #define IS_LEAFNODE(node) ((node)->attribs & ISLEAF_BIT) #define NODE_DEPTH(tree, node) \ (IS_LEAFNODE(node) ? TREE_DEPTH(tree) : _NODE_DEPTH(node)) #define CHAR2LINKTAG(tree, c) ((tree)->char2linktag.byte2code[(unsigned char) (c)]) #define NEW_NODE(tree, depth) new_ACnode(tree, depth) #define NEW_LEAFNODE(tree, P_id) new_leafACnode(tree, P_id) #define GET_NODE_LINK(tree, node, linktag) \ get_ACnode_link(tree, node, linktag) #define SET_NODE_LINK(tree, node, linktag, nid) \ set_ACnode_link(tree, node, linktag, nid) #define GET_NODE_FLINK(tree, node) get_ACnode_flink(tree, node) #define SET_NODE_FLINK(tree, node, nid) set_ACnode_flink(tree, node, nid) /* * API implementation */ static unsigned int new_ACnode(ACtree *tree, int depth) { ACnodeBuf *nodebuf; unsigned int nid; ACnode *node; if (depth >= TREE_DEPTH(tree)) error("new_ACnode(): depth >= TREE_DEPTH(tree)"); nodebuf = &(tree->nodebuf); nid = new_nid(nodebuf); node = get_node_from_buf(nodebuf, nid); /* this sets the ISEXTENDED_BIT and ISLEAF_BIT bits to 0 */ node->attribs = depth; node->nid_or_eid = NOT_AN_ID; return nid; } static unsigned int new_leafACnode(ACtree *tree, int P_id) { ACnodeBuf *nodebuf; unsigned int nid; ACnode *node; nodebuf = &(tree->nodebuf); nid = new_nid(nodebuf); node = get_node_from_buf(nodebuf, nid); /* this sets the ISEXTENDED_BIT bit to 0 and ISLEAF_BIT bit to 1 */ node->attribs = ISLEAF_BIT | P_id; node->nid_or_eid = NOT_AN_ID; return nid; } static unsigned int get_ACnode_link(ACtree *tree, ACnode *node, int linktag) { ACnodeext *nodeext; if (node->nid_or_eid == NOT_AN_ID) return NOT_AN_ID; if (IS_EXTENDEDNODE(node)) { nodeext = GET_NODEEXT(tree, node->nid_or_eid); return nodeext->link_nid[linktag]; } /* the node has no extension and is not a leaf node */ if (linktag == (node->attribs >> LINKTAG_BITSHIFT)) return node->nid_or_eid; return NOT_AN_ID; } /* * set_ACnode_flink() should always have been called before set_ACnode_link() * on a leaf node. So we can assume that, if set_ACnode_link() is called on a * leaf node, then this node is already extended. */ static void set_ACnode_link(ACtree *tree, ACnode *node, int linktag, unsigned int nid) { ACnodeext *nodeext; if (node->nid_or_eid == NOT_AN_ID) { /* cannot be a leaf node (see assumption above) and no need to extend it */ node->attribs |= linktag << LINKTAG_BITSHIFT; node->nid_or_eid = nid; return; } if (!IS_EXTENDEDNODE(node)) { if (tree->dont_extend_nodes) { /* NEVER during preprocessing */ return; } /* again, cannot be a leaf node (see assumption above) */ extend_ACnode(tree, node); } nodeext = GET_NODEEXT(tree, node->nid_or_eid); nodeext->link_nid[linktag] = nid; return; } static unsigned int get_ACnode_flink(ACtree *tree, const ACnode *node) { ACnodeext *nodeext; if (!IS_EXTENDEDNODE(node)) return NOT_AN_ID; nodeext = GET_NODEEXT(tree, node->nid_or_eid); return nodeext->flink_nid; } static void set_ACnode_flink(ACtree *tree, ACnode *node, unsigned int nid) { ACnodeext *nodeext; if (!IS_EXTENDEDNODE(node)) { if (tree->dont_extend_nodes) return; extend_ACnode(tree, node); } nodeext = GET_NODEEXT(tree, node->nid_or_eid); //Rprintf("set flink: %d --> %d\n", node - GET_NODE(tree, 0U), nid); nodeext->flink_nid = nid; return; } /* * Not part of the API */ static ACtree new_ACtree(int tb_length, int tb_width, SEXP base_codes, SEXP nodebuf_ptr, SEXP nodeextbuf_ptr) { ACtree tree; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] new_ACtree():\n" " tb_length=%d tb_width=%d\n", tb_length, tb_width); } #endif if (tb_length > MAX_P_ID) error("new_ACtree(): tb_length > MAX_P_ID"); if (tb_width > MAX_DEPTH) error("new_ACtree(): tb_width > MAX_DEPTH"); if (LENGTH(base_codes) != MAX_CHILDREN_PER_NODE) error("Biostrings internal error in new_ACtree(): " "LENGTH(base_codes) != MAX_CHILDREN_PER_NODE"); tree.depth = tb_width; tree.nodebuf = new_ACnodeBuf(nodebuf_ptr); tree.nodeextbuf = new_ACnodeextBuf(nodeextbuf_ptr); _init_byte2offset_with_INTEGER(&(tree.char2linktag), base_codes, 1); tree.max_nodeextbuf_nelt = 0U; tree.dont_extend_nodes = 0; NEW_NODE(&tree, 0); /* create the root node */ return tree; } static unsigned int a_nice_max_nodeextbuf_nelt(int nnodes) { unsigned int n, rem; /* when nb of nodeexts has reached 0.40 * nb of nodes, then the size in memory of the 2 buffers (nodebuf and nodeextbuf) is about the same */ n = (unsigned int) (0.40 * nnodes); /* then we round up to the closer multiple of ACNODEBUF_MAX_NELT_PER_BLOCK so we don't waste space in the last block */ rem = n % ACNODEBUF_MAX_NELT_PER_BLOCK; if (rem != 0U) n += ACNODEBUF_MAX_NELT_PER_BLOCK - rem; return n; } static ACtree pptb_asACtree(SEXP pptb) { ACtree tree; SEXP base_codes; unsigned int max_nelt, nelt; tree.depth = _get_PreprocessedTB_width(pptb); tree.nodebuf = new_ACnodeBuf(_get_ACtree2_nodebuf_ptr(pptb)); tree.nodeextbuf = new_ACnodeextBuf(_get_ACtree2_nodeextbuf_ptr(pptb)); base_codes = _get_PreprocessedTB_base_codes(pptb); if (LENGTH(base_codes) != MAX_CHILDREN_PER_NODE) error("Biostrings internal error in pptb_asACtree(): " "LENGTH(base_codes) != MAX_CHILDREN_PER_NODE"); _init_byte2offset_with_INTEGER(&(tree.char2linktag), base_codes, 1); /* Using max_nelt = 0U will turn off the "dont_extend_nodes" feature for now. Seems like having dont_extend_nodes at 1 causes segfaults. To reproduce, put tree.dont_extend_nodes = 1; just before the return statement below and reinstall (i.e. recompile) Biostrings. Then run the following code: library(Biostrings) dict0 <- DNAStringSet(c("TACCNG", "TAGT", "CGGNT", "AGTAG", "TAGT")) pdict <- PDict(dict0, tb.end=3) subject <- DNAString("TAGTACCAGTTTCGGG") m0 <- matchPDict(pdict, subject) m1 <- matchPDict(pdict, subject, max.mismatch=1) Is the "dont_extend_nodes" feature reasonable i.e. is it safe to not set all new links and failure links? Still need to think about it. */ //max_nelt = a_nice_max_nodeextbuf_nelt(TREE_SIZE(&tree)); max_nelt = 0U; tree.max_nodeextbuf_nelt = max_nelt; nelt = get_ACnodeextBuf_nelt(&(tree.nodeextbuf)); tree.dont_extend_nodes = max_nelt != 0U && nelt >= max_nelt; return tree; } /**************************************************************************** * F. STATS AND DEBUG UTILITIES * ****************************************************************************/ static void print_ACnode(ACtree *tree, ACnode *node) { error("print_ACnode(): implement me"); return; } static int get_ACnode_nlink(ACtree *tree, ACnode *node) { int nlink, linktag; nlink = get_ACnode_flink(tree, node) != NOT_AN_ID; for (linktag = 0; linktag < MAX_CHILDREN_PER_NODE; linktag++) if (get_ACnode_link(tree, node, linktag) != NOT_AN_ID) nlink++; return nlink; } /* --- .Call ENTRY POINT --- */ SEXP ACtree2_nnodes(SEXP pptb) { ACtree tree; tree = pptb_asACtree(pptb); return ScalarInteger(TREE_SIZE(&tree)); } /* --- .Call ENTRY POINT --- */ SEXP ACtree2_print_nodes(SEXP pptb) { ACtree tree; unsigned int nnodes, nid; ACnodeBuf *nodebuf; ACnode *node; tree = pptb_asACtree(pptb); nnodes = TREE_SIZE(&tree); nodebuf = &(tree.nodebuf); for (nid = 0U; nid < nnodes; nid++) { node = get_node_from_buf(nodebuf, nid); print_ACnode(&tree, node); } return R_NilValue; } /* --- .Call ENTRY POINT --- */ SEXP ACtree2_summary(SEXP pptb) { ACtree tree; unsigned int nnodes, nlink_table[MAX_CHILDREN_PER_NODE+2], nid, max_nn, min_nn; ACnodeBuf *nodebuf; ACnode *node; int nleaves, nlink; tree = pptb_asACtree(pptb); nnodes = TREE_SIZE(&tree); nodebuf = &(tree.nodebuf); Rprintf("| Total nb of nodes = %u\n", nnodes); for (nlink = 0; nlink < MAX_CHILDREN_PER_NODE+2; nlink++) nlink_table[nlink] = 0U; nleaves = 0; for (nid = 0U; nid < nnodes; nid++) { node = get_node_from_buf(nodebuf, nid); nlink = get_ACnode_nlink(&tree, node); nlink_table[nlink]++; if (IS_LEAFNODE(node)) nleaves++; } for (nlink = 0; nlink < MAX_CHILDREN_PER_NODE+2; nlink++) Rprintf("| - %u nodes (%.2f%) with %d links\n", nlink_table[nlink], 100.00 * nlink_table[nlink] / nnodes, nlink); Rprintf("| Nb of leaf nodes (nleaves) = %d\n", nleaves); max_nn = count_max_needed_nnodes(nleaves, TREE_DEPTH(&tree)); min_nn = count_min_needed_nnodes(nleaves, TREE_DEPTH(&tree)); Rprintf("| - max_needed_nnodes(nleaves, TREE_DEPTH) = %u\n", max_nn); Rprintf("| - min_needed_nnodes(nleaves, TREE_DEPTH) = %u\n", min_nn); return R_NilValue; } /**************************************************************************** * G. PREPROCESSING * ****************************************************************************/ static void add_pattern(ACtree *tree, const cachedCharSeq *P, int P_offset) { int P_id, depth, dmax, linktag; unsigned int nid1, nid2; ACnode *node1, *node2; P_id = P_offset + 1; dmax = TREE_DEPTH(tree) - 1; for (depth = 0, nid1 = 0U; depth <= dmax; depth++, nid1 = nid2) { node1 = GET_NODE(tree, nid1); linktag = CHAR2LINKTAG(tree, P->seq[depth]); if (linktag == NA_INTEGER) error("non base DNA letter found in Trusted Band " "for pattern %d", P_id); nid2 = GET_NODE_LINK(tree, node1, linktag); if (depth < dmax) { if (nid2 != NOT_AN_ID) continue; nid2 = NEW_NODE(tree, depth + 1); SET_NODE_LINK(tree, node1, linktag, nid2); continue; } if (nid2 != NOT_AN_ID) { node2 = GET_NODE(tree, nid2); _report_ppdup(P_offset, NODE_P_ID(node2)); } else { nid2 = NEW_LEAFNODE(tree, P_id); SET_NODE_LINK(tree, node1, linktag, nid2); } } return; } /* --- .Call ENTRY POINT --- * Arguments: * tb: the Trusted Band extracted from the input dictionary as a * rectangular DNAStringSet object; * pp_exclude: NULL or an integer vector of the same length as 'tb' where * non-NA values indicate the elements to exclude from * preprocessing; * base_codes: the internal codes for A, C, G and T. */ SEXP ACtree2_build(SEXP tb, SEXP pp_exclude, SEXP base_codes, SEXP nodebuf_ptr, SEXP nodeextbuf_ptr) { ACtree tree; int tb_length, tb_width, P_offset; cachedXStringSet cached_tb; cachedCharSeq P; SEXP ans, ans_names, ans_elt; tb_length = _get_XStringSet_length(tb); if (tb_length == 0) error("Trusted Band is empty"); _init_ppdups_buf(tb_length); tb_width = -1; cached_tb = _cache_XStringSet(tb); for (P_offset = 0; P_offset < tb_length; P_offset++) { /* skip duplicated patterns */ if (pp_exclude != R_NilValue && INTEGER(pp_exclude)[P_offset] != NA_INTEGER) continue; P = _get_cachedXStringSet_elt(&cached_tb, P_offset); if (tb_width == -1) { if (P.length == 0) error("first element in Trusted Band " "is of length 0"); tb_width = P.length; tree = new_ACtree(tb_length, tb_width, base_codes, nodebuf_ptr, nodeextbuf_ptr); } else if (P.length != tb_width) { error("element %d in Trusted Band has a different " "length than first element", P_offset + 1); } add_pattern(&tree, &P, P_offset); } PROTECT(ans = NEW_LIST(2)); /* set the names */ PROTECT(ans_names = NEW_CHARACTER(2)); SET_STRING_ELT(ans_names, 0, mkChar("ACtree")); SET_STRING_ELT(ans_names, 1, mkChar("high2low")); SET_NAMES(ans, ans_names); UNPROTECT(1); /* set the "ACtree" element */ SET_ELEMENT(ans, 0, R_NilValue); /* set the "high2low" element */ PROTECT(ans_elt = _get_ppdups_buf_asINTEGER()); SET_ELEMENT(ans, 1, ans_elt); UNPROTECT(1); UNPROTECT(1); return ans; } /**************************************************************************** * H. CORE AHO-CORASICK WALKING HELPERS * ****************************************************************************/ /* * The core Aho-Corasick walking helpers use recursion and indirect * recursion: * o transition() calls compute_flink() and transition(); * o compute_flink() calls transition(); * A trick is to have the path from the root node to the current node 'node' * stored at *negative* indices in 'node_path' i.e., if d is the depth of * 'node', then the path is node_path[-d], node_path[-d+1], node_path[-d+2], * ..., node_path[-1]. */ static unsigned int compute_flink(ACtree *tree, const ACnode *node, const char *node_path); /* * 'node_path' will only be used to compute failure links so it's safe to not * provide it (i.e. NULL) if all the nodes already have one. */ static unsigned int transition(ACtree *tree, ACnode *node, const char *node_path, int linktag) { unsigned int link, flink; if (linktag == NA_INTEGER) return 0U; link = GET_NODE_LINK(tree, node, linktag); if (link != NOT_AN_ID) return link; if (IS_ROOTNODE(tree, node)) return 0U; flink = GET_NODE_FLINK(tree, node); if (flink == NOT_AN_ID) { flink = compute_flink(tree, node, node_path); SET_NODE_FLINK(tree, node, flink); } link = transition(tree, GET_NODE(tree, flink), node_path, linktag); SET_NODE_LINK(tree, node, linktag, link); /* sets a shortcut */ return link; } static unsigned int compute_flink(ACtree *tree, const ACnode *node, const char *node_path) { int seq_len, n, linktag; const char *seq, *node1_path; unsigned int nid; ACnode *node1; /* 'seq' is obtained by trimming the first letter from the node path */ seq_len = NODE_DEPTH(tree, node) - 1; seq = node_path - seq_len; /* walk on 'seq' */ nid = 0U; for (n = 0, node1_path = seq; n < seq_len; n++, node1_path++) { node1 = GET_NODE(tree, nid); linktag = CHAR2LINKTAG(tree, *node1_path); nid = transition(tree, node1, node1_path, linktag); } return nid; } static int has_all_flinks(ACtree *tree) { unsigned int nnodes, nid, flink; const ACnode *node; nnodes = TREE_SIZE(tree); for (nid = 1U; nid < nnodes; nid++) { node = GET_NODE(tree, nid); flink = GET_NODE_FLINK(tree, node); if (flink == NOT_AN_ID) return 0; } return 1; } static void compute_flinks_along_pattern(ACtree *tree, const cachedCharSeq *P) { ACnode *node; int n, linktag; const char *node_path; unsigned int nid, flink; node = GET_NODE(tree, 0U); node_path = P->seq; for (n = 1; n <= P->length; n++) { linktag = CHAR2LINKTAG(tree, *node_path); nid = transition(tree, node, node_path, linktag); node = GET_NODE(tree, nid); node_path++; flink = GET_NODE_FLINK(tree, node); if (flink == NOT_AN_ID) { flink = compute_flink(tree, node, node_path); SET_NODE_FLINK(tree, node, flink); } } return; } static void compute_all_flinks(ACtree *tree, const cachedXStringSet *tb) { unsigned int nnodes, nid; ACnode *node; int P_offset; cachedCharSeq P; nnodes = TREE_SIZE(tree); for (nid = 1U; nid < nnodes; nid++) { node = GET_NODE(tree, nid); if (!IS_LEAFNODE(node)) continue; P_offset = NODE_P_ID(node) - 1; P = _get_cachedXStringSet_elt(tb, P_offset); compute_flinks_along_pattern(tree, &P); } return; } /* --- .Call ENTRY POINT --- */ SEXP ACtree2_has_all_flinks(SEXP pptb) { ACtree tree; tree = pptb_asACtree(pptb); return ScalarLogical(has_all_flinks(&tree)); } /* --- .Call ENTRY POINT --- */ SEXP ACtree2_compute_all_flinks(SEXP pptb) { ACtree tree; SEXP tb; cachedXStringSet cached_tb; tree = pptb_asACtree(pptb); tb = _get_PreprocessedTB_tb(pptb); cached_tb = _cache_XStringSet(tb); compute_all_flinks(&tree, &cached_tb); return R_NilValue; } /**************************************************************************** * I. MATCH FINDING * ****************************************************************************/ /* Does report matches */ static void walk_tb_subject(ACtree *tree, const cachedCharSeq *S, TBMatchBuf *tb_matches) { ACnode *node; int n, linktag; const char *node_path; unsigned int nid; node = GET_NODE(tree, 0U); node_path = S->seq; for (n = 1; n <= S->length; n++) { linktag = CHAR2LINKTAG(tree, *node_path); nid = transition(tree, node, node_path, linktag); node = GET_NODE(tree, nid); node_path++; if (IS_LEAFNODE(node)) _TBMatchBuf_report_match(tb_matches, NODE_P_ID(node) - 1, n); } return; } /* 1st helper function for walk_tb_nonfixed_subject() */ #define NODE_SUBSET_MAXSIZE 5000000 /* 5 million node pointers */ static ACnode *node_subset[NODE_SUBSET_MAXSIZE]; static int node_subset_size = 0; static void split_and_move_pointers(ACtree *tree, unsigned char c) { int node_subset_size0, i, is_first, j, linktag; ACnode *node0, *node1, *node2; unsigned char base; unsigned int nid; node0 = GET_NODE(tree, 0U); node_subset_size0 = node_subset_size; for (i = 0; i < node_subset_size0; i++) { node1 = node_subset[i]; is_first = 1; for (j = 0, base = 1; j < 4; j++, base *= 2) { if ((c & base) == 0) continue; linktag = CHAR2LINKTAG(tree, base); nid = transition(tree, node1, NULL, linktag); //Rprintf("%d --[%d]--> %d\n", node1 - node0, base, nid); node2 = GET_NODE(tree, nid); if (is_first) { node_subset[i] = node2; is_first = 0; } else { if (node_subset_size >= NODE_SUBSET_MAXSIZE) { node_subset_size = 0; error("too many IUPAC ambiguity " "letters in 'subject'"); } node_subset[node_subset_size++] = node2; } } } return; } /* 2nd helper function for walk_tb_nonfixed_subject() */ static int compar_node_pointers_for_sort(const void *p1, const void *p2) { return *((const ACnode * const *) p1) - *((const ACnode * const *) p2); } static void sort_node_pointer_array(ACnode **x, int nelt) { qsort(x, nelt, sizeof(ACnode *), compar_node_pointers_for_sort); return; } static void merge_pointers(ACtree *tree, int n) { int i1, i2; ACnode *node0, *node1, *node2; node0 = GET_NODE(tree, 0U); /* Rprintf("n=%d nodes before merging: ", n); for (i1 = 0; i1 < node_subset_size; i1++) { node1 = node_subset[i1]; Rprintf(" %d", node1 - node0); } Rprintf("\n"); */ sort_node_pointer_array(node_subset, node_subset_size); i1 = 0; node1 = node_subset[i1]; for (i2 = 1; i2 < node_subset_size; i2++) { node2 = node_subset[i2]; if (node2 == node1) continue; i1++; node1 = node_subset[i1] = node2; } node_subset_size = i1 + 1; /* Rprintf("n=%d nodes after merging: ", n); for (i1 = 0; i1 < node_subset_size; i1++) { node1 = node_subset[i1]; Rprintf(" %d", node1 - node0); } Rprintf("\n"); */ return; } static void report_matches(TBMatchBuf *tb_matches, int n) { int i; ACnode *node; for (i = 0; i < node_subset_size; i++) { node = node_subset[i]; if (IS_LEAFNODE(node)) _TBMatchBuf_report_match(tb_matches, NODE_P_ID(node) - 1, n); } return; } /* Does report matches */ static void walk_tb_nonfixed_subject(ACtree *tree, const cachedCharSeq *S, TBMatchBuf *tb_matches) { int max_size, n; const unsigned char *c; if (node_subset_size != 0) error("Biostrings internal error in " "walk_tb_nonfixed_subject(): node_subset_size != 0... " "PLEASE REPORT THIS! THANKS.\n"); node_subset_size = max_size = 1; node_subset[0] = GET_NODE(tree, 0U); for (n = 1, c = (unsigned char *) S->seq; n <= S->length; n++, c++) { if (*c >= 16) { /* '*c' is not an IUPAC (base or extended) code */ node_subset[0] = GET_NODE(tree, 0U); node_subset_size = 1; continue; } split_and_move_pointers(tree, *c); merge_pointers(tree, n); /* if (node_subset_size > max_size) { max_size = node_subset_size; Rprintf("walk_tb_nonfixed_subject(): " "n=%d max_size=%d\n", n, max_size); } */ report_matches(tb_matches, n); } node_subset_size = 0; return; } /* Entry point for the MATCH FINDING section */ void _match_tbACtree2(SEXP pptb, const cachedCharSeq *S, int fixedS, TBMatchBuf *tb_matches) { ACtree tree; SEXP tb; cachedXStringSet cached_tb; tree = pptb_asACtree(pptb); if (fixedS) { walk_tb_subject(&tree, S, tb_matches); return; } if (!has_all_flinks(&tree)) { tb = _get_PreprocessedTB_tb(pptb); cached_tb = _cache_XStringSet(tb); //Rprintf("computing all flinks... "); compute_all_flinks(&tree, &cached_tb); //Rprintf("OK\n"); } walk_tb_nonfixed_subject(&tree, S, tb_matches); return; } /**************************************************************************** * J. MORE MATCH FINDING * ****************************************************************************/ /* Does report matches */ static void walk_pdict_subject(ACtree *tree, SEXP low2high, HeadTail *headtail, const cachedCharSeq *S, int max_nmis, int min_nmis, int fixedP, MatchPDictBuf *matchpdict_buf) { ACnode *node; int n, linktag; unsigned int nid; const char *node_path; node = GET_NODE(tree, 0U); node_path = S->seq; for (n = 1; n <= S->length; n++) { linktag = CHAR2LINKTAG(tree, *node_path); nid = transition(tree, node, node_path, linktag); node = GET_NODE(tree, nid); node_path++; if (IS_LEAFNODE(node)) _match_pdict_flanks_at(NODE_P_ID(node) - 1, low2high, headtail, S, n, max_nmis, min_nmis, fixedP, matchpdict_buf); } return; } /* Does report matches */ static void walk_pdict_nonfixed_subject(ACtree *tree, SEXP low2high, HeadTail *headtail, const cachedCharSeq *S, int max_nmis, int min_nmis, int fixedP, MatchPDictBuf *matchpdict_buf) { error("walk_pdict_nonfixed_subject(): implement me"); return; } void _match_pdictACtree2(SEXP pptb, HeadTail *headtail, const cachedCharSeq *S, int max_nmis, int min_nmis, int fixedP, int fixedS, MatchPDictBuf *matchpdict_buf) { ACtree tree; SEXP low2high; tree = pptb_asACtree(pptb); low2high = _get_PreprocessedTB_low2high(pptb); if (fixedS) walk_pdict_subject(&tree, low2high, headtail, S, max_nmis, min_nmis, fixedP, matchpdict_buf); else walk_pdict_nonfixed_subject(&tree, low2high, headtail, S, max_nmis, min_nmis, fixedP, matchpdict_buf); return; } Biostrings/src/match_pdict_Twobit.c0000644000126300012640000001541512241047607021033 0ustar00biocbuildphs_compbio/**************************************************************************** * The Twobit algorithm * * for constant width DNA dictionaries * * * * Author: Herve Pages * * * * Note: a constant width dictionary is a non-empty set of non-empty * * words of the same length. * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static int debug = 0; SEXP debug_match_pdict_Twobit() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'match_pdict_Twobit.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'match_pdict_Twobit.c'\n"); #endif return R_NilValue; } /**************************************************************************** * * * A. PREPROCESSING * * * ****************************************************************************/ static void init_twobit_sign2pos(SEXP twobit_sign2pos, int val0) { int i; for (i = 0; i < LENGTH(twobit_sign2pos); i++) INTEGER(twobit_sign2pos)[i] = val0; return; } static int pp_pattern(SEXP twobit_sign2pos, TwobitEncodingBuffer *teb, const cachedCharSeq *pattern, int poffset) { int twobit_sign, *pos0; //printf("poffset=%d: ", poffset); twobit_sign = _get_twobit_signature(teb, pattern); if (twobit_sign == NA_INTEGER) return -1; //printf("twobit_sign=%d\n", twobit_sign); pos0 = INTEGER(twobit_sign2pos) + twobit_sign; if (*pos0 == NA_INTEGER) *pos0 = poffset + 1; else _report_ppdup(poffset, *pos0); return 0; } /**************************************************************************** * Turning our local data structures into an R list (SEXP) * ------------------------------------------------------- */ /* * Twobit_asLIST() returns an R list with the following elements: * - sign2pos: XInteger object; * - high2low: an integer vector containing the mapping between duplicated and * primary reads. */ static SEXP Twobit_asLIST(SEXP twobit_sign2pos) { SEXP ans, ans_names, ans_elt; PROTECT(ans = NEW_LIST(2)); /* set the names */ PROTECT(ans_names = NEW_CHARACTER(2)); SET_STRING_ELT(ans_names, 0, mkChar("sign2pos")); SET_STRING_ELT(ans_names, 1, mkChar("high2low")); SET_NAMES(ans, ans_names); UNPROTECT(1); /* set the "sign2pos" element */ PROTECT(ans_elt = new_XInteger_from_tag("XInteger", twobit_sign2pos)); SET_ELEMENT(ans, 0, ans_elt); UNPROTECT(1); /* set the "high2low" element */ PROTECT(ans_elt = _get_ppdups_buf_asINTEGER()); SET_ELEMENT(ans, 1, ans_elt); UNPROTECT(1); UNPROTECT(1); return ans; } /**************************************************************************** * .Call entry point for preprocessing * ----------------------------------- * * Arguments: * tb: the Trusted Band extracted from the original dictionary as a * DNAStringSet object; * pp_exclude: NULL or an integer vector of the same length as 'tb' where * non-NA values indicate the elements to exclude from * preprocessing; * base_codes: the internal codes for A, C, G and T. * * See Twobit_asLIST() for a description of the returned SEXP. */ SEXP build_Twobit(SEXP tb, SEXP pp_exclude, SEXP base_codes) { int tb_length, tb_width, poffset, twobit_len; cachedXStringSet cached_tb; cachedCharSeq pattern; TwobitEncodingBuffer teb; SEXP ans, twobit_sign2pos; tb_length = _get_XStringSet_length(tb); _init_ppdups_buf(tb_length); tb_width = -1; cached_tb = _cache_XStringSet(tb); for (poffset = 0; poffset < tb_length; poffset++) { /* Skip duplicated patterns */ if (pp_exclude != R_NilValue && INTEGER(pp_exclude)[poffset] != NA_INTEGER) continue; pattern = _get_cachedXStringSet_elt(&cached_tb, poffset); if (pattern.length == 0) error("empty trusted region for pattern %d", poffset + 1); if (tb_width == -1) { tb_width = pattern.length; if (tb_width > 14) error("the width of the Trusted Band must " "be <= 14 when 'type=\"Twobit\"'"); teb = _new_TwobitEncodingBuffer(base_codes, tb_width, 0); twobit_len = 1 << (tb_width * 2); // 4^tb_width PROTECT(twobit_sign2pos = NEW_INTEGER(twobit_len)); init_twobit_sign2pos(twobit_sign2pos, NA_INTEGER); } else if (pattern.length != tb_width) { error("all the trusted regions must have " "the same length"); } if (pp_pattern(twobit_sign2pos, &teb, &pattern, poffset) != 0) { UNPROTECT(1); error("non-base DNA letter found in Trusted Band " "for pattern %d", poffset + 1); } } PROTECT(ans = Twobit_asLIST(twobit_sign2pos)); UNPROTECT(2); return ans; } /**************************************************************************** * * * B. MATCH FINDING * * * ****************************************************************************/ void walk_subject(const int *twobit_sign2pos, TwobitEncodingBuffer *teb, const cachedCharSeq *S, TBMatchBuf *tb_matches) { int n, twobit_sign, P_id; const char *s; _reset_twobit_signature(teb); for (n = 1, s = S->seq; n <= S->length; n++, s++) { twobit_sign = _shift_twobit_signature(teb, *s); if (twobit_sign == NA_INTEGER) continue; P_id = twobit_sign2pos[twobit_sign]; if (P_id == NA_INTEGER) continue; _TBMatchBuf_report_match(tb_matches, P_id - 1, n); } return; } void _match_Twobit(SEXP pptb, const cachedCharSeq *S, int fixedS, TBMatchBuf *tb_matches) { int tb_width; const int *twobit_sign2pos; SEXP base_codes; TwobitEncodingBuffer teb; #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] ENTERING _match_Twobit()\n"); #endif tb_width = _get_PreprocessedTB_width(pptb); twobit_sign2pos = INTEGER(_get_Twobit_sign2pos_tag(pptb)); base_codes = _get_PreprocessedTB_base_codes(pptb); teb = _new_TwobitEncodingBuffer(base_codes, tb_width, 0); if (!fixedS) error("cannot treat IUPAC extended letters in the subject " "as ambiguities when 'pdict' is a PDict object of " "the \"Twobit\" type"); walk_subject(twobit_sign2pos, &teb, S, tb_matches); #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] LEAVING _match_Twobit()\n"); #endif return; } Biostrings/src/match_pdict_utils.c0000644000126300012640000006446712241047607020736 0ustar00biocbuildphs_compbio/**************************************************************************** * * * Low-level utility functions used by the matchPDict() C code * * Author: Herve Pages * * * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" #include /* for Salloc() */ #include /* for ULONG_MAX */ #include /* for clock() and CLOCKS_PER_SEC */ static int debug = 0; SEXP debug_match_pdict_utils() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } /**************************************************************************** * Manipulation of the MatchPDictBuf buffer. * * The MatchPDictBuf struct is used for storing the matches found by the * matchPDict() function (and family). */ TBMatchBuf _new_TBMatchBuf(int tb_length, int tb_width, const int *head_widths, const int *tail_widths) { static TBMatchBuf buf; buf.is_init = 1; buf.tb_width = tb_width; buf.head_widths = head_widths; buf.tail_widths = tail_widths; buf.PSlink_ids = new_IntAE(0, 0, 0); buf.match_ends = new_IntAEAE(tb_length, tb_length); return buf; } void _TBMatchBuf_report_match(TBMatchBuf *buf, int PSpair_id, int end) { IntAE *end_buf; int nelt; if (!buf->is_init) return; end_buf = buf->match_ends.elts + PSpair_id; nelt = IntAE_get_nelt(end_buf); if (nelt == 0) IntAE_insert_at(&(buf->PSlink_ids), IntAE_get_nelt(&(buf->PSlink_ids)), PSpair_id); IntAE_insert_at(end_buf, nelt, end); return; } void _TBMatchBuf_flush(TBMatchBuf *buf) { int nelt, i; const int *PSlink_id; if (!buf->is_init) return; nelt = IntAE_get_nelt(&(buf->PSlink_ids)); for (i = 0, PSlink_id = buf->PSlink_ids.elts; i < nelt; i++, PSlink_id++) { IntAE_set_nelt(buf->match_ends.elts + *PSlink_id, 0); } IntAE_set_nelt(&(buf->PSlink_ids), 0); return; } MatchPDictBuf _new_MatchPDictBuf(SEXP matches_as, int tb_length, int tb_width, const int *head_widths, const int *tail_widths) { const char *ms_mode; int ms_code; static MatchPDictBuf buf; ms_mode = CHAR(STRING_ELT(matches_as, 0)); ms_code = _get_match_storing_code(ms_mode); if (ms_code == MATCHES_AS_NULL) { buf.tb_matches.is_init = 0; } else { buf.tb_matches = _new_TBMatchBuf(tb_length, tb_width, head_widths, tail_widths); buf.matches = _new_MatchBuf(ms_code, tb_length); } return buf; } void _MatchPDictBuf_report_match(MatchPDictBuf *buf, int PSpair_id, int tb_end) { IntAE *PSlink_ids, *count_buf, *start_buf, *width_buf; int start, width; if (buf->tb_matches.is_init == 0) return; PSlink_ids = &(buf->matches.PSlink_ids); count_buf = &(buf->matches.match_counts); if (count_buf->elts[PSpair_id]++ == 0) IntAE_insert_at(PSlink_ids, IntAE_get_nelt(PSlink_ids), PSpair_id); width = buf->tb_matches.tb_width; start = tb_end - width + 1; if (buf->tb_matches.head_widths != NULL) { start -= buf->tb_matches.head_widths[PSpair_id]; width += buf->tb_matches.head_widths[PSpair_id]; } if (buf->tb_matches.tail_widths != NULL) width += buf->tb_matches.tail_widths[PSpair_id]; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] _MatchPDictBuf_report_match():\n"); Rprintf(" PSpair_id=%d tb_end=%d start=%d width=%d\n", PSpair_id, tb_end, start, width); } #endif if (buf->matches.match_starts.buflength != -1) { start_buf = buf->matches.match_starts.elts + PSpair_id; IntAE_insert_at(start_buf, IntAE_get_nelt(start_buf), start); } if (buf->matches.match_widths.buflength != -1) { width_buf = buf->matches.match_widths.elts + PSpair_id; IntAE_insert_at(width_buf, IntAE_get_nelt(width_buf), width); } return; } static void _MatchPDictBuf_report_match2(MatchPDictBuf *buf, int PSpair_id, int start, int width) { if (buf->tb_matches.is_init == 0) return; _MatchBuf_report_match(&(buf->matches), PSpair_id, start, width); return; } void _MatchPDictBuf_flush(MatchPDictBuf *buf) { if (buf->tb_matches.is_init == 0) return; _TBMatchBuf_flush(&(buf->tb_matches)); _MatchBuf_flush(&(buf->matches)); return; } void _MatchPDictBuf_append_and_flush(MatchBuf *buf1, MatchPDictBuf *buf2, int view_offset) { if (buf2->tb_matches.is_init == 0) return; _MatchBuf_append_and_flush(buf1, &(buf2->matches), view_offset); _TBMatchBuf_flush(&(buf2->tb_matches)); return; } /***************************************************************************** * Brute force flank comparison routines * ------------------------------------- */ static void collect_grouped_keys(int key0, SEXP low2high, IntAE *grouped_keys) { SEXP dups; int nelt, i, *key; nelt = 1; IntAE_set_nelt(grouped_keys, nelt); if (nelt > grouped_keys->buflength) error("Biostrings internal error in collect_grouped_keys(): " "IntAE_get_nelt(grouped_keys) > grouped_keys->buflength"); grouped_keys->elts[0] = key0; dups = VECTOR_ELT(low2high, key0); if (dups == R_NilValue) return; nelt += LENGTH(dups); IntAE_set_nelt(grouped_keys, nelt); if (nelt > grouped_keys->buflength) error("Biostrings internal error in collect_grouped_keys(): " "IntAE_get_nelt(grouped_keys) > grouped_keys->buflength"); memcpy(grouped_keys->elts + 1, INTEGER(dups), LENGTH(dups) * sizeof(int)); for (i = 1, key = grouped_keys->elts + 1; i < nelt; i++, key++) *key -= 1; return; } static int nmismatch_in_HT(const cachedCharSeq *H, const cachedCharSeq *T, const cachedCharSeq *S, int Hshift, int Tshift, int max_nmis) { int nmis; nmis = _nmismatch_at_Pshift(H, S, Hshift, max_nmis, NULL); if (nmis > max_nmis) return nmis; max_nmis -= nmis; nmis += _nmismatch_at_Pshift(T, S, Tshift, max_nmis, NULL); return nmis; } static void match_HT(const cachedCharSeq *H, const cachedCharSeq *T, const cachedCharSeq *S, int tb_end, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf, int key) { int HTdeltashift, nmis; HTdeltashift = H->length + matchpdict_buf->tb_matches.tb_width; nmis = nmismatch_in_HT(H, T, S, tb_end - HTdeltashift, tb_end, max_nmis); if (nmis <= max_nmis && nmis >= min_nmis) _MatchPDictBuf_report_match(matchpdict_buf, key, tb_end); return; } static void match_headtail_for_loc(const HeadTail *headtail, const cachedCharSeq *S, int tb_end, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf) { int nelt, i; const int *key; const cachedCharSeq *H, *T; nelt = IntAE_get_nelt(&(headtail->grouped_keys)); for (i = 0, key = headtail->grouped_keys.elts; i < nelt; i++, key++) { H = headtail->head.elts + *key; T = headtail->tail.elts + *key; match_HT(H, T, S, tb_end, max_nmis, min_nmis, matchpdict_buf, *key); } return; } static void match_headtail_for_key(const HeadTail *headtail, int key, const cachedCharSeq *S, const IntAE *tb_end_buf, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf) { const cachedCharSeq *H, *T; int nelt, j; const int *tb_end; H = headtail->head.elts + key; T = headtail->tail.elts + key; nelt = IntAE_get_nelt(tb_end_buf); for (j = 0, tb_end = tb_end_buf->elts; j < nelt; j++, tb_end++) { match_HT(H, T, S, *tb_end, max_nmis, min_nmis, matchpdict_buf, key); } return; } static void match_headtail_by_loc(const HeadTail *headtail, const cachedCharSeq *S, const IntAE *tb_end_buf, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf) { int nelt, j; const int *tb_end; nelt = IntAE_get_nelt(tb_end_buf); for (j = 0, tb_end = tb_end_buf->elts; j < nelt; j++, tb_end++) { match_headtail_for_loc(headtail, S, *tb_end, max_nmis, min_nmis, matchpdict_buf); } return; } static void match_headtail_by_key(HeadTail *headtail, const cachedCharSeq *S, const IntAE *tb_end_buf, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf) { int nelt, i; const int *key; nelt = IntAE_get_nelt(&(headtail->grouped_keys)); for (i = 0, key = headtail->grouped_keys.elts; i < nelt; i++, key++) { match_headtail_for_key(headtail, *key, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); } return; } /***************************************************************************** * Preprocessing and fast matching of the head and tail of a PDict object * ---------------------------------------------------------------------- * * Note that, unlike for the Trusted Band, this is not persistent * preprocessing, i.e. the result of this preprocessing is not stored in * the PDict object so it has to be done again each time matchPDict() is * called. * TODO: Estimate the cost of this preprocessing and decide whether it's * worth to make it persistent. Not a trivial task! */ #define MAX_REMAINING_KEYS 24 // >= 0 and < NBIT_PER_BITWORD #define TMPMATCH_BMBUF_MAXNCOL 200 static PPHeadTail new_PPHeadTail(SEXP base_codes, int bmbuf_nrow, int max_Hwidth, int max_Twidth, int max_nmis) { PPHeadTail ppheadtail; int i; ppheadtail.is_init = 1; if (LENGTH(base_codes) != 4) error("Biostrings internal error in _new_HeadTail(): " "LENGTH(base_codes) != 4"); _init_byte2offset_with_INTEGER(&(ppheadtail.byte2offset), base_codes, 1); if (max_Hwidth > 0) for (i = 0; i < 4; i++) ppheadtail.head_bmbuf[i] = _new_BitMatrix(bmbuf_nrow, max_Hwidth, 0UL); if (max_Twidth > 0) for (i = 0; i < 4; i++) ppheadtail.tail_bmbuf[i] = _new_BitMatrix(bmbuf_nrow, max_Twidth, 0UL); ppheadtail.nmis_bmbuf = _new_BitMatrix(bmbuf_nrow, max_nmis + 1, 0UL); ppheadtail.tmp_match_bmbuf = _new_BitMatrix(bmbuf_nrow, TMPMATCH_BMBUF_MAXNCOL, ULONG_MAX); ppheadtail.tmp_tb_end_buf = Salloc((long) TMPMATCH_BMBUF_MAXNCOL, int); //Rprintf("new_PPHeadTail():\n"); //Rprintf(" nb of rows in each BitMatrix buffer=%d\n", bmbuf_nrow); return ppheadtail; } HeadTail _new_HeadTail(SEXP pdict_head, SEXP pdict_tail, SEXP pptb, SEXP max_mismatch, SEXP fixed, int with_ppheadtail) { HeadTail headtail; int tb_length, max_nmis, fixedP, fixedS, key, max_Hwidth, max_Twidth, max_HTwidth, HTwidth, grouped_keys_buflength; SEXP low2high, dups, base_codes; RoSeqs head, tail; cachedCharSeq *H, *T; tb_length = _get_PreprocessedTB_length(pptb); low2high = _get_PreprocessedTB_low2high(pptb); max_nmis = INTEGER(max_mismatch)[0]; fixedP = LOGICAL(fixed)[0]; fixedS = LOGICAL(fixed)[1]; if (pdict_head == R_NilValue) { head = _alloc_RoSeqs(tb_length); for (key = 0, H = head.elts; key < tb_length; key++, H++) H->length = 0; } else { head = _new_RoSeqs_from_XStringSet(tb_length, pdict_head); } if (pdict_tail == R_NilValue) { tail = _alloc_RoSeqs(tb_length); for (key = 0, T = tail.elts; key < tb_length; key++, T++) T->length = 0; } else { tail = _new_RoSeqs_from_XStringSet(tb_length, pdict_tail); } max_Hwidth = max_Twidth = max_HTwidth = grouped_keys_buflength = 0; for (key = 0, H = head.elts, T = tail.elts; key < tb_length; key++, H++, T++) { if (H->length > max_Hwidth) max_Hwidth = H->length; if (T->length > max_Twidth) max_Twidth = T->length; HTwidth = H->length + T->length; if (HTwidth > max_HTwidth) max_HTwidth = HTwidth; dups = VECTOR_ELT(low2high, key); if (dups != R_NilValue && LENGTH(dups) > grouped_keys_buflength) grouped_keys_buflength = LENGTH(dups); } grouped_keys_buflength++; headtail.head = head; headtail.tail = tail; headtail.max_Hwidth = max_Hwidth; headtail.max_Twidth = max_Twidth; headtail.max_HTwidth = max_HTwidth; headtail.grouped_keys = new_IntAE(grouped_keys_buflength, grouped_keys_buflength, 0); //Rprintf("_new_HeadTail():\n"); //Rprintf(" tb_length=%d max_nmis=%d\n", tb_length, max_nmis); //Rprintf(" max_Hwidth=%d max_Twidth=%d max_HTwidth=%d\n", // max_Hwidth, max_Twidth, max_HTwidth); //Rprintf(" grouped_keys_buflength=%d\n", grouped_keys_buflength); /* The (max_nmis <= 4) and (max_Hwidth + max_Twidth <= 10 + 4 * max_nmis) criteria together with the MAX_REMAINING_KEYS value above (20) are optimized for the Core 2 Duo arch (64bit) */ if (with_ppheadtail && (max_nmis < max_HTwidth) && (max_nmis <= 4) && (max_Hwidth + max_Twidth <= 10 + 4 * max_nmis) && (fixedP && fixedS)) { /* The base codes for the head and tail are assumed to be the same as for the Trusted Band */ base_codes = _get_PreprocessedTB_base_codes(pptb); headtail.ppheadtail = new_PPHeadTail(base_codes, grouped_keys_buflength, max_Hwidth, max_Twidth, max_nmis); } else { headtail.ppheadtail.is_init = 0; } return headtail; } static void init_headortail_bmbuf(BitMatrix *bmbuf, int nrow) { int i; //Rprintf("init_headortail_bmbuf(): nrow=%d\n", nrow); for (i = 0; i < 4; i++) { if (nrow > bmbuf[i].nword_per_col * NBIT_PER_BITWORD) error("Biostrings internal error in init_headortail_bmbuf(): " "not enough rows in 'bmbuf[%d]'", i); bmbuf[i].nrow = nrow; /* Set all bits to 1 */ _BitMatrix_set_val(bmbuf + i, ULONG_MAX); } return; } static void init_nmis_bmbuf(BitMatrix *bmbuf, int nrow) { if (nrow > bmbuf->nword_per_col * NBIT_PER_BITWORD) error("Biostrings internal error in init_nmis_bmbuf(): " "not enough rows in 'bmbuf'"); bmbuf->nrow = nrow; /* Set all bits to 0 */ _BitMatrix_set_val(bmbuf, 0UL); return; } static void preprocess_H(const cachedCharSeq *H, const ByteTrTable *byte2offset, BitMatrix *bmbuf0, int i) { int j, offset; const char *c; BitMatrix *bmbuf; for (j = 0, c = H->seq + H->length - 1; j < H->length; j++, c--) { offset = byte2offset->byte2code[(unsigned char) *c]; if (offset == NA_INTEGER) error("preprocess_H(): don't know how to handle " "non-base letters in the preprocessed head or " "tail of a PDict object yet, sorry ==> FIXME"); bmbuf = bmbuf0 + offset; _BitMatrix_set_bit(bmbuf, i, j, 0); } for (offset = 0; offset < 4; offset++) { bmbuf = bmbuf0 + offset; for (j = H->length; j < bmbuf->ncol; j++) _BitMatrix_set_bit(bmbuf, i, j, 0); } return; } static void preprocess_T(const cachedCharSeq *T, const ByteTrTable *byte2offset, BitMatrix *bmbuf0, int i) { int j, offset; const char *c; BitMatrix *bmbuf; for (j = 0, c = T->seq; j < T->length; j++, c++) { offset = byte2offset->byte2code[(unsigned char) *c]; if (offset == NA_INTEGER) error("preprocess_T(): don't know how to handle " "non-base letters in the preprocessed head or " "tail of a PDict object yet, sorry ==> FIXME"); bmbuf = bmbuf0 + offset; _BitMatrix_set_bit(bmbuf, i, j, 0); } for (offset = 0; offset < 4; offset++) { bmbuf = bmbuf0 + offset; for (j = T->length; j < bmbuf->ncol; j++) _BitMatrix_set_bit(bmbuf, i, j, 0); } return; } static void preprocess_head(const RoSeqs *head, const IntAE *grouped_keys, const ByteTrTable *byte2offset, BitMatrix *bmbuf0) { int nelt, i, *key; nelt = IntAE_get_nelt(grouped_keys); init_headortail_bmbuf(bmbuf0, nelt); for (i = 0, key = grouped_keys->elts; i < nelt; i++, key++) preprocess_H(head->elts + *key, byte2offset, bmbuf0, i); return; } static void preprocess_tail(const RoSeqs *tail, const IntAE *grouped_keys, const ByteTrTable *byte2offset, BitMatrix *bmbuf0) { int nelt, i, *key; nelt = IntAE_get_nelt(grouped_keys); init_headortail_bmbuf(bmbuf0, nelt); for (i = 0, key = grouped_keys->elts; i < nelt; i++, key++) preprocess_T(tail->elts + *key, byte2offset, bmbuf0, i); return; } static BitCol match_ppheadtail_for_loc(HeadTail *headtail, int tb_width, const cachedCharSeq *S, int tb_end, int max_nmis, int min_nmis) { BitMatrix *nmis_bmbuf; const BitMatrix *head_bmbuf, *tail_bmbuf; int j1, j2, offset; char s; BitCol bitcol, max_nmis_bitcol, min_nmis_bitcol; nmis_bmbuf = &(headtail->ppheadtail.nmis_bmbuf); // Match the heads head_bmbuf = headtail->ppheadtail.head_bmbuf; for (j1 = 0, j2 = tb_end - tb_width - 1; j1 < headtail->max_Hwidth; j1++, j2--) { // 'j2' should be a safe location in 'S' because we call // match_ppheadtail_for_loc() only when 'tb_end' is guaranteed // not to be too close to 'S' boundaries. s = S->seq[j2]; offset = headtail->ppheadtail.byte2offset.byte2code[(unsigned char) s]; if (offset == NA_INTEGER) { _BitMatrix_Rrot1(nmis_bmbuf); continue; } bitcol = _BitMatrix_get_col(head_bmbuf + offset, j1); _BitMatrix_grow1rows(nmis_bmbuf, &bitcol); } // Match the tails tail_bmbuf = headtail->ppheadtail.tail_bmbuf; for (j1 = 0, j2 = tb_end; j1 < headtail->max_Twidth; j1++, j2++) { // 'j2' should be a safe location in 'S' because we call // match_ppheadtail_for_loc() only when 'tb_end' is guaranteed // not to be too close from 'S' boundaries. s = S->seq[j2]; offset = headtail->ppheadtail.byte2offset.byte2code[(unsigned char) s]; if (offset == NA_INTEGER) { _BitMatrix_Rrot1(nmis_bmbuf); continue; } bitcol = _BitMatrix_get_col(tail_bmbuf + offset, j1); _BitMatrix_grow1rows(nmis_bmbuf, &bitcol); } max_nmis_bitcol = _BitMatrix_get_col(nmis_bmbuf, max_nmis); if (min_nmis >= 1) { min_nmis_bitcol = _BitMatrix_get_col(nmis_bmbuf, min_nmis - 1); _BitCol_A_gets_BimpliesA(&max_nmis_bitcol, &min_nmis_bitcol); } return max_nmis_bitcol; } static void report_matches_for_loc(const BitCol *bitcol, HeadTail *headtail, int tb_end, MatchPDictBuf *matchpdict_buf) { // Note that using _BitCol_get_bit() for this would be easier but is // also twice slower! BitWord *bitword; int i, i2; bitword = bitcol->bitword0; for (i = i2 = 0; i < bitcol->nbit; i++, i2++) { if (i2 >= NBIT_PER_BITWORD) { i2 = 0; bitword++; } if (!(*bitword & 1UL)) { //_MatchPDictBuf_report_match(matchpdict_buf, // headtail->grouped_keys.elts[i], tb_end); int key, start, width; key = headtail->grouped_keys.elts[i]; width = headtail->head.elts[key].length + matchpdict_buf->tb_matches.tb_width + headtail->tail.elts[key].length; start = tb_end + headtail->tail.elts[key].length - width + 1; _MatchPDictBuf_report_match2(matchpdict_buf, key, start, width); } *bitword >>= 1; } return; } /* static void flush_tmp_match_bmbuf(HeadTail *headtail, MatchPDictBuf *matchpdict_buf) { BitMatrix *tmp_match_bmbuf; const int *tmp_tb_end_buf; BitWord *bitword2, *bitword, mask; int i, j; tmp_match_bmbuf = &(headtail->ppheadtail.tmp_match_bmbuf); tmp_tb_end_buf = headtail->ppheadtail.tmp_tb_end_buf; bitword2 = tmp_match_bmbuf->bitword00; mask = 1UL; for (i = 0; i < tmp_match_bmbuf->nrow; i++) { if (mask == 0UL) { // this means that i % NBIT_PER_BITWORD == 0 bitword2++; mask = 1UL; } bitword = bitword2; for (j = 0; j < tmp_match_bmbuf->ncol; j++) { if (!(*bitword & mask)) { _MatchPDictBuf_report_match(matchpdict_buf, headtail->grouped_keys.elts[i], tmp_tb_end_buf[j]); } bitword += tmp_match_bmbuf->nword_per_col; } mask <<= 1; } tmp_match_bmbuf->ncol = 0; return; } */ static void match_ppheadtail0(HeadTail *headtail, const cachedCharSeq *S, const IntAE *tb_end_buf, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf) { BitMatrix *tmp_match_bmbuf; int nelt, min_safe_tb_end, max_safe_tb_end, j, ncol; const int *tb_end; BitCol bitcol; if (headtail->max_Hwidth > 0) preprocess_head(&(headtail->head), &(headtail->grouped_keys), &(headtail->ppheadtail.byte2offset), headtail->ppheadtail.head_bmbuf); if (headtail->max_Twidth > 0) preprocess_tail(&(headtail->tail), &(headtail->grouped_keys), &(headtail->ppheadtail.byte2offset), headtail->ppheadtail.tail_bmbuf); tmp_match_bmbuf = &(headtail->ppheadtail.tmp_match_bmbuf); tmp_match_bmbuf->nrow = IntAE_get_nelt(&(headtail->grouped_keys)); tmp_match_bmbuf->ncol = 0; min_safe_tb_end = headtail->max_Hwidth + matchpdict_buf->tb_matches.tb_width; max_safe_tb_end = S->length - headtail->max_Twidth; nelt = IntAE_get_nelt(tb_end_buf); for (j = 0, tb_end = tb_end_buf->elts; j < nelt; j++, tb_end++) { if (*tb_end < min_safe_tb_end || max_safe_tb_end < *tb_end) { match_headtail_for_loc(headtail, S, *tb_end, max_nmis, min_nmis, matchpdict_buf); continue; } // From now 'tb_end' is guaranteed to be "safe" i.e. not too // close to 'S' boundaries. init_nmis_bmbuf(&(headtail->ppheadtail.nmis_bmbuf), IntAE_get_nelt(&(headtail->grouped_keys))); bitcol = match_ppheadtail_for_loc(headtail, matchpdict_buf->tb_matches.tb_width, S, *tb_end, max_nmis, min_nmis); report_matches_for_loc(&bitcol, headtail, *tb_end, matchpdict_buf); /* ncol = tmp_match_bmbuf->ncol; _BitMatrix_set_col(tmp_match_bmbuf, ncol, &bitcol); tmp_match_bmbuf->ncol++; headtail->ppheadtail.tmp_tb_end_buf[ncol] = *tb_end; if (tmp_match_bmbuf->ncol == TMPMATCH_BMBUF_MAXNCOL) flush_tmp_match_bmbuf(headtail, matchpdict_buf); */ } /* flush_tmp_match_bmbuf(headtail, matchpdict_buf); */ return; } static void match_ppheadtail(HeadTail *headtail, const cachedCharSeq *S, const IntAE *tb_end_buf, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf) { int nelt, nkey0, nkey1, nkey2, i; const int *key; nkey0 = IntAE_get_nelt(&(headtail->grouped_keys)); nkey2 = nkey0 % NBIT_PER_BITWORD; if (nkey2 > MAX_REMAINING_KEYS) { match_ppheadtail0(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); return; } nkey1 = nkey0 - nkey2; if (nkey1 != 0) { IntAE_set_nelt(&(headtail->grouped_keys), nkey1); match_ppheadtail0(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); IntAE_set_nelt(&(headtail->grouped_keys), nkey0); } /* FIXME: If headtail->grouped_keys is guaranteed to not grow during the loop below, then extract its nelt before entering the loop. */ for (i = nkey1, key = headtail->grouped_keys.elts + nkey1; i < IntAE_get_nelt(&(headtail->grouped_keys)); i++, key++) { match_headtail_for_key(headtail, *key, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); } return; } /* static void BENCHMARK_match_ppheadtail(HeadTail *headtail, const cachedCharSeq *S, const IntAE *tb_end_buf, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf) { clock_t time0; double dt1, dt2; int i; time0 = clock(); for (i = 0; i < 100; i++) { match_ppheadtail0(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); } dt1 = (double) (clock() - time0) / CLOCKS_PER_SEC; time0 = clock(); for (i = 0; i < 100; i++) { match_headtail_by_key(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); } dt2 = (double) (clock() - time0) / CLOCKS_PER_SEC; Rprintf("%.3f\t%.3f\n", dt1, dt2); return; } */ /***************************************************************************** * _match_pdict_flanks_at() and _match_pdict_all_flanks() * ------------------------------------------------------ */ void _match_pdict_flanks_at(int key0, SEXP low2high, HeadTail *headtail, const cachedCharSeq *S, int tb_end, int max_nmis, int min_nmis, int fixedP, MatchPDictBuf *matchpdict_buf) { /* static ncalls = 0; ncalls++; Rprintf("_match_pdict_flanks_at(): ncalls=%d key0=%d tb_end=%d\n", ncalls, key0, tb_end); */ collect_grouped_keys(key0, low2high, &(headtail->grouped_keys)); match_headtail_for_loc(headtail, S, tb_end, max_nmis, min_nmis, matchpdict_buf); return; } /* If 'headtail' is empty (i.e. headtail->max_HTwidth == 0) then _match_pdict_all_flanks() just propagates the matches to the duplicates */ void _match_pdict_all_flanks(SEXP low2high, HeadTail *headtail, const cachedCharSeq *S, int max_nmis, int min_nmis, MatchPDictBuf *matchpdict_buf) { const IntAE *tb_PSlink_ids, *tb_end_buf; int nelt, i, key0; unsigned long int ndup, nloci, NFC; // NFC = Number of Flank Comparisons static unsigned long int total_NFC = 0UL, subtotal_NFC = 0UL; #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] ENTERING _match_pdict_all_flanks()\n"); #endif tb_PSlink_ids = &(matchpdict_buf->tb_matches.PSlink_ids); nelt = IntAE_get_nelt(tb_PSlink_ids); for (i = 0; i < nelt; i++) { key0 = tb_PSlink_ids->elts[i]; collect_grouped_keys(key0, low2high, &(headtail->grouped_keys)); tb_end_buf = matchpdict_buf->tb_matches.match_ends.elts + key0; /* ndup = (unsigned long int) IntAE_get_nelt(&(headtail->grouped_keys)); nloci = (unsigned long int) IntAE_get_nelt(tb_end_buf); NFC = ndup * nloci; total_NFC += NFC; */ if (headtail->ppheadtail.is_init && IntAE_get_nelt(tb_end_buf) >= 15) { // Use the BitMatrix horse-power /* Rprintf("_match_pdict_all_flanks(): " "key0=%d " "IntAE_get_nelt(&(headtail->grouped_keys))=%d " "tb_end_buf->nelt=%d\n", key0, IntAE_get_nelt(&(headtail->grouped_keys)), tb_end_buf->nelt); subtotal_NFC += NFC; */ match_ppheadtail(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); /* BENCHMARK_match_ppheadtail(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); */ } else { // Use brute force match_headtail_by_key(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); } /* BENCHMARK ========= Uncomment below (and comment out the use of brute force above), reinstall and use with the following code: library(BSgenome.Dmelanogaster.UCSC.dm3) chr3R <- unmasked(Dmelanogaster$chr3R) chr3R_50000 <- subseq(chr3R, end=50000) library(drosophila2probe) dict0 <- DNAStringSet(drosophila2probe$sequence, end=12) pdict6 <- PDict(dict0, tb.start=4, tb.end=9) mi6 <- matchPDict(pdict6, chr3R_50000, max.mismatch=1) sum(countIndex(mi6)) # 17896 if (headtail->ppheadtail.is_init && IntAE_get_nelt(tb_end_buf) >= 40) { clock_t time0; double dt1, dt2; int j; time0 = clock(); for (j = 0; j < 5000; j++) match_ppheadtail(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); dt1 = (double) (clock() - time0) / CLOCKS_PER_SEC; time0 = clock(); for (j = 0; j < 5000; j++) match_headtail_by_key(headtail, S, tb_end_buf, max_nmis, min_nmis, matchpdict_buf); dt2 = (double) (clock() - time0) / CLOCKS_PER_SEC; if (dt1 > dt2) { Rprintf("_match_pdict_all_flanks(): " "IntAE_get_nelt(&(headtail->grouped_keys))=%d " "tb_end_buf->nelt=%d\n", IntAE_get_nelt(&(headtail->grouped_keys)), IntAE_get_nelt(tb_end_buf)); Rprintf(" --> dt1=%.3f dt2=%.3f\n", dt1, dt2); } } */ } //Rprintf("_match_pdict_all_flanks(): " // "total_NFC=%lu subtotal_NFC=%lu ratio=%.2f\n", // total_NFC, subtotal_NFC, (double) subtotal_NFC / total_NFC); #ifdef DEBUG_BIOSTRINGS if (debug) Rprintf("[DEBUG] LEAVING _match_pdict_all_flanks()\n"); #endif return; } Biostrings/src/match_reporting.c0000644000126300012640000002330012241047607020401 0ustar00biocbuildphs_compbio/**************************************************************************** * MatchBuf manipulation and match reporting facilities * * Author: Herve Pages * ****************************************************************************/ #include "Biostrings.h" #include "IRanges_interface.h" static int debug = 0; SEXP debug_match_reporting() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in file %s\n", debug ? "on" : "off", __FILE__); #else Rprintf("Debug mode not available in file %s\n", __FILE__); #endif return R_NilValue; } int _get_match_storing_code(const char *ms_mode) { if (strcmp(ms_mode, "MATCHES_AS_NULL") == 0) return MATCHES_AS_NULL; if (strcmp(ms_mode, "MATCHES_AS_WHICH") == 0) return MATCHES_AS_WHICH; if (strcmp(ms_mode, "MATCHES_AS_COUNTS") == 0) return MATCHES_AS_COUNTS; if (strcmp(ms_mode, "MATCHES_AS_STARTS") == 0) return MATCHES_AS_STARTS; if (strcmp(ms_mode, "MATCHES_AS_ENDS") == 0) return MATCHES_AS_ENDS; if (strcmp(ms_mode, "MATCHES_AS_RANGES") == 0) return MATCHES_AS_RANGES; if (strcmp(ms_mode, "MATCHES_AS_NORMALRANGES") == 0) return MATCHES_AS_NORMALRANGES; if (strcmp(ms_mode, "MATCHES_AS_COVERAGE") == 0) return MATCHES_AS_COVERAGE; error("Biostrings internal error in _get_match_storing_code(): " "\"%s\": unknown match storing mode", ms_mode); return -1; /* keeps gcc -Wall happy */ } /**************************************************************************** * MatchBuf manipulation. */ MatchBuf _new_MatchBuf(int ms_code, int nPSpair) { int count_only; static MatchBuf match_buf; if (ms_code != MATCHES_AS_NULL && ms_code != MATCHES_AS_WHICH && ms_code != MATCHES_AS_COUNTS && ms_code != MATCHES_AS_STARTS && ms_code != MATCHES_AS_ENDS && ms_code != MATCHES_AS_RANGES) error("Biostrings internal error in _new_MatchBuf(): ", "%d: unsupported match storing code", ms_code); count_only = ms_code == MATCHES_AS_WHICH || ms_code == MATCHES_AS_COUNTS; match_buf.ms_code = ms_code; match_buf.PSlink_ids = new_IntAE(0, 0, 0); match_buf.match_counts = new_IntAE(nPSpair, nPSpair, 0); if (count_only) { /* By setting 'buflength' to -1 we indicate that these buffers must not be used */ match_buf.match_starts.buflength = -1; match_buf.match_widths.buflength = -1; } else { match_buf.match_starts = new_IntAEAE(nPSpair, nPSpair); match_buf.match_widths = new_IntAEAE(nPSpair, nPSpair); } return match_buf; } void _MatchBuf_report_match(MatchBuf *match_buf, int PSpair_id, int start, int width) { IntAE *PSlink_ids, *count_buf, *start_buf, *width_buf; PSlink_ids = &(match_buf->PSlink_ids); count_buf = &(match_buf->match_counts); if (count_buf->elts[PSpair_id]++ == 0) IntAE_insert_at(PSlink_ids, IntAE_get_nelt(PSlink_ids), PSpair_id); if (match_buf->match_starts.buflength != -1) { start_buf = match_buf->match_starts.elts + PSpair_id; IntAE_insert_at(start_buf, IntAE_get_nelt(start_buf), start); } if (match_buf->match_widths.buflength != -1) { width_buf = match_buf->match_widths.elts + PSpair_id; IntAE_insert_at(width_buf, IntAE_get_nelt(width_buf), width); } return; } void _MatchBuf_flush(MatchBuf *match_buf) { int nelt, i; const int *PSlink_id; nelt = IntAE_get_nelt(&(match_buf->PSlink_ids)); for (i = 0, PSlink_id = match_buf->PSlink_ids.elts; i < nelt; i++, PSlink_id++) { match_buf->match_counts.elts[*PSlink_id] = 0; if (match_buf->match_starts.buflength != -1) IntAE_set_nelt(match_buf->match_starts.elts + *PSlink_id, 0); if (match_buf->match_widths.buflength != -1) IntAE_set_nelt(match_buf->match_widths.elts + *PSlink_id, 0); } IntAE_set_nelt(&(match_buf->PSlink_ids), 0); return; } void _MatchBuf_append_and_flush(MatchBuf *match_buf1, MatchBuf *match_buf2, int view_offset) { int nelt, i; const int *PSlink_id; IntAE *start_buf1, *start_buf2, *width_buf1, *width_buf2; if (match_buf1->ms_code == MATCHES_AS_NULL || match_buf2->ms_code == MATCHES_AS_NULL) return; if (IntAE_get_nelt(&(match_buf1->match_counts)) != IntAE_get_nelt(&(match_buf2->match_counts)) || match_buf1->ms_code != match_buf2->ms_code) error("Biostrings internal error in " "_MatchBuf_append_and_flush(): " "buffers are incompatible"); nelt = IntAE_get_nelt(&(match_buf2->PSlink_ids)); for (i = 0, PSlink_id = match_buf2->PSlink_ids.elts; i < nelt; i++, PSlink_id++) { if (match_buf1->match_counts.elts[*PSlink_id] == 0) IntAE_insert_at(&(match_buf1->PSlink_ids), IntAE_get_nelt(&(match_buf1->PSlink_ids)), *PSlink_id); match_buf1->match_counts.elts[*PSlink_id] += match_buf2->match_counts.elts[*PSlink_id]; if (match_buf1->match_starts.buflength != -1) { start_buf1 = match_buf1->match_starts.elts + *PSlink_id; start_buf2 = match_buf2->match_starts.elts + *PSlink_id; IntAE_append_shifted_vals(start_buf1, start_buf2->elts, IntAE_get_nelt(start_buf2), view_offset); } if (match_buf1->match_widths.buflength != -1) { width_buf1 = match_buf1->match_widths.elts + *PSlink_id; width_buf2 = match_buf2->match_widths.elts + *PSlink_id; IntAE_append(width_buf1, width_buf2->elts, IntAE_get_nelt(width_buf2)); } } _MatchBuf_flush(match_buf2); return; } SEXP _MatchBuf_which_asINTEGER(const MatchBuf *match_buf) { SEXP ans; int i; PROTECT(ans = new_INTEGER_from_IntAE(&(match_buf->PSlink_ids))); sort_int_array(INTEGER(ans), LENGTH(ans), 0); for (i = 0; i < LENGTH(ans); i++) INTEGER(ans)[i]++; UNPROTECT(1); return ans; } SEXP _MatchBuf_counts_asINTEGER(const MatchBuf *match_buf) { return new_INTEGER_from_IntAE(&(match_buf->match_counts)); } SEXP _MatchBuf_starts_asLIST(const MatchBuf *match_buf) { if (match_buf->match_starts.buflength == -1) error("Biostrings internal error: _MatchBuf_starts_asLIST() " "was called in the wrong context"); return new_LIST_from_IntAEAE(&(match_buf->match_starts), 1); } static SEXP _MatchBuf_starts_toEnvir(const MatchBuf *match_buf, SEXP env) { if (match_buf->match_starts.buflength == -1) error("Biostrings internal error: _MatchBuf_starts_toEnvir() " "was called in the wrong context"); return IntAEAE_toEnvir(&(match_buf->match_starts), env, 1); } SEXP _MatchBuf_ends_asLIST(const MatchBuf *match_buf) { if (match_buf->match_starts.buflength == -1 || match_buf->match_widths.buflength == -1) error("Biostrings internal error: _MatchBuf_ends_asLIST() " "was called in the wrong context"); IntAEAE_sum_and_shift(&(match_buf->match_starts), &(match_buf->match_widths), -1); return new_LIST_from_IntAEAE(&(match_buf->match_starts), 1); } static SEXP _MatchBuf_ends_toEnvir(const MatchBuf *match_buf, SEXP env) { if (match_buf->match_starts.buflength == -1 || match_buf->match_widths.buflength == -1) error("Biostrings internal error: _MatchBuf_ends_toEnvir() " "was called in the wrong context"); IntAEAE_sum_and_shift(&(match_buf->match_starts), &(match_buf->match_widths), -1); return IntAEAE_toEnvir(&(match_buf->match_starts), env, 1); } SEXP _MatchBuf_as_MIndex(const MatchBuf *match_buf) { error("_MatchBuf_as_MIndex(): IMPLEMENT ME!"); return R_NilValue; } SEXP _MatchBuf_as_SEXP(const MatchBuf *match_buf, SEXP env) { switch (match_buf->ms_code) { case MATCHES_AS_NULL: return R_NilValue; case MATCHES_AS_WHICH: return _MatchBuf_which_asINTEGER(match_buf); case MATCHES_AS_COUNTS: return _MatchBuf_counts_asINTEGER(match_buf); case MATCHES_AS_STARTS: if (env != R_NilValue) return _MatchBuf_starts_toEnvir(match_buf, env); return _MatchBuf_starts_asLIST(match_buf); case MATCHES_AS_ENDS: if (env != R_NilValue) return _MatchBuf_ends_toEnvir(match_buf, env); return _MatchBuf_ends_asLIST(match_buf); case MATCHES_AS_RANGES: return _MatchBuf_as_MIndex(match_buf); } error("Biostrings internal error in _MatchBuf_as_SEXP(): " "unknown 'match_buf->ms_code' value %d", match_buf->ms_code); return R_NilValue; } /**************************************************************************** * Internal match buffer instance with a simple API. */ static MatchBuf internal_match_buf; int active_PSpair_id; static int match_shift; void _init_match_reporting(const char *ms_mode, int nPSpair) { int ms_code; ms_code = _get_match_storing_code(ms_mode); internal_match_buf = _new_MatchBuf(ms_code, nPSpair); active_PSpair_id = 0; match_shift = 0; return; } void _set_active_PSpair(int PSpair_id) { active_PSpair_id = PSpair_id; return; } void _set_match_shift(int shift) { match_shift = shift; } void _report_match(int start, int width) { start += match_shift; _MatchBuf_report_match(&internal_match_buf, active_PSpair_id, start, width); return; } /* Drops reported matches for all PSpairs! */ void _drop_reported_matches() { _MatchBuf_flush(&internal_match_buf); return; } int _get_match_count() { return internal_match_buf.match_counts.elts[active_PSpair_id]; } SEXP _reported_matches_asSEXP() { SEXP start, width, ans; switch (internal_match_buf.ms_code) { case MATCHES_AS_NULL: return R_NilValue; case MATCHES_AS_COUNTS: case MATCHES_AS_WHICH: return ScalarInteger(_get_match_count()); case MATCHES_AS_RANGES: PROTECT(start = new_INTEGER_from_IntAE( internal_match_buf.match_starts.elts + active_PSpair_id)); PROTECT(width = new_INTEGER_from_IntAE( internal_match_buf.match_widths.elts + active_PSpair_id)); PROTECT(ans = new_IRanges("IRanges", start, width, R_NilValue)); UNPROTECT(3); return ans; } error("Biostrings internal error in _reported_matches_asSEXP(): " "invalid 'internal_match_buf.ms_code' value %d", internal_match_buf.ms_code); return R_NilValue; } MatchBuf *_get_internal_match_buf() { return &internal_match_buf; } Biostrings/src/matchprobes.c0000644000126300012640000001374212241047607017534 0ustar00biocbuildphs_compbio/* * Copyright R. Gentleman and W. Huber 2002-2003, all rights reserved * * A program to match probes on a DNA chip * to a given sequence */ #include "Biostrings.h" #include #include #include "R_ext/Arith.h" #include "R_ext/Error.h" #include "R_ext/Applic.h" /* machar */ #include "R_ext/RS.h" /* CallocCharBuf */ #include #include /* The position (counting starts from 0) within a short oligonucleotide probe on an Affymetrix genechip where the base is flipped between "match" and "mismatch" probes */ #define MISMATCHPOSITION 12 /*------------------------------------------------------------*/ /* A data structure for storing a match result between a pair */ /* of sequences */ /* pos1: the position of the match in sequence 1 */ /* pos2: the position of the match in sequence 2 */ /* len: the length of the match */ /* type: type of match (e.g. PM or MM ) */ /*------------------------------------------------------------*/ typedef struct { int pos1; int pos2; int len; int type; } Match; typedef struct { int rec; Match match; } MatchWithRec; /* The general signature of sequence match functions */ /* and one particular instance: */ /* typedef Match* (*R_MatchFun)(char*, char*, struct Matchres*); */ /*--------------------------------------------------------------------*/ /* Test whether a sequence x contains a substring y or a substring */ /* that is obtained from y by flipping its 12th position */ /* */ /* Arguments: */ /* INPUT */ /* x, y: pointers to the "long" (haystack) and the short (needle) */ /* sequence, respectively */ /* OUTPUT */ /* rv: pointer to a struct Match (see above) */ /*--------------------------------------------------------------------*/ void strstr_with_pmormm(const char* x, const char* y, Match* rv) { char *m; char *scratch; int len; /* this the return value if nothing is found */ rv->pos1 = 0; rv->pos2 = 0; rv->len = 0; rv->type = 0; if ((m = strstr(x, y))) { rv->pos1 = (m - x)/sizeof(char) + 1; rv->pos2 = 1; rv->len = strlen(y); rv->type = 1; return; } len = strlen(y); if (len < MISMATCHPOSITION) { error("Sequence y is too short: must at least have length %d.", MISMATCHPOSITION); } scratch = CallocCharBuf(len); strcpy(scratch, y); scratch[MISMATCHPOSITION] = compbase(scratch[MISMATCHPOSITION]); if ((m = strstr(x, scratch))) { rv->pos1 = (m - x)/sizeof(char) + 1; rv->pos2 = 1; rv->len = len; rv->type = 2; } Free(scratch); return; } /*---------------------------------------------------------------*/ /* R interface: */ /* query: a vector of mode 'character' */ /* probepos: a logical. If TRUE, return a list with the position */ /* of the match too */ /*---------------------------------------------------------------*/ SEXP MP_matchprobes(SEXP query, SEXP records, SEXP probepos) /* SEXP probepos, SEXP method) */ { int i, k, ct, rvlen; /* R vectors that are used in the construction of the return value */ SEXP matchesrec, matchespos, rv, rvnames, rvmatch, rvpos; /* query and record sequences */ const char *queryseq, *recseq; /* their length */ int nrqu, nrrec; /* logical: should the match positions also be returned? */ int lprobepos; /* intermediate buffer to store the match results before */ /* bringing them into matchespos and matchesres */ MatchWithRec *mbuf; Match m; /* if(Rf_isFunction(method)) { matchfun = (R_DistFun) myRDist; isFun = 1; } else matchfun = (R_DistFun) R_ExternalPtrAddr(method); */ if(!isString(query) ) error("Argument query must be a string"); if(!isLogical(probepos)) error("Argument probepos must be logical."); lprobepos = asLogical(probepos); nrqu = length(query); nrrec = length(records); if(lprobepos) { rvlen = 2; PROTECT(rvpos = allocVector(VECSXP, nrqu)); } else { rvlen = 1; rvpos = NULL; } PROTECT(rv = allocVector(VECSXP, rvlen)); PROTECT(rvnames = allocVector(VECSXP, rvlen)); PROTECT(rvmatch = allocVector(VECSXP, nrqu)); /* allocate memory for the match buffer */ mbuf = Calloc(nrrec, MatchWithRec); /* loop over the query sequences in 'query' */ for(k=0; k /* Return the length of the Longest Common Prefix. */ static int _lcprefix(const char *S1, int nS1, const char *S2, int nS2) { int n; n = 0; while (n < nS1 && n < nS2) { if (*(S1++) != *(S2++)) break; n++; } return n; } /* Return the length of the Longest Common Suffix. */ static int _lcsuffix(const char *S1, int nS1, const char *S2, int nS2) { int n; n = 0; S1 += nS1 - 1; S2 += nS2 - 1; while (n < nS1 && n < nS2) { if (*(S1--) != *(S2--)) break; n++; } return n; } /* * 's1_xp', 's1_offset', 's1_length': left XString object * 's2_xp', 's2_offset', 's2_length': right XString object */ SEXP lcprefix(SEXP s1_xp, SEXP s1_offset, SEXP s1_length, SEXP s2_xp, SEXP s2_offset, SEXP s2_length) { int s1_off, s1_len, s2_off, s2_len, n; const Rbyte *s1, *s2; SEXP ans; s1_off = INTEGER(s1_offset)[0]; s1_len = INTEGER(s1_length)[0]; s1 = RAW(R_ExternalPtrTag(s1_xp)) + s1_off; s2_off = INTEGER(s2_offset)[0]; s2_len = INTEGER(s2_length)[0]; s2 = RAW(R_ExternalPtrTag(s2_xp)) + s2_off; n = _lcprefix((char *) s1, s1_len, (char *) s2, s2_len); PROTECT(ans = NEW_INTEGER(1)); INTEGER(ans)[0] = n; UNPROTECT(1); return ans; } /* * 's1_xp', 's1_offset', 's1_length': left XString object * 's2_xp', 's2_offset', 's2_length': right XString object */ SEXP lcsuffix(SEXP s1_xp, SEXP s1_offset, SEXP s1_length, SEXP s2_xp, SEXP s2_offset, SEXP s2_length) { int s1_off, s1_len, s2_off, s2_len, n; const Rbyte *s1, *s2; SEXP ans; s1_off = INTEGER(s1_offset)[0]; s1_len = INTEGER(s1_length)[0]; s1 = RAW(R_ExternalPtrTag(s1_xp)) + s1_off; s2_off = INTEGER(s2_offset)[0]; s2_len = INTEGER(s2_length)[0]; s2 = RAW(R_ExternalPtrTag(s2_xp)) + s2_off; n = _lcsuffix((char *) s1, s1_len, (char *) s2, s2_len); PROTECT(ans = NEW_INTEGER(1)); INTEGER(ans)[0] = n; UNPROTECT(1); return ans; } Biostrings/src/replace_letter_at.c0000644000126300012640000001212712241047607020677 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" #define REPLACE_IFNOTEXTEND 1 #define SKIP_IFNOTEXTEND 2 #define MERGE_IFNOTEXTEND 3 #define ERROR_IFNOTEXTEND 4 static int notextend_action; static int skip_or_merge_count; static char errmsg_buf[200]; static ByteTrTable byte2code; static void set_notextend_action(const char *if_not_extending) { if (strcmp(if_not_extending, "replace") == 0) notextend_action = REPLACE_IFNOTEXTEND; else if (strcmp(if_not_extending, "skip") == 0) notextend_action = SKIP_IFNOTEXTEND; else if (strcmp(if_not_extending, "merge") == 0) notextend_action = MERGE_IFNOTEXTEND; else if (strcmp(if_not_extending, "error") == 0) notextend_action = ERROR_IFNOTEXTEND; else error("invalid 'if_not_extending' value %s", if_not_extending); return; } static int replace_letter_at(char *dest, int dest_length, const int *at, int at_length, const char *src, int use_byte2code) { int i, j, byte, are_IUPAC; char old_letter, new_letter; for (j = 0; j < at_length; j++) { i = at[j] - 1; if (i == NA_INTEGER || i < 0 || i >= dest_length) { snprintf(errmsg_buf, sizeof(errmsg_buf), "'at' contains NAs or \"out of limits\" locations"); return -1; } new_letter = src[j]; if (use_byte2code) { byte = (unsigned char) new_letter; if ((new_letter = byte2code.byte2code[byte]) == NA_INTEGER) { snprintf(errmsg_buf, sizeof(errmsg_buf), "'letter' contains invalid letters " "(first found has code %d)", byte); return -1; } } old_letter = dest[i]; if (old_letter == new_letter) continue; if (notextend_action == REPLACE_IFNOTEXTEND) { dest[i] = new_letter; continue; } are_IUPAC = ((unsigned char) old_letter) < 16 && ((unsigned char) new_letter) < 16; if (are_IUPAC && (old_letter & ~new_letter) == 0) { // new_letter extends old_letter dest[i] = new_letter; continue; } if (notextend_action == ERROR_IFNOTEXTEND) { snprintf(errmsg_buf, sizeof(errmsg_buf), "new letter (code %d) does not extend old letter (code %d) " "at location %d", new_letter, old_letter, i + 1); return -1; } skip_or_merge_count++; if (notextend_action == SKIP_IFNOTEXTEND) continue; // only IUPAC letters are mergeable if (!are_IUPAC) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot merge non IUPAC letters at location %d", i + 1); return -1; } dest[i] |= new_letter; } return 0; } /* * --- .Call ENTRY POINT --- */ SEXP XString_replace_letter_at(SEXP x, SEXP at, SEXP letter, SEXP lkup, SEXP if_not_extending, SEXP verbose) { const char *x_classname; cachedCharSeq X; SEXP tag, letter_elt, ans; int at_length, letter_length, letter_elt_length, letter_ncharsum, i; const int *at_p; x_classname = get_classname(x); X = cache_XRaw(x); at_length = LENGTH(at); letter_length = LENGTH(letter); if (lkup != R_NilValue) _init_ByteTrTable_with_lkup(&byte2code, lkup); set_notextend_action(CHAR(STRING_ELT(if_not_extending, 0))); PROTECT(tag = NEW_RAW(X.length)); memcpy((char *) RAW(tag), X.seq, X.length); skip_or_merge_count = letter_ncharsum = 0; at_p = INTEGER(at); for (i = 0; i < letter_length; i++) { letter_elt = STRING_ELT(letter, i); if (letter_elt == NA_STRING) { UNPROTECT(1); error("'letter' contains NAs"); } letter_ncharsum += letter_elt_length = LENGTH(letter_elt); if (letter_ncharsum > at_length) break; if (replace_letter_at((char *) RAW(tag), LENGTH(tag), at_p, letter_elt_length, CHAR(letter_elt), lkup != R_NilValue) != 0) { UNPROTECT(1); error("%s", errmsg_buf); } at_p += letter_elt_length; } if (letter_ncharsum != at_length) { UNPROTECT(1); error("total nb of letters in 'letter' must be the same as nb of locations"); } if (skip_or_merge_count != 0 && notextend_action != REPLACE_IFNOTEXTEND && LOGICAL(verbose)[0]) warning("%s %d letter(s)", notextend_action == SKIP_IFNOTEXTEND ? "skipped" : "merged", skip_or_merge_count); PROTECT(ans = new_XRaw_from_tag(x_classname, tag)); UNPROTECT(2); return ans; } /* * --- .Call ENTRY POINT --- */ SEXP XString_inplace_replace_letter_at(SEXP x, SEXP at, SEXP letter, SEXP lkup) { SEXP tag, letter_elt; int at_length, letter_length, letter_elt_length, letter_ncharsum, i; const int *at_p; at_length = LENGTH(at); letter_length = LENGTH(letter); if (lkup != R_NilValue) _init_ByteTrTable_with_lkup(&byte2code, lkup); notextend_action = MERGE_IFNOTEXTEND; tag = get_XVector_tag(x); skip_or_merge_count = letter_ncharsum = 0; at_p = INTEGER(at); for (i = 0; i < letter_length; i++) { letter_elt = STRING_ELT(letter, i); if (letter_elt == NA_STRING) error("'letter' contains NAs"); letter_ncharsum += letter_elt_length = LENGTH(letter_elt); if (letter_ncharsum > at_length) break; if (replace_letter_at((char *) RAW(tag), LENGTH(tag), at_p, letter_elt_length, CHAR(letter_elt), lkup != R_NilValue) != 0) { error("%s", errmsg_buf); } at_p += letter_elt_length; } if (letter_ncharsum != at_length) error("total nb of letters in 'letter' must be the same as nb of locations"); return x; } Biostrings/src/strutils.c0000644000126300012640000000325312241047607017112 0ustar00biocbuildphs_compbio/* * Copyright R. Gentleman, W. Huber 2003-2007, all rights reserved * */ #include "Biostrings.h" #include #include #include "R_ext/Arith.h" #include "R_ext/Error.h" #include "R_ext/Applic.h" /* machar */ #include #include /*--------------------------*/ /* the complementary base */ /*--------------------------*/ char compbase(char c) { char bases[] = "TACGtacgn"; char compl[] = "ATGCatgcn"; char* p; p = strchr(bases, (int) c); if(p==NULL) { error("Character %c does not code for a nucleic acid.", c); } return(compl[p-bases]); } /*------------------------------------------------------ get longest consecutive stretch of consecutive letters ------------------------------------------------------*/ SEXP MP_longestConsecutive(SEXP x, SEXP letter) { int i, j, ncur, nmax; const char *pc, *seq; char c; SEXP rv; /* Check and preprocess function arguments */ if (!isString(x)) error("'x' must be a string."); if (!isString(letter) || length(letter)!=1) error("'letter' must be a character variable of length 1."); pc = CHAR(STRING_ELT(letter, 0)); if(strlen(pc)!=1) { error("'letter' must contain exactly one character but contains %d.", strlen(pc)); } c = *pc; PROTECT(rv = allocVector(INTSXP, length(x))); for(i=0; inmax) nmax=ncur; } else { ncur=0; } } } INTEGER(rv)[i] = nmax; } UNPROTECT(1); return(rv); } Biostrings/src/translate.c0000644000126300012640000000467512241047607017227 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" static char errmsg_buf[200]; /* Returns 0 if OK, -1 if error, and 1 if warning. */ static int translate(const cachedCharSeq *dna, cachedCharSeq *aa, TwobitEncodingBuffer *teb, SEXP lkup, char skipcode0) { int phase, i, lkup_key; const char *c; phase = 0; aa->length = 0; _reset_twobit_signature(teb); for (i = 0, c = dna->seq; i < dna->length; i++, c++) { if (*c == skipcode0) continue; lkup_key = _shift_twobit_signature(teb, *c); if (teb->lastin_twobit == NA_INTEGER) { snprintf(errmsg_buf, sizeof(errmsg_buf), "not a base at pos %d", i + 1); return -1; } if (phase < 2) { phase++; continue; } /* aa->seq is a const char * so we need to cast it to char * before we can write to it */ ((char *) aa->seq)[aa->length++] = (char) INTEGER(lkup)[lkup_key]; phase = 0; } if (phase == 1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "last base was ignored"); return 1; } if (phase == 2) { snprintf(errmsg_buf, sizeof(errmsg_buf), "last %d bases were ignored", phase); return 1; } return 0; } /* * --- .Call ENTRY POINT --- * Return an AAStringSet object. */ SEXP DNAStringSet_translate(SEXP x, SEXP base_codes, SEXP lkup, SEXP skipcode) { cachedXStringSet X, Y; cachedCharSeq X_elt, Y_elt; char skipcode0; int ans_length, i, errcode; SEXP ans, width, ans_width; TwobitEncodingBuffer teb; X = _cache_XStringSet(x); skipcode0 = (unsigned char) INTEGER(skipcode)[0]; ans_length = _get_cachedXStringSet_length(&X); PROTECT(width = NEW_INTEGER(ans_length)); for (i = 0; i < ans_length; i++) { X_elt = _get_cachedXStringSet_elt(&X, i); INTEGER(width)[i] = X_elt.length / 3; } PROTECT(ans = alloc_XRawList("AAStringSet", "AAString", width)); Y = _cache_XStringSet(ans); teb = _new_TwobitEncodingBuffer(base_codes, 3, 0); ans_width = _get_XStringSet_width(ans); for (i = 0; i < ans_length; i++) { X_elt = _get_cachedXStringSet_elt(&X, i); Y_elt = _get_cachedXStringSet_elt(&Y, i); errcode = translate(&X_elt, &Y_elt, &teb, lkup, skipcode0); if (errcode == -1) { UNPROTECT(2); if (ans_length == 1) error("%s", errmsg_buf); else error("in 'x[[%d]]': %s", i + 1, errmsg_buf); } if (errcode == 1) { if (ans_length == 1) warning("%s", errmsg_buf); else warning("in 'x[[%d]]': %s", i + 1, errmsg_buf); } INTEGER(ans_width)[i] = Y_elt.length; } UNPROTECT(2); return ans; } Biostrings/src/utils.c0000644000126300012640000001366212241047607016366 0ustar00biocbuildphs_compbio#include "Biostrings.h" static int debug = 0; SEXP debug_utils() { #ifdef DEBUG_BIOSTRINGS debug = !debug; Rprintf("Debug mode turned %s in 'utils.c'\n", debug ? "on" : "off"); #else Rprintf("Debug mode not available in 'utils.c'\n"); #endif return R_NilValue; } #ifdef DEBUG_BIOSTRINGS static void print_ByteTrTable(const ByteTrTable *byte_tr_table) { int byte, code; Rprintf("[DEBUG] Byte Translation Table:\n"); for (byte = 0; byte < BYTETRTABLE_LENGTH; byte++) { Rprintf("[DEBUG] byte=%d ", byte); if (32 <= byte && byte < 128) Rprintf("['%c']", byte); else Rprintf(" "); Rprintf(" -> code="); code = byte_tr_table->byte2code[byte]; if (code == NA_INTEGER) Rprintf("NA\n"); else Rprintf("%d\n", code); } return; } #endif void _init_ByteTrTable_with_lkup(ByteTrTable *byte_tr_table, SEXP lkup) { int byte; if (LENGTH(lkup) > BYTETRTABLE_LENGTH) error("Biostrings internal error in _init_ByteTrTable_with_lkup(): " "LENGTH(lkup) > BYTETRTABLE_LENGTH"); for (byte = 0; byte < LENGTH(lkup); byte++) byte_tr_table->byte2code[byte] = INTEGER(lkup)[byte]; for ( ; byte < BYTETRTABLE_LENGTH; byte++) byte_tr_table->byte2code[byte] = NA_INTEGER; #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] _init_ByteTrTable_with_lkup():\n"); print_ByteTrTable(byte_tr_table); } #endif return; } SEXP _new_lkup_from_ByteTrTable(const ByteTrTable *byte_tr_table) { SEXP ans; int byte; if (byte_tr_table == NULL) return R_NilValue; PROTECT(ans = NEW_INTEGER(BYTETRTABLE_LENGTH)); for (byte = 0; byte < BYTETRTABLE_LENGTH; byte++) INTEGER(ans)[byte] = byte_tr_table->byte2code[byte]; UNPROTECT(1); return ans; } static void set_byte2offset_elt(ByteTrTable *byte2offset, int byte, int offset, int error_on_dup) { int *offset_p; if (byte < 0 || byte >= BYTETRTABLE_LENGTH) error("Biostrings internal error in set_byte2offset_elt(): " "invalid byte value %d", byte); offset_p = byte2offset->byte2code + (unsigned char) byte; if (*offset_p == NA_INTEGER) { *offset_p = offset; return; } if (error_on_dup) error("Biostrings internal error in set_byte2offset_elt(): " "duplicated byte value %d", byte); return; } /* * Values in 'bytes' must represent byte values i.e. values >= 0 and < 256. * The byte offsets are written to 'byte2offset'. */ void _init_byte2offset_with_INTEGER(ByteTrTable *byte2offset, SEXP bytes, int error_on_dup) { int byte, offset; if (LENGTH(bytes) > BYTETRTABLE_LENGTH) error("Biostrings internal error in " "_init_byte2offset_with_INTEGER(): " "LENGTH(bytes) > BYTETRTABLE_LENGTH"); for (byte = 0; byte < BYTETRTABLE_LENGTH; byte++) byte2offset->byte2code[byte] = NA_INTEGER; for (offset = 0; offset < LENGTH(bytes); offset++) { byte = INTEGER(bytes)[offset]; set_byte2offset_elt(byte2offset, byte, offset, error_on_dup); } #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] _init_byte2offset_with_INTEGER():\n"); print_ByteTrTable(byte2offset); } #endif return; } void _init_byte2offset_with_cachedCharSeq(ByteTrTable *byte2offset, const cachedCharSeq *seq, const BytewiseOpTable *bytewise_match_table) { int j, offset, n; unsigned char x, y; const char *c; for (j = 0; j < 256; j++) { y = (unsigned char) j; offset = NA_INTEGER; for (n = 0, c = seq->seq; n < seq->length; n++, c++) { x = (unsigned char) *c; if (bytewise_match_table->xy2val[x][y]) { offset = n; break; } } byte2offset->byte2code[y] = offset; } #ifdef DEBUG_BIOSTRINGS if (debug) { Rprintf("[DEBUG] _init_byte2offset_with_cachedCharSeq():\n"); print_ByteTrTable(byte2offset); } #endif return; } TwobitEncodingBuffer _new_TwobitEncodingBuffer(SEXP base_codes, int buflength, int endianness) { TwobitEncodingBuffer teb; if (LENGTH(base_codes) != 4) error("_new_TwobitEncodingBuffer(): 'base_codes' must be of length 4"); if (buflength < 1 || buflength > 15) error("_new_TwobitEncodingBuffer(): 'buflength' must be >= 1 and <= 15"); _init_byte2offset_with_INTEGER(&(teb.eightbit2twobit), base_codes, 1); teb.buflength = buflength; teb.endianness = endianness; teb.nbit_in_mask = (buflength - 1) * 2; teb.twobit_mask = (1 << teb.nbit_in_mask) - 1; if (endianness == 1) teb.twobit_mask <<= 2; teb.lastin_twobit = NA_INTEGER; teb.nb_valid_prev_char = 0; teb.current_signature = 0; return teb; } void _reset_twobit_signature(TwobitEncodingBuffer *teb) { teb->lastin_twobit = NA_INTEGER; teb->nb_valid_prev_char = 0; teb->current_signature = 0; return; } int _shift_twobit_signature(TwobitEncodingBuffer *teb, char c) { int lastin_twobit; lastin_twobit = teb->lastin_twobit = teb->eightbit2twobit.byte2code[(unsigned char) c]; if (lastin_twobit == NA_INTEGER) { teb->nb_valid_prev_char = 0; return NA_INTEGER; } teb->nb_valid_prev_char++; teb->current_signature &= teb->twobit_mask; if (teb->endianness == 1) { teb->current_signature >>= 2; lastin_twobit <<= teb->nbit_in_mask; } else { teb->current_signature <<= 2; } teb->current_signature += lastin_twobit; if (teb->nb_valid_prev_char < teb->buflength) return NA_INTEGER; return teb->current_signature; } int _get_twobit_signature(TwobitEncodingBuffer *teb, const cachedCharSeq *seq) { int i, twobit_sign; const char *c; if (seq->length != teb->buflength) error("_get_twobit_signature(): seq->length != teb->buflength"); for (i = 0, c = seq->seq; i < seq->length; i++, c++) twobit_sign = _shift_twobit_signature(teb, *c); return twobit_sign; } /* 'at' must contain 1-based locations in 'seq'. */ int _get_twobit_signature_at(TwobitEncodingBuffer *teb, const cachedCharSeq *seq, const int *at, int at_length) { int i, j, twobit_sign; if (at_length != teb->buflength) error("_get_twobit_signature_at(): at_length != teb->buflength"); for (i = 0; i < at_length; i++) { j = at[i]; if (j == NA_INTEGER || j < 1 || j > seq->length) return -1; twobit_sign = _shift_twobit_signature(teb, seq->seq[j - 1]); } return twobit_sign; } Biostrings/src/xscat.c0000644000126300012640000000766112241047607016352 0ustar00biocbuildphs_compbio#include "Biostrings.h" #include "IRanges_interface.h" #include "XVector_interface.h" #include /* for Salloc() */ /* * --- .Call ENTRY POINT --- * Arguments: * args: a non-empty list of XString objects of the same XString base type * (see R/seqtype.R). * Note that this function is VERY similar to XStringSet_unlist(). * Maybe both could be unified under a fast c() for XRaw objects. */ SEXP XString_xscat(SEXP args) { int nargs, ans_length, tag_offset, j; SEXP arg, ans_tag, ans; const char *ans_classname; cachedCharSeq cached_arg; nargs = LENGTH(args); if (nargs == 0) error("XString_xscat(): no input"); /* 1st pass: determine 'ans_classname' and 'ans_length' */ for (j = 0; j < nargs; j++) { arg = VECTOR_ELT(args, j); cached_arg = cache_XRaw(arg); if (j == 0) { ans_classname = get_classname(arg); ans_length = cached_arg.length; } else { ans_length += cached_arg.length; } } PROTECT(ans_tag = NEW_RAW(ans_length)); /* 2nd pass: fill 'ans_tag' */ tag_offset = 0; for (j = 0; j < nargs; j++) { arg = VECTOR_ELT(args, j); cached_arg = cache_XRaw(arg); memcpy((char *) RAW(ans_tag) + tag_offset, cached_arg.seq, cached_arg.length * sizeof(char)); tag_offset += cached_arg.length; } /* Make 'ans' */ PROTECT(ans = new_XRaw_from_tag(ans_classname, ans_tag)); UNPROTECT(2); return ans; } /* * --- .Call ENTRY POINT --- * Arguments: * args: a non-empty list of XStringSet objects of the same XString base * type (see R/seqtype.R). */ SEXP XStringSet_xscat(SEXP args) { cachedXStringSet *cached_args, cached_ans; int nargs, *arg_lengths, *ii, ans_length, i, j, *width; SEXP arg, ans_width, ans; const char *ans_element_type; cachedCharSeq cached_arg_elt, cached_ans_elt; char ans_classname[40]; /* longest string should be "DNAStringSet" */ nargs = LENGTH(args); if (nargs == 0) error("XStringSet_xscat(): no input"); cached_args = Salloc((long) nargs, cachedXStringSet); arg_lengths = Salloc((long) nargs, int); ii = Salloc((long) nargs, int); /* 1st pass: determine 'ans_element_type' and 'ans_length' */ for (j = 0; j < nargs; j++) { arg = VECTOR_ELT(args, j); cached_args[j] = _cache_XStringSet(arg); arg_lengths[j] = _get_XStringSet_length(arg); if (j == 0) { ans_element_type = _get_XStringSet_xsbaseclassname(arg); ans_length = arg_lengths[j]; } else { if (arg_lengths[j] > ans_length) ans_length = arg_lengths[j]; } } PROTECT(ans_width = NEW_INTEGER(ans_length)); /* 2nd pass: fill 'ans_width' */ for (j = 0; j < nargs; j++) ii[j] = 0; for (i = 0, width = INTEGER(ans_width); i < ans_length; i++, width++) { *width = 0; for (j = 0; j < nargs; j++) { if (ii[j] >= arg_lengths[j]) ii[j] = 0; /* recycle */ cached_arg_elt = _get_cachedXStringSet_elt( cached_args + j, ii[j]); *width += cached_arg_elt.length; ii[j]++; } } if (snprintf(ans_classname, sizeof(ans_classname), "%sSet", ans_element_type) >= sizeof(ans_classname)) { UNPROTECT(1); error("Biostrings internal error in XStringSet_xscat(): " "'ans_classname' buffer too small"); } PROTECT(ans = alloc_XRawList(ans_classname, ans_element_type, ans_width)); /* 3rd pass: fill 'ans' */ cached_ans = cache_XVectorList(ans); for (j = 0; j < nargs; j++) ii[j] = 0; for (i = 0; i < ans_length; i++) { cached_ans_elt = _get_cachedXStringSet_elt(&cached_ans, i); cached_ans_elt.length = 0; for (j = 0; j < nargs; j++) { if (ii[j] >= arg_lengths[j]) ii[j] = 0; /* recycle */ cached_arg_elt = _get_cachedXStringSet_elt( cached_args + j, ii[j]); /* cached_ans_elt->seq is a const char * so we need to cast it to char * in order to write to it */ memcpy((char *) cached_ans_elt.seq + cached_ans_elt.length, cached_arg_elt.seq, cached_arg_elt.length * sizeof(char)); cached_ans_elt.length += cached_arg_elt.length; ii[j]++; } } UNPROTECT(2); return ans; }