alakazam/0000755000176200001440000000000014505673010012034 5ustar liggesusersalakazam/NAMESPACE0000644000176200001440000001224114505516263013261 0ustar liggesusers# Generated by roxygen2: do not edit by hand export(ABBREV_AA) export(DNA_COLORS) export(DNA_IUPAC) export(IG_COLORS) export(IMGT_REGIONS) export(IUPAC_AA) export(IUPAC_DNA) export(TR_COLORS) export(aliphatic) export(alphaDiversity) export(aminoAcidProperties) export(baseTheme) export(buildPhylipLineage) export(bulk) export(calcCoverage) export(calcDiversity) export(charge) export(checkColumns) export(collapseDuplicates) export(combineIgphyml) export(countClones) export(countGenes) export(countPatterns) export(cpuCount) export(estimateAbundance) export(extractVRegion) export(getAAMatrix) export(getAllele) export(getChain) export(getDNAMatrix) export(getFamily) export(getGene) export(getLocus) export(getMRCA) export(getPathLengths) export(getPositionQuality) export(getSegment) export(graphToPhylo) export(gravy) export(gridPlot) export(groupGenes) export(isValidAASeq) export(junctionAlignment) export(makeChangeoClone) export(makeTempDir) export(maskPositionsByQuality) export(maskSeqEnds) export(maskSeqGaps) export(nonsquareDist) export(padSeqEnds) export(pairwiseDist) export(pairwiseEqual) export(permuteLabels) export(phyloToGraph) export(plotAbundanceCurve) export(plotDiversityCurve) export(plotDiversityTest) export(plotEdgeTest) export(plotMRCATest) export(plotSubtrees) export(polar) export(progressBar) export(rarefyDiversity) export(readChangeoDb) export(readFastqDb) export(readIgphyml) export(seqDist) export(seqEqual) export(sortGenes) export(stoufferMeta) export(summarizeSubtrees) export(tableEdges) export(testDiversity) export(testEdges) export(testMRCA) export(translateDNA) export(translateStrings) export(writeChangeoDb) exportClasses(AbundanceCurve) exportClasses(ChangeoClone) exportClasses(DiversityCurve) exportClasses(EdgeTest) exportClasses(MRCATest) exportMethods(plot) exportMethods(print) import(ggplot2) import(graphics) import(methods) import(utils) importFrom(Biostrings,BString) importFrom(Biostrings,extractAt) importFrom(GenomicAlignments,explodeCigarOpLengths) importFrom(GenomicAlignments,explodeCigarOps) importFrom(IRanges,IRanges) importFrom(Matrix,rowSums) importFrom(Matrix,sparseMatrix) importFrom(Rcpp,evalCpp) importFrom(airr,read_rearrangement) importFrom(airr,write_rearrangement) importFrom(ape,di2multi) importFrom(ape,ladderize) importFrom(ape,read.fastq) importFrom(ape,read.tree) importFrom(ape,reorder.phylo) importFrom(ape,root) importFrom(dplyr,"%>%") importFrom(dplyr,all_of) importFrom(dplyr,arrange) importFrom(dplyr,bind_cols) importFrom(dplyr,bind_rows) importFrom(dplyr,combine) importFrom(dplyr,desc) importFrom(dplyr,do) importFrom(dplyr,filter) importFrom(dplyr,group_by) importFrom(dplyr,left_join) importFrom(dplyr,mutate) importFrom(dplyr,mutate_at) importFrom(dplyr,n) importFrom(dplyr,one_of) importFrom(dplyr,rename) importFrom(dplyr,right_join) importFrom(dplyr,rowwise) importFrom(dplyr,select) importFrom(dplyr,slice) importFrom(dplyr,summarize) importFrom(dplyr,summarize_at) importFrom(dplyr,transmute) importFrom(dplyr,ungroup) importFrom(igraph,E) importFrom(igraph,V) importFrom(igraph,all_shortest_paths) importFrom(igraph,as_data_frame) importFrom(igraph,as_edgelist) importFrom(igraph,components) importFrom(igraph,degree) importFrom(igraph,distances) importFrom(igraph,graph_from_adjacency_matrix) importFrom(igraph,graph_from_data_frame) importFrom(igraph,groups) importFrom(igraph,make_directed_graph) importFrom(igraph,make_graph) importFrom(igraph,make_undirected_graph) importFrom(igraph,set_vertex_attr) importFrom(igraph,shortest_paths) importFrom(igraph,vertex_attr) importFrom(progress,progress_bar) importFrom(readr,cols) importFrom(readr,read_delim) importFrom(readr,read_tsv) importFrom(readr,write_delim) importFrom(readr,write_tsv) importFrom(rlang,":=") importFrom(rlang,enquo) importFrom(rlang,sym) importFrom(rlang,syms) importFrom(scales,log10_trans) importFrom(scales,log2_trans) importFrom(scales,math_format) importFrom(scales,percent) importFrom(scales,pretty_breaks) importFrom(scales,scientific) importFrom(scales,trans_breaks) importFrom(scales,trans_format) importFrom(seqinr,s2c) importFrom(seqinr,translate) importFrom(stats,cor) importFrom(stats,cov) importFrom(stats,dbinom) importFrom(stats,dmultinom) importFrom(stats,dnorm) importFrom(stats,ecdf) importFrom(stats,mad) importFrom(stats,median) importFrom(stats,na.omit) importFrom(stats,pbinom) importFrom(stats,pnorm) importFrom(stats,qbinom) importFrom(stats,qnorm) importFrom(stats,rbinom) importFrom(stats,rmultinom) importFrom(stats,rnorm) importFrom(stats,sd) importFrom(stats,setNames) importFrom(stringi,stri_count_boundaries) importFrom(stringi,stri_count_fixed) importFrom(stringi,stri_count_regex) importFrom(stringi,stri_detect_fixed) importFrom(stringi,stri_dup) importFrom(stringi,stri_extract_all_regex) importFrom(stringi,stri_extract_first_regex) importFrom(stringi,stri_flatten) importFrom(stringi,stri_join) importFrom(stringi,stri_length) importFrom(stringi,stri_pad_left) importFrom(stringi,stri_pad_right) importFrom(stringi,stri_paste) importFrom(stringi,stri_replace_all_regex) importFrom(stringi,stri_replace_first_regex) importFrom(stringi,stri_split_fixed) importFrom(tibble,tibble) importFrom(tidyr,complete) importFrom(tidyr,gather) useDynLib(alakazam, .registration=TRUE) alakazam/README.md0000644000176200001440000000354514270715207013326 0ustar liggesusers[![](http://cranlogs.r-pkg.org/badges/grand-total/alakazam)](https://www.r-pkg.org/pkg/alakazam) [![](https://cranlogs.r-pkg.org/badges/alakazam)](https://www.r-pkg.org/pkg/alakazam) [![](https://img.shields.io/static/v1?label=AIRR-C%20sw-tools%20v1&message=compliant&color=008AFF&labelColor=000000&style=plastic)](https://docs.airr-community.org/en/stable/swtools/airr_swtools_standard.html) Alakazam ------------------------------------------------------------------------------- Alakazam is part of the [Immcantation](http://immcantation.readthedocs.io) analysis framework for Adaptive Immune Receptor Repertoire sequencing (AIRR-seq) and provides a set of tools to investigate lymphocyte receptor clonal lineages, diversity, gene usage, and other repertoire level properties, with a focus on high-throughput immunoglobulin (Ig) sequencing. Alakazam serves five main purposes: 1. Providing core functionality for other R packages in the Immcantation framework. This includes common tasks such as file I/O, basic DNA sequence manipulation, and interacting with V(D)J segment and gene annotations. 2. Providing an R interface for interacting with the output of the [pRESTO](http://presto.readthedocs.io) and [Change-O](http://changeo.readthedocs.io) tool suites. 3. Performing clonal abundance and diversity analysis on lymphocyte repertoires. 4. Performing lineage reconstruction on clonal populations of Ig sequences and analyzing the topology of the resultant lineage trees. 5. Performing physicochemical property analyses of lymphocyte receptor sequences. Contact ------------------------------------------------------------------------------- For help and questions, please contact the [Immcantation Group](mailto:immcantation@googlegroups.com) or use the [issue tracker](https://bitbucket.org/kleinstein/alakazam/issues?status=new&status=open). alakazam/data/0000755000176200001440000000000014500041201012727 5ustar liggesusersalakazam/data/ExampleDb.rda0000644000176200001440000030150414500036443015277 0ustar liggesusersBZh91AY&SYMͤs~ݿ2&RI,elHyP(R@/[I AA {:>݁;v\5CG#w;{py^Lj]V^KCM6;5i-sÓ@hm 4u\ʺ2sF]`  O|bSeSG{Ovt횈.w=_>WT ,Ŭ{c^t@9 -S{;Ӈד)v$ڭ2h -:tmv{oc}}U}jl;`mvKm)Kw7v_=Ǫ(} }nDwfU@u;WF.Bڅ6{-=>r:kw{Nqz=ݳp''wۼ=wݕz6Tՠ] .y{˶Gl (c٥خ{k"z){ʺwwfw4!'uW@J@||c':WNlQT4oy觠 ;ݣnP>0N64+v:( ^֜zwl2uoXn=w;IY7wu+{ToxH_}^ʠ9k:-K^ :@@M{mv8ɧEt:ZV&@hh*HOQL4C4ɦ#@&FJ~iy#d OPIL'=@ 1#6d1 d4`BITRLHzCȏԟM L#A! %OQLѦ)hɔ?T42y&M=@1=@4ԍ$IOH=& F@}E_E/.}ʷȯPCL8tWz2{o_t]ʺy׾E+?m{%߁F&vo{n7y燐b y<\p >_>Wki=a?}Ͻu6V_m4KwTǰox^!b =VʅNnjwt]W1!nK0ۜ*>υv7k2}t>ɝvQY=cܵߡo(ccO9jn|ߨcJwSLly0Ξ{ݾ^o1Kյǘ=.}ڟ)΋կzK9BлN]>XS}K)6ه88JMV:ޠ~m_\8޳|CLv곿ہ@SCÌ˞՝n/Kc5]pFE63?ydʪ^+a:^C7=Ydl>Czjk ޾^xJV7Rh?Kb2]z{J}/N'κܤp˗لv߲©DRYL2;̣%h~E;i8uoyE1zqř-;P{Ǒ冹;i>:'~TZU\OlGGkajt9m؞C % *d5EH QBP JCQL4IJ(( E)ЮP% 4"R Ћ@Hv P,WJ襤ZR J* P( Q*Ha" S6@i@P4H-JA/!qP}߽?b*;n 6u*U- eqca6p$4TҴ3MbrCT0[eB$& #@3a q c  &MT46JC 04@ HA&ĨBNgēpcaq! I(UVd`7qjXـ;C C#4i-%b%LTD@k(:CciHa¢2% `K.IIhs2cBÆ fҀM!K đ4l0iFJ: 6gm)c fD31 5OcheJJF U>h¨jB ̶ld d TB D%&TLq@ETRd('QN\"`K9G*(@RlY" (ӋE" KB*Ж,+rh:FE .aSCc:EP ?_fW _Cq5BRF%C$)c(HPETSh!9TA*B /HE"!`"'R)RPha!B* 6!@E%!()j$P Ά`UԛFQ҆ º2(@hWB5PgÀp<q>NGJ|H+8r QE2<&*dnB`22ʠsI$"faY&i$^ DʂR(4(C@@@RZP2UN#%#BUT!G#!Н%Eϻr~?k,}IL Bw@' @Dq)C8luʟzw輿6sxW+ p~np kl&f02ôc'Rb=;D*~Ps uϟ<.8sJf *{D#R;U޷়BU.߅@kR V?7[>HnmW()}?qH$uw~jvsůڇ(0>ޏ c$M7b0=8 C6Lr 1A1O=<cqf(%.BtAL0.+:(+|)n ؟edybBerw7J(kHw*}G W/\^5ZKϓ_ξ     ='až><U<*%XE3t+} =bAQt =zKiCh1tUѮG\CX=:5Eo.gا?aL)6 O9A!4t7 &0 A%Hu>,'D>o~{ch?^@`@3mm-~0mT:-I;{>w5dk`suvp[sXj\%uF"<̯#҄s* >X~~Wq7gG/( r,91s2Qm>:ST@FYl5Ё ['u 5̅y.;o[MXU8 >ž=y,=㌽ʘSTZ!*Wf bJLN󄏁N]+rSqXs J);K|e#nyms G0<-u6ҝy0UT9Q_CǡXQSJ@,/l)_,=<_l/GPvx;]y6?Ikto&1cͼe J7]a!Bm\~Ֆ*sUSdtFrWqI34GbfS; xgk+O{'J']/AÑ}V@ 10y{U}H/uoTG%P@b  G(dc ڕtRRU"-4$\D8)'^+T8\l h=;~~u.h߈<ʹbߖJ;Zcn wk#!dvϞc֏5:̼H.YHL` ~0z#y=R S|$Lczs;}ǷWYQi.6 ̖C:nCZUy qHd4ϛ βPz;/io\ޘq0Z0 g-1y5Y ùeL)h^{KB&$$`DD@   D ` E`2 Q1  Q[[z7Q6Υ~#᭘s]x*{5WJ]np{OntNyhj9F8T뷷Cޖo8F89UPV +߮Sȕ=uWJ`r7s=ZXid)؀1zϡ~s斱+)(X_# Srp*O>6{0&0OZP>xʄȉUXQ)y"g!ʊ )H)R)!YU&I  @@?!CV Foaā0R3%" M - HP @#Jl:F1 P!AD@ (ЭJ0Ҟd׳  ?/>E9f2ؾB"*Q C|{o=|{$ gJ%4P(AHBD t *8T4DJ @ZUm 5W'~!o]8PC @iњCEĨP+ZBA2Ȩ&2&?웃.vC 4MP6ئ.bV: ąq9T0Yq4X1‹ P' liV!m Y vĨJ0+AAJF"Ctd l QR,XK,E J:r#MܛkfI~D y:'ҁ@M;;JZTfH &&@Fw6Ժأ&6~SvDvW^퀬@ot ^ɀ1I.cBR@8PĢtnԇ_scr;;^(*;H nDXwqD)AZysNJl:X],8zftiY,wZ% ùdMۄH L$JWpwZNl@ dAmB9QKqsO{P{&i* |%z/y$Hd8}{͊[ǵbtq\w m.ѻ ˉQ)غ8 m.#C@rqqI!",#"I "fbXDSվ} ?E:N0uhArpt(8-"~T=v.Dp&*>3.wȞ1D([W*tLLJ B]kHXȪR `- A9%1 F2dBp]!TvTP9]wCу@=0 uB 4Dbn8@Ď K"uM3ZT(ivC(q&D6RzD# Pd!K%5"ɺ tK܈XĊm4B&Fx5"I m45`ʬkw!89ęcQHiYOF [ʉXX$Dh1[%x n_z @}A$!$# cl:fJ4vӬo/^ܟ'{yD?R4bwNj$h۹eW BB%9o ^HKݎ[H@eV;J! Ɍ"N(D/ZRVHB!hR7vGݎ;<D6cq|z YmC(+kFU@֭_+h:YKܝo6@oAA= A˙@n3TJo@!:eOwM (#@@C@}:( ӧBCAB 4)&4QSDIJQH"d#u$ =!F% n-|G`'x2rCor:$2|drP ̠an%$ Ć/ {sw&RJhL@`Cʸ""Q.N2ZG ZdI8&f=Ӳ88 &aG't vEG4ckO{EN7sw nB4=sBE  q9(2q q@6ДC#l{k>(+ bCv  ʥCFq 8C#vE(JqLM M:0Lz^ty1 ϽX \tk=)Ёq)E6A~YѐvamdШt mE6WrH"wG~֖$Cc>omEe M%vU}phsb@Ӥ^ޕPd)P@ `$"PR6X3J4  4B*,B"%I *k*b[KN7MtL>s$,ipdBAhLXavL'bAcy͈ɳ@P+ݹ( :5u@PFsbJ)$PZەCa&EyRLj@ ڝPeB H8CpaB¥<؂vH,ʺx;`P\Sd6ONQ8)D pE9"OG>r?xR|&NAI"7ND-Yt<ШXB5(s`d'AH"$Cw0vݸ s-ơVrpB{x ;4 !iQO hMlHmx 7?\ t Q4(BT tIYJHe V(BH(U"%(tҍGQ .$za&)W5UE 0F2 ЊңudNcwcϚ]xvCF8>Bx(zxz i̇V&#>]† +( a>O+` LIW0Xһ׻Ȩt 4 ),0(F#N$mٜ {&CBAB "S |oVyPk~vX"#v>Ύ %vAZgmb.<h:Dn؊7zH -}1{ m?}^QiWBb@lF:ܜrZKOIt>%qbUTY:3T=z `툠;vžNP(Q6 t@bDD3o@U$q,}A̩Fl`L8R]T*JǪ:P"|{u6!] =:[1]CyX$JT ) 劄s]ҟpv"x%w @ס<˅mO/Fhz<`y؛wnȯ=Y6I,6;6+PӱR{ׯ<>꣦GXZzwkWm@G;E?!P5y̏—{x$vx6h@3a B$Qݎ T%D( &7=(rT &5Ľr%BR 0R $  (ʪB"E4?ww ؇:7kpF}F_;)ЉІI{m@&dۂ@,d 7g`aP 7i D!X&c?h.at:  N;MH>a V$:%Fu {sx9LOX D(C@: t LExx]8 {L/ P#6az?H^:J]D!d862"7R{;d&aPpkz8T3cެ)D; H~7¡xEfz&JwS@*o8>N`TiP}>~8+0߻ȟ7tͧ!qڀ$$")z RL !$22PDҏP{ROJY܂(v4-yJ4I~ﲯޏUxbELW@8߀~>^x}T.$M ɑqfOyQ-*'Тf@!yw[j).7τGK LHH{vmE xۀ* YAXZn1cQIi`B"D~L~oXQPPWBRTTQRTA{q96>{܈~Ї$#_,|.MJGa†|w{mB|D8MkرaW޻;̠m&cg[uZ)D,:G ǡ4(ҍPH2*ewx=%8FL@s1 _ !f`3`~#BI!(O#e "cHr D &@qVS':< E9>=/Nf~/?wbiPi($`B"b"h7.YDT1m@fLQeaZJ1 YՉXD8R6f 6 Fda.ޱΓqǬG1F;@'Ш`;)\ \8 *LG{fqg[ 7=iPN\ .;S"0)*xw ǚCHLNBKiM#;䄕qCJl i;mj>,ֆY 1g[LX,Fǻj"YHXT׎Zz([.@!Ǎ-=pGJz#Jh].ŏm([B)Khaے7)) `>sOŴ8PI~c8D Β D-*`F;FӌQqӰ#\gFyg'FRQ9^q$EDlD$.8BZD.7Z nզ# tzQJ86NHG 0ʶv(&/V,Md@&e7mE C1&ݜFeҩ!Mz ,@2Gfhْh依PD{*#џH!EzQN$y*Q;!@'ۡPl90 Nmqm"FCAj8!W6֔h,,d+BĚ:Z-.;ecM@0 K{S~>܆@|XăΧӧ^n  !M F0FZ'zDGccE;H+wEA(z]RO&B @Wv;R[;R/]!qccDJ=Dl'*;P"bdIF`vy i!9'n%} HLT9ލmvUBq)L9=! +IP,c.V)~aw<*tkqu2B *e3QZҍ.ǤX~dH2fvrU9pD[kӂEjb<8/XzyCnLøV~ uiJ|D` }V 8߈>. T*l1:ě(yjXcz".ZHdqׄ HBm1``|SN?&/G4T$PN[ˍڽg} vUQx˿nʔi4Wk{csp eYRi" éȴ<GJ^% k /Ras"z=JμS`+ϐ(xZY0:#WFl$AE БYzS:< Zb$@ U"!P JFc"rB@9" HpZE2΀6wnE0\7 ̮&6 ;(dWKʽV13DNAx=nQ*Nݞ7rNյ"!@@("V!$HA WM=?P7BV Ѷ'xG db@,@I&&j@%n(!͡I.8` hR `q%2Ḁr"'B?O{[p5HQFA*WW}^0.;ǐ G`N84^{Pgm9SA&H] &ǮBI(QoP:Q!i̲PƚQRUJELn|vA*$28t4ۥ?M\9f@@l D*: .Gׅ`񲢄RP 7"$Lfx(y$@:IG.J%BQ"W8ClqApE\(%=(c`z(Uaz>8 )TҨD o|s*ϕo9a;\w'2єdD`9WHu.T(QPx^$(B&4sTC2`ЅdC (*m$8BDiUDx]ϧȉO{YgqKGfil|"}7_}dڅ瀥D Wܛ!@ca4rtFUd UzzS(:UÆgR)T-ILꋬqhI2t:}F+DbH !̏@pF$YEfDM T(1 1EDٰ֐*tpjDp@ BJʉ:TyKtv52X4E" Q,JfHZB&a4GB$"IXMH#Ad4nt Т[ۧxDЙ@Pۅm`lGjOtP9Y*s,cٷ --@JA*@@!" C,W91dT:UPĨY8# ) !e &k!WEOBpAp# }ৣ&1Ȇ܄4^aD  BI`U֤ 'pB  6 Jq-Vv чAt=(Sn;8q (G `B.HjM"ЀH*ғ$eh @Ws%M%mhLB`$Kn"0sAmcA-Cbcv8ף=v)#>"T6:pp ~e l[.VP_>aF ! SH Рt! pF $"de-SJ*vNW?%YUUoI?O4pxSЀ>q'|~qcO^'?iK>+~Ѝ}5QDVca;>sƤ{+=_=~W%="tJNYETAO)ou7R|fFNߒaOdzByX?/owoƌ??  > 4D8]AԲT+% @ʼEԘv.젧E9Piռ fw0nTmcAL!@uB#3B P JUir(ɲ:A,lbmLh4h?==.Gr!?08T/2 ^"8n6N&FD؜lp1rFS#"4JiUwʧKc,wzJ|=0rD')ʀM Aҭa UݱTcnﰞ<1@A߯*A2PՀ'P=p={?7}@{eN.d(zʊh@"Ҡ: Ti:SHt 3L KҦH" H@A88"D8AC d{R7 9@qhh6VYGC~?'AR#F#rgZTLBtC9p )e{yА%40mQhmq0`:dS5cX 9:U]_KH1~ܹȺ%HQS8M% ʘ1 qHW`4 CDs#,vP6\Ù p XBhDZEq]sn}DWDu٩QP%Az Xd .d $5";wqp\`t 0#LsێzAK"'vjDne]hp4CH$ccux@҂(xL%4 Ǹr $IΣץr˫laWh\[<)wrV @!%5Hw"TjĀ ,UQEħ,g !v:64+`vy;G-*"Tpf Q<:V\G'Q(@e<DF2 GFUHpye:(T@@g~۸q M"A C*ltEivD РXCB'ChL9Б`DCH rs݄BGv5_CxR~qſW~t*at AxۊKqi8%"Q^U6DD i 41`AFwd2J{T%n=Ɛ pihER{Yh,!glyakU!De10a,ɨR$ա1m> ʣ+@ ! M $US:42`*Aj+XUEU4+%*SZv{c&#SI>Aj?~g@U'Vȅ F%"l8%BNnGr 4( gdQPA(S?@- #:bյ `up 9Ea(8@=*")J*RhT֠*lacBB!y 9ҠД̬T4@4(LH*:DԴ l M*z 3`J2XoޕGION1[~h(hPs<]ޫ[2+Yl!iډ|8mϥn6:zLH!^zA (HR$E3a@] 9 e~۟BAC#UCA2LDS`(@^)җٽo4;-I{;`1GH) [I$ӫ?_ IM`ccl(}| Ă&KS[b6HHָRV u" $. ;8Xgܝʈ$$bq 6z$BP)T TJSB"N#SeU@hSVM]cMB yJGG9tk.wbun3thGP$2fݰEƇ^{P/q΋:R eAhAB%;v'#@tH@1 D,"K$t򈰨Hj QOCD %tu7 Za$$7w:aBZ#K*b4{$ABTJ$d$Y\c+0,ahR M"+K!e0c!?oȰ_e.4hS,7gNOj0ِ :ak!@pQa ۚ84md̮ĂR.L0:Ma)t*ۂH7S\NB$h(uu4P2!h5PQCXUBT@*!fs[i3`X6jjbʥQZT@Bqpܰhħ@30M rԇTä'Ak N Ќ5Ҭ,WH@ HJ5e;v$@ 6 J!M:\B6].". ZTMdSbҍhX5Юhe_dkA(;c6狧{o_7S=`n빤W6-,ѕl`KScc%bn*aaY!(iGqPݐ4U0`lW: HFlxC$>}" E4UQ^X%@`@h(LQ%z욒#YQ?RiT{HݰܝU<,] q8! WDuǮB=FǼaidS7Stl]<.PMVM 'O4,.7񶲔sI$G?L^461`5#‘ *; W[q66uPEMD=qleC)&zw]q" 1(I"$ ~-{rPzœZ99TH7:@F4\aI@n> Fɜu"+ !f$ܜOԝ%{h›/bʧdPE(:JTtA4(Ҍe®P҆Ӻ݊Mb Z" B"sn2uUſ?f1GgKŠЄMnA22SK`0\9uv6]5¬"H"d A EhO[F<lpkȄ ` IFI!vL2A[TC`N`N{EH!T< WbG D7&(R B#B+BYE# 96$۞xv+ 2MGYq+Q=ۍ\20"FH*hhplbJuX $T:S#^2U:EZ+`(db&ˆ(Rbg &iٙݓ:pL @4|`{0{+B1ȂnpehPC91>0oe2,A *K 帺фCwqOXTa]6x mɑ]8smȄp湴BD) CȤf$z0nk/SSbq`wD@2 >tsN99͟xC@k9l '(%L S۾8P ^ g6 reC ,LH-N`O+P=)}(>z9rAe ( C@ ܇Q$f PDJPNE4`B2,(ؔ  ЀՅ];ҁˆBr3ەGCn8v=xI]!Ŷ\)D MU g7$c$qH8Y"`YQ|>tB@AԹPQL4*a 5Lȟ?|RT~PuRЀa 0rvEW1C0q2$^!`B;c@[Zse8Ҩy  224 iZp*Gl" ! =2m!Fs!ps dEЪ "J=(=׉J8.C ,HW=ȫ"b1a n5=q*ڑ]i$K,Jv P(RtcfJЋiMv{ 2ġ2R !0PJĒ- hʼnq;Fуȕ b Pj0#838@x,kV2wH(DcpPE= IAq4/@A. ^d) M.$ah&WP!7d=l[.ǜJw ˌ\ )t ۂ^dwc2: ]hA1 ¯P$JllzqĝQM}k^^NjgOy<g4ġ(p-\kd09&0%%=GfybJt51(r;  #lJ挗s89JCLǗ`Z=sTTb%צь#KKZwz~PDj+|֕jKJ#GB@Yj@HAbD e" ?< + TFS #ؘ޷X7\Qej@bqWbKPDsV*VBlng86=㠝+Ex֮[e -^J>jrPh8/M,Zy>=skՂA'REX+b^?:r9  08#DM/`YRrprm`< Ѩ.9p"TqIP;E>һcs4{{[ޅ44:`%C>P%R]0a)b:lRQ(~` !' /"뎘{7 Ή?2͘M},ȧ;-fͬJ/{9 T&28ʅ\UxdDNx 97$+&nj\y>dtÅ9$|qRhbd <7*Jܓ O-" ;#p5JP)s")7Zk ҐY5@"N  ^|"g篭l-'<+\K2 |u|^}W}0">P~0 B  Exv&:BP$ PD3"P4%1"*ҍ PE,.1D˜ ##>w|G'; QPKFȞ4.K~Be~W1kA]vݠߊR<$QX0aȁ`VI>p/W!A >0J } ]98q@#j\< JC\-dB]Yn(%Q^Ӹ1;w!cCRuo0|@ҨA 덀:ԇ1~x ۠K$Pl}-E $k ؑ 8%Y )Ш)Ј=.iQPDQ Nt`|ш!y=(QvknKMEa ެ<(!HG8I @E^0aS_yA4 E!N6Tf1N Qspvn1pnWq-* ;Á44ti Lc)  Bٚ966(d3+8BPMl]`QPJ`@HF p*{D#GڽA ""HG ?[Ǐ{/߳_yuspM8-pt;ήyq7D;`xR (< Kq0[f.ff~4RӞC8pcFϮz䄚T'90B"ay;MU svL@@HE;#."i [4M6]p4ªm%խz}w U4ZCE N@WFZXHuΘnANaDTM GgDBPAUAHL!EIMPHD ,I2eX !( R*h*d:mmDZZx; F9ZQ4԰&i '|rXf(n-lޱ V-% fKe.L6 mCdt)Ob,%炂* sh6%FB uZ}B|&|?mvVO>Xϫc h( iRT~>=}{5 ˻?:׉n }|>]||=izO>ZD)NCT'",W"{ߋoOP^SSzOdZ=e3ͯR"$? ~ jPmj)1#,ww ` }!=%Cÿ~lȲik-cE3BiL&w@P1'q B(#S( ;X3e/eܢ!KBE6]"@)@_hj~m;o{PhyMܭaz4QPoN=;h^;kkF\嫌]rXV n! @ {ގ| hD\` @D`bg8CJd 6P@[`G 6 !*@ITv0 J2S9pPuִzꓝ&r[bSSchC4!Q~.ʻno c!cE1(]#$% JWq(M m|O>>?P[vR(JC2@=a1o_?;UC1@`~2 '  ݮ(;8c`' (q xI "W€AbLA$bF]p Fp)T6:7e5< q28(v9D5qt(J+ `56*R dSMSd\ RI:EG"BR]tDGbCqd\X;m Pda ]@ bu"z@M*HxE*ĬLP !'uA(0#4eֲ d!Et!g"b"^$11 4`SJ4(4<#_r{ڂ4#( fpBN0DR' xJ^ d'd&532R@l8 eQg)X6UC)ĈB8J$eG#eJq!n"!'r RE)SP,BgdzM=4yL@ !ցCy<_B1v*+ Cx(Vz5v @rgunH {S*U[✑jfCqdQ=2B(㲏[AW҂0B|uEq4Lt-qv#C)E]IGE\<:ph^Cʛ.vHjb@#\Zbsw ُk޼rmB~1[oZiA4BYVaGj:KsLUie6ꚞ %VJ% OLD]eg`WDt8 `(9YyU$RBFR :+t]@bS|@qFAM:' v^4D)8^SO0!@ =!J ^ h ]J2;]L#V 4{ܨiFy;:;@ᬘXg,%qMQ@(۩z j($iY!4)ȩB4,kGEO)$ZmOĊ66ɶwqlsLQ,Rhk3)nssr%*A.x쨎zMw`s(*\qG-BԪ' C*gAg($Hftz`P0y'1,P˸-t"R{wD'r-(8.9ͳa6$Nt Cr 9cwm` M`)2T /8pSuz,``4N.@25ɰ@(uNaaK %#vy t`@ AЪq A>Bd UJd$V&UXJPG񣣐b8% 0iEKLjv&,d1vu9B @«2"CɑxE 2w|>@T,^&E=(J:yV$r<` "eKjgIp )($!W)(ԑA0 ! `߿:BaVhD"I NU6h"bDNM(TK$R2RЋ$Q$$dQH! X1jA Qu5ZP&.A5¤ wrt)Y% ||$ɫ2_) /BK.:CjH^0uThBUh Ȁw\"NR (Z-T1s Si 0*܇INtR?=ur$(q817 $I/D# Z?`A &JEif[)"O|) l|%J}Bgj)2@4lc?m{ `zt^*I V Z @-.uȉ ":h #28=I,=rDuJ(6x*3pAo@_>}wP>cl.> PUH9@OWA.@Ȉh (Qs & J (`"I""Y Zbf&%&"B"iXbUI@J)*b`XYa嵇Dz‚ }`Fes  #GfCP %L5Z~J:z&@|n+P yT.04w9ҨQB+ݷ^;c0#/v2s݃%LҦ%CBJ]pH){Q @쭃& qv1aLlI7`'me h&K4XPt"d`P6Q+@{$lhCT Ec'J{ hЯl\y5"2K%}qW@RńBt;>A?oa@B=<9 ^GrD㽼Gaл1݅0 tt qGh*M+%X0 Պ z h< 1XüYEd4+jeErdiLarkN+!; |<*V(bQG( 9 pO#$y||@N2tʃvJ+~&y]6 y ŒwS; ل3N^48T7cw\⺳AغF#rS2Ҫ&Ƴ0 Ci)Ȁz=w!\cZd$5n!U5%t&ݸQ(Cs :@E(TTD\@Ρ6lmЀ1ECj&L<*?HzERwt$t EA, jw! F0BҋH)GAH!qܣc$ J$aȚnw :D`%4@3ThaYw \~1MK{JA]* edEiDәkGxa4LK rs(Bi ѫFUȉW]ۃ"ANTeFY~ )= >ݵ1my#6D; c׾8gT@c_*)`ChPJArAe@}~U! (Bi@ ]8O1rk =- @X1 OƯ^'M#Agp'R$(|ft.6uBQճE;"!$$U{VA ,A$Bs @Ȩ} LJD%1-LU2[Ѓ]"h؄CpE@CJ(JqM 0EVݳzN.-שD*GObxF݀ $ ƠB-$ɦ06r)H 2]\%&vdqB S-$,e(og\޶7 knA)$a(ܳ|-c!\apKy}Ɓ7)Aa 7} &c;𮶧d/biԎ#WD-VY垙,dռ:ʩ(X欩|U6~Y >nwω;ev,zƍN9of aSNz%xכses39 kBCjz̓+'CR69f}v#MS%mC6F1cK% r9F>dH 97m+jA~S Q^ F,5R:' ` `@C[&CNPߘF@a&IJ?28c`-?1i"B*wE3 =ث|[Xqt%߄&}~ /ÙW'ep2i߃<4WP;`qG>3=c|Yl;7)Z֎meH O# G >fGaZ`+CËV}48er߮̍.W]/T6ZջtR$;xm6GuMU,\+w(peSFf{A&ncYuooУL B~[>02ɰ{du]:Ҵ//Dn4w}k4>: rl}Oum5mUWwywR<_Udoo`ZD53{Q+=~a=^W$=]ʼ/N_m9Dal.`1:l2Z<'" QSQ$Hub:h_u״Q.gZyh|!kuuE0Fr T>JL丱Was j9sbsz /O{ızw%aYt xt);Z'',42ND/b.#ǭ:cedRg}ַpz.Ǘ|xz{\yDTӍ&m5a}PW}6yoI=n`81 c[qʅ87.Ѡd=93#WYVNJM rR]9q&NygGm-) #J{LZaQZw"T? 8"NʮqhP F$ a!w * 1*FT(EE #@8t0 [c7{cdθ-r? \"ez7Nt, s@ @D`0 8cs|xE%<:Bb^=n,`,tL[fm$st#& mr#FiPy}t؋e|zE=0cОYʨwn۹TF6)\!GXE;%HA rptb$H$,v& ,!Lb؄l1&Yݳ qE`T$،wGW$p`VsD{8d-֢VPMqȉ4 8y2JLu vķ`{8w#= ʅ(!FRJH *тaD НXQ`LD6; ՌiG9s t-d1MM@lWw m֘_^v63II Ve`Pȏrr@!Fl+ח ޺-7 6ɴLT4Xd3K,;JZ.\DF8V\vػ:\ܸU;x @yxŭdCfdS#!%R4JJ;!w9DMܲj; рbxNE\!"j@9iw]:քyƃ22L b Ci4~AGxhx*N{=u;1%w""$VRQ.q"}4b?;7x2P҈~^b zCxҧJF} >WCCZӭ :DAЕTGwviM4/:\U[LG U e/Fx误NZ v4Δ4)AӤ~HP~Jx\Pqv鈔&b:1)5ҌGWk'XZL8LàP#( HZk@ Rih li? k<,6u-L $D;4}H(R ( (L(РG/qnܜ{L= @Q}vtÙ:@&Хy_@tHw]mŒ#[&KOr" tc E/B dYph<<Өhxzpra"U`&Q0qgW\7s` QO8{iHRt/@cPhMC;oy\3(50[=NBwr+, #(_H_($*Q LR J=+db.x% MAC@~PU\ֱ] DvL( Ou%A!*+(!@M~lzCSgU FrY@:P{>ؽ;ۨS8*-A 1<0hZ^I(3k)T4CAJ%@[l9}W`er8[#qLFʢlEUl0Uq}GO-'`89ӗn lHXQ)! Y-lQ(lJ8#,; aM\$f@y@ī 8ZA[Q>F&KJf$FdSK;5:d BL[8DÎ+xƠ-:5m]t @l A+-hjUXAR#B6఼r;R ²&3 f}S4(P !,(6dI՜*Rr `z@AS<=%&TL]c@܁$I(4 ** H< "k `L4RQL]rwBQRdt:Nd;=FJUBUHBPۅzNB%*T:TtR/С%T^ODkXl BpceG08:y'FLB@,T[1\"LIM(;@9Ҽ@)X&Xh"Z)H H} @`PbRZU(JJIBAHM4%@< 0;pṈМT@L@`B'w`m(v xP$=P!'jzi ʼng*P? @B$Ic12ذҐ@AQY~"+B9痨Az.|!_}\d&J M@!bvh\IBA i22AF}R#̭`)"YBT]dȒ!! P.1DarfDn QX(8WiH;d8]b IE ĨRx@HVnAbGe٠HByf%hw!tPcmpVlH0n7CJ6VТhSHHPPJ iDBP- *bzwk4iVBŕh%@Y+݄r+2!QPPmA<(B ){ũ\"i5%6MbѼ4i+J"@X  BU% Pt",C fe;Azh!7e{M;=kKǑ %^DGXIC6FUr=sغ$ƒ `ݜs+n 0iBJ2 Ȕq*枴TGLK1z[v񳆖S 3ԄRB #Uv(3-P)M 2k:J EFV^5X&t-} i X{ǣ jnn u Lꉒ%]s$fp9n;6 (IqǝP7wԯ8d5@Ҭ]+-sMk.ϡ5б4ʙǯql8zaWw<ۨM  % ݋Dnaƨ'#(4QAch@$ p!z!=g(J,FRDfAX9M&pGb.V4GC9 =aDTm ^@piA0T4pQu:TGw5\cǹR: *@no]t4G(rN WN :JkRJ!B7F^_/ҙnAaV]c.=* ")'*,#xД(B!ĀHHRB2$ "L' DgcH+8)ib2lAw L @CM*= $De8DCJH(2B#`Tj@ B!1lDklt TIB4=fUIh)*IHsqk0e.$B((S2+2lM(dtJ0 j!%42:JIEBL%AeAx9[A& Ăt93l!c#<!Pj5gTv!gk=.. DUYrNHfM=q ;r#_zlS{"0 g?BL` BU@Q3u@E0Ln!cJsdʓ! BJCM"$ EhzE\fHƓKq<*@hPRۓGDP'Л@ ]uu%m!B$)R!*F%nL<8 L/%Gp@zTgpŽMH JzA0#%AW)D2 wm=mjJ븍s/;&IS~ $tQ]Y:stEtt AP'AҘՎJG`VZEgh SE0Hnyh4 uayUP铌 Q4- h!œuҢaQ)+ܢ*..!r 8֋* ! H)4BP"!P2$W qilt!RTS܋[;aBCQZ]ʦH.b%@A64' FE nrt}bq(B&a rjKh:88J ړ !K; '`&)Rda&"BXV TraB U4s4 ;Ph80dyVҪI -tɐq$e*@ݩ6A1l"+(DT$Nl @" pOw nH(B,J- $ **ЪcҺ)}J#N!EpaSU 8;gv3rMpD'B1eO [95M섓ʖttuqafleqvА1iJw>@rm<,M$;80*JpI!w5!bzƓ2 0$i WTn@ ]b΄MB[@Dhz: 8% B"@*2ġ@4P@!5HR@vsBxOu"% TJB::utG2vBL'Bh>d?Yt7"u1tHRP v +vLPi`3vv(q`3S`.O0Ck1 Y=8*$%)PPJ@=q0Bm*`ߑNM¡¡ʛ%@ t=҃ `TǗn QA(E R) (IH:SHPS@P@ ؐ& (h]p eE2sdpcC .GG6H0J!! gbhE:LHr%&hV t.yPBGFnThL@ O(ӹ1 'tCG:@j!B0aBJP6Lj!N⇣.D%Pm Kns4QGN:.AGH@U{Xs0ʟ@, 0Hw2RhAS@̠xRQN]%D1-llN3`,mB QeqT.@cJki|R:YRQK*vwf :!&/tr^y~;H}$ZXpzWH|JP 슅mncȫAEA Em1$TAɐĥ!BJTJu$QE1TKADINjJZ HB$lk@D  }"$j'@l 7?ԨERڔ&aZ%:$$BP,4JCX&lV*q68†q\[$;tU 0D%J"!2Щ9 U:Uy$T>&s$DRAcX@LJR%XtB"B8i %t-PBm[۲!8BP$ 9)뫋 i)DBa@С4LJBt즆YBaZU %Y`FeN1F&ZT>@']"\BD䒕F #B29TAZ`c A3)@ RND@H HФ@%CDGHz8^`OBR*RtM`A;hA8$ lZid:;гd4VdP P Z0 Z)ABtRjH j:@zO $Ui C I( 2.҅iwXFG"Y]d ((փDGTDKV•x Z)$FДkNHd0pAL(| !+PT@P-ua ɧ}O͢}.K¡4,@$SH HI TA 6:&yZ[0E:9N-:`TtP % )18 [F5)elsN#BRDA!KD!(2 zХ qb14:w]c:Tr?|KZJmvd\jXQ Z!J{tnDH#Xn#mq/t/r#K0mpD;Fİ5Rhf|yNC 8 @(Dbz+SSew /)YSV Y1evg h$aJ%Mda(C)̽6I[#lіl j@5i0&-VlhTĠȉ ywlq͟8Pm ,0Q=`K<<}LzT1!! pͥɃU@A !Bs(!G! ̄"LԸƴ""Q,NϞr 1HQ @8疀:ȉ#eCCd;= lm20,*%(m&،Ki 8͒]c&H`#!^((z@/0b @$ɑM8?w@6b%C4-D-b4]:k+$4G%>] bmT;qZH+1EDACI@%[AʔK E2hq3b68Zul.&fW 7;Erk@ 4&cQd[*I0٬٥E+@pFӀ4&M|_/?쯾T[&~BLL9%6f?6qO별)ZkMݹv_J Qx\JMO+88n~enAoN 8fŧM1'=ε hښ:2+ PX$q9;?76{ٱ#1i\DVnuҽ qj"dMj<ׯ/$}{lοe~]GNmWࡧW&ǫ@t#F »[mvYzV0"vۏw;0Q.o󶇹⚟|V |8Yg]gTfke[O+QnFC#Gtwa[I߳N4P*UŔ K'oXwCuqHUO;9Ŕz{i\;"+Bbw:2BsJwҎ?G˰‘GJf$hiQ$wT#`~c7rl!#ӄd"J]s[ |'k&L+)e}=҇}[`|qrpy>L np1atvGk7%r~5QOG_ ꧧ5e2Czo2t tqu@lOz-ztc>tlc6S.>ufֶfqOxK-uUe`۩!ʨVx' Ixz~DǻkCߵS>MC::ٟ;<4nᆵT^0Y:e;xeމx؋ڗWdߑПqtb[,POq9Z C=BWϝ>*I )Nwѵ׸]kg/4!nCUErJ"eR# 3 zD"+TiM"d}/@ԊJ48KV GQ$UԂK*ʆR1,)jTrE*qB­'((,e&(/ZW[#'Py6m6c2ՙL2SP= yrA d0T *QGz{{=>IP%^[:r PuTVKqveR/# Q8(ZK_ 6*ř('QLkYlf5bRP )Uԉ\DѩC:jZ5lW'H>C@:+Lculi(⏈ȘGFJKF%8(u&-(~ʜ >DjKJ1`\2& FTȻKq̙LlmeɊ$S\Uː sI\+f7s8u5ENlڃkkMgnm esYrQL̸FIW*Dቊ4G99(.JBOiTFUU]ȼ+ZVWh5D"WTTYt*җRK>f6G j 2M_?d"BϚLh kmYv/h}fXXmCrBʊ  d7cr@6H"08b"1l_!?TO"4c[Xs?wA4]5 CrawetPSTZT~&:0)2MB*#)y9t8%5U_$》b Cwvܩ+R@!)ڈo@Cv RU'D[^R8ʲ+}v>,.!(&2 N+zL 2 > xA3L! Te*V`ډJ U .uѰDA7rEW5 (2Ԉ=S( jqꗣUPi+3kZ6eEO% ,4UrٲN6e!IJ:̪FѷӜrrR6]YWg,q&\INeArs8`\mWn[l\e3"5I.v{=[T6d{=SM4Մ.i棦Z歩W5.sgv.w%ɱ]:)uD9"LUj^̛,<@4<'(ҍCF- em+☞Y2GЯPrI Ai*~a/J9O}!&Qd_HaODW*ЍC)4IA1<&Ar0e OꜣEWPL]Z\`Hb#J)LA]X PI- GG'M.C#*=dReVAdЬ'ʇ*P$Pd +%F80e)Q,EYTy".urV9cwt6T3#Mņ奙7=Qf5mf2iIUdO>)4G#|Q'&_q0ELG+ RAҧ(XTr^lMYq!u`D-^X^1U>% L=Ahd/_Ha/Ej8e&#EjUtqQvoc:5z[E؛.iu'*ڜmvw+VudžVkpyLl\5N2OeڍiMEwpsiajj3[El[kk[ZuRZɒSdDRIRIR,\'49.:%<8SRSQEʼb_=`|EQP(g"6,/e (QW9pܱUzKĵNCzR U J{g]/DH:D,Cr@*|8 aAFCs =6ٺ(k`fW,(jTG/zj ySԣ VIҗZK .*"j UjT<zT@@K6X DE|#~‹pv11P/MLKRRʞ^!fS_H",QҏB:#*J 銧£FPjhA85T,iGNpT\SjjI^YvNL:w[6+ Np VKꚩ!**rX*N(XKN*Z$:b+yQ:"KLty3mP Uq5*JSʘCFRz9SCԣ )b~,7S=ٔ!ArܕM&z>TEly@C_ W'\9O0Ɍ~k~h>4Ҧl%p\,`PL@gj,2!!(HQY54}ѣZʽzf<9D d[IQI?);ifZZ-+J_`)])!iL+Fh!VDOCiBƪf|KN=K=E.y'*F*y)M)™fx+CUؗhWd#B )N4%꒧!F. pEEEԾ@g(+ >WR8hr!ixSʋRW%&Wj\*JQO@yRRȲ# ,*CBb.PpKBB=J#Ғ Hq!N dX6-b \Uq@BekJEBaA}:>AiN$^ebce[6#yR/T5 1/BZ.%KEItUFBiS4U/ O\%/%tFKB=4 X4QOxU4%^Px%\!.DIȢVA&G%ꬤqE+V 8}QȞ"$2>CGJKTī+*:@0K'!xTԎć TxU4tKz*.$^@NUbU5TvD\i,bUU)h\*d*4M&zPipixSҕ2h'RvRj ݱWdTE*SʫB/HiSF`zOGGBA@'J$Ρ=6fؖYt8|"}M!u@'U0%Cef[2[*ٰKʺU]AO릥_`+T/bKZt[x+[ʬۤԛZ\hMU6[oۤzKy̞<}3~V,l#^U å'UrtD}<'VBB 3AVe aVuN T2II y)O%)he0Z W9Gr+TLHDYV ]T8r)2'P\tJ+()4:(z )#:pҋ:S8,>^އ# u*]1R42&# I^PW~]/Uʂ#\ͬ6351I v'2MY %Zi*O#ĵ$44dDdNAʺ⮢eZZPx48Tu%O !<őZKDE|'\)=+J^$ԭf !ث DM Rd2jSJ`<4ڋD^Gɵm5Ce}WŲg&BDR‡1.I|{G.BԚfжŲ5#ЌTOS+ RCJdJjr"e-P`(쯍ehzIj_ E=.JXCA#.I- (4q'6d gn̉]chm{- GjfM9(i 4(PEEm(MW*Ԝ>aWRh|QCSJUU] '.uԪb`d+Qj AM" zx<>Cp"K^,Jܼ% ?hŁs޹?>dV A)T7Y<}zSʌ6mVQFO x'YHԒ #,3M֍4f1hCI&frt:Vh֛6fa3iƭZEjY+)-aQh֑RcYl4rKESTGPYPXKrOE-pCg/؁!#ۃRP_e걯[ktzY/$N <Bly6kɌ3j ef i# L4`ŖYmƍfFSf( *Z:=8N*e%aL pl6ViI S46b4Ҵ#I1YdlX͍UQ]Rz$3;>8uhKG|qŠD(F<(.<Ba* tE(* IADjg5AiS~( ܶ>{$!q`9*d`4 Udӄ"`J~k:fɱ{PnX,CZz@$MSi#)jS+XcF6LՆC-kZ153QFr\1S# :#TШ'1WJY1Uf.Ød),؝)-15f)Xd̃j|Re5I)>SCΡ!ҞU:2DA\]~{vx;`!1p 4-x.ϧnqS'ԟ~HeE<3(K*aKPґy ,@ M ,& ^*W%\TqQT2EZ)xNKT.9tC)4Tt5ARx墫K Ч%.CJ C"//!r8a:] rRS_(Ž+UjJ- AWP^*kF5lFfͬhT>R|tV٭f h2Q2YjR*)#UIĸUNY5*C1 42'?9җʎ̣65jͱm)N䈹&Ti.Uؗy6͘|zT^SUS_~)ZjHңD#HMA LOoڿ^~}JdW# j^*ʪuSD˜!%$:*CWdEDXuV""%rf !!Lou~ZJ"hQM VճcIc4ƲBJYMZ֙ɒbljDU"mCPp/*$1|(^-US!^ArU4ͩeeDkQlؚk4D 2Di͒bkVfk(ؙiqJ=*5P PeҗTBVT)QNTdT<JqPPzqRpPzO+<WGS ')xZ'Rs>_9-P\%+VUW*9>*iM5A%I4| Q|*K$%|! R!iKG*2EPi ʕi^y+¯DXL'VdX" 5 cTyUIZ =AA6զızEShRxbTj JyqM2r(4TT%-'|LYDlRp5WLF žSDL1 Y!V$䈱+-Bu M*2Ir O.g̽wS7 Ny|Y.F>z_ sNcSS̱C̞6=YcK+˜*%^*S%)1.ܴMN w`0j"8"+PjRQMbhbi-Hw@>+Ĺ&ER?9ʕ5Q LN#&@Qx`qC:eal!oP7@yq?yBc4Vya,ڨ _TehU7@*II=-MA4еijN(`ϔAa|IVeAJtF0jq "ŢXDRbNP V(S@dBy.ҡuPt$N^)+N%5 DԒZL%TSVұk1ScEIRfj) iEkM(l3!a&FifJ5&l`kfR6)V3MCs$]ʋI`5!&%Go2҅GB4>=%u.ҴZp=J9'{m{'󸱾;=D|Җ2#ֽt)UD!! o,Fbٱlqve;nwƘ[WuNR_ |r{Ǟvkda:m-jqk[L=1\,i4L7,0+'caF.ösNՍ\7kXi36֮sO8l9-N.dmnmygM4gƻιf[ia]^M˶9ܳdlru8lt&i2V0IkfӻḇqwiۺS6sRdLfIFkWNJNPCWF*dUd+'* ļİ9J9.Ur'"8RRzMQ:H`ZDY)vb+]ȝq,)MP)p.Uvi?wJ?[Rga CTi%L w;}zle`~ @R:8 "ʳst{ kT}:RjŵX$ENLEO_>~TxP}z*dAqQ܆ #_}~_GΩ9S&*l;;Pp!s %ShAL\XEZħ%)VK&G NU[mC=P^p8NT.1:HrMHҝ$OT\ $,KH#*+"tt]S!hFR]|^O$$T-UXt+al5lhƒ{&46Ҷ&kTYd4Kbld5T{T+K܅;0z])iAYB't=J#\WR%*P"꒭Rzļ% Cɰ VififJ-1 jl̦fIb̕5ab-h͒4bص%Z*SRƐMEQž2WU&B=IdjIK rD\RKF9$z+u%zTB"q $+ tK<`hXRa ]ʋ$I*de'4rrj RPzXH5H(ZC*"BUiQL)tQKHEqEt&K#NZV+W@le,RRJJ)Q)5J$S!hTji6"d*Rm&c1Y[Y$4)UT)ĖPLCЪpȚ"r& MQ-%eZJBh UPdUNnW jTD)P+1U ^߁쓊 n@ʋ"L9%{TQiT hz76 `zB7gK!LB^ԈI=deCP䴞kЗS@z5ESI20Tt:)8?:RQMЎrNqÒ5D]()@ R"b"ق<t:M/?ޢ=Ht:T|_X5LUN]Xu P,>T\PWviBL8QЌS(%ʂ)4-TT=*?)j?GVZ*9m `lhlUfbaՖIdrc Yz/4=){v=R'G(&MDTʡȖ*qUYx=CC:Oh_H}CZT]*:TyK9L(t$M%0ڬųZj,jB̩'ڰawB!Z3354he[dllk%HeRcj)RڛRƴZI l͙%N£RV#ʚO(EѤyJٌɞ)WGr+"hLuBPr&ޅ3C,ۦ1\, `-AF&yI4Yd R#S@xN)1HFaU"ʱSIb=A& .(Dꃉ{V_CG ̤d_g~>Կy_>$RWZi5֒u%-|*XV# sA'Hgg*Nq 4%-- dj (x7cϠ6E$ CB:0 dLP\,րT Cr )Ee5Dg'&lKl[mK@MJۜ7j9J4֫:nӻ{hN;( c6Cݎz }٭zz5r/ګRw]R5aw]oKl|/݇o}@i#+/C+WGnG/kGy\׋gws"F:Mkko=65ɠ;i}w^}knrv;lk'.8Y˻w mP[fQr]U׶ܙ>M[Ii$w/o۾KcݝJ!>C@f: ncjiwrKe ڬ9vtkvۊ{lV:-nogNv1@jOnmzEJrޓi3MNTӵ}ީnېݪvK=oVP]uPi"vA;>w݀6cݷ +ppn}ۯ4(>ﻮݷ{V؇} 4M 43S'F#ɢd2d42jhSSh h e%%&2h4BIUSzA=ɦ 4b 4JS@ѣ@&=@0d1d HM Ryԟ4h& =& &hщd ԑU}hE"AVQTK_>D]VDT%U@>*U)MgBP.2& ȹE\-X$r+(b̂["͌4:j0} jUtU$+ZQB@m:D lBg%Ȫ06Cf)2b@YXB Pi,Y-U%$;RtCTH +28CUOttg[l Nf©E 0@2`"6clb@Me1RURR4Z  -FNإѠ4U%"v0@)B):tpbSh))-H!HR4th(R()() kH5Z)i(% JMhZDBJ F t VN $( 0(4 NKJH)Z Pib7@!9*%%P@hiuZ>R8BIEW=*fTLQE+.ȹtgKaUK(c[$m}Aa4  QE:#"UTT|PUU@("D@DR00 ( L0Hʄ CO/dB."QҚ"F%JҦhi)*hhYRjh&j()WQG9TJҨ3H TsVUG*VRЂfeőr%eDAQ4@JPib& E@QM% %5BD ht-,R4D@hi@"%-#T4HR%4)CTSEtHд--4QJ(PRRP%( **RBt.)AU2RTaH +JutֶM4JAJ- ĵ%TS,CCJ4PRR@S5 tM!QHDJ-4P)-!Jҍh4B(RP%RJ҈$c.>GAZrlqizBq֤2jM=|8wZƣFkU GIB-ҚtKBB%P% %ȜO[q4MEVصB:mvB @q!UjMNЙÖNf9 9pD  5'H %8}*J) H*&hE&8lRQ|a'#ÏACISPRU$@DąR?2:V/o}D*I2B P?0d8:mEN;ȲL@)<;sRH; ĚCQ&A(P@p9w]4s:90ԏYLoux%M+{08Hbh[A{70d3%^ 4r!cvߝ+8k0z@s!t=(i Bi4iG\!V`˔iHO$8 (,PwۏrX[Nuz@d䔅QZ)-Ɔ'h(?3mKf);e,kPjX +X ;˪f p^lk%lɒcXqe^6SN IX=IyX0g-<ɜRR\50s13wTU˅23TŇ13VV Qwf,53t(LC. i*i#,8 ĚQZ;Jo 6 aaMrjћ| Et=^5U hVjq1328+ ZvͬmJ1vk5vkSZS!փ1DUa:rhj¥fYr.Lڒ:k6.c+]&f\33UWW^Ӎ&+geŶhƫ% ِeu1aYmiXnު1LjWNZӧ[ӦfiXwmmSj(jcS kdm]^޲xֻ.q _/\oby_WI=]ou'VlQbb`qӓY٬M=Y&V%.2U-E[Jn0Q HI*t:M(lpL1޷HgIa )p` ݂6EB93O2={71Nt@%m" 5pfZFqTg{VA733 VF6+jeRXH8"}?7!IC1 hC9i7P8z!ߪ:)o6a2RK$PLF||O5۹ &e :Mt=htd4M"iiQH!MZM,MyKoP(vQ% p-{i`Ab )%o5"ζ(mMDI F-4+71;xcR@Q]4o/υ67Gt`*;L1b 9X"uh ( =vl<* &P% HC*# E"c (Q:;+1 wQD ]nJ/Oez"9 тi@8#!$GD#12+"< ,H#vAd@ PD `:TWqE8U\@&¯QM "0$ҧ JQ"*('aBBD`A!IBFD  2(D(@aARBʈ|*0I T)()ZJ)bU)ZY"(0  # 9Gh ٽLRTraX;y*xOG(=EV* s2GpS)PYQD!T!DĐ KMqҡ@S*Ј`idC{I0)(T!+w ))wfA!+} Q >qHB v0E v`UnT8idlk͖ 7q#y ]hw@{j. ;jz7zN29V..YqqЃ 9GQ-w>ÚhQG hŢmIz h/.,GuǬC]& ]@v mU-/}Onh3~&p%>Jh"#U%ҁR Ut.uua}{=Q0j<&#A:BWIww )ŲhXf4u/ Om"%rMVC1;RrрQJy#3TRLcc&Tz*" $SnQsPr󶌧;uˌ8u0)0#AdUN(NWU׍܃ {cCj糽*>< 8xM;`g#R)S:5nB*'Ln\SjWr`:"ts:F{I51h.8pC,vTQPSu޹7$_^7ulȠۉ$  <y9CRa(k& l`<h Z1Ñ MknĈIyUn={MoWQpRmí+kRA[2eӝӤ!B@ݧ!ʈ bFLv1+ҙ5:nײ}G?mBOG1 IāTJВ.G͒hH6 x<$ GlwE 9AA!i)Q@6*ʤ"d}k!R>@1ccbE0E@1HRP:CAZ4=qDT%.j}E{R@h2(0#D+;PHa\M^6֗%4<"wGe8yLec|z 5,#V6܋q8ڬA'91NZV0&g/AƫEL'8lVI J^` {6ʄ (A/JY$|Ȣ|B$^%"! [J:GRxX)'ulJȌ B $UjfoHq!HL@_=on[u=vKe#ADPMFFU\DT$ M(JbB+pPCjpEUSAIRF4*T<{zN1Rz.xeJxC+pBQ!$ \e1-pe0PI0!Alڮj 2*#nAMMOs1vwC`1jw܊bP|](7Qy]{ݻ9Z[Vf ]otmNf]<;&;ls:eRi'@B=IRArJg8'>wUPuv1m3RڴB䐐(*H6ݕSm7%v5N!J4=RL4@4΂^d|~& dE:D#@78]%dˏtmiMai ;ݳDM\훭]S \R(%GXusu*dd Au8FFXAE#g*0i`4eʘ=4@% @`*O)ļ(}$>{Dm`:D4AӠ^R44RRСҥ$PlcߴHMtQ JuJꥆZVBu+! O ҃ k:f&Y H\lMa5 o}#d,0Ǘ'yw˾( /Ch_Ƒw1c\Y i6%lS?ˣww_yw~ǻ $),} oE0; mӥ* Q@;OAӤg>ͤ݋5cYA[@b yu)&z:1 M vZ]5ib C2r\KG_wwv' vB.wf=d3 %-47 #6WkJj v== d")^Ɨ>ͿLPY eA9) m:=A=]:; <dyQѫ ؤA PE#TfN^zP_dM(BT.zMaɂvM{HfA@Hۣ׸SjelP:hytãXT黃AͻZ. Cl* paip="z4NA"r1'#m7{/qNAI1")jÑLuʎKΞʗ@m =&[h"tj.WS'mR")(-X* IP|H)($ *0KՂMٳiD1ܘAq; ۶'r6<Pcw=m$SBIȦ݁!C?O(p~=[F3 'y7" <$"$RAT4  CDA#PDR+ @E BV4!Si @S|}zH.( X?U=ܨ*z ,*ROpklD$'a0#z6Iuy'"u$ma_ ;q;!%ȧp Ͳ@zLq{ԇw]k%.rǎ==`v^l-ig )QlDxp ")eUP;E/Emy쨹;Ay<$`Pr'3YrM>%upj˯OފްwN]ags>8A]Q8Pp##.~;S==!BH.QxD :b!xiDKa!BaU%I-_w(1rG ۫ UIS}X{ zKE!FW@i +$J"S K Ӏܩo$xXH`t/ :zN9 x(ʧqG(;BkT2}$Ԡ@St#t?mD}hOu=c@lZwMw^{Y{o!1;@w$$VOoP#klGʧ;|j$![ ]ȢF0]y=ބP ;<&ke60Д 4K@ a҅-XilHpЍ(EH"PDDKT#vm|`F#Cr] bśH)R;FJ'У^@Bf;FbHdk0fҮRLBCXyn U<ԓssDS;< %9ܢtCeMOBa $N Oc-ªOqfX6߆Js.*9k|oPv¹ۍ[m!^P%q" EW.н'_}ݍƍ#tuJbퟎz_Cwp]En=BAeLm yFU^}Q^'qTA*H'a >@SB H @"<@"Rq+j BaU$mF\['miaJAp@ bg)Zr L"e# 4@2 ta㊚B~ hSg@4úA pp2uɶZnRBBx][r\jQVÖz==].|+8 C@tB۳:p`D9c &xSQdOiR绕Z0ԝcǽ#,nM%[kåB4[@wg;@ nqL m"zHRxpcN@ItPXS$*x&g ђr֏YE(Ɓ#M@-aF6ENQ"/J ҹnxa*UǸCE$㉊&') T8p(m@!vP# aG dRPzHTA >#fdq׌_NocOrc`E9ٶ`в m!; KMbV#A{Q5f퓱( L@ 9F*D*J k8h-KYP0,"b(qہs(͓Y- (Kg"vG Y*D%F1~,cp#:1͉BZ ,$@Ѹtc(>Sɂ=ҧҀ)Z8œpq{"CULȀJ r"ʤ[2Nq- #@] rp @po$>AC|HZ,O$b2)G: =P#`9``P1t(wYrvU] `܀ rkVGTL@wH@= a/`:d=#$܄ _{_ !"Frrv  nHi:?| t4B?_T0GQ, qȸ>6*ww}AāH1#BMB Wu8 k@1{lХFVD. B4 _=#J 7@@uc UDAXhn%ЏW=rc9y /—leށL0)vAS nu[sGl !,ǃg"X՗@a4`6Q lcPlq ;KI0 Ve ƾ=RQ,`Xّ[8}AQ;Wb"( "45a!jbQ+;5Cnֶ1aPRPCaE9dF\HѡADth6!UVl %8f*0I`Ը3aٺbɛ3bڌ] #0Ioik CU\* nn]vT>!Mʆ-܊dG'{09! UҀp<¢. Li *P) kS6mESq2sj4q\D87Q#v #1^ܝ[0r1uH!9q8&jIYCMȤ#=2=hHOwdB$*ZYQJ$&0[k:(XP; ~QSYT_AlEAZ428Z)*T%68It(玃ƟHd#HEH6ڞڢ9j G(5bDdA$ڭ#!bE ȯΝ!(¡"Xiy\G(pq]{fr]wxO6Bå"# K H|շWqn633=e9(I LT@!.tiiLH8-9kF =*{AhF,zo:@rpBR)W&`n l<"<&E]q( cA6mlUC ݇mE݀8^h̰6uMj9Ġ.v()/  ><|*񎰪q'zM:`D "2S c$Gv vGKWQ).9ڒNSH.8X+PNGn p#̡܍:[rvlMj1QM]1s]۸S')H@,PP9Qp 9`GNNqI!yL~ʁpxE4 H0 ^.TU7"+yr6ȦǪDk `g :hXD{"ص; 5k<.ybθZ8堓`nsk)m \PuLq;rU ܔ#sJNc``AN@Fx *?@X;\Gq)\Ikݢ(06m+T!ЋЎT:ЌaH]@q@*( Z@\B) "wۮ3@7s &iTLsBThXJW"wqfIAN'(z(Т.*EN{ELKA Cj*NQ %#E7BtZ(AW 5&@ BRhot C,m4t >4}[> ?:޲JHkd};pBNI.Xor:O:vSn@ H5ɚC^̟~|h_=㹑+Z' M%qtb^ih t1~d%0VdCcq1>7DFߛ:+%=^z~kY!.t̎HeAA(P7vݰT#Xr7nEdSp]lzr2›b ,qrN嫴j5Q5NKL%*itA^$MТqLB4 䧢! )Ő tplA1-(ֲ\`yUwBv;utȏcPraQs@ *ǎ+eRqՕ{wjQ%!BH IHBhMG@5%V8Fŝ9)S(r-؄gS8wD>`غ  =Oop'[u8cبwR|ևj^r%<Css""9^bB7,v_lW1)e횊, iI) qBRel*2=aT<BPĻV\maA2 > meDƌ_v8s "!b&&(PB'az2Q ㏟Hrʐ 7@e~%0#-R"Hٽ%N e6#B(l DCPf%c4q@" !ʌ)*LRMS,T^jSBҦ$h+C*JMSAQIL"Jv1@%RP4L QJ-LAS -T4"&DAJ6BgF- E$PVWJ >>נ0!Յ.0#`H@ ! #/(0&0PS i<ʄ)QȜ p,< *9"Ħ# ,2 )(U7TtQ :{-X?B .v#j>l}r@^J:xsC=x!=VKꥻ?{O­7q>zqgIX! U!^H@㛁Tڨ eR쁁!@8FT@#vQG PX{4&T!T3O#r/LuцOeTv`*B*/d+EB'firG8! BYSTo;K('ڼUut @  h5ƻk4 H´!AAC7qTBP4jA1܍e xe_yA0 n5 :881cY65L"2m*Ƙ!^<[SRӹ.=(v#p/!){$.C+*U R0BU4/YBpu;o=V#49Hc2@w]YA\bv(G\\Q}AS~^,dp#dY8Fwt)I-mT6%Β:ciFG·=u=_2x&!W()ψKﶆiډCqG9hEO;{~v( pwcZs6oGܲ2BB{Ҩ*+$ PP* Э*"4RBдҫH!B %"*S@%4J҅%(B --!@P *@NZDPF@EҊJ" 9QQq`z`!2q"UZxK?AFmJ&FG@.uG4!;OElr B@`!s:.Ju7t-EܻGirY9ꉹESvT]87v7#ƅ %DSiXPM r v9An GSȀ \`5`1]/?Sꟓ@&)2Yb 4 ™ˇAţnjDC۳fvE hk,si YJ⌓b㸥٪`MNT*@j@hM p `:r%p=m9Aݕb&XG \JAӖ(3!I7&Y0QIH$CM$҉(*Ca42e cab%hb O9$kOoz#pn'd lz:.F67ly1m«" A!}=J%r"]vL)I BCCMu˖x?i?k;}_"ttT6$=! XRV{;(Hu!ƾ/}x8{Bl>(yCA&fH )"&bH ` &ZH4`;R=q Q4#\oI(Cd=n u(Adq;L wTqD(DWl*z䃫pюvADiJ AWN i ҡ@i&d$Хb@i+ *8m~SVH_BG@Vqrh wuL)K*2XS'vqg 9  r2[-vuUC6놵sqcnb# r(*r.3l W+k{Wdcׅ[VE.`]]HX7Y@MzwJtA $P07< 2N8eDR}n0t c#6y\Ѐ.˯GH eM n  @fQ퀷mRR,*\(peE.Qta2FRBA` 8:d^@Fb@VENfihW `UH(&0ݨ)iA M"A 4E /8`,#AR1 YPt)>; lG>|(_ױ*@ mZk a&$YV{7рYQhSr)ñg8`B$#i #`JΝ[XZv`=6ͶJ(0Bl-D!5B1:qBdI mC͞sIEM iz*FP*cv3$-DQLI ĠvvE(A{eiD;A @P\c`E㐆&hBNvP>ǐF"=p (3((x9$0+"`LH)Ҁ0ݭ '@ۓ݀Czn"4b{E[S B#ř::ݗN3UtB(B"!Bg} )z t2\`[hW Q۝P˦,t=:MDz/xJg $l ("XhC4q*D;58zNF`g#3bS ٘ҒTnsMX  hy7rq j:ˉ \$H@w; AL'J n ,\qqvqdB$ :"8Ik`Ai8县0}.ɻ4/MlhmaCl( j@L8D,G6TpR=큐CFȂRjNQD%ER$Q 7:8 KphBjVqqr !:/~7` ``K@H(h45C (*g(h"$,~; E""I *)*bp(t(n nwaz @ uVHQ#B@$H(,wp\@,WC$E2mnVUdU zq>V'ӓcܳhBC[6ݱ$"SZ؉[l*mhtug B" qϯ'JC,F0wF` | 4N/&i]]H{<]\bG0$ B-rz<Sx1PfэX2x‘ikLW''v1Ҁ\ y_vScR-n *myw | zЛ{O!T EkFZۖ>/ǷwX"!}ь"H"Lmct ISL2`vkjjrP%1Z..NI+)3lRSc$ت8m&ӓ=L}rq:-Cp((Qo^ `*JHMPb$.+wVppB0UASR4 D/r/qWgeD4ʎaK[aQ4WPD ;M]ȈP@ݑTĪPIb,J k9#Do tJm,eһTU6{/BժI$YEp$N[ i}mtmYi mEJ%E)FL@,4&8xb"JMց&KbCHD-VUO\WA *F5kg(nU"fIallU40[j2TEdYTmY5^qȓa9;btE3ZELB$Q X#.)э Jbp2Ihjٲb[4wS,尸Vʤ:Rjƫ{6ԥ !mФ(da`@`3Mmٵ5Bld VUJf *WG 6`q[aVӔc hƱ@n,nGrN'/\Cd Can\q(K fjԺP?b833gPR 7&H^P 3Gdk-5hi:n 4"( S  Ba)݋In0S&*٬vc5JdB^`U  FzEʫO#XW-p"@c`>OG*YQqi= `z[`th1 LWod_B Ol=!=ܨ #qɭqɑ(lYJ*w61Osw[N)@QHJu16ϔ7veXQ4Χ= ";AKZ$5z3 HE:B H;@^7HCL8|w3E^?l{ϞN=p5ϒx;aۂDU ',uC4"R!S.]R J^ ݻ8@QD@:6.1w"uwimt.QE$&KlC[:}roYc uuإ{(KDcMwt B!1l&idMTȂ[p dU.ܢXӠF-Hsa{ʮhrp[]"xDt`{͔q>Yܐ)- )wF,@D88T]jw\P09Tʀ`="ZIEB!(0kSeP* JE)0[`RFJPҁ vƜҦH"H"1QRR4 LQJIE-4HĔ HC4RDAS%DDI QH%+E*q]LE(Ptv9ňz5Q{8%R$ ^L4XVeO"A|1YN:q^8Е 9>lMGBhj`") R߬xʤ) b6QuUR(?!M Н uΣO[#`Q56"6,tV,=ڱRp窷qL`ƻiI&qH&)]4[f]؅&)Gg8@UU,e{a \ݬ1 v-rpv.DhEDMPJ "@d0 ,a?DWCBrƒj)2$hD@XAhBPC< ȿ|'O4@(|Q4'8d/Oy\4"&ejff@iPR\0uPm. ]O[sh ߝÄ'xȌ# `U| * tB+ Y "@ AL&+?ֲ7@60) ?#$ $P8@1 2 TD?%Eej&f@iPRE3  P< H H\ ! Vt b BB*| XV! _0>#AID=/ ju1 3Z@NS҉=pAv];b"!AA4%0eQx8lRTd8I4K'P0Ff4h`<{FFH S gd+I` %`x38Πd`fT" SiЀ#"QZ3I0KX0ҙ1EUVƔQqeS|MDz/ A AL("h =ߗ.8vlPS.8(yom`qP{؞y.a //ΐ;lC[\CxG]!v2QBj8TpB(M$ Sh6X FAzuxw{Q0anMm7v:!p! |`^ҎA] 2\e3НYL BkmͲ$Amd琉r)()Ȯ֘Wv 6Ɠ(BAxwmE'ׯ |qWn*xHwwv D]"7\?E-jmjIhs=ig7$v# 1Ʃ8N*cXrwXⴻ(SH:iJ@ htC%ʁ_ĚvxuôH".cr\Zg D @ԥ,<}LMGҴ *(PP I.< pr5&)v #_E}R(B@%)o|>I]*QE4IJ4=(+CKT995SCHAT'(=k2%C!i-h}?!ScM;k>}j  eNqN4)AӤ~HP $=Cݐ#7v탡. 5Y}TO)s 4 [7pP/aЇH<>N)J@]D}OBߌ;q h);͟rC0=g- vmOr)!A%+; 8 "kSmJt2tQIA0$ BBݎ"dR KetHRH&4iP="ө5΃:;vh g M(<)<țD pVK.@ J†r" QLwFi<|tH ]Xπ' H+FQ_i${[z:BB)IB"C -a:C YOK*3jN$`5"Nd.H !ѕPN1]PNTEٌlmwGA=JKŤ*S NA(J?=*N$}[IuA_>$;_+z~%~wGx9>m MR4:}Ā)rH^:QpB.@) UH  "0!@e@BȪ!,,8`*L]QO7ǮϬ']0U6O^y_v,XP|XW-BЩB*B" D%$!1JԱO@<|_=H;(U)1/څq\UW^Nr*Lq]l wv2#(iGvqXPr@ !H\@U,p2@6ۨ*"=tC7gA\d4RJ~ ~ ĝ:ZLBD$BD10*p/qCDq UФK<FYEPBQCE;Օ=R"n8]ș{ LۘyDGehIZ)$FДkNH{QFȸr.B*o ^] \P:~{6{hBg.ֱL9d#SpgubHh<'I*أ)YcĊU&<ÆמuIc! WKI i;^ 3m#(hPҝ ۺ $Y`PS"B@%"))(h**h JR(!̈Z:ko$owMI1=~kħbLPd$ vQL* t9Yn2pQxcFngTKWc̒_Kx;#cLٲ.[%%6fU(ȸǵX,4=SYVnDLoPmHΖYe`̈/^r6ӎZc8%:Ry1@ zu7߱S6o UIkׁt}]LecgcO{U8Τu[WOP;ݠ魨OP|(7{/@s\rã6n篺q\׍[pFxu7J>n>:p{ru}WWxOMjyX5{%V^ fZU'~ mw;mHIJ[5^8볧]S4{u|a'z}__'t.sEclkQٴm}tێ S޸:ka$Ez`[ m8oڷ-gȪmlyD|(Q(E1y <ɫR)J3L6l+2@€:;!Pn5aGBdbh& JR%ZǨHLoĚ=i䟡 r xjju## bL-& i[&a$8Nm@$V(31B#$JZOZN|>=ȼmv0hsI}D.}uxYk \I,٣"i3VPlmbM_yXSƉ͊-0E`U 0PTeEc( ( eEtPT7Ue5p:=.>@ ]mF P6@@14&`&FMhBm &F*~LIT =Oj#<5M12=CO$6iyM S G52h@S&SJh  4h4""dz!L&H =!zL&&LSGѦMd=F#MGdƦL11241=LL0 *d14bi& 4&@ёG& FAF4ɣF21&b#&&CCL@ HB#O=Fщ&L#G&Chd#aGdhh 44&! `II%Ih @'#'I!!}T%4dRdAdNX- "d4d&B&T)йYY9QBR)J TUKFT.FF94 ҒT-UFd呶63M'|3F=֩8QEتO+R/n3K]ٝmOTb8/%zOOuO~n +MTT:Fˎ:?l|LjȢE9ޗy24MӚ_6﹝ x h._z< V[/vJpt7~AE+2HTs#W;ZAb{7j9,Uf,廙W2)Q&ŽLMn\spclnVnfAüۙtvvk%48q|oCwtzgo=-%rM tk7Oz>_c|;>nCso*=3m_W7e;Cw_=g37y}hf7_nlӿtre~k{$cG>Y`_|﷽gvtps}~8KO5q%jx:m)Rh M+{vm 6ܕ"e I+3u8Fj,-c.c-cH5A#U-^{Y˭k}=褺tYrCo%ýkpI -~p&.0ezA]Z,;8s8w;v^PKok{aBFՎ#L6ZO Hpz]T>#|x찁.!9tf3gXܽH[~VyCk-@Ȕs Ȣ\qR\ [e~l܂cDǬ@zWez 38ז(/ bO\7!e5% G|r+U0q|sq;X`GvJ<&; .+uJOv\%S"J6s(!6jw͸L4e 8{1XVc( 1= e5 <È1Z +kq8zre먒*/$k"xtM1Q(9YY8oG!{v'I-k_q9o+IOyEqpK3 G-tkj\8Ǎmv :3=-sN'>:hZb¶}oη~]9U{MVZ9p]: h\(x06lzY҆[cSK݌K T8L*XÎ0J9nK6env4e.wZ+2'M?"HǶC){J=7 @\@^}M*̄Ru"GFYWnnBlDՋe CѸ]%:h`?{ɬU*B5f"&g;2{x.Ybm8% b T.:X3P Cֲ.|&Μ7"tlSL8yFkF癫RRRJ (. G!)`P]rq*j f@'K \ 4f4s \s6!7nV^4w2P$DG)OYx6syϘۮ ֚w zJS8!Ru]N_Y&ĚMno,YPД)@ĔQcgX=LlyI4:8]N0] \^<8_E]|/1y4BCPQ,L;}DO'+#`kbMg Ӳ&ve۶ ׯp_,{cRwͥeLq:OicDq'ˌ&Et2(M G~/aj7j5zvr;@u_7>)鞞!㒀U BޚS:Q Ky{ȀPRQIUxBGaxrAHD.vjڰ|9Z rq5% h!, *ڇO";B+hRc4go>O })k)^u}qMp<<(rlmr8ܾj yTAJWPSfRƛ{e7pcNw=E^)OADi(eH8/y]EdDW/t#5x{_t~ z>67Qo" u2@<8%|/ n~Wv^4뿽|q>ڑAA$t|TgMi!,Hjf IZ/f.;mq hHD&H=2/I SS`]h-:PA^aeWy89'@84|kS!P}BE{IIKgauPtI(BI*BiGt+X`|[5=jiZ݋1$HY</r_KgFKt#%I<:d㲐(YR_$hAII^bň X$+O#?;ǯD(M/&=HFn],7\//P!`H@<_;/ }d )JD.aM4S$#cj=6lGZTPSAHUPJRM#IdQ9&fce6)()bA)(G bxXJ5Bm&I2449#-QLPҔ @еHR@4%!IE#JR9JdJ$BR:9(d&Bpj7(J?Iծ6/@ z+oaF~ZWPBL0aIBd44i&Y$T!Kd(ʂРL"Hxxu#Pf(o*E%$ABPZL(GP F@mB (T֚PCxR hGPj&9Jm /Y 8I BP!SR)G*ZViR(4&MrT!<Ԯo&\ԛ!ݡ'\)6MK@dR4sY ˚j:E[.`s.am%s l9 Kdj%MJj @GSP(Z Hq T*UU B&@PSAAFѫhv`JRK00iZJkF(Х-AM)M)>1 bmmVeض6 H%)KI H%X6mL6B4P44HP@"5HҋH5DJ%5DH(R2% B+@2I&)j** #H jRl[Q e-dk3fŭf6 wrʃ&UpąJZҭT9N`cfJ둜ASkFeT$fl+9ӡ9)uL:&fȺX֥IӢcj)QQ.bmTNI.hsX-%R4c&8 %8`H,Tj3\j[SQFL8܊i%ڠs*m!:F"K005(!: WSQ'{*-JU*G}dVg|DRrqȧJڤNbK+"ha sA4uu·ThJ`es%KL2G*Ș1NuL f:NrDѠPgH\\N"Frԗ;CZtᔷT{B T?CĒ $ҦQ-I^?smGT.9*TTKu(Ƹ(bYj:*hѩWGPVa\MTNi\ddYE۳ݑ݃R vmGZ! ~ŁoX`O 9% DIS @dok"kVD $q*᝝.KGe6H-e*TRӎ]SuKB5#Q*']Tuf)؂-A#66Dl:EMc 09ܖra *g%q*\HaMT휙Z J1hq$$d `@d߹4x9E>#پ_>?HNrI$-Zoc[qhY( )r ,A7i@60HMW<?=-UW0psc &t`ǎL0ZSB0/ᙚ\/LcG&龀aJc |iblyPkigx*^ TjFQF:"HzeJ;yA؀_'3~@n7K[k[id\=~Fwr!87&cȋGMm)QYgIM۸ջoݞϼZz2 j6OCxϽ86m|% 4(!Br~ >O<c"Dɓ5E=zȇQmVR!R˜k{ }e%|@a#]z` Y|QCi#; ڔIudCÁYM̡V` Cz^9|}.MY) YEhZeF{ YmO| t  $$He'eR`rN C>-6~h[&LB*3@^o߈0[[3HT6^@n3˼J<7LAWD&K~1`$AxG"e#(9BJ$h4=Ӆﶞߑž)'$R{Tt[ &gx8M4ZzzD\"\O).%gշɉ W6hWc?>|1/hk..u%JqRT#R1e?$҉l٤R7V.Mj8ta_@E;^ﳳP!Cȼ‘1,BD\ lown >48OeUcj?SP$,$B'x&US1꼆/i2 } IbnL2$4H:߸.p RZalakazam/data/Example10x.rda0000644000176200001440000020554613761510560015400 0ustar liggesusers}]UXP p Λ>I9INB&d8! ˺+MAjP *U׮+" EKޯ{ιf$yy{O}߽ozE-zP׃ϮFo=Ekz?g7zΊ~DH进舃JB9y9"NQZQBDGIKi!ZGgkRG%dtx]N*KthMk45PY'D3UUxHۋNVo]3B.\WT%`h!o]UMMS1+}Ɖ*/юE;"a"̃XRd@Fţ Xt(C,"?8 )bE-9ྀ CDDwHMfK/KpwcqC(\ J:TX%p80QxE*օ*(hZW H݅EPp #bK XP: kTa"XpB$|<+C #ϋ#$X N:$ ؔx W`oj u"P]$TV\pP ا!Nõ_gE)\|h06U8dÞ c'8fԠvW݅!bS0BbLʋƶk_$D-A\4,Zڱ:kE{'3x00ܰ#5VLʠzv!Thy $U+I0DCa.{p n3F5Ͱ WV#.S5k0{HvAJ/Bp dW D* JLDЪC 4*KҀu_p,xjJpZe D" (r,0ޅxF:Ax6{Jd1@ES c<. ߠ5nj[jN&d Vy+jxW"ys@ "(i\Сa1MޅA=&Jrl)xjsuT,؃*A-r_(UЦЇHIefm HgpMs8TLudst-cdY AcvjIS҄$@]0P 13l"Ln2S1 4R > SL,ȻcH MWř}5*bh6vAR=8vR h:6qjj+Ed.Z1@8G/u9Aĩ G j}$f֢aI3CЄb PtV4[a1' /!3VL$,T*0QᥒPN\D2!A^㖤>Rb* " bH)a~#`$Ŋ,BR1Dw1pڂ7ydA FPtA #UU5kP0+GvP~L %J !_^ϿAY\ݡMu>!LGKdNNU1Pp:Ȁwa2I'̌ه &W `FܺTR)`2jNA LR C^%RGK»+4)fxE^jiC. aD D25E]&ӊi$ CE#C;sJ2yPRR z)>9 ;U RًvQ|^ d$oR#0%T0<&'+ ROZVMb hњC&K 1jUAtIcH'b0l(O|$ 0Q00 pXJІ(JPQG]:,ZqB[@Dd+ւ[!)P4 'UB )g`퓸60̍kY`:[@0\aiKMTX u[ӀdLAIŒfIJ%@DXYXMrp1 5T1+=AQR Kl;1O*@1/Nwv4Z#I$eH L:" 7fx#kqF IV*T*\H)I$UYО`-*xA1zhi`Aw A#/0-i*AP`X?T&'eB!Ј0P|R&X:Έa0 /!6=ԉW=#'ڕ&is0TSTÞG_T0`uXH-Ua--oCHm&ц#4"GgќbQbD&8HMDhK 2N;K ŕjL{Qbv`=LEQe@BJy 3Yb16aRژ0.$& q[4 +h A@x ѰBz's8DF!TMBf9@U Cq"qr\)3I\krU|P.P0-t NDJXT΅2V  pq pR\K8m!mӭ׶1  k'.)k* -Pk*V(~Z!iN FVPZK2/AE,HKmi ղr< -*#I'U7D*ȧE>Q))bs t$1 D>F>|~%IGAqˀQdEgux ` D퇚Z=k7,*afgrxyKH7c84CbNŪIӆ;Ty}.Rہ7)Pyܡ֜S"hs0$K5ܡ_hۏ$Krh,Fg@t4?5>H:(1^|R<}d/]Bg~&[# ddtnJ:@@uc<RjXBȐ,'H0I(!qE *>#9k 05qJCؕ#W=̠l L+,Ts/%`F4FyO3cI*!\d˗l\h؈o#zlծ)2&i`BWd̩h&Q@W$w3w1 ڋu>=%eR&q ~6a'P[W҇m p0H9#HGV Vj} !7\$a~j393ɑsU`z)(vDՏ8+P< C[ĊA؎uvs^Tc0ӯ QYnB4^Hvs=ôpopڂ8us:n qsqsk%820hbU*ۑA:uqJ3Gϖ Bc)ܴگ:M~LF?Nt;J'zT4j5[Q#W9ǕR'OwHBƧ:s9E ]sNjl5YE,<&H$;G[ .H(Y ͠+Lo¦.'Zy<E9Xgј 9' ^[ 0 )A9i.%>#G7="6'?AIۡ@j@"@LkmNo ꔚ,5UswzSa_:9NUK3QXB׊`L7YUQ`]Zh Db͖(\bFo)̹51)K ps2%jFi*gbP`r>yի:«ZQ+fs?}@r mt0%1T\b\`(YwԃE@s^+gc  ~eRp9 dҒWf8ʀ 0@bA:ץ\0d)K`Vli Z+QTyFwЂCF!\P tTv^y#=6HUk ~bn#P&z"Rng8 `g5b * A'*:H4Ke#ixS6!i n+kKS)&>ibLaSY3GImT@Z$ţb -R@G]*2ȅG) ĵHdZ8!SÌ*jRvISNI˓IM,+"BQʂ8\ &BПk^\yTcbrc K.פ!Г $>6h/ab_^!960TyObjꟑRMgHQ.E ~U*HvE*d"sz| n6bD0҃ Pbm5F UB aR }QA۪:64_HVt=;'ZTؗp?vg(m򈇠GVGSfE=K֪e:mr>r>u>2 v> O^)޾љG"!i0TUaM2FKQjӋI(N vyJ8TAk% (+7pҡS8ԩ>WC2?'ZLvƧZBnp fP0"(ɺVGt9G*t0 Avuw.Eyz]֪c). Vad"X=D8%B щδ#tOȜ M 5eр @<$N|tTCͧjMfFH$sBZ-T:ŧT 2(&XHa)"-'0!U_q1Bn_`} idx^=#0 0 VPO0,jRI! GbZZ2CFoPW2N84 H&K-E+8NP#( i)2IUIy9*>]1AcTIWP)1+LEX0hZV16$tr[XV=0j7ޭ οL\X͉vAht u~Vzm3xɓ;OIreyLpDT$6»}=?LR>.rl!pѤJ3(UݶʨFy ,$$焖v!l[DBb@hw1uA#-=Q4&_Ò!?UcvZ# @@a/GI;]hS`#'ͽ~g@gA{'))kMX Iv  z IZњ p v;7y;eb*yEm5Sn-bXTO :%mQG#nYq> ce0VǜgunrC B6Q:r@5aly]Vb閫ͣ^bZp(͠0H 7Y-W{*tbGR:I1IG$+2%N9JH7>yJ'd V:͌XE \ Rٵ pp :|hIת3š(0Zk4)3VW|t6SZ+86 W:VVp"vbn\%~*%$P \B/l]RDd65ѷԬo 2I*n&}p!},RgMM+D<:^ 4WsƂDyf,ZD RπC!h"bhwHޖ]"q5gnwge${âYITqMH)-[у1GaJr&߱b8{]UW@ p/2z D+5{`Dp_g h+1~+!X[дUe$eHAayFrxP4}v)Ґ! }5|fHAh-r<8 Q/C v}ą#l-/sShNH +d)O "z#CzB+z`f4 #UP pגꍦ%ȉ-zmLDo%QqA`=&akEvnq ( %~$)t3 9nQQ/Ȯ?FI?i&00 sV[ZX( sp%(md6vWAN. [}PPonTIju m 1* B*$笹A/8gS>+F~3*ЉP?.:W\Q)d2VKC[ ֖_H*P=.V֘GsOBa |W 2abPSd*1a(_ *S"짰 V)$r2KO3KSAү~ afԂ45ƙ}Ff=w|?e*Om,I{ w@FBZ.cy`${lAV:G[I/8&,Զ7OB0 8ЪOfBW2Y@1JTQ^T)%vQ3,K]-BOfRМSJrҦ lVf:fuF4 慤ϢDE-e Hj,N.&$3!L+.Ȇ$`& Pwe) e;;#Lfʋ1A,tKpz7A*+zger/\b z{Amt6^TdUUz]RQL NSh)xOP* M8֣#zy( 3(4}jXZ#Ajֵ;?ak`  yV 9 "Pd9 D[*B`0 ;DدENh+$PlhhԠ ƽezR @ vU{+0I>vޛފLL,P&ք.'g Q>eV;ؿCXl1Ř;@ G#jWwŽ.|L*SD2)LRRV&ULS& eR +뉨LQ&-C+rQEZD6Z]D E0ۄ`q8MhjA5}V=A0A=TcЮ!1S2< F"kL(dt+R]BWN~.+/BHC Sz`êP&x=DŔ j"+7&ҚX=DKjb'\M,K`2zDT}cfnh>S0MC~(U@8"dY&BfyЬ9|Td8,+=K>r)e+:++8 H(fay%$uUY7 juU R̗y$I' QPuUBU%d\5\U\sOA } 0˃d^Hk,Ora(}_:Ҥ@(‡8.;-h)fR@ nKT%Z L 0(3Yna&0@Kd 1\uHE$K b@蕬vl8QR`[fd~q]>tNS$TԲn%(ׄ6~MInW\0#L`pZZ!)_FE(`E@%%%&*ĎxRB'jz1SasAdlN`xu{bEismD,'j涣Dےa#>-DeC6map[*Ll)YؒDW&DsVeI%@7Dy\輦΍cF{b!C$QXf^yGra=iQ,Iw,Nݹ[99%lcS˖:S;NBպ f~=i#4_0+Yz!]UB(# ]XDrQTX/dJ/`};}hy0AHnuۣQxvAfչaiu!^V>aBpI 4L ` F`V4"# W ZiB l2P%+/됋j/ e : cָ2DJQdZ1|*k4pM*LPa!BeP9'@NEYt$dAy~|4nTnTR$SQI-TJfjJ9HtH#h~> A|K\E Z(kZ$ F*mdDNS A̭B-|c:BuaJRnk4?M9VD/CokЖR>!)dTcKJ=P aWˈZQm BnC_ڶׂڼ2D*qk2qk"ϭ0CS!RƭŐ+YnM:P&nMݚ@.OKK wLm54&*N - HѯЊ9T. 0XE Ƿخ$1;KaMa.6ل} 4P @XDap` , :wDe3w oV`%H Wbr7\\$p:q(fmi-e•#$Kb\¬ A.mMV2(4up\^_&5%y сnŤ&iRtuݐfD>) KjT({4V[NN4˄$SfuLjr:쐚 JꩣB$G`D]~n3 V8!`B5u Ae%_HgMR&/ƵjcN6*Ge!_/L{v4IujKM|=vd}䦐i2a ,k\Pa>o )ErAF/Ȍio%k CqY4#dDl@aziB҃S'0TA 0L lP.7I%b*i T ρVi9|LR(TR]TTDEh7]>$ qDQ6 );j0 vIȅIP8b/nT/ uFT)w?@㗖2P$;MS)#e#2{h=G+v SxH47/ Ҥ{({LCG/X3 U~^9 TYF$eL w؎P{%*S(Ԓ*qr~DGl]&$Hd֓hξiW4 rJ!$|ܬ]U,VcMSXfG]RAK]BcͪQet W/mRE;ՃVpb.4 tT؉Y*yd-UA cUnU\VAMor'Wʭ[FͳܘզܐܒR* uN'ȎV\C-ޔ2r7 s!qRlϩ $.xvTqpЦ0  7;?XmPu"a$&(NH%]K׉LiPtzb\tI" Ex+$.HF@m:i+}9(PxJ jm|> j BTZ`4Ky9,lyfR(!)ynHvȂiKn样Iȕh4RB DbI{SYQnAT"OIZ@XF |<Oo`5 "XAiŢ!oFafs0g9׵|#(d\6.=IPY5Y p=0CN-G9YA¡+eDȡ+T 6r GX`\"FP sLʐEDW_$%e$65@Yҟ'"ҴSmghIL֖s,[qRCeMX"[B.eR! yӆc+>RP{ X10$^]MnEr5H ] +L{Y%R%8DDBsLb,9 "5b_jA43AGp di\$kyC؍m`ejۂVM`7i7].I!( nZ7C!)45D'lOÓ!pt9Z'HĥGq/UtĿ]n WT́hS¤Hh̆T}c8MAJvՉN&Mp_NM`cBMiڔT:ifv36AC# q M!>zJ ( Ci߉,1?RQSTف$L&qQb\{ā"V;pWH"+,L&ƬZ!"M5,+'Gs48oAQOH.?ZHTn#$jGǤbr859&LzpDMzޞDȜ5 9-ҙpJg3ڏå3T.q93S:S&[d =L=AKgCL̺5.QH3ŀ<)qv/,I.QRܼt{?e~gx(=U`#@څUKQt=(D o{ĵ$Sb]"n~yþ 'eNe_ O{=H{=@ZGei4Kf{\+ l ciU@`iX$Q kk8ߗ1AY JXsTK1g"( ꈼ>]3<4FiVE/.豊B?YS t !½o b>V5%Vcdꋒ"(I ,ɂc`ˬ\RWa%whIxjC5y0!m8g;5ī-КI"b9nj,Ɣ(AtL*IB icvb;}HCQ~N@$"dΝg [8(A05ϲ#  O[54f ;Yn VelAqt)g@Eg ca@$C|6P\yIP<&[20RTqmqJOp9WeY'kIY6W9Q,Zk%y&Ō:m@m=D 4$1dZ;줠iBd!X;v9$^Sa'Zj9z |vSN% ,;H*H[RH}0A@+^H,+0BP)]O%hjFKQ*AKlʹ(PehI(ҙ-W5{>jsrVTYT "$Evl&H惤2Kz (}۴*PB;0+3BBL"$8j&[!%10RB`7a3!sҲrsyl= "vTM=g:P,=JS=et:P*-(S`&2JDFL'qDesR-VFsи!>Tr>did IZRa>T> 5M5}R̄bHڮL =2S=aj[c9B4`+B,@zh5ԃ"Ã0OmQD&#$2ED$3kQM]:ta{x@w jle=G{674,ǣze/u,hx[?տ|7Y=f?u_0L<vq=\<_`4Xt2XvfL):_+艺g}EHG,fm nYwHAjX>8C=Rߍ^kZQߎ*RIr/k %(l=-mf5޴e+^GCczcJ6 ?)哋iƀحFw[ۈ1Xfq>]>}xz9}_z̀v5~8?ŒԣJ 2l gfcqfV!ߨܡJ. y8C]- د;-6^t3-Z3_\MG\6)Hy쁠t}Q@?XTC/넯@L-wBRd`~g^*JPEjk f`;(fƞ{~S#J;EI'(V ۚ# _ Ĕ`K~'eAvw^ux0zQCzӖmZ ˑGx4݈X{J Ϩ7%}o[|_E-F)a>>:ߍ=O~;g vo BW)XKhքXq>{~@R70ԈPxVԔM *?ZDJ;Ó 8I7ri lWAC{&hws(8@e3ìv%)-q?ZnEʑ;<#WbWcbi(ƔBazqOz&pխsu`G&rTդj] 3 ͍GL;}_vP?R9 ))-3Hj`@ti`z@*,U`SE*EDzε|h c3KW Yz^e=ojEa~,S&EN%dPrwU=q9?`D֖üpե_`D2 sB`-0x9'WNKPVwZHk i0R6 `ƽky2; =XK*^?_t}}EneƷs-hU hW]oI5PWU=RURCW(8UYE+GW=jGjy6먚E AUSuf_U-<~_fhfic4Z}|own?a!}Cg1Oi˽'S,gop<%J}rO <*^}Std"Ϳ>.XO?񓖬g*VF"QTͪwl5?_hi"}8\:JcvDQHj~LE_-[ˆD$=ȵ!oh'5>3~.lH h{ؐ_S )7Y/~QO4W>/^AgCߋ1=TT|,1FY1F*z =>m6wb+ c(z =HaD 9QaD"+:ܧ!CW3G$="$"u?%== 'iiX0oFe֣!<,D2G>II4ZR uB>gԐ,T&(f*DPp0]Z?yC4oMo*R3LW"G ;ۦCFX_.8gOq1{ꡤ8S«^MTj(#jj?%դtʫ^M&(@@,eQ#7a&2m&11fK61lI~zl)(ڄʮ 0rV*)T[n19ΖPU~֊@z?s@j]h}D(`c%HaI> S>%i?Mx7Y:wPo c෰6 **%=uBV'YJ"PCoD5=NwB ~ Ew:&GӀ6JFlJ/LC~1"DHEYU&RhMYosw"п :I{ST$n0<;$Nn2p?pLkqMFnLv R !nX2 m(6 U44iphE\Y%6 U`H4?UIúC\DLj+| GV,f{R3.#2!seUlR7u E]ڼL~hEi\|rGV NPMQ 7{‘^IL]ـޕ x xcB/`^.Wתo t2`)i~kTʈHkaORL5jYt+0E\\eM t `.ᙎ0(\\"$N1LQٓ)*3rqgoLwΓOw{3٠:Añ#ـ@iA̎RDXASAºB8V4-Xn#QHkt"yB4idT7 J Dt P&UX4zJ4-?EFF"9PR$bBo_lNU`”Dm4J5cueH)nphCcˎkY%\j:``i+rT-o7EIH.Kb0$4W"Ӹ椃&mA0~haҒ o1EECI1ih%mA'DNLRlEHPغ9'޶I.MlfD S$̌drffR6̌LYh=,~E%yQE6e@I;B |B`VQ$R޽ B炥 7p۶L$3]z5BeE卜X VhdUɐLFJQH%%+Hۼ`j}]:KJʘtLY}\B+8F?:n2hTh.L.a͡=DvdtCV(-Y赩由x4J*/Q"1{IU^(m"}q([ J(0bBV z(L%z#U|IZ)B&V&O)G1`g (2T dܐD m!0dA}!Z2 锬yO5A)Eac"X&$DBjVrb78(-Y3) Ed BW].Jd ( nsv*Q)ЅdFVI=TN_;pc4DF0^86R 5Q7R(%3 Oz) 4mMwRrT4 UӪ.m՞.mA!~66v2=.) [9EF;&Rvi$JF;hVQrJȔh, lǶN] b6deCREtvuS$G{Blk{, @+b#L{/Y}tUL/04~ %ztGFNaV[+#Ӡ{ȁ4E΃S᭚U^]J,R¼0ʬ¼|X+uu{.C!ZR))@f$!g-OUbu]=z &WtG1jyɃhe8!M.+r%C3=D@Z@]̒ԡN XRHivh`/%Pt#ZQk" 'jD薁T[L lXkWAat"{LCk6P뭭+@4k(@SM:@tY R{4 MYb~W1$0j;"dﴳǖX oWaQ-&cEƆ-`Ô UZUi,p仔=iaa㚒qD~):7ס=Ҹ_BDXO0Fju綅NsiR ]b  b#Nl&TʬNb &u,B|KA[(g) ,Ex"TRc):RtR.C :3AD8c?[]юRQ80adUAbYW4&g> /1HneNh*v4=[+HBFN11fi L$I՚MF0l/I|vy Y6Bq60%H(z.5 e~ Md~F>l'x xM U4I/]E&k#( RF蜀M" D:cTqUB*}%YCL$ܘ\dSt lJ5[tQAThmԨhҒBF׃\&' ZE(Sniw8rSTH:`H9|bn 8'B{v.n;+ᰙ4xNUD;ؽ뤇2@Eeru;Hو"Gު^IRBv\F#0J(Y.bPWV|osQ0 9/"GTgzR$ED42zn(\x-0č7"˦0UU /651T,bZ|Qn(l6^kޛ Q 2JBSA!*E3h6 ѩ),>ibvn+Ԑ HFd0*/HFdJFNKFsjN {^D,[D]4< tQv$-11g&B3n9ptA0K%0ˍ\Xv~iqҜ.N! tB"BUNQa #TLaD4 3[š89X&Ry`)S 4Z4 (S~(!l]!ě1f-T"M5x ^Mʾ1g1uj }Mk+:YnR4lb0 V)A=?-k bݝi'T~֜r r f *(|Eve2"]vS$ Y/w!fW6ѨQw]'K^$jm ɬH` *R`:;!Lj'@ L+qAIP%ByQ(PFJ Y cހPt"; ~P#BjwQ'7qҹǩ_ڜw1]^ dy&p7̈́nN9yTl(X*Xra@ƴͅ-M^̰V3D9 D8 2tt+i `˸G# GĊl,AVۄ8!\+qŸ9W! qڄrqm.m>Di*;@]gBQַ]I@6ݢ+L9C1XD%A^.٢K[@GNۥ* kH+yf C;rT}O 쭲N5CH,twƢ9#^g}>R`C QiD٤Uca#a$H*tr;RσWA Xn6$o]"O6_E' 5F,xª<%)$vYϥ3I8Gw#pA<-KĈ2Ԗ BHnRGVN\oK~)p}R%RgRKBZI#t ~TꭔoA$@:7̾ U.ߐ/GW>kjj_"ġ(Epa)nNY*\{l9蜻ap*xsT A~ %]ePFiZiKU`f=yf&u:%bC1?E")*)P%T!l)7%TQ!hC0BjWA]"I"|<3X{9]ID ӵD`|RHTݝQ5b`FVjer'\p0c P"휄q3䩤1+C"p$W0e"qƾo\ !%DmIDJ,`T82L:u i|k5G>c2g8ǀ1CT ߊd؇tLC?Y!D sʒ!:ʒjgTC-^!F"-%Oᐢ ,7zlUQPQIPt),zaxjB4C\:,'Y]4;+$oI9SGSIR%Ѧfm"c@-K\\rA^-Ae UAh*蕡4>0d2HZ$Q3HeB `/G_se,F,doHu. !Y¶*[DA+ S?W" &44ċ"f܅4)V %IivsVF$KS[4=̚` D7t~ݾD#  uB4lԿcHMXn#=▁_?[ur@NˈM62SW.Df"S,t 369SRer3J +ȅYUi@vQ'o"JTf.YTŜ)@g)4V8KY TҒrL@W_^lQlD.i%Ӫp@ڠaQ kS a0hX0$VW#t:FtJ+͔V$!_ ˄@`ǣa+F MQł BOjs*尥.NS5IZ"MkU*Dtneq׸kD$iY!\\ .!?=( ɷW *T*y}!{ Ėu$1y9;%溙<_偪9*vsYV'y-ʪU9\:a7 U>ɋ\iEU.ՙR#:5bk,R1 dFs?VEB% I*][PB' .*0|EX cDsYr 88%2]@@TˋZDw f}W0Х}廴]&\22j*oQfhI6h6(hW(D-6F4;캵[ArSedK'(رCԭ=%; "%CqZN aqZqZVi Rtάע"C OT0xddu\TΣ|[c6dH>՟#Bfl85+0@W\XIkIC$TeP4iH+DctV;J0bME#2iiZ @dquQX,K0+3;YL! I(&W rj*tKEb!~*KbqmAր\SQ:;:utqs3mNC|ۺ^0oh _5A^L#s]#ɄXld}~ǜQڢ9+w B"m.\ Գ$e,ZÆ`g]?Qco5 ?l0`cAfSxѼ>,l0K㥑tr`%m6Xd۞ ?pq\/Q@;m'd/&0X,PBn^Wս}ª.G ( qKID@J'%i3qnK,Yy ,-o$%I-Qܖ3uV+ +H4Kr(GԿ""%*3w 2@P QV oŠ+(i;1 )Jŝ0L0ϯNn*E06J;7K8o""ۥ wRo lwt񘾫2 )$~Agq].}'FX Eqͽɼ ɘ+&jWu(f!WØYQ@bPaSBpĜ6 aY3yX 5;ًaH`a3i@"ݩH;6ZghP8q# RJJzvLX\+qlI86I9Bc'*ąze- fzϘġASgԆOܘz])En ג3(I%n# @/vi;. 4xF:JS 6o ayjZ0K\VBb fH`y@)Gݴt<IGQl24+(cUY e]bCJ%2",TIBO=?^BYH;Gc R[ ̹$C~fXHU\ѡK6f"L,Dm1ъ-V`fHzd[mُ [\HoAfI1~[nRMj&cGWD%2&ԓ?Fc!6Y!T3Ɏ2깲&1>&11r&r&Ka"KY\jɢS\S*񭜒su ږFK @1o܉1'ԁ&Kfj.bv1rNR9@vO-\z sՅxKiHMKHAS-J$! {QF)ߒevg~ EDQdhpdfiPb4J'_e^ޅZdBx\.N i<-z,}'pL6ZO"vx MfF=Ӱᓶ$&k%WF)T.VepdL&$#;.b#ǮqW]b&ݣTuv G&U^id LG^\51'&E7ޕHyA;#yǝI?Ýd"ӝ4 Z^S4{!?錤DXASA]Ft05-<47"ЉAO`P7  "{g'#[~!4:%c2e?p>j:vUUAUZFvOѻb9%t̪%Kd.'Wl"t5-6S+geNy龠|SBhsIuc@vXzbά0z±,dqW?Ƌ HȔ 2I] d/WFaFxA2^SH`:p\\DAŅc ފB2:mIjL!1ĝ2Z:L5f@1ZOh D6iNP;euA4Oc3~T@ 2;ycڥy,auo[tLÎ5ӫz25E%a7Xc&MI,R^(+7w*/aJ=Ou'T_XϻASIO`EV;(2Tv2!Ld,2DkCinh"ZSjG$ j*A5WkvV"Kpnuk6grn[F knš@zy9@+O( $BjG"0!S+a( h -h3U{u"UWʅm 5Alt$D I5j +@W!0GJhOm:<2x p 8Y}tUL/0vb%"o-&EN֤w¼@U&?:--!,_ջ׿.%K)(s+JKDJ-DDhֵ JDjvW+;u\QTIiQ%Dd'$1 #P4)㺰OLiwn*#ﴳǖH0!vG8L6Rء%bBcI&ˊ5:| `Nvs0Џx :Vl[Ί5Yv,R6@J 0p aȪ~]Q14łȬ+T+_lԻ:Toy ŏt"R7HBFN11fi L$I՚-Wwauu4Ũlvգ%X6!6vF7Ryo~-#L/G*vQ ,s6\6xj.J|}%YsơA0VN)س(ix@EFPKH*w ;I::I>h/ÍpKCR תU6"AǵjNs^!]菎®cW`: ]@K=U8NK+:.Ebpe*^g wPpݮQ(EJ#&`jKd? @6krCgaQl&:/q7$='SNcbfSvd8 wA0Qv"LYDSeu;vzʔs]VXrcJCpQCΆrLcnZGO)O&BJ$}>|vk= "e15D-"):?c:sjHK u){۷N3 H 9Cy#RP,z.-5&*mKW $FьdD s<>8*.ެ)ol0arpOcT:Ȝ?8@:']R; HXDd/uuarrެ_jmA9UoeANw BAX$:w蹙7Y5Y*;̺,ϬCPVu`Ms*)P%T!l)7FT Kd X;IDi\:̦:rs 2sӵ=M"lA>n8Cw'bTPͷIpP0;'6T琴e% l[γJJ4.D9!roG3)Ub}դ])4幘ܖ_[^k$r](>)uoت A gC&zPY4nVgk&;hj|i:\dPJ_c2eTP#g)["R%A+] 闾tD֬twR\}3(;phL8[_ؑHakL %IivsVRod"x&Z%lǛtb:n_Yh|Eǐ2$?o[Z+N.2ɈM62KI},2g$< r\), k:56 =z^D'ﯗ'i$jY6Y̪a6/S U̡kavJNhwJ+͔V\+3¬t뭝Ul'Si.Nd5k4L6VKLOl.CbJ )"(XJZ`k:! gZ,XaKOh41k$>1-Q.YԠDF\ 2G[OJtMei#JoDF" \a?xr*{8˓ NBNÉO7 m:1!5]R/Iy K"m.wڦ(D;2n$a AJ!H#he"آ%>a#>)ɍ\]-3{$,1IT|̢3u RK+pe>²|lƒQ d@4c?j7zLŃA 퍕G` f)>{!>Ka(4?Î-aAbtт^ԧ '6qĴ=} cZΈl+EBD'$CX€,7|WxOtMzf+(is-B(748Q$7SDWI PdEGYNС·ȌڡKj a ar` ,ӡ2U՜$xenԑ -Mh3HG V[SX<s7xNJފ G:8Ж!Nd3i2yD'i7$Fy<C0GGa DAؔ$WnC=2 :ѩ#El`6 9# -'40X?{Rط&_CG|) -L$Ole)q̀(0Ŗ4B.n&9)(KJY]#f.»:1E@Y" mH)@`gȍBSdq~~@#Xz0IOrq;hqc@h'$Ϝ<-`cJBҩ>[WA NCz l D,hNg̱eVI ~n`| Bd2Hx|NIEMPqY@DreF7FTf!@멞&dp*h" 5Yk*mgMܫ&kP^ JT`) 911%M*&a nɶD:Jr`5ţ6 LäM` h@vepaŘR-vFKklMY2 r0Lr`7)R>P`]84g(XL~MN-IZ7`^&oE("dؐPGҬfl5ʤ|QM VP4@7o`-  i;0)O.F\iYNMZhf%6A^)mȸJyȭi1 55%|mPt%a@Œd 䦐:> .aBN.k9⏓ w]aj:EW([Qv\ʻmIJ*!zQGu8<M8easN2n23yp JiDRnHfq?Je,im(Dj\*Hb3#,HFW*!9-ů>dS&Xe lqtvLd!i Ss[T4m,"q2/qH ,{IA"g e3W"@2W"垴hJsqZ9q,@R =dNE|! WcQ;ǮPOV1hliafIQ"jFE4`Wa.<=+޹F0 vPC*Ier( q4:2XrjOb-Ӧ/#3c6LDh]eI |~"'`IT'qG~RiADF<$$ښ{,qbft&V{͔֒{U\b9Fs_uf/v!X뤣<V @c]f6 q֭[զ-գVΨko5uú Gow3֍o.Tbf 7gֵbb_ٙIy|\ߐ|)f̆Io*z4;15n|̤SSjfjZΛ@fŃnيKg f}yzm4 ^mݺY>'ى nE8>ujBlٲ 6XMFY;aubVDCxOݼy˄r ;=51=ڬsZ=%Ą;T4ek)7$Dž,7MG˘L6~װGi1gg:nvlH +q5.&nqWVlV ޚ!,֭8=>3;)RNםbf*VU#:'bӍg딞.Yغ92 ̖1.;7cipPިLhZ2D׮m̐m>޸nԔgIrbÌR}a3bԬ!EY׊Q#H%hz >(pj6'2 j?1vfjԸ>k7{\q|)ONGo sz|mgubºf$'jT-jr&Xcgݚ{GGmټybfJ۞x(L̊)5IڢaGv-8xZxnz*V7NvQ#H4I=3;'F"m57~fZL(_X"vWvDX<9~H%#0."smM]I<:8:6"2L[bG՚(vOnz*^'"N_]匒㒛3Y-YīU(oU)/fC쓽]mvlgmDfM;~Ԇ)S26352qk7LoU Ʀ#astD:D7D0v2Wul#FNn^ L:BɬKLlPTUbK{fwǧ RbX rY}=3qFJtޑ}@_i' W7p@_i?;L^1<'>|4'GSh^8 6zy0 {oݗᙾo#־#Cf `aGhd>}~w.XF=A~o\z/ۈ'_{WÍL_/HbvcӷzNXJ >hIoiQq< w#FǃXY<^sqF. яCXJj6FLg.0D2563W.>7L/;ToR$:B'>eN g 6W=ѶA[d)#Y궲[!Vcz Xr?1YH/L? \ő ;Ai$YkXx2!w(pƋDB_IQlah>%sK{lG@B:VϪ1l0!?҂e;4~?21Q=}@c؞2>6kNY[^ &x K[oߠ=UTjUb08 cw54zgAM'&oFhH FxmQq|aO҃F{ϖix0| 8d`+[R@ +lF\5:'~a@5lbOc]ӳgvn6XüD6Q]Qy7}Zp28A u v׶?1|p}?dF0A\7Z`gOC,yt{ݵÖ+D8 ES*qa E2>f!B]\7`s31se|}xir#tHîh83 ~XL\98nrx`Ö!tNC1r[ÃCfkiV+ 8 #M@PlC#,'J`ȠCxo4aa0~k,INn?E@oQ92dV{861C|ö.Mb l 9!g;w F1a6cϘkҡve I۹~ނX>UhXVZN$a2f~4$LH!f0%hPB(ϛ KʳG #'U$e{q4wCNcgdfp2FV>;h]4Dinj}Oo6k{G}xr}q LsOƏepҍ载ز5N'#E*O'9.-6q1kmhF,['L3}Z̒6Mo-ox Pj(^AKjĺ۰6nĶ=ZJwÓ}6ݝ27Dh2@=D{#곦1$0 1-`Q i0ˆ۰fֈ'b 2 d cbh\IzX'\-%%rp"DDtŨQ([pvRgE!kG#+Y}Q$l :!Oj:[!Dn~زؽpكrp?C#-U1i*,q u>^l#9{QGG h!/}&?v2npİ7\thE/|hrȕhOc6߰=`;ŞH 2a76Î^"P׶;v K,W{>璱'FGc?9` Z?o$rG^8Z;6A,}QJ vю}Mi :f*rX,$Jl ܐjXk\+Iip.#pUlġ֒Fۈ3 *iXE&a^N:hF[,` &M`$E rcc85`m`vG) \b/倅G"qyMkqP*i E{o!Ebe οhdboz\֊e76C`㰞W !> MC_ slh"s#SzMO`-sH-nxߖU1`0d<&`у1﷮L]eҽf6b0%0a|t,ȾI0{b؊mtcȫ% &ƨae n..nĪge}Cʯ6"kĻ24.FZja`-Ċٗ<׀wbd *th; ao#'ꂥ k;Fej7`-|`o8I*q'"0`1pT =O {Dܕh jQpح1:hi< ~rz mmcL}pqO}K{ݸަ߹Hb{&jm]_q{ 4<5#N^X@;cx!d<, ?G$mqB88~x&+bpejxnS/Lb13:VEBFu5nYW6Lty9+g,E729`]`j;iYZ8F l GLrA?μ3m,Eu=Nm7^$ ڂܧYc?dbmͷ:},|xD,$m99gz }@o$e{lsH$[cbuSOj1hp<}#CIߧ-;doÉ@t>Xoư3# 7k离dq8 W:۷@[=Şvrn:6[$c8bfàӇT\PTh G.Qx a& emqL2'fPrv:8y^W( 0ky,p.7 8!O:uڠwgΟ?;6gFݴfb[WϚku _.'ms_8IzOZs>~6u?1]u;_zם}a{}e9 '_uk2߼]''y=;_όw?O_:8|,=aßǾk_^,WYgً|}_}fw5Y绪=/KY)ソ_>};|yus_x/'~wq\8>_Bu99^w=7?=c{={oe|<_o?z]}ϟwk/y7u<{zx><K ^:WNW<ü}yz__'g}zX4_~??cKu~n>d=>;ۿ5<>m?{|ؿ-vg9?㭇;͑y统_|_uw{7Ko;qΗ燻k*z>k>P*q=|*|ow<_[_xDZd_zS<Gv?/%K:<.ho_YgkOqWq'܈'nק{'3O[J?^]Fok'xuA}:.7y<;y{w]Ͻ}+q_y_>Ϡu<}<[Wq'[gyxyϼlz=u{<9t} O?8Fw޼|Wzt˛{.3:xNh>'{7Now?_c=f4i< nN>,5|?%O탏;֫쭟s<>3<}.o\z}q}{8.C{ lZt9=z}b:Fz?Eǿd<'yy4wt9<>ϏOC8;?{ ǝE:[׻/X͟u6s{=3m}5rx]ۮt?Fs=,Z'Ytۼ8Ѹ/Yw^??;ȕ:{^)f)|mf;?y=f_|<[s ͝,':_?}~:hgrgqe{1r7vG=VwfOr{&͟\g;Nu:p. >yv^;]3M;~f\ʂqnuߛﷇk=/>c>{-w{k׿;{_jƽ57zWz2ԣL3|~j=gUt럱$,ʒsJi|/ivM^Lc>S>g^97q<3E+$|e\]_<.z^ޝh&/^?^ v'͇p^y1ϗy-L~ǟ׽])xO>u~}=>̾qc>?7y;{~5|~;s]{3ox _ q{?^Χqa^|:{W>j^oFx>7y}{wDZ /G=޳~lfh~^n'i8.?Eףچۆi\qW =QZh{;4O'F=z.xy+1.3ϗ,&q]8\oƹ}8j殇3ڛˋyx߼y\Iy4i=>wO4/w]us9ιt=#yky_L\r\qA|^}nϿ>_7q1Z4tSwu.>Hjꏋ=ߍ>|AM\W0mV.WOqxq]? ׇXύ>nu?7_^_ȼ~Ms߷uy>G3[~+>52= |O{^j]x{wy_{}}Y}%5ׯ_ow_/xq<߿ܕ1_/~N7dy'#/qR~xgwoO~.|>.~_7Kx]~}<'. +hs~}c|ߛo)᭷܌r>u7ַxq~fyxcx=3uy#y>/Vw=ޫ/_>g x<_,>,G.Ox>Y~4.#m _Ou۝j5JǟG{8x?_g3ggiަ}?zx@boYF뺒^sO y ץ̾uwf=|>g~|5}=tϟ|}>͋|7ϼ0t=#ov=B:#!+_=YLǝ}]/ۥ ͋xYY_uyzuYONͼh]f:K~yxofilfkqXO/ݙc=]3:9q84o#'~Dס_Ηzcƿbe{66w =2vFzb csg&/_zg]q>?|;xy 9.xgy7y%zSs?u}w<||ۗkV= c^)l~z^_ǛσwyC{):>|auՍ2R)>_/]vy};K{y2=:Y9_c~˗c>?{]qRϲ:`\x}ίs%g{u˾>umՎ+.~[^/KnyYhyj>Tìfͷp2ZgշPvET7"u<}:Y-y,w'/3Or7}KsZ9? |9z5j7 |cNf6=]H闿)tܭ}ޝo0+1"z5wHJo4΋i=kgL"w9[kkoS5Sz]~+7S?i|w?e;mӾC'oy[k{Ǿ?Һ OxΝy۷>qWǾfS߳'M_7?=u?ͷ!9M|>X/;9V=oZ}ow%_m'872!{^Ɵ~E;c՛W~iy[3 w{g6./\}-/ng{A'{[ˎỹW([/vٷ~o<y|D/{o'޽ߺZE{~';~W}f^l yr5gMyn~?އZ^|Ήa}/mxp|\u?+{WVRײcNX}~ؿ.)ԗ{7n=;M[.o]֋xϩuj>uQ\ 7,{mݿp{-O8w]yI{NQ_;[}ک~'??yܒ ^uw\~~g}|~UZԷ#{_>>uaz~﷏偟zYߺ/#qKo>Ջ|Sm+_?g/>}!:[/ao]v{G~cq}f߾g_G^rf[Oy[av{;3G\;poWpƿ~ro>k;#}{^wC{W>[o??7pޥG\{듯}.|%=+x7}O?ێJgo~]4إ~t}ӏt=B#ˡw_3ƃ_N^YwOΎ}}ݧ򷙧/;jϥK'XoyOۺtGL}t?c1<O|=W#ڻEW_|OwWrȗoXtJ5c7W?zs~\8'vzGE/rߥϔ:3GA3>wGO[F~o_uo})zn>'\sa|̯gwS3~w_k?/G|o8_9o{SNm<⨿n~v9c}Ǟs >k|s{ݯ{ҟ{C{9o{~/=h٧.=7]>=/5} O{-{O~UG􀩟_wt?>h9G\GY}o_O޽-w_cOx |ݟ-_ջ{)^󟧽{C{?tYO{W}n.zad+~yOXv#|^羯ޗ__иO>Q^'v[/7t}+}=_>C;kncׇ_}/8G,;ǿ~?v5/6t䥍?pU_=p%%#_ǽKߥ^}ۅ_}ϋ~wi w;_ȇwSN_;^-.5|x##>w~7]zѣO}bn޲\}/q ˳{#nizdwwGtoב[?=!ߢ߽ʟ|'ǿ^w~Cⲣo}[p/]KMGǜK^qZz+ٟ~Ƨ}knyy8.9?o[3V|] ƚ#Oku%}a+?5C7|ռ;Շ߯qxʘ]oyy<?_w:Mu<~|y><.ˉ9Kygxg58σ1.7yuO~</7>;׾?񌟜}*<ջOS; k=O>aM~q/}Ooy~_8'ݾ|N/;oתuӓ߽aީ/|1{o}v7W_th)_Onzܷs{Q}})z-wszpLL]~&~Gq'=c7~޿zS.⛾kﳮ7]z‘\VknUzw[1n>7KV==oZ??V1~Zy{./oc<^=޲ۉ|ު;/?U_!gfo^f~~t?R~L~z9qGx+^oyO{>W~S{ ׏x//s[U_k0US'~'gC<`##-~g~񐿮_oc7W~_ZF>/?ӫ?K_bOV?gi_#w֗,ZyYſx2y?^3*N}yq>]rv>nϽnϳ^/_n+e}X}78:[/=hͩd9$w=m7|c߹isCzɚuC{ҋUGȧNSno^>FU{!{Cy5"9:>:y>6mϷuYW歧V/y:_uͻ/^OtI(5鼷_s̟n->ᯜоN:W?涿\1|Uwݽn`q ɕ|Σ?7q}料kMݏ=|z<疣!Z?[_=U{7z1voX}G\0Ef?Wz>9kͩדYVrU}^^>z9g{Ƨ\ϘKGz߇.8dAo܉8_~Կ/qdZe ׹OUS^_oy|x=y|^=^_<+y|c9+7ν>.wwb~}9{7fIΗߛuxzF~?x.W.<_y?x7Oq}_uodob{?Yrb;5gמ+'ϯ>Ѻy׌<';y <|y*[x›[}~/J}_=t'ymVݓx!E/|e5m~kӟӺ=u'e_cee=_y՗R+nG&)C.Eh8ĭ׋ p?_ߋuַ'lJ+;޷óכaJEqa~/\N:p}+ǖ?G}+R[rՊ >s=_飏ܲԗ|r~_~7n^=z*7z?A~w􃧟Ϳ}ėc52:fe_m8U}_ݚ?z=Onwꢟ|/j|AS#c{1}8f>5Ƚ'cpO8+x }߿{ic_G{;?ge>?b=_j>#>7%kFu=g<1u׋5k5ϣvn{E/zƃ?7-W,Yllɯ{+/'Cri_}W.c'·>=z qXqe˞b{Ӟ34z>k n}_Zy޷엋/?yE;wOMr̚ל{׾=b:.cT֧{zny?^|ٱ}k.OyF޾?>}nݷ2g}h8axƶ{{{xO~W}!dlI{gdo#V^쿯8-+3aztݾF~,]q?qݟFUoݿ~wߝug;8/Cs43z{x׻Gу]Ca}~m>쩱}w{>3\课O|[}gcg.١eblϟ }όn㴗ŧo>1<_}+|dokY6:]3''rFOǯz%O:Gdg]+>zE__8tĹ߷ܯg+|__?z+g.]U'EO|෍wZG +?|ht±?SC|[|~c߻}]cx͏i1"tCjl?oS_V<t'N|}<noOD v>{ٿغ<䙇>VNޫ:=/ϱĕoy~O+z3uK^[^􆩡^=z/]љϼp:yO7|+?-;r m׾=c{^g\5Z0;U*q:4WEW־d_%~*ʕ"5WM a\Uh:L&>W _7!x; Kف KKmY_<>bUY¹V \+\k̓cʹ؁`[V\EssmY*S̵%YD<: 5*UeU͛kE}j],* t:ivǭT) *fgZbu%I\&dtu0s]} akVV,2׹.!ii_u_U?6ZUv3FnUʶDk4K M~Ul-+0~9VKw)0*ӊj=?>ykx9j ^;_u TZҝ̟+RsUcضƂ rVe/giGCEq=JWR(\\c˷j`9l6(@557q6C+kVX0uWKZܾfZAu@g{h̎us\w9Yyx~!>+-m\Zsڪ\&ۈҌ?6TrU2cik/|ku  #U36 \(ԧgɰwu6ڮ99Ô՞}l¿yVk%+23WU5 n!hyfd,hL`c¹G-ƄsZ5(lVyw@xYk3ylKQ\K>K,>zS 'm`yè)unLu3NQ¶J/^U:έ'T-}m1p'K&fR 8S= dNN *aRp<J~ PA%p0 0*Q>(Y*oTiFB֪BkZJ*A+?UYkeJzV<*iTx@_M2M2, G;*G8E* 3gJ(oSTMџaţڣ UA¨bߕÙTWy7\k%}]7U"uj+NMgWLhЂv;PԑEap\|6jϯ q~\zρc" $.3Y&oŸ#^A7qpeV‰ `p{ $Z+rp!Y+W*wXݏ7D7k"r\㶃Id,Ò`:iWGlkgD rt%RQmCƽc+@I!~EϏv0| p XVK.pC\d\' B C K(Kwujus^nuڎ8dlS3NF{NFNԶgI'^}=ܮ)`HUͅTϽӸtpr$4nPv]W*\a Vxej75+ 55B7]XYΖ9eo +%0nG '+b83(XYd @iV,mڮmv1F$ VJg2ץosZ2˷  4)0ݕdCjir@:vBM&ʓ"K[@e]Z=q2.eUu2 ٨K-'3RuhuoW&J<\+oWR7Kpe^";!I/zK+*R+Q|;|$UӸЙMl~#F5+TaAH-gjs(fKz.]4HLi(R5)nO):KuY3uࣦsv= ֩ ۵aS]YEgv]XbBBS%FIX4"]\J 9wp- t ' 6M5tQ%cE*!Re-6k{ZQT^A^ Q̽pYgMD.t%lrZ9s"˴a&?Uf8yG\$a.tik9~)V*JBӉ .s)3"} loY$ ڞ^U+0m4j,m0x;Cj3!V.hjb&t dvUmp hpKp2Vim  Raʖ9݊9CDMm׸r1=e mAٯy W[eȢĶj9\F"mjZWX!V[bz&ڙ.Hb8aʘ{33D s* ̓URZ*5fan*&WP mߎzmS0>PaQj@UH>R&GV\ꦦY9K_B lu蕅i@n ]B;݂mj.ٺ7ZL\Z#ps-bUZ^A2*st9. c9~GKZw5n/d)l SuW dA2K=Zr=;,w®|)֩lfЇBe[]܂p;& vs;4Pk8MjO;f;}^[Y{<-w+nhh m 96U {ا`:RsA]ڛJ buoO`cuBfay!2|ݴu;_C2>p{l>&!$ g4$2+~V 喧Uڵ5ݰ{&=S PyL*co}8vQyfO:[DN:9J >pt}@./K\;)V֠(}R~'Wc6×[TM\ŧz0\j@(}l)?V-bi}GUhm>SX.V݌ ;*kV*>ɂnnWWQŵe\n(1_EHX'©UnpPt[e nE\d1V*׫w2V%os{k<+NJ̸*䣀/6wEWy[o*[^-{b1 cPϪM}T5zwo5c­ZX9KUKTh< BU%A$}h5Wʝ*J6_{V\L!cUs}k@MdoK͡ hˬm 3U߹4/?SAid!;N뺬ٴ?nȊx$)o! *cwB`+X֐qy݁$+3o֮Cq NjD*Te}a3/q0):+:~=UʊtӪ#nӼ\udQC'KqUw+NF\0`r %aQЅ|KaD_KS.^ ⎈}$,s O`<Do$곇7b靐ε6iZ"u-8*0bJX0{)PX*X4V}C=_;]EB#:RR=XFP:GG,El[yxQ$ ڷ}y-$Ğ:)?b|GIMk1mxֵ$іP@ʍl;m~g$WWYzo4_fČYb͡< Q ?oɵZWQRs#1:=–,gz>1SޮR"50%mO`. 햢x 6gcZɨP}3|Q%Uś|oR>Z =\m,Yxkj ط\(W%^gI;i]fe{$Zb:Vyf!܈c 9CUL:/tK(J)[SЙ:PYo"Ւ*ڽ{-_G [sŹ IQ,l ʥwP\oC" KhNY&~ei["Nc ?@OLEx>SWS` ;)л7U12e$0 !\V`4OV(5-ki$ kMk)ITz߭Ï [Yúqqg˅ dG sŠE$g ' @Yjb5O\Y[&\ӎ`p/o-XDՉu_kj& =?e8]ÿX3yRi6_K>K_6?5a-yL2 ͣ hoaaw*g$F^:S*)/6DOB&;v|$d,$PLnm:Fڰ)>o9m!;cG:ЌgҁwVS/(5-1ȍi{e49vLP}8ۻn@!Ԃ_d(Es=rD~pa#F50ٝWM4A$&q.0 }.gP'P"e ãIQ+,9d#X#XN^I]1 x_CH7d18eEGzOD[VFp9E}x;.I 5 f&EؠC"EK?oݖgI}"̑w%3G<V)UP̈́Qҽı /(4HbLGҦ@$Uh<) ;mVKkQh0Z+g&{10Af*Q2BH_aR^J:%zc,XkAG(,dʑ@ dMNDm۴*Aru7'e MQ$O ȼ@p+ZJGa);2t;Ւ:w([xyRЕIyJ *NJ&$L7yô]>qdu WUX}@.II4\kSLZU``ȯX 26o$sR%,N"*KI- >W5k\ l'&,9V=ؖxa DwBLv`Jz@g)t8N(]$MƔ*=&!"j4" 6 $}Ga"8X!7P[d jF&M]e;\4!IM9x!mr-x c MX_9@hQA20CbN|g Sy!BbbQ|qb`޾;uL;_]\6a6>TY%*P)#hx%$ $,~D/K{3ӧg%@5XM/e 9MH릴>s M󝄬)mYC@%k+70;۷*]g= Wdh}tb gshs4z@!Fwݚ9\*؃W_X|]kTP5~hPw+^HnQxҸIG;8 k]R&"&¡dxi rG| -5$~6AstR0؍*!qAE D`k6:=lP/S6HdɄH!m).TroE N)i5>yJHTW&eP;kTP y"]C" ]ӒƩs,nPG|i ͎ۖU@9>t݇ %8(+i^sl. 7sjL_Mntin,WmaWLZ0rfɦ T_w/eL:E/f )275fplRf*:6A @pWIw{TO~8cUMb@Y@2Ak? ;x;ޕ@r!sh̝z>5O4EK*%(gH:)WaTۏt͝A]C@kGО ]`]¶ [wM7(.$}vn8'\.lIBd'x~ƉZѷˏǬگz,RHm}{ile2ޑX(L~Ÿ?Z8 d?R CUiwJ=|%]QpޥS`! {2H!szfϥ|u5E;/.`fU j2!sB)D[{m[C&? #|H܉zJ1*جBV {?6J-! 2]`].+L_ ЉL;ckeIQOfi׸EN؁/M5X!]#ӉG-9M~*L+V">6 dυ= ޽*56xg6R6|b(5$(jaZBHm:Q}ff8dtl0&%VKL)C`9^>*Pa892OQ\9ywv!D@Vκ$s[ &mg楡?u 9 ZHUxZxvxv?,:~E2>Y(#h5-a|h:]~.ST-< Bx`|ȱ4֩Ij* "gKR -<!=UC-1fnv>]X7~_kRTt9?G¼ 1 %Pkn1=TBqAR!X<': > 9#c3ȌZt<}b1Qb& $RP+:R-]Xf{j98WAEq}Xؓغ81{ )SMb.Lf0`иH=z/sPS`i>6@y\Va FဇC@cld{u/_?g|+ES!$;m$&\˄ޒҴpAȕj|T!.Swlhl0} <_p}-5j޺+'L p&`CY,j9X=/v ]1T{+po]Db_H_z&-Y݀jZk׼:gIPC7B꾵ԝ܅ Htyǡ@ŷC=Mhxu:Czq'O9a7@@{z\'}/B?!"w:W߂DxB817^&~f{x1>B<}M/-7OO3HC{~q^׿}? 'Aaa\#W:nG= CwAB{~h߇p>>~w qkh~?箲zo`]_Gqz> -'p}/?;?B{c=/|׷C>|'O1e(~s A}%7q]}K~{;W@%>}{G_܋#p_;㢾%›}~loM.AK޿k>۟v۱F^E/kzخ{R!]x'8ՇpN+ۼ~}g [/уzU~zo/ouaKtӸ4!ow-u4ÅyFl ħ4A=pK\E㭧-m7kGt8mf k5M+3޿@QSjyAu8 N>_zvَ_w7O5 w4/7%mەOmacΒ:{_?~E{h#|qp겲n`1_䣯RW6Z['%gg-+gX͆} zzXmr0WDLV{]/Wp|3֖3Z@۵7Fr ϳ<;?0QFd΍:[yGJ M7,ute5>4>IՅF߷Sb0 AގnhV|ƃ.l5\6jg kk-q? |&e~/M4\Z1f E͢/eFfs }y}.r'~ 5CbiYdlb ʁv7&vh^Jy+yw 8p:kՕ雭/4t}o~f@3/mfWM Ͻ m6^lZ/Gή/ak^v'^[]`>Vtnu\B32_9m~#lv/Z;bgj7#:/ZvE$xӶ5,L<֑ ~mce;~s ltY3{# g{k5r<8$ TkoSXa8d=[R*Ppjx_],:,5 Dw#[ea.+J3O-L)rsX1ఆLώn.B(::2 խm*WC([Uh/w!(t3tz-[PU0nH!3qĴqDBs AT.G`n@+,qKO^ni,9:ɨ\#4Xh(W8N"?z[Q4ɢazF1o3z6241mJm5NG0 b[Y&^nڞL,j{ؗ8ʷTJȪRkҸ:1(5ʘ0HcOF~.Rx5>RεZ0n/ÒHyԁM#TT,o-"`()4ډ(]:Pܸ\oB04M)_ed$I<q6XxE9̕&35}jjfX(]ܘCsg ٽmmW a9{˘“K> ;q"9*Љѫ8OzlQt,ќ7Z~{)ۆUm bKr.QkƓE4 (Aja޶X[) 8v `um6ĸDŠO\g묗td0ye(OQN:p#wRh&U2 ҽ@d_Hyy\ {qt*3pHm,ΊЀ8a)] 3َ{x~nVZ  ' &q VczcW[- VGm#>-$.B@qoلkTV"b]ٲ83jlQ2Y60|S%*є)WP%:T3SD?` Uϸ̲*J ۚXb(L!F_c.=Oʶ 陧OPS v*<#P(DK9~ƋRljQf vn$U/) .`DMh3P0͋.)=/"emRj?aXMqn(N>`ﱬG+y\uCޅJ)1Hyv% p[=t>M蓦0X/ä(7 UY[>1U)Vp(F'G##S/$ܬ!w+Hm,o21*Petў;Cj81cQC X0;e_"m&n0 H =jgS/}WhLG3 CkoNTH?hA}ŏ7~|w/]g^z\<~#'vUtȱ3w%?{cNCo0'>P3cxϐą_;W.={ة{=Nzz\q;ϭ8:9y.W۩7:'w;~T%Y/9+9}fX>n\udeﻪwNw^VluBzܙwNJdc[}MrI^D˧܉W/2W%G/ki(Lyalakazam/data/SingleDb.rda0000644000176200001440000000211014500036453015115 0ustar liggesusersBZh91AY&SY}ic_@ ^Qx&F҃FF4h2jiMiɦMhddhC 昌d LF2BS@ 4P SjbM&LM56I@C&MM,J#[JPP0ڀ5L B 5( GHlriDI4kZ6:hHId^T p`f) y(Jus2Lj7ÕLPTETƋ=:y.n7m+!R*o1^7 .&2kdƸZ HR@J'@@F!*TI,$7^n[H1 ښˡ]cE}' iMk4o8T ZֽFsÞdF5FsgI^C'903Z scX1n;c^f PkЭcZ k4 f0p 4H#\cÚ5{o ;B#F cg!k\T#Ń0`ǣcy燂pcj`>/Xד\9*PL %)&e\:1Z|)N^۟'?t`<:` 1Zpkƴh5k8s\<~^oKEMzkFޞ;s .\\bM ؖYzͩ&JiiefO;Y$Ii'&$Gv=F΅}'T烲2uh\Фt:JsC#n7)J)JRː8$mmɑCq%9^MIָ L&ROLyo:3lծ &'g%2ݽ&N$2NC2Q0Ri; K,Y QAޔ0IK@zOZw%V}guN%ImqI9sa$I”1R І^^o9SyzHyoYw.p!,alakazam/data/ExampleTrees.rda0000644000176200001440000004073614500037116016041 0ustar liggesusersBZh91AY&SYo ]_0AA@@@^|kb XE Yu@  !iJP`A@ @  @`6eZ ( @ AU2F&4@ f1 2iM42db6!6C &1&#cUU1`` ɀ L BcSƉAcM$FSShd=@4 JI#=Q0FM}A~l$d#TPPȨ$p'U¬ D(BeFmک&+aYa8cc2s5 нYrh^EX0&d&Q41E b"%I"H^I$Q`{RdR1~31y(E4ܩR !jŒE!*,+,\.E4Q mXYE3˜VL*qI16MT(el[RIdKʑ$$$EI4X*Bz"J(ͱ ?H\+$ɘΑ"bo'-aY: St S >3#:;.#(&w6~;<;ky?YQ~6(bZ;%kUHIkEEPAC !/N<|Kd7a_sQ:=gW}}ݺձ׺ZafZnņ7)v=>L|l!&Ge{}y^W6;1xT;)']칝7^j$<)>)>/g/{0|(jhD>I&|R\[QR.kXmAj$Q 8y'H$3v+'aΝTmUu>mW}(y$Վ=v"EV 8\o2 <'DZ!f0̳,eq _~ ʒd&1 Ŗ dY222 ecПB!~\D?eS'aKU1"r$,<_,Cվ'w^˕cS|Mjs&Ǜ7թc[[q8]y',QTZ B %Ta Qm(hU$PUElZaXB 9r踹c)Udq|l'1Yp9fc22Y{93+2YɘFb,q⅟fK?,̿_G9edy39ܹpYbg8y̫3(;0f#,̌q3c13Ⅸ_" 'A8LzOS=O3|?1B"E=I? ϰHBa L+LIy͇3eEs2!=#\D2g'2y)0>PWY (FP)TT|O"H_^Gl{U[Mf͜bczX(_VXL©K|*ffc1E1s3<9f)1qfVg9ə̜̳0.ff agfec fj%O*&)fg333333332̪333#32fg31333afasaf*B/~fK3p,l\1Tq7ǔf:U޹cUJ~!E)|$Z\a;$a %f(}6J0a͝ /4XەrʖWKgVg:c]rU sc *+fYYtiv]Բ3]dKg**0+(ߦ7۞YWC_MTBVk`7jniExd4^H~CYi 65%Cm(nn;:R[{#\$@DoU]jC"%Dȝ牼P0"<"fDDЧ.;gg mxXeO ד vjMI!)$RE؛$J1 euԮ9pˋ" ):l)>XT~i#̑ȴ>D|LwNǒR<8wJ7F{0nkWmYl;l0`reUV)6 m{-"=r i.djͪΛlMY~tHLHI"{M|񧄻ç.6YL,jʼ=K;"ŭ'6ʥJfHbFg<bIs4 '8L# _tGqwymURe^nz+3gؗ9v,_2WoNK4Ĉĉļv̴$q!U;U)rWZU>_߁oCZkt^edH y3PBGqՀ Hײ=z!Ef,mU(mNv2a8ꛧm[7aTR0CrvSWmSQiQq\ gAi\}NQB&Q:;vQڶRJ.앜~ބ `ڢ=GQ|= MxSۨm鞖CUdk˭TL4WbRDeF =l6N 9홄zơhvH}>G#NzKÏwKwwuҖm{N }UI'ЬTxO66UT~*a%^^3 Ns_ -j[Q{Ϝlmaxֻ=iJQ=Jm0HɁ;X"=Bç\gDzt.>x^ƞ5$Xo0= F̴O%Vig>HQw;zƗjɖr4rzj6Q;LֹIڻ6ܤx Ԉ;q{΅G>&³l5|vs=u/@Ç}F ig{bmk1³}g0dvDpek½]vuc)=v,^+#e~㼮 V0K1 GFΙiC| ugđω}c}7=~vo>>u˻eX F͒(v5+)yU['[Xvoq[F|~|+͵6JSk3*47O"ðH29:-Ѫ1˱7e{/ԋGƩ*>&jPd*'4T?O!~?9\gd̫1s/'9^e2~>y\/X|ex|dl 53|~4QT55$D!8g13(ܧʩZ4L#RS5z `T<InjMeJmL+" b!#+X?̩_jndRX4A7$~3,,xc?Xf3229ey9e?2?~8휧K8.)dS5tJkTMjjTb|im3X|f3 y~ydNd1f3ݷpŘqc̬q|dg'>#`sf=>"ȨO F{MCɢB_YNL!Ire&N\XIg+Td.P˓ pß9b+X ^.|g2˔\ FONj//,K)\<~&*>Rf^NY33**0)Y`YWg|>c2G1~31^b㜋p‡<+sŕITÈʜ31T̩,A̮g+(xxJ+ >%| y0'LVJrIeYA\LeFFY#+&b9bN31a9̦S,8ʜxL,Y0yg'p&< 2>x'W(.pa8r眡/!pas'&axLʜ O"ybeday\byy899XOc2)?O&+3#_T‹xb^3̞<qF.^ǜbrxxeOX#'0&C%W̱W19 ,8Ȝ8CLʥxU9Y)L#92e|(f\Qaxį/!,e2a^1fe2#0,&C⋇g*_aY*˜ 'G'9e9,Rgy2rY\Jes_H1J1epsL^efS)<œ!'s( ̢DUU!FId>wA0ϥ)Z>h7`s se1*Y2 39brqY0s NC`L'ޞ?Y^OC+/'W<1ySO/?eʓeO0Ce~Ke8yQ,9Neba/^Y̮aDxrO9xpUO)P\,EO&r\fc`)rr>g9<\|˕W<1)Ip/'W2'99Hʥ˞yG<<#3"̊Ybd2䣓eLQSE ".fp|c 3Y1,L+*eUbLˎsYrd`\a1y8q1|ˑ ʌa>e'3eX+0r# TS40Vo??~˜9?za3)\+*Cf\Yrg8&Gp哙dV9 X.cdfY˜x 2p E1ʌ 2Ɍć 䋙V`S1eKO/8`xbK*f1"Bs,^1a>(dU90y9dQ/% d1se1^^Ts\S%Ń 3+3*.aəArge\2/e^g FLxqy^YFe̒ʆee&Vb2 cG 1L^g?O&qS,^Ir&f/spȫ8gyc"g.UT\by0(sʗ(s#.YO c ,XiЙ}>G37ډĬYy&~ӁiB%u/**>¦i"GRbhPs0kPl(^uwEM0<GQCyTn$l9 ^$DTfp; "҇y#qXL*?'B I%=G3|&TdK+3NXd0+\ b2+?~Ɏ)dO)˜Xes)"bSxEyYfeQ2c1<+f &S,Ï0ydrb1gVL9?%ŏ燏<d.\1QUgx9\g/J><<'2#'<y.$9c˗0T<eQ9O3?T_)VO,'^/>y,2%˗*Œ\YOI|̘yYee%8*.ayC$dX/?fY2R?xx3YgeVxḶ,Vb̗˙pF!<9y NF\\aeCQr2xE1% 3R|Q1̈C8S/ކNL2~$×!*+ ̹ b, O g /.`2G(%O#2E+¹f30YT2c0!Oʮd1)Ņya1Q 8?`YOf3)/1s\$ĨYbg 9_Hy)),Lxy)ʦgS&eI,*#.Xs ,*,1L2|9>>^0#̾GbL,fTf|0& qc*fEdr1b#1XY,3py0 ^/>~/T~F9381&Yd,q*qS._^s VXYLJ2fUf)e+9#e_|p/31TFW)\Qq9NYJS\ PaO1f32¬IfO*qX\Uea3Ǚ9p9g,1/2^c21ebg1X2#1Ľ|ffY#'2fc 23ϖs0ac0d3/bexe2efK#C1_(K Q]lJq:gܛ xM P!YL(E4I1$qQE##ka56M "y*L&(Cr%&reW,J䬕\2reI Q0 f2̫0fʧ&&cy U8/'#*dNYe2RpxÓ2Jy9<ɓ!x98s(\G''/',2G VErgA/r2sa30 )9S2e&e%3Ç)S8S1 &U8erK d*<1~ s3X*̰9ɞ^\''%ʱBɗ"O(#'+eX|W)..O@fVV32O2W 3*f bœs&f*ɖbɆYPEVYpV`PXsx>\(bVbx UJS!༘Uɇ88#甜#&eV0\^N\c8,Q13 dEÉ&'$$7+4/> Љ0uOdMiLI252A7 s(La3&BDa2$D9\L}HqQa"E(}$Vz(`Pi<QEcLL,ʖgO"T}w#&;+?QYĸV.&y*&m=]Yt25MPA|lMNaPYaiB$I"P&"m$k~I7k=fYwvөșhj #QLH|NLs5fdab^$H dKw5$9#Qfs53p5LhTj>g3CaY"\y4 6CCboBqDDdp&j&6<#i1 E`p8U'39Ŝc IqfDDʅCC ̖UfyK1FXR,3e2Od22>qU898pX?g"bcf3)L,eQQ0qLfc3?g?||sWMYs8q5./&:g3м6"gSBBÑj/5a/&^q"=yYk;HGq3Y=C\{#vNiv % Gqx Eg#Y"'ia2G9/-ȗW 2ʳ)>Yb.`0|_1FYYI!9+~K#"^FSYqde\&eY*xVX`GTYyÓ,G<a.,*Y,y<|US0g x ,\T<fK2sTde0< )yfYL,<\''(O,F,')UXʫS*T9#'Lb\%ă 2Pȼ2a2?y^`ɔ1rINe8e1++0<ɓ˔ydK,exg8|㕘r'0FdK9䗊3˓9y3',dɖL)bDU)šsx*3 VLbɐ^VO,|_'.#*230s3s,ȳ8f32/9r\g ˕<,9EybWW' r^#'9̆ ]UQ9?^ bra1/2gNp0yɑcG9Urc* 1$džDef'3,SyLYpNX3*pŗ<e*JRexpGTXJrd*|Ga;J ̋NԸr12>dP IejJדw(Xbq,*:+*b.43I;N<y45ȓ3,*0; 7̎ǙD7CRQx 'Ùl2ZVp5d'1<"EfYH OA0j-cn쏅?r>Uuҽ3zΒ;(sk.6c/ !VߕzVQsڵe,p@C !@Ck鳆v}oφ:Yo3)T S)j~^x]^Y׫e]Մyefzv@BWc~k5}7kU9JXyK v*KUVWj퟼$7kҫ@CPFꬦS~HkFKׄ4@B4uB! !vU_ U;AfalU &w|k*Te9]lƻ4zuls[g('[^^HB$JݭڵU[4u<,S;QlY}u w.@B(NwT(鎾B$ 7cN=[7J tOx !q!!n=7r|m<[_kvS5GUJ0}ru%YT$LLtMq АMMh':'D'89+ &'2 `A>Ăq A;qv)8߁EQ)Jv*ښ&n`&BJIiE6 &%~/"(f¨£kl~#<3}y_3cn\}0hFI H"POHOH ܪO$ON 0NMDHl>^>-:!C(-]Y!<]y$[ ")„|alakazam/data/ExampleDbChangeo.rda0000644000176200001440000035102514007007324016565 0ustar liggesusersksM=yas8I/%)ϙwclO 444n(bh肢.\t17~ad_^!Nʼx4V:0~|So?[?br_zOgp_no櫭ɵtݫ|3SՁd3M׭n0sW盁{u}]$mn !{{ce1w<뇡{uq=ܿz=u]?-݃Ż7fqcW=w|4x^0gw}?|ȷ'7+Og淿ѕcMjw|6yn7fYoz3WݻōL.onǭ^ZirK7{?xtw2ԡyp4zN|6u#Ϻ&geYw2^9yk5^yh“{Mcћ/kמ[QI<Ϯ/~NH[J^&O{r.ܷ ooƏǸ'73Ǹ? q^'-mw[۟{N&ٷΨ~^O] өm>Sǧ'?gNl2u֗緮{]a.a ?g<_8hqo6=:BRy#g||p۟WNbuMͽ&Zؽ:={zo^.]Hv^m_nvzakd;@|}O vGndwuꌻcjlz$'OӋֵ&w=Ư+m{M%Kvm{罊y3v^Ew_9~$=ٙ_8۟mS{hvG7g'-Ox w#0}:)N^G?=;Gƒ{ y..U=[;C7t~բ)<]_zO2I{͍a }Z396M1EG-n-'-޽}fD[}71;]Ecag~~t;~p>mk<7mgO}Jzfwvh8Kgޏo}Jzѽ8 |gܺV/nv]YWoyzHDj2٨uu2Ԣq/8;ԛ[ zr>xq''-qWkxce"(k d2h۟-^G!;__*Yjs'csn ]$_?7t֟] f/ONrJHdvfG_Y7m,Nw|5'V_{ vk__t-aޚ+tW|u&/Ľ=?|aq>yY{m,O&ފwyûㅷd,دY|O'Km2[ [p{B>v؞bȁ )L}Djh;;;Nw>s*Osm(֝(Q\y:'r6|;;ٻ}Vby͇#MnVjw4}jhS~sv]Z[_h7޷L=_b}r:ϣ;2'rˡL{ p|yroVI珷޻YכDG>[|w>NxOh/gF^ـ箻[Zowt_ C_nޫLg\ɍ䊯-n}r][E"۝m?} :`x>OcUD|g8-DK7?<ד4Q"S.ޯ&!_ Ӎӻ5|Ҏ ;OםY|-ix&fkڛ<8^ǐywڻI5pp~cѝ]xRi׭*<9 ӥWږot=~w|kįo>hADž$u"+Z^ɸIdKGw|=MZVfNt&އiOgN;s"wMT׹?y||}uТ݋\I[KV_$::Cߓk#~L&DŽO<,kz6z^g۷W|}ITi/8<߷AB^/I?o/OoG )$Ld j쫿<juwr?qc^ g~˵sE}ߓھ:y|BW<=EmzKnn}t0:]9ӛ]z 3ٝE1d໼o[O_^|-*^tw;atA/h1u|{nwhts ʃ۶}FQ=y}_fO%͌=_B;ےGesvkT$<~_$(KToDGXw}c{C"FB;\?&/Džp;={mx=ώ/DO<8n~=,-$OQ6FBi"Q9v2OTSߟ|oh=[^/w)[L'2#sӗ^Om~=,۳.D6'-&~>k[ݑ_%4㉯.wR/u?u9ۮQ SǗ}՟Q=Ld/=µ4xNN}m|8{ݻϽG-[O{{bϖ_\K79}<{v-)y>p1z&ݗ&w\J`ʪ=&-Qqnp6j_o&g>8brz+U^#|U'/sSgp edidQm^׉潎ޟ}PD#YwYQ}7lo}Ϋ[˫)Dw#0\%t}HT@DYWbzKdr:/]<t0}Zxov+ekMKÐii2c^&::acG/>>?W}] 擇惇\n{Ċ|<}P{-wZ>W<_\%<Ѭ5JsƳ˄찌>>{l|_^m=_%wwyx:]iYng?9lGwwݚM۞)&ϧ3Ѝ&NHPY^pw gK<=lj(Mt7]sQԯ?*+ܴ}ROFO7ӧ j:W~Bލ#g_}X^wyѿG/^{=:?%I̧o of}$WqY$k2\x_|"CtF=߽>4[.]L6޿$fwRoz7臘g_Ӣu+xyG7''/W=o|;%2#KyןD̻#~><%\;G /y{0N}s}IHIt>2ۛ?>LoO|}E몛vu6s=]2eiz|[&xo'|X ~w}~izUo?%g0].< G}y?vޭҹUuƳkJt_: uKКΌ{ svps;NfDw;&?dz%`I<+j,٣cY[3D]zD/Ξf=7~72>~Շ./:S] G^W=EepY07wD'GN~oN'7O-_uّfgrux/On-ֵ7jBgx:}dN\Lֻ&ԗkYm^ř_o}q 8Bv(}~gr{CWOW^{<|w+' or4;OHCܽ4?\[ uFV3ye4g Vv;{Eh1ՃwG@/;~jwr;oړ׋ybfלjݷQ"{Sz~SFW-J{4MD8por-#ޛ>&j˨>Q~pֿM!Q켿&N; aϯn|s Eo>u}W.qnRpB-Q-w~{ȏ]O3^mNd|WsÛyy8zg&g{ĹjC_]=XdIezmb/Ћ?!XL|&}iĚ&k)!8&2r[$pxN_Jٺ{Aۇy"}o[ȝ; 0gRq޻ Ĺ<2/h#eL: =yHg|uk$2Q{Z O?_t'֟^K>1Cn}Lk ~ro9Q>y"3:t'㙻p>跽/Ql.zN]ތn=|qnz$rO&#"Ϣ,=Ń<|W{}@F~[2K%z5x{zN>O;w5<%t^:2W~Ο2um'7zO-O~zw7~2.[ f/]q!_ыsy{['UkKJ|m|~ջI罻=9K4Xu뼤O}oz'v?}WwL-uԢ~n59?=ߋ8X;2fZKJTGϽDͫﯞL wG>g3De7[1gǏ!pN8g|7ODϾ"}[i?ܻН4ʯџ7X<_~Z:=#.I~uk2UMd\5'n qxx'b`_p5gL^gLH}uX$;'TƼz^M+ΐQ5~@nn}6oO73{mߟIH !S__s?.U&q@NwGw DOb@}H컽}^MO8^Ȯ_S/,'w] mQǰ:};5ga+bruYfה=(<(qC}ԟF ٟX؛KﵓUDkt0q \Yȟ9,ѻxQӻ/NE|og5zxzKUyH2ku.|=ɍ=i_|T_>3'vu&ܺ}xVprsxsA=g'#W S3o&$*Ğ q꼕[ߏ_{> _ |}V~#WCu8ljNB{>}&g9^N\e{wC/wF-NtJuGry}_'v|e2C&$".N,,޼oE?ɷ|x}y]=WCߵ:\Rb/}xz1s%UqHx0{mKzׇv"9|K5?%a_^井8/F;܆י?;zOXڷ7t($:(h6gGu⤳wJĦǶ?9;=Jk"a8:Q??'f><}ŸW1=|-3'kw'W3_ՠ<5q"QE>Dr8$?,OoĹ£nWSry_w',F~hpO[w+m??}'NK?m<$4umM~P{~T8|w1Rof׿ǐagt35^ 3K)NM4ǡhߦD<(D n?}Ea<yyew_|`z_EP 9qu/)y|{HBY$6qg&ݷD:)yԟlj}bLg"CW.}~.7$"b?ѩ#2qot;Ld"___ 烞ӭvyqsp}χZCs']/Ct33{=kc6NśKKO[댄 KB#>S0C{fT9?,~sϞ{-3򌋧;Y3zⱌgD}ҟ:|Ʒ/~ )7ŽZXn}$1sBC[?S3QF/>s7gNCO,;/zGKwPL;z}yC2DZ81qc%aCyuN9?8oհb8^Ew|>KxϮ] xYOAn?)'./]w[μמLC'Uy36ScLٌԟГ|x<'wd(oW7<3{׮v Ԧs ?/s0=0݋D~Lן]Sg|+]綏|/~pb/q͟מ,DfoľP~sݝ՟zAw'NOEg[Y|1g>{;npv?@&SEm'rϵʟ_ZTZOQ1z&|ɲ >mt#8&_sQ6V郳Ag8zwr='2Ûv"<9ѓ?m}2э>Cg ^g ꎃLdg;Fc׉ׯ<ڡ4ȽqYf>?''ω -ӫ?baz\a w3g _=Ӄ2IwZ;W{ᣯ?9;|tO9xy~ƃyo8[sFCp:[g<ۢ^b~',:;ڜG/wg6.}={_K㗄?y5:ˈ<Vz$2Da4uor/ӗ~W}b|do>{i;yyG\'Iw6wC"Y ? s[t|ǃKuNj݄߫ҟ3ҡu/ S?wn&˕0pp8`V5y}|__Ͻ_2y}Ef0#>';|9{v}6}Φ5 ~ %/8gܧ_O"auٟ&Kй]׭qRȨτu@{0p4k':gWy+ xΊ?Qa*'v,?v}qo8/{˷a|:Q.& g+^='m'"v*ݟ/ez;{׫x&D|tgz_ϊ BKϟ<4ѻ8x5hn)\w|Ο<-nKzP^/ {p#Q'_z?uj993:d1H<)v2~ 3l|y!f^kt77>,ƽI}sViꙥ2Qq䛗7$ӹGS.Jd&w^ٛv]oFD=w:,c~O~'gtm^FTg-S&v+>ѩ3=sكߏӛ˓ g/O7St9OlRݽŕJ`~哗;zv?3~oY{t|OzOf65.Fx<$=߼ }o~/FgN}hpjM7~~޴'nX}<|Z>4X}z96xL<w9/.InӖǣllv=zmԟO>7}+<ן.i;3q5ƽe{ql{>kg>==o'Bv'jji֤3n-}_?!j8;bHd8gx }cw<;Yzg.>C?qw ?h/߯?uW̗gJ:*סɳmǭ~\gJ,ډOδRxf"ZGIC7{=yjΝϟk[4}N,|yU1iK`v5OSS:48gi[Vlw3V[2^Ң$Z6yh0xf4M>%e_^VozJZk_ٛ2 -''5~OgDgΉ7-ROި:Cj/̟iɋߕ1_g%ghs){@zӷR@ǯ>j_޳"'ɍw.zBq4$],& ,vWOBͯYNω=+-O.^}phjI ɣo/8=pW^۷gCvhH"wOneA?|}'I&qB^CQ·}N`9oݦ%Sg_Lu7/牽)qZ.cӛ*& oX}}Cf )4]~j?k_k%;Ӕ ';_' U^B{ij^<$ΔݚDݟޤ\-GJ=hjPӖ'& s(~PuX]xG|o^U*>2/?FŗwX$ӏ S^prhzb :H0x㡀(C_x?(~-ŕfpL<.Ǭ?WbtF:7OόS1aAop:ż`r./8_ "\(SGw`7d|RY\(*Xww/ Xhx}K^ʫ!)/Y ZEy:IT%/('/N IA xgMHsV̺VzFRg8εxA( Rŵ }Vxʹ,/ICI*Ƌ5'Y޻*6H녊YeT5${xZ;EJሪMV:cSR 㥺#JIUɺuC$U.p脫:i`fLL+`,|fnKSYU,bzGsIœ9o sCU%-5&tus[](Qa2gnΜr]b҂ZhJ(j ˰Ȝ u+.Y̰.ZaT`qY;5+,bdZ 9. KU #9MDxJ_QWd)Q0LW,\̆BVSH*cxY7fns$ׄV!' + z"c"&РzӰ`rݹ؝K1SE\*>| %ppM&Jra3.>BW̏fJk#p1ֹȊ Y#ԸN[~ jt .Wqum)/Q^Wˋl#/_QpM^42p9-!% on\\mC=FX\s5z$+:̾dyI^BDqO\B pᦼkts+.jGj\XǥR9xE+ml_]_nlz_ާXZ͇bC SR/\(5aXcTkF舣*tY[?SHH֙o4܍q4g:'seɚ'ґ^cСmІG9!#ykf(K,d,NE=OèG#l~u=YׅULXhJ+tA1Mv9Ft@N0Z;|PCrfWCQ?"Z&dMʻpJEH %hlEb4WNEVnpQe~":+r`nyvl;.k3pJ^hZ .zmtlwO[%?\Ʌ?av\zl_.&/7u`v{vĨ`vȧ /IPKX6^5NJize ~hY})21`Azŵ#&`J.W1ROr8f,S*G޽ى;H[6yInv[z]@kU Rl4q 8*.юB6 攀 Lu& ( PY;GLbD;Ə ub )%XnBT%!:zIWf%+ME*A+.nB8>DE">N  7B0tHEL̶AlzDJ*bV%hƸ7ʶ31SM5Yb9{f"T*wl|-:2$V,&$| 'TUXH3Ѷ92. (eTX.[,_ gўz)c"pb"[y}6?C̋:M1R ɖ)t [dW 9 hG@zHq̀4]&S\vD =ABd_U"  Ov/kpHKH<9mCBǵ!Ϩd FZMjyYdbP/_nr"nm.!uD:I 3BJI&}}o,&Pm@Q` [PN!T)hB6jo ']PR{[E|jM!&WvI­U_qxޅ,`h& X|8a`n@1d-6( ;믆Ѿq8?Eˋ!p['ǑI1:Tp؇8Ccݦ\(r`44uINElux}և'$6fډ 2<]BEU-CDWuke_υoj !)tٷ,[,g*MjiaSOÙ7e't=YнSwN؆X,5PǭUU`PDAX s@v8+t H|DYݮp#l{,2472f'' lBasJ` !u 8CC'%}@CvU.2#=?u_uA5";D#)[yPߠD?r0õ+!t~`bjb 4hA$cb*"9̴)#bRkqa_K䵓4e^vUUsǽ>23ykMG]FK6/o0W(p#mZ`%+#6?g^_/_$hUڣbTPzRHw2+בx| NUoLԣ$p2RRae0s[G[Bɋv؏nMڞg0c#%DFAYYnӪȝ㸒;Zɝ8)EV'Vrv;6FyZbg>_:2MDz2ړdQջ_fuWW=qD+xU/RP{vQP4+xWW07PM݅NI)oܕzz3/c poYNʡNBsQ[֫ZVUq}QpJ:o5+![+D^:~{NJ;+ b-gxKd/na %*|Mo_l-#"bUy,#;PåB֋ z"FߡUKLl$QL0Y!eV-QȾY`᳋Tu#V(VɇB 2lXcbɪt6GI=3CFWWy`XJt {fgh"2 ?ҙa^ec=T=jfxg{g51SW\wꆬ2kƺF#: ;2R"cƶWC#4̡ ^G!hum(k60CeCalJWq0DL %[0 ;y_cmK$#ljvYU%P)cp8>(cMEn:=QFor^@Zz53hF:rnzKh7 !&Y V_|W؈V Ѭo&n&<+}ccgbB%ywi*YNUGJlRnd&>:ϻYMiڻF_|p(2N$Fh4B hlHWCUhG\+|% N:5ĥꝫ-PyxV!+St)7UѮnƚU[](fg[EpVR&*RV=)")ea )S#3;]`{ƾP8Cj K*RJo BKi(Ԁ (l,,OC;P7"I:PHD9͒Ԃx6H:+%Orl"[URx#?:\mjPQ%/e e@g&Ķ?]JC1{ؑ@!{(#]A`C|joa3QܴAu$ Bj6= = @pDDb XЈ-]X7U6bO-m[`܊V,525Ҍ&!a/TA@ |, $n,ҥb7VRDw!0.ZI r!@"2Adtj ZLbt鯤"1ĸųU9&~~A1*29`=@UDZ56Ul :Hݝr_U@otB %Lz1ь"*T"KXVvЀ57U1䈀~ H6bk.J$ @ƒCF@R u@qLzQNs$F x1z$:W9 *uq 7:@`@\D Z ~M@M Zm%H*$JPe@: 6 h ml6NBIp!$e7{+/K^\OEuZ cyq%h+/nFԿN}fosTqlImUaqHE@V]|z~ ݹݏ.Z~:hlK D:`K-%&H7Ѧ~!h~h3[% l;fF1NZ ȚNE'*3zFf , {B`})([nܐxsP73 z`GC$N&A(3bF:ōZ.VG7(2SuEFAl:}4f@KFՋyPgZ˺K#Tt5,e{Bm8o.(p"! ã^K#Ueh 6i ԋam:E(fyBVOJSqWw9){ލy^սZ{M嚀/n@~HMEFDUtΪ^-7^A / H)->) N@L)gTv%w݃JJ@(&G4ե,V4 @hc[ c"/Ѿ'a+sl/#M(eJ?җRh n6/M6dJǖ%Vtb ey(Dw Nq $Dώv+KtQ_|>Jq JdtȒ- @e EK]$GL0bpc!]4T&bĎDL/d~NftzCexŗJLk\?th){5jk|V#XN,OJƸBtsGc_kb\Sj*EbboƎ)2O.XL%>vLÌ2©RIʪ)ѸE|ſFLTۈ`!$аW_b0'h"` +XBTL $:XDzINP!υiHl1t3(nee!c9R~LbI`^:b=˄?};Fyғ `=s1Tet/ɑ\x,J =NAa\lC Ji~}] b-^,YN&PUaMpUf9bFIzXP7s"뺓0RE1^( 'dE>_A!3:#ȝ Q`u _ 2#F4I>`sGdTSm(щ(R[5Ê ⵟ=[ZFXd #tbҌ$͈|3` ksI(GZbaP QBo)c:&RN` kW2Scb^cXy!c*L*=6|Y? t101Bڀd\m:=&lYi˘N !}b @[*c:4(|HeL'Ĥx:Ga҄N!I/jͩl\ \s!RR<0OŞVf뒷+b%%KZUЯvKM8Kɪ b.$f^j3D2g ȯbBjܘ(3}řbZmRO@SŬ| vN!tjl'p-qCinH L 8L4d$a {aaq ?1[<(2d}=3aD k^C۱BH*¼s89K쵨&*KΖ2, F$0n`mHW;duqŬ:]MeRՓi1C9**4j*K\: A\O 48'6ѯXEY͎pSk#zhi-yX"`GWK ~aa$R%n';D +uepqzkIء}̺ubtpHPY:+%C8D8 EzB; Qft*FHF#tqc>e2b.vdSGYy؞ o0-ԑ/(BBF9 $"TG쳤 J# -R}Y+edR::.aGUBȒCqF2LKHx&za"f);LL/&2M~¾پȂ0iPKG*L ◥L]JԢ?FM$#;YЩch*ۗ@c2,fuuDK98#;]&Ebgo &H{A-;98[I zA9ܟccT3V^4Nm \(,'D>nU5 e ZFv le`aZ~('NPYIRvhy|m$kgCbSHeu>P Lh M8_246j6N0$@h%JSb}kWV2 V72\jLt~8YFbd@0l,Ym٩-DZ1PV qFӐe)tTgf@?GB 퍬̅M12F()Ӑ5R)I[毴4ӥv>o?4|9FyjEAf(Li^ִО8E-$Q܌1'!fx,Z ^F@&T]e0y ooPaS7 ^R룹ƽ!\  [;]ΙGzoÙN,bϐ /}Ws:jSuZ`:Ҡ>*tWBoAG&^(E>Rt*thE'l. y&"9Tvβ"; c-ά2Ll#6 B9/N񑼂OJ:CM:lQxb!te Q͑N xNc ֞ ftTA#SIG~\4K*.[7?T tV|$v}*Էyjd;V1m7XŻK_,ͥl1c}j? }3.g{ { "C\N!/l~$BQ"dpݕa\`գ}ZOLe._yN*>aŅ?U=쾠;G\8/?p $ LFFG >C^B{l8kkŲѿv~2,;#߀`߁wբ/FI(m 8{q\IѰqVSaK@HOؠbѶXȼ"6ȅAU) )1 mTG{DH<9`iE, 5UID1 }EAu=R:`{{?k$EFmUYY*b$.MqxGv[߫} {uoP^\u^zuMq1Fj )JK>R"h <=]cY&LNN4eLq¡!"p94dlOáDDd[""s8"gO+D`?.O ً(6"b\H,wjeKAZڢlMm$#4CwޝB [t4ZNN-y+@,8P 'A"l!t0Ţކy0⚸"~':1(-c!@T-2Ȏ@"q _tͷKA{芩Ϭm4{~O\ 4vFIɚStj =_jhK@bƬR' (!AjWUgV}mЩ֓gVFUin i_(x@T M/WIk s7_V4du+T2 Xra@zL),PHvGD_v%;T߷e@ok4F河w$| >Ճĉp͛NIp|z8sQCf e%V6V Y}afv] {ڠ9UQoiJ~qh]leSLVCʛAJBZ;h+*U uUH94EQ% Jl烿2:RpeI(9PJDvyd~2QZ 72ѹ$uRiz4۝N)>]^4y<\:<}IB]髞Tu4~CEGE+w*yvD8EDD:"ዉr1|w]؎[VDqy1UHՎ 1 Ɗ%(NA5"Dat&.}9]"B ;NHcx}e-{?;a~(:$Aԑ$ n};['UAF{nu2Pa* Ad:%(BVDn3bV}q,,ykUB_%jҁaE!Ѩj@AQTh cJC&(ԦȶJP\(Lcf1@ֳ1M%Yy^!5A;qi:)(Lv3+ EU_caQˮUdN$Qg%jG1ZH0*r(?WPAih`^\fI@!b}"Ry%%IVJڰ[qAc+r:pFCrσ, OX#bl5m,LS'5??~٪@Ke6y*L BdM=QծX ms6Xݤ"Z+3?Xur]dB?/JS& MZЬ>, >ji|J>l >iw:g>ɏR}&tvK/R3;ye_ìS/ξ(s}F>)Yaxc2J 5Y})f/(k07r\&+Pӌyk>6Fhܘ/P>_E(c@@ɆtǵE)M“87EJ(k1^(:L"%I(9{hL2r+ i 59\n2Y(RRS_<n$+rkzzO)5S Q HEUJDPLmkVד iJ4ps!1+V&,Qv`j1mcJPc h].iZ8`U 0cF+ 2:m ژ1C*A3FVUa.>\>cl uEn@hf$[oq-Ghqtʋ6H`ֹqZ Uݬ$0RN7Y֤(q#+D?? B)R@.1JӦaȀ>ZPeϫ2Qt@Z&oYL@p}Y"E2D1q %!$,OkUA;KU 㒨D )V[cT9@NuY%3)`l.~O,QV<~nmځRFu" epB$"I`TVD$ [qDNDCYv%4vd_6jG" A,f;9HQ[5+9xmŤug98BD%!okъBDy-I J +蟚!ɈJfYYk}XAԌer^ܿnP^ņ@-gO$#FtO5BА.F"R!B\k-"7₱s G"Кj1蟑X2H*f/e Mu.~m"oM$w#;H&r"*wޑ ت9f·- Yh`ȖDߡ&/*Z+l "ZCdlAR"Y;D8*w+"NB Xӥ ln܆Q#vʊH " ߦ]  xj*C uz2U]-?_؄`%BZ"'UIxs](zSR܌A(ʍIX!x%}Q5euD `/##;# !#6ۂh j B:[@ ")4ln nZgbe L>H@kx˚|KCܣ7 AXg!b9c 85n6 z+#k+1ڑ2p,z&פQ":H0AVk9 N`褪U'*d*"sIl ݞ}K.͞Pl0([4,h7|B]4 Y#ŁuzOr p( a[@z>Ef4UEP;ɍ>6K@u)|DIQZDi1BB=S Rt)9?lBӤȑHIuTI )Rl$%2GS|EBKqXMASjD`X8q<(SG~$@R 2\#Bحq*1E:P=)fNJU#&)lNal9y&T"0MY25SV"I;ӧzgYFdi)H2'J3L L= y82 S䙣cRRz+duZ,`ATE]l'VmSaobp4)a"+,"aY%>K{f܎e'cr,e^Hrg,'4 ,-Â*ΓJXp;þ/%fgBb)s)dRגL]e3ߖ/% B!R N 4'fKREKo6/@ tn2uM}r[UUK-wuOۼc>QRSp6$[ZKY,NΩábVIRad7)ѰrV8x68@ 7_t@bTjȓ ##~T]YVskmI {6XF, ݎZ/n="b748DeLxhr17G|bMqzO$5 bé%UnGaRg[AX6 cS8:Fi Ɔ02o*MSy$`nM= ZЩ$(oCɺIP[EM?ȃ2͔dJA`*5mAIRH 7LKlAI]nRRr6.ArǦ%[sXA~m3A,b5$ҩdI\pd2*A-U]t"Jbu<9-M=|7JY>K>x7б2)eW56,y43S҉)LP2@)͌Ҁ5)Ѷ|<ýXW Ƈ$)qcKak C@?qu{F]까߂o5޿A+6V=_狐`Re@vd諞/G+t>SuJlؕԴVk_?KaʀMJxy ^1Rz *k*ɻ04+c3;e4A#c-00>d4@c䂒hT< b4w'Ј6QS_,HĻSCQ#:e\<A`K+#kFS_sl\AP 4:RgWL7BQ0]S6E1BQ!TicF)d\f\@Hߠ(o |AlastUY+RfÖ9E9GfhV{z9Ls(݊Dz}!fL=8Uavl$gTZ2+^,sU7b;|iE2I2 )k`Fh2] 4)pQAe+fexz\6xg hv3JBdleJZ#%2=C֦{Bm.z(Ze\e ֹC v$\:׶P{PWdexZ\KyUOd\'.2H5X\9ʸNj?ج؆k̟o/ٱpH GfV| 5˸N&٧YSt>uzllkgDSK\ .ͶЖh>6rmh70o&Ÿ!d Jaӹ}oD$8"D$.ȖD[dD-Itڷ#:ȡ2"z#J+9 h=LTDD>MkuFAVSj-D+#p,&* s}M0f"DHOGR%_=1D 0E"dDo9IFzGdCP= ӗ1/YT|^st$c:,Ȍm u)+d;̟^TGXl&eqҗSPպYMI#xr[6+d32CY3AjCFXg垪X="r)|qC+esH_#acfMطʓ)/ Yђ)|9ԙ-}u يJ?PϩaC@UoA=xEAF6+I !!Lš`pKP`>I`RV_i$t0EF idbҠ@5 Q#ZK%|4R.vAB"jz#- 0#ı5P~YR,Y`|(hjj)S$IBhȂd2TN+}T@}x#NS $^(45As(AM=*gTb[~TEZo^HЬ`ۧT7'M޴{w]0ǻrRi{pˮ71y'*c:3ٌn;*Ռ0UNxLPgySƔ1% ~_F ikVfӉlS 8OS+1HZ,YWKm'm4Z32j1@ L ),MMzІ_zD1xgI\6'}%JcI2/Ƅi8Ҏ\Sx)PSYN7i) Os׈M }L;UaoMՄ^I$a"7 IkLHh<& KJ BK ZR!f$Y6 bxe)+` ִ߭ϻWMI\lQNb֜#V V^$l.UX L19Lhp`(c:ۨξ>auixkL$y",hƘ +p$V$X0zzRJS=j#(Ρ-u F$[wIp/JJ+wR:yz5H<_OXy_plj&AGu߉!}Vtm>`2X$2G5 9)g x*tQÁu:" N? "$D.f1p o@6"9ZMw=J lh%Í([42',eS+Uх5Q 2`u^% 1U4` 5G])8h4N4`Ӫ: )"d"H&r0=%d7O IB>2{ZF#"M":2)BF"\'" Z ‡݁"Z N /YZ !u0O qg ¥`mh, #~X7ۊG4ZK$e<-#ZđM_BFtH]LjO32bJ$T%efك%`%#\=[EE mV{*eAzY3L$qDJdC"(Զ^ZezK;>[\ b?d{#Ya"-JdLo5U6&02J F_d V~cš|*@@\'@e3L7hZ4h|? k:sNboH7&?r S0h)@VW%VQ5-cQT+$JC1 YSRLa# ޢB @}SȘݫA\! ܛ*8spp-\f"5.침"M.!E\/>F.hcR!>ir!E2$s9Mk~|}o_ &xof3~沞MG;2殬i:pA~M O d*gJʳ|;[T5s)P ?B f@&ժ@&/ᝏ\B@->5ߤ~{+T@wXUeMZ.1h姀Cjkq5DDPiv"Z8DI5f]|.qly<MF|!lJ%ֺX!N![VaAa>lD#4jk0+F4!5M(tXI#iF#`Y\*RD^1oFcu*z%U: 55 Kd4&+ZLc}^"$N~O4zNŕz:Bj8Afwz(,|XMRs<4 /.XPAww]\gg;IBCp48h 4v3wi &:7NR%+*FCEIߦ[=ց R/۹߭[IE;ivVNS0.š,b=B < YPBXPE( }) ,[Gѡڂ̂¦/͂W,B%GP2*`9baCecT, :\fQb {QYսaIqh_DZɆ q]n/Yc\P/.RPl`R?ʾ$BSSuJV ߃w 49$"tR ك -X0A+(YpdzאBBΔ- f,\4 3i[Lu<9m[MM@ W[qTg:N!C,TAGCDHV,F6:EiWfUr@u.QhUPS*ڑblX$j.^WEJh.vVDbӭW#PtQmz+Tb8DpTZpUXkB9AB>M'9's>] - wNNb!Z J@,(-HlbHi1(<CӠb1H+ *+m1$Z PX*l5Љ5Ebzǯ otTwPa5k5&D:v=[ d0q7BDT2t*8&ˆWO`Y ذ];>c,ڢ#u-ֶ5 QGl-2jz3vЄh/(Hv BP=Gh)9FlC3 OՠjY6"ŐW])g4MF󻠡Fh!'IDrĪSRsџZCL:qhBDjZy H?BVhWԆ93m/9r+4*Ԡ C gSjᷜ)V/5QX9:BtR$2[ru>6ߌwG֪l\zF|#Q}<[DӴ5(l oīkmM5%Z!D]FK8%vQhBG٪I\DcSR"c] Xݩ; #bm%E?<툰KaSRR~/u"jlrІKU {4ݵW##;EPɄ)D tz2lb% kCF[dUHZhuB+}+Ay\+$e` ݾn_`mDOMuQ0VLju@)U,kIsf wTKcEWHf*aҵʶI(} hS~Ur*9іzłP%v*ZՉ)C?2.ST"R Cwh*I :d\VY8 }-24h[#DoQJa sD2Ffn.5҃z]G0q<4zR4j=F׋ BΐYʾdURU綠!DLL?ưqk)vvl@@"h_`Xykwj%APz@ #eEJ1I=Jr]!kbO`ׄ2,'1K,;HG~sw.t0ûPF1kT3)3:Q* G^bgF~w(#`ϊYX Sf$sp!JTZ1l9bll8uZ'"#ClN3hы@01\8躿)Y>v*;IY%!>g)&!šp6l^Iڐ7RˣdQkl;(Bʔd^M <8S, Ery;Ԧʔ2!(%YC)(5Kze VbZ(qDiJTPۚH a1%dP8xZoYQLt4( Bu5%ÞR)eJ?#$hrt:JllB8^~.%>%pC ))GdGYX@˅T(/,NI4uշJPt:jv*O3SV•Pqr_e2L[)}cJ?Wzk<ƙ骀:<9Be餔=e]_A26;jQ<m\!y<pϫmա7Ymq ^ڈHs^@cΉP) *>:cJ@b 7b%FoD!(s(Sʔ~iJ((;*S~;SR]:%ud5fрW=CYNi6+L L#;*S:-%VMo)S:]BN!Jm) ckfk&LJgҖ2dY:&#qY ))J!NhIDiJX]H(1PbQ)(WEF{o&oaqnBPNE<Қ14~5J(!C9}ŴDC:-n7(p|(ePsp VP BbXXg V !iZ )`GnP Lzu0G(JDm6&W@JmPNK(/-%cʸ43ώg^sv71;0{8N方enCEp_4Iƥ(*7UP )gKi4yXW 1b#:zgj6ݱu*g$aZM{DF.y .3JP fNj.-A T,BO6U,-@}J ;8̨kdTwkψ$39t,-Ῑɧ. ԡVwLP0L$$D\KGjLgj5|CÐPNAqM5oaORP> 9&dUI0Z1)B<LgI&Re]EIJj)Ū'rr%K]Vj`fd&jt)|f &o y8~q<]PF " Һ=p}3kteI2̸2GJђҕqe\xWgjhZ`S˸U\H\Q,:˸~#&ĠK Jdcb0 a̩h1ǂ=:voՄS*P-dԲJ[Za/b櫸MJ+f"$h#,}+04uaIWaVFY0P_+0eiXf`CfS&egb y[ d֒G,^#YNE&Y^,NdlB!4X7 C Yڰ?C`P^Ȕ`;R֞ew\A̔m˰ ՟MrZ',O#a)TxĽWCՋ:!Y ~da{OZޠ!Ba}nH 0YA]1VYfAL139>I4FJL<[Va 5}< &[0٨Qj%Ku3I$"1˥fX_%XCB2|$g0Nu T_BYf,Y_ K/w&D2YQldw0J/*0: GT,*7+| װKgDqw `d &+4:z[z) KjM"b*9.Z7MӶߣ5d̀eF8XˌX\|9`GPXŠJˌvHKUXm`n]jjq瀅."njP1 I%p%If, Ҷ (pp U!gG N,*0n d8,r]3@_#96** GLYf$ 58a7!`]|J~[͏H D8%H_VMUe1".K!9ٶؿ&9кƋ{:5Ab)YD8P{[q%'m($8t渵gZhomMXPc**e Ȗ,|nf C4Jdun4ؒhwBjcQ5 IRa1E]Q2x \ 9+8bW;%& C{5f^—GPGD W ?3/Ӈ(PyQTO?ϲ0QzϥK"i"μָP [\Gk!`˼&A`~=ԟ4/CC\\vu/EM^xּatc/Abr-Uh=ՀCB@?yJ/F(_7K`KE%/cE|Q?[`I|P^dxيutԘ6lWےMאڝa*eo8,a$:>#q)#;*:*&˦ 3R)q\RceG15S*P :G/BשI:5ZG-4_/>HlzɰDmRf]F @K]C9O6b^ΐBZEWlGrz ޠEA**"5d5 Ը`t8g۝|%Sj)vBԐ5dl;ב4K2OuG#dO3Z8֕@Ra#'?T-v_j Kkz_ђFM!AUl#1͛k~dSӅCK>?MNN-;СQ'ىc̃-&JjҩavdQv&١ֻ[KGmEݶfCN# {"*ad/8v8de GHqudD_JL,nJP "?B 4҄6 /;P:dt"Tt kɘ-XXJr8z3/A>ƱAY텣6ÒԊItYW= )?g%>pU+޿g'My#S.ޔl(p SN+r.MTMyC{R:5p[2&ztXik4R4pSVa# "tb-z8f>rձmNk;, #^Uqt?RVdA%@RכrʊC*#4C8* uK6 j\F:xtwL~QJm .j|/ܘa|Vp '+0 ײeQjCq$:+|)%˥#*ͬN*`z4oEU{C/C*cթ jYgm8gV~^ի"Io>=|VND#<[(+J=d*%&Dm`XI)E3w[ o2- aT07c~Fsb.,c2BDG*tv UG4ThgE ݓae[RS Y tƯvqhE|*?mͩ,8< F*DR#16p }* k't4]昴&#KWͮZQgBz4+YdeqpB M)'>KW %~; 8&M[Q=mIgAM|98 G&k-5+񦴘GBsTYoZ'd4'@PW{HVr;&d6hL#fltC=3Z3qFsBjV'gt ,5O=h݀S)4+!vWLMn!Ҙ՚wVQSv7hZjC uY6,u`vN 'h(ăv=B349.(ھk,sنvN\,mPNBI+h|_ERl31V֌M QׅRׅںΒoIRTDdEM[f3ZSЀϸJM% B-4u)54S@ ktR fj_ rׂP-T%%k jgOLR3} ɦ! R!e ֮(zEw=f^BE4y1aK ecBZ%0ᲶrDm'kIof5p}%dPJƻQhP,k]և>$_FZ3]sPpPeX%@̕NMDj1ɪK-*j%H"}[46bC?EՇ %?C^)!궰8XɴN򱞚t66luUYZ5mT3t]\JLg00\zwM,JL~vv@9:]Ij7∳8n@;* *olӧhϊ 5-N c"6EJ@>"j N0v&q4:١izzI:&jŐ,`*̏G?@_Z?^vv"Y;tZyC_=V5 I#̤jej_O"\lUYL픲 -b l1JX"vrpݴ}dj>(B ]FTΚz/nڛ_k,S"hbI:2 Y @T5fʼNEq6Ì%kq=5#+jVkTa5ύ'R"V ~{:쌃k5߫3%H]t1:LU)ꌰ`*Bft,Ff&B ڻџrE12EFJF\1FtYK'#c7 , D0\yed~:*0V鈂;L{ZG!Fe}dM(FjJ,/Z8!HXcTD2ID"zj10A8ԨĠ֪A\kaPa=|Poo!"5+||qq%']j&7KǧIG@h+VZ8Nm6mGٔ58NY ,g+{V'T/FtD:ʼȧKG@#TqqM8SwEf SGT] ^-phr W7ϪH+_`鐯Y+ tVdO(?ͳc&p,_C^O=;-`6q}mX*(ԛVVV_^q2vN*Ԛ`HC%(d8K{q,NASC7esa4/{N*8,ħ݂ {ZT:JAlM)qhP2,͓a%te ^Qfz=c}1}(絍-oEtK ׉E N&u()?9Q? q^G ԉH _X4e,us'eHHsGH)nI11 )c0FAl2F0F_*zö+TpAX^Dw8vr)&nufD.zp8Cnrx8 uÝuըZѨF; R尅Q fK8Ng;!2Vj%dsSmwYrF_83 I{\F .-pAY7BĪُџQx,~H!(oFqUPc`K#QhUFb#RUL=+ "9= SA:@ )*xf7-A@\U",A( F+Z+\b`RD5FU!)ğ)>&b PF;IDz1QD]"tP| V Q1G}:Zx mj nj"⃣KR GF"@`)e,?X"~jY2rGkD8פ I(K'k_X@P9 @PD8'ATf}U/ղWn,Jj$/]jJ 4q[LIu^Sy &(LFe_o# դcO!U"I xO"B@T mMq_,Gn.OA)˻JD1bz8F=@j6B>Yu hǤE@P(unC Bv:ipG@fֹUu%T"8 "l! @"b DЖ XS;JHqP CL0 9Pwj N"mY]5,&@ؔDr̤Tҏ[_M6ٷ*RPV+gcenN67 !{MB(>w@쾦Sf=Ł]]"/CiLbY'דԬE\tՄezUI1 *! *6寕sDe/>ds[ (F[ID@"B8DЁA[JX澊֗p5)=Э%␶j 5o5{HJvj!Dj x=fu Y6JAAfTR xDpk ):F}WB|hJl+ܭ)AQ13W=y:P>H !k7ZưgDjVPwQbERزzѠ[y3pOQoCpT pKt\cN Eq܆~+yRm 388Z:Y  Vވ﹎K w'TEbsڄ>& væSlZ fDΚ\*𣠥qb"áZ\ln`ng~S!nQ&iszܷ^R%hD#XxdWPZI\E5X.NౠW^4^fy6RAzLPC'lRd3]z;.x!f:@k%U%G5%W8YR)"i*S\Ur` u 1gqR2:QQ$4,GRU}0VI@:?C5g)3/ R RYS k2Uu~T-F#|L + jJG@@Vq|H2RIYY)sFV5#PZ=gJ(4Ϝ,yYS:fRc<q;pҔ6v)L)e= ZBq.|+%u*)Mt8] z3Ȳ)eJk|<~cb?UeJ[%[vb$9ZT)zqB+NYUFn~'JY33P:˔3,K?R@)N~$%E)eOGPDe)SY$8Ӝ?=bn3RQG㪐dJ's,k1dꔊV(ў;Z*^"%ZQ"P҃VѥRĘ"Ҏ|U6jP%F nP6Q vuW z '(mcbBtV۞`R °<]+FI4`~N4%M 3 +* )-iU iZBz+ q fn5^wțV|] 뤮(FJr ݥlwNvP1]!{]:4mO'aBY $H;';;lpt-ٖꪢEJS4g:+:w $ nh59w 9T݈8A'g%lZkbt~/aS,!M_S(Mާߦ?^6;W̝?]aNƦRxw8m"*y+L-58?ۂ>rȺ S*Dw3mGGv_kI#L۔~j>R+ Qxkx WyanySovNxWOC~ӇzO$+@`@zOŽa 7jJ#>Z(Y]dU_D_Mah|fC ]o"w]r |V]Sjy5#&T ٳ&LbY ҉3+ot&MbVrVrGϘ;[ b\Gre7x[x_#ۊ<;FIEjt2qkqd:ξvGĀCӭ վ4q9:CU>t$AԯfeBuy%n 2 3 y&2 B^:#˶׽fZy*Y+.Ód.\$ZߵV} >Q+={B\2TY*uV\ 4FY=.dT4uCa עj̒.}jGB ؟&A 4=c٣jm$) Z4K5M >!vN" D"5jr)bB+M% TEw(BTi"I"*sdtT$#\ [*<*5zI/`,?.!ENʹi1DVv`yմ6J^5Um͙# fU@ 5vcc{"R-A^l6傹8/  />"(8h`|^@v·21V:J?k 9abPAuy VƮ 9ճ| y^cbjE $ni"8NbYB *`Q<t2L:FStd-|fcg)ߤC&`tQ/*i!LG:چv Ԕk[*|{2tP腘ͪ,PQ *Bel14ІbaP!)gU!)gLun.K f?6mm !B}vȋ벀d|2x%  6k& 2/K 2v(ij$nW$RK3 [4)F=/0blZ2/_Cm4q1ٛ|^E+^xQW'yъoElFҠ^Ě@sbFXy|e^ J45`jJȼ>WU&xaI:@23C YN!_LʔZPŨT؜|ld7 j;F9!*mP6vh4-W$6d1x ji9N+ZдYl֎jx1p #y@d7C\mFÁy}vNn!XFv2O\'LD\WdU A*#jd,~!A!#J;f- wEwqLȪXz"f (ѐҐU=QR'K[iz"iz"'Z#DlLudE#Kfm5WHGO$eeE[|~pR|ȌF JcI# V Ź$KQ,RFM*M%E8S8(#׎P.u8 o0]:<')jF0-5Td !a]>V#tUq4W.PZ/BBc0@5ΰE:֪t8`h=v8BGլJ:8WV֖ Tݤt ]mW4XTK@ Z: "%p@ѕVJ8a;4\#b7jCTvpGH"LV̭ZyA\k;@d c'~H:ƂC骁KPӗ> 'Yd T*,1tjԺ3(APhau,dMH&gޠT#ppLß4Y”tdKFV"S7,zC+qewJPQYʾ b U&\3ՋoМ0Ȏb4ҤI;kk~[@[ #8kvidﮉ?\u׬$v隐NqN&P#*A+Ϯ:}P%m d-"{3@E=:qo97ˎT`b/2CUgt: 4e'm0* F;7+p B|,T@pX Xh wj 0Ť o^ߠ{-&\ABAP"`d\b}.TApO$,!辰Sol0`!aSNbT蚰(?}e۷hZE |jÌF yXCҢlLꀸT%K咥 bm:Ҵ=\޺/ho@VDj1b{{XC0/{JP*J?c&hWCJFl9fYtKp5XPTC.mDg QX:V-g1d]{˙&-1d*henĒַ!88H>XjVt"Qgh3Ufx#PeTWɈ("U=eOv@ x"8jDTzFrdIE^B1Qh/9ʌb='XxaYso]zu ! Y_m+3:wLYuXK);ՎNV5YAl41BvbJ%}LCLg8 +0Q Е*5XE#xJlve} ?K Fј+وvM>{Qp#4 eXN>&?T'_c&w|my<:ėoL>Gy XxjUC찵5njJǒXhkVٚ=V>ʧW>V۫3GC6i%v&b|} 48.6|-1{R)\vUk #]-[f/-*X7c`q+~.1Vvfi>XO&[X&~ X_BKMbyVu"B(7]Z^ӁԷڥ @H$vjhUĚLN.Ğ&1c6bubr"&k'?#.F ^'VĂĹ{G@whyH G3bJLJ;4dY2=M#vb(P?PZcp̱XAܐ15by+Co4=S6qPYZC$B͆Qԏxab&#-F0*XJb'nW{`a,يFUjY}UKHJ잲Cmn'?}7Fz*O(TpK zHlDU03:r1U I5-\?ѷuh;x2a%=}?9% j; #TA"Wʑ|}u." Qc;=*`mVLL u{: 5VgdFQȌNoWIFr$kI'z PCKU&Ihهղw Fr# L~Hbne} (J';`=0+EƗ1!RVvʘN)`JnPsֆKML:?+L!c:4Y+>vڻL1k.a05[^komA0qrcbJYAB_ <#+=5も@CDPKpANqna,'ZpAa^˅?"\P)Mt`HnL.wr 6ZPtO(`inU/?@ I72kd57#a LF lhd&u TdZ\[`+_!>B< 2\2cc2F؋&BLt&Sq &9oB4(PAeSCcK^agro{>6`1|lakC ⦏]djvBV0 ϨI܍z1(MbڶM`69 ]:B:WoLXA3R0b=}:g7SeG^t)9m86ð=Rft Nrnic}0_Z9ڋhjCX*CRQX~hޞWafja)tt4UM56؆ 5,huɸH2z 1gGVՄ=j Rj$M&DX2S 8v%})%nPBHQIIn}-oIf=Tel4 .I M5FPI*1LPʲ(e[\;}E7dF$E.:)IjT6R(pzBT($& @;J!cdu`ʆ:%ZK)d螸 RRßeJߒ$e &bQbP uJhiRub]v"%ĩQW>̅-Rx9J哴9$(9A5bVIoMG4^kM'.i*Kv*KRWdD٥L)SZC}vi %YK#JY'u> vL&q>>Bd)Zs>o$%,1\^-LɢZ4ĒkVFIe)xY,uZt;J)?]ݍqR:͔>%+*GȶfY:ļC3G_w QKnʜ^v Yb,eJJ)ҏ!v)]m:]SSHlY&4^Dn)S 3{1-,vo1uM:x߱l%A,W7cP%>[孔^ qw*)Vqqp DqБpp8˵Ol%jD&m+;iM0O]Pd4۶s<7%^t ԄgmޚDy>{zkni γp!s%*rePG}P4\eG!I="TOW䏝a 7qq[@ƚaUj88q5qhw_Y!:RǁP~9H ҊlbqFa(͎'qX.#+u(r8/_G؄!RMo!I(ۗiu"&pʊ5L9*BJd(im0%-FUj'#A㳒1-jP0Bv\-!bvl%4ev#c/)̲NmgՋNֱ;,dTUE)J ,w_/wV3; Pk/5f]5QTDv*qhɄ : PC=Q]tGQg.DOPN) %ȌcHMWo# _|!#(2 )O6@cHDYL #+1[Ag>?~lَ/Ds1_x6X jE24 W/黄nB9<5QF2p`JͦXAȶ ~3O=؂_[5\@"efy,b~d.+NqZVxא2˄h:qMB8_%l[d!"qzج?2X!ld3tb͜e);bz(lod !NL9ʶMB[x>yZK!#Jf,e'ך0JejOJc3^l#ݚ~_,*ed'@e"kNŘG-hy&[zA*RMZX ^Z/0;YPtXaeX'l`&7XV0k8 SʖoI-ԧbLٽ-:֪Ak.b9lbEæ%hr0X=Nl6UbO ɼP68 /RA,GcN"},!YRH,K>:֢*U+$9NqYGNt(ҡOC[ӑ$6 {1TLZy,9L1U4Ck7"J/#ɝ܋`'K:͐AyA@'ݢ]qrtAgP1CMX70k(#dvPE X\E%,J 5XSYE5XT&m`)!Գ 4a0XX3%,nHtJEBkჳ^[6䀭iRIvF <$"YCjA&YsV!Y,NIU$jznn} D tE ?v;"J6G A;6Eu#3m^pHqHB\8Do+p1kv uW>)4pW >&.WlE&ќEv9 C-p^t ]!P%K%">oHZJWqwlN1GGgݎ-6_N b J6;Bbǖ1[ز…c*fb3$Zf$IUɚyRPɼ+?"FT5 $&x* %@2T8 ר#H926` 8.s=tơDt">l*Ǿ&cOT=kf~>j\mؾ q ڒ U4ކK:PKS}>\d.Es\8r%s.zDɷٶ\PY9nĶD-?8p(ev`"GRX[k v06 VB 7NjA)tAe`/kKR ?/C.|ގK'cBrl돕=`\…J./5qecc|3Ʌr3뉃R(biZ{ugҶ3Gz=lAEw+):"JOfOVlk'8cOW]CQh[C$lODuDĈJh`dե(f]ܭRLdo„1DX%2"u"^w)2PZ1LN;Ht"Dc"jЫZKݒHDIDDOq:cΩpۑ۝H}dZ;0[.#˰ G'˗9X[~tX9`&DѼF5Xz,˲JoֲɃL-}1lfo?%evt}I~JhQa +^.)cʘ`bP_ ݦ3c:&<U37~aDXMgL'Qz޹iL;*vvd!ksp2 X*1{=mbUztD8C5Gy9VGz'>{׻w#!tH$HNh:@k"tfk6~(_2at1J"Jw{ӡ&P6Qotc:ن;yp̻gν?_vh١eBGSUo4<SMR^EBv8ړXODtxEtt&:GG5u? t0I):|R:YvtVm!j蘨mK+cSsS 9SgJ5РSsWv'SB$jMmbҡKÍ\$4C#WP l:V HG]|]EɊN͚ʀOFOonXֵ :q1e:ߑNF ƿ=t~gǒ|k|͖ѣEˡV/RNBvxgesr*G ;F1aKUj붤#1t Hdri z zSfA? Ջ xKЮ{i B8N!4ёѯ]=`.*3fKkUxi6iб I%T3Q݁N71knLR5tYE9duvX*d97`_(;)GAv#L&`H?F5{yG2)5,&[JJ.V"Dyxu,UBM)-BېItXC6#d"Po]dVHp,г\΢*ևrjr! %z\J`,RTFNkgAΦ;0$zήc  )Y΂;N%2G5tRM[AIFлK e \+C9-LNb^bkk`AikYhμ ښ7XHTܳE!lB,P3kXoWjV0ً5,BQ|\:of,|Vߌ 'E ifI3a;Ŋ8Fвo:h" ,~}[Qi6GQՏESG{Bda:J} >P 3RɸFtF?*X-ˢFS^ y ̓ܜ\pJb~ӧUZWzygBQ. T>nP/P< \8GjLNyw!ډ5=PhJz"@ӠC b6X^Q jDP_\1"V];6qA)c( U\X9RTЛ2*)Ro* j4F!5NjeJP*թW"x::\ʠјO/¬gP'bhd1DؓY߃%!0DZ- 2#IT8qGAԧQS, _@9sUsFUߑ>̛7c3`3vl-:"(hM dCujҚ YIr|"TLPʹ >]EPLb^%(mF"Y//4Cǫjn7n!՛9A@bZ(=\X\[v pmTYκ~J_tu.2ML!*'\yr+f>PIT+ILu{G1H,3KRP)o"ރr̹ɓFIU,_q OG4즮HNB@ݑ#Rv9qa~lY D!UFdF?B8c]'8@a`f PFd2 M#J IY 4R󴑅Szh+(l6] Y()A+sYoy;  h%IP,A6)%rѕQJP P(I5: *c) }g)APt ? Nrِ  ҤTSPHR뢫Z簪hǛ*$-V DAEgسLF$>VKu %>KPhH$U\)Aa[  ^%'8JPiԆq)Az- u KU$J< }IjrV*,$̕}G,.W Xٞ -{8l*K:aGAT鷔4A6KI9Z q&3&CϭEVPcPKm8֪Ԅp]jRjMWJjj LcF@Vb7z47E 8\;t< KKa r& 2Xeӗe.ߒK%sIs"D'qYul44J+.٢6r WPKI^xͅwrѠqE\ȅq9Ÿ[rp%s\N%d.;|K|Oy1~;.0ob3EzLv\ϙ˞\2o^z++.PΨv >o) ٴ5%z`mpPpK%?{r͒yb{ꢺHTWt)? 4wq1m7̸DSдƢ7?@c]2VfFfFνw|:N̝uV↹Ğq\=.*%V .}"eK,/\e5.m_:yT/js(s):)ƾ~pq)k+Bxrʅk9Kls.\ /.r\"l \\%l=b2,xr(X|^œC/Sn8~?l1LaH*7\Wi>-Ѝ\b!5U^:H]Ǔד%/~=y_ u\i\<v(}K/-.n*_}1߶/co&ʤ;\݁r摣ǜ:Egy!lTؗR#K.ypmr9Dp$K 4\F@^\6 K'n_a" Y7kpwpٖ݇lMre\ /2Ń&X^|oA.[y .p9D\zJ'ޤlK\u~?le9-s`y=F ǎm[qyy\e\ .7\ /r>.7\.P^n$ˑ_ q /㲢I.py\._S~mA^<zl\BiBX.y\6),yb#\Rʥ~\r 3 sQ[a=!oK].M6L<@ξj=Z8QÅ)Np!v. \6M.M4v?t/AȻ\vKc[\OrX3v?v~+%^: lۓ7~]eAJ\|{\b]WzÅC־!mq=i%}W/ͺ2پ/1.|e_ڗPMsMc![z%-0e?Kq00pLca\^\\\/abw_v/Nbο(q[[U%/r\.^z?ͥ\Bh^p)pqKZ=ǸL .a|esq&>_)\.f-.O)>.7R 0p9\ /%^}qyyC\e?Mr.K\7\ 6\;?_ /rez\7d_bKv5ME:.co[^ KK!.\6A.5V'{W\ҝX.4q F^\,r%.|:PySrSfEezbD.p9/A_Ϳ9pK_ωSp ].`ߏ `G^s̋KKK^ph䅿zRlLeWsF5unPJvl2X'pqksqK\H(/% rfp9r%⏕ڗd('_}|.]$v?߿!.X '`ckͥ\eR^?z߇U/nz$/~v?̖!?YaB^zv'>Pxn.I^.c2 q.,&>6%.'hPm.[(Xːj_HWcV})ab_!sqJyYq .I.ck+D2/ue[AQMsJyM.p%&lK^[ҭqlS^d-$/I.ypp .-.pQ,U+/=|yIt7rT8%r5\N"/%%ݒJ;\ߊ ).%.1r\DxR?Z%TbHnqp.KŅmr 0.&p$s zşU_Ζ 1p.7Ņ.I.cRńKqڝ\RRôV9~xyD sz.n3.c0+ɋ'0CbayK]@^6//[y~.|Er ss9\Łysqd7'16 l)ߟlU-!/2S^/F\|Kmr'oI^n /'r=I./rY\ne\ /Fd0WZlU^čri=vl۾\`f@^. l \eE.\6%ƸrzLƸ@^\6Zo@^:Oh.cr I.p:p.#/\ǰ~.I.%+%]%htOK_ h؟cn{{b;K2UprYS^e\ڹu.u/K8zMK`.>L_e/?(/%TٗЕ:B=BT!.p`bH\_rI^Kc6p 􍮼P׽0%\ v?s!ǩkK'.5~24\Fp rD.p08p9.岺 =.z<\W /m=ve3\e\ް`җ~Er4_I _I a,njj.h<9sK3|b5pp2~qiFû˥c_|Ѿ."sپƾ4SwZ% /m_h݅/cW8K8ŜŢLKV ,ˋ3e:_ȋKbK^~@^z\J]6 A23q ̷0T v?ueL$[~vp8kcvOն1߮S zխ:XO[0pa\\V2w?r)%v\{q˺z~+_zq+;\V^WJ%:#cq_iĵ0XhqᏙ8a,z,Opy3\k_Bˈ7}re(O[B\Y\fRAr)\ /.r\о_iy rrz-/7 z \\.˪v?u}c.7⤐$ġ*y1?ZJ\"COyR̋X. /Abq Ÿ@(n^Lb{]..s[-_jr qY[ojSo-.%^'\ .~K(qqϽvsE.s=bS}wa1ecCr쪸3qK\B>űv'%.ũ. ЩS".A5' z̍zKW'dlKve\z60/.~)?%}X%}99y)ņ\Vcr2y}A!/+/rr\ 7l_ /(/}.?sey)-]eܲ(/.qc(/X,j<zqC111c /+/'qsEU%^] az?Llqq%.LU֏^G;z".\6$/.72Kl >@^6xr.K8Mr46@^V /x<ٙ8q|K(rq-.jGhzbU)hP0?rT8!)ˋkKKBk{ qT^ˋ+ LKr|eW^\pKh#G[jpMrs Mr\&p$܀&@^JDp$# ʿ^࢏Ev^Qy S\| x+>HHirq&\y1%M:߲%4\)p<.$m6%h^lKqXO^N]\kr)j% BlK M͍Qy 'B϶_#˗r\о\\!}_. -rR=F7<"/DY=gzzzXpz\ \ǮK\ KZZ^\ qq. .ʋ_X?V+ۗu2=_Zoڗ_zY.#/3w□DžJ}sC\bÅ?4 cttOyU/#{ݿMr\!.yY @lqKϥt].#6?*.'cA?.z-xE.<\c%.Vut/q)_F%RǶ\FtKyzwK\~1/敋q)}p) ˩þx ɋWXWx2)yYѾA^K@^"Be3e}c׺l%@^ //g}Kfqp 5\z[ҫ!ywnǾ%.DS7N{KQ/uuaR^w}.n<ø7ȅE.@^6%c9}\Vek\_.7\c=1.۰/7I.p \\R.^8|.o(rY ˖Aymr,==yb.׾MrysDydؗ\ r%5=v= /J\h؆[gA\W.иwƸi]sIa-[\i;\B[^\+$.\=}:XcZzqsI[%\}\/tS-LOz,D?*/E=Xc E=p,1s =~/2c U\ľ W!sayq.e=ֵ.}r\xNrqe:\ܥ~/!sK_^yO'_P.c.r\`_`r.U=-./­Vm4yA. \6e5.I.}yq\6%4zcqm.N LRK\vDž8s"]%&~ =BydYj!0&;߱KF.үpbK/qؾtB~k_šo4҉}eKTױeyssl K/Uqݨ}cXt%T_:0~%/^W^ ;'p=vzْÅ}i\ǶM.myz\jc==6+Et!KhrP&T e\ް%Z0&lI^c,\n6i_evb8W2 \!7eᏵvv;}պ;WS=OoMqOlӔp\'=uO#b4QJ`}Sx‡uN!98aY .&".\l-@ :8?N6hJڊЩ" YДm %%BiYR (VxXh j4Fk dk1^b,ucqN*#AI_lx pxRW%R':F< x]R|rҰG%E^)C}c^0QjztلP0g:3U!Ln=YW]lP:'xߜŶ9[,,YֵJ֏Wt K|E卯Wd_1 /f윋_S4>=y$HB=Kmիg\ WL_b_}E, h0,7߫\?p9F.B+X܂z\&8@^%/eohe \ /f_>@ ǫ)|9.th:tVS#)]C&Jt<Wk_v ٰH":? #+ :UXitB :LYv'"MEt|NT:6&UXy:g:7>.p[.ۀ!\&x&/Ro \#:*W\˴8rWKh{e)T;Mz˞[vr8D _X՜ Y=8ӨJ~7%RƻBK9H-z-|%m(`/IO;Kgr r2 I _b}^rֈ@B(  ^?[R[Gߨ_=Qaoi:+)}uu@H?[P893&v&0' Jm)a8&f!؈tQ`Viy8ЃY!"l/Oh}"8rڗGR&2}Ch}\uy`yJrGi_?cy翩t@t@t@EM Бx?\:mf2_3[x^/a ^4O4}ǃGWzxȇ$rɾj?c0PG]~f󍗛\:F1՚(^kүx /0/B"N'v:ڿ*_*LgFZ()ckyuG/=~⟒hn'r\Wzܹ,w'w#wDer]4?/Dӏ%wyC:WX뷬 &/x/5._Кo:~o|ι8'Uqvg%+B"{9‹Fq WzLuP^ɜP^q ;t[ecGKi ;N*e+١켶,I"i #A֏ s"sa02#1p7y%Ȃ3KqP7^@t4{hBCwoy#k~\Rv dZ#dWRr3:B}QD s7#22rx UȲ1,V s3Y7i@@96z"M(㩯ܲ?sNs%@7+r?Lkf.Z; hZ4iQD & 1 `#bXWb5gnVٲ¤[Ez4շ!w4ʦʦ B7kODWr5ZFi޼  IL-6(!t]e@'TI=J| rAPW6i[[fpW-/ Hw8Dq3tUPң*m@Nq[K<9@ܴ 4Ա(S'F>$gp1Qb~-zW0:\@nAM2 mQYf0#ys0:kd rtFщ-{|m: W3LAI,.P& eFxg7b zbG^u~<4FB4nW PG~fkg7UFEG~tYk$eRjMJʞtxcR&%yfvG~j ‘*դH]ˤ6n##8R$]%Mt-5#/p BE=W)X_W)VQUXZ-wt Պy}mcƈlk`^#=(:)3R7;Rh#vG8N踋S'9:l}6":h[~!ЉtR5>W`S *hrOIu9.BpN²ecOtme5 X![I՜P{8zsu%xqev02 8P٨gJmǒ/H̎U.;p85"b5/{Q w."ꋰeV)#eV_^w#v\Ay,exhYQ [$hrF#0] dܙ# ?TrX(r0?At#W蔕@1d2H [׼˖ť@:&22 2 2 2 2 2 7l`@A1^Ux!)2 Ȁ JC Ȁ 6O!-dn1 C\$2WIqu_C-[rJRC^_ 4TըJwn /QEjQ~5A}ot1'nS1FDs A0սtb7A/ /oח7Ћ-x}yCB<xǃ=JǃNN{:gSt);rנ:ӢS㵝$, S6Z0.nc\jd\ /Rea\xsqe[vEK]1K=-yžL2.ޛ.tnBp_eM/\ToJtb5\UEp"sp #QV-8CU5l_.LxpUq飀RĦoŠ EpKVZChI̢AuFydN(͑7-/^$2!ie/ie F7ed/D䖉djW1yYW%< BMҙnCឥ6 iEӪDVeK (I²fْvdG&CPIEVF1ek6F-XG0@ۋ͑# 0@[%xh[mL`6$ A4Ӌ{+6 A[Z5@Pq@g*tm$hNT%oh?zͫN68P4 X;ę HAx9hګV9h$@rϫ:ΫʫLxok SAt@tA蜉N ٶс϶e:KcRk6Y?؝x::D_̤ tnU9(и+o&:"7Aw}_,_{gQ-)7M(ݩp땷/~mQhK*,gf1[(ns]g͛ b"(,XYE`%kT4MGFD?8f2j*9Ȱl,SD(Xx&YM< ݨRG$γ-On GD""yJCD\G_6؋o0u55ձZFۤj Pub4je PS*e *m@@{{P(8u(T _(\CN]f݇$6q>h7qy8řsCҲKxAaEc(eKT(EӀjɱF % mO5u&cᰘ?S -4 Z*ŗ'et)4N Zl)_Shh0A;bgdcG?[&t2o-|3ȃYg|0w~_ >AAeUAPh=EDAJtp@ :6K:P%PZ' J%%P%P%P%P>޶)<%. _sk0N5_#5_QsydZ3t+MF Z-v}sݽojS穐D(E'3!ɤPy@AiӀ]JURY -~WCՀf43]9h΁f&yh]h(A*>.]u"\(Ck.lDڲtזqAn|.Hpvt].('[]疮y~ q:$ھg(q/*4O:_M*Qz3J>/} m?\V "ˉҊh9ֈHu"#4kmNF@D@ֶTXvhh-{"# "g MC:4G>&`7A$`:m%0m߅HtL3!?`e(=B0m &`Bb˘>VzOt l $^|G}0]I0`: LW J\)4ht+.lrkwE/] FEbOONYK_JtDsG鄡Y:t,DN9萛LyӔ!\G>s7:5wTߥ;lѱ~xtF@di1"uj`\:_uURJQ/ =(kJx5W1FWh,Fcj4RE@D@D@D@D@D.ȇO!D*x_CW " ȟY"#,tj#@ӡ]"Ñ"?9 H͉Ьdk 5h*Ӕn& r7hVh̅2Ϳun֪&F/ >Xł?Xճ+`q<sXRYl{XA-\*-ŘH%{ u,ސ\lAG}z1_G܁Woq "NZfN¶<vMGh0Nَ,Eq3@[S?XPh6 Rh"ši~N".dqE\|O9 lqU `!?\t9j.DRF4zv3)9IYmU[x 6babIJ < X m,Fh,go-[h,F1#difo Y#8PXGf2Lz KBٍ5/t}v ;YsN Kܰ }kO;|5Qܹo"^P$ {È%D814A s_Fɕz~țY~( W9X;FGjP3JE3Q34@4@vфPB.b]4I>IN0e4n54<9rH 4h&,_֜ D oBUXEhP4(s<"i< |B@O@B9Yr~Ũƃg!\MjYPdEa~i,[nqrO|+h<`\\󀮕t<`O%L#ʳ8-jW.؝w3\9b^nIM={aYQܕ}p['1*zY%Ԯ4!d* [adG W2(F [dl-]'HZ(P{? S~%uX=]'i .{ІTȟ ?*@`F`]t`F`TDFu꺿h~ 3Ow!!Nq`9k~Qčf(FN@ @iR(P%PZ((- "hIH΅C/:n kJtՔjU((JiH8(.4EP:te @ 6DOZ|JR5CQ)yr Dɕ)%4˔gzyRtIߣLI4Jdͼr`ʴ2K7E $Be(H}CGN]3PAI]jgGtJD3B!")-Mj6]2~ C)GPh.Q=RB1 dƩ s fp;9UV;nn6uYl$oE-ٗMnĒYa0[䆸)f!2oDdVХEcgR͍v祊8slrH9H82W΢YViy9Gu2h o#%o-yLVg: LdlHNNqn& &0r&˙ {`rF91)S:#1LdLJ< oZe}ﰎc22#\\\\\\NA\ׄ 9ݍ ; vU&*f\^pYRt7XPOj|τKދ-?ŗS 7Ҩs7_@H~x &<+ݑRe|ۤ aEuu%mX"XuX? =54aW B +aA.D] ^7 _^^^E^s2^N8y;PŹ:-{im1^ zaDK0υ 22 d.!Ȗ cvA͌x%RM O<í䦼ʍ2XƆ^^AJHzK !*B:A[Til]Or˒|~)r@CScVyG]k?G;|3';Aw-;vV3r=K~c8+?VW>^@r1`'Ѭ~w0}C!qf(wý-W@sČ>f.@VdN֜Aj`kmYQ4W$5ޠqGEq%4pUI \=YHj i,wL&$麘\|hOa${0w℞kw~l4H/]8~TgCN -Z?@ "_@ Fd LڕڟSǙkD#ݸBVdd%L|Y+@2# ԡ46>Sj)Fj;NԺ3kh :IQjNgD&x&-nJbzU]C?Bb#Gd#^ѹSF84Xze0,#VVt+NQ2b,SRr޵^Or{Ōҭ Gѱ*k"i_%N7BR.5~q:Mtl 8 ׃c 8hDgq8YHǖ86x8cc8 [ @:6YpCY"p@:6pG ˜տ Gq}3M {TK8RC -ʂ3}P* m/͋C0<1BR<=H#5"Rd(Q>bCwQ&iQ(Q,Xa"0f*Kz1[4Jw}֨Aըj}:,2*Z[I8\;Lrd ˘;k=HF"cpb@Fqi5 .ƶqf8$u<|fFF Gڭ&KGmc >_bQl1; '_'PĉA@"6bHt%brm.v@bA D2HyHđ@ =l9$bH`#5ɯFĹmTF@jzC0֛ q@I3q5@E^@llyCӃ0uk@@5Z5XoD"`75-z bM'1)-GB  cAP'=HdA$`XCF#=pDi- 0>A7അpi#&Q8'ь~X$EwXJXz9-fJ@˾sdsE%WD/;WJbVɱI08ۗԼH_J.use:R: PAB%!Ce1H]qC~8d1~+e HJ##b Hږ*G (d2(A@ V`OBJwT@4((((((((( )MALb⠴u,-B))vSЦ2'VH}cr0羵mJDIn0|5mdaQ J.!#=YYHZPIÌ`E!tJK\@ )Uy+hFGƕI(/BtKCB{azvhx <4l1<"ϐtMPJ}ss]"S\F# ))ϊL a]C68*ԳԦc%]]SCNuѺ qt-*aw , yr7^Շ\} p&>^WV=p@ *vR:Ǹ舿TA3} NcUE K5?V&Ns tG+(y}h;L]cCԃkYB | I@"N G @"N*#+XGějWs(|X#48Dp2pkqlj┳M-~Řs)>c#SڗA >G+K;g`rA =PN%%#R ȹ$dc@@ 2<_R=ʒ;9/Cu{Ӕ4ҠR=Rq% ťz - apXwtp, sfFW@ @ @m;ݫcRfp\j5 |ءdb\Gz؁ $ 11D-C6Fp$MJv$k6$@(&||eй>:\':tnGRRBB'<ؑDYPYȋ t<=t_J(msptګ$ #ƓDBzw>!FC5] &uܗ퇰jjCLXpL ܪ xitg8 8ޚtt>29qq"{srtv]dh8rĔQ'orĨ ^Ƿq/9_pXZaGJ | g~W;R;| =zdâҔ4 S&WM䖚oKҐ8l!1111K"R4,!o؁2O,Âa1JkHɘ"0i 1dCCe Md1-e4ӏSEL=)YKzMJ$h0qO`Ӡ[:F'`~t2{xLΦTځA\*¼, .T^G;1+B. 28*dpB+dHѠ_"O(KBE!x22_+,>yTzm`r`TVk1x[O}~jsy4A}lܲc2 &6YD;j ȑ5e@ګ5_4*M51:2FׁΉ@, Άe0 @t*f1pUTbu~zYZ@q{k-K}Cz.ҴEbMER4zYF,_I((]J"K"KO@)U;h<%P%P%PD(],1(P%Pªr)(md(?P%P+]#ZC+%?Ȳy4FGK?rr"HjQJ縦5~GiPNfB&+4=dG|M1FBE#q7|Jya.^7 xü:,yfvG Lj ‘U\x5]pG.Fn} {8ұb _Qyi4GxG&]v1yW 毁L ղ;CУ9^PlN:!F^:NP$8.trxƄJmŦ3&߂Rj:bRmju:SO^m-#)7Hϰ\HE6R)6Rg]m' TǬw!p]t7{NB'Ny~bKMa?_@ F i,]Ć&j؊'ܳb\sLJ&V# yK_ æ^XA>0'O....ak/N&c˶%흂aŁ  \?6+v\ތqTHMȍQlIPWW,o4)S/iW1G{)rM\p nY,&μE0Vu"]Rx)@d";df`Kr9ה2`S>ʣk4 D |t vhr BM1݆xIQ˩MB +:NȒx)eGE>#OŔ2sJ9>Ď%eC LL40]4i:0vaUhcTb@ۓzF'tބmPVTU94C$)Ƌ#4o@.VŵI 4 I Y-TrtE*O^-Dj&Uoƕx$];D3$d@$ \<2ɉFW|DD=|0ߎ߁na=U:8 :ЩikJ4l;e:sS Tcg|69dgvt@t@̍+ :S+;;:;C <{U9u$_̤ tx? Yw-Сt~ktXŔIb̕|1 "ݩp"( ?"-ȑYFG8S0:"8YձpX|H (I峸H`X:UY:;, js]g.2MYxy-FhX0> ˏw5?˒F4u;#u^gY"t:ןeqYd&s]"qHOS8$yRa&$aʣKFx;ZDa}aaICD\G:R~v$%_cͤ%PPu;jY̓DT ED]*FL%*A.@.ԇZLQpP\He1])Q:$6)ڠA xL29kVPKE=5)ٔ5%4|03#;tkPM\h5psALqϸ̬ax |*93 ^(p4\7NcP.ޑFv҅#> Xy #K(47@Zq ?(^>KПLsў^=Ć$8W)AEԺǦE'.}9MB(aʏ(5.XjjIH"apppppYŀ ˵q pppppppppp,.o!l. e\ނ us}ppppppppppppppppppppppppppppppppppppppps{\e\ > \;fpy\\\\\\V[ˆ@^\\\\\\\\\\\\\\\\\\\\ ާ..\\\\\\\ppppppppppppppppp-s]e _&x\2 OpEKݷ.=..............................................................................rl..p豷\\\py ~p>=.......r..r\.:L\& \ i$........Z|y1pppppppppppppppz.Lpppppppppppppppppppppppppppppppppph.ppppp_咹?ppp W [M.oA^ߥphydq...۷.r\.zr墹\pp re ˉK2\p}pp ................W%^<w0.....................................................  s........................'\\\\\\\\\\\\\\\\\\\\\\\\\\\h\. ....oҾ \}q\ /..............[}}Ooz{^~￿}󞞾lǾf=}zk+C?ji#9oy_k{3~[b{s*ѡLJcd'Ϋ;G>W xcCk^}u%=v> 48rC|Oz7; }sH,96fXwx+/{yĭαOnU9ߏ}G8~z78plP'>8tZXG۲) C'XvP ZC˺QuCwOCr֎!{ vlp 0$Wی0?tliFY? us Ui¼6O2{Ckmݱe׹3p=v72.8cǾW:K|c%éOU ;oKC7.suyk$b^z;90Rq8Fb:u1'nuǾ:6ߠCsկj>ұv^ލ-=fe>~zWtvaUYcǯ[#?6=4USDz~munXgc;=~wc>\ 䲪\c1uʾU*Z:/jq ȱUI,CCvd"W&Mf{_F]hoݖ~i̋Qm6 _.%yt{?u_}Kcv)Ohy-^p¼a _σrH{w鱥}ұ{^yN|z; FG3T-()sOjOy(| v K-77RN}[N\[=k>X31?tlm;mH:nٔ+8fA*̖te>mɆkM5J~YVU'>VԱ6rBzݶ9|mmKnRgM6QjwcK|q-N=pl]޾ -*.š: ).|{:q+vpiDz1c_msoS-htM8ʪ?o Ǿa}7l1^L3m\p{t*\lđ>ۓ~p} ޴)~sS]7co .TFXг#dO@{o[vv(@;3 ?{/[Wlֻ-m),GvCg%ˋ^HP-wDZ_ _\z+{mޛ˰>ߟcĮv?^Ӈη }hP7sGmonnWҮGaջ.%c׋Xk/1r]z{nOjԴ MVpz#{`tQTUU&*bzյKR-8M|I mvMT kvחӮOf~i,6\(v$/N8 {BhCDa'EY0O}v뗆G!R=j?'=|`/~&{t7.Vn^~5|Uv-S~CԥWsg3kٜ,> 0^t Y滙+]J6HZuC=kur]$' C7 ƞ#]gDрVLe:k֝8j59d2fϗwYX'Y_ɹ›s\k8qW/<׶f=#uYTfjp={%)v=8pX7[[?78\x:vPXoaڝ]݆^..éy a\6z䂺w]\..ȮK.Xaaޚ.캴]WxĈ^SVR8|ܹaI.®6lqqvkBqNol6|6>>w?ymzw±;~9ֱ!ӞUc u웭ygy+;zG--l6#:6^Y:vW7pu}Ni1&s;mcZAiO&:vXY?2FmL[tP.^ؘ41deLth ]V_elȎql 5ݘJW/)Zb 3ryy;fFFeefdJqswK{_ڛ9[-]Ǧ=cV_{9#6"D#WkC#\`5zEtJjcNژǃ5&Qӿvy\?FtYm]O1 49k}_ќ,Wޘt Ǥ4xg,2<1Q:2`?89vBTޔ^8m 7vlLu;7q_)^;Hanqj וٗ8\dĎ,3D\69TZ1[׉.|9Q#3?{/Æeg,ߵZ,Xjġ1}R 9lV_/{n[9qV8.^-,5X[c3"/IфDǼϸ[~zV-,㪫F-饱11Gu<4ھز|Rs9.=-[cTfpGe#4c,#|3R9\˟Z"qx^φ$EZhxgMɪB5jwO,|r֪Y6-oZH\Zf6X"՟9\_.Y[Lb-/-Y,+0Cwk9%e(Xdq>pp< [1D-;U'x,{#5%ˊV8uw̩Ο:]x>(i򅵛ˢZt\b9^nEUiN^Y4s^%9MZ_`N̼yWiSV{s &qQV3ZX*}N*/+Xzl|@gbҷ=1^~0`0^\Z_41"B[JB.%+9'3J8 -e.  ^j&kfDxbXg;3%g ^:.^[zd esƳ+,{dQ[;$~vV. cp_稴uc*,,.X!9lccƹgmAf+s!ڤ11c-Ʊyl#.$}8c9f?z$=pjuK5nn|5@U-`5V{~SWk]ɁSբ_{B=uY06 uMɉW3 fg \bW}\6'XoWi?c6]-8恳z܎)N>k`"E6)lP1ݏ5Z&2U;EyLܦm LeMsyhd?8qwBs/n-٦;0rnsY3oiS^NDهS,U![o,;5kvֳnvzĜULu5Ϲ>_8OVbط9᎚ڦ(aT"k' s \΁ ppppppppppppppppppp`CP8888888888pvOv|c_Υʹb ]L{}w9ߛo!7mwc!Ebsw bB:;~ߩY`˦kpR]nDiۧBWV]:aj$xwtG,79?iZ[w~#RwӀLw 3.ݒ&0иͦk.f"N"$ JC;yLOa3Jy*M i6<]qViibӿ& ͺY=6ii?NK=ݏ 54<V61v,^oIMr'N&Xe2M}=[g |xߚzSN ߨVG=syў?pyKZ&B䋳W7H /]eT-ZX,Ns5TT9G߶ԴNn_n"/OSC,|eoN/Vwo}#Ǟ!xózEv]\KiԜƏ\42^V9x֖I 0x7Ѽy='&J0P^h0TV(,G.ؗdFƯ~l$bYշr/981=GM8.c>n1ʜ!ز#%YȰ>7I7=Q?T_qǦy4w<"B m',DgH@/ƖxrrҼ6kYۜyI~^Ȩ]5sDxVR )iġ)eٳ@%n\'(Pj͎ФgOڤS]X6W75)#-|te ՃF{5qfъQB# %A vlP@y5 H[}8N)ϰєqKMJU,Awt!k^4~rKA3+D^%ZvgK~fj\_u G;"=2rgT9^< xM \J,}!qYh/&„W6R>]1-NuN%\/UKd\Jnj46I' %QCeQ֌Qe]زI~g=d5#VCZ`hj(2S9J<$+C8^#N YDUsmYp}%sio~ڎ.G0H~6,+s~Xc%Z0ug;tv}Zֿجh[zQbHi9dxŀ#f\e(jpKė]9cYw\FvTeg8~k$ -Wpd9oeG\W@рzx^"KU,EO R7I"'jax?9$pY%1ƏOJTwŤj6ZEjLC,iiVW!7L*=]e|^Rb91=,+x< #EmfD֡@eR>׬e:<Sm6D`M3=2*, ,WNšT2w9j<@Ya~=ncS%.ϧ֚da9y|KrD~f,CSdⲪw'I9g,al;yS^$bpN>'tR~;NkJE7a*ɶQ:=n>n{JP ?̜7϶]5ACmk/ecPsǞp#8 ܙC^8C׉8ޓSTLy9~.OZ5xKCֹO bGrxGB+,c9udl <ǎ(*#}0{)_Z[$Q$s^8a&&z+F{ę-.! 㥑mNS$vQ-7-YA"2"$r2˲f.z_A n%J!!7<@U S0zWqǘ0%/{S^>Na7j\BaR 9:JTDİβyDZYIœZxpg,(M̤k[X':e((4爞o9ڙ\+xSY-^.]#g=$Mfm^lT5FWbM=y J"ucS)=F6}93hؘO3q#NlKH4B0ʋQM/ɒc#5\ʠŃW℠7YAQŜ*l)  5ɏBW-X 1aֵ9MGkCʘq&"瑇,.A{SnƂ̱dosM}mcK͵ʤǪ1uS}IY*R G' z1/JSY%]sQBe{C9=oPLTj,OTg1rQ|a'1Y c[CxnXƛc^=b6oErro)~96g _ EamTI f'x,gjRTBYG&H3,eQ¡Q.[HBGѻQp-R67TKK^QBͭ&%:G!ꄟI^wgJ7OJV/hM1lu%iz@b˪%eg9xWLUQʥ/j0wC!9S]9]#)T뮵Dsv4PjVa]\1f]x8+ƩiGgSly5ۡH e(9R ND" MPVNO 1rRtlMALDNXG*-|&i -o.]Nw i$o nm~l8M 4ؔL^S;8UG |Kj1(3Eh6V;&%of(]ax]QYs冽́ G5~C]s6QʉX x/GtzŘxօ(_{ء0eJ_ Rk06nٮŁ;XqX; 'gI;'ЍkV^Y9^u}n7I-)m?UxyylK,1nh<\xΫ*a,RY3iT~C'sbW6)&E4(ւ>SNH~H6p1H Ib,BGO"5Mzqs b, CsJ&{٤d9od cu7HYJ\J\; AP IEdw"Dy yeE)yRl)Ns5}U7NM"N-n΃!Ǜ6|$'䝛'IH6MET9:"Vnb%xDY.źI$cDtlUNSqЅܰ$#L4/]Ԃ%R>3e|1 $mcWRJٺg+5.4)%ЬcΉ=(`䠖7Onݳ M߳%{ P8 [Q_N 'mJxI½lw]"aEnogו?}4*r0BWB?>@pE ~vx.T.]$oϳa a(pQ+5շ՚o>`?x6j4]pz>o4ۤk兗YO##gkR*E&NU<Ĝѓ8v&f&dF^ߺ*$/- _Gz^z*+BQ9aUVg[+M!'5mg8V1WK^F ‚ܱ& 6A8 WW rM|I-qgVϊI!4|Vms^}q(j1[#U&,zYMrz))U;s$[eU&5ͤmѮʢ.8^֭3(CGg<6 gtpc;H~h0KR(X[rx$C ?< E:%jPCkrzx(C3L$'6; R;*1W'˩9бk¦5zW(5DT1@.gqt0LU8ͺGyu[^A7l;׋:)RqMhÑsܑ,)}%G**. a6W|ׅjPx˻f<(OyUU< tiE&S ymHuZ*87?Oe\;7*%dTP_CR287Pƚ$01= D$-, K۶0[5{ń¦8AZ4z(riwazpLԷĢ5mƞ'K0+lyyLηcm5mvL(63f+ݘ> [ G8/#ь!'dGL1$ :) Q"9iƳDŽ=1'(El9j16W $nYlL1a}QS*t}܅fF;jGj<Ӕ:IBo!#E&R͚~tL$oTH 4wd]tT5lD5F')L'y"ýf7k-^SZ/Tzbߕ%ix*inWZT gGG)hpՏ0f&6\'Vakpmd~s5ЊM/c^9JY$xʱF'J$V{Aw$ѓ)'WcW,a%Hqtm8rY-ٚY _zLZa(6Okyj0"k[OϑqVہ5I&mL7$v1OOѸPF9'r3O6uG2//S216Ĭ[J}`^ۭfHDIP76laAך!v汎!cx ]̪  7ƛ \8P,:S C R5I׋yѾ19UVbaWd潆׻e)vh&xYҊڅHjR;9. L:R򲺚 Cs)J`BQ#,VZ m6o]aJJm9O j2B +*zCʫm쮚~xkRGQ'zCS569=)OQ ft+hֶGIS:DzƷo,=׿'ۂ_e +s^adF)Cw( .t\q+fɮ./ę(,N@5TW(sn(o1+5#3pŒ)Jc!i6WTh gCd7=/H%J +hKx\&o dk2fa3vQi]}Y 祗ptqȦV:&Zַ͐XZ_-f)&# wnm i)s\aC뮸oQ׿v#_5sj0f#|)F:A'(rɦǮuۢSKx0T.eȗOK=+(1WRS#Á](:8~ 28\1Է4s 8^WeG=n'9~$6q*eG{^WkלqUEQGt{7=tm2.z[ޠrjKE;7uU^iɡ{pUق,[ 8tmlDN E(t:թP=?:V:JEx73=s^d:dׄ1,yb8#}{"އFF."J:uv|EIDIa zc}R.~~W#Gy 'L+++{Y ,$in+?tр>^ Nlo6AVa|GA "QȇR'${r ɫr=ǀXb\h?D/'|($KM/u)R~H$#R<~`8y%bpcC$)3zh4x$lbh`ت !AkLM!w28=@FD{7LH䗄{u6op3%dY<ձ%|*΃&T^CJ~8sc,?Z79N65r!hpiF"{"JdK[s3ƚٳ()|+vs7[ǾԵck 6R4d❨&$ŚjV/ZM9kjJflUV6)(E,%5b?o9nN/)scIq@{b3)g MI4y!M/8/Cmk&B -Zܚ&%T"?&ĎcUJpg KhDJ`&Bb I&+ƻ}ՍӜ4\r佦3e2~Q+r0pkixo别ۖȱrSNHh;|!N9/*v0ŏР a쭖10b O5qIjIҐrw(oZ Mr8E.X'%`adR}8]iZUT߸yK4SYw,H<3O!?uRw4!wd%Y cz:.q?3%mD~w6U}r: jIMh'LI[WMVìF_8&q 3e'|&&٭@w6B.UoV6/rV*ܦ*4tsJ},k V`M!tTo 8SF]O"j4WrN)DyqȵO\ cURGP8AB@s'$/= EUqc^8)wK^OB_ʊ\$΋QgRFM7ȼk#OV -`g]q$>׹\Hi_ ՆFڇkLDž5[EӃNnW-1{KaG@pcHp+e/T9A:<-6 Հ 8ypXr̔|!@^dG⦾uFb-nK-9~xKyw A&yh%M^vs5Ug`WRDotiPLɞIifyb$Uƈ+*'xEAodQfuJ[(ABTtmtIv4ꑽB=r`j[z/ ,Oc2dzֺ|h[4IUG^(a̻B?llm8#WE H/ܛyW{$$h/ 蘋 {tngK-jRAj8| i \PDs=ggTՏϗrG5M@tMF^V0I90MTrQ7+37x<~ƫUm>$Lu_eϣtvN9!Ną^/u]F!:iHƫDzD9s)gX޳blAv(3&ǻTY*|hݓu -T ZS{xšj(:0]"5N1hMM#v\F۶U47֒{ɤJΓS d׈+zrPs9G^-k2<2a&߲9O}R!/_H-!Zؒ62.j[Zǐ+!w:iN4iVIN*pg{ Oa ud>RM 8YFMgif*8n-kx6%XxPiO5pCkۋ +;m̡ͩLC!aɞKP?H -' gK;Rϭ<7[(@Zqz$u/9pL>(jRt ́޳(  jˊWkK! b#J.kΜ|G VϜ 5$%W$>p ̜!ל@0*^=gVф &gQPWrOd)ëI`C#XźWnKOGyI'wwSve (0K@ 4 (Jyr|C<jg=/fJ+0D|a@yI-qXVbL V,M*~,6g@),#qg!{۲ٓr6t!@hm 6@hm6kqem,wZ]9h6̘Θcusmf~؋xFls{RàYz״1?hc^Z=Whm 6V۶n(ܼh5ed- @cmi= 6ڸ6i*v6ڸ6W&/mߒb~hlՏ0E^tm Cjm!sbқncfp6^bq]ISKCkS_5mQ.^Wsm 6ڸ69m)ѷ*˟6FphJm@#QGYYQ6ڸ6vvw _gO;is?cW#~8^ )ka\Jߪ/? gt3)͛t-qk/R?uw:>5~8z::CuǯtS:ϯ |~36c<4o>vykw>cvb8mK>e۩>Ǻ$:~fu ~k/~Os _aG9=ooWF?YKJ!Z;w·%nܯD~~cO}W_tȩ?]ީߧi&]{nG*]wSkڱYouvi=g=]Z;ݘFZfscSic;tI/_.Y_N'_׬5ZzC֫Ck{]|||N?_(_>~BA?||sr식O:'峓s ߟ?ɾ/c[|,}H\O+矗7䓾/k~V}i2.}QKr'drd3/}Ŵcϛ/K[_>O~[|dE9e[;/s_9 Hu?6}{'$tscEΏe9ѱL~>6m?'m}"{'[/m٧wvjii~(g̘2?#m|k痎OYGrwy}W?u/eY9sϘT?al뿕ʺL|ȌΑh~>/|L)ͱ;v^q.۵ue{ǟsunx86^与յϻNîwUO|ee# 3?-\_}U>6Qv>2WckuG:}շjg~|mO~/[OJu;ﯚ㋦[>9|T/}nM2ܩչ՝kut\?65U_ֿ؜V{2Sre%c5hITVTF糦OOYzVVtw~|eQ}u_e]=us#M4㧟{<}.۾_~E 9'_ܛ]cVZEey^̴qs˻{hsEdӿϛc}|7W۞gdӾG.~G_e}e3_e{r g\j|Ԇ|tMLU< c/ Ν˽Ԯ>_d{;ڇe>PNڟo-ױQ?v]2ٙkvm:ƪL+l\~vvYz]}7:Ov;u~r_61.k㦾[_ܳv,u ?˾L~Y3zh}kRI9{:mP=]5J'~PVr,B[˻)i|5]~"m.0蹩oN:7t @t~a`v~v~ؙ1ﶣr=]lLcӻ<"m?{Ox|[ۮǬW6]MTJcݯqHl{'Ӿk/꿪:?̨LQh7Կem媟uͩcuh۟첝RYs/6Nҧ,}i>_]lKv\t̿69Gk~󈟩q$;}ԉϔ|(칵znf|5^CƦ;gJsokטoI_[/s-:9v>C[[i=9S<<~A>IfO?-4>|^>kk']zT}wwnk:}gFPr]7v'SyӾ%_w8}W4sr}]h(/˘=ꚯ:u\Kf[c?1oڱt/?mXh\KrmaٵOKW3{g]C5}/Ƚ[ r[3G6'S璍vmt嵞޿h9}"5?w9V/uv폛]^I2vߐT'T|ݎs7{zgX|cH]ΑhCc: 4 4>}]r]G]w9楱e|]U>5:.ǧ~Z]]ُǔ*|;4'ac?8Q4NBrƗd~8Um]}Th<髆~T޾.Wd&c3j3l~׹''յfsj֝3V9.۬or~UUiGcm_K鿓vS탽ׯH{_ki,a7~I>ߔ>]^3hn,.#M|~J]֩oλzz1v:g4.?޵sҪ\C<<~˻<1tcQC7\UXrLk t w<7yھqA/~{W.s|PỆ޷s;>P]"zk̮_ڋrɷw9g׏2cMt> U|WMx-ItNr?y AҵzWZ_eBjk|}C9]c5LߖKƠhrM,,TWvYL߻]:LsL&S}oHrM砽gwyNxغӜ5]{r/O]ˠcB/u??v~~f:.:ΪMƼhYUWyo˵}a~fk!=9n}΍O:Ug͵zE׵ꓩM/NBR;ؿ%qy]龱S-}dOsԟǚӭ?~dZ[;7c};7:S]ʡ{}z&6Mlb&6Mlb&6Mlb&6Mlb&6Mlb&67&6Mlb&6Mlb&6Mlb&6Mlb&6Mlb6;/{OO\vty3L}axm}(ۜ~Yo sZN*yu77eWc9هu_h&M/79'Vps|ًU{69/&'ͅõSp8䪮BB*cp,߂uEziqI i Gra($lC tp)ppzikyZspHNvxݪ<%Nsx+z/aN8քYYsUs[pМKV5[ǚ\s67u׼ytw&(y(ުq免:yA9_8K5iݷPx(3P9R8G9~\-S涰gs I뿪N}{~BK6 kacs.022U]˅3  za)duȥ9{5Dz1| cd&-ÃfUN[X@Z6[-tkIm6yf5>\^vg[x6oosՁ3' X"46os Xž~;ojscgQ[6nznQfc8H{*YgF>>ڟl~c~t}+;ޟnXLX\chj?sw}?znF^.ӕ}i%?x~pui5c_sl)st1[RJʜ>ñYK_r?5:#Sڰ9X2%vJ5)>C-||9k9^j?ϯԧwڏc̵/\[\cY ן; -d3OmC94b1]?XCwv}kJoT\׭|l=]ۏJc>N?u;rcՌe1og!L?odW 7e36;ܮWp~5VCoյS֯ڱ؏}goWW|p_~t~O\c9Ԟ_?w}9s!?4&w29Ԯ9s':B[SlᜩR)6uv8L>׮.=ǟ1u`:NaPe*05j?ꃕ|h_27ܿoAM;K9dMij|W+CҿS8`ژsLY6>swlfQ==m[/ڴ\U}lfl>7Cnafn)>o枽潯ͦ\i)!%\i|˛ݿ^˛yi}ټ_oG}zi1_}lG.o6=>Ӛ,_iMן?6swnwovwwOy<={{ʰZo|~|7??5~~y̛O͗^nFm{y_ȲP|Λy_^o%^ul5O|%5 Sn,Ϩgwyۼ}o7J-mgQۆJ}5wwf;`}6<ܾwߛ헼}{ks͹msaqgvkv]iŴl?{ouuKyیÓ~-o~>k=9R~s~`'mk]Vi7۹OΣinjӋ9%{鳹C<>?ybbkb}>Wo?7ۏf;9׌ëW37^㽊zY/ݽ7y?Y;OS~3/_L;/Wo?<ho?s͘?9loܟ,kw??UNYk|]ogO7cuݳپ/o{|κ#/?m3^L;/{;kg^Mf _wu_f?syūF17zx,El7z63mm}Elyxot};?<<6͘ܛ>6l??|6%x1s%m3_ѓ{6dm3YvGv~4~sgۆuF͈od?jmod7|1{4>cmls_<4GC>uwg~`uz|ܧ?ӽ}#ݓuO~{7lk=ɓCM=Ҷgq|&26z)ٷyz2X~l>̍Γai;7'>¾;l) ?q{1oY?dAOf^3z5ǧWg2:Y{?`_ٷ|6yG?~i`9o??k=u~;s̳oy6޳љFgGZO|}1Y??xݭosgiwfn|6yml~}{5;.?~K|~v}gorFƟoF&66G# /}61g[x6g}697OY)۸5))-6fָӘ)}۹MB5mSjm3LmeD>rm[ѤoMemJp3![S*vl~1M9~lr\SbJ_LyI޾rkܸ5i[ĸ5W#ysޔ7ei&D|gBwM9{SvxkJCM.?<_M)9הޚR[SfRTw$ՔT~۔R3<ܙ%)Q3e&ugҝ)9۫)+5;Ý Aۦt;S2q`X<&L)C}xy6%/fΘPY}x4%!;$param$OMEGA_CDR_MLE[1]} to, for instance, get the estimate of dN/dS on the CDRs at the repertoire level. \item \code{trees}: List of tree objects estimated by IgPhyML. If \code{format="graph"} these are igraph \code{graph} objects. If \code{format="phylo"}, these are ape \code{phylo} objects. \item \code{command}: Command used to run IgPhyML. } } \description{ \code{readIgphyml} reads output from the IgPhyML phylogenetics inference package for B cell repertoires } \details{ \code{readIgphyml} reads output from the IgPhyML repertoire phylogenetics inference package. The resulting object is divded between parameter estimates (usually under the HLP19 model), which provide information about mutation and selection pressure operating on the sequences. Trees returned from this function are either igraph objects or phylo objects, and each may be visualized accordingly. Futher, branch lengths in tree may represent either the expected number of substitutions per site (codon, if estimated under HLP or GY94 models), or the total number of expected substitutions per site. If the latter, internal nodes - but not tips - separated by branch lengths less than 0.1 are collapsed to simplify viewing. } \examples{ \dontrun{ # Read in and plot a tree from an igphyml run library(igraph) s1 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="+7d") print(s1$param$OMEGA_CDR_MLE[1]) plot(s1$trees[[1]], layout=layout_as_tree, edge.label=E(s1$trees[[1]])$weight) } } \references{ \enumerate{ \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody Lineages. Genetics 2017 206(1):417-427 https://doi.org/10.1534/genetics.116.196303 \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - Repertoire-wide phylogenetic models of B cell molecular evolution reveal evolutionary signatures of aging and vaccination. bioRxiv 2019 https://doi.org/10.1101/558825 } } alakazam/man/phyloToGraph.Rd0000644000176200001440000000334614500351304015516 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{phyloToGraph} \alias{phyloToGraph} \title{Convert a tree in ape \code{phylo} format to igraph \code{graph} format.} \usage{ phyloToGraph(phylo, germline = "Germline") } \arguments{ \item{phylo}{An ape \code{phylo} object.} \item{germline}{If specified, places specified tip sequence as the direct ancestor of the tree} } \value{ A \code{graph} object representing the input tree. } \description{ \code{phyloToGraph} converts a tree in \code{phylo} format to and \code{graph} format. } \details{ Convert from phylo to graph object. Uses the node.label vector to label internal nodes. Nodes may rotate but overall topology will remain constant. } \examples{ \dontrun{ library(igraph) library(ape) #convert to phylo phylo = graphToPhylo(graph) #plot tree using ape plot(phylo,show.node.label=TRUE) #store as newick tree write.tree(phylo,file="tree.newick") #read in tree from newick file phylo_r = read.tree("tree.newick") #convert to igraph graph_r = phyloToGraph(phylo_r,germline="Germline") #plot graph - same as before, possibly rotated plot(graph_r,layout=layout_as_tree) } } \references{ \enumerate{ \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody Lineages. Genetics 2017 206(1):417-427 https://doi.org/10.1534/genetics.116.196303 \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - Repertoire-wide phylogenetic models of B cell molecular evolution reveal evolutionary signatures of aging and vaccination. bioRxiv 2019 https://doi.org/10.1101/558825 } } alakazam/man/plotAbundanceCurve.Rd0000644000176200001440000000412214500351304016653 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{plotAbundanceCurve} \alias{plotAbundanceCurve} \title{Plot a clonal abundance distribution} \usage{ plotAbundanceCurve( data, colors = NULL, main_title = "Rank Abundance", legend_title = NULL, xlim = NULL, ylim = NULL, annotate = c("none", "depth"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{AbundanceCurve} object returned by \link{estimateAbundance}.} \item{colors}{named character vector whose names are values in the \code{group} column of \code{data} and whose values are colors to assign to those group names.} \item{main_title}{string specifying the plot title.} \item{legend_title}{string specifying the legend title.} \item{xlim}{numeric vector of two values specifying the \code{c(lower, upper)} x-axis limits. The lower x-axis value must be >=1.} \item{ylim}{numeric vector of two values specifying the \code{c(lower, upper)} y-axis limits. The limits on the abundance values are expressed as fractions of 1: use c(0,1) to set the lower and upper limits to 0\% and 100\%.} \item{annotate}{string defining whether to added values to the group labels of the legend. When \code{"none"} (default) is specified no annotations are added. Specifying (\code{"depth"}) adds sequence counts to the labels.} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotAbundanceCurve} plots the results from estimating the complete clonal relative abundance distribution. The distribution is plotted as a log rank abundance distribution. } \examples{ # Estimate abundance by sample and plot abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) plotAbundanceCurve(abund, legend_title="Sample") } \seealso{ See \link{AbundanceCurve} for the input object and \link{estimateAbundance} for generating the input abundance distribution. Plotting is performed with \link{ggplot}. } alakazam/man/maskPositionsByQuality.Rd0000644000176200001440000000277114500351304017606 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Fastq.R \name{maskPositionsByQuality} \alias{maskPositionsByQuality} \title{Mask sequence positions with low quality} \usage{ maskPositionsByQuality( data, min_quality = 70, sequence = "sequence_alignment", quality_num = "quality_alignment_num" ) } \arguments{ \item{data}{\code{data.frame} containing sequence data.} \item{min_quality}{minimum quality score. Positions with sequencing quality less than \code{min_qual} will be masked.} \item{sequence}{column in \code{data} with sequence data to be masked.} \item{quality_num}{column in \code{data} with quality scores (a string of numeric values, comma separated) that can be used to mask \code{sequence}.} } \value{ Modified \code{data} data.frame with an additional field containing quality masked sequences. The name of this field is created concatenating the \code{sequence} name and \code{"_masked"}. } \description{ \code{maskPositionsByQuality} will replace positions that have a sequencing quality score lower that \code{min_quality} with an \code{"N"} character. } \examples{ db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") db <- readFastqDb(db, fastq_file, quality_offset=-33) maskPositionsByQuality(db, min_quality=90, quality_num="quality_alignment_num") } \seealso{ \link{readFastqDb} and \link{getPositionQuality} } alakazam/man/sortGenes.Rd0000644000176200001440000000256214500351304015046 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Gene.R \name{sortGenes} \alias{sortGenes} \title{Sort V(D)J genes} \usage{ sortGenes(genes, method = c("name", "position")) } \arguments{ \item{genes}{vector of strings respresenting V(D)J gene names.} \item{method}{string defining the method to use for sorting genes. One of: \itemize{ \item \code{"name"}: sort in lexicographic order. Order is by family first, then gene, and then allele. \item \code{"position"}: sort by position in the locus, as determined by the final two numbers in the gene name. Non-localized genes are assigned to the highest positions. }} } \value{ A sorted character vector of gene names. } \description{ \code{sortGenes} sorts a vector of V(D)J gene names by either lexicographic ordering or locus position. } \examples{ # Create a list of allele names genes <- c("IGHV1-69D*01","IGHV1-69*01","IGHV4-38-2*01","IGHV1-69-2*01", "IGHV2-5*01","IGHV1-NL1*01", "IGHV1-2*01,IGHV1-2*05", "IGHV1-2", "IGHV1-2*02", "IGHV1-69*02") # Sort genes by name sortGenes(genes) # Sort genes by position in the locus sortGenes(genes, method="pos") } \seealso{ See \code{getAllele}, \code{getGene} and \code{getFamily} for parsing gene names. } alakazam/man/tableEdges.Rd0000644000176200001440000000352414500351305015134 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{tableEdges} \alias{tableEdges} \title{Tabulate the number of edges between annotations within a lineage tree} \usage{ tableEdges(graph, field, indirect = FALSE, exclude = NULL) } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{field}{string defining the annotation field to count.} \item{indirect}{if \code{FALSE} count direct connections (edges) only. If \code{TRUE} walk through any nodes with annotations specified in the \code{argument} to count indirect connections. Specifying \code{indirect=TRUE} with \code{exclude=NULL} will have no effect.} \item{exclude}{vector of strings defining \code{field} values to exclude from counts. Edges that either start or end with the specified annotations will not be counted. If \code{NULL} count all edges.} } \value{ A data.frame defining total annotation connections in the tree with columns: \itemize{ \item \code{parent}: parent annotation \item \code{child}: child annotation \item \code{count}: count of edges for the parent-child relationship } } \description{ \code{tableEdges} creates a table of the total number of connections (edges) for each unique pair of annotations within a tree over all nodes. } \examples{ # Define example graph graph <- ExampleTrees[[23]] # Count direct edges between isotypes including inferred nodes tableEdges(graph, "c_call") # Count direct edges excluding edges to and from germline and inferred nodes tableEdges(graph, "c_call", exclude=c("Germline", NA)) # Count indirect edges walking through germline and inferred nodes tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) } \seealso{ See \link{testEdges} for performed a permutation test on edge relationships. } alakazam/man/polar.Rd0000644000176200001440000000255014500351304014207 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{polar} \alias{polar} \title{Calculates the average polarity of amino acid sequences} \usage{ polar(seq, polarity = NULL) } \arguments{ \item{seq}{vector of strings containing amino acid sequences.} \item{polarity}{named numerical vector defining polarity scores for each amino acid, where names are single-letter amino acid character codes. If \code{NULL}, then the Grantham, 1974 scale is used.} } \value{ A vector of bulkiness scores for the sequence(s). } \description{ \code{polar} calculates the average polarity score of amino acid sequences. Non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. } \examples{ # Default scale seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") polar(seq) # Use the Zimmerman et al, 1968 polarity scale from the seqinr package library(seqinr) data(aaindex) x <- aaindex[["ZIMJ680103"]]$I # Rename the score vector to use single-letter codes names(x) <- translateStrings(names(x), ABBREV_AA) # Calculate polarity polar(seq, polarity=x) } \references{ \enumerate{ \item Grantham R. Amino acid difference formula to help explain protein evolution. Science 185, 862-864 (1974). } } \seealso{ For additional size related indices see \code{\link[seqinr]{aaindex}}. } alakazam/man/IMGT_REGIONS.Rd0000644000176200001440000000132014500351304015012 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{IMGT_REGIONS} \alias{IMGT_REGIONS} \title{IMGT V-segment regions} \format{ A list with regions named one of \code{c("fwr1", "cdr1", "fwr2", "cdr2", "fwr3")} with values containing a numeric vector of length two defining the \code{c(start, end)} positions of the named region. } \usage{ IMGT_REGIONS } \description{ A list defining the boundaries of V-segment framework regions (FWRs) and complementarity determining regions (CDRs) for IMGT-gapped immunoglobulin (Ig) nucleotide sequences according to the IMGT numbering scheme. } \references{ \url{https://www.imgt.org/} } \keyword{datasets} alakazam/man/getPathLengths.Rd0000644000176200001440000000261114500351305016012 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{getPathLengths} \alias{getPathLengths} \title{Calculate path lengths from the tree root} \usage{ getPathLengths(graph, root = "Germline", field = NULL, exclude = NULL) } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{root}{name of the root (germline) node.} \item{field}{annotation field to use for exclusion of nodes from step count.} \item{exclude}{annotation values specifying which nodes to exclude from step count. If \code{NULL} consider all nodes. This does not affect the weighted (distance) path length calculation.} } \value{ A data.frame with columns: \itemize{ \item \code{name}: node name \item \code{steps}: path length as the number of nodes traversed \item \code{distance}: path length as the sum of edge weights } } \description{ \code{getPathLengths} calculates the unweighted (number of steps) and weighted (distance) path lengths from the root of a lineage tree. } \examples{ # Define example graph graph <- ExampleTrees[[24]] # Consider all nodes getPathLengths(graph, root="Germline") # Exclude nodes without an isotype annotation from step count getPathLengths(graph, root="Germline", field="c_call", exclude=NA) } \seealso{ See \link{buildPhylipLineage} for generating input trees. } alakazam/man/testDiversity.Rd0000644000176200001440000001101514500351304015750 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Deprecated.R \name{testDiversity} \alias{testDiversity} \title{Pairwise test of the diversity index} \usage{ testDiversity( data, q, group, clone = "CLONE", copy = NULL, min_n = 30, max_n = NULL, nboot = 2000, progress = FALSE, ci = 0.95 ) } \arguments{ \item{data}{data.frame with Change-O style columns containing clonal assignments.} \item{q}{diversity order to test.} \item{group}{name of the \code{data} column containing group identifiers.} \item{clone}{name of the \code{data} column containing clone identifiers.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If \code{copy=NULL} (the default), then clone abundance is determined by the number of sequences. If a \code{copy} column is specified, then clone abundances is determined by the sum of copy numbers within each clonal group.} \item{min_n}{minimum number of observations to sample. A group with less observations than the minimum is excluded.} \item{max_n}{maximum number of observations to sample. If \code{NULL} the maximum if automatically determined from the size of the largest group.} \item{nboot}{number of bootstrap realizations to perform.} \item{progress}{if \code{TRUE} show a progress bar.} \item{ci}{confidence interval to calculate; the value must be between 0 and 1.} } \value{ A \link{DiversityCurve} object containing slot test with p-values and summary statistics. } \description{ \code{testDiversity} performs pairwise significance tests of the diversity index (\eqn{D}) at a given diversity order (\eqn{q}) for a set of annotation groups via rarefaction and bootstrapping. } \details{ Clonal diversity is calculated using the generalized diversity index proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. Diversity is calculated on the estimated complete clonal abundance distribution. This distribution is inferred by using the Chao1 estimator to estimate the number of seen clones, and applying the relative abundance correction and unseen clone frequency described in Chao et al, 2014. Variability in total sequence counts across unique values in the \code{group} column is corrected by repeated resampling from the estimated complete clonal distribution to a common number of sequences. The diversity index estimate (\eqn{D}) for each group is the mean value of over all bootstrap realizations. Significance of the difference in diversity index (\eqn{D}) between groups is tested by constructing a bootstrap delta distribution for each pair of unique values in the \code{group} column. The bootstrap delta distribution is built by subtracting the diversity index \eqn{Da} in \eqn{group-a} from the corresponding value \eqn{Db} in \eqn{group-b}, for all bootstrap realizations, yeilding a distribution of \code{nboot} total deltas; where \eqn{group-a} is the group with the greater mean \eqn{D}. The p-value for hypothesis \eqn{Da != Db} is the value of \eqn{P(0)} from the empirical cumulative distribution function of the bootstrap delta distribution, multiplied by 2 for the two-tailed correction. } \note{ This method may inflate statistical significance when clone sizes are uniformly small, such as when most clones sizes are 1, sample size is small, and \code{max_n} is near the total count of the smallest data group. Use caution when interpreting the results in such cases. We are currently investigating this potential problem. } \examples{ \dontrun{ # Groups under the size threshold are excluded and a warning message is issued. testDiversity(ExampleDb, "sample_id", q=0, min_n=30, nboot=100) } } \references{ \enumerate{ \item Hill M. Diversity and evenness: a unifying notation and its consequences. Ecology. 1973 54(2):427-32. \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Wu Y-CB, et al. Influence of seasonal exposure to grass pollen on local and peripheral blood IgE repertoires in patients with allergic rhinitis. J Allergy Clin Immunol. 2014 134(3):604-12. \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ \link{alphaDiversity} } alakazam/man/ExampleDbChangeo.Rd0000644000176200001440000000373414500351304016225 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{ExampleDbChangeo} \alias{ExampleDbChangeo} \title{Example Change-O database} \format{ A data.frame with the following Change-O style columns: \itemize{ \item \code{SEQUENCE_ID}: Sequence identifier \item \code{SEQUENCE_IMGT}: IMGT-gapped observed sequence. \item \code{GERMLINE_IMGT_D_MASK}: IMGT-gapped germline sequence with N, P and D regions masked. \item \code{V_CALL}: V region allele assignments. \item \code{V_CALL_GENOTYPED}: TIgGER corrected V region allele assignment. \item \code{D_CALL}: D region allele assignments. \item \code{J_CALL}: J region allele assignments. \item \code{JUNCTION}: Junction region sequence. \item \code{JUNCTION_LENGTH}: Length of the junction region in nucleotides. \item \code{NP1_LENGTH}: Combined length of the N and P regions proximal to the V region. \item \code{NP2_LENGTH}: Combined length of the N and P regions proximal to the J region. \item \code{SAMPLE}: Sample identifier. Time in relation to vaccination. \item \code{ISOTYPE}: Isotype assignment. \item \code{DUPCOUNT}: Copy count (number of duplicates) of the sequence. \item \code{CLONE}: Change-O assignment clonal group identifier. } } \usage{ ExampleDbChangeo } \description{ A small example database subset from Laserson and Vigneault et al, 2014. } \references{ \enumerate{ \item Laserson U and Vigneault F, et al. High-resolution antibody dynamics of vaccine-induced immune responses. Proc Natl Acad Sci USA. 2014 111:4928-33. } } \seealso{ \link{ExampleDb} \link{ExampleTrees} } \keyword{datasets} alakazam/man/translateDNA.Rd0000644000176200001440000000154614500351305015417 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{translateDNA} \alias{translateDNA} \title{Translate nucleotide sequences to amino acids} \usage{ translateDNA(seq, trim = FALSE) } \arguments{ \item{seq}{vector of strings defining DNA sequence(s) to be converted to translated.} \item{trim}{boolean flag to remove 3 nts from both ends of seq (converts IMGT junction to CDR3 region).} } \value{ A vector of translated sequence strings. } \description{ \code{translateDNA} translates nucleotide sequences to amino acid sequences. } \examples{ # Translate a single sequence translateDNA("ACTGACTCGA") # Translate a vector of sequences translateDNA(ExampleDb$junction[1:3]) # Remove the first and last codon from the translation translateDNA(ExampleDb$junction[1:3], trim=TRUE) } \seealso{ \code{\link[seqinr]{translate}}. } alakazam/man/buildPhylipLineage.Rd0000644000176200001440000001752114500351304016650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{buildPhylipLineage} \alias{buildPhylipLineage} \title{Infer an Ig lineage using PHYLIP} \usage{ buildPhylipLineage( clone, phylip_exec, dist_mat = getDNAMatrix(gap = 0), rm_temp = FALSE, verbose = FALSE, temp_path = NULL, onetree = FALSE, branch_length = c("mutations", "distance") ) } \arguments{ \item{clone}{\link{ChangeoClone} object containing clone data.} \item{phylip_exec}{absolute path to the PHYLIP dnapars executable.} \item{dist_mat}{character distance matrix to use for reassigning edge weights. Defaults to a Hamming distance matrix returned by \link{getDNAMatrix} with \code{gap=0}. If gap characters, \code{c("-", ".")}, are assigned a value of -1 in \code{dist_mat} then contiguous gaps of any run length, which are not present in both sequences, will be counted as a distance of 1. Meaning, indels of any length will increase the sequence distance by 1. Gap values other than -1 will return a distance that does not consider indels as a special case.} \item{rm_temp}{if \code{TRUE} delete the temporary directory after running dnapars; if \code{FALSE} keep the temporary directory.} \item{verbose}{if \code{FALSE} suppress the output of dnapars; if \code{TRUE} STDOUT and STDERR of dnapars will be passed to the console.} \item{temp_path}{specific path to temp directory if desired.} \item{onetree}{if \code{TRUE} save only one tree.} \item{branch_length}{specifies how to define branch lengths; one of \code{"mutations"} or \code{"distance"}. If set to \code{"mutations"} (default), then branch lengths represent the number of mutations between nodes. If set to \code{"distance"}, then branch lengths represent the expected number of mutations per site, unaltered from PHYLIP output.} } \value{ An igraph \code{graph} object defining the Ig lineage tree. Each unique input sequence in \code{clone} is a vertex of the tree, with additional vertices being either the germline (root) sequences or inferred intermediates. The \code{graph} object has the following attributes. Vertex attributes: \itemize{ \item \code{name}: value in the \code{sequence_id} column of the \code{data} slot of the input \code{clone} for observed sequences. The germline (root) vertex is assigned the name "Germline" and inferred intermediates are assigned names with the format {"Inferred1", "Inferred2", ...}. \item \code{sequence}: value in the \code{sequence} column of the \code{data} slot of the input \code{clone} for observed sequences. The germline (root) vertex is assigned the sequence in the \code{germline} slot of the input \code{clone}. The sequence of inferred intermediates are extracted from the dnapars output. \item \code{label}: same as the \code{name} attribute. } Additionally, each other column in the \code{data} slot of the input \code{clone} is added as a vertex attribute with the attribute name set to the source column name. For the germline and inferred intermediate vertices, these additional vertex attributes are all assigned a value of \code{NA}. Edge attributes: \itemize{ \item \code{weight}: Hamming distance between the \code{sequence} attributes of the two vertices. \item \code{label}: same as the \code{weight} attribute. } Graph attributes: \itemize{ \item \code{clone}: clone identifier from the \code{clone} slot of the input \code{ChangeoClone}. \item \code{v_gene}: V-segment gene call from the \code{v_gene} slot of the input \code{ChangeoClone}. \item \code{j_gene}: J-segment gene call from the \code{j_gene} slot of the input \code{ChangeoClone}. \item \code{junc_len}: junction length (nucleotide count) from the \code{junc_len} slot of the input \code{ChangeoClone}. Alternatively, this function will return an \code{phylo} object, which is compatible with the ape package. This object will contain reconstructed ancestral sequences in \code{nodes} attribute. } } \description{ \code{buildPhylipLineage} reconstructs an Ig lineage via maximum parsimony using the dnapars application, or maximum liklihood using the dnaml application of the PHYLIP package. } \details{ \code{buildPhylipLineage} builds the lineage tree of a set of unique Ig sequences via maximum parsimony through an external call to the dnapars application of the PHYLIP package. dnapars is called with default algorithm options, except for the search option, which is set to "Rearrange on one best tree". The germline sequence of the clone is used for the outgroup. Following tree construction using dnapars, the dnapars output is modified to allow input sequences to appear as internal nodes of the tree. Intermediate sequences inferred by dnapars are replaced by children within the tree having a Hamming distance of zero from their parent node. With the default \code{dist_mat}, the distance calculation allows IUPAC ambiguous character matches, where an ambiguous character has distance zero to any character in the set of characters it represents. Distance calculation and movement of child nodes up the tree is repeated until all parent-child pairs have a distance greater than zero between them. The germline sequence (outgroup) is moved to the root of the tree and excluded from the node replacement processes, which permits the trunk of the tree to be the only edge with a distance of zero. Edge weights of the resultant tree are assigned as the distance between each sequence. } \examples{ \dontrun{ # Preprocess clone db <- subset(ExampleDb, clone_id == 3138) clone <- makeChangeoClone(db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count") # Run PHYLIP and process output phylip_exec <- "~/apps/phylip-3.695/bin/dnapars" graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) # Plot graph with a tree layout library(igraph) plot(graph, layout=layout_as_tree, vertex.label=V(graph)$c_call, vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") # To consider each indel event as a mutation, change the masking character # and distance matrix clone <- makeChangeoClone(db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count", mask_char="-") graph <- buildPhylipLineage(clone, phylip_exec, dist_mat=getDNAMatrix(gap=-1), rm_temp=TRUE) } } \references{ \enumerate{ \item Felsenstein J. PHYLIP - Phylogeny Inference Package (Version 3.2). Cladistics. 1989 5:164-166. \item Stern JNH, Yaari G, Vander Heiden JA, et al. B cells populating the multiple sclerosis brain mature in the draining cervical lymph nodes. Sci Transl Med. 2014 6(248):248ra107. } } \seealso{ Takes as input a \link{ChangeoClone}. Temporary directories are created with \link{makeTempDir}. Distance is calculated using \link{seqDist}. See [igraph](http://www.rdocumentation.org/packages/igraph/topics/aaa-igraph-package) and [igraph.plotting](http://www.rdocumentation.org/packages/igraph/topics/plot.common) for working with igraph \code{graph} objects. } alakazam/man/plotEdgeTest.Rd0000644000176200001440000000331714500361511015500 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{plotEdgeTest} \alias{plotEdgeTest} \title{Plot the results of an edge permutation test} \usage{ plotEdgeTest( data, color = "black", main_title = "Edge Test", style = c("histogram", "cdf"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{EdgeTest} object returned by \link{testEdges}.} \item{color}{color of the histogram or lines.} \item{main_title}{string specifying the plot title.} \item{style}{type of plot to draw. One of: \itemize{ \item \code{"histogram"}: histogram of the edge count distribution with a red dotted line denoting the observed value. \item \code{"cdf"}: cumulative distribution function of edge counts with a red dotted line denoting the observed value and a blue dotted line indicating the p-value. }} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotEdgeTest} plots the results of an edge permutation test performed with \code{testEdges} as either a histogram or cumulative distribution function. } \examples{ \donttest{ # Define example tree set graphs <- ExampleTrees[6:10] # Perform edge test on isotypes x <- testEdges(graphs, "c_call", nperm=6) # Plot plotEdgeTest(x, color="steelblue", style="hist") plotEdgeTest(x, style="cdf") } } \seealso{ See \link{testEdges} for performing the test. } alakazam/man/collapseDuplicates.Rd0000644000176200001440000001465114500351305016720 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{collapseDuplicates} \alias{collapseDuplicates} \title{Remove duplicate DNA sequences and combine annotations} \usage{ collapseDuplicates( data, id = "sequence_id", seq = "sequence_alignment", text_fields = NULL, num_fields = NULL, seq_fields = NULL, add_count = FALSE, ignore = c("N", "-", ".", "?"), sep = ",", dry = FALSE, verbose = FALSE ) } \arguments{ \item{data}{data.frame containing Change-O columns. The data.frame must contain, at a minimum, a unique identifier column and a column containg a character vector of DNA sequences.} \item{id}{name of the column containing sequence identifiers.} \item{seq}{name of the column containing DNA sequences.} \item{text_fields}{character vector of textual columns to collapse. The textual annotations of duplicate sequences will be merged into a single string with each unique value alphabetized and delimited by \code{sep}.} \item{num_fields}{vector of numeric columns to collapse. The numeric annotations of duplicate sequences will be summed.} \item{seq_fields}{vector of nucletoide sequence columns to collapse. The sequence with the fewest numer of non-informative characters will be retained. Where a non-informative character is one of \code{c("N", "-", ".", "?")}. Note, this is distinct from the \code{seq} parameter which is used to determine duplicates.} \item{add_count}{if \code{TRUE} add the column \code{collpase_count} that indicates the number of sequences that were collapsed to build each unique entry.} \item{ignore}{vector of characters to ignore when testing for equality.} \item{sep}{character to use for delimiting collapsed annotations in the \code{text_fields} columns. Defines both the input and output delimiter.} \item{dry}{if \code{TRUE} perform dry run. Only labels the sequences without collapsing them.} \item{verbose}{if \code{TRUE} report the number input, discarded and output sequences; if \code{FALSE} process sequences silently.} } \value{ A modified \code{data} data.frame with duplicate sequences removed and annotation fields collapsed if \code{dry=FALSE}. If \code{dry=TRUE}, sequences will be labeled with the collapse action, but the input will be otherwise unmodifed (see Details). } \description{ \code{collapseDuplicates} identifies duplicate DNA sequences, allowing for ambiguous characters, removes the duplicate entries, and combines any associated annotations. } \details{ \code{collapseDuplicates} identifies duplicate sequences in the \code{seq} column by testing for character identity, with consideration of IUPAC ambiguous nucleotide codes. A cluster of sequences are considered duplicates if they are all equivalent, and no member of the cluster is equivalent to a sequence in a different cluster. Textual annotations, specified by \code{text_fields}, are collapsed by taking the unique set of values within in each duplicate cluster and delimiting those values by \code{sep}. Numeric annotations, specified by \code{num_fields}, are collapsed by summing all values in the duplicate cluster. Sequence annotations, specified by \code{seq_fields}, are collapsed by retaining the first sequence with the fewest number of N characters. Columns that are not specified in either \code{text_fields}, \code{num_fields}, or \code{seq_fields} will be retained, but the value will be chosen from a random entry amongst all sequences in a cluster of duplicates. An ambiguous sequence is one that can be assigned to two different clusters, wherein the ambiguous sequence is equivalent to two sequences which are themselves non-equivalent. Ambiguous sequences arise due to ambiguous characters at positions that vary across sequences, and are discarded along with their annotations when \code{dry=FALSE}. Thus, ambiguous sequences are removed as duplicates of some sequence, but do not create a potential false-positive annotation merger. Ambiguous sequences are not included in the \code{collapse_count} annotation that is added when \code{add_count=TRUE}. If \code{dry=TRUE} sequences will not be removed from the input. Instead, the following columns will be appended to the input defining the collapse action that would have been performed in the \code{dry=FALSE} case. \itemize{ \item \code{collapse_id}: an identifer for the group of identical sequences. \item \code{collapse_class}: string defining how the sequence matches to the other in the set. one of \code{"duplicated"} (has duplicates), \code{"unique"} (no duplicates), \code{"ambiguous_duplicate"} (no duplicates after ambiguous sequences are removed), or \code{"ambiguous"} (matches multiple non-duplicate sequences). \item \code{collapse_pass}: \code{TRUE} for the sequences that would be retained. } } \examples{ # Example data.frame db <- data.frame(sequence_id=LETTERS[1:4], sequence_alignment=c("CCCCTGGG", "CCCCTGGN", "NAACTGGN", "NNNCTGNN"), c_call=c("IGHM", "IGHG", "IGHG", "IGHA"), sample_id=c("S1", "S1", "S2", "S2"), duplicate_count=1:4, stringsAsFactors=FALSE) # Annotations are not parsed if neither text_fields nor num_fields is specified # The retained sequence annotations will be random collapseDuplicates(db, verbose=TRUE) # Unique text_fields annotations are combined into a single string with "," # num_fields annotations are summed # Ambiguous duplicates are discarded collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", verbose=TRUE) # Use alternate delimiter for collapsing textual annotations collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", sep="/", verbose=TRUE) # Add count of duplicates collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", add_count=TRUE, verbose=TRUE) # Masking ragged ends may impact duplicate removal db$sequence_alignment <- maskSeqEnds(db$sequence_alignment) collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", add_count=TRUE, verbose=TRUE) } \seealso{ Equality is tested with \link{seqEqual} and \link{pairwiseEqual}. For IUPAC ambiguous character codes see \link{IUPAC_DNA}. } alakazam/man/plotDiversityTest.Rd0000644000176200001440000000375014500351304016616 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{plotDiversityTest} \alias{plotDiversityTest} \title{Plot the results of diversity testing} \usage{ plotDiversityTest( data, q, colors = NULL, main_title = "Diversity", legend_title = "Group", log_d = FALSE, annotate = c("none", "depth"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{DiversityCurve} object returned by \link{alphaDiversity}.} \item{q}{diversity order to plot the test for.} \item{colors}{named character vector whose names are values in the \code{group} column of the \code{data} slot of \code{data}, and whose values are colors to assign to those group names.} \item{main_title}{string specifying the plot title.} \item{legend_title}{string specifying the legend title.} \item{log_d}{if \code{TRUE} then plot the diversity scores \eqn{D} on a log scale; if \code{FALSE} plot on a linear scale.} \item{annotate}{string defining whether to added values to the group labels of the legend. When \code{"none"} (default) is specified no annotations are added. Specifying (\code{"depth"}) adds sequence counts to the labels.} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotDiversityTest} plots summary data for a \code{DiversityCurve} object with mean and a line range indicating plus/minus one standard deviation. } \examples{ # Calculate diversity div <- alphaDiversity(ExampleDb, group="sample_id", min_q=0, max_q=2, step_q=1, nboot=100) # Plot results at q=0 (equivalent to species richness) plotDiversityTest(div, 0, legend_title="Sample") # Plot results at q=2 (equivalent to Simpson's index) plotDiversityTest(div, q=2, legend_title="Sample") } \seealso{ See \link{alphaDiversity} for generating input. Plotting is performed with \link{ggplot}. } alakazam/man/ABBREV_AA.Rd0000644000176200001440000000072614500351304014377 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{ABBREV_AA} \alias{ABBREV_AA} \title{Amino acid abbreviation translations} \format{ Named character vector defining single-letter character codes to three-letter abbreviation mappings. } \usage{ ABBREV_AA } \description{ Mappings of amino acid abbreviations. } \examples{ aa <- c("Ala", "Ile", "Trp") translateStrings(aa, ABBREV_AA) } \keyword{datasets} alakazam/man/pairwiseEqual.Rd0000644000176200001440000000167614500351305015716 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/RcppExports.R \name{pairwiseEqual} \alias{pairwiseEqual} \title{Calculate pairwise equivalence between sequences} \usage{ pairwiseEqual(seq) } \arguments{ \item{seq}{character vector containing a DNA sequences.} } \value{ A logical matrix of equivalence between each entry in \code{seq}. Values are \code{TRUE} when sequences are equivalent and \code{FALSE} when they are not. } \description{ \code{pairwiseEqual} determined pairwise equivalence between a pairs in a set of sequences, excluding ambiguous positions (Ns and gaps). } \examples{ # Gaps and Ns will match any character seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C", E="NTGGG") d <- pairwiseEqual(seq) rownames(d) <- colnames(d) <- seq d } \seealso{ Uses \link{seqEqual} for testing equivalence between pairs. See \link{pairwiseDist} for generating a sequence distance matrix. } alakazam/man/getDNAMatrix.Rd0000644000176200001440000000200114500351305015351 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{getDNAMatrix} \alias{getDNAMatrix} \title{Build a DNA distance matrix} \usage{ getDNAMatrix(gap = -1) } \arguments{ \item{gap}{value to assign to characters in the set \code{c("-", ".")}.} } \value{ A \code{matrix} of DNA character distances with row and column names indicating the character pair. By default, distances will be either 0 (equivalent), 1 (non-equivalent or missing), or -1 (gap). } \description{ \code{getDNAMatrix} returns a Hamming distance matrix for IUPAC ambiguous DNA characters with modifications for gap, \code{c("-", ".")}, and missing, \code{c("?")}, character values. } \examples{ # Set gap characters to Inf distance # Distinguishes gaps from Ns getDNAMatrix() # Set gap characters to 0 distance # Makes gap characters equivalent to Ns getDNAMatrix(gap=0) } \seealso{ Creates DNA distance matrix for \link{seqDist}. See \link{getAAMatrix} for amino acid distances. } alakazam/man/calcDiversity.Rd0000644000176200001440000000346614500351304015706 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{calcDiversity} \alias{calcDiversity} \title{Calculate the diversity index} \usage{ calcDiversity(p, q) } \arguments{ \item{p}{numeric vector of clone (species) counts or proportions.} \item{q}{numeric vector of diversity orders.} } \value{ A vector of diversity scores \eqn{D} for each \eqn{q}. } \description{ \code{calcDiversity} calculates the clonal diversity index for a vector of diversity orders. } \details{ This method, proposed by Hill (Hill, 1973), quantifies diversity as a smooth function (\eqn{D}) of a single parameter \eqn{q}. Special cases of the generalized diversity index correspond to the most popular diversity measures in ecology: species richness (\eqn{q = 0}), the exponential of the Shannon-Weiner index (\eqn{q} approaches \eqn{1}), the inverse of the Simpson index (\eqn{q = 2}), and the reciprocal abundance of the largest clone (\eqn{q} approaches \eqn{+\infty}). At \eqn{q = 0} different clones weight equally, regardless of their size. As the parameter \eqn{q} increase from \eqn{0} to \eqn{+\infty} the diversity index (\eqn{D}) depends less on rare clones and more on common (abundant) ones, thus encompassing a range of definitions that can be visualized as a single curve. Values of \eqn{q < 0} are valid, but are generally not meaningful. The value of \eqn{D} at \eqn{q=1} is estimated by \eqn{D} at \eqn{q=0.9999}. } \examples{ # May define p as clonal member counts p <- c(1, 1, 3, 10) q <- c(0, 1, 2) calcDiversity(p, q) # Or proportional abundance p <- c(1/15, 1/15, 1/5, 2/3) calcDiversity(p, q) } \references{ \enumerate{ \item Hill M. Diversity and evenness: a unifying notation and its consequences. Ecology. 1973 54(2):427-32. } } \seealso{ Used by \link{alphaDiversity}. } alakazam/man/pairwiseDist.Rd0000644000176200001440000000347014500351305015544 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{pairwiseDist} \alias{pairwiseDist} \title{Calculate pairwise distances between sequences} \usage{ pairwiseDist(seq, dist_mat = getDNAMatrix()) } \arguments{ \item{seq}{character vector containing a DNA sequences.} \item{dist_mat}{Character distance matrix. Defaults to a Hamming distance matrix returned by \link{getDNAMatrix}. If gap characters, \code{c("-", ".")}, are assigned a value of -1 in \code{dist_mat} then contiguous gaps of any run length, which are not present in both sequences, will be counted as a distance of 1. Meaning, indels of any length will increase the sequence distance by 1. Gap values other than -1 will return a distance that does not consider indels as a special case.} } \value{ A matrix of numerical distance between each entry in \code{seq}. If \code{seq} is a named vector, row and columns names will be added accordingly. Amino acid distance matrix may be built with \link{getAAMatrix}. Uses \link{seqDist} for calculating distances between pairs. See \link{pairwiseEqual} for generating an equivalence matrix. } \description{ \code{pairwiseDist} calculates all pairwise distance between a set of sequences. } \examples{ # Gaps will be treated as Ns with a gap=0 distance matrix pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), dist_mat=getDNAMatrix(gap=0)) # Gaps will be treated as universally non-matching characters with gap=1 pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), dist_mat=getDNAMatrix(gap=1)) # Gaps of any length will be treated as single mismatches with a gap=-1 distance matrix pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), dist_mat=getDNAMatrix(gap=-1)) } alakazam/man/alphaDiversity.Rd0000644000176200001440000001060414500351304016061 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{alphaDiversity} \alias{alphaDiversity} \title{Calculate clonal alpha diversity} \usage{ alphaDiversity(data, min_q = 0, max_q = 4, step_q = 0.1, ci = 0.95, ...) } \arguments{ \item{data}{data.frame with Change-O style columns containing clonal assignments or a \link{AbundanceCurve} generate by \link{estimateAbundance} object containing a previously calculated bootstrap distributions of clonal abundance.} \item{min_q}{minimum value of \eqn{q}.} \item{max_q}{maximum value of \eqn{q}.} \item{step_q}{value by which to increment \eqn{q}.} \item{ci}{confidence interval to calculate; the value must be between 0 and 1.} \item{...}{additional arguments to pass to \link{estimateAbundance}. Additional arguments are ignored if a \link{AbundanceCurve} is provided as input.} } \value{ A \link{DiversityCurve} object summarizing the diversity scores. } \description{ \code{alphaDiversity} takes in a data.frame or \link{AbundanceCurve} and computes diversity scores (\eqn{D}) over an interval of diversity orders (\eqn{q}). } \details{ Clonal diversity is calculated using the generalized diversity index (Hill numbers) proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. To generate a smooth curve, \eqn{D} is calculated for each value of \eqn{q} from \code{min_q} to \code{max_q} incremented by \code{step_q}. When \code{uniform=TRUE} variability in total sequence counts across unique values in the \code{group} column is corrected by repeated resampling from the estimated complete clonal distribution to a common number of sequences. The complete clonal abundance distribution that is resampled from is inferred by using the Chao1 estimator to infer the number of unseen clones, followed by applying the relative abundance correction and unseen clone frequencies described in Chao et al, 2015. The diversity index (\eqn{D}) for each group is the mean value of over all resampling realizations. Confidence intervals are derived using the standard deviation of the resampling realizations, as described in Chao et al, 2015. Significance of the difference in diversity index (\code{D}) between groups is tested by constructing a bootstrap delta distribution for each pair of unique values in the \code{group} column. The bootstrap delta distribution is built by subtracting the diversity index \code{Da} in group \code{a} from the corresponding value \eqn{Db} in group \code{b}, for all bootstrap realizations, yielding a distribution of \code{nboot} total deltas; where group \code{a} is the group with the greater mean \code{D}. The p-value for hypothesis \code{Da != Db} is the value of \code{P(0)} from the empirical cumulative distribution function of the bootstrap delta distribution, multiplied by 2 for the two-tailed correction. Note, this method may inflate statistical significance when clone sizes are uniformly small, such as when most clones sizes are 1, sample size is small, and \code{max_n} is near the total count of the smallest data group. Use caution when interpreting the results in such cases. } \examples{ # Group by sample identifier in two steps abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) div <- alphaDiversity(abund, step_q=1, max_q=10) plotDiversityCurve(div, legend_title="Sample") # Grouping by isotype rather than sample identifier in one step div <- alphaDiversity(ExampleDb, group="c_call", min_n=40, step_q=1, max_q=10, nboot=100) plotDiversityCurve(div, legend_title="Isotype") } \references{ \enumerate{ \item Hill M. Diversity and evenness: a unifying notation and its consequences. Ecology. 1973 54(2):427-32. \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ See \link{calcDiversity} for the basic calculation and \link{DiversityCurve} for the return object. See \link{plotDiversityCurve} for plotting the return object. } alakazam/man/permuteLabels.Rd0000644000176200001440000000207014500351305015674 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{permuteLabels} \alias{permuteLabels} \title{Permute the node labels of a tree} \usage{ permuteLabels(graph, field, exclude = c("Germline", NA)) } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{field}{string defining the annotation field to permute.} \item{exclude}{vector of strings defining \code{field} values to exclude from permutation.} } \value{ A modified igraph object with vertex annotations permuted. } \description{ \code{permuteLabels} permutes the node annotations of a lineage tree. } \examples{ # Define and plot example graph library(igraph) graph <- ExampleTrees[[23]] plot(graph, layout=layout_as_tree, vertex.label=V(graph)$c_call, vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") # Permute annotations and plot new tree g <- permuteLabels(graph, "c_call") plot(g, layout=layout_as_tree, vertex.label=V(g)$c_call, vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") } \seealso{ \link{testEdges}. } alakazam/man/makeChangeoClone.Rd0000644000176200001440000001426314500351304016261 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{makeChangeoClone} \alias{makeChangeoClone} \title{Generate a ChangeoClone object for lineage construction} \usage{ makeChangeoClone( data, id = "sequence_id", seq = "sequence_alignment", germ = "germline_alignment", v_call = "v_call", j_call = "j_call", junc_len = "junction_length", clone = "clone_id", mask_char = "N", locus = "locus", max_mask = 0, pad_end = FALSE, text_fields = NULL, num_fields = NULL, seq_fields = NULL, add_count = TRUE, verbose = FALSE ) } \arguments{ \item{data}{data.frame containing the AIRR or Change-O data for a clone. See Details for the list of required columns and their default values.} \item{id}{name of the column containing sequence identifiers.} \item{seq}{name of the column containing observed DNA sequences. All sequences in this column must be multiple aligned.} \item{germ}{name of the column containing germline DNA sequences. All entries in this column should be identical for any given clone, and they must be multiple aligned with the data in the \code{seq} column.} \item{v_call}{name of the column containing V-segment allele assignments. All entries in this column should be identical to the gene level.} \item{j_call}{name of the column containing J-segment allele assignments. All entries in this column should be identical to the gene level.} \item{junc_len}{name of the column containing the length of the junction as a numeric value. All entries in this column should be identical for any given clone.} \item{clone}{name of the column containing the identifier for the clone. All entries in this column should be identical.} \item{mask_char}{character to use for masking and padding.} \item{locus}{name of the column containing locus specification. Must be present and only contain the value "IGH", representing heavy chains.} \item{max_mask}{maximum number of characters to mask at the leading and trailing sequence ends. If \code{NULL} then the upper masking bound will be automatically determined from the maximum number of observed leading or trailing Ns amongst all sequences. If set to \code{0} (default) then masking will not be performed.} \item{pad_end}{if \code{TRUE} pad the end of each sequence with \code{mask_char} to make every sequence the same length.} \item{text_fields}{text annotation columns to retain and merge during duplicate removal.} \item{num_fields}{numeric annotation columns to retain and sum during duplicate removal.} \item{seq_fields}{sequence annotation columns to retain and collapse during duplicate removal. Note, this is distinct from the \code{seq} and \code{germ} arguments, which contain the primary sequence data for the clone and should not be repeated in this argument.} \item{add_count}{if \code{TRUE} add an additional annotation column called \code{collapse_count} during duplicate removal that indicates the number of sequences that were collapsed.} \item{verbose}{passed on to \code{collapseDuplicates}. If \code{TRUE}, report the numbers of input, discarded and output sequences; otherwise, process sequences silently.} } \value{ A \link{ChangeoClone} object containing the modified clone. } \description{ \code{makeChangeoClone} takes a data.frame with AIRR or Change-O style columns as input and masks gap positions, masks ragged ends, removes duplicates sequences, and merges annotations associated with duplicate sequences. It returns a \code{ChangeoClone} object which serves as input for lineage reconstruction. } \details{ The input data.frame (\code{data}) must columns for each of the required column name arguments: \code{id}, \code{seq}, \code{germ}, \code{v_call}, \code{j_call}, \code{junc_len}, and \code{clone}. The default values are as follows: \itemize{ \item \code{id = "sequence_id"}: unique sequence identifier. \item \code{seq = "sequence_alignment"}: IMGT-gapped sample sequence. \item \code{germ = "germline_alignment"}: IMGT-gapped germline sequence. \item \code{v_call = "v_call"}: V segment allele call. \item \code{j_call = "j_call"}: J segment allele call. \item \code{junc_len = "junction_length"}: junction sequence length. \item \code{clone = "clone_id"}: clone identifier. } Additional annotation columns specified in the \code{text_fields}, \code{num_fields} or \code{seq_fields} arguments will be retained in the \code{data} slot of the return object, but are not required. If the input data.frame \code{data} already contains a column named \code{sequence}, which is not used as the \code{seq} argument, then that column will not be retained. The default columns are IMGT-gapped sequence columns, but this is not a requirement. However, all sequences (both observed and germline) must be multiple aligned using some scheme for both proper duplicate removal and lineage reconstruction. The value for the germline sequence, V-segment gene call, J-segment gene call, junction length, and clone identifier are determined from the first entry in the \code{germ}, \code{v_call}, \code{j_call}, \code{junc_len} and \code{clone} columns, respectively. For any given clone, each value in these columns should be identical. } \examples{ # Example data db <- data.frame(sequence_id=LETTERS[1:4], sequence_alignment=c("CCCCTGGG", "CCCCTGGN", "NAACTGGN", "NNNCTGNN"), germline_alignment="CCCCAGGG", v_call="Homsap IGKV1-39*01 F", j_call="Homsap IGKJ5*01 F", junction_length=2, clone_id=1, locus=rep("IGH", length=4), c_call=c("IGHM", "IGHG", "IGHG", "IGHA"), duplicate_count=1:4, stringsAsFactors=FALSE) # Without end masking makeChangeoClone(db, text_fields="c_call", num_fields="duplicate_count") # With end masking makeChangeoClone(db, max_mask=3, text_fields="c_call", num_fields="duplicate_count") } \seealso{ Executes in order \link{maskSeqGaps}, \link{maskSeqEnds}, \link{padSeqEnds}, and \link{collapseDuplicates}. Returns a \link{ChangeoClone} object which serves as input to \link{buildPhylipLineage}. } alakazam/man/IUPAC_CODES.Rd0000644000176200001440000000171114500351304014646 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{IUPAC_CODES} \alias{IUPAC_CODES} \alias{IUPAC_DNA} \alias{IUPAC_AA} \alias{DNA_IUPAC} \title{IUPAC ambiguous characters} \format{ A list with single character codes as names and values containing character vectors that define the set of standard characters that match to each each ambiguous character. \itemize{ \item \code{IUPAC_DNA}: DNA ambiguous character translations. \item \code{IUPAC_AA}: Amino acid ambiguous character translations. \item \code{DNA_IUPAC}: Ordered DNA to ambiguous characters } An object of class \code{list} of length 15. An object of class \code{list} of length 25. An object of class \code{list} of length 15. } \usage{ IUPAC_DNA IUPAC_AA DNA_IUPAC } \description{ A translation list mapping IUPAC ambiguous characters code to corresponding nucleotide amino acid characters. } \keyword{datasets} alakazam/man/SingleDb.Rd0000644000176200001440000000122214500351304014554 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{SingleDb} \alias{SingleDb} \title{Single sequence AIRR database} \format{ An object of class \code{spec_tbl_df} (inherits from \code{tbl_df}, \code{tbl}, \code{data.frame}) with 1 rows and 32 columns. } \usage{ SingleDb } \description{ A database with just one sequence from \code{ExampleDb} and additional AIRR Rearrangement fields containing alignment information. The sequence was reanalyzed with a recent versions of alignment software (IgBLAST 1.16.0) and reference germlines (IMGT 2020-08-12). } \seealso{ \link{ExampleDb} } \keyword{datasets} alakazam/man/gridPlot.Rd0000644000176200001440000000074414500351304014661 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{gridPlot} \alias{gridPlot} \title{Plot multiple ggplot objects} \usage{ gridPlot(..., ncol = 1) } \arguments{ \item{...}{ggplot objects to plot.} \item{ncol}{number of columns in the plot.} } \description{ Plots multiple ggplot objects in an equally sized grid. } \references{ Modified from: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) } \seealso{ \link{ggplot}. } alakazam/man/progressBar.Rd0000644000176200001440000000053614500351304015365 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{progressBar} \alias{progressBar} \title{Standard progress bar} \usage{ progressBar(n) } \arguments{ \item{n}{maximum number of ticks} } \value{ A \link[progress]{progress_bar} object. } \description{ \code{progressBar} defines a common progress bar format. } alakazam/man/ExampleDb.Rd0000644000176200001440000000417014500351304014733 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{ExampleDb} \alias{ExampleDb} \title{Example AIRR database} \format{ A data.frame with the following AIRR style columns: \itemize{ \item \code{sequence_id}: Sequence identifier \item \code{sequence_alignment}: IMGT-gapped observed sequence. \item \code{germline_alignment}: IMGT-gapped germline sequence. \item \code{germline_alignment_d_mask}: IMGT-gapped germline sequence with N, P and D regions masked. \item \code{v_call}: V region allele assignments. \item \code{v_call_genotyped}: TIgGER corrected V region allele assignment. \item \code{d_call}: D region allele assignments. \item \code{j_call}: J region allele assignments. \item \code{c_call}: Isotype (C region) assignment. \item \code{junction}: Junction region sequence. \item \code{junction_length}: Length of the junction region in nucleotides. \item \code{np1_length}: Combined length of the N and P regions proximal to the V region. \item \code{np2_length}: Combined length of the N and P regions proximal to the J region. \item \code{duplicate_count}: Copy count (number of duplicates) of the sequence. \item \code{clone_id}: Change-O assignment clonal group identifier. \item \code{sample_id}: Sample identifier. Time in relation to vaccination. } } \usage{ ExampleDb } \description{ A small example database subset from Laserson and Vigneault et al, 2014. } \references{ \enumerate{ \item Laserson U and Vigneault F, et al. High-resolution antibody dynamics of vaccine-induced immune responses. Proc Natl Acad Sci USA. 2014 111:4928-33. } } \seealso{ \link{ExampleDbChangeo} \link{ExampleTrees} } \keyword{datasets} alakazam/man/combineIgphyml.Rd0000644000176200001440000000415214500351305016041 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Lineage.R \name{combineIgphyml} \alias{combineIgphyml} \title{Combine IgPhyML object parameters into a dataframe} \usage{ combineIgphyml(iglist, format = c("wide", "long")) } \arguments{ \item{iglist}{list of igphyml objects returned by \link{readIgphyml}. Each must have an \code{id} column in its \code{param} attribute, which can be added automatically using the \code{id} option of \code{readIgphyml}.} \item{format}{string specifying whether each column of the resulting data.frame should represent a parameter (\code{wide}) or if there should only be three columns; i.e. id, varable, and value (\code{long}).} } \value{ A data.frame containing HLP model parameter estimates for all igphyml objects. Only parameters shared among all objects will be returned. } \description{ \code{combineIgphyml} combines IgPhyML object parameters into a data.frame. } \details{ \code{combineIgphyml} combines repertoire-wide parameter estimates from mutliple igphyml objects produced by readIgphyml into a dataframe that can be easily used for plotting and other hypothesis testing analyses. All igphyml objects used must have an "id" column in their \code{param} attribute, which can be added automatically from the \code{id} flag of \code{readIgphyml}. } \examples{ \dontrun{ # Read in and combine two igphyml runs s1 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="+7d") s2 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="s2") combineIgphyml(list(s1, s2)) } } \references{ \enumerate{ \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody Lineages. Genetics 2017 206(1):417-427 https://doi.org/10.1534/genetics.116.196303 \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - Repertoire-wide phylogenetic models of B cell molecular evolution reveal evolutionary signatures of aging and vaccination. bioRxiv 2019 https://doi.org/10.1101/558825 } } \seealso{ \link{readIgphyml} } alakazam/man/aminoAcidProperties.Rd0000644000176200001440000001343114500351304017033 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{aminoAcidProperties} \alias{aminoAcidProperties} \title{Calculates amino acid chemical properties for sequence data} \usage{ aminoAcidProperties( data, property = c("length", "gravy", "bulk", "aliphatic", "polarity", "charge", "basic", "acidic", "aromatic"), seq = "junction", nt = TRUE, trim = FALSE, label = NULL, ... ) } \arguments{ \item{data}{\code{data.frame} containing sequence data.} \item{property}{vector strings specifying the properties to be calculated. Defaults to calculating all defined properties.} \item{seq}{\code{character} name of the column containing input sequences.} \item{nt}{boolean, TRUE if the sequences (or sequence) are DNA and will be translated.} \item{trim}{if \code{TRUE} remove the first and last codon/amino acids from each sequence before calculating properties. If \code{FALSE} do not modify input sequences.} \item{label}{name of sequence region to add as prefix to output column names.} \item{...}{additional named arguments to pass to the functions \link{gravy}, \link{bulk}, \link{aliphatic}, \link{polar} or \link{charge}.} } \value{ A modified \code{data} data.frame with the following columns: \itemize{ \item \code{*_aa_length}: number of amino acids. \item \code{*_aa_gravy}: grand average of hydrophobicity (gravy) index. \item \code{*_aa_bulk}: average bulkiness of amino acids. \item \code{*_aa_aliphatic}: aliphatic index. \item \code{*_aa_polarity}: average polarity of amino acids. \item \code{*_aa_charge}: net charge. \item \code{*_aa_basic}: fraction of informative positions that are Arg, His or Lys. \item \code{*_aa_acidic}: fraction of informative positions that are Asp or Glu. \item \code{*_aa_aromatic}: fraction of informative positions that are His, Phe, Trp or Tyr. } Where \code{*} is the value from \code{label} or the name specified for \code{seq} if \code{label=NULL}. } \description{ \code{aminoAcidProperties} calculates amino acid sequence physicochemical properties, including length, hydrophobicity, bulkiness, polarity, aliphatic index, net charge, acidic residue content, basic residue content, and aromatic residue content. } \details{ For all properties except for length, non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. The scores for gravy, bulkiness and polarity are calculated as simple averages of the scores for each informative positions. The basic, acid and aromatic indices are calculated as the fraction of informative positions falling into the given category. The aliphatic index is calculated using the Ikai, 1980 method. The net charge is calculated using the method of Moore, 1985, excluding the N-terminus and C-terminus charges, and normalizing by the number of informative positions. The default pH for the calculation is 7.4. The following data sources were used for the default property scores: \itemize{ \item hydropathy: Kyte & Doolittle, 1982. \item bulkiness: Zimmerman et al, 1968. \item polarity: Grantham, 1974. \item pK: EMBOSS. } } \examples{ # Subset example data db <- ExampleDb[c(1,10,100), c("sequence_id", "junction")] # Calculate default amino acid properties from DNA sequences aminoAcidProperties(db, seq="junction") # Calculate default amino acid properties from amino acid sequences # Use a custom output column prefix db$junction_aa <- translateDNA(db$junction) aminoAcidProperties(db, seq="junction_aa", label="junction", nt=FALSE) # Use the Grantham, 1974 side chain volume scores from the seqinr package # Set pH=7.0 for the charge calculation # Calculate only average volume and charge # Remove the head and tail amino acids from the junction, thus making it the CDR3 library(seqinr) data(aaindex) x <- aaindex[["GRAR740103"]]$I # Rename the score vector to use single-letter codes names(x) <- translateStrings(names(x), ABBREV_AA) # Calculate properties aminoAcidProperties(db, property=c("bulk", "charge"), seq="junction", trim=TRUE, label="cdr3", bulkiness=x, pH=7.0) } \references{ \enumerate{ \item Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). \item Grantham R. Amino acid difference formula to help explain protein evolution. Science 185, 862-864 (1974). \item Ikai AJ. Thermostability and aliphatic index of globular proteins. J Biochem 88, 1895-1898 (1980). \item Kyte J, Doolittle RF. A simple method for displaying the hydropathic character of a protein. J Mol Biol 157, 105-32 (1982). \item Moore DS. Amino acid and peptide net charges: A simple calculational procedure. Biochem Educ 13, 10-11 (1985). \item Wu YC, et al. High-throughput immunoglobulin repertoire analysis distinguishes between human IgM memory and switched memory B-cell populations. Blood 116, 1070-8 (2010). \item Wu YC, et al. The relationship between CD27 negative and positive B cell populations in human peripheral blood. Front Immunol 2, 1-12 (2011). \item \url{https://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} } } \seealso{ See \link{countPatterns} for counting the occurance of specific amino acid subsequences. See \link{gravy}, \link{bulk}, \link{aliphatic}, \link{polar} and \link{charge} for functions that calculate the included properties individually. } alakazam/man/cpuCount.Rd0000644000176200001440000000051714500351304014673 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{cpuCount} \alias{cpuCount} \title{Available CPU cores} \usage{ cpuCount() } \value{ Count of available cores. Returns 1 if undeterminable. } \description{ \code{cpuCount} determines the number of CPU cores available. } \examples{ cpuCount() } alakazam/man/groupGenes.Rd0000644000176200001440000001247014500351304015212 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Gene.R \name{groupGenes} \alias{groupGenes} \title{Group sequences by gene assignment} \usage{ groupGenes( data, v_call = "v_call", j_call = "j_call", junc_len = NULL, cell_id = NULL, locus = "locus", only_heavy = TRUE, first = FALSE ) } \arguments{ \item{data}{data.frame containing sequence data.} \item{v_call}{name of the column containing the heavy/long chain V-segment allele calls.} \item{j_call}{name of the column containing the heavy/long chain J-segment allele calls.} \item{junc_len}{name of column containing the junction length. If \code{NULL} then 1-stage partitioning is perform considering only the V and J genes is performed. See Details for further clarification.} \item{cell_id}{name of the column containing cell identifiers or barcodes. If specified, grouping will be performed in single-cell mode with the behavior governed by the \code{locus} and \code{only_heavy} arguments. If set to \code{NULL} then the bulk sequencing data is assumed.} \item{locus}{name of the column containing locus information. Only applicable to single-cell data. Ignored if \code{cell_id=NULL}.} \item{only_heavy}{use only the IGH (BCR) or TRB/TRD (TCR) sequences for grouping. Only applicable to single-cell data. Ignored if \code{cell_id=NULL}.} \item{first}{if \code{TRUE} only the first call of the gene assignments is used. if \code{FALSE} the union of ambiguous gene assignments is used to group all sequences with any overlapping gene calls.} } \value{ Returns a modified data.frame with disjoint union indices in a new \code{vj_group} column. If \code{junc_len} is supplied, the grouping this \code{vj_group} will have been based on V, J, and junction length simultaneously. However, the output column name will remain \code{vj_group}. The output \code{v_call}, \code{j_call}, \code{cell_id}, and \code{locus} columns will be converted to type \code{character} if they were of type \code{factor} in the input \code{data}. } \description{ \code{groupGenes} will group rows by shared V and J gene assignments, and optionally also by junction lengths. IGH:IGK/IGL, TRB:TRA, and TRD:TRG paired single-cell BCR/TCR sequencing and unpaired bulk sequencing (IGH, TRB, TRD chain only) are supported. In the case of ambiguous (multiple) gene assignments, the grouping may be specified to be a union across all ambiguous V and J gene pairs, analogous to single-linkage clustering (i.e., allowing for chaining). } \details{ To invoke single-cell mode the \code{cell_id} argument must be specified and the \code{locus} column must be correct. Otherwise, \code{groupGenes} will be run with bulk sequencing assumptions, using all input sequences regardless of the values in the \code{locus} column. Values in the \code{locus} column must be one of \code{c("IGH", "IGI", "IGK", "IGL")} for BCR or \code{c("TRA", "TRB", "TRD", "TRG")} for TCR sequences. Otherwise, the function returns an error message and stops. Under single-cell mode with paired chained sequences, there is a choice of whether grouping should be done by (a) using IGH (BCR) or TRB/TRD (TCR) sequences only or (b) using IGH plus IGK/IGL (BCR) or TRB/TRD plus TRA/TRG (TCR). This is governed by the \code{only_heavy} argument. Specifying \code{junc_len} will force \code{groupGenes} to perform a 1-stage partitioning of the sequences/cells based on V gene, J gene, and junction length simultaneously. If \code{junc_len=NULL} (no column specified), then \code{groupGenes} performs only the first stage of a 2-stage partitioning in which sequences/cells are partitioned in the first stage based on V gene and J gene, and then in the second stage further splits the groups based on junction length (the second stage must be performed independently, as this only returns the first stage results). In the input \code{data}, the \code{v_call}, \code{j_call}, \code{cell_id}, and \code{locus} columns, if present, must be of type \code{character} (as opposed to \code{factor}). It is assumed that ambiguous gene assignments are separated by commas. All rows containing \code{NA} values in any of the \code{v_call}, \code{j_call}, and \code{junc_len} (if \code{junc_len != NULL}) columns will be removed. A warning will be issued when a row containing an \code{NA} is removed. } \section{Expectations for single-cell data}{ Single-cell paired chain data assumptions: \itemize{ \item every row represents a sequence (chain). \item heavy/long and light/short chains of the same cell are linked by \code{cell_id}. \item the value in \code{locus} column indicates whether the chain is the heavy/long or light/short chain. \item each cell possibly contains multiple heavy/long and/or light/short chains. \item every chain has its own V(D)J annotation, in which ambiguous V(D)J annotations, if any, are separated by a comma. } Single-cell example: \itemize{ \item A cell has 1 heavy chain and 2 light chains. \item There should be 3 rows corresponding to this cell. \item One of the light chains may have an ambiguous V annotation which looks like \code{"Homsap IGKV1-39*01 F,Homsap IGKV1D-39*01 F"}. } } \examples{ # Group by genes db <- groupGenes(ExampleDb) head(db$vj_group) } alakazam/man/checkColumns.Rd0000644000176200001440000000170514500351304015511 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{checkColumns} \alias{checkColumns} \title{Check data.frame for valid columns and issue message if invalid} \usage{ checkColumns(data, columns, logic = c("all", "any")) } \arguments{ \item{data}{data.frame to check.} \item{columns}{vector of column names to check.} \item{logic}{one of \code{"all"} or \code{"any"} controlling whether all, or at least one, of the columns must be valid, respectively.} } \value{ \code{TRUE} if columns are valid and a string message if not. } \description{ Check data.frame for valid columns and issue message if invalid } \examples{ df <- data.frame(A=1:3, B=4:6, C=rep(NA, 3)) checkColumns(df, c("A", "B"), logic="all") checkColumns(df, c("A", "B"), logic="any") checkColumns(df, c("A", "C"), logic="all") checkColumns(df, c("A", "C"), logic="any") checkColumns(df, c("A", "D"), logic="all") checkColumns(df, c("A", "D"), logic="any") } alakazam/man/readFastqDb.Rd0000644000176200001440000001045014500351304015250 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Fastq.R \name{readFastqDb} \alias{readFastqDb} \title{Load sequencing quality scores from a FASTQ file} \usage{ readFastqDb( data, fastq_file, quality_offset = -33, header = c("presto", "asis"), sequence_id = "sequence_id", sequence = "sequence", sequence_alignment = "sequence_alignment", v_cigar = "v_cigar", d_cigar = "d_cigar", j_cigar = "j_cigar", np1_length = "np1_length", np2_length = "np2_length", v_sequence_end = "v_sequence_end", d_sequence_end = "d_sequence_end", style = c("num", "ascii", "both"), quality_sequence = FALSE ) } \arguments{ \item{data}{\code{data.frame} containing sequence data.} \item{fastq_file}{path to the fastq file} \item{quality_offset}{offset value to be used by ape::read.fastq. It is the value to be added to the quality scores (the default -33 applies to the Sanger format and should work for most recent FASTQ files).} \item{header}{FASTQ file header format; one of \code{"presto"} or \code{"asis"}. Use \code{"presto"} to specify that the fastq file headers are using the pRESTO format and can be parsed to extract the \code{sequence_id}. Use \code{"asis"} to skip any processing and use the sequence names as they are.} \item{sequence_id}{column in \code{data} that contains sequence identifiers to be matched to sequence identifiers in \code{fastq_file}.} \item{sequence}{column in \code{data} that contains sequence data.} \item{sequence_alignment}{column in \code{data} that contains IMGT aligned sequence data.} \item{v_cigar}{column in \code{data} that contains CIGAR strings for the V gene alignments.} \item{d_cigar}{column in \code{data} that contains CIGAR strings for the D gene alignments.} \item{j_cigar}{column in \code{data} that contains CIGAR strings for the J gene alignments.} \item{np1_length}{column in \code{data} that contains the number of nucleotides between the V gene and first D gene alignments or between the V gene and J gene alignments.} \item{np2_length}{column in \code{data} that contains the number of nucleotides between either the first D gene and J gene alignments or the first D gene and second D gene alignments.} \item{v_sequence_end}{column in \code{data} that contains the end position of the V gene in \code{sequence}.} \item{d_sequence_end}{column in \code{data} that contains the end position of the D gene in \code{sequence}.} \item{style}{how the sequencing quality should be returned; one of \code{"num"}, \code{"phred"}, or \code{"both"}. Specify \code{"num"} to store the quality scores as strings of comma separated numeric values. Use \code{"phred"} to have the function return the scores as Phred (ASCII) scores. Use \code{"both"} to retrieve both.} \item{quality_sequence}{specify \code{TRUE} to keep the quality scores for \code{sequence}. If false, only the quality score for \code{sequence_alignment} will be added to \code{data}.} } \value{ Modified \code{data} with additional fields: \enumerate{ \item \code{quality_alignment}: A character vector with ASCII Phred scores for \code{sequence_alignment}. \item \code{quality_alignment_num}: A character vector, with comma separated numerical quality values for each position in \code{sequence_alignment}. \item \code{quality}: A character vector with ASCII Phred scores for \code{sequence}. \item \code{quality_num}: A character vector, with comma separated numerical quality values for each position in \code{sequence}. } } \description{ \code{readFastqDb} adds the sequencing quality scores to a data.frame from a FASTQ file. Matching is done by `sequence_id`. } \examples{ db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") db <- readFastqDb(db, fastq_file, quality_offset=-33) } \seealso{ \link{maskPositionsByQuality} and \link{getPositionQuality} } alakazam/man/testEdges.Rd0000644000176200001440000000276414505513545015044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{testEdges} \alias{testEdges} \title{Tests for parent-child annotation enrichment in lineage trees} \usage{ testEdges( graphs, field, indirect = FALSE, exclude = c("Germline", NA), nperm = 200, progress = FALSE ) } \arguments{ \item{graphs}{list of igraph objects with vertex annotations.} \item{field}{string defining the annotation field to permute.} \item{indirect}{if \code{FALSE} count direct connections (edges) only. If \code{TRUE} walk through any nodes with annotations specified in the \code{argument} to count indirect connections. Specifying \code{indirect=TRUE} with \code{exclude=NULL} will have no effect.} \item{exclude}{vector of strings defining \code{field} values to exclude from permutation.} \item{nperm}{number of permutations to perform.} \item{progress}{if \code{TRUE} show a progress bar.} } \value{ An \link{EdgeTest} object containing the test results and permutation realizations. } \description{ \code{testEdges} performs a permutation test on a set of lineage trees to determine the significance of an annotation's association with parent-child relationships. } \examples{ \donttest{ # Define example tree set graphs <- ExampleTrees[1:10] # Perform edge test on isotypes x <- testEdges(graphs, "c_call", nperm=10) print(x) } } \seealso{ Uses \link{tableEdges} and \link{permuteLabels}. See \link{plotEdgeTest} for plotting the permutation distributions. } alakazam/man/testMRCA.Rd0000644000176200001440000000246514500351305014522 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{testMRCA} \alias{testMRCA} \title{Tests for MRCA annotation enrichment in lineage trees} \usage{ testMRCA( graphs, field, root = "Germline", exclude = c("Germline", NA), nperm = 200, progress = FALSE ) } \arguments{ \item{graphs}{list of igraph object containing annotated lineage trees.} \item{field}{string defining the annotation field to test.} \item{root}{name of the root (germline) node.} \item{exclude}{vector of strings defining \code{field} values to exclude from the set of potential founder annotations.} \item{nperm}{number of permutations to perform.} \item{progress}{if \code{TRUE} show a progress bar.} } \value{ An \link{MRCATest} object containing the test results and permutation realizations. } \description{ \code{testMRCA} performs a permutation test on a set of lineage trees to determine the significance of an annotation's association with the MRCA position of the lineage trees. } \examples{ \donttest{ # Define example tree set graphs <- ExampleTrees[1:10] # Perform MRCA test on isotypes x <- testMRCA(graphs, "c_call", nperm=10) print(x) } } \seealso{ Uses \link{getMRCA} and \link{getPathLengths}. See \link{plotMRCATest} for plotting the permutation distributions. } alakazam/man/plotDiversityCurve.Rd0000644000176200001440000000444714500351304016767 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{plotDiversityCurve} \alias{plotDiversityCurve} \title{Plot the results of alphaDiversity} \usage{ plotDiversityCurve( data, colors = NULL, main_title = "Diversity", legend_title = "Group", log_x = FALSE, log_y = FALSE, xlim = NULL, ylim = NULL, annotate = c("none", "depth"), score = c("diversity", "evenness"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{DiversityCurve} object returned by \link{alphaDiversity}.} \item{colors}{named character vector whose names are values in the \code{group} column of the \code{data} slot of \code{data}, and whose values are colors to assign to those group names.} \item{main_title}{string specifying the plot title.} \item{legend_title}{string specifying the legend title.} \item{log_x}{if \code{TRUE} then plot \eqn{q} on a log scale; if \code{FALSE} plot on a linear scale.} \item{log_y}{if \code{TRUE} then plot the diversity/evenness scores on a log scale; if \code{FALSE} plot on a linear scale.} \item{xlim}{numeric vector of two values specifying the \code{c(lower, upper)} x-axis limits.} \item{ylim}{numeric vector of two values specifying the \code{c(lower, upper)} y-axis limits.} \item{annotate}{string defining whether to added values to the group labels of the legend. When \code{"none"} (default) is specified no annotations are added. Specifying (\code{"depth"}) adds sequence counts to the labels.} \item{score}{one of \code{"diversity"} or \code{"evenness"} specifying which score to plot on the y-asis.} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotDiversityCurve} plots a \code{DiversityCurve} object. } \examples{ # Calculate diversity div <- alphaDiversity(ExampleDb, group="sample_id", nboot=100) # Plot diversity plotDiversityCurve(div, legend_title="Sample") # Plot diversity plotDiversityCurve(div, legend_title="Sample", score="evenness") } \seealso{ See \link{alphaDiversity} and \link{alphaDiversity} for generating \link{DiversityCurve} objects for input. Plotting is performed with \link{ggplot}. } alakazam/man/maskSeqGaps.Rd0000644000176200001440000000172414500351305015314 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{maskSeqGaps} \alias{maskSeqGaps} \title{Masks gap characters in DNA sequences} \usage{ maskSeqGaps(seq, mask_char = "N", outer_only = FALSE) } \arguments{ \item{seq}{character vector of DNA sequence strings.} \item{mask_char}{character to use for masking.} \item{outer_only}{if \code{TRUE} replace only contiguous leading and trailing gaps; if \code{FALSE} replace all gap characters.} } \value{ A modified \code{seq} vector with \code{"N"} in place of \code{c("-", ".")} characters. } \description{ \code{maskSeqGaps} substitutes gap characters, \code{c("-", ".")}, with \code{"N"} in a vector of DNA sequences. } \examples{ # Mask with Ns maskSeqGaps(c("ATG-C", "CC..C")) maskSeqGaps("--ATG-C-") maskSeqGaps("--ATG-C-", outer_only=TRUE) # Mask with dashes maskSeqGaps(c("ATG-C", "CC..C"), mask_char="-") } \seealso{ See \link{maskSeqEnds} for masking ragged edges. } alakazam/man/DEFAULT_COLORS.Rd0000644000176200001440000000273514500351304015244 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{DEFAULT_COLORS} \alias{DEFAULT_COLORS} \alias{DNA_COLORS} \alias{IG_COLORS} \alias{TR_COLORS} \title{Default colors} \format{ Named character vectors with hexcode colors as values. \itemize{ \item \code{DNA_COLORS}: DNA character colors \code{c("A", "C", "G", "T")}. \item \code{IG_COLORS}: Ig isotype colors \code{c("IGHA", "IGHD", "IGHE", "IGHG", "IGHM", "IGHK", "IGHL")}. \item \code{TR_COLORS}: TCR chain colors \code{c("TRA", "TRB", "TRD", "TRG")}. } An object of class \code{character} of length 4. An object of class \code{character} of length 7. An object of class \code{character} of length 4. } \usage{ DNA_COLORS IG_COLORS TR_COLORS } \description{ Default color palettes for DNA characters, Ig isotypes, and TCR chains. } \examples{ # IG_COLORS as an isotype color set for ggplot isotype <- c("IGHG", "IGHM", "IGHM", "IGHA") db <- data.frame(x=1:4, y=1:4, iso=isotype) g1 <- ggplot(db, aes(x=x, y=y, color=iso)) + scale_color_manual(name="Isotype", values=IG_COLORS) + geom_point(size=10) plot(g1) # DNA_COLORS to translate nucleotide values to a vector of colors # for use in base graphics plots seq <- c("A", "T", "T", "C") colors <- translateStrings(seq, setNames(names(DNA_COLORS), DNA_COLORS)) plot(1:4, 1:4, col=colors, pch=16, cex=6) } \keyword{datasets} alakazam/man/summarizeSubtrees.Rd0000644000176200001440000000431414500351305016624 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{summarizeSubtrees} \alias{summarizeSubtrees} \title{Generate subtree summary statistics for a tree} \usage{ summarizeSubtrees(graph, fields = NULL, root = "Germline") } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{fields}{annotation fields to add to the output.} \item{root}{name of the root (germline) node.} } \value{ A data.frame with columns: \itemize{ \item \code{name}: node name. \item \code{parent}: name of the parent node. \item \code{outdegree}: number of edges leading from the node. \item \code{size}: total number of nodes within the subtree rooted at the node. \item \code{depth}: the depth of the subtree that is rooted at the node. \item \code{pathlength}: the maximum pathlength beneath the node. \item \code{outdegree_norm}: \code{outdegree} normalized by the total number of edges. \item \code{size_norm}: \code{size} normalized by the largest subtree size (the germline). \item \code{depth_norm}: \code{depth} normalized by the largest subtree depth (the germline). \item \code{pathlength_norm}: \code{pathlength} normalized by the largest subtree pathlength (the germline). } An additional column corresponding to the value of \code{field} is added when specified. } \description{ \code{summarizeSubtrees} calculates summary statistics for each node of a tree. Includes both node properties and subtree properties. } \examples{ # Summarize a tree graph <- ExampleTrees[[23]] summarizeSubtrees(graph, fields="c_call", root="Germline") } \seealso{ See \link{buildPhylipLineage} for generating input trees. See \link{getPathLengths} for calculating path length to nodes. } alakazam/man/countPatterns.Rd0000644000176200001440000000257714500351304015754 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{countPatterns} \alias{countPatterns} \title{Count sequence patterns} \usage{ countPatterns(seq, patterns, nt = TRUE, trim = FALSE, label = "region") } \arguments{ \item{seq}{character vector of either DNA or amino acid sequences.} \item{patterns}{list of sequence patterns to count in each sequence. If the list is named, then names will be assigned as the column names of output data.frame.} \item{nt}{if \code{TRUE} then \code{seq} are DNA sequences and and will be translated before performing the pattern search.} \item{trim}{if \code{TRUE} remove the first and last codon or amino acid from each sequence before the pattern search. If \code{FALSE} do not modify the input sequences.} \item{label}{string defining a label to add as a prefix to the output column names.} } \value{ A data.frame containing the fraction of times each sequence pattern was found. } \description{ \code{countPatterns} counts the fraction of times a set of character patterns occur in a set of sequences. } \examples{ seq <- c("TGTCAACAGGCTAACAGTTTCCGGACGTTC", "TGTCAGCAATATTATATTGCTCCCTTCACTTTC", "TGTCAAAAGTATAACAGTGCCCCCTGGACGTTC") patterns <- c("A", "V", "[LI]") names(patterns) <- c("arg", "val", "iso_leu") countPatterns(seq, patterns, nt=TRUE, trim=TRUE, label="cdr3") } alakazam/man/charge.Rd0000644000176200001440000000324314500351304014323 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{charge} \alias{charge} \title{Calculates the net charge of amino acid sequences.} \usage{ charge(seq, pH = 7.4, pK = NULL, normalize = FALSE) } \arguments{ \item{seq}{vector strings defining of amino acid sequences.} \item{pH}{environmental pH.} \item{pK}{named vector defining pK values for each charged amino acid, where names are the single-letter amino acid character codes \code{c("R", "H", "K", "D", "E", "C", "Y")}). If \code{NULL}, then the EMBOSS scale is used.} \item{normalize}{if \code{TRUE} then divide the net charge of each amino acid sequence by the number of informative positions. Non-informative position are defined by the presence any character in \code{c("X", "-", ".", "*")}. If \code{FALSE} then return the raw net charge.} } \value{ A vector of net charges for the sequence(s). } \description{ \code{charge} calculates the net charge of amino acid sequences using the method of Moore, 1985, with exclusion of the C-terminus and N-terminus charges. } \examples{ seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") # Unnormalized charge charge(seq) # Normalized charge charge(seq, normalize=TRUE) # Use the Murray et al, 2006 scores from the seqinr package library(seqinr) data(pK) x <- setNames(pK[["Murray"]], rownames(pK)) # Calculate charge charge(seq, pK=x) } \references{ \enumerate{ \item Moore DS. Amino acid and peptide net charges: A simple calculational procedure. Biochem Educ. 13, 10-11 (1985). \item \url{https://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} } } \seealso{ For additional pK scales see \code{\link[seqinr]{pK}}. } alakazam/man/translateStrings.Rd0000644000176200001440000000242414500351304016441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{translateStrings} \alias{translateStrings} \title{Translate a vector of strings} \usage{ translateStrings(strings, translation) } \arguments{ \item{strings}{vector of character strings to modify.} \item{translation}{named character vector or a list of character vectors specifying the strings to replace (values) and their replacements (names).} } \value{ A modified \code{strings} vector. } \description{ \code{translateStrings} modifies a character vector by substituting one or more strings with a replacement string. } \details{ Does not perform partial replacements. Each translation value must match a complete \code{strings} value or it will not be replaced. Values that do not have a replacement named in the \code{translation} parameter will not be modified. Replacement is accomplished using \link{gsub}. } \examples{ # Using a vector translation strings <- LETTERS[1:5] translation <- c("POSITION1"="A", "POSITION5"="E") translateStrings(strings, translation) # Using a list translation strings <- LETTERS[1:5] translation <- list("1-3"=c("A","B","C"), "4-5"=c("D","E")) translateStrings(strings, translation) } \seealso{ See \link{gsub} for single value replacement in the base package. } alakazam/man/writeChangeoDb.Rd0000644000176200001440000000150014500351304015751 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{writeChangeoDb} \alias{writeChangeoDb} \title{Write a Change-O tab-delimited database file} \usage{ writeChangeoDb(data, file) } \arguments{ \item{data}{data.frame of Change-O data.} \item{file}{output file name.} } \description{ \code{writeChangeoDb} is a simple wrapper around \link[readr]{write_delim} with defaults appropriate for writing a Change-O tab-delimited database file from a data.frame. } \examples{ \dontrun{ # Write a database writeChangeoDb(data, "changeo.tsv") } } \seealso{ Wraps \link[readr]{write_delim}. See \link{readChangeoDb} for reading to Change-O files. See \link[airr]{read_rearrangement} and \link[airr]{write_rearrangement} to read and write AIRR-C Standard formatted repertoires. } alakazam/man/baseTheme.Rd0000644000176200001440000000115014500351304014762 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{baseTheme} \alias{baseTheme} \title{Standard ggplot settings} \usage{ baseTheme(sizing = c("figure", "window")) } \arguments{ \item{sizing}{defines the style and sizing of the theme. One of \code{c("figure", "window")} where \code{sizing="figure"} is appropriately sized for pdf export at 7 to 7.5 inch width, and \code{sizing="window"} is sized for an interactive session.} } \value{ A ggplot2 object. } \description{ \code{baseTheme} defines common ggplot theme settings for plotting. } \seealso{ \link[ggplot2]{theme}. } alakazam/man/AbundanceCurve-class.Rd0000644000176200001440000000331014500351304017055 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Classes.R \docType{class} \name{AbundanceCurve-class} \alias{AbundanceCurve-class} \alias{AbundanceCurve} \alias{print,AbundanceCurve-method} \alias{AbundanceCurve-method} \alias{plot,AbundanceCurve,missing-method} \title{S4 class defining a clonal abundance curve} \usage{ \S4method{print}{AbundanceCurve}(x) \S4method{plot}{AbundanceCurve,missing}(x, y, ...) } \arguments{ \item{x}{AbundanceCurve object} \item{y}{ignored.} \item{...}{arguments to pass to \link{plotDiversityCurve}.} } \description{ \code{AbundanceCurve} defines clonal abundance values. } \section{Slots}{ \describe{ \item{\code{abundance}}{data.frame with relative clonal abundance data and confidence intervals, containing the following columns: \itemize{ \item \code{group}: group identifier. \item \code{clone_id} or \code{CLONE}: clone identifier. \item \code{p}: relative abundance of the clone. \item \code{lower}: lower confidence inverval bound. \item \code{upper}: upper confidence interval bound. \item \code{rank}: the rank of the clone abundance. }} \item{\code{bootstrap}}{data.frame of bootstrapped clonal distributions.} \item{\code{clone_by}}{string specifying the name of the clone column.} \item{\code{group_by}}{string specifying the name of the grouping column.} \item{\code{groups}}{vector specifying the names of unique groups in group column.} \item{\code{n}}{numeric vector indication the number of sequences sampled in each group.} \item{\code{nboot}}{numeric specifying the number of bootstrap iterations to use.} \item{\code{ci}}{confidence interval defining the upper and lower bounds (a value between 0 and 1).} }} alakazam/man/padSeqEnds.Rd0000644000176200001440000000244114500351305015121 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{padSeqEnds} \alias{padSeqEnds} \title{Pads ragged ends of aligned DNA sequences} \usage{ padSeqEnds(seq, len = NULL, start = FALSE, pad_char = "N", mod3 = TRUE) } \arguments{ \item{seq}{character vector of DNA sequence strings.} \item{len}{length to pad to. Only applies if longer than the maximum length of the data in \code{seq}.} \item{start}{if \code{TRUE} pad the beginning of each sequence instead of the end.} \item{pad_char}{character to use for padding.} \item{mod3}{if \code{TRUE} pad sequences to be of length multiple three.} } \value{ A modified \code{seq} vector with padded sequences. } \description{ \code{padSeqEnds} takes a vector of DNA sequences, as character strings, and appends the ends of each sequence with an appropriate number of \code{"N"} characters to create a sequence vector with uniform lengths. } \examples{ # Default behavior uniformly pads ragged ends seq <- c("CCCCTGGG", "ACCCTG", "CCCC") padSeqEnds(seq) # Pad to fixed length padSeqEnds(seq, len=15) # Add padding to the beginning of the sequences instead of the ends padSeqEnds(seq, start=TRUE) padSeqEnds(seq, len=15, start=TRUE) } \seealso{ See \link{maskSeqEnds} for creating uniform masking from existing masking. } alakazam/man/maskSeqEnds.Rd0000644000176200001440000000331214500351305015306 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{maskSeqEnds} \alias{maskSeqEnds} \title{Masks ragged leading and trailing edges of aligned DNA sequences} \usage{ maskSeqEnds(seq, mask_char = "N", max_mask = NULL, trim = FALSE) } \arguments{ \item{seq}{character vector of DNA sequence strings.} \item{mask_char}{character to use for masking.} \item{max_mask}{the maximum number of characters to mask. If set to 0 then no masking will be performed. If set to \code{NULL} then the upper masking bound will be automatically determined from the maximum number of observed leading or trailing \code{"N"} characters amongst all strings in \code{seq}.} \item{trim}{if \code{TRUE} leading and trailing characters will be cut rather than masked with \code{"N"} characters.} } \value{ A modified \code{seq} vector with masked (or optionally trimmed) sequences. } \description{ \code{maskSeqEnds} takes a vector of DNA sequences, as character strings, and replaces the leading and trailing characters with \code{"N"} characters to create a sequence vector with uniformly masked outer sequence segments. } \examples{ # Default behavior uniformly masks ragged ends seq <- c("CCCCTGGG", "NAACTGGN", "NNNCTGNN") maskSeqEnds(seq) # Does nothing maskSeqEnds(seq, max_mask=0) # Cut ragged sequence ends maskSeqEnds(seq, trim=TRUE) # Set max_mask to limit extent of masking and trimming maskSeqEnds(seq, max_mask=1) maskSeqEnds(seq, max_mask=1, trim=TRUE) # Mask dashes instead of Ns seq <- c("CCCCTGGG", "-AACTGG-", "---CTG--") maskSeqEnds(seq, mask_char="-") } \seealso{ See \link{maskSeqGaps} for masking internal gaps. See \link{padSeqEnds} for padding sequence of unequal length. } alakazam/man/ChangeoClone-class.Rd0000644000176200001440000000172214500351304016522 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Classes.R \docType{class} \name{ChangeoClone-class} \alias{ChangeoClone-class} \alias{ChangeoClone} \title{S4 class defining a clone} \description{ \code{ChangeoClone} defines a common data structure for perform lineage recontruction from Change-O data. } \section{Slots}{ \describe{ \item{\code{data}}{data.frame containing sequences and annotations. Contains the columns \code{SEQUENCE_ID} and \code{SEQUENCE}, as well as any additional sequence-specific annotation columns.} \item{\code{clone}}{string defining the clone identifier.} \item{\code{germline}}{string containing the germline sequence for the clone.} \item{\code{v_gene}}{string defining the V segment gene call.} \item{\code{j_gene}}{string defining the J segment gene call.} \item{\code{junc_len}}{numeric junction length (nucleotide count).} }} \seealso{ See \link{makeChangeoClone} and \link{buildPhylipLineage} for use. } alakazam/man/plotSubtrees.Rd0000644000176200001440000000552114500351305015567 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{plotSubtrees} \alias{plotSubtrees} \title{Plots subtree statistics for multiple trees} \usage{ plotSubtrees( graphs, field, stat, root = "Germline", exclude = c("Germline", NA), colors = NULL, main_title = "Subtrees", legend_title = "Annotation", style = c("box", "violin"), silent = FALSE, ... ) } \arguments{ \item{graphs}{list of igraph objects containing annotated lineage trees.} \item{field}{string defining the annotation field.} \item{stat}{string defining the subtree statistic to plot. One of: \itemize{ \item \code{outdegree}: distribution of normalized node outdegrees. \item \code{size}: distribution of normalized subtree sizes. \item \code{depth}: distribution of subtree depths. \item \code{pathlength}: distribution of maximum pathlength beneath nodes. }} \item{root}{name of the root (germline) node.} \item{exclude}{vector of strings defining \code{field} values to exclude from plotting.} \item{colors}{named vector of colors for values in \code{field}, with names defining annotation names \code{field} column and values being colors. Also controls the order in which values appear on the plot. If \code{NULL} alphabetical ordering and a default color palette will be used.} \item{main_title}{string specifying the plot title.} \item{legend_title}{string specifying the legend title.} \item{style}{string specifying the style of plot to draw. One of: \itemize{ \item \code{"histogram"}: histogram of the annotation count distribution with a red dotted line denoting the observed value. \item \code{"cdf"}: cumulative distribution function of annotation counts with a red dotted line denoting the observed value and a blue dotted line indicating the p-value. }} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotSubtree} plots distributions of normalized subtree statistics for a set of lineage trees, broken down by annotation value. } \examples{ # Define example tree set graphs <- ExampleTrees[1:10] # Violin plots of node outdegree by sample plotSubtrees(graphs, "sample_id", "out", style="v") # Violin plots of subtree size by sample plotSubtrees(graphs, "sample_id", "size", style="v") # Boxplot of node depth by isotype plotSubtrees(graphs, "c_call", "depth", style="b") } \seealso{ Subtree statistics are calculated with \link{summarizeSubtrees}. } alakazam/man/readChangeoDb.Rd0000644000176200001440000000407214500351304015541 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{readChangeoDb} \alias{readChangeoDb} \title{Read a Change-O tab-delimited database file} \usage{ readChangeoDb(file, select = NULL, drop = NULL, seq_upper = TRUE) } \arguments{ \item{file}{tab-delimited database file output by a Change-O tool.} \item{select}{columns to select from database file.} \item{drop}{columns to drop from database file.} \item{seq_upper}{if \code{TRUE} convert sequence columns to upper case; if \code{FALSE} do not alter sequence columns. See Value for a list of which columns are effected.} } \value{ A data.frame of the database file. Columns will be imported as is, except for the following columns which will be explicitly converted into character values: \itemize{ \item SEQUENCE_ID \item CLONE \item SAMPLE } And the following sequence columns which will converted to upper case if \code{seq_upper=TRUE} (default). \itemize{ \item SEQUENCE_INPUT \item SEQUENCE_VDJ \item SEQUENCE_IMGT \item JUNCTION \item GERMLINE_IMGT \item GERMLINE_IMGT_D_MASK } } \description{ \code{readChangeoDb} reads a tab-delimited database file created by a Change-O tool into a data.frame. } \examples{ \dontrun{ # Read all columns in and convert sequence fields to upper case db <- readChangeoDb("changeo.tsv") # Subset columns and convert sequence fields to upper case db <- readChangeoDb("changeo.tsv", select=c("SEQUENCE_ID", "SEQUENCE_IMGT")) # Drop columns and do not alter sequence field case db <- readChangeoDb("changeo.tsv", drop=c("D_CALL", "DUPCOUNT"), seq_upper=FALSE) } } \seealso{ Wraps \link[readr]{read_delim}. See \link{writeChangeoDb} for writing to Change-O files. See \link[airr]{read_rearrangement} and \link[airr]{write_rearrangement} to read and write AIRR-C Standard formatted repertoires. } alakazam/man/countClones.Rd0000644000176200001440000000511414500351304015365 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{countClones} \alias{countClones} \title{Tabulates clones sizes} \usage{ countClones( data, groups = NULL, copy = NULL, clone = "clone_id", remove_na = TRUE ) } \arguments{ \item{data}{data.frame with columns containing clonal assignments.} \item{groups}{character vector defining \code{data} columns containing grouping variables. If \code{groups=NULL}, then do not group data.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If this value is specified, then total copy abundance is determined by the sum of copy numbers within each clonal group.} \item{clone}{name of the \code{data} column containing clone identifiers.} \item{remove_na}{removes rows with \code{NA} values in the clone column if \code{TRUE} and issues a warning. Otherwise, keeps those rows and considers \code{NA} as a clone in the final counts and relative abundances.} } \value{ A data.frame summarizing clone counts and frequencies with columns: \itemize{ \item \code{clone_id}: clone identifier. This is the default column name, specified with \code{clone='clone_id'}. If the function call uses Change-O formatted data and \code{clone='CLONE'}, this column will have name \code{CLONE}. \item \code{seq_count}: total number of sequences for the clone. \item \code{seq_freq}: frequency of the clone as a fraction of the total number of sequences within each group. \item \code{copy_count}: sum of the copy counts in the \code{copy} column. Only present if the \code{copy} argument is specified. \item \code{copy_freq}: frequency of the clone as a fraction of the total copy number within each group. Only present if the \code{copy} argument is specified. } Also includes additional columns specified in the \code{groups} argument. } \description{ \code{countClones} determines the number of sequences and total copy number of clonal groups. } \examples{ # Without copy numbers clones <- countClones(ExampleDb, groups="sample_id") # With copy numbers and multiple groups clones <- countClones(ExampleDb, groups=c("sample_id", "c_call"), copy="duplicate_count") } alakazam/man/gravy.Rd0000644000176200001440000000267614500351304014233 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{gravy} \alias{gravy} \title{Calculates the hydrophobicity of amino acid sequences} \usage{ gravy(seq, hydropathy = NULL) } \arguments{ \item{seq}{vector of strings containing amino acid sequences.} \item{hydropathy}{named numerical vector defining hydropathy index values for each amino acid, where names are single-letter amino acid character codes. If \code{NULL}, then the Kyte & Doolittle scale is used.} } \value{ A vector of gravy scores for the sequence(s). } \description{ \code{gravy} calculates the Grand Average of Hydrophobicity (gravy) index of amino acid sequences using the method of Kyte & Doolittle. Non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. } \examples{ # Default scale seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") gravy(seq) # Use the Kidera et al, 1985 scores from the seqinr package library(seqinr) data(aaindex) x <- aaindex[["KIDA850101"]]$I # Rename the score vector to use single-letter codes names(x) <- translateStrings(names(x), ABBREV_AA) # Calculate hydrophobicity gravy(seq, hydropathy=x) } \references{ \enumerate{ \item Kyte J, Doolittle RF. A simple method for displaying the hydropathic character of a protein. J Mol Biol. 157, 105-32 (1982). } } \seealso{ For additional hydrophobicity indices see \code{\link[seqinr]{aaindex}}. } alakazam/man/extractVRegion.Rd0000644000176200001440000000350114500351305016034 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{extractVRegion} \alias{extractVRegion} \title{Extracts FWRs and CDRs from IMGT-gapped sequences} \usage{ extractVRegion(sequences, region = c("fwr1", "cdr1", "fwr2", "cdr2", "fwr3")) } \arguments{ \item{sequences}{character vector of IMGT-gapped nucleotide sequences.} \item{region}{string defining the region(s) of the V segment to extract. May be a single region or multiple regions (as a vector) from \code{c("fwr1", "cdr1", "fwr2", "cdr2" ,"fwr3")}. By default, all regions will be returned.} } \value{ If only one region is specified in the \code{region} argument, a character vector of the extracted sub-sequences will be returned. If multiple regions are specified, then a character matrix will be returned with columns corresponding to the specified regions and a row for each entry in \code{sequences}. } \description{ \code{extractVRegion} extracts the framework and complementarity determining regions of the V segment for IMGT-gapped immunoglobulin (Ig) nucleotide sequences according to the IMGT numbering scheme. } \examples{ # Assign example clone clone <- subset(ExampleDb, clone_id == 3138) # Get all regions extractVRegion(clone$sequence_alignment) # Get single region extractVRegion(clone$sequence_alignment, "fwr1") # Get all CDRs extractVRegion(clone$sequence_alignment, c("cdr1", "cdr2")) # Get all FWRs extractVRegion(clone$sequence_alignment, c("fwr1", "fwr2", "fwr3")) } \references{ \enumerate{ \item Lefranc M-P, et al. IMGT unique numbering for immunoglobulin and T cell receptor variable domains and Ig superfamily V-like domains. Dev Comp Immunol. 2003 27(1):55-77. } } \seealso{ IMGT-gapped region boundaries are defined in \link{IMGT_REGIONS}. } alakazam/man/alakazam-package.Rd0000644000176200001440000000313214500351304016241 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Alakazam.R \docType{package} \name{alakazam-package} \alias{alakazam-package} \alias{_PACKAGE} \title{alakazam: Immunoglobulin Clonal Lineage and Diversity Analysis} \description{ Provides methods for high-throughput adaptive immune receptor repertoire sequencing (AIRR-Seq; Rep-Seq) analysis. In particular, immunoglobulin (Ig) sequence lineage reconstruction, lineage topology analysis, diversity profiling, amino acid property analysis and gene usage. Citations: Gupta and Vander Heiden, et al (2017) \doi{10.1093/bioinformatics/btv359}, Stern, Yaari and Vander Heiden, et al (2014) \doi{10.1126/scitranslmed.3008879}. } \seealso{ Useful links: \itemize{ \item \url{https://alakazam.readthedocs.io/} \item Report bugs at \url{https://bitbucket.org/kleinstein/alakazam/issues} } } \author{ \strong{Maintainer}: Susanna Marquez \email{susanna.marquez@yale.edu} Authors: \itemize{ \item Namita Gupta \email{namita.gupta@yale.edu} \item Nima Nouri \email{nima.nouri@yale.edu} \item Ruoyi Jiang \email{ruoyi.jiang@yale.edu} \item Julian Zhou \email{julian.zhou@bulldogs.yale.edu} \item Kenneth Hoehn \email{kenneth.hoehn@yale.edu} \item Jason Vander Heiden \email{jason.vanderheiden@gmail.com} \item Steven Kleinstein \email{steven.kleinstein@yale.edu} [copyright holder] } Other contributors: \itemize{ \item Daniel Gadala-Maria \email{daniel.gadala-maria@yale.edu} [contributor] \item Edel Aron \email{edel.aron@yale.edu} [contributor] \item Cole Jensen \email{cole.jensen@yale.edu} [contributor] } } \keyword{internal} alakazam/man/nonsquareDist.Rd0000644000176200001440000000364314500351305015736 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{nonsquareDist} \alias{nonsquareDist} \title{Calculate pairwise distances between sequences} \usage{ nonsquareDist(seq, indx, dist_mat = getDNAMatrix()) } \arguments{ \item{seq}{character vector containing a DNA sequences. The sequence vector needs to be named.} \item{indx}{numeric vector contating the indices (a subset of indices of \code{seq}).} \item{dist_mat}{Character distance matrix. Defaults to a Hamming distance matrix returned by \link{getDNAMatrix}. If gap characters, \code{c("-", ".")}, are assigned a value of -1 in \code{dist_mat} then contiguous gaps of any run length, which are not present in both sequences, will be counted as a distance of 1. Meaning, indels of any length will increase the sequence distance by 1. Gap values other than -1 will return a distance that does not consider indels as a special case.} } \value{ A matrix of numerical distance between each entry in \code{seq} and sequences specified by \code{indx} indices. Note that the input subsampled indices will be ordered ascendingly. Therefore, it is necassary to assign unique names to the input sequences, \code{seq}, to recover the input order later. Row and columns names will be added accordingly. Amino acid distance matrix may be built with \link{getAAMatrix}. Uses \link{seqDist} for calculating distances between pairs. See \link{pairwiseEqual} for generating an equivalence matrix. } \description{ \code{nonsquareDist} calculates all pairwise distance between a set of sequences and a subset of it. } \examples{ # Gaps will be treated as Ns with a gap=0 distance matrix seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C") pairwiseDist(seq, dist_mat=getDNAMatrix(gap=0)) nonsquareDist(seq, indx=c(1,3), dist_mat=getDNAMatrix(gap=0)) } alakazam/man/makeTempDir.Rd0000644000176200001440000000101214500351304015264 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{makeTempDir} \alias{makeTempDir} \title{Create a temporary folder} \usage{ makeTempDir(prefix) } \arguments{ \item{prefix}{prefix name for the folder.} } \value{ The path to the temporary folder. } \description{ \code{makeTempDir} creates a randomly named temporary folder in the system temp location. } \examples{ makeTempDir("Clone50") } \seealso{ This is just a wrapper for \link{tempfile} and \link{dir.create}. } alakazam/man/calcCoverage.Rd0000644000176200001440000000222214500351304015444 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Diversity.R \name{calcCoverage} \alias{calcCoverage} \title{Calculate sample coverage} \usage{ calcCoverage(x, r = 1) } \arguments{ \item{x}{numeric vector of abundance counts.} \item{r}{coverage order to calculate.} } \value{ The sample coverage of the given order \code{r}. } \description{ \code{calcCoverage} calculates the sample coverage estimate, a measure of sample completeness, for varying orders using the method of Chao et al, 2015, falling back to the Chao1 method in the first order case. } \examples{ # Calculate clone sizes clones <- countClones(ExampleDb, groups="sample_id") # Calculate 1first order coverage for a single sample calcCoverage(clones$seq_count[clones$sample_id == "+7d"]) } \references{ \enumerate{ \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ Used by \link{alphaDiversity}. } alakazam/man/stoufferMeta.Rd0000644000176200001440000000131414500351304015533 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Core.R \name{stoufferMeta} \alias{stoufferMeta} \title{Weighted meta-analysis of p-values via Stouffer's method} \usage{ stoufferMeta(p, w = NULL) } \arguments{ \item{p}{numeric vector of p-values.} \item{w}{numeric vector of weights.} } \value{ A named numeric vector with the combined Z-score and p-value in the form \code{c(Z, pvalue)}. } \description{ \code{stoufferMeta} combines multiple weighted p-values into a meta-analysis p-value using Stouffer's Z-score method. } \examples{ # Define p-value and weight vectors p <- c(0.1, 0.05, 0.3) w <- c(5, 10, 1) # Unweighted stoufferMeta(p) # Weighted stoufferMeta(p, w) } alakazam/man/countGenes.Rd0000644000176200001440000001045414500351304015206 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Gene.R \name{countGenes} \alias{countGenes} \title{Tabulates V(D)J allele, gene or family usage.} \usage{ countGenes( data, gene, groups = NULL, copy = NULL, clone = NULL, fill = FALSE, mode = c("gene", "allele", "family", "asis"), remove_na = TRUE ) } \arguments{ \item{data}{data.frame with AIRR-format or Change-O style columns.} \item{gene}{column containing allele assignments. Only the first allele in the column will be considered when \code{mode} is "gene", "family" or "allele". The value will be used as it is with \code{mode="asis"}.} \item{groups}{columns containing grouping variables. If \code{NULL} do not group.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If this value is specified, then total copy abundance is determined by the sum of copy numbers within each gene. This argument is ignored if \code{clone} is specified.} \item{clone}{name of the \code{data} column containing clone identifiers for each sequence. If this value is specified, then one gene will be considered for each clone. Note, this is accomplished by using the most common gene within each \code{clone} identifier. As such, ambiguous alleles within a clone will not be accurately represented.} \item{fill}{logical of \code{c(TRUE, FALSE)} specifying when if groups (when specified) lacking a particular gene should be counted as 0 if TRUE or not (omitted)} \item{mode}{one of \code{c("gene", "family", "allele", "asis")} defining the degree of specificity regarding allele calls. Determines whether to return counts for genes (calling \code{getGene}), families (calling \code{getFamily}), alleles (calling \code{getAllele}) or using the value as it is in the column \code{gene}, without any processing.} \item{remove_na}{removes rows with \code{NA} values in the gene column if \code{TRUE} and issues a warning. Otherwise, keeps those rows and considers \code{NA} as a gene in the final counts and relative abundances.} } \value{ A data.frame summarizing family, gene or allele counts and frequencies with columns: \itemize{ \item \code{gene}: name of the family, gene or allele. \item \code{seq_count}: total number of sequences for the gene. \item \code{seq_freq}: frequency of the gene as a fraction of the total number of sequences within each grouping. \item \code{copy_count}: sum of the copy counts in the \code{copy} column. for each gene. Only present if the \code{copy} argument is specified. \item \code{copy_freq}: frequency of the gene as a fraction of the total copy number within each group. Only present if the \code{copy} argument is specified. \item \code{clone_count}: total number of clones for the gene. Only present if the \code{clone} argument is specified. \item \code{clone_freq}: frequency of the gene as a fraction of the total number of clones within each grouping. Only present if the \code{clone} argument is specified. } Additional columns defined by the \code{groups} argument will also be present. } \description{ Determines the count and relative abundance of V(D)J alleles, genes or families within groups. } \examples{ # Without copy numbers genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="allele") # With copy numbers and multiple groups genes <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), copy="duplicate_count", mode="family") # Count by clone genes <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), clone="clone_id", mode="family") # Count absent genes genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="allele", fill=TRUE) } alakazam/man/plotMRCATest.Rd0000644000176200001440000000324314500351305015354 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{plotMRCATest} \alias{plotMRCATest} \title{Plot the results of a founder permutation test} \usage{ plotMRCATest( data, color = "black", main_title = "MRCA Test", style = c("histogram", "cdf"), silent = FALSE, ... ) } \arguments{ \item{data}{\link{MRCATest} object returned by \link{testMRCA}.} \item{color}{color of the histogram or lines.} \item{main_title}{string specifying the plot title.} \item{style}{type of plot to draw. One of: \itemize{ \item \code{"histogram"}: histogram of the annotation count distribution with a red dotted line denoting the observed value. \item \code{"cdf"}: cumulative distribution function of annotation counts with a red dotted line denoting the observed value and a blue dotted line indicating the p-value. }} \item{silent}{if \code{TRUE} do not draw the plot and just return the ggplot2 object; if \code{FALSE} draw the plot.} \item{...}{additional arguments to pass to ggplot2::theme.} } \value{ A \code{ggplot} object defining the plot. } \description{ \code{plotMRCATest} plots the results of a founder permutation test performed with \code{testMRCA}. } \examples{ \donttest{ # Define example tree set graphs <- ExampleTrees[1:10] # Perform MRCA test on isotypes x <- testMRCA(graphs, "c_call", nperm=10) # Plot plotMRCATest(x, color="steelblue", style="hist") plotMRCATest(x, style="cdf") } } \seealso{ See \link{testEdges} for performing the test. } alakazam/man/rarefyDiversity.Rd0000644000176200001440000001012414500351304016261 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Deprecated.R \name{rarefyDiversity} \alias{rarefyDiversity} \title{Generate a clonal diversity index curve} \usage{ rarefyDiversity( data, group, clone = "CLONE", copy = NULL, min_q = 0, max_q = 4, step_q = 0.05, min_n = 30, max_n = NULL, ci = 0.95, nboot = 2000, uniform = TRUE, progress = FALSE ) } \arguments{ \item{data}{data.frame with Change-O style columns containing clonal assignments.} \item{group}{name of the \code{data} column containing group identifiers.} \item{clone}{name of the \code{data} column containing clone identifiers.} \item{copy}{name of the \code{data} column containing copy numbers for each sequence. If \code{copy=NULL} (the default), then clone abundance is determined by the number of sequences. If a \code{copy} column is specified, then clone abundances is determined by the sum of copy numbers within each clonal group.} \item{min_q}{minimum value of \eqn{q}.} \item{max_q}{maximum value of \eqn{q}.} \item{step_q}{value by which to increment \eqn{q}.} \item{min_n}{minimum number of observations to sample. A group with less observations than the minimum is excluded.} \item{max_n}{maximum number of observations to sample. If \code{NULL} then no maximum is set.} \item{ci}{confidence interval to calculate; the value must be between 0 and 1.} \item{nboot}{number of bootstrap realizations to generate.} \item{uniform}{if \code{TRUE} then uniformly resample each group to the same number of observations. If \code{FALSE} then allow each group to be resampled to its original size or, if specified, \code{max_size}.} \item{progress}{if \code{TRUE} show a progress bar.} } \value{ A \link{DiversityCurve} object summarizing the diversity scores. } \description{ \code{rarefyDiversity} divides a set of clones by a group annotation, resamples the sequences from each group, and calculates diversity scores (\eqn{D}) over an interval of diversity orders (\eqn{q}). } \details{ Clonal diversity is calculated using the generalized diversity index (Hill numbers) proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. Diversity is calculated on the estimated complete clonal abundance distribution. This distribution is inferred by using the Chao1 estimator to estimate the number of seen clones, and applying the relative abundance correction and unseen clone frequency described in Chao et al, 2015. To generate a smooth curve, \eqn{D} is calculated for each value of \eqn{q} from \code{min_q} to \code{max_q} incremented by \code{step_q}. When \code{uniform=TRUE} variability in total sequence counts across unique values in the \code{group} column is corrected by repeated resampling from the estimated complete clonal distribution to a common number of sequences. The diversity index (\eqn{D}) for each group is the mean value of over all resampling realizations. Confidence intervals are derived using the standard deviation of the resampling realizations, as described in Chao et al, 2015. } \examples{ \dontrun{ # Group by sample identifier div <- rarefyDiversity(ExampleDb, "sample_id", step_q=1, max_q=10, nboot=100) plotDiversityCurve(div, legend_title="Sample") # Grouping by isotype rather than sample identifier div <- rarefyDiversity(ExampleDb, "c_call", min_n=40, step_q=1, max_q=10, nboot=100) plotDiversityCurve(div, legend_title="Isotype") } } \references{ \enumerate{ \item Hill M. Diversity and evenness: a unifying notation and its consequences. Ecology. 1973 54(2):427-32. \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. Scand J Stat. 1984 11, 265270. \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. \item Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. } } \seealso{ \link{alphaDiversity} } alakazam/man/bulk.Rd0000644000176200001440000000264514500351304014034 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AminoAcids.R \name{bulk} \alias{bulk} \title{Calculates the average bulkiness of amino acid sequences} \usage{ bulk(seq, bulkiness = NULL) } \arguments{ \item{seq}{vector of strings containing amino acid sequences.} \item{bulkiness}{named numerical vector defining bulkiness scores for each amino acid, where names are single-letter amino acid character codes. If \code{NULL}, then the Zimmerman et al, 1968 scale is used.} } \value{ A vector of bulkiness scores for the sequence(s). } \description{ \code{bulk} calculates the average bulkiness score of amino acid sequences. Non-informative positions are excluded, where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. } \examples{ # Default bulkiness scale seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") bulk(seq) # Use the Grantham, 1974 side chain volumn scores from the seqinr package library(seqinr) data(aaindex) x <- aaindex[["GRAR740103"]]$I # Rename the score vector to use single-letter codes names(x) <- translateStrings(names(x), ABBREV_AA) # Calculate average volume bulk(seq, bulkiness=x) } \references{ \enumerate{ \item Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). } } \seealso{ For additional size related indices see \link[seqinr]{aaindex}. } alakazam/man/getSegment.Rd0000644000176200001440000000722614500351304015201 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Gene.R \name{getSegment} \alias{getSegment} \alias{getAllele} \alias{getGene} \alias{getFamily} \alias{getLocus} \alias{getChain} \title{Get Ig segment allele, gene and family names} \usage{ getSegment( segment_call, segment_regex, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getAllele( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getGene( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getFamily( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getLocus( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) getChain( segment_call, first = TRUE, collapse = TRUE, strip_d = TRUE, omit_nl = FALSE, sep = "," ) } \arguments{ \item{segment_call}{character vector containing segment calls delimited by commas.} \item{segment_regex}{string defining the segment match regular expression.} \item{first}{if \code{TRUE} return only the first call in \code{segment_call}; if \code{FALSE} return all calls delimited by commas.} \item{collapse}{if \code{TRUE} check for duplicates and return only unique segment assignments; if \code{FALSE} return all assignments (faster). Has no effect if \code{first=TRUE}.} \item{strip_d}{if \code{TRUE} remove the "D" from the end of gene annotations (denoting a duplicate gene in the locus); if \code{FALSE} do not alter gene names.} \item{omit_nl}{if \code{TRUE} remove non-localized (NL) genes from the result. Only applies at the gene or allele level.} \item{sep}{character defining both the input and output segment call delimiter.} } \value{ A character vector containing allele, gene or family names. } \description{ \code{getSegment} performs generic matching of delimited segment calls with a custom regular expression. \link{getAllele}, \link{getGene} and \link{getFamily} extract the allele, gene and family names, respectively, from a character vector of immunoglobulin (Ig) or TCR segment allele calls in IMGT format. } \examples{ # Light chain examples kappa_call <- c("Homsap IGKV1D-39*01 F,Homsap IGKV1-39*02 F,Homsap IGKV1-39*01", "Homsap IGKJ5*01 F") getAllele(kappa_call) getAllele(kappa_call, first=FALSE) getAllele(kappa_call, first=FALSE, strip_d=FALSE) getGene(kappa_call) getGene(kappa_call, first=FALSE) getGene(kappa_call, first=FALSE, strip_d=FALSE) getFamily(kappa_call) getFamily(kappa_call, first=FALSE) getFamily(kappa_call, first=FALSE, collapse=FALSE) getFamily(kappa_call, first=FALSE, strip_d=FALSE) getLocus(kappa_call) getChain(kappa_call) # Heavy chain examples heavy_call <- c("Homsap IGHV1-69*01 F,Homsap IGHV1-69D*01 F", "Homsap IGHD1-1*01 F", "Homsap IGHJ1*01 F") getAllele(heavy_call, first=FALSE) getAllele(heavy_call, first=FALSE, strip_d=FALSE) getGene(heavy_call, first=FALSE) getGene(heavy_call, first=FALSE, strip_d=FALSE) getFamily(heavy_call) getLocus(heavy_call) getChain(heavy_call) # Filtering non-localized genes nl_call <- c("IGHV3-NL1*01,IGHV3-30-3*01,IGHV3-30*01", "Homosap IGHV3-30*01 F,Homsap IGHV3-NL1*01 F", "IGHV1-NL1*01") getAllele(nl_call, first=FALSE, omit_nl=TRUE) getGene(nl_call, first=FALSE, omit_nl=TRUE) getFamily(nl_call, first=FALSE, omit_nl=TRUE) # Temporary designation examples tmp_call <- c("IGHV9S3*01", "IGKV10S12*01") getAllele(tmp_call) getGene(tmp_call) getFamily(tmp_call) } \references{ \url{https://www.imgt.org/} } \seealso{ \link{countGenes} } alakazam/man/seqDist.Rd0000644000176200001440000000427714500351305014517 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Sequence.R \name{seqDist} \alias{seqDist} \title{Calculate distance between two sequences} \usage{ seqDist(seq1, seq2, dist_mat = getDNAMatrix()) } \arguments{ \item{seq1}{character string containing a DNA sequence.} \item{seq2}{character string containing a DNA sequence.} \item{dist_mat}{Character distance matrix. Defaults to a Hamming distance matrix returned by \link{getDNAMatrix}. If gap characters, \code{c("-", ".")}, are assigned a value of -1 in \code{dist_mat} then contiguous gaps of any run length, which are not present in both sequences, will be counted as a distance of 1. Meaning, indels of any length will increase the sequence distance by 1. Gap values other than -1 will return a distance that does not consider indels as a special case.} } \value{ Numerical distance between \code{seq1} and \code{seq2}. } \description{ \code{seqDist} calculates the distance between two DNA sequences. } \examples{ # Ungapped examples seqDist("ATGGC", "ATGGG") seqDist("ATGGC", "ATG??") # Gaps will be treated as Ns with a gap=0 distance matrix seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=0)) # Gaps will be treated as universally non-matching characters with gap=1 seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=1)) # Gaps of any length will be treated as single mismatches with a gap=-1 distance matrix seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) # Gaps of equivalent run lengths are not counted as gaps seqDist("ATG-C", "ATG-C", dist_mat=getDNAMatrix(gap=-1)) # Overlapping runs of gap characters are counted as a single gap seqDist("ATG-C", "AT--C", dist_mat=getDNAMatrix(gap=-1)) seqDist("A-GGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) seqDist("AT--C", "AT--C", dist_mat=getDNAMatrix(gap=-1)) # Discontiguous runs of gap characters each count as separate gaps seqDist("-TGGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) } \seealso{ Nucleotide distance matrix may be built with \link{getDNAMatrix}. Amino acid distance matrix may be built with \link{getAAMatrix}. Used by \link{pairwiseDist} for generating distance matrices. See \link{seqEqual} for testing sequence equivalence. } alakazam/man/ExampleTrees.Rd0000644000176200001440000000144214500351304015467 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Data.R \docType{data} \name{ExampleTrees} \alias{ExampleTrees} \title{Example Ig lineage trees} \format{ A list of igraph objects output by \link{buildPhylipLineage}. Each node of each tree has the following annotations (vertex attributes): \itemize{ \item \code{sample_id}: Sample identifier(s). Time in relation to vaccination. \item \code{c_call}: Isotype assignment(s). \item \code{duplication_count}: Copy count (number of duplicates) of the sequence. } } \usage{ ExampleTrees } \description{ A set of Ig lineage trees generated from the \code{ExampleDb} file, subset to only those trees with at least four nodes. } \seealso{ \link{ExampleTrees} } \keyword{datasets} alakazam/man/getMRCA.Rd0000644000176200001440000000357514500351305014325 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Topology.R \name{getMRCA} \alias{getMRCA} \title{Retrieve the first non-root node of a lineage tree} \usage{ getMRCA( graph, path = c("distance", "steps"), root = "Germline", field = NULL, exclude = NULL ) } \arguments{ \item{graph}{igraph object containing an annotated lineage tree.} \item{path}{string defining whether to use unweighted (steps) or weighted (distance) measures for determining the founder node set..} \item{root}{name of the root (germline) node.} \item{field}{annotation field to use for both unweighted path length exclusion and consideration as an MRCA node. If \code{NULL} do not exclude any nodes.} \item{exclude}{vector of annotation values in \code{field} to exclude from the potential MRCA set. If \code{NULL} do not exclude any nodes. Has no effect if \code{field=NULL}.} } \value{ A data.frame of the MRCA node(s) containing the columns: \itemize{ \item \code{name}: node name \item \code{steps}: path length as the number of nodes traversed \item \code{distance}: path length as the sum of edge weights } Along with additional columns corresponding to the annotations of the input graph. } \description{ \code{getMRCA} returns the set of lineage tree nodes with the minimum weighted or unweighted path length from the root (germline) of the lineage tree, allowing for exclusion of specific groups of nodes. } \examples{ # Define example graph graph <- ExampleTrees[[23]] # Use unweighted path length and do not exclude any nodes getMRCA(graph, path="steps", root="Germline") # Exclude nodes without an isotype annotation and use weighted path length getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) } \seealso{ Path lengths are determined with \link{getPathLengths}. } alakazam/man/EdgeTest-class.Rd0000644000176200001440000000340114500351304015675 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/Classes.R \docType{class} \name{EdgeTest-class} \alias{EdgeTest-class} \alias{EdgeTest} \alias{print,EdgeTest-method} \alias{EdgeTest-method} \alias{plot,EdgeTest,missing-method} \title{S4 class defining edge significance} \usage{ \S4method{print}{EdgeTest}(x) \S4method{plot}{EdgeTest,missing}(x, y, ...) } \arguments{ \item{x}{EdgeTest object.} \item{y}{ignored.} \item{...}{arguments to pass to \link{plotEdgeTest}.} } \description{ \code{EdgeTest} defines the significance of parent-child annotation enrichment. } \section{Slots}{ \describe{ \item{\code{tests}}{data.frame describing the significance test results with columns: \itemize{ \item \code{parent}: parent node annotation. \item \code{child}: child node annotation \item \code{count}: count of observed edges with the given parent-child annotation set. \item \code{expected}: mean count of expected edges for the given parent-child relationship. \item \code{pvalue}: one-sided p-value for the hypothesis that the observed edge abundance is greater than expected. }} \item{\code{permutations}}{data.frame containing the raw permutation test data with columns: \itemize{ \item \code{parent}: parent node annotation. \item \code{child}: child node annotation \item \code{count}: count of edges with the given parent-child annotation set. \item \code{iter}: numerical index define which permutation realization each observation corresponds to. }} \item{\code{nperm}}{number of permutation realizations.} }} alakazam/DESCRIPTION0000644000176200001440000000611614505673010013546 0ustar liggesusersPackage: alakazam Type: Package Version: 1.3.0 Date: 2023-09-29 Authors@R: c(person("Susanna", "Marquez", role=c("cre", "aut"), email="susanna.marquez@yale.edu"), person("Namita", "Gupta", role=c("aut"), email="namita.gupta@yale.edu"), person("Nima", "Nouri", role=c("aut"), email="nima.nouri@yale.edu"), person("Ruoyi", "Jiang", role=c("aut"), email="ruoyi.jiang@yale.edu"), person("Julian", "Zhou", role=c("aut"), email="julian.zhou@bulldogs.yale.edu"), person("Kenneth", "Hoehn", role=c("aut"), email="kenneth.hoehn@yale.edu"), person("Daniel", "Gadala-Maria", role=c("ctb"), email="daniel.gadala-maria@yale.edu"), person("Edel", "Aron", role=c("ctb"), email="edel.aron@yale.edu"), person("Cole", "Jensen", role=c("ctb"), email="cole.jensen@yale.edu"), person("Jason", "Vander Heiden", role=c("aut"), email="jason.vanderheiden@gmail.com"), person("Steven", "Kleinstein", role=c("aut", "cph"), email="steven.kleinstein@yale.edu")) Title: Immunoglobulin Clonal Lineage and Diversity Analysis Description: Provides methods for high-throughput adaptive immune receptor repertoire sequencing (AIRR-Seq; Rep-Seq) analysis. In particular, immunoglobulin (Ig) sequence lineage reconstruction, lineage topology analysis, diversity profiling, amino acid property analysis and gene usage. Citations: Gupta and Vander Heiden, et al (2017) , Stern, Yaari and Vander Heiden, et al (2014) . License: AGPL-3 URL: https://alakazam.readthedocs.io/ BugReports: https://bitbucket.org/kleinstein/alakazam/issues LazyData: true BuildVignettes: true VignetteBuilder: knitr, rmarkdown Encoding: UTF-8 LinkingTo: Rcpp biocViews: Software, AnnotationData Depends: R (>= 4.0), ggplot2 (>= 3.4.0) Imports: airr (>= 1.4.1), ape, dplyr (>= 1.0), graphics, grid, igraph (>= 1.5.0), Matrix (>= 1.3-0), methods, progress, Rcpp (>= 0.12.12), readr, rlang, scales, seqinr, stats, stringi, tibble, tidyr (>= 1.0), utils, Biostrings (>= 2.56.0), GenomicAlignments (>= 1.24.0), IRanges (>= 2.22.2) Suggests: knitr, rmarkdown, testthat RoxygenNote: 7.2.3 Collate: 'Alakazam.R' 'AminoAcids.R' 'Classes.R' 'Core.R' 'Data.R' 'Diversity.R' 'Deprecated.R' 'Fastq.R' 'Gene.R' 'Lineage.R' 'RcppExports.R' 'Sequence.R' 'Topology.R' NeedsCompilation: yes Packaged: 2023-09-29 13:49:31 UTC; susanna Author: Susanna Marquez [cre, aut], Namita Gupta [aut], Nima Nouri [aut], Ruoyi Jiang [aut], Julian Zhou [aut], Kenneth Hoehn [aut], Daniel Gadala-Maria [ctb], Edel Aron [ctb], Cole Jensen [ctb], Jason Vander Heiden [aut], Steven Kleinstein [aut, cph] Maintainer: Susanna Marquez Repository: CRAN Date/Publication: 2023-09-30 01:12:40 UTC alakazam/build/0000755000176200001440000000000014505552753013145 5ustar liggesusersalakazam/build/vignette.rds0000644000176200001440000000057014505552753015506 0ustar liggesusersAO06AHLP/;<4^&m'ͯE|>J5Fo_o#$ [$a`j萈t{5Yq!' O3_ f ?R+)MS/fTW3x{t|=m8)s)Ź9SYPr*0p.ea`iAddb)QEbV=G/::RnGfG2z:R5OG*3: e}9 } o v$ޏZJAW mҶ x`~>LgvBΔL;V}󡮒1>v#xi|%X{)5tPpv_9$alakazam/build/partial.rdb0000644000176200001440000000007514505552645015274 0ustar liggesusersb```b`afd`b1 H020piּb C"{7alakazam/src/0000755000176200001440000000000014505552753012635 5ustar liggesusersalakazam/src/RcppDistance.cpp0000644000176200001440000002204614115144216015710 0ustar liggesusers#include #include #include using namespace Rcpp; // [[Rcpp::plugins(cpp11)]] //' Test DNA sequences for equality. //' //' \code{seqEqual} checks if two DNA sequences are identical. //' //' @param seq1 character string containing a DNA sequence. //' @param seq2 character string containing a DNA sequence. //' @param ignore vector of characters to ignore when testing for equality. //' Default is to ignore c("N",".","-","?") //' //' @return Returns \code{TRUE} if sequences are equal and \code{FALSE} if they are not. //' Sequences of unequal length will always return \code{FALSE} regardless of //' their character values. //' //' @seealso Used by \link{pairwiseEqual} within \link{collapseDuplicates}. //' See \link{seqDist} for calculation Hamming distances between sequences. //' //' @examples //' # Ignore gaps //' seqEqual("ATG-C", "AT--C") //' seqEqual("ATGGC", "ATGGN") //' seqEqual("AT--T", "ATGGC") //' //' # Ignore only Ns //' seqEqual("ATG-C", "AT--C", ignore="N") //' seqEqual("ATGGC", "ATGGN", ignore="N") //' seqEqual("AT--T", "ATGGC", ignore="N") //' //' @export // [[Rcpp::export]] bool seqEqual(std::string seq1, std::string seq2, CharacterVector ignore=CharacterVector::create("N","-",".","?")) { int ig_len = ignore.length(); ig_len = ignore.length(); int len_seq1 = seq1.length(); int len_seq2 = seq2.length(); if (len_seq1 != len_seq2) { return (FALSE); } else { for(int i = 0; i < len_seq1; i++) { char seq1_char = (char)seq1[i]; char seq2_char = (char)seq2[i]; if (seq1_char != seq2_char) { bool ignore_seq1 = FALSE; bool ignore_seq2 = FALSE; for(int j = 0; j < ig_len; j++) { char ig = *(char*)ignore[j]; if (ig == seq1_char) { ignore_seq1 = TRUE; } if (ig == seq2_char) { ignore_seq2 = TRUE; } } if (!ignore_seq1 & !ignore_seq2) { return FALSE; } } } return TRUE; } } //' Calculate pairwise equivalence between sequences //' //' \code{pairwiseEqual} determined pairwise equivalence between a pairs in a //' set of sequences, excluding ambiguous positions (Ns and gaps). //' //' @param seq character vector containing a DNA sequences. //' //' @return A logical matrix of equivalence between each entry in \code{seq}. //' Values are \code{TRUE} when sequences are equivalent and \code{FALSE} //' when they are not. //' //' @seealso Uses \link{seqEqual} for testing equivalence between pairs. //' See \link{pairwiseDist} for generating a sequence distance matrix. //' //' @examples //' # Gaps and Ns will match any character //' seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C", E="NTGGG") //' d <- pairwiseEqual(seq) //' rownames(d) <- colnames(d) <- seq //' d //' //' @export // [[Rcpp::export]] LogicalMatrix pairwiseEqual(StringVector seq) { // allocate the matrix we will return LogicalMatrix rmat(seq.length(), seq.length()); for (int i = 0; i < rmat.nrow(); i++) { for (int j = 0; j <= i; j++) { // check seq equal std::string row_seq = as(seq[i]); std::string col_seq = as(seq[j]); bool is_equal = seqEqual(row_seq, col_seq); // write to output matrix rmat(i,j) = is_equal; rmat(j,i) = is_equal; } } // Add row and column names Rcpp::List dimnames = Rcpp::List::create(seq.attr("names"), seq.attr("names")); rmat.attr("dimnames") = dimnames; return rmat; } // seqDist // [[Rcpp::export]] double seqDistRcpp(std::string seq1, std::string seq2, NumericMatrix dist_mat) { // Check that seq1 and seq2 have same length int len_seq1 = seq1.length(); int len_seq2 = seq2.length(); if (len_seq1 != len_seq2) { throw std::range_error("Sequences of different length."); } int len_seqs = len_seq1; List dist_mat_dims = dist_mat.attr("dimnames"); //print (dist_mat_dims); CharacterVector dist_mat_rownames = dist_mat_dims[0]; CharacterVector dist_mat_colnames = dist_mat_dims[1]; int num_rows = dist_mat_rownames.size(); int num_cols = dist_mat_colnames.size(); List row_key_idx; List col_key_idx; std::map rows_map; std::map cols_map; for (int i = 0; i < num_rows; i++) { //const char *this_col = dist_mat_colnames[i].c_str(); std::string this_row = as(dist_mat_rownames[i]); rows_map[this_row] = i; } for (int i = 0; i < num_cols; i++) { //const char *this_col = dist_mat_colnames[i].c_str(); std::string this_col = as(dist_mat_colnames[i]); cols_map[this_col] = i; } int d_seen = 0; int indels = 0; // sum(d[d>0]) double d_sum = 0; for (int i = 0; i < len_seqs; i++) { // find row index int row_idx; char row_char = (char)seq1[i]; std::string row_string; row_string+=row_char; auto search_row = rows_map.find(row_string); if(search_row != rows_map.end()) { row_idx = search_row->second; } else { throw std::range_error("Character not found in dist_mat."); } // find col index int col_idx; char col_char = (char)seq2[i]; std::string col_string; col_string+=col_char; auto search_col = cols_map.find(col_string); if(search_col != cols_map.end()) { col_idx = search_col->second; } else { throw std::range_error("Character not found in dist_mat."); } // distance for current i double d_i = dist_mat(row_idx, col_idx); if (d_i > 0){ // Sum distance d_sum = d_sum + d_i; } else if ( (d_i == -1 ) & (d_seen != -1) ) { // Count indel indels++; } d_seen = d_i; } double distance = d_sum + indels; return (distance); } // pairwiseDist // [[Rcpp::export]] NumericMatrix pairwiseDistRcpp(StringVector seq, NumericMatrix dist_mat) { // allocate the matrix we will return NumericMatrix rmat(seq.length(), seq.length()); for (int i = 0; i < rmat.nrow(); i++) { for (int j = 0; j < i; j++) { // check seq equal std::string row_seq = as(seq[i]); std::string col_seq = as(seq[j]); double distance = seqDistRcpp(row_seq, col_seq, dist_mat); // write to output matrix rmat(i,j) = distance; rmat(j,i) = distance; } } // Add row and column names Rcpp::List dimnames = Rcpp::List::create(seq.attr("names"), seq.attr("names")); rmat.attr("dimnames") = dimnames; return rmat; } // nonsquareDist // [[Rcpp::export]] NumericMatrix nonsquareDistRcpp(StringVector seq, NumericVector indx, NumericMatrix dist_mat) { // defien variables int m, n, i, j; std::string row_seq, col_seq; // extract the sizes. Note: This should be satisfied (n<=m) m = indx.size(); //number of rows n = seq.size(); //number of columns // allocate the main matrix NumericMatrix rmat(m,n); std::fill(rmat.begin(), rmat.end(), NA_REAL); // sort and push indices back by 1 to match c++ indexing std::sort(indx.begin(), indx.end()); indx = indx - 1; // find the position of the column ids in the indx vector NumericVector pos(n); for (j = 0; j < n; j++) { pos[j] = std::find(indx.begin(), indx.end(), j) - indx.begin(); } // begin filling rmat for (i = 0; i < m; i++) { row_seq = as(seq[indx[i]]); //row sequence for (j = 0; j < n; j++) { if (!R_IsNA(rmat(i,j))) continue; if (indx[i] == j) rmat(i,j) = 0; else { col_seq = as(seq[j]); //col sequence rmat(i,j) = seqDistRcpp(row_seq, col_seq, dist_mat); if (pos[j] < m) rmat(pos[j],indx[i]) = rmat(i,j); } } } // Add row and column names StringVector subSeq = seq[indx]; Rcpp::List dimnames = Rcpp::List::create(subSeq.attr("names"), //rownames seq.attr("names")); //colnames rmat.attr("dimnames") = dimnames; // return matrix return rmat; } alakazam/src/RcppExports.cpp0000644000176200001440000000701714505513556015635 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include using namespace Rcpp; #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // seqEqual bool seqEqual(std::string seq1, std::string seq2, CharacterVector ignore); RcppExport SEXP _alakazam_seqEqual(SEXP seq1SEXP, SEXP seq2SEXP, SEXP ignoreSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type seq1(seq1SEXP); Rcpp::traits::input_parameter< std::string >::type seq2(seq2SEXP); Rcpp::traits::input_parameter< CharacterVector >::type ignore(ignoreSEXP); rcpp_result_gen = Rcpp::wrap(seqEqual(seq1, seq2, ignore)); return rcpp_result_gen; END_RCPP } // pairwiseEqual LogicalMatrix pairwiseEqual(StringVector seq); RcppExport SEXP _alakazam_pairwiseEqual(SEXP seqSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< StringVector >::type seq(seqSEXP); rcpp_result_gen = Rcpp::wrap(pairwiseEqual(seq)); return rcpp_result_gen; END_RCPP } // seqDistRcpp double seqDistRcpp(std::string seq1, std::string seq2, NumericMatrix dist_mat); RcppExport SEXP _alakazam_seqDistRcpp(SEXP seq1SEXP, SEXP seq2SEXP, SEXP dist_matSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type seq1(seq1SEXP); Rcpp::traits::input_parameter< std::string >::type seq2(seq2SEXP); Rcpp::traits::input_parameter< NumericMatrix >::type dist_mat(dist_matSEXP); rcpp_result_gen = Rcpp::wrap(seqDistRcpp(seq1, seq2, dist_mat)); return rcpp_result_gen; END_RCPP } // pairwiseDistRcpp NumericMatrix pairwiseDistRcpp(StringVector seq, NumericMatrix dist_mat); RcppExport SEXP _alakazam_pairwiseDistRcpp(SEXP seqSEXP, SEXP dist_matSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< StringVector >::type seq(seqSEXP); Rcpp::traits::input_parameter< NumericMatrix >::type dist_mat(dist_matSEXP); rcpp_result_gen = Rcpp::wrap(pairwiseDistRcpp(seq, dist_mat)); return rcpp_result_gen; END_RCPP } // nonsquareDistRcpp NumericMatrix nonsquareDistRcpp(StringVector seq, NumericVector indx, NumericMatrix dist_mat); RcppExport SEXP _alakazam_nonsquareDistRcpp(SEXP seqSEXP, SEXP indxSEXP, SEXP dist_matSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< StringVector >::type seq(seqSEXP); Rcpp::traits::input_parameter< NumericVector >::type indx(indxSEXP); Rcpp::traits::input_parameter< NumericMatrix >::type dist_mat(dist_matSEXP); rcpp_result_gen = Rcpp::wrap(nonsquareDistRcpp(seq, indx, dist_mat)); return rcpp_result_gen; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_alakazam_seqEqual", (DL_FUNC) &_alakazam_seqEqual, 3}, {"_alakazam_pairwiseEqual", (DL_FUNC) &_alakazam_pairwiseEqual, 1}, {"_alakazam_seqDistRcpp", (DL_FUNC) &_alakazam_seqDistRcpp, 3}, {"_alakazam_pairwiseDistRcpp", (DL_FUNC) &_alakazam_pairwiseDistRcpp, 2}, {"_alakazam_nonsquareDistRcpp", (DL_FUNC) &_alakazam_nonsquareDistRcpp, 3}, {NULL, NULL, 0} }; RcppExport void R_init_alakazam(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } alakazam/vignettes/0000755000176200001440000000000014505552753014056 5ustar liggesusersalakazam/vignettes/Topology-Vignette.Rmd0000644000176200001440000003063214145427343020121 0ustar liggesusers--- title: 'Alakazam: Topology analysis of lineage trees' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Topology analysis} %\usepackage[utf8]{inputenc} --- This vignette covers the basics of analyzing the topologies of Ig lineage trees built using `buildPhylipLineage`, using some built-in alakazam functions that focus on quantifying annotation relationships within lineages. ## Example data A small set of annotated example trees, `ExampleTrees`, are included in the `alakazam` package. The trees are `igraph` objects with the following tree annotations (graph attributes): * `clone`: An identifier for the clonal group. These entries correspond to the `clone_id` column in the `ExampleDb` data.frame from which the trees were generated. * `v_gene`: IGHV gene name. * `j_gene`: IGHJ gene name. * `junc_len`: Length of the junction region (nucleotides). And the following node annotations (vertex attributes): * `sample_id`: Time point in relation to influenza vaccination. * `c_call`: The isotype(s) assigned to the sequence. Multiple isotypes are delimited by comma, and reflect identical V(D)J sequences observed with more than one isotype. * `duplicate_count`: The copy number (duplicate count), which indicates the total number of reads with the same V(D)J sequence. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(igraph) library(dplyr) # Load example trees data(ExampleTrees) # Select one tree for example purposes graph <- ExampleTrees[[24]] # And add some annotation complexity to the tree V(graph)$sample_id[c(2, 7)] <- "-1h" V(graph)$c_call[c(2, 7)] <- "IGHM" # Make a list of example trees excluding multi-isotype trees graph_list <- ExampleTrees[sapply(ExampleTrees, function(x) !any(grepl(",", V(x)$c_call)))] ``` ## Plotting annotations on a tree There are many options for configuring how an igraph object is plotted which are helpful for visualizing annotation topologies. Below is an extensive example of how to plot a tree by configuring the colors, labels, shapes and sizes of different visual elements according to annotations embedded in the graph. ```{r, eval=TRUE} # Set node colors V(graph)$color[V(graph)$sample_id == "-1h"] <- "seagreen" V(graph)$color[V(graph)$sample_id == "+7d"] <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" # Set node labels V(graph)$label <- paste(V(graph)$sample_id, V(graph)$c_call, sep=", ") V(graph)$label[V(graph)$name == "Germline"] <- "" V(graph)$label[grepl("Inferred", V(graph)$name)] <- "" # Set node shapes V(graph)$shape <- "crectangle" V(graph)$shape[V(graph)$name == "Germline"] <- "circle" V(graph)$shape[grepl("Inferred", V(graph)$name)] <- "circle" # Set node sizes V(graph)$size <- 60 V(graph)$size[V(graph)$name == "Germline"] <- 30 V(graph)$size[grepl("Inferred", V(graph)$name)] <- 15 # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.05) # Plot the example tree plot(graph, layout=layout_as_tree, vertex.frame.color="grey", vertex.label.color="black", edge.label.color="black", edge.arrow.mode=0) # Add legend legend("topleft", c("Germline", "Inferred", "-1h", "+7d"), fill=c("black", "white", "seagreen", "steelblue"), cex=0.75) ``` ## Summarizing node properties Various annotation dependent node statistics can be calculated using the `summarizeSubtrees` and `getPathLengths` functions. `getPathLengths` calculates distances from the root (germline) *to child nodes*, whereas `summarizeSubtrees` calculates paths and subtree statistics *from child nodes*. ### Calculating distance from the germline To determine the shortest path from the germline sequence to any node, we use `getPathLengths`, which returns the distance both as the number of "hops" (`steps`) and the number of mutational events (`distance`). ```{r, eval=TRUE} # Consider all nodes getPathLengths(graph, root="Germline") ``` Note, the `STEPS` counted in the above example include traversal of inferred intermediates. If you want to exclude such nodes and consider only nodes associated with observed sequences, you can specify an annotation field and value that will be excluded from the number of steps. In the example below we are excluding `NA` values in the `c_call` annotation (`field="c_call", exclude=NA`). ```{r, eval=TRUE} # Exclude nodes without an isotype annotation from step count getPathLengths(graph, root="Germline", field="c_call", exclude=NA) ``` Note, `steps` has changed with respect to the previous example, but `distance` remains the same. ### Calculating subtree properties The `summarizeSubtrees` function returns a table of each node with the following properties for each node: * `name`: The node identifier. * `parent`: The identifier of the node's parent. * `outdegree`: The number of edges leading from the node. * `size`: The total number of nodes within the subtree rooted at the node. * `depth`: The depth of the subtree that is rooted at the node. * `pathlength`: The maximum path length beneath the node. * `outdegree_norm`: The `outdegree` normalized by the total number of edges. * `size_norm`: The `size` normalized by the total tree size. * `depth_norm`: The `depth` normalized by the total tree depth. * `pathlength_norm`: The `pathlength` normalized by the longest path. The `fields=c("sample_id", "c_call")` argument in the example below simply defines which annotations we wish to retain in the output. This argument has no effect on the results, in constast to the behavior of `getPathLengths`. ```{r, eval=TRUE} # Summarize tree df <- summarizeSubtrees(graph, fields=c("sample_id", "c_call"), root="Germline") print(df[1:4]) print(df[c(1, 5:8)]) print(df[c(1, 9:12)]) ``` Distributions of normalized subtree statistics for a population of trees can be plotted using the `plotSubtrees` function. In the example below, we have specified `silent=TRUE` which causes `plotSubtrees` to return the ggplot object without rendering the plot. The ggplot object are then plotting using the `gridPlot` function which places each individual plot in a separate panel of the same figure. ```{r, eval=TRUE} # Set sample colors sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") # Box plots of node outdegree by sample p1 <- plotSubtrees(graph_list, "sample_id", "outdegree", colors=sample_colors, main_title="Node outdegree", legend_title="Time", style="box", silent=TRUE) # Box plots of subtree size by sample p2 <- plotSubtrees(graph_list, "sample_id", "size", colors=sample_colors, main_title="Subtree size", legend_title="Time", style="box", silent=TRUE) # Violin plots of subtree path length by isotype p3 <- plotSubtrees(graph_list, "c_call", "pathlength", colors=IG_COLORS, main_title="Subtree path length", legend_title="Isotype", style="violin", silent=TRUE) # Violin plots of subtree depth by isotype p4 <- plotSubtrees(graph_list, "c_call", "depth", colors=IG_COLORS, main_title="Subtree depth", legend_title="Isotype", style="violin", silent=TRUE) # Plot in a 2x2 grid gridPlot(p1, p2, p3, p4, ncol=2) ``` ## Counting and testing node annotation relationships Given a set of annotated trees, you can determine the abundance of specific parent-child relationships within individual trees using the `tableEdges` function and the signficance of these relationships in population of trees using the `testEdges` function. Annotation relationships over edges can be calculated as direct or indirect relationships, where a direct relationship is a parent-child pair and an indirect relationship is a decent relationship that travels through another node (or nodes) first. ### Tabulating edges for a single tree Tabulating all directparent-child annotation relationships in the tree by isotype annotation can be performed like so: ```{r, eval=TRUE} # Count direct edges between isotypes tableEdges(graph, "c_call") ``` The above output is cluttered with the `NA` annotations from the germline and inferred nodes. We can perform the same direct tabulation, but exclude any nodes annotated with either `Germline` or `NA` for c_call using the `exclude` argument: ```{r, eval=TRUE} # Direct edges excluding germline and inferred nodes tableEdges(graph, "c_call", exclude=c("Germline", NA)) ``` As there are inferred nodes in the tree, we might want to consider indirect parent-child relationships that traverse through inferred nodes. This is accomplished using the same arguments as above, but with the addition of the `indirect=TRUE` argument which will skip over the excluded nodes when tabulating annotation pairs: ```{r, eval=TRUE} # Count indirect edges walking through germline and inferred nodes tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) ``` ### Significance testing of edges in a population of trees Given a population of trees, as a list of annotated igraph objects, you can determine if there is enrichment for specific annotation pairs using the `testEdges` function. This has the same options as `tableEdges`, except that the values `c("Germline", NA)` are excluded by default. `testEdges` performs a permutation test to generated a null distribution, excluding permutation of of any annotations specified to the `exclude` argument (these annotation remain fix in the tree). P-values output by `testEdges` are one-sided tests that the annotation pair is observed more often than expected. ```{r, eval=TRUE} # Test isotype relationships edge_test <- testEdges(graph_list, "c_call", nperm=10) # Print p-value table print(edge_test) # Plot null distributions for each annotation pair plotEdgeTest(edge_test, color="steelblue", main_title="Isotype Edges", style="hist") ``` ## Counting and testing MRCA annotations The most recent common ancestor (MRCA) of an Ig lineage we define herein as the most ancestral observed (or inferred) sequences in the lineage tree. Meaning, the node that is most proximal (by some measure) to the germline/root node. The `getMRCA` and `testMRCA` functions provide extraction and significance testing of MRCA sequences by annotation value, respectively. ### Extracting MRCAs from a tree Extracting the MRCA from a tree is accomplished using the `getMRCA` function. The germline distance criteria are as described above for `getPathLengths` and can be either node hops or mutational events, with or without exclusion of nodes with specific annotations. To simply extract the annotations for the node(s) immediately below the germline, you can use the `path=steps` argument without any node exclusion: ```{r, eval=TRUE} # Use unweighted path length and do not exclude any nodes mrca_df <- getMRCA(graph, path="steps", root="Germline") # Print subset of the annotation data.frame print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ``` To use mutational distance and consider only observed (ie, non-germline and non-inferred) nodes, we specify the exclusion field (`field="c_call"`) and exclusion value within that field (`exclude=NA`): ```{r, eval=TRUE} # Exclude nodes without an isotype annotation and use weighted path length mrca_df <- getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) # Print excluding sequence, label, color, shape and size annotations print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ``` ### Significance testing of MRCA annotations Similar to `testEdges`, the function `testMRCA` will perform a permutation test to determine the significance of an annotation appearing at the MRCA over a population of trees. P-values output by `testMRCA` are one-sided tests that the annotation is observed more often than expected in the MRCA position. ```{r, eval=TRUE} # Test isotype MRCA annotations mrca_test <- testMRCA(graph_list, "c_call", nperm=10) # Print p-value table print(mrca_test) # Plot null distributions for each annotation plotMRCATest(mrca_test, color="steelblue", main_title="Isotype MRCA", style="hist") ``` alakazam/vignettes/Diversity-Vignette.Rmd0000644000176200001440000001557514450010605020264 0ustar liggesusers--- title: 'Alakazam: Analysis of clonal abundance and diversity' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Diversity analysis} %\usepackage[utf8]{inputenc} --- The clonal diversity of the repertoire can be analyzed using the general form of the diversity index, as proposed by Hill in: Hill, M. Diversity and evenness: a unifying notation and its consequences. Ecology 54, 427-432 (1973). Coupled with resampling strategies to correct for variations in sequencing depth, as well as inference of complete clonal abundance distributions as described in: Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. This package provides methods for the inference of a complete clonal abundance distribution (using the `estimateAbundance` function) along with two approaches to assess the diversity of these distributions: 1. Generation of a smooth diversity (D) curve over a range of diversity orders (q) using `alphaDiversity`, and 2. A significance test of the diversity (D) at a fixed diversity order (q). ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. Diversity calculation requires the `clone` field (column) to be present in the AIRR file, as well as an additional grouping column. In this example we will use the grouping columns `sample_id` and `c_call`. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) # Load example data data(ExampleDb) ``` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ## Generate a clonal abundance curve A simple table of the observed clonal abundance counts and frequencies may be generated using the `countClones` function either with or without copy numbers, where the size of each clone is determined by the number of sequence members: ```{r, eval=TRUE, warning=FALSE} # Partitions the data based on the sample column clones <- countClones(ExampleDb, group="sample_id") head(clones, 5) ``` You may also specify a column containing the abundance count of each sequence (usually copy numbers), that will including weighting of each clone size by the corresponding abundance count. Furthermore, multiple grouping columns may be specified such that `seq_freq` (unweighted clone size as a fraction of total sequences in the group) and `copy_freq` (weighted faction) are normalized to within multiple group data partitions. ```{r, eval=TRUE, warning=FALSE} # Partitions the data based on both the sample_id and c_call columns # Weights the clone sizes by the duplicate_count column clones <- countClones(ExampleDb, group=c("sample_id", "c_call"), copy="duplicate_count", clone="clone_id") head(clones, 5) ``` While `countClones` will report observed abundances, it will not provide confidence intervals. A complete clonal abundance distribution may be inferred using the `estimateAbundance` function with confidence intervals derived via bootstrapping. This output may be visualized using the `plotAbundanceCurve` function. ```{r, eval=TRUE, results='hide', warning=FALSE, fig.width=6, fig.height=4} # Partitions the data on the sample column # Calculates a 95% confidence interval via 200 bootstrap realizations curve <- estimateAbundance(ExampleDb, group="sample_id", ci=0.95, nboot=100, clone="clone_id") ``` ```{r, eval=TRUE, warning=FALSE, fig.width=6, fig.height=4} # Plots a rank abundance curve of the relative clonal abundances sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(curve, colors = sample_colors, legend_title="Sample") ``` ## Generate a diversity curve The function `alphaDiversity` performs uniform resampling of the input sequences and recalculates the clone size distribution, and diversity, with each resampling realization. Diversity (D) is calculated over a range of diversity orders (q) to generate a smooth curve. ```{r, eval=TRUE, results='hide'} # Compare diversity curve across values in the "sample" column # q ranges from 0 (min_q=0) to 4 (max_q=4) in 0.05 increments (step_q=0.05) # A 95% confidence interval will be calculated (ci=0.95) # 200 resampling realizations are performed (nboot=200) sample_curve <- alphaDiversity(ExampleDb, group="sample_id", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) # Compare diversity curve across values in the c_call column # Analyse is restricted to c_call values with at least 30 sequences by min_n=30 # Excluded groups are indicated by a warning message isotype_curve <- alphaDiversity(ExampleDb, group="c_call", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) ``` ```{r, eval=TRUE, fig.width=6, fig.height=4} # Plot a log-log (log_q=TRUE, log_d=TRUE) plot of sample diversity # Indicate number of sequences resampled from each group in the title sample_main <- paste0("Sample diversity") sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(sample_curve, colors=sample_colors, main_title=sample_main, legend_title="Sample") # Plot isotype diversity using default set of Ig isotype colors isotype_main <- paste0("Isotype diversity") plot(isotype_curve, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ``` ## View diversity tests at a fixed diversity order Significance testing across groups is performed using the delta of the bootstrap distributions between groups when running `alphaDiversity` for all values of `q` specified. ```{r, eval=TRUE, fig.width=6, fig.height=3} # Test diversity at q=0, q=1 and q=2 (equivalent to species richness, Shannon entropy, # Simpson's index) across values in the sample_id column # 200 bootstrap realizations are performed (nboot=200) isotype_test <- alphaDiversity(ExampleDb, group="c_call", min_q=0, max_q=2, step_q=1, nboot=100, clone="clone_id") # Print P-value table print(isotype_test@tests) # Plot results at q=0 and q=2 # Plot the mean and standard deviations at q=0 and q=2 plot(isotype_test, 0, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") plot(isotype_test, 2, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ``` alakazam/vignettes/GeneUsage-Vignette.Rmd0000644000176200001440000001642414060415570020146 0ustar liggesusers--- title: 'Alakazam: Gene usage analysis' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Gene usage analysis} %\usepackage[utf8]{inputenc} --- The 'alakazam' package provides basic gene usage quantification by either sequence count or clonal grouping; with or without consideration of duplicate reads/mRNA. Additionally, a set of accessory functions for sorting and parsing V(D)J gene names are also provided. ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). Gene usage analysis requires only the following columns: * `v_call` * `d_call` * `j_call` However, the optional clonal clustering (`clone_id`) and duplicate count (`duplicate_count`) columns may be used to quantify usage by different abundance criteria. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(dplyr) library(scales) # Subset example data data(ExampleDb) ``` ## Tabulate V(D)J allele, gene or family usage by sample The relative abundance of V(D)J alleles, genes or families within groups can be obtained with the function `countGenes`. To analyze differences in the V gene usage across different samples we will set `gene="v_call"` (the column containing gene data) and `groups="sample_id"` (the columns containing grouping variables). To quantify abundance at the gene level we set `mode="gene"`: ```{r, eval=TRUE, warning=FALSE} # Quantify usage at the gene level gene <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") head(gene, n=4) ``` In the resultant `data.frame`, the `seq_count` column is the number of raw sequences within each `sample_id` group for the given `gene`. `seq_freq` is the frequency of each `gene` within the given `sample_id`. Below we plot only the IGHV1 abundance by filtering on the `gene` column to only rows containing IGHV1 family genes. We extract the family portion of the gene name using the `getFamily` function. Also, we take advantage of the `sortGenes` function to convert the `gene` column to a factor with gene name lexicographically ordered in the factor levels (`method="name"`) for axis ordering using the `ggplot2` package. Alternatively, we could have ordered the genes by genomic position by passing `method="position"` to `sortGenes`. ```{r, eval=TRUE, warning=FALSE} # Assign sorted levels and subset to IGHV1 ighv1 <- gene %>% mutate(gene=factor(gene, levels=sortGenes(unique(gene), method="name"))) %>% filter(getFamily(gene) == "IGHV1") # Plot V gene usage in the IGHV1 family by sample g1 <- ggplot(ighv1, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("IGHV1 Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g1) ``` Alternatively, usage can be quantified at the allele (`mode="allele"`) or family level (`mode="family"`): ```{r, eval=TRUE, warning=FALSE} # Quantify V family usage by sample family <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") # Plot V family usage by sample g2 <- ggplot(family, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("Family Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g2) ``` ## Tabulating gene abundance using additional groupings The `groups` argument to `countGenes` can accept multiple grouping columns and will calculate abundance within each unique combination. In the examples below, groupings will be perform by unique sample and isotype pairs (`groups=c("sample_id", "c_call")`). Furthermore, instead of quantifying abundance by sequence count, we will quantify it by clone count (each clone will be counted only once regardless of how many sequences the clone represents). Clonal criteria are added by passing a value to the `clone` argument of `countGenes` (`clone="clone_id"`). For each clonal group, only the most common allele/gene/family will be considered for counting. ```{r, eval=TRUE, warning=FALSE} # Quantify V family clonal usage by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), clone="clone_id", mode="family") head(family, n=4) ``` The output `data.frame` contains the additional grouping column (`c_call`) along with the `clone_count` and `clone_freq` columns that represent the count of clones for each V family and the frequencies within the given `sample_id` and `c_call` pair, respectively. ```{r, eval=TRUE, warning=FALSE} # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family clonal usage by sample and isotype g3 <- ggplot(family, aes(x=gene, y=clone_freq)) + theme_bw() + ggtitle("Clonal Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g3) ``` Instead of calculating abundance by sequence or clone count, abundance can be calculated using copy numbers for the individual sequences. This is accomplished by passing a copy number column to the `copy` argument (`copy="duplicate_count"`). Specifying both `clone` and `copy` arguments is not meaningful and will result in the `clone` argument being ignored. ```{r, eval=TRUE, warning=FALSE} # Calculate V family copy numbers by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), mode="family", copy="duplicate_count") head(family, n=4) ``` The output `data.frame` includes the `seq_count` and `seq_freq` columns as previously defined, as well as the additional copy number columns `copy_count` and `copy_freq` reflected the summed copy number (`duplicate_count`) for each sequence within the given `gene`, `sample_id` and `c_call`. ```{r, eval=TRUE, warning=FALSE} # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family copy abundance by sample and isotype g4 <- ggplot(family, aes(x=gene, y=copy_freq)) + theme_bw() + ggtitle("Copy Number") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g4) ``` alakazam/vignettes/AminoAcids-Vignette.Rmd0000644000176200001440000001733714060415570020316 0ustar liggesusers--- title: 'Alakazam: Amino acid physicochemical property analysis' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Amino acid property analysis} %\usepackage[utf8]{inputenc} --- The `alakazam` package includes a set of functions to analyze the physicochemical properties of Ig and TCR amino acid sequences. Of particular interest is the analysis of CDR3 properties, which this vignette will demonstrate. The same process can be applied to other regions simply by altering the sequence data column used. Wu YC, et al. High-throughput immunoglobulin repertoire analysis distinguishes between human IgM memory and switched memory B-cell populations. Blood 116, 1070-8 (2010). Wu YC, et al. The relationship between CD27 negative and positive B cell populations in human peripheral blood. Front Immunol 2, 1-12 (2011). ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(dplyr) # Subset example data data(ExampleDb) db <- ExampleDb[ExampleDb$sample_id == "+7d", ] ``` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ## Calculate the properties of amino acid sequences Multiple amino acid physicochemical properties can be obtained with the function `aminoAcidProperties`. The available properties are: * `length`: total amino acid count * `gravy`: grand average of hydrophobicity * `bulkiness`: average bulkiness * `polarity`: average polarity * `aliphatic`: normalized aliphatic index * `charge`: normalized net charge * `acidic`: acidic side chain residue content * `basic`: basic side chain residue content * `aromatic`: aromatic side chain content This example demonstrates how to calculate all of the available amino acid properties from DNA sequences found in the `junction` column of the previously loaded AIRR file. Translation of the DNA sequences to amino acid sequences is accomplished by default with the `nt=TRUE` argument. To reduce the junction sequence to the CDR3 sequence we specify the argument `trim=TRUE` which will strip the first and last codon (the conserved residues) prior to analysis. The prefix `cdr3` is added to the output column names using the `label="cdr3"` argument. ```{r, eval=TRUE, warning=FALSE, fig.width=7.5, fig.height=6} db_props <- aminoAcidProperties(db, seq="junction", trim=TRUE, label="cdr3") # The full set of properties are calculated by default dplyr::select(db_props[1:3, ], starts_with("cdr3")) # Define a ggplot theme for all plots tmp_theme <- theme_bw() + theme(legend.position="bottom") # Generate plots for all four of the properties g1 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_length)) + tmp_theme + ggtitle("CDR3 length") + xlab("Isotype") + ylab("Amino acids") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g2 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_gravy)) + tmp_theme + ggtitle("CDR3 hydrophobicity") + xlab("Isotype") + ylab("GRAVY") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g3 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_basic)) + tmp_theme + ggtitle("CDR3 basic residues") + xlab("Isotype") + ylab("Basic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g4 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_acidic)) + tmp_theme + ggtitle("CDR3 acidic residues") + xlab("Isotype") + ylab("Acidic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) # Plot in a 2x2 grid gridPlot(g1, g2, g3, g4, ncol=2) ``` ### Obtaining properties individually A subset of the properties may be calculated using the `property` argument of `aminoAcidProperties`. For example, calculations may be restricted to only the grand average of hydrophobicity (`gravy`) index and normalized net charge (`charge`) by specifying `property=c("gravy", "charge")`. ```{r, eval=TRUE, warning=FALSE} db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3") dplyr::select(db_props[1:3, ], starts_with("cdr3")) ``` ### Using user defined scales Each property has a default scale setting, but users may specify alternate scales if they wish. The following example shows how to import and use the Kidera et al, 1985 hydrophobicity scale and the Murrary et al, 2006 pK values from the `seqinr` package instead of the defaults for calculating the GRAVY index and net charge. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load the relevant data objects from the seqinr package library(seqinr) data(aaindex) data(pK) h <- aaindex[["KIDA850101"]]$I p <- setNames(pK[["Murray"]], rownames(pK)) # Rename the hydrophobicity vector to use single-letter codes names(h) <- translateStrings(names(h), ABBREV_AA) db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3", hydropathy=h, pK=p) dplyr::select(db_props[1:3, ], starts_with("cdr3")) ``` ### Getting vectors of individual properties The `aminoAcidProperties` function provides a convenient wrapper for calculating multiple properties at once from a `data.frame`. If a vector of a specific property is required this may be accomplished using one of the worker functions: * `gravy`: grand average of hydrophobicity * `bulk`: average bulkiness * `polar`: average polarity * `aliphatic`: aliphatic index * `charge`: net charge * `countPatterns`: counts the occurrence of patterns in amino acid sequences The input to each function must be a vector of amino acid sequences. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Translate junction DNA sequences to amino acids and trim first and last codons cdr3 <- translateDNA(db$junction[1:3], trim=TRUE) # Grand average of hydrophobicity gravy(cdr3) # Average bulkiness bulk(cdr3) # Average polarity polar(cdr3) # Normalized aliphatic index aliphatic(cdr3) # Unnormalized aliphatic index aliphatic(cdr3, normalize=FALSE) # Normalized net charge charge(cdr3) # Unnormalized net charge charge(cdr3, normalize=FALSE) # Count of acidic amino acids # Takes a named list of regular expressions countPatterns(cdr3, nt=FALSE, c(ACIDIC="[DE]"), label="cdr3") ``` ## Default scales The following references were used for the default physicochemical scales: * Aliphatic index: Ikai AJ. Thermostability and aliphatic index of globular proteins. J Biochem 88, 1895-1898 (1980). * Bulkiness scale: Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). * Hydrophobicity scale: Kyte J, Doolittle RF. A simple method for displaying the hydropathic character of a protein. J Mol Biol 157, 105-32 (1982). * pK values: \url{http://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} * Polarity scale: Grantham R. Amino acid difference formula to help explain protein evolution. Science 185, 862-864 (1974). alakazam/vignettes/Lineage-Vignette.Rmd0000644000176200001440000002042214145427343017645 0ustar liggesusers--- title: 'Alakazam: Reconstruction of Ig lineage trees' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Lineage reconstruction} %\usepackage[utf8]{inputenc} --- Reconstruction of an Ig lineage requires the following steps: 1. Load an AIRR tab-delimited database file and select a clone 2. Preprocess the clone to remove gap characters and duplicate sequences 3. Run PHYLIP, parse the output, and modify the tree topology ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. Lineage reconstruction requires the following fields (columns) to be present in the AIRR file: * `sequence_id` * `sequence_alignment` * `germline_alignment` * `v_call` * `j_call` * `junction_length` * `clone_id` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(igraph) library(dplyr) # Select a clone from the example database data(ExampleDb) sub_db <- subset(ExampleDb, clone_id == 3138) ``` ## Preprocess a clone Before a lineage can be constructed, the sequences must first be cleaned of gap (-, .) characters added by IMGT, duplicate sequences must be removed, and annotations must be combined for each cluster of duplicate sequences. Optionally, "ragged" ends of sequences (such as those that may occur from primer template switching) may also be cleaned by masking mismatched positions and the leading and trailing ends of each sequence. The function `makeChangeoClone` is a wrapper function which combines these steps and returns a `ChangeoClone` object which may then be passed into the lineage reconstruction function. Two arguments to `makeChangeoClone` control which annotations are retained following duplicate removal. Unique values appearing within columns given by the `text_fields` arguments will be concatenated into a single string delimited by a "," character. Values appearing within columns given by the `num_fields` arguments will be summed. ```{r, eval=TRUE} # This example data set does not have ragged ends # Preprocess clone without ragged end masking (default) clone <- makeChangeoClone(sub_db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count") # Show combined annotations clone@data[, c("sample_id", "c_call", "duplicate_count")] ``` ## Run PHYLIP Lineage construction uses the `dnapars` (maximum parsimony) application of the PHYLIP package. The function `buildPhylipLineage` performs a number of steps to execute `dnapars`, parse its output, and modify the tree topology to meet the criteria of an Ig lineage. This function takes as input a `ChangeoClone` object output by `makeChangeoClone` and returns an igraph `graph` object. The igraph `graph` object will contain clone annotations as graph attributes, sequence annotations as vertex attributes, and mutations along edges as edge attributes. The system call to `dnapars` requires a temporary folder to store input and output. This is created in the system temporary location (according to `base::tempfile`), and is not deleted by default (only because automatically deleting files is somewhat rude). In most cases, you will want to set `rm_temp=TRUE` to delete this folder. ```{r, eval=FALSE} # Run PHYLIP and parse output phylip_exec <- "~/apps/phylip-3.69/dnapars" graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) ``` ```{r, echo=FALSE, warning=FALSE, message=FALSE} # Load data instead of running phylip # Clone 3138 is at index 23 graph <- ExampleTrees[[23]] ``` ```{r, eval=TRUE, warning=FALSE, message=FALSE} # The graph has shared annotations for the clone data.frame(clone_id=graph$clone, junction_length=graph$junc_len, v_gene=graph$v_gene, j_gene=graph$j_gene) # The vertices have sequence specific annotations data.frame(sequence_id=V(graph)$name, c_call=V(graph)$c_call, duplicate_count=V(graph)$duplicate_count) ``` ## Plotting of the lineage tree Plotting of a lineage tree may be done using the built-in functions of the igraph package. The default edge and vertex labels are edge weights and sequence identifiers, respectively. ```{r, eval=TRUE} # Plot graph with defaults plot(graph) ``` The default layout and attributes are not very pretty. We can modify the graphical parameter in the usual igraph ways. A tree layout can be built using the `layout_as_tree` layout with assignment of the root position to the germline sequence, which is named "Germline" in the object returned by `buildPhylipLineage`. ```{r, eval=TRUE} # Modify graph and plot attributes V(graph)$color <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" V(graph)$label <- V(graph)$c_call E(graph)$label <- "" # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.1) # Plot graph plot(graph, layout=layout_as_tree, edge.arrow.mode=0, vertex.frame.color="black", vertex.label.color="black", vertex.size=40) # Add legend legend("topleft", c("Germline", "Inferred", "Sample"), fill=c("black", "white", "steelblue"), cex=0.75) ``` Which is much better. ## Batch processing lineage trees Multiple lineage trees may be generated at once, by splitting the Change-O data.frame on the clone column. ```{r, eval=TRUE, warning=FALSE, results="hide"} # Preprocess clones clones <- ExampleDb %>% group_by(clone_id) %>% do(CHANGEO=makeChangeoClone(., text_fields=c("sample_id", "c_call"), num_fields="duplicate_count")) ``` ```{r, eval=FALSE} # Build lineages phylip_exec <- "~/apps/phylip-3.69/dnapars" graphs <- lapply(clones$CHANGEO, buildPhylipLineage, phylip_exec=phylip_exec, rm_temp=TRUE) ``` ```{r, echo=FALSE, warning=FALSE, message=FALSE} # Load data instead of running phylip graphs <- ExampleTrees ``` ```{r, eval=TRUE} # Note, clones with only a single sequence will not be processed. # A warning will be generated and NULL will be returned by buildPhylipLineage # These entries may be removed for clarity graphs[sapply(graphs, is.null)] <- NULL # The set of tree may then be subset by node count for further # analysis, if desired. graphs <- graphs[sapply(graphs, vcount) >= 5] ``` ## Converting between graph, phylo, and newick formats While much of analysis in `alakazam` focuses on using `igraph` `graph` objects, R `phylo` objects are capable of being used by a rich set of phylogenetic analysis tools in R. Further, stand-alone phylogenetics programs typically import and export trees in Newick format. To convert to trees in `graph` format to `phylo` format, use `graphToPhylo`. These objects can now be used by functions detailed in other R phylogenetics packages such as `ape`. ```{r, eval=TRUE, show=FALSE} # Modify graph and plot attributes V(graph)$color <- categorical_pal(8)[1] V(graph)$label <- V(graph)$name E(graph)$label <- E(graph)$weight ``` ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Convert to phylo phylo <- graphToPhylo(graph) # Plot using ape plot(phylo, show.node.label=TRUE) ``` To import lineage trees as `phylo` objects from Newick files, use the `read.tree` function provided in the `ape` package. To export lineage trees as a Newick file, use the `write.tree` function provided in `ape`. ```{r, eval=FALSE} # Read in Newick tree as phylo object phylo <- ape::read.tree("example.tree") # Write tree file in Newick format ape::write.tree(phylo, file="example.tree") ``` To convert this `phylo` object to a `graph` object, use the `phyloToGraph` function with the germline sequence ID specified using the `germline` option. Note that while some of the nodes in more complex trees may rotate during this process, their topological relationships will remain the same. ```{r, eval=TRUE} # Convert to graph object graph <- phyloToGraph(phylo, germline="Germline") ``` alakazam/vignettes/Files-Vignette.Rmd0000644000176200001440000000500314060415570017334 0ustar liggesusers--- title: "Alakazam: How to read and write files" author: "Edel Aron" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{File input and output} %\usepackage[utf8]{inputenc} --- As part of the Immcantation suite of tools, the `alakazam` package includes a set of built-in functions capable of reading and writing tab-delimited database files created by [Change-O](https://changeo.readthedocs.io/en/stable/) into R data.frames. However, due to differences in how certain values and sequences are handled, `alakazam::readChangeoDb` and `alakazam::writeChangeoDb` will not properly read in [AIRR](https://docs.airr-community.org) formatted files. These files should instead be loaded using the functions included in the `airr` package (`airr::read_rearrangement` and `airr::write_rearrangement`). You can read more about how we use both data standards [here](https://immcantation.readthedocs.io/en/stable/datastandards.html) and [here](https://changeo.readthedocs.io/en/stable/standard.html). *Please note that the default file format for all functions in Immcantation is the AIRR-C format as of Immcantation v4.0.0, which corresponds to alakazam v1.0.0.* ## Reading data Small example databases for both the Change-O format (`ExampleDbChangeo`) and the AIRR format (`ExampleDb`) are included in the `alakazam` package. For specific details about the latter, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Set the file paths from inside the package directory # These files are smaller versions of the example databases previously mentioned changeo_file <- system.file("extdata", "example_changeo.tab.gz", package="alakazam") airr_file <- system.file("extdata", "example_airr.tsv.gz", package="alakazam") # Read in the data db_changeo <- alakazam::readChangeoDb(changeo_file) db_airr <- airr::read_rearrangement(airr_file) ``` ## Writing data ```{r, eval=FALSE, warning=FALSE, message=FALSE} # Write the data to a tab-delimited file alakazam::writeChangeoDb(db_changeo, "changeo.tsv") airr::write_rearrangement(db_airr, "airr.tsv") ``` alakazam/vignettes/Fastq-Vignette.Rmd0000644000176200001440000000650214312061635017354 0ustar liggesusers--- title: 'Alakazam: Using sequencing quality scores' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes toc_depth: 3 md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes toc_depth: 3 html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes toc_depth: 3 geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Fastq} %\usepackage[utf8]{inputenc} --- The `alakazam` package includes a set of functions to inspect the sequencing quality. ## Example data Load example data: ```{r, eval=TRUE, warning=FALSE, message=FALSE} library(alakazam) library(dplyr) library(airr) db <- read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") ``` ## Load quality scores This method allows to add the quality scores to the repertoire `data.frame` as strings. ```{r} original_cols <- colnames(db) db <- readFastqDb(db, fastq_file, style="both", quality_sequence=TRUE) new_cols <- setdiff(colnames(db), original_cols) db[,new_cols] %>% head() ``` The function `readFastq` takes as main inputs a repertoire `data.frame` (`db`) and a path to the corresponding `.fastq` file (`fastq_file`). The sequencing quality scores will be merged into the `data.frame` by `sequence_id`. The newly added columns are: `r paste(new_cols, collapse=", ")`. The other fields, contain the ASCII quality scores in the form of a vector, where values are comma separated, and `-` or `.` positions have value `" "` (blank). After loading the quality scores with `readFastqDb`, `getPositionQuality` can be used to generate a `data.frame` of sequencing quality values per position. ```{r} quality <- getPositionQuality(db, sequence_id="sequence_id", sequence="sequence_alignment", quality_num="quality_alignment_num") head(quality) ``` ```{r, fig.cap="Sequence quality per IMGT position for one sequence.", fig.asp=0.25} min_pos <- min(quality$position) max_pos <- max(quality$position) ggplot(quality, aes(x=position, y=quality_alignment_num, color=nt)) + geom_point() + coord_cartesian(xlim=c(110,120)) + xlab("IMGT position") + ylab("Sequencing quality") + scale_fill_gradient(low = "light blue", high = "dark red") + scale_x_continuous(breaks=c(min_pos:max_pos)) + alakazam::baseTheme() ``` You can add use the quality `data.frame` to complement analysis performed with other tools from the Immcantation framework. For example, you could inspect the sequencing quality of novel polymorphisms identified with `tigger`, or the sequencing quality in mutated/unmutated regions. ## Mask low quality positions Use `maskPositionsByQuality` to mask low quality positions. Positions with a sequencing quality < `min_quality` will be replaced with an 'N'. A message will show the number of sequences in `db` that had at least one position masked. ```{r} db <- maskPositionsByQuality(db, min_quality=70, sequence="sequence_alignment", quality="quality_alignment_num") ``` alakazam/R/0000755000176200001440000000000014505552630012241 5ustar liggesusersalakazam/R/sysdata.rda0000644000176200001440000000200313732424726014401 0ustar liggesusersBZh91AY&SY!4/h0 @!,F%5MMM4 @hi44b!M(p40jb4zz@d@ Dp4$&ALjhzM@hUlRMxI¯Am /B՞P(H!FűXTN%  u`)^RI@A]ƊnYERLctS6&AsL&8M9R F76)b1v3(!CSn-[f'b,'ds $I ﰁGEĉJL"&\d@HhtI{%C""D& $ M„OРB <0 U dAX5 TŧC9C ˉ-r!FeJ_l;0eW4LUX,ٍ0Q*$HVQ.[|ȩnIe_zR N"G%4c&a*'np[~v `_M(Nc]L[ 1GxfaG&|8ruGJgb|Y ĸc=W`#(騈 1+*0 VDd`@[IC 0쇅y̰gN&ReEGɋ]SWZ`@ T̄TʵE)301}g'3I]VgE#VEŝ2 Қа eLdb[7@mNBۧ_ѿVmUN/H652 ԣKMJU~ursUIۙ زZ$vA lH3 7ZjPe:(h$١~[(~-J@qsE~2C6X/V*G.p!8Bhalakazam/R/AminoAcids.R0000644000176200001440000006075514500321673014404 0ustar liggesusers# Amino acid sequence properties #### Chemical property functions #### #' Calculates the average bulkiness of amino acid sequences #' #' \code{bulk} calculates the average bulkiness score of amino acid sequences. #' Non-informative positions are excluded, where non-informative is defined as any #' character in \code{c("X", "-", ".", "*")}. #' #' @param seq vector of strings containing amino acid sequences. #' @param bulkiness named numerical vector defining bulkiness scores for #' each amino acid, where names are single-letter amino acid #' character codes. If \code{NULL}, then the Zimmerman et al, 1968 #' scale is used. #' #' @return A vector of bulkiness scores for the sequence(s). #' #' @references #' \enumerate{ #' \item Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences #' in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). #' } #' @seealso #' For additional size related indices see \link[seqinr]{aaindex}. #' #' @examples #' # Default bulkiness scale #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") #' bulk(seq) #' #' # Use the Grantham, 1974 side chain volumn scores from the seqinr package #' library(seqinr) #' data(aaindex) #' x <- aaindex[["GRAR740103"]]$I #' # Rename the score vector to use single-letter codes #' names(x) <- translateStrings(names(x), ABBREV_AA) #' # Calculate average volume #' bulk(seq, bulkiness=x) #' #' @export bulk <- function(seq, bulkiness=NULL) { # Get bulkiness scores if (is.null(bulkiness)) { bulkiness <- BULKINESS_ZIMJ68 } # Remove non-informative positions seq <- gsub("[X\\.\\*-]", "", as.character(seq)) # Create character vector from string aa <- strsplit(seq, "") # Calculate average bulkiness aa_bulk <- sapply(aa, function(x) sum(bulkiness[x]) / length(x)) return(aa_bulk) } #' Calculates the average polarity of amino acid sequences #' #' \code{polar} calculates the average polarity score of amino acid sequences. #' Non-informative positions are excluded, where non-informative is defined as any #' character in \code{c("X", "-", ".", "*")}. #' #' @param seq vector of strings containing amino acid sequences. #' @param polarity named numerical vector defining polarity scores for #' each amino acid, where names are single-letter amino acid #' character codes. If \code{NULL}, then the Grantham, 1974 #' scale is used. #' #' @return A vector of bulkiness scores for the sequence(s). #' #' @references #' \enumerate{ #' \item Grantham R. Amino acid difference formula to help explain protein evolution. #' Science 185, 862-864 (1974). #' } #' @seealso #' For additional size related indices see \code{\link[seqinr]{aaindex}}. #' #' @examples #' # Default scale #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") #' polar(seq) #' #' # Use the Zimmerman et al, 1968 polarity scale from the seqinr package #' library(seqinr) #' data(aaindex) #' x <- aaindex[["ZIMJ680103"]]$I #' # Rename the score vector to use single-letter codes #' names(x) <- translateStrings(names(x), ABBREV_AA) #' # Calculate polarity #' polar(seq, polarity=x) #' #' @export polar <- function(seq, polarity=NULL) { # Get bulkiness scores if (is.null(polarity)) { polarity <- POLARITY_GRAR74 } # Remove non-informative positions seq <- gsub("[X\\.\\*-]", "", as.character(seq)) # Create character vector from string aa <- strsplit(seq, "") # Calculate average polarity aa_polar <- sapply(aa, function(x) sum(polarity[x]) / length(x)) return(aa_polar) } #' Calculates the hydrophobicity of amino acid sequences #' #' \code{gravy} calculates the Grand Average of Hydrophobicity (gravy) index #' of amino acid sequences using the method of Kyte & Doolittle. Non-informative #' positions are excluded, where non-informative is defined as any character in #' \code{c("X", "-", ".", "*")}. #' #' @param seq vector of strings containing amino acid sequences. #' @param hydropathy named numerical vector defining hydropathy index values for #' each amino acid, where names are single-letter amino acid #' character codes. If \code{NULL}, then the Kyte & Doolittle #' scale is used. #' #' @return A vector of gravy scores for the sequence(s). #' #' @references #' \enumerate{ #' \item Kyte J, Doolittle RF. A simple method for displaying the hydropathic character #' of a protein. J Mol Biol. 157, 105-32 (1982). #' } #' @seealso #' For additional hydrophobicity indices see \code{\link[seqinr]{aaindex}}. #' #' @examples #' # Default scale #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") #' gravy(seq) #' #' # Use the Kidera et al, 1985 scores from the seqinr package #' library(seqinr) #' data(aaindex) #' x <- aaindex[["KIDA850101"]]$I #' # Rename the score vector to use single-letter codes #' names(x) <- translateStrings(names(x), ABBREV_AA) #' # Calculate hydrophobicity #' gravy(seq, hydropathy=x) #' #' @export gravy <- function(seq, hydropathy=NULL) { # Get hydrophobicity scores if (is.null(hydropathy)) { hydropathy <- HYDROPATHY_KYTJ82 } # Remove non-informative positions seq <- gsub("[X\\.\\*-]", "", as.character(seq)) # Create character vector from string aa <- strsplit(seq, "") # Calculate gravy aa_gravy <- sapply(aa, function(x) sum(hydropathy[x]) / length(x)) return(aa_gravy) } #' Calculates the aliphatic index of amino acid sequences #' #' \code{aliphatic} calculates the aliphatic index of amino acid sequences using #' the method of Ikai. Non-informative positions are excluded, where non-informative #' is defined as any character in \code{c("X", "-", ".", "*")}. #' #' @param seq vector of strings containing amino acid sequences. #' @param normalize if \code{TRUE} then divide the aliphatic index of each amino acid #' sequence by the number of informative positions. Non-informative #' position are defined by the presence any character in #' \code{c("X", "-", ".", "*")}. If \code{FALSE} then return the raw #' aliphatic index. #' #' @return A vector of the aliphatic indices for the sequence(s). #' #' @references #' \enumerate{ #' \item Ikai AJ. Thermostability and aliphatic index of globular proteins. #' J Biochem. 88, 1895-1898 (1980). #' } #' #' @examples #' seq <- c("CARDRSTPWRRGIASTTVRTSW", NA, "XXTQMYVRT") #' aliphatic(seq) #' #' @export aliphatic <- function(seq, normalize=TRUE) { # Calculate aliphatic index for valid amino acids ala <- countOccurrences(seq, "[A]") val <- countOccurrences(seq, "[V]") leu_ile <- countOccurrences(seq, "[LI]") aa_aliphatic = ala + 2.9 * val + 3.9 * leu_ile if (normalize) { aa_aliphatic <- aa_aliphatic / stri_length(gsub("[X\\.\\*-]", "", seq)) } return(aa_aliphatic) } #' Calculates the net charge of amino acid sequences. #' #' \code{charge} calculates the net charge of amino acid sequences using #' the method of Moore, 1985, with exclusion of the C-terminus and N-terminus charges. #' #' @param seq vector strings defining of amino acid sequences. #' @param pH environmental pH. #' @param pK named vector defining pK values for each charged amino acid, #' where names are the single-letter amino acid character codes #' \code{c("R", "H", "K", "D", "E", "C", "Y")}). If \code{NULL}, #' then the EMBOSS scale is used. #' @param normalize if \code{TRUE} then divide the net charge of each amino acid #' sequence by the number of informative positions. Non-informative #' position are defined by the presence any character in #' \code{c("X", "-", ".", "*")}. If \code{FALSE} then return the raw #' net charge. #' #' @return A vector of net charges for the sequence(s). #' #' @references #' \enumerate{ #' \item Moore DS. Amino acid and peptide net charges: A simple calculational procedure. #' Biochem Educ. 13, 10-11 (1985). #' \item \url{https://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} #' } #' #' @seealso #' For additional pK scales see \code{\link[seqinr]{pK}}. #' #' @examples #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVRT") #' # Unnormalized charge #' charge(seq) #' # Normalized charge #' charge(seq, normalize=TRUE) #' #' # Use the Murray et al, 2006 scores from the seqinr package #' library(seqinr) #' data(pK) #' x <- setNames(pK[["Murray"]], rownames(pK)) #' # Calculate charge #' charge(seq, pK=x) #' #' @export charge <- function(seq, pH=7.4, pK=NULL, normalize=FALSE) { # Get charge data if(is.null(pK)) { pK <- PK_EMBOSS } # Calculate charge arg <- countOccurrences(seq, "R") * (1/(1 + 10^(1 * (pH - pK["R"])))) his <- countOccurrences(seq, "H") * (1/(1 + 10^(1 * (pH - pK["H"])))) lys <- countOccurrences(seq, "K") * (1/(1 + 10^(1 * (pH - pK["K"])))) asp <- countOccurrences(seq, "D") * (-1/(1 + 10^(-1 * (pH - pK["D"])))) glu <- countOccurrences(seq, "E") * (-1/(1 + 10^(-1 * (pH - pK["E"])))) cys <- countOccurrences(seq, "C") * (-1/(1 + 10^(-1 * (pH - pK["C"])))) tyr <- countOccurrences(seq, "Y") * (-1/(1 + 10^(-1 * (pH - pK["Y"])))) aa_charge <- arg + lys + his + asp + glu + tyr + cys if (normalize) { aa_charge <- aa_charge / stri_length(gsub("[X\\.\\*-]", "", seq)) } return(aa_charge) } #' Validate amino acid sequences #' #' \code{isValidAASeq} checks that a set of sequences are valid non-ambiguous #' amino acid sequences. A sequence is considered valid if it contains only #' characters in the the non-ambiguous IUPAC character set or any characters in #' \code{c("X", ".", "-", "*")}. #' #' @param seq character vector of sequences to check. #' #' @return A logical vector with \code{TRUE} for each valid amino acid sequences #' and \code{FALSE} for each invalid sequence. #' @seealso #' See \link{ABBREV_AA} for the set of non-ambiguous amino acid characters. #' See \link{IUPAC_AA} for the full set of ambiguous amino acid characters. #' #' @examples #' seq <- c("CARDRSTPWRRGIASTTVRTSW", "XXTQMYVR--XX", "CARJ", "10") #' isValidAASeq(seq) #' #' @export isValidAASeq <- function(seq) { # Get valid amino acids from seqinr # for consistency with `gravy` and other # amino acid properties that don't consider # amino acid ambiguities and special encoded amino acids # http://pir.georgetown.edu/resid/faq.shtml#q01 # Also include here characters for non informative positions valid_AA <- c(names(ABBREV_AA), "X", ".", "*", "-") .isValid <- function(aa) { all(aa %in% valid_AA) } return(sapply(strsplit(seq, ""), .isValid)) # valid_AA <- paste(c(names(ABBREV_AA),"X.*-"),collapse="") # valid <- !grepl(paste0("[^",valid_AA,"]"), seq) & !is.na(seq) # valid } # Count patterns # # Counts the number of times a "pattern" occurs in "x", a string # # @param x a string (usually amino acids) # @param pattern regular expression to be matched in string # # @return number of times the regular expression was found countOccurrences <- function(x, pattern) { return(sapply(gregexpr(pattern, x), function(y) { sum(y > 0) })) } #' Count sequence patterns #' #' \code{countPatterns} counts the fraction of times a set of character patterns occur #' in a set of sequences. #' #' @param seq character vector of either DNA or amino acid sequences. #' @param patterns list of sequence patterns to count in each sequence. If the #' list is named, then names will be assigned as the column names of #' output data.frame. #' @param nt if \code{TRUE} then \code{seq} are DNA sequences and and will be #' translated before performing the pattern search. #' @param trim if \code{TRUE} remove the first and last codon or amino acid from #' each sequence before the pattern search. If \code{FALSE} do #' not modify the input sequences. #' @param label string defining a label to add as a prefix to the output #' column names. #' #' @return A data.frame containing the fraction of times each sequence pattern was #' found. #' #' @examples #' seq <- c("TGTCAACAGGCTAACAGTTTCCGGACGTTC", #' "TGTCAGCAATATTATATTGCTCCCTTCACTTTC", #' "TGTCAAAAGTATAACAGTGCCCCCTGGACGTTC") #' patterns <- c("A", "V", "[LI]") #' names(patterns) <- c("arg", "val", "iso_leu") #' countPatterns(seq, patterns, nt=TRUE, trim=TRUE, label="cdr3") #' #' @export countPatterns <- function(seq, patterns, nt=TRUE, trim=FALSE, label="region") { # Translate sequences if nucleotide region_aa <- if (nt) { translateDNA(seq, trim=trim) } else { seq } # TODO: What is the proper length normalization? With or without non-informative position? # Calculate region lengths aa_length <- stri_length(region_aa) # Count occurrence of each amino acid pattern for each sequence out_df <- data.frame(matrix(0, nrow=length(region_aa), ncol=length(patterns))) # If patterns are unnamed, make the names X1...Xn if(is.null(names(patterns))) { names(patterns) <- names(out_df) } # If region name, append to names of patterns if(label != '') { names(out_df) <- paste(label, names(patterns), sep="_") } else { names(out_df) <- names(patterns) } # Iterate over patterns for(i in 1:length(patterns)) { out_df[, i] <- countOccurrences(region_aa, patterns[i]) / aa_length } return(out_df) } #' Calculates amino acid chemical properties for sequence data #' #' \code{aminoAcidProperties} calculates amino acid sequence physicochemical properties, including #' length, hydrophobicity, bulkiness, polarity, aliphatic index, net charge, acidic residue #' content, basic residue content, and aromatic residue content. #' #' @param data \code{data.frame} containing sequence data. #' @param property vector strings specifying the properties to be calculated. Defaults #' to calculating all defined properties. #' @param seq \code{character} name of the column containing input #' sequences. #' @param nt boolean, TRUE if the sequences (or sequence) are DNA and will be translated. #' @param trim if \code{TRUE} remove the first and last codon/amino acids from each #' sequence before calculating properties. If \code{FALSE} do #' not modify input sequences. #' @param label name of sequence region to add as prefix to output column names. #' @param ... additional named arguments to pass to the functions #' \link{gravy}, \link{bulk}, \link{aliphatic}, \link{polar} or \link{charge}. #' #' @return A modified \code{data} data.frame with the following columns: #' \itemize{ #' \item \code{*_aa_length}: number of amino acids. #' \item \code{*_aa_gravy}: grand average of hydrophobicity (gravy) index. #' \item \code{*_aa_bulk}: average bulkiness of amino acids. #' \item \code{*_aa_aliphatic}: aliphatic index. #' \item \code{*_aa_polarity}: average polarity of amino acids. #' \item \code{*_aa_charge}: net charge. #' \item \code{*_aa_basic}: fraction of informative positions that are #' Arg, His or Lys. #' \item \code{*_aa_acidic}: fraction of informative positions that are #' Asp or Glu. #' \item \code{*_aa_aromatic}: fraction of informative positions that are #' His, Phe, Trp or Tyr. #' #' } #' #' Where \code{*} is the value from \code{label} or the name specified for #' \code{seq} if \code{label=NULL}. #' #' @details #' For all properties except for length, non-informative positions are excluded, #' where non-informative is defined as any character in \code{c("X", "-", ".", "*")}. #' #' The scores for gravy, bulkiness and polarity are calculated as simple averages of the #' scores for each informative positions. The basic, acid and aromatic indices are #' calculated as the fraction of informative positions falling into the given category. #' #' The aliphatic index is calculated using the Ikai, 1980 method. #' #' The net charge is calculated using the method of Moore, 1985, excluding the N-terminus and #' C-terminus charges, and normalizing by the number of informative positions. The default #' pH for the calculation is 7.4. #' #' The following data sources were used for the default property scores: #' \itemize{ #' \item hydropathy: Kyte & Doolittle, 1982. #' \item bulkiness: Zimmerman et al, 1968. #' \item polarity: Grantham, 1974. #' \item pK: EMBOSS. #' } #' #' @references #' \enumerate{ #' \item Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences #' in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). #' \item Grantham R. Amino acid difference formula to help explain protein evolution. #' Science 185, 862-864 (1974). #' \item Ikai AJ. Thermostability and aliphatic index of globular proteins. #' J Biochem 88, 1895-1898 (1980). #' \item Kyte J, Doolittle RF. A simple method for displaying the hydropathic character #' of a protein. J Mol Biol 157, 105-32 (1982). #' \item Moore DS. Amino acid and peptide net charges: A simple calculational procedure. #' Biochem Educ 13, 10-11 (1985). #' \item Wu YC, et al. High-throughput immunoglobulin repertoire analysis distinguishes #' between human IgM memory and switched memory B-cell populations. #' Blood 116, 1070-8 (2010). #' \item Wu YC, et al. The relationship between CD27 negative and positive B cell #' populations in human peripheral blood. #' Front Immunol 2, 1-12 (2011). #' \item \url{https://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} #' } #' #' @seealso #' See \link{countPatterns} for counting the occurance of specific amino acid subsequences. #' See \link{gravy}, \link{bulk}, \link{aliphatic}, \link{polar} and \link{charge} for functions #' that calculate the included properties individually. #' #' @examples #' # Subset example data #' db <- ExampleDb[c(1,10,100), c("sequence_id", "junction")] #' #' # Calculate default amino acid properties from DNA sequences #' aminoAcidProperties(db, seq="junction") # #' # Calculate default amino acid properties from amino acid sequences #' # Use a custom output column prefix #' db$junction_aa <- translateDNA(db$junction) #' aminoAcidProperties(db, seq="junction_aa", label="junction", nt=FALSE) #' #' # Use the Grantham, 1974 side chain volume scores from the seqinr package #' # Set pH=7.0 for the charge calculation #' # Calculate only average volume and charge #' # Remove the head and tail amino acids from the junction, thus making it the CDR3 #' library(seqinr) #' data(aaindex) #' x <- aaindex[["GRAR740103"]]$I #' # Rename the score vector to use single-letter codes #' names(x) <- translateStrings(names(x), ABBREV_AA) #' # Calculate properties #' aminoAcidProperties(db, property=c("bulk", "charge"), seq="junction", #' trim=TRUE, label="cdr3", bulkiness=x, pH=7.0) #' #' @export aminoAcidProperties <- function(data, property=c("length", "gravy", "bulk", "aliphatic","polarity","charge", "basic","acidic", "aromatic"), seq="junction", nt=TRUE, trim=FALSE, label=NULL, ...) { # Check arguments property <- match.arg(property, several.ok=TRUE) # Define the data.frame that will be returned with amino acid properties prop_colnames <- list( "length" = "aa_length", "gravy" = "aa_gravy", "bulk" = "aa_bulk", "aliphatic" = "aa_aliphatic", "polarity" = "aa_polarity", "charge" = "aa_charge", "basic" = "aa_basic", "acidic" = "aa_acidic", "aromatic" = "aa_aromatic" ) # If no label, use sequence column name if (is.null(label)) { label <- seq } prop_colnames <- lapply(prop_colnames, function(x) { paste(label,x,sep="_") }) out_df <- data.frame(matrix(NA, nrow=nrow(data), ncol=length(property))) colnames(out_df) <- prop_colnames[property] # Check if out_df column names already existed in data # if yes, throw warning check <- checkColumns(data, colnames(out_df)) if (any(check == TRUE)) { warning("Duplicated columns found. Overwriting previous values.")} # Check input if (length(seq) > 1) { stop("You may specify only one sequence column; seq must be a vector of length 1.") } check <- checkColumns(data, seq) if (check != TRUE) { stop(check) } # Assign ellipsis arguments to correct function dots <- list(...) args_gravy <- dots[names(dots) %in% names(formals(gravy))] args_bulk <- dots[names(dots) %in% names(formals(bulk))] args_aliphatic <- dots[names(dots) %in% names(formals(aliphatic))] args_polar <- dots[names(dots) %in% names(formals(polar))] args_charge <- dots[names(dots) %in% names(formals(charge))] # Get sequence vector and translate if required region <- as.character(data[[seq]]) region_aa <- if (nt) { translateDNA(region, trim=trim) } else { region } ## Will retrieve properties for valid sequences only ## keep index to fill results data.frame valid_seq <- isValidAASeq(region_aa) if (any(valid_seq == F) ){ not_valid_num <- sum(!valid_seq) warning(paste0("Found ", not_valid_num , " sequences with non valid amino acid symbols")) } valid_seq_idx <- which(valid_seq) region_aa <- region_aa[valid_seq_idx] # Calculate region lengths if ("length" %in% property) { aa_length <- stri_length(region_aa) out_df[valid_seq_idx , prop_colnames$length] <- aa_length } # Average hydrophobicity if ("gravy" %in% property) { #aa_gravy <- gravy(region_aa, hydropathy) aa_gravy <- do.call('gravy', c(list(seq=region_aa), args_gravy)) out_df[valid_seq_idx , prop_colnames$gravy] <- aa_gravy } # Average bulkiness if ("bulk" %in% property) { #aa_bulk <- bulk(region_aa) aa_bulk <- do.call('bulk', c(list(seq=region_aa), args_bulk)) out_df[valid_seq_idx , prop_colnames$bulk] <- aa_bulk } if ("aliphatic" %in% property) { # Normalizes aliphatic index aa_aliphatic <- do.call('aliphatic', c(list(seq=region_aa), args_aliphatic)) out_df[valid_seq_idx , prop_colnames$aliphatic] <- aa_aliphatic } # Average polarity if ("polarity" %in% property) { #aa_polarity <- polar(region_aa) aa_polarity <- do.call('polar', c(list(seq=region_aa), args_polar)) out_df[valid_seq_idx , prop_colnames$polarity] <- aa_polarity } # Normalized net charge if ("charge" %in% property) { #aa_charge <- charge(region_aa) aa_charge <- do.call('charge', c(list(seq=region_aa), args_charge)) out_df[valid_seq_idx , prop_colnames$charge] <- aa_charge } # Count of informative positions aa_info <- stri_length(gsub("[X\\.\\*-]", "", region_aa)) # Fraction of amino acid that are basic if ("basic" %in% property) { aa_basic <- countOccurrences(region_aa, "[RHK]") / aa_info out_df[valid_seq_idx , prop_colnames$basic] <- aa_basic } # Fraction of amino acid that are acidic if ("acidic" %in% property) { aa_acidic <- countOccurrences(region_aa, "[DE]") / aa_info out_df[valid_seq_idx , prop_colnames$acidic] <- aa_acidic } # Count fraction of aa that are aromatic if ("aromatic" %in% property) { aa_aromatic <- countOccurrences(region_aa, "[FWHY]") / aa_info out_df[valid_seq_idx , prop_colnames$aromatic] <- aa_aromatic } data_cols <- colnames(data) %in% colnames(out_df) == FALSE return(cbind(data[, data_cols], out_df)) } alakazam/R/Sequence.R0000644000176200001440000013146114500030360014124 0ustar liggesusers# Common DNA, amino acid, and gene annotation operations for Alakazam #### Distance functions #### #' Build a DNA distance matrix #' #' \code{getDNAMatrix} returns a Hamming distance matrix for IUPAC ambiguous #' DNA characters with modifications for gap, \code{c("-", ".")}, and missing, #' \code{c("?")}, character values. #' #' @param gap value to assign to characters in the set \code{c("-", ".")}. #' #' @return A \code{matrix} of DNA character distances with row and column names #' indicating the character pair. By default, distances will be either 0 #' (equivalent), 1 (non-equivalent or missing), or -1 (gap). #' #' @seealso Creates DNA distance matrix for \link{seqDist}. #' See \link{getAAMatrix} for amino acid distances. #' #' @examples #' # Set gap characters to Inf distance #' # Distinguishes gaps from Ns #' getDNAMatrix() #' #' # Set gap characters to 0 distance #' # Makes gap characters equivalent to Ns #' getDNAMatrix(gap=0) #' #' @export getDNAMatrix <- function(gap=-1) { # Define Hamming distance matrix sub_mat <- diag(18) colnames(sub_mat) <- rownames(sub_mat) <- c(names(IUPAC_DNA), c("-", ".", "?")) for (i in 1:length(IUPAC_DNA)) { for (j in i:length(IUPAC_DNA)) { sub_mat[i, j] <- sub_mat[j, i] <- any(IUPAC_DNA[[i]] %in% IUPAC_DNA[[j]]) } } # Add gap characters sub_mat[c("-", "."), c("-", ".")] <- 1 sub_mat[c("-", "."), 1:15] <- 1 - gap sub_mat[1:15, c("-", ".")] <- 1 - gap return(1 - sub_mat) } #' Build an AA distance matrix #' #' \code{getAAMatrix} returns a Hamming distance matrix for IUPAC ambiguous #' amino acid characters. #' #' @param gap value to assign to characters in the set \code{c("-", ".")}. #' #' @return A \code{matrix} of amino acid character distances with row and column names #' indicating the character pair. #' #' @seealso Creates an amino acid distance matrix for \link{seqDist}. #' See \link{getDNAMatrix} for nucleotide distances. #' #' @examples #' getAAMatrix() #' #' @export getAAMatrix <- function(gap=0) { # Define Hamming distance matrix sub_mat <- diag(27) colnames(sub_mat) <- rownames(sub_mat) <- c(names(IUPAC_AA), c("-", ".")) for (i in 1:length(IUPAC_AA)) { for (j in i:length(IUPAC_AA)) { sub_mat[i, j] <- sub_mat[j, i] <- any(IUPAC_AA[[i]] %in% IUPAC_AA[[j]]) } } # Add gap characters sub_mat[c("-", "."), c("-", ".")] <- 1 sub_mat[c("-", "."), c(1:27)] <- 1 - gap sub_mat[c(1:27), c("-", ".")] <- 1 - gap return(1 - sub_mat) } #' Remove duplicate DNA sequences and combine annotations #' #' \code{collapseDuplicates} identifies duplicate DNA sequences, allowing for ambiguous #' characters, removes the duplicate entries, and combines any associated annotations. #' #' @param data data.frame containing Change-O columns. The data.frame #' must contain, at a minimum, a unique identifier column #' and a column containg a character vector of DNA sequences. #' @param id name of the column containing sequence identifiers. #' @param seq name of the column containing DNA sequences. #' @param text_fields character vector of textual columns to collapse. The textual #' annotations of duplicate sequences will be merged into a single #' string with each unique value alphabetized and delimited by #' \code{sep}. #' @param num_fields vector of numeric columns to collapse. The numeric annotations #' of duplicate sequences will be summed. #' @param seq_fields vector of nucletoide sequence columns to collapse. The sequence #' with the fewest numer of non-informative characters will be #' retained. Where a non-informative character is one of #' \code{c("N", "-", ".", "?")}. Note, this is distinct from the #' \code{seq} parameter which is used to determine duplicates. #' @param add_count if \code{TRUE} add the column \code{collpase_count} that #' indicates the number of sequences that were collapsed to build #' each unique entry. #' @param ignore vector of characters to ignore when testing for equality. #' @param sep character to use for delimiting collapsed annotations in the #' \code{text_fields} columns. Defines both the input and output #' delimiter. #' @param dry if \code{TRUE} perform dry run. Only labels the sequences without #' collapsing them. #' @param verbose if \code{TRUE} report the number input, discarded and output #' sequences; if \code{FALSE} process sequences silently. #' #' @return A modified \code{data} data.frame with duplicate sequences removed and #' annotation fields collapsed if \code{dry=FALSE}. If \code{dry=TRUE}, #' sequences will be labeled with the collapse action, but the input will be #' otherwise unmodifed (see Details). #' #' @details #' \code{collapseDuplicates} identifies duplicate sequences in the \code{seq} column by #' testing for character identity, with consideration of IUPAC ambiguous nucleotide codes. #' A cluster of sequences are considered duplicates if they are all equivalent, and no #' member of the cluster is equivalent to a sequence in a different cluster. #' #' Textual annotations, specified by \code{text_fields}, are collapsed by taking the unique #' set of values within in each duplicate cluster and delimiting those values by \code{sep}. #' Numeric annotations, specified by \code{num_fields}, are collapsed by summing all values #' in the duplicate cluster. Sequence annotations, specified by \code{seq_fields}, are #' collapsed by retaining the first sequence with the fewest number of N characters. #' #' Columns that are not specified in either \code{text_fields}, \code{num_fields}, or #' \code{seq_fields} will be retained, but the value will be chosen from a random entry #' amongst all sequences in a cluster of duplicates. #' #' An ambiguous sequence is one that can be assigned to two different clusters, wherein #' the ambiguous sequence is equivalent to two sequences which are themselves #' non-equivalent. Ambiguous sequences arise due to ambiguous characters at positions that #' vary across sequences, and are discarded along with their annotations when \code{dry=FALSE}. #' Thus, ambiguous sequences are removed as duplicates of some sequence, but do not create a potential #' false-positive annotation merger. Ambiguous sequences are not included in the #' \code{collapse_count} annotation that is added when \code{add_count=TRUE}. #' #' If \code{dry=TRUE} sequences will not be removed from the input. Instead, the following columns #' will be appended to the input defining the collapse action that would have been performed in the #' \code{dry=FALSE} case. #' #' \itemize{ #' \item \code{collapse_id}: an identifer for the group of identical sequences. #' \item \code{collapse_class}: string defining how the sequence matches to the other in the set. #' one of \code{"duplicated"} (has duplicates), #' \code{"unique"} (no duplicates), \code{"ambiguous_duplicate"} #' (no duplicates after ambiguous sequences are removed), #' or \code{"ambiguous"} (matches multiple non-duplicate sequences). #' \item \code{collapse_pass}: \code{TRUE} for the sequences that would be retained. #' } #' #' @seealso Equality is tested with \link{seqEqual} and \link{pairwiseEqual}. #' For IUPAC ambiguous character codes see \link{IUPAC_DNA}. #' #' @examples #' # Example data.frame #' db <- data.frame(sequence_id=LETTERS[1:4], #' sequence_alignment=c("CCCCTGGG", "CCCCTGGN", "NAACTGGN", "NNNCTGNN"), #' c_call=c("IGHM", "IGHG", "IGHG", "IGHA"), #' sample_id=c("S1", "S1", "S2", "S2"), #' duplicate_count=1:4, #' stringsAsFactors=FALSE) #' #' # Annotations are not parsed if neither text_fields nor num_fields is specified #' # The retained sequence annotations will be random #' collapseDuplicates(db, verbose=TRUE) #' #' # Unique text_fields annotations are combined into a single string with "," #' # num_fields annotations are summed #' # Ambiguous duplicates are discarded #' collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", #' verbose=TRUE) #' #' # Use alternate delimiter for collapsing textual annotations #' collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", #' sep="/", verbose=TRUE) #' #' # Add count of duplicates #' collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", #' add_count=TRUE, verbose=TRUE) #' #' # Masking ragged ends may impact duplicate removal #' db$sequence_alignment <- maskSeqEnds(db$sequence_alignment) #' collapseDuplicates(db, text_fields=c("c_call", "sample_id"), num_fields="duplicate_count", #' add_count=TRUE, verbose=TRUE) #' #' @export collapseDuplicates <- function(data, id="sequence_id", seq="sequence_alignment", text_fields=NULL, num_fields=NULL, seq_fields=NULL, add_count=FALSE, ignore=c("N", "-", ".", "?"), sep=",", dry=FALSE, verbose=FALSE) { # Stop if ids are not unique if (any(duplicated(data[[id]]))) { stop("All values in the id column are not unique") } # Verify column classes and exit if they are incorrect if (!is.null(text_fields)) { if (!all(sapply(subset(data, select=text_fields), is.character))) { stop("All text_fields columns must be of type 'character'") } } if (!is.null(num_fields)) { if (!all(sapply(subset(data, select=num_fields), is.numeric))) { stop("All num_fields columns must be of type 'numeric'") } } if (!is.null(seq_fields)) { if (!all(sapply(subset(data, select=seq_fields), is.character))) { stop("All seq_fields columns must be of type 'character'") } } seq_len <- stri_length(data[[seq]]) if (any(seq_len != seq_len[1])) { warning("All sequences are not the same length for data with first ", id, " = ", data[[id]][1]) } # Define verbose reporting function .printVerbose <- function(n_total, n_unique, n_discard) { cat(" FUNCTION> collapseDuplicates\n", sep="") cat(" FIRST_ID> ", data[[id]][1], "\n", sep="") cat(" TOTAL> ", n_total, "\n", sep="") cat(" UNIQUE> ", n_unique, "\n", sep="") cat("COLLAPSED> ", n_total - n_unique - n_discard, "\n", sep="") cat("DISCARDED> ", n_discard, "\n", sep="") cat("\n") } # Define function to count informative positions in sequences .informativeLength <- function(x) { stri_length(gsub("[N\\-\\.\\?]", "", x, perl=TRUE)) } # Initialize collapse_count with 1 for each sequence if(add_count) { data[["collapse_count"]] <- rep(1, nrow(data)) num_fields <- c(num_fields, "collapse_count") } # Initialize dry run columns if (dry) { data$collapse_id <- NA data$collapse_class <- NA data$collapse_pass <- TRUE } # Return input if there are no sequences to collapse nseq <- nrow(data) if (nseq <= 1) { if (verbose) { .printVerbose(nseq, 1, 0) } if (dry) { data[['collapse_id']] <- 1 data[['collapse_class']] <- "unique" data[['collapse_pass']] <- TRUE } return(data) } # Build distance matrix exact_duplicates <- any(duplicated(data[[seq]])) d_mat <- pairwiseEqual(unique(data[[seq]])) colnames(d_mat) <- rownames(d_mat) <- unique(data[[seq]]) n_uniqueseq <- nrow(d_mat) # Return input if no sequences are equal if (!any(d_mat[lower.tri(d_mat, diag=F)]) & !exact_duplicates) { if (verbose) { .printVerbose(nseq, nseq, 0) } if (dry) { data[['collapse_id']] <- 1:nrow(data) data[['collapse_class']] <- "unique" data[['collapse_pass']] <- TRUE } return(data) } # Find sequences that will cluster ambiguously ambig_rows <- numeric() for (i in 1:n_uniqueseq) { idx <- which(d_mat[i, ]) tmp_mat <- d_mat[idx, idx] if (!all(tmp_mat)) { ambig_rows <- append(ambig_rows, i) } } discard_count <- length(ambig_rows) # from ambiguous rows in d_mat to # ambiguous rows in data data_ambig_rows <- data[[seq]] %in% rownames(d_mat)[ambig_rows] data_discard_count <- sum(data_ambig_rows) if (dry & length(ambig_rows)>0) { data[["collapse_class"]][data_ambig_rows] <- "ambiguous" data[["collapse_pass"]][data_ambig_rows] <- FALSE } # Return single sequence if all or all but one sequence belong to ambiguous clusters if (nrow(data) - data_discard_count <= 1) { inform_len <- data.frame(list("inform_len"=.informativeLength(data[[seq]]))) # For each ambiguous cluster, return the best sequence g <- igraph::simplify(igraph::graph_from_adjacency_matrix(d_mat)) inform_len$clusters <- igraph::components(g)$membership[data[[seq]]] inform_len$select_id <- 1:nrow(inform_len) selected <- inform_len %>% dplyr::group_by(!!rlang::sym("clusters")) %>% dplyr::slice(which.max(!!rlang::sym("inform_len"))) %>% dplyr::ungroup() %>% dplyr::select(!!rlang::sym("select_id")) %>% unlist() if (verbose) { .printVerbose(nseq, 0, discard_count - 1) } if (dry) { data[["collapse_id"]] <- inform_len$clusters data[["collapse_pass"]][selected] <- TRUE } else { return(data[selected, ]) } } # Exclude ambiguous sequences from clustering if (!dry & discard_count > 0) { d_mat <- d_mat[-ambig_rows, -ambig_rows] data <- data[!data_ambig_rows,] } # Cluster remaining sequences into unique and duplicate sets dup_taxa <- list() uniq_taxa <- character() done_taxa <- character() taxa_names <- rownames(d_mat) collapse_id <- 1 for (taxa_i in 1:length(taxa_names)) { taxa <- taxa_names[taxa_i] data_taxa_i <- which(data[[seq]] %in% taxa) # Skip taxa if previously assigned to a cluster # or if ambiguous # (ambiguous taxa don't get their own collapse_id) if (taxa %in% done_taxa) { next } if (dry & taxa_i %in% ambig_rows) { next } # Find all zero distance taxa idx <- which(d_mat[taxa, ]) # Translate from d_mat idx to data idx data_idx <- which(data[[seq]] %in% colnames(d_mat)[idx]) # Update vector of clustered taxa done_taxa <- c(done_taxa, taxa_names[idx]) # Update collapse group if (dry) { data[["collapse_id"]][data_idx] <- paste(data[["collapse_id"]][data_idx], collapse_id, sep=",") } if (dry) { #idx_copy <- idx data_idx_copy <- data_idx idx <- idx[idx %in% ambig_rows == FALSE] data_idx <- which(data[[seq]] %in% colnames(d_mat)[idx]) } if (length(data_idx) == 1) { # Assign unique sequences to unique vector uniq_taxa <- append(uniq_taxa, taxa_names[idx]) if (dry) { if (length(data_idx_copy)==1) { ## 'truly' unique data[["collapse_class"]][data_taxa_i] <- "unique" } else { ## unique after ambiguous removal data[["collapse_class"]][data_taxa_i] <- "ambiguous_duplicate" } data[["collapse_pass"]][data_taxa_i] <- TRUE } } else if (length(data_idx) > 1) { # Assign clusters of duplicates to duplicate list dup_taxa <- c(dup_taxa, list(taxa_names[idx])) if (dry) { # Keep collpase_pass==TRUE for the sequence with the # larger number of informative positions # (the first one if ties) max_info_idx <- which.max(.informativeLength(data[[seq]][data_idx]))[1] data[["collapse_class"]][data_idx] <- "duplicated" data[["collapse_pass"]][data_idx[-max_info_idx]] <- FALSE } } else { # Report error (should never occur) stop("Error in distance matrix of collapseDuplicates") } collapse_id <- collapse_id + 1 } if (dry) { data[["collapse_id"]] <- sub("^NA,","",data[["collapse_id"]]) return(data) } # Collapse duplicate sets and append entries to unique data.frame unique_list <- list(data[data[[seq]] %in% uniq_taxa, ]) for (taxa in dup_taxa) { # Define row indices of identical sequences idx <- which(data[[seq]] %in% taxa) tmp_df <- data[idx[1], ] if (length(idx) > 1) { # Initialize with data from most informative sequence seq_set <- data[idx, c(id, seq)] inform_len <- .informativeLength(seq_set[[seq]]) max_inform <- which.max(inform_len)[1] # if ties, pick first tmp_df <- data[idx[max_inform], ] # Define set of text fields for row for (f in text_fields) { f_set <- na.omit(data[[f]][idx]) if (length(f_set) > 0) { f_set <- unlist(strsplit(f_set, sep)) f_set <- sort(unique(f_set)) f_val <- paste(f_set, collapse=sep) } else { f_val <- NA } tmp_df[, f] <- f_val } # Sum numeric fields for (f in num_fields) { f_set <- na.omit(data[[f]][idx]) if (length(f_set) > 0) { f_val <- sum(f_set) } else { f_val <- NA } tmp_df[, f] <- f_val } # Select sequence fields with fewest Ns for (f in seq_fields) { f_set <- na.omit(data[[f]][idx]) if (length(f_set) > 0) { f_len <- .informativeLength(f_set) f_val <- f_set[which.max(f_len)] } else { f_val <- NA } tmp_df[, f] <- f_val } } # Add row to unique list unique_list <- c(unique_list, list(tmp_df)) } # Combine all rows into unique data.frame unique_df <- as.data.frame(bind_rows(unique_list)) if (verbose) { .printVerbose(nseq, nrow(unique_df), discard_count) } return(unique_df) } #### Transformation functions #### #' Translate nucleotide sequences to amino acids #' #' \code{translateDNA} translates nucleotide sequences to amino acid sequences. #' #' @param seq vector of strings defining DNA sequence(s) to be converted to translated. #' @param trim boolean flag to remove 3 nts from both ends of seq #' (converts IMGT junction to CDR3 region). #' #' @return A vector of translated sequence strings. #' #' @seealso \code{\link[seqinr]{translate}}. #' #' @examples #' # Translate a single sequence #' translateDNA("ACTGACTCGA") #' #' # Translate a vector of sequences #' translateDNA(ExampleDb$junction[1:3]) #' #' # Remove the first and last codon from the translation #' translateDNA(ExampleDb$junction[1:3], trim=TRUE) #' #' @export translateDNA <- function (seq, trim=FALSE) { # Function to translate a single string .translate <- function(x) { if (stri_length(x) >= 3 & !is.na(x)) { stri_join(seqinr::translate(unlist(strsplit(x, "")), ambiguous=TRUE), collapse="") } else { NA } } # Remove 3 nucleotides from each end # Eg, "ACTGACTCGA" -> "GACT" (with "ACT" and "CGA" removed) if (trim) { seq <- substr(seq, 4, stri_length(seq) - 3) } # Replace gaps with N seq <- gsub("[-.]", "N", seq) # Apply translation aa <- sapply(seq, .translate, USE.NAMES=FALSE) return(aa) } #' Masks gap characters in DNA sequences #' #' \code{maskSeqGaps} substitutes gap characters, \code{c("-", ".")}, with \code{"N"} #' in a vector of DNA sequences. #' #' @param seq character vector of DNA sequence strings. #' @param mask_char character to use for masking. #' @param outer_only if \code{TRUE} replace only contiguous leading and trailing gaps; #' if \code{FALSE} replace all gap characters. #' #' @return A modified \code{seq} vector with \code{"N"} in place of \code{c("-", ".")} #' characters. #' #' @seealso See \link{maskSeqEnds} for masking ragged edges. #' #' @examples #' # Mask with Ns #' maskSeqGaps(c("ATG-C", "CC..C")) #' maskSeqGaps("--ATG-C-") #' maskSeqGaps("--ATG-C-", outer_only=TRUE) #' #' # Mask with dashes #' maskSeqGaps(c("ATG-C", "CC..C"), mask_char="-") #' #' @export maskSeqGaps <- function(seq, mask_char="N", outer_only=FALSE) { if (outer_only) { for (i in 1:length(seq)) { head_match <- attr(regexpr("^[-\\.]+", seq[i]), "match.length") tail_match <- attr(regexpr("[-\\.]+$", seq[i]), "match.length") if (head_match > 0) { seq[i] <- gsub("^[-\\.]+", paste(rep(mask_char, head_match), collapse=""), seq[i]) } if (tail_match > 0) { seq[i] <- gsub("[-\\.]+$", paste(rep(mask_char, tail_match), collapse=""), seq[i]) } } } else { seq <- gsub("[-\\.]", mask_char, seq) } return(seq) } #' Masks ragged leading and trailing edges of aligned DNA sequences #' #' \code{maskSeqEnds} takes a vector of DNA sequences, as character strings, #' and replaces the leading and trailing characters with \code{"N"} characters to create #' a sequence vector with uniformly masked outer sequence segments. #' #' @param seq character vector of DNA sequence strings. #' @param mask_char character to use for masking. #' @param max_mask the maximum number of characters to mask. If set to 0 then #' no masking will be performed. If set to \code{NULL} then the upper #' masking bound will be automatically determined from the maximum #' number of observed leading or trailing \code{"N"} characters amongst #' all strings in \code{seq}. #' @param trim if \code{TRUE} leading and trailing characters will be cut rather #' than masked with \code{"N"} characters. #' @return A modified \code{seq} vector with masked (or optionally trimmed) sequences. #' #' @seealso See \link{maskSeqGaps} for masking internal gaps. #' See \link{padSeqEnds} for padding sequence of unequal length. #' #' @examples #' # Default behavior uniformly masks ragged ends #' seq <- c("CCCCTGGG", "NAACTGGN", "NNNCTGNN") #' maskSeqEnds(seq) #' #' # Does nothing #' maskSeqEnds(seq, max_mask=0) #' #' # Cut ragged sequence ends #' maskSeqEnds(seq, trim=TRUE) #' #' # Set max_mask to limit extent of masking and trimming #' maskSeqEnds(seq, max_mask=1) #' maskSeqEnds(seq, max_mask=1, trim=TRUE) #' #' # Mask dashes instead of Ns #' seq <- c("CCCCTGGG", "-AACTGG-", "---CTG--") #' maskSeqEnds(seq, mask_char="-") #' #' @export maskSeqEnds <- function(seq, mask_char="N", max_mask=NULL, trim=FALSE) { # Find length of leading and trailing Ns left_lengths <- attr(regexpr(paste0("(^", mask_char, "*)"), seq, perl=T), "capture.length") right_lengths <- attr(regexpr(paste0("(", mask_char, "*$)"), seq, perl=T), "capture.length") # Mask to minimal inner sequence length left_mask <- min(max(left_lengths[, 1]), max_mask) right_mask <- min(max(right_lengths[, 1]), max_mask) seq_lengths <- stri_length(seq) if (trim) { seq <- substr(seq, left_mask + 1, seq_lengths - right_mask) } else { substr(seq, 0, left_mask) <- paste(rep(mask_char, left_mask), collapse='') substr(seq, seq_lengths - right_mask + 1, seq_lengths + 1) <- paste(rep(mask_char, right_mask), collapse='') } return(seq) } #' Pads ragged ends of aligned DNA sequences #' #' \code{padSeqEnds} takes a vector of DNA sequences, as character strings, #' and appends the ends of each sequence with an appropriate number of \code{"N"} #' characters to create a sequence vector with uniform lengths. #' #' @param seq character vector of DNA sequence strings. #' @param len length to pad to. Only applies if longer than the maximum length of #' the data in \code{seq}. #' @param start if \code{TRUE} pad the beginning of each sequence instead of the end. #' @param pad_char character to use for padding. #' @param mod3 if \code{TRUE} pad sequences to be of length multiple three. #' #' @return A modified \code{seq} vector with padded sequences. #' #' @seealso See \link{maskSeqEnds} for creating uniform masking from existing masking. #' #' @examples #' # Default behavior uniformly pads ragged ends #' seq <- c("CCCCTGGG", "ACCCTG", "CCCC") #' padSeqEnds(seq) #' #' # Pad to fixed length #' padSeqEnds(seq, len=15) #' #' # Add padding to the beginning of the sequences instead of the ends #' padSeqEnds(seq, start=TRUE) #' padSeqEnds(seq, len=15, start=TRUE) #' #' @export padSeqEnds <- function(seq, len=NULL, start=FALSE, pad_char="N", mod3=TRUE) { # Set length to max input length width <- max(stringi::stri_length(seq),len) if (mod3 && width %% 3 != 0) { width <- width + (3 - width %% 3) } # Pad if (!start) { seq <- stringi::stri_pad_right(seq, width=width, pad=pad_char) } else { seq <- stringi::stri_pad_left(seq, width=width, pad=pad_char) } return(seq) } #### Subregion functions #### #' Extracts FWRs and CDRs from IMGT-gapped sequences #' #' \code{extractVRegion} extracts the framework and complementarity determining regions of #' the V segment for IMGT-gapped immunoglobulin (Ig) nucleotide sequences according to the #' IMGT numbering scheme. #' #' @param sequences character vector of IMGT-gapped nucleotide sequences. #' @param region string defining the region(s) of the V segment to extract. #' May be a single region or multiple regions (as a vector) from #' \code{c("fwr1", "cdr1", "fwr2", "cdr2" ,"fwr3")}. By default, all #' regions will be returned. #' #' @return If only one region is specified in the \code{region} argument, a character #' vector of the extracted sub-sequences will be returned. If multiple regions #' are specified, then a character matrix will be returned with columns #' corresponding to the specified regions and a row for each entry in #' \code{sequences}. #' #' @seealso IMGT-gapped region boundaries are defined in \link{IMGT_REGIONS}. #' #' @references #' \enumerate{ #' \item Lefranc M-P, et al. IMGT unique numbering for immunoglobulin and T cell #' receptor variable domains and Ig superfamily V-like domains. #' Dev Comp Immunol. 2003 27(1):55-77. #' } #' #' @examples #' # Assign example clone #' clone <- subset(ExampleDb, clone_id == 3138) #' #' # Get all regions #' extractVRegion(clone$sequence_alignment) #' #' # Get single region #' extractVRegion(clone$sequence_alignment, "fwr1") #' #' # Get all CDRs #' extractVRegion(clone$sequence_alignment, c("cdr1", "cdr2")) #' #' # Get all FWRs #' extractVRegion(clone$sequence_alignment, c("fwr1", "fwr2", "fwr3")) #' #' @export extractVRegion <- function(sequences, region=c("fwr1", "cdr1", "fwr2", "cdr2", "fwr3")) { # Check region argument region <- match.arg(region, several.ok=TRUE) if (length(region) == 1) { sub_sequences <- substr(sequences, IMGT_REGIONS[[region]][1], IMGT_REGIONS[[region]][2]) } else { sub_sequences <- sapply(region, function(x) substr(sequences, IMGT_REGIONS[[x]][1], IMGT_REGIONS[[x]][2])) } return(sub_sequences) } #' Calculate junction region alignment properties #' #' \code{junctionAlignment} determines the number of deleted germline nucleotides in the #' junction region and the number of V gene and J gene nucleotides in the CDR3. #' #' @param data \code{data.frame} containing sequence data. #' @param germline_db reference germline database for the V, D and J genes. #' in \code{data} #' @param v_call V gene assignment column. #' @param d_call D gene assignment column. #' @param j_call J gene assignment column. #' @param v_germline_start column containing the start position of the alignment #' in the V reference germline. #' @param v_germline_end column containing the end position of the alignment in the #' V reference germline. #' @param d_germline_start column containing the start position of the alignment #' in the D reference germline. #' @param d_germline_end column containing the start position of the alignment #' in the D reference germline. #' @param j_germline_start column containing the start position of the alignment #' in the J reference germline. #' @param j_germline_end column containing the start position of the alignment #' in the J reference germline. #' @param np1_length combined length of the N and P regions between the #' V and D regions (heavy chain) or V and J regions (light chain). #' @param np2_length combined length of the N and P regions between the #' D and J regions (heavy chain). #' @param junction column containing the junction sequence. #' @param junction_length column containing the length of the junction region in nucleotides. #' @param sequence_alignment column containing the aligned sequence. #' #' @return A modified input \code{data.frame} with the following additional columns storing #' junction alignment information: #' \enumerate{ #' \item \code{e3v_length}: number of 3' V germline nucleotides deleted. #' \item \code{e5d_length}: number of 5' D germline nucleotides deleted. #' \item \code{e3d_length}: number of 3' D germline nucleotides deleted. #' \item \code{e5j_length}: number of 5' J germline nucleotides deleted. #' \item \code{v_cdr3_length}: number of sequence_alignment V nucleotides in the CDR3. #' \item \code{j_cdr3_length}: number of sequence_alignment J nucleotides in the CDR3. #' } #' #' @examples #' germline_db <- list( #' "IGHV3-11*05"="CAGGTGCAGCTGGTGGAGTCTGGGGGA...GGCTTGGTCAAGCCTGGAGGGTCCCTGAGACT #' CTCCTGTGCAGCCTCTGGATTCACCTTC............AGTGACTACTACATGAGCTGGATCCGCCAGGCTCCAG #' GGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGT......AGTAGTTACACAAACTACGCAGACTCTGTGAAG #' ...GGCCGATTCACCATCTCCAGAGACAACGCCAAGAACTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGA #' CACGGCCGTGTATTACTGTGCGAGAGA", #' "IGHD3-10*01"="GTATTACTATGGTTCGGGGAGTTATTATAAC", #' "IGHJ5*02"="ACAACTGGTTCGACCCCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG" #' ) #' #' db <- junctionAlignment(SingleDb, germline_db) #' #' @export junctionAlignment <- function(data, germline_db, v_call="v_call", d_call="d_call", j_call="j_call", v_germline_start="v_germline_start", v_germline_end="v_germline_end", d_germline_start="d_germline_start", d_germline_end="d_germline_end", j_germline_start="j_germline_start", j_germline_end="j_germline_end", np1_length="np1_length", np2_length="np2_length", junction="junction", junction_length="junction_length", sequence_alignment="sequence_alignment") { # Check input check <- checkColumns(data, c(v_call, d_call, j_call, v_germline_start, v_germline_end, d_germline_start, d_germline_end, j_germline_start, j_germline_end, np1_length, np2_length, junction, junction_length, sequence_alignment)) if (check != TRUE) { stop(check) } # Get deletions for (i in 1:nrow(data)) { v_dels <- countDeleted(data[i,], allele_call=v_call, germline_start=v_germline_start, germline_end=v_germline_end, germline_db=germline_db, junction=junction, junction_length=junction_length, sequence_alignment=sequence_alignment) d_dels <- countDeleted(data[i,], allele_call=d_call, germline_start=d_germline_start, germline_end=d_germline_end, germline_db=germline_db, junction=junction, junction_length=junction_length, sequence_alignment=sequence_alignment) j_dels <- countDeleted(data[i,], allele_call=j_call, germline_start=j_germline_start, germline_end=j_germline_end, germline_db=germline_db, junction=junction, junction_length=junction_length, sequence_alignment=sequence_alignment) data[['e3v_length']][i] <- v_dels[2] data[['e5d_length']][i] <- d_dels[1] data[['e3d_length']][i] <- d_dels[2] data[['e5j_length']][i] <- j_dels[1] data[['v_cdr3_length']][i] <- v_dels[3] data[['j_cdr3_length']][i] <- j_dels[3] } return(data) } # Junction alignment helper # # Report the number of deleted germline nucleotides in the alignment # # @param db_row one row from a Rearrangement database. # @param allele_call column containing gene assignments. # @param germline_start column containing the start position of the alignment in the reference germline. # @param germline_end column containing the end position of the alignment in the reference germline. # @param germline_db reference germline database for the V, D and J genes. # @param junction column containing the junction sequence. # @param junction_length column containing the length of the junction region in nucleotides. # @param sequence_alignment column containing the aligned sequence. # # @return Alignment deletions countDeleted <- function(db_row, allele_call, germline_start, germline_end, germline_db, junction, junction_length, sequence_alignment) { # db_row: one row from data # allele_call: one of v,d,j # germline_db: the reference germline database used to assign genes. allele <- getAllele(db_row[[allele_call]], first=T) deleted <- c(NA, NA, NA) # Check for valid allele information if (is.na(allele)) { return(deleted) } # Check for allele in reference germlines tryCatch(germline <- germline_db[[allele]], error=function(e) { stop(allele, " not found in germline_db.") }) allele_germline_start <- as.numeric(db_row[[germline_start]]) allele_germline_end <- as.numeric(db_row[[germline_end]]) germline_head <- stringi::stri_sub(germline, 1, allele_germline_start - 1) deleted_head <- nchar(gsub("\\.", "", germline_head)) germline_tail <- stringi::stri_sub(germline, allele_germline_end+1, nchar(germline)) deleted_tail <- nchar(gsub("\\.", "", germline_tail)) deleted[1] <- deleted_head deleted[2] <- deleted_tail if (is.na(db_row[[junction]])) { warning("NA junction found.") return (deleted) } if (!db_row[[junction_length]]>6) { message("Junction length <= 6.") return (deleted) } junction_len <- db_row[[junction_length]] junction_start <- 310 # junction_end <- junction_start + junction_len - 1 # get aligned junction end (counting gaps) seq_aln <- s2c(db_row[[sequence_alignment]]) != "-" seq_aln[1:junction_start-1] <- 0 junction_end <- which(cumsum(seq_aln[1:length(seq_aln)]) > junction_len)[1] - 1 # For V and J alleles, calculate number of nt in the CDR3 germ_cdr3_length <- NA if (grepl("[Vv]", allele)) { last_cdr3_pre_np <- db_row[[germline_end]] - db_row[[germline_start]] + 1 first_cdr3_pre_np <- junction_start + 3 # without conserved # len <- last_cdr3_pre_np - first_cdr3_pre_np + 1 #germ_seq <- stringi::stri_sub(germline, db_row[[germline_end]]+1-len, db_row[[germline_end]] ) germ_seq <- stringi::stri_sub(db_row[[sequence_alignment]], first_cdr3_pre_np, last_cdr3_pre_np ) germ_cdr3_length <- nchar(gsub("[\\.-]", "", germ_seq)) } else if (grepl("[Jj]", allele)) { j_aln_len <- db_row[[germline_end]] - db_row[[germline_start]] + 1 # germ_seq <- stringi::stri_sub(germline, db_row[[germline_start]], db_row[[germline_end]]-j_tail) germ_seq <- stringi::stri_sub(db_row[[sequence_alignment]], nchar(db_row[[sequence_alignment]]) - j_aln_len + 1, junction_end - 3) germ_cdr3_length <- nchar(gsub("-", "", germ_seq)) } deleted <- c(deleted_head, deleted_tail, germ_cdr3_length) return(deleted) } #### Rcpp wrappers #### #' Calculate distance between two sequences #' #' \code{seqDist} calculates the distance between two DNA sequences. #' #' @param seq1 character string containing a DNA sequence. #' @param seq2 character string containing a DNA sequence. #' @param dist_mat Character distance matrix. Defaults to a Hamming distance #' matrix returned by \link{getDNAMatrix}. If gap #' characters, \code{c("-", ".")}, are assigned a value of -1 #' in \code{dist_mat} then contiguous gaps of any run length, #' which are not present in both sequences, will be counted as a #' distance of 1. Meaning, indels of any length will increase #' the sequence distance by 1. Gap values other than -1 will #' return a distance that does not consider indels as a special case. #' #' @return Numerical distance between \code{seq1} and \code{seq2}. #' #' @seealso Nucleotide distance matrix may be built with #' \link{getDNAMatrix}. Amino acid distance matrix may be built #' with \link{getAAMatrix}. Used by \link{pairwiseDist} for generating #' distance matrices. See \link{seqEqual} for testing sequence equivalence. #' #' @examples #' # Ungapped examples #' seqDist("ATGGC", "ATGGG") #' seqDist("ATGGC", "ATG??") #' #' # Gaps will be treated as Ns with a gap=0 distance matrix #' seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=0)) #' #' # Gaps will be treated as universally non-matching characters with gap=1 #' seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=1)) #' #' # Gaps of any length will be treated as single mismatches with a gap=-1 distance matrix #' seqDist("ATGGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' #' # Gaps of equivalent run lengths are not counted as gaps #' seqDist("ATG-C", "ATG-C", dist_mat=getDNAMatrix(gap=-1)) #' #' # Overlapping runs of gap characters are counted as a single gap #' seqDist("ATG-C", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' seqDist("A-GGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' seqDist("AT--C", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' #' # Discontiguous runs of gap characters each count as separate gaps #' seqDist("-TGGC", "AT--C", dist_mat=getDNAMatrix(gap=-1)) #' #' @export seqDist <- function(seq1, seq2, dist_mat=getDNAMatrix()) { seqDistRcpp(seq1, seq2, dist_mat) } #' Calculate pairwise distances between sequences #' #' \code{pairwiseDist} calculates all pairwise distance between a set of sequences. #' #' @param seq character vector containing a DNA sequences. #' @param dist_mat Character distance matrix. Defaults to a Hamming distance #' matrix returned by \link{getDNAMatrix}. If gap #' characters, \code{c("-", ".")}, are assigned a value of -1 #' in \code{dist_mat} then contiguous gaps of any run length, #' which are not present in both sequences, will be counted as a #' distance of 1. Meaning, indels of any length will increase #' the sequence distance by 1. Gap values other than -1 will #' return a distance that does not consider indels as a special case. #' #' @return A matrix of numerical distance between each entry in \code{seq}. #' If \code{seq} is a named vector, row and columns names will be added #' accordingly. #' #' Amino acid distance matrix may be built with \link{getAAMatrix}. #' Uses \link{seqDist} for calculating distances between pairs. #' See \link{pairwiseEqual} for generating an equivalence matrix. #' #' @examples #' # Gaps will be treated as Ns with a gap=0 distance matrix #' pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), #' dist_mat=getDNAMatrix(gap=0)) #' #' # Gaps will be treated as universally non-matching characters with gap=1 #' pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), #' dist_mat=getDNAMatrix(gap=1)) #' #' # Gaps of any length will be treated as single mismatches with a gap=-1 distance matrix #' pairwiseDist(c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C"), #' dist_mat=getDNAMatrix(gap=-1)) #' #' @export pairwiseDist <- function(seq, dist_mat=getDNAMatrix()) { pairwiseDistRcpp(seq, dist_mat) } #' Calculate pairwise distances between sequences #' #' \code{nonsquareDist} calculates all pairwise distance between a set of sequences and a subset of it. #' #' @param seq character vector containing a DNA sequences. The sequence vector needs to #' be named. #' @param indx numeric vector contating the indices (a subset of indices of \code{seq}). #' @param dist_mat Character distance matrix. Defaults to a Hamming distance #' matrix returned by \link{getDNAMatrix}. If gap #' characters, \code{c("-", ".")}, are assigned a value of -1 #' in \code{dist_mat} then contiguous gaps of any run length, #' which are not present in both sequences, will be counted as a #' distance of 1. Meaning, indels of any length will increase #' the sequence distance by 1. Gap values other than -1 will #' return a distance that does not consider indels as a special case. #' #' @return A matrix of numerical distance between each entry in \code{seq} and #' sequences specified by \code{indx} indices. #' #' Note that the input subsampled indices will be ordered ascendingly. Therefore, #' it is necassary to assign unique names to the input sequences, \code{seq}, #' to recover the input order later. Row and columns names will be added accordingly. #' #' Amino acid distance matrix may be built with \link{getAAMatrix}. #' Uses \link{seqDist} for calculating distances between pairs. #' See \link{pairwiseEqual} for generating an equivalence matrix. #' #' @examples #' # Gaps will be treated as Ns with a gap=0 distance matrix #' seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C") #' pairwiseDist(seq, #' dist_mat=getDNAMatrix(gap=0)) #' #' nonsquareDist(seq, indx=c(1,3), #' dist_mat=getDNAMatrix(gap=0)) #' #' @export nonsquareDist <- function(seq, indx, dist_mat=getDNAMatrix()) { nonsquareDistRcpp(seq, indx, dist_mat) }alakazam/R/Core.R0000644000176200001440000003775214500027762013270 0ustar liggesusers# Common input/output and data structure manipulation functions for Alakazam #### File I/O functions #### #' Read a Change-O tab-delimited database file #' #' \code{readChangeoDb} reads a tab-delimited database file created by a Change-O tool #' into a data.frame. #' #' @param file tab-delimited database file output by a Change-O tool. #' @param select columns to select from database file. #' @param drop columns to drop from database file. #' @param seq_upper if \code{TRUE} convert sequence columns to upper case; #' if \code{FALSE} do not alter sequence columns. See Value #' for a list of which columns are effected. #' #' @return A data.frame of the database file. Columns will be imported as is, except for #' the following columns which will be explicitly converted into character #' values: #' \itemize{ #' \item SEQUENCE_ID #' \item CLONE #' \item SAMPLE #' } #' And the following sequence columns which will converted to upper case if #' \code{seq_upper=TRUE} (default). #' \itemize{ #' \item SEQUENCE_INPUT #' \item SEQUENCE_VDJ #' \item SEQUENCE_IMGT #' \item JUNCTION #' \item GERMLINE_IMGT #' \item GERMLINE_IMGT_D_MASK #' } #' #' @seealso Wraps \link[readr]{read_delim}. #' See \link{writeChangeoDb} for writing to Change-O files. #' See \link[airr]{read_rearrangement} and \link[airr]{write_rearrangement} #' to read and write AIRR-C Standard formatted repertoires. #' #' @examples #' \dontrun{ #' # Read all columns in and convert sequence fields to upper case #' db <- readChangeoDb("changeo.tsv") #' #' # Subset columns and convert sequence fields to upper case #' db <- readChangeoDb("changeo.tsv", select=c("SEQUENCE_ID", "SEQUENCE_IMGT")) #' #' # Drop columns and do not alter sequence field case #' db <- readChangeoDb("changeo.tsv", drop=c("D_CALL", "DUPCOUNT"), #' seq_upper=FALSE) #' } #' #' @export readChangeoDb <- function(file, select=NULL, drop=NULL, seq_upper=TRUE) { # Define column data types seq_columns <- c("SEQUENCE_INPUT", "SEQUENCE_VDJ", "SEQUENCE_IMGT", "JUNCTION", "JUNCTION_AA", "CDR3_IGBLAST_NT", "CDR3_IGBLAST_AA", "GERMLINE_VDJ", "GERMLINE_VDJ_V_REGION", "GERMLINE_VDJ_D_MASK", "GERMLINE_IMGT", "GERMLINE_IMGT_V_REGION", "GERMLINE_IMGT_D_MASK", "FWR1_IMGT", "FWR2_IMGT", "FWR3_IMGT", "FWR4_IMGT", "CDR1_IMGT", "CDR2_IMGT", "CDR3_IMGT") # Define types header <- names(suppressMessages(readr::read_tsv(file, n_max=1))) types <- do.call(readr::cols, CHANGEO[intersect(names(CHANGEO), header)]) # Check if ChangeO format if (length(types$cols)==0) { airr_columns <- intersect(names(airr::RearrangementSchema), header) if (length(airr_columns)>0) { warning(paste0( basename(file), " is not in the Change-O format.\n", "If you are trying to read an AIRR-C Standard formatted file,\n", "use airr::read_rearrangement for correct type casting. ")) } } # Read file db <- suppressMessages(readr::read_tsv(file, col_types=types, na=c("", "NA", "None"))) # Select columns select_columns <- colnames(db) if(!is.null(select)) { select_columns <- intersect(select_columns, select) } if(!is.null(drop)) { select_columns <- setdiff(select_columns, drop) } db <- dplyr::select(db, all_of(select_columns)) # Convert sequence fields to upper case upper_cols <- intersect(seq_columns, names(db)) if (seq_upper & length(upper_cols) > 0) { db <- mutate_at(db, upper_cols, toupper) } return(db) } #' Write a Change-O tab-delimited database file #' #' \code{writeChangeoDb} is a simple wrapper around \link[readr]{write_delim} with defaults #' appropriate for writing a Change-O tab-delimited database file from a data.frame. #' #' @param data data.frame of Change-O data. #' @param file output file name. #' #' @return NULL #' #' @seealso Wraps \link[readr]{write_delim}. See \link{readChangeoDb} for reading to Change-O files. #' See \link[airr]{read_rearrangement} and \link[airr]{write_rearrangement} #' to read and write AIRR-C Standard formatted repertoires. #' #' @examples #' \dontrun{ #' # Write a database #' writeChangeoDb(data, "changeo.tsv") #' } #' #' @export writeChangeoDb <- function(data, file) { write_tsv(data, file, na="NA") } #' Create a temporary folder #' #' \code{makeTempDir} creates a randomly named temporary folder in the #' system temp location. #' #' @param prefix prefix name for the folder. #' #' @return The path to the temporary folder. #' #' @seealso This is just a wrapper for \link{tempfile} and #' \link{dir.create}. #' #' @examples #' makeTempDir("Clone50") #' #' @export makeTempDir <- function(prefix) { temp_path <- tempfile(paste0(prefix, "-temp-")) dir.create(temp_path) return(temp_path) } #### Data manipulation functions #### #' Translate a vector of strings #' #' \code{translateStrings} modifies a character vector by substituting one or more #' strings with a replacement string. #' #' @param strings vector of character strings to modify. #' @param translation named character vector or a list of character vectors specifying #' the strings to replace (values) and their replacements (names). #' #' @return A modified \code{strings} vector. #' #' @details #' Does not perform partial replacements. Each translation value must match a complete #' \code{strings} value or it will not be replaced. Values that do not have a replacement #' named in the \code{translation} parameter will not be modified. #' #' Replacement is accomplished using \link{gsub}. #' #' @seealso See \link{gsub} for single value replacement in the base package. #' #' @examples #' # Using a vector translation #' strings <- LETTERS[1:5] #' translation <- c("POSITION1"="A", "POSITION5"="E") #' translateStrings(strings, translation) #' #' # Using a list translation #' strings <- LETTERS[1:5] #' translation <- list("1-3"=c("A","B","C"), "4-5"=c("D","E")) #' translateStrings(strings, translation) #' #' @export translateStrings <- function(strings, translation) { # TODO: use match instead for complete matching? Currently regex characters in values will mess up the matching. for (n in names(translation)) { rep_regex <- paste(translation[[n]], collapse='|') strings <- gsub(paste0("^(", rep_regex, ")$"), n, strings) } return(strings) } #' Check data.frame for valid columns and issue message if invalid #' #' @param data data.frame to check. #' @param columns vector of column names to check. #' @param logic one of \code{"all"} or \code{"any"} controlling whether all, #' or at least one, of the columns must be valid, respectively. #' @return \code{TRUE} if columns are valid and a string message if not. # #' @examples #' df <- data.frame(A=1:3, B=4:6, C=rep(NA, 3)) #' checkColumns(df, c("A", "B"), logic="all") #' checkColumns(df, c("A", "B"), logic="any") #' checkColumns(df, c("A", "C"), logic="all") #' checkColumns(df, c("A", "C"), logic="any") #' checkColumns(df, c("A", "D"), logic="all") #' checkColumns(df, c("A", "D"), logic="any") #' #' @export checkColumns <- function(data, columns, logic=c("all", "any")) { ## DEBUG # data=df; columns=c("A", "D"); logic="any" # Check arguments logic <- match.arg(logic) data_names <- names(data) if (logic == "all") { # Check that all columns exist for (f in columns) { if (!(f %in% data_names)) { msg <- paste("The column", f, "was not found") return(msg) } } # Check that all values are not NA for (f in columns) { if (all(is.na(data[[f]]))) { msg <- paste("The column", f, "contains no data") return(msg) } } } else if (logic == "any") { # Check that columns exist if (!any(columns %in% data_names)) { msg <- paste("Input must contain at least one of the columns:", paste(columns, collapse=", ")) return(msg) } # Check that all values are not NA columns_found <- columns[columns %in% data_names] invalid <- sapply(columns_found, function(f) all(is.na(data[[f]]))) if (all(invalid)) { msg <- paste("None of the columns", paste(columns_found, collapse=", "), "contain data") return(msg) } } # Return TRUE if all checks pass return(TRUE) } #### Plotting and progress functions #### #' Standard progress bar #' #' \code{progressBar} defines a common progress bar format. #' #' @param n maximum number of ticks #' #' @return A \link[progress]{progress_bar} object. #' #' @export progressBar <- function(n) { pb <- progress::progress_bar$new(format=" PROGRESS> [:bar] :percent :elapsed", width=40, clear=FALSE, stream=stdout(), force=TRUE, total=n) return(pb) } #' Standard ggplot settings #' #' \code{baseTheme} defines common ggplot theme settings for plotting. #' #' @param sizing defines the style and sizing of the theme. One of #' \code{c("figure", "window")} where \code{sizing="figure"} is appropriately #' sized for pdf export at 7 to 7.5 inch width, and \code{sizing="window"} #' is sized for an interactive session. #' #' @return A ggplot2 object. #' #' @seealso \link[ggplot2]{theme}. #' #' @export baseTheme <- function(sizing=c("figure", "window")) { # Check arguments sizing <- match.arg(sizing) base_theme <- theme_bw() + theme(strip.background=element_blank(), plot.background=element_blank(), panel.grid.major=element_blank(), panel.grid.minor=element_blank()) # Define universal plot settings appropriate for PDF figures if (sizing == "figure") { base_theme <- base_theme + theme(text=element_text(size=8), plot.title=element_text(size=8), strip.text=element_text(size=7, face="bold"), axis.title=element_text(size=8, vjust=0.25), axis.text.x=element_text(size=8, vjust=0.5, hjust=0.5), axis.text.y=element_text(size=8), legend.text=element_text(size=7), legend.title=element_text(size=7), legend.key.height=grid::unit(10, "points"), legend.key.width=grid::unit(10, "points")) } else if (sizing == "window") { # Define universal plot settings appropriate for an interactive session base_theme <- base_theme + theme(text=element_text(size=14), plot.title=element_text(size=16), strip.text=element_text(size=14, face="bold"), axis.title=element_text(size=16, vjust=0.25), axis.text.x=element_text(size=16, vjust=0.5, hjust=0.5), axis.text.y=element_text(size=16), legend.text=element_text(size=14), legend.title=element_text(size=14), legend.key.height=grid::unit(18, "points"), legend.key.width=grid::unit(18, "points")) } return(base_theme) } #' Plot multiple ggplot objects #' #' Plots multiple ggplot objects in an equally sized grid. #' #' @param ... ggplot objects to plot. #' @param ncol number of columns in the plot. #' @return NULL #' #' @seealso \link{ggplot}. #' #' @references #' Modified from: #' http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) #' #' @export gridPlot <- function(..., ncol=1) { p <- list(...) n <- length(p) layout <- matrix(seq(1, ncol*ceiling(n/ncol)), ncol=ncol, nrow=ceiling(n/ncol)) # Plot if (n == 1) { plot(p[[1]]) } else { grid::grid.newpage() grid::pushViewport(grid::viewport(layout=grid::grid.layout(nrow(layout), ncol(layout)))) for (i in 1:n) { idx <- as.data.frame(which(layout == i, arr.ind=T)) plot(p[[i]], vp=grid::viewport(layout.pos.row = idx$row, layout.pos.col=idx$col)) } } } #### Multiprocessing functions #### #' Available CPU cores #' #' \code{cpuCount} determines the number of CPU cores available. #' #' @return Count of available cores. Returns 1 if undeterminable. #' #' @examples #' cpuCount() #' #' @export cpuCount <-function(){ if (.Platform$OS.type == "windows") { nproc <- as.numeric(Sys.getenv('NUMBER_OF_PROCESSORS')) } else if (.Platform$OS.type == "unix") { nproc <- parallel::detectCores() } else { nproc <- 1 } # in case an NA is returned if(is.na(nproc)){nproc <- 1} return(nproc) } #### Generic statistical functions #### #' Weighted meta-analysis of p-values via Stouffer's method #' #' \code{stoufferMeta} combines multiple weighted p-values into a meta-analysis p-value #' using Stouffer's Z-score method. #' #' @param p numeric vector of p-values. #' @param w numeric vector of weights. #' #' @return A named numeric vector with the combined Z-score and p-value in the form #' \code{c(Z, pvalue)}. #' #' @examples #' # Define p-value and weight vectors #' p <- c(0.1, 0.05, 0.3) #' w <- c(5, 10, 1) #' #' # Unweighted #' stoufferMeta(p) #' #' # Weighted #' stoufferMeta(p, w) #' #' @export stoufferMeta <- function(p, w=NULL) { if (is.null(w)) { w <- rep(1, length(p))/length(p) } else { if (length(w) != length(p)) { stop("Length of p and w must equal.") } w <- w/sum(w) } x <- qnorm(1 - p) Z <- sum(w*x) / sqrt(sum(w^2)) pvalue <- 1 - pnorm(Z) return(c(Z=Z, pvalue=pvalue)) } # Stirling's approximation of the binomial coefficient # # \code{lchooseStirling} calculates Stirling's approximation of the binomial coefficient # for large numbers. # # @param n vector of n. # @param k vector of k. # @return The approximation of log(n choose k). For n < 100 \link{lchoose} is used. # # @seealso \link{lchoose}. # # @examples # alakazam:::lchooseStirling(10e9, 10e4) # # @export lchooseStirling <- function(n, k) { if (any(n < k)) { stop("n must be >= k") } n_len <- length(n) k_len <- length(k) nCk <- rep(NA, max(n_len, k_len)) nCk[n == k] <- 0 # a = index n_small # i = index k_small # x = index nCk_small # # b = index n_large # j = index k_large # y = index nCk_large # # Check for vector inputs and assign indexing if (n_len >= 1 & k_len >= 1 & n_len == k_len) { a <- i <- x <- (n < 100 & n != k) b <- j <- y <- (n >= 100 & n != k) } else if (n_len > 1 & k_len == 1) { a <- x <- (n < 100 & n != k) b <- y <- (n >= 100 & n != k) i <- j <- TRUE } else if (n_len == 1 & k_len > 1) { a <- (n < 100) b <- !a i <- j <- (n != k) x <- if (n < 100) { i } else { NULL } y <- if (n >= 100) { i } else { NULL } } else { stop("Inputs are wrong. n and k must have the same length or be length one.") } # Small n nCk[x] <- lchoose(n[a], k[i]) # Large n indices nCk[y] <- n[b]*log(n[b]) - k[j]*log(k[j]) - (n[b] - k[j])*log(n[b] - k[j]) + 0.5*(log(n[b]) - log(k[j]) - log(n[b] - k[j]) - log(2*pi)) # .nCk <- function(n, k) { # n*log(n) - k*log(k) - (n - k)*log(n - k) + # 0.5*(log(n) - log(k) - log(n - k) - log(2*pi)) # } return(nCk) } alakazam/R/Alakazam.R0000644000176200001440000001727214505516254014120 0ustar liggesusers#' @keywords internal #' @aliases alakazam-package "_PACKAGE" # Alakazam package documentation and import directives #' The Alakazam package #' #' \code{alakazam} in a member of the Immcantation framework of tools and serves five main #' purposes: #' \itemize{ #' \item Providing core functionality for other R packages in Immcantation. This #' includes common tasks such as file I/O, basic DNA sequence manipulation, and #' interacting with V(D)J segment and gene annotations. #' \item Providing an R interface for interacting with the output of the pRESTO and #' Change-O tool suites. #' \item Performing clonal abundance and diversity analysis on lymphocyte repertoires. #' \item Performing lineage reconstruction on clonal populations of immunoglobulin #' (Ig) sequences. #' \item Performing physicochemical property analyses of lymphocyte receptor sequences. #' } #' For additional details regarding the use of the \code{alakazam} package see the #' vignettes:\cr #' \code{browseVignettes("alakazam")} #' #' @section File I/O: #' \itemize{ #' \item \link{readChangeoDb}: Input Change-O style files. #' \item \link{writeChangeoDb}: Output Change-O style files. #' } #' #' @section Sequence cleaning: #' \itemize{ #' \item \link{maskSeqEnds}: Mask ragged ends. #' \item \link{maskSeqGaps}: Mask gap characters. #' \item \link{collapseDuplicates}: Remove duplicate sequences. #' } #' #' @section Lineage reconstruction: #' \itemize{ #' \item \link{makeChangeoClone}: Clean sequences for lineage reconstruction. #' \item \link{buildPhylipLineage}: Perform lineage reconstruction of Ig sequences. #' } #' #' @section Lineage topology analysis: #' \itemize{ #' \item \link{tableEdges}: Tabulate annotation relationships over edges. #' \item \link{testEdges}: Significance testing of annotation edges. #' \item \link{testMRCA}: Significance testing of MRCA annotations. #' \item \link{summarizeSubtrees}: Various summary statistics for subtrees. #' \item \link{plotSubtrees}: Plot distributions of summary statistics #' for a population of trees. #' } #' #' @section Diversity analysis: #' \itemize{ #' \item \link{countClones}: Calculate clonal abundance. #' \item \link{estimateAbundance}: Bootstrap clonal abundance curves. #' \item \link{alphaDiversity}: Generate clonal alpha diversity curves. #' \item \link{plotAbundanceCurve}: Plot clone size distribution as a rank-abundance #' \item \link{plotDiversityCurve}: Plot clonal diversity curves. #' \item \link{plotDiversityTest}: Plot testing at given diversity hill indicex. #' } #' #' @section Ig and TCR sequence annotation: #' \itemize{ #' \item \link{countGenes}: Calculate Ig and TCR allele, gene and family usage. #' \item \link{extractVRegion}: Extract CDRs and FWRs sub-sequences. #' \item \link{getAllele}: Get V(D)J allele names. #' \item \link{getGene}: Get V(D)J gene names. #' \item \link{getFamily}: Get V(D)J family names. #' \item \link{junctionAlignment}: Junction alignment properties #' } #' #' @section Sequence distance calculation: #' \itemize{ #' \item \link{seqDist}: Calculate Hamming distance between two sequences. #' \item \link{seqEqual}: Test two sequences for equivalence. #' \item \link{pairwiseDist}: Calculate a matrix of pairwise Hamming distances for a #' set of sequences. #' \item \link{pairwiseEqual}: Calculate a logical matrix of pairwise equivalence for a #' set of sequences. #' } #' #' @section Amino acid propertes: #' \itemize{ #' \item \link{translateDNA}: Translate DNA sequences to amino acid sequences. #' \item \link{aminoAcidProperties}: Calculate various physicochemical properties of amino acid #' sequences. #' \item \link{countPatterns}: Count patterns in sequences. #' #' } #' #' @name alakazam #' @docType package #' @references #' \enumerate{ #' \item Vander Heiden JA, Yaari G, et al. pRESTO: a toolkit for processing #' high-throughput sequencing raw reads of lymphocyte receptor repertoires. #' Bioinformatics. 2014 30(13):1930-2. #' \item Stern JNH, Yaari G, Vander Heiden JA, et al. B cells populating the multiple #' sclerosis brain mature in the draining cervical lymph nodes. #' Sci Transl Med. 2014 6(248):248ra107. #' \item Wu Y-CB, et al. Influence of seasonal exposure to grass pollen on local and #' peripheral blood IgE repertoires in patients with allergic rhinitis. #' J Allergy Clin Immunol. 2014 134(3):604-12. #' \item Gupta NT, Vander Heiden JA, et al. Change-O: a toolkit for analyzing #' large-scale B cell immunoglobulin repertoire sequencing data. #' Bioinformatics. 2015 Oct 15;31(20):3356-8. #' } #' #' @import ggplot2 #' @import graphics #' @import methods #' @import utils #' @importFrom airr read_rearrangement write_rearrangement #' @importFrom ape read.fastq read.tree di2multi reorder.phylo root ladderize #' @importFrom dplyr do n desc %>% #' bind_cols bind_rows combine arrange left_join #' group_by ungroup #' filter slice select #' mutate mutate_at #' one_of #' right_join rowwise #' summarize summarize_at all_of #' transmute rename #' @importFrom igraph V E graph_from_data_frame as_data_frame as_edgelist #' make_graph make_directed_graph make_undirected_graph #' vertex_attr set_vertex_attr #' degree shortest_paths all_shortest_paths distances #' graph_from_adjacency_matrix components groups #' @importFrom Matrix sparseMatrix rowSums #' @importFrom progress progress_bar #' @importFrom readr read_delim read_tsv write_delim write_tsv cols #' @importFrom rlang := sym syms enquo #' @importFrom scales log2_trans log10_trans trans_breaks trans_format #' math_format percent scientific pretty_breaks #' @importFrom seqinr translate s2c #' @importFrom stats na.omit setNames ecdf sd cor cov median mad #' dbinom pbinom qbinom rbinom #' dnorm pnorm qnorm rnorm #' dmultinom rmultinom #' @importFrom stringi stri_dup stri_flatten stri_join stri_length #' stri_count_boundaries stri_count_fixed #' stri_count_regex stri_extract_all_regex #' stri_extract_first_regex stri_replace_all_regex #' stri_replace_first_regex stri_split_fixed #' stri_pad_left stri_pad_right #' stri_detect_fixed stri_paste #' @importFrom tibble tibble #' @importFrom tidyr complete gather #' @importFrom Rcpp evalCpp #' @importFrom Biostrings BString extractAt #' @importFrom GenomicAlignments explodeCigarOps explodeCigarOpLengths #' @importFrom IRanges IRanges #' @useDynLib alakazam, .registration=TRUE NULL # Package loading actions .onAttach <- function(libname, pkgname) { msg <- citation(pkgname) msg <-paste(c(format(msg,"citation")),collapse="\n\n") packageStartupMessage(msg) } alakazam/R/Diversity.R0000644000176200001440000016400714505517171014357 0ustar liggesusers# Clonal diversity analysis #' @include Classes.R NULL #### Coverage functions #### #' Calculate sample coverage #' #' \code{calcCoverage} calculates the sample coverage estimate, a measure of sample #' completeness, for varying orders using the method of Chao et al, 2015, falling back #' to the Chao1 method in the first order case. #' #' @param x numeric vector of abundance counts. #' @param r coverage order to calculate. #' #' @return The sample coverage of the given order \code{r}. #' #' @references #' \enumerate{ #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso #' Used by \link{alphaDiversity}. #' #' @examples #' # Calculate clone sizes #' clones <- countClones(ExampleDb, groups="sample_id") #' #' # Calculate 1first order coverage for a single sample #' calcCoverage(clones$seq_count[clones$sample_id == "+7d"]) #' #' @export calcCoverage <- function(x, r=1) { # Use traditional calculation for 1st order coverage if (r == 1) { return(calcChao1Coverage(x)) } # Use general form for 2nd order and higher coverage x <- x[x >= 1] n <- sum(x) fr <- sum(x == r) fs <- sum(x == r + 1) if (fr == 0) { stop("Cannot calculate coverage of order ", r, ". No abundance data with count=", r, ".") } if (fs == 0) { stop("Cannot calculate coverage of order ", r, ". No abundance data with count=", r + 1, ".") } a <- factorial(r)*fr / sum(x[x >= r]^r) b <- ((n - r)*fr / ((n - r)*fr + (r + 1)*fs))^r rC <- 1 - a*b return(rC) } # Calculate first order coverage # # @param x a numeric vector of species abundance as counts # # @returns Coverage estimate. calcChao1Coverage <- function(x) { x <- x[x >= 1] n <- sum(x) f1 <- sum(x == 1) f2 <- sum(x == 2) if (f2 > 0) { rC1 <- 1 - (f1 / n) * (((n - 1) * f1) / ((n - 1) * f1 + 2 * f2)) } else { rC1 <- 1 - (f1 / n) * (((n - 1) * (f1 - 1)) / ((n - 1) * (f1 - 1) + 2)) } return(rC1) } # Calculates diversity under rarefaction # # Calculates Hill numbers under rarefaction # # @param x vector of observed abundance counts. # @param m the sequence count to rarefy to. # # @return The first order coverage estimate inferRarefiedCoverage <- function(x, m) { x <- x[x >= 1] n <- sum(x) if (m > n) { stop("m must be <= the total count of observed sequences.") } # Unrarefied case if (m == n) { return(calcCoverage(x, r=1)) } # Calculate rarefied coverage # TODO: Read up on this and fix #rC1 <- iNEXT:::Chat.Ind(x, m) y <- x[(n - x) >= m] rC1 <- 1 - sum(y/n * exp(lgamma(n - y + 1) - lgamma(n - m - y + 1) - lgamma(n) + lgamma(n - m))) return(rC1) } #### Abundance functions #### # Calculate undetected species # # Calculates the lower bound of undetected species counts using the Chao1 estimator. # # @param x vector of observed abundance counts. # # @return The count of undetected species. inferUnseenCount <- function(x) { x <- x[x >= 1] n <- sum(x) f1 <- sum(x == 1) f2 <- sum(x == 2) if (f2 > 0) { f0 <- ceiling(((n - 1) * f1^2) / (n * 2 * f2)) } else { f0 <- ceiling(((n - 1) * f1 * (f1 - 1)) / (n * 2)) } return(f0) } # Define undetected species relative abundances # # @param x vector of detected species abundance counts. # # @return An adjusted detected species relative abundance distribution. inferUnseenAbundance <- function(x) { x <- x[x >= 1] # Coverage rC1 <- calcCoverage(x, r=1) # Unseen count f0 <- inferUnseenCount(x) # Assign unseen relative abundance p <- rep((1 - rC1) / f0, f0) return(p) } # Adjustement to observed relative abundances # # @param x vector of observed abundance counts # # @return An adjusted observed species relative abundance distribution. adjustObservedAbundance <- function(x) { x <- x[x >= 1] n <- sum(x) # Coverage rC1 <- calcCoverage(x, r=1) # Calculate tuning parameter lambda <- (1 - rC1) / sum(x/n * exp(-x)) # Define adjusted relative abundance p <- x/n * (1 - lambda * exp(-x)) return(p) } # Combined unseen inferrence and observed abundance adjustment # # @param x named vector of observed abundance counts by clone. # # @return A vector containing the complete inferred abundance distribution. # Unseen species will be denote by a clone name starting with "U". inferCompleteAbundance <- function(x) { # Infer complete abundance distribution p1 <- adjustObservedAbundance(x) p2 <- inferUnseenAbundance(x) names(p2) <- if (length(p2) > 0) { paste0("U", 1:length(p2)) } else { NULL } return(c(p1, p2)) } #' Tabulates clones sizes #' #' \code{countClones} determines the number of sequences and total copy number of #' clonal groups. #' #' @param data data.frame with columns containing clonal assignments. #' @param groups character vector defining \code{data} columns containing grouping #' variables. If \code{groups=NULL}, then do not group data. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If this value is specified, then total copy abundance #' is determined by the sum of copy numbers within each clonal group. #' @param clone name of the \code{data} column containing clone identifiers. #' @param remove_na removes rows with \code{NA} values in the clone column if \code{TRUE} and issues a warning. #' Otherwise, keeps those rows and considers \code{NA} as a clone in the final counts #' and relative abundances. #' #' @return A data.frame summarizing clone counts and frequencies with columns: #' \itemize{ #' \item \code{clone_id}: clone identifier. This is the default column #' name, specified with \code{clone='clone_id'}. #' If the function call uses Change-O #' formatted data and \code{clone='CLONE'}, this #' column will have name \code{CLONE}. #' \item \code{seq_count}: total number of sequences for the clone. #' \item \code{seq_freq}: frequency of the clone as a fraction of the total #' number of sequences within each group. #' \item \code{copy_count}: sum of the copy counts in the \code{copy} column. #' Only present if the \code{copy} argument is #' specified. #' \item \code{copy_freq}: frequency of the clone as a fraction of the total #' copy number within each group. Only present if #' the \code{copy} argument is specified. #' } #' Also includes additional columns specified in the \code{groups} argument. #' #' @examples #' # Without copy numbers #' clones <- countClones(ExampleDb, groups="sample_id") #' #' # With copy numbers and multiple groups #' clones <- countClones(ExampleDb, groups=c("sample_id", "c_call"), copy="duplicate_count") #' #' @export countClones <- function(data, groups=NULL, copy=NULL, clone="clone_id", remove_na=TRUE) { # Check input check <- checkColumns(data, c(clone, copy, groups)) if (check != TRUE) { warning(check) # instead of throwing an error and potentially disrupting a workflow } # Handle NAs if (remove_na) { bool_na <- is.na(data[, clone]) if (any(bool_na)) { if (!all(bool_na)){ msg <- paste0("NA(s) found in ", sum(bool_na), " row(s) of the ", clone, " column and excluded from tabulation") warning(msg) } data <- data[!bool_na, ] } } # Tabulate clonal abundance if (is.null(copy)) { clone_tab <- data %>% group_by(!!!rlang::syms(c(groups, clone))) %>% dplyr::summarize(seq_count=n()) %>% dplyr::mutate(seq_freq=!!rlang::sym("seq_count")/sum(!!rlang::sym("seq_count"), na.rm=TRUE)) %>% dplyr::arrange(desc(!!rlang::sym("seq_count"))) } else { clone_tab <- data %>% group_by(!!!rlang::syms(c(groups, clone))) %>% dplyr::summarize(seq_count=length(.data[[clone]]), copy_count=sum(.data[[copy]], na.rm=TRUE)) %>% dplyr::mutate(seq_freq=!!rlang::sym("seq_count")/sum(!!rlang::sym("seq_count"), na.rm=TRUE), copy_freq=!!rlang::sym("copy_count")/sum(!!rlang::sym("copy_count"), na.rm=TRUE)) %>% dplyr::arrange(desc(!!rlang::sym("copy_count"))) } return(clone_tab) } # Perform boostrap abundance calculation # # @param x named vector of observed abundance values. # @param n number of samples to draw from the estimate complete abundance distribution. # @param nboot number of bootstrap realizations. # @param method complete abundance inferrence method. # One of "before", "after" or "none" for complete abundance distribution # inferrence before sampling, after sampling, or uncorrected, respectively. # # @return A matrix of bootstrap results. bootstrapAbundance <- function(x, n, nboot=200, method="before") { ## DEBUG # x=abund_obs; method="before" # Check argumets method <- match.arg(method) if (method == "before") { # Calculate estimated complete abundance distribution p <- inferCompleteAbundance(x) # Bootstrap abundance boot_mat <- rmultinom(nboot, n, p) / n } else if (method == "after") { # Calculate estimated complete abundance distribution p <- x / sum(x, na.rm=TRUE) boot_sam <- rmultinom(nboot, n, p) boot_list <- apply(boot_sam, 2, inferCompleteAbundance) # Convert to matrix boot_names <- unique(unlist(sapply(boot_list, names))) boot_mat <- matrix(0, nrow=length(boot_names), ncol=nboot) rownames(boot_mat) <- boot_names for (i in 1:nboot) { boot_mat[names(boot_list[[i]]), i] <- boot_list[[i]] } } else if (method == "none") { # Raw sampling of input p <- x / sum(x, na.rm=TRUE) boot_sam <- rmultinom(nboot, n, p) } else { stop("Invalid method: ", method) } return(boot_mat) } #' Estimates the complete clonal relative abundance distribution #' #' \code{estimateAbundance} estimates the complete clonal relative abundance distribution #' and confidence intervals on clone sizes using bootstrapping. #' #' @param data data.frame with Change-O style columns containing clonal assignments. #' @param clone name of the \code{data} column containing clone identifiers. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If \code{copy=NULL} (the default), then clone abundance #' is determined by the number of sequences. If a \code{copy} column #' is specified, then clone abundances is determined by the sum of #' copy numbers within each clonal group. #' @param group name of the \code{data} column containing group identifiers. #' If \code{NULL} then no grouping is performed and the \code{group} #' column of the output will contain the value \code{NA} for each row. #' @param min_n minimum number of observations to sample. #' A group with less observations than the minimum is excluded. #' @param max_n maximum number of observations to sample. If \code{NULL} then no #' maximum is set. #' @param uniform if \code{TRUE} then uniformly resample each group to the same #' number of observations. If \code{FALSE} then allow each group to #' be resampled to its original size or, if specified, \code{max_size}. #' @param ci confidence interval to calculate; the value must be between 0 and 1. #' @param nboot number of bootstrap realizations to generate. #' @param progress if \code{TRUE} show a progress bar. #' #' @return A \link{AbundanceCurve} object summarizing the abundances. #' #' @references #' \enumerate{ #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: #' A framework for sampling and estimation in species diversity studies. #' Ecol Monogr. 2014 84:45-67. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso #' See \link{plotAbundanceCurve} for plotting of the abundance distribution. #' See \link{alphaDiversity} for a similar application to clonal diversity. #' #' @examples #' abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) #' #' @export estimateAbundance <- function(data, clone="clone_id", copy=NULL, group=NULL, min_n=30, max_n=NULL, uniform=TRUE, ci=0.95, nboot=200, progress=FALSE) { # TODO: # Add alakazam style cellIdColumn=NULL, locusColumn="locus", locusValues=c("IGH") # similar to distToNearest # filter based on locusValues # if cellIdColumn # for rows that have unique cell_id, ok # if rows have cell_id not unique, count only once # if not cellIdColumn, count heavy chains (locusValues will be IGH) # If mixed bulk and sc do calculation but raise warning because different type of abundances ## DEBUG # data=ExampleDb; group="sample_id"; clone="clone_id"; copy=NULL; min_n=1; max_n=NULL; ci=0.95; uniform=F; nboot=100 # copy="duplicate_count" # group=NULL # Hack for visibility of dplyr variables #. <- NULL # Check input if (!is.data.frame(data)) { stop("Input data is not a data.frame") } # Check columns that are reported are real columns (can be NULL) check <- checkColumns(data, c(clone, copy, group)) if (check != TRUE) { stop(check) } # Set confidence interval ci_z <- ci + (1 - ci) / 2 ci_x <- qnorm(ci_z) # Tabulate clonal abundance count_col <- if (!is.null(copy)) { "copy_count" } else { "seq_count" } clone_tab <- countClones(data, copy=copy, clone=clone, groups=group) %>% dplyr::mutate(clone_count=!!rlang::sym(count_col)) # Tabulate group sizes if (!is.null(group)) { # Summarize groups group_tab <- clone_tab %>% group_by(!!rlang::sym(group)) %>% dplyr::summarize(count=sum(!!rlang::sym("clone_count"), na.rm=TRUE)) %>% rename(group=!!rlang::sym(group)) } else { group_tab <- data.frame(v="All", count=sum(clone_tab$clone_count, na.rm=T)) names(group_tab)[1] <- "group" } group_all <- as.character(group_tab$group) group_tab <- group_tab[group_tab$count >= min_n, ] group_keep <- as.character(group_tab$group) # Set number of sampled sequence if (uniform) { nsam <- min(group_tab$count, max_n) nsam <- setNames(rep(nsam, length(group_keep)), group_keep) } else { nsam <- if (is.null(max_n)) { group_tab$count } else { pmin(group_tab$count, max_n) } nsam <- setNames(nsam, group_keep) } # Warn if groups removed if (length(group_keep) < length(group_all)) { warning("Not all groups passed threshold min_n=", min_n, ".", " Excluded: ", paste(setdiff(group_all, group_keep), collapse=", ")) } # Generate abundance bootstrap if (progress) { pb <- progressBar(length(group_keep)) } boot_list <- list() abund_list <- list() for (g in group_keep) { n <- nsam[g] # Extract abundance vector if (!is.null(group)) { abund_obs <- clone_tab$clone_count[clone_tab[[group]] == g] names(abund_obs) <- clone_tab[[clone]][clone_tab[[group]] == g] } else { # Extract abundance vector abund_obs <- clone_tab$clone_count names(abund_obs) <- clone_tab[[clone]] } # Infer complete abundance distribution boot_mat <- bootstrapAbundance(abund_obs, n, nboot=nboot, method="before") # Assign confidence intervals based on variance of bootstrap realizations p_mean <- apply(boot_mat, 1, mean) p_sd <- apply(boot_mat, 1, sd) p_err <- ci_x * p_sd p_lower <- pmax(p_mean - p_err, 0) p_upper <- p_mean + p_err # Assemble and sort abundance data.frame abund_df <- tibble::tibble(!!clone := rownames(boot_mat), p=p_mean, p_sd=p_sd, lower=p_lower, upper=p_upper) %>% dplyr::arrange(desc(!!rlang::sym("p"))) %>% dplyr::mutate(rank=1:n()) # Save summary abund_list[[g]] <- abund_df # Save bootstrap boot_list[[g]] <- as.data.frame(boot_mat) %>% tibble::rownames_to_column(clone) if (progress) { pb$tick() } } id_col <- "group" if (!is.null(group)) { id_col <- group } abundance_df <- as.data.frame(bind_rows(abund_list, .id=id_col)) bootstrap_df <- as.data.frame(bind_rows(boot_list, .id=id_col)) # Create a new diversity object with bootstrap abund_obj <- new("AbundanceCurve", bootstrap=bootstrap_df, abundance=abundance_df, clone_by=clone, group_by=id_col, #groups=if_else(is.null(group), as.character(NA), group_keep), groups=group_keep, n=nsam, nboot=nboot, ci=ci) return(abund_obj) } #### Diversity functions #### #' Calculate the diversity index #' #' \code{calcDiversity} calculates the clonal diversity index for a vector of diversity #' orders. #' #' @param p numeric vector of clone (species) counts or proportions. #' @param q numeric vector of diversity orders. #' #' @return A vector of diversity scores \eqn{D} for each \eqn{q}. #' #' @details #' This method, proposed by Hill (Hill, 1973), quantifies diversity as a smooth function #' (\eqn{D}) of a single parameter \eqn{q}. Special cases of the generalized diversity #' index correspond to the most popular diversity measures in ecology: species richness #' (\eqn{q = 0}), the exponential of the Shannon-Weiner index (\eqn{q} approaches \eqn{1}), the #' inverse of the Simpson index (\eqn{q = 2}), and the reciprocal abundance of the largest #' clone (\eqn{q} approaches \eqn{+\infty}). At \eqn{q = 0} different clones weight equally, #' regardless of their size. As the parameter \eqn{q} increase from \eqn{0} to \eqn{+\infty} #' the diversity index (\eqn{D}) depends less on rare clones and more on common (abundant) #' ones, thus encompassing a range of definitions that can be visualized as a single curve. #' #' Values of \eqn{q < 0} are valid, but are generally not meaningful. The value of \eqn{D} #' at \eqn{q=1} is estimated by \eqn{D} at \eqn{q=0.9999}. #' #' @references #' \enumerate{ #' \item Hill M. Diversity and evenness: a unifying notation and its consequences. #' Ecology. 1973 54(2):427-32. #' } #' #' @seealso Used by \link{alphaDiversity}. #' #' @examples #' # May define p as clonal member counts #' p <- c(1, 1, 3, 10) #' q <- c(0, 1, 2) #' calcDiversity(p, q) #' #' # Or proportional abundance #' p <- c(1/15, 1/15, 1/5, 2/3) #' calcDiversity(p, q) #' #' @export calcDiversity <- function(p, q) { # Add jitter to q=1 q[q == 1] <- 0.9999 # Remove zeros p <- p[p > 0] # Convert p to proportional abundance p <- p / sum(p) # Calculate D for each q D <- sapply(q, function(x) sum(p^x)^(1 / (1 - x))) return(D) } # Calculate the inferred diversity index # # \code{calcInferredDiversity} calculates the clonal diversity index for a vector of diversity # orders with a correction for the presence of unseen species. Does not take proportional abundance. # # @param p numeric vector of clone (species) counts. # @param q numeric vector of diversity orders. # # @return A vector of diversity scores \eqn{D} for each \eqn{q}. # # @details # This method, proposed by Hill (Hill, 1973), quantifies diversity as a smooth function # (\eqn{D}) of a single parameter \eqn{q}. Special cases of the generalized diversity # index correspond to the most popular diversity measures in ecology: species richness # (\eqn{q = 0}), the exponential of the Shannon-Weiner index (\eqn{q} approaches \eqn{1}), the # inverse of the Simpson index (\eqn{q = 2}), and the reciprocal abundance of the largest # clone (\eqn{q} approaches \eqn{+\infty}). At \eqn{q = 0} different clones weight equally, # regardless of their size. As the parameter \eqn{q} increase from \eqn{0} to \eqn{+\infty} # the diversity index (\eqn{D}) depends less on rare clones and more on common (abundant) # ones, thus encompassing a range of definitions that can be visualized as a single curve. # # Values of \eqn{q < 0} are valid, but are generally not meaningful. The value of \eqn{D} # at \eqn{q=1} is estimated by \eqn{D} at \eqn{q=0.9999}. # # An adjusted detected species relative abundance distribution is applied before calculating diversity. # # @references # \enumerate{ # \item Hill M. Diversity and evenness: a unifying notation and its consequences. # Ecology. 1973 54(2):427-32. # } # # @seealso Used by \link{alphaDiversity} # # @examples # # May define p as clonal member counts # p <- c(1, 1, 3, 10) # q <- c(0, 1, 2) # calcInferredDiversity(p, q) # # # @export # calcInferredDiversity <- function(p, q) { # # Correct abundance # .infer <- function(y) { # # Infer complete abundance distribution # p1 <- adjustObservedAbundance(y) # p2 <- inferUnseenAbundance(y) # names(p2) <- if (length(p2) > 0) { paste0("U", 1:length(p2)) } else { NULL } # return(c(p1, p2)) # } # # # Correct abundance # p <- .infer(p) # # Add jitter to q=1 # q[q == 1] <- 0.9999 # # Remove zeros # p <- p[p > 0] # # Convert p to proportional abundance # p <- p / sum(p) # # Calculate D for each q # D <- sapply(q, function(x) sum(p^x)^(1 / (1 - x))) # # return(D) # } # Calculates diversity under rarefaction # # Calculates Hill numbers under rarefaction # # @param x vector of observed abundance counts. # @param q numeric vector of diversity orders. # @param m the sequence count to rarefy to. # # @return A vector of diversity scores \eqn{D} for each \eqn{q}. inferRarefiedDiversity <- function(x, q, m) { x <- x[x >= 1] n <- sum(x) if (m > n) { stop("m must be <= the total count of observed sequences.") } q[q == 1] <- 0.9999 # Tabulate frequency counts from 1:n fk_n <- tabulate(x, nbins=n) # Calculate estimated fk(m) fk_m <- sapply(1:m, function(k) sum(exp(lchoose(k:m, k) + lchoose(n - k:m, m - k) - lchoose(n, m))*fk_n[k:m])) # Calculate diversity D <- sapply(q, function(r) sum((1:m / m)^r * fk_m)^(1 / (1 - r))) return(D) } # Helper function for computing alpha diversity from bootrstrap outputs # # \code{helperAlpha} divides a set of bootstrapped clones by group annotation, # and computes the diversity of each set. # # @param boot_output data.frame from\link{AbundanceCurve} object containing bootstrapped clonal # abundance curves. # @param q vector of Hill Diversity indices to test for diversity calculations. # @param clone name of the \code{boot_output} column containing clone identifiers. # @param group name of the \code{boot_output} column containing grouping information for # diversity calculation. # # @return data.frame containing diversity calculations for each bootstrap iteration. helperAlpha <- function(boot_output, q, clone="clone_id", group=NULL) { ## DEBUG # abundance <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) # clone <- abundance@clone_by # group <- abundance@group_by # Compute diversity from a column of each bootstrap output <- boot_output %>% dplyr::ungroup() %>% dplyr::select(-one_of(c(clone, group))) %>% as.matrix() %>% apply(2, calcDiversity, q=q) %>% data.frame() %>% mutate(q=q) return(output) } # Helper function for computing beta diversity from bootrstrap outputs # # \code{helperBeta} divides a set of bootstrapped clones by group annotation, # and computes the alpha diversity. Group annotations are then ignored and # gamma diversity is computed. A multiplicative beta diversity is used corresponding # to the gamma diversity divided by the average alpha diversity of each group. # # @param boot_output data.frame from\link{AbundanceCurve} object containing bootstrapped clonal abundance curves. # @param q vector of Hill Diversity indices to test for diversity calculations. # @param ci_z numeric value corresponding to confidence interval for calculating beta diversity. # @param clone name of the \code{boot_output} column containing clone identifiers. # @param group name of the \code{boot_output} column containing grouping information for diversity # calculation. # # @return data.frame containing diversity calculations for each bootstrap iteration. helperBeta <- function(boot_output, q, ci_x, clone="clone_id", group="group") { # Hack for visibility of dplyr variables . <- NULL # Compute gamma diversity metrics gamma <- boot_output %>% dplyr::group_by(!!rlang::sym(clone)) %>% dplyr::select(-one_of(c(group))) %>% dplyr::summarize_all(sum) %>% dplyr::do(helperAlpha(., q=q, clone=clone)) %>% tidyr::gather(key="n", value="gamma", -!!rlang::sym("q")) %>% dplyr::mutate(gamma=as.numeric(!!rlang::sym("gamma"))) # Compute alpha diversity metrics alpha <- boot_output %>% dplyr::group_by(!!rlang::sym(group)) %>% dplyr::do(helperAlpha(., q=q, clone=clone, group=group)) %>% dplyr::group_by(!!rlang::sym("q")) %>% dplyr::select(-one_of(c(group))) %>% dplyr::summarize_all(mean) %>% tidyr::gather(key="n", value="alpha", -!!rlang::sym("q")) %>% dplyr::mutate(alpha=as.numeric(!!rlang::sym("alpha"))) # Perform comparisons of alpha and gamma to extract beta beta <- bind_cols(gamma, alpha) %>% dplyr::group_by(!!rlang::sym("q")) %>% dplyr::mutate(X=!!rlang::sym("gamma") / !!rlang::sym("alpha")) %>% dplyr::summarize(d=mean(!!rlang::sym("X"), na.rm=TRUE), d_sd=sd(!!rlang::sym("X"), na.rm=TRUE)) %>% dplyr::mutate(d_lower=pmax(!!rlang::sym("d") - !!rlang::sym("d_sd") * ci_x, 0), d_upper=!!rlang::sym("d") + !!rlang::sym("d_sd") * ci_x) return(beta) } # Helper function for computing statistical significance # # \code{helperTest} computes the pairwise statistical significance of differences # in bootstrapped diversity values between two sets defined by the group column. # A p-value is computed using the ECDF distribution as the frequency of bootstrap iterations # for which no difference is observed. # # @param div_df data.frame from\link{DiversityCurve} object containing bootstrapped # diversity curves. # @param group name of the \code{boot_output} column containing grouping information # for diversity calculation. # @param q vector of Hill Diversity indices to test for diversity calculations. # # @return data.frame containing test results for each value of q. helperTest <- function(div_df, q, group="group") { # Hack for visibility of dplyr variables #. <- NULL # Pairwise test group_pairs <- combn(unique(div_df[[group]]), 2, simplify=F) pvalue_list <- list() for (group_pair in group_pairs) { pair_list <- list() for(q_i in q) { # Currently just testing for one diversity order mat1 <- div_df %>% dplyr::filter(!!rlang::sym(group) == group_pair[1], !!rlang::sym("q") == q_i) %>% dplyr::select(-one_of(c(group, "q"))) %>% unlist() mat2 <- div_df %>% dplyr::filter(!!rlang::sym(group) == group_pair[2], !!rlang::sym("q") == q_i) %>% dplyr::select(-one_of(c(group, "q"))) %>% unlist() if (mean(mat1) >= mean(mat2)) { g_delta <- mat1 - mat2 } else { g_delta <- mat2 - mat1 } # Compute p-value from ecdf p <- ecdf(g_delta)(0) p <- ifelse(p <= 0.5, p * 2, (1 - p) * 2) pair_list[[as.character(q_i)]] <- list(delta_mean=mean(g_delta), delta_sd=sd(g_delta), pvalue=p) } pvalue_list[[paste(group_pair, collapse=" != ")]] <- bind_rows(pair_list, .id="q") } test_df <- bind_rows(pvalue_list, .id="test") return(test_df) } #' Calculate clonal alpha diversity #' #' \code{alphaDiversity} takes in a data.frame or \link{AbundanceCurve} and computes #' diversity scores (\eqn{D}) over an interval of diversity orders (\eqn{q}). #' #' @param data data.frame with Change-O style columns containing clonal assignments or #' a \link{AbundanceCurve} generate by \link{estimateAbundance} object #' containing a previously calculated bootstrap distributions of clonal abundance. #' @param min_q minimum value of \eqn{q}. #' @param max_q maximum value of \eqn{q}. #' @param step_q value by which to increment \eqn{q}. #' @param ci confidence interval to calculate; the value must be between 0 and 1. #' @param ... additional arguments to pass to \link{estimateAbundance}. Additional arguments #' are ignored if a \link{AbundanceCurve} is provided as input. #' #' @return A \link{DiversityCurve} object summarizing the diversity scores. #' #' @references #' \enumerate{ #' \item Hill M. Diversity and evenness: a unifying notation and its consequences. #' Ecology. 1973 54(2):427-32. #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: #' A framework for sampling and estimation in species diversity studies. #' Ecol Monogr. 2014 84:45-67. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso See \link{calcDiversity} for the basic calculation and #' \link{DiversityCurve} for the return object. #' See \link{plotDiversityCurve} for plotting the return object. #' #' @details #' Clonal diversity is calculated using the generalized diversity index (Hill numbers) #' proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. #' #' To generate a smooth curve, \eqn{D} is calculated for each value of \eqn{q} from #' \code{min_q} to \code{max_q} incremented by \code{step_q}. When \code{uniform=TRUE} #' variability in total sequence counts across unique values in the \code{group} column #' is corrected by repeated resampling from the estimated complete clonal distribution to a #' common number of sequences. The complete clonal abundance distribution that is resampled #' from is inferred by using the Chao1 estimator to infer the number of unseen clones, #' followed by applying the relative abundance correction and unseen clone frequencies #' described in Chao et al, 2015. #' #' The diversity index (\eqn{D}) for each group is the mean value of over all resampling #' realizations. Confidence intervals are derived using the standard deviation of the #' resampling realizations, as described in Chao et al, 2015. #' #' Significance of the difference in diversity index (\code{D}) between groups is tested by #' constructing a bootstrap delta distribution for each pair of unique values in the #' \code{group} column. The bootstrap delta distribution is built by subtracting the diversity #' index \code{Da} in group \code{a} from the corresponding value \eqn{Db} in group \code{b}, #' for all bootstrap realizations, yielding a distribution of \code{nboot} total deltas; where #' group \code{a} is the group with the greater mean \code{D}. The p-value for hypothesis #' \code{Da != Db} is the value of \code{P(0)} from the empirical cumulative distribution #' function of the bootstrap delta distribution, multiplied by 2 for the two-tailed correction. #' #' Note, this method may inflate statistical significance when clone sizes are uniformly small, #' such as when most clones sizes are 1, sample size is small, and \code{max_n} is near #' the total count of the smallest data group. Use caution when interpreting the results #' in such cases. #' #' @examples #' # Group by sample identifier in two steps #' abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) #' div <- alphaDiversity(abund, step_q=1, max_q=10) #' plotDiversityCurve(div, legend_title="Sample") #' #' # Grouping by isotype rather than sample identifier in one step #' div <- alphaDiversity(ExampleDb, group="c_call", min_n=40, step_q=1, max_q=10, #' nboot=100) #' plotDiversityCurve(div, legend_title="Isotype") #' #' @export alphaDiversity <- function(data, min_q=0, max_q=4, step_q=0.1, ci=0.95, ...) { # Hack for visibility of dplyr variables . <- NULL # Check input object and call estimateAbundance if required if (is(data, "AbundanceCurve")) { abundance <- data } else if (is(data, "data.frame")) { abundance <- estimateAbundance(data, ci=0.95, ...) } else { stop("Input must be either a data.frame or AbundanceCurve object.") } # Set diversity orders and confidence interval ci_z <- ci + (1 - ci) / 2 ci_x <- qnorm(ci_z) q <- seq(min_q, max_q, step_q) if (!(0 %in% q)) { q <- c(0, q) } # Set grouping variables clone <- abundance@clone_by group <- abundance@group_by # Compute diversity metric for bootstrap instances boot_df <- abundance@bootstrap %>% dplyr::group_by(!!rlang::sym(group)) %>% dplyr::do(helperAlpha(., q=q, clone=clone, group=group)) %>% dplyr::ungroup() # Summarize diversity div_df <- boot_df %>% tidyr::gather(key="n", value="X", -one_of(c(group, "q"))) %>% dplyr::mutate(X=as.numeric(!!rlang::sym("X"))) %>% dplyr::group_by(!!!rlang::syms(c(group, "q"))) %>% dplyr::summarize(d=mean(!!rlang::sym("X"), na.rm=TRUE), d_sd=sd(!!rlang::sym("X"), na.rm=TRUE)) %>% dplyr::mutate(d_lower=pmax(!!rlang::sym("d") - !!rlang::sym("d_sd") * ci_x, 0), d_upper=!!rlang::sym("d") + !!rlang::sym("d_sd") * ci_x) # Compute evenness div_qi <- div_df %>% filter(!!rlang::sym("q") == 0) %>% select(one_of(c(group, "d"))) div_df <- div_df %>% dplyr::right_join(div_qi, by=group, suffix=c("", "_0")) %>% mutate(e=!!rlang::sym("d")/!!rlang::sym("d_0"), e_lower=!!rlang::sym("d_lower")/!!rlang::sym("d_0"), e_upper=!!rlang::sym("d_upper")/!!rlang::sym("d_0")) %>% select(-!!rlang::sym("d_0")) # Test if (length(abundance@groups) > 1) { test_df <- helperTest(boot_df, q=q, group=group) } else { test_df <- NULL } # Build return object group_set <- unique(div_df[[group]]) div_obj <- new("DiversityCurve", diversity=div_df, tests=test_df, method="alpha", group_by=group, groups=group_set, q=q, n=abundance@n, ci=ci) return(div_obj) } # Calculates the pairwise beta diversity # # \code{betaDiversity} takes in a data.frame or \link{AbundanceCurve} and computes # the multiplicative beta diversity across a range of Hill diversity indices. # # @param data data.frame with Change-O style columns containing clonal assignments or # an \link{AbundanceCurve} object generate by \link{estimateAbundance}. # containing a previously calculated bootstrap distributions of clonal abundance. # @param comparisons named list of comparisons between group members for computing beta diversity. # @param min_q minimum value of \eqn{q}. # @param max_q maximum value of \eqn{q}. # @param step_q value by which to increment \eqn{q}. # @param ci confidence interval to calculate; the value must be between 0 and 1. # @param ... additional arguments to pass to \link{estimateAbundance}. Additional arguments # are ignored if a \link{AbundanceCurve} is provided as input. # # @return A \link{DiversityCurve} object summarizing the diversity scores. # # @details # Beta diversity or the comparative difference between two samples as quantified using Hill # diversity indices proposed by Jost (Jost, 2007). # # Briefly, the alpha and gamma diversity components are calculated for each comparison. # Alpha diversity is calculated as the average hill diversity across each independent sample # while Gamma diversity is calculated as the total diversity without distinguishing between # samples. Beta diversity is computed as Gamma/Alpha. # # Diversity is calculated on the estimated clonal abundance distribution with a correction # for unseen species much like the calculation for alpha diversity \link{alphaDiversity}. # A smooth curve is generated in the same manner as in \link{alphaDiversity}. # Confidence intervals are derived using the standard deviation of the resampling realizations. # # \enumerate{ # \item Hill M. Diversity and evenness: a unifying notation and its consequences. # Ecology. 1973 54(2):427-32. # \item Jost L. Partitioning Diversity Into Independent Alpha and Beta Components. # Ecology. 2007 88(10):2427–2439. # \item Jost L, et al. Partitioning diversity for conservation analyses. # Diversity Distrib. 2010 16(1):65–76 # } # # @examples # div <- betaDiversity(ExampleDb, comparisons=list("TIME"=c("-1h", "+7d")), group="sample_id", # min_n=40, step_q=1, max_q=10, nboot=100) # # plotDiversityCurve(div, legend_title="Isotype") # # @export betaDiversity <- function(data, comparisons, min_q=0, max_q=4, step_q=0.1, ci=0.95, ...) { # Hack for visibility of dplyr variables . <- NULL if (!is.list(comparisons) || is.null(names(comparisons))) { stop("'comparisons' must be a named list") } # Check input object and call estimateAbundance if required if (is(data, "AbundanceCurve")) { abundance <- data } else if (is(data, "data.frame")) { abundance <- estimateAbundance(data, ci=0.95, ...) } else { stop("Input must be either a data.frame or AbundanceCurve object.") } # Set diversity orders and confidence interval ci_z <- ci + (1 - ci) / 2 ci_x <- qnorm(ci_z) q <- seq(min_q, max_q, step_q) if (!(0 %in% q)) { q <- c(0, q) } # Compute pairwise beta diversity for bootstrap instances beta_diversity_list <- list() for (comparison in names(comparisons)) { beta_diversity_list[[comparison]] <- abundance@bootstrap %>% dplyr::ungroup() %>% dplyr::filter(.[[abundance@group_by]] %in% comparisons[[comparison]]) %>% dplyr::do(helperBeta(., q=q, clone=abundance@clone_by, group=abundance@group_by, ci_x=ci_x)) } # Generate summary diversity output div_df <- bind_rows(beta_diversity_list, .id = "comparison") # Beta groups group_set <- unique(div_df[["comparison"]]) # Compute evenness div_qi <- div_df %>% filter(!!rlang::sym("q") == 0) %>% select(one_of(c("comparison", "D"))) div <- div_df %>% right_join(div_qi, by = "comparison", suffix = c("", "_0")) %>% mutate(d = !!rlang::sym("d")/!!rlang::sym("d_0"), e_lower = !!rlang::sym("d_lower")/!!rlang::sym("d_0"), e_upper = !!rlang::sym("d_upper")/!!rlang::sym("d_0")) %>% select(-!!rlang::sym("d_0")) # Test if (length(group_set) > 1) { test_df <- helperTest(div_df, q=q, group="comparison") } else { test_df <- NULL } # Build return object div_obj <- new("DiversityCurve", diversity=div, tests=test_df, method="beta", group_by="comparison", groups=group_set, n=abundance@n, q=q, ci=ci) return(div_obj) } #### Plotting functions #### #' Plot a clonal abundance distribution #' #' \code{plotAbundanceCurve} plots the results from estimating the complete clonal #' relative abundance distribution. The distribution is plotted as a log rank abundance #' distribution. #' #' @param data \link{AbundanceCurve} object returned by \link{estimateAbundance}. #' @param colors named character vector whose names are values in the #' \code{group} column of \code{data} and whose values are #' colors to assign to those group names. #' @param main_title string specifying the plot title. #' @param legend_title string specifying the legend title. #' @param xlim numeric vector of two values specifying the #' \code{c(lower, upper)} x-axis limits. The lower x-axis #' value must be >=1. #' @param ylim numeric vector of two values specifying the #' \code{c(lower, upper)} y-axis limits. The limits on the #' abundance values are expressed as fractions of 1: use #' c(0,1) to set the lower and upper limits to 0\% and 100\%. #' @param annotate string defining whether to added values to the group labels #' of the legend. When \code{"none"} (default) is specified no #' annotations are added. Specifying (\code{"depth"}) adds #' sequence counts to the labels. #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso #' See \link{AbundanceCurve} for the input object and \link{estimateAbundance} for #' generating the input abundance distribution. Plotting is performed with \link{ggplot}. #' #' @examples #' # Estimate abundance by sample and plot #' abund <- estimateAbundance(ExampleDb, group="sample_id", nboot=100) #' plotAbundanceCurve(abund, legend_title="Sample") #' #' @export plotAbundanceCurve <- function(data, colors=NULL, main_title="Rank Abundance", legend_title=NULL, xlim=NULL, ylim=NULL, annotate=c("none", "depth"), silent=FALSE, ...) { # Check if abundance is in data if (is.null(data@abundance)) { stop("Missing abundance data.") } # Validate abundance limits if (!is.null(xlim)) { if (xlim[1]<1) { stop("The lower x-axis xlim value must be >=1.") } max_xlim <- max(data@abundance$rank, na.rm = T) if (xlim[2]>max_xlim) { message("The largest x-axis value is ",max_xlim,".") } } # Check arguments annotate <- match.arg(annotate) # Define group label annotations if (all(is.na(data@groups)) || length(data@groups) == 1) { group_labels <- NA } else if (annotate == "none") { group_labels <- setNames(data@groups, data@groups) } else if (annotate == "depth") { group_labels <- setNames(paste0(data@groups, " (N=", data@n, ")"), data@groups) } # Stupid hack for check NOTE about `.x` in math_format .x <- NULL if (!all(is.na(group_labels))) { # Define grouped plot p1 <- ggplot(data@abundance, aes(x=!!rlang::sym("rank"), y=!!rlang::sym("p"), group=!!rlang::sym(data@group_by))) + ggtitle(main_title) + baseTheme() + xlab("Rank") + ylab("Abundance") + scale_x_log10( breaks=scales::trans_breaks("log10", function(x) 10^x), labels=scales::trans_format("log10", scales::math_format(10^.x))) + scale_y_continuous(labels=scales::percent) + geom_ribbon(aes(ymin=!!rlang::sym("lower"), ymax=!!rlang::sym("upper"), fill=!!rlang::sym(data@group_by)), alpha=0.4) + geom_line(aes(color=!!rlang::sym(data@group_by))) # Set colors and legend if (!is.null(colors)) { p1 <- p1 + scale_color_manual(name=legend_title, labels=group_labels, values=colors) + scale_fill_manual(name=legend_title, labels=group_labels, values=colors) } else { p1 <- p1 + scale_color_discrete(name=legend_title, labels=group_labels) + scale_fill_discrete(name=legend_title, labels=group_labels) } } else { # Set color if (!is.null(colors) & length(colors) == 1) { line_color <- colors } else { line_color <- "black" } # Define plot p1 <- ggplot(data@abundance, aes(x=!!rlang::sym("rank"), y=!!rlang::sym("p"))) + ggtitle(main_title) + baseTheme() + xlab("Rank") + ylab("Abundance") + scale_x_log10( breaks=scales::trans_breaks("log10", function(x) 10^x), labels=scales::trans_format("log10", scales::math_format(10^.x))) + scale_y_continuous(labels=scales::percent) + geom_ribbon(aes(ymin=!!rlang::sym("lower"), ymax=!!rlang::sym("upper")), fill=line_color, alpha=0.4) + geom_line(color=line_color) } # Add additional theme elements p1 <- p1 + coord_cartesian(xlim=xlim,ylim=ylim) + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } #' Plot the results of alphaDiversity #' #' \code{plotDiversityCurve} plots a \code{DiversityCurve} object. #' #' @param data \link{DiversityCurve} object returned by #' \link{alphaDiversity}. #' @param colors named character vector whose names are values in the #' \code{group} column of the \code{data} slot of \code{data}, #' and whose values are colors to assign to those group names. #' @param main_title string specifying the plot title. #' @param legend_title string specifying the legend title. #' @param log_x if \code{TRUE} then plot \eqn{q} on a log scale; #' if \code{FALSE} plot on a linear scale. #' @param log_y if \code{TRUE} then plot the diversity/evenness scores #' on a log scale; if \code{FALSE} plot on a linear scale. #' @param xlim numeric vector of two values specifying the #' \code{c(lower, upper)} x-axis limits. #' @param ylim numeric vector of two values specifying the #' \code{c(lower, upper)} y-axis limits. #' @param annotate string defining whether to added values to the group labels #' of the legend. When \code{"none"} (default) is specified no #' annotations are added. Specifying (\code{"depth"}) adds #' sequence counts to the labels. #' @param score one of \code{"diversity"} or \code{"evenness"} specifying which #' score to plot on the y-asis. #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso See \link{alphaDiversity} and \link{alphaDiversity} for generating #' \link{DiversityCurve} objects for input. Plotting is performed with \link{ggplot}. #' #' @examples #' # Calculate diversity #' div <- alphaDiversity(ExampleDb, group="sample_id", nboot=100) #' #' # Plot diversity #' plotDiversityCurve(div, legend_title="Sample") #' #' # Plot diversity #' plotDiversityCurve(div, legend_title="Sample", score="evenness") #' #' @export plotDiversityCurve <- function(data, colors=NULL, main_title="Diversity", legend_title="Group", log_x=FALSE, log_y=FALSE, xlim=NULL, ylim=NULL, annotate=c("none", "depth"), score=c("diversity", "evenness"), silent=FALSE, ...) { # Check arguments annotate <- match.arg(annotate) score <- match.arg(score) # Define group label annotations if (all(is.na(data@groups)) || length(data@groups) == 1) { group_labels <- NA } else if (annotate == "none") { group_labels <- setNames(data@groups, data@groups) } else if (annotate == "depth") { group_labels <- setNames(paste0(data@groups, " (n=", data@n, ")"), data@groups) } # Define y-axis scores if (score == "diversity") { y_value <- "d" y_min <- "d_lower" y_max <- "d_upper" y_label <- expression(''^q * D) } else if (score == "evenness") { y_value <- "e" y_min <- "e_lower" y_max <- "e_upper" y_label <- expression(''^q * e) } # Stupid hack for check NOTE about `.x` in math_format .x <- NULL if (!all(is.na(group_labels))) { # Define grouped plot p1 <- ggplot(data@diversity, aes(x=q, y=!!rlang::sym(y_value), group=!!rlang::sym(data@group_by))) + ggtitle(main_title) + baseTheme() + xlab('q') + ylab(y_label) + geom_ribbon(aes(ymin=!!rlang::sym(y_min), ymax=!!rlang::sym(y_max), fill=!!rlang::sym(data@group_by)), alpha=0.4) + geom_line(aes(color=!!rlang::sym(data@group_by))) # Set colors and legend if (!is.null(colors)) { p1 <- p1 + scale_color_manual(name=legend_title, labels=group_labels, values=colors) + scale_fill_manual(name=legend_title, labels=group_labels, values=colors) } else { p1 <- p1 + scale_color_discrete(name=legend_title, labels=group_labels) + scale_fill_discrete(name=legend_title, labels=group_labels) } } else { # Set color if (!is.null(colors) & length(colors) == 1) { line_color <- colors } else { line_color <- "black" } # Define ungrouped plot p1 <- ggplot(data@diversity, aes(x=q, y=!!rlang::sym(y_value))) + ggtitle(main_title) + baseTheme() + xlab('q') + ylab(y_label) + geom_ribbon(aes(ymin=!!rlang::sym(y_min), ymax=!!rlang::sym(y_max)), fill=line_color, alpha=0.4) + geom_line(color=line_color) } # Set x-axis style if (log_x) { p1 <- p1 + scale_x_continuous(trans=scales::log2_trans(), breaks=scales::trans_breaks('log2', function(x) 2^x), labels=scales::trans_format('log2', scales::math_format(2^.x))) } else { p1 <- p1 + scale_x_continuous() } # Set y-axis style if (log_y) { p1 <- p1 + scale_y_continuous(trans=scales::log2_trans(), breaks=scales::trans_breaks('log2', function(x) 2^x), labels=scales::trans_format('log2', scales::math_format(2^.x))) } else { p1 <- p1 + scale_y_continuous() } # Add additional theme elements p1 <- p1 + coord_cartesian(xlim=xlim,ylim=ylim) + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } #' Plot the results of diversity testing #' #' \code{plotDiversityTest} plots summary data for a \code{DiversityCurve} object #' with mean and a line range indicating plus/minus one standard deviation. #' #' @param data \link{DiversityCurve} object returned by #' \link{alphaDiversity}. #' @param q diversity order to plot the test for. #' @param colors named character vector whose names are values in the #' \code{group} column of the \code{data} slot of \code{data}, #' and whose values are colors to assign to those group names. #' @param main_title string specifying the plot title. #' @param legend_title string specifying the legend title. #' @param log_d if \code{TRUE} then plot the diversity scores \eqn{D} #' on a log scale; if \code{FALSE} plot on a linear scale. #' @param annotate string defining whether to added values to the group labels #' of the legend. When \code{"none"} (default) is specified no #' annotations are added. Specifying (\code{"depth"}) adds #' sequence counts to the labels. #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso See \link{alphaDiversity} for generating input. #' Plotting is performed with \link{ggplot}. #' #' @examples #' # Calculate diversity #' div <- alphaDiversity(ExampleDb, group="sample_id", min_q=0, max_q=2, step_q=1, nboot=100) #' #' # Plot results at q=0 (equivalent to species richness) #' plotDiversityTest(div, 0, legend_title="Sample") #' #' # Plot results at q=2 (equivalent to Simpson's index) #' plotDiversityTest(div, q=2, legend_title="Sample") #' #' @export plotDiversityTest <- function(data, q, colors=NULL, main_title="Diversity", legend_title="Group", log_d=FALSE, annotate=c("none", "depth"), silent=FALSE, ...) { # Stupid hack for check NOTE about `.x` in math_format .x <- NULL # Check arguments annotate <- match.arg(annotate) # Check if abundance is in data if (is.null(data@tests)) { stop("Test data missing from input object.") } # Check if q is in data if (!(q %in% data@q)) { stop("Test for order q=", q, " not found in input object.") } # Define group label annotations if (annotate == "none") { group_labels <- setNames(data@groups, data@groups) } else if (annotate == "depth") { group_labels <- setNames(paste0(data@groups, " (N=", data@n, ")"), data@groups) } # Define plot values df <- data@diversity %>% dplyr::filter(!!rlang::sym("q") == !!rlang::enquo(q)) %>% dplyr::mutate(lower=!!rlang::sym("d") - !!rlang::sym("d_sd"), upper=!!rlang::sym("d") + !!rlang::sym("d_sd")) # Define base plot elements p1 <- ggplot(df, aes(x=!!rlang::sym(data@group_by))) + ggtitle(main_title) + baseTheme() + xlab("") + ylab(bquote("Mean " ^ .(q) * D %+-% "SD")) + geom_linerange(aes(ymin=!!rlang::sym("lower"), ymax=!!rlang::sym("upper"), color=!!rlang::sym(data@group_by)), alpha=0.8) + geom_point(aes(y=!!rlang::sym("d"), color=!!rlang::sym(data@group_by))) # Set colors and legend if (!is.null(colors)) { p1 <- p1 + scale_color_manual(name=legend_title, labels=group_labels, values=colors) } else { p1 <- p1 + scale_color_discrete(name=legend_title, labels=group_labels) } # Set x-axis style if (log_d) { p1 <- p1 + scale_y_continuous(trans=scales::log2_trans(), breaks=scales::trans_breaks('log2', function(x) 2^x), labels=scales::trans_format('log2', scales::math_format(2^.x))) } else { p1 <- p1 + scale_y_continuous() } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } alakazam/R/Deprecated.R0000644000176200001440000002347513732424726014444 0ustar liggesusers# Deprecated and defunct functions #' @include Classes.R #' @include Diversity.R NULL #### Deprecated #### #' Generate a clonal diversity index curve #' #' \code{rarefyDiversity} divides a set of clones by a group annotation, #' resamples the sequences from each group, and calculates diversity #' scores (\eqn{D}) over an interval of diversity orders (\eqn{q}). #' #' @param data data.frame with Change-O style columns containing clonal assignments. #' @param group name of the \code{data} column containing group identifiers. #' @param clone name of the \code{data} column containing clone identifiers. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If \code{copy=NULL} (the default), then clone abundance #' is determined by the number of sequences. If a \code{copy} column #' is specified, then clone abundances is determined by the sum of #' copy numbers within each clonal group. #' @param min_q minimum value of \eqn{q}. #' @param max_q maximum value of \eqn{q}. #' @param step_q value by which to increment \eqn{q}. #' @param min_n minimum number of observations to sample. #' A group with less observations than the minimum is excluded. #' @param max_n maximum number of observations to sample. If \code{NULL} then no #' maximum is set. #' @param ci confidence interval to calculate; the value must be between 0 and 1. #' @param nboot number of bootstrap realizations to generate. #' @param uniform if \code{TRUE} then uniformly resample each group to the same #' number of observations. If \code{FALSE} then allow each group to #' be resampled to its original size or, if specified, \code{max_size}. #' @param progress if \code{TRUE} show a progress bar. #' #' @return A \link{DiversityCurve} object summarizing the diversity scores. #' #' @details #' Clonal diversity is calculated using the generalized diversity index (Hill numbers) #' proposed by Hill (Hill, 1973). See \link{calcDiversity} for further details. #' #' Diversity is calculated on the estimated complete clonal abundance distribution. #' This distribution is inferred by using the Chao1 estimator to estimate the number #' of seen clones, and applying the relative abundance correction and unseen clone #' frequency described in Chao et al, 2015. #' #' To generate a smooth curve, \eqn{D} is calculated for each value of \eqn{q} from #' \code{min_q} to \code{max_q} incremented by \code{step_q}. When \code{uniform=TRUE} #' variability in total sequence counts across unique values in the \code{group} column #' is corrected by repeated resampling from the estimated complete clonal distribution to a #' common number of sequences. #' #' The diversity index (\eqn{D}) for each group is the mean value of over all resampling #' realizations. Confidence intervals are derived using the standard deviation of the #' resampling realizations, as described in Chao et al, 2015. #' #' @references #' \enumerate{ #' \item Hill M. Diversity and evenness: a unifying notation and its consequences. #' Ecology. 1973 54(2):427-32. #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: #' A framework for sampling and estimation in species diversity studies. #' Ecol Monogr. 2014 84:45-67. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso \link{alphaDiversity} #' #' @examples #' \dontrun{ #' # Group by sample identifier #' div <- rarefyDiversity(ExampleDb, "sample_id", step_q=1, max_q=10, nboot=100) #' plotDiversityCurve(div, legend_title="Sample") #' #' # Grouping by isotype rather than sample identifier #' div <- rarefyDiversity(ExampleDb, "c_call", min_n=40, step_q=1, max_q=10, #' nboot=100) #' plotDiversityCurve(div, legend_title="Isotype") #' } #' @export rarefyDiversity <- function(data, group, clone="CLONE", copy=NULL, min_q=0, max_q=4, step_q=0.05, min_n=30, max_n=NULL, ci=0.95, nboot=2000, uniform=TRUE, progress=FALSE) { .Deprecated("alphaDiversity") bootstrap_obj <- estimateAbundance(data, group=group, clone=clone, copy=copy, nboot=nboot, min_n=min_n, max_n=max_n, uniform=uniform, ci=ci) diversity_obj <- alphaDiversity(bootstrap_obj, ci=ci, min_q=min_q, max_q=max_q, step_q) return(diversity_obj) } #' Pairwise test of the diversity index #' #' \code{testDiversity} performs pairwise significance tests of the diversity index #' (\eqn{D}) at a given diversity order (\eqn{q}) for a set of annotation groups via #' rarefaction and bootstrapping. #' #' @param data data.frame with Change-O style columns containing clonal assignments. #' @param q diversity order to test. #' @param group name of the \code{data} column containing group identifiers. #' @param clone name of the \code{data} column containing clone identifiers. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If \code{copy=NULL} (the default), then clone abundance #' is determined by the number of sequences. If a \code{copy} column #' is specified, then clone abundances is determined by the sum of #' copy numbers within each clonal group. #' @param min_n minimum number of observations to sample. #' A group with less observations than the minimum is excluded. #' @param max_n maximum number of observations to sample. If \code{NULL} the maximum #' if automatically determined from the size of the largest group. #' @param nboot number of bootstrap realizations to perform. #' @param ci confidence interval to calculate; the value must be between 0 and 1. #' @param progress if \code{TRUE} show a progress bar. #' #' @return A \link{DiversityCurve} object containing slot test with p-values and summary #' statistics. #' #' @details #' Clonal diversity is calculated using the generalized diversity index proposed by #' Hill (Hill, 1973). See \link{calcDiversity} for further details. #' #' Diversity is calculated on the estimated complete clonal abundance distribution. #' This distribution is inferred by using the Chao1 estimator to estimate the number #' of seen clones, and applying the relative abundance correction and unseen clone #' frequency described in Chao et al, 2014. #' #' Variability in total sequence counts across unique values in the \code{group} column is #' corrected by repeated resampling from the estimated complete clonal distribution to #' a common number of sequences. The diversity index estimate (\eqn{D}) for each group is #' the mean value of over all bootstrap realizations. #' #' Significance of the difference in diversity index (\eqn{D}) between groups is tested by #' constructing a bootstrap delta distribution for each pair of unique values in the #' \code{group} column. The bootstrap delta distribution is built by subtracting the diversity #' index \eqn{Da} in \eqn{group-a} from the corresponding value \eqn{Db} in \eqn{group-b}, #' for all bootstrap realizations, yeilding a distribution of \code{nboot} total deltas; where #' \eqn{group-a} is the group with the greater mean \eqn{D}. The p-value for hypothesis #' \eqn{Da != Db} is the value of \eqn{P(0)} from the empirical cumulative distribution #' function of the bootstrap delta distribution, multiplied by 2 for the two-tailed correction. #' #' @note #' This method may inflate statistical significance when clone sizes are uniformly small, #' such as when most clones sizes are 1, sample size is small, and \code{max_n} is near #' the total count of the smallest data group. Use caution when interpreting the results #' in such cases. We are currently investigating this potential problem. #' #' @references #' \enumerate{ #' \item Hill M. Diversity and evenness: a unifying notation and its consequences. #' Ecology. 1973 54(2):427-32. #' \item Chao A. Nonparametric Estimation of the Number of Classes in a Population. #' Scand J Stat. 1984 11, 265270. #' \item Wu Y-CB, et al. Influence of seasonal exposure to grass pollen on local and #' peripheral blood IgE repertoires in patients with allergic rhinitis. #' J Allergy Clin Immunol. 2014 134(3):604-12. #' \item Chao A, et al. Rarefaction and extrapolation with Hill numbers: #' A framework for sampling and estimation in species diversity studies. #' Ecol Monogr. 2014 84:45-67. #' \item Chao A, et al. Unveiling the species-rank abundance distribution by #' generalizing the Good-Turing sample coverage theory. #' Ecology. 2015 96, 11891201. #' } #' #' @seealso \link{alphaDiversity} #' #' @examples #' \dontrun{ #' # Groups under the size threshold are excluded and a warning message is issued. #' testDiversity(ExampleDb, "sample_id", q=0, min_n=30, nboot=100) #' } #' #' @export testDiversity <- function(data, q, group, clone="CLONE", copy=NULL, min_n=30, max_n=NULL, nboot=2000, progress=FALSE, ci=0.95) { .Deprecated("alphaDiversity") abundance_obj <- estimateAbundance(data, group=group, clone=clone, copy=copy, nboot=nboot, min_n=min_n, max_n=max_n, ci=ci) diversity_obj <- alphaDiversity(abundance_obj, min_q=q, max_q=q, step_q=1, ci=ci) return(diversity_obj) } #### Defunct #### alakazam/R/RcppExports.R0000644000176200001440000000477514505552630014672 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #' Test DNA sequences for equality. #' #' \code{seqEqual} checks if two DNA sequences are identical. #' #' @param seq1 character string containing a DNA sequence. #' @param seq2 character string containing a DNA sequence. #' @param ignore vector of characters to ignore when testing for equality. #' Default is to ignore c("N",".","-","?") #' #' @return Returns \code{TRUE} if sequences are equal and \code{FALSE} if they are not. #' Sequences of unequal length will always return \code{FALSE} regardless of #' their character values. #' #' @seealso Used by \link{pairwiseEqual} within \link{collapseDuplicates}. #' See \link{seqDist} for calculation Hamming distances between sequences. #' #' @examples #' # Ignore gaps #' seqEqual("ATG-C", "AT--C") #' seqEqual("ATGGC", "ATGGN") #' seqEqual("AT--T", "ATGGC") #' #' # Ignore only Ns #' seqEqual("ATG-C", "AT--C", ignore="N") #' seqEqual("ATGGC", "ATGGN", ignore="N") #' seqEqual("AT--T", "ATGGC", ignore="N") #' #' @export seqEqual <- function(seq1, seq2, ignore = as.character( c("N","-",".","?"))) { .Call(`_alakazam_seqEqual`, seq1, seq2, ignore) } #' Calculate pairwise equivalence between sequences #' #' \code{pairwiseEqual} determined pairwise equivalence between a pairs in a #' set of sequences, excluding ambiguous positions (Ns and gaps). #' #' @param seq character vector containing a DNA sequences. #' #' @return A logical matrix of equivalence between each entry in \code{seq}. #' Values are \code{TRUE} when sequences are equivalent and \code{FALSE} #' when they are not. #' #' @seealso Uses \link{seqEqual} for testing equivalence between pairs. #' See \link{pairwiseDist} for generating a sequence distance matrix. #' #' @examples #' # Gaps and Ns will match any character #' seq <- c(A="ATGGC", B="ATGGG", C="ATGGG", D="AT--C", E="NTGGG") #' d <- pairwiseEqual(seq) #' rownames(d) <- colnames(d) <- seq #' d #' #' @export pairwiseEqual <- function(seq) { .Call(`_alakazam_pairwiseEqual`, seq) } seqDistRcpp <- function(seq1, seq2, dist_mat) { .Call(`_alakazam_seqDistRcpp`, seq1, seq2, dist_mat) } pairwiseDistRcpp <- function(seq, dist_mat) { .Call(`_alakazam_pairwiseDistRcpp`, seq, dist_mat) } nonsquareDistRcpp <- function(seq, indx, dist_mat) { .Call(`_alakazam_nonsquareDistRcpp`, seq, indx, dist_mat) } alakazam/R/Classes.R0000644000176200001440000003026513732424726013774 0ustar liggesusers# Classes, Generics and Methods #### Generics #### # @exportMethod print #setGeneric("print") # @exportMethod plot #setGeneric("plot") setClassUnion("DfNULL", members=c("data.frame", "NULL")) setClassUnion("CharNULL", members=c("character", "NULL")) #### Diversity classes #### #' S4 class defining a clonal abundance curve #' #' \code{AbundanceCurve} defines clonal abundance values. #' #' @slot abundance data.frame with relative clonal abundance data and confidence intervals, #' containing the following columns: #' \itemize{ #' \item \code{group}: group identifier. #' \item \code{clone_id} or \code{CLONE}: clone identifier. #' \item \code{p}: relative abundance of the clone. #' \item \code{lower}: lower confidence inverval bound. #' \item \code{upper}: upper confidence interval bound. #' \item \code{rank}: the rank of the clone abundance. #' } #' @slot bootstrap data.frame of bootstrapped clonal distributions. #' @slot clone_by string specifying the name of the clone column. #' @slot group_by string specifying the name of the grouping column. #' @slot groups vector specifying the names of unique groups in group column. #' @slot n numeric vector indication the number of sequences sampled in each group. #' @slot nboot numeric specifying the number of bootstrap iterations to use. #' @slot ci confidence interval defining the upper and lower bounds #' (a value between 0 and 1). #' #' @name AbundanceCurve-class #' @rdname AbundanceCurve-class #' @aliases AbundanceCurve #' @exportClass AbundanceCurve setClass("AbundanceCurve", slots=c(abundance="data.frame", bootstrap="data.frame", clone_by="character", group_by="character", groups="character", n="numeric", ci="numeric", nboot="numeric")) #' S4 class defining a diversity curve #' #' \code{DiversityCurve} defines diversity (\eqn{D}) scores over multiple diversity #' orders (\eqn{Q}). #' #' @slot diversity data.frame defining the diversity curve with the following columns: #' \itemize{ #' \item \code{group}: group label. #' \item \code{q}: diversity order. #' \item \code{d}: mean diversity index over all bootstrap #' realizations. #' \item \code{d_sd}: standard deviation of the diversity index #' over all bootstrap realizations. #' \item \code{d_lower}: diversity lower confidence inverval bound. #' \item \code{d_upper}: diversity upper confidence interval bound. #' \item \code{e}: evenness index calculated as \code{D} #' divided by \code{D} at \code{Q=0}. #' \item \code{e_lower}: evenness lower confidence inverval bound. #' \item \code{e_upper}: eveness upper confidence interval bound. #' } #' @slot tests data.frame describing the significance test results with columns: #' \itemize{ #' \item \code{test}: string listing the two groups tested. #' \item \code{delta_mean}: mean of the \eqn{D} bootstrap delta #' distribution for the test. #' \item \code{delta_sd}: standard deviation of the \eqn{D} #' bootstrap delta distribution for the test. #' \item \code{pvalue}: p-value for the test. #' } #' @slot group_by string specifying the name of the grouping column in diversity calculation. #' @slot groups vector specifying the names of unique groups in group column in diversity calculation. #' @slot method string specifying the type of diversity calculated. #' @slot q vector of diversity hill diversity indices used for computing diversity. #' @slot n numeric vector indication the number of sequences sampled in each group. #' @slot ci confidence interval defining the upper and lower bounds #' (a value between 0 and 1). #' #' @name DiversityCurve-class #' @rdname DiversityCurve-class #' @aliases DiversityCurve #' @exportClass DiversityCurve setClass("DiversityCurve", slots=c(diversity="data.frame", tests="DfNULL", method="character", group_by="character", groups="character", q="numeric", n="numeric", ci="numeric")) #### Diversity methods #### #' @param x AbundanceCurve object #' #' @rdname AbundanceCurve-class #' @aliases AbundanceCurve-method #' @export setMethod("print", c(x="AbundanceCurve"), function(x) { print(x@abundance) }) #' @param y ignored. #' @param ... arguments to pass to \link{plotDiversityCurve}. #' #' @rdname AbundanceCurve-class #' @aliases AbundanceCurve-method #' @export setMethod("plot", c(x="AbundanceCurve", y="missing"), function(x, y, ...) { plotAbundanceCurve(x, ...) }) #' @param x DiversityCurve object #' #' @rdname DiversityCurve-class #' @aliases DiversityCurve-method #' @export setMethod("print", c(x="DiversityCurve"), function(x) { print(x@diversity) }) #' @param y diversity order to plot (q). #' @param ... arguments to pass to \link{plotDiversityCurve} or \link{plotDiversityTest}. #' #' @rdname DiversityCurve-class #' @aliases DiversityCurve-method #' @export setMethod("plot", c(x="DiversityCurve", y="missing"), function(x, y, ...) { plotDiversityCurve(x, ...) }) #' @rdname DiversityCurve-class #' @aliases DiversityCurve-method #' @export setMethod("plot", c(x="DiversityCurve", y="numeric"), function(x, y, ...) { plotDiversityTest(x, y, ...) }) #### Lineage classes #### #' S4 class defining a clone #' #' \code{ChangeoClone} defines a common data structure for perform lineage recontruction #' from Change-O data. #' #' @slot data data.frame containing sequences and annotations. Contains the #' columns \code{SEQUENCE_ID} and \code{SEQUENCE}, as well as any additional #' sequence-specific annotation columns. #' @slot clone string defining the clone identifier. #' @slot germline string containing the germline sequence for the clone. #' @slot v_gene string defining the V segment gene call. #' @slot j_gene string defining the J segment gene call. #' @slot junc_len numeric junction length (nucleotide count). #' #' @seealso See \link{makeChangeoClone} and \link{buildPhylipLineage} for use. #' #' @name ChangeoClone-class #' @rdname ChangeoClone-class #' @aliases ChangeoClone #' @exportClass ChangeoClone setClass("ChangeoClone", slots=c(data="data.frame", clone="character", germline="character", v_gene="character", j_gene="character", junc_len="numeric")) #### Topology classes #### #' S4 class defining edge significance #' #' \code{MRCATest} defines the significance of enrichment for annotations appearing at #' the MRCA of the tree. #' #' @slot tests data.frame describing the significance test results with columns: #' \itemize{ #' \item \code{annotation}: annotation value. #' \item \code{count}: observed count of MRCA positions #' with the given annotation. #' \item \code{expected}: expected mean count of MRCA occurance #' for the annotation. #' \item \code{pvalue}: one-sided p-value for the hypothesis that #' the observed annotation abundance is greater #' than expected. #' } #' @slot permutations data.frame containing the raw permutation test data with columns: #' \itemize{ #' \item \code{annotation}: annotation value. #' \item \code{count}: count of MRCA positions with the #' given annotation. #' \item \code{iter}: numerical index define which #' permutation realization each #' observation corresponds to. #' } #' @slot nperm number of permutation realizations. #' #' @name MRCATest-class #' @rdname MRCATest-class #' @aliases MRCATest #' @exportClass MRCATest setClass("MRCATest", slots=c(tests="data.frame", permutations="data.frame", nperm="numeric")) #' S4 class defining edge significance #' #' \code{EdgeTest} defines the significance of parent-child annotation enrichment. #' #' @slot tests data.frame describing the significance test results with columns: #' \itemize{ #' \item \code{parent}: parent node annotation. #' \item \code{child}: child node annotation #' \item \code{count}: count of observed edges with the given #' parent-child annotation set. #' \item \code{expected}: mean count of expected edges for the #' given parent-child relationship. #' \item \code{pvalue}: one-sided p-value for the hypothesis that #' the observed edge abundance is greater #' than expected. #' } #' @slot permutations data.frame containing the raw permutation test data with columns: #' \itemize{ #' \item \code{parent}: parent node annotation. #' \item \code{child}: child node annotation #' \item \code{count}: count of edges with the given parent-child #' annotation set. #' \item \code{iter}: numerical index define which permutation #' realization each observation corresponds #' to. #' } #' @slot nperm number of permutation realizations. #' #' @name EdgeTest-class #' @rdname EdgeTest-class #' @aliases EdgeTest #' @exportClass EdgeTest setClass("EdgeTest", slots=c(tests="data.frame", permutations="data.frame", nperm="numeric")) #### Topology methods #### #' @param x MRCATest object. #' #' @rdname MRCATest-class #' @aliases MRCATest-method #' @export setMethod("print", c(x="MRCATest"), function(x) { print(x@tests) }) #' @param y ignored. #' @param ... arguments to pass to \link{plotMRCATest}. #' #' @rdname MRCATest-class #' @aliases MRCATest-method #' @export setMethod("plot", c(x="MRCATest", y="missing"), function(x, y, ...) { plotMRCATest(x, ...) }) #' @param x EdgeTest object. #' #' @rdname EdgeTest-class #' @aliases EdgeTest-method #' @export setMethod("print", c(x="EdgeTest"), function(x) { print(x@tests) }) #' @param y ignored. #' @param ... arguments to pass to \link{plotEdgeTest}. #' #' @rdname EdgeTest-class #' @aliases EdgeTest-method #' @export setMethod("plot", c(x="EdgeTest", y="missing"), function(x, y, ...) { plotEdgeTest(x, ...) })alakazam/R/Data.R0000644000176200001440000003172414312265171013241 0ustar liggesusers# Documentation and definitions for data and constants #### Sysdata #### # 1x20 vector of default amino acid hydropathy scores # HYDROPATHY_KYTJ82 # 1x20 vector of default amino acid bulkiness scores # BULKINESS_ZIMJ68 # 1x20 vector of default amino acid polarity scores # POLARITY_GRAR74 # 1x7 vector of default amino acid pK values # PK_EMBOSS #### Data #### #' Example AIRR database #' #' A small example database subset from Laserson and Vigneault et al, 2014. #' #' @format A data.frame with the following AIRR style columns: #' \itemize{ #' \item \code{sequence_id}: Sequence identifier #' \item \code{sequence_alignment}: IMGT-gapped observed sequence. #' \item \code{germline_alignment}: IMGT-gapped germline sequence. #' \item \code{germline_alignment_d_mask}: IMGT-gapped germline sequence with N, P and #' D regions masked. #' \item \code{v_call}: V region allele assignments. #' \item \code{v_call_genotyped}: TIgGER corrected V region allele assignment. #' \item \code{d_call}: D region allele assignments. #' \item \code{j_call}: J region allele assignments. #' \item \code{c_call}: Isotype (C region) assignment. #' \item \code{junction}: Junction region sequence. #' \item \code{junction_length}: Length of the junction region in nucleotides. #' \item \code{np1_length}: Combined length of the N and P regions proximal #' to the V region. #' \item \code{np2_length}: Combined length of the N and P regions proximal #' to the J region. #' \item \code{duplicate_count}: Copy count (number of duplicates) of the sequence. #' \item \code{clone_id}: Change-O assignment clonal group identifier. #' \item \code{sample_id}: Sample identifier. Time in relation to vaccination. #' } #' #' @seealso \link{ExampleDbChangeo} \link{ExampleTrees} #' #' @references #' \enumerate{ #' \item Laserson U and Vigneault F, et al. High-resolution antibody dynamics of #' vaccine-induced immune responses. #' Proc Natl Acad Sci USA. 2014 111:4928-33. #' } "ExampleDb" #' Single sequence AIRR database #' #' A database with just one sequence from \code{ExampleDb} and additional AIRR Rearrangement fields #' containing alignment information. The sequence was reanalyzed with a recent versions of #' alignment software (IgBLAST 1.16.0) and reference germlines (IMGT 2020-08-12). #' #' @seealso \link{ExampleDb} "SingleDb" #' Example Change-O database #' #' A small example database subset from Laserson and Vigneault et al, 2014. #' #' @format A data.frame with the following Change-O style columns: #' \itemize{ #' \item \code{SEQUENCE_ID}: Sequence identifier #' \item \code{SEQUENCE_IMGT}: IMGT-gapped observed sequence. #' \item \code{GERMLINE_IMGT_D_MASK}: IMGT-gapped germline sequence with N, P and #' D regions masked. #' \item \code{V_CALL}: V region allele assignments. #' \item \code{V_CALL_GENOTYPED}: TIgGER corrected V region allele assignment. #' \item \code{D_CALL}: D region allele assignments. #' \item \code{J_CALL}: J region allele assignments. #' \item \code{JUNCTION}: Junction region sequence. #' \item \code{JUNCTION_LENGTH}: Length of the junction region in nucleotides. #' \item \code{NP1_LENGTH}: Combined length of the N and P regions proximal #' to the V region. #' \item \code{NP2_LENGTH}: Combined length of the N and P regions proximal #' to the J region. #' \item \code{SAMPLE}: Sample identifier. Time in relation to vaccination. #' \item \code{ISOTYPE}: Isotype assignment. #' \item \code{DUPCOUNT}: Copy count (number of duplicates) of the sequence. #' \item \code{CLONE}: Change-O assignment clonal group identifier. #' } #' #' @seealso \link{ExampleDb} \link{ExampleTrees} #' #' @references #' \enumerate{ #' \item Laserson U and Vigneault F, et al. High-resolution antibody dynamics of #' vaccine-induced immune responses. #' Proc Natl Acad Sci USA. 2014 111:4928-33. #' } "ExampleDbChangeo" #' Small example 10x Genomics Ig V(D)J sequences from CD19+ B cells isolated from PBMCs of a healthy #' human donor. Down-sampled from data provided by 10x Genomics under a Creative Commons Attribute license, #' and processed with their Cell Ranger pipeline. #' #' @format A data.frame with the following AIRR style columns: #' \itemize{ #' \item \code{sequence_id}: Sequence identifier #' \item \code{sequence_alignment}: IMGT-gapped observed sequence. #' \item \code{germline_alignment}: IMGT-gapped germline sequence. #' \item \code{v_call}: V region allele assignments. #' \item \code{d_call}: D region allele assignments. #' \item \code{j_call}: J region allele assignments. #' \item \code{c_call}: Isotype (C region) assignment. #' \item \code{junction}: Junction region sequence. #' \item \code{junction_length}: Length of the junction region in nucleotides. #' \item \code{np1_length}: Combined length of the N and P regions proximal #' to the V region. #' \item \code{np2_length}: Combined length of the N and P regions proximal #' to the J region. #' \item \code{umi_count}: Number of unique molecular identifies atttributed to sequence. #' \item \code{cell_id}: Cell identifier. #' \item \code{locus}: Genomic locus of sequence. #' } #' #' #' @references #' \enumerate{ #' \item Data source: https://support.10xgenomics.com/single-cell-vdj/datasets/2.2.0/vdj_v1_hs_cd19_b #' \item License: https://creativecommons.org/licenses/by/4.0/ #' } "Example10x" #' Example Ig lineage trees #' #' A set of Ig lineage trees generated from the \code{ExampleDb} file, subset to #' only those trees with at least four nodes. #' #' @format A list of igraph objects output by \link{buildPhylipLineage}. #' Each node of each tree has the following annotations (vertex attributes): #' \itemize{ #' \item \code{sample_id}: Sample identifier(s). Time in relation to vaccination. #' \item \code{c_call}: Isotype assignment(s). #' \item \code{duplication_count}: Copy count (number of duplicates) of the sequence. #' } #' #' @seealso \link{ExampleTrees} "ExampleTrees" #### Constants #### #' Default colors #' #' Default color palettes for DNA characters, Ig isotypes, and TCR chains. #' #' @format Named character vectors with hexcode colors as values. #' \itemize{ #' \item \code{DNA_COLORS}: DNA character colors #' \code{c("A", "C", "G", "T")}. #' \item \code{IG_COLORS}: Ig isotype colors #' \code{c("IGHA", "IGHD", "IGHE", "IGHG", "IGHM", "IGHK", "IGHL")}. #' \item \code{TR_COLORS}: TCR chain colors #' \code{c("TRA", "TRB", "TRD", "TRG")}. #' } #' #' @examples #' # IG_COLORS as an isotype color set for ggplot #' isotype <- c("IGHG", "IGHM", "IGHM", "IGHA") #' db <- data.frame(x=1:4, y=1:4, iso=isotype) #' g1 <- ggplot(db, aes(x=x, y=y, color=iso)) + #' scale_color_manual(name="Isotype", values=IG_COLORS) + #' geom_point(size=10) #' plot(g1) #' #' # DNA_COLORS to translate nucleotide values to a vector of colors #' # for use in base graphics plots #' seq <- c("A", "T", "T", "C") #' colors <- translateStrings(seq, setNames(names(DNA_COLORS), DNA_COLORS)) #' plot(1:4, 1:4, col=colors, pch=16, cex=6) #' #' @name DEFAULT_COLORS NULL #' @rdname DEFAULT_COLORS #' @export DNA_COLORS <- c("A"="#64F73F", "C"="#FFB340", "G"="#EB413C", "T"="#3C88EE") #' @rdname DEFAULT_COLORS #' @export IG_COLORS <- c("IGHA"="#377EB8", "IGHD"="#FF7F00", "IGHE"="#E41A1C", "IGHG"="#4DAF4A", "IGHM"="#984EA3", "IGHK"="#E5C494", "IGHL"="#FFD92F") #' @rdname DEFAULT_COLORS #' @export TR_COLORS <- c("TRA"="#CBD5E8", "TRB"="#F4CAE4", "TRD"="#FDCDAC", "TRG"="#E6F5C9") #' IUPAC ambiguous characters #' #' A translation list mapping IUPAC ambiguous characters code to corresponding nucleotide #' amino acid characters. #' #' @format A list with single character codes as names and values containing character #' vectors that define the set of standard characters that match to each each #' ambiguous character. #' \itemize{ #' \item \code{IUPAC_DNA}: DNA ambiguous character translations. #' \item \code{IUPAC_AA}: Amino acid ambiguous character translations. #' \item \code{DNA_IUPAC}: Ordered DNA to ambiguous characters #' } #' #' @name IUPAC_CODES NULL #' @rdname IUPAC_CODES #' @export IUPAC_DNA <- list("A"="A", "C"="C", "G"="G", "T"="T", "M"=c("A","C"), "R"=c("A","G"), "W"=c("A","T"), "S"=c("C","G"), "Y"=c("C","T"), "K"=c("G","T"), "V"=c("A","C","G"), "H"=c("A","C","T"), "D"=c("A","G","T"), "B"=c("C","G","T"), "N"=c("A","C","G","T")) #' @rdname IUPAC_CODES #' @export IUPAC_AA <- list("A"="A", "B"=c("N","R"), "C"="C", "D"="D", "E"="E", "F"="F", "G"="G", "H"="H", "I"="I", "J"=c("I","L"), "K"="K", "L"="L", "M"="M", "N"="N", "P"="P", "Q"="Q", "R"="R", "S"="S", "T"="T", "V"="V", "W"="W", "X"=c("A","B","C","D","E","F","G","H", "I","J","K","L","M","N","P","Q", "R","S","T","V","W","X","Y","Z", "*"), "Y"="Y", "Z"=c("E","Q"), "*"="*") #' @rdname IUPAC_CODES #' @export DNA_IUPAC <- list( "A"="A", "C"="C", "G"="G", "T"="T", "AC"="M", "AG"="R", "AT"="W", "CG"="S", "CT"="Y", "GT"="K", "ACG"="V", "ACT"="H", "AGT"="D", "CGT"="B", "ACGT"="N") #' Amino acid abbreviation translations #' #' Mappings of amino acid abbreviations. #' #' @format Named character vector defining single-letter character codes to #' three-letter abbreviation mappings. #' #' @name ABBREV_AA #' #' @examples #' aa <- c("Ala", "Ile", "Trp") #' translateStrings(aa, ABBREV_AA) #' #' @export ABBREV_AA <- c("A"="Ala", "R"="Arg", "N"="Asn", "D"="Asp", "C"="Cys", "Q"="Gln", "E"="Glu", "G"="Gly", "H"="His", "I"="Ile", "L"="Leu", "K"="Lys", "M"="Met", "F"="Phe", "P"="Pro", "S"="Ser", "T"="Thr", "W"="Trp", "Y"="Tyr", "V"="Val") #' IMGT V-segment regions #' #' A list defining the boundaries of V-segment framework regions (FWRs) and complementarity #' determining regions (CDRs) for IMGT-gapped immunoglobulin (Ig) nucleotide sequences #' according to the IMGT numbering scheme. #' #' @format A list with regions named one of \code{c("fwr1", "cdr1", "fwr2", "cdr2", "fwr3")} #' with values containing a numeric vector of length two defining the #' \code{c(start, end)} positions of the named region. #' #' @references #' \url{https://www.imgt.org/} #' #' @export IMGT_REGIONS <- list("fwr1"=c(1, 78), "cdr1"=c(79, 114), "fwr2"=c(115, 165), "cdr2"=c(166, 195), "fwr3"=c(196, 312))alakazam/R/Topology.R0000644000176200001440000010746414504655610014215 0ustar liggesusers# Ig lineage topology analysis #' @include Classes.R NULL #### Graph analysis functions #### #' Generate subtree summary statistics for a tree #' #' \code{summarizeSubtrees} calculates summary statistics for each node of a tree. Includes #' both node properties and subtree properties. #' #' @param graph igraph object containing an annotated lineage tree. #' @param fields annotation fields to add to the output. #' @param root name of the root (germline) node. #' #' @return A data.frame with columns: #' \itemize{ #' \item \code{name}: node name. #' \item \code{parent}: name of the parent node. #' \item \code{outdegree}: number of edges leading from the node. #' \item \code{size}: total number of nodes within the subtree rooted #' at the node. #' \item \code{depth}: the depth of the subtree that is rooted at #' the node. #' \item \code{pathlength}: the maximum pathlength beneath the node. #' \item \code{outdegree_norm}: \code{outdegree} normalized by the total #' number of edges. #' \item \code{size_norm}: \code{size} normalized by the largest #' subtree size (the germline). #' \item \code{depth_norm}: \code{depth} normalized by the largest #' subtree depth (the germline). #' \item \code{pathlength_norm}: \code{pathlength} normalized by the largest #' subtree pathlength (the germline). #' } #' An additional column corresponding to the value of \code{field} is added when #' specified. #' #' @seealso See \link{buildPhylipLineage} for generating input trees. #' See \link{getPathLengths} for calculating path length to nodes. #' #' @examples #' # Summarize a tree #' graph <- ExampleTrees[[23]] #' summarizeSubtrees(graph, fields="c_call", root="Germline") #' #' @export summarizeSubtrees <- function(graph, fields=NULL, root="Germline") { ## DEBUG # root="Germline"; fields=NULL # TODO: should probably include a means to exclude inferred from substree size # Define node attribute data.frame node_df <- data.frame(name=V(graph)$name, stringsAsFactors=F) for (f in fields) { node_df[[f]] <- vertex_attr(graph, name=f) } # Get edges edges <- igraph::as_edgelist(graph) # Get unweighted paths paths_step <- suppressWarnings(igraph::distances(graph, mode="out", algorithm="unweighted")) paths_step[!is.finite(paths_step)] <- NA # Get weighted paths paths_length <- igraph::distances(graph, mode="out", algorithm="dijkstra") paths_length[!is.finite(paths_length)] <- NA # Define each node's parent node_df$parent <- edges[, 1][match(node_df$name, edges[, 2])] # Define each node's outdegree node_df$outdegree <- igraph::degree(graph, mode="out") # Define the number of nodes in each subtree (child count + 1) node_df$size <- apply(paths_step, 1, function(x) length(na.omit(x))) # Define number of levels below each node node_df$depth <- apply(paths_step, 1, max, na.rm=TRUE) + 1 # Define the maximum shortest path length (genetic distance) to a leaf from each node node_df$pathlength <- apply(paths_length, 1, max, na.rm=TRUE) # Normalize node_df <- node_df %>% dplyr::mutate( outdegree_norm=!!rlang::sym("outdegree")/sum(!!rlang::sym("outdegree"), na.rm=TRUE), size_norm=!!rlang::sym("size")/max(!!rlang::sym("size"), na.rm=TRUE), depth_norm=!!rlang::sym("depth")/max(!!rlang::sym("depth"), na.rm=TRUE), pathlength_norm=!!rlang::sym("pathlength")/max(!!rlang::sym("pathlength"), na.rm=TRUE)) return(node_df) } #' Calculate path lengths from the tree root #' #' \code{getPathLengths} calculates the unweighted (number of steps) and weighted (distance) #' path lengths from the root of a lineage tree. #' #' @param graph igraph object containing an annotated lineage tree. #' @param root name of the root (germline) node. #' @param field annotation field to use for exclusion of nodes from step count. #' @param exclude annotation values specifying which nodes to exclude from step count. #' If \code{NULL} consider all nodes. This does not affect the weighted #' (distance) path length calculation. #' #' @return A data.frame with columns: #' \itemize{ #' \item \code{name}: node name #' \item \code{steps}: path length as the number of nodes traversed #' \item \code{distance}: path length as the sum of edge weights #' } #' #' @seealso See \link{buildPhylipLineage} for generating input trees. #' #' @examples #' # Define example graph #' graph <- ExampleTrees[[24]] #' #' # Consider all nodes #' getPathLengths(graph, root="Germline") #' #' # Exclude nodes without an isotype annotation from step count #' getPathLengths(graph, root="Germline", field="c_call", exclude=NA) #' #' @export getPathLengths <- function(graph, root="Germline", field=NULL, exclude=NULL) { # Define path length data.frame path_df <- data.frame(name=V(graph)$name, stringsAsFactors=FALSE) # Get indices of excluded vertices skip_idx <- which(path_df$name == root) if (!is.null(field)) { g <- vertex_attr(graph, name=field) skip_idx <- union(skip_idx, which(g %in% exclude)) } # Get paths step_list <- shortest_paths(graph, root, mode="out", weights=NA, output="vpath") step_list <- step_list$vpath # Get path lengths for (i in 1:length(step_list)) { v <- step_list[[i]] path_df[i, "steps"] <- sum(!(v %in% skip_idx)) path_df[i, "distance"] <- sum(E(graph, path=v)$weight) } return(path_df) } #' Retrieve the first non-root node of a lineage tree #' #' \code{getMRCA} returns the set of lineage tree nodes with the minimum weighted or #' unweighted path length from the root (germline) of the lineage tree, allowing for #' exclusion of specific groups of nodes. #' #' @param graph igraph object containing an annotated lineage tree. #' @param path string defining whether to use unweighted (steps) or weighted (distance) #' measures for determining the founder node set.. #' @param root name of the root (germline) node. #' @param field annotation field to use for both unweighted path length exclusion and #' consideration as an MRCA node. If \code{NULL} do not exclude any nodes. #' @param exclude vector of annotation values in \code{field} to exclude from the potential #' MRCA set. If \code{NULL} do not exclude any nodes. Has no effect if #' \code{field=NULL}. #' #' @return A data.frame of the MRCA node(s) containing the columns: #' \itemize{ #' \item \code{name}: node name #' \item \code{steps}: path length as the number of nodes traversed #' \item \code{distance}: path length as the sum of edge weights #' } #' Along with additional columns corresponding to the #' annotations of the input graph. #' #' @seealso Path lengths are determined with \link{getPathLengths}. #' #' @examples #' # Define example graph #' graph <- ExampleTrees[[23]] #' #' # Use unweighted path length and do not exclude any nodes #' getMRCA(graph, path="steps", root="Germline") #' #' # Exclude nodes without an isotype annotation and use weighted path length #' getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) #' #' @export getMRCA <- function(graph, path=c("distance", "steps"), root="Germline", field=NULL, exclude=NULL) { # Check arguments path <- match.arg(path) # Get distance from root path_df <- getPathLengths(graph, root=root, field=field, exclude=exclude) # Get indices of excluded vertices skip_idx <- which(path_df$name == root) if (!is.null(field)) { g <- vertex_attr(graph, name=field) skip_idx <- union(skip_idx, which(g %in% exclude)) } # Get founder nodes if (path == "distance") { path_len <- setNames(path_df$distance, 1:nrow(path_df)) } else if (path == "steps") { path_len <- setNames(path_df$steps, 1:nrow(path_df)) } else { stop("Invalid value for 'path' parameter. Must be one of c('distance', 'steps').\n") } path_len <- path_len[-skip_idx] root_idx <- as.numeric(names(path_len)[which(path_len == min(path_len))]) root_df <- igraph::as_data_frame(graph, what="vertices")[root_idx, ] root_df$steps <- path_df$steps[root_idx] root_df$distance <- path_df$distance[root_idx] # Switch name column to uppercase names(root_df)[names(root_df) == "name"] <- "name" return(root_df) } #' Tabulate the number of edges between annotations within a lineage tree #' #' \code{tableEdges} creates a table of the total number of connections (edges) for each #' unique pair of annotations within a tree over all nodes. #' #' @param graph igraph object containing an annotated lineage tree. #' @param field string defining the annotation field to count. #' @param indirect if \code{FALSE} count direct connections (edges) only. If #' \code{TRUE} walk through any nodes with annotations specified in #' the \code{argument} to count indirect connections. Specifying #' \code{indirect=TRUE} with \code{exclude=NULL} will have no effect. #' @param exclude vector of strings defining \code{field} values to exclude from counts. #' Edges that either start or end with the specified annotations will not #' be counted. If \code{NULL} count all edges. #' #' @return A data.frame defining total annotation connections in the tree with columns: #' \itemize{ #' \item \code{parent}: parent annotation #' \item \code{child}: child annotation #' \item \code{count}: count of edges for the parent-child relationship #' } #' #' @seealso See \link{testEdges} for performed a permutation test on edge relationships. #' #' @examples #' # Define example graph #' graph <- ExampleTrees[[23]] #' #' # Count direct edges between isotypes including inferred nodes #' tableEdges(graph, "c_call") #' #' # Count direct edges excluding edges to and from germline and inferred nodes #' tableEdges(graph, "c_call", exclude=c("Germline", NA)) #' #' # Count indirect edges walking through germline and inferred nodes #' tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) #' #' @export tableEdges <- function(graph, field, indirect=FALSE, exclude=NULL) { # Function to retrieve the name if x is exactly one vertex index and NULL otherwise .getSingleVertex <- function(x) { if (length(x) == 1) { vertex_attr(graph, name=field, index=x[1]) } else { NULL } } if (indirect) { # Get indices of excluded and retained vertices if (!is.null(exclude)) { f <- vertex_attr(graph, name=field) skip_idx <- which(f %in% exclude) keep_idx <- as.numeric(V(graph))[-skip_idx] } else { skip_idx <- NULL keep_idx <- as.numeric(V(graph)) } # Iterate over nodes and count indirect parent-child connections edge_list <- list() for (i in keep_idx) { # Get parent annotation parent <- vertex_attr(graph, name=field, index=i) # Get indirect child node annotations step_list <- suppressWarnings(shortest_paths(graph, V(graph)[i], mode="out", weights=NA, output="vpath")) step_list <- unique(lapply(step_list$vpath, function(x) x[!(x %in% c(i, skip_idx))])) children <- unlist(lapply(step_list, .getSingleVertex)) # Define data.frame of connections if (length(children) > 0) { edge_list[[i]] <- data.frame("parent"=parent, "child"=children, stringsAsFactors=FALSE) } } # Merge edge list into data.frame edge_df <- bind_rows(edge_list) } else { # Get adjacency list edge_mat <- as_edgelist(graph, names=FALSE) edge_mat <- vertex_attr(graph, name=field, index=edge_mat) edge_mat <- matrix(edge_mat, ncol=2, dimnames=list(NULL, c("parent", "child"))) # Build and subset edge data.frame edge_df <- as.data.frame(edge_mat, stringsAsFactors=FALSE) edge_df <- edge_df[!(edge_df$parent %in% exclude) & !(edge_df$child %in% exclude), ] } # Count edges edge_tab <- edge_df %>% group_by(!!!rlang::syms(c("parent", "child"))) %>% dplyr::summarize(count=n()) return(edge_tab) } #' Permute the node labels of a tree #' #' \code{permuteLabels} permutes the node annotations of a lineage tree. #' #' @param graph igraph object containing an annotated lineage tree. #' @param field string defining the annotation field to permute. #' @param exclude vector of strings defining \code{field} values to exclude #' from permutation. #' #' @return A modified igraph object with vertex annotations permuted. #' #' @seealso \link{testEdges}. #' #' @examples #' # Define and plot example graph #' library(igraph) #' graph <- ExampleTrees[[23]] #' plot(graph, layout=layout_as_tree, vertex.label=V(graph)$c_call, #' vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") #' #' # Permute annotations and plot new tree #' g <- permuteLabels(graph, "c_call") #' plot(g, layout=layout_as_tree, vertex.label=V(g)$c_call, #' vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") #' #' @export permuteLabels <- function(graph, field, exclude=c("Germline", NA)) { # Determine which nodes to permute labels <- vertex_attr(graph, name=field) i <- which(!(labels %in% exclude)) # Return input on insufficient number of nodes if (length(i) < 2) { warning("Only 1 node to permute\n") return(graph) } # Sample and reassign field values s <- sample(i) perm <- set_vertex_attr(graph, name=field, index=i, value=labels[s]) return(perm) } #### Test functions #### #' Tests for MRCA annotation enrichment in lineage trees #' #' \code{testMRCA} performs a permutation test on a set of lineage trees to determine #' the significance of an annotation's association with the MRCA position of the lineage #' trees. #' #' @param graphs list of igraph object containing annotated lineage trees. #' @param field string defining the annotation field to test. #' @param root name of the root (germline) node. #' @param exclude vector of strings defining \code{field} values to exclude from the #' set of potential founder annotations. #' @param nperm number of permutations to perform. #' @param progress if \code{TRUE} show a progress bar. #' #' @return An \link{MRCATest} object containing the test results and permutation #' realizations. #' #' @seealso Uses \link{getMRCA} and \link{getPathLengths}. #' See \link{plotMRCATest} for plotting the permutation distributions. #' #' @examples #' \donttest{ #' # Define example tree set #' graphs <- ExampleTrees[1:10] #' #' # Perform MRCA test on isotypes #' x <- testMRCA(graphs, "c_call", nperm=10) #' print(x) #' } #' #' @export testMRCA <- function(graphs, field, root="Germline", exclude=c("Germline", NA), nperm=200, progress=FALSE) { # Function to resolve ambiguous founders # @param x data.frame from getMRCA # @param field annotation field .resolveMRCA <- function(x, field) { x %>% filter(!duplicated(!!rlang::sym(field))) %>% filter(length(!!rlang::sym(field)) == 1) } # Function to count MRCAs # @param x list of graphs # @param field annotation field # @param exclude vector of annotation values to exclude .countMRCA <- function(x, field, exclude) { # Get MRCAs mrca_list <- lapply(x, getMRCA, path="distance", field=field, exclude=exclude) # Resolve ambiguous MRCAs mrca_list <- lapply(mrca_list, .resolveMRCA, field=field) # Summarize MRCA counts mrca_sum <- bind_rows(mrca_list, .id="GRAPH") %>% select(!!!rlang::syms(c("GRAPH", field))) %>% rename(all_of(c("annotation"=field))) %>% group_by(!!rlang::sym("annotation")) %>% dplyr::summarize(count=n()) return(mrca_sum) } # Assign numeric names if graphs is an unnamed list if (is.null(names(graphs))) { names(graphs) <- 1:length(graphs) } # Summarize observed MRCA counts obs_sum <- .countMRCA(graphs, field=field, exclude=exclude) # Generate edge null distribution via permutation if (progress) { pb <- progressBar(nperm) } perm_list <- list() for (i in 1:nperm) { # Permute labels tmp_list <- lapply(graphs, permuteLabels, field=field, exclude=exclude) # Summarize MRCA counts tmp_sum <- .countMRCA(tmp_list, field=field, exclude=exclude) # Update permutation set tmp_sum$iter <- i perm_list[[i]] <- tmp_sum if (progress) { pb$tick() } } cat("\n") perm_sum <- bind_rows(perm_list) # Test observed against permutation distribution for (i in 1:nrow(obs_sum)) { x <- obs_sum$annotation[i] # Annotation count distribution d <- perm_sum$count[perm_sum$annotation == x] # Expected mean obs_sum[i, "expected"] <- mean(d) # P-value for observed > expected f <- ecdf(d) obs_sum[i, "pvalue"] <- 1 - f(obs_sum$count[i]) } # Generate return object mrca_test <- new("MRCATest", tests=as.data.frame(obs_sum), permutations=as.data.frame(perm_sum), nperm=nperm) return(mrca_test) } #' Tests for parent-child annotation enrichment in lineage trees #' #' \code{testEdges} performs a permutation test on a set of lineage trees to determine #' the significance of an annotation's association with parent-child relationships. #' #' @param graphs list of igraph objects with vertex annotations. #' @param field string defining the annotation field to permute. #' @param indirect if \code{FALSE} count direct connections (edges) only. If #' \code{TRUE} walk through any nodes with annotations specified in #' the \code{argument} to count indirect connections. Specifying #' \code{indirect=TRUE} with \code{exclude=NULL} will have no effect. #' @param exclude vector of strings defining \code{field} values to exclude from #' permutation. #' @param nperm number of permutations to perform. #' @param progress if \code{TRUE} show a progress bar. #' #' @return An \link{EdgeTest} object containing the test results and permutation #' realizations. #' #' @seealso Uses \link{tableEdges} and \link{permuteLabels}. #' See \link{plotEdgeTest} for plotting the permutation distributions. #' #' @examples #' \donttest{ #' # Define example tree set #' graphs <- ExampleTrees[1:10] #' #' # Perform edge test on isotypes #' x <- testEdges(graphs, "c_call", nperm=10) #' print(x) #' } #' #' @export testEdges <- function(graphs, field, indirect=FALSE, exclude=c("Germline", NA), nperm=200, progress=FALSE) { ## DEBUG # field="c_call"; exclude=c("Germline", NA); nperm=200 # Assign numeric names if graphs is an unnamed list if (is.null(names(graphs))) { names(graphs) <- 1:length(graphs) } # Function to count edge annotations # @param x list of graphs # @param field annotation field # @param exclude vector of annotation values to exclude .countEdges <- function(x, field, exclude) { edge_list <- lapply(x, tableEdges, field=field, indirect=indirect, exclude=exclude) edge_sum <- bind_rows(edge_list) %>% group_by(!!!rlang::syms(c("parent", "child"))) %>% dplyr::summarize(count=sum(!!rlang::sym("count"), na.rm=TRUE)) return(edge_sum) } # Count edges of observed data obs_sum <- .countEdges(graphs, field, exclude) if (nrow(obs_sum) == 0) { stop("No valid edges found in graphs") } # Generate edge null distribution via permutation if (progress) { pb <- progressBar(nperm) } perm_list <- list() for (i in 1:nperm) { # Permute annotations tmp_list <- lapply(graphs, permuteLabels, field=field, exclude=exclude) # Count edges tmp_sum <- .countEdges(tmp_list, field, exclude) # Update permutation set tmp_sum$iter <- i perm_list[[i]] <- tmp_sum if (progress) { pb$tick() } } perm_sum <- bind_rows(perm_list) # Test observed against permutation distribution for (i in 1:nrow(obs_sum)) { x <- obs_sum$parent[i] y <- obs_sum$child[i] # Edge count distribution d <- perm_sum$count[perm_sum$parent == x & perm_sum$child == y] # Expected mean obs_sum[i, "expected"] <- mean(d) # P-value for observed > expected f <- ecdf(d) obs_sum[i, "pvalue"] <- 1 - f(obs_sum$count[i]) } # Generate return object edge_test <- new("EdgeTest", tests=as.data.frame(obs_sum), permutations=as.data.frame(perm_sum), nperm=nperm) return(edge_test) } #### Plotting functions ##### #' Plot the results of an edge permutation test #' #' \code{plotEdgeTest} plots the results of an edge permutation test performed with #' \code{testEdges} as either a histogram or cumulative distribution function. #' #' @param data \link{EdgeTest} object returned by \link{testEdges}. #' @param color color of the histogram or lines. #' @param main_title string specifying the plot title. #' @param style type of plot to draw. One of: #' \itemize{ #' \item \code{"histogram"}: histogram of the edge count #' distribution with a red dotted line #' denoting the observed value. #' \item \code{"cdf"}: cumulative distribution function #' of edge counts with a red dotted #' line denoting the observed value and #' a blue dotted line indicating the #' p-value. #' } #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso See \link{testEdges} for performing the test. #' #' @examples #' \donttest{ #' # Define example tree set #' graphs <- ExampleTrees[6:10] #' #' # Perform edge test on isotypes #' x <- testEdges(graphs, "c_call", nperm=6) #' #' # Plot #' plotEdgeTest(x, color="steelblue", style="hist") #' plotEdgeTest(x, style="cdf") #' } #' #' @export plotEdgeTest <- function(data, color="black", main_title="Edge Test", style=c("histogram", "cdf"), silent=FALSE, ...) { # Check arguments style <- match.arg(style) # Extract plot data obs_sum <- rename(data@tests, "Parent"="parent", "Child"="child") perm_sum <- rename(data@permutations, "Parent"="parent", "Child"="child") if (style == "histogram") { # Plot edge null distribution p1 <- ggplot(perm_sum, aes(x=!!rlang::sym("count"))) + baseTheme() + ggtitle(main_title) + xlab("Number of edges") + ylab("Number of realizations") + geom_histogram(bins=50, fill=color, color=NA) + geom_vline(data=obs_sum, aes(xintercept=!!rlang::sym("count")), color="firebrick", linetype=3, size=0.75) + facet_grid("Child ~ Parent", labeller=label_both, scales="free") } else if (style == "cdf") { # Plot ECDF of edge null distribution p1 <- ggplot(perm_sum, aes(x=!!rlang::sym("count"))) + baseTheme() + ggtitle(main_title) + xlab("Number of edges") + ylab("P-value") + stat_ecdf(color=color, size=1) + geom_vline(data=obs_sum, aes(xintercept=!!rlang::sym("count")), color="firebrick", linetype=3, size=0.75) + geom_hline(data=obs_sum, aes(yintercept=!!rlang::sym("pvalue")), color="steelblue", linetype=3, size=0.75) + facet_grid("Child ~ Parent", labeller=label_both, scales="free") } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } #' Plot the results of a founder permutation test #' #' \code{plotMRCATest} plots the results of a founder permutation test performed with #' \code{testMRCA}. #' #' @param data \link{MRCATest} object returned by \link{testMRCA}. #' @param color color of the histogram or lines. #' @param main_title string specifying the plot title. #' @param style type of plot to draw. One of: #' \itemize{ #' \item \code{"histogram"}: histogram of the annotation count #' distribution with a red dotted line #' denoting the observed value. #' \item \code{"cdf"}: cumulative distribution function #' of annotation counts with a red dotted #' line denoting the observed value and #' a blue dotted line indicating the #' p-value. #' } #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso See \link{testEdges} for performing the test. #' #' @examples #' \donttest{ #' # Define example tree set #' graphs <- ExampleTrees[1:10] #' #' # Perform MRCA test on isotypes #' x <- testMRCA(graphs, "c_call", nperm=10) #' #' # Plot #' plotMRCATest(x, color="steelblue", style="hist") #' plotMRCATest(x, style="cdf") #' } #' #' @export plotMRCATest <- function(data, color="black", main_title="MRCA Test", style=c("histogram", "cdf"), silent=FALSE, ...) { # Check arguments style <- match.arg(style) # Extract plot data obs_sum <- rename(data@tests, "Annotation"="annotation") perm_sum <- rename(data@permutations, "Annotation"="annotation") if (style == "histogram") { # Plot MRCA null distribution p1 <- ggplot(perm_sum, aes(x=!!rlang::sym("count"))) + baseTheme() + ggtitle(main_title) + xlab("Number of MRCAs") + ylab("Number of realizations") + geom_histogram(fill=color, color=NA, bins=50) + geom_vline(data=obs_sum, aes(xintercept=!!rlang::sym("count")), color="firebrick", linetype=3, size=0.75) + facet_wrap("Annotation", ncol=1, scales="free_y") } else if (style == "cdf") { # Plot ECDF of MRCA null distribution p1 <- ggplot(perm_sum, aes(x=!!rlang::sym("count"))) + baseTheme() + ggtitle(main_title) + xlab("Number of MRCAs") + ylab("P-value") + stat_ecdf(color=color, size=1) + geom_vline(data=obs_sum, aes(xintercept=!!rlang::sym("count")), color="firebrick", linetype=3, size=0.75) + geom_hline(data=obs_sum, aes(yintercept=!!rlang::sym("pvalue")), color="steelblue", linetype=3, size=0.75) + facet_wrap("Annotation", nrow=1, scales="free_y") } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) } #' Plots subtree statistics for multiple trees #' #' \code{plotSubtree} plots distributions of normalized subtree statistics for a #' set of lineage trees, broken down by annotation value. #' #' @param graphs list of igraph objects containing annotated lineage trees. #' @param field string defining the annotation field. #' @param stat string defining the subtree statistic to plot. One of: #' \itemize{ #' \item \code{outdegree}: distribution of normalized node #' outdegrees. #' \item \code{size}: distribution of normalized subtree sizes. #' \item \code{depth}: distribution of subtree depths. #' \item \code{pathlength}: distribution of maximum pathlength #' beneath nodes. #' } #' @param root name of the root (germline) node. #' @param exclude vector of strings defining \code{field} values to exclude from #' plotting. #' @param colors named vector of colors for values in \code{field}, with #' names defining annotation names \code{field} column and values #' being colors. Also controls the order in which values appear on the #' plot. If \code{NULL} alphabetical ordering and a default color palette #' will be used. #' @param main_title string specifying the plot title. #' @param legend_title string specifying the legend title. #' @param style string specifying the style of plot to draw. One of: #' \itemize{ #' \item \code{"histogram"}: histogram of the annotation count #' distribution with a red dotted line #' denoting the observed value. #' \item \code{"cdf"}: cumulative distribution function #' of annotation counts with a red #' dotted line denoting the observed #' value and a blue dotted line #' indicating the p-value. #' } #' @param silent if \code{TRUE} do not draw the plot and just return the ggplot2 #' object; if \code{FALSE} draw the plot. #' @param ... additional arguments to pass to ggplot2::theme. #' #' @return A \code{ggplot} object defining the plot. #' #' @seealso Subtree statistics are calculated with \link{summarizeSubtrees}. #' #' @examples #' # Define example tree set #' graphs <- ExampleTrees[1:10] #' #' # Violin plots of node outdegree by sample #' plotSubtrees(graphs, "sample_id", "out", style="v") #' #' # Violin plots of subtree size by sample #' plotSubtrees(graphs, "sample_id", "size", style="v") #' #' # Boxplot of node depth by isotype #' plotSubtrees(graphs, "c_call", "depth", style="b") #' #' @export plotSubtrees <- function(graphs, field, stat, root="Germline", exclude=c("Germline", NA), colors=NULL, main_title="Subtrees", legend_title="Annotation", style=c("box", "violin"), silent=FALSE, ...) { # Hack for visibility of special ggplot variables #..x.. <- NULL ## DEBUG # graphs=ExampleTrees; field="c_call"; colors=IG_COLORS; main_title="Outdegree"; root="Germline"; exclude=c("Germline", NA); style="box" # Check arguments style <- match.arg(style, several.ok=FALSE) stat <- match.arg(stat, choices=c("outdegree", "size", "depth", "pathlength"), several.ok=FALSE) # Set stat column and axis labels if (stat == "outdegree") { stat_col <- "outdegree_norm" y_lab <- "Node outdegree" } else if (stat == "size") { stat_col <- "size_norm" y_lab <- "Substree size" } else if (stat == "depth") { stat_col <- "depth_norm" y_lab <- "Depth under node" } else if (stat == "pathlength") { stat_col <- "pathlength_norm" y_lab <- "Path length under node" } else { stop("Invalid value for 'stat'. How did you get here?") } # Assign numeric names if graphs is an unnamed list if (is.null(names(graphs))) { names(graphs) <- 1:length(graphs) } # Get subtree summarizes and filter excluded annotations sum_list <- lapply(graphs, summarizeSubtrees, fields=field, root=root) sum_df <- bind_rows(sum_list, .id="GRAPH") %>% filter(!(!!rlang::sym(field) %in% exclude), is.finite(!!rlang::sym(stat_col))) # Set ordering based on color names if (!is.null(colors)) { # Assign missing levels to grey x <- unique(sum_df[[field]]) x <- sort(x[!(x %in% names(colors))]) if (length(x) > 0) { warning("The following are missing from the 'colors' argument and will be colored grey: ", paste(x, collapse=" ")) x <- setNames(rep("grey", length(x)), x) colors <- c(colors, x) } # Cast to factor sum_df[[field]] <- factor(sum_df[[field]], levels=names(colors)) } else { sum_df[[field]] <- factor(sum_df[[field]]) } # Make plot object p1 <- ggplot(sum_df, aes(x=!!rlang::sym(field), y=!!rlang::sym(stat_col))) + baseTheme() + ggtitle(main_title) + xlab("") + ylab(y_lab) + scale_y_continuous(labels=percent) + expand_limits(y=0) # Add distributions style if (style == "box") { p1 <- p1 + geom_boxplot(aes(fill=!!rlang::sym(field)), width=0.7, alpha=0.8) } else if (style == "violin") { p1 <- p1 + geom_violin(aes(fill=!!rlang::sym(field)), adjust=1.5, scale="width", trim=T, width=0.7, alpha=0.8) + geom_errorbarh(aes(xmin=after_stat(x) - 0.4, xmax=after_stat(x) + 0.4), color="black", stat="summary", fun="mean", size=1.25, height=0, alpha=0.9) } # Set colors and legend if (!is.null(colors)) { p1 <- p1 + scale_fill_manual(name=legend_title, values=colors) } else { p1 <- p1 + scale_fill_discrete(name=legend_title) } # Add additional theme elements p1 <- p1 + do.call(theme, list(...)) # Plot if (!silent) { plot(p1) } invisible(p1) }alakazam/R/Gene.R0000644000176200001440000015737414500350354013255 0ustar liggesusers# Gene usage analysis #### Calculation functions #### #' Tabulates V(D)J allele, gene or family usage. #' #' Determines the count and relative abundance of V(D)J alleles, genes or families within #' groups. #' #' @param data data.frame with AIRR-format or Change-O style columns. #' @param gene column containing allele assignments. Only the first allele in the #' column will be considered when \code{mode} is "gene", "family" or #' "allele". The value will be used as it is with \code{mode="asis"}. #' @param groups columns containing grouping variables. If \code{NULL} do not group. #' @param copy name of the \code{data} column containing copy numbers for each #' sequence. If this value is specified, then total copy abundance #' is determined by the sum of copy numbers within each gene. #' This argument is ignored if \code{clone} is specified. #' @param clone name of the \code{data} column containing clone identifiers for each #' sequence. If this value is specified, then one gene will be considered #' for each clone. Note, this is accomplished by using the most #' common gene within each \code{clone} identifier. As such, #' ambiguous alleles within a clone will not be accurately represented. #' @param mode one of \code{c("gene", "family", "allele", "asis")} defining #' the degree of specificity regarding allele calls. Determines whether #' to return counts for genes (calling \code{getGene}), #' families (calling \code{getFamily}), alleles (calling #' \code{getAllele}) or using the value as it is in the column #' \code{gene}, without any processing. #' @param fill logical of \code{c(TRUE, FALSE)} specifying when if groups (when specified) #' lacking a particular gene should be counted as 0 if TRUE or not (omitted) #' @param remove_na removes rows with \code{NA} values in the gene column if \code{TRUE} and issues a warning. #' Otherwise, keeps those rows and considers \code{NA} as a gene in the final counts #' and relative abundances. #' #' @return A data.frame summarizing family, gene or allele counts and frequencies #' with columns: #' \itemize{ #' \item \code{gene}: name of the family, gene or allele. #' \item \code{seq_count}: total number of sequences for the gene. #' \item \code{seq_freq}: frequency of the gene as a fraction of the total #' number of sequences within each grouping. #' \item \code{copy_count}: sum of the copy counts in the \code{copy} column. #' for each gene. Only present if the \code{copy} #' argument is specified. #' \item \code{copy_freq}: frequency of the gene as a fraction of the total #' copy number within each group. Only present if #' the \code{copy} argument is specified. #' \item \code{clone_count}: total number of clones for the gene. Only present if #' the \code{clone} argument is specified. #' \item \code{clone_freq}: frequency of the gene as a fraction of the total #' number of clones within each grouping. Only present if #' the \code{clone} argument is specified. #' } #' Additional columns defined by the \code{groups} argument will also be present. #' #' @examples #' # Without copy numbers #' genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") #' genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") #' genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="allele") #' #' # With copy numbers and multiple groups #' genes <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), #' copy="duplicate_count", mode="family") #' #' # Count by clone #' genes <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), #' clone="clone_id", mode="family") #' #' # Count absent genes #' genes <- countGenes(ExampleDb, gene="v_call", groups="sample_id", #' mode="allele", fill=TRUE) #' #'@export countGenes <- function(data, gene, groups=NULL, copy=NULL, clone=NULL, fill=FALSE, mode=c("gene", "allele", "family", "asis"), remove_na=TRUE) { ## DEBUG # data=ExampleDb; gene="c_call"; groups=NULL; mode="gene"; clone="clone_id" # data=subset(db, clond_id == 3138) # Hack for visibility of dplyr variables . <- NULL # Check input mode <- match.arg(mode) check <- checkColumns(data, c(gene, groups, copy)) if (check != TRUE) { warning(check) # instead of throwing an error and potentially disrupting a workflow } # Handle NAs if (remove_na) { bool_na <- is.na(data[, gene]) if (any(bool_na)) { if (!all(bool_na)){ msg <- paste0("NA(s) found in ", sum(bool_na), " row(s) of the ", gene, " column and excluded from tabulation") warning(msg) } data <- data[!bool_na, ] } } # Extract gene, allele or family assignments if (mode != "asis") { gene_func <- switch(mode, allele=getAllele, gene=getGene, family=getFamily) data[[gene]] <- gene_func(data[[gene]], first=TRUE) } # Tabulate abundance if (is.null(copy) & is.null(clone)) { # Tabulate sequence abundance gene_tab <- data %>% group_by(!!!rlang::syms(c(groups, gene))) %>% dplyr::summarize(seq_count=n()) %>% mutate(., seq_freq=!!rlang::sym("seq_count")/sum(!!rlang::sym("seq_count"), na.rm=TRUE)) %>% arrange(desc(!!rlang::sym("seq_count"))) } else if (!is.null(clone) & is.null(copy)) { # Find count of genes within each clone and keep first with maximum count gene_tab <- data %>% group_by(!!!rlang::syms(c(groups, clone, gene))) %>% dplyr::mutate(clone_gene_count=n()) %>% ungroup() %>% group_by(!!!rlang::syms(c(groups, clone))) %>% slice(which.max(!!rlang::sym("clone_gene_count"))) %>% ungroup() %>% group_by(!!!rlang::syms(c(groups, gene))) %>% dplyr::summarize(clone_count=n()) %>% mutate(clone_freq=!!rlang::sym("clone_count")/sum(!!rlang::sym("clone_count"), na.rm=TRUE)) %>% arrange(!!rlang::sym("clone_count")) } else { if (!is.null(clone) & !is.null(copy)) { warning("Specifying both 'copy' and 'clone' columns is not meaningful. ", "The 'clone' argument will be ignored.") } # Tabulate copy abundance gene_tab <- data %>% group_by(!!!rlang::syms(c(groups, gene))) %>% summarize(seq_count=length(!!rlang::sym(gene)), copy_count=sum(!!rlang::sym(copy), na.rm=TRUE)) %>% mutate(seq_freq=!!rlang::sym("seq_count")/sum(!!rlang::sym("seq_count"), na.rm=TRUE), copy_freq=!!rlang::sym("copy_count")/sum(!!rlang::sym("copy_count"), na.rm=TRUE)) %>% arrange(desc(!!rlang::sym("copy_count"))) } # If a gene is present in one GROUP but not another, will fill the COUNT and FREQ with 0s if (fill) { gene_tab <- gene_tab %>% ungroup() %>% tidyr::complete(!!!rlang::syms(as.list(c(groups, gene))), fill = list(seq_count = 0, seq_freq = 0, copy_count = 0, copy_freq = 0, clone_count = 0, clone_freq = 0)) } # Rename gene column gene_tab <- gene_tab %>% rename(all_of(c("gene"=gene))) return(gene_tab) } #### Annotation functions #### #' Get Ig segment allele, gene and family names #' #' \code{getSegment} performs generic matching of delimited segment calls with a custom #' regular expression. \link{getAllele}, \link{getGene} and \link{getFamily} extract #' the allele, gene and family names, respectively, from a character vector of #' immunoglobulin (Ig) or TCR segment allele calls in IMGT format. #' #' @param segment_call character vector containing segment calls delimited by commas. #' @param segment_regex string defining the segment match regular expression. #' @param first if \code{TRUE} return only the first call in #' \code{segment_call}; if \code{FALSE} return all calls #' delimited by commas. #' @param collapse if \code{TRUE} check for duplicates and return only unique #' segment assignments; if \code{FALSE} return all assignments #' (faster). Has no effect if \code{first=TRUE}. #' @param strip_d if \code{TRUE} remove the "D" from the end of gene annotations #' (denoting a duplicate gene in the locus); #' if \code{FALSE} do not alter gene names. #' @param omit_nl if \code{TRUE} remove non-localized (NL) genes from the result. #' Only applies at the gene or allele level. #' @param sep character defining both the input and output segment call #' delimiter. #' #' @return A character vector containing allele, gene or family names. #' #' @references #' \url{https://www.imgt.org/} #' #' @seealso \link{countGenes} #' #' @examples #' # Light chain examples #' kappa_call <- c("Homsap IGKV1D-39*01 F,Homsap IGKV1-39*02 F,Homsap IGKV1-39*01", #' "Homsap IGKJ5*01 F") #' #' getAllele(kappa_call) #' getAllele(kappa_call, first=FALSE) #' getAllele(kappa_call, first=FALSE, strip_d=FALSE) #' #' getGene(kappa_call) #' getGene(kappa_call, first=FALSE) #' getGene(kappa_call, first=FALSE, strip_d=FALSE) #' #' getFamily(kappa_call) #' getFamily(kappa_call, first=FALSE) #' getFamily(kappa_call, first=FALSE, collapse=FALSE) #' getFamily(kappa_call, first=FALSE, strip_d=FALSE) #' #' getLocus(kappa_call) #' getChain(kappa_call) #' #' # Heavy chain examples #' heavy_call <- c("Homsap IGHV1-69*01 F,Homsap IGHV1-69D*01 F", #' "Homsap IGHD1-1*01 F", #' "Homsap IGHJ1*01 F") #' #' getAllele(heavy_call, first=FALSE) #' getAllele(heavy_call, first=FALSE, strip_d=FALSE) #' #' getGene(heavy_call, first=FALSE) #' getGene(heavy_call, first=FALSE, strip_d=FALSE) #' #' getFamily(heavy_call) #' getLocus(heavy_call) #' getChain(heavy_call) #' #' # Filtering non-localized genes #' nl_call <- c("IGHV3-NL1*01,IGHV3-30-3*01,IGHV3-30*01", #' "Homosap IGHV3-30*01 F,Homsap IGHV3-NL1*01 F", #' "IGHV1-NL1*01") #' #' getAllele(nl_call, first=FALSE, omit_nl=TRUE) #' getGene(nl_call, first=FALSE, omit_nl=TRUE) #' getFamily(nl_call, first=FALSE, omit_nl=TRUE) #' #' # Temporary designation examples #' tmp_call <- c("IGHV9S3*01", "IGKV10S12*01") #' #' getAllele(tmp_call) #' getGene(tmp_call) #' getFamily(tmp_call) #' #' @export getSegment <- function(segment_call, segment_regex, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { # Define boundaries of individual segment calls edge_regex <- paste0("[^", sep, "]*") # Remove NL genes if (omit_nl) { # Clean segment_call to keep only the name (remove species) allele_regex <- '((IG[HKL]|TR[ABDG])[VDJADEGMC][A-R0-9\\(\\)]*[-/\\w]*[-\\*]*[\\.\\w]+)' segment_call <- gsub(paste0(edge_regex, "(", allele_regex, ")", edge_regex), "\\1", segment_call, perl=T) # non-localized regex nl_regex <- paste0('(IG[HKL]|TR[ABDG])[VDJADEGMC][0-9]+-NL[0-9]([-/\\w]*[-\\*][\\.\\w]+)*(', sep, "|$)") # delete non-localized calls segment_call <- gsub(nl_regex, "", segment_call, perl=TRUE) } # Extract calls r <- gsub(paste0(edge_regex, "(", segment_regex, ")", edge_regex), "\\1", segment_call, perl=T) # Strip D from gene names if required if (strip_d) { strip_regex <- paste0("(?<=[A-Z0-9][0-9])D(?=\\*|-|", sep, "|$)") r <- gsub(strip_regex, "", r, perl=TRUE) } # Collapse to unique set if required if (first) { r <- gsub(paste0(sep, ".*$"), "", r) } else if (collapse) { r <- sapply(strsplit(r, sep), function(x) paste(unique(x), collapse=sep)) } return(r) } #' @rdname getSegment #' @export getAllele <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { allele_regex <- '((IG[HKL]|TR[ABDG])[VDJADEGMC][A-R0-9\\(\\)]*[-/\\w]*[-\\*]*[\\.\\w]+)' r <- getSegment(segment_call, allele_regex, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) return(r) } #' @rdname getSegment #' @export getGene <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { gene_regex <- '((IG[HKL]|TR[ABDG])[VDJADEGMC][A-R0-9\\(\\)]*[-/\\w]*)' r <- getSegment(segment_call, gene_regex, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) return(r) } #' @rdname getSegment #' @export getFamily <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { family_regex <- '((IG[HKL]|TR[ABDG])[VDJADEGMC][A-R0-9\\(\\)]*)' r <- getSegment(segment_call, family_regex, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) return(r) } #' @rdname getSegment #' @export getLocus <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { locus_regex <- '((IG[HLK]|TR[ABDG]))' r <- getSegment(segment_call, locus_regex, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) return(r) } #' @rdname getSegment #' @export getChain <- function(segment_call, first=TRUE, collapse=TRUE, strip_d=TRUE, omit_nl=FALSE, sep=",") { r <- getLocus(segment_call, first=first, collapse=collapse, strip_d=strip_d, omit_nl=omit_nl, sep=sep) r <- gsub("(IGH)|(TR[BD])", "VH", r) r <- gsub("(IG[KL])|(TR[AG])", "VL", r) return(r) } #### Utility functions #### # Get all VJ(L) combinations from one or more chains of the same type # # Input: # V annotation, J annotation, and optionally junction length of # one of more chains of the same type # - v: V annotation # - j: J annotation # - l: junction length (optional) # - sep_chain: character separting multiple chains # - sep_anno: character separating multiple/ambiguous annotations within each chain # - first: to be passed to getGene() # # Output: # A vector containing all unique VJ(L) combinations represented # # Assumption: # 1) number of chains match across v, j, l # 2) if length value is supplied, each chain has a single length value # # Example input # v <- "Homsap IGLV2-20*09 F,Homsap IGLV3-30*09 F;Homsap IGKV1-27*01 F;Homsap IGKV1-25*01 F,Homsap IGKV1-25*38 F,Homsap IGKV1-32*02 F" # j <- "Homsap IGLJ3*02 F;Homsap IGKJ5*02 F;Homsap IGKJ3*03 F,Homsap IGKJ9*03 F" # l <- "36;39;60" # getAllVJL(v, j, l, ";", ",", FALSE) # - 3 light chains # - number of V annotations per chain: 2/1/3 # - number of J annotations per chain: 1/1/2 # - Expected supremum of the number of VJL combinations: 2*1 + 1*1 + 3*2 = 9 # - Note that this is the supremum because the ACTUAL number (7) CAN be lower due to presence # of different alleles from the SAME gene (since computation is performed at the gene level) getAllVJL <- function(v, j, l, sep_chain, sep_anno, first) { # is l NULL? l_NULL <- is.null(l) # are there multiple chains? # assumes that number of chains match across v, j, l # (pre-checked in groupGenes) multi_chain <- stringi::stri_detect_fixed(str=v, pattern=sep_chain) # are there multiple annotations per chain? multi_anno_v <- stringi::stri_detect_fixed(str=v, pattern=sep_anno) multi_anno_j <- stringi::stri_detect_fixed(str=j, pattern=sep_anno) # separate chains # gets a vector of strings # each vector entry corresponds to a chain if (multi_chain) { v <- stringi::stri_split_fixed(str=v, pattern=sep_chain)[[1]] j <- stringi::stri_split_fixed(str=j, pattern=sep_chain)[[1]] if (!l_NULL) { l <- stringi::stri_split_fixed(str=l, pattern=sep_chain)[[1]] } } # separate annotations # gets a list # each list entry has a vector of one or more strings if (multi_anno_v) { v <- stringi::stri_split_fixed(str=v, pattern=sep_anno) # take care of 'first' here because getGene will not split by "," if (first) { v <- lapply(v, function(x){x[1]}) } } if (multi_anno_j) { j <- stringi::stri_split_fixed(str=j, pattern=sep_anno) if (first) { j <- lapply(j, function(x){x[1]}) } } # get gene # gets a list # each list entry corresponds to a chain, and is a vector of one or more strings v <- sapply(v, getGene, collapse=TRUE, simplify=FALSE, USE.NAMES=FALSE) j <- sapply(j, getGene, collapse=TRUE, simplify=FALSE, USE.NAMES=FALSE) # if there is multiple chains and/or multiple annotations if ( multi_chain | (multi_anno_v & first) | (multi_anno_j & first) ) { # gets a list # each list entry is a vector of one or more strings # do if/else outside sapply so it only gets evaluated once if (!l_NULL) { exp <- sapply(1:length(v), function(i){ #eg_df <- expand.grid(v[[i]], j[[i]], l[i]) #eg_vec <- apply(eg_df, 1, stringi::stri_paste, collapse="@") n_v <- length(v[[i]]) n_j <- length(j[[i]]) eg_vec = stringi::stri_paste(rep.int(v[[i]], times=n_j), rep(j[[i]], each=n_v), rep.int(l[i], times=n_v*n_j), sep="@") return(eg_vec) }, simplify=FALSE, USE.NAMES=FALSE) } else { exp <- sapply(1:length(v), function(i){ #eg_df = expand.grid(v[[i]], j[[i]]) #eg_vec = apply(eg_df, 1, stringi::stri_paste, collapse="@") n_v <- length(v[[i]]) n_j <- length(j[[i]]) eg_vec <- stringi::stri_paste(rep.int(v[[i]], times=n_j), rep(j[[i]], each=n_v), sep="@") return(eg_vec) }, simplify=FALSE, USE.NAMES=FALSE) } # concat and convert to vector; keep distinct values exp <- unique(unlist(exp, use.names=FALSE)) } else { n_v <- length(v[[1]]) n_j <- length(j[[1]]) if (!l_NULL) { exp <- stringi::stri_paste(rep.int(v[[1]], times=n_j), rep(j[[1]], each=n_v), rep.int(l[1], times=n_v*n_j), sep="@") } else { exp <- stringi::stri_paste(rep.int(v[[1]], times=n_j), rep(j[[1]], each=n_v), sep="@") } } return(exp) } #' Group sequences by gene assignment #' #' \code{groupGenes} will group rows by shared V and J gene assignments, #' and optionally also by junction lengths. IGH:IGK/IGL, TRB:TRA, and TRD:TRG #' paired single-cell BCR/TCR sequencing and unpaired bulk sequencing #' (IGH, TRB, TRD chain only) are supported. In the case of ambiguous (multiple) #' gene assignments, the grouping may be specified to be a union across all #' ambiguous V and J gene pairs, analogous to single-linkage clustering #' (i.e., allowing for chaining). #' #' @param data data.frame containing sequence data. #' @param v_call name of the column containing the heavy/long chain #' V-segment allele calls. #' @param j_call name of the column containing the heavy/long chain #' J-segment allele calls. #' @param junc_len name of column containing the junction length. #' If \code{NULL} then 1-stage partitioning is perform #' considering only the V and J genes is performed. #' See Details for further clarification. #' @param cell_id name of the column containing cell identifiers or barcodes. #' If specified, grouping will be performed in single-cell mode #' with the behavior governed by the \code{locus} and #' \code{only_heavy} arguments. If set to \code{NULL} then the #' bulk sequencing data is assumed. #' @param locus name of the column containing locus information. #' Only applicable to single-cell data. #' Ignored if \code{cell_id=NULL}. #' @param only_heavy use only the IGH (BCR) or TRB/TRD (TCR) sequences #' for grouping. Only applicable to single-cell data. #' Ignored if \code{cell_id=NULL}. #' @param first if \code{TRUE} only the first call of the gene assignments #' is used. if \code{FALSE} the union of ambiguous gene #' assignments is used to group all sequences with any #' overlapping gene calls. #' #' @return Returns a modified data.frame with disjoint union indices #' in a new \code{vj_group} column. #' #' If \code{junc_len} is supplied, the grouping this \code{vj_group} #' will have been based on V, J, and junction length simultaneously. However, #' the output column name will remain \code{vj_group}. #' #' The output \code{v_call}, \code{j_call}, \code{cell_id}, and \code{locus} #' columns will be converted to type \code{character} if they were of type #' \code{factor} in the input \code{data}. #' #' @details #' To invoke single-cell mode the \code{cell_id} argument must be specified and the \code{locus} #' column must be correct. Otherwise, \code{groupGenes} will be run with bulk sequencing assumptions, #' using all input sequences regardless of the values in the \code{locus} column. #' #' Values in the \code{locus} column must be one of \code{c("IGH", "IGI", "IGK", "IGL")} for BCR #' or \code{c("TRA", "TRB", "TRD", "TRG")} for TCR sequences. Otherwise, the function returns an #' error message and stops. #' #' Under single-cell mode with paired chained sequences, there is a choice of whether #' grouping should be done by (a) using IGH (BCR) or TRB/TRD (TCR) sequences only or #' (b) using IGH plus IGK/IGL (BCR) or TRB/TRD plus TRA/TRG (TCR). #' This is governed by the \code{only_heavy} argument. #' #' Specifying \code{junc_len} will force \code{groupGenes} to perform a 1-stage partitioning of the #' sequences/cells based on V gene, J gene, and junction length simultaneously. #' If \code{junc_len=NULL} (no column specified), then \code{groupGenes} performs only the first #' stage of a 2-stage partitioning in which sequences/cells are partitioned in the first stage #' based on V gene and J gene, and then in the second stage further splits the groups based on #' junction length (the second stage must be performed independently, as this only returns the #' first stage results). #' #' In the input \code{data}, the \code{v_call}, \code{j_call}, \code{cell_id}, and \code{locus} #' columns, if present, must be of type \code{character} (as opposed to \code{factor}). #' #' It is assumed that ambiguous gene assignments are separated by commas. #' #' All rows containing \code{NA} values in any of the \code{v_call}, \code{j_call}, and \code{junc_len} #' (if \code{junc_len != NULL}) columns will be removed. A warning will be issued when a row #' containing an \code{NA} is removed. #' #' @section Expectations for single-cell data: #' #' Single-cell paired chain data assumptions: #' \itemize{ #' \item every row represents a sequence (chain). #' \item heavy/long and light/short chains of the same cell are linked by \code{cell_id}. #' \item the value in \code{locus} column indicates whether the chain is the heavy/long or light/short chain. #' \item each cell possibly contains multiple heavy/long and/or light/short chains. #' \item every chain has its own V(D)J annotation, in which ambiguous V(D)J #' annotations, if any, are separated by a comma. #' } #' #' Single-cell example: #' \itemize{ #' \item A cell has 1 heavy chain and 2 light chains. #' \item There should be 3 rows corresponding to this cell. #' \item One of the light chains may have an ambiguous V annotation which looks like \code{"Homsap IGKV1-39*01 F,Homsap IGKV1D-39*01 F"}. #' } #' #' @examples #' # Group by genes #' db <- groupGenes(ExampleDb) #' head(db$vj_group) #' #' @export groupGenes <- function(data, v_call="v_call", j_call="j_call", junc_len=NULL, cell_id=NULL, locus="locus", only_heavy=TRUE, first=FALSE) { # Check base input check <- checkColumns(data, c(v_call, j_call, junc_len)) if (check!=TRUE) { stop("A column or some combination of columns v_call, j_call, and junc_len were not found in the data") } # Check single-cell input if (!is.null(cell_id)) { check <- checkColumns(data, c(cell_id)) if (check != TRUE) { stop(check) } } # Check locus # message locus is required if (is.null(locus)) { stop("`locus`, is a required parameter.") } check <- checkColumns(data, locus) if (check != TRUE) { stop(check) } # if necessary, cast select columns to character (factor not allowed later on) if (!is(data[[v_call]], "character")) { data[[v_call]] <- as.character(data[[v_call]]) } if (!is(data[[j_call]], "character")) { data[[j_call]] <- as.character(data[[j_call]]) } # e.g.: "Homsap IGHV3-7*01 F,Homsap IGHV3-6*01 F;Homsap IGHV1-4*01 F" separator_within_seq <- "," separator_between_seq <- ";" # single-cell mode? if (!is.null(cell_id) & !is.null(locus)) { single_cell <- TRUE if (!is(data[[cell_id]], "character")) { data[[cell_id]] <- as.character(data[[cell_id]]) } if (!is(data[[locus]], "character")) { data[[locus]] <- as.character(data[[locus]]) } # check locus column valid_loci <- c("IGH", "IGI", "IGK", "IGL", "TRA", "TRB", "TRD", "TRG") check <- !all(unique(data[[locus]]) %in% valid_loci) if (check) { stop("The locus column contains invalid loci annotations.") } } else { single_cell <- FALSE } # only set if `single_cell` & `only_heavy` v_call_light <- NULL j_call_light <- NULL junc_len_light <- NULL # single-cell mode if (single_cell) { # regardless of using heavy only, or using both heavy and light # for each cell # - index wrt data of heavy chain # - index wrt data of light chain(s) cell_id_uniq <- unique(data[[cell_id]]) cell_seq_idx <- sapply(cell_id_uniq, function(x){ # heavy chain idx_h <- which( data[[cell_id]]==x & data[[locus]] %in% c("IGH", "TRB", "TRD")) # light chain idx_l <- which( data[[cell_id]]==x & data[[locus]] %in% c("IGK", "IGL", "TRA", "TRG") ) return(list(heavy=idx_h, light=idx_l)) }, USE.NAMES=FALSE, simplify=FALSE) # make a copy data_orig <- data; rm(data) if(only_heavy){ # use heavy chains only # Straightforward subsetting like below won't work in cases # where multiple HCs are present for a cell # subset to heavy only data <- data_orig[data_orig[[locus]] %in% c("IGH","TRB","TRD"), ] # flatten data cols <- c(cell_id, v_call, j_call, junc_len) data <- data.frame(matrix(NA, nrow=length(cell_seq_idx), ncol=length(cols))) colnames(data) <- cols for (i_cell in 1:length(cell_seq_idx)) { i_cell_h <- cell_seq_idx[[i_cell]][["heavy"]] data[[cell_id]][i_cell] <- cell_id_uniq[i_cell] # heavy chain V, J, junc_len data[[v_call]][i_cell] <- paste0(data_orig[[v_call]][i_cell_h], collapse=separator_between_seq) data[[j_call]][i_cell] <- paste0(data_orig[[j_call]][i_cell_h], collapse=separator_between_seq) if (!is.null(junc_len)) { data[[junc_len]][i_cell] <- paste0(data_orig[[junc_len]][i_cell_h], collapse=separator_between_seq) } } } else { # use heavy AND light chains for grouping v_call_light <- "v_call_light" j_call_light <- "j_call_light" # ifelse won't return NULL if (is.null(junc_len)) { junc_len_light <- NULL } else { junc_len_light <- "len_light" } # flatten data cols <- c(cell_id, v_call, j_call, junc_len, v_call_light, j_call_light, junc_len_light) data <- data.frame(matrix(NA, nrow=length(cell_seq_idx), ncol=length(cols))) colnames(data) <- cols for (i_cell in 1:length(cell_seq_idx)) { i_cell_h <- cell_seq_idx[[i_cell]][["heavy"]] i_cell_l <- cell_seq_idx[[i_cell]][["light"]] data[[cell_id]][i_cell] <- cell_id_uniq[i_cell] # heavy chain V, J, junc_len data[[v_call]][i_cell] <- paste0(data_orig[[v_call]][i_cell_h], collapse=separator_between_seq) data[[j_call]][i_cell] <- paste0(data_orig[[j_call]][i_cell_h], collapse=separator_between_seq) if (!is.null(junc_len)) { data[[junc_len]][i_cell] <- paste0(data_orig[[junc_len]][i_cell_h], collapse=separator_between_seq) } # light chain V, J, junc_len data[[v_call_light]][i_cell] <- paste0(data_orig[[v_call]][i_cell_l], collapse=separator_between_seq) data[[j_call_light]][i_cell] <- paste0(data_orig[[j_call]][i_cell_l], collapse=separator_between_seq) if (!is.null(junc_len_light)) { data[[junc_len_light]][i_cell] <- paste0(data_orig[[junc_len]][i_cell_l], collapse=separator_between_seq) } } # It cannot be the case that there are 2 V annotations but only 1 J annotation for # the two light chains. Both J annotations must be spelled out for each light chain, # separated by \code{separator_between_seq}, even if the annotated alleles are the same. # # This one-to-one annotation-to-chain correspondence for both V and J is explicitly # checked and an error raised if the requirement is not met. # one-to-one annotation-to-chain correspondence for both V and J (light) # for each cell/row, number of bewteen_seq separators in light V annotation and in light J annotation must match n_separator_btw_seq_v_light <- stringi::stri_count_fixed(str=data[[v_call_light]], pattern=separator_between_seq) n_separator_btw_seq_j_light <- stringi::stri_count_fixed(str=data[[j_call_light]], pattern=separator_between_seq) if (any( n_separator_btw_seq_v_light != n_separator_btw_seq_j_light )) { stop("Requirement not met: one-to-one annotation-to-chain correspondence for both V and J (light)") } } } # one-to-one annotation-to-chain correspondence for both V and J (heavy) # for each cell/row, number of bewteen_seq separators in heavy V annotation and in heavy J annotation must match # (in theory, there should be 1 heavy chain per cell; but 10x can return cell with >1 heavy chains and # you never know if the user will supply this cell as input) n_separator_btw_seq_v_heavy <- stringi::stri_count_fixed(str=data[[v_call]], pattern=separator_between_seq) n_separator_btw_seq_j_heavy <- stringi::stri_count_fixed(str=data[[j_call]], pattern=separator_between_seq) if (any( n_separator_btw_seq_v_heavy != n_separator_btw_seq_j_heavy )) { stop("Requirement not met: one-to-one annotation-to-chain correspondence for both V and J (heavy)") } # NULL will disappear when doing c() # c(NULL,NULL) gives NULL still cols_for_grouping_heavy <- c(v_call, j_call, junc_len) cols_for_grouping_light <- c(v_call_light, j_call_light, junc_len_light) # cols cannot be factor if (any( sapply(cols_for_grouping_heavy, function(x){class(data[[x]]) == "factor"}) )) { stop("one or more of { ", v_call, ", ", j_call, ifelse(is.null(junc_len), " ", ", "), junc_len, "} is factor. Must be character.\nIf using read.table(), make sure to set stringsAsFactors=FALSE.\n") } if (single_cell & !only_heavy) { if (any( sapply(cols_for_grouping_light, function(x) {class(data[[x]]) == "factor"}) )) { stop("one or more of { ", v_call_light, ", ", j_call_light, ifelse(is.null(junc_len_light), " ", ", "), junc_len_light, "} is factor. Must be character.\nIf using read.table(), make sure to set stringsAsFactors=FALSE.\n") } } # Check NA(s) in columns bool_na <- rowSums( is.na( data[, c(cols_for_grouping_heavy, cols_for_grouping_light)] ) ) >0 if (any(bool_na)) { entityName <- ifelse(single_cell, " cell(s)", " sequence(s)") msg <- paste0("NA(s) found in one or more of { ", v_call, ", ", j_call, ifelse(is.null(junc_len), "", ", "), junc_len, ifelse(is.null(v_call_light), "", ", "), v_call_light, ifelse(is.null(j_call_light), "", ", "), j_call_light, ifelse(is.null(junc_len_light), "", ", "), junc_len_light, " } columns. ", sum(bool_na), entityName, " removed.\n") warning(msg) data <- data[!bool_na, ] if (single_cell) { # maintain one-to-one relationship between # rows of data, cell_id_uniq, and cell_seq_idx cell_id_uniq <- cell_id_uniq[!bool_na] cell_seq_idx <- cell_seq_idx[!bool_na] } } ### expand # speed-up strategy # compute expanded VJL combos for unique rows # then distribute back to all rows # unique combinations of VJL # heavy chain seqs only if ( (!single_cell) | (single_cell & only_heavy) ) { combo_unique <- unique(data[, cols_for_grouping_heavy]) # unique components v_unique <- unique(combo_unique[[v_call]]) j_unique <- unique(combo_unique[[j_call]]) # map each row in full data to unique combo m_v <- match(data[[v_call]], v_unique) m_j <- match(data[[j_call]], j_unique) if (is.null(junc_len)) { combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i) { idx_v <- which (v_unique == combo_unique[[v_call]][i]) idx_j <- which (j_unique == combo_unique[[j_call]][i]) idx <- which(m_v==idx_v & m_j==idx_j) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) } else { l_unique <- unique(combo_unique[[junc_len]]) m_l <- match(data[[junc_len]], l_unique) combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i) { idx_v <- which(v_unique == combo_unique[[v_call]][i]) idx_j <- which(j_unique == combo_unique[[j_call]][i]) idx_l <- which(l_unique == combo_unique[[junc_len]][i]) idx <- which(m_v==idx_v & m_j==idx_j & m_l==idx_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) } # expand combo_unique if (is.null(junc_len)) { exp_lst <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=F, USE.NAMES=FALSE) } else { exp_lst <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=combo_unique[[junc_len]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=F, USE.NAMES=FALSE) } } else { # single_cell & !only_heavy # important: do not do this separately for heavy and light # must keep the pairing structure combo_unique <- unique(data[, c(cols_for_grouping_heavy, cols_for_grouping_light)]) # unique components v_unique_h <- unique(combo_unique[[v_call]]) j_unique_h <- unique(combo_unique[[j_call]]) v_unique_l <- unique(combo_unique[[v_call_light]]) j_unique_l <- unique(combo_unique[[j_call_light]]) # map each row in full data to unique combo m_v_h <- match(data[[v_call]], v_unique_h) m_j_h <- match(data[[j_call]], j_unique_h) m_v_l <- match(data[[v_call_light]], v_unique_l) m_j_l <- match(data[[j_call_light]], j_unique_l) if (!is.null(junc_len)) { l_unique_h <- unique(combo_unique[[junc_len]]) m_l_h <- match(data[[junc_len]], l_unique_h) } if (!is.null(junc_len_light)) { l_unique_l <- unique(combo_unique[[junc_len_light]]) m_l_l <- match(data[[junc_len_light]], l_unique_l) } # expand combo_unique if (is.null(junc_len) & is.null(junc_len_light)) { # map combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i){ idx_v_h <- which( v_unique_h == combo_unique[[v_call]][i] ) idx_j_h <- which( j_unique_h == combo_unique[[j_call]][i] ) idx_v_l <- which( v_unique_l == combo_unique[[v_call_light]][i] ) idx_j_l <- which( j_unique_l == combo_unique[[j_call_light]][i] ) idx <- which(m_v_h==idx_v_h & m_j_h==idx_j_h & m_v_l==idx_v_l & m_j_l==idx_j_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) # heavy exp_h <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) # light exp_l <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call_light]][i], j=combo_unique[[j_call_light]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) } else if (!is.null(junc_len) & !is.null(junc_len_light)) { # map combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i){ idx_v_h <- which( v_unique_h == combo_unique[[v_call]][i] ) idx_j_h <- which( j_unique_h == combo_unique[[j_call]][i] ) idx_l_h <- which( l_unique_h == combo_unique[[junc_len]][i] ) idx_v_l <- which( v_unique_l == combo_unique[[v_call_light]][i] ) idx_j_l <- which( j_unique_l == combo_unique[[j_call_light]][i] ) idx_l_l <- which( l_unique_l == combo_unique[[junc_len_light]][i] ) idx <- which(m_v_h==idx_v_h & m_j_h==idx_j_h & m_l_h==idx_l_h & m_v_l==idx_v_l & m_j_l==idx_j_l & m_l_l==idx_l_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) # heavy exp_h <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=combo_unique[[junc_len]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) # light exp_l <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call_light]][i], j=combo_unique[[j_call_light]][i], l=combo_unique[[junc_len_light]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) } else if (is.null(junc_len) & !is.null(junc_len_light)) { # map combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i){ idx_v_h <- which( v_unique_h == combo_unique[[v_call]][i] ) idx_j_h <- which( j_unique_h == combo_unique[[j_call]][i] ) idx_v_l <- which( v_unique_l == combo_unique[[v_call_light]][i] ) idx_j_l <- which( j_unique_l == combo_unique[[j_call_light]][i] ) idx_l_l <- which( l_unique_l == combo_unique[[junc_len_light]][i] ) idx <- which(m_v_h==idx_v_h & m_j_h==idx_j_h & m_v_l==idx_v_l & m_j_l==idx_j_l & m_l_l==idx_l_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) # heavy exp_h <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) # light exp_l <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call_light]][i], j=combo_unique[[j_call_light]][i], l=combo_unique[[junc_len_light]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) } else if (!is.null(junc_len) & is.null(junc_len_light)) { # map combo_unique_full_idx <- sapply(1:nrow(combo_unique), function(i){ idx_v_h <- which( v_unique_h == combo_unique[[v_call]][i] ) idx_j_h <- which( j_unique_h == combo_unique[[j_call]][i] ) idx_l_h <- which( l_unique_h == combo_unique[[junc_len]][i] ) idx_v_l <- which( v_unique_l == combo_unique[[v_call_light]][i] ) idx_j_l <- which( j_unique_l == combo_unique[[j_call_light]][i] ) idx <- which(m_v_h==idx_v_h & m_j_h==idx_j_h & m_l_h==idx_l_h & m_v_l==idx_v_l & m_j_l==idx_j_l) return(idx) }, simplify=FALSE, USE.NAMES=FALSE) # heavy exp_h <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call]][i], j=combo_unique[[j_call]][i], l=combo_unique[[junc_len]][i], first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) # light exp_l <- sapply(1:nrow(combo_unique), function(i){ getAllVJL(v=combo_unique[[v_call_light]][i], j=combo_unique[[j_call_light]][i], l=NULL, first=first, sep_anno=separator_within_seq, sep_chain=separator_between_seq) }, simplify=FALSE, USE.NAMES=FALSE) } # pair heavy & light stopifnot( length(exp_h) == length(exp_l) ) exp_lst <- sapply(1:length(exp_h), function(i){ n_h <- length(exp_h[[i]]) n_l <- length(exp_l[[i]]) stringi::stri_paste(rep.int(exp_h[[i]], times=n_l), rep(exp_l[[i]], each=n_h), sep="@") }, simplify=FALSE, USE.NAMES=FALSE) } # one-to-one correspondence btw exp_lst and combo_unique_full_idx # exp_lst: VJL combinations # combo_unique_full_idx: rows in data carrying each exp_lst # exp_lst may not be all unique because gene-level info is kept instead of allele-level # make exp_lst unique exp_lst_uniq <- unique(exp_lst) exp_lst_uniq_full_idx <- sapply(exp_lst_uniq, function(x){ # wrt exp_lst, therefore also wrt combo_unique_full_idx idx_lst <- which(unlist(lapply(exp_lst, function(y){ length(y)==length(x) && all(y==x) }))) # merge unlist(combo_unique_full_idx[idx_lst], use.names=FALSE) }, simplify=FALSE, USE.NAMES=FALSE) stopifnot( length(unique(unlist(exp_lst_uniq_full_idx, use.names=FALSE))) == nrow(data) ) # tip: unlist with use.names=F makes it much faster (>100x) # https://www.r-bloggers.com/speed-trick-unlist-use-namesfalse-is-heaps-faster/ exp_uniq <- sort(unique(unlist(exp_lst_uniq, use.names=FALSE))) n_cells_or_seqs <- nrow(data) # notes on implementation # regular/dense matrix is more straightforward to implement but very costly memory-wise # sparse matrix is less straightforward to implement but way more memory efficient # sparse matrix is very slow to modify to on-the-fly (using a loop like for dense matrix) # way faster to construct in one go # (DO NOT DELETE) # for illustrating the concept # this is the way to go if using regular matrix (memory-intensive) # same concept implemented using sparse matrix # mtx_cell_VJL <- matrix(0, nrow=nrow(data), ncol=length(exp_uniq)) # colnames(mtx_cell_VJL) <- exp_uniq # # mtx_adj <- matrix(0, nrow=length(exp_uniq), ncol=length(exp_uniq)) # rownames(mtx_adj) <- exp_uniq # colnames(mtx_adj) <- exp_uniq # # outdated: # for (i_cell in 1:length(exp_lst)) { # #if (i_cell %% 1000 == 0) { cat(i_cell, "\n") } # cur_uniq <- unique(exp_lst[[i_cell]]) # mtx_cell_VJL[i_cell, cur_uniq] <- 1 # mtx_adj[cur_uniq, cur_uniq] <- 1 # } # actual implementation using sparse matrix from Matrix package ### matrix indicating relationship between cell and VJ(L) combinations # row: cell # col: unique heavy VJ(L) (and light VJ(L)) # row indices m1_i <- lapply(1:length(exp_lst_uniq), function(i){ rep(exp_lst_uniq_full_idx[[i]], each=length(exp_lst_uniq[[i]])) }) m1_i_v <- unlist(m1_i, use.names=FALSE) # column indices m1_j <- lapply(1:length(exp_lst_uniq), function(i){ # wrt exp_uniq idx <- match(exp_lst_uniq[[i]], exp_uniq) #stopifnot( all.equal( exp_uniq[idx], exp_lst_uniq[[i]] ) ) rep.int(idx, length(exp_lst_uniq_full_idx[[i]])) }) m1_j_v <- unlist(m1_j, use.names=FALSE) stopifnot( length(m1_i_v) == length(m1_j_v) ) # no particular need for this to be not of class "nsparseMatrix" # so no need to specify x=rep(1, length(m1_i)) # not specifying makes it even more space-efficient mtx_cell_VJL <- Matrix::sparseMatrix(i=m1_i_v, j=m1_j_v, dims=c(n_cells_or_seqs, length(exp_uniq)), symmetric=F, triangular=F, index1=T, dimnames=list(NULL, exp_uniq)) ### adjacency matrix # row and col: unique heavy VJ(L) (and light VJ(L)) # row indices m2_i <- lapply(1:length(exp_lst_uniq), function(i){ # wrt exp_uniq idx <- match(exp_lst_uniq[[i]], exp_uniq) #stopifnot( all.equal( exp_uniq[idx], exp_lst_uniq[[i]] ) ) rep(idx, each=length(exp_lst_uniq[[i]])) }) m2_i_v <- unlist(m2_i, use.names=FALSE) # col indices m2_j <- lapply(1:length(exp_lst_uniq), function(i){ # wrt exp_uniq idx <- match(exp_lst_uniq[[i]], exp_uniq) #stopifnot( all.equal( exp_uniq[idx], exp_lst_uniq[[i]] ) ) rep.int(idx, length(exp_lst_uniq[[i]])) }) m2_j_v <- unlist(m2_j, use.names=FALSE) stopifnot( length(m2_i_v) == length(m2_j_v) ) # important: x must be specified for mtx_adj in order to make it not of class "nsparseMatrix" # this is because igraph accepts sparse matrix from Matrix but not the "pattern" matrices variant mtx_adj <- Matrix::sparseMatrix(i=m2_i_v, j=m2_j_v, x=rep(1,length(m2_i_v)), dims=c(length(exp_uniq), length(exp_uniq)), symmetric=F, triangular=F, index1=T, dimnames=list(exp_uniq, exp_uniq)) rm(m1_i, m1_j, m2_i, m2_j, m1_i_v, m1_j_v, m2_i_v, m2_j_v, exp_lst) ### identify connected components based on adjcencey matrix # this is the grouping # source: https://stackoverflow.com/questions/35772846/obtaining-connected-components-in-r g <- igraph::graph_from_adjacency_matrix(adjmatrix=mtx_adj, mode="undirected", diag=FALSE) #plot(g, vertex.size=10, vertex.label.cex=1, vertex.color="skyblue", vertex.label.color="black", vertex.frame.color="transparent", edge.arrow.mode=0) connected <- igraph::components(g) VJL_groups <- igraph::groups(connected) names(VJL_groups) <- paste0("G", 1:length(VJL_groups)) ### identify cells associated with each connected component (grouping) # each entry corresponds to a group/partition # each element within an entry is a cell cellIdx_byGroup_lst <- lapply(VJL_groups, function(x){ if (length(x)>1) { # matrix # important to specify rowSums from Matrix package # base::rowSums will NOT work cell_idx <- which(Matrix::rowSums(mtx_cell_VJL[, x, drop=F ])>0) } else { # vector cell_idx <- which(mtx_cell_VJL[, x]>0) } return(cell_idx) }) # sanity check: there should be perfect/disjoint partitioning # (each cell has exactly one group assignment) stopifnot( n_cells_or_seqs == length(unique(unlist(cellIdx_byGroup_lst, use.names=FALSE))) ) # assign data$vj_group <- NA for (i in 1:length(cellIdx_byGroup_lst)) { data[["vj_group"]][cellIdx_byGroup_lst[[i]]] <- names(VJL_groups)[i] } stopifnot(!any(is.na(data[["vj_group"]]))) if (!single_cell) { return(data) } else { data_orig$vj_group <- NA # map back to data_orig for (i_cell in 1:nrow(data)) { # wrt data_orig i_orig_h <- cell_seq_idx[[i_cell]][["heavy"]] i_orig_l <- cell_seq_idx[[i_cell]][["light"]] # sanity check stopifnot( all( data_orig[[cell_id]][c(i_orig_h, i_orig_l)] == cell_id_uniq[i_cell] ) ) # grouping data_orig$vj_group[c(i_orig_h, i_orig_l)] <- data$vj_group[i_cell] } # remove rows with $vj_group values of NA # these had already been removed by the NA check for `data` data_orig <- data_orig[!is.na(data_orig$vj_group), ] return(data_orig) } } #' Sort V(D)J genes #' #' \code{sortGenes} sorts a vector of V(D)J gene names by either lexicographic ordering #' or locus position. #' #' @param genes vector of strings respresenting V(D)J gene names. #' @param method string defining the method to use for sorting genes. One of: #' \itemize{ #' \item \code{"name"}: sort in lexicographic order. Order is by #' family first, then gene, and then allele. #' \item \code{"position"}: sort by position in the locus, as #' determined by the final two numbers #' in the gene name. Non-localized genes #' are assigned to the highest positions. #' } #' #' @return A sorted character vector of gene names. #' #' @seealso See \code{getAllele}, \code{getGene} and \code{getFamily} for parsing #' gene names. #' #' @examples #' # Create a list of allele names #' genes <- c("IGHV1-69D*01","IGHV1-69*01","IGHV4-38-2*01","IGHV1-69-2*01", #' "IGHV2-5*01","IGHV1-NL1*01", "IGHV1-2*01,IGHV1-2*05", #' "IGHV1-2", "IGHV1-2*02", "IGHV1-69*02") #' #' # Sort genes by name #' sortGenes(genes) #' #' # Sort genes by position in the locus #' sortGenes(genes, method="pos") #' #' @export sortGenes <- function(genes, method=c("name", "position")) { ## DEBUG # method="name" # Check arguments method <- match.arg(method) # Build sorting table sort_tab <- tibble(CALL=sort(getAllele(genes, first=FALSE, strip_d=FALSE))) %>% # Determine the gene and family mutate(FAMILY=getFamily(!!rlang::sym("CALL"), first=TRUE, strip_d=FALSE), GENE=getGene(!!rlang::sym("CALL"), first=TRUE, strip_d=FALSE), ALLELE=getAllele(!!rlang::sym("CALL"), first=TRUE, strip_d=FALSE)) %>% # Identify first gene number, second gene number and allele number mutate(G1=gsub("[^-]+-([^-\\*D]+).*", "\\1", !!rlang::sym("GENE")), G1=as.numeric(gsub("[^0-9]+", "99", !!rlang::sym("G1"))), G2=gsub("[^-]+-[^-]+-?", "", !!rlang::sym("GENE")), G2=as.numeric(gsub("[^0-9]+", "99", !!rlang::sym("G2"))), A1=as.numeric(sub("[^\\*]+\\*|[^\\*]+$", "", !!rlang::sym("ALLELE"))) ) # Convert missing values to 0 sort_tab[is.na(sort_tab)] <- 0 # Sort if (method == "name") { sorted_genes <- arrange(sort_tab, !!!rlang::syms(c("FAMILY", "G1", "G2", "A1")))[["CALL"]] } else if (method == "position") { sorted_genes <- arrange(sort_tab, desc(!!rlang::sym("G1")), desc(!!rlang::sym("G2")), !!rlang::sym("FAMILY"), !!rlang::sym("A1"))[["CALL"]] } return(sorted_genes) } alakazam/R/Lineage.R0000644000176200001440000015110414504655610013733 0ustar liggesusers# Ig lineage reconstruction via maximum parsimony #' @include Classes.R NULL #### Preprocessing functions #### #' Generate a ChangeoClone object for lineage construction #' #' \code{makeChangeoClone} takes a data.frame with AIRR or Change-O style columns as input and #' masks gap positions, masks ragged ends, removes duplicates sequences, and merges #' annotations associated with duplicate sequences. It returns a \code{ChangeoClone} #' object which serves as input for lineage reconstruction. #' #' @param data data.frame containing the AIRR or Change-O data for a clone. See Details #' for the list of required columns and their default values. #' @param id name of the column containing sequence identifiers. #' @param seq name of the column containing observed DNA sequences. All #' sequences in this column must be multiple aligned. #' @param germ name of the column containing germline DNA sequences. All entries #' in this column should be identical for any given clone, and they #' must be multiple aligned with the data in the \code{seq} column. #' @param v_call name of the column containing V-segment allele assignments. All #' entries in this column should be identical to the gene level. #' @param j_call name of the column containing J-segment allele assignments. All #' entries in this column should be identical to the gene level. #' @param junc_len name of the column containing the length of the junction as a #' numeric value. All entries in this column should be identical #' for any given clone. #' @param locus name of the column containing locus specification. Must be present #' and only contain the value "IGH", representing heavy chains. #' @param clone name of the column containing the identifier for the clone. All #' entries in this column should be identical. #' @param mask_char character to use for masking and padding. #' @param max_mask maximum number of characters to mask at the leading and trailing #' sequence ends. If \code{NULL} then the upper masking bound will #' be automatically determined from the maximum number of observed #' leading or trailing Ns amongst all sequences. If set to \code{0} #' (default) then masking will not be performed. #' @param pad_end if \code{TRUE} pad the end of each sequence with \code{mask_char} #' to make every sequence the same length. #' @param text_fields text annotation columns to retain and merge during duplicate removal. #' @param num_fields numeric annotation columns to retain and sum during duplicate removal. #' @param seq_fields sequence annotation columns to retain and collapse during duplicate #' removal. Note, this is distinct from the \code{seq} and \code{germ} #' arguments, which contain the primary sequence data for the clone #' and should not be repeated in this argument. #' @param add_count if \code{TRUE} add an additional annotation column called #' \code{collapse_count} during duplicate removal that indicates the #' number of sequences that were collapsed. #' @param verbose passed on to \code{collapseDuplicates}. If \code{TRUE}, report the #' numbers of input, discarded and output sequences; otherwise, process #' sequences silently. #' #' @return A \link{ChangeoClone} object containing the modified clone. #' #' @details #' The input data.frame (\code{data}) must columns for each of the required column name #' arguments: \code{id}, \code{seq}, \code{germ}, \code{v_call}, \code{j_call}, #' \code{junc_len}, and \code{clone}. The default values are as follows: #' \itemize{ #' \item \code{id = "sequence_id"}: unique sequence identifier. #' \item \code{seq = "sequence_alignment"}: IMGT-gapped sample sequence. #' \item \code{germ = "germline_alignment"}: IMGT-gapped germline sequence. #' \item \code{v_call = "v_call"}: V segment allele call. #' \item \code{j_call = "j_call"}: J segment allele call. #' \item \code{junc_len = "junction_length"}: junction sequence length. #' \item \code{clone = "clone_id"}: clone identifier. #' } #' Additional annotation columns specified in the \code{text_fields}, \code{num_fields} #' or \code{seq_fields} arguments will be retained in the \code{data} slot of the return #' object, but are not required. If the input data.frame \code{data} already contains a #' column named \code{sequence}, which is not used as the \code{seq} argument, then that #' column will not be retained. #' #' The default columns are IMGT-gapped sequence columns, but this is not a requirement. #' However, all sequences (both observed and germline) must be multiple aligned using #' some scheme for both proper duplicate removal and lineage reconstruction. #' #' The value for the germline sequence, V-segment gene call, J-segment gene call, #' junction length, and clone identifier are determined from the first entry in the #' \code{germ}, \code{v_call}, \code{j_call}, \code{junc_len} and \code{clone} columns, #' respectively. For any given clone, each value in these columns should be identical. #' #' @seealso Executes in order \link{maskSeqGaps}, \link{maskSeqEnds}, #' \link{padSeqEnds}, and \link{collapseDuplicates}. #' Returns a \link{ChangeoClone} object which serves as input to #' \link{buildPhylipLineage}. #' #' @examples #' # Example data #' db <- data.frame(sequence_id=LETTERS[1:4], #' sequence_alignment=c("CCCCTGGG", "CCCCTGGN", "NAACTGGN", "NNNCTGNN"), #' germline_alignment="CCCCAGGG", #' v_call="Homsap IGKV1-39*01 F", #' j_call="Homsap IGKJ5*01 F", #' junction_length=2, #' clone_id=1, #' locus=rep("IGH", length=4), #' c_call=c("IGHM", "IGHG", "IGHG", "IGHA"), #' duplicate_count=1:4, #' stringsAsFactors=FALSE) #' #' #' # Without end masking #' makeChangeoClone(db, text_fields="c_call", num_fields="duplicate_count") #' #' # With end masking #' makeChangeoClone(db, max_mask=3, text_fields="c_call", num_fields="duplicate_count") #' #' @export makeChangeoClone <- function(data, id="sequence_id", seq="sequence_alignment", germ="germline_alignment", v_call="v_call", j_call="j_call", junc_len="junction_length", clone="clone_id", mask_char="N", locus="locus", max_mask=0, pad_end=FALSE, text_fields=NULL, num_fields=NULL, seq_fields=NULL, add_count=TRUE, verbose=FALSE) { # Check for valid fields check <- checkColumns(data, c(id, seq, germ, v_call, j_call, junc_len, clone, text_fields, num_fields, seq_fields, locus)) if (check != TRUE) { stop(check) } if(sum(is.na(data[[locus]])) > 0){ stop(paste("Missing values found in",locus,"column")) } if(sum(data[[locus]] != "IGH") > 0){ stop(paste("Only heavy chain (IGH) allowed in",locus,"column.", "Heavy+light chain trees only supported in Dowser: https://dowser.readthedocs.io")) } # Replace gaps with Ns and masked ragged ends tmp_df <- data[, c(id, seq, text_fields, num_fields, seq_fields)] tmp_df[[seq]] <- maskSeqGaps(tmp_df[[seq]], mask_char=mask_char, outer_only=FALSE) tmp_df[[seq]] <- maskSeqEnds(tmp_df[[seq]], mask_char=mask_char, max_mask=max_mask, trim=FALSE) germline <- maskSeqGaps(data[[germ]][1], mask_char=mask_char, outer_only=FALSE) # Pad ends if (pad_end) { tmp_df[[seq]] <- padSeqEnds(tmp_df[[seq]], pad_char=mask_char) germline <- padSeqEnds(germline, pad_char=mask_char) } seq_len <- stringi::stri_length(tmp_df[[seq]]) if (any(seq_len != seq_len[1])) { len_message <- paste0("All sequences are not the same length for data with first ", id, " = ", tmp_df[[id]][1], ".") if (!pad_end) { len_message <- paste(len_message, "Consider specifying pad_end=TRUE and verify the multiple alignment.") } else { len_message <- paste(len_message, "Verify that all sequences are properly multiple-aligned.") } stop(len_message) } # Remove duplicates tmp_df <- collapseDuplicates(tmp_df, id=id, seq=seq, text_fields=text_fields, num_fields=num_fields, seq_fields=seq_fields, add_count=add_count, verbose=verbose) # Define return object tmp_names <- names(tmp_df) if ("sequence" %in% tmp_names & seq != "sequence") { tmp_df <- tmp_df[, tmp_names != "sequence"] tmp_names <- names(tmp_df) } names(tmp_df)[tmp_names == seq] <- "sequence" names(tmp_df)[tmp_names == id] <- "sequence_id" if (length(unique(data[[junc_len]]))>1) { message("Junctions of multiple lengths found. `ChangeoClone` will use the length of the first one in slot `junc_len`.") } clone <- new("ChangeoClone", data=as.data.frame(tmp_df), clone=as.character(data[[clone]][1]), germline=germline, v_gene=getGene(data[[v_call]][1]), j_gene=getGene(data[[j_call]][1]), junc_len=data[[junc_len]][1]) return(clone) } #### PHYLIP functions #### # Create PHYLIP input files in a temporary folder # # @param clone a ChangeoClone object # @param path a directory to store the write the output files to # @return a named vector translating sequence_id (names) to PHYLIP taxa (values) writePhylipInput <- function(clone, path) { # Define PHYLIP columns nseq <- nrow(clone@data) v1 <- c(sprintf('%-9s', nseq + 1), sprintf("%-9s", "Germline"), sprintf("SAM%-6s", 1:nseq)) v2 <- c(stringi::stri_length(clone@germline), clone@germline, clone@data[["sequence"]]) phy_df <- data.frame(v1, v2, stringsAsFactors=F) # Define names vector mapping taxa names to original sequence identifiers id_map <- setNames(gsub("^\\s+|\\s+$", "", v1[-(1:2)]), clone@data[["sequence_id"]]) # Create PHYLIP input file infile <- file.path(path, "infile") if (.Platform$OS.type == "windows") { infile <- gsub("/","\\\\",infile) } write.table(phy_df, file=infile, quote=F, sep=" ", col.names=F, row.names=F) return(id_map) } # Run PHYLIP dnapars or dnaml application # # @param path temporary directory containing infile. # @param phylip_exec path to dnapars or dnaml executable. # @param verbose if TRUE suppress phylip console output. # @param onetree if TRUE save only one tree # @return TRUE if phylip ran successfully and FALSE otherwise runPhylip <- function(path, phylip_exec, verbose=FALSE, onetree=FALSE) { # Expand shell variables phylip_exec <- path.expand(phylip_exec) # Remove old files outfile <- file.path(path, "outfile") outtree <- file.path(path, "outtree") if (.Platform$OS.type == "windows") { outfile <- gsub("/","\\\\",outfile) outtree <- gsub("/","\\\\",outtree) } if (file.exists(outfile)) { file.remove(outfile) } if (file.exists(outtree)) { file.remove(outtree) } # Set platform specific options if (.Platform$OS.type == "windows") { quiet_params <- list(stdout=FALSE, stderr=FALSE) invoke <- system2 } else { quiet_params <- list(stdout=FALSE, stderr=FALSE) invoke <- system2 } # Set dnapars or dnaml options if ( grepl("dnaml$",phylip_exec) | grepl("dnaml\\.exe$",phylip_exec)){ phy_options <- c("I", "5") }else if (grepl("dnapars$",phylip_exec) | grepl("dnapars\\.exe$",phylip_exec)) { phy_options <- c("S", "Y", "I", "4", "5", ".") }else{ stop("Executable not recognized! Must end with dnapars or dnaml") } if (onetree) { phy_options <- c(phy_options, "V", "1") } params <- list(phylip_exec, input=c(phy_options, "Y"), wait=TRUE) if (!verbose) { params <- append(params, quiet_params) } # Call phylip wd <- getwd() setwd(path) status <- tryCatch(do.call(invoke, params), error=function(e) e) setwd(wd) # Return TRUE if phylip ran successfully invisible(status == 0) } # Reads in the PHYLIP outfile # # @param path the temporary folder containing the dnapars outfile # @return a character vector with each item as a line in the outfile readPhylipOutput <- function(path) { outfile <- file.path(path, "outfile") if (.Platform$OS.type == "windows") { outfile <- gsub("/","\\\\",outfile) } phylip_out <- scan(outfile, what="character", sep="\n", blank.lines.skip=FALSE, strip.white=FALSE, quiet=TRUE) return(phylip_out) } # Test for successful PHYLIP dnapars run by checking the outfile # # @param phylip_out a character vector returned by readPhylipOut # @return TRUE if trees built # FALSE if no trees built checkPhylipOutput <- function(phylip_out) { # Check for failed tree build result <- !(any(grepl('-1 trees in all found', phylip_out))) return(result) } # Extracts inferred sequences from PHYLIP dnapars or dnaml outfile # # @param phylip_out a character vector returned by readPhylipOutput # @return a list containing an id vector, a sequence vector and an annotation data.frame getPhylipInferred <- function(phylip_out) { # Process dnapars and dnaml output pars_starts = grep("From\\s+To\\s+Any Steps\\?\\s+State at upper node", phylip_out, perl=T, fixed=F) ml_start = grep("node\\s+Reconstructed sequence", phylip_out, perl=T, fixed=F) if(length(pars_starts) > 0){ seq_start <- min(pars_starts) seq_empty <- grep("^\\s*$", phylip_out[seq_start:length(phylip_out)], perl=T, fixed=F) seq_len <- seq_empty[min(which(seq_empty[-1] == (seq_empty[-length(seq_empty)] + 1)))] seq_block <- paste(phylip_out[(seq_start + 2):(seq_start + seq_len - 2)], collapse="\n") tc <- textConnection(seq_block) seq_df <- read.table(tc, as.is=T, fill=T, blank.lines.skip=F) close(tc) # Correct first line of block and remove blank rows fix.row <- c(1, which(is.na(seq_df[,1])) + 1) end_col <- ncol(seq_df) - 2 seq_df[fix.row, ] <- data.frame(cbind(0, seq_df[fix.row, 1], "no", seq_df[fix.row, 2:end_col]), stringsAsFactors=F) if (length(fix.row)>1) { seq_df <- seq_df[-(fix.row[-1] - 1), ] } # Create data.frame of inferred sequences inferred_num <- unique(grep("^[0-9]+$", seq_df[, 2], value=T)) inferred_seq <- sapply(inferred_num, function(n) { paste(t(as.matrix(seq_df[seq_df[, 2] == n, -c(1:3)])), collapse="") }) }else if(length(ml_start) > 0){ seq_start <- min(ml_start) seq_empty <- grep("^\\s*$", phylip_out[seq_start:length(phylip_out)], perl=T, fixed=F) seq_len <- max(seq_empty) seq_block <- paste(phylip_out[(seq_start + 2):(seq_start + seq_len - 2)], collapse="\n") tc <- textConnection(seq_block) seq_df <- read.table(tc, as.is=T, fill=T, blank.lines.skip=F) close(tc) # Correct first line of block and remove blank rows fix.row <- c(which(seq_df[,1]=="")) if (length(fix.row)>1) { seq_df <- seq_df[-(fix.row), ] } # Create data.frame of inferred sequences inferred_num <- unique(grep("^[0-9]+$", seq_df[, 1], value=T)) inferred_seq <- sapply(inferred_num, function(n) { paste(t(as.matrix(seq_df[seq_df[, 1] == n, -1])), collapse="") }) inferred_seq = toupper(inferred_seq) }else{ stop("Input file format not recognized") } if (length(inferred_num)>0) { return(data.frame(sequence_id=paste0("Inferred", inferred_num), sequence=inferred_seq, stringsAsFactors = FALSE)) } data.frame(sequence_id=c(), sequence=c(), stringsAsFactors = FALSE) } # Extracts graph edge list from a PHYLIP dnapars or dnaml outfile # # @param phylip_out character vector returned by readPhylipOutput # @param id_map named vector of PHYLIP taxa names (values) to sequence # identifiers (names) that will be translated. If NULL # no taxa name translation is performed # @return a data.frame of edges with columns (from, to, weight) getPhylipEdges <- function(phylip_out, id_map=NULL) { pars_start = grep('between\\s+and\\s+length', phylip_out, perl=TRUE, fixed=FALSE) ml_start = grep('Between\\s+And\\s+Length', phylip_out, perl=TRUE, fixed=FALSE) if(length(pars_start) > 0){ # Process dnapars output edge_start <- min(pars_start) edge_len <- min(grep('^\\s*$', phylip_out[edge_start:length(phylip_out)], perl=TRUE, fixed=FALSE)) edge_block <- paste(phylip_out[(edge_start + 2):(edge_start + edge_len - 2)], collapse='\n') tc <- textConnection(edge_block) edge_df <- read.table(tc, col.names=c('from', 'to', 'weight'), as.is=TRUE) close(tc) }else if(length(ml_start) > 0){ edge_start <- min(ml_start)+3 edge_len <- min(grep('^\\s*$', phylip_out[edge_start:length(phylip_out)], perl=TRUE, fixed=FALSE)) block = phylip_out[(edge_start + 0):(edge_start + edge_len - 2)] block = unlist(lapply(strsplit(block,split="\\s+"),function(x){ paste(x[1:(min(which(x == "("))-1)],collapse=" ") })) edge_block <- paste(block, collapse='\n') tc <- textConnection(edge_block) edge_df <- read.table(tc, col.names=c('from', 'to', 'weight'), as.is=TRUE) close(tc) } # Modify inferred taxa names to include "Inferred" inf_map <- unique(grep("^[0-9]+$", c(edge_df$from, edge_df$to), value=T)) names(inf_map) <- paste0("Inferred", inf_map) edge_df$from <- translateStrings(edge_df$from, inf_map) edge_df$to <- translateStrings(edge_df$to, inf_map) if (!is.null(id_map)) { # Reassign PHYLIP taxa names to sequence IDs edge_df$from <- translateStrings(edge_df$from, id_map) edge_df$to <- translateStrings(edge_df$to, id_map) } return(edge_df) } # Modify edges of phylip output # # @param edges data.frame of edges returned by getPhylipEdges # @param clone a ChangeoClone object containg sequence data # @param dist_mat DNA character distance matrix # @return a list of modified edges data.frame and clone object modifyPhylipEdges <- function(edges, clone, dist_mat=getDNAMatrix(gap=0)) { # Move germline to root position germ_idx <- which(edges$to == "Germline") edges[germ_idx, c('from', 'to')] <- edges[germ_idx, c('to', 'from')] # Calculate edge mutations for (i in 1:nrow(edges)) { if (edges$from[i] == "Germline") { seq1 <- clone@germline } else { seq1 <- clone@data[["sequence"]][clone@data[["sequence_id"]] == edges$from[i]] } seq2 <- clone@data[["sequence"]][clone@data[["sequence_id"]] == edges$to[i]] edges$weight[i] <- seqDist(seq1, seq2, dist_mat) } # Find rows zero weight edges with inferred parent nodes remove_row <- which(edges$weight == 0 & edges$from != "Germline" & grepl('^Inferred\\d+$', edges$from)) # Replace inferred parent nodes with child nodes when edge weight is zero while (length(remove_row) > 0) { # Remove first node with zero distance to parent r <- remove_row[1] r_idx <- which(edges[c('from', 'to')] == edges$from[r], arr.ind=T) edges[r_idx] <- edges$to[r] # Recalculate edge weights for modified rows r_mod <- r_idx[, 1][r_idx[, 1] != r] for (i in r_mod) { if (edges$from[i] == "Germline") { seq1 <- clone@germline } else { seq1 <- clone@data[["sequence"]][clone@data[["sequence_id"]] == edges$from[i]] } seq2 <- clone@data[["sequence"]][clone@data[["sequence_id"]] == edges$to[i]] edges$weight[i] <- seqDist(seq1, seq2, dist_mat) } # Remove row edges <- edges[-r, ] # Re-determine rows to remove remove_row <- which(edges$weight == 0 & edges$from != "Germline" & grepl('^Inferred\\d+$', edges$from)) } # Remove rows from clone keep_clone <- clone@data[["sequence_id"]] %in% unique(c(edges$from, edges$to)) clone@data <- as.data.frame(clone@data[keep_clone, ]) return(list(edges=edges, clone=clone)) } # Convert edge data.frame and clone object to igraph graph object # # @param edges data.frame of edges returned by getPhylipEdges # @param clone a ChangeoClone object containg sequence data # @return an igraph graph object phylipToGraph <- function(edges, clone) { # Create igraph object g <- igraph::graph_from_data_frame(edges, directed=T) # Add germline sequence germ_idx <- which(igraph::V(g)$name == "Germline") g <- igraph::set_vertex_attr(g, "sequence", index=germ_idx, clone@germline) # Add sample sequences and names clone_idx <- match(clone@data[["sequence_id"]], igraph::V(g)$name) g <- igraph::set_vertex_attr(g, "sequence", index=clone_idx, clone@data[["sequence"]]) # Add annotations ann_fields <- names(clone@data)[!(names(clone@data) %in% c("sequence_id", "sequence"))] for (n in ann_fields) { g <- igraph::set_vertex_attr(g, n, index=germ_idx, NA) g <- igraph::set_vertex_attr(g, n, index=clone_idx, clone@data[[n]]) } # Add edge and vertex labels igraph::V(g)$label <- igraph::V(g)$name igraph::E(g)$label <- igraph::E(g)$weight # Add graph attributes g$clone <- clone@clone g$v_gene <- clone@v_gene g$j_gene <- clone@j_gene g$junc_len <- clone@junc_len return(g) } #' Infer an Ig lineage using PHYLIP #' #' \code{buildPhylipLineage} reconstructs an Ig lineage via maximum parsimony using the #' dnapars application, or maximum liklihood using the dnaml application of the PHYLIP package. #' #' @param clone \link{ChangeoClone} object containing clone data. #' @param phylip_exec absolute path to the PHYLIP dnapars executable. #' @param dist_mat character distance matrix to use for reassigning edge weights. #' Defaults to a Hamming distance matrix returned by \link{getDNAMatrix} #' with \code{gap=0}. If gap characters, \code{c("-", ".")}, are assigned #' a value of -1 in \code{dist_mat} then contiguous gaps of any run length, #' which are not present in both sequences, will be counted as a #' distance of 1. Meaning, indels of any length will increase #' the sequence distance by 1. Gap values other than -1 will #' return a distance that does not consider indels as a special case. #' @param rm_temp if \code{TRUE} delete the temporary directory after running dnapars; #' if \code{FALSE} keep the temporary directory. #' @param verbose if \code{FALSE} suppress the output of dnapars; #' if \code{TRUE} STDOUT and STDERR of dnapars will be passed to #' the console. #' @param branch_length specifies how to define branch lengths; one of \code{"mutations"} #' or \code{"distance"}. If set to \code{"mutations"} (default), then branch #' lengths represent the number of mutations between nodes. #' If set to \code{"distance"}, then branch lengths represent #' the expected number of mutations per site, unaltered from PHYLIP output. #' @param temp_path specific path to temp directory if desired. #' @param onetree if \code{TRUE} save only one tree. #' #' @return An igraph \code{graph} object defining the Ig lineage tree. Each unique input #' sequence in \code{clone} is a vertex of the tree, with additional vertices being #' either the germline (root) sequences or inferred intermediates. The \code{graph} #' object has the following attributes. #' #' Vertex attributes: #' \itemize{ #' \item \code{name}: value in the \code{sequence_id} column of the \code{data} #' slot of the input \code{clone} for observed sequences. #' The germline (root) vertex is assigned the name #' "Germline" and inferred intermediates are assigned #' names with the format {"Inferred1", "Inferred2", ...}. #' \item \code{sequence}: value in the \code{sequence} column of the \code{data} #' slot of the input \code{clone} for observed sequences. #' The germline (root) vertex is assigned the sequence #' in the \code{germline} slot of the input \code{clone}. #' The sequence of inferred intermediates are extracted #' from the dnapars output. #' \item \code{label}: same as the \code{name} attribute. #' } #' Additionally, each other column in the \code{data} slot of the input #' \code{clone} is added as a vertex attribute with the attribute name set to #' the source column name. For the germline and inferred intermediate vertices, #' these additional vertex attributes are all assigned a value of \code{NA}. #' #' Edge attributes: #' \itemize{ #' \item \code{weight}: Hamming distance between the \code{sequence} attributes #' of the two vertices. #' \item \code{label}: same as the \code{weight} attribute. #' } #' Graph attributes: #' \itemize{ #' \item \code{clone}: clone identifier from the \code{clone} slot of the #' input \code{ChangeoClone}. #' \item \code{v_gene}: V-segment gene call from the \code{v_gene} slot of #' the input \code{ChangeoClone}. #' \item \code{j_gene}: J-segment gene call from the \code{j_gene} slot of #' the input \code{ChangeoClone}. #' \item \code{junc_len}: junction length (nucleotide count) from the #' \code{junc_len} slot of the input \code{ChangeoClone}. #' #' Alternatively, this function will return an \code{phylo} object, which is compatible #' with the ape package. This object will contain reconstructed ancestral sequences in #' \code{nodes} attribute. #' } #' #' @details #' \code{buildPhylipLineage} builds the lineage tree of a set of unique Ig sequences via #' maximum parsimony through an external call to the dnapars application of the PHYLIP #' package. dnapars is called with default algorithm options, except for the search option, #' which is set to "Rearrange on one best tree". The germline sequence of the clone is used #' for the outgroup. #' #' Following tree construction using dnapars, the dnapars output is modified to allow #' input sequences to appear as internal nodes of the tree. Intermediate sequences #' inferred by dnapars are replaced by children within the tree having a Hamming distance #' of zero from their parent node. With the default \code{dist_mat}, the distance calculation #' allows IUPAC ambiguous character matches, where an ambiguous character has distance zero #' to any character in the set of characters it represents. Distance calculation and movement of #' child nodes up the tree is repeated until all parent-child pairs have a distance greater than zero #' between them. The germline sequence (outgroup) is moved to the root of the tree and #' excluded from the node replacement processes, which permits the trunk of the tree to be #' the only edge with a distance of zero. Edge weights of the resultant tree are assigned #' as the distance between each sequence. #' #' @references #' \enumerate{ #' \item Felsenstein J. PHYLIP - Phylogeny Inference Package (Version 3.2). #' Cladistics. 1989 5:164-166. #' \item Stern JNH, Yaari G, Vander Heiden JA, et al. B cells populating the multiple #' sclerosis brain mature in the draining cervical lymph nodes. #' Sci Transl Med. 2014 6(248):248ra107. #' } #' #' @seealso Takes as input a \link{ChangeoClone}. #' Temporary directories are created with \link{makeTempDir}. #' Distance is calculated using \link{seqDist}. #' See [igraph](http://www.rdocumentation.org/packages/igraph/topics/aaa-igraph-package) #' and [igraph.plotting](http://www.rdocumentation.org/packages/igraph/topics/plot.common) #' for working with igraph \code{graph} objects. #' #' @examples #' \dontrun{ #' # Preprocess clone #' db <- subset(ExampleDb, clone_id == 3138) #' clone <- makeChangeoClone(db, text_fields=c("sample_id", "c_call"), #' num_fields="duplicate_count") #' #' # Run PHYLIP and process output #' phylip_exec <- "~/apps/phylip-3.695/bin/dnapars" #' graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) #' #' # Plot graph with a tree layout #' library(igraph) #' plot(graph, layout=layout_as_tree, vertex.label=V(graph)$c_call, #' vertex.size=50, edge.arrow.mode=0, vertex.color="grey80") #' #' # To consider each indel event as a mutation, change the masking character #' # and distance matrix #' clone <- makeChangeoClone(db, text_fields=c("sample_id", "c_call"), #' num_fields="duplicate_count", mask_char="-") #' graph <- buildPhylipLineage(clone, phylip_exec, dist_mat=getDNAMatrix(gap=-1), #' rm_temp=TRUE) #' } #' #' @export buildPhylipLineage <- function(clone, phylip_exec, dist_mat=getDNAMatrix(gap=0), rm_temp=FALSE, verbose=FALSE, temp_path=NULL, onetree=FALSE, branch_length=c("mutations", "distance")) { # Check clone size if (nrow(clone@data) < 2) { warning("Clone ", clone@clone, " was skipped as it does not contain at least 2 unique sequences") return(NULL) } # determine branch length type branch_length <- match.arg(branch_length) # Check fields seq_len <- unique(stringi::stri_length(clone@data[["sequence"]])) germ_len <- ifelse(length(clone@germline) == 0, 0, stringi::stri_length(clone@germline)) if(germ_len == 0) { stop("Clone ", clone@clone, "does not contain a germline sequence.") } if(length(seq_len) != 1) { stop("Clone ", clone@clone, "does not contain sequences of equal length.") } if(seq_len != germ_len) { stop("The germline and input sequences are not the same length for clone ", clone@clone) } # Check dnapars access if (file.access(phylip_exec, mode=1) == -1) { stop("The file ", phylip_exec, " cannot be executed.") } # Create temporary directory if(is.null(temp_path)){ temp_path <- makeTempDir(paste0(clone@clone, "-phylip")) }else{ if(!dir.exists(temp_path)){ dir.create(temp_path) } } if (verbose) { cat("TEMP_DIR> ", temp_path, "\n", sep="") } # Run PHYLIP id_map <- writePhylipInput(clone, temp_path) runPhylip(temp_path, phylip_exec, verbose=verbose, onetree=onetree) phylip_out <- readPhylipOutput(temp_path) # Remove temporary directory if (rm_temp) { unlink(temp_path, recursive=TRUE) } # Check output for trees if (!checkPhylipOutput(phylip_out)) { warning('PHYLIP failed to generate trees for clone ', clone) return(NULL) } # Extract inferred sequences from PHYLIP output inf_df <- getPhylipInferred(phylip_out) # Extract edge table from PHYLIP output edges <- getPhylipEdges(phylip_out, id_map=id_map) clone@data <- as.data.frame(dplyr::bind_rows(clone@data, inf_df)) # Convert edges and clone data to igraph graph object if( branch_length == "mutations" ){ mod_list <- modifyPhylipEdges(edges, clone, dist_mat=dist_mat) graph <- phylipToGraph(mod_list$edges, mod_list$clone) }else{ # or just keep everything the same germ_idx <- which(edges$to == "Germline") edges[germ_idx, c('from', 'to')] <- edges[germ_idx, c('to', 'from')] graph <- phylipToGraph(edges, clone) } return(graph) } #' Convert a tree in ape \code{phylo} format to igraph \code{graph} format. #' #' \code{phyloToGraph} converts a tree in \code{phylo} format to and #' \code{graph} format. #' #' @param phylo An ape \code{phylo} object. #' @param germline If specified, places specified tip sequence as the direct #' ancestor of the tree #' #' @return A \code{graph} object representing the input tree. #' #' @details #' Convert from phylo to graph object. Uses the node.label vector to label internal nodes. Nodes #' may rotate but overall topology will remain constant. #' #' @references #' \enumerate{ #' \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody #' Lineages. Genetics 2017 206(1):417-427 #' https://doi.org/10.1534/genetics.116.196303 #' \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - #' Repertoire-wide phylogenetic models of B cell molecular evolution reveal #' evolutionary signatures of aging and vaccination. bioRxiv 2019 #' https://doi.org/10.1101/558825 #' } #' #' @examples #' \dontrun{ #' library(igraph) #' library(ape) #' #' #convert to phylo #' phylo = graphToPhylo(graph) #' #' #plot tree using ape #' plot(phylo,show.node.label=TRUE) #' #' #store as newick tree #' write.tree(phylo,file="tree.newick") #' #' #read in tree from newick file #' phylo_r = read.tree("tree.newick") #' #' #convert to igraph #' graph_r = phyloToGraph(phylo_r,germline="Germline") #' #' #plot graph - same as before, possibly rotated #' plot(graph_r,layout=layout_as_tree) #' } #' #' @export phyloToGraph <- function(phylo, germline="Germline") { names <- 1:length(unique(c(phylo$edge[, 1],phylo$edge[, 2]))) for(i in 1:length(phylo$tip.label)){ names[i] <- phylo$tip.label[i] } if(!is.null(phylo$node.label)){ for(j in 1:length(phylo$node.label)){ i <- i + 1 names[i] <- phylo$node.label[j] } } d <- data.frame(cbind(phylo$edge,phylo$edge.length)) names(d)=c("from", "to", "weight") if(!is.null(phylo$nodes)){ seqs <- unlist(lapply(phylo$nodes,function(x)x$sequence)) names(seqs) <- lapply(phylo$nodes,function(x)x$id) } if(!is.null(germline)){ germnode <- which(phylo$tip.label == germline) phylo$uca <- phylo$edge[phylo$edge[,2] == germnode,1] if(sum(d$from == phylo$uca) == 2){ d[d$from == phylo$uca, ]$from <- germnode d <- d[!(d$from == germnode & d$to == germnode),] }else{ row <- which(d$from == phylo$uca & d$to == germnode) d[row,]$to <- phylo$uca d[row,]$from <- germnode } } d$to <- as.character(d$to) d$from <- as.character(d$from) g <- igraph::graph_from_data_frame(d) igraph::V(g)$name <- names[as.numeric(igraph::V(g)$name)] igraph::E(g)$label <- igraph::E(g)$weight if(!is.null(phylo$nodes)){ igraph::V(g)$sequence <- seqs[igraph::V(g)$name] } return(g) } #' Convert a tree in igraph \code{graph} format to ape \code{phylo} format. #' #' \code{graphToPhylo} a tree in igraph \code{graph} format to ape \code{phylo} #' format. #' #' @param graph An igraph \code{graph} object. #' #' @return A \code{phylo} object representing the input tree. Tip and internal node names are #' stored in the \code{tip.label} and \code{node.label} vectors, respectively. #' #' @details #' Convert from igraph \code{graph} object to ape \code{phylo} object. If \code{graph} object #' was previously rooted with the germline as the direct ancestor, this will re-attach the #' germline as a descendant node with a zero branch length to a new universal common ancestor (UCA) #' node and store the germline node ID in the \code{germid} attribute and UCA node number in #' the \code{uca} attribute. Otherwise these attributes will not be specified in the \code{phylo} object. #' Using \code{phyloToGraph(phylo, germline=phylo$germid)} creates a \code{graph} object with the germline #' back as the direct ancestor. Tip and internal node names are #' stored in the \code{tip.label} and \code{node.label} vectors, respectively. #' #' @references #' \enumerate{ #' \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody #' Lineages. Genetics 2017 206(1):417-427 #' https://doi.org/10.1534/genetics.116.196303 #' \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - #' Repertoire-wide phylogenetic models of B cell molecular evolution reveal #' evolutionary signatures of aging and vaccination. bioRxiv 2019 #' https://doi.org/10.1101/558825 #' } #' #' @examples #' \dontrun{ #' library(igraph) #' library(ape) #' #' #convert to phylo #' phylo = graphToPhylo(graph) #' #' #plot tree using ape #' plot(phylo,show.node.label=TRUE) #' #' #store as newick tree #' write.tree(phylo,file="tree.newick") #' #' #read in tree from newick file #' phylo_r = read.tree("tree.newick") #' #' #convert to igraph #' graph_r = phyloToGraph(phylo_r,germline="Germline") #' #' #plot graph - same as before, possibly rotated #' plot(graph_r,layout=layout_as_tree) #' } #' #' @export graphToPhylo <- function(graph) { df <- igraph::as_data_frame(graph) node_counts <- table(c(df$to,df$from)) tips <- names(node_counts)[node_counts == 1] nodes <- names(node_counts)[node_counts > 1] attr <- igraph::vertex_attr(graph) seqs <- attr$sequence names(seqs) <- attr$name germline <- tips[tips %in% df$from] if(length(germline) > 0){ ucanode <- paste0(germline,"_UCA")#max(as.numeric(nodes))+1 nodes <- c(ucanode,nodes) df[df$from == germline,]$from <- ucanode row <- c(ucanode,germline,0.0, 0.0) names(row) <- c("from","to","weight", "label") df <- rbind(df, row) seqs <- c(seqs,seqs["Germline"]) names(seqs)[length(seqs)] = paste0(germline,"_UCA") } tipn <- 1:length(tips) names(tipn) <- tips noden <- (length(tips)+1):(length(tips)+length(nodes)) names(noden) <- nodes renumber <- c(tipn,noden) df$from <- as.numeric(renumber[df$from]) df$to <- as.numeric(renumber[df$to]) phylo <- list() phylo$edge <- matrix(cbind(df$from,df$to),ncol=2) phylo$edge.length <- as.numeric(df$weight) phylo$tip.label <- tips phylo$node.label <- nodes phylo$Nnode <- length(nodes) phylo$node.label <- nodes class(phylo) <- "phylo" nnodes <- length(renumber) phylo$nodes <- lapply(1:nnodes,function(x){ n <- list() n$id <- names(renumber[renumber == x]) n$sequence <- seqs[n$id] n }) phylo = ape::ladderize(phylo, right=FALSE) return(phylo) } # Reroot phylogenetic tree to have its germline sequence at a zero-length branch # to a node which is the direct ancestor of the tree's UCA. Assigns \code{uca} # to be the ancestral node to the tree's germline sequence, as \code{germid} as # the tree's germline sequence ID. # # @param tree An ape \code{phylo} object # @param germid ID of the tree's predicted germline sequence # @param resolve If \code{TRUE} reroots tree to specified germline sequnece. # usually not necessary with IgPhyML trees analyzed with HLP model. rerootGermline <- function(tree, germid, resolve=FALSE){ if(resolve) { tree <- ape::root(phy=tree, outgroup=germid, resolve.root=T, edge.label=TRUE) } tree <- ape::reorder.phylo(tree, "postorder") edges <- tree$edge rootnode <- which(tree$tip.label==germid) rootedge <- which(edges[, 2] == rootnode) rootanc <- edges[edges[, 2] == rootnode, 1] mrcaedge <- which(edges[, 1] == rootanc & edges[, 2] != rootnode) if(length(mrcaedge) > 1){ print("POLYTOMY AT ROOT!") quit(save="no", status=1, runLast=FALSE) } tree$edge.length[mrcaedge] <- tree$edge.length[mrcaedge] + tree$edge.length[rootedge] tree$edge.length[rootedge] <- 0 tree$uca <- rootanc tree$germid <- germid return(tree) } #' Read in output from IgPhyML #' #' \code{readIgphyml} reads output from the IgPhyML phylogenetics inference package for #' B cell repertoires #' #' @param file IgPhyML output file (.tab). #' @param id ID to assign to output object. #' @param format if \code{"graph"} return trees as igraph \code{graph} objects. #' if \code{"phylo"} return trees as ape \code{phylo} objects. #' @param branches if \code{"distance"} branch lengths are in expected mutations per #' site. If \code{"mutations"} branches are in expected mutations. #' @param collapse if \code{TRUE} transform branch lengths to units of substitutions, #' rather than substitutions per site, and collapse internal nodes #' separated by branches < 0.1 substitutions. Will also remove all #' internal node labels, as it makes them inconsistent. #' #' @return A list containing IgPhyML model parameters and estimated lineage trees. #' #' Object attributes: #' \itemize{ #' \item \code{param}: Data.frame of parameter estimates for each clonal #' lineage. Columns include: \code{CLONE}, which is the #' clone id; \code{NSEQ}, the total number of sequences in #' the lineage; \code{NSITE}, the number of codon sites; #' \code{TREE_LENGTH}, the sum of all branch lengths in #' the estimated lineage tree; and \code{LHOOD}, the log #' likelihood of the clone's sequences given the tree and #' parameters. Subsequent columns are parameter estimates #' from IgPhyML, which will depend on the model used. #' Parameter columns ending with \code{_MLE} are maximum #' likelihood estimates; those ending with \code{_LCI} are #' the lower 95%% confidence interval estimate; those ending #' with \code{_UCI} are the upper 95%% confidence interval #' estimate. The first line of \code{param} is for clone #' \code{REPERTOIRE}, #' which is a summary of all lineages within the repertoire. #' For this row, \code{NSEQ} is the total number of sequences, #' \code{NSITE} is the average number of sites, and #' \code{TREE_LENGTH} is the mean tree length. For most #' applications, parameter values will be the same for all #' lineages within the repertoire, so access them simply by: #' \code{$param$OMEGA_CDR_MLE[1]} to, for instance, #' get the estimate of dN/dS on the CDRs at the repertoire level. #' \item \code{trees}: List of tree objects estimated by IgPhyML. If #' \code{format="graph"} these are igraph \code{graph} objects. #' If \code{format="phylo"}, these are ape \code{phylo} objects. #' \item \code{command}: Command used to run IgPhyML. #' } #' #' @details #' \code{readIgphyml} reads output from the IgPhyML repertoire phylogenetics inference package. #' The resulting object is divded between parameter estimates (usually under the HLP19 model), #' which provide information about mutation and selection pressure operating on the sequences. #' #' Trees returned from this function are either igraph objects or phylo objects, and each may be #' visualized accordingly. Futher, branch lengths in tree may represent either the expected number of #' substitutions per site (codon, if estimated under HLP or GY94 models), or the total number of #' expected substitutions per site. If the latter, internal nodes - but not tips - separated by branch #' lengths less than 0.1 are collapsed to simplify viewing. #' #' @references #' \enumerate{ #' \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody #' Lineages. Genetics 2017 206(1):417-427 #' https://doi.org/10.1534/genetics.116.196303 #' \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - #' Repertoire-wide phylogenetic models of B cell molecular evolution reveal #' evolutionary signatures of aging and vaccination. bioRxiv 2019 #' https://doi.org/10.1101/558825 #' } #' #' @examples #' \dontrun{ #' # Read in and plot a tree from an igphyml run #' library(igraph) #' s1 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="+7d") #' print(s1$param$OMEGA_CDR_MLE[1]) #' plot(s1$trees[[1]], layout=layout_as_tree, edge.label=E(s1$trees[[1]])$weight) #' } #' #' @export readIgphyml <- function(file, id=NULL, format=c("graph", "phylo"), collapse=FALSE, branches=c("mutations","distance")) { # Check arguments format <- match.arg(format) branches <- match.arg(branches) out <- list() trees <- list() df <- read.table(file, sep="\t", header=TRUE, stringsAsFactors=FALSE) params <- df[, !names(df) %in% c("TREE")] names(params) = tolower(names(params)) out[["param"]] <- params out[["command"]] <- df[1, ]$TREE for (i in 2:nrow(df)) { tree <- ape::read.tree(text=df[i, ][["TREE"]]) germ_base <- paste0(df[["CLONE"]][i], "_GERM") germ_id <- tree$tip.label[grepl(germ_base,tree$tip.label)] if(length(germ_id) > 1){ stop("Can only be one tip of the form '_GERM'") } if(!ape::is.rooted(tree)){ warning(paste("Tree",germ_base,"is not rooted and should be!")) tree <- rerootGermline(tree,germ_id,resolve=TRUE) tree$node.label <- NULL } rtree <- ape::ladderize(tree) rtree$germid <- germ_id if (branches == "mutations") { rtree$edge.length <- round(rtree$edge.length*df[i, ]$NSITE, digits=1) } if (collapse) { rtree$node.label <- NULL if(branches == "mutations"){ rtree <- ape::di2multi(rtree, tol=0.1) }else{ rtree <- ape::di2multi(rtree, tol=0.0001) } } if (format == "graph") { ig <- phyloToGraph(rtree, germline=rtree$germid) trees[[df[["CLONE"]][i]]] <- ig } else if (format == "phylo") { trees[[df[["CLONE"]][i]]] <- rtree } else { stop("Format must be either 'graph' or 'phylo'.") } } out[["trees"]] <- trees if (!is.null(id)) { out$param$id <- id } return(out) } #' Combine IgPhyML object parameters into a dataframe #' #' \code{combineIgphyml} combines IgPhyML object parameters into a data.frame. #' #' @param iglist list of igphyml objects returned by \link{readIgphyml}. #' Each must have an \code{id} column in its \code{param} attribute, #' which can be added automatically using the \code{id} option of #' \code{readIgphyml}. #' @param format string specifying whether each column of the resulting data.frame #' should represent a parameter (\code{wide}) or if #' there should only be three columns; i.e. id, varable, and value #' (\code{long}). #' #' @return A data.frame containing HLP model parameter estimates for all igphyml objects. #' Only parameters shared among all objects will be returned. #' #' @details #' \code{combineIgphyml} combines repertoire-wide parameter estimates from mutliple igphyml #' objects produced by readIgphyml into a dataframe that can be easily used for plotting and #' other hypothesis testing analyses. #' #' All igphyml objects used must have an "id" column in their \code{param} attribute, which #' can be added automatically from the \code{id} flag of \code{readIgphyml}. #' #' @references #' \enumerate{ #' \item Hoehn KB, Lunter G, Pybus OG - A Phylogenetic Codon Substitution Model for Antibody #' Lineages. Genetics 2017 206(1):417-427 #' https://doi.org/10.1534/genetics.116.196303 #' \item Hoehn KB, Vander Heiden JA, Zhou JQ, Lunter G, Pybus OG, Kleinstein SHK - #' Repertoire-wide phylogenetic models of B cell molecular evolution reveal #' evolutionary signatures of aging and vaccination. bioRxiv 2019 #' https://doi.org/10.1101/558825 #' } #' #' @seealso \link{readIgphyml} #' #' @examples #' \dontrun{ #' # Read in and combine two igphyml runs #' s1 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="+7d") #' s2 <- readIgphyml("IB+7d_lineages_gy.tsv_igphyml_stats_hlp.tab", id="s2") #' combineIgphyml(list(s1, s2)) #' } #' #' @export combineIgphyml <- function(iglist, format=c("wide", "long")) { # Check arguments format <- match.arg(format) ordered_params <- c( "id", "nseq", "nsite", "lhood", "tree_length", "omega_fwr_mle", "omega_fwr_lci", "omega_fwr_uci", "omega_cdr_mle", "omega_cdr_lci", "omega_cdr_uci", "kappa_mle", "kappa_lci", "kappa_uci", "wrc_2_mle", "wrc_2_lci", "wrc_2_uci", "gyw_0_mle", "gyw_0_lci", "gyw_0_uci", "wa_1_mle", "wa_1_lci", "wa_1_uci", "tw_0_mle", "tw_0_lci", "tw_0_uci", "syc_2_mle", "syc_2_lci", "syc_2_uci", "grs_0_mle", "grs_0_lci", "grs_0_uci") paramCount <- table(unlist(lapply(iglist, function(x) names(x$param)))) params <- names(paramCount[paramCount == max(paramCount)]) params <- ordered_params[ordered_params %in% params] if (sum(params == "id") == 0) { message <- "id not specified in objects. Use 'id' flag in readIgphyml." stop(message) } repertoires <- lapply(iglist, function(x) x$param[1, params]) combined <- dplyr::bind_rows(repertoires) if (format == "long") { combined <- tidyr::gather(combined, "variable", "value", -!!rlang::sym("id")) combined$variable <- factor(combined$variable, levels=params) } return(combined) }alakazam/R/Fastq.R0000644000176200001440000005772314007007324013450 0ustar liggesusers#' Load sequencing quality scores from a FASTQ file #' #' \code{readFastqDb} adds the sequencing quality scores to a data.frame #' from a FASTQ file. Matching is done by `sequence_id`. #' #' @param data \code{data.frame} containing sequence data. #' @param fastq_file path to the fastq file #' @param quality_offset offset value to be used by ape::read.fastq. It is #' the value to be added to the quality scores #' (the default -33 applies to the Sanger format and #' should work for most recent FASTQ files). #' @param header FASTQ file header format; one of \code{"presto"} or #' \code{"asis"}. Use \code{"presto"} to specify #' that the fastq file headers are using the pRESTO #' format and can be parsed to extract #' the \code{sequence_id}. Use \code{"asis"} to skip #' any processing and use the sequence names as they are. #' @param sequence_id column in \code{data} that contains sequence #' identifiers to be matched to sequence identifiers in #' \code{fastq_file}. #' @param sequence column in \code{data} that contains sequence data. #' @param sequence_alignment column in \code{data} that contains IMGT aligned sequence data. #' @param v_cigar column in \code{data} that contains CIGAR #' strings for the V gene alignments. #' @param d_cigar column in \code{data} that contains CIGAR #' strings for the D gene alignments. #' @param j_cigar column in \code{data} that contains CIGAR #' strings for the J gene alignments. #' @param np1_length column in \code{data} that contains the number #' of nucleotides between the V gene and first D gene #' alignments or between the V gene and J gene alignments. #' @param np2_length column in \code{data} that contains the number #' of nucleotides between either the first D gene and J #' gene alignments or the first D gene and second D gene #' alignments. #' @param v_sequence_end column in \code{data} that contains the #' end position of the V gene in \code{sequence}. #' @param d_sequence_end column in \code{data} that contains the #' end position of the D gene in \code{sequence}. #' @param style how the sequencing quality should be returned; #' one of \code{"num"}, \code{"phred"}, or \code{"both"}. #' Specify \code{"num"} to store the quality scores as strings of #' comma separated numeric values. Use \code{"phred"} to have #' the function return the scores as Phred (ASCII) scores. #' Use \code{"both"} to retrieve both. #' @param quality_sequence specify \code{TRUE} to keep the quality scores for #' \code{sequence}. If false, only the quality score #' for \code{sequence_alignment} will be added to \code{data}. #' #' @return Modified \code{data} with additional fields: #' \enumerate{ #' \item \code{quality_alignment}: A character vector with ASCII Phred #' scores for \code{sequence_alignment}. #' \item \code{quality_alignment_num}: A character vector, with comma separated #' numerical quality values for each #' position in \code{sequence_alignment}. #' \item \code{quality}: A character vector with ASCII Phred #' scores for \code{sequence}. #' \item \code{quality_num}: A character vector, with comma separated #' numerical quality values for each #' position in \code{sequence}. #' } #' @seealso \link{maskPositionsByQuality} and \link{getPositionQuality} #' #' @examples #' db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) #' fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") #' db <- readFastqDb(db, fastq_file, quality_offset=-33) #' #' @export readFastqDb <- function(data, fastq_file, quality_offset=-33, header=c("presto", "asis"), sequence_id="sequence_id", sequence="sequence", sequence_alignment="sequence_alignment", v_cigar="v_cigar", d_cigar="d_cigar", j_cigar="j_cigar", np1_length="np1_length", np2_length="np2_length", v_sequence_end="v_sequence_end", d_sequence_end="d_sequence_end", style=c("num", "ascii", "both"), quality_sequence=FALSE) { check_cols <- c(sequence_id, sequence, sequence_alignment, v_cigar, d_cigar, j_cigar, np1_length, np2_length, v_sequence_end, d_sequence_end) alakazam::checkColumns(data, check_cols) style <- match.arg(style) # Process the fastq file header <- match.arg(header) fastq <- ape::read.fastq(fastq_file, offset=quality_offset) #default: -33 (pRESTO) fastq_db <- data.frame( "quality_num"=as.vector(sapply(attr(fastq, "QUAL"), paste0, collapse=",")), stringsAsFactors = F) fastq_db$quality <- sapply(fastq_db[["quality_num"]], function(qual, quality_offset) { paste0(sapply(strsplit(qual, ",")[[1]], function(x,quality_offset) { y <- as.numeric(x) - quality_offset rawToChar(as.raw(y)) },quality_offset), sep="",collapse="") }, quality_offset) fastq_db[[sequence_id]] <- attr(fastq, "names") if (header=="presto") { fastq_db[[sequence_id]] <- gsub("\\|.+","",attr(fastq, "names")) } # Merge by <- sequence_id names(by) <- sequence_id data <- data %>% left_join(fastq_db, by=by) data <- sequenceAlignmentQuality(data, sequence=sequence, sequence_id=sequence_id, sequence_alignment=sequence_alignment, quality="quality", quality_num="quality_num", v_cigar=v_cigar, d_cigar=d_cigar, j_cigar=j_cigar, np1_length=np1_length, np2_length=np2_length, v_sequence_end=v_sequence_end, d_sequence_end=d_sequence_end, raw=FALSE) if (!quality_sequence) { data[['quality']] <- NULL data[['quality_num']] <- NULL } if (style != "both") { if (style == "phred") { data[['quality_alignment_num']] <- NULL } else { data[['quality_alignment']] <- NULL } } data } # Thanks!: # https://drive5.com/usearch/manual/cigar.html & # https://jef.works/blog/2017/03/28/CIGAR-strings-for-dummies/ # M Match (alignment column containing two letters). This could contain two # letters (mismatch) or two identical letters. USEARCH generates CIGAR strings # containing Ms rather than X's and ='s (see below). # N Alignment gap Next x positions on ref don’t match (Deletion in query?) # D Deletion (gap in the target sequence). # I Insertion (gap in the query sequence). # S Segment of the query sequence that does not appear in the alignment. # This is used with soft clipping, where the full-length query sequence # is given (field 10 in the SAM record). In this case, S operations specify # segments at the start and/or end of the query that do not appear in a # local alignment. # H Segment of the query sequence that does not appear in the alignment. # This is used with hard clipping, where only the aligned segment of the # query sequences is given (field 10 in the SAM record). In this case, H # operations specify segments at the start and/or end of the query that # do not appear in the SAM record. # = Alignment column containing two identical letters. USEARCH can read # CIGAR strings using this operation, but does not generate them. # X Alignment column containing a mismatch, i.e. two different letters. # USEARCH can read CIGAR strings using this operation, but does not generate them. # Tested with IgBlast output, not with IMGT calcSequenceAlignmentQuality <- function(sequence_db, sequence="sequence", sequence_id="sequence_id", sequence_alignment="sequence_alignment", quality="quality", quality_num="quality_num", v_cigar="v_cigar", d_cigar="d_cigar", j_cigar="j_cigar", np1_length="np1_length", np2_length="np2_length", v_sequence_end="v_sequence_end", d_sequence_end="d_sequence_end", raw=FALSE) { # query sequence sequence <- sequence_db[[sequence]] quality_phred <- strsplit(sequence_db[[quality]],"")[[1]] quality_num_values <- strsplit(sequence_db[[quality_num]],",")[[1]] v_cigar <- sequence_db[[v_cigar]] vd_pseudo_cigar <- NA if (!is.na(sequence_db[[np1_length]])) { if (sequence_db[[np1_length]]>0) { vd_pseudo_cigar <- paste0(sequence_db[[v_sequence_end]],"S",sequence_db[[np1_length]],"X") } } d_cigar <- sequence_db[[d_cigar]] dj_pseudo_cigar <- NA if (!is.na(sequence_db[[np2_length]])) { if (sequence_db[[np2_length]]>0){ dj_pseudo_cigar <- paste0(sequence_db[[d_sequence_end]],"S",sequence_db[[np2_length]],"X") } } j_cigar <- sequence_db[[j_cigar]] cigars <- c(v_cigar, vd_pseudo_cigar, d_cigar, dj_pseudo_cigar, j_cigar) cigars <- cigars[!is.na(cigars)] ranges <- bind_rows(lapply(cigars, function(cigar) { ops <- GenomicAlignments::explodeCigarOps(cigar)[[1]] lengths <- GenomicAlignments::explodeCigarOpLengths(cigar)[[1]] keep <- ops %in% c("N", "I") == F ops <- ops[keep] lengths <- lengths[keep] ranges <- data.frame( "start"=rep(NA, length(ops)), "end"=NA, "width"=lengths, "operator"=ops, stringsAsFactors = F) ranges[['start']][1] <- 1 for (i in 1:nrow(ranges)) { if (ranges[['operator']][i] %in% c("S","=","X","D")) { ranges[['end']][i] <- ranges[['start']][i]+ranges[['width']][i]-1 } if (i+1<=nrow(ranges)) { ranges[['start']][i+1] <- ranges[['end']][i]+1 } } ranges <- ranges %>% filter(!!rlang::sym("operator") %in% c("S","D") == FALSE) ranges })) iranges <- IRanges(start=ranges[['start']], end=ranges[['end']], width=ranges[['width']]) reconstruced_sequence_alignment <- extractAt(BString(sequence), iranges) reconstruced_sequence_alignment <- paste0(sapply(reconstruced_sequence_alignment, toString), collapse="") positions <- unlist(sapply(1:nrow(ranges), function(i) { ranges$start[i]:ranges$end[i]})) quality_df <- data.frame( "reconstructed_sequence_alignment"=paste0(sapply(reconstruced_sequence_alignment, toString),collapse=""), "sequence_position"=positions, "sequence_alignment_position"=NA, stringsAsFactors = F ) %>% mutate ( !!rlang::sym(quality) := quality_phred[positions], !!rlang::sym(quality_num) := as.numeric(quality_num_values)[positions], !!rlang::sym(sequence_id) := sequence_db[[sequence_id]]) # Sanity check. Just to be sure reconstruction is working correctly, # and be sure I will later transfer the quality scores correctly sequence_alignment <- sequence_db[[sequence_alignment]] expected <- gsub("[\\.-]","",sequence_alignment) if (reconstruced_sequence_alignment != expected) { stop("Reconstructed sequence_alignment from cigar doesn't match db sequence_alignment.") } # map position numbering: sequence input positions <--> aligned positions nt_aln <- strsplit(sequence_alignment,"")[[1]] for ( aln_position in 1:length(nt_aln)) { if (nt_aln[aln_position] %in% c(".","-") == FALSE ) { pos <- sum(nt_aln[1:aln_position] %in% c(".","-") == F) quality_df[['sequence_alignment_position']][pos] <- aln_position quality_df[['sequence_alignment_nt']][pos] <- nt_aln[aln_position] } } if (raw) { quality_df %>% select(-!!rlang::sym("reconstructed_sequence_alignment")) } else { qual_num <- rep(NA, length(nt_aln)) qual_num[quality_df[['sequence_alignment_position']]] <- quality_df[[quality_num]] qual_num <- paste0(qual_num, sep="", collapse=",") qual_phred <- rep(" ", length(nt_aln)) qual_phred[quality_df[['sequence_alignment_position']]] <- quality_df[[quality]] qual_phred <- paste0(qual_phred, sep="", collapse="") ret <- data.frame( "quality_alignment_num"=qual_num, "quality_alignment"=qual_phred, stringsAsFactors = F ) %>% mutate(!!rlang::sym(sequence_id) := sequence_db[[sequence_id]]) ret } } # Retrieve sequencing quality scores from tabular data # # \code{sequenceAlignmentQuality} is used internally by \code{readFastqDb} to # process the sequencing quality scores loaded from a \code{fastq} file. # # Once a repertoire \code{data.frame} has been processed with \link{readFastqDb} and # contains the fields \code{quality} and \code{quality_num}, # \code{sequenceAlignmentQuality} can be used to retrieve the quality scores # from the already present field \code{quality_num}, without requiring # again the \code{fastq} file, and report them as a \code{data.frame} with sequencing # qualities per position, not as a string. This is done setting \code{raw=TRUE}. # This \code{data.frame} with qualities per position can be used to generate figures, # for example. # # @param data \code{data.frame} containing sequence data. # @param sequence_id column in \code{data} that contains sequence # identifiers to be matched to sequence identifiers in # \code{fastq_file}. # @param sequence column in \code{data} that contains sequence data. # @param sequence_alignment column in \code{data} that contains # IMGT aligned sequence data. # @param quality column in \code{data} that contains # sequencing quality as Phred scores. # @param quality_num column in \code{data} that contains # sequencing quality as a comma separated string. # @param v_cigar column in \code{data} that contains CIGAR # strings for the V gene alignments. # @param d_cigar column in \code{data} that contains CIGAR # strings for the D gene alignments. # @param j_cigar column in \code{data} that contains CIGAR # strings for the J gene alignments. # @param np1_length column in \code{data} that contains the number # of nucleotides between the V gene and first D gene # alignments or between the V gene and J gene alignments. # @param np2_length column in \code{data} that contains the number # of nucleotides between either the first D gene and J # gene alignments or the first D gene and second D gene # alignments. # @param v_sequence_end column in \code{data} that contains the # end position of the V gene in \code{sequence}. # @param d_sequence_end column in \code{data} that contains the # end position of the D gene in \code{sequence}. # @param raw specify how the sequencing quality should be returned. # If \code{TRUE}, return a \code{data.frame} with # quality information per position, where each row is # a position. This \code{data.frame} has columns # "sequence_position", "sequence_alignment_position", # "quality", "quality_num", "sequence_id" # and "sequence_alignment_nt" If \code{FALSE}, for each sequence, # concatenate the position qualities in a string, and the # quality information to \code{data} sequenceAlignmentQuality <- function(data, sequence_id="sequence_id", sequence="sequence", sequence_alignment="sequence_alignment", quality="quality", quality_num="quality_num", v_cigar="v_cigar", d_cigar="d_cigar", j_cigar="j_cigar", np1_length="np1_length", np2_length="np2_length", v_sequence_end="v_sequence_end", d_sequence_end="d_sequence_end", raw=FALSE) { pb <- progressBar(nrow(data)) qual <- bind_rows(lapply(1:nrow(data),function(i) { pb$tick() calcSequenceAlignmentQuality(data[i,], sequence=sequence, sequence_id=sequence_id, sequence_alignment=sequence_alignment, quality=quality, quality_num=quality_num, v_cigar=v_cigar, d_cigar=d_cigar, j_cigar=j_cigar, np1_length=np1_length, np2_length=np2_length, v_sequence_end=v_sequence_end, d_sequence_end=d_sequence_end, raw=raw) })) if (raw) { qual } else { data %>% dplyr::left_join(qual, by=sequence_id) } } #' Mask sequence positions with low quality #' #' \code{maskPositionsByQuality} will replace positions that #' have a sequencing quality score lower that \code{min_quality} with an #' \code{"N"} character. #' #' #' @param data \code{data.frame} containing sequence data. #' @param min_quality minimum quality score. Positions with sequencing quality #' less than \code{min_qual} will be masked. #' @param sequence column in \code{data} with sequence data to be masked. #' @param quality_num column in \code{data} with quality scores (a #' string of numeric values, comma separated) that can #' be used to mask \code{sequence}. #' #' @return Modified \code{data} data.frame with an additional field containing #' quality masked sequences. The name of this field is created #' concatenating the \code{sequence} name and \code{"_masked"}. #' #' @seealso \link{readFastqDb} and \link{getPositionQuality} #' #' @examples #' db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) #' fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") #' db <- readFastqDb(db, fastq_file, quality_offset=-33) #' maskPositionsByQuality(db, min_quality=90, quality_num="quality_alignment_num") #' #' @export maskPositionsByQuality <- function(data, min_quality=70, sequence="sequence_alignment", quality_num="quality_alignment_num") { required_cols <- c(sequence,quality_num) checkColumns(data, required_cols) sequence_masked <- paste0(sequence,"_masked") num_masked_seqs <- 0 data <- bind_rows(lapply(1:nrow(data), function(i) { db_row <- data[i,] seq_qual <- strsplit(db_row[[quality_num]],",")[[1]] low_seq_qual <- which(sapply(seq_qual, function(x) { if (x != "NA") { as.numeric(x) < min_quality } else { NA } }, USE.NAMES = FALSE)) if (length(low_seq_qual)>0) { num_masked_seqs <<- num_masked_seqs + 1 seq <- strsplit(db_row[[sequence]],"")[[1]] seq[low_seq_qual] <- "N" seq <- paste0(seq, collapse="") db_row[[sequence_masked]] <- seq } db_row })) message("Number of masked sequences: ", num_masked_seqs) data } #' Get a data.frame with sequencing qualities per position #' #' \code{getPositionQuality} takes a data.frame with sequence quality scores #' in the form of a strings of comma separated numeric values, split the quality #' scores values by \code{","}, and returns a data.frame with the values #' for each position. #' #' #' @param data \code{data.frame} containing sequence data. #' @param sequence_id column in \code{data} with sequence identifiers. #' @param sequence column in \code{data} with sequence data. #' @param quality_num column in \code{data} with quality scores (as #' strings of numeric values, comma separated) for \code{sequence}. #' #' @return \code{data} with one additional field with masked sequences. The #' name of this field is created concatenating \code{sequence} #' and '_masked'. #' #' @seealso \link{readFastqDb} and \link{maskPositionsByQuality} #' #' @examples #' db <- airr::read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) #' fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") #' db <- readFastqDb(db, fastq_file, quality_offset=-33) #' head(getPositionQuality(db)) # #' @export getPositionQuality <- function(data, sequence_id="sequence_id", sequence="sequence_alignment", quality_num="quality_alignment_num") { checkColumns(data, c(sequence, quality_num)) bind_rows(lapply(1:nrow(data), function(i) { seq_id <- data[[sequence_id]][i] seq_len <- nchar(data[[sequence]][i]) qual_values <- as.numeric(strsplit(data[[quality_num]][i],",")[[1]]) nt <- strsplit(data[[sequence]],"")[[1]] if (seq_len != length(qual_values)) { stop("Different length, for sequence: ", seq_id,". seq: ", sequence, ". qual: ", quality_num) } data.frame( "position"=1:seq_len, stringsAsFactors = F) %>% mutate(!!rlang::sym(quality_num) := qual_values, !!rlang::sym(sequence_id) := seq_id, nt = nt) })) } alakazam/NEWS.md0000644000176200001440000004575614505514275013162 0ustar liggesusersVersion 1.3.0: September 29, 2023 ------------------------------------------------------------------------------- Backwards Incompatible Changes: + Some functions now require the parameter `locus`: `makeChangeoClone` General: + Updated dependencies to ggplot2 >= 3.4.0, airr >= 1.4.1, igraph >= 1.5.0. + Updated the example data `ExampleTrees` to use the igprah 1.5.0 format. See https://r.igraph.org/news/index.html#igraph-150 for details. + Performance improvements in `collapseDuplicates`. Diversity: + Fixed a bug in `plotDiversityCurve` and `plotAbundanceCurve` where limits were not being applied correctly to zoom in the plots. Gene: + Fixed a bug in `groupGenes` where TCR chains where not being considered when detecting heavy chain sequences prior to subsetting. Version 1.2.1: September 19, 2022 ------------------------------------------------------------------------------- General: + Fixed bug in parsing of TCR gene names. + Fixed missing import of `ape::read.fastq`. Version 1.2.0: October 31, 2021 ------------------------------------------------------------------------------- General: + Updated dependencies to R >= 4.0 and ggplot2 >= 3.3.4. + Removed lazyeval dependency. + Added `junctionAlignment`, which counts the number of nucleotides in the reference germline not present in the alignment, and the number of V and J nucleotides in the CDR3. Gene Usage: + Fixed a bug in `getFamily` where temporary designation gene names were not being correctly subset to the cluster (family) level. Lineage: + Fixed a bug in `runPhylip` which was causing `buildPhylipLineage` to fail when run on Windows. Version 1.1.0: February 6, 2021 ------------------------------------------------------------------------------- General: + Added `readFastqDb`, which reads a repertoire's .fastq file and imports the sequencing quality scores for `sequence_alignment`. Added `maskPositionsByQuality` masks positions that have a sequencing quality score lower than the specified threshold. The convenience function `getPositionQuality` will create a `data.frame` with quality scores per position. + Added a vignette describing how to read/write Change-O and AIRR Rearrangement formatted files. + Increased `dplyr` dependency to v1.0. + Added the BioConductor dependencies Biostrings, GenomicAlignments, and IRanges. + In `padSeqEnds`, the argument `mod3=TRUE` has been added so that sequences are padded to a length that is a multiple of 3. + Fixed a bug in `translateDNA` where `NA` values weren't being translated properly. Amino Acid Analysis: + Fixed a conflict in the default argument settings of `aminoAcidProperties`, which will now default to `nt=TRUE`. Diversity: + Added a parameter to `countClones` (`remove_na`) that will remove all rows with NA values in the clone column if `TRUE` (default) and issue a warning with how many were removed. If `FALSE`, those rows will be kept instead. Gene Usage: + Added the function `getLocus` to extract the locus information from the segment call. + Added the function `getChain` to define the chain from the segment or locus call. + Changed the check for empty columns in `countGenes` to give a warning instead of an error so as not to disrupt running workflows. + Fixed a bug in `getSegment` where filtering of non-localized genes was not being applied when called from `getFamily`, because the "NL" part of the name was removed before the filtering step. + Updated regular expressions in `getAllele`, `getGene`, `getFamily` and `getLocus`, to parse constant region gene names correctly. + Updated regular expressions in `getSegment` to be able to parse constant region gene names correctly and not remove the "D" from "IGHD" when `strip_d=TRUE`. Lineage: + Added `branch_length` argument to `buildPhylipLineage`, and augmented `graphToPhylo` and `phyloToGraph` to track intermediate sequence in nodes for phylo object. + Added a parameter to `countGenes` (`remove_na`) that will remove all rows with NA values in the gene column if `TRUE` (default) and issue a warning with how many were removed. If `FALSE`, those rows will be kept instead. Version 1.0.2: July 17, 2020 ------------------------------------------------------------------------------- Diversity: + Fixed a bug in `plotDiversityTest` that caused all values of `q` to appear on the plot rather than just the specified one. Gene Usage: + Fixed a major bug in the single-cell mode of `groupGenes` where the `v_call` column was being used in instead of the `j_call` column for J gene grouping. + Added support for TCR genes to `groupGenes`. + Changed the `only_igh` argument of `groupGenes` to `only_heavy`. Version 1.0.1: May 8, 2020 ------------------------------------------------------------------------------- Backwards Incompatible Changes: + Changed default expected data format from the Change-O data format to the AIRR Rearrangement standard. For example: where functions used the column name `V_CALL` (Change-O) as the default to identify the field that stored the V gene calls, they now use `v_call` (AIRR). That means, scripts that relied on default values (previously, `v_call="V_CALL"`), will now fail if calls to the functions are not updated to reflect the correct value for the data. If data are in the Change-O format, the current default value `v_call="v_call"` will fail to identify the column with the V gene calls as the column `v_call` doesn't exist. In this case, `v_call="V_CALL"` needs to be specified in the function call. + `ExampleDb` converted to the AIRR Rearrangement standard and examples updated accordingly. The legacy Change-O version is available as `ExampleDbChangeo`. + For consistency with the style of the new data format default, other field names have been updated to use the same capitalization. This change affects: - amino acid physicochemical properties (e.g. `GRAVY` to `gravy`); - `countGenes`, `countClones` (e.g., `SEQ_COUNT` to `seq_count`) - `estimateAbundance` (e.g., `RANK` to `rank`) - `groupGenes` (e.g., `VJ_GROUP` to `vj_group`) - `collapseDuplicates` and `makeChangeoClone` (e.g., `SEQUENCE_ID` to `sequence_id`, `COLLAPSE_COUNT` to `collapse_count`) - lineage tree functions (`summarizeTrees`, `getPathLengths`, `getMRCA`, `tableEdges`, `testEdges`) also return columns in lower case (e.g., `parent`, `child`, `outdegree`, `steps`, `annotation`, `pvalue`) + `IG_COLOR` names converted to official C region identifiers (IGHA, IGHD, IGHE, IGHG, IGHM, IGHK, IGHL). General: + License changed to AGPL-3. + `baseTheme` looks is now consistent across `sizing` options. + `cpuCount` will now return `1` if the core count cannot be determined. + Fixed a bug in `padSeqEnds` wherein the `pad_char` argument was being ignored. Diversity: + Fixed documentation error in diversity vignette for viewing test results. + `estimateAbundance` slot `clone_by` now contains the name of the column with the clonal group identifier, as specified in the function call. For example, if the function was called with `clone="clone_id"`, then the `clone_by` slot will be `clone_id`. Lineage: + Renamed the `buildPhylipLineage` arguments `vcall`, `jcall` and `dnapars_exec` to `v_call`, `j_call` and `phylip_exec`, respectively. Version 0.3.0: July 17, 2019 ------------------------------------------------------------------------------- Deprecated: + `rarefyDiversity` is deprecated in favor of `alphaDiversity`, which includes the same functionality. + `testDiversity` is deprecated. The test calculation have been added to the normal output of `alphaDiversity`. General: + Added `ape` and `tibble` dependencies. Lineage: + Added `readIgphyml` to read in IgPhyML output and `combineIgphyml` to combine parameter estimates across samples. + Added `graphToPhylo` and `phyloToGraph` to allow conversion between graph and phylo formats. Diversity: + Fixed a bug in `estimateAbundance` where setting the `clone` column to a non-default value produced an error. + Added rarefaction options to `estimateAbundance` through the `min_n`, `max_n`, and `uniform` arguments. + Moved the rarefaction calculation for the diversity functions into `estimateAbundance`. `alphaDiversity` will call `estimateAbundance` for bootstrapping if not provided an existing `AbundanceCurve` object. + Restructured the `DiversityCurve` and `AbundanceCurve` objects to accomodate the new diversity methods. Gene Usage: + `groupGenes` now supports grouping by V gene, J gene, and junction length (`junc_len`) as well, in addition to grouping by V gene and J gene without junction length. Also added support for single-cell input data with the addition of new arguments `cell_id`, `locus`, and `only_igh`. Version 0.2.11: September 12, 2018 ------------------------------------------------------------------------------- General: + Added `nonsquareDist` function to calculate the non-square distance matrix of sequences. + Exported some internal utility functions to make them available to dependent packages: `progressBar`, `baseTheme`, `checkColumns` and `cpuCount`. Diversity: + `estimateAbundance`, and `plotAbundanceCurve`, will now allow `group=NULL` to be specified to performance abundance calculations on ungrouped data. Gene Usage: + Added `fill` argument to `countGenes`. When set `TRUE` this adds zeroes to the `group` pairs that do not exist in the data. + Added new function `groupGenes` to group sequences sharing same V and J gene. Toplogy Analysis: + Fixed a bug in tableEdges causing it to fail when no parent/child relationships exist when specifying `indirect=TRUE`. + `makeChangeoClone` will now issue an error and terminate, instead of continuing with a warning, when all sequences are not the same length. Version 0.2.10: March 30, 2018 ------------------------------------------------------------------------------- General: + Fixed a bug in `IPUAC_AA` wherein X was not properly matching against Q. + Changed behavior in `getAAMatrix` to treat * (stop codon) as a mismatch. Version 0.2.9: March 21, 2018 ------------------------------------------------------------------------------- General: + Added explicit type casting for known columns to `readChangeoDb`. + Added the `padSeqEnds` function which pads sequences with Ns to make then equal in length. + Added verification of unique sequence IDs to `collapseDuplicates`. Diversity: + Added the `uniform` argument to `rarefyDiversity` allowing users to toggle uniform vs non-uniform sampling. + Renamed `plotAbundance` to `plotAbundanceCurve`. + Changed `estimateAbundance` return object from a data.frame to a new `AbundanceCurve` custom class. + Set default `plot` call for `AbundanceCurve` to `plotAbundanceCurve`. + Added the `annotate` argument from `plotDiversityCurve` to `plotAbundanceCurve`. + Added the `score` argument to `plotDiversityCurve` to toggle between plotting diversity or evenness. + Added the function `plotDiversityTest` to generate a simple plot of `DiversityTest` object summaries. Gene Usage: + Added the `omit_nl` argument to `getAllele`, `getGene` and `getFamily` to allow optional filtering of non-localized (NL) genes. Lineage: + Fixed a bug in `makeChangeoClone` preventing it from interpreting the `id` argument correctly. + Added the `pad_end` argument to `makeChangeoClone` to allow automatic padding of ends to make sequences the same length. Version 0.2.8: September 21, 2017 ------------------------------------------------------------------------------- General: + Updated Rcpp dependency to 0.12.12. + Added `dry` argument to `collapseDuplicates` which will annotate duplicate sequences but not remove them when set to `TRUE`. + Fixed a bug where `collapseDuplicates` was returning one sequence if all sequences were considered ambiguous. Lineage: + Added ability to change masking character and distance matrix used in `makeChangeoClone` and `buildPhylipLineage` for purposes of (optionally) treating indels as mismatches. + Fixed a bug in `buildPhylipLineage` when PHYLIP doesn't generate inferred sequences and has only one block. Version 0.2.7: June 12, 2017 ------------------------------------------------------------------------------- General: + Fixed a bug in `readChangeoDb` causing the `select` argument to do nothing. + Added progress package dependency. + Internal changes to support Rcpp 0.12.11. Gene Usage: + Renamed the count/frequency columns output by `countGenes` when the `clone` argument is specified to `CLONE_COUNT`/`CLONE_FREQ`. + Added a vignette describing basic gene usage analysis. Version 0.2.6: March 21, 2017 ------------------------------------------------------------------------------- General: + License changed to Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). + Removed data.table dependency and added readr dependency. + Performance improvements in `readChangeoDb` and `writeChangeoDb`. Version 0.2.5: August 5, 2016 ------------------------------------------------------------------------------- General: + Fixed a bug in `seqDist()` wherein distance was not properly calculated in some sequences containing gap characters. + Added stop and gap characters to `getAAMatrix()` return matrix. Version 0.2.4: July 20, 2016 ------------------------------------------------------------------------------- General: + Added Rcpp and data.table dependencies. + Modified `readChangeoDb()` to wrap `data.table::fread()` instead of `utils::read.table()` if the input file is not compressed. + Ported `testSeqEqual()`, `getSeqDistance()` and `getSeqMatrix()` to C++ to improve performance of `collapseDuplicates()` and other dependent functions. + Renamed `testSeqEqual()`, `getSeqDistance()` and `getSeqMatrix()` to `seqEqual()`, `seqDist()` and `pairwiseDist()`, respectively. + Added `pairwiseEqual()` which creates a logical sequence distance matrix; TRUE if sequences are identical, FALSE if not, excluding Ns and gaps. + Added translation of ambiguous and gap characters to `X` in `translateDNA()`. + Fixed bug in `collapseDuplicates()` wherein the input data type sanity check would cause the vignette to fail to build under R 3.3. + Replaced the `ExampleDb.gz` file with a larger, more clonal, `ExampleDb` data object. + Replaced `ExampleTrees` with a larger set of trees. + Renamed `multiggplot()` to `gridPlot()`. Amino Acid Analysis: + Set default to `normalize=FALSE` for charge calculations to be more consistent with previously published repertoire sequencing results. Diversity Analysis: + Added a `progress` argument to `rarefyDiversity()` and `testDiversity()` to enable the (previously default) progress bar. + Fixed a bug in `estimateAbundance()` were the function would fail if there was only a single input sequence per group. + Changed column names in `data` and `summary` slots of `DiversityTest` to uppercase for consistency with other tools. + Added dispatching of `plot` to `plotDiversityCurve` for `DiversityCurve` objects. Gene Usage: + Added `sortGenes()` function to sort V(D)J genes by name or locus position. + Added `clone` argument to `countGenes()` to allow restriction of gene abundance to one gene per clone. Topology Analysis: + Added a set of functions for lineage tree topology analysis. + Added a vignette showing basic tree topology analysis. Version 0.2.3: February 22, 2016 ------------------------------------------------------------------------------- General: + Fixed a bug wherein the package would not build on R < 3.2.0 due to changes in `base::nchar()`. + Changed R dependency to R >= 3.1.2. Version 0.2.2: January 29, 2016 ------------------------------------------------------------------------------- General: + Updated license from CC BY-NC-SA 3.0 to CC BY-NC-SA 4.0. + Internal changes to conform to CRAN policies. Amino Acid Analysis: + Fixed bug where arguments for the `aliphatic()` function were not being passed through the ellipsis argument of `aminoAcidProperties()`. + Improved amino acid analysis vignette. + Added check for correctness of amino acids sequences to `aminoAcidProperties()`. + Renamed `AA_TRANS` to `ABBREV_AA`. Diversity: + Added evenness and bootstrap standard deviation to `rarefyDiversity()` output. Lineage: + Added `ExampleTrees` data with example output from `buildPhylipLineage()`. Version 0.2.1: December 18, 2015 ------------------------------------------------------------------------------- General: + Removed plyr dependency. + Added dplyr, lazyeval and stringi dependencies. + Added strict requirement for igraph version >= 1.0.0. + Renamed `getDNADistMatrix()` and `getAADistMatrix()` to `getDNAMatrix` and `getAAMatrix()`, respectively. + Added `getSeqMatrix()` which calculates a pairwise distance matrix for a set of sequences. + Modified default plot sizing to be more appropriate for export to PDF figures with 7-8 inch width. + Added `multiggplot()` function for performing multiple panel plots. Amino Acid Analysis: + Migrated amino acid property analysis from Change-O CTL to alakazam. Includes the new functions `gravy()`, `bulk()`, `aliphatic()`, `polar()`, `charge()`, `countPatterns()` and `aminoAcidProperties()`. Annotation: + Added support for unusual TCR gene names, such as 'TRGVA*01'. + Added removal of 'D' label (gene duplication) from gene names when parsed with `getSegment()`, `getAllele()`, `getGene()` and `getFamily()`. May be disabled by providing the argument `strip_d=FALSE`. + Added `countGenes()` to tabulate V(D)J allele, gene and family usage. Diversity: + Added several functions related to analysis of clone size distributions, including `countClones()`, `estimateAbundance()` and `plotAbundance()`. + Renamed `resampleDiversity()` to `rarefyDiversity()` and changed many of the internals. Bootstrapping is now performed on an inferred complete relative abundance distribution. + Added support for inclusion of copy number in clone size determination within `rarefyDiversity()` and `testDiversity()`. + Diversity scores and confidence intervals within `rarefyDiversity()` and `testDiversity()` are now calculated using the mean and standard deviation of the bootstrap realizations, rather than the median and upper/lower quantiles. + Added ability to add counts to the legend in `plotDiversityCurve()`. Version 0.2.0: June 15, 2015 ------------------------------------------------------------------------------- Initial public release. General: + Added citations for the `citation("alakazam")` command. Version 0.2.0.beta-2015-05-30: May 30, 2015 ------------------------------------------------------------------------------- Lineage: + Added more error checking to `buildPhylipLineage()`. Version 0.2.0.beta-2015-05-26: May 26, 2015 ------------------------------------------------------------------------------- Lineage: + Fixed issue where `buildPhylipLineage()` would hang on R 3.2 due to R change request PR#15508. Version 0.2.0.beta-2015-05-05: May 05, 2015 ------------------------------------------------------------------------------- Prerelease for review. alakazam/MD50000644000176200001440000001724114505673010012351 0ustar liggesusers637a22fc99e5acb59767b2cdb9b63e8f *DESCRIPTION ed6485eda4a1889ffac224192bf9f07b *NAMESPACE b6f26a592609e1a93941cdf97130c033 *NEWS.md 38f343a432567a39846afb0dd908e7d2 *R/Alakazam.R d71ea375dbdcb26f8276cd99093cfe80 *R/AminoAcids.R f6e0d1fce17fe087df552218004a6be9 *R/Classes.R 916ace3ad514cd4a531390016089db24 *R/Core.R 71edf30ff926aa0f3c09394df9ca1e93 *R/Data.R 86e564b8b709c13ca72e80296a455980 *R/Deprecated.R 86e4518b872982ed1d5dc644774525e9 *R/Diversity.R c9bdee2a3a5e4916aef326268fb16468 *R/Fastq.R 0ff86e7bd3b6e597a36624e9606ed351 *R/Gene.R 0dfe0f1ef0cb6c1a90077f16d875b118 *R/Lineage.R 6f8a72642969fd382cd8f88bc18e6b24 *R/RcppExports.R 8db48271b2b0f99470c9b4ad71524273 *R/Sequence.R c8581d9d8bef8d6ab416568664e22bd3 *R/Topology.R def92a4fe63ca7bcdba22c3a382dbced *R/sysdata.rda 3398ce3684e5d65869b119635bbf1b51 *README.md 7080893e02c49cd296d4424b9be55069 *build/partial.rdb 31ad388c6c5e035944abc19531fedeee *build/vignette.rds 8e55f0c4422bff63d5f9a73636ccd2ea *data/Example10x.rda 2ca0c64c8ed79f363f7b06e171839818 *data/ExampleDb.rda 44a2714d7443c83b5cf8d6f7b21c252e *data/ExampleDbChangeo.rda 9456c9ccc04b81b1acdaa564afbbf243 *data/ExampleTrees.rda 26bc36d9477eb80794992f0aab49f5c0 *data/SingleDb.rda b034dfc6972e3bdd19b8801d55ac4b7e *inst/CITATION d9d5ababa8ef62395f5398046b516a97 *inst/doc/AminoAcids-Vignette.R 960653fdeb23924745066c49cd80e31a *inst/doc/AminoAcids-Vignette.Rmd a5687f6a3dfe98bade32201905e77253 *inst/doc/AminoAcids-Vignette.pdf b5dda44fd2ba0f1235f5eb7fa50382ce *inst/doc/Diversity-Vignette.R b43702f2123e679b9ded2ff921037eb1 *inst/doc/Diversity-Vignette.Rmd 1924bfe7c14457ba2f109363143926c2 *inst/doc/Diversity-Vignette.pdf ddd0dc0980ee355a5114b98ff2a97ce8 *inst/doc/Fastq-Vignette.R bc1ee42a0d0f5be791bd1f6d7e9eaca7 *inst/doc/Fastq-Vignette.Rmd f02f3a445eaf362e74f0645a60683724 *inst/doc/Fastq-Vignette.pdf 0d56c8162b4e38ac04cbb3b322dd6d15 *inst/doc/Files-Vignette.R e83df6ce6b04a14b1eedfc8cf85935b4 *inst/doc/Files-Vignette.Rmd c562a8e8bd62db483d08cfb295d98534 *inst/doc/Files-Vignette.pdf 651b31226485ec0c7f6180296aab17a8 *inst/doc/GeneUsage-Vignette.R 802b6f439b64a29cf7dacffb426aa24a *inst/doc/GeneUsage-Vignette.Rmd 4d969e19e904456fb221d77fae3ea39a *inst/doc/GeneUsage-Vignette.pdf a9af24d2533d799ac06566e7ffb260b8 *inst/doc/Lineage-Vignette.R 8a9e73918c83119ac0ce6e1710c46185 *inst/doc/Lineage-Vignette.Rmd 3133cc18d3ead10cd6bd7da373be31f2 *inst/doc/Lineage-Vignette.pdf d75c1f36f70c370f5dae8775763671c3 *inst/doc/Topology-Vignette.R e7e008c78c5c17e3e46edefbb6508230 *inst/doc/Topology-Vignette.Rmd b937176450bbef0ae5145d5b9c42144e *inst/doc/Topology-Vignette.pdf d6b9c5b466e6acfac01f41f70279e462 *inst/extdata/example_airr.tsv.gz 2fcc671e7657eed4ee9b6819004d9563 *inst/extdata/example_changeo.tab.gz 547e6794bb28cdeb9d355bea001d77ba *inst/extdata/example_quality.fastq a859f8de5695231a17a684df638aff58 *inst/extdata/example_quality.tsv 987475fe1f56c385e720c6afd798dd08 *man/ABBREV_AA.Rd 12bc2f6e5c83021ba446013f93f2c819 *man/AbundanceCurve-class.Rd 13bf964a5e2d342c91185034bf2bb2cb *man/ChangeoClone-class.Rd a84a6d4edd8410275bb1abd5a463ad32 *man/DEFAULT_COLORS.Rd e8cf58a2dee521487a4c4c64af7a793f *man/DiversityCurve-class.Rd ddc49fed05c59121028f0dabecbe5fb1 *man/EdgeTest-class.Rd 1932908e3468566f4df4b03b421a5948 *man/Example10x.Rd 407424a705d79f858d4e57db2caab842 *man/ExampleDb.Rd 40db6c9c2338f5fee3bc9d1c8c9ce4e9 *man/ExampleDbChangeo.Rd 6e69b6b8867ec8ce3d7a0df5da568603 *man/ExampleTrees.Rd 6853dbdd976e24e406dcc39c824f277e *man/IMGT_REGIONS.Rd 4585817f760a903f7ad773fff25573f5 *man/IUPAC_CODES.Rd 4d8441622f8bbb14de45524ceecbe737 *man/MRCATest-class.Rd 3b369061d3f5a02afc617e3bdcdc6f74 *man/SingleDb.Rd 81eebe9b035eb3a5cb769688944abe68 *man/alakazam-package.Rd 2e74f2c7fe2ef4fe67a22877ac25be0a *man/alakazam.Rd db19819685d940da24bd3022a9d4e8be *man/aliphatic.Rd 14d7a80970ef09bd37bda31b80e04b1d *man/alphaDiversity.Rd d7b2caf979401d440a9648ef7ee00159 *man/aminoAcidProperties.Rd a8d03c199086e18e26fd673624ffa1a4 *man/baseTheme.Rd 1182a86ad7f76f2574fea18001f8c752 *man/buildPhylipLineage.Rd bbfdb6340b92a396e2b4bb5f15cd5633 *man/bulk.Rd c686bdeedc7abc3277241668dfe4bb2f *man/calcCoverage.Rd af307d6e0209dbd3acaf15c8ec4c8295 *man/calcDiversity.Rd 42c99ea962c520a3d6cb6b88572ad984 *man/charge.Rd 995aabe2f257ba72862d5b226ce03c66 *man/checkColumns.Rd 7c682c648b3a05217b526850f09d1b42 *man/collapseDuplicates.Rd c3719294a76cb1dc606b0115b935be90 *man/combineIgphyml.Rd e40fd4846b4eeb3836e10b9bae834506 *man/countClones.Rd ad2f576a3db27d486cd17d1d4f617fe9 *man/countGenes.Rd e53becee13b70f2005243881ad2cb6e4 *man/countPatterns.Rd 228c0d1d4a6fc2744f10623b6342ead8 *man/cpuCount.Rd 2a319c89da2b5e3d33054136acfa3d91 *man/estimateAbundance.Rd 9dd006c3a64d4b51deafeecdbb805fac *man/extractVRegion.Rd d9bcf6fa4885d0682e7f951faf7f2254 *man/getAAMatrix.Rd f3d1c78e3419a6d133ac41d1b340edb6 *man/getDNAMatrix.Rd da9177951218d3a90104d18255531f86 *man/getMRCA.Rd d97054f355e98a82cf5a5a806526ed5b *man/getPathLengths.Rd 18e41b200a453d4a5b9a28b0babdb50a *man/getPositionQuality.Rd ccc0565b7266c496c29802830241f448 *man/getSegment.Rd 76697bcf036a02fbe6ddb7f351926ca9 *man/graphToPhylo.Rd ebd8bf4d329181cffdec5346ad8721ee *man/gravy.Rd 43a957cfa4f3285543fad47363376786 *man/gridPlot.Rd 86a06adb5a779690a2d79547d8a24802 *man/groupGenes.Rd 56bbb424640d95b6e9fcb109c76df6f5 *man/isValidAASeq.Rd a9acf8807ef75725f015d91f0869fd64 *man/junctionAlignment.Rd 30de8901dfdc3e828c32d115941e010f *man/makeChangeoClone.Rd 16c622dc1a843365e20d348978727214 *man/makeTempDir.Rd d977ffb1591f5c93f326241acd133275 *man/maskPositionsByQuality.Rd 1eeab523917cc47d245c324644f4a387 *man/maskSeqEnds.Rd 18ef28997eb2cb4a67ae7f06c4856f6d *man/maskSeqGaps.Rd c4ee04b0eacd1e93066cc87c0520800d *man/nonsquareDist.Rd 7ff01dba7bb52b0f78b5fe6e8883faab *man/padSeqEnds.Rd 1e23c90638621a4425fc49ced382dc0c *man/pairwiseDist.Rd a93f7fde10257f4d80ca1a3db58ebcaf *man/pairwiseEqual.Rd f0e407fd33a9a29bf63240fefb36c724 *man/permuteLabels.Rd c380b34307cbbee5f99ba5e2b06f4efc *man/phyloToGraph.Rd dddb082d641c0c2e74d542fc33ad960c *man/plotAbundanceCurve.Rd 36271c575b7282997a2c552c1a1ce830 *man/plotDiversityCurve.Rd 5b9a7c245bdc2ce91dad0b34777140c1 *man/plotDiversityTest.Rd af5d9096d8470f1f895d4bc07ad2d0fc *man/plotEdgeTest.Rd 553a53b5b0a96f390422a565fee9d970 *man/plotMRCATest.Rd 14f6a8cb7dbdf6658e827dabb856ea65 *man/plotSubtrees.Rd 57f38289101ef92fa9db938e09766869 *man/polar.Rd 7c2c3846d5f429596501499da0c9aec9 *man/progressBar.Rd 6649627271c10d1be5d87687c649e762 *man/rarefyDiversity.Rd a07a1db2516b5e3389f7632e93ce8fab *man/readChangeoDb.Rd ded74283da2084401944c9ed4e06ae4a *man/readFastqDb.Rd a580831b84edd79a88f34cc693d3e597 *man/readIgphyml.Rd 7cc1917257918b65d8ff2c5e0f47e93c *man/seqDist.Rd f5e27a7fa978350281f109893235c4d4 *man/seqEqual.Rd 1e0a5d095b881bde9dfa4603903b23e5 *man/sortGenes.Rd 4551455c0ab7d85eba44ccab82ddccd5 *man/stoufferMeta.Rd a70b6eafc7cbb3753f60afe631379f3e *man/summarizeSubtrees.Rd 68a832553b26782673d82eeaedea750c *man/tableEdges.Rd 3308f5dd254a011be415178f8b17b710 *man/testDiversity.Rd 2dc1fded59f2f258192ddb2d9b9a72c5 *man/testEdges.Rd 6afbc7577d809e0fef8278d5060a9c9d *man/testMRCA.Rd ed2b5d2d9fd87a693a560dd5fd7fdf7f *man/translateDNA.Rd 8242a3df101301f23473a572115fc432 *man/translateStrings.Rd 04cb7509996ed099f47415db4fec4e03 *man/writeChangeoDb.Rd 3b377cf40c356ccde3fa098907bfd279 *src/RcppDistance.cpp 48e120890b196a5e995ea895e4f926be *src/RcppExports.cpp 960653fdeb23924745066c49cd80e31a *vignettes/AminoAcids-Vignette.Rmd b43702f2123e679b9ded2ff921037eb1 *vignettes/Diversity-Vignette.Rmd bc1ee42a0d0f5be791bd1f6d7e9eaca7 *vignettes/Fastq-Vignette.Rmd e83df6ce6b04a14b1eedfc8cf85935b4 *vignettes/Files-Vignette.Rmd 802b6f439b64a29cf7dacffb426aa24a *vignettes/GeneUsage-Vignette.Rmd 8a9e73918c83119ac0ce6e1710c46185 *vignettes/Lineage-Vignette.Rmd e7e008c78c5c17e3e46edefbb6508230 *vignettes/Topology-Vignette.Rmd alakazam/inst/0000755000176200001440000000000014505552753013023 5ustar liggesusersalakazam/inst/doc/0000755000176200001440000000000014505552753013570 5ustar liggesusersalakazam/inst/doc/AminoAcids-Vignette.pdf0000644000176200001440000063360514505552721020065 0ustar liggesusers%PDF-1.5 % 9 0 obj << /Length 1738 /Filter /FlateDecode >> stream xX[o6~=X[>nVlH C[ DuquIPIXEǏ*OOϓ'^4`),UhBIAr A}RY$igk]* nY7T X_앤c$c,iD"%4KТ7}JjPZ5{.,Ɍp!p2\D4x,`8PIFhpi] ;o k s%D$2k]oUn .U&JP@fQLy< Z=@yȦ4 }T wk'H[mR[iF8X_,+؊XPEMNtT_ts =i݌r,C!SX24$LZKM#i6$lDy=?$nZ`Eg,t-Zݡ-«ZtZ|j|:fc-SpF\cfzB'%C$y SJT_A C7Ql3(+("F零AtΏDtr[^م*Ps7kapAڲC1eRCکͪBYޘ.!](g9MlUq;bp۫\ 9_fSL-878ՐzveeU@L36rjQrpZ<.Borisg=៧G(jOU~6uԭ_7jʲUQ5ziMmҴܛv'8Gv2۹n }xzB mn (7[hm-XySoqgCpoONK|4MiƔSFPAtȅ#jG۳6zS*zMݚ >ß(>wc Y4(h6Dl+ܹ+ыĎmc\rU90jO  GH*]Uǹc9B ϜV<^hG tbV,aj7P-對=pAlWa捂NWKCXl=ygnQnFH pR5~pHfmxpRjvWM\8>g1gyvtIbjx2:%Or-ΐ/b+.;^_2֍)S;Ĉq)Uڂ 0Q`_qZeN}e: ~cmR#gs'NDd:m7)-)A9K+"ig,> cB #E&f\}ucw/Tg[RQi;jS_52W%X + [I|sb;X䍹?$108MjȔJJd g z7g❈~>~x )O|Jy[AUjխ,$aqMBםG",)+`wBP19gQ׷ Hg5̮o%/v Xs~W8C2ETw>Ll?NLԌ1bX@l|Lryyl(M endstream endobj 28 0 obj << /Length 1919 /Filter /FlateDecode >> stream xZYoF~ϯ  =r0 EJ,:2rg Af$rq'7@uN|nPivK0ˆ#A&u"T†kZ%="z87rz#7NBaײT\=;DIPkC<ˡNG=b3` u"s|gmП:a` a lrk8l 1wbHȌ"K2J癀[5(3 $ؤAT+ 38 &I=L&y&*c`KX1@+&DiT* 5YlTfR*i0n_U1XIe5^YR-4m9R MUER$ .ߏFjv­c1=G41RDB̻>Q׹崷\8#D\TMf0R4X(|ͪN\!ķ}D4:TEe1m@`l-DLVqDfypjOMLٜnŻAR'Aǃ':vsض06ReJQ=̞8x&9+qa@wĩeLc .&flg;L 0 L<"Ƥ*}nE^ێ\zUa}OΩ_ogmMv\k`Q@t5fgvSA;"+WKTQ%4TdAKR</|a۷g${l-DY( +9U'xy*x; |A̳I%Tc]ڝS{j'ܝjYz*yϱ~Rp5*c#G&~y*Z*4>wy3Ա<(Iȏ/- endstream endobj 33 0 obj << /Length 1225 /Filter /FlateDecode >> stream xXmo6_!_d,f`еMa@,1=mvjE:#y{9(l$6}6_A0OɣR>ƃX/al`dYCQz`2.}RMG"՘˾(,;;Be(XAqaDzuZ;_zjgAs~Tl)$Md~xF*$ծxs^w'o1:ɞeRoj\,,gVj˅c`*EHٛ@=Ya1Sq*œ_:-1ހ J&̃iwqN|ω;֢ԝ_yfq1'u=;Q e+- _=肪FRh>n 9kt:|ETf;/bY%* ti2 e%7|usZFIMu@Mڢ7G7e :gac5}^K/JigA&dv䎕buX{2b;7y΋v,G<-Jq)KR#`|D,IAk!jȣfY0&_,g[aE_][J#!jJ5,v JLj|@I/ :r1@TN(mĸ7}XΠnBd3N'Fܵ5/4L̢0K@G!.p ^gԔ3 1ߨqXxM(}\رːV,w< ۭslj\jB[K P}G|\۾}XjE$biW4=8ϋ3Ͷ]g2ZlZyiՑ(&}:9>:{c.gYNHg> /ExtGState << >>/ColorSpace << /sRGB 40 0 R >>>> /Length 10284 /Filter /FlateDecode >> stream x}]%{AB=M"plvȵeQ'?8ݜܞD"2Q(|&pb(g_;w?|Ow%.';e+)u;r.~p9|ߝ0#))Mi:[zTpwrc<_rc9絻ӟwsJ}ڟ\]22p.egHK>ogM7ٷs=;hVF9 2|Λ PsY]]}=e2{i*6L{9/..Ur,޲u*d cu?ȭΕLO纟o (m; Q휋q9%Z9+V*ϵV&8+)\X#rww_tkC:CHg>b @Vg~jPj™.9o4?oI5Q̯ !Z9\T2ֈu?8's^7B8!:B6L85"mO?~ytgαdLOW8EN9T۶V!hE կ4TXiΥJ~A0ANϽOi4?͟rޖam;o-*~MXG9կe\:oٴ2J kD:͟O?c9C@Li%z6/ "%L; *k_e™.9o Oh mk>4׏gX1rN{j[xᮍj6ёpÇC?"PGQ:x`ɕ KeWdYz91C7, ZҢ.B%AӚQ'Հ(YǨL*)ld?-S0n*ɂdynm,ovA-_G3X %>XGbʂKʇ]vO_/ӗ҃Q,JTz<ڣ|UeAYHplX9YT# }ɹ _r9xzg3{2}L_/ӗe2}y_yAV1.3;6n~Ye۱*+(>cd'wկ.;fyLFK@% dAaRFڪ7L ad݇u~βM:?G`:h:?X߼g=FR8dXeNzv߮/<}L_/ӗOǗTn)n{8n{Wn{#,R8Fd9|t[t=|Yoali؉6cXEꢍ xRAd\t=|Yose k}YBu=/}\.Ebʂbޗ͠% %Sr*m"x%,y]CT m=6z¾Q!P Ǹ D X ou<# PP6Wt2>GA,( 7Y 06`%_74겂>Ax4ISegE u)BnJ9R]%A8pR B_ .ρҾo:4~kOi?sM&[oVxWa7qQܕE3EGh|S dsjqkHtuHf{Wk 6CR3߂l߀5@`;B^NYڼ~Da5=@k#_Ikƛj?}~j׊$On_=U:?_- 4Pj!O:[F9Aǿ/]Os{rX5i?۟sbǕ#UV) zKX?z1.5TۼR|[k",=h?}m8YipPIA.,ЄoAW`οm ]I},|^Uxxo\PСҽ,eº~x.HCelWhKkW.m@-/W+׵D͋KZ^P+Oˋǜ{//{yY Kumcs(n2(4:!iR^ӱ}n:ܨuvxW}%}zu4{ ;[/ІO5IW-z >p}ѶZD&g^Ǹ)oU5Kx%=M#eh{@_x|/r 鴵Vk@ 9Hfe BVmAiZ.j8Dt ]t ]pJ.%ڌVFYpOZ,*[7ȁ6}+&ߵje…5"m5i4g_7Bp6M$3\1r X3c26A+|pay[S{6K홚:yjNBGL M I%Dr!UyhG1(͏[qw_,{u[|iFlnx넲_lUYPd[[(v{9V$L;_"xV2Fr}P勭* xij,pfa5>}!Zlw~=(fX6{aW{/Up^j?7R8YoE;cyhЎv XڱtюC;v,^cqh֡KXEali'yl(ƖL cKm4&J[V- vr8Yo |Y4̗4.|I[{_eX5͗v{L_^ݗO@c}z}t:ޗO@5 h̑//af}:6}T} N{Imʦ|N*N}D v)N/5, a+dA~)6ܺG ]7S/'yvc;f[>fb3-kЪúec`hb31rbsq^yWexS{Y{KւۛDjWMw-xX%7Qӗ6?q^ɭ+kB敵+akmIüҵ*>SaP.=ObkoEK]vEa)dӗh a6;2oc[ÈX-rچXFek{>~&[= ۷`7[}ϢQ;}v|rΥ3B [b!d=ɮgk_W;(N}XR_M%EeAa2%߿p_o멮Qӗe$Fb8WWR+mKl9ڏmK0_}%&$|)qr_}fٮMfj|}Rd0]% d݇:b=~_L~_Le}8 5}1vO_> _R6T'KG* tL&d6Ѝ[1aW;K{2}L_/ӗƖӗOӗ}d]#E/󰏬a<#a9]#a9 >eZ:|!x_G_vg=dͳe=/.Ɩ÷T^vO_/ӗrKicїT|٬8p6AKʢ{ g֣/iֻ x6gebHr 5{q{ߵSu#C }rt"ǃӗe2}L_/ӗe2}}u~Dat^ }Qøq>oo)0aVYPvO_/o-}ӗe2}L_/ӗe2}L_/ӗe2}L_>__NG,l }QتBn 9/&KXt }Q>,rqt^Z=Ktv2_3CY]7Wr|U2\sRruc!Mj%ے,K{uU݄L^ǰpՂzE]@rIK55GtOQ\k^/a~R_+2nMԋ|ItZE4]k|!;s?w;^:h%(܃O.zr% 8?2\x;uow x~VFk~oo~KN zۅ\њ樗iR;f,)'hؒmr^LQh*hwյKHEY`Jir]:;jK_#C7fJcRҊ ZFJ^ O(V5RNJҦ{ՠ {6 ї1UKf+(_l2ź:cWvB u |*zG_J8q_Ȉ˖c\Zd֢Yظ|Yoe2}L_>U_4jlÚR֔ŚR֔aM+SkJ[SjXM~MIeݷ-ձ[{l ؾE/[UT-%>W 2ݫ^oovA}x/r =SlL kk꫘{XdPW_Xb9=}L_^ @' ݜ{}P|K[5}yq1W<ڞSÞbz1WӇ]ZYM-tD-VUR\iesU[DUzoחUrAv}25aSYl Jv]sB cm EalɑLrȱ5_v}dźe1}de*>8y]4'4'C|r<|[_">y/ӗe2}}@V)14Y~gvL.^U#uqaiV#=^ðA"So!ZN/'m+ 6T#/xyYh1-,ZJV#/3-;;gZrjDƙl*k.*ڳ]v_-6B.,M׭'^R~f:]Ғ u#O:?_1b'3$e"F/OOF~ D'& @`!$/L܂vᏈT=YxWÿ>6_EIcbk#7E:SŚc8e<*Fp9SOo2/ATx JgF'c*}GUB/)b Pb]yUQ/Z~z>cP);/b Zim=c+ $̓h/t渶 (M.h4eS|"m|1v5> ǡ ʴrywҽ,>,/e1/(FA1vy 0k//Ю4E um@u{B)vt//KAy)} [m1˃lW|.Jy}$ 2[|CDon=fK}65K𒔪͐BKAH"e|H3t>C3}[@7>/,p8̈嶀N}[@7>Zv,$~Z鞾L_b'#G'3YPhlqQ}/ʇ]E-}IKj}QتduH;YRq'Ay_6wtߪ/]*Gu |UeA>%C !Q(ad݇%]L;G5|/ŝ3YPb¸S|P{C"rjWreї\hR}ЎաXʂ*,&RorPî1}-/ӗOӗ5,kޟ'EbʂbޗNll͔E ˚hlXz쌗 IWz%:m.6Yt{96y~|$԰>사{EnšΕی1fCGnK} ifv@3>,}tO&ЍqU!P@y_[W݃/*=UPL=LžD;3QD;@Q}g"xܙ~gb;H37ze 7勆[O87_C0߇Y}fGzʼի[喾[eɌ4?%Kvc?P{ֽT0} f7o|AiV7הJI|k+s4 ůMH<. jqM) cUwq}6 nT]8kMXiC5aV5EbUVUwg |q\ UEbs[f+* +cx&b 䜭(UQ(y%ʗVYPū5o½fJՀ(|zhE1fj zVq#:-PGiUF{AKi)`i{etpVY. BUVMJr\UUV}&by[~?=ju#wN N ط?M[7j|1,;* ڢSk.:*MurtM-UABKÀO ABGbʂ‡M n;HhvA}k.`1-5^7+Fh31&/? endstream endobj 42 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 45 0 obj << /Length 2006 /Filter /FlateDecode >> stream xY_6ϧ0{%EJM+=aXВV"K$vp(YRdgn{ir8'>|ūYC1Y&sw2! fs=GLg 9!wCNo3!> o ΝgR -\#rg+$ ? HsE~~:tvURH9qK'1="% j(3/H{MYζ,`R$e'"uEJLe5эVzJ|C宦lemtGCeՂ(]Yu݈$8]zؗjͦ3xx\pzh)6d0L_"76I047O2,fatE{wWMz.^w'=/Ɠ c" U/KfƉ}'*+Yw7柟@u j}GM:a Żw8T-ޫ.zEƿ^ʥ^f/7 }f$(-凁UێvyTEՆ<ل- x#~x:sd/^GzqBHD 7^Aodhcd(gOI$R cڔK]NOl?]x=$۷/ Q=NNs޽ ĉ,1oi_/ GtU벮z}M)?ڷ›Y 35DX x{-0zC.@RxqY|RGR~Znsg"0*! L>NgD' r8 Phi|"t`8ެyg9plr@ʞu騁/7G&9jzXmZd5@ؠ|SB/He<AB0`^蒱˙Y5NG Q4ώRxUU1lB(|^W9VzczjH.VD4m@(E,,g#Z.-6×uCo),-8EʢzdS%5 n1$yऋaÐ# Ey,<Кl5BiPmR#{ڗ~[[(ƄҸ`l1W`74_+.h~IU7U,0u[d|vGm8$«t  n9,Q+}) a(x陘7(! 8Lr;}O4/|+<50 jP= Q+>6j,i!v<.P@eκ}rLΆpq$O {"OvhjmAܦ߭T-=ze2M{Z4hM?ǟ/ZdXs̵OM$"*-z4 )*"f@B$40'h~.8ef~G$ \IJ2+1FM _=jϹv|-4P> stream xWYo6~ϯ/ ml_pGbo9"XQ *f2“:^1rnLHU#.%Kx?JAp\fNOq zu&ǡ)ۦГy HHxÔ,C{> w6Xpi 9^fPĝ}|-/."SdY@ nϲȆ`P+#H_EŃjQUfׯlnj)^|+|ʿ3xM !˪(m_MyF_FMc;$v&3nm 359v8srk6 uv/(or~+3iYpfMso74`K@8P6\gptͼjlb 9q"+ Rt][l{UT,{vT7UMق()J7vX.FBBR4- 61wcHEz?fҎ4lH@9+79QanPif>˰{Fp2Wd9zsPTXhpa.zÉ3ڻ p hm"nb#hX 19K(0R e>%.*h /ӦgK]FT5<|1x\al +ܜ ώ NaӚy]}+ל8.2g/\q_+?f兂]CcIa3fxaSb)Fc2z@>|TBF/O^ W+~lKUvrPu]v4 FmI[-\W(vߴna&v!LXTabx-s \RB)W[| endstream endobj 59 0 obj << /Length 269 /Filter /FlateDecode >> stream x]PN0+H]{ AnR^ )ўvvvgW3KVfs tΉJ4U`ZxfT͖ nT|o?R_VfD5sEeIP+#ÁlTl9>z~#o#j}DnvC"~}}l$)"1uqq?{_q**S _E)P Bމ՘0 U A 5. j: endstream endobj 80 0 obj << /Length1 1935 /Length2 22962 /Length3 0 /Length 24176 /Filter /FlateDecode >> stream xڴeP\k5wwwwи-8 s93{tK]]MNJ/ljo sgf`ɫ13ыۘX`EF.vbF.@@ K>cO>|qWVVgfsfOF jfN%PY8023:0;38Ond :m.i @h $aNr(˟6Jcahgdgab 0KRMuurC_*u;ӵ5rߎٹ:{6}&vΖ.G,m;陥_2yai qU5z_ 8l!3` |burwdw_ٟ:0Y:C9:&R5)%vw8}-̀Xog#7 O#XfNǐ, _ѥ?KkI?6` 4eTwvrI(kedkivc Cl,a4Ut1˥]>^ёDc`??gthbmtvp(F yeYQLM-,#''#OX`agx3)!02ٻ|\]|fN `#qFܜF .Їɿ3#hkf5+?ym?2~d`t`t]n /-SsVLaU'{k&F.N>C7J@#""l\znv3cVV5*G`=F27iBDAIвLG=ՆB ?(ѹ W"A(MuXoo*JSnc up [BڸTb lۏ'M"}Q, 0R@ M1h|,,ҫ3XtLD-اRmrLj' uH0>ZNjG@JyP%;MNvX '.j02Jν W!r׈Ԃ\8 ΟcK^ 0>T ٯ\QT(QgVnex,(}ȢU炼81ٓujcR1"KbLBCCe`Ps>kWoAPKŐ]Öty%)oRH}7Yo!Snik^K Az:@@N<[J^~$s*- k,VkMFR9N} TcOD9R,kjB4PmaNBGG vF[t||2Y.P>?Wްxrx{ gt yB㹈[Hl/ p}BNQ!!hwN5u,H*z3mUpc\T/tral<Q1+9kI?!ZѴE|Ҍ"/Ec)jkQ$4pWA=m+4E u >zZGn_Le{Op}t@ww͉vH/5y7s \O B+mI~d6S")] p-3<\֕_;<>n5FDOIшE|J`үU.>v]b<鳢C g!!;Yz$Sx9~µY=3󧥓ͻQE֯_⮎0~6 JYc 䳀i &t]>Ѱ~%&w~2RyGWrYH'|5B>Qm!*Jt;h K ']F"ƒuW)+yyERFn[Jqvbd* 9v&I]{-{:BOXT/Hi~,> i1dv6tzo5Z;S88I1n+Gv/1'FcBg\9icJ;}_2u |EO!UCKmӧdyH@g݂jKF#/!buM oZeU}jE|=1VBŪGx`~pƲ+Kv#vȩʩ+f*|ܑ@6Cb`(t4*Nb~Ժ%nZFr̒w8ԩAv6jV SWGҫD wǀǎQ&31Nh+iER9Uz\V&^kR|o_^p"%*(zE0"X}ȄUqn~<_*LTc;hיhn9D_7J$8%+ۨ[BTnw^hd#h aA_c u<DhjADS8^A#J7,ID۽Y!¶ӯhuӌ IϚZ[a-0=êMVvݡ`<&!2p~kcue /fA4GjZ.栥N{Y_i,!NI{qc[@PUȭr@J]b:3zqn}gP%m\ފf8UAyd6z6 ^Cm'>!jI+0BhMlLlGU<8W֩ 25rG;b/$m9">ZH&׏%%* Պ0ʽ&Yq߇qѤdBCS8agb7N bB>H{2$0Ϧj? .棴pVA QX3%VJhr)eBǵ=kCoF0ڝ̈́e\(`J_}],44|F]XYgцW%ƤomL*(ӯir*~ |o}x+KU.p&ђ -yx|BK‡݆h(,HA3Ʃ`J;27֎ Wm 9}TJAu&z5%A 0H\h#F^8b>l|k?*q{ГdAHm?2Nl؎Ĕkn?vIp_P,÷e,(x 7}FRF/ O&E z阢Y4YPF%˨VVV߱ 3M h65Eu۬ n j3F7ީ P5$E([v^p&x#߄g ltڤp@zKAPHK{q:;݃Zh.(a6#S;s7XBy1Kկ_g-`2f-'xuwzY~Bj/C;q\ʪ5:N6X,_-N3xY׷,10 " 1Vۍ)% KLOBidB/N;ZZKwg}S%: ЈKtYsu[.WKk>v[/&XdJc> }.L U%fͻhgˆÞ8Ml1[ELB衂)շYM<λ[MEiW#[f`%r<1f~yl{;tL: w-F]nI6_y-qfY I#tl>Uon5j=A_¢Ds)f7k[ݟ.-AsƸ6S+4" ?Mr_mKhRA;^U'wJ5V~ImAXE{EiH ,,j4O+-(_xcul=?ԠamIku׸@"rzPX˰]つgLHvTׅ7cR=UAvGkT)̐5{|PMD`fyc-/c>R,Si5ŸoGkIzN@:#hw!9x;Osi"L߃cygs&3%=Ym*|\=K5o;?kjD\M,u>L `8}E;G7` 7Q8z묛.U) E0.$d+ˍKk1JWpv$i|aw2^*CeOPMʆ7LL?P1Za.so˚R.3I!aMb'C++3vhBc 8I).Rx4 ^&s3lv͒fܙD䢟.9j|Co go7p6vynRP#ajl!j)RWddZٍk0! xHEUJ"Hv۶)QNoJҴx~>7 ;_+D Iݾ~Diߖ*/<#-&}拤ܢt NzqJ43 OҳҽRz,"޹) MH^Rc^"Aa> *u,Ѷ[#$d¨[[eDM_r0ԕ}u HAL'u!xiJ`be'wIִY -B:etRKyp.)kvN& %Bp+,ï7*[0)-m=aDP.Uޓs$H]ڪ%Q2&d"*q%n "ջY~>`*TVGײr#CVj}T$|pge7iߚp2!e;y=i+Xج9oNj$|wkW e3hxpAC&jÔT}=*f8U׏ovqA&SG.+e5fvy3Χ5|BT%Q&NIi`(2Mſ:RKP-J>afW4tTE^vLPKQl_r?m٘ JWr X UYR=aNS7i-[~>H~ W> ?PMdg+}wQ$ݜ1+ :+ioI*)2}T˧Բ=trkEnG: H:8M^fp.qpVEaEhK\,rc-߁ %EV2gLVF#1ɖ"n<'6. p>g^X%&\ızݿ o1> CGJn m][[:77t|< 57`]`Z]pLEk2;u$sU` e޾#0Wl%-5A K( k"ӱ/~-.dEʘ7ɱ-Dl>2npE4 ncư,dz#eNzc=ywBm@cbqNT )Fqvg32"&V8|#;#xݶ dM>E˶^PXup<x_}aޫ cI3RDSlji94k {mV  51Uw8C#/{Q+i,:Pw|Ǐ ʮy11ȭs`b?D=IlJSױ.z9GM!R$n\4]ĶW{4_t<<.׫2_2+wN=y| z+Z(";RQwѐkFuܼfL|-C bt<\ЪL>Yz)' :0O6cJG[9e8-&6ꅯ^3 뮍 7-lۻFv" sv W?<5')cfdF\sHc_${eia } FUX&a[**Zy]VT"zwߒ =gC7%&i)!,{訴s~ ëyeaB6dv$ťglg,Z)6K`+|{+/[N=M^jY6scZdZ:WʹO:8޴xYu'P޼CZy}œcw EjyDWg|$[^Wx3; 9mdCp3 ڎre#L3EZ\ۢi @6!>,hHF/ q2JM*K. 'N",j *6ἨBK̥[]rI,P1"ўK։A5wtz!SȂ3~R ƈ{lR[}"^Fvww*gy˰agtV"Ú^@ruWIO.IЧ*}? )'Ɉ-0M hA}#k4S7eA]1GZKTaޓDA=~Hf r|K[97-hU]ɮm w2NJT9Ӷȸ0JXxE: ԏJed86)啣3SzD0 .ݼ =ɻ :V甜?'46|vlHs%mڜ&Sk1ƂͳA3(&sZȏ9儨+_esONr+όo nn;fr/mOQkunՅjzjԾ[T:OA SQ=YY"JQ D`3YZpr#Д՗j>x[l:Y+ AٺOlj1(5f 7ޏ&zրX@*XuGz8;UJ'yqi_\JԤ)y>j;(P̱toN /Y$m@{e9}m":2yװ¶P-p$D$[P9F/-}"͡ӓil|F:D#eC;=3L[a>*968m,#>K4Oox5' \>vV0jҧ*oG: ɺ TS)&FEO3kIڑ(,[=f˷Ö3/&|#˿&o//+pi>ZG? i[䣝#j\M A#Y,/+ѷuNmcSdW.06Kpj mkr{:qfbW9.'PD/0&p(OhjCq{u!UۅG!0.2vvIwE^o}!o`N&i-}0mC T|?Q- l)J .Ȭ d@(Ac}>~4=7#I&-X)Hۃ$E߀—b-ţ>0jYL2-n^zʺj9nȝԬ3z*]m1V.\xQh!H !nPw +\dGzxZՌ(+Lar|#TRvJmWBH;Frp[`;ʚ9lz ͅrN%y8$7B:Ÿ4)+Q/>MY~k!MeMl@y|XItJB}BeIas3' k{8֪Aƅ]l'XuW|~Pb1 Te'p&Ϣd҅)s+))jA~dM?PrX+]7ΥUuÅeI7}=[ҩdzts]a9:'~0Ť"DalK&%P!5}FBo H*'gH$3cIJf:L-ܞhe?h%w05lV04 _ػOUsyTW×'Q$|U)f]= ><)>}͇5(i} - OƈHЬ,MUF1Vti(,s_#eg| ӌV&L+i}4ީ\̼V*׍-\u6x|xR1(k7 pQA@E="iد.q eude6cʫjtdlMڝ&L=s;j5,# rK)r$9 %tWx`}EG݁ґn"hh8Q$k;˦{/3rs wz*mGkFbˁ3bƾT|팿7qE- @P0v܇cyqKCf}Jׂ]_q K}ZGya|`”[ҫBÏHF+"U'!ն$ qEX2>u*rŔqE螫):Cd ^D-zn/飪inGLm(+GB5^_|/frCWÞ">Gej +Mu|2qRRͿ8lPx<Xx, /'Xr$!7Tҿ>WRQ-Y~Xk,vI%?- w7Q"~}JLRSL;':F @4-z^uPҪUWv .qDo0Bf,Ip8tZtOQFg/eDŽ^_<-ů4fگqP)b-2~b2ll躶4RtB+.MZx'iIL.xKQ@Ea!|' ZD1#앪 \Z_I#]!}>Vd-_ T:IiTp{9 ӃJA8 kd.Duz2^`FjZY׷`/鈓fxH_%0*v=ާQ+o@  ֈw=PXu姯VQ>AU9WJ@+`j ^N2<^ŧ!^FԜ+Tv<&ۙ3|TKXw\T4M ׭7_I_}cc_zYVTh)I,{܆"X0pٗ}5Hk>U ]>5`U쭎tI&RVaFQ^BA o]VNUCؘ$Vr+TA"!eO_Gwx#sfD*-"DX*҉tݕaIb0@dUvt(e$]MSM>uXQܰs4$3ƚD4jk6lGǺjTϻUqvKzO=P-}sh \Lx0 mR&V\1&o…i`Tkzt 'AEb!|{WZ 26 gksV~Ԣx׷L3!P|zf&@C,]e"ԭKw;ԩtKgUpŧ_Ԣ]x`oS咾fR9r3"34],Hn W[v揘bIH|&K )>9p6]'@;٫-DbZ(l3Zװf9.mTV+3!x,.k2;td)+iNTPU_:65WʨBc|(aq"D~níQ%d̎\,Hj/I iH(|9|Z(Ӻ--*hVtg@n4`" C5mq }he3/_x󦫤˜h tXƯOļ?$|CwU󟿕K(W h =綐=qKpY5v@4GOEEP⦡dEXZv6lj&`'rrNaɅ8&̸qfkOSehR-2=(vnw=_6(4=!˃,Fa MA]nW{EA$mWǒćr1"ZWOqxYV lpJBN?㳗dX<&hZ߸Y ) fpxgUg* K7:d>A/$eWM?ƾ&5 A9@wN,u? 4_~q2 HqG]o_K'S1ě*%9WuBt>4x| QҴ_#R-9<3ߘJQ9q6fr~d: w% Z|+(%ޜ6uWHK#CwI9ݐnvSG@t_ ̢G_ӹP*qJFQ љ!_b{5X-M`£*1q]iPVKQ!GLJ+:Web{dZD5g  C4OL;m͊|[ d$4OG9{vD, lo@F͔C|`1+B o$T'@MɴO _(P84ӉmFcNl6Ic۶Vc۶m{/;'&ÖAv%|~dVZA>Siޕڦ}Fq).wGUUVz0"\cSCl0,"A!|d%q$S!$<+I˛, u]5Z4:SP]\n΍w "2.wH6 ?hU{O%!́-bW)w_F@f9@hY*i3F.BJ]=a,mv[S6%:A6@' g ,_ ckX{nZj .N 'rph`wcHOő%Ԧ]3QH?\}*4՟|Q4[cjm>eo@d=]˕EeZ f-.2+~ngcH͚ .~ﯮt3])=koT,[Z iR}U&)ְx>(駬/wy F[O'_hӾ9c6Puy\:wkkl$Y挥3抖c@FO8RUθl4x:|*O@ _-B=tW[AF?nDNRQF[ju ~#mbN1R(\(|?k:N52lvw@sVqz6dO _ 6ʫ6]:p/c' YH!)P3{? ԧODeAٴz2Bn! R=>S=e;Cb,K"xdCW4ib]r>4c\f(hlXMYPg f-(9;Ccė㾈}lJl›y6Z%jP5 2ퟢh?y!~]ǘQ'|cA9œP]2,޷5C4[^҈'Xu^FiX`w+[Hr'p&ۀP&譊Df.e~-gղTƶ{(jR*Wtb!v=H"iipnQSORjkB032OB,J-F [>gTI`քme7R-<SGOXItQݽoBG$X(9W/Y|u4a#w=Oߵ+͆N(+ï؊N¬TzP"cǼ2ڐ鋅^ㅧaʇɛ;yh-Wss-k`|R~dsPMq໐6Ҟ&e0o>ֹL&[%Z"tX?fbuU;LbkKqh<,RPZ8W;oxCZi5[8; ։NQ*_$I2"Ҧh3 nTeyTۢ &3fځ =LC>?;ۿWi9rK[{~lTHѩXYpC/krBKHgDQGap867+ebNe.&?ʗ%6`Q+sBrɽ{ s)#2CQKG_eiqNZ<5Y`Ab|WvN*һ) q;/ޘVˑSRj& ҆#kbPto.`)nT&ƙ;LDbTiQnT م8K6RJh+žyѠ@ L{Ws$3 T-s25bskVs!幉=BB>]JdpeR 0]!~9})lgMUah]i갪s=Vyx ~+\noږwxt%[X=`UjWRC{TgBgڸ˔Zߩ7QҾRF yȿb|"Ůggq7)ԚÖv0\mGX>hy&RWG|.Fn\6u868HEi9 J7DEE}ǃp?fT4#)򫧔F)1(d-ljB§Ӷ 0h(,;c1? $Be&aS7;>*ڬ`Ԏ^޼G6 eWDV)ʤY]ͪma] s=e@eDkÞ"E+?~ Y4ץob"A.DxOw%Gl]DG76<>n4àQݴr(d2G+_ PbZc, !%qŋ{o lk׬PKCSAOt] ;6 EOui;_ QɁG7oqyt%e~nY6z*S;rm{jK}4R1@:6k-^aߙ@DX"fæHkMbmR)73Y/N{𼯳3[ASd6WBb%LPncޛl`x91//R4=岐$AԚ]ZӟJrվQ젬Tb{im;kEc8/:7#x1(^K&@msUҌKSh*D^ F$Yw`"01J=ZIט%e 7a HEj0\4F}4nX_Cx7Sн֞B.\lүǛIw( ^veZ 9.93]1P?#1kN ځuN19į i0?Pd tAϠ`m&_r9F@iNOJ̥#;+OMظ~lMÜաܒ,gb;gՐ{܄@TxK&uwR%Y>Jt!:lHE >'S8ebsGF3bݓ5 ~I[{e[\Bjg-5pII Xv}.uZLɠz)pϕDؔX ʎvA@3'E[tSaՓkj1+ն g-yBM kzr>O>)Vh&jGV`<h CcPߪh&37XO|+H㗈VںM7-MIQH/AҐIbH[[ %ŽX. x;zC7 EA^eO}ua_C9 (rH <:YUN!R50-J'wa(w+PK D8Xpd%&f,prN5 Tvb; cBrSxFq!p$ FadB>ΝiiՁåSZZ*3͠HYN\淽֭{F Oo`SP`miag ęλ?bf>ˌ_olY<S,H?_<Ꮗ5j98T!c~R!5j~m#tj{IC$}ܝqFY&(V ͺ!<:8Xyϡz}AT>JoU,2G PcܫNS%*drnt׭a-k xiG3GAxFK}{ſf"&8Y$-Ote'4xoϥ' XCkT/]$ڢ1 hC!L$94//r_ޚ4pKi3nO.ܝ}0G*!A0;8 G[,M8pҳŰ5woaԆЃW̤SXR,<`p+fCU=l6~r&3ojA08> stream xڴveT[-ww+ݝ%w=#ܾ}F=^VENJ/l`pwgf`ɫ83Ћ8ؚX`EƮVbƮ@%@ K?f/VusttpXDU%b j@R]Uϧ#~ :ڇχwyq5a5m%qf?w0܁.Vh+6/##+_YZ<mOg-ĸٛ}J2ڻ8I8HӇH3m6Aci򗯜holoaj0KQ  C_*W"7ӳ3ۻx#7ymS{+WO̭lwS3+d jrgO/{WO׿',&b0s>TL#j?ȓuKͭd͑Q (-?",& 4dCW3`nl2~<`}\݁Wg7?`9fVM1(.mo[ɿTS~cBmf@sXF׏f3c%fk`lτ&OT'L-v5hza{ [GE#ۏX:Vvthjctqpp~HhRҊҴ.ۛ:Y[X9^L=ahe3_M`dwpp8a(G70qqX}L131@? h?ݿ!??? +q]C^ϿHrk]aUWg/?L]C7 [DӇ@ `fs[N5{5/g{@O)Ҽ)ouJSxxd97iL߮q 1* Ƌ&|C:%2M(oj9KZnO+:9r6 Uq2|}@Z](2`<*Ks5'z(x!EgTx/Gjz30^ /Ȯ7.OՉn\;|Rv`qYoxcRsiJU>$8;R!td/wrN_ό*xPrv{RFƱ <7*81'mwVRoY߭&+qۉHLHM&{ AOo].<ᅼ1Dz=wc2B] \[>&s;4\QZNITpٛ#?HCZ~~as^x$vE-]cUm۳j'+t\q1"4}fW\>?",+oe}gcRsIW#xƉ̳6m1K g %Xh2R aߍf[t鸝 4Qs:퐆O%[ mB&ZF/WG%+7*:E>G((Ƈq(G=譠SҘ%KHsIU嘥fPd SukȄz29ovlr~É"o!FzSewhJShZ,>b50~k||xl9-,pv*oګ7EJ8 S@N镢{_2xOhˁ f '(x^ 1@E$#Ր$w8BgR}^h Q<_YE~f=bnFB<<)T[; 7.n>=`EQ)#0z!PږVOwV4%O/ wI:/JtRYa8'#?_TQhK2༰vs7}8tc { l$g}nHB10cQ76e_ 7VMN/لJj*zV+=C\XX!!~=zO̖5˔[yg|뤮HCUA/zdr֔w?F3@gY dzVB$۟g-]6O[ m?ږG1_%!B1D:V(Vv"ǧp3^N$#7HR|?@z2H5GpWr{Mߖa %ٝQМx1h .'/}d0Zp0 D<6I99ާ7϶컷*;#m嶫_Q 4gJ(+j뮗 pxZ[ֱ3ԀUш-ě'!2V#6Ig`+!|5$^My#7d||-f̆/cYcxEFRthl8P틨SI4]3ɨZOBy"oF,/ __[qu#ӝ+b4VYErӉeҨ>\3?=[Y:(VifӳC,ވ2t' i4b75z JnBsەo/Kp]}(8j\PR_U%cbh|z_a||'[E RMPNS<f8fj+AKF<{*o`y] C(vԋ-s^6)1*0 UD@'\ D~ lR㻗覢j5bqiVlQu,_Ie}:,VmRLj /uJ`>y- ?^14{ '+P;.W]*r)YݭYeZ !6/Y Bc)6>Bs^YU}v/_j2RFߔ?(9S䜌;FϠ6kb*N#B[*9=zJ-VYW%'$ M{rjT-PJT͐n)%qAolIoy0n|I:T =N88I!M䮃0\xH#z\#?>vVZs]Ww21ăX;R]`d?of9P 蘟~iR M:WV-8 ؇?DV參 iӠT.OtN X*@Ȏ}ʂ͂ oŋbɠTlI>}fiȃq $Tzx%2#sesCx?wj(m5D@"tcBwjH1']4=;;Mu)$4H}jbbX-0$}CTY57r < yxL $ב#̬:2&Ξۢ̊MCU$Fvx䎔ęlB=D (<~`n%6-u|X⑝;VM6Uh;yd<+ CDҪ nP}ELl,eW7W@l/PݰZ Z 'ԴHQ_=K~Zov=jq I˸ˑ!hcNv FDQ/7h8PC~)hSrqʵ>Z+TŊh5h-!ENzAXk-\;1w9mHjǝ_hߥكYu:mڐNsJgH>Lזm?4Ʈ[ åkJ(=!Kd'CdT 'c!&9eF5nat'ThH{**7d!t4\.251ZmUKs"Q{Mugw4<A.PJ +npA&r ="ei~vKZ>MigZO5Hp4R{h3&o]%%4 h ;J8TnO<[^q|pa;%bYѽO%A8,@Zv_6פ&_۞7.)xޗ{:Q4g_ۆ00nw{e P .H'Ae8kwL*C!TEQ)(O+tnŏulK6VV_ BtH1BնCk˳d+@6EY*=jm~:/3_4f,Ӎoq[ cd%P{_$S{3J~k7-JAr, ʂU4yn\6]^ڽU_rT;$q_ -֢%o( 7*Jghr^ \Ljmg}w%[(MqUZ q0Ve3<._56\FZNy+A/1|Żj5QLu~S6PHsPIk/dhsw O *J(Og7Y-(1^2ǧ΅p$.N&W@ZjRK/4>^CL)[m..p%|\SyDZɋJaեdcGmb$6J8opW['.1MlKlj%#e:k#^f:lREڠ F_UDĩ=$iJ^'g]3ZHm>ь :\'ah( J :ݧ}7AZ+U7@ԀyIg [{Q7G:\=n9mC1U*8Rm|=O ř^ >cXS^ @V47z={% #mn5$!R|~͵Hbx?+Ui[ifB)ASĐ]JC͆p|_vC񆮿-xoȳrOQ"`ܞfʏ>`ʤǎLX_|۰Ї8od%/RIbC<գ+N|[sK#y-Ql +l7)Gw@vh`0LL I)nD"agiy#٫ar» )#v=}0YvpS' {nTnCpLp*wGXM󿝇x"u("/I:㻽 w eOBVPFVk6H*VW*|.=: *5 Z*toZV-tM\{*q_X^XLV7Fx3\(t rvQ %gVɈY Xw }N%cQh!oXI#ԧFX^w+IVا'GCJ>XyS7w_R!|dˠ|g>%:-v}4⤭Y%nȞ'?<#NBD OsyCIýdC ΂ª_1pE9ҩP36A-Hz&7JMNk_rԒj)2VǵjpgV%[[v:*T^  . kLQ,t|嵟N?'n!ގ?饑A8;PshE}nd8C1ao' >VπZJ1UC^A;◎,1 Hz[Eظm[|PD^t-I2n%1CY$==^YAWlT+"9nxAV* I7b:@cW #py}Lb1aTNԾewkd>+^e֐Fдm&Nk{"Ѵ cg򯞵FuOWt[@Th ሧ Y矃E !g`okes(b:đbiA1&.vKo)&/H^llNcAm]%ټ A癕W 0Ut60 jgq+_mVkӵT)A>q3׍vGxd;+$Bn LL2 {peo߯rkl)~W8&j>Lƶp.${VVH.(򪚄-tQ|پow%!P0X>7yG i%\bwtH>% 26Z'/"5 al?TsQVAΆej Q D¤@̋ez#sőF12S|-JR.4pec _v&3*) 3߷_Ku}SzQArCObAw^AC7 w2ҕM{ Yw7 Y{TIJ jkPJixrL4 MT )wbrh!7K҈ϑlR7Lc>DQÅ*#xppg@z7:"#}`i۶fk3"~?SGk_#RXTo'LN3z-b[ItOw$]FL ;Vj^ CL0nEQa"6"<,6ɂ{0h$T@DTkX (2|=w&;/X('8`-'zk'3 $T"̗/BYuQ!xչ-ۏK\=p!kh(_"Wԩ߶R$d&lOִ1rcM_o%cA 4ڱykYc,є5 cW᜶iz: o&D6Sdž fN~klx۱/B _ʰ8xbrdiljlXGtDF 955Yy=ġ g3T^=%~w3*HPZGK*g$Q1!Dv`(g1$o|h 2]U!\7v&ʷr|DgD I;SAaQmM p~uyeHiQ#>A@4^g;.(5TO/(4֘XXJ<5~F/0J5d[%ғ֞ Hm`Lh?BL8< ?PWX3RB9\Ks8ȳr +8(k43} ݀$ɸ#~QQ`p87uba:r$p8}͕tXl9xaS>!N>x쥽,FIiޅC[¹'߇oe~&b_H5[P↢$͙PQ<)m Ib }`B2<.DeC%ƥYKC %U%ɥ,Y4P1eoAsj/(wB݊iN$%(}'`=6oN }Yv4~ ppz0&v#=9.8'I7D#sK'L$od#(s ؊-Xb8\_E2k>yM׷QYN>tKBfjdx-=)ՔRw {^DS|OX 8^KaJF9Ss!Fz"OD H5!#, u3liu=..yg"jp(@`Mp,^z=qP gD8k|}lS uC"nR("Z%}U!\4B=!QHIŻ3ËH=_`a긌t<+50U'Flq~˲_S(2Ϯ77ps.&Lha*ڥ8 1\h|I'mIʽF`@m?D%=|hIbͽ ϘmnI]ˠi5|w(:Trtek:s5徹Q5Ze,[)Lߟ-20R'[~0xi)XXgUg}|&cCnX.FA\u"RJ9:lCXՂa=ZOQ=!O|{ A` Ùak }]=`I?UWGUf3*io;Y+UV)Pe~J`GbIݦj [D [|)B|ycWsnLGo*]|90+fsVl½~IT[cUHшlȷ]V^Yev5#i P E5AElR'ЧzAK@vyZȑE Y8̦Q>fNgcLqiݴ y;aSo~VX["$ t>HoKE_+6hMDLS?b'׋舢vрuufD2u)=v2돔D0}[R&͟/l_'SmY'^ J#G0 8mu:V+x P8 V[Qôu.1VlNn,{\7 /{˃VOm svialmt/~(<*3C`Yuv|;%roH,(RRxi֑ncAm6?t2 Eն@5w_#л^CK%;+NN- 6͛ [eڥlx@Xnu@= B$ZOfR\DvJ >84#Yɺt_u8 a}J)S4[gɃAe1UsZ}I}& NX{2ye>UFĵxɞz2׈>aSt$ )pY$dl٬@bWJMo~WFR <ÑKYH̷> kFW=x* UbP\61~ =R8k +[U j=VUAuyd} !u2鵦&~"swsC$*xN]cU} Hq^rN'q1DkA]h;k Z0bG,T1$hdp~,P[l#0~r+7aVӛ\c~I{tGk1C-=HW:t8"GMxIdp,h- &(BC#hm4-Mu7EnW&헖09tja9+3uNKZ.HȢ,r'yß?#~gܰ?}8'A*f,YZ_0œ'Eٟ JG ’h3t>zE並ri Ё5,u. QCT .H")'NTTJUE6ܳ|cpkyTf#93 B竣DV yX %Yt^Shg:N4_w767%ԕTYS jw>8m$ijLA ,WU$uo>N8f*`]y-jq^<]NGO&բSvH`͖jX뒷1-#Q ܒGIi29 dKU+LᰟP8t}N-.9Da=TTD}ˆmu_x߼ ^"ώc9-".beHI;  ᨨ@,ri5D 氪iͷ4'ۊ|~%{6,]x<+I.}J 9=O\B{Q&cy`bLzQ}3Sk9ICt.$cF TCq'_杊3Xt[: MCujx;lXX_h+?-ҳb n1(ú]mHŕcD5L Bw7^GSnYqJƥ DStlK9"S*Ͽ&ۣA!&%g՜B,$ܔ y8CDh*4a^$l'{`:6v<$7AjVA1TWH8k*aMG= A[U8('PgUt0R8y K i߫$#jGW*Zg}um!q:UUYL-$d!Yy*Q`ykdY褄#dabhYVx;u 4e-߸TE9F#sk'KjR8 i絻PhL\r3~hΐq稘c_v0'FG-X?; ~*߳Y ?g^3>Am#}y%DHeW҈ߡBW_ϜW9hz"LaG!6 zVcNxlsAwWYP(rB(j<͒6fN2pi7LNM(N\}g5ҷ!\_(]7 )!eaD-rj80{*GF/B$t~aԺ,=Yt9x"Vx¨`3fmU'#Z:S|"if~W'.]3ƥ)mk@gH 8| `lFǰkGo $ X~Ϣpk]JdJ[5k~%ȺtbسUNAմ^>)~" Z;D˫e_. +[:MuT.`mXOkG9$bVN`m-NMyK%{NXZћZ[񞞗1׼ ]9N XR6v(ʁ4]m?GVϴJF3ꤘCa SKx{{ w$Z#5'?JSīla[]@PZbHPij ?苤L*D ysP y(@ m ViFYm,{7-j[Tybl G?\]Kj70JNFiILu-dHATsttUXЎBH$|٤|q=cTcH !#>$Wty\KO.hom R߹d_ ~O)J#e4C&N,).SbU[+(0?/]sïn\|%"9  `YDqBJ3>A+ꅇ?|I=z) Oѱnƽ4@ ܇DiVٺEd+i~LZ:9kh/f3X(y059[pm`(`2]eY`|TleK+ ͗}8fnėIfAtpASc0P&yĔ$y7(jj! yTnV2^˼.#۔n[̪ͬ?f杶?M_k6;΢vo0TSEI)r N`-9̽WaSSRmQ.Ӏ"TX'f=B 3B@Nַwc<񰣥ҿB7ϵxLH~=9GvY]?PW/>B: HP3b%#32]s5+@KÓ~Bb  Quj3=ۄnnTG?aW,5 Wenmq+oj x](b/UV*9ĀX65&ш x‡g]sJFWLEc6ʙ¹F:Ww,"]J7e )$3o0š @G+KpVfa&A̼;4FN[SIWsLY9zZ̫^BM^^L1Z3 . 2icBm 3bzCUZp;1#/=:x);cS`m+y;d"Yr#IU׃. W \)]A;8H8"9JWeO9Jի oĘOaa*1U~DlrAK{F!dHEl@-K΃z z?pt 7 `Qtcٷ}m'R J -γYl_C zzy7p_nq{zPԡn۸Fgy^to@rJ-nr[ x2|k:N]k?n(O1qes{y) s@R2 kgU-IQNf%aԢ*Ga/xݳ3'뒬(Kd:RwvȑH qO<eD{6f?2g!Aм+`i?b83*0K>.kX|=]yK6s;@-B_4KrjF#',ߟX՜$^Ϫt]y%|dUHIh=БYY(+ݨce<2ir? a}u9W6 P9=h0Yd'R+=̶F~A3zFcB+!*^uc8zy9-8x  f'|:ps)6`4;'WfzUGwZ Yݎf ']16=C!JnWgD)fA}B( V~{u,KMle.^5t78P:uW1l!C*HCLwuPZCuX2.3EHa9Jѽ.KM>$z O^xd4d)pgE=|-ȲhKg5\n 8ԇHWM1 pLT(e* X mRɧE@:nh/aj~渥b32emh/Ts΄JFӑ4sS3Ki5y 䠳H~)Aώ6J){ϋ׾CayQ@ e; w^2t֨5QOb/ `5U̎">چ8R0srsB=RڴdjVU7SqB_fg}?Hr0=3G3O KtI |9yƃic&P \Ȟ*ij^~Z¼)Tv޹c=3hqw.j3mByU} ~+%ubQ*KyЅN[ [BVZZܽx?m؞K5G1ߍv\3n$0̰PƕGBM<JaeU.@R.D λ4鴒Y}9*0z}nt-o$qy+}[~dK,#`t1&T$NnDLa[' &}h@4#Q=1q 8*VogC'lN@Z$ j\ /XOLJ~ddUW ?1_E3@θ>zKnJgXzJ^@zr@tJ* bO_s40K sG_r]5C]H  BȮD$H;}{; ?O~54.U1}b%[}='X)m3jKTގPf4nF=H3%]50:me&@+s\P|ݬrPn ϊu↓/3P/5aL>'0o$y6~~Pa[9ņ1WyLȗ~fZ\FOxLyT'2NuwE t렙MR!A%MG֔k_5nڪӘ.@X}fX~:Ӷ;0&~OBD̉˭0I`V)K7)} @Au?MϓiB^kR|N%ҌE>);JObsO(*O,prܥJqI^Se\4֯PqX[)~U R*N΁M픳`}Nq|.O~\Zbŵ{jv61u`Du1Z` ,g6U7I{'KU ;؆8־ö<^k4 !EjW] "[Y峀t 7ިɀ% KIi[Py{ȷ d$e/3] \ފ+~i!_ ޟ Y IDIƛA[0żu~%SЃo H' G@;OW' <32u+és)_؉|zґ1 3: ]U2sӿ|Xd1>;raҺp#K:, )>[$Ey%\ˈT>o\x 6;FTehً̘8"Lp4 ;&ܛiͶR )hZ_N9D76N8-:q, +z"=6j X"c Ewfd-Sˆd^@06-В)2,#;(N`-5~x<5]g +rfC~/ P]i۵FlB,qKa!MswxyŅ8ܮK :vy?.Jjo/0Q`T PaKJ]z’Hnnkl]ljolHFeKì1 V2nAcn8S:qcةDԠ=hĆ 2E4w'<%n;1-k`,Ag1%mxtzz! z7-~S-USe%7QuG~h6L.}hb2GlE}[n&v/L̯;0i psC}! ǚ.VpCh+e\'~+'Mumjfe$OJ}t>:i@,5V E| i΅Kj\JM bxr*?*.0PwM{3tȑD]ʔ`Hv噴VVP8q~0h> %[dx5.,| ?su:_N=z^gZ:t@[ *AW  <]]3(N ;bE҃JM.(h4 F҇ℓ-gcK&NBJFLVm*ʹzRo0䩨Vt8tP/?[Ƨ+Qv/@OJ, { bZ?XNo&)UEcZ;r/_073e!4_7Kg/J"^r)&~N ȑ)w64n 9o mx]sޜ!?"8l]2RXѤ:f+P/ﱍ'oh]/5@V$xֳ&bXϞ- 5g:t7e@BLviɹmP^% 8{uh0{@:CQmLh=ca5;wn`oibx{o ߑY a Nv>ǐ#^=&jtb\ ޴)si[>@OFr)S{K"zW2խъgrp0唶qma۠$-DO<kc2][HKQ#V*Dƥ0tFĬ[;A@٪> stream xڴeT\ͺ58!Kpww ww'nv}N>;GgzjɈil "6֎4 )i+}kz=Lhfc-9d Azz82(hr @G}%7[ R gHcrM̬@)6nf&k0;[ oha`aз6HJdl\@F35hoi 1(ʊ QYe9OŠN6EPQIY /$ PD~UZPd@}@ӥ~p;n_ARmi4ut夣sqq5qrp7Z$)_~ @h$b/HJPob !״W86JIͬֆ@G}G'?6/Ј_A'{=e6K]2-K/}1}k'eX;98:"`lf YcVT 5 HkZGWӳ8!6v-H'G{7;6.o퍜l锭윀B2jhJ? `o23><G{'ߎDp l#3CGШ ?ŭm2 tNl-F@c8:GHPsh߁Vfn_!l)el-g b 43s44;ږLʿ%hvAߏ/ 3@ciha tp0+ @'-$"+?qֆ6Ff&FV=hYX 63,:ZkGP `lc{CYYtMB:? @' =NbЉA:? @'1$ ?]u@eA P??OS@U@58@55 ?߈hDwdo7Z[d54 4bxZhl'7tp' BL JhWfq2 $ lѳ@Sj :AClnblAlA%@ c@Ghof % %҉l?\#_\tR(9 ]lJp t pkAٮAPy H+?@܁jߗ? 'm,fF7B\5AWٟ[lWf&z #10_65׋?Q ]ps6\I߿x MBqОcIľ[Lh"5Hqj{.T# İ|]kN1CRUO^- t(^<BP9h|d{pHUڲR0Јno꺀ێ0ͿH5sDNpʝ4{4a%ChPvx|0RRQEKj47Ȑq$|'\ À# Lמ|JI'I)V i_MZy]]Q br%jGӨo7^j4G^``ӎ;i!F򾾜I s&" nљ@~&0爁`,?9,ƦJ Ϙ L^iX^xchٺ _m6c͊#< Vѐrk vFvQcP:h[\1 T4Ñ[!NQ RD\1zlJ' jH*Ä1.֋jE6}Q{D, ^<w$ 5. |o$KMƤ:ˎ|gC}?o鵂+JS<9/qVNUG _jy:SzxDRE۲?IxgněS.5WZN>"kbyוKq36NQa9dy,C #Gt E#:GkL]Q8w/ ^PxwQcքQ:x<=`Ry47vP:z4$S_9>\|ܕrYȃeM!Otd!g[ɇ||䣯FiyLoNXFBhݧ0bL4j4o<;'[sgw`PR:ҷ:ʥL]W,Axm)!/ V~Vs*As14 'I^O:?Oke1mȃ7 X*})7'ҍOv}?|2oafSր p4O*| gjCԹp#_ևJH-%m-H4!.O R0;1MC" w,1|k 2׿+0*~%+-y2zo "4LgiZ0<{@ *-'{F *;#+ldoEOAUYGԞ~vq_aVG6u6ZPBUt ذ8ck7(4[|F}L ݯ[6a0i,e,Q:V=SY޻3qa!ij==gI-Ƒڝ]ↈ(,4+Ƶfp3y'Elm#d~(y= ";C~v@l'‹kD \{1aq(yρ ZEsk5yEA5}$Z_gV#ᆟ}My> [ӗW3-TȚJ7񑴇is@\xHr/YO 5|7ӟeǥ^Ǖ܄wfMsw3V24xun_AGUܠyَi_KԡD-|*VtLX%Қf!Bmbn,chƒhb"=K4ŋ{˫U/$RX&W&z0 B | 7rhLU:[Ӳ2`ydLy@ B1nmWdeRsb/(c"(Psv2mK5fOʟIʼnVrrQuYTɸrH\Mdkjы$Su7Ddj^lGm/5MMΤ5>̼Fv1s@<";hf*)Ts'iq)Ŋ $]Kō@2xuM-|s )f̌ǩTaTtNcyO,WIM|Ro~ѷ` ';iҗc~ًU7؀ ȨVG6)'~Y]g_5=~sN ޴p6ŧy6+G|hytxj&Ad,ʥ鲺KD[-_e}IK3&ULDks~69Aj=ahBlYW+3UK9oa b.ٱΜ M#=Y I.;)lr4{Mx7Z'U_hZX9 ZZQDBjðOx|wѾ ̬R0/Iem%Lm "sv^eibz(MLsJ9;>fHdQN+|FrwKȤᗺeպ,+{m\  CƨbքXResStɌ.&o# >b՟B8nD`i/EA^#Ț"6#9-}7Px4|b4!_u]dM\zl8!Q~[z`^D;s8f,!!f6`dh9Vأ ѓtӘ ~r>*xF[.YON'9%Wv{1/霳zCETruY-y~IVD|z:ۃ(%3 ;Xpw/_`1idGEu`tzDHo}9 fvәr)\B:nW3 !:R}ȼK ?թkB#FL#Y:TBMF`y]9X᜴vtL.#bv^g=E[kˍ86S鯄n~6-HAYȾZ=1C]ֻ|I9" }0*:ϐx?TSxѸ!r휀F |3Գ" E+F#]DVg='wpz69Y_ R@I)j]JLx;u?tba=FNj '@PxIE_m+?LRW;wnXb+Ba` nv*`BL@%,ib]'/.SRF]+n݄Uۧ-|Da9N8PW6μ7*|/L.[XE[H@3)Z|:R:Z>}I?Oip^ôIl׮y|DTtk7]2^ a:oloxn;gP7|xʸD"ښЀߴNŃ]BpD/7rtGl^jʻCLEϕ}ZD>A];Cq<}cxk:6'uk`Q+2gkUjt|#cGBLYLRh~ZVd3i~/+s;~ߗ$o.BevIHiF"q"stA~ 0zVg_v0,U%\SBF̯&xAV/txóPUZ;Is^'+N`5ZG v 5P2*w|MMC2d ~]@1d]oye3(gau_l*lDYBz7&P˱foNM8!w4O k!4O9JXJAP*YCn:lnꗺ: 8y|ώxQ*g q*IԎp3%ԒMW9Lis,گVYpXVz#>7DEiDJx,W=6klMMM);4< Y e4zֹz Ib珝Q+iЛwZvw_qF붷?+*u^xCeGʬFD=:k7YƇ@R#<`Ĺ~ACb9ڍIݺN9ǵe1X`d}c :}/yhH34S$AǪ=Cx/[X"ABjO~β%#$44 \/i⽯s@:lqU\uWViZօ>SB<#FDmTTۀh6u&~(ס=wH2OôBE9[ FӦz 'U *V4>y!-.Rq> =gY*zSzPb(b.fsdMFԼ$ N(bѵ.aV'-BDYG03.Wl߰sZyC3A H'BGfQD.<}p_‡(K=p.t]i!fSŭ9I$唫QkPxNxblzT4Zg|ؑV'541x8Yd4zoz?ܥ/1LGT(!4(d 0K-)BWGOX*΁q}Mį[pˤ>|)/ʸ1d0&W3wmwv3 $+mG=G=0Cp)L a)c G&e.dw8b F.A{2l($]1@i ,amuEۤ0Z-jQVn 橙Ie7/a%L@9\AEP6 *!3)i9y(@4t[q&Gs˧v٥S ٝK/βcO1 u 3F#X[/|i#X fEuI<^ 9vmY1nT#ɀA|`OIbEѦ򋓁 gp-D#(>o1+vé3?x7y+?.ZOϟt:ǹ/!u{_*|s.:r/1QNIlh |yν[1B2737].%pg O:-`? y;bµIMbU~D <9ɚRdt\(:N"ώ'åR&6eֵ*9YJo} 9#U~9q1˿JLG[MWk1/]nRc#T8Dd@”=~Nv=hjowNr򑧒dA)-U\Mz/Tv'K&A&\yWِFCwakp{5"YՃ`?*.g>bBCjG^(9lb"(Q֠οMSO?#bhޙN,_I<)>bNJsNk43EnGܛ+?SC2P_ LztmS؆8XGG*Cb*@>l [f}iA}eHU401yfqrȴR4%5޴鯉[J?]5y>bt' V%7S~)9hh/54U<JnF:v`|LlRcL@eηt#To͜1/ԝ_t>)6hM)mWQ+0nZuԍ#!qҧmx[*PbCRf7I^Zg͋#vchJ> MP(`'#2ýPU& U_d%EĴ9ůnЪb7lmpTަ( vw>}Bhޘ4QN?]] e;#Mhn]ܮ5%idbEO/LL&ϕyfVŰ1I-?j.IUgP^;)"VL,*\bZXĕגPce {ZO&ntj$"c}?ISu{ e._.O@kK 1*4RRcg rv~)ھLRa͂<5ƇÞ, śŮ7 Ŏ[e+y*~$ؽVQ)&SH+//wM3W|oB\k͎)%H/iURF@;IL"X<Ǯ31TKNğ;?JqU^m:b;s?Q^4uZuu;KKs'+sJu{zQ7B!(珞og3ZE5f0+rxn)ABv7d7 i'r  f$'_7V}VyϩkY%%6e!GQQH) Dj- z+$ٛtlH\WK7`Qb|zY] @v PY~h8|݆Bk=0d9 9_NH\z: HhW-ݕ=x9#+G4hG |i $o^NU*OrncE?v-n*4.q}Gֿ >~H+lX@B ikCi`ZFǨ3co>D- Oo+Լw3_ȌKB`iA ,V: 粔{ߙ&GͪG2ăj-~X$ٯC?a3 #^c!n4Q$`6!7?ru.XrOgdbeWl,Lgt}؜K=J nQ$ٔ" ݬ* hȱܲy) &=~HD-'dXP O(!?GQëU=]^k laJ^`s˷5m]LFSU/NB]y)AwcOOt7 ^.l%9 ҄:05B(c7Ĭ i%XЅkZm.H+.tZ@~[1;&ث 3("ƈլ%y<&zT.il{JZk$WR dͷGèOhR[R9Cn7j) s;i*K,BDDz(yнy6 ]fZw.^TV+.ˮ7N‹Y)]ue%aSZ&%/R38M%wcrCUE@:y\ơv }Xmxm C A.Н[~Mֿ_VjA4@:zTHKD+)>j>1=.DH[~W2w Q=r{9qT 8':D*C>e6_2rAeWWFc>g A ;в|z8 [*҇B,SGFo>݅rH8=n ^fhG+ l/f1uN<l次7lbJ{-ХsoRoe-:{2>3ۡZ٨Ov1SW/1s+IDB{z2Ijv7Fޫi>x)N<##x|KlF4:Cľ86ejG2!|Qd 8tf2ٿk xV ghRO]*nLk _DPXR|]p|'GΦor5Au WT*W@AV켡p֣U\!Ӵ(@}e{[uE[/kJp6dN3)Ƞ`edDOuyX:T%ڗ$uonxO}$G]},qܾ%NjTAŨ{8/"E7O$Iϴnk ASSfs(s(;Ð$,uQ̕"27E5RHs{M) H-Pp[{W\0Bv-@s YQTf[V=J:p%rxp̶Djf2U+*ȭ* `$asKMU/ֿH(>=:( }f ,.\x6F_WH"u 9?BB0,ݓuNYgڮ֦8)/7q'(,3=3]E%`-DJPɛ Bzg9H/b@qO+95;mr8}1`""hTO:Zx?f6NřY*b!'*3ajshT2"},DyU-*_B(oU8Mfx+#rh ͸/en kS6 Ӑ77I-W_>K*"_}I HQ]enŽٚAF $g:)&4XJ[m^O=V_}hik B; 6a]9hHAǛpmUAK_d=ǠB&$nY Csq汎GeJV[JHʋ ЮjeDUwΧn}=ldxK33O&jF.+ `nݺlH ,)x}N2@n[L9uo޿Lx1=x|!)EgIcJٞO\xxh,p;ޞl^$ x%KV qa`H4ICmwk"e//`1֎wie“%VFY2MB4Zt2T Vv[8< We1ؽt~-\)&<d Ams?8.4ۇS\ɵDB`OnOVv_fМK'O??5{뫹W+"BUtR2#UA#pYix]tKWC^W꠰DpN|c{%Zށڥ7Q'ndzj@VO65JP4-cɗ=9aLNކ|W^*:+p <-axD+w9,san5!Q+\͎;~)dϛ$ `ĺy!) 9 Yt©4Nǔr~9@CnZcgI7\& j{hݻ] Vɰ-2WQz3ݮLv9+cuT,|yہSJG'8#Y !|p#^C#"dFռ %(2BwYrj cUC'z" IGRA"zV[p"|bݠ]jO%HŽ7QyMMp HY#ҫW!&$~8[2aF0W˝cZq-vT=sA/`cɿFF^tt,UBD &%6Bbhik4}8!QGuoU PL1w (ˮ/Cw_b5sAXnīI F:}geWD4<ρ)ЪjW=r`R8{{cKXRW2< ʎCčp?4dL-G-c𝛲t>.@< %wipw +XNj3<& Q5(ʈ&Aߢ=1vOFs}Wo99}"n{wZ̯=Veb"5pZ#7N k H`|n1@ "|~[^6͉=jx k^Ij:㱝k˧0aUeFʃP]Դ%9 >ː5Y>-~\fqX5(>EArш%LW;S.0^Gmd;^2uKJWUJ2vXȃ#:p1jy5yİ̅8=Ư{Vb~ߍK-9EA5o&u7C�&՗%پ`]uϞBXS\O2{8SH q" >?6`sK3lz,23H^j4C׉ .(uuYq3uɘhZԧm?Y+U PC~>;\|jubv"܏)f8Y% ũo 9nE"=J%֠E0B$8;}Ën.OD`$V'{ŷ7݊8_?0OZp[1B,0>}% {:^:v{ z Zcݷ3\ڤ||έc~ 'sѺ 5&;'4fO[#q162Cyb5QG/iY"OTF Y,&+x0''VnLcyO=*<}U fQMPm  UX\)&ntMM5E|܋DcDx)yzN!)}GQHQ&ޒJ%R:"{_̈/Pрu@Xa,sz玜~|_r` 5)2`sM. p'#97\?K.ijOa<`_=AD(FxOK0cTuyͻ#,?APEǻ%8̆*FkX tqM/V\$Z,FVV.Guxif o%zJTjr\xOH~59:40mEccg+)pD0KAa>vb6>evQ5@7y`%KN #w[w{?P}ΏÏV`;tP,RnLt.+;ks&&}.A>]utYl̼XRV5צ+N HO(z_eW2&Sf26ׂ5>paG9Af<\`-0B/0]r['y\?qGL# D7l=${v"^"0} >U鼎 |T^v*ʄOMB剀G<֨}!:aWta@in-ӊ$r;dLRA9,f0:m۶mvmOm۶m}kSow.!$ZvW0\h? n_߭ W'ݛ7&x8ikG(O5%Ŝ\MUqN7yg`Gp@M1nP#HDwEEAjPZz['sJvH0:Z5F6[ ǍCDȳQ %HD@jqk L0 B8:N?Muefb}ۙ='"〶&ĥCP;BG޳||}kUΕ`p5~O1x;&D4wyA~jbm.op;SB@8|]D٪&]`BVWsZ񹛔Reα"Pdrtu >vzG\c$omv߉avz²њmF7<.{~FXVr-Ibjyj`="w@ܱH]a123ElJ\(U&6]kKR|#NwaqeG_2ٟ܃.~܌c*WcK? &<V8C}i siV2(u{}G{ +r05 h;|Lel7]?+(h_IYnBˊ_2r#'JA֚»/\ m?OPTC[~E(Ľa -B&ko`\a^r-sDTA[WLqJ+3P(o%}^;ܒS)[!o"$U2MlaEy/(Tl { .j=y]2(7[.}`XMÆA) 檢"Y~-EuA"eaŘƶcd/ yqw̜Rm_hՇ죤U?|Abe*﹗}cmKDڵWqh熏;-T0(TtX:'kWifL1 Yw!TE f:Ͼ5 {/$t !pi4IU9u# a0LvBЯrC7d:g{Hڀ|;"v{/]?L[kiTsܵS~N@<? kנT}Dv q䁹 n(0GOĮ:| "fϺX!urayOW}<9 \pas&MƊ?(c`? -/GV8lF2܊CBV Iqp\DjuJQ>Ri{C? ޼٧Ş Ѻqi2mO )s(X1o@+=YHނsuա2]G֮<ƪU75=8\Fl8Xii}o,pyI;Uq7ZR0M~;AA•~r3S-+%ϰwPA G*!d_E7E7 px]8C>| BCtP}vfT~F(JULjֻWMSѰ w>b%M,U ?9:U9VL'883Ehϩt(+C%u6aO;>kAp6LC ^KWGʫr[P.XR iG$Om¥8)ܕeJ򹸕y-r8$rkBl(ϕO^FaFrI5lI_qEс<߸O 5|fAgAGcE#M 6ַTGA|x%vѦyykVA?t1ޑV'@>a{"$!/(4Ӑ˥΂)6buw%G@~6u=͙*RF= 8E%ЙKJeS3LQ+%kvd>5Lf>`ퟚ}p햄hy )+v8 )lN[`Nq#!y3YC Q4d^VֻG:ظ9 +]ޔ3vמKpRMdg&.gEɌ9j|K cB^~lP0x{s|pZ8a NOb)NM׊zR+*g HZb2=z<9)"K4׸);*hЬE (Gy3Yz3 33#+nP(-mV^LZ8ҾV6z$dώ9b[tBKHTͥB֞"'H`yK.Y#gG#d;&;JeC}{#<h.uT !_]dt%}>kXrƄD @<%l / $=sm51*D`''ԕ _yYJEUdZ$c)X,)7h+aK|!"Fz&+md(ZDp M:.jz*=;+iwoӒCdP?\9uxgߑz>R/Qiá %C-FJ .k"*P=/rF`'c("] !+j_gl{G84JܕUJRde)S-p7тz36Gp,K=?`>j~] &'I6n@slPQK\Ô#o“?Fiґw<drjAZfW>23Weu6yKiJq`2ʩQdgIr=9xػY>622;q)pfgL|Gȍ<_=]]>f?Ynrn$OsS촑K,qfm ".|͕$Nt>_],^F4{ajwI]b0͜d;)fn tI 57}5K$d\9Yy+ݣ-| ے@:\;Ts6w: ̢ͽ’(xEYDO *ZLwvs. funšÀJ51VCNǔ>fU#(CML>рÊڇ̅~L9s+؁1UőtI'@~UV+*|5>[oZX) lUS-[kC#_Fs8=.>^-F|*.9Ƴ˧yiE!QY ɳv 3(ƠUA\wt,$%?B g`n58q ;a@,Ν#]Š{O=6L*0MJWDz] T^xQ6fGr8n-ޛb䡞ijў碓`@ p|wt rTυ;'"j cxLhuo [|ۖV\oUfv8` 9T~1 J B ʋ&?"}#DqW)TԠ!~ox⿐p$;hboM3kG_NRGۙx&VZNMc|?gVєjT@@BhUI"g{jiJef;nktWΦ[g6qJ>H1*](Qz|P!idH\|dl,}fs)JvtH+aeڕ# ġ>\eї }T [W9S8jI\K~>>]WiCIN 7C1K?"{rCJS-Q։[<^AqIU>%{+xȥ@.!bvc%xO&,~W/'0׋]].V͟=mACn~$^6`rm!l,jEx! $ E! ?CYMZp|j!lKb<,J7\&XfBޭ )nSLPkݫ}ߊv~q< iDW[SjUSۭ0R*On)J Wș|̀>#yxﵜۄn>Xm!^pc)'m$ }X s˵~,w1ÍZ^g 4+7ewֿׅ"tЩ !^.8wRGۉϑC2 33r>1K 45kc== W;'K _t싢xԥx9=a?Tl&/'LU~YkC6+~{3i'~%| Ad+2>OB賡\g|ї1,!nD)Q\~T}k6!H) J*T#^\ŶxA#ǑIogby-(IZԮpPNh)dR]#psI;e)(.=iA-wz.:ghoT0e"]οKxPH@[Zf;wп?<10/d,DKH쓼7h(daj$)xtYgFT^ݳ^^ ~wJױ|GqEHYzDމ5U߱{ح>n6!3/!sKRx\@`a=m8_6Y~0 Oɀ_N˜v~Ȍ)@)9WWs?D="MK*`n&H}rQ$4 MB@O>nxIM;]wѱs1څւړ71zÑ%y<G ѨZoȼ 짅1NNLXm3+~bS`X;YG ,bQOx?WhV di/ AθhmdaT1DWox%&Q[F-bOYe@ZEyL.MYpƳ~Ղp?ؓf=ߞ % ljPh>VlB EQS$&{JZBNh B/DmrʞTVz pH!%I40Yѩj}Ws}^׈w.$TF,ȕ7{ q*QXѮŃ{M?%==M, oneM ^4&M'>ؙwݺXm.gzFHڇ]y΂70G5╳͖ m5IkF 3ptue6I`͉Ǽ7׻Az;'2I;}#zуpB ..ǹVFXm |bS˴טDRvlUKEAR,hYޞ?{5 nvl>r.Y4wFhcZ',$Q Ie}ZPrsAcV0g WS?{D=n0EtLJ"Φj%)|@`\T~p0ijV`zp`aj=!pGB<;Cr\?\]P.|E>خ"!Fk0?5lۍi4qQov 6 ?j6*ӄHlblo"a Bc ɺ*a$gE<n/ogn0y-01eb}5 hq')ŠMJLIГX)*7Iz26sg5INm:-&^&gپ[6FN\/={ECk&=)GeLǼR>D_N.2e_ṾO<#Nlbubd\w-ؑr{[Y%69?!o1"/Vo,ᒧer Mw]1q1cIF?s$DAu˚-ʯ?:I@h&gw S墮x /SR|3ďuaA[ @g+)V}aRA'Zގ`iɣ5-ԐƦmjF-E;=tb)$b Mq^ߖT|)*5 DwK"ϓ8O ,ckYp,]7BkfNf;,TJO* G|&ߴg3B6j-U[VaL0{׺~^gÑO&]$_]}9[y N)pyxylcYV㬾FՅ`@!L=+- / 5)?cI7Wv-V18, xjn jsz gl: -hC2Cs"c!U/4M<ׄ#Z’u.`M|0t=ڡkL1yB)Y ?',̈a z#sJY1KmgDΟ~995n!@س,gyLu);IFq+jmj!y6瀜_:@ b d?1,w`<2#-R\wZ3$rmU//2t{j1D*v| 'kŎYU])E8ཬ\_}$ԎuMK S"VBA_hUnERs:vy_p5׺g3 g!#ӔEg\"Z<)vDExڵq`dfX2< he02F/wKpLu(}p%=: <[ujVyWb=7PЮѥ*Yޅ_X6уwa{s ]fǿG~vU^iFn,ͣz5AQ ]=BL{LyJ{S϶В-i8 QRXiv ˺ Tnq v?ſ_p0C;#P$Qg99%5mcWD,cXpg&l!;WT{rJ» "#3mLq@^ cWfi:: oNVqw[6y:!#ZDdak7Fe;"$2J0 Dk!h%w{O1v%rnX6lDl6/*_֣Sgo#UY[̒e'rG LD'=q# R\p0WZ$"-baIzUpڔA'С:Rb(_KԪD ;UXjօ0{v D`g!;<nte٥郛;&$O/O!h-GvZT (.}V|R L=V{iѷ|DHQpm;V^.5bVp!'ZX6w2k KNF/u}c[b5~ |rPxˆ,xbͷ[ o!w'2`6^,C{Pƣ 2f_BAڿ~=XǮWZpJ@bZzMLf7,hry? ɰ۵Ň2Q Ov  Pr]5!)]c|EͬLߌ'w-A+>a:hTܨGc>2~yueq<[ 3q|a1$ݴkK-[W!kݞXz .m6j cDy3릖#=:2>{d=,ӷFs>`40ij!'W}s3ݯWh 'x b̫$sy HV}fw* ^<g.MW'N*ǖ=d=AxWJNdɉY[~{YP񾌓j>Ѕ^jw_W]gLT| Hɏ`ܵ-ьg XJk.a>yFj4Js32Fqx$%%5wN=-D7 7 p e콊ڀU=7'. <Kqg&yMA˳NZAv[o&hygr4VfdAcQO jI>k"3}[)]ѓyf!pJ@pL(cagjd:RLXfjed (Eeϗj5[D:"--:0\r'ӧ,-ǷIǛW[ Kf@ SI:, ;W|-fW*X$)f;f9[ӝF>,KsI da),_\'b.ˡ:+j-Xlh'P)iSH;RlUq VxAgC=="]/eؓ-5Sf*56˿Sӝ&eQҤt#W KZԲ _ZsQѣ"tv5:FɆ/Ut !vswkV')Zܿ+@t@Z5L_XZr܌(^o\_O,='nϯQn{GJ[=OÖZ/%"柠P+;O ض!L xG) ذ㘦qyX}eήO]l\LO|Xhdp%,)y[a-yWlyw[Ʊq_f!}86%!wҲuo˜4_ìQy~2+;HS}N]QMHTIJh&u_g2KNHM3Zyxȅ,q!m-hhpU*", |j` ׆n+Jf(Ӹ.6޷P=F{@u&-2!-ޮ+oD˵RQ+i#YzQѝar|y`֞ زlrOf,V7}3Kh&$ɱex%r`Kz'E^Y < +A:y>YZ'^RtqNh$!Wae䶺$FP#^Buq[D<;s+\!nM+3p`;Vv.ŽdR<32=vުŗ_b=qkËG&<UzA , %ۈs%[C6nL\L|i^|dBx;WwL[uTGJLm%?~p}vЀ Re^°.,۽U̺O2wHtr|l8b1}r;MB!AmӤi+cˑ;%ֱ!c&m?7qx  `s_s1iM8k Pd+m#?&H\s5.b ¯lgYf.9FOK*ت>8ZB@)nBV4 !=_ȯN&W ,-,/7"FNs޳doYRF ,kp~ǜvMb,r-Ҏ~:Hٴ9DoJ4zC$?HHl [$HҶŴ0ZlzU Kp\%BXGZ~,nڿ/*h5G,7'JL-Y% I'ڣ5>XXє OיKI\n<XbTx餃~>GaCeUۼ2Og ~oh]o٦4¯Z ź,RO' ,^&guL3L) YR PTO&Wp a?sKAOC^C%Z&Ô}Bz_)^Tj)B ՞5y%4u(F_H{=u},I3xPy|'ID&@˃{A nE|SZ,:qGûPc(οOHq+YkdGiG?@7&1c2ȐȌV5Q& O}e=~J_W+VINnh( #LոNr<@-h"<69hDӗ-fb'gUw[,# ,O~;1GݮF7f#K^1&-]-UWhTz'r9T>8*LY9и<1MN2/ʖF%CMFѺ0N^{}n/گi CM#QH_fq$AVܸPK, HaC0M-CMЦzνD+)w3:T~Kj1Hɻ7O$ݲfXY&? IOp.!#- _yXձ4>ڬ绂aw9.` {"-`4\RN/O^Ӟ],&|q?I` ?eR5!5\&q?˔›MٿfX,:$\Z#.ѐʰ @X V!Eu }c3 2RuwVX] endstream endobj 86 0 obj << /Length1 1861 /Length2 20602 /Length3 0 /Length 21823 /Filter /FlateDecode >> stream xڴeT\ݚ5 w)!8wkpw ݝx}tU.{V"'VR6s0J8ػ330UYUn&&6XrrQg+j P4u`b%HΟA3@jdPc(9қ|V@QG/g+ K׿=Xv[-16qpۛd N+=hilkp0*IEu%UjƪnETUM] &&j$U~?[>|&-WVVgf{f;F ohv PY:02zxx0X288[08Ol:mfoI%_ @h[$'E~IߞJg?rJJr;c+{Wg hF/@r1 ]l}=sŌ\7M]\\]0Ewͬ +HK} Ϟ^{WOp1qL"7uD>1O\_a;x[ٛ͑Q (-_.,& 4d;u3u07uY?/>.@ 02uv_O$/PU? h˨) %fk`l8Dc;+[)hm#f"a 4Sr5K_,n)O~?V/=3'>eijctq~?MUAk>#kmC:eNw,rGsάv@(+AGBI#e֢|z Rr?1["BSvAo7i-I)&g\J{tv1q4ۜ.m?47#D3޼>,Ѭx?-RNNh'V#,-0dX"#2(jJZ JM.5L($l ;"A7AQK/hc3dMSVz"*ױ1ł8ɉM6g asf-$2^䠤쾧jFiךF%_ E~ Xhh0zYJmȡb2}bGݒ<؅e'0'QlCamUq_G԰ʼYG8B&Zqu߄!R5m^/* #_Zβz&]d7ćw(-j*6XZM0qua3RdWћ5esmEF}attGD{;k|sQ!Yw./& ~QPpioz~,3@)*rw6/p^E8ӡl.T"-@om,{㇨"-0R͟\UEhK9}g~W/)Яsu}~ -ZWdItD|1)4Lтό/y8gQտݗ& (۔#p6xƁ;%_œY$ND\\-9 ق_i:A Nݡk-k/4;^*N [?Uv.(n{ ձ-k?ʀ ym?Kg(PVՉ ٢;6e\h*6bFFc%.0Q_PBڟ9Y(D nvH2*aо[.9papa+!%Zki0_[sKЍ$ lj έHE McOP^PMSoI/IW0brM٧*I|*EJ I@"KJ*uၔ ,lb00~8k;PDsz=.$6!mTFWEW?b"6siKg &؛%~FH7gʙsLd4BL*V#M`v/eՆw>vCӖ}?'[ igw_D@H4cŸ2\~ _qW7['89jAǸ˷`uwQFcڑ T}\ΉBӘ H}c3o!P? ߴz 3o3!QɂJwhk  >ȫ97Z&^tPw\W_֠@W8Ł@w(T5.K'6Twq-D".AdN]BNaYHʒe:۾;ӳTeQp0oh 0zsݠ!/OVM"U8 4Dn?h lF{yÜ~ M 7Ӭ _'D5Mň9z*/B U}s),}F&`EA`\C7Ӧ9WCp5H*, :cg0?#,=(G8~DH[D)*$z> l3<\,RJ 2X$p3[,XQ({zF|Ni[ W 1^zL,ЄwCa ̥lVB Fd`NԖ2L:%FMKŎE4A/E %B{A+E= "4a5; PFq1ĩ?ҶG/؄D7`rP eqC{gZ6[-Y(Qr~*sF YD3$MH"/7]c2αi _W7W>{!so/%Y}lznK/D)pn ~b=ebUМ?[*Bvq& 3.l?^R]p;4®h]QMȯ#ҖfaaWWb#h97m#5@}8а.e^'~V#t qҊB1wU]]?v\FZcPA u/Hb4  c@z{m@wz+y$2+[ʓSEdʪ/>OCe>TKŢcsx/BP.ȳLoK6~OF?˂ږ X6k(Ot]uLx\#6sӆN 7t@GV-w|5v0=Hu@MsTJ% D,y >[#,| ޞ~ىLo#!D{#38Nݨ13l !0rv^S2M}Sԓgmsv71P/u@_W^lSt98-5 l[lb@ M_%o4?[]}{x`;ϵw7OZ^YwBV?{:/쬡 .FbEbݣ&ܺ`Oj+ )[ NS m8Cc("u@G69G0)<цF'ePPa/PX 4GݖWS|yjP"gH^ؙa"Y|9`#}܀=7ɠL^$R8w+5.[H:jp*J*_G#6._UА cgT + $A,]z wrmnx)cqHzPu%mA Óm;qo6 '=:S_L_Y [8mގ{qP"b\\VZAmB;`m#D:p $,fiG ƈqO[-|Ìbj 2q6{c "yq`T\$mPnUMD tǚItVʢqRIQ:&?cרbmypm6 NN>HM~=7+A#X8dtmKdӏj!PЅٍ\{Rx}ROCIGԱ'N"*Cڢ ^~9?5<S*|8gF {JDڔs[L 0LT )#szB sZxaBH( N.g]4eSCkn,1T޻8QK0|pF5*D"u^/ći6+Ă8MbOi`Y8"dx,L\Ti+:#"T"H(&i4C0ٚm肱`hqOb:-(% Q H`F uS``љ:|=Ő|=iFgOSj*Ø[C"R:maA*{/DY- bǠ?/vه 4 b='q8浕jSq6s!N2ܦZԏ[d'iJ ),dFgjh4Vnߗ/+Vg!XyzR}X(QGkHL =Y2pGX(Қt)3UkN.l+.Ӧ'֘Rq-A"}TngƊF&""5$+F #P{i[Sr'Cjv1ضP6kO]( S]+"X[H3Ÿݭ@Uo:䊹kV63q11 .Tc=ssٶc>T̩+({jּMhb 669dţQO-`T*\8yϵ/)l8bf$eU1CU^WTIaGOиmZ7NdL92'KuCRvV`C|Ya8X? FDWg[s!1ys-Ln`r r5oĖ<% W`g3^cB>qXKifvS-%[<~\/ *bOT!4<u)sO<@wRGNJ@z$Jkibb `v@a/A fQ[a΍F 5T;M`^j$TWTT\Go"B*E %r&8Ĝzr&B7[0A[Eٮ؂tMه5' 03 "9L&=LF'?7].;B7l12̳kYl!] *.+圁:W؄D _xw*XKg,d8Y9Vf3U |Ϟf nf fK+JJjh~A9G7izo8kUcS ,lTn^IX Mpαa} _! w,HFXlp'YskFW@+p2?P !^j/f5ۛBrFH&r*oh,t  q[qUԠdssi0^dwUT]4a]_qlF~0ª8z[wG%ƤQoZ*٭ufepxS~=aϾmQ&J#\!!$6l϶J1`|&؃<ybE={H<~&\!A/*].̭U4LA%W( ȤWVS-_=[̹DoJ@͈;{=5 .B&@׈u9&EYzZE$ruBhT=rP(p&N-$館ůWPLbȲ3[KU)G_ %%,xG8Cj@l7)פ׆nKR?BȪٞi&&&$S`)ЈgnN9eY_!}`V |b_8ΆX$e"P%L2i&>L>okG,ʕצquqݪ0ƦEDƽ1!t õFnBvEdНR."d=t_=3K%*ԒEs/fFg|uP?ߖwY2 &G"7YW $d[ ͱ`Uv- l 1 掕-`z%5OۣބnA&W*yx޲ T4u9DdF`Ƕ4)LnzY5?ܸgz}-'-,2bSrm\H#*~=?+A͜담e3Bn  )E\s`5^G֪A>\M6KvPk-꜂T$:NZ 0ʼc4/݃.A a״QA b]S;BG,y` Z{H:t]8,o=Uus@PRRM}XB/^ӺeEy8nE`lj(-nZ{^-ˬDUX(9>$:Yp;΂t%5ioI~V*`C̹[KQhXjK0~{'mf *:7mPjAF.وEwEʳ[VOϷ׽368 K*=tWv2bssqw:f@Fң l(Ä+n6ǪҘѸ\O*7t} ')! )}I9>^7&c{AWYDS-,a`x b0w Ha=3 Z//<@CU S{\:)g{d{4NB,~l9/Eb hw-n) SFDLr57t)ь+xoQR|a1 eKއvt>_--!\]BaI0畁?Ћc?~V@P$wj4bmo9/=_p2dMJtxwZ/۬b A`BDaRt;/nxƊ;e2߶yb:i%0|O#1Aқ8*oU!' q0mV[nl qB7Vxc+z%*$ 9ޡ&6b5ƣ*Hl0 jJn~>1Ar,Bߎ%-prRVBdJaLφ QN0kThez,/Z߅u[ݝMv(9o v&jzrVmT(}W"c,|-r3S0c ddHhKbDOyA~s*&khA\dqW;)F%ȍ33No,\4rWZ% yCW%0^ D[@Moy % T>n&vƒ +ۅ,ӫܟ{mޒp+V/*<֡p ulX?VxA lށ`dxr9":*^= 52C"BŅK/նHLtVlka6!܊$89NMGDk& 2.8vFN" $Rܸq7EF<"\:vꁵh~Y)BBykFvGefڪ:x8usMՕLah%[ 0OSu,D2jnܴDI b%>":Ͽ}^#ޢo9N( yf8Δ7աں}7J)XI/[̾> K]: X3xmʣ= ҤyRԄܝftxj+gJ~D6tIU͆BQ-sװ0l?B 3OVL[h8( a oԓ?c3p>*,C'EQ)}yVuBdgN=Ѕ<)6弊;I5/ ډy/Ǫ~Xw55%Vt;+눰"t1x4."\o=G3$4n'A3o#gb+oj:ufs0M֩4']C.f7΢,:tK/ $+p-Ρ &Y8ׂ!)H$ٞ5gٔ0M][ߐN3l:tkby̢}\bxYS͞%Su~^pkXᥑ:9IL5FMIO5Vl#N-O!lF@4)i>^)b=g[suEtECtѨIڣmEFEѮHtep#8ܐIAIKg@my2/9މn3+XXHy[]׉y$_ˤ'0m.}>aV9!:s~;txNvsWJl(wjb`-i$pj/Xk~}Oc(t<{/ގFZbm20G%Yõl厄nk&;>Wn.A:yN~4гe=XjeWUA&"E[# FX"Ĝc̍*@8섂1uu}$?o?\2˄)6M.-2<@֫Ϙ.3+FZZ0dvx@F黌h2q1鮙~_Vii &J'D 3\CNۭ~`Y7}W|KmEQ)^t\uiGmqs] -U.jz֒.g!' R*гs\ƱK8HYi5GВ`? -^Yؖh6->ÞS /m/P\ ^PcHsኪv,ewE ;og]ƁI($w/ܕ;[QH:g3WෟsFn림B gXmR#N'2RIH-!Ȃ ^uW\Q1-F(]o1-`u&s 2UCUmn Z&vGoܜv4-oh*@7>~wd|oQ)Oqr&b r}%#k:ozK,YtE6rG<1:kH:q5i>\^oz2,IU>KVnԔ"9l'n&aZld~jx+nbFf vk2Ri׉iǕ.aMNRpc-fFAeHJ䤝`42sXA}F;ҿ8VF޿OfaB!,vMgn0a-EC]݈5҇1X[^ooJ%F#u<$?4s)g/ZGTn-Luu+)/whk4ziC*7jˠsXԼtʪ_IDǧ C1xU.M9|7 1I dU;(8݋PF2*I]zxgiЯ~O2ŞPN$<^\OCx֑TbNr5Z"V0Sl͍[bX\}F1u 1K4UE9s5ѡ#oK/-ߦs}}HY.)׎ʵ&ˌ,DƔz W0dSz 2EjK~#JU~kXu0;&qb$u!kJ°N?'—O+*%j9 U.^γBmt,EF*Lsue9|baP#by8~V~TlBpmȡM.ͽg\[ Ѳ [@f=. w-)3K qY#ߔuL-ֺBB>迧."=K[{z7iǞΛrSQ= ksFxV&v3K$a{;p!բ;wѡ5. ^kz.~Z^ "_ [؆׈/r;݀钣"f,yUw#LשQj-3 taJdԕ|‹wf;Pgc EJeTo$yQp/ )_f}tΥ#x[Ӏ8 I9~m*,Wӝ68xR{%R$+4SZvTW8w?-yu?SUJ?&gBVM ' [ʡb"w#X襰6H$^^]H *L<o-t|X _k_nzMĒ1|֣AXhӡBLXwJ޼~3f4?Lx)?e-m<+aʥH12~I{#"bOBSa 3M`Hj9/ VCe!Xu%C9Tk%f ^*_s:O1'Ra U.'/iׂ͌4n~!ug9/p;2ap|ݥ`I:V4੯~e%I t_* *Pwb(( qMUܸѮe̮YfOS]n`){z+T3,37)+1V^YG=!q 1i96K WOקT5e& fI oz $Ǵtt*,>mi*P8pQ0ښՑ,Uw9E_lïR* TռO?? ).݋9lCMޒP1|φf|^_|J9+kxv#>)qM6rahkW N$Οhܴp~@kTU3ǃ0!5Nԯ 4x>ԫ~ansWU|#ca.ZH̕I$`nE*i8 0f0UpžpOY#wX6"+4 W$.ڑk*]WGk?ny_>T꽣ڼJs:sLW ^p NB@YtyZ3-z#cd&1ޠr~@o|9n? '$&-쩫|}O&Od HN_W 6葛Z^Oo`JcZb^T-]bG,ٗ08ao,68udCg$󒧰NZ]0.Ϲr[V>B@j7.ST\a83doE0e3U93sݠ7ꅊέO{zVkx.Dez9bW: M:Tg!#nMF!?)@%'6@D}C0>H:* K%?zleYm/fî7Χ"~?X$-oAJ֠ϽŀI PRPJ?sؿPT8kP;Tz Q$j8 b!1am&]AQ?{Z7n3KdشccK6˄O\ j^쎚.okTڪt6۽8dSGJSFbͥ;/]!ηw@׶=.uGld@#V)Hkԯ.|Ubo\dԄ!^!~-q!;Y`tMw~^G% kލ&j&ɥ˨hR VIaXjzU*5x\7͢Zm}c*L?MJ2v%Y5*PӦ9SYy Q|f3Rz\/@4X]r3"b-U1HB!9\@SF*@`pxBwy~ ͪͧЛ}ޚd黫 r1fylE'1SANA^wk/Ƒ0]z`/m%v;u a@40ѵ d2WjH'޴Q Oa<U"'hC,JWe~|3j)P hypVpi>. БdqsDJL$Ttu)6`qU əqv6V&/L5B˙WiP[2uav5yOV#+ǘD/ǥ]yY0:0,ȣ폪;1S2MB?_twZi?z]ܚ!d#rELˑD%nYoi<6@5aeCNT)3|ltыWXjb˜s~`.Ipmpg0o5S.;s b<@V#UCY(Xؾ-ҟ𣖤KߣאPչ!͘hT]Qȗp0Bu+LiZ憑FV;ߵp0L8>~`" (CXcR eÈȴӯjYtMjS];x( j;c5} ڪb渂Xa˖,Nz%?K)UǕpCug 5ŝCj \HBbjdoXJ{v$9hVz)MNTh:#Y_-(*A |! Z(! zwp[2ɼʎٶܭV;eX8o=FeſM Jө#-B+`naWç$߹\W:R?LIZ}lc8zy9-8x H:e&߮] 0PqTlL|}&^n,\MI%!\;wu2[ D5B# ')>Hucǝj&kh~d8ܮ(9F7Rq4o_#9x]@\{\4/<y5%z 2jnLnIÀ)b=*/ _b:g:c(K⯂Y'U:09h1ḙFBHZثstDP+ +-s5:3htjsPG|F2>F =e'X]9}f,OQk6K$O9P)}S/;fQ]Lƕ:\;KDR^tCaAt{*ƾlE %X+K9Z wG('UA~X lAr!cEa*\pw@: .SGD@? '[^HJhN*%jv9J*hLVyEQ#CJYT.s(w0C0FRSxJ)))O"-T[+H'-[g?i[ 9Ѿ<+';{h |<fpXVe0<atBP_;R.>Kybj}~ܶ1&{/.1 bg2 `##νceW))3Egq)fVf8p`w-! 65nHћG{KHkZO֙J SlDtey~eTb9{jy:UZ׀]"4^*@CDJ7x/SQ\h?#Ao-N뙅 yDc%cٓi)O3PG!TSX<oL#&'4u痵=T&s/fx ,CJ(!ރt~Qm51p2dK=RsP1 ?=E؜$HgMR"0PRNrRSJ!8;s3ehՕP|Z?IO<%5ppӌiɬ]5hRu[VЦ"1ThԬ'JG顛b"q%d)jR̮<*@mpC&%ߣ0eKCd/DP^`Tk gֹ_v!RMIgjwޗD+ɆSCRmz}U-Q:!]sr]?@w_ؓi)UʭSj[Ri޼t5|Ljq&ViNh>fVVfTw6_$U‹~IϭM4ɜS#JU[XJx,qֳ81S1iJg|2y $\S956OF$/ZB?[4Wh~m=^ĵ./V⿬dqImT V(PFux)wZyi%YO՗mp`x܆~<;tVDh:QCw`.*<{碘vV/dvX endstream endobj 88 0 obj << /Length1 1912 /Length2 22780 /Length3 0 /Length 23919 /Filter /FlateDecode >> stream xڴzeX]6R+E;$[q(w+^(nš9Μ]'{I+*jfPPTYU66&dJJq0v,ʦN,,Ȕi 4Nv@V_@hb-@` 8da';#HŘrƦWGklcRd(A\_  0Zۘ u@CMRU FX?kH3$D%O i 5?@k %WW?*`Ah#7JbɎՕщ `dgW~ G+zu*3최N+)$NrMNb_ ** [c 6:;9;>fHwvpáO3u1l<]snjΎͿ/v9:9#"`ϞEd$^̨y/?D%<,V^NkJ!Y;")NNw`+(A`3?7sc읁c*B`@7SK?1k!= vscG7zAt4vޞW;BfL^[u\. 6x!~䟪iFuN `wY 4&?mlm4ihl qw0ɖF `kl: hr2Gi!u2~Q u[i)}=@/#'^ ttp Z0+kK(߶Nl 1-l\ccwd^`x6f03!N.;g'o9φrqEBf!^"NWy]?%,,fAV3ol7||n7Jm/J7^W" ooo /o5_wCωרk{ 99@ ׏(;9tY^U;#׈[L ZfF6.+;;ϟrz?NͿfY h1Jn .VGt\+%f)[!DPs_:UDAO'3H2y5rȶ[IѱOLʾeis̤Ŷ4y;"&_0'镵¹α6c;`} $;:¸Wtn(/wLޮ CӻI9e yZK}sE*|_TJS7ٮq>ؚ%c$d-JXh%)=KP1O>]ZF]F~SQЪ<oC|G=2MQ6NI"Ps&M lk# &0'F%W u]S,˦k@ER.V]ocrʧm`+jJX&9X}҃&_3Ӂc+ͧm$܀7Y$&-oPz6 'mץWHc'2-w#i9}4p6Tԥ/0c4|yk2d 0GNn&RCIe/3qXi&=$ق^W iC?a*,ɩ4 _| NXX`ԹN[6_6.RY~r(-[dޡJ$Mqp2MD޴"tKVz)ddz[, ?̄an&x` v[pq}߲uƕP p:~Xx6x䵗6K-vn"s^ ˄&"ZDܟ׸ڗ٭}uR@ѩ=Ȉ06:6JY0c4[*l#fn~Ƶ̓)}b +ĠB1bkWBCLJ0}A񕰿ۊ%Fkr\&-JK2XjZּpvaGSz9>NI7 jn\V5CFsg K%k6GF3WЍ3jL>i1EQpH±FibtH5PJ󳺯q̠4P0v@X[K+CPdGkJe4ɣnȽiڄ}E7ANKzB0tV/քXQX'JY"6j$5/btP]epб\"NM], '~%yZ<8"9_ʇAKhCyp6ɟnผX=yO%&J}/Fw~rh]VWk^>2 qäRFEF/)0F!&l(H$0khEZ{&܎~V=tzFG0H䃳~hW<ۓxobE_T3#WCU{sȯv1.>X6A5c-q2HGsZNAnuHy:yJR՛|/m@-]BB7W:hGi۳xN@7uJYY RFM݁I*jEn oxh[9r2c߰VN͓6QY2gw~Ka H3V~+m嚓LxƬ˵Z*6m8ScT&i)=z2&CŢx%?_G އ_nkzo N@<#:6 lt׬_j?ypmvPbHǖ-=@0㑠 FIb Q}z6C!ʊУ܅Z& Yɦlo%Zͦ.oq$±1< PR6)4]$T N1'"5O˲7# bĽSC3";E[:GghĤH/ 6F|hsSWԚ5Ge#MV;,On-GΊ_ꂧǞYX:;C'I[ lЭ p3:x^/qd4/*9r8h MH\=]E6KG_D␂ dQhUnz8|  /Z䑦d&`:Nۍ#]CAG'&G[@ݝݸ|h-̑2|ič v7,MG6WΪ[UP;iYI-q3SO}137c%TȖąY ,U \BzH#_mbօETb,g3Q]jqxU ańB,z'?p=-jH_b-y;TO+eG2gqAlfaCRzɸDAdCwRͤMێ8 oU0@t? JW8H,?`;zNZJ%J}BJ'?zrE2Eŭ{_L'7~O:IW0S&j$;w7=]s}'yfpZVA%")Iͅ|;-߅+>'{\ZgqEt'=6Aį w=/|P[EL ׾j@@ۯ0p9v=-nJТ (}IAܫmКn Ǖ%NAHcU1,V@CNfwpQPPi`#6^i7ř=ߢ%5Sj]KFt'JͭD"< ͢"-ʽixA=+L#-GV)$* lrBjPDЋ0Kteu=EX52kR(^x5EL0oZّ|2>4Ud=O%[K]e ]Ķ\!MNpE%/2Xt7q@{#=hԻf{Hͣ1_(9(Qhǽ-dE(CJ}c@sϼUENaM=ʛSA#CQǺò8Gg? {˒[,

ve*Z-%X迏0\錧5Mj`ӹFJw,et c-i^!7]Yƥg/Oj_Ϝje:2}K['6OywfݳZڟozGDOTĘn2k[)iz &ՠy2rn}Sy`E6D?`??5^][$ Fټ|~ER55( P~jI޸M~ 㭥T?dZ< WuĦu QؽnJ{ _,Ly{aR!Q+wGqͼ:j"M?Oa>Gėj=dtDD4MN(-#tʆ`SYy]L>n${Z5t;:r=\ٓ8jŗ3SRe2U=D1Y7S{7LW6tfp-P >y`q936UMTs7Nzzm>oٞk-TGh0ڛ-> +E.0LnDdI_w䏖Woڸ[(sܥ!<:P3?Ϯo_.a9m(L԰[*,\"ħ$)0>{ ^ Ͳ%5H4:е7QTdgW{$w<;R$:w.hd 挐gc*54/>WbN|sIv4MRĥ]_g+ Gj:LE2߽gG%vFoE8rmVW:JE*F1^6ꗸa4ᶞD F d Hm=v۝J7`1lvW+WwdjP@4h0cZ+63(,'cOwɠRb\5 3z@CV5}Hnfw9ޚ\o%ʻ q(PՄxgckrm`n=.gP>#F {?wp-}'*q1yHPƮ ٯӠy|gGO3rѾ_"8iǫͲAy΂)yUI`>ȇr#k}cqE+p =h h8@X2j)үJ/flx>z cZdP`JԻ`IA88;XS@)ᠦOёԓ;8S22.L*[HnjJZ_fmn!A]ő $k}h'ŋQ#kub Ձ8|KClg#ЪuDR {Yt\RK ޼D7$=J&v=v}\["A&K L p9jY-ژ$ZT`y * UVZxeԊw" !*YvejKlCVC{MIh Ss}9 D|VG v%t|B$,骚V$#?AUFv]e~ Egh^9+]`OA~}hJV͜"sWxI0`t%Mg~O#H O3W0f߸ t7r3<$g3ۉe}ϵnFWپ'Oz]XNճplRom*ό\~=321{ϯˎ_Yw~695`iQ@$i$BǘBsS\N*HA#%o:(;x^blkqLT|=-}ivɎ*T%'jq$[at/Ynf%qdzЧX6>>T^2/QO]G<~?vLzP]8XvESڮ1uZ2 dYo<~$hE@b}G JZ;[Cf(ǒD&~- AS9'U2ޟވ:7b;#+{(T,\Fѯ>a>&Ș[6=:`~n")@a#=~(gNEM6|,N#_4L8l7*z5>0PmD?k>+zʝ ?:bk,(0njT' sFV'g֐+\(-NG:8y^|cJ?ĭ";z|sH{Q%go|MNg qX M׾$ݗ`EO u~(ejθEUdq%NQ*Z0 8 ,o>T!ۛJ)OY-Opv`G6aa Ϛ}=e Km$>՟>^3,x'"^-53#˜_dXG6|qB8(&J$KWe-ND~HOwEu?uv PL N0 Us)$>S j#5Lq_[!.-)re4"SB#F#8);K V4- Ya>;{V@ѭHA}1Ih1n媈{IBr9`[X1@0Dw+zM*W7΋GLo1xm8ܵ[6"n6, q+?y30Dﭓ|P8[AX?t^Z۳^C#g{^GCcA(h>_b%bۊZ!QtJz&lIWSIS4eFL~@C6lS޹r7CKd0게SmmOQ]fBfDPv+ieK)_$i(._0)-/ u1D6P’h 6%X1cJJEXIP-G/^,ıѐ " .ԏTraZ&CYJ*kU 0X7|ywyez.? W$TGUp堇8plHΠ]|fZkR>-Z+e 1$B{ ./.bH5T&u) DMgAb!ZGBT>DDvh9;e.)=YKqHQY\U5^ƾѧ*:ǵ~@1MEF7 :57X1knBz[{(|zAtBΚ&:oʧBJPf]gQETte81R|?ˉJCK?O` ,m#Yda\ij e`. 0lv7Xzs:4(~TT{jh*B;8Fɼ\e~vTw &Z&ZQSB)!Gcm >`X`?2}AAx_h ՝ڛGR_ tq3*XZ.x KdҲsjxW|Ъ'$v EAH%nR&6<>&;d"d]N9ᢦ43Q*۞_k5$a0B ZsX Vޣx.Xg?ȔP`)#tvb$c@>X6]#+ȩAߴX)%} ;.|<}(a6=d J"Ŭmހu<+>ŕfK7İ7^K!yiZ:Yī,ڴ6.4{^)/!O}IVFcki>TK9;2&w)k7FO2n<<157~Y(;pX4Y3?=; E Zd,|/i FEYhÂ[Da j:soKnlv%e_t`.!,^(o< | W0I A}Rp7'.Qp\!M]- lsj<\`EMOKC,O 2ՖML3}{ėu9K}&s1l.YU[ P9#puP~cسEP8 sz{=25v\Mm@rP@:r;F [óvl[A5F D)[N=3tiIj6&0=#7E(^߯ˤY-3#$L˒P|Duje?q!8;S 9L(Plre1WtSZ'lWwMQ}`dFW>~=_JvԖ*HV%0Əm.E~Y8TqUs˺uE:6Ho"?j6aE'-yoW3?)\ŕ27iq\o|3I-89X1YSff,iihK+ h)*%d7 aٰw袸MnW;6[(@)o'Mȡ8e⋣|I&1T='\Ff-alR4!hNd/_ v3N9'UMي =֟P άh5*,g轠gqZbtV[}xLi Qy˝2EXH KA gesWeF'&w{OD!Ow;k4C`2U / *DŽocw_>G#:Y>z,nNpT%ڒk{?AwrEhzȺdt[5.X{[m!dTNd{ [PC ܜԹ'_5FhQrտZVYu2)|&mp. -9A"z+l9wfO-"L5w_3ɳ5Hk&)lݼ}A7IZ=:š8MĤwMZM} Z-iBDC >~z.aalzhl؁JT_eaPlqצw}"y&+^cw+26 7μM)@CBm7C|OENIDY3=fG$vY-~DžYf`{jlde(QQX8VE3ղ&7DT/Kd,U1qu1k*v!3Z7jeaKŕWHmloA)>A;3}wRRN(1]"~3n輡@=ҥLIS{%F7#7W`G'*2h W&OM'gkQnEtpwgV3bHIv?;kղ8-STup{"TMe6gM|cgv ߪ-šp.ӳKGnLepkE_[L'5rޒwuj'[0䦱_ ID{7!N懇ᕃs!#R Ywb_[/eh|vPNyIDѭ>]\*\7,V$0yN] ii ~02.-4t?S%jL$5&B)mgՊQ$蒫vlݥKH5~>$_I%ّ}5"Ig|R&leď6A)KVF",KEei 43}?Yr]>D^xRr*/)a뙐ǮK({#D& vtkU^XCqqi)׻#8;LzAU?nZ3+ʤk縝VLr*ȽD,m(=Y卒VrR8s%s0D++.!~K&+V~ x. F7i\VR *BtVi$v:9[G씇{\ִ=Ş",:J-1Z5O裆K -mLUyN%; WznÁ7^.J?-׻MUvxSգXb7Q($(Fij%b-+ it5`&=ފ5PTk9.a1ВA?RZG}nUJmK9 bu5%nJ+|#ǯDiKš*z)ܬ6ؼuq!x^ eJIk=FP6]"-"^2ğ×}Lo~|1xYf&p sjO.?=72D}T96t!u S|шƇ;86$']Qeo٭ԊR}ly)1L@ͤFMbc! KQ_# =foON&t(~ )`(Q^x4@ Gߴ_=Q!©"MԼ?WŊ۸$:@p5:=t%10ZuW,ɛ#&3ȤUEOޝ޲R;ޝssG]}Xs }Ozt-wO&3E0}EyLMXfY;gKի .ݾz"[Ksˇe ;ܓ] Ԩc҅mM:FێCqbYVSze>GPHXa5 + ~PtOIrlaMYLfN嬇a _X'i?|B[FZܲj=\%K2A;☙JhAga*+= 4'o=W60RnbQT r:KVu'A2nge 뿏ߚ! _{l=H%Ai.4>ffq2Y~3W;ّ\|@y`QJHKv``*h}Ҋb_ ֞?q"y,8v[2iS4fz>CQ,RR'f$; ML&gLaN0,abQ(lbBJf ^tOjXg;Z3L\'k$W# "7&)T~}2c36\P?ŀ:SOyt\;MhH)(yXvm&ۑ:!#5:|Q1R0r\.~laT,Uu.b=6 ''Wٝllg˶mZmkv^Zu{?oy` Wx-MU1=ȃ y$S<j-h⡁-:x>.qrբYUT?VG-b&ͅ`T":%Kk{Cvqm cu3&wA"cݤ8̆c" _ZE}R>.ǪlG@"ڑ6ˍJ W KAwojX1Q͸M,5O{`x-4Bpe'D+&GnGOQt@C oƗ)3~ ) ?T}j5A #YT]nIR&)>?"4ї, wjY+q˟=KB;GYKѰ0$GHej%vNIdN Yl_K9eL?e8\?,׀H [U Le٧|j_ͧHt!v*ٝOOla.# >=W=kw2!ʌi|aHG^bwCSzt2V!&aF:H~Z8%΅,ɤ]0A_6y~!(R䈺C_53Dur& L~l[!k4䧱BϮoK ³V<ѦahCouiej)+V@}Ey&^mWw&= b~kF،̀N|1%k6tl?7,GմFbYMR_kip ahhXǒٌU{grJ  PϢ.^s]]]&l'NLO("$.L8 Aù2yR;1:Km>k J3+fOXmXE&Q)ŧfm,,4͘>QoXov}s>64^5ܣgȕ&)'y簰x.,3k+.Cג1`:uQz_vn*ᅌWԌWUNŔKZ:E$U'`T0Ip͆y0FFՍ9 Llfʗ_f=䬔Q B{cڎRȞ̪dO { CI*}9E[Zٱ?x{%+Tڑ|CvW.@ᚡ5 a7ЭFNHncd10:on#/^un~h`SVtN^$JI=BzovYdެiG1ɤV*yxq u QG-CT~B~LwpxXt.P ՘MuHFn " #UvU}> sDnsMFMf5p*Ի`5ǔu酂i15`BJ +RFϬ\F/ai#| DHjY_MDftAyj5r~L0gH=Z,dv#c懪_Y;d# H҅F%5%^vcU李)NLc*Oigy!U/̫@›)˽Ų`w"r\燄0S)y?y;Sj?[̅(A⯎1 =?n)ZNj!aIn_%ו]B RB1ĄjN]UB~_6 +gә<pTSbxxȒdqfs~/.lfADsILQ6ЭkZ{v"D`^\?TM@zNoؽMHjQJj{vx]@ifC{p:vfH6^!'19s$]7뭞FFt>4Q|;%jZ= A#t8adW*$#~aXֶ=Sii~bk@#ԵYM9y,k=?Y[LBL1אc"?YT:\SDjx877( ( コ .䔅ϒXq;hbRRT3>5K=g`,΃~0.rm._Ke w(T~ŭX;wZڙ10-i\:xQ653ew^1:D 4Lܯ#~MrV} ߦڙ6Dɰ ׬Ff vMݦϨKvZIn.wټ.&T ;HeZ[~'?z Mʣ; "0XWSat Iǻ@`mn/hAF=7- w9'29 g.ߪLw%!oɗE{k5Lҝ[B[lZ#и=}| 摹{k %Q ot,K*4O]+{D薲&-L,Ưo\T+Pwo[1O&?UHHԏT餢E g&/Z^7eizK.9l5:[:4"//PΨ>T_4g'ԌF )-ר1rc/BÙǀO;t_F 7 Č_\$69+$| R1dҼ2`bNRԻ\d)G=&LL~ nSߣaR` Sr!w t vkI,jS i%ux$_M.e}zZMTFm6u[bZ3SA#Ԇ57j KsA"GVwRnp$? ;B'T>Q"%lvqޏ:ru", 8?&\0˵d}l6- YDny>w6YڑJ<D74̡ ]ei%SϷ>hkkQsbCAu>œ`]{񿏵$DɷbN˙aɩ2.|.,Խ0Ng\6ʸޯV2d>5ֱDuۻaO F'|ʓ " pO&%EãX[3w؆,o% p}ֈ3V9uޫY'P_Y-m{tRƓ0:Dgyo&`wHq1Zxu#|ɉV.(6;znY-թjH` ܈jp%sLRζ> s҉e4mQ؆"!yV?,k>K˥ (B$WȔ xa췻5ٳ"#+b|7w:ΏRZIW8{@pL$>qbx}TdMa5KvO` ewH q1=r]D# p.R.Yfqحm2#Nޜؚ˵B#l*Cnۋ~-~tAr8qpiW1bq8pW0-R]82 "Dv15Mx" r v,p(/"FW:R}>:\PV44T'xϑ[ӸHe jYsy4΄KAh"VJU*E2*|(gڮx 3t9+)7_=;fSKU$ })y1N\&k=մNzˈ߳L2ӟ6t")Vxy=EѡLK+w[M;g'-< ;`׹"7s)8=H,*=!|jO) 0B(iߔA:fG2IU?L;ը58CFRL8p>Ⱥ8G9So5D$kK ?@OTD1fUFX{ ſ!u<*0f<{Y`5F?k U}"HOl)1:7Nmm 6WA-|nnk.U˨bABIYy\97Ӭ45&Z&yzBHl}&Ljx/`8Ul`"&;A1)qRC2뵇ɔ|Y'ZIpe_- 0]m-$G~3skHxx ,4zgUMYh1S^0 ĥC:^~TT_7iK:v$HIu?EWQD 5Hwi̭LG|2u HŒɖh>nsK"me?KjաVk%앜JDU$QI 﩯 o1a4޸+T8y`V ޕTeYV : 'Y.50ăS wC؇KDL Xڶ\m0Zx͋lʸ;d7j{;sUaI3i3=BkƑ1˅ތ3?-0{/Cac5z2-E~cGC8v`,_-ȓoL1;[ c!kHcm&hVɄT=يA?_6b2V>6l6IvД|-:\;qgj|˾"ƕk4K۪SzD0ܭHYw.Z1H*UaGzJ% $ICDz6?kRN:]菉]M2k`1GUODQOܳλjf= &)G7ɐZ!c]H+P7WL2xқ|tKyG.ϒ7lQyjQPCMyBQY˨_j}0!XKcc:Ok<4}GpVT)g{#6J Oh">doTNnYn n~ q>un ~恲~x&y\DUL}4`\Cl] |Z(^bX/Ȏ aL1!?̋ ?^kg4'7 [QNJ*cdwUϟy놨⃤Xx_9. ԑe cp$ Pd KɕQLQV%Q9`e/M0Zmfq JhdJ\M"`CK5p,D` 4P*[82t~|uGd,6[t p$;k`Pu  >&au[i\. r>*TFvc-qwq3Q ?K0aItY?/^$ sAY`ZXqMs10?` endstream endobj 90 0 obj << /Length1 2790 /Length2 29346 /Length3 0 /Length 30934 /Filter /FlateDecode >> stream xڴuTߺ=L)!tmR6!nxssw8s> Ez!S[c-ȉ +'g efW;[9X((DFN Q#' `NG01q#P$ i 0vT*# [[;wKs 5XW-62uuL r y[W@e -fU&@MELY B.lgg?\DTT$Bb:@BME@9@^;]NLUHUKQō 8* '';FFWWWsgG'[s;ZX:\m@k?8Lr:YUd-M G$q9mRv @0r'WVQQ`cd r@&@'#'gG?6_D~_ÿ/ua[t=\{nj@Ύi69Z::9"`fi Y K˂D/g VOzBQC*2vD-%X''[w3V [WYL~+olǨwJO4؄ft0vLo3o3XoO;[;# h898=v'B`Z8|X.2p f*5ڂ@3Fy['@Ps %8#Kk oT6Ftt*Z:XRNF[{Ii-}s98H+ V$"MF01%0rp0rG` ;;<Ҧ@u윝f7(/`8"Q0q2 f`XR.A¿AlF?]wW5 p?#n33k7v1hoNĿ&Fb&_ o͟LyZ?`?EholdW X6?)`f.u8/i5XZ w; /f//;?~l6 38O+vp-lc23X?5mbf/4Ʋ1? :;ퟍb fg"?$ ;ۂ_"lKufJT`.wt+L-v0[' _ ^_ `'?&K X:?\/,AdW:^yܘ܉iVqrjX? 327& şGlaa[7Oz6T`8Y(H5G?"_ MlMx?4Mf8.הYLh" 5SJ$ 5)1_֚+ƯM||ń~|UgPO[-m'>U6BPq$2vL[ڲƵ`5*wNc"i s~H@զMU/0N#,։Ät J0]f8YJXOTLhxB-Y!@D ]I#+V hzTI҆vd,`yZ)C9Ŭ-IO26[5BաkF>+VB˟q'ΨΆ }M|h, ,B)nq!jeZ3c9ܚ*˼&֥ЦoI*"jal=s*i^b9#Gf+Nѫz@9԰+f sq^M{\ MB,9XȺEXB_?u,|S$S{f ǘb!LeM2Є }ނ5g1ҡ9k $JeCn8^ 쩰RG Q·m*MZai%|hNժD`{ư@M^-D"\yUc>r))E'}j+{sBH/Z~WP- mi7L!0NfrJƠ1QA]+>ړ_hl n hg&N(A\g@(=]r:!񤁟 em&ޠ09qO,]f bYXm7DoʎsmTHe&CsossQ:"_[V?$]9W>y/ A\Jh{<ZBH)x"c˦+p':t$_գgLڢ]hvq}ĥyۿ$=A(MBC;3d$Q.brA҅PP)KJk y6A/T԰`qAc~֜͐DcW^Jn}Aq(5 S~V 26RbV'hhԆ)J\*=QA"7[s>63xxADQ':mX*;:S'NaR+'״KV_1jRr'9{r_ .{3gxyS4;_5Շת70G1#b|WdqwH>_ j⚕Ek CnwcNث >D.b-](G:h4\Rsl;ԏmYc'q>K'NTőyuMR1zO[VOT6:̊d64x5h-io涓Ov#LgsFVO}7ϗW=ڛV۴=x,lĿ*V_bHf):N=^I%lSGeFZ{[ZFVԘ!ϟE_eI3(%Hφa/055(}b2#+-\bbOUzҦMn].Ҭb#6JUUҋUYNM%gBYnÊu2)* w$Д > }7ywt"p~+[@qߑ@:(ǻB,?Xm3A! tƘ4]3yǪ1(fpEs-WyY!1_sT|bEÒGVX;P܈V=TzPRro"&K`62E_}CZY7ßF&[haӊuw5MX͝ MnTݦS6([ K*b䜫ßb ~@w ~irjl\@!QWqPL[K96*9bY-nk~yOEn3+/|J)N)+J}u7گ _Fy ҆5—&zi(>PN2|L?S^* 1n< V${PbEnm*+#Ld:_4{N*`!Tr/W w'n/XRlGAUA"'Mֿ$LU($Y |py3": ۞Ď޾6O{dD|~F  7AH?㙎hxحT'qyoՕ0#fZn6 - }43"ˏj߫!Щ6ֱ[E&wjB&!-(>/+hQ2Ȗz3/8J}`ڞ&T a fVl0ܠMHOqa<سvMu?wayNSU^b%9>|Fe-F!4q˔O NY 3ΐ}|{[YⒶiJ  DT{T)4R^-°Џ7tn͆f0͕?96@Q0?V`ʡăH.VӛFUP.9/Sp[{!v%tncmO & +T)/|yaV< Ē.>ȉc>hm9jhȞۛz zaH}rI)L;*paF, Ey!C}ajy' aLA[,ި5uQjWO,ާfsV_ <{"J т̿zi~!,P2G:OiˇWg\0j3~N[yϨ]%5qE1 h^-*IL o5.$\;4bʱkcT!p,4 s0%fY黏1K۸;<'3<]B,RO5I4WOK/IRLNN8m֓yY.鹍[aN鳁/+RYS踾ry {N}KG-,i@*;7os}֬ѳOwHt kP6Lܺsވ3k-gi`[% :A _^E*0EqeS]S Mr!{ւO2\?7I3'WdKNuG 4ܷ4Ŵ?c :&Oi5,=b]7ubA5+R_'ܓUEӠeNʤDn^Ld  `/YOᾒ$2UۊЃy)K=Os|>L{r& bJG9oʻg֡7+<҆1PLG"n)#EJC׏~:ONԆDHo]G&՟oE4~ A 3L.O b96䑧~E Z%8bZ)}p 槪TEv]O-AnmSז$zվoQ/?$I\>3'2㋉7*38M&~9ȣqڌ]Rv⑾4hh 1$-i Ã/S !nf|3UCW Cf{_5AH2&T.ƹ(D25-7T V]W?S:fcid=tݖyO ^P5{\|e1z#n%9m:bө4+8-c{ ,..֓4(Gnxſ8I)xE\ͯ'G6BַDR󐒚f_9g2|_*& -b#ay7| @3m>L_Qqn ;9 6zE c33-q +Wd \o(%{zYH%n'~+Y-Iĩ)cKtrb*HzӃ2(SG:j%D5T6']P7kx geIIR|JY<2_Feg(),Xt~Z26kVT*X!{KtCЅØ?:_-29wA\ /jf=Rqc"(:+5Z!>-XS]4B[ TXm(XBQl 6`I=}UЯb,W7Ԭ"Za6cǘnHd7'ʖyJ=~epW2YOK>{3{:PR.@6 NT*"kf?mxSt K+Z0G3h#ujPHepQzH(|eig9"ŊG*_=Y4' :MPlYN\/ _NGX9mڹ)눰2B丢P3r\NTN!j"hiLA#?MW=;q*H~UiZx^2DwOk9Kc񲨛 +7,]XwyGfK&%VD0.uHM{3DgaNU{Uj =B)=RVȫl&^.G_ s ~}Ox>ڎCwQGc[r4~2WcR9;c,R J ?rŊ>AxƛK2qnf$^SUS3g32 Cp:Sб2S]%D5s$PѶkQt$kaq(]ZصSAnXboOmvu") ͪptQ4U;h@2ɻKkF!!<9iUaF ^Tfܘ8aIJlU& 1⛍Kaή9̊T$硳#=$=6]H!)XHm؈DܖqW4 Χ+m<UQ@ -l G3Xct:K4Lcl V7%\ Tŋw%|K$Wm>úG>ߛ8+}w:JAEO[~ nUڃCGKuo2%\kۋ(pD\$ 3:Y)bN>T͎CQQmq?(Ba:޾j\iL=ȧJ_ӟiJrQ1o]Hn7i iOῌ5(0٦~jJVX3gջɹʋJlch:j92>1k])@ˇm&5"s$i< zdOLخRuа0ᮗPj{H0jSf v Z o›fG!{&2\idH1&"f?^pu>uEo)!mxkZ"=g䲽F B(9bL#\l>eH9~F ٗIـ48!:WEoLit riLp$ b"$L X ܷnJTM>䀼kÆ#ˎLYDĭ7h!J8t V0r)@%)R(;0`PVin"X"l[Zray6Vf!({ddS_}KHcoj!4fxgw!4ĄplB<)x W2%ݛtV6>"i(8U65"Tp?$rd̫{z"iW$ 9uX}j-xؓxPk!~}qdBz\]Lm4;S!Aũ\0BmQ,وx[X2zS+qzHߺ__uoZdE`"'N1j8PU$ &}v쁘>85A_;’#3 CP=C6d l1\ .Nk<0~:[]VUxx뗮/4U|Ϙ(UDliZ+~ܹ ľ k>OdC57R2E>Op$?Tϵc3.`E}畋E>Lv]%'5:͵{l8  2CֳR㗨A3e< )N˲";Bv1A<{mHGxyj΅9[& VJP72К|?UEǎX[;hUaج߷Mޑ=**΋T-"~suj(9Q'SS@z{imAu6td?bb>]ThW{ rgΉOwY`yiR$ʣ`b2叞[C7? f@LxU}E>%HILQQU803!cɗ*eethT |37L#ccb$ + (x$ ~x4.ícXYz_.?ϣBqLFibljbOn H§h۽h<ŝL+49ŏz̸HD͙Q{K0[3J(?g kqT@|aϤ{tk7mwKJ&*pSg̰eo`oW5*ʺ/kpmp Gj}ޭ5IY>CHe/̫ӭN:fہs |md>3PߤJ/`w;KdKV.Rur1tnH+)-%W,j{lIKFv*ND}ױ H9}3o ^}OAy ~>d7SH~ߙ-=%ۏ+trD ˠ/1afR:Uxdgq3"{>:hU(Hq7]D\+鏅0͕-ŻeHd3/,)CvgPB?QH|ϐ PYo&)h$Oai%{:e8:@E Z=g1-&"EHtAk&lMWJh3hx6ǙG5_{w5_Wc0 5B5 hldq(.b95ok@1ɮv/ijJrQ>Fif*8̢%qt&i,e Z @< d*f/Z!*Uvso"3]gK2Vh8:HAET9&7d&wss#uJll$ O:Hl{>HXG6Q;c˼x׷>5(՚7Gm}r<;T]/tsCe鱃늪|fAeyȤ'g-k_a?cϕ Ű7,TeX^FWJrHhWV]Ƿm"Uݻ\X5Q2諲O ϒ~XAt-T$qެ9?]D\GtpR޸6Iʸ]):̶:=[;ueemK #HOŗ$te)QR3:o͋94^9kĽJUWb d:_Lvcx3&[ nr996ɉ4a7vB:nx8d-Je45/v)Dÿ{f Y҅7#A.5?w׏U[>+־󢑖]^pQd /֫]DVٝW?))з/`) |ӬeIs23x ȕ>0Bc[T'9`H1*,銐ğ`P]sNUaPޑQ3]XDŽ>:j8ru\ꟊ22uc 8L jb#}.EU.^$1ldbRKJ6(6 &[X[H+6?4hHG:6Eq0RKӰL6 (>qJ5XZ`Zgw8u26@ ,,K5|O9&#_٦B̿廜ej\W A1sDv.{&EW= 8"ac/D㚱} s FMyflt[B LIŇalE,i.<V/v7"W(<CFl,Fޤ,YEg {'|Ղn.;q{G^\oT|:6(sd@1|H>}S \mX:)xT&h dꌀ=G [͛S`_IH+/_ș#P_*́^\{c40if0弡}W^{Н}&w)X7{45BSWnyozE.oK>Un${q=(@;RME!uZLsz%y-$N{1j;_8(.^DŽ om` ahl%Z  o& 9d~t>kB^x *XxN^QUwASRRlJPvknoʏr "&V\_#P`(<}?k{N"ɵ eع/E k'AW{ T}1 ]VLڋRc3伪7U,[DŽQrV@['o/eJ\s;eHqDmYC5Ȕwr1xSH չY.:SX|ׄ1zk%tPէ3٫GA Bͺ܂:zNE3.$>CS©,B&kN׎Jλ!Ɋ^>}%wiH ȈC,SR\qKz$9cYC \=`j%hUBBVk[MvQDR84T` ˥&S{I26o2+AIU^Tsf2?c2+{XNͽs+>}|KWlߣހ2c}WSb;ʑo;*vlMZE{[JeRkbQ < gydrh2K˹">rj4Xίcq.FV=)vm<"RU^IJIe TjXƫ)K1^>eگG׸z`w*L5  w!ph?7Ycr РK3͛ FCVsܽ^Q)TG6s]Y|#LI!4=hlbҹ M, @*0j\TW tF=.Ff5ԪB_ӿ[V]lLo[kUK*5s]c7C!s%[[˒1q5(c"ly8[O.D AFɎP1K9+i8-UtWec۞TQ;b2zgM} ^B\SQ8}Tߓ:O3(hඳV 󍐹@aTLJ%UG=2T#\q!9a7G?OIuo߰C')UJ3.Oawoӛi&|d]k1IYA ̃r"ghLƂhrΑO -m1(ɯGk|@Wޕ]&vKCZ s3.AAE(qmDЎPzz-ǡqx_u:,ard}#ƕZpM"bIY1fkI$el(_lu3}ҽ%"{HxB>oNL`._1CFLI=>OIOQZ!Y>EہF-zwTX`)g[F+3K[`_'#y7xm 9_Yd?4qWub{M4Ŀxe.z(݂`7,Yކӎd[(;/KVG`4EH ]J*I[e8RI%lRs/TuDTi5/~ͥ&[ ;(Ͽ=ppb?[" '/OFu]DEH m6V]f> tB~<}1GNOk9Wvmxd Jxu~'~mvi 8l> LC{X۫S#,{^Kj"SCiCCӋi+?U9[$Ƴi[LX!ۚ UbrE֪PHi#;J)I@< x$#s@iXA\LǛN{m\*-_GPa|zS[`#ؠw܄RԙsVe!MXlh!v:Xӈo%@هE7% ~*A_r ?c㒮3\)WQþN*U\gT@< {˶+OѨ~M6ϼ+~!ݰvE-?f;då _hയr#Y !̭щɕ`mj #j^ xF|ōHƁ!_>ɢ#ӱ89+3h? h"Qp"މY$'1ڜ#'>%@kz][yEZVGAnO o%OV㦏o*}vdBb7JHCm:Z0IFui+υ D`,#KLD2AEb-q3Bfp\om溝& Eh1-fw< '˽VSõ}(l^8?ae[q2~̪oN-S+2 -\VjNvRiwa >kTuϧhvU3]=Dx/ 틂hJbY 4 s׽N d#Bi(H/˪sջ\8Ir#;I11hǀn]_:x>` %x}D} Mrѭ?u5;/͊2c91Ha Mٯ~ !vЏ0 dמڂpI`BM~7ѽǓo4[7mFQecE3}6+g2Wa40[ l@E(mĿA+ $:Q뒲ح Ό$D Fgͨkaae/jm-NlYIìu d7o $PPWo~&ϿV|is*\ |WF W!6 j "FcKT8 RtZ dH|x~H[^ɔ*^bf5VG0 @?'$8C"hֻ ^ثr=70gD6gDLer[5庨 >z@y5lBxE9/u)fǦղXb quu"(TS~.0>-e@ul2f(r*;9@yZqBKf7Ca ;ѓwLXS\Օ𵲿BK:F>+S̜,h(HxLh}}^_r_N LUY}ǘjB9l79YQ6zv73! S;gC}ُݩ.cƁUoD֓rLhZK&b6cհMI4Sƽ6ɮe!q{@DsLD!HMOI {`c&Zlʬ"EK,sJ^Q6Rd "0 ) 1t+jò@̙<%2KL-rk{,<ݯ_o1+,RWXTm!DW7c@n8)OTjέ}Jh輂jC$&TEg4 q<sV]`2Ni]qNC&>C !VG-̳^;Ny I("v!Q|mP q*2m>z!UwN.!ZZ' kt.eK}*~Ec630=t䆫so3\yB{aG;J6GtH.{ g~;zu$D lN/|-bk-(u?\)n̘eK?ٹ{ " ecau v4ET?{*΁a;c}}ƛڜ!˟_|Šיc˫ɝi_^gBqqZ0%&t]bvs]PF3tiqq Նn[/HBsRT~C_|qeة6qGI8'/c^"V+5=_iYtm`t2/@ۘ2s"4.īa '] c k˟d.Z@ Ag+%:r!FuQ'/[_ɨ.05#\M0%ſ˽My{X" G _xI!X^0>MߍMoXCtGH:x%/ݶh"? =DކpON$]/n+Eҧ-e%B}Of ]p:ڙe"i>\!N *jC/h,Xp*7p6 _\iUoYe?B[k;K_7 d7 m]?YAi3qwB$RkHw%bбaTF+L_p^>cD>VR*4ܩ5FB -G& 7)_C;m!; 8]VS/(#cHCt-YU"PYOͳ3π+}+'k<9lL*u9ߞ _]"!gxdL'g?@+oy9no}ߡ=Pf'VfA9.LƮRhub-U[ bcFf0%(_PS,=1W"U= Q*rq&6ǐ\wC󐖊8߃G]bZm^{|&]J&"C sAGGJ,͒G}&_X8qdjF[sl`geu(&a}];7]ƻ$TbކcPyNՉL/UBjQ ºbaT%,JF!7lp zÛ5{6H C|ޤus:+QdrBwIh㥂vp]s =ioKyuu,U+ؓLÖKZv4bI/xT I|fr2Ȉ߻!!3 5W@:8K4]+'a>4% @%ǝ!wQ(p_|aE3QC|{(thFɬEzPzB m tÈK&SQ+JGEXDOO|&eoKᬼK9FLPo G]5#o_ r_Y: ]dSDs#}zab'24U|DXPWm9cBc'k{d]a*5=7'S=6J/kn|;R\<ɬ)ϭԅX'-zj&օG+rX\B}jyLS? =J4|m SS\P7?o#Ġ 4:v(uGbZ (@s@ 9g_Q{ !,!;K8OZ2ǭ9KV'g Kh8O^4FN_M6v9!jFM=SgI!I cJ''H1bŃxdo!;!_;rx/,PK]chT`džƖ_g*ì3CSBtrW=VŰ~q:@!%ZAK]Z?Jm^7۶8.sL?Dzd7!sLIdt PIYYfsέ!W49P/#:iو"3F?!eۀ8p9IiB}q!^|_ߨ#;]'Y+ 1?c5Ѧ+$ #4bE߳4KW2UFR6S7tX`fM0C<-2Ű{)c<)fxPʖvɵdT?'z M0K 7VZZ/MSN?2g58ZU69 q--FJL3zd5O/,. \"_f˄$U֏4 )$x'OzrCK9Ḩn&}Jb+dzrWr떫vZzqLImxmHDDKugkCe~$afքG:/P3&q@~GF_HZ)b17+4@59C5ck1 P&K ~Ӛ+x$1nFh? B^`sC|3&grMtֿ3FsSـUv$M .!i$&AT)"ÌYtWLew rLJ7>H@#ٻx w&y:_Ln̚*U'"46Ɗ¿Ax2ϱ<'2}5+0?%\ߦh>{Z60ŬW Zr}yFDG5Y5V{/v{u6*7¡: ׏]Z/4B)KZ2'N_VV9HOu$Ѳ O%5H0е0᜖Kr~fAc¬A[˃=#7_=1`HwRjlfZZĻgv,ƏƎcL:x>m |f Com,uPlyQ^H;>75 Yx!UfQֻR;:Z<ᦑ[dI mP0燖r,\fy, 6Zklľ*L/Пx^J;}d#zHlȭ\f:S7[v,RH)7,驡3#u/.nɝ.\QUc80b:V)"K>/yz)k/jt/%͢ |Jidk퀀BCD#bL,I썧k(j zD+VWFc ~1c^24P[9XQcu&\ja3Q}9Ζ=f{ fTnS7>`&X<}-75PfIWY0CY3v.::_RZjQsu‡ 雠Xz.n^{v}h;3ϴ!} ϞΎ|_^ghamCPUǒu"pazCw*3A dBZB4\ 0Y r6/r9=-[ۼ7hgst}՗+VFIfmMq~^)#6;tȔ0 iӴ7$&LN(U|M Ǥ<2Af iz-鴬*l H)U,m*4eqȒ)…#椷Jʦ :41qjG<n+k[]rw6њi`-$07u7pO`:7Zyfr}_ŒI$`+uJZR"6ʨ_`'G{{ -d}hr-9ibBqՁ^ddt|{`R1zІ|w(HJ|R=rfz\$7ESS9v$4}J"WbnB4y:Ȅ&@3Z5{k9T]^a|I[XNIT {xm!otȃ\Y)^^ ̅7 {⡨%-N_ ɇ^"SwTqL'oI56$ ߽p%N@L)yK:oRA VN%6r6zK&xd6 }rU^ >\Rk< d-f%]*(SC&큨I;<b.mqwW"4-4_y n>L4=\I^lo\? zǘJ! _mpѿvK5?*qV a%^kIQQ]HdyV%)w r:_矫:geQ~P ' xwt @Kq>ZnپϾCK o鵝ET5NC 3FÎZ2xg^g椕AЈ˯uZ5vξB |#< v & Kg˙ylN9GzzP*&mZ"ː=Q_j??q* kj]1ӝBH 53i: \\@,+ Z"9&ъ;Ah%!qr;~Q]w W\2M,a>}nPՁd/x _kEesS7nAvWo}b(_a,FM=sX XO13EL;F#Ze yutW|o5 :x^4cAQsw8+I PF_ϲx0 44X+&Tܐ!%V=d 4-B%Ci%Kh1lWy ^yH,J4@c;2FERVނGdC]i(ݔt鞸iLᇺG_}؂dNYD@Kx4[DЁ&n\ M{ @@(H/ʷD",`-_)l͕؂O GxI{jϓsqJVg5:ʚwV@5"Yh *1sg$>O5cީj$esmX l|E/ NLqv$3qp)?DHah˩w9S0.؞H-.!)^e&+ʴn[ qe~q-ܖ`~Ŭk8[l@I*~bU0XXA!ʋq,?9ҒKJbL.:7ChXפVė#Ӟ6ˣCx-ⶵkܛBc|+i]icBA4'hzw6cNț4/噞iBɇ~&At\c39]Q>齖1p(vאy}-4ܴ; i<R OaB:_[$A<+B|jf#P#yֹ̪4M5wqOUA.#dk-৴ZΗSx, "-vKfۙe< ;\XG2G]Iv;rD-`;2+T9 QF^Ⅷت 4h@Z%VvcOG_ # B:IyOH^ƒ埥/rrFNK 唍:AtG Rk=?׫٭ \WhStYf$Ebv+& upǭ|I'dg3UAX6_JVCO2+ŻvCCƥvy3W>~kaNGkaD ʖi=`H; 8 3] ?\î TxF (|gP-<٪t[`YPaӿKWߚW…O4̯Ã>]B~xSS+5n߂f٨0ѵ d2WjH'޴i?¤d>Pgd,p%ZĽH"<ƨf 2UAXϖN( v&/ބz^Fb*?l1yP:R I-Om0S,850eԀ JTW]4]~-4B.=R2 @^NLiQ<"%;So4YMV!/ʺ_Ypc^ \eꊔ ԢBDK-4cipOCVC=Ȳ'≱r|>*zRO;`Nsg9 ~`@6@9~-tDvpk̕H2XS&,cYcl7LyhX8 iSpTE(ZZ!g `&p}M^ lu .dz[XԢRB^!4;ntJBE:P~iTԩ҈҈?q4.[uV#bܐsc}SJ} 8s{dsښDh5rѹ:7Ctfgq D˻ρRO 'M0̈4(CWm*F}.j[zV<v"1); i=֭[c0dU"Ek]>w8<0UH$ҵ.n_6mu~ݑin]q"3~**^|>u Җu휿G|;<@\ZZ`W=s8Vi#Q9[V=1\H4PkWtUWŏm9$H!BroE_$-Ȥ0aTI͜8m^*&z$>Gl }S Govݍy_7:ET:iY\b04lvkLsdJT/Gӫ6F`xkPpuw*y wz-xs'`/ 249V<{2ܬK7WL Q8mȞ9!Z^`Ȥxc):_ژ'd3Y&Fm44ZG2TXFL8Yh%}uUp*RQĐ6]//Qrm{ʹ諌L@%OMlƘQ&J_i]ӣ^{ ~sLHX%,n]ՙ.Gځq̢;y<r KFgg=Xޡ00t#y%VMEKh)YGCq.J{xpQsva R 'tV\-77ig{Ug3}C_O+M49c|֝{ o#2@EOZA]\+_sɀ"XS<վ@U? 5ͩ3F )݋ f⪀jjc4.Yy_]*9xn9LS ;6Eˑwo(z7 ;75DU45OzyK!~؆gF-2_7‘]m! .CL1s6RPln d."uyi!Ŀ# $6l4K0^KXS.v:z<6tXU?qUdV(.M_m`E{^a r] 9%Ά|C-sfipslh:  x+C3vC6y? V_#a2K}'u=kZktTD^[D0Rdـl֠S48>KQ;D?t5lIy5JtJ &`N:?yq-}` )&Ek8j|V,Pibo}?ryQP%ckБ$_ߙΔv~E$hSjt1z1݇#  ؿ5񓹔lɦʂ v ,.t <-`SQn>A4szΦaz :d)rM(5G!1 /?K[c+:2d86J؟Q3iA7CޝU4)0Q98RA(:eA:Ea|-&.{kJ'~DyզMy3FȰcӈ$Ŝ>JYQ3N@U5~wlݯtOhEojҢ 4i2VSaQ?6M_=ؑ2ɓ{Ov&[Iu?Q[7?ү&1oIH^|ܳ]`g4]s+#sݫa TT>_\1pNk%_ >g Y2f܆tv+պQE {h&km׎msKxY;Dj: YS'+9 fwO{n&1SՒ$ϒ_f 6U#0^-3Y #70((dw+|ft><ۚ:|~_rYL.'$5REwvׅt} EE TȺC:JLya#9O0{q3mPżb-5QÌWv`&tLX[픿ミ2vObԆa;fŒ3cHLJʆᄘ ߃P?25GX\"#$CBl7 M,B+~RFu Q%g((d +"h'37*Ŀz*3n5GnhYX&8>Y R+=ѭf̥[O:Y8L98Xf9HT~D:=jc5)PNC$Zr4LB~PҸڠ)\f[ۙYIa ѷI`cm.Sd_w1U s6)w7S_v԰L@m:FSki⫇'@&Y/r xoV ( Hjq;2W=. XNWA!澏wVFs NSMvŜ?W?{?iW0TKQ1W݉Py|apМ-yts/E8-V($ ~6iAcokZA+rA,ǧe rf٦v5+ 5~}(pE^p\J%o0xC<. iS.BR2RǓF:kA |I}xA\S`e˶b!3}KJFR7Hlh|¾'xr<#Et)Yr{("+6Gs]naHb$zJ?M%4`=H/J0"7y5 \7ǰt-p}'Ai/a+\zN#e>8n9y-xB([]#rԅ矲~^Ķ*tqP!*A]pp|5?ЎQcS(f6߾ @*#i,pa,vЖ/r=+/A֛]ZFӒIád*$ <;1˚Hb9GMzjBXᖗ9ޜ!1K{c-Vr f(q{ >udL7Tfrs{$4ז{1qzLV?<2\ h`3vgI{s=h1rxŮ-9Ƣ{*m<`]K]) P[돲O+ꘞ sjNZ_QM&dF{zDvRK\WyQ80TP|+Pzϕfʍ͇~0(!K3[Wȷyf?ئ[RE?OsVk% ** r-ت^MF||,tAt9Zu >V9ā \.wTs"'++ GjiY<ǵ*{eTLN^"ttܼ>k?l&p3$1 C H`4@9Xӣ?q`]J@ö۰έ!*vLwXS+Ä DNFr7z3 ixMmaBwA;1Qy5!>,=Y"#TbVYTXdaIEx_ڟ@J}U،MgHx '8N`l[OUI97V_ŤKw)vI6ۂ7ӒENhxXMCEqo ډL(?v2~ ptUSWZ όȊ\#߹OeJT>?iq!A1)i+,V([I&>>wux[*z"ق> stream xڴeX[҆Ӹkp 4N%$8݃Ckpw'pȞofs V֪ަ"SVc1w0J:\ؘY  6V&W;k3;3++3$n pZ\W:YYyR@i0(]MԽlZ@ŕ YZtK-\'ӟբY3[[k  ˬ Ptx7Zh@ShIT49::815u )FPSWzoPTg˟g܁.6we/pvՑÃŕْ/}V.g[3Wc@t+=[A.?$ow7ON\*ceZyeey52i%ssvSC.tQ'ӷ33x7f kWe,Ի3k_6EI 5u&1)8wW|"`gg\] Ÿ[ً-AnȢvrʈ_ o% :fV,5+lMqtpXع->.&@矎&6nˀ,2+cJ~F@v^s8s=:a&v^?Z?RiMg"i 4Wv52`b`f/Ɵe>׏?4]\\G4EATNT]( 50qv6B`}vNNT= 3} `gG8,"L"n`qX&.a(MտEoMZ4CZL /?^|`|W`|`x`h#f|rLNP]ߙ?'ٛ9M(.?^㟩ŻŻwY^wYk9W_` Բ6#DSNa{?*@uբ>LlpR\ۿ=fKf6+%+xO|ԖMZʚ /E*j ̦.v3O jSb۽|1W6W'DdVX ";/)nKl#hvt?ƲO_W~(֌lṈFI8 c'D?g\3& ۍː^}b 3}q8&{17Ʈӝ#o4^k 6A/g> 'Yٖ"\΁LJq Sgkށb+s=cbHAOUv0˧~7q&4=~7)r6)Ѩ b t5- ԡh?IGok%oR2YQ:kIr`?iJPUYiڍ҆R;r9Fcmt? >I^"/ e=U0knE>NۡZtƼS5̬@Rk$̖.lAu;@糟J7Aaʄ7ޛ|ƒ? yc FN;*Bq&ZQUã)[9~UfW@Kio6"qtV47P¾R pp͆:_,|W qpIUj6Fd;GsɊ*SEy5LJێ;xAEMQA^$3 љ=f$b# t5s,{k,: ~܃Iy5iVZ҄= $/=k *ȳkr18sO>FucknC8_ m>sB&^+W;y%Zf*h0D'R$dZa$^4Fdh p[=lN:59xfXuX&GS1ʖ&a Cj{AM2 AIBi-|Qs B%LLjr]ITJ#,)W.S|Kr_RΦ‘1}0h[? 4t:U 'ZHxv1SYcC@'GAݪKO6KNx#[4rlQCv/圩mSa`bE##Ƥ Pj7FwobUjEDžSk=BAcy[ +yj_uH_kɣrn@g1TdG  |+T#Ĕyb_5lC5~)"TzFf-o=y#+C0jK0I.Կ~9]s.lsxҮ!x;r>BЄ$i36{I_HrJ1/S'KE<@էG#G}JY8 'OPLa겙S:c¶LǸmh6#g>ച3liϿM$~]y<"u Dh]k{3j3X'[YC腘٣4%Rgɮ]_xirx1L3l?EsHV(̳On7wڍ C8eP%F-+('w8uBSe@;?&őY:C'JT$sC#}LLLrhÕtHFsv01, }yC79AS'[f.昴铮;N*-}D/5<>c塺u`|UƮIxEla\Ϙ)36jD5&}16BB]1t qDTnygA/f^ JST6|:ƫACo8-[8|MpSF% W KK򯀸 ]8w_1əʘ$I!UZb-j5\64,AƆƸ!R+ ѻCWɟ/Pwq\R߄^`!QĂ*UDZ)d$"@qLԩq/_ȡus*U%,}SfrѸ%d7E7}䡹d8~H^z u.wR37l5i>30O n)!06\rtUGs1#鮅`",-$@E~Bcf# 2M%cEs plR)z|9Zrdn[ξ\g 7)fW5rY ᮣyxVFSW<;SpV6779Lz\B tsW O}?vAI!cfi`Bܵ锻'_5VʜJ !+PojEZ TgPCqidy x;t.&N[ 5:Xޤy8y-?#~biRDh!h DU'LUMbCȰPQt?U]&@Pe`:|¯G q)sǖ9B#ϹǷ:SPz y pJ^9CIpN2 J,hV$o&:8sd$4V!{ %08<%?Cj܍Yt URu[eSk.i|٭>Cg197*=4 {]ݪ{hV[0RsH2n 8d kdc]lyA12E;Z2؇mnc97 M(.wywIq&s`kHrPq1ȐHЕ,^88U$lgE; 7TkJ9țf7\iy 5L0| F./t?MV;x%xEEy.o?t5X0IYf¬z7[#X˔V>nힽ"juJd=}҈dˏǗHMQtxTd$+S{jT܀ z*'{J&Oy.9up90q:!T躹yIY/P3[pjBYϓQ1~\'0Gc1}$$vǀ<%8$x3߯8ϜxdW4r60S+/ &Z Caj <:J]OBq\C?`׵ךN:@DR!p_ms#GOCiq -GI= -% =1zk}@2l5KorZȥ3_~7)y֑-mǛs*VfY7,n%n{uZi#Ύp=E{|ӥS5ДOj+튺]BFssקhcCf3kN EBJľ"g-̲O4)} Iqs?XvqNWKLsn۩,:*!kŇs9 f AP.) ձօ)M*uğ&]DT:K R\6^˯cd^?ݏƗ<h@-9wDJeQj@;>bGbCSm5+7}h5-` lR LA),|~ƣӹ/?Oυd 7IaI0w HR5^I OBTSxr/1!@hNSqrŎgUyNyp6,}'׭[KnٗBʙjzyyeKs]ʐT[/NGT.LCAI` sUS'M& ^P-71ѯkAT3'10LJ#`*w6 |2nHd`wi(\]}o4ЖTaEdENzA2H{ZS2lw.Y$u ǻ](<3ck Ǚ :71zu˱Fu! E&e&|+럱tk *C'r0*!Ĩ~:6DKOG NaOFuؒy+ѷC,\0k j_&GqCHKOXbcP%nם{]E괢-:L ul,»f_BV|&)Iu8:Cى$1A_<J[#C1RP@q6C/l 8ǔ-Ue0gzZQ+>RTǗuE~aHb=gPݒDU2Vu!l`e[BSa qf^t+Þ1O<{GiAs,0V( WyhcB]x׭lA$f6ECJe+Lwd&6.\c> xv=)Vc ocLT%6"UP89?)"ȷJ'' c#sTԎ`Q &n2wϿ̻{;&NOckV.蛤 `آ|Ֆa:em+0 od%Ѡ b 3z,.g^-'pҳ0"GȔH|\NB >$Ru3L-|`JV􏢯NxQIaZŜgLHm2]?XN&Xyg@f-)6-ү:}oA$+\1UN{} %uu\)0 [si%TݪhaZפ輦!/S.\d+xכ)U(GȬ.Kdͮ$CTyf?FgYOR,YıEjy̹4z[>Ap7Q PȯVо=>pF*mm6L]CNJקۦ@vOW]@YUai/e;py~`<pcis(`pԟ7vA}ߙ4݀KI&@8El P"cQMUM{L/%5r yL=8_-13@1v ]tS8!x49y;ssh'ޏ-s??6(hG? {v ^/k6YM} C8g֎-NjaGU 1Q ~3ds\>ҬyWՈM݉~\hCZ8O:ݭww,=v [CrWD<(1@oL]@@*iB0u{Yy )'ͷgtC-7OgY?&Р(V>r3OV+`D MLjJf*:*S  ƏQ26lb-w$2fI`+|y0/iBF\S?!hjS 54O|pMIG C hL$-}T hj1㒼Gœ§Ft6 vX-~)OP+-U&a@'YuN<!岲tdxgV <)O x0/)9T dM5qTx7G1<eCG>$RrUc]d\ίXB ͤ˝DC@hv1;9)N=7D |̴=$fSвߓɓ~p#畅qٵ-F{~PZgC zz2D=bw4 xU$'W|kTB;/ZFgn/K.y9'P_~9y іjrN ߝ/R~, s?:"4 Cwq;dQ+*q~|cp8En@?bl,g,^d g}

Y|^# sOۻA玂浐\s5+˾Z+Z DߗhRJKu؎LbҊe^)b̖PZ/t8zJʹI}FF37B[FþeE!?NIeYsg1Ar+f~%}i1(H:S R!Y, QhyN oTC?{~[M`ƭ_]ˈ%ܸF-nVnEj9 vWokv]cKJs+M1?g M \YMڵ(X" OK1A\Q[q dޛ̔U,m H Y7QV'K :LlHָ_KĭG=g`UA|&A^JލWx!' m _Ú,|c5!shOmТ~iU,ۅ-[O!61 yAu?hۧϣLhY "\m׏J$ #&[E~~1Pcm"x K:yi)2WVfe3#tR0Ȩ>'2weHrN.SQp/bMi8rUcA h}lIh8*wpsc w.w 7 dXIgC=Gxy?f{ j^>b=]`m'Wfs#C/;%SJ- (e( Qn>0cJ^:H~a~<NRTD^UL?Jg L44t#^#_ο2<+(Id{^Y|ZB]mҪ3ۑZpdQ @3!˛$F 벛ǤrrO+s4o=?iܐ9uHQ&R`3=G KʋzTuC'txORJȤ_#?^]Ar9"ڴI^grK7{*Xk$7"Ds/Rjmо{?g2HG2$ ֺ3 F8aWFGE{)ݘ{!p9lVǴ}9)|?T= Pb-G[_ѶƇ]{YEdWLIKlc!ϕ'"3 ֨b#2RjX̌ۺz2m>CQB˿d{ ,~ď$(Aga!\QĿW3 Lh pvc0 B>{a~hHBJɦ~lae5b?ow؊vmϪ[0#JG+?<5\(_3Wz[*|U/ń:dyߍ=)'!28PC@+묲b8||!ߑH/b " H8]N} Һتm`O,lJ?E a}wUu+aF ͎yv{2p+ҹB`Sxd~o3çY4L ' xPGiO\H\QҕlWm7s,>qg;Q:rڃ(W|M0)0čM$1?JآQy!2 Gۤ?Z]-oIԫ36mZ+!F!4h-Jzwx:4"A5%-󨍼k~{")3-:gTn/Cd6l7M/ }(7ٻc!$T2UoBӗ8a8n_[= y(rƌ 1nRpmGRlHbB1EfmlIJlUQ̨T7FRwZ槎31%dCB- ri|I]_˩f&Dgk*tvcn[RoVRU .OeCg(b fa%Hy syc6$Ph{d-yϝQ݉p*lj ʩoLn͖|y+i22j]!Fobnϲnu@J<8߳h YL%gUvzncnMpAώs]u%({x+<[Ӣ8}*4s{`fzq6z0|{a7ZnZeV1B>ǘ[rUIXw4 o3)ƸDK:l?Nopd]kb9L^L.}e! "9}9+9ݡͅSBj*1z8qou6%yǧwyBȬqFqj8h'Ǽ}tuL#6 -1+AD>>6h-\ +g)Fl|Gz^ioBZ>?D7=Kք2p77uRЉi]fw%p&ؗ3PЙ:!X凊r2Pw]""L> 1R}wԴz쵩d(W@m]/:}۵Hh%r(&0bҳa*x4wT NGb`_Pw̥nŐEe㞒`.#/GݍyB4Y[2&.7ŧ(9W`0qf3Z0  anv NjPv S/Q~r\ӾoPӗEӥuN=yF7nh7ۈ^qiZ53vڐLx48~ FMT\7CC`=/jih7H!=%5_A龴uxݛӛQ]k/ tB8}#J^Rvxr-;iNH ꏇ8(-{[Q]sgeWq?R(u3;/o=тW4}l̰6}h)(eiEcMto* &3ŠR *E\)VFV?ԿL;fM]@%m$cbl*'!`sos!44Y}wwm)# 5KxM" ܟtW沛1٧p #v<"0i!z nxdTl܍_2ǓwcKuY__kE_":EY5 ҿ&˰%kcyV|QM:q檀<^󸼙U5ůWK*H.:$ݑ\cJ9(MwQw+&fnm즽vkǸ6(EyqPخ gD_$͖*6YC۴6 Opu# n7?K 'yv7f/H>FH4V!Qb^5wQV?8EZ3av]4Z}|~~ǛH@:83OJl`NIL7^17,N4t_t[['Ⱥ5Z1Dnj7_ʈDK`~k-6~"ҥo Fldz8o]P\wS*~ *{g *=_hZ@yDO׭va jY5ԣY_l@Ɖ&oBFپJѓ=BޣĬ/0"nGketNt~C &C,o>ޑ*'ȋuXqS9uoJ7SOȀb'aµ4;vSudYr>MjE~J*+@[ŪфjR7Lู:!x# i/?=FhfƄq 贾J-$f- C_go(g(ݖOXAS !K O8D9a3^MGB#Oh5 rn/]% }yyuO}h(lf쫸Eb)/3c> ~l, uUJ$4eRT=tYʡ!,WH⛡vT#`83/n27l̔2e:Ak@ >j ܸ_ʳ|imPx {xγ*|~8r1L[iK:>%WsTW̶G@ϡ vd tF_W`P 8T bQ"oxZv;&?Ni GʄUIT)-FV cTB8E%U.yѨ㩃`7w(pbA/$ߘĂU4&yg~5Y֝1;>_`9 ga .Fc;b})/U#4'9N$M42?۹ʻ 8]zrtqp*晅- GwVU+|l|Y H3VOq.w$i*g) f3AL4x+F4l8i}y)'7ƝjBX,,<=pXu#/#MEI'bxJ_x_ngҺO(Nr^a@c=c綖ytc,!5H8qڿ Mp:%-)Zc~.2FUν& I4`D0#EN븘x*:wGz <͙s]||s^ǹ\>^{3!ByX&\)Ӄ\:W#HwM6 *̅-'\^8EeRgrp E:|ᇊRZ#?ڀj!ͳ1n%_BYA\VSULͮYt>$? ׃&PN/D8 |2Z-G|}oJ~.QP/^Z{4}j~3WaËۦ8u]xuc=),tޚ7Aqm2DUI%->0I(Ѱ~6d-[$sŴ&_ꅱ$J!M:!LP.#$;rIZ YdUиT&p, BVR '5.V@|pMˢMw(-Rئ3 FNa(U u1:6Kfdtf Nޒ7Z z-D^2'GO rw;H9(od0xKL=LZ(|ƍMJ n&[.i{/ ki=.+2&b3apq@Ps1C ~ooKyz׵,P Ј-&r->~,\ Bd[ovwN\$ Csqz>/^a(`5 aqZ74kl#~G-Lnt[I!Las_A #]H4jcŐsjO*oY Î#xHuL}l=́4 XxˮSV-m&M6aWDzJ,9W4եc9W[>j8Yk\JZo;`].,kiTEL-Vߺ^j$3V7j=q<<­Hz^3AX\&$ 1M3Ox& ,݈p^?c;78T1mY Ze0~?:'Y kUetVա ONZp iݶG֝Twɡ4a{!-Ӵ'e^'yW1[OH;PDz$=Px"ŭfc2W ;OЋytC&V{c ?7+ǧY'|Wuq Ewik`&|5-JF$7Ț@&pX82Lȝ% e™1޺{:SbZfU !u:s"z~:ޠ;WGΈuW5wjkUH m@d~쇁l2hR-Gnl`~Bhꣴ49W#tSJ4D8{tkchC7sc~ݡ^6)} `Pr~SSy@QOeW< ~ ] &)ni6%Ld73.|Z7X{iZV#ުYfJN2"#O."sH *$74ʽ81*8E;'uޅ+9˟?ȉY4,[7.b^jM <%BdslfWj䭲S{m!Ã, kcm6&0 toq?PJ[|/SFM2n]Q0KKnϯx--WaEM=~vOmЇO(Ng">t ~<9u>&+dXۮ/)g{7@C+i @aaUEN@z+#~R[L4 6s'f5O6I$3/qCoL[=߉5ǞB)*OU4CnwG$1`71LO밗/K.wVNi _ͦ򖙒/ZfSs ՗!\JrLnBCDM򸎚B37c_UhEϗ%IwOY=H^Y<%|{?+;18:<ߴ<8n7bɶwhHeNbZM.4ȫ)@3P%ۿ9vht"JƵJCX{ i\ɡFlѢ!LFmfCf/tQ0v'.UoXRqaTVSSV!Eq68FXΎz5mp ?zSaECZedt= :&698jlF #e@zHs4ȉU)'sWOP:3&4 sH 8cruZL<聮@/X#P1߽XGH & OX|gqMKn{,mz%8V+fzXNa7Exsp2PL"CΑ}zҢړ{̅sam;㐴͸s*RN5ѶzHtT^ lD[öh6vxZ1ސy}2Llj߻[]([n$È_b}P_'{M%8F> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qhe9xSTQO7}̽][GLrFMG}}"Im!00jEV%H^/v}0<_7RyL U~C`PރSӯ|' imXYӷ|4nt.kP^k?IFsuB`nlB =@ )U 9yI(ѥ S*043``ÍSqf|kiCc, pDˆzF:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AI cMXS?S/w,;: fyR(#c^g!ch"ƨ/kC^d cRx~h K^| МQV14Ld5cY9Y?=C9돡'g ?%>O:ShYg{ΈrYgDk>[bghX|&^V|sig33qgng3tZ[Yog,g-g B|B|\3gg|2?f)> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qDŽ r Gէn8A{,쏘LEvDB``B9zK~;_q`>Wgy o.>ݫﭯAbZ%?6G_Nzy;9ڰoiܰ^]0zu\~3ݍܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1gT Hӆp1X:,p8}u 8alSM3?r>x\i"EܰpJMkl4\?ǚc:#?^YHwuprQF^odž1BЖEQ?1^׆ƨАԗ039+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrY׆}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *.MGZN(:p~7a?}]TyԟE}Ư%Vu'e% endstream endobj 96 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3FXҝA5(O)suߖcHQIܮQW Lڮ9ˊ6nK5NoغWi~r<d(Vu;_=85vѩֆu5CNmm悥+U=#)\][|, MHS"#p #>y| #:##0)%T\`YQqJƚ`ci|1Mَbo4m `2WQ/cW888sέ-./qJ;&\ k(d?F#h0\?Ipa]~9Vk?q1Bx.BzҬÀhƘ'g 2xk=6u2,bق6E0F,eL燆LY` YecODV3Μ蛳;zr֟P.O0{S3ux9(uF: }6,V|ƌV|gegV|F_+>O+>G|V|~+>C1 V|B|FB|/g)g1{!>_|&~'a9i0K!cB{XTK5;)NŽbPq> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z endstream endobj 98 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z6 endstream endobj 99 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R!ݪ70W?g_,ɝиYs{ ]7;׺v=ߩǡoݨM'opiT}IAu~\3;he?<{Q%(SVk-#&9sQ擾ݾk^!00j(+m$?Gwt>X.oTuþ{S_tpСtZ|I1?H/'BZV;ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCa endstream endobj 100 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQի C}͌6jo73o{q3fѭVO4cpuU sk/wOwquy_t}??p]AAu~\33cA}P>>%t;en>r8`S0Aj~vUk&Yos yv rOiHM0[7v,ܜǽJnkz~lNͿvt*amкq۸qۿ`J-ztH]{O|, MHS"#p #>y| #:##0)%T\`YQqJƚ`c2U{;5Ҵ!\,18"\aD E_sN[sS9)9^W$js7 GZ ׏p$uX}/S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7q/c?z~#袳rdbP)n endstream endobj 101 0 obj << /Length 700 /Filter /FlateDecode >> stream xuTMo0+J!m0U !mTto4j{zv|tv ںQf|6'op݅uM{}ugfci"Amƃ}>,%rtPRJ(:X'Ab~oںT7h uSӌ]Acq`sy̟M.n? D`އщ7+d~4Wj7vw VRŪ,ׁk/bxO0+,F )1!Pp #]QxQTv)#ZBYLt/X^r<1u%pr_d9٢PSi0@WQ_Uh֩h諵"qFM]RrCpt39Âж~j3Fezp888Q:1bc7~}Hq('bĄ>^m# &zd}4)` "H,4%!%AQ߄B[B~)ҙ́ _)M?DM;豬;kyoQnNRd\Ӎ;WA} zoZZgbT$Z|U endstream endobj 110 0 obj << /Producer (pdfTeX-1.40.24) /Author(\376\377\000S\000u\000s\000a\000n\000n\000a\000\040\000M\000a\000r\000q\000u\000e\000z)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000A\000m\000i\000n\000o\000\040\000a\000c\000i\000d\000\040\000p\000h\000y\000s\000i\000c\000o\000c\000h\000e\000m\000i\000c\000a\000l\000\040\000p\000r\000o\000p\000e\000r\000t\000y\000\040\000a\000n\000a\000l\000y\000s\000i\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Keywords() /CreationDate (D:20230929154904+02'00') /ModDate (D:20230929154904+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/CVE-2023-32700 patched) kpathsea version 6.3.4) >> endobj 2 0 obj << /Type /ObjStm /N 85 /First 680 /Length 3759 /Filter /FlateDecode >> stream xZ[s6~ׯc;"Htv&&8nsiӤ~%F"U&;DQr$iw .CiD"iEԑ告2#$J#$QEFDFQj#qF635*2³TbF)x&p 721.m2ʀ\ie)XŦ:o"J"'̰D*A™2|"x:,*aM'%T0(r,FD6%H&#)D 6 b"EB`PTaLmFXOT9`[W0AB`KH`VHq0 )RJTJ=2S /K:V$2R A\*4JY RL*MR 9Db@u (`L @KMg%Mc4A* (I0d1HH-՚T"&b?o눝FuĞEcx~Y1.F줮܈.zL:ΊY??Gt(p-azyĢ{\U5|\Arvhku?boVk,O#nfEVJ.3|L](vGcHn ʆ@b2F%q%G;xbbYW$𧒑f0`+%?BHD)뤑"Vdd|m]XrcbAfhX3c K-SCV'w߹c6{޽~Nϣ[clVO8/f2UUv_⺹fE.lw%kiX7b>1~P \Z{`R dRr9cE(?4&w?pjbXhXG C2iQ`P7Pը%؏M=}SENFmun|!f?mLoFeN l4xEb&b ll۲cuC/oi;fih8joFD"LGU1/{Vo#}5geuMII`#{~rB3ly1Xd /ejiyuU@T$S--jJWuW̋Q۶dM~[| 6-jq5/> ȧ eSSZ`KebYqͦP|7:oVyX}]W'6 _̧Ŗ y|] rٮ$lNy51Gn5 $9# E(uƞ+$E\˗˖Mo0eJf 71` aO۷ ;}; |놻g1q0c -ILENł%s* *~K޳sHNI?aR;ݎo}T}plvSj `̆cm=?Efာ]Yz 6P0ݖzɏJ22lkfoy( b8&E}0ە߰ٚI"C[t%"@M2ep"TIiM+eӘ~%%h!@_d2&uX6M4R#ޚ략ebPu!0Y^zzX4IW:lƼbQkD=J.x ^'Ǘ z}y/ bkA:NItW'ᚻ^%<c DG 3ZB O?܀G%~ojLPo 5?Q&C>}]$N=DqUmh!\|~[ z|ݗneI ĈH!pRL C<ZX ru#,TX"lL?/$GxzJuH{N֙v.JcX?I(7%ꐗh> T[eHhG&,z̙*>ib~qfrgøgܜ: $Q}CZX̓jhl#B I5n 6a'yƵMP~Lب$b}}3u_sё/ZT{H dF%l"pBBg.F4`Invj8[!J+=+ ;I=fu4[0A&E ]Lts8}g*@QϏVcwZӦ\vu>/^׋Jɓz>q_̨hJ%!cŇe|V7I $@qu=/]H0>LB/Gvޱ])]]Yjd kYV}{B@n1=~M:Cю=d[S>'v/'}8{?o1ُo?(uqEBk:Ld}=ø-!ߏٓS2{+Ï5{޲ٯ샳|^tҴ &qvsUBݰ/˛<>VeU@5%[oqkC,-;Y;(iuE}f_ؿٿOW~8'#Gm4O% ! `Y|E!28?>2GdbD':km-}>j2HM5-l\I7a7'Y]G=TDt@mZnh/?}O<ɧιU{Y= \Nv6~\EӖս\z9_\w\48k0O8A[ٓO޾ߨ+bmа94<:& t' C lvux+֞#>}LGFe ׷@z0IjZ{gv]wٛ_ "tzf=t|]m'Jr$ӄZ/%T^ws/2MۑEae)_Ywy폀.~W 쪇ܗ)vTzdC>N|8rRn7㤪z ]!U}ꇓz !*>RqRIݟlSj︔Q*SjTmd;)WQB$:XjĦwSٖeW؋r֮pL~GSNx>_uslIm :bY~)tT0ti/LKCTOM WtWOu<~ DA^NM7ݘ.XMjIwSLM}+vR_MEYՓ|Z&-vl9+ռ@AҟQ?*>弘U1]vEAb qjVޖ3duQfˊ ̙em^\@p+%,Nt |L7m1v6[ᛶ-M[^i r OS8iBDy!C1gwW- ~w+7E[:ditCN$:UIUuL-^z]!wm @ˢ7u> endstream endobj 111 0 obj << /Type /XRef /Index [0 112] /Size 112 /W [1 3 1] /Root 109 0 R /Info 110 0 R /ID [ ] /Length 284 /Filter /FlateDecode >> stream x.AsFKQZuWEѢ }+H$b|g733DhVHFC86؃}(C;:*p J oGTQ>l]nCBniW4m9)!QˆJކ30Si|F& `0p s  K XU=\*FUBVoVJZm>4xgGH~9RwtΆO.u+V_fٝ(4e#w endstream endobj startxref 210281 %%EOF alakazam/inst/doc/Topology-Vignette.pdf0000644000176200001440000106361514505552753017676 0ustar liggesusers%PDF-1.5 % 10 0 obj << /Length 1762 /Filter /FlateDecode >> stream xXKH+,őHO?<؈ Fӓ;؝_Um'6+q+`=zŽDpd8$""EUb٧k}8KYn6QXj6YWmѺ]ˢZ M3PZ|LҀ1*8" M"wˬ+=f<ͦ+n08{wB+]lI1&+S.4)%D*04"=И=@kw 08:."" 1l+v!Uf2 .?@rr9< ps&s6YU&3E]aN <46!k{6kc}|fﰨpń$ԍ)Q~ r8p, bΣFf(F.7Ů73eAѤ-vǏ&>Wh?_pZBƁT9%-8pf4(֕6FF^t0pEvP׍[oh4®u/J[o[k Zkg#Dه{Wo6We{Oh/XwGkjG7ZB|_}ܠn}jWYrl2OI*bǝ8d́\Au(ξ!'r )P€3ZulfejXw0Lܲ>P"nS*<56Y(ܯ: /MI4Vxn:Rj |+Bq.("*I=fRW)-'.źv)DҽS/m~Թ9J/O6K체r٧-Q{>PE1H-8㡀kT{]}L0oߐ`"2Qw),G.2Ӹ#BX"& ~PKE[ޕj16j>mz^>l6sz_oEFtLŶIK{0X],7~~ː|U {鹯Wjlux5ۺeɪ [y\8!>at4_XzAb WIy;_Boqe?un_ѳ]znhGD䉀9Ҙp.a![]ھ@=A~H( p f<&cg]UV_wS; >XymRŲɚ@mCu[֛|Gծj>L551ݼ# cێg= ;~lS|;tqonJ endstream endobj 31 0 obj << /Length 1526 /Filter /FlateDecode >> stream x[[oH~ϯ`x2܌6d[Rյ% mc@~\HKl㬬*f80\0X.h-i)H˒oggWW30ghÑ暚=m8 n1oʨvQSZ8 :'ӄ)i2K8Yv ŕ;X~ zۓ$c@jcXҀ nă%!nnN)\jΒDM{E~{ovGW T}A8'yG܏0_(8Y2bɝV)%ɷg߱Eta,{Sģo-yHo)q "(B/ P*8[٭`ܶ(zvzƤS;Edֿ c֌뿾Ϙ.ޠ3_ȏU䁅Y Tr͂0a/|nw)Ne$Iآ*UoQtmhCĤݣY >_+A 29"O~O70, ĭTSMyt;/m@T|G#.Eyc(,#h !y..O^\b> 1\9}Y0ᄦ00mIјkBʼnz&?5oq[x \4@T"y em&5w{pǿ(քJy8 }hjBY2g`+<B\-{aOC\.,lCQ$OY<i@m(+L8J~394~ ؐ_Ʌe%Bn¢.z_/d[3tbeX.2y,ޕ)8aDBMH"Ep =PWß\ $dIR(=F5t4yTT/ļ3t gW@Hndi!6!e=- )aZ(hQWsY5;A]^f2J`Q"%ϒwnYSٌd[0f5M,諦=#~!yh`OC/@=}THPrB $u@Nշ}o>{LGG9} B(Ie4iz\rjo{8O<%OӔ|dl̗{[Oh̎KDG~mr99+>^޿!6 |q6aL7}i-f@GdOAF;ke>۹p\GFwMs"PڈV]*Ŗ"#x_w$@Ӝ(2CJuKŋlsefP*RlꁓHƏh eaꏿ^ˊQ?F\&G+Ňʋy]~\SR_Kx5Ƃ D( Q~c՗Fz75SUK~ȠfL5V啍l_;?:{" endstream endobj 37 0 obj << /Length 1581 /Filter /FlateDecode >> stream xڥWYoF~ׯ  6{xC$ Hb!)M,TwfgWUI.Pܙ!"MG #2)g*Q,IRw[_E}p5ګ$`12-8-Hh6o6uVWxR xni{6"nv?gU:$,``&O"-93fku4TuE_55SRdzn1,zCm`紁m<]_ -bUnVEo焏rELF¶_Z"~myGٛm'`d^(92 S/?_%[2M];vN *?eΙ4Cm |.iƋYF-Zv~g-)SJY=srYwLir4`8j7`0psJai[[tS?AyzP;N_LDm5Zh ɼ`wB1|Vk#h2B2ґ^yS f _$e%b](Ԛ4PƀWl |ɸ[6-xBnVb?64G7hW@OPo+VÂ##% 9?]JPB)=f>J4=Lp Q c,L1ژ)?O4j!]ZѢn|N:y L{'xh.&B1ߢ-P`&$|A.l4e&8c/\QF ?p#1cڒ(qr?‡x#* m[;Ly%L?wf\_}3G!G0Cu ^zfsP|v~G!?` xzGPg]x鶶;f>㳼PxοOq_6Hޥϯ=@PLs*CT?pR' +* R>6kYP-65`tLah3,4ީAFT?C;sX߯l*WmS*dwCXe')ҮAJ$LxlB;bO yGʇ'F4.49nu('^=`::)+DUζ&0J%"LۻYѢoe@8we2zΕ8jҥ_jci/Vv\>|&7XԹ/D_Wv1wȭFyتAAi/xX~Aث ?< Õ:d;?ذPaNN&&g*"/* pqI'6 &9o@,Ơڸ#T7?: endstream endobj 28 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-2-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 44 0 R /BBox [0 0 540 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 45 0 R/F7 46 0 R>> /ExtGState << >>/ColorSpace << /sRGB 47 0 R >>>> /Length 840 /Filter /FlateDecode >> stream xVKoA 1xTZHHTP5H}& ~۳#h> &#!(k ͻ/\.1:?ln}c5h 4ɬd6E `PIhNbh".`2袈tC+B-+Cf[j("6&,YΉaDNGxvV(9f`/~x-k)*2[I]4'ˊs!q` =vsÑ/Xn`BSX>6Uq0q< gUpd^:۲ Qۿ\ĆQgb)AUp8\I"FsMCZS*/]`!$zy93U0ۮ͆MbiE<9T][IDzR{J'j[9_jf͒P#P&Хnģ.fŔU1\we[{؎UZ9`*=q;JUv{b~k^(IF$k֥*Kk$/z+®I"H6{sKGѕ\)m=sWD؎R*_r/Զr:;p;́v:lj!?vyY[9c&brUɛt_VH2JN&h$:B)=~/orB"\:=Sm6MhҌǶBd5@F!!dlhF \CS@Z2Vѯ FAju;S`jy/iM7NaK&v}"}&>ti,wq]MK endstream endobj 49 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 52 0 obj << /Length 1788 /Filter /FlateDecode >> stream xYmo6_a`1Qv@۵N.`bѶY2$zmw|Qd)l'0(w;=wr'\? 'LDf3f'/Oń`LA'GL>zΦrշyM}ɋDVv5UbKgZF֓yb,vT)y7;c b~|'}kZɔ0ᣑ|)ZRw s,~<1ךyeQga)}k]Cܚ1L,iWeX2K'<β Gtڻ0?5czsͩJs2ks$TϥfGΕٔ|!R&N0QɯCtC\?uZ~2b῭_72<~WdU]"!Ae={1`U >gT[kG1iɹ3OS+i'6'-7HilUGzٍ~|~Y)qWA`"KS&D +($._|Aȗ@2ިRjf1,U*{HLb?2XLj)J)MI#ѡu\V}(@66ۤ :#ڞMW(m7y}&vqS2`œ9\9Eejm ߬`ʙϭ+Mx& Q;+`'-|xA?Q;DC`=TUOe|ߜj#3 xa\ ODB9PĥUoxlHV|s|O.~pj~fQ D.u(h 僧%ܮ2YJQ&:,{Cނ w@m$Fk;T yG4[ 4.y'rg`@߽[U\ZjlާaVK􆃀\N@nKA\$+u˸i Hloʐ M%/u!\ B2vOe؀AÁEqf+}xS;1 @{,HDăFcʠ1t*c4azԵ8g@F 3T{m4WXϪ>1DC>DC=ȝ..qZNΰ@XsD9iHl9|Is{u_a|Bosv- .>>vꁻ[ٯ.߻.R~O.+*u%(lJr1bW7M44EɘĖ쁻pP-/gA}Pߍ@!993i7h=egT':B9\TwWqVZwҞ3*֖m==&-E :ݶ) fuҾ*ÿHN,D3<|7tzt3Q}L=$}Rz61ʄHԈWX}tzGo'+k?q0G (ॹZ6OPwvvcz9Оt=[:Л6,FٝWr>D=<uiD܁&g:FLmOQllG" endstream endobj 58 0 obj << /Length 1493 /Filter /FlateDecode >> stream xZ[oH~ϯ``}ҴUxە*"fl€~\ qlNn[<e|l'Gi]D>|pP¬=svr`|t ! `<p2(tQ}3&4cF Sk7Ҟygg61ۺ=ѳ@jIг񼾷>=G d EHLB<ݸܶ?Fo$2 bc؀S>! =}|BwD]W.Lw]dyXXgX3^Q^@]~cFB# ރ2LF.*@a`}o 5,x)O]~G{WLY ޤUuѕ2Qk_vXih5v uJg^9F!ߎ0eP-7"\9f.sXJR2}^ٙ$:?31kX:S 1_ AJBdFBWVԦ*Re`2ekqn{MjK:[+EMԑ$Y|H%vRGNtS"*ZeQ&:+d!!\$O YK_t!jКYz%.6t[ =q_v;)}+Ɋ3;XzoQix-Dz.:. C+'L 2TYpn^ٿ2*) 7s XRaY338~bb-\DIvQ'u*KWpS1!fAvI%bJm|(qkFДk<#+>W ?'@u/]GVX4Ty؉ $J[ջ/D'_xuvMP?F:muLZ^E߳z|{t1-GB\ $:@{< endstream endobj 63 0 obj << /Length 1229 /Filter /FlateDecode >> stream xڭV_o6 %d[v@b%"&KD'ͷߑGٖd00㉑"o153/ y$:9Tx$ (##" ^ea^?#1% ͏8`4/U[b Kd!F~){UFOc 1,?~;Gĉ 21‍;c4' iF@ l֭FJ5ЯuI|m60SQáunlZϧyF[rt @\h볭`Za`5]0#x)bg^= E@كA1>nS; ~ll'! 3ΩX,M]0kլ9KtM۴P\}'k+MWw,.˸Sm z %)1CSR}@s)KdNJJ~C"wJeQt U0']SM!Q}šPZبx;yPOe̖Iz,!e 3~R27nLUkۼ ]oܛPC+OGY& ;ZQ4Ȓî)\!@i%պ1` dz'u%5D>-<)H]=t)V@zlU7|؝I )@a0o/63 Pl9z`Cl:0. 8^01¸_N:mǦ@n%J>U.Ew#a>&]#U2LNnflIko9l,cdFܝ.7XvQ(aek3@tL;=h1 #_;A0#&%L0it<|(!1c]!pitNj)c]Wr>^n@סg|>tX[b*aQjr;h IS:KZ(2)^CCCڕՐ+tO%շy|gm5<򬵱^¼/^~ZN^'9rV+n8._qauS7K'%m_S|_T5Ѐ@NJ|0BC_K5? !rs4k̅fſg|N[44}L+M7gI&#x;9fc endstream endobj 60 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-6-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 68 0 R /BBox [0 0 540 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 69 0 R>> /ExtGState << /GS1 70 0 R /GS2 71 0 R /GS3 72 0 R /GS257 73 0 R /GS258 74 0 R >>/ColorSpace << /sRGB 75 0 R >>>> /Length 24928 /Filter /FlateDecode >> stream xK.q:?bO0ДmZ,\@lIؤ _+׊XtO%R xkgU}U+"O?-KY~|.{|of/_uxRo==Z3G./ko[xه!b`ﳿ2S}|mQR]{}&?]v%kc>x]?RZoxן~џk=3ߊstu3 .8ijd_>&3٩_qhc{?o?,мr=˷v׷zϓST_2,=H~ }ϱ5gK[׽u}z=o[=Yo7:b#~}%>5D7Nmڭ_vk,ėα|XR XRX ۭ_}%^{DX}{ Xb|7=αx=2{ kyc,j9d³95{{@v{ei_ h}jvCvWR_ ok~ٽgﱤn9IXzcDX}{ XK2۟ tۭ_vv{D\DzI.em=^Cx92yiHs,~g^/Fzy6 ѹ^5gexV^/Dzv{{+ǾOc3rOr4% ]2%sCϾdrxcq<3t1k~ٽg3_%ޛNIt~o{{ ٗ W1K _\vX֗ ceX9t1k׬njó/96Pc?s cn=]hkގ<.@wv{vBw.) ]ڭ_vXH=Z/e;9X{t.Y=xN9S~!<]<7%ݻ,Mt.ݬvgK欱wSǡ']zK3>f}}>=9pسY~.=g_Z?洡X} }~Vҁ{i":[޳=RKO8ʒ:Vα@{ j$?w޸l)zvVmk~sd?}?:^zr_> c6]zlj)c/=Btn{~KUm[ߒSgEcχϞ"ǶoɩtËOcEXyocjtkյ뼟\1]]B޳2mZz}kwXj뻌Xw.\,s)-{d6n-koLt/nK{YWl?bdK Čg_k?̶3i?b@ڷv[~u퇽,-~/Dڷv>Za)_޳˿|d6\kS2AbR`Zxy2)3ۦȍS~9wGw,ҝ`|kXϾKu?ҏzvWucw?;t~}^k}\k]k?t~v,Y^xJٽ# grMG{ ٗ}=@Ǟ t0g_K]̌/r]]+:?}}g:s6si?]*?$ڷm?Ϲo=_ >s{*.kl{m|oc{_BDGfQ֜;ڝo v'vZ;u?j c? IX$C.]>iM&ğƓi]Cfӷ]~Fs0IYգϾxo/W_|)H>,kXFG=QNeNFϸgCF+ccb/GD8b=@5qzYڈ+NyˏE\0}iaei k\?R!,-Gyگ)/Q./c*>^ӵQI1-:~&ˋ4Nz-ۊo՛ gݶS~X #%Utm}̓#&cH1{1< X\ e6{u a읷"*3ڥC\H}ozξ!.b/Yђ @F@^ίu'I&C_FHMCa.[41?:Mnj۟}Sr;GݮL0HtW}e5ÄFte{,kYCySA-m~~z b\0e$8Fw[/z6D{]֋`M,5QʞD״QjXO:HMtx{{]/?u*CuCcxokQ[-j}.X}Br=\n.lv_hOv0>InRZ =s,ξ9]7c|KL//sP̚n13۞ t%{9Uu}^ e%^4ǧx&}>H;1ͭ]|DGB| kSg[NG߁Zk_؁Z1ewkv7e>?E GvkZ#PKM\\4`@ݫ=\Khi-]KwXh9R ١Rڭ سT3 F:mR}ej*ϗ[t79t1k&25~GSy4Ct=k]@w~˽p8ʊ" s|oSގH9^}='rNI/}i?wb08"/Ь}_C9)iK8! '_㛤m&blNA||5r>[iV3o/4!2AR= ěuC#ԴO~_}ۯgF?b!ߊy_A\xI!}7t?Zy!p$y06SixG^߽=eXV< w ݎ%?07ž/!ē︾0naz7J<1ܗiϟ+"Y.|?sWŽl Wzuv _\š O7^ w>scMG4g㙰 d&ΆhO:%?ҥix}fy%zp"n &n`-lLغp7}~Z_ =dz%^>4I\x}F(k2: ܚcFl8 ^?cg5!,e_2Atw1yQpn/㩌~}e__ߩ3}K?8ExE+pq~Z_o|K?o<^/qf1l6G6\A/~/=/ږGϓ'W|KX?=&4'`8m)By=|)>Q. pyT>+3~?|)|_B5\1ՃMU; O|J~M_*}LGXx '{A< GG>=x .܉v_/ ga0JyeGX1`_p`FG|̪~z '?/>_s}ļS߭'ҡo-<扭-8i_&GL`wLi(lK7_:º1YMv}>'G]_z_>t}&7n> S>|V/~Xn|i8]?ǍkqK/x޸Oe1o<ۉ#^pq*7\_^/qVo _] 1ߧqq~\</ < XmydX롻k"54@c-GK'EIMGGQboW?1<sE ,y.y;<|~C~_h.|slyXeL(yGϛڏV__M_3aL_hY߿ha]_?xxU1ovߴw?t=7?}ne8GOcW^Wޟ$&~p_}Sx3~}ݯϼ3&vC <y]׳oɆ?9,>,H?nQ33| ?#pq}~f]KgGL/x8<9;/6Ovyd/<]߭#}}}[\/[a~-BN/XuGK%/yZ_k:'$G1G9N>bWzɣ%o1%_3s{#tGh$$ny-o{a^oy8XA/~88\{ k3{4ܮm~_~?ҭr 跾1歏>%}e[|=C2iSzp׸>7\J/)HyIK&}sP[p꫃x(SWWSxQ.yTKUox>|<_L|1E<9iyuԟt^o: ]/לolơXӍ}/{W^aCd+{ɤ~){}[&׿1}e/{t{|z1~ Z=qnD﷿۟xKz)m6nL{ +irZE-oa-:oau0wkiu}q:>wr K>Ӎ >/RO5o_kr}|~?yLQ%AȰQ#B|;4#ćhG/ȇJ'E|N,W.za/|牏3|_mp>6wc͇ܿŗ^G,ϭxb&Mdd'dBQ:+N_g今86r-$_\|J%lx1l|>p? f7Q⣶@U[`|Y[`]~}o<-8xKyԢ{)E_8_ģ+\:|G^x|%s|·n_Zt6f.ηnL(>v ;_{r[t7Y߼EwtPO|x67徾wƵu>^Hx= zAo=<^3x=^Ey<Ś/>x|^gcdOfǟ2}*Ǐ*""edLG'o^/pxWz<wP.O<^YSK[eKIe^/yT_%_ߠƧMg1L3Lh㟌>~f :M)/'Z|0,>/x<_'bw,/D<ef *qřϷ؊Of~zG񓶿TgyKb;I[ݏx8~^k!#{-~ăxR<9ݎ7_WR<e(ޜڈ/6qӏï{/Qߘ˾τVg&icH JqN9#sЙ> BfA7I'vӑI/tb%Ùs2X5՚f1~hc_#_8-\=GyA1p[-\)C!3nb#FZLO;?LpQ=k`aHQ"K,9\baH+{xl#qXyH\ 1aos)ЉgL\# [n`߿. 0l1ĕ{•: uh%CBMƙjv%i:~f(',KJԉȅ́3“1ؓKԩƼŬLŌFPܣ.5Yv>NO/K>Acc>^AN/4ybx|>'Z>V yfLLqsω;s,G̹DqsbRc7ч߽>~ GaH9PtoΛLH9#sX4o!'{ 7BMrlcSJMTlc')xD|bisANN~r8r%0wsI}N?G[?*d>{`@frh8ձq>~s9~29pӚ 9f?>ή;BNt.NIg'yVr{m 8y|߅(^4d>;W:7w]X|dr֋9^|^wz/.. 9O}ɫBt#]}r˫Bv|r˫Bxs| Oϳ󱻼*{n_ 癅w8|YSDЧ2t.Uߣ.ܽ2lVMMOzH{(Z w) / dυwqRa=%Sry9ݸxQc7*K,<|k}p8x~]W1N\|co\|kI{L'ߣ©߸77{8k1\ƍwq~SZ?mXxlye8k/wk- zn^Ƴ8- yn^o[^5ܸ?RMp 7Ƶܸk{o\q7{o\[q?c.[^Wsq7n#mye8j 8K^\oye8k_=- k7xlye8&U{7~ɷ<1,yerqוJu~ K^~w {{_A{2\덵߯- k_WI[^~oK^~oXj%ް{ÒWk.e2k_C{7cXʰ׏a+ k,}- k{ZS{7cXʰ{ÒWnƒWK+s2~eް5p7Zi {7%[ k~oXҟk8mye8k,}- xckaÒW|\ I|B~_j='|ZZ~~o8)um˫eo`(~ k_=R/ p<Ϗ.W/I{-yuQAӍ~=-yνY2~{Zaɫuna߯2x%VN=>/ZE)7~oXjXy%H{Z?1\ҍ1^1Xrj77ri= 7Yk_9W<eC^ Woj>TOyiX!oAn=p%+={?no8܏ kB WPXpo~b=kor/77p7o:oʍ>%ӉWus’WSq.{'{qm71,ybзKaa+[2‰^?%i~ K^QOa+å8<yIK^}NƒW:~% vհlx۟x {j ۟Mcl't_N}n/n=ϧ~ԗ7 P|6߀Gfx|6߁͇m%x| 7߂t5x|7߃y}Eh|6ߤ䓯Ri|~H{>ObAT؛7_TՓS|b|oG`8J9*>ߏr*sl}>AμY`󭘣{zX|.|/|0|15yNLlY|+>\|_9797ߎ979.|>)/rҋ/h9'Z{-'3_|F~#Z|H-dSEH_ˉؼ#|9w臭k9woʜѶ~,gSW|ΜtZ^e-3Z|[\\^uAn}[b}-DZY|a˹,>q'Y|N>ȝ5W̑(>sgN0;sg_,>u'Y|,>v|_.s~ݙM|.x|{NkߖNzmwW yפh_YQ^O>_rԈϯ`k{ (XZ@|#XN+XN3X4;XNCXNKXN6S 0Q`1,GF5Y1xQa<َ'37Qkd\BD9o4='S9 ܊gZ|;Oxœ,*9|<oU,J: s(0⽊x<؃< eOVkzYIxb1V~OCێw+1WP~_&v<y^W sx_̉<^TxBx< Oa+֠S+Rc}]QZ* !3.{_qcW\ wˆkHګqǷ|~`M_}^0V?zN]D`.ˣa3]1PNW,[ڳe }E1|}{>mR~7L_ wK,en |E\ CM'ʚ\wc.W{ hww@Yd'JOo&7/~?WoϾ߾}oۏt1[H'\B@(QDf"eBY~Wo?U'3 Rs{@;1W~ehYmT8T|Y+ӏi!~,w:{W ;GŌ9ʅt3ѷ,ߪ;{tVw>W_|[|5{~m; ~|.̫L{/XT\…x|ݓ8h}'3| |T?2,  >b2 qdK̘1㘑wR,`FzeWcZ92 StX<'URih*/^&Z7t<](Rey|橓rrqfi2B+ͲjWzr<_[̉ N-R&䠮2&3>oZc5k8V=Irez͉CH ?gg>z̋%K0Ca \8hϋ̐pTO$]w9ҜߪgNV/^sŠhIm.jeOk{e(gӄyV͌8ߘކ,UKzp y|&k^s(ܼDQyn ɛç3Dݧٳl?)buVdhF2B7ɏc{#@]{sGսMnܽ2YM]g Lu 3.2Խ!@=dY|$p/.hGhνB?D֋ƹgƳzt ECBR$%t˙A>^3uրG;sB~ԪQG-GGG,=:k xY62"~H:޽YF|Ph^]g&IY)H#;|އ`)Äyv +!yU HJw^a^=Kb3Iצ)8t?k([~ -$н.sA02eUEP*F~` FAߕa?|Ԡty~(?k25 K]kRFR\YebrrbY@ ?k5 ,#0_&wLg ?kȢg, <ث3K2iC{~(` ?kdF £0_i5~<~(RpRAI[hY @UX,PU +wYiD?PfuaxY]? s+5 O?kDU MX* 5 ^~@ӂ\`/XQF}~:0Q`И~֠5uz!UF ӋX5hU^*pT80 sX{tajNL?k0yYhE 9 <'*ym8-l{K/uHr wмJMWiꂯm PyNџT潅/{+E ^ʳiҟ4/yFe܀_4P\ғVzCٿE"4BU(Fo,,Za KA?ͅڅmod[uaҨ# ^_x}^y^IAGѮ+F/WX+zݟEqbyefb񭉴X|o[t-x[J~,XSg_X*}Yi]]YEߣ¦X{W|һ/*ĞOVWzXm=|ҼUA}P3jd{ު_VW땮+iI.o*@$ty8&a_N*=lPM <\/וEϼ}CM4~Ѹ~47a,ڏhjgVX] ?}?R/jJ6~O߯W{?gC`O4H0cW4Ew; r[jAӡOm}l9¡5X>~[l,S$}''KJl-r>"g[jgixV5Sc;m+*})}JJRT-ј_~h,yJbui,yJd[u:o1BDZ>5D(ӥ^D@V}!ِxA fN+c5tm@ѡH#sC-Pl:n7TEa! 5tg.CG248  !VВT6mhˬ@4ѣaj$„24؊eNiAa)!y 5 lqBei4 #&Q QKf/e1PhfBdjHA 2y5H\1.{ q̅)3]C@ߗAbQyd-!2-6H?/%*h`I&g@І&ciV $aIBA˄ېIҝ̿+-iᆬ1270dXnൔQAɺ}ov,,Sy} 27ڐ 278Ad'B\ m9H[aoӡh )rX48^hpsѰr i0YQ|t9Y|r4c!7 Ν~r4Nc,!r*5rjp!&+wU]άӱ\] b9r5XDkH("[*܂};?lr5ili.8?8 R2|rt6>wswsX2wMshr6As(mPܾ o92n[,2i3r77d-30+G"n0} `ْ?s |o855L9L@r7XxD h80АPt Q"*4.CCFK:N`LS7C[10G"utDd8!c']cLt("tҢtsX:Eq eA=#W䙎&jMGRMo:r,i0(=^o@ChD4HJ(L-X¦?l\)$WFf-bUv,UCY(["tuEݫñ+2XVTN:6/:<"u$EM-F5W&u(â=2"u ul"uD։AÉ&_/*`'-_/Zɰ#("(vmD_xȍKލ]ç!dBNzS.;򴈐a]0/2gHTN>AdN&!'E"}t vkS;"vDm$"vQ!l|v@%It\GYwT^&Sw< 'E^{k\;f؋<boaf#o/W;.mK;w& 0@6 6D(o]37x[i d8L["R1 ƭ `)fYpjE{E,XKFw`,e*&#d83+Ij`ӫ^)@3ec2h*LL_Fmnenk*1hJ:)jDn+۲ϞF,k^^ Z&W&U=zV=}SÂg oIN.<"ꭙgo]A^(R{ӑtCtt xk:AbɎ[;Š%NgFضZ0akw^o6SP8h.Vhj<"E3m{bбo^' ;"%9&#iKxbʔ5/06ZƇnpRzp憋#`8ݹy͈</EP0`zZ`z`zRN8Li3t w'yT3F[3M5e"vf(TQzG,9# T0c֊8bJs&[F$/0hIY"L%n;];Pbp*քr͓޳zs Fo0Rz'l $d^1A|u/#o'o0Sz'g&Ot/ēT \/K@LɤwJ uDOܞO靐'})[1w%o&4 n慕&/;aD_]N=}Tf]poBh*,'Ӎ-`£(^Mz'&ьOKp{'V[Q-`tf^pf/!JĚkVz>uCY&׋{/?sTGвL6U J,Uri}F/TX=WAyɩ"$Yv>@F`An \7|Oj|Do V Ct8Z2 F`E mW*:,>+ނ^z/8Ui麷`N,wk3?S`[9v/X֖<[Wyq}=ž`hp7./5U_K85ݸ?Nx@կ ,L^/IX(L&wएn X3px;ƪk e F p@ I@Fn-[%'h+!?*9#1?HcrdMGު>XdPsQo_zHd>z QQ;cd?z`I| ./-C#sU?TM+,@*犯 @#@Շ 4.-D,ul 犅˂+|V|޾ST}Db]gִw]~GtE>#^$+0@A@B/AUϗ'S],o)h H\|ZQ \~م71y;+SDP]/31вpz/\u>xx۽^b+91׵zR>T;1^ib9q^*BknގjN u?'Jyb`ty8N\o^/+'O=0wjoǻ|@ㅛSX>޵zx|<!Z_y,xP}~?@]J{ã},ޅO|)OOP~j>k~!O5 Ca`K|z*Zo,%cakz. $z/ ė<(W ;QeUeYe ]e K |ءVc铍4GKw77}1QiP }CGԡ7F~rV&qmrerz|mLspL簏 txx@g%zwUwrxLm,u+_eٲ P-qZaxg/oa:fڽeٙY#&k&K[ޏv/mi?a*Sze)&z8_.m~2pFq ۭ vIűOnwʳog⪶+e2FA9YXy].⑃&+ ˪˹êrC2r*1\N,.T}tW5oe|aeX\N \l[z᏾sL.]F:>X\?0[0CRi r)yXzapYjreA\NL{hXrιܯLZ.lF\,z.nFܾp.p],.rF"1]L3}*?, =nyO\z<}^ՋZvgs9YKn}a?픀%#@F"1 2v*BZD<-Nܤ7B Er v etގs'2"WXw)"fh:2(͢|dyE"%XP97KjR`*{wM)K! 0ۮ[w'ϔA:&o;-0|I;%z>hp;IE*0,T.8ehD!1HJHQ "8D*E*PEb䅈UjEFMZaSX`^1ѽ C ߢ12BDQ7͌A+"XzDQ+0VƲ"1״q-\ERNceQ?YҌG"fܿcl C!D#d(H[J0 #Xy>2BH&[m@>TT\2S5 ȜwYwAheZ-oiDԂ <2ȫ'V3E|PDai,J-D Xvݻ&ne20PDߊ%p^{\N!"WDWD\#rG h.WFܔ<[Kt늴Z"cd(!"w]Eg(╕z\"W^*Jz+BDz8_!D(#:}]Sd.*~1_D +Z$ 5L!+w)+ 0*"UB*+0bsQBE*!5TXPa S@DRDE)hf10-@һʞxTx{!{yi1[WȒTҺ]fA+KT/0qa@:-ІқYYh0tT!< aRT;t jHŽl9 JjPl<^yko;܉y+ ^PS(I%f| j@wݛ!\ bG5l cG5{XsA*L[q=~׃ݘRpg׽mD{7P'dעQ5պQ^ME} ,)0T6؂L/ʼzaQaV WXzNlUBV$V$ׂ(Y!Z0W3BYVhgER~V,ZQ(AA]u}V۶-z\ eT+`$KQڊfVTmERD箭- k{k0{7/w{E{@qpcU#W *S)R sq*nVufkeUmYTm:7_>~#Qא~}~#^bT֎o?Jz{W* g53W&l?z3~kopV0׭~LZpu/黩`"qKR}wjT;-cjwCbO͐+ /, ;(̸>_o:]Bmܫsihǒ]K??WoϾ}O8EZ r5߂,Y I Ь_W-ٿ>1}gKmN8N ZguGzS&O\wD;]_ o+AUo>* m puo~o?[RDi endstream endobj 77 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 80 0 obj << /Length 2045 /Filter /FlateDecode >> stream xX[~ 6{%ps GE=H%;- AmvfgvqW)=L0 31Ky6xdR<)W̓f2K|sꏧïHSnwD߿.#!2,D,hue"񲲮쫦h9x}ikþƫ޶\$w %۱Bkkĩ2 P0]Ha]$GwvoxLҕOm֮{?\N{' XK?H 'eRAw,-C\0!&܅Ӻ`S03cxqss?<8ز Cϖgdn]HUZ10/ld&tq3T_1k=o9υ0-$Lxi0$GnhEG:V][e U7N &$m㤍OtbKk'9gm?ip{E=oq9c`{/$c!l^34IqU>996QϨ9DX0'}^ѧV`!>bXl 9;X.Llm'˵]諾wus޳fz~ 4!иeU<'"FJG3E:3F1 FvqRQ`,i-e +-| |˥J0CݹBM7Q=}8ZUZ@˝[X#:ji-H]\aרYJҡLҖ:{w ["04B8P6%[ḯ-h<<̢Xt4i/h$j Ȕ  O}x,c`JL||WA:L sTϜ<LKb=T:zqD77ԊrvB2:_l$@+dp_A XVm/_\ !'. N% `˧lVa?B=$,u3W5Iz kB,( Yaԫ.bo}/EcRwU*5n4udmnmBB_ImxyU*] %ˉƩbc?P<>K®.0?%3H6<ٺ@Pu:|ռ&3 3̙~1VnPkFx}aXf,SmOrdWvLpؓ'QА x-[jxA=7O@+v#=:!1Lsrń b#i7VMQJ29 GGimQ>6Pܻuta@ WR 5PSeh*&سmbspy @lm0(a!ѷH<#O>ph(-P*WalT[⣛jvyxƤJn؜% <AFf>(eUJ'F|z6`q>hx<]e%)y;!+)JY= 'q4yCF233TQ.`J{~j/O_wE r9'EoW` ܶZ> stream xXK6WE\>l4MM) L,ɕl;!mهȡbk8$3o\peQp'#UY3̗QXc~1/cOHauOF;^'<A*(ʘTiPT&L'Ij玔Mߛ_f l6fLN8h''9㠳5EJ}Y3a^/Mw0U2|ܯ>˦ОW*^&P: 4PY"+8s6 Fat=Q)L=:$,jj4iZrPxnr_K7+)kq7 󉫨viMhk-O6mA8OT:fZ 2L՞7 ׇ",i[63 JŤxnK maߚ)hǦo5y ps~GLgpxIywgxDmeeO"2k*zw_K*7 fW7k,v.ш@u~4fXN0eJQBT5>qtKN7%9!%~m9ͮVl?VK}T;!ʆTǀsϧ:L/$ƮbDy :@KAmTUWUeepmיMi9IfG]\q}a7[647RE<oծB(eCjy}-㘉4%ꬎPF4uQ9@yJyVIWNgÿ7\{^AG"$ }kHX /i=% jUmY,Yvzı=z!saOqj© yԳw+6M8^mXौCz}[:aGcï vұ-ۼ2?;;[-0p1y " 85Xx'aoICb7_OU|)g(u/ϗ㛗[ړRrHA_ r7eaq<{ɉJ<|Pcx6 Dl,d2a=, wXr1¢3lZw0FڵH.k%vScUF>Ҹx9T-y{(ӷ~#:LKo.Ϊ'wBqq1bJX=6ROVzU endstream endobj 85 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-10-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 93 0 R /BBox [0 0 540 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 94 0 R/F3 95 0 R>> /ExtGState << >>/ColorSpace << /sRGB 96 0 R >>>> /Length 1769 /Filter /FlateDecode >> stream xKo6+La uA[""M6v=Whgf</<0"y(s/޼4|2-~>DŽl3>E[ )وw6jnrԼ[xb l͸:;Gr1(GZp`p 1(Fbn1X֢ڦ1حM_cPlP-m;^t,B뱭 dc]-|2DD}{39>͉ Xݼ(۶ y[,@Zo;jձWSGpOթk8kh_Yfox@rS)1I<=Cs5YМxʒ*|lN<#e~:*dm&/>K}g?Te` endstream endobj 98 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 102 0 obj << /Length 1170 /Filter /FlateDecode >> stream xڽWYoH ~9t7 hS] - YtUe9dKc'0 (H~311n;l׃ C|f1#;D!6kp`(ĸ3)˒?gWXtQe~ 9qeӁ._+0wK\6ac.R?(/!k4Px*  X ~,#6 W3S|փذ-+bZ=fъezYYu*QhYNTII8|L#LE/@^| m*͸Z=*{We\ `Xu("\UZa\$WUĽZ+6A;fgu?s4Z(]O87t%?pCsZ' @ f5i( $\ud0LmdհZO˝5gEgG lL14ҢsK؎(9]T_g:b6%:L})+nXd=h>Y|SGvI88ʪ=Nf :fBo{Vg6Q wND[m(Si]~ۀ`LLƎme1+doe5(V(ܥJxvÏxtժ,Etzx;g8`s;)?y0ldݝGi)ˠ\߁C3qaRl[#bkdFO~L|j/:ww3:'شF? @O NҘ endstream endobj 99 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/Topology-Vignette_files/figure-latex/unnamed-chunk-13-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 106 0 R /BBox [0 0 540 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 107 0 R/F3 108 0 R>> /ExtGState << >>/ColorSpace << /sRGB 109 0 R >>>> /Length 1169 /Filter /FlateDecode >> stream xn7E\Ƌ{i 6K@A-64R"9O/}k1!ΐ*Ǚ7ƙ/>#9k\tR`,Sbsyb~5˫ǫp9,qRY6n'閈{u3EFL8”(k=iԵD(fT<Γ2OzR)FKFdB %oTq%D!"6RI`x1a82Y/'׊,Ս͕ T0 \ y׻D9U,%*'O3SYiTa> m߂W(,.dag "7DY)BdaBmODJV㍲;lIֱlOޏףw)Lߍ5k ".fPo(*;M93 ϶ddxɠw%.=ƒҠ>.mfjmfm6@*?}T!z@j=Uzpt<xTPm:Uu(:sTP*@5*8opnTjP @\Gj5תVp:DR άؙm{dsSj $Nj$ f}mzOojf nd!ɮy3| sex;xMg Z"'A6[IgUwmV۽컩Ջl8YvRcs^\̧CL|j| zZ}Orմ\OkoFTgoN1Ů}%m{UxuY^ޮ^G>t*7;kO91'3ܳgSN=={zEi7f_&ks,vcs@żpmxµ^^M\ƇT!Ԓ]>jmK9+IBS"Y-iBRdZՠ抷C[6ZCw 'Լ}jceɝQY^yy~8ߜś su?Oz{bY endstream endobj 111 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 806 /Length 2495 /Filter /FlateDecode >> stream xZnH}Wc4~Y H b;q#^]9MQm<ج:U)`i 0T1 ̺B3)YБIłLZ,ddD3 eiiPb W$0c8 ֚X`if0M1W(*+JI/A` a ʨ(LWE )Rzza0p(94b$=\0\q~\W(=@!_z/b2D@h0j0oB'\ˌtp*B"D@G1YBW 9R% ЄĚnIEi хy+h)p.h"g<^IXH Ac!q2W²>5mQZ[ZXA:&\'XY|=+X9oX]hd[V/?({SMuUiX׋ N`QWf9WȒΪg'vAH. _b S:=],@v҄6QO4$zY Hl~6[ZϚ^ec<웬E\cZx <`X#bO- 0p, fHVҚD*ǭ1C?BrET)V*;lyt+ܣjimCi51ra3 Z"Re/UQo=(p|~yXzZ'aD qJ)=8zN^-TL^!]ۦ}ϷmO{XۦPn۴RSo(#_ڷꋖ_1IɽCQp *Z/l6le]^k_P8 (J@[3|-{n>&+f}Y$I^5'\ N&,ʿWԧժNP?lRŤWt9tFx>W߽mgu^OOI|E4[]cxXvg>ԀℝЖ׳;+iF rjV^-겚lu9-'Sͧuy]M͢|!!dȖXV%G%.'Xy1?nWrs=6벹j"}jRRPnXxG11lt&m;*WJޕT5:Mm>[~i;!q@bng+~V9&&=#>D㾰==a˹oNvǮ@5_M5n~uݘ)<ꖇFT[ƶ*31zcR:jLaLL;֫_w )aۇ?[ǣ3#ʻ߽ w}+u2᫩WVwϚj{U.oT oȕbZGisrThne8̍Ç]͂}HJwڥN7}V0)N ,h-& f˭ ޻zZjӫ]x>kwhקl-.Ip%rCюKzKEmHpmlP $ dR6$oJd-gmV3"q}C;~ocMQeк,. @qv|Ğ,@QNQ#=f a|jYG|DI?/׉""=T :SYMLih+M/{JAJ)I tnS߱?(Eh9`BU⦚날kToIN\nRN\V{.f%`U7}9ڶ@+$1>۰t`m(P:K0{zi+(HvHTiQ)>HжEE$4lp3-ODTvБJIr4Vjf'D%yT-Z!-8 HLO{M,r#̉ڷ;olLITvKZ98(CBcɺ5k9N 7i;v4r>M/lu+t== >!jD}; Hі Z*z'"CI>eG]_66,e endstream endobj 140 0 obj << /Length1 2006 /Length2 23937 /Length3 0 /Length 25101 /Filter /FlateDecode >> stream xڴeT6wwwwwNpwSkqw"Ž/V9g3޿H\S5\N2F(>*1;%@ ,̼yU{ 39Bhj7q\JfVff t~WL @Wu/G /`j,A@w1G/gkK+?1D-51up Ew50ZY,@m@JUICY=qSSא(K) 5?@;KzOw? ":,L`]nj`W#/+%_ԭ]ζ3Wa@tOKf@ JR;]Mbmp+_{k+d2{7t5qus%{ͩ&9;ɡ/|Lq::8{1Tۂ<@>+[# (#",f 4bI#f#~/#gm| n@?*!p̭\߇} ]d[_k?_};@ &EagO.I7;;E{ LLR?]$=֮fVWoЋ,Kgٽc0s}lA@na `V֠qHd`n rpLMg>@Ͽrp}w8,4$G70g7z)qTLjA&#w? n{#ff? ?w$OwvYyy8p|O^ =_;kG3g^VsuvjYa`lY39I-* ``p2s3fc/_忎s&@Oڲ_MzKXDl4yl"Zl'x.)P(-0A^?5TMe՞R=sk"gO"!2ɨXMJs"[S>ՑA И8ye~CN#կȇ(^dit\E"Xw}{Č1Y]0.ÞqAӥK/P7jY>6#$W!ixceBV'9"3E Oe?ح7ZÈhY-}6"T?6% 90TYE[\_Q@}#̾t[d(T!S c-ŜZDz`cG YGVvOɣTq:#}s6aт^xX L+[W Ł*HMC( _\Fe۹?h%[l`='~1V9ؔ^ɵ6rՉ= K]0ۘ)!S.s5܆ADF{+=:ep4(gӥ /q|wBhޔ#ݼ. krlbcӯʠ~|v7gS aV/ [g)wa;JnU?|gةG:콗9̃Ssҟ"}l#_#M^-U2)[, ]^Uv|I]M\kOL9R,kjF<Vf,X>8(v}{'6)!T_7=^,fTkFgs'}"t0ii45I)9Ɏ)>u1|;@to9 n(,dp(61!pZKڪ 0LP9b ?zf543f}|)NmaCrrN?I#Mo 5na oԶ7u9ƫďVGvGhjPԋ]\㋭H$,]hkެ|x!D,R{B*5ÎA 1M@a~]ү1/S}iHV 7IKϋ'geA(d[V@=}"jJ){9D%;.8Gv>vܛ'@F[G+GM$ƬdQp:ZP"bE;`,es2!N?/'A߇ S3)B/ !ؕ~X2y*si-V0jOŽ:ǭtqYcK/a4{¦{IS,%UPi;O^_Qn$ Oֆ b- [ʬW\{ 6}xs8Ҥ=NI)X[o &:D~u1y6~D\'I册Q]5۾z|qh zi֑%o"L{&E`-:q (řq1*g1yx>(A-H&n쩳6nYk=lVEc*Z؅9LFď$,pΫW>.?&[W)bAlՂ~ ms4;5{ dl5,B?b };Iu̠նX]?sR[v$u5Bk۪p:vvv6xCmQ=4@j^􈡆̤DhٳM5:.6_$QW q~fWpӆDٹqZ[??э:[V{ |*msKG+qYʃ}Hz1SF1MNSTG4dUpJR?oMb6<ȑhTs{6e}&=IE#O~ԟ9He"~w;,:I/ZsMQkͣ,e *sGqݳVc~ lɤ? 3%կ4X@f&2ha ~*6K%O] [8͚9MSnhdLv b DNS,npjQu"z4ujk@큋A{̱rƥ:59Z7R "8R#Dу֬ G!⼾'?[:T,:8wK%<8` JJËPk ֐%r?J~!P @vj"f5V} L'K2Èu.gHb#hֵ( hZv h(C%:#9a]`"*T;wi*{&1R+Ʃ= bTZm +F朇t_ps?|e Fʐ%b$p&5r=#rfr@S|3=Þ[xp720I*e_Bf~pqPA$ 5 k*yt>:#Jg^[nx̵zY'R0`EF z Wq:xU09~\|٭`h{+rٹwK4 {h2#׸;H^PEu F}6 @#6q }$FM* if.jW|iAZ6EpDnQ8e'ǦxЉ.Wq"`TYH"\}cQPlD<' (YuKq9'R<4t?I ^؍*_ȨKr nQ/()I=^ا >aJ'Źqe<c!f 'i: E~*bLtb{j$ޭk8W4=/3A @'[x]R=iMk)Q_z"u} J-AAX!a!)H};: LC= RqT5 nI j+ȨR |눚}^=c0l+a(Nۧ4F˻Yo0f!i3;&,WvVIEU'`бiՐfjQ-4#{~ 1,X.-eILƨ.qq;l_$#%JqJqRhM7BFb]/LdxWЂw UayD{^ޫSH l19&?vMGhJP?Y{=Za>yG3d^Cxg} ,{N,˰N\?}KG\e-/ w"Ӈ>l3Mk؊#ܩx d6K <.j'[?ɿZ >Waf7m_YwtOkJ8GyD?AɃ˜ujL.N$$lgM>uˏ"U4&: <]¡CK4,Ē{0DwDzL瘼z+|;yH[/$0x`˅ZM f%sv`DMk;F&e븓_4hsȯ q ?XUE>|b}fY}p,4}+LݼW/pg9ȗzM).M$g9MERq _hZW?ZC`,¡,AܬS J[2MU~\Ue;cZշJ<T t, ;Zsٹ~.ʪaQLRX`oǒ)ůPK2 BUD+_ +0~n >lsQgAM9_qdGTÇAMbc)˝!AzL$~u8BsFSÔ8 /uLRBUs+C!:\+ ̟&sJLm^fS-GΫEg!!="[/J|ԡXbN'fag%K^fZ1)_tM 8Vt#~xERO!mİÇ+Hȉ5Nه-#nݙ(4l1"i"jπͣz<<ȩReh *VdBX>#!OЏ.6@(u£T!/zw/ m5wpHJAiJeҀ,Q鲘i3 T"&ǥ/c\yG"Zl\$\.Er@SnKl-_8[xXJF4c7Teڠel>oexBd?G#7cb X%oli/ !]%odɓ 6{oόEٰ'0Yzg2Lnj7U^""6x i',n.GĦ`Q}bhq%bXFi| N:tƖvDkR!9hszmjB 3m5ASga(lZ>ݳ륻,2aO`{F+;18fA0ҟ.R }Rq6ݹ"8@#lwg}ػeacbf#0_Q} G3}lgZm5TL]Qc6R;i?t,/}nj%!2%j{A/qG}]]]U!5 z=:"$p1g?/|0:Tpbuthzw >v q NJdL  !ODM& HCzSK_aBVj)F-pTM?j;"D([^+Fޤ?9ZK  > asy>KMl@R5:el4GpքSmDyR{Z)^dݲo,kհhSu75QBy9NG8?=a[q.! QLL I+1䥇){>4{0Qo=r8bmg :r^kHV"N.:Vf#Xo$؋ jRE.İ OzIxDzkb~*:rp{6 ƥ*oV o#0o!;pԂ<qf*}>}07n,oLKOoQip,.ݙn(a!`aZ ە-cDV8 |wef1&c _R0f2BXS 8xPF#:u.Q70a#dШtb=-z3q([ GTs~%f1I6[?沧UP^u2jFM IBMXǑNTRh"`a`cf/cXgS h=y$X-$崬jN[jnO*aM>spN ;c2 YT C@*h X;~7(R(\8a@ofA1u+Y tɋ1K }!:vs,E ;/ula5Q3böoW32nņM1bȬFY鎕w^/hс&cМU{|"+-c%5 Ųnp/&'@u~y|2,}l_4CX02ʃ*FyK@ Y"a$uJw8Njxr@!.4f WzY۾ Z5 ʌb ˊ@˚rfM T+X }SìN.PV$r򊄩F5 ʘhwe&*ťꄪiёA  i/8"⮿C뱌c~a :#vɿ %zz*\ LJ 8DƉ46ɦWl. CPt-?wD `|6Ѐ1kƓ* Ϙ G InQ=}'D|&Eft O#wo2K|̼ 4@w/d,^ WQ^2&,\×.>$9^˱HYqVvbbQGY+vU݌U]"d347&w{w2[Lr7D4IڡlƌZ!^-\P\JJ[Wg\-U$(>zZ;hAgjDR6Nc5٥y+D]CyS&zʃ&3 h5/Dу4z$pąf1 V>J<Й/J]:75+"wCY ;M,53o]ˠ&ןX9fͷwF㓞9UAH$21q}[euLG,\6VBz[06yʔ(QO>KBy q_h. 4 ]{,bQnjI޹nkUMkbfLșjbwӘ( CCهg!.Whh[?A5P:ܵ i^L@'pͭ ntֵ@sǯ<<3:pnsNDë}(zTYf3y{Q/`,1RV{ N`4_.C{ʢ=R@*O/ (;QU-w}8,^:i"^]TM$:  ތ{$gnœ]_+W^qg(?㮋ŁȉVfd3FVN1{<ǂgR@ceKt\L6AUNQ4+JAtK-p(S496BdOR91+u[9PwmG%~$>_:1<ًD=+ȱj(fm${msH  )ydqG7z>j4@͇exDf|[TE:0j"OߚVX^`{]A>fO$u}GC=7Kh>EeLErVw|W- %QIM7JOUQI؉ff?Tߜۮzȹ|ʺX^'AOxpKfXz} aUԭIБ*1}]ˮpo𨺼kāGɮ;1琘ZwsBIuAV$FH47U:ssjjoV৴"3v89' AO!.q]m%a%b7uKkoK4]cIeuw$R؟0oYvH[o1gt~UjjvIjuMb#[Ds"B~ WUn)TIFf}tp|6<MިMhxdy_?ϿR(E5po#F3zbQFQ|Kڈ`&-ՙDa|V9+X鴅|3QW20c!^n_%dRJw}`WZ v6BũSC%;|T&/p t>̵b[~:%~3  D.*tq5Y˺!SHH0ORgv]!Wu SZ5) 0NHe.ЉCs'IjNU\YCD2OXf7d$KG1=G%ҐY|x@σRw +AVG~g$gŠR 8*|ɜ) M8|7+y(W$M.C!cꬁ( 7^. >'J+GVNm*edUD~@R8wZ 9T92 zt%>dm'Ϙ`hZ`L-V% ;5#wZgIˣ'.B1"wbO ;cwkN6鲍R$NR*Cic;b/1UOP m Z,pNq!mZZ:s8Zۍ1YZ~\iQ+aw]Kg֨Jԡ(ۀŔ5NLY*U%/HlrjQA g=MS)|vρٹgɜPi!iuIF4.2:u`qXY?Ĝ_u0x"3*3| $RgҙEQ*glҾb(Zݞ\hG^ƺ@ű;WP#NmT sZi 0ee]q6(v`Jta ?=8"q?j\l:1Uҭp ,#%R*MME> o)Br9]mW>%< zWһXc J2r㨆?otxo 6],9E~5 GKl6WxW=nM$FE-]ɫ2gA R$nE%6Qy S\Oa[-W:fNm RdL[L>A7f17d#!bkgM"3]qS;[GCt1A䣠eӆfT̯}r& V bg1?nsז~saѴJ&#.{uѪ?VѾ '07$Eq(v9˖\|+U-$K)$MOUk #` $h$ņ~31^:)U< kA}#ρl>tH*=7 =(m¾0"AU}ց:Ic\Ml S^,i=سD=s[*IHa rc oËC;<, VμvɈ ̤}X%)̶d>*yxV:DipnlPBtm{q!*\c׵q.U005, ZQ :0foiXL[$q!Gu]!23 .]$Fn54)Cٖj1&(4n&\ 8OqBgC"&e?x6.0`plP.C\ӣܳ(4ɪ^exœ=3WP78$My+RJ_¢ޓ/.z<7>[ Rӟ?bx?215akƌP*}%}`ϸ!  4. qۇKxOXmL0&NPdv.=7!Qcvﰬ-UY/, GO%46'\oj^E n'}~pVSVl;c';/b%:TͰ Ouq%[==bg@G?g$վLBozfyvӼ}ڙd;xWgm:Goqc1)u ^LmOp["MuZ(pC%OaXyVT~W987mu( ljC*n8\j/3zܮK vn l)F:qlqQ\^^s;I'>3UgG'( /J&،|e6hrS2 ʷ^%OC6Vy+[ *Aɕ}* qnf&V=?>rfqN/bq8:$BưTx5'6kKl xQAa%G X}^8(Ͳs@'?ՅWN3V<\Y1vRY"OXMu"COȉOS3*F#=Rw&?/1b$N yRxRk,C,E%0tߝ(Q^TeaP~ }؈qO(~ăA)iXdb_ɱ )wHh}X)2<+T6d !Yd8%f%| .2 vk;^oGy]8bnk0{NmB <0 ١$Ui[41%b,6tCn̷QZ\( } d c@dZScǕb͸lʭS=\G{W.BY ~$- 1T%VSծ0חa'Lӌq=j35|NM9N*畹EdH `a>U d"vwy=q#^tkſL($*JrG4WA>Ib3mb)E^&9%~TjC*g4X T6:[hݪh[A3}41J޿9D.=<Qq_T3'h,Cˌgm(I[$*TŠH[r~siTD!c3]:\=id KjJ/--"7|^b IZ/ڌx=(bDJ9}T+1{:FxLzӯDQz@5sׄ<̏賢f߹R ͒KSڳtO=`rp̬> Aj;λ=Kd%N[L#ŋ9>Pu7x1.h"$ISա} J9ۡz]uV0)cK <0 q5iy9SXyZ2kweQj,T$"yTdL k E}>*wCԕ":}9N`c {zuɠbxn![$u] ˫ýV)Z K"Loof?,%HDW)Х ȝXqe*kr;p &N0dAiPhĚR7ƋL#"uq0xCw5,7ߘ_i]zU&q4kN^tI$e-7:5|Z;/+x= vWrl˭0Vaqpߺ3';lh)^ΞdyFA6T''<d,WDq)/Q^!|\U?܇5r_2 *uY$k+%QNu7(?eiMF%B6ƏA7dmooRQ},;0X;Anz2-e* #e`8"7_XTA\ }q /UY.:}0ZWӱ ,3,Ʌp58G)8}Oqt^[Cr.yLbMy05ߘ <=z*@@EUT+A s78ʔN)k!fLzy{8P V={Zr>#?+˭\Rrõ}&J^-dħv/ CҒL2ӑU%'|@٥Xᅯ@U5ȒJ]2SãY~كhگP,<-dYOgF.#O|bfΐ37KFw.va-jqفw:`~=CJ#.cxU_cQˣF5 [*7AIdl_XhlG 3"$>e";D& qE+nzL0=csp < >MTEhoJ5.2Ϻ #zAH@ˣk:==7㮯Zar {8Ou@eo{CϞi &;iۅoMYelA\_{T~I*KpdX(r Kz~{/[x ő :Us]ǚ,!*;(YĊۭHdB_[*Յ8L3w |ƨ 㷂 y#FJs|']bސ4i-X(c'OFu߬ Ӡ 䜑m90)9UQ];>/t0Lnb~1ꐪ$;g>lɊF'h:+Lcbs/qÎj#;}5D=YNT. ށRC32XAddƌLRm2AY,JϛjcN/^nzI¼pND ">~셅d(a ;_p[ᛘOyb^vrǿC=tnGRTOX{A=t\OA ~F풨} -o/->DU+} ~d.?H]Mn27Y"moVXoNv>UYmjkјY:D1xؚ_cT03 ƹc%X;{(>oL=Nl)IlNog'TC0JRw221LE1#t̩V뼇}8F>l!K9&71>ll {g9ӣ0L\)/NigȿkYu'zʆ#}"lmD=@N)فfa=_R]iIG hl<*8=uW,SaْUg_Njw"@Mt%ߩEcO խnԮ۞Mӈy0_ds0Qw5]kY80oDdf""n^SuG"%hdDܙzN0DI&JT—H YBoy1GscLE3Y,&l 4rWK_xDB]%In95%yLn&VWO xsY_-0¾S(netm+/mU:@ Og]'PK Cn1+݃Iٵ߻ me3%\?om:j{.C}pH:Ce:2rM|4OyI V&FU :R#;'- Xa1*mI3g+ MŠ'3c9Tkj N+W᧶^["gl{3қJ:۹wۘX\Y@>?fǝ"@G{ rlǶ,U^56nE]2Ke9/}PBF炎[`=~h(XpUZF"[ a04N It` tASfjk.(ycHdNo40gt}o(YZ^f,SzizFٞoe;^#{)F\Վ,Y`enB?A:D(8/i:`_F 5{_Y˦֛s;l5l? !A Ȑ@)ܛ#+N`^*LmDpᙓmibV">LQi~?u4*h`w 1Θ 'ӷVR9!`0Sv  IbJ>tO!tϷʋ`VorH;4Iu]gbAhd͎z[^:C[\Lim Ң4Ӝ7MJ0 1}1dˢu2?}׉okIwiHTaW?N O?JњV #Gp" )7R7Aq? Ԍ˲¨oӓenh==e)-\R+ß8Vdz('6~Ҕ'̄R/ʹyYsZ 8&5|sDo.k踲B1?\')?*.󢹬k'R* o` eJ/;j} ]?ܟݸξ& G( x[ =ke 62=sdnFy}'d}FӜ4kZ厅|>Iszׅx1_3t^wfu[ՇgaDC46H,M%$z|^wzl݄~4#?Y, DgB%TV~d G2 tĥa4!;CU'<_=2[`7m*/q7t!Ee?y{^Dl'&w_ %(4964hĪ~g;Zk$&nX/ }swCM9PG{p&}n1=_\I+\{BHL\nݎdmc<^ =KHcHY5L۠p>zԗ^"5Ven+ (.ɤ*R »P$teW+mqYkM20YTeG17B `mjk耊8c2%[K?@ȩI jӹCuO|LxwaτfUn1JR U0@{5ԥ8F C_as,xc/ ʃأ)9%!}+x wG,?ԧ9129 :+qAJ-Gnս_6U4$+}1k+̉!SuZ.:weP(yMVHXT5\u (J3<K\&=WsCbeQsk_kބl3ȴHK2w I h뢩]XIco`?J*a E,۶ͧ],~ь&R\$9sq2\GZukZcƍ=pC HRlz'ź W_ny3H>YƝ̑7'ҋ0ĪyX8K̞T8e 4ᄀhY5] 1y6@n,A*}fx{,V^%6r瀡!L3'2D"p:s?^o i-;FVg=m1.HM}u^T1 C <q*B+E/1(,*1b-`ھ@p[ȮXmT LQ.[A`.jfޚ⧸7?vT%mtކӴ[M0 t^݄!RAQF)5sݮ$)KۤJp#HSiΚicMȯ%xW0& #wgK<1ƖAniowHgj hW_K j ML +M0]:<[LI\iݹ$dL *cȁ/_0D1i$q>qԗjfT#QZ2&nPgeoPbglb{i/*L"J\E6*{jtrۂ}GYI N.8`/KO(soQ*ְo EBI3E[~#/ez`a~SZ2n4vxMnh?#ny e22!]jqNu(P M| H$c%u7ZhkvOz_\Dޙ WāEd}/ 7@/$&cU]p[BFN8K-P*B#CΤH+L=q]p譔uv+L:{[{l2(1E0R'$# /u^Ո-ICד(+ܧ"JiQVNA!4@PBTAv1Tbt Oic$XƓ޻ۚ!+h"} *vSQ8kdIlH~sݮ7(Jgח]c}wInHL8GwIv?klWʮ :\N#?#/ endstream endobj 142 0 obj << /Length1 1962 /Length2 22702 /Length3 0 /Length 23890 /Filter /FlateDecode >> stream xڴ{eP--^ Z Phw/Zݥca GX2@I(b6J]YX `;{V6FQ9R hۋ.V%37G' /%@ htzSL= @uO +/ vva45q~S-A@71O vF?x2dMl6 9@I v4`{)jj)U% e5Zj`rSSאb(K ) 5??Ձo-o?y +H(K2y+ Q1ڛ+>ffwww&KWg&%_ԭ@w h 0ot#Af@{g'I?vo|sz[!\Ĵ94V&++L@.@{{7CWg_o9?bNNr(K4. ~{2}[o_혉jߏmw98#"`ag d "2jogϨ~=_≈xX!7ٽvFS>q[\N36`w{Z-TՁY ?2K t=̬kRYJvX:}Aog7 w#Vn9m2`?oLgiZRڷ 5ź̊`acKVH_+;U, +\̬Qe\Lކ^֑Dm`ߎ0rsml.T߷a `WqH lqrLL<Xf6@dvys8,N `#0%t F<,f 6;Y߈߈o |s0[  m%|K|c7o- o\y E w7?} 8mZ (8@"m,ۗksm?? lM& ŀ2Ch.nH8<5ϼ|gtBqA,PHsb#v]. mgB0)c-me{?'E[7Yt''!#H0Ӎ|cyEq'wN!YZHxSЮ_g|;͌LAF Kxb0,vgi)ZA٘<~->GWR|fu8PX z}~n8"sj#@(acO-_IykZjHVa owlQYC'(bDĩ;3?lhC}RLud"Ȑ+OkBys}KʢZm2%6z*;|3ob"g|Vz  ,86<#E^]!)E'WP ms#Sozvq&UZ`¯}]tFaQu||f4y# Jb>W1%ήݶ}0PEQ5橃Su@7  C>'eGP<&#Şga9L^I|wrb6XXun Xvk.N{FU)TǢ6lJ7WM᭫87˻W+<)b(PQ_̀e 7A=]-1#döf{:GhB,9ֿJr1Jŷ0% Ĝ|glpHqxdJwkyo]m~JQgm#YZَJ܊jt$ջ4#KؑJݯ`XVUiZ]. ^R~:*C2+&)K&@z  `w~\/sԓ h>{rcEq-S~;_w{Pc8">y_T BtJ4xLY(Ɩ},)v*dU,|v7dІpMSRI)ו`j2>V4zGex8`vaj(Ƥۘԕ7d2&yPu5mP'扇!_,/hiq~VRw^S'hbnO'qy!c0#!+ $\ C6QGᴚ2l-Ok$rL(#n`A`ܤ֏Ȝ aXu 6o9g'/(2/)#uZjJ't]70{cTYE4q̷-UZbm)mƒ Dz4!opЪj]<8B&gA ,Bӿ(Thm΢,aQy>4kl@8.Li2՗lLrbqi6*# |elj~|_3JB-sn}fJ5mx+0(kO#MȥUu}k'`r>NUg8~Zղ 5 mobDYfRt[t1QPFv"Yn@]>X(6b"dcB}˾3-='N|=t!;Topn w5"^yTs/gnc>* Mlx})c߃n.YPROӸ%z S|s9 a{Dze`i G=HxY@`ro"(ŊJ`蓉gRx"B׫uңǯ}GE z%-THn3S+VD&* Ѣ+fǓ۝O÷^D3LNMZHL'k -rR4tQ HSLm-lDWU5аFRNُBrBUQS~ŦEua~0(߮/^ǩC:k3VQ |zI^nԼ:킿8-ަfYloe%(Ԣ`9sMlp}6v*zG'wSV&t{?e0z\Jט7 5]䔂7Ȥ16:e"όZlAsZqSQ Kn-%-*o05.rYm͠8~ 9"i~O\鏲 6u.b(e(F0*Ah.|XpF\ !n:HJs-Ϯ#2:Bܬktg[z `4G HZx̷VQ)ov>[:!Fizb7lďN KYqZ"+9<3U}SNjrapH>&hY{pW &J"?[8#g`9|ǎ:;f)j4%ט FfO%1 9P :@[}jblH= ,}7Y.PcϋW$|k6Om!vfǖZ#J92c~ EU6wn T1/]؛I荐$mף&ΡKappZ4؎s_9Z>N䍦Ҵ⺋J*>g)yOڲ}\UG'nO[(Tݐߗ4qsR~57SvMU* <Ѧ%$U~΀|j_[aKzړ/vXr IˑX4Zѥ0,!IQfOWz;xpg:D;S*5ޘڌ?Wh|4)aTcI)7qךybn[Q'Թf.{ B de^8q+z\ZRtj~xm.XYLui=JV:. 5&-;v߆%%bZ`8]Ϥ#9[gD}т ϖFA#r,Lz*,eoFi4A7p.y.݆t>Mrgk3xt-NT}k!>D>#]W"T.#YvSB0ʑȽ^Am{vr yU Aj'JJܗn)nZF,}|"{U+~70WKY}.l١ ~R3El]-T}]:FΒ'fߟi2ʺ*A·{*)|0YPtub@US[7{ciX,!{N&@hV#0M4S*i!NRhتf^~hW(f og7/Jb}Qy=S&^0kӉGfs4U\[ԭgt?SL'һի1*qHn%QCr֖Aϰfzݞuۍ03xLRQf> ˶PNEbqRYV"-lezHu}*倫N`3L L!wHjmg -9V'aKõȏa~y\} D9̞`_TH,_p}Q{o*2%)L#"jV-vVsg-][Ը +}wGbq5ϤnC/W w翐Dņ9F_5xS-p0mL|S;| הtD&SzN9MAv'4øc.j.}0!%K̏ $ ~wZn.7`/5\猴SMNZ-VF!qOF 3<[!Fj-KվzO:3LrlҮKw d7x=UUn'"*^O]9ާdQ _$26&US1c0^lkizY*RI"y\/i|rd :O/A":^(ƘY?$VgAk"ֶ܌8V<΄Aȏ:dh4$D(a83tĒg}DwdWޏM#mc=MY'kFPCwԫ,K@!_-L,,*dǃ`CFZ<do~gH_%É)]wAm-g֘_[~R5%dR?+z-m1n:iś}f0_f"t<|Og&9;4Lg4oc;yOF:㵀fP`9~v\x1x;] unVngY}r&^g5{[Ҍj0%ʪeۗ_@WQCaP;>GClXi ~uX&2T~ey| G{6BӅKrN?&q~CRjVT͝s&˘P릩G~)e= sm}\. -j28Q*Tt JtugbwL#dq9i(Njk`u2mD7~_ciinw,V^_&DcaK r1: @1, 0,Lxg("u@DSvěF%G~O-G;cQgI]|:+xɇ,ohAЪd.}M !9%osIViIcKM%+zmFol5b. ﯮCۓ}T^ʷ*9rHk߿Oތ,/re4DȮbçϱT5̜4nSѿ7H1fJN@ATH\|jU+uV%KloT'zE;xL}e?A3Q:F~iRSn#KtF"xYYA1p唁CS wv_h[OKdEV&!wltsIVB`@ubs7X8.9׌(Ebe[5tny %xM ꒥7CG-В=qBoPӊiVQ^/s11$@ _녯D_3Hv6긤ҧW*C'D@&h; 2Ig]&Bȡ?Oi\Rz.ؠg1ZOZꧬa'MNڌCޭN)1T˻B/1H0{6kUb^",ԫVm{ѤToǮ!>θi ,${F샹E4WB8OT/`2M鈆Ld. >p}IV,p]^$VE{d]3x*M(4RU`UiPCg]XK!bѪ@Cc!O]il691?SzOIR?"Thd7L^Fv sG+5o6 XjyF8N##B(~OBPUKdSO)A<_V0e433, jrQ :%`JH=;ᬿS6ӴV>a 9n.Դ!m:.h=4,896^U6,bltMa` igUrvO'ʴ)V < HiGg"y`e&&C(&L~c0{{w׍u+E]` ؉T8\nkl>JuK%/S "Op2mw{|QTlqҲV̈́' vƬ1snlNe.GG̊)cbH Κ1F\7)G3R)õf8/k/U 9a? 6wSY-*a9͐քظ.HTϐ8q?l٪ ġ ο+|*R0`2f.$|2F!JcE* Ѱk~{{/ &-rSr!,Z Qُ,1.[z0-yՇt0p"Cՙ(e蘸Lձ:[= V1EFUK+1rGQiIr%͇:>)ya>B#EP@%DR1}J9N }56CNhNsZ ƆCJMP1/\T%Fpo,qу-{؎4f^Ɵ$AO,"y5F>IPCY3Y\#5Ebeۯ4ѵ()Z8 x*'yvaj{boLpKYDO7vi^yvr{H\Ү4{zŦd:*7p~ )%q^"([JP<By`3;tv+.ZrW|])Dq p.r d7{%}{oDHV!ea,Nzؿ|\Ï#B/ Fh$ Ek}Kkɸ]#XrD?H/&U*>m\(py/zTP ?yމ~Et {"pcV/!{v̔hH\8im 魨 a%д숔8_6`ub^rCp S0Jڊ\eZc50@+(@A2 !=~E~dR5t:S=ԽgsLXjc7ޗ<,O_iFKss+R-=; @@A KtĩCD8̡}@TPL[o_Yav72(57N @Z0JƧ2DW%/ͥT1u)qmp\H<BĢwipQZi<>Qb༭Q f$R@Et3/J&`]ktʥHOeJ:?BT33\Q8YŇȻY.YolaINf1h@>rHWxp Ҷ&ԕ"_-M#)o+ Zn`%WB#dz#0d[>\xH ܘkoW$1KJaCC"Οn141./O-Rw`_% :.}1_ɳrF#d'Р?_Lf1t kjdnDPxvI$&yڅ㪥GqG:s[%i ~="vhec}UP@#5FX3THQM[fyoR=hk~up[Uu8:zSLbuX^|#.Wxr &5d'е%\b9]p D+@qB5DdSr$cGz_6Ԍ+B5= 3LcP'Ɍ" }9a]3LNi-e1E;aڿ,(ͺfs0NqӐ͆w{Kh!H=9 T֊¦wC9bY0ʤg=o|uub0xJ kmArhtq}Apo"؀VȏC? i$% +L]*_I{FЧX.a}7ss2HK4y v]$^=>4:ė죜C[ߕb`2FuӃ$VH'6I}.\>z*y;?EC2']9T4M;Sl5;jET IlH-{,M1 {ixWHt i7(Mk?C+-kahK)Hfܘ}b) 0kĈwq̈)(5/W6G&ع._/)-$j)'խD^2Č$4JH6OBXL70)~LF ^-N:l]FT=?ZiZ,nAdeS -椓02pǷ'7B0bp;džwKrK\O^+Ϡ4ӠWW>o7RI2N7$#p-E.z 3cɶ]3\HK+33t勰K\}΂N\^MƐ۬CX3.f RB]>Jf^gl偟&c֏f|R/WFP5xe=+lһ |An/<àYpЀk$2A*#}$c^ Nj”G6ar~{O/? ~UnD >^փ!!됈?$FRU QS}S<=u|Mz3.k-́0A+|499A#jccex@1`(YN4=.n+K2̀n&pCVAo0&`y&ZȡO?*jI5D3㽓-@ T{ 0.+b-=n\シ(ݼ" YS5Կ7̧׊ѩw=lqGnA;4ܧφ',YZ'x4ٛA;q,$ :(r!XM}f8FDzMJgx*hzEAN 5=U-Ih:5wNُug S_W._ݛ>>ގpB뭰E5Xveu^1Bz==n6y}9 YסJ>ގSV硌qygך!}J̋p^` *%j ܟA_e=-lF@+2͓,nX=QĶQ V?qB#?vUo:ɶ@wxY xLW;U]2sUSl3SK)GU8g@:w򽪳^נ k)7R]6U+]cLmmfZiq6V(*$TMRcrEO ?QkvYm"j1l-И`(RJ. $py"GsmDyM*kx҉R.|sֈ$|_{1h\$J9зMu#!Zbb&G;M_t%Çmytìtex&pr`)2\ɔm:GeUyy0zP'cVbSٻ,DhѶnVIҴV?N6/`>\鄂t2(eG QvRE~5qE3U0H YIz Qշפ[{9*cLMB]A~4wE)& (~{u ,BXrӹGVHlT[[bD ҁx`:,4rR0ejA<{5Ž#o$N#EA_e V"!'n ;h|"zzIC-?wo ro7s`-uTsoA%M?wgV\5gV79"=:,BfP J.'ѨY')x- "z9@O:kT@&APA`2'`(V>doC(Ֆh]Q8`wRצ(Y܋S'Oup-6,]>7W*/okK& 1'"6A.͡Wc=v#^>5/`̴)if.=a⮠=V)nq'ܮv$օv$"vI#{^MuNN+V%证H<$Zgx3Ҿc6RN^ *|k :+s -* {' i!jF&m%R Y:KIYMO"ySf18C)ޟ.kܥ9.xq5؏ȭÿW6M ֮g,eb6%et49CbLO) $$yO_L;zbat"\mQ>w ܣb:  ϡFF\kPoXL6bLYNu֬R E9A3f\ڠ|+QVAXKgV ͱ7aM^gեa\. Ţ0]V6.!ʒڪdk'r)(,}[E0nYVjcKkń\絳EYpL<;(KOCql hzv%Q/BiGb [~ѕ 7;e$˵>Q4W)*gZPV}LPըyd⌨g^y *P?.;:5*J>1j٥+߭ҲDC _b)(SC^]yVk|TW9oKj:6̞3>, zɤ^Wkt :j^G=@ւ(TG´e#w!l\Bٷû$Ez4XQ}8_]TbfH-]Ds^'J*/*>l000т$1PJgZstœ"4,ۛb|cYRp>u&)Q؍ޠM#U7&PH?n$h ߛ;6ilr]Ǎ&Z8|4ܯїNLd@ʰp܎Vs8Ac fa*|'+>TPnŃ}dz3~`͋4gmWs'@9FE`T=*Kߕie7OR%-.TFDuHǽ[yBB;vM5?&ao߷]GxJ'hĄx=Cꩄ٣+t_7 9gqYmZq%,zs2AXINVY>jV]D({paD u JEЉ nxR=-oHGPH$'rQa׭YHRdHu'+w^+}R3~;z5 Ij`u2u>3E8_I>$o-˻>Q[Tv%f޲>gx,#:riNDRΒͬ:rc]A*$%&2tE$V}]-DԬH Dv#*#A>셍c$촰H _i5ڻHOYWDɎ tFa^LdߪWP|gzϢZy4.8͊rH:PKXZEΩՋ&ˈTtˬxԳƞ1v:q=WT q zN=-s}g2_% #ր!& + `p݆Q8qq~p '_bn-@h 4j:VHSѻH$bklsg1R⻈b >ZbgtD֤F?>JӀCq/I= -ކ91֨>pO12  Z1ff[HݷsP?bg AXmTo<.>=8qpzUmGuE33:r$CuM)u!պQɌ^T5}(Vل)MM=eO|EwY׆ 0fkvgn{fr1W4_#[d zZDV*z$hTN}hlޕ .Nf^ }"Oć "5<3$_z&Z\ͼ6.AƠ*5_ )BHyXu#%z2(D7oUuìZ ?ER^oy;>/=ڃ, *~e|/j+>|r@ ׭PFX.mSQI $e VwcmgJ/38Kir 7+FMghN3*s'.zBՠ1<Ǥuq}srQGв Ȟ[싉'oT"Qjg,iēE]/7Y ЦԞbG%lT| =;; aIm<3 #ȧ]Du )["q}x+J\籾7/L ^a?ƱMny0h@" 7ڊ j^2ltHg<< `DϚVD84!JJf$8nMX HTEy 8mO@Oq10!H^=oc`|$sYRZSZ x>PTCCӪmpe l1iS tEGdwB%=>jѿt:js," N[DI \Г ߬:%pd{2|wmS Μ;? P]ؙqc1T悒BZgF Mc6_}K]Ey! v"jAqn.m:`{`t.|+7zܷK| dJ.}p&] }[+?LYɺ8LC4gvF>bPt:LΝ^u<}A[\kHߚHs'+ҝnFԟL-<RzyqaIȉ?F G}HKz4u:=} 鋝q\mzp+GY@|dhIqxjRv`(MX63-\5 }\}=̲)F{ :}F_oJ E3nžvt:>}oK.BQ:ȅI<) e3VϾN/\wr4&|q> a|'г1Y݈v}/z8sg%3(:mR\Im9r?퉸d61o!TdKUݢj?J&?H&<'^ {Fl;QϝEr,"gC7Y}D*6 : &^)1]e ‰jd̒xv oDnE8߁̶{lE %YjdT1ߢǣ⧌'LP'P2rO]H΄,߯6qݰ)h`/V 8),r­""L d$ Q'-8̦_| kݡ7J )X]$bܒIR=MRu? <^{OVxHg̩yC߉?,U \89^\֧v)`1E+y88#R}EHbXXUCy_|Z∨= 1{;бXߚ#vp]SE"b v8eqݙb"^URlkouE.)#16VfCL)۫hv઼ Ѷ@()AR)/v"5i86z2l6]!gѬP궠U|o60#wIzo;S8XA״^;E_'FݚusyhKtjf*f d'ozmz<&k5'y 0pU髡Vt+•yb/󷁳8ŖBv4mv32p!qb16#&9蝅[w 쿎l`VJH`Q,@΀aֻ5#|a?u QLh"o&|霡A;AA-u>48Q6#'Y/q˂)bӑbxdx ܁[yCpJQ*%D ~p:Ű{텚I[?W=>'C`ؘ{ 6cc07'k3iK?FM6lqsίK1d!&nI+[_,`Jͺe3 \wJcZt&c+Gcz?[:ٱy&+{B..DD6U#-5_5խ4{i^m҃`E㙲۶ ?^?9ZR$i BI}pj@Ð]Chh(֢*AxDّ\&y٢tBvy`-oZN҄ˁc3dN='5tm{$@v5g*0"o,k(0D0CQ9(<*Mcݭ'8-RkTs fy࿣FA"(<49ʀ- e,%<ÈP )OzYF1H/$Lt !w(V{h.0nd^< .'K8`B e $$4kH':iIcSٸyaL5SWc&M|,~v2E/f] 5k#WG ,ٜ ?H| Y =j!`T?4pṋ\}}Gz'WPAj`cWMQےH\HgdM21ך<*ns_]9<4"]5+d-ܭ|OZ řmE*ZO ;V7A%~u:+u)j+ |}^p`dhQVg-wCb_ &W{x'owL JQ>cf }Mt]{:Cb TbYl8}`Cto _Шg}FB MZx!!4_;׊}M3$Y/fE_lw[a64jR$+&V0ecn\uz% 7oN_ *B偱h%o*^ M\GkM*,@]K؃"7g6.sdž"Lr&ʘχ::qIxГκu^=wdw#ݼ7%2 yXv2d$U팻 S*OXNv6*=l.O!jހ5᭲j:%ڢLZ~xW59%g(Kf=Z]}ۈvo_SE~|sJa7ã'85+^;~zfAgFsi,'hb++L|^o7NIE%udz'͔u'WG{L&:=+ S޲핬㧘&DjC2*\nR 3g\&u :_J ܵ"%hi0C-3E/t(GT)?8ͼ J Vh$xuQ`,eE B=53B[_f-\ƦfB~ m MX-2]Qd=Ѣ^94oo> GLƳ^B&Mj spQ 4H(LJ4ٚfY|8JVγƤIw N;vJ8k$W*ᆔ0W$iccrfK32᝿pI=eA:[vC^tA :x|t55@j<@HQ*Z (DЋ?dkJL6^`Niߊ hC$l.h 80 b`N+^3c12n..}?o̷C+S@OSNSN'[DCΟ1 戦{c]gQ j2̽kYk*5@0/L?ER]q$o̟(;1?8ݭڭ*{O^}.  y uW J;7XF4Ķ&Ӌ"CWz\ 8CVyg Rv+~ wb=͹Zɠ>a"g P@JrۼfA$Jiʚ{~:,j6 ]vL_s))IU[]|#ḅBC\C@zHzV\a1W!IUǮ{f!P}x9Vj;6 3FXH;+*~l'J 傓^/Ɉ\7?> MO}-b# Bx<g# |St$~/֥![YdLxJVh${6m)݉2 ^)-ixFN-55VϤ x܋ &Fe~5ou( @"$,byE)&/߶ʅE/;Lpz*IH̶XhUIgYA嘆F0M۳tcpr > Gs`~ژrq x`޸~,} uFjA7^i#U}OmT~•K-|`w$%k4FI(J]owRsڣ@aC!0s+Hzapb]8 endstream endobj 144 0 obj << /Length1 2708 /Length2 31906 /Length3 0 /Length 33479 /Filter /FlateDecode >> stream xڴuX=%=twtww343HIIw )- -9G\{{=RkJX-`C vqrjm=,\l :2 k)3;o:An>`;^ {o=\u@@ Pl z[ٱnϼ6s6Csl,܁6@/T?w O `mo:S]d eo ?GzN '5] NprRp2?oO7[Ue+I/: [' t[1>RNم?/+'cix ? `RRV`8d XYr@g lk?`g!`vC|vߦ!>` ?']Av?A)A~*]v h?Av"??@KxAO"& ^h 8;mSퟡ+0? Oo'7ӟ` BSlPvC7+j B9:98t@N(?y 凪C /7t1.b. hG0t='T ׿J -$'};'TֿDjg/yB;YUO^2!vnf* WǟQqw)tmA^_/T_!?W}kA@={kGBT, nF7j~/j@+[R=\*td+_(ywzPfV¡ 2l2[I^ImPŊͤ++ |ӆ;=6%W]ZkoZ`H g̿hbS-0(lNh& K v}>O2h^G*lss"n#o<{c-4e^N0ՁS,Ͱ)t+uuQg;64R@ [9}1*WF 1 ؄"vq)}z;A7K2Kݻ4Br-bޢh^dw*#,W돵COȷ Q̃6cvETuj$7X* *OdwC^q$)I"eD~RpYA CQYre 5{j" ՟IEV Ez~eoNQ:R*;#"e)]+R8"+ aŴy%RG<q|#XΏcWx1֌ ~eݧTW^]zJ\TxzH}{.7CDV~VHCJn0].G2T..O[zߣAD 5ټWACgn`UTqBr ,xh(6CF*}&N t2٩ۛufi -tsB=W|[%+{U' ).. ,z|-}:I(*c=Y{?(M\ (r0grf-y]{ⓕ8 uįǗ7EsE-3hFei(p RҸGEwܬ׷7fio` M1_\Tpu\~Jc 3"Yqӱt mHH?|doO\t)1<{+DF<6k+"g?L0>4S#Ѕ'F Xv} 41wβ9ôCKx QU2PgɆ% x.v'X6R¦XLia&Fye:$Edx7_Gbek|3ndMX<: c‹Z˜ f}x\=>3Z(9D G\]ʟ'\QQC#3¾-1" OIEgھ>zr.͏A[D_RJl*]#-@v?1/oMP+K"=EPC-JV->XQt;Q8oadR_ OKs\MG`2nK1ؖ^4$";8a/k AFя"0Ԣ Rs9opSy^Pakyz4%P}ePv4R;3&u@1s4qEh+[-|di/|91{*1.bg Nc׶<\)$yBECkT+3ljbͺ3r3>I~]AZ\njo\fvu-^YUκd|RΎX{IBl',2[*{=wFy5wDS }5%俧^('MswO SP<:٣z_&ZBvxH,t)*f gxw <.nhwaυLf+/0c~HdV]67j#U g D16+9S+~#"OI.=f ) AN[z xBij^'k=ؕ9eQL<t.Fp2H),;N(>*izw640-FNF2{qt,X,Ivp((Q_ڤ^(5t]t1^^HOt$k Ĩ)yQ&$8YOXg&!OJҹ٬-. 8nm_e:~n-s|p PxK`l{99[A2d &=@uN9vФk1P#g&9Z4\18<}kDj{:ѸXVoeWR r{YH}\H; MxϘ(q3Lŷ,K=˄7%-"Aac'%F:|*sﶘ*IvS!-lbpMŖ;L ~9uM~ [Ce-/HF $*&\ɌM 2YbH)Qe9rt>- F^NNjQq=]/)e]-0bLER|bi<%:4κixf,# sd㧽AN(qA!=̄0mP\}W]1z]9iL:eLsrt˾O+.@D,]{]WȜv TaC)ni?<pWTz@Liӛa(qr麯uc࿫> -V* +rY0@Gn>Nʗ:@aHAmb6rnk& ;09aTJب>BYiwUW2LNp<Ȏ߆[1WȋSY?fI)D&ߛleEލ4l<8B@{*Oa]5͖zxo۾x$|MaJ8ҫ QkUO.;BҊa%MfItGt'^ HB0@<8QR9"\-xLV|n4Xo?;iFb{|̥O+#_RcΞ/Fs{~Eh~CU`uhsH>" 1Z9G7 ^0 ^O P\Gu8m.t>!]S286Xc%>`uɦTƊM >2ySfhϹVfcJCj"ddK#_+lZֵPF @JI߄/CGR{p'٥Ȃ[7m8N9@"xua]I&K6SlNaJ.x_ؠ1%_H}WwcQ*Bwzp)aa?g^Y#4pCm`2Yc "jQ&]er]j]s~ԵՃ2=Hmuϑr^^@ɪW>=/i 6 z3͟[I}ZDwեt1/Hg|0.^W7$myLF*-"NF~v Eɳ3Ƈ"3$ wPr?Tr'W݌F=I.$DPٯR^qm}]֮X=iH2mWd^X+ᜂk0. bA /> ڨǕxK?՟JY"Y6L2T(gK.mkiDT^ uꞖ_[b)~h?oyB{9c m²0XZ6B,IѿAfyڛ9lMK{l'UAjDIk0q:Sq2yY.tr&>?D^I)DWLڟ䃖gʰ\?r&mtDP:vϩJ2BhAAz.]XZ65usFŽyՙQ-'ZPsT1|;˓_ٲ\H!^  ¶k o8e+b2ݴBUU'TM)U,v,W:%/۪zX408/(ȧ mߋyȪ3%(_ehw|:|ˌ{0Y3Pcf.VuZD޾HXItRrc;%v+il/1$vȞS'x)>+ͼUNS_ X 䃼Bod=W=Æ_9nV)j }r9Q^*iahu! W@ /16Zv4>Fpף$K1IRo0rd3 8 7:&)U?tײThxC77|Bͪ3oM KmXP{5ggܶ …ol]ʦVJCU+.&ōZFC;\M?j [3d9qS2&asJyW*w]Jl&sQ$AGxk3idg}3;1;%l3rZ]\\EO(Ѯv- )eB qƗIy0ğ3>32~|fzts_n !qz>C~0껾:ClX abxa+cKـ2jܵ\Y3yO%g xi/{+gK(E}۴5\>*Uqkz ü?h x)cx\rd C`刉ڧ)ͪS?- &7a'bfwtA?‘7eeE`G$#5)Jxykf@ate$9_նL2޶e0t`,7 3GkC=oo15$P`w^F8~\X35JbIr׽A:𜻈UC(>X˽,O(av -XDxR*39

DʾW]wzJ_.*] cWz}p3wK*KI>ya, uS}CX\EAMc|">mMps}!Gmy{)E5.϶@Q+3dec5YQu0PfܘTSJ˱2ܰ9}=:Nܪ*'R`/5Oq'ƌwTM ԓ 漝a 3TCUڍ8(^vUsCq='aқSk{/5oa` on IWLc2AMj ׂ߾vQ4 [oǩbE"G.IjV1g_8ڃJvWRlluv&u>`nvωkZGM*<-"KOJAA뇫g /']lʸW"fA;7 o6?w{)pw@c†)blq`TiMEUOߪײ^CHٻ(5vTt{C \z*Es]J4Qj\`q9u {P=VTDNᇥۄ尶BR>C=|c_qo[i*TrBM.n49p~=tHQQ\x^23jݪ2X9Gh=a6S+}FG Ix6!zAgn4j+0p#kG]Qii42=yOFg(:o^3p@"n-w 4F mM /  Jـy>]yIVx-L[${tg=Z)*ADǜwN5GfZM F 8k}(Zi3Õ 'Bn<{Z%V&/M&c!e=nP۹֐LqONy!$>Gq;pgJ73t8xhU>iqMlɻn,xs{Fk‹VsVp9V滜[@ uDۖs:22._εB>Ct`*w9$9:5d$m7\7 W˞˽5G#/=9͕;}WMn=EPr]F]<ͨՓdfc2;D ޓ@O\{E<GLv{XXg3/h4^@>b*| ۊ☢-GV |ag|ܗ@7( # &i}_4N,>is]A"ʁhHSa Oz[l?ٰ6syE8\&詑\N@P:r= g_r)+Ӎcwy80OWI2`6^:mqeľkb #Qs~Gw6,8냀^C-jr`W<枞>=(ij]!2;G1mtW Q[h^u.BMvCRsↂ"po9E X:&ĉm/iZT`&)^o,w`٭irt(C9h;JAXtGcn~$nVeF7ٜRWKθVgPv^=q!o}5N؎6 kOk<nǯ#:fyw|z,gltGAjO|K7zHki|ڴ!؁[P 3 ;C/s\ƗLFP2be~Chbڋ줲KwGz8џV:/y)2'#23Uh}q^Zc9Q({UUAkwu;*b޼:1L<|90h*Xl*}"J4̳\+>jb>P_-P-: [H&ߏPB4gc\5x*UMiH S?OGn Ap2%QF9A+ clK BSƂ$ȵN:T qwvtU;! 2Ia&`| ʷ>|Kޚ%tx&K$wG!4 ?t36d5ɏS}):)ÏQs@vmEF –#aA_6JmNli2̆ Y88?5OBX^v- {Z,~j؎=Go1~Jl\݉ a]oLޤM0W:W'0Y zܩ(&~QnoufUMlA^~l/ż={{"ChPro,of";)w,b{[|W( "x} ń-0d`lgH} }H!8x\L1sYKך޲ً}H<>!u-k\*ywuPnpЌ~p1mu'`VYgBXkY_:f25t c\C0/G_-ÈSrfZZ^ -kEƄf!y9Ne?}\/+ZR"!YGu!<t&t{ytur}81ϟ!q'5}=K3cIC04Vu~U\_?a:!r[ص <={o"|\l͞L1l̩<9$(K׽<EߖBhm ^ű"\)`E+]]n;ؐc xŤHj+-`~&D(0T[&Yb~{~j3`rcj9Ss=s[-41; e~'gbsBF|nuG;1IAdžl3<*#a<ʼFW/I{C˿3tK( M#1C-ϫ.qP͂m`;5J޳0G8[& A˯U >ӿ"| @m%t<۽Ҷ+)gܼ;33iLZ|⬏P%S.>O#v)i$-7}>Ah/L4LFouRHH,w&$%!!Ap3rm̰WD{m,,TƤv}du`p휷.Ml:+&gx9?w>kxоX3/\9xvt-:v6VC>FjŦQ2kQV]CCf~sJI!e\hxv62\YytS?Tp)Ѵ !)Q";nr,~w~ 6֢T t;< hĵFZ@ɔduN9D6/Ǟr/-x-i0n*Hp0j&Z2EpϯfL=[א$7 a%Vvag932+3$Cxl?>MN٧[p8\n[aX43L.8X)Aߴ= ub^ޟm\ڄ%?Ǣ7O$wyhޕ{oT1KFSV3"Tr!|sDes:5[H'C&d 4d}pqmZ4'<9gO~\¯@܎+}M-{t?7YK`x46c)7lCȬԃ/LI3l Q'0T0!^8 &ɓvIC_|~9( 9 W7+4ٳ+T9.(_૤ە)\펓Z9b  LVkQ?WdX< b9ABzPeeݜz$,=$}oU>&-YvsÒ^՞ܠHSzaU>EtяQX1rX*+Bcn5M#0<#nP )s[!kŔo"}1MەRi_LauyRk=c씰(**XQm9zoۤ-u!%7#/wgY*Al &1 #Yo`gXۨM=)iun%MviL4hk1Tʇ\;* ѕcw ?(@l& DrD4Ax&R}WLdU(+767G6MH'o~C# 7=k<5խ6-?b=lIk#mb:<ա}x-m1kOl[a'FNYqT7p&od҆1 hK[ݧhf4Ҫ3]Cr6ð8v]5Z6yqoOl8Y_,Iqmaig) vI4zLzয়06;*kgԃiS3)?HE+wZ i}K$Lfi|[5Y(5sVY;žM"WƐy5/Ό=T;fggbY֚PGϏ"g'/y F 2KAzef/Iz &dlSG!9S!|L@yv3ܝIrW3OD#Kِs ) ІW5mbw(~W O5]+#&H9YGD& /Z=&ҏC_o)Qod1,o3"3<ģIÝSMi3p+}s;&snҶX`H6k+V*ۿ()8>csPn=ӟԈE" &]ڰbtqDF(Pw/]ۜ̓SiP]5DDBtQ' c;Kc1gt|g!~*ýXe;5)Y#okJݞ-w0cvrU?Yw6Vjҵ8Ptd ! h]ˆ /Ŏ:Ty6> d + 8t)0Xb$ƖՅ3D)I X@JVhA\{6wY 7Wau,51 s, /8?Yq8ywk+Ar1fBN50 B;J|]ȤtDV>t>4þέoq 6/> )e}.v0h }E\N.0.^  Є%Piՙ(X!G턐FZC+Aʞ`YtЫ֬mϭ2'<4mBÍPSk)E[9!װg[wpYy0{v%sFr`wH0tN:MazBDJbUR!,Ya8N:M/+/Ba:Z\vbN^hl'xUm4˭ﳖ j}'&l,=1 ( 4AbD&@*ܸ j _著2bF` y:(} Q WXax7϶$d/* GGf!nTyy"o?!q9Dh`~B$3+hn+m.cB#ƶ1cI|" -'{2zk{ͯ%t΁|I$T\oYĵ]3Rn6/I+R2bZ6QC<p]wz0nJ]3$Pm[0,8# o`L~iTabw^@mym؄xDCKa.ufo&g;|a#fb$ qNq>wFh7N8&{!o=5A6_0m|6*nk1$>  YO)/X6L˝NӒُPkT=4JtNq:&zÉrjg4H8J)սq/sT6]Y og\..;a<yܛ i嚔Y,7ܷo.Lk]@+(`Y96,ɱjH˗)J.%sж[iOA1@ο7UR>`wI&5ol)] Egp?cc5Gf3|#ݛ]HTPaX;yQD ܺh:AI{-vbM8y=~˵sw"]N[6H yFmY1˳C@ʋP`Q#En0k%rgs0-R ?b!眡8xBh^5Avv\lv.>IiM]V ko)ׯJ&ѪmL*ٓIڀ&-P刨q'%F=Iom@D5TZ+ok+!c-8@$DTgn#82z#Q39[cX['E3Kfp*R7YI qE"Ե¡x]YQ0GZ7_]Jt@Q Z5@UŨi7ߴϠH2m bT%CG]>w?FTg %K \u^#wx,޲$Ђ~XOzHYcBoC=JIgHGHfW&a{z.MX,Ì~qLй9v\j~dY鞷Ȑ;g^DIy5)2i%[]pp!p!ql{1&SSs;8g '#ψw8&);خ6/\d%am|WpT\](; nQt- %13jFp60JC[. ~ЎV+r7j6~9}RIs CrP=2"UÒn@,05,&]*}::Bo% cWdBKqO!:ddLM a;1#e{jKp Gd. Y뜰ܷ!7d H35lQ;$Y=., m`!Nl~vvv8{Lchֶ2ܦWDan3L r 8prCa?|X:tƴֳ' 6. jY', -e6aGu"w`3lpb'})[ }+b՞;PKP*D 7 )/Mqi sS%05 &hJBQ .! |D +*A>(88Af 1}ASAƒ"L.Y>NLƍoe}%A ېd.8L8c~ORLa<"x:VB jhyྫ{RNbuΞJ׿~R{'!SKC];8 |"U3ªa97 9*L e}_t1@HqV«[n"䃢$55 'M89!L[Rz dԬT$1'Վe I Z3 ChQ#^:mrgR3Z35vkIyD0)%XkΪeٮ?M1q] =M_qX4'Qgy sVymD~ˬ;]?`HվSxzp\!ko}Ӣ.hjc+VĹ_ VbsUZW^T.-4}CT"fhlׇc4oTOKCd"~72?<[ V9-naɮl.kgnr#R^&v75k4'?SfE^(5iݩP45jQBx( 2dw}#/|Ω_>8⋈{ݝ|ȧ]uȳ'ZffDGʇcfl#q`;(-[7S9yS?9u* 4~]L;&ģCf̷O1ž$-MɵpMSWf"#od狸f&}Wؚi/6W~>WB:0ǜ\H!Tz0jSRn6ߵF l0L` ѫ>]4zy?D}OyI|.*]of];&zEuAO3 ЅMS2Q{!5y,.S}sͪo>\tL!r`>h& PܵhϽC#};@U9N=WB 孆F:i[Y&NΉ]PllrهZ~Ș[O&VxaTg {HjUr\T8%Z sҌuHyə{ဌ٤`x, aq2F6 رm  4|LD`pF( mVZeo%?$4o\=LP)UT`u"'}]J)4nãCt:WZbE[j{8 /G41nc^%.9:&BZSVq8:BugR@,6;*p(o׭)}%\}){J &yg @Kq#¤:uk`6` P.}% .r*-# l5wl=r ,=צj8u1m=*` jnmryXGzcHԊ&؄9\nc|GY %X5TR ѣ6|&ڑtK@YI>Zب1sL"a(dͤM dFJ|,m+0j"XqjK7Hf=hpi"o J!$N#u#yue%]IO/u.z 6{# `7Lof{_TCRXTzaKlHj X$ %^Rtd]Zg oxOh6*V.cP~nt_c,`dI&kfLSGF 8a)H+xu墏=aw~,yӬdM8̛sPDݲxIP\B-=(vSH1;l! .^r,a|\X &F'y.gzI>ft49%B3UexvE^P3:h%ʡφ]`(ϸw8yi|gYա4c >N^_$Rč"l=(1}2 ez Q{c P^>fWB$gʖ"۰Sor ҳtEi&[灉/,KAl$^Yai(g(u*'~yhY܅,^`>/|\zc0{27NoguxY x[לtO"Mz#3jsac^R*)AdE^Oo*TƷh-רj"G "` \Z1謹rۅeJ5XXZёڬg:? Qr,鿁 6/-'Z_X!L>y;{$$ũx|\x.9B.%^AP)훇 ę8m5҃h[B,,bfyrRUtv(4Dn9a}ᣰ#4XGA;8n5NY3!6'5ZCF߫ Fձ{x_I.КuĤc[5&,ziƅSŊpؓS QQxc!g>7le2GH앂^P#Mw7BUk=&/}D)Dl @pϿq0^Ƒ1_?G6o94;7SތDO{1 \h/0Xks/<Sרb62Hfc_/P=r?#t܂+`!MY=vxHE_R{mbG T\! "_.n?=99Z' :IUc-ӊ߳н<S`$ggRyٴ'h]$0ouMcۭG(W֥w3 DT)*G3WNƛw'?Vi8'|m,5]@chkz1 8CߨcA9 5۞tN9 X)A} %T*Q0Jr[tԨ/o f (G@2-ߟ뜮J4?CHZ<0h:Q5VSYƒNlSeFt$D w*%mK1> t因3iO-F@_fVp&"e†yl^^IJ_G.¾3l,mW zIuC=e}"LEE<#1න`Y 7!QcVZkԞp-x|ZLjmè\2~ OEW.#ɣy,ZQI<()D|m.+RI鑬T.-k %4V‹Kd;8oL›3^LhR[]ȺPNJL` /K5ÊTϠW@{u tWնfhzDOb:ܡBWS(pr2g.rO2G/2 8ėp#o2bԊy3Ӯ|O-YF(@IN _vb&RtNd- ۼb8MzB -Κdf`bdeE`+{9+^ \ E Syt8/꬜jgFIGLGbR-l;3MQfم2; 8SD!e䌩3BϩPLdPP}K RrtvvOf(|<0YtMa[<;i+snx ~!97s8/2&*EV>2|f4G[Q*IA@OA4o-2p$ ӧnV ַ!}[Š>V֕40I4L8 '\euV3"&Ea{6~ DϢF[ d ]D!0X@WɫXL!ǧDbpK*ʬ>ܵ@QHT੄8 ^ p xX@ǚ؅0PԠ(\ͅ`h= ؟rvCK_1YYل-Q9𪽟De. 32%vK#nװ=4D[0żu*pq>'(Jx?bzh|^Naޅ9҄*#r z{lNluOHlW y~A*@1Unkc s39/r}tQ?>zJ,ΐ%Gj'zF0oRl!GI\¿-qG ^4&ԓXd02bie.>sS O\eL=7:S t<.oV_)V`Հ!ͣz7ٶKpR/xoGJ2Nڤx8u$!c.@I|# qmNGkaD ʖeػ ӍWw$Dp)@ً,x66N3uX97OLfl.in)!LhDۆI#)? &l0cq&\ g >Yz}HF*O n ыf=@}QQ"@.L|;b7[Q1rp.:2`FQʡ'y*fnYx"ͧ?qߪ?:ǟO°GLp֦U~М-3uݝQW,]ܘ6R.dH!j z|]("ˑ1;w^^I7A@6g:Nʏ="¼Zh_lk8B@Ũ~N9iwL/)*3HEej,`ԤZ5iһ&"&df̿ᙧg4ćTz4-M:˝|JzH$  KFdj֍D)s[nF((ıޯ [m_XQ*yuXнўz׫9 ;#*_/LTAx>)D{JbnLeb˴2V3W Ԏ5FhI+v?.H:ցLY28;e!f =pB $m`q$ W1=1+B (3urQoj,ho-Y |qh@VI\zVtr`h)Hyl>T0@P3\΍&SjPvބUC5F܍0b{=AD{1{(d^r3؃kTb0!wl>x&rֱmql`8aq\/K"Rڍ*+Ÿ]2Mߚ?%]d4i(E,eX8@QPWbcjA)ZP)L&")唱e,E=c4H6mI10 OԷ]@p3m χ2*V`PuBq'<aE/vC`4PL,1Db>°@zH-l0Ń<̑FTx[N~]WfO5WL)L$0"S/e^xEYOWcyKqa jluv(FD,>(q."3 yjTvlAJvH#W$rwQ,YV*O%%°oז^,ܺ!u)O@=~$؟+!`plPpTYߢoȃ%B|! :.[]pP՜xeIOw#Ilox(IckymEE􇽯W=1Z7tD#a[lٴ3͵J@ il%T^-ʰUֻuuo\pv?:=8U>X 6ґLQEbZl+Ԇu&Y տANW;n&o 1ey%AR1pak@h~D-U8:<|߂Ѱy5w< b6uŐVX1>Fc"AЩoS}Cv9xuN]JU*2+T(- {j\`:9?ܱB%!+8-GőDC'A^qEw.1?)Bķ6t*o`.$?TSuh+ظDsnc/~WAXG8Y,z2:(HM-R֏H-ll / -6QNɘ{D!Щ_P^i8%IYxr+GGhBGyc+f7gV}@ٳ[?71J*fWԃ)N=S\Fw_@rhs2#1[x)'@ <`F._&.FnS/ ^_!Xޞ-3Bfel'Ć23[X & eB)ィv2SW#^scxxx!CֺyZ> t؝C}\! ~CydHeMJhrcE`'5hBIu߲Q(mEJs f`9أu]un4~EWY5*/L#D<"bf.rY9čϣP`&[IC17?wY#_iJp0EW]kZ ўmܝ8dW0WA}PMG k(X";v7d~ gmJLj%˿} #Yb,,yUXF##lgfֆ; ]֯8b|pCAC{gп>CডcX_kRۢj' M[.И4B\v ,PDD#Z3dN.¯9[F*)νtFjt{8/qtk_Q^~,r&6 n%]QGJp{A1LM$k 24=4i/ Y5?Qɰq"y%L a ?b^poAOGԧE+&"9tt?-y?y`c7q F!^VTb)Uu/⁁c'WwTJfN5_BkRw^7-A0t'A%!2kZ!S<^%Jɾ d[v15>&)l’ ޚe7b Q-b,cvcFY7½Ork3pwXP*NGVxԕ%v:T?sqaF!Ml? +p;؟ |Wra|J=MzovxY\ϳ {4DN1bo㥥 X%9Dw <rK5}44ܢP/!THIPsKH9&ܶƈU]Kva wᵖ,k'HC{ ey "0ƍJ՜9ףF}|u$ DYcRLL ?cUuO!TP5D/l%9M-.:G;\F@3oNgtigdL[|FqӶQvh8IYBX9o;0rW$n}I[w/C.l)3܏ Âߨdɧ+B\KPOid͜M{1Oc5uiΑv0ړ =1u`rU­?W{[FGr iB,Y@^:mkZ I:aVwֹ/g͎+*e:_Y>/XozlďE)"Hץ4m|6#4yHUq.攕4GAʆ4i] \.)2atu^% um'ƪ򆑐YSqH切|p0r" ]ѐul-GhPC/WQ?an(kW@b>޼TmN1(!^QxV\J{DrC8T=wwnoKl M}̺m~Q]~ұp7JfO%dKK+Z(Ë%:+a j8͎Ӕ`|֮9 r٫T_Id*aڞ&$!H^'G'g Tց*fY_!1Y2IĪ O~`oOb~oogw( /,YzHNNcQ"DS7K^9)۞"a1"May`$ƽgM6}uꕣA-B[0[ΉE&6w2D1DW1P\NQw:5>[ƼMgk0^ 9JUn/TU+z'#ٲu)"S88Ā_ M9/yfjX`e ěahs8T[ 'G^>o,xEMlnp)S*M*|(_I/Y~ )c6XYsc7nH>uJF90HH$v 9iS endstream endobj 146 0 obj << /Length1 1934 /Length2 21666 /Length3 0 /Length 22882 /Filter /FlateDecode >> stream xڴ{eTm6 Rwww)݋www(Z;gfޙs~+Us 'E;$1 'HFw*߃Np8@QW,ha ;:]@&8:!OZ{c@['Ͽqmlgd 5z?=K'',YB\E^}lٱepvwO>a1Y >&v66精'fΓl+[;7[`jakb{{F5[ gqW![gr0@9㟂5;>^vS~ArΎ. SB`X; w$4P{jbgk0"09MZ.@6_.?hmepp(Z8?;_ޖTjV}v?lcile rre_()"J/?q[c; [3 ;@`zvv`#{`jF?$Nr89ILLFFDK{؛lVZo{~ǿɜ&wwPgsGпsv[:w0za)9Z@7dgG;+\Ύ:L7(@[= ׬G33 ,ksߧ y-SCK| &KɹN˱42&rI@vR:Z/v-Nv;=~ /bJta뛣 ~}DyЊ5X@bt[@b}@A*+᫨VM˧ɶr'$%+Q*-70N ȇ*ڍ6@MA7ਾ3b)R JnVΑ ; P¹&nxR-OA!s\{4d9 s708j&JspDu!D"'4p?~L͠ZMl$ҚΣ1)Pe!5mb;B'tGҊt&S#ISH3p>֌IԫA_'w Y8j抒xr9ʂ(ًTܚo.qƈ§=y&j0,+Bx;ߴ"vGC,JMkIcdgDZ^U521ם+ HjBkD"Vhөdf?c',uՃ2E*?_FG '%7YēΜOkL4I{’~n-yR͇^st.w!#2WbOt3cie * Jok-5s/dN\Ns#P#^|6`5ӵG\:KpO@yN~M_./\JN7PkD|fNr~y-CZ(uJP|8ަ9BLE5z^̢Bn4,Sf|Ц:e78`u#æJ;ج k['ӌ{КIC]|o.u) E@PpUϬ,&^v5_"КA>oVӄHtmdo_X!}{]XˣBI8B!4`eYL"XN@P? ;e ba'\/cJio7p5s!35U>I՘j/UQ%]<{ ƬlyQ%ez43Jq'm!![%ꣽ8<>۞OGzݻM\ 헁6CHݒNUs[47Vζ6vIvpr T2;r;Twm%K~1)]ô`! ԽC=ѿ]gk͐^@~f_]ut @CGaJz~wJVEǵb0f2eTlɀ";7e> iQm#3F6,: e] "Vb%bflD>/Aݖ 7bt侺sx 6瑻9÷ ע9nL2,÷_ޚ:[pMr(V^ts.EMz'S~aNWnxM@^+#!ܹQw?>]W~zciqGO K.;K שX{kIpꗈemSyC1-9 B9-n9 Zp ,;9I'ZN :ysXTy!!Z&A_xj:(8OUgNE5O?U~3ώֵ;iÕ,OcM?7o>F?֫gjc9,o@䨾sm C5CIlgH> ׋tD/n-AzmsˇlǞ מ`e_^ϔH1glGTG Y2S6;0-eJ_TeqȗK abMj7J'XfNKzb?4&}jX@9U 13Rn+h}q55[Ƥł]k\sBTaT/%\b3j -u+Pr_:aDSl VV+JA%e?q,js"\H: v<.yp&A$R8_} h$Y!nk!hO;C;OM)~ԟ;m̃?4HBU6 7qv?Cr6 .I{H'AnS^:i.]V%O50h cGmNnEh-s1ͧ?ƴK,h&W1 !jjFHqH#{vLFhh).D[&QZRGbBbU;!MrWR '3MG^#7aP!Q5%Gl~mpp>|l@"h&0kN _7"4ϊpYw"M& De$˝PTqhi(CqvWŃsl.uuSuv dȖܝf}ˑ=E1̬#'afײg .+0(pVr)VE^*pOqdxLᚆ# 3F;N(Ul0uMdU=*28F;wU{zcx } u*8O(߭!CC<@E$-A6vhjAZMѾ8@9k:-Js7B:z#(> }QY(%1gӽKƫ_<Ƴ w}6⽟Fܜ3-)WS!263Kղ| ֢sn y%,KFѨb([xZB <҂l?2wH*XVI:ci#\ ;~{o-P[agAպ? @T;?o~#ii_{Eq:y7@llrPs8oZb`ǡc *ܞ %*Z3oADmNݯ \/ro9:<[mܫV,h/X$*WUo/7C1֞'c{J# f_@v( +HKؾ:sM"fFxX/֑)'7I.I^Vn  ˠqsHi[UJn j 1QRe-,PTӴt )>> x|=]WbWJ)geA^^nE%q 45ӟzޘ4%ș~kCb0a2& SP:+L\j5_uOqb .y) O% >]9RK7ɟB4-tXkL[w,==ϊggwݪ8mRVs z-,e׷`-JqP 4Q$Rb,VZC~DHm^)G>>ӉEz#'C},V{oyA#AO_.g/^Q S: \a1oLhd+{'оbJsb_gm3s|V,jd#J8% >liKвPA1]*"zv}ّ E -uF[B/sDSЙUmJ' HS% l0-I3?#zRvn{ _NyԸR i2\L!,|r]&eޠ7u /,;<`WV!q3{U0~leoMfM@z`gVzn2 w|#Nm&T^`T Vdkbҍw'Lۛ93xý \(R wY mu!O5|xqp2>n j0%֧Y dRW %fV\|``80v{tԯ"5-ԝ/{_ZsXry J9DUm,)FA--w|6 ΘSoNߣ! ;_$l6IP?-)TϕH<Ȩڎ`! ae.XPY9ͼ{be) = nwUlN؉~: ~~$_d`3S[l͐0\1JY?JZϯ+cpXM}aGi+WE3%T*8XIYi*0P,n*iݱ &$VEL<0 ×緼?(in]sr{s`m{f[EO|}7Lۀk@sT,협%4Pt(d}bk)2F 9F .ZL1mkN!-c݇ Qo27'amjrBq+h`")/$LpSPb,VԬMV_Qr|e@), d_lEkeI.frn=lu+gxtCAkeY.KKĚӚ72=gH=bЍ9m}D:zrLa{EV9mn˥1Oji1#ӾE ش[$K[`ԀԇAZ\/k%4X{OlW0"WtVqZ-"dA/xl=S7/ؿ_B1 ;qf?Gv`[ D;plClĞxChNA4~gx%ŕ@oܾfYT@;v J@z[O4Vnpl:LG?GV~mT`=ۜݥ{Kwda3d- s4C]J/)x~o'wz=X宙|2Ae&-O7[롆$4hvwEVcbr&S/LvTKĈ+۵ Kug]+ W߳ ˥iyR~9CƠַzWe] vs'-ސVzt P?&q55G_kу~(> F;TH4~%n9f]'e~;*:_S>ɍ{1 Ic+db#z뙖EZ cA/x&pƶSޛ*DLdDT@|P8X6!*[tQ:%E"Nad u}[£cM&Z95j'<1ǺfnO;D]kI0"?q ?o/ b/i$ 0 *$\y);{~TR%9BDΜot!ŨjIJ]g/иj(W 7,h3֭_D}vf 26zrş~eciV WS#6h[羺Հ:GdKk>ɢY'/|$x [;[?-|FcSʖ*t9{JoxҒdOFͱnQXxޔju~.,FRE§oD3:oKQt koN5%\g$aFƯR==FuPVAUJ`ۚW:2^䝜?Іd/L]>w߅T_h g+HL&,Jy[h|f-іvN#M)CYoC7Ճ3" RV1jaRFTvΝP<+lj2wv#ܑ)_3= *]Jk/ m_=N5WɃ[i$q`fݖ!w0^ +^-{Bо#ijH! 0 %ݖR`{#J5É t?/,“NBI0.VquؠA.g8¢ǣJW{*M W$6:|T'$>uGCT'X˨x::㸐U")96TΩTH-޸Lċ ?9%asc^f?f@@E '҆xXzk0oeRm| ^Un/Z/7zw^uۍh;ָee7'Kɬ,[Z edrT284$Kw "m[mJ85KLg ylN%~GI-˔ i:n-j'6k@/eIc )L  KjG .3 )H B6((w:ÿ{[21KZۥ%Ht&bYPW3~ϖ!Ĥc1$a{8Âo^}K8(cI{p3ÝB|.+t_ǫQŧ{5BrƢ `җ' # 2Bߜ?"Hͳ +-qk{RF;ה./8b6Wa̞1?K} $'gf !jb°cNlZjAJ¢P=650MŁI#cO}*5+{/춞zᛍk,;Ez=p/Zr2{뱍!&|,vo ܫTZ*/Y+lШ˽bnꉨ'"?=BK >Y3 ӓQ>Eu*n:"[*跱[TBh1M@x{ z1 sʿ?/1[6!׵`(9iU8az/>^"c5#UU{$!;:(>,Bxc=h|OJ%b h~M5qd21-3fQwHD,Q?تS ],QZA){0Eϙu1m!=9X|9_ )34+Ԃ(?v4i՘i:˕j^-gQ'Cگ˩t3)j5|U #NlG|8'{ޭs. e.% C$]iFj[0-^& `t><:)Dʣ=}V7A6ǿ, b%ۂx;?wx:722rdN sBO tJf /ʰd*Zg,"чeر#1a'6TD]M>qm@r~ߔV .䀤NPiQ&DhWK_bTI -EKԕmN҃q07u>VݹDnTG$l/#՗YN?N(3.!؈ăjʼn:EWMt@~ kl h& B&)lN]@>!K]rLDvONDYAUDXITῐ兛\! 9]ċ)B#.ڝ5 N'?KzcFirA׹tZ?`*0 0.SLFՅ4.X=b!@QZ 4Y2]ˌb٪#/Wn k>EU9nqM@-=G]}mob tE}mmAj!g*ጉ 3r'\U7rsf ZtawݝQϢvF4u]֜S 5s{ت5&d[ >d?ӂA M:-¥Ms4YnZ%: S]/ Q#lG8AYeJ?Bb8mf|jZ{IFC?}?ҍShkU:ܹՌe%`U=% K^I[Rzvcy7.Ȓsj^m)ǰN7c|̷:9{_eʪ?$bE_p&P)4괒r(GP`Jv 3%>9F0}HB">^N >(R_du +"""?(fs9i8|̍jy |@"VpQR927>a ؾ MRi8.o1ߎOL:{6B0SAPŃBꘌ"b~%>HYHlyZH8?D7 iJRaӆI_na `BʴIZ"Dt+.pNu?:͇lUvԿl!>KV3zVH ^_\#&30d>B~ 7=nv}~-L1jXѠl4@(# AR&77č.>L$T 6NN,n -ߍ3?Bg $wp:Cb:9!/UY+73'ꀪ& KW[r?`&1S=}_=t݃ 4m8*/C׸9;0t"c6Y!/ǵfB&XFz~֌}hlϻ[׷*& -1qdd59(Ry9抏5U5iΪl6:"24q@:xЊN,oA%d5rVnꂌY#zi|gn_eԭ FkAF"],eL|pK2nM%,fI>_y0l[^&ja`֧q*]8+֜9]:)J;[aز.WGso;ʧΕ:ZXj(%wAxlvY6p~b/96L"+<=UO) MH C2*%?m#bC:CSJiy=ŃM)x^ `v-KC轄AP<&-}tnpH T!bw*CG{,, !7GDK5CX8h,) D*q,lJNnikTTcw__{nlRƷȣ8S&!x_NZu?W#l1\юG_$k!lKkLlx'$4((8mW{)n Z UpK$^CB6: qxBty/w%BF>w1Q2s 9:%RXjxv@p0HC$F6T@Ȑ]l0SxBEKU*RnqI"E(o^m߈o"h?F O>LjHBZ"r m%ay<2$0dk/=ڧ1lW>$c1֢m224N=T(dOT]Ioï1S6Pazߪ$*~wL\kgeyvҋ3w 1cT WFZdU_>Y]*kհՉw]:sh$< N}:Kb˶9P -B蛓& i!rvfgLPRE$`2^5F\e}Szl\&2i3Q Y `X 9 tݞz}sA-tq# p'vw{/&@jx= j*{ iֲ"1h.I@gY7*)mlk [9 8#~6/, 6ʛsM+7 y)ͻ}7fiPd_)7 7 Apz'^GRZ|FoRޱ2fFeh{Dx_記tS&Ƙ<do/ ajbjw=$Rk(-A%?W$9c~fGG>Ϊ߁]Bk ]JYIs?6P/YWCK3 Bjه|%rYԌs>U <([0w.q40y|cRhR=At<{uMMqN)_7kC/}CzKфHVy rocݴ졝tsS'uEx({E7}=0UoVtz!)lc2 wޏ5.wf_nI,(IwIV(81v%GA[_\0F-IQktW(ΥduãˠD!ݭdS)AR\#A۽ޘ[d{i8 tcoESrΧx&$lV<m`4 TD$pGzF|0C^i= CRY$b҄dǪfZS, vY#ؼ0;Q Zϯ*-ٴn}Ja@xє2ŏ;Z?=^Z*}OVJ.sJ^Q6Rd "\~sN`F;AJv@1ıx!ӌ:)(2TnBNBAcRh{ń2-<ǔT @oԑe? -+}G KC3TY3su+Tmy>hӝu~R@GG%39M!\ѵ>Vd_H!V-<71!oٵ a.R6׆'KD9[fT8{vA{zyѺd^,V# aX2[5|s\>vDtZ&y wzD}tZ/9?Q< }ugpCO9`:=.O.ZɝBKB Blf-'3'Fkt8G4K +Q{E"g~}tHn|'yF.,6_c*fꞩMjo6bpvYG@c&͞y=oJA0M.YpW{[[R",p Pa4j_G+T< ҈^JHGzP ,,xבWֶ\j0E{Yg'!ŗ24B,w\)`j<,sC8=ζr^sX)cS:e80zoo ¦vPGyQ}in_| kl x[x`T PaKJuUcT\oEVzHCzn6 o0{_c9==Yt6]n# ;KS PmNuJ"_*:HZbsȦY+7qM~BIp!:sBC gy\ Y?W~`ዂ38{f lpB3T!d ͢jS]6!W#u:$_؅4=mSW O[h39t7"[̐!ZzhbWU+ӎ)AC̑ `0^f*<~=)& ܮuԡEbw1t0*).}[ z\ ;4VO m%QKO'pʱ^d#/:R뀤5Ǹ'Jj[턡u;Vα i.& ÑI$FϩI2C7|5沾uW=lRcPZWpo!kJR9t7D-׀3z T_GJ!'YTZ ĞK_DMo/mވ(У޺ } 3U-cB</o(]MӈVa&`lE Un9rC I9B-4n&;Θk ;p.fn:"|s?)C'uŔϘ˜ޜh#丘P*4",O^(_bX-ѻ;+|zQ;Onϸa8&&a`Bfҍt[10Dž\YϞx, RӅ`)|K-!<?TKh+5xxoGp_D>-krXM=TD%4߅Zk!m;lAp E˂sr7x_Ԉ-tQ2Ё"}^!0KTIǶP,5^)v#'_`"؞vNFw )EJUjh{-bxJД- 1$ߊ@mT`Gq|*SSv8> FnS  ;mo6p~ƳFM'u0&!+:F`6LIJ;L2I̠~P( `UeYc.\.yCg!SjiՌoq[W.҆tBDS)o%gis3t8 ,gtŖj1C?.{Z ҋD#׌ţ":;I݄Hf"dma2Th\R mG/8tø;t7DΓ]h2%|ps@YLw~X l+O[ V5 qkΊ(յ2Ҡ^Sg۫h#$]}@k"N۶vihx`FteK`z!;-Y>%H* (NG&}68zbaL# ƚPT<WR:k*6/%[{uscTّY4b Cۋq2/ЍjeX׷$NBFB/vA<^^m`,:p'Dy<j9֓} ANXycP' <Ǵ0U>?,!wDxtlL NjTҜKEgXKup& }vIHգ '\ɷDp}𗩬hIg %(tB wLw`V' !WxN(NHɨM)=(Fh?*s U$vu}1JBHaZ + <ګs&˯yh6Ι4(5daB}Ĵ2\U$t)ҌݴF]%1$w,2=N UBQ yTC€(,ao'oM( Vٞݑj}/ ӬMڥ+ouűeX2u&''EmN xH #Y|=[23cר^Qd7wmޛB;L7؊Fkqè=KW8s0=o Q<)>sa\|xG_^hN]Qg7ž4?@eBe:R3p"F.ȇ$\;SէE~BADJ= ~Js`(y茓לkr4r?ssr ih GD:IA+g"y<{)艇W3aBFHX%*.NVBd$*8t7~}NKvY{^2e`#A>/ѐ2 &( endstream endobj 148 0 obj << /Length1 1912 /Length2 22963 /Length3 0 /Length 24132 /Filter /FlateDecode >> stream xڴeT\۶5S;;݂[pw#{s>~_Vc1W[U$j "掦@IG7Ff^ *GA!4qvt7qܬJfnq>9x3_b:8z:?zoĤ`ܿe@73 zY1I_Y?0s[[?.p&@;Dp,\sk3 _e,<?*H@ר|̩7hǤA &rI)OO?MD ZjEG{YJZ{͕̬nr78X?/Ɵc0rf@WWnFWS/IQTSFV/; 3GskK+' _b" pt&?7;I7cA0&@6?G&yL,ec.y]9Ln?Bs7H꿰-P67k/=9a?P{-*!nN rߧ_3?G,:|iT Q4S Ix^%-9Ӆ#K *n ʢ,v5H v(զô{lO3W3 PGdRXFJs"WS>ՑA?yezGF_ٱ^Yky#>Ƥ_dv޸ָ,S_&zF%}I9خ; Z~"҅(JŒTv;hl?1 :Ef4v'eI%XJS;(dII5Pw2vNɼ"8=< #W~T֮%8+r]@3+dN㘆gCv踫cK4˜!LV*{MeNas R9{'SIkĕw7eҟ6dyS` s 7{P3FмQówfu7(~ih}@AG[x_ΐ!x%0{e3YYD֦(V h0Y/-@Ku]hBԏ s$:28w9,@LrSxIU<~.xRsُk#uG`5T?($0Jk/YpP=ZZKV3X$ aV7苇8w yTڙk{R͎.=<݈;6^iReZ 9HM`L"3CF0gKƄ+\rK-E?kdzk۷`/N#p+3"Xg~0B;qQDWТ#֦gͮhҢ]@ [ps5D'N0( I>IqBC"_@U5)Z>˗d}~X#Gi Ǔ99,3ùʝ#u o.^.e˩6et`̺JgjR r;Rh,EGҙ绉y}t)eOǝf *BO( 8Q72|ι7 mљx&jډJ3ßƼ_3Oی} 1ja$itC_8gY 񫧃P~*Qo:Wj045lܲ6vysis,>3 `?b 4._˗M"^fʋ9h](/X[ [;ƽ)n} Lk-<WלBv2& $`mP :/Yp}=~**Iz]{ 0 eK ULRWTO2VPy½U'0٨O:Fg8'-PKbr@m=/%ZN!|)d) p=m-oꉼ{ >Q[7r2)\Z /묘@gFclKz0A_a#F9̧( ERv\6S@>Wo(=\.e`! I-Lq,!a: 4HnKv[C:d5o3!R&V`TV~)oI`& Z)'阗|BJY!O }:؇-q# J x19Mu'04c͛hK~ʟpp.+yODkv(6aݬʇ_"921ՅmnV=BI MmxK"wYmp^{Js!ٿrnxV穠6a5/{WG/hFarHRO~Rѭ^5s_ ~2G/޶c $l! Z Ő b kxpR;*~Lj|$k]w]C~ycD,6*h6NT}G_ty%92fY#;+4r/ղ' xx줩xay6,kYH%˫!+,e VOphxaVd2 yŰ<"eqq ESxheM>& UKe1/QˣFN2RA;g(nNvܵ*Jڲcf_c`b<_jĂJ.8}WN ؿ*ifd&\y N1DluD{ wm 6[ܤΠKdRSk<؞3T:Gctmq洝vpuc<2`=\FBU0keP0M*[^VnNSGv)T~M1쯢٘] :W4(&;-k+Zz9!:<_Tbӫ~R);~K'| 4d*̭ٚlba@1 62ta">_n:ЊhJ%mtݬdp <Č i@=3 v2)|8@0X~FY*4 H%ڋH&֟EbJF%:usKߛ%6V$$:{L(|8V8)S."Xr&zބ.C] ;Q E @ MFɄb+ͱ-)|_{A''W /<MUL&|\=S~E>C9fP?R)C.3Bُ-™x_ vC}E_?8 _xO 롼 a9di~1 d4(+^>2K6j៨.=J7&/#߼Jhl}Ld>caIp5z܀vHśX:>-y*:L D(2vDhvJ[$؋g066XV'Gr X@,]#9b?}o KC*j̪Fo̖<l!jM0W"~À4KGA1Fsi!RqpM~n o2H:jىeo]楩4z;-Hz` E ƌq#\!2ܝoqVJ`'ʪz}qP?cNn~MMIs{9¹`HZ82ve; ip}L)ٯ *=s$sQ >9V&aKzܪ|ɸq`}Rð/]Km*xNi GU*̊Sh6J;jv=LY&gJDA(euGLWRlCu=-Hm?ۑz !_7-;Q# ;oU{o[Ue[`\zˈs{,5oJ\Ľ[Q#o\ 75G|!SaHAcˡ$Ⱥ2ꣷڿ.oP#sUAHڼAk_ΜZ73YKT" 1(^.) ˃DX{Pl[zN2[CLM89KOLedjuQ^g]*6ӷ6]hzPXBOhRv!=RZôv/aqk&Bzsuay 71t*)ɣW¸bE\d6䖻K> (ME}M驺ZOz,"`׾台2=a70q%uJYq躷eǾe_ =qh_`prZ?7vdٕ*S~ o0 Qy\QX] Ux&b̥2XQjW;2ua;}5x {ir%ǕYuY!of@)Tu )'qdݛ%CBS~?V#f͔$ߎӎcy39ηlu0𦷐nj#Y #mզyә*ia^zY u%SvLclB"`Flkb|f)AEE,,m$27'GQ '߈K􊈋~l,KɏLy5+ylm†"'C}i1ĸ\;%C`<˶ڻ,w<֭|}T}i H !G|XVB հc}i7n[]SbQy0- /MkR}~7"XZK(I|E6@+>{P?HQ0<:tfq̧;ր3v0ޣl֨v@kҩt"S= D׼z\!gJm9 'G ɆY2SxdCjuqϪ%sLٰ̢"-THݫцɏvM`O(L+ae?.Ba/%x}r:`P47q/np-y^'Ewr" Qgw%U:gBV{۽{?DkfQw){Fw$D**j~7$/H~B|I):4OzPC|_>ulh%SfpuU%pQ' vʅ*;ڠzMԗXI "lu]郻P&b{τg,f*[=OǁT ]aMY Hn/ns'ZI2DďmNSXXuj2sfn,=X+UmΤ<+Χ1;^aeoƕ{Ә s3]9#iH E* a) ['&Bɥ9~ZȀi1 !7V4Qq6/+MIRпc|QcQY_mc#7+jaE5@$^'jHЂPїPR"`h +q4SMZsKÎI霢4XDH^QI'X5'(rU V 1|u0pQůBLQZUڌY϶: db1WB,$cH"qՌà#CJ*dD'Ç8[x2Ҕ }P#XF="PdȂMCV\?9nGuyd3BunHg%v4}61(XKa8uinڷPսd%0w)}x̃qe@oRp̋Y+ JB$+8zi|ʫkOy H[ DW $+8 &Fwo ;Gu8ok34J_TH[ Η9utZX, L>OPLZ$8HF#.ý#NH~ W\t"9!&5A" `6j&Ǹ63A2j4_MgsQE5kÐ`4'dX ,Hù k U52Af_M-u%+$:NK@Ha״ЍzW$A8N:`Ԗ="o0#]oj[guR8Ҷ2PdJ;ðP݅\,*N9L)U,F5q%!wWR(& +dM@..#!SZ-OEM81`!+ϝ7Y9|OnFǩ?h;L7j5Uݸ SiyD#NR<[W*\ksI,d1,u2#8Tǒl~EE[Pzkl$ elFz8OJ1k"Vd|_@Wx L>0)ń|ûW XABEmoŲ ⇄ mGi DZDȬ^xMGb<}m×BT=1--T8]ݤ,Jzmk+^zD~k3Zos83VU +IU("txɧe&R;ϥ>2 0g?pz y)$r KZDR䏊#.YX؋)({Ir:fLbOU Š&*ݞJϑ8g/q8r#߅li#~ODwOsRJl RxS6E~f[z" 51O?[<^yDT/%} 0QB h v9dwKog1;t VvgVR5Mh*d!aqR?d3Jzs}(jYSc'p;m71i37~}ۃIo3ɘէDGHVC`O P3[wil0%D̄O*k}Ǿ^^]}ẑ"EVg#=k^U>%eu v7qx $Ne%e±B{a2Vab#(_73,Lu qzv]\-dl/B(uӵ_up& O{jEHۅz~J""_iڢOⳭkgZilA ?Z͵y3܂4 s+å("k%o/V"{CڎFT"O1t_#~)4vzgj$''5]YIe9wE!88G%L3LW!Y\]Qo%O "3,'V}l6VܼۢsQzmh&o굧̔\IzͫHg@ {#xY Wa[* ܒ$H@=6u }v(-GKA8!GIA\~?F IaKtv9F]Cx׼ZWc 8NjrBL+>jxN|ŗKpnb 蓇y1Da"Q kҴOjHt-(k4bp,ekSla3-x x!?Hj:""J#4J))T5e]`]$FEScBNӕqD0"2aN>K.\c i2nqԲwwk)/S4F-Oi8)VU e}r$(MBZ`!/>R%%s\oN1](CA bǠW5')&q3۾9ܑd'+˽l$<͖ xK)RVۘWz^n{+j`v,;˱wqK,ڲのTGe].3 ^~gqm襰~z7(#I'ʥW'f\R:^i3Q舞^`)NpjB7 ژm埐 8\( C,5w$ vŔ&}?Qe;9f1vD\FeB5") 6Bs9+~#\siM ݴr*ER)RA앟R ZPT:Fbkvś6Ro:ML75$UyONhȸ<4G=c0R ?̼ TneId_9sX%F:HxEb[&wSž]*/yZZLLbj1i.EA໊i3kFetH{ $ZRcM& uo?V4wGdʑqLhHZGkܘ+~TmzҊtT}{+u$%ltJDD?˃8~ԑc=dN{&}Ζ;$Oe|VyKC4١W^qj"9I1W2cw4njվm(2""Dy݁0D֪,{. RN]9bLgťh2@wkstVoJ0R/P ` ^¼[/у˦bNg^ xfo٠2L)EK}nMފdU(S.M-wpjٶ~}{eVLs;zsMNjsjmcpRke>_ MA0UZ/#:<i+=eAEU-/ \ wDkFBΣ/AR!'.up'g2UJGUhZ6t.hV-la@g^w6m =ȓp5MfMed/QTfWSS(Rzf^.Xƙ >UPg8dfc ;8H_%l")FP {yDXEc I 1E}UK&aSIYM^] WB6D[_^AcW{Wu*jGvţ7?՗J0:uK.X>|ˎDsxдsˈYELVn}S(埍E;D%!GzІ5dc7vxZTpݘuk[|5aWѣ6cGȖMvDT H0d1sCvZ=',RR[SRI?I"*l 6|(E@J3j!asqZN1;g6InKH !*0>RIH0owuӁO>롉.wOſ=—nst 1SEI\GWer&abߛ;Sf<4&wG Luj,;njLBmՃr\; b,Tk&rPYo ~@@ɘ6懔]=U'gJ ;Nbne؍re0zyQ$q#ґ,WLCHgdb0vT}CIPb>x,X\. !ь0X͝ z}&&q7(je7w)#ӻEQ.Dnיyx"jo7)Fk^㚁>ُ<$슮#"}ǦDȑz1(B~pa/Ȳ~sh|z }woLnMO^9J8*ٴ&v7݆9% %ŭ9BS~C#$aw%K[;~W.|燍 7ժ0,flB8*LbDJq#+;NdO+Zy!TnU~W5GO,>DB@" $bU l3H[eLi${$ 1Zm:j~8ZE 5U&y끊+s vchqi Ă7F*+xwJK9n;P{5*Sm΋.38W.'U$ЮU+񟪓ZB>JIFKʶ.XGIW[xROm8.i.tY鋔L b}Ñ夁"F F.zTeasd0hfncx<`*/zL4[(ܼ:P!xP?uaK>bꤿkV eYr ~Gz37w6) %} Ůw˝R  -ۈc |!FCP%7h 4 OI/{^ g86 ڡduŸ"[p聯ϵ>-UORk#5 k9μ8~N8Hg)] ʼԐ|li89?<>AF;:j#SڔVq@/@ OmO7IH!aM6=4])SŧkFNy/xoҽ mKhv<O nn '5\odAs_h+51,7/Dn IRѱn690{ ӣ@X>OxT6qנM)Kr !S~jd.}4#LTUJ=|glIH/^iUUJW~1(]>Q™/P- _nݓAe/a^@IYwÌtm yyH\xZL.R{p6ֆٯ|غ QԀjm6:1ty(4ޞd"xuBW̞85ս^ y*a~3qR:ER-68Ч 8YW˱P6m?J`|j^X7)Jm:X%|V_l-)-| WI"!8?WXs䍓b围A;әc/ ~r;@'-_s-B2 Qj4nv3!4}(oY,`9?fa?f\"lSl:y? UZu  3f =;,ze/0Z^e "p8%=Ynqҩ3`LO6K%)I:lubjq_%U$۾c Z>}mO D9?)PBkʪt^R3¾0X$M(Q#.bFHM\W_kG}v]DyFƍ1Tǎb;9O7Q /i yQ h|{'?.Nc*t[0'hK p_K57x]u6ڔݔ}3opVƼ/a,i5 ɢ;@W[`%n Y\gKd\(]۷"%21K_$08!uX\PߘCUM&[Rvn9|K!e[Qxb:?e8"d% 'Gd5Ǿx#n71. g3VaG@zpv 4WhegkKN]ԁl# G.j6ZgW?!lF# a5 竰K{;˜m?c0ZJc^A >vS+X}x4 em"g).wL|Pƃ/n88ך^`B6X4Y({*̎V5S{! Tb蘐8SK$hTxo {ϻ*GXB`7Ɩ0zޱt:>绾{,0e0;_&/ޝ?Q6ǽ+'c.s}X`}q;bw#.\TC24NW(|B:-e07[H0 Rio{Ґ `G%o~7dx*0̈́eȌnXHaƒ2,v'(i^PG3;0 >!ձ@f=H>h|:m~]K:LQef 8y2&功JNoLЂ$;!3WB{tP |iw.R#>nT %)-) rinֻex| E+ByˤenTd_N@FyS!3sW'qMy.)f&y(![]扶kM?i$BvOCL_.ku8X&dYG KU[e]CZ&OM geeywN%NjD@ IF dEG Qk˺RWa3Z0?A*Ay*r$/1|'/q}&n ( z)͹OLYr ĕ5b)N0*}6Ƒ1eb? %l-o7b%i}4 >k'XWVMgJ3DtՕb4J% ca^ yYzWiDM9lfHVqAxJ^~x|ݞREt>-YMJW"&;';zfnZzӸ-ٷ7Lb}ӍX!Y=& i|g.[U`8 o2#BlDlt{(KK7`8 쮯0Τ Gr;`4?AjC4bxZx |/πv'rJED1(kѓb|61SW %]Xa&f9V`jzp'hGоnD26 fI՟hpL"Jb,4D%"- #6ux(%;X~de #KI/^gJl?6"[[隴45Z3s_md$pùefð?i%+wcy:C\{x#U>:d0jNS`"k֥nSuE-e"\H&,K?Md1uԫkQx|v<3郤ZƒVT fIR6^~uwˁ1w5klخzc"V}QpCI[#+iK~ߠQݷ 5rqbJiօwRF>eH?˜mLBEsYWjEu܊,Rx[ķ} >`MoO̭*47U,޸͎:\FL9:=kz"'IުԴ@gLZa;|x /pI`?*#0=īWwwX$@jŹްX2Mq?;]2rO<}fӐ{}HT+*̟ [茊qgc <ӿ1⒉V~d.MOa($A,gJIlTR NR&HS@Hz)/7ϱ;QG%>VG?%Sϓ4\wWra'rX:AH]*(}F7}}TCsoOHa܏- Żjx2s)2j K'WUU_:sZo'5}EGwA;+DJ׮!ʰŜ:'6#8xFJ& 8WR1FfX"+jy)-:.ju/C?a6Qpфrk8JS$k{]۟v#rp6 OcgP=^Msh\lŊ_9 ލ6PWtЬUNF| !X Z߃ㄇ7 Xhޤ1*ԕO){10?|{hfUG颰NOGÄrF4q|]Mi_k^gar0S)fe bhڭݣCwV Q`+mz7](}g{X*B`!f!& K긳K+Vpź::by0Vx^Hi\axsAT cJna9j{ #ڤ˨TX>ym`6@M[ck0<DhP` ͷ+%wgL+Dg1^Ɏ`#jC2"@#ΨgZPƃrC#:<ȪA<*t!/)|moUaP؄p. +Ww:^zN=>g("wik>FUSz(jR*nyI°bS s|!u圎Bcgp >@` A7M8JVpkݨ+_&O|젞-.~Αw + 6f9X@'G2iNg8y,fjij<1ɯt i-*y/3$A>ݹOU3x"ޱ9[4*2 M)͖[1ϭ dE.>#=qՌLLȃ(<(rNQ !/ݥ(v:߾L(e~尖:潺So4,m>_TJǿOMn%9mU?:H)M8y6lTFə{ sX6dg"W]9}ثN%Zᢌ;$XHUw25(]) Ka XUt΅!7Rā8[[Aa=B+ErnՀcލ̈&.RZ%IQ"atGȌ~ K׋u uP9+7k.U'a(=V""m CS cv͐krd}l_N࣡ۗcؔ=cw/L 7-RoP~++YR]H7@ZzXut"]Yj| >c;fm X `3ơ-tGnM]Ϥx<~Ҵ 騡>JD3߁k~ń#h "?f1j<ag* 1DH <VdR#ƨ&Ah`կ]9/cS9'RDZ=T>[;-l&M -ѷ|huwV[%f\=Ƅhs@H'/m҄Z+)FG3W4#o?!ہbQ]ٰDJ^E98z f7) O%Lݑë0JS).QJD\˾^ Az`JO{#_Xl+Dk E@eҢ4P@dZÙ[I>\ZAHƩK*mŤVneu-diɢ2v˳.r:c=z6FUl#^TX~䞡N[GwNe`?6 endstream endobj 150 0 obj << /Length1 1823 /Length2 12594 /Length3 0 /Length 13781 /Filter /FlateDecode >> stream xڵweT\k-அwwwZS\ A9oU=DIA(aob`adɫٱ03Hl,M)(DF K{;1# (])@;ӻ`<,j3] 3Ҽ;x8Y[`e`鏷#@`dg ag(ػ -vc $UՕTi88;O-j1a5qP W h^9=@A]'ϻwyq5a5m%q?`-(+wW3'{ۿ-@ &&777Fsg9_YX:읬W' /b\LYPr&@;g' T;A[;?1m68/_9%%9hgdgn28 T89!/W"wgc'fdnM-AG,mwsfv%UώA;F;/?x\n6{ۙھW >1w@NL.Lv.@i~[f@GĂO变/{3 ~r6r@N.@*pL-M@>,E3p-~_i}JMl<@3x&{{CP%bc`d oJ?-DXj{'[#Y:KXM,A&3\v6@ #3+ǧ5wG_4:;ؘRO&Y-9i;ۙ؛Zڙ>s<;;彷Mu pp*77/ `2d0?L&@.?{"CDv#;Gv0ɘҟP0YaU5Pqy#.{G? (=wb`c0|~}A|b__~V t,ڛY4LCQp3Ub h}XI% gPI&kQaڼn%VMݘ* # h0f/wkfǵND;{?M^%ꕷAͳ`8٠/u/Ow0bWh Cdz#3b 3o%Bb F^I?5j Sڡ!~c{d1cfۡC8#jkܤHsL0 /晬4ӷ#'51ȩ ^V-5+|!PF^dvhFnᥓ Ik5r@PՊXAguƉiwǔj)l™ʚʔ1 %|f1" b#~#&pL AtF{%wKf]֏K~;Ft;!U:H}z_ؗ1URVp &|St'&U/HՐ̒RXŃ1/[^Z><6 ҕ qJM)f0/JunOyISW0'k/صZ8Gwx9A&.LllޕFXO`TSq<<;4K*H=g/fc] Ghpgsl:ayjlL TNb 3՛qA'yLEhl˚گ08`Jl,ImK*eQ__sm65Gj3QȦpefjȰM+v?. ǐRcP&Dn$뀠E0_^7E!OOeYGRJfP}q8 >X"%Er>wk.%]!!REPƔ~Y5KJ 9.tjZSKS; p0&D 0Buo/j{;@5ʬ6<.3F%Xr:ᓵVR<99624:C!a yTOW;)Mfa܄1%Ą$r2-Rzf5htX^ C!nQ[5N-dzq1{<waW^# rd㷄lY<lEOM[aԵ**X:'ԟl78lnȍ|6gGmqB'Q'@Pp0{Y*ϑM?  vM]DG#K͖a) "++u njSMq.$щC!*wbޭ06 ѵusKӇ"p\U=4{pmKJmGsbR/W+riI YO.j'b(F=~j+6RoǮ }EwpIK05 r`p, 'yJO@aJuCqI>CWJ FH|+8U{`LewRs{쓾u۔u5و)~U^f ݫ'-׬P1S98j E>sbpxBZ.P!w14YP_ N!1o}+ocMOD SzSN?#aog㞾 KX'ds=s O+:Z2y~5M]L!%xȮܭ6q&8]{iOI*y#SZ^9&_dXʹ4LdC &+( %8(U]ϤGS]"~H`!+F>\d}(vWv/ wu-Euy4&m!@9ph/д ~ZK-~Az2Q8 =,n&0Af7j7*B(zMY21sDY8VO{s~+Ied`-PqfAwCK৖]hbRiYRv G4+hpй:F>u %y*U".4NY}Q DKGi5BZMK+f]CK" aXLٝrw!K)å~3X+쭙,ZJF2_m1%W5;ՏKARg]H]?kY቙q(@>dRZ=Ԓ5,igx ^JAS).Pvq`1ߒoqIxf]yw;-}HxjԻǡqW,~nnM &A񕷹ԍ,)q:ZJcVC>=:!Qܷx鳂q vsRz$x*۝:8D io+5F~t}<,>r1vkqcR"^E,nόMud[EE(KIduW{Z;P7$яEHCG))3ʼ:bjUt*=MmZZ#8b`]x E_95ƣ6FgGD^ql4Fʩ$j=˟AyO<f}K9rNCſLTQ̾`En"v0=U!Borƪ. .C4i W*?d1Phw:U!HcrLi`{,5E" F~&.b,cwW,nZM(/4gusWVW ON3Glwo{~I4 KZe)zNԧR~H,7[X i-2ҏF=`1Ls\fV|eލf%&;P{]$uVFSӂx'dGy/1D7݄+i6AԫZ;8&\XE(a`) 7vpGoæ?7Ih`]/꺯ZpeɸD~ 7v[׆mL#3gD?= m;gs# -p v.ꋈ'zKM {03jCfO܂II@uTA/6ͬ|-lܙ$wqEzp:-e`jhM5YC&ȓKI5--Lze[{ahJf`2CUBy2HezP>MCli)BH5D 6(XXʚ b^EU-y3NYGnyyO-}D 5, Og.x'l^Ϛ4>#̽hwwG+d~io,,9^hH9qvcȱLȀ'WIr%h.i ׯsL)μںI6:A NԶ$F7Oi2B clkjhv״6Agv5F\͝"J3%},G7rRKVefm!=v p0j/~ hόQGdǟ܍DJKyKm $\)bSȨ0xW~Gfp8Fm 2_ cvʉ)(N~ۚ8].aԚ6 k^JdP.~W>TtTHAa|+r 6е$t0uA먻ӗ꺒/'_>}b[1X2fojqC6_l[!H. װOuH"֓h5 XA|*{HUV81"NUEcCnn$O ȶX׈U$L 7Ȇw[ 2 fy+#뭵G"_y}T{7 5vZմ~m4 ID%#/.!O<9KN @ɍ7 htOC,(sH["_IH6bOM;.Z0Y `Pm O˷q.ϩ_T{J<$s7,<35>KPޘ{>(A٘W&jmZպ 1J,crun,$]Ƨhc8߅Xpзr*'rRK х| 2w6u|) rę?ر)^}QRA4v5L#Dm B0Ygt; n{ =kRfaJ|'`:$cznWcQ}T !">mfJz\.L߭r}$Xh<}A]oZɯ| cZC1pY3uwCƙ>GuA1U9^(WV@ z딆f_q[h1ֺmdXINvӐ0͐Pa>1IRཨR.8upkϽ{ՖXY6$`S%jjl~pM%O }á, ¿4!PbOۍ/꾪R;v[Б®]wOq,N[$N!J? =*t$h `+؟ػh84xw;>Gb&5_Kk[K;u<(G14}T {^3`D7鄪Jf3)KÎ>`uKLdHd jCύ8+։'<\ʊyø4Wbn@rz-6: gZҜwj#2J.AkFpa1- q`tZgDNZxz]rq*\ &t%PKцKׇ+;ĻC Ӈ1#"w1ԂsbPSqj*L@_C}zq i*%KG|kRUF?^A| uf4(fZ0I&$s- _%~ŠF͑c]>c5kؖj-1`d\8~Gʌ6cN%ojDxn>hp!ei@/iﷂ<"ȝ{k56DT *˔GZU NU;]E JlB2(Y$s9Zps1eMJt1-6%0 $3D؃ c$I:zkNhn^c8잤ߐIX5`iE{]) }fׄ{=NS' O\Aj 9rrPi~qpje'j$L2RJȋ=^pDrqIWůBw~|%H\1X(eX' @qGO%h 2zht]G2j?&0(:=&Jx: ^lV*k0?(ˊAd[fQFƯgUEor횂j8Z O ٽtA$`X G[mQ3g󩪦^:՞ui Sl~؏l%vSNJ-hNE<<*{媧b4:U (,I1{HppNTJW&Atj[eٛ8\P~hc~PtDlLxNU,[iyXgUO q7¨B|}pهPmZ9-e&Q}F[= Z \'4iSb![tjN(ׂ'ow[鉸(r soY4ެ5-d$5)ěg D8ySsߪ@iS;?A_q^xqh/l]JJ] ɿ\8ظܡ{z#2e2;|YܗS/11`? ~ Q f剋0M2޳cI]5L,2OI/[i'7il|oЉEϵAj7&BdDϱ|lT~#i-ePҎ| T?[Jwi8q$*f4""L#TB/)HuQ`Z 5(Tr`eDuu a"_MQ^c⣀_sd+33ELbҢ5*u9+/f* Bm ,$j%*_OIlmw$ʏw gH~&TT܀FvA86G9abwvKp0|1d xbl [3VZr[GKE[ڣ5~8b*ɝ0$Y?52jWG2Dva)itF@'IL y [@X$-Rg^=| CmC4&a按g!ꊍ鯎-}K|xI Dcj?#]{#*nXǴ9#`~Z%%=,/|r-( N 3^Z%y*4*bly_Qvr(ZM=?n"Ƨ^~f_uk'[bPZбy '|9sWtOBEjYqM0"kD pQOكܾ:ld |sFJl S5G0a}ێ셭lghU02_(o&ߴZ'n 8'/:@xGg%&R|(i+ah=~,E\'xhYalr*NlycȢw~Wͦ~FKž18mHwEp^|u]dƁpp8`)4#祒/ :tob}OhE뉍ovVkp5 uA[G&B);]BRs-`(YDJLqT~5v"qtl >p\ʡ|utlQdi3)/8ErU](_;-7$=d~4l,X]Nm֖<YFAA۝'nBu B MGشz-hכ{>X^MY;e; ej}ٯR!ylBT|͝ ?i,g $K^קN+1DM`a*t$F4BH>肇#v 0kn\w'/ې|-gÇ! X]Ysq@}30,Ԍu*CPak"gq-hvWZ]ʩX\EQwQb ݗT>婞UQ]H sot"nKx7;ȟKk(4DpƮ!JpQ Ɗ<~Ð' a7k`k]8ST9mU!s兿\Th94 Pq>,gH47=TW[s[s+Oz؛ޣl`׼`V7b'f/vF 4։e8rfRixWRyZJ` ԟ] ?^NU88ERh^>~@WA.Fݫ!Mh8>`hvsOv]LYSj ҨtS8UeUӯіq\QmIтک< +е{ВbSXܦ%5lK+ʖR,04:7,%/Ga/W]rꌃUnfsWf;Ȍm,ik9|rA] O13~Uې$8s{OF`^C_L,mJe㔴:շ%I1.tu <'9PYCRw(AIJteN#KR[Eڤ=4s=!-'vX'I6fu3b){H&`E:3q%YTo8fcrgTq,&=b9wz4%m.UW!bNMGC|?8%D O8,'/No5"YtmK"# XĚq*wK<"WdWķ伬!QxUTkd0|d!8 X'HͫSX*@ćS_lP.Wpc-iP0WAbyG8B/'J=X+agn"Cwgic(3Bo#n{er)W/K޽ϡXUAp9\'W);)i])> b# iqޒ?u1ߔ_IK Y4 ݏJT]us a<[^iލlS^&a Tg܂(ZZqxیݗh`j{=*G :IlI C1ybd endstream endobj 152 0 obj << /Length1 1712 /Length2 21170 /Length3 0 /Length 22262 /Filter /FlateDecode >> stream xڴcxdݶ6cum۶I:Tlc۶mض:g}V{pycEA bjk 9102lAN, ֦VFffv 1-H `fdafdefAHA@?)t2Rwm sK揋O 6z2dLl],F S,#@h Ff[3:P&RUPVaXjSSא(K) 5@1G7ÿ ":,L`-(T9@mdhh`hgO}W[+OcA@_@ruO+8Oa7@Jca<L:99; |T*svpCU'.jgez֞FcF gG^-_3Kk%LADQFRBMA@ btrso<qy^7; S1[?U;"m>9:3'@ 6(#_ ́Nft3`Yigk03vz[\<\'g+04qC?Ot-_J[_g@iL-` 4C`RuC?rI:[[+ifdcia[,Q hldbO8gK49w,XNfGӄOV `RTQUOc%25X98FFXdCgS?401l윝fdGbaf0`7do"'D.?^ߑ:՜lZNn``X>O%97oQQ[7Ovv37xɿNxg?[; hdk-{Dl94E%ljl'>x)Pп/V^W'TMeՖX5so"o,!2ɨWMJs*S>NИ8yb@LW޾Zm e 3&Ҩ_dv0;,]_.]JNJSaY.J큹^XϞ5%yCcGw}HɯWH%*RɧjG+}JNmW*ztv_%;ͣQZ9-"tS1kuMZZ5Ȇ}]A=VЎ_}^S_ha9r3JIꟙ;XmcLᥐP~Au~"S^ +Xvok zқ&V lӋBm] PUD%qDc[wilV~g%m ͈4o70̣3~*.їM# kq,נ&Qܠ,+ȵQ\NU k ʼA^J$h "4ڐѸz@"XW|rj" ]oqCr| RB(Os@U|LNC `Іٜ_#X=FYpǙvp>`;xZ YO&gMU-Ⱥ,N/b̺iO)_D>.O{-Nc&ULKhBXnLa>^,pxnC.V 2u]ACB`oMW jU6Q!`[S8=N}*"dQuaB%o!spżE jWG1m| *MXQ G)q[|5jSر:ǧ17 #/}ΥEY,j|I^%!"~8ܓ`}d!0N~)Zjzk{"%.?w'GH\Esc!<.Vs2hb9M1[m&4G}0Ѡ*F7ӟ$U#V8SLv:\4B&LLOQ*ǒG:*ǔ9Z%rG}#J hSy=7*78k!e]7 Jgw# Cr9MXST lڇM$R8l ftXz3v2;<=hbfo&"w2d! 1Eu{a`@'5,M6_x$ثi}J5niu2=yJp1ݍ*iTSd>V1uT}jָtS\yN_,\{BkDJF@u){QEA\MW@Ken,8ܧW7-ߦlF~ {&EsdP- To=6מĹs>TG]nskcff3=?}|"l@sʦ%̥SG+]b(;l׹sBQE关FXup]JԔr]+ۀ/L\^IU¢3#$79~W]א-ILc(Sgg5<ɑY#{R?i $MkI^JQ\9w7"h( Ғb6@ȟŝ$0kITcm: ﹵|Oӽ<_W׊AcW; 1nƕu[.դk-ML}+ŶߪUto=V`_m2T_BpM*?0>BYKr#~YtcC GQ7#f)ԯ,eM,νh3wMyA(ԴDk^0q][%϶[Auݑ,8s^顖X"IcǸDY}{P%?K7&QzsnZ\Ǘ:zo^Lb!?E`au)ӧ'$g4V"vEr&7/Կ2 A`auߎ|ݒ|6{LN4Czb]d񕃅|یdRDf,:P4MBݦ(.upͬo_l4_^V +5^ge<)3s{m?W/68BVD{rNC) h6@B @{z0"+0wGIvʠ /HG^r^A)9} =Ï 赩:-r^lom6}YE({e&E`cT78aKS*Ss :dLߪ4 m\|]y1I$ V=ֶ0K==-**QS?!4XiiJQǂf.G6B]{SY(duR_(B/HSGCΊ҉p#b\'SÁJm90_%7ҤlԠsoەbC^ r/[ȢO3+u 0 BG0R'(p(P'N1׺N;׍yތ"T% F4}ɄN7T`-IcF\t}Bp2}44ENPz4ĸVD)}ĝu&Wv/*a#Vq,@KZ K~~]j(Czg*yc8շ9' P3p5kg39D*GO5"C](0 =}^b;t7W^# s1yG <"ǝ 3M@dԶl.rZ~}drf!?/"\ܿ2eâ-(ڶ_ƷADlCr`EoR|( =Sۯ^&fLDbbI#jcZcY9e^՞Ԇ1c{CtR Ǎ3Tky(g ~J1sd9&6ݯ) mV(N%RpJZJ q( Jғ/kM{YU5LJ.TkժnV338!MF Ԭ=~'nWzG p9Z]^CR7dlp>ÇȟhxMCj ` ,iA܀f r@Crv*O5(49.BKި{(®c^g9|1sq*.5y " A_c ·@~WK G7ObTiS[h*?z%78f,G'"ހ.1SNuR ~ޜ -@YʹlVj~ݾ~W N:rB0|EJBHbG5=dEM_w*Wʖ>I#xu\FZfQ[n-XBAw^zk`f8_]&S~'< ]>z˂]],qBhZ@Y1 }.m 7IhpLIx:˙3\EԷۚ{6SØ'/ Qs`mG^Xcحq7#n3<䆳 1qFZ'ާL N8D˽ Wj Pk=ZR-i4j@".ؾMw}Aih%8HVz(1c!@O%w" fJ?\ecy bTinEI;-K}'fK6[U0P&~ UBt/c6lv9ᑜzu01f*~@tt0 ]pe_0="cJ{*2;k s~|v|:7k؅nyu뻜1Zvy\ D~:#-{mnI3@1"tVi3 z<9bOPIYtHfM#Cuo9 4AJ؀DQ24=? !f9b=,k '56 ]sH` D` xI=XaolJ#>};!b0e6(}W=$GK5x퐟֯_Sc7:3k׭}=B7oEqt+6VPV< T+8 "q} v+TbX˞kשK>sAX8溟+!;lZSs-NpWSsMT90) pZɴD%Zj3^U/4 eRIڳVgӃonڔ l(Z(TՖEƞ$w80jdk@A8D l˅*l}ݒg)`ODh绿QUyT'L2EQTyXZmQ |6L5 XN 7S}ĝꘔE2V@%gnR3o 8?鲸a~ݼE 9y n"_#R}!…xZݛTǚ-JgږH%O;~#ݔtܭ9Ñ`7)œ"Q}Xw>#t(' MP$c]%˴>k)Z4²Һ3LGvVK?nh+I)ΡtzHq԰jKOhsb'6ޠynt,ڳ ɹ :&ko -3,:~k-j*,&J Dp>IJ c 1  |p1Li BD8R:ʌfHp օN/80}e|E^m1Yv 4q+xc^A7h0j.`4ɍBdP C;1RsXSY^Z)1[m}OZ,nrW?<3=K?V6nPy ϛ9_O}!'iC%wZ^.FxDV0D/ -nv֣YQu:!};NWo2s6`8n}N9di)Z5}bcM/9.~4gf,=A$*gF> C j0ҥE Bu9هxثj$ vBA^gUCB잲ܪ Wqם VU4K4C2"Oq6"M~pVJ-cQ1Pk n}i4fc2kE$~@BdV{_f6 g\f .sfç%I̷3ynI؆\B){TFu{q3aX ]V[}ܵqoY}r6fP P wk\(ܩ@GBN,N?!E9LyXŽ[ ~6BLcON[eWIo ᗬbŪ! >&B7YIG!?H^螨%R+=E-XٰwVd줻3ʋ"+Vip<E2 ߟ!9}:1=o`wG$oF>bRa&4?ϳ|]6*8*(< l8z+lC-mN C~WxnR#~,}L8j{E; @o~z2æ,)/4=~>B3 -wϚ/ 'CQlm ˢQ@n^Ay([7;]N3 eTApjs7ap nro! ?.eAͲZ{R*Uwx*__Re|z׋6e7Cfw0Y3~SQ5%)ǼDV{CH}$W$?C;[PfYuT=Y @4_ujx8;! #GCY;gH4vUj:>0|I1lsؿ1ާyX%7IL8- l\&l%V6PE$*31(a{=HO[v׸tJFE`wЄ8w/>EJ~,ؘ G{UϬ{ѣ%;z>ޅTm)%<|"[4TxKKK#VfRh6gSH"b9Q N-Fvœ_RJO>;cuRPdƄ8ո^!`D8r5f2-vvBY8$h_E`rNlìdj!E2Mè""n_0{/c Fyf+G lq9^wfݪ5ĻX6!7; X&z=WE^/C$SoT4L:'&>c%Ltl 1V֎"WWѸ6<kk^ Z>(f\N2) knlGܖ V ~N6g^ph-@4J::HJ  l뚵VVSlZZW֣2inUɾ!/0G#Kl!`0q)1љ> A})w" O9KV69wznыsKn72M͋~[١6Lϲ^p+|<]30g'EiD۾Tl5WN&Yׅ$N/VM%٧1иgkCڝr)Yb.@h5B rX/˥Ѫ.x-&>]1ӇGnXY";{&Ɗ*3gse WDSZ5N̘bMe؈t]-.!"3ҡȸ4٣IM(cH3^Z,p,gr=m|a3}wN+=E{o n=-7ޟiqFqs*I&[a~=+]z&il(9]{կ{y[gs82s"(,kf/( N\L¾uyH&szŕ꒴rcN1dUK^,G(>˫EI^jra xO&Sƴ-2(ddtsI]V*@x}Xٱ ) ?U2י JUCž~hsM݇oV^!3h)t5%`W 0 ѤXu`8M͸m}w2ծh|9F66?Y1#܄c ɿO5ȖڊPyfoͰmK7{lWI֟ †9?*l'Oa6IJ;&wR$oIhՕ 4VӸ|/E-Vӟ>l<6קJ?( cONEKSX(2do<v925'=מfۈ7ty O"mcKC"Tzr37Y!ZgE Oq'۱H(B:JF=&IS^/ xiQEBKc࡭cEʊzp]P^".<2 f*wGA]?)V[^λgpE_l"A[bt\jl0 EJwnk&X% ZV"9.$:O=vCokp.9myZ=XWH]HgP-TzD皴8r0l.mNc/y jO$q|'X/Ʋ~؄e=Ô [M9 yXRÃYce\mVWH( l0w8581jGJGm[्Y_o#X.6pBm OȰ_C + Q5^Xq$-s0龁#5៣֑ z;Jg Z&d*9Yy6R_DR?3ܽ,u{/ l"H&y͔8ץP*?7 9-FIxnFSL, 9hV젒]t⡟.RuӬG`L$ͭT@w]K({7nĔZ6wf@B W\apԝʛObMye[%Y]^Bž6(Q])G#MqLCPEwrQ+ jl(65kar]31d]T^ÂqU o)= 1+~o'0O[ øG~]3Cn M`Bpˮ3u%ġGpa>g>eZzF+"{lO u"[`+ NUrz(,N7jB~P #C:BsM4Du[20Xnr AruU"guv%RgǴϥ .6;MLZF}>1ە:J_X 8AOh=hxői2 F؜J@shcRo=8l 4(_.±$-N rl "w\كYLjYHDڭ2e} JZv iQ`/HD8gXI0k54/~B pxBgCZRJ "A4Ͻҩּ݁'9u^p^tцRfv6d3I6AҼxx8"aD9+KMox4'-8mtج_;Eӑbj3oZ7GdW.:)bmr_߽1[底 }u:7HFE51d5?X`7βsl(5lR6TWזMg-عR5a#&p8K.;DOmAbt!A $aDC/ٌ.;zV1wyVqaax#@q.=!(ρz8͗9'=`OrT-l0y!.pet-n!w)6RCSa zNrf?D)>z&d7f]:_|h?.d5o>@ `mD`r坢UE9qiUT1i2*L31.si' !xɾUޟpΉxxјlb|ȫgO6EzWmdjeIAlJV;FZ!\ZLvP_rROEmBӤAb^@T@(Թe.fS+A=8qKphe3l-*]&6piiSy73b%B$tY8ӔG= a2G{^ns5 o".)K; 2^/-5 *᳾2""oM6aFPߛˆx]eGĿpb&pG ;.)(ulJ-dLo{b%j8(D`d9NW UbDMt|? )P6;RF̗ [M/cAL^v+K/}Mf Q[2'% Qm?豻J""c#t:"g @*M=4JDw:,?{YfFK_!E/1*OL \:qXz xnk{dLx󋵗3ܟT5+ G̔RB,'Af|g8Gm5.:ڲ/@F>hqJe;&2;tdt0"4ֱEʓM- f$%a;0anĥy:*/_˴IPd){p43sp)JZժr&}F+廻&WM?%Z>JuA]f1|,-: 3 ֯A,3LH"8cy!XxǼ-g2!qC]V|ZW^BHCj!eK49#"y+oY>" E# !Eɱk^0bC"\9K:(PeܯB1^6XH C\y<"#;]$0A?SpEzo%l;F)|" 5DfRk%pJ܋"j#bNVq9]3[ua@㚶v9q5|r1CVbLsk)y$b Lt )%YQI05%\,6U@Su U5≉SjB4%x {SZK4AR0?(TO`{%ғG򣧍7qO'RIY7P D wɏ3bgWAӏ-m m' .5Mb\<6T1cLJ'{#h8?DϏRDtW<8희Ə }K/yVrH99ڸRG&Yu}kfk0&H̞n$]}=]O~3pʊxwNs"njlZaPz)V"s/+t!٤;pFji:. M#޻G{H]wJ(m:jpk⦥IwHPJ}?nChXQrIue6RY̊4rQpO#h'uY9<-r&i~ɰ Y9yBn2X{" M./u˰\+Xw acAW2:^V:)~aK"pVYD>-}!<ƚ]0tEն}X10rrreqluI睝_+u>):pG(D> I4atp3|d狿m|޸7m̞?RQT P3d#svO*33N1Dq%d?X;:쪴wF-YɢW#X5 do˃_Oz *ο ~;}moMqF^auR;k ^dJ!#i5/+=*7u\u#ƥ$'0洛齺5Ҟ`%v!~Dۯd8a;f9czXNDPie[j؇ӛ̥4^XMPs׾_j m{a:lVY[lwe8gS1״Gt.]&ɵ6I;;?K( . C}k>;9oVЖXۧ -_KΩ }Dbq܀eKg QF30pDWwFձ*A^g(Pv%f&)WQZFV1{uyk\H~- 1G 0kk/NG}>UlI!̄MGQnn,4 PcBQO\ZNǼ$)ze([&1Jq|LP7hN@sj>]5MU~z j+*wa(XӵEG /dVPPEMv? M4m6fvlﻴ+nyj͉ǭ3c">9FG6`E"[0v튌bc49eHYX+]"b'/e9,Ⱥ* Lʨ)W?c2 eH̭ J*C C[¤ m?c8m81=}>=LiNLϴ1qbMw:1zTR+b!Vdfe\i %bta96liQXa[OR\:`Uqs0c~bkDO;qθN=s06,ҽ+1M_v$vqS7)PȽhc+[gzfIaqSZ3jѐ)%=:#o:(k`?1yڞEWRDOE;:+UfSvbtC72P7әy1,0$ip`Kp3`s fTu!_g5h( xQQ@ecLrW3~~7i9x< Ϙo_Ig•;8C/TJk"+/  g 5Id|M˸$x䀇ҞUĽ Y(yŰލӠU@v1W}ܿ>6*Sec7%'zܚY@㛜G増oG[ I3}I.}kN4zC>^SXp=e`IhN4ҍyQmsыUd:?݇v) h\6Sw 5HE'NBLq#TJ(/C\ S׃s6|H곲`*X26ZC#V) e. ~(wΩI[,cS"*J vKܭ4O -s·a(M@rWt]wɫ~{sLnt!#fS r Vd`J*JF7c/lƭxnXj dOhQJq e"9TM'Hs:m"]{+쒎ĪrJ# XԶd #uS;&; tcw~Z^c{UW* mcg-sZSdDi x75Jy؍!'i0Np#VW>X'~9.8}k||Ŵicu7xClI>L*}E` BjHj޵>29,jmk<%c1}kkV0X9-`LÄ?U”EdכaC=^)-޲_; ~\s(/ʒ7zߎ< uUI 9  eԯX_VdpQcB~U\Q3Wؕdf^0A:ǏbΥ{+AB7 (]qo>`{4rj֮O'jWr${# >whbBP,{=C]pk) ,8z~k 29%*Rb* Nf:~Xi=l [|+ 6~k7 K̯0CJ:3cFWnnG>AeZ;۪wef VGYb -wGƸmKר uMs&}Y^P{YHG<﹩Y-8TpIНYtlXW.fZoH->3iܙ`*qt'7"Gj(=KY-_=Qۛ'bi(˂=h.ԚGm p Ojf;R!܎AHFLMZd@Xrl!op.XU81_[C_ Y2 LQ`a8hIjJUjDzZ5*]hvKwɞ"`G)"We2,[ *O%ӻuF4Yǐ0N3Ieș\0ث;*+rLj"0F!`Jc~$70Q% lm)J Wbj;I"[H}d<攗07%D)Rp!;*EC8GõT-FAZã!$W[5u_&[£¦CwhEԞfR2ş saܦ&?%O_yef4CpyHi`^9n(z^\Y4Yx4# QR;/u!%ښb(@Dk󁼯]qp7Vllѫ6l$e{ F>I-`~Er5DQ{#m1Ꮤ1Rx:P!&[<.[Mg;6DUl~wث<&Zy&N "&|q;a-6ܲCV#`Fhfoq^ОJ07a3(:T2/˼΂7=auqZ+@`S-cXuTF]a͋h rǐQ&b%p}!*ORҗF¤1a/ExVy/u8ɿK;-!ݜge~qSF ȃA9$_U~2 6屰22i\Oq\? RM06ZDݧ3n_Pc|2 MF{z*"|I'[v?1{dK>vβ\(^˗C}Ė#}J6Z!y;5!֧/ƝC tq _c.2K{ʍp G ?2 }KbmOsZ |wb g/8zj M K#bJ8Q/r^IC]m[&{ cRgo7t`V䏄s"/r߾f!`Q%:dfp`Y["Vn1խXSZ+!:X AER]ƌx,[[\>WRsJZҜDoz׹"䒲UD46ĚS7-K&yzIFeyoA۵4bd|XR'Ѻ3jGy{2Y嶯A8Hi7/MiF߻TZ8U7g]Zyz_|zprMTTV^&1G,kCeWk}bq Q] Pw1>#[Qyhnj_lGJ~ 8wu63%oP:c­+Jg4w+ ,í1oxb="%VHOl 3-rUxc"& ̿:P?GueUeB8ާ/#L #+$͂ώVV"'x.rMx>^}9&lִ)ѓmaxkoc ~D3ݱ,LvC…qMh(L2!)꼀~uFŌ>ͧ][JUPD_[g)%9KLʵף (O+Gw'RInkiYL* R)J3K6jCCIv,R˥w#jB݄G֐~ý7ɬc7ҭMWxk"5\7dR h\R->*k3tشl?]nD'deZ۠i 5|5o3+:S>d0ly?AF endstream endobj 154 0 obj << /Length1 2828 /Length2 29794 /Length3 0 /Length 31381 /Filter /FlateDecode >> stream xڴuX>ҍݝ! 0 %ҍ4Hw#!ݍH(9G Zku{CK*iʁ lBeUh`bAvC@`'sPYBCyXxTsm/g 'vZB@':D;Rl%sK{=`dPbSa=Fښ;Xm@GKVS M v?.Z:,IUmY @^GK_m @U]{,'98@WÍ t [YÃvasv-v@?]qs +E(,N߃r:B!!;ÿ@5wg2:;YB!7W?6/Њ_i75TrOSCgfg+f6=mK+@559cSTUfU6 O|2Vpqq8M*d% vtvE- [+o̮zTh po@OK[ff ~>`g+d ~7ߎF+%͂OvE'k0@_f(٨]jvrXQUhC0gO-97UsG Jq ]o `Gs\@@+ueVC[_]L:wmG`#-흀>\@ *ov5iuo'Llrp]\̽P9} ᄶF9!!g7{1x쒿MB|v?. e A?']+Av?AՕ hu?Z]VWAP.AhAP.:˛?Er rpv5stbAd`h 'tVPV`'')4_E~ߺ;msǿ@a r+o7?E~w9tlL^ζ@"6_J//$8bPu'4O)^h.'#s/JPHCs 79>?>tv@z@Etvp3 ndoᯢP_rB kPz[_ ZnZW%o- jrAŁ Z/L@1R;+lYAC7!ڡ? z-%aJ UFzsuBO D]^[ ڥ5N# $SJBXΘ !ۦfSJhC_:eOG-3Jvw"<_[&S `Df&꾨Gp&5W:2̘ZV*! P=Dpٮwv;QӛJQoM׎aΏE%v/S} +QqDmQM( zC ^dpia%-~ÉMN$VKbU= ,?"~m=|.ں+S!Տ-3k Ơ4bC*ڒJ,7UJ+;qnWfQY\2):{$@6c8ɛ>svw(X%q+Xw"`IK nd*E3j,04!kjp1.GD+g:qs"SG z'U:iOVnE/'"<^BMN;BCTx[S}snMed)i ķwQ' {'8+8ktekft\ʯ Rrs:Wg AKN@L'Pʉ&"#c4$ 7ĥWT _li*lR.ˑ}n e}SKZoo^",(UQ%#]0$ǵָ:ei4ƽkW)R AVK͂"C]+Dt*/=$}]?Sj/K$q镓FվDFRd,={S%ɓ.Xw:@]fus c'`sc=N Tg+YF:/S96wUJM 0fcR^ lTG gbsS_JvYvc[~%:IbuMW}WۻH6϶9XK8v%҅]KEl fj-~.YlAT1=VL;W\'6"1Z5]53HNrjMdgZ3h7'!O];sJCp:B۠a쐹KatA/_)!3{mGhWGm\eI:> ̩#v~͓!^!41zB:!^{'+X\>f5}H l^rTj((]u9*|;|Rl?V)_td$үZWYMJ=1C8j?4r"b!-b"E*~.eVC a4"]l+. (S5\Fs~n*B_XNCK%-v`jy!ZQEWƁ_ Ov)w?3vE[10zV}F {=4v4R>URT/ʲQ?l@#H}8ͪ[e(TDN Ƣr(l^p?bC2/xwd\K>;Z1 פ֐[tJduFX|e'JP0C7;f,?|5fWL# g*;Lrvݽ+یs2Ɖ؀fDR=V߫ )>Y5zO^%Ӱk0J4ތCɧ~(lсI;9UX[\quc,F~Y=7%_H_M+̄ke"|?n;N ܛ@<릮Y=95bc۶ S~Ҧdh3\^xL*{mqT?F0L,eeup$N|\OG@ Vk,*Y __0BX6kOy' eJrWDiHFZP! k ga&+w}gkl,'3!whxǸ1$#ՆL"LaS}={KxH¹I]/(4ΒT?zI՞=!M[5Hp{uoi`~aݥ9IѧӕA{L!BAWqbz.i閵i7B;Fm)?-W]g.ݙ6X\?p2l3h ~D7rC+_e#8myKx(viרҹcVD!t'['RlA>t :dYt"9޷M=ֲv<~/Ü߼ T֧ٓ`u)ensLqܲ`^O) ~l򠾁6eΘ+AzÀj͉cOD(ܯbu| b{OŊ^8r˗O2oJ"ug]T%^9)6)Ӵ~m.lH 0}N{9GdeJ~ 'gĉ3pZ KKbNVO@{!mJGRR߫gIvCl]g'YV匇5 ^B)HxTy]>tR:y:˛m+2'R4o\JN4Z#Nۭ~P͇^8.wvIy^ʽ T!.УN[Ƚwg;,bmJA޲>Fr]#E)y-N2zȺl` _^n5A Qzpܐ=' u˒}7勏Οa_H"10<++r+ifvt\KA0 =7Qkq:vb +z:U44w:-B=.FT5 Od-%uv 6,#<{j4V]l>9/y:_g~"u sb50DmC+Zv*F xCltdq"Eg>Ƌ{)lȗR 8FD]ϓ9!B\(WY=GX ؅+4sԉφ}^ ]1>%^ `ҡ۫p_YRV1̇nюźЗ<5l/8'*-]*/#x_aql ,<Zӄ%9 Ȁx|!BM4ECs/&ʃ{}g"dقiㄛk:lgxcJ$o#R''vtۡ.XXH: d,]h@#.Dܾ/"{j۶WgS>!+wCQXwG\Βx|veW8Dq:64.h:|  _ms=ZXDkP~[ 劭bs&#WА^mjZd}/i}2}uGvm/fsՒťqf8w6#N 3C-uMdݬ%YՂVο;YmW9ثc1v7iiњqU}ײ~,h^A+}cs۱E"" tjy'NTFB$>FP}H(k`DdL"+D;J<(iBfMN`;Wɸ~t&V-[?ݼm-,+"n23%K$G㣚|M\%sDD4{bK>\wj =21V[\r`Q? 4]9>\"" Y4[fawlssSe l}?I 髏Ee]\Ū ǽ ! at0׈!kB3!UI@YV~dO ;aŎ&Űjs u/ml~&L~I|O@tZ-ARowT0\OF3QkMN&03n2nIU~tT| 'E0_K̇0Q#)ES#SBէnBّTDLkti.X_^Hq ۃ"wI@:'ٕ J//GT%!1Y\$urC+,CiimV)>bB Vݚ6lȊJ Jp"=^j.ifSٛ uUO-%CD/WAXhK.=4bnvFZbر:(\”qvkeClt8YCQy,Myqj sr: *S.m D~G;f&y"%\v̰'.G-n`n=cp$6E!bi7p\;L\/)JmL'ULxjKfb^ځʞTc#m8%R^ #yy[t!֯9'ıH-qp _! ~OX("ť;<1hEPtUk_p#נa[vtm6J$,y:ĵO>6S0u_/2Ki'NLS[T9ugJm1GG}ޓ\> d^r1袽p=z=T<wrYWڪ`W`VELx 26Fm4uj\P4RXȠ8Æf'վ`U汤pJI&!LΈn$)ʢQ.1L&f"NՄEA2l ; rnހFpLDU3/:)79X];5m )P&k#FS.5T)*o2{+L!4> Nj1pJĭQ^R.G[,=w8X *N $aD u5DOMnCy mF{#QԗSXʾE` LDbj"3}a+E*x;fEޡ8.8=*Pb ^%kQ_ױ| HNOt<B9Hyey+xa7r+dj`mOa}>t$p%Yf\y'YC!qGBe^RZHi}OcYKIHHǛX Xf6ַ |8PRN-ڲ~tN8ڇzN{A}9Ku =M3+2DNfuW^hÜ.܌0ycpN [$F~$ zbD g K6ֆړ]9e,r>2HL C R ;}]_KPlb/;T$T_T0_:t}|~Pa+(HGn,;$#= "syPiɀ~{~etOm+6:7?dB|TTo[.+C2(KZ5O/eatS>q>4Ɨ06i/KV7' g윴E\N8#0@&(_Cp|bה@,3Zet}0/ZDjmf}b~2R(}U=֛Q{6iH|wybuOysX+KPD߭ :.A,9T0 ۷N p-ˏVB5#R 'a?i> ]wTs41ڧ*ojdwg"mV0'H|{VyE3Oqθ2j$>+"K!ᙬvGu`NzG4ZI<*1~P"į2S1ŞˋӑŢ3iyu{+ LF(VnX3ekS˵yT^zZZ5RJLWwX8RR=I[o7Han)eDwW0\kEcq+T6<NӚǮ)ߏcv[ <ԑq5G#KXS.=8Mn2Lk4s9)nNuB*Bri\tR5}@3ށAΒ$S?S6?━fnvL UeǚpCSͮ9a"l,gT~_+m@om $(n0XHEWsRjUM`91AѨx-67ЍqˏC1n%*IHZHZX9}|vBtT<Uׇ>|1傮U]Cs3ܣGv,睇!J1 5VJWG}` Mx֛\2,ղ'j'KVm>0\V=}vZ`cv;h۽m9a nNV(g&9Z v&GT8VuՋ<~Rf Iȇ>-x!<[~R'\$p}?[Nj6棌fr\]]LdNvMb6%uYl,8J?˵B KMM9Q':~Xf/&k0Hr|!htñI @A=!=LTKp6IW-駕b] z…Mx篛uYakJBtc1ּ:~A5=YT2.<U2!Kwq/Ӯ4G {]WdpVC=qJ\3i$$u"$ݫ(->gU,#NiE2#OKl&1F}k?%]0Eb,R#J)sE&a3d}>PŨy3듃*F)"}&n.6<<'~,OOYq * ^$@둎5ͨuD_!-AA[<7_b&WkSZnsRY' q|YGA!*V)s<40Xò5oUyGvE?Aޖ"ؔMg9ڠgQ~lGŗ2aMЩh8zѨ\^f &msckɩ`8<3$kd[=}ZLKJ_#k]皈~,yX녈5^FܬOz9EŽܔ[ S<,zj%xI^:QY^}nF%eɬ k^(dd >ө7v[݋ rn# 5y5Fux1eýjٚw蒭qؼ3Jt>au(hVa/ R\%t}vu%Dc|Pƾ;cu19<0\qrJ B|͸#Qԁuqn)J+nSg1X:O$DB Eo26ꮨ<̋Az\U}FHbʌAkhˬBɴ=maRI8ˍ-~ζ m]]x 'D{c Q Îy{^pDfKq;ъ{'π22#LYUŵhśaS)0yОz"ϓ'"ȏ$i,V҃T +eihSyio_b8 ⎠xPvǐ`@Tr8(s{.b1I[/w7 `odH洑cyRXةLelZ!}hSIu u&glGP1 Ut \k2'wt[nb1+ҕ^eJ0hy_e{${<79TMF+ "u3̚G]*`(5K 8/HBqSeSiFF8zy,w ;׋ϭ#Nڡ՘ a?b%#{$SxAy^2N4=w[jr Š8?}.WB߆1j-= _(-I 0ՒX|FGGlD _`R*ks&u/L$o:5C͚:-˔Vj:v'AR:9"UW᯻4lI,=啌38o >oI֏^{ MF xc8`;uu! tp%=xv$2,(Vd^>:\^Mrĉ,zPhLm]=FV~ RQkXø\pzJO_G˹YC؟dXA(f,nwCr}ہ3w> Ӥe#K?,6h\( DoK%G_r1qNH[I}WfE@}<ϬTy~`G-gڮ0i(b3:\Vʣ,p\lh)*D$|v~N3:-FRYW,[cсexϹqmG퇶zq?c^|Ah`˔Zok?HWq=me˒̠F|nꎍFxWgvb־t!9MGb1EWL0/j "FBHzLCRCz#M֑Ѿo:SAcL˺Wܝ>qKҍ坳%;{\Ͼ-ſAMd&?NǼ _RtLN VL'Xf +EPW{u.K\,26e?ZJ8\;Q,NL h6NbEI.DŮ8T`2GG5"cw>Fq^}~U5{+WbIFd..<G_18"u#膷̑KB6F*~Aַ{Sӈ}Ig5+ [S瀠sĬ浭Σϯa=`C\H:w:8n(S-n5 mqWFA>ʳS#0kLE}y5NYV'ȋaXjw_װj۶m۶m۶mݵm۶mMB&ɊUeȃdn(r0nƢ=E,oߢE0g)!fhx6/= \92gpS Se, 5ܬUB2>xdEC*k33§qW1Vq}[+53 \@1E'eb}7E"Ȉ{LxoK\=lsOrƐs!AdZIkMF9mzD1wK")Ifܞ,a+AqOgZ?hl!ukZgJbUmM3c!T$|sl8[N.S 8QN9szW{0bn7}a]^]Y'EFx Ks:Dݹ@ܝo%"j*ȭZSUڍR"]Ξ>k9> v;h:?[[Hv >qG-gyKpʅYWRSW0K븾;~ZIӎ2*,R Ĕb`4721 QFB>t\~CYh$[4؝MrQѡ:O娐Dy Va4ԲE zfH*s*m0ȧB\]B%dt|%{5LAܑ5F7&[wfyoP"m XVTD"p34YK0'[1Mv#:^ Xi_գBNv>PŧԉO-k%QEvqN,v^uaFX( 4vtN2KcжK:wo#d>%X 'b_kivGCX[] ĿJo6cxݑbT\R˰ 6i&|2p{,FWc()dØ|4F5@}'C]Ge`0qi>!$ g/y '[6HGQ&2Kƺ&"{Lkܸ)]>4on{ha,ɵ5r}ɛ)҅>Qr l5ÚPJ+n(+MYXD@:?v|t4KhmqI|I? y6\~ցil66#5$w RǶ4꿺pmz|QH^j $uAI7.uycѫ]hуERɯݥ-d^^8̀TOwC}`}Qԭf8ͨ^U!a)XMa ѐ c`R:EgIHGkav d|im6(5h/0EF=Ȑ}#tPQBrUΤp8M9.wh"@;ϲkq+# rQ㏙Y4NABSu;$*^$Z:Ry) *UFAp [mOzƓ0M('.HKؼK\曜\+46?m k VxrD2REW?Aw옒Նtga$H dnhf\Ul%D<9l YP&qtA FIC黔9 ̛~YWJ.BKD'y/2 ^P8N`G(H3+IBh[|IBthGWeT`}ɇ!| `r(}X8%i]d|Pq3e%+C n7dZ)t+Ħ@KE㞝:Rz Ke7ecgI-u7WHFg}Q[T2$Ϯ**7*fQBQ(>-9+[.({WEBTuoEq Mh˂R/)໧]:K=x\RXr&Z]gP3+$ fp$r\1s$Wim*2RD]mᙫb_n5Z8SLMje{*Y(g;P)Y88ޕFU}&پmj6/_5;H:{X2)Qf-L/)AD-4HJY)4B3tLDޅ'UpĒm}|x|"DieB`ʥ{&ױdIH`INOZ4=!O!#PU9)JZcv(K$(]%0JG :i|۽IooqTKKoj-"HF6'ڛ|fsjk%FHl1$S^gl}Q|(Ux ZPv/M6, m ܺ 笏CmɞZ0 fћ%>h Llbk:D"~/Ko:XSm3& d-\'XN mmj^Db?B~7Sшi R(=,W3;Q 'K:ån dC4&oor׫L3c7+ebb>]pgY9i1?9bMALFT%2U~mݴ? 2G{c'˫ٛ{l*~+VŹXc8{eQ7v"QW^ݑ]kt3i~_\o?roi 8KA%щ,Ui򡻷!&8Yf;EL650TB5&tj6-d`ll^k7p+C5'"2];+^2Kb̰ Ӭ8{̑s|RT.=<wQ/o~M_mzp۫#^SHsaǐ::9@M(cIQ(`DMk*WԉdŅ%, n@E>Y&@;KWL;IU5rCluȥuXPsAď- D)`ỤS$86Ӏkq͟uz/Kǽ䓟sk\4O31]#MPʲI#Mvm9Hz:rra|{{:`MVdz*ͱ;ݐ4C֙@dL!㕯B! ?e[!^ey cδh}WnEOQjO})][裞JѣiclA/gDŽ#0iG} 噧i\-8{k 9e8x2$+)ྯ~Ri>WlUN7W;:u0c2p&Z.bB) ip#g' ݻ1MӰ{I+ hU7F$7 gViEƀ$z|Y6[7gyeozme/FDdJ|0VvYM]7KTԫjytScd;qŠ@Qeߝ(jB(5Kw@j$F9H )Kw4h:3FK-&hO&(L)|w8n,MDx7L4(5@ .V);ۉWwt!J)*nLiV'KBKYtó.eh+<#T8x|/k怮(j8VΫ?~ 9@aɄZq#] <6PQ5-LQP?W2ElOPulxݏ1;m<k5qG=ՅXu"K7X< N< ߩȥw[k ngWуk{)NQ; 81onceJo(=ELeٜ]S(y3vccRtK y꼠yhW-zC~ w2ɝ/pp '{)\xPyG5]$Y;Wڌr sN9!5:ׁȇJk_j]RU^" Lfɂ`*|JuqCg,Re?Mx{jnȧ\XǑ]+.%оrz-GA"11%J܆!Iw9pp s[L aW~9K[$tL0d $֡NݛFeqߦ]bIe]vnn/t&`:&, ХTO̽puw2=`pQoAIXsU*(qܘ7eH,5֔"2KT-edOXX܅(WS,'f0u Dtwd|4WJYC9%.s1?{Աy@!&ؐtm=x.Xp kNi"rIl,<^sYzxQ(4 ;M}.ݒne#qaRGXb\]%un5Ddۚ|6S%㍬QBÉS@'{ .lʋFNlF .@nȷճ;$/j(>kuX/\2eȧ&xUuqSR#nW& ȎD:17<2Q^! ̲#C n俬NME8Ѥ\k#먂:PSˍ[p=U_?WA35nj &O:GcC:>ټTzg> XhLSӛ,I|yQ]*2 'Yz\vv0 qQ*r׈e,eGFX0`wև(F\y!`n@+ .Pw-jS5Z/ FO@16QRbޗ{m#"bیSɻx*}YާP@cěwř60,/Q fuqPX֠Df#Fwfz,q󊈱 (^m_PyN?&(hҌ>_ 3Q<Td)Zos$lF9M/_*׈ض&Jڶ"*Nߡͷf7;f3F$oo}[ۈE/,Q_QcGbl!9;Tfk :>!iL ?Ͱ1NQ"8Ր^]mW.M 7؈l\enx׀ֿ쯫 gaTyvL q}n )r_m q%~~摥bR9q4*Nn[='E;HoTK=3գN)RM[!HYDQY8@&xrW Tk^wq?eP8/o~4|H`Z 09שAC)vEe+!Gͱ[O376#~ h*@le/ f]><+" cQZE^NgdG`ڜ%_$9 fZV g~N\.N \NJ$B  "[rlK~4A1/NINWہ p֭̏\7 8j+i0W_0FZ5 o^5_m~ICYcOM.8Nk͉ }W^Vϻ>N6Ct 7HŘyx-Nq{f?g&-#q WznNi]hh }62>}CāVLd ]#TYٽ`'pHa$g} 7t wcߗx]_('wޠL7BYXefb6+x?b)ռ KQ'y<0N% jERGAz%#SQMaux9XMLeхX6TQd(lmCB$ŧ!cNu{%hC}7RBYf_ #yZC(؃K'(0ry.zP% ! ;e7͸K\>4@Q+DP ]KQxgBb#EDIwλ/(/2]A%(6EL)h35PS߁< #`aChg!+ʗ}?~{߮kH<9Ŝ{ZU&Z ܑ-"%>?k~NT}pA2L{1D-Ppְs+[T.ԑiC]d灙ιs.$TdEï5yQ}|D^ ;wo13x\=xښM>j$USZhmeq%˿*Uϴ'Ͱ<_!g怨gL*ٰvrYDnz묱 +0cͭ_J}QY^x~&|AQpe5!kx ,?-LRE՞ٙBAdA.^Jt쑣 Kф f&Ҹ)t'<q}AF>XH'IK2`3VQZYǶX/IIy}49scn46ZGKИzL]5^Ӕr釤FKVD$'Y@Kzrx"z~77GJͱTPo/' l!qVSN%8%U/ E "CҒ"ÓHD|!0AIl$76p/TO0s4%Æ`'[-h,Cfxvmf>"~mn(]c xק X>*PD ai?x$cu'ۆz*UB&~;yg*G'8`q`~.@ ɬQ+ -\c)]4}{X emJH6ɂ5t02|K6 Wׅ+}Yv.}I]޶oM&whXU5P}!BPw,7.3byYm/Ocŋ8I9IN ̯ &%e8xO@; Wߤ{W[^r˪c҈ϯC~°$yXjd 3@ܬ2_رE?ڊ?X~Trـ%Ú?ITr2Zr0FMmq e,Y@ՉѶf]@EʜdtTy F-hрg[ ϼHJ_.ьK,v#@Ė}9e7 + j'H:RTZM0^Rd({>>-tb3@;lb!Kc&|d cSN:6}@Fhquh& ~Q7}~`)'.pӤmi`b (O4;-W L" OK19GCk?L [Zұ]3~g#K@sKB[rM%JY{LT>Y sJ*:9kRHS? F&.Oitr:f-FyV%hq/%bw+m#F]>m:o)>;٣k0Uu"%NgCPjlm*['d~~MIEzY: xPqN{/"껪 l: @lXy\W>?1d*c5ZhXGo1l~9I?9 <7:|]y摳~5? ʇVmsيM*$ek!Rr|4 J p#5KS* <N58n]}§[Ju5Q闫r% *رop)7E}OɔR aKl%tV[d2'T N7yq]He>$,sKh$c(I'xCڋbt%Ǿ^pesawa5NШo4]C7)z|B^.o#q8{T(IM iUbdu#،}M>UvZbsjǕmu~ _Ms$_ďw7;8B8N>X?)6 f>. "MCM\ftQD:NO|U|[sSQ`2Sy%Q #M֨Gڽ"Ha AeGXDzqsrNǬ$/8’읖˷-CXNUh5#fq=.a2 /:"m&E\7'szxy(e|JRq?" )')ap#s=vW^<_o$ YWxw4B(2¼[<@m?*%m&.a:(at Hhg$Ɓ  {@4^qY[da5Jfᡲ& MZwb"( %T_U+—7?vWJOP熬MO^1'\is/Gh Pci㷅H8sAUX,>7kKt'9( jf{jDJ\ct` jRX{`wE/}SepĀG()$cfg ` j^'\^'9f:aêJC]Mޭ7u`)y99Q' np³6 \xV jӦm73A߸}( ":ֆaF[~*n '7F%Hqx" 5}' |F~![Z ^^lLւτ5^(f5qW6ހ9HF B;.C\]vY A8 RD)ݱ:b5A:'@ O>&ÒqB +a>xEyvۖ}}cxy3J=Ι3dC~H@uThd,shjeQFJ;lBLr+ B15)[K#Io$oЫ˞܋Ք[H.73BYOӌXJ_S \}&~,&n<q2`|Տ|?.9Tdk M?CDj " 2bQLZuPbjN"AUI˒ IAqż+ux)Yic?=5my[֘/v"-rf)RxDpdC Fʦ>3B'!\Pשl#y9'.? C]0oaP=n~2ax.B/PA<)d.'׈)HDB7cin(I)2Ia?Aeۮu~dȝe[֒}=HsڰM5.JW:p KCgRK_1Eߕ"6a<j Nm9< owmX ~~$ .a>.@eC; |M_|;ҶRO}>SHN{hڀGf6 ^ZO!n@&E@ݰUdzxqP #v'bghܢJyBRlҭVlK;)w GMǮftD́w[QSf ZK$P%kDW#Me%'볘;d6A`z4z©m1Tq]my̔I@hP֋c4`~nt)m`q|LŮք51(4>ǃ)߷ /k~dΓh5sIgzl\%,3Y^u n %{ gg*BHOʹ-n (0wa@9TX2c `>v߱VacFOKzwzeꁯ_~*ߨ<seŹzj&%1ғ꼩~c2iPGQ~TufLpHF-&|Fԓe kPZbD)كeBw28ifO_*̤jF]UߝLk^M @ÅK#I|)HS6Ȉ,(oX:ۘCͩWi P3>Ht`ꓽN K#ȠX܂ٰ8c~md'e ^i b 8n!!/Ko"Vt~"?X(|%EHl,&W0T{qrKARq2|Ov  N+. 5V,Cb7hLF7{ ; Y%,]6H>ۼGe2˒|(eĘso{P_8]ߛ8TzU5㤒:.W&4C٦ GW3ܕQaX. VNn0ReH!0OF 16ms:g>K k# )2i1V $)zmX zɢB[Õ+LJٲsZSc՗&w.\4,"xp ?&GqyvR+'1x@O4 ߵm`if+{)HR&f*qwuUòMlcU1ic9'3L+Ŀ_e¤+n2U/ fZ:RÇ2 D݅m`/+2țNMBgK%V"淺R~!FՆZVv=*Qc-NB}rdML.oٌ9Dn6/R GŽ_@6%WJ g(g;r,CSj݌50r D. *".!L17v/rfWDJnEbyG4#֋Zx+:a4QOC ϑU%*N_Rw߼C˧kХ~C Qyٞ\j8V&UPIp}tdEڜ~A6K~_}o>pbIWonƢJs::i1j2:Gbc!Oڕ=,=eI zXViiFUoT.`Ʀ] F~W('k^Pqdn2E 5"As{E"FXPovJ7F}R 8Us¸[ݱuvb'w]o9OM endstream endobj 156 0 obj << /Length1 2270 /Length2 17299 /Length3 0 /Length 18687 /Filter /FlateDecode >> stream xڴeTk6 ڸCp'Cphi\;ݝ$hp |d;}V)HUM쌀v Ff^ 34OA!4Yي.9@`ef恧HmJ;@2Tu vN #Cw5H"jghafO?"Cc+;W'+ @Q o.P֦;S*P"TVPSTa|loo\DUT$b:=@RMEϧ*=@^]'ϻw9qUaU-Eq?5X.@G'?i;3]MlJ6y\]]͜@vfS5p9Z޿lkN9_ @h$a/{+ߝ{oOLJcn,55~7@D?iM]2kOoC=1C[g'6up9+"`ja ϙY%WQe}<[92@Y',&>\VVVۚؼv>1>ݙwl\m=?bS [?}7qgRppJo`@7cs??b?&x{L /xO'C < >Wti[S;ϿLkMiw`4g?[?$ m53v/J-ohch?: ' 7&KL¶f@ ;#3'4j6}t߯?׻tSile trph&U5Y5eUmL,lCGGCwxa`xO i01ځ] o#0  qDF\&ѿ7Io`zq3F&Io^蝙={ÿ;3;3 5 ;!@?;CphnoŻ?;Uw6Cwfb{dlcg坰?;a)ha Ykp|=?{ ;#?^?{=Cwow==5aP?L An_/%w߿t+?ED<yX l=fc3j_y4@71ʢ1_eJSpxt4ILJt>X6)Pk_eOWbM@L׍&JB;>r>H9jr~e]429Z%mqmD#Q(֩7dR Gl΁42 q[t bvɗ}(:qq2Q^į; ]zr_2k7cqQ(RSԟ̤TE}¥"~-pyQD봻+FP)X̌č[PaS|c=l.UUZwj܋҄P9t:郹pLeapxR.7 >技t'Ûמğ>*D#mBgtƤ$l)m-O<&U%.$ V7^lLkF=6](<1y`" Nu:}QL&[#=[RJ!%5w`7J;`Jr3a^ə@P˅ne6\gSqё$fTZuL\q(VzXnR(g7/͟ȉJ G{ :ǭ%,yS#x(r.b^1^ն`dl,{n'Iz s8iw`~%*NiXz Y%Sd~I9١e" O SaZ%*<1SzFb8kAj{`/|Aiޖm6P#0$A"7wF6O$U-Byyv)%x EesGM}Fu&q_Prj~uh,}pch+׹ ǔ57Fp_%''ί4Fh"657TQVZRgzc&&4t|:2TfwxOS|-Ut<بikG>h iޖ+չqssy*yC4-d I nVw ~|ZuosEp)|=tDx&=dJg$\?G|y<\k36.35-Jt (`הT mM}{6]4XV@wPKPȠo{vdW'D[)mk8&xF7E{uK?~f̑ ^S4gVY})@|m](X|Fn!c5y)#Mm7 E4EiWR_DᆐIڧ؆ĬagFDͨAybѵ85|%^={ҸtlW?kCz]qs~[ .>s.b!bSO ؈4/TZN{=FTQ%f^mn)R3 $`>TH)׼L3 .oޛ7yb"CtŲI[ {00h%UDXϸ/5UsYmy]!AlLN pnY~S>þc idGHGnxdoOg99X)d<<;F(oMO)uҹrxJ+LFG}ڣDWr%sF=Ù4_l^DVRXǂmN|f!e >9ŗSleW"cMuAv^h9U)W>gԭzDba51W߸ tRdXey#Db}p_L sIeM8f1bK#ѹ[vy^])pG$s;՛Ktdž<$LmhkвXc[„O)۹)_H͆%^W;)ee.MV]rV+Ln_kBEx1& ."/!qjF p0(;VTPw(Mr:A3=\i e 8u%P6|N2ͤ5<`v?X2><]#5 M*7p:~ D`/%ђ5'>:.$; LpE\LҖ*!x$zG7mѱ*սzE0c "Jh1Lrb>_,C;-#zP=l(l ._vY*Ʒ 7eECסY`/rR(~h&ժxy og%!pEYlF4h)zU);8 Sl rc8zzٝ"%Ecp{DI8j: lk#NV!vRPyY_!bz&Wm6HHB(DHW]iXmeD[tgbv8@0pX C:W. , U@mr bs5 [Wb]֙GN|PO3G 3bj" Y)2B!ض=d\0G4l d!,Pwk\1zwh-ZLV)KN]$B-at`rnH"X<3LFR Qd7Fq2k=.Ziк{h?Xz!Np8}ǡĂ}[YQ8?POk5_j>xY䪾cSpѦu"c=1困6%~bDbPzMjncޤ =q{ 3#W.h <%?d业(J\gh@dZ73 BO= s{NppߦJKV_o q<L뤳_h})QBS-u^?ph?2IK z~-vʏ$? \F)(n[lr%RLIb[G.nJe(|*:4IXe}fr ]TC1.YӁ7 UkmIT/4rB8#E||[ o>B7ֵch!]B}d=#Pb 3]s"FP, H,vV5wdAUh\&B8GBt^X4cC1П\U3l{f5o*O:u(xr4@^˱fϧ|tp\-㊄r ϧnHtj` 'Jՠ֍En!kŴm޶n6"-N}ImvLk94+\#%4v*u '+Ҷ$MmbaY2<;NC]8S$ j96 [M>sp\mކsJ`l&"Sz@lFL0 .ַ#jkYԅݎfOe<pt]3ݝq5SzLI"I}d2wM`L(GwZTPDړEW>3,CB?4P,5*]C]ErpIL;O2UuBߝ/*Vm&zBz~ G ֐f@!p S>AO_*Z׉ZeփoN (3̞H)/dmauM/[(}vNc2F{VV(5ppu(< @2ޯR/+uU@td̞V-_8ǚuWje'R2Q:#3 TW. sX+\6>Lz>#' h&!5ڻL/#u `ؒcX2 ){'G9LSiDA8QL\$/ M\ӎ`: q-2Ma+x攋iHk*{!C`IU8`:A(˙@Ȫydk3|6 EVfqYܓ}8ۡCS"3dcqG 3-_zm z}\^^6C*G5$j 8,+֕f*4 ʶ,xH0mk͉L|1vq"h|Zת*OBc@\WOj";rܽj!~*,5pv~a$1] 9e* }@h ' n2rġR˫ yLm fcṾI3hȋ ˭fL.| Bl!ύ>Iٞ@ p#O56jh [Ʉ=L$T!o$)K@8xr:fAgaqW/K| ĭ~ Nu5G"ϻ-ܖt{Rp=t}kb\ ʧ>3C-n?R=7؜3Td0=Ͻ,MuRU/ cq0e,;UyImAؒCvm9ڥwenHIEQsĦTg,XoD' yC J%C4'Zλyo/ zڢ_!ђerT^IGɨr)Т?'t SpDIBS.D) ^?jQERz26Rpy䙃Di0 w $hfaz6@F΄]3hREfGco2®d:lPfFO%TJNƉiݍrHJlĻ%Cg=zoyݦa46faPsy(YEps3Z1JNnIڕ&ٸwjP #jCI3C)Yf؏7la6&خc*Nɷ75 b-*B{ƋB~%b1sf FVz=  Xy/f֍%vɆxym<9QaL;qA4;+N1C *"vQ zq!$at0JL4'f4Z }8m\鴫Jqx[S9 G^IUInƍ0' 80BL#kƾ.D??IWɢY YMn#9rԱv$tVu>g*c t*AYoucKaGA 1MT o CHAKc09Fߪ=] qVoV[O (tRQ6%5 y?0cwŢTMh$С|\fA-ӐDh?S5oì)+衖~WqU׾39XK1to-&Q121*s9?~{(o$+Ox;|Fhݖ<{e`& 0ӌjPcW7X'<ù3y}6 Y`\>jq 9-J4į݀^ EC,d85'ellCE_C+G09ODs23,oRA?=:NjPmIyh^)=j򎚅uKi蒴^[Z-ƌTwtJ)b+4譁gHβM*G}-.%b*k;WͮTYOVm"]?o>NГubT -kI-w_k@$&!C0%bpům(Q>6%o0 jU-Hdۏb)i505Vtpi4GL7xqcϏP*܂Pk\dꮚۼ|ů QN6li+0]I(5#?ro'ݓb`=u˱S|(B1yLӈDS1j\BNY?ͪ,RJ*%Ѹ3ôzW64A}1<Tbr}^ɲ2Ta1c@`q qD*]I B_,>ArAbtMRtK!H~`@A1(OIDnȓ~lSR?.}{3FFZ8)ߵC$!O=؉u [7/[֙m?Y5U@O3n6EM ǡ%ϨD y9B^՟lЅ }@'1Tk;<8T?/$YwSEjZ n 5y+ d17Vؐm]sTrN ]'o57q]LkX"JLQ/S@(H~w o6M~TAW;-o*{dvme]dU:q7 '^'UHU86 &pXiMX߫]-yN̴0sj$l4weg~Q`_UHF]|Żv$$+r4K ;.wb;;-ĝvC)9y:ol'͘&tԼ6!vW"QC \1\+L2OSR%&&ax=i9Wh2q6IcPo>߾t/LE-Gݧu$}9A3'.{aVg?yDgyz? HoV;*S.7J{L*Y@Mrͪ6XK*1ȴIQX\URPZElfO2otYfyU~&Vm<%yzKrU#S/|Fkm/ۯEl>Wv~;{Alhn+ ]Vz 5.rł0vBCu'Yv{3 $fo (ќ3ݑ</tzO 7R MK]y9h\R:a݊֔iVʮ&(z nCV{2W4߯c/zPyA2K/wuR,eSަг5 }mbo89b q+!S\xd*N' S n-;Le`: [pe][# zg6u!|%: N .*zͼ n eS;3BhNvUkei-fbn[/mY+8N:LĥWa=lu:9g /,K@T[)3NSu4b7uձy:!Y?nIUh1)Dy]bd< .ifzh @Si##<`,u@JXˮ&"*3U6q~'辵Ֆ@ cĄ-H{B QVA67dGjVwbd*I 3޾]!NF;@;~%-J֜&YY\^ME% =q>B֥=뺄yE@'I%|f1K#LyAXF†snqGt&.2Ҍ|\]p)TyOZ=jK< ^c{84PGqc/ Pde8Pma|Y:} H ʾy EX\aQƫT&~`Z吃4,ÃU2n D9ɞVj4 aH5Rmwَ;4Tc~9*g5CkBIJD*>7El'=;ƽr}T4y ۬Xk$z8ԧ)2}Hx /YᵶFU1{X\R+ɮ?0tx89}dVvD/x)Yl:OaT-2w?F o t@<{̾^-ᯆ3vn("S@h >Y$ǔDG/g^ s!:58fgM#X}ϝpan#zyh&@ Pmn\h'ɼ[E3}Ĭ^@ǔvYR J ROͭ^a# 5Z={JKgUiʉ~e=ڊGn uC>LyNEVOG=ѵ*Fv ]ei䰵|̊OHcqJ} g0&ܦ| ZǮͣP/XM\į1az;w7V?4jvp,h%8{SqwR^I'@A2> 3Fz6` uCbZ8Q+Z0xj |_?6LvD\39lާo>sd!vζtR!ћrdJvK.zA-yC,{ e3xbkb5aT/m`8CgLlw~o ,"u$)?L~ 1QueA+2ejk61Gۉ)mt<T;q?… oOElMw !I)%j~3gW)1hNVGDX 5 v35 HK$xbLx\m;OӔ,ǧPByi(N1)O` kHL'5(~OXw5*԰[v._'?oϠUd?_&u) ne͙Iqv7Ч,LJRiLٴ ~O&c/.;Ԡ N? }(KX`` ō4*y]´(OyaSt:%*kp}{~tSȡ*Kv&K^Y8SqjL9=s`}j1X&B艳מ4tp䘦E4ӛ%#pOm) A!rrY| ?Dܬc4[ҷgPU | M"?}!GY[3 `/rY)ޡ,Œ`Lq(=H&FWd y-9uQZzK4 _Q>'_x%i%w7c 1nL7]n42u-RAVK^ e>|Κg`ޛ۴X9)SۖI*!)+0l}aWٲSruXc죢:jH1wY(W;WDu9O+V} Q6< Z@j}J$ EJkbP{!|hiЛ"]w4z!S#I"_i2?ࠉP2/hy>_=`#ف%5˙3"z?I{2z`=;M LGJ ]Ϲ3ѳ3zEYr8Q Xw{ ႺX&բ4:A.w #ZCV2C6^ FO˗E QZ^=I9_<솒kP=|?v](5sW# f(c0AbOX/ߚK@o庈w.ɁD=&q?WQ*9oC9c@ +f7>֖E ү` xՏ]QO,odrNDz.6G'`tfSg#c'8Tkt!ٞB)jUp'NY:XO+zZ~0I{ͤ*ZbĹ9i1^#p"tCB %kQVW/xq8 qYo4 pk1O ~zP)6 K܏FI cX2޶`KÙɥGD8Kq~G7tNr&.BmYX6ZYOċ#Yh<ˈx$@/(U9]a"G, Q3 i)-|ɓGO\\-C57cYMH1ʴV9T9\Ԯac8Ϫ/Q4Zh'z h:jDQwQnb2+&R'dySU2Z @Rh:^Z#l HûP <*GwGB x/ҢaR6FO<5g~DԷOH, 4 tcmgR .p [}`&`Ӥ\O snjP=5`^W:^xU9Z]?mΩ\idt N``u! E>\|ͳv$o}qUMekU!guz/FZ3,KΩc[=uu\Jr)$p)#z6d| ca%Z (u=ȿzJ{٤SdhA$ł;BR(NGs# o1lF,6D.'V߇ Fx 船sfkky9iniڜ|;=?xe;pgv}c rY\+(kwؗD%]tQ9 l7I~~BK%M16V/$fړa˿S93Eb%ʢh LvP]܎u 7aE*Bs̩-<2|s'{Wl >Rf8:ʥͮ"6D#d~Kw*?D$U.;y/%A8:JFi#^a44dYU0?'d𷩤kF_[ yB(+juB 19;vCeI_3ѧu7iNprI8L1GL)Ĝp`Gu3V@0S~zX_L!ΕnY@sf\!\GJ`ƔtK_6F_A(})a.SW}ۘVi!QU,v]\3 '`aP{UGu2s KB5 ڲ.Kw8Y?K { \ޅqG wP^joѥ1x,(6JCъmwQKU);Xx3Ϧ-Qdb˘ie>9rrBG@./4_.$tiYJ}+ؚ%'KwUtƤ0]XZۙZ'>RTo:b ׼8bp7IeNݼϲgGG endstream endobj 158 0 obj << /Length 844 /Filter /FlateDecode >> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qhe9xSTQO7}̽][GLrFMG}}"Im!00jEV%H^/v}0<_7RyL U~C`PރSӯ|' imXYӷ|4nt.kP^k?IFsuB`nlB =@ )U 9yI(ѥ S*043``ÍSqf|kiCc, pDˆzF:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AI cMXS?S/w,;: fyR(#c^g!ch"ƨ/kC^d cRx~h K^| МQV14Ld5cY9Y?=C9돡'g ?%>O:ShYg{ΈrYgDk>[bghX|&^V|sig33qgng3tZ[Yog,g-g B|B|\3gg|2?f)> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qDŽ r Gէn8A{,쏘LEvDB``B9zK~;_q`>Wgy o.>ݫﭯAbZ%?6G_Nzy;9ڰoiܰ^]0zu\~3ݍܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1gT Hӆp1X:,p8}u 8alSM3?r>x\i"EܰpJMkl4\?ǚc:#?^YHwuprQF^odž1BЖEQ?1^׆ƨАԗ039+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrY׆}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *.MGZN(:p~7a?}]TyԟE}Ư%Vu'e% endstream endobj 160 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3FXҝA5(O)suߖcHQIܮQW Lڮ9ˊ6nK5NoغWi~r<d(Vu;_=85vѩֆu5CNmm悥+U=#)\][|, MHS"#p #>y| #:##0)%T\`YQqJƚ`ci|1Mَbo4m `2WQ/cW888sέ-./qJ;&\ k(d?F#h0\?Ipa]~9Vk?q1Bx.BzҬÀhƘ'g 2xk=6u2,bق6E0F,eL燆LY` YecODV3Μ蛳;zr֟P.O0{S3ux9(uF: }6,V|ƌV|gegV|F_+>O+>G|V|~+>C1 V|B|FB|/g)g1{!>_|&~'a9i0K!cB{XTK5;)NŽbPq> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z endstream endobj 162 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z6 endstream endobj 163 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$ݪ70W?g^,ɝظYs{ \wu{S<.7զ7u{R޺>f? Kw{KTQ/7SVk-&9sQ擾]׷HRP]s6o Ogw!X.o; cƮS_wСtZ|I1?H/GBZV ; ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:qw#/M endstream endobj 164 0 obj << /Length 844 /Filter /FlateDecode >> stream xmUMo@+H.Ȳ|h%Qի ۇ6웙7X=Tg ]NncT5ob<Y:socsOPcYB?9Os֙3\Q.4ڰX3Z9#>\Z} ?L[ V|V|oV|3[: } B|)W|L| ,Y a!SM~W,:?8C8…I^U E'b|82 8ϻ޽YtїkZbu_G4 endstream endobj 165 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R!ݪ70W?g_,ɝиYs{ ]7;׺v=ߩǡoݨM'opiT}IAu~\3;he?<{Q%(SVk-#&9sQ擾ݾk^!00j(+m$?Gwt>X.oTuþ{S_tpСtZ|I1?H/'BZV;ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCa endstream endobj 166 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQի C}͌6jo73o{q3fѭVO4cpuU sk/wOwquy_t}??p]AAu~\33cA}P>>%t;en>r8`S0Aj~vUk&Yos yv rOiHM0[7v,ܜǽJnkz~lNͿvt*amкq۸qۿ`J-ztH]{O|, MHS"#p #>y| #:##0)%T\`YQqJƚ`c2U{;5Ҵ!\,18"\aD E_sN[sS9)9^W$js7 GZ ׏p$uX}/S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7q/c?z~#袳rdbP)n endstream endobj 167 0 obj << /Length 700 /Filter /FlateDecode >> stream xuTMo0+J!m0U !mTto4j{zv|tv ںQf|6'op݅uM{}ugfci"Amƃ}>,%rtPRJ(:X'Ab~oںT7h uSӌ]Acq`sy̟M.n? D`އщ7+d~4Wj7vw VRŪ,ׁk/bxO0+,F )1!Pp #]QxQTv)#ZBYLt/X^r<1u%pr_d9٢PSi0@WQ_Uh֩h諵"qFM]RrCpt39Âж~j3Fezp888Q:1bc7~}Hq('bĄ>^m# &zd}4)` "H,4%!%AQ߄B[B~)ҙ́ _)M?DM;豬;kyoQnNRd\Ӎ;WA} zoZZgbT$Z|U endstream endobj 179 0 obj << /Producer (pdfTeX-1.40.24) /Author(\376\377\000J\000a\000s\000o\000n\000\040\000A\000n\000t\000h\000o\000n\000y\000\040\000V\000a\000n\000d\000e\000r\000\040\000H\000e\000i\000d\000e\000n)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000T\000o\000p\000o\000l\000o\000g\000y\000\040\000a\000n\000a\000l\000y\000s\000i\000s\000\040\000o\000f\000\040\000l\000i\000n\000e\000a\000g\000e\000\040\000t\000r\000e\000e\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Keywords() /CreationDate (D:20230929154931+02'00') /ModDate (D:20230929154931+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/CVE-2023-32700 patched) kpathsea version 6.3.4) >> endobj 139 0 obj << /Type /ObjStm /N 40 /First 342 /Length 2265 /Filter /FlateDecode >> stream xڽY[o۸~cER(`@'m.ͽ)ش,Mb#.E")r7m$  bR!9~G@#FDKh0D ae"Fl@hz)ELX&8#` R`BÒD SB($F "% XH )81!yB"9(¸A94nڈ`e .e0 zU fTL/(!@"`DP: 8X(bDB# 0>63f0vCF@CMz"3OA!`!AɨFIrw'լvmY$m=Í.졁#L4P'!XS/|i  O;?xZfMFEV-WFv;xQ'Ų44~.f*6y+/R噚ԶUi UߗEO9g<T3Y*p|jT v-c/gw'7o$`I%lǶ-bS0d ֛,t}<~#z@;.ӧ&>Mk[tm:t~N d\6QG}a%^X%v?[ )(|Qyde(\8bOݠLQ)zO/tn+Wtru}|5SC:dDkPD5nJ#_ r&oLFTmRk۴"/ QMa3MR%|7{j n:wJlY5I_OIo&ñ4>Bx'7և}6'oxu'spG8ͧX:(0HU+[k(WB[5Z7Ŀ7@)gփ g6ł0gMH@*lc;kSg[(fۑ(Z-ClWߛb1naq!N|MW'_o1H27|)}ZV]y:BvYm{6Pћ>OaP^ k5uJXk?-ׁ.\ޅKD/\\wKۅumv7. 7岗]W|# F= x`+`#``k.ڍ0c]!]ASSk0-c]n6^%SUAT,bR][,Ih#oȦwd YV-YVԆIW+%V|ZT'#P*f7ߢMJڴ5u'46]*KO[֫ɶ.RGV"r,ђ.e񭲘// ײ˲Vb4>@v9z3JDB ;U@6|XpʹUS{~pQP֩ <9B83990D08B75BC14318F71856418FFA>] /Length 476 /Filter /FlateDecode >> stream x9LTQs{0(۸ " :"8%ųАؘPie!6Jk~λ=ffY0E#9H :&7kּ4DLH:ȷ5rf,lukMȻFTj -n'-VhvAD 82pxй[ v/JTݰڡֵ6Q(uR GA't~8v{1]C۫/* 3K3ۛv#pY8' Cݏ+Zv ι}\T9 a <pLP4zPJGkz$<, nmw3'PcJUe:*{RdGFOh9R}_LL?zNԉ4RF#e4RFe%h*+CsSy endstream endobj startxref 287921 %%EOF alakazam/inst/doc/Topology-Vignette.Rmd0000644000176200001440000003063214145427343017633 0ustar liggesusers--- title: 'Alakazam: Topology analysis of lineage trees' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Topology analysis} %\usepackage[utf8]{inputenc} --- This vignette covers the basics of analyzing the topologies of Ig lineage trees built using `buildPhylipLineage`, using some built-in alakazam functions that focus on quantifying annotation relationships within lineages. ## Example data A small set of annotated example trees, `ExampleTrees`, are included in the `alakazam` package. The trees are `igraph` objects with the following tree annotations (graph attributes): * `clone`: An identifier for the clonal group. These entries correspond to the `clone_id` column in the `ExampleDb` data.frame from which the trees were generated. * `v_gene`: IGHV gene name. * `j_gene`: IGHJ gene name. * `junc_len`: Length of the junction region (nucleotides). And the following node annotations (vertex attributes): * `sample_id`: Time point in relation to influenza vaccination. * `c_call`: The isotype(s) assigned to the sequence. Multiple isotypes are delimited by comma, and reflect identical V(D)J sequences observed with more than one isotype. * `duplicate_count`: The copy number (duplicate count), which indicates the total number of reads with the same V(D)J sequence. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(igraph) library(dplyr) # Load example trees data(ExampleTrees) # Select one tree for example purposes graph <- ExampleTrees[[24]] # And add some annotation complexity to the tree V(graph)$sample_id[c(2, 7)] <- "-1h" V(graph)$c_call[c(2, 7)] <- "IGHM" # Make a list of example trees excluding multi-isotype trees graph_list <- ExampleTrees[sapply(ExampleTrees, function(x) !any(grepl(",", V(x)$c_call)))] ``` ## Plotting annotations on a tree There are many options for configuring how an igraph object is plotted which are helpful for visualizing annotation topologies. Below is an extensive example of how to plot a tree by configuring the colors, labels, shapes and sizes of different visual elements according to annotations embedded in the graph. ```{r, eval=TRUE} # Set node colors V(graph)$color[V(graph)$sample_id == "-1h"] <- "seagreen" V(graph)$color[V(graph)$sample_id == "+7d"] <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" # Set node labels V(graph)$label <- paste(V(graph)$sample_id, V(graph)$c_call, sep=", ") V(graph)$label[V(graph)$name == "Germline"] <- "" V(graph)$label[grepl("Inferred", V(graph)$name)] <- "" # Set node shapes V(graph)$shape <- "crectangle" V(graph)$shape[V(graph)$name == "Germline"] <- "circle" V(graph)$shape[grepl("Inferred", V(graph)$name)] <- "circle" # Set node sizes V(graph)$size <- 60 V(graph)$size[V(graph)$name == "Germline"] <- 30 V(graph)$size[grepl("Inferred", V(graph)$name)] <- 15 # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.05) # Plot the example tree plot(graph, layout=layout_as_tree, vertex.frame.color="grey", vertex.label.color="black", edge.label.color="black", edge.arrow.mode=0) # Add legend legend("topleft", c("Germline", "Inferred", "-1h", "+7d"), fill=c("black", "white", "seagreen", "steelblue"), cex=0.75) ``` ## Summarizing node properties Various annotation dependent node statistics can be calculated using the `summarizeSubtrees` and `getPathLengths` functions. `getPathLengths` calculates distances from the root (germline) *to child nodes*, whereas `summarizeSubtrees` calculates paths and subtree statistics *from child nodes*. ### Calculating distance from the germline To determine the shortest path from the germline sequence to any node, we use `getPathLengths`, which returns the distance both as the number of "hops" (`steps`) and the number of mutational events (`distance`). ```{r, eval=TRUE} # Consider all nodes getPathLengths(graph, root="Germline") ``` Note, the `STEPS` counted in the above example include traversal of inferred intermediates. If you want to exclude such nodes and consider only nodes associated with observed sequences, you can specify an annotation field and value that will be excluded from the number of steps. In the example below we are excluding `NA` values in the `c_call` annotation (`field="c_call", exclude=NA`). ```{r, eval=TRUE} # Exclude nodes without an isotype annotation from step count getPathLengths(graph, root="Germline", field="c_call", exclude=NA) ``` Note, `steps` has changed with respect to the previous example, but `distance` remains the same. ### Calculating subtree properties The `summarizeSubtrees` function returns a table of each node with the following properties for each node: * `name`: The node identifier. * `parent`: The identifier of the node's parent. * `outdegree`: The number of edges leading from the node. * `size`: The total number of nodes within the subtree rooted at the node. * `depth`: The depth of the subtree that is rooted at the node. * `pathlength`: The maximum path length beneath the node. * `outdegree_norm`: The `outdegree` normalized by the total number of edges. * `size_norm`: The `size` normalized by the total tree size. * `depth_norm`: The `depth` normalized by the total tree depth. * `pathlength_norm`: The `pathlength` normalized by the longest path. The `fields=c("sample_id", "c_call")` argument in the example below simply defines which annotations we wish to retain in the output. This argument has no effect on the results, in constast to the behavior of `getPathLengths`. ```{r, eval=TRUE} # Summarize tree df <- summarizeSubtrees(graph, fields=c("sample_id", "c_call"), root="Germline") print(df[1:4]) print(df[c(1, 5:8)]) print(df[c(1, 9:12)]) ``` Distributions of normalized subtree statistics for a population of trees can be plotted using the `plotSubtrees` function. In the example below, we have specified `silent=TRUE` which causes `plotSubtrees` to return the ggplot object without rendering the plot. The ggplot object are then plotting using the `gridPlot` function which places each individual plot in a separate panel of the same figure. ```{r, eval=TRUE} # Set sample colors sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") # Box plots of node outdegree by sample p1 <- plotSubtrees(graph_list, "sample_id", "outdegree", colors=sample_colors, main_title="Node outdegree", legend_title="Time", style="box", silent=TRUE) # Box plots of subtree size by sample p2 <- plotSubtrees(graph_list, "sample_id", "size", colors=sample_colors, main_title="Subtree size", legend_title="Time", style="box", silent=TRUE) # Violin plots of subtree path length by isotype p3 <- plotSubtrees(graph_list, "c_call", "pathlength", colors=IG_COLORS, main_title="Subtree path length", legend_title="Isotype", style="violin", silent=TRUE) # Violin plots of subtree depth by isotype p4 <- plotSubtrees(graph_list, "c_call", "depth", colors=IG_COLORS, main_title="Subtree depth", legend_title="Isotype", style="violin", silent=TRUE) # Plot in a 2x2 grid gridPlot(p1, p2, p3, p4, ncol=2) ``` ## Counting and testing node annotation relationships Given a set of annotated trees, you can determine the abundance of specific parent-child relationships within individual trees using the `tableEdges` function and the signficance of these relationships in population of trees using the `testEdges` function. Annotation relationships over edges can be calculated as direct or indirect relationships, where a direct relationship is a parent-child pair and an indirect relationship is a decent relationship that travels through another node (or nodes) first. ### Tabulating edges for a single tree Tabulating all directparent-child annotation relationships in the tree by isotype annotation can be performed like so: ```{r, eval=TRUE} # Count direct edges between isotypes tableEdges(graph, "c_call") ``` The above output is cluttered with the `NA` annotations from the germline and inferred nodes. We can perform the same direct tabulation, but exclude any nodes annotated with either `Germline` or `NA` for c_call using the `exclude` argument: ```{r, eval=TRUE} # Direct edges excluding germline and inferred nodes tableEdges(graph, "c_call", exclude=c("Germline", NA)) ``` As there are inferred nodes in the tree, we might want to consider indirect parent-child relationships that traverse through inferred nodes. This is accomplished using the same arguments as above, but with the addition of the `indirect=TRUE` argument which will skip over the excluded nodes when tabulating annotation pairs: ```{r, eval=TRUE} # Count indirect edges walking through germline and inferred nodes tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) ``` ### Significance testing of edges in a population of trees Given a population of trees, as a list of annotated igraph objects, you can determine if there is enrichment for specific annotation pairs using the `testEdges` function. This has the same options as `tableEdges`, except that the values `c("Germline", NA)` are excluded by default. `testEdges` performs a permutation test to generated a null distribution, excluding permutation of of any annotations specified to the `exclude` argument (these annotation remain fix in the tree). P-values output by `testEdges` are one-sided tests that the annotation pair is observed more often than expected. ```{r, eval=TRUE} # Test isotype relationships edge_test <- testEdges(graph_list, "c_call", nperm=10) # Print p-value table print(edge_test) # Plot null distributions for each annotation pair plotEdgeTest(edge_test, color="steelblue", main_title="Isotype Edges", style="hist") ``` ## Counting and testing MRCA annotations The most recent common ancestor (MRCA) of an Ig lineage we define herein as the most ancestral observed (or inferred) sequences in the lineage tree. Meaning, the node that is most proximal (by some measure) to the germline/root node. The `getMRCA` and `testMRCA` functions provide extraction and significance testing of MRCA sequences by annotation value, respectively. ### Extracting MRCAs from a tree Extracting the MRCA from a tree is accomplished using the `getMRCA` function. The germline distance criteria are as described above for `getPathLengths` and can be either node hops or mutational events, with or without exclusion of nodes with specific annotations. To simply extract the annotations for the node(s) immediately below the germline, you can use the `path=steps` argument without any node exclusion: ```{r, eval=TRUE} # Use unweighted path length and do not exclude any nodes mrca_df <- getMRCA(graph, path="steps", root="Germline") # Print subset of the annotation data.frame print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ``` To use mutational distance and consider only observed (ie, non-germline and non-inferred) nodes, we specify the exclusion field (`field="c_call"`) and exclusion value within that field (`exclude=NA`): ```{r, eval=TRUE} # Exclude nodes without an isotype annotation and use weighted path length mrca_df <- getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) # Print excluding sequence, label, color, shape and size annotations print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ``` ### Significance testing of MRCA annotations Similar to `testEdges`, the function `testMRCA` will perform a permutation test to determine the significance of an annotation appearing at the MRCA over a population of trees. P-values output by `testMRCA` are one-sided tests that the annotation is observed more often than expected in the MRCA position. ```{r, eval=TRUE} # Test isotype MRCA annotations mrca_test <- testMRCA(graph_list, "c_call", nperm=10) # Print p-value table print(mrca_test) # Plot null distributions for each annotation plotMRCATest(mrca_test, color="steelblue", main_title="Isotype MRCA", style="hist") ``` alakazam/inst/doc/Diversity-Vignette.pdf0000644000176200001440000074200014505552730020026 0ustar liggesusers%PDF-1.5 % 9 0 obj << /Length 1863 /Filter /FlateDecode >> stream xXK6ϯ 8K;$H.N."`[[Hr?קEْ=E\̇bU񫯊ʓu'䯴y,^2JnV rfڛ:-^.2Uc7OEڮ]nZ7m.;93q )Iȅr CUd"/XGg(y:8jz)(Lnxн`P 5ã6 )"yweAD S&e\ ld\2 9k\gqKR;ePsqϝaSO΢BΝ4/Y~Ͽz;sl9:vp["~i{.գ'gvR1s/V>"3.dD9Hw n -&q_x8 &1=-ph}7 un?c1~u 4}yKQP-'_PCv{)DiȒJ6e׵dA>h}~o.g~۷K3k9D&"Т -ӟ}P!cݻq}7~1϶z=vmӻ/{t$BjHl7:UOҭι)%os*Uoߵ{M?Qs=wt; CK˶rsЀ{MD&$n7]`(6a=HXu Y&LI[,O$^i=oDpEFζt[W X[ȸGpLDW=}~{ h|KWn٭{hq׆Oc2ȁ>m?},)]v{EgA}gh82Jr eD~5yR"nW?\_4ʿe bGD5߾0o@3i`b7;jCjWLV6~zE) V,2sUy5TOwTJXFDFB?C1tS77 0:1=ԕf[>ܼD endstream endobj 30 0 obj << /Length 1975 /Filter /FlateDecode >> stream xYYo~_1ؼp'c@X< F6Gj`Zj36@g]]]U[ݭ뿡LV,$KW5G>߼׉Zq,*!S+V_?/?5v:Ef_n1Sl~)K208фfoqkt(ѹ^'22(L]ClIPu-Ugjmzyv̓w|?zƕw{Sp*Jc[&Qx CQOa>NG>cps|>^: 7}2j^x`3 uDH_b ݋yf#nw,O{<7&A'T$9yˀPȨ~ZE*Lz7~?WwkO}~rl͂ Zn%q`@R] IZ 2}uN2v1؞%1TcA[D覶l͇' 'N?(H T% D@2 nv 8?cfyLEqOERgQdؓay 2NhHrb<Ӕ Qڱ ]SpsW>(Yg}9.'!AҏP<=]ec@l'I& d| g-ٝ!w]AZ4{wao;IϘfzH'C6¡kL ,S[eri˜yjRoEzP'α:y<@aI^Z3J,10[90b%e !g ңmz!dVAmjZU42/mioOECB` C9B _xZK2Ѯ( > stream xYYo6~RѵB$yH7bo"%!*Q;ClI.9fEXkX&</3'*)|_DEZVHb0ˬ/Y$OPO;)@sq7kC (7YplE}F/lA 抣d?lٯݜQbPQ-e^h ig)t`( Qpl~x uy)~>f~q<`owabbgU"ф3F2>\gsLAc#{+[Ixsf"lx(mńXKN4w\O(%!Zբ~I?:+'ßYYȢRwAƙl>1*wәdL=j KQ oȜ82ZQgNB#)@s)6058^<䛫 K !DZUQ+48SIbO\lF kv2?4n(8k \|ݐBfRL2C52M_h)joˣ4 l/oysر$E=lz34c5Fgҏ%^kFLjsn7tBn,5_0KwnA0 .5zP< (y,6I+nyT'iU:AݚQ mߑ4qBXbm䯪P#ţ ..ODWۓhg(i &LgA oش-1{h ;rs=ZNiR虱=UJ_KmT#S50{ްz @03gbx[PauK?\:tCx)&uġQKadFΤFT_=Z=]zm,P#/]A.pt[ y6DW VɚRx]6Zt!<iC{CuPa_!:ɿp endstream endobj 33 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-5-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 39 0 R /BBox [0 0 432 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 40 0 R>> /ExtGState << /GS1 41 0 R /GS257 42 0 R /GS258 43 0 R >>/ColorSpace << /sRGB 44 0 R >>>> /Length 50509 /Filter /FlateDecode >> stream xM&ߣF")QS{mxk` >Y$عs%)rWh?O\ka*dQk~ɯ!?T?jwϿT׿?]ͨ_-؏k̟~Z._K~Yi6~vɯ5Z_nW_tMyl||̷;37uj/7e@{ӷcuxg;_SC^㮿Vne?nCDZnV_ Y7Ĩrç ܉]C[3V@N1T)ܩۜUl{C+jU+oY>x(np HL}iH7Jy~XG+l9֫P(gݒu!(a%wuX,@UۆҾ6i9nZ8p;2X˾JiWNmO=XQ ᆝ^,=!\wߏ&/ЯbJvp>S[VGs?BH g偻BG _MP;3h̃7e٧[{MrgeW/gvpw+ղ}Y4];z|;|ht7p^Ϧmy~ wCnλS27pOQH=;Α}}Yvw>xzdSwpC Ubvn&c5#~V3nFqсT59:ϮRIqO^8w.ʻhXox~RkaƈtViw+k˙ZHWL^yhT'a^Ê漷G{@U{5 3a n,+4[ƛ0wWzOj]'M-/PrrS g5R{ܻIpQVʊi(lf=`_{[N\Z 9,;SoEWcl*ޥr^F^vʮ2>cۣw0Z]g6:#$z#c} =`@;[JCd=rz>e\綴w|' ZbDr(jퟁlJu4sRp2. ܹsX\iF{<,Jp^yLe9- {Lg pF:-O8joC ҽ2?B8k{Tq6L.Y ԑZ!-Ձ;#}T]pfv#G5 HAjev>ay8M1 ʫbA4Mi87܉=ʨ}3t,uGO  7K-] )ex 7y>pϰc2=ݰ9̛sh)5頩X% ep{BcZ89\τ"RrѐzGj Niiϣ#B ]tA!SwR5b i.z`FRYL&.v2Jեe[Ս8=np;`a?vgڼ=$+Hݍ0=1^{`GY[p3i]*LɣҺz`2;͌wѝ?XiL7reK5MF3)t(iu:uE><6M&z,EGHlu\Xϟ׊qtSjQotўq>8Ve>9~A._8E ':AY;h育)!ur\/4822p<#I΋r'oM ܘLɀ^7=J}jFMB8w/>K/$+)pǍ#]rY_{P%Q;,K^8PV'$SeJ(;&$WFBu =zGZj/\0% 8d=|ʝ2~l7JXF-hN 帷ʳAy`ڷkT>G}<W@æE_8{J=P{'r~m뀜X]>3$'E=FHsA/>)JY)-ajWʁJ:qC7BpCct8Hҩg煲ͺuBd[S(z&Ƒ.(H"+迹n=`ܣJecNIif^AirA}tQT3'].%ʹ`UvnH(D:>`Up)m*- kFN *Y ZF9,o|҅N.E˿U٪3fRvƒFFFeQB* w/ y'G`-ǹ'׌,iy+ A彄 }{O8(%]U-磷P^QlBa-*c.[!"ʟASJe~bj[1l~ҽ$ր:L+Fǔ鎩I=ӝl] ZjO:(]FjWPyWNHJe?{ULZ%it**EpG G T16']wdNUCc>%#<8ʻ~?QkNHkrLe37!'.Hcp{LH',a$4J)8<;\^}R/gPGyϰt.(>;k hnV0;?8c9;-S{>pק$IVY-{wl@q AGmiNGN6eqp.!섵xg Q5BCƲuOWqݓȁJp1@#ɽg?β|pOGyA: HβZ$9 p5B#tZ)} VNecT²(W-҆r pȌRtv['"XOβ{`'e'N,'LȲkֲ3棰T81烻RoّeaJXVelltp+;v,Yv7:YT ߲ BURO qT!::,;Xvlg'Se l,t YŲ>ݹZvB%dɲhH{tuuuECr6$gCr6$gCr6$gCr6$gCr6==,L2@eYaree6mLNce/xUGNh pJȲh9-g 3r[^@VȲv45h$i, PIRYV0F$l$yŲI^dgS Meo*4x*!I:$9HdN$$$$$$$$$I6lttEIb>2Gƶa!LhƶalAHGNGImۆm죰 IҘ ########FG袣0(DSrq\(WƠl Ơl 8B:tQNGX~(ID9(1('$\*GȠ#rdPYC9kg C8kg C.M{8־/}a k_X־K p^6 ɪEVY7ƾ'Ɖq"h XݍXݍXݍXݍXݍXݍXݍ87C}P8K2!\ }w_/cű~b_C /:CT6**UƫT* 6oESGTR߸RU!NWTTʝFTm*ʵƅ ,T*EuT^X rJdTv****w*w*w*FeRY,T* |Q2jY<N*16.Tv*;z]\><!8Wx6*7*7*_Th\?pGQ]br.b˹r.y}qح.v+<[כxF' ZkS +k?xƗ//HHCICHHf#^}_EL?P!)՞/16>p s 6@4Gט\lO\OHX6G iT)?tm00Ƈ< 45hT))u??Ss*֥Z|՚};;[;i*F"^c\Ƨv DZt5֯~ i_6C6*7FlьR8\E Je2*Tـq:P8^ ;r*r*Ш\W2yʍʍʨ%rOة\jq=@[ 1!e||6@ɋmWsub.v]bD\P*U~4ZGSSŧXaʲ[9EksW:,YVnO~nBm,[w_G0 cs<'oVd&[XG`L{Gwvnp+$ɺp ûr-Ӳ289~@Y9(̣8ru_VE|й:Y=w~H O"‘*Y /@t%sFP^ FYħ  y?>^ |aOX|9>^_`#$tA P V78[ '+'+'+>Paw A8}S Ns {`~.@TYgrѼ\cpxúRF-X9CICICI"l~pla4R83oXL7 DEaPiJhTŌTX)C5 6}:G煍K*:Q;OMoX'[7o6N&L: qŸ{z ;qcsŞb<3~ )V5 Wu""AN94ڕnTP灵ܰA):)FEKQ^ぃRe~~TI-rŨhcu74֭^b^xyJR*E#Jx*xc־w|']p_&y W#ݓTMxPv: s"«M7Ҳ`S#n=+Xܤ1<7-s㭃>)|?-O5y~Uqx$"ׅ72;',K\KNʭ-FsarjJԞ]Tx*66]jBre/ˇL[F77>k7_k캥;Z=y` 0bAc>﫫/iMgP>6Xc'BZ/kPF>$Ƚ*趿}3@| }16{|[+3=G[W_T.e'/tecJM{ih?}Ͱhzpo w_Wt -ΊFb~nGg|_IuٹCv蹿}`09TզH03s؃Ќbzo}Qی79rh87tgg1$p>b1T0D1BcYrbHN_Q 9s{'ob}L('U:7ݼsB>pO׾k!'Wr;x[&rcĈ d /s>6dz\rYy}ʈb4b9vZkoDrQGH~KFOo{\-]43?ޱ\۞rl{EbcL[ a. |2ߢ&Ht-[*wE8{kbظX*5ɤ=Sl{+vȯmƈO#pn5Z]l+ܛX3ÜӢ彩=%ϱ].Юolc6΍xt[gr4ݭyxPmJ䮲8(0- S!RqrMܳl 8ʳ*?Z@-uCJ{8v:GV<*PX;[RGyUV!΁4/lhm*F 9ʣݭHeLS;W!(",ŎMHG'AtQގB9?;шCk~,d~.)Ly,!V:/Ӟ*U\C8e'[݌Owy!?3L5/VG+>6j_80&wIRJI:K(JZ ,9S^F o\9e{([ifqX2/U ݛ(?y(ܑu8+0,W#(C}\}*U&6u+F t/ =yB){Se󫘞pO(kDaeѝ)/+O ǹ4wlexolHedGg?p^~plu/OgRU2ܗ8:,{M&zz h_<=B-ρ 58sYy?ΜZu4lRhFxLulRrڀ)7?p); Wiq!=oLWe"?.q'z~V/S!uq8j胞(?e͠{EF\?4c=kVPΏrr~v@-9z)H篏eLJUi䇦Cc{TdC1x~ Z#'yG.9OCX԰KwW@(ke?v)e-՗#bjt@=J/).(;'~TWe$RyH^@q:?g<2J٤JWJwk?ʽcٍpAyvT^{:+O!fy~W nG˼@je;/-+>ޙKSIc6 +f]G 2 m*^WCf#^;W52 L2\OT$L+*U&B㵂ynZU2#\0 e+S;hAX3ՏG*w>['09K t2(VzJDVP-Gr3RgIt9^)zSxiQnR4W<^ZLi#wOTME! +eg:ftU |9'~QQVZ qÈ#E2<W SQvNEe{ ב>أg-V*ÔI$^\La9/"(;KV:u1.B $CEQtz0eH습J}!&(+ R#QGi|XcB-veMXObQ}rOĄr~@&,e*4( S7$NQ)ڄriO[*e<Dž r&*p1|9w"Hl!7ʶ|:E V#N1>'N2/B#p$~?I7n|~Jofr]H΢UyKnyK}ܐ+BS25W´n>VLY'\%|*}Lu4U[45i ] d~({ y( ʶmA* 8ZC%?Wa _F8Mﮅ8ZmGih2uK`y J_˽&˧8zSBYUB52tlB  %d,)pB,c%]uv~ p:^9bJt@y̏#TJPFi"Mu$9Hr !I 46<:]#.\Y~LW?imgy% e1wN".Ŕ:X)hDioTܞMK~$61egSK kc>w+'G\n9+(k~zӖ{!9SலC E1ʳ>y(~g.SU缐{p J8PVXh+iy r@gNedsծSv}/dr^6VSҲԶNUTTF?h('h< ~:-;-5=}\_\iHn冧/:a9~ \0%T2uZvG$/P<xCڿsLuGy LN9}@L*O;oyBjxB!mu%T^%P"Rzwky Hy am-eDŽʙXg`y2T!qkCʫQys(7r]5Sΰ$+Eu MTIHVnauKQG 9& uew(ϋ$O0+Go;D #9[SV%qCcJ/^#y`Qttz paIt|tA p !< ]tXu9݌}?l ӞO:(]e"0͚ /aԌ1|@jtdҺ]zSh SX~A Kf,&SvѢ5y6;z #]P65CY+re44`Y6Xӓb(E(nH4e-3ùF++e0ZDMT15Y)R/?p!W4i`V݊1q6\<pT@I/ c*o ˹EOyBZX΁b`م֠lIҜ4U`H(A8[7b?NPၠS'hMF4'`<jk+!MTAH&;pyOm[:p>A8BYJA8a 8/Sj:!WBFTބBXfY4)3uɩw$ky329̳3NS8M9<]:&#l96OM-V٪`{ !-a9U>8s ʠtQ5*y_pd}|@#cFS;MuW$|eh;Xe9 zuM]&q.NQ(D>XYMg^g2qQ&J>N1[%Ƨ\P!4*f6'U:Hb2qJxe]&nH>BD%'o' ASZcI>: uVf0dƽ#),lfX ªyaV0KpSU9+'+L+*hKbPi }a/KN61zP=-,6|AE_H>\;Lh05$9HYNnLԤY7D ZeqQ(Z`wR]/~B ]C/l-8F [ZF k$|A)1S:36U5}eXYC6$44[{^>${NuVPd^)zyD*^><ЩLNIL.L.f&45 P?p<wβq ;{[ 'L I IshILJqŚ$i$iBvB'$N8?8hP$9` Z=4% IYGJ%NZ dg#\Lbu~}x'uO#= я}l6XvRJ EbTxdzA䬴 _2FI-n$Tx": -?hy`9wZvQly2-OZ *N)ßEˋU~fUj!U|NXY>^F $Sg4*8IHJ1y)I)9---abeXj*;r.d %et:= Uv:}_}pi1Y&-Or[\[)tA!8TM(;qh\1#mP ޕKJb̧។1ӝI}иߵeAcgd(ec;-c3N|q;?xkpAX~ !-{+'g_(.idlΆ4D\-oZ6Sv/,b P{~a eCXbse'&.\i^A y ^ռrۆβe"l(+JHG2X)ez2eR:Bgx%MՋ[_c2?2bDtB Y1AGCgx=/;9sY)TfD&Ɉ&M_lK(e{^th1u.ŋ+~]}᪼k0Αe)OZfDˆ #%|WiT:#eDʈ2zSy?]2G|Ppd]a3NG: n0 :t4AG9ӑwJ2lu/2IGn2՛՚9=e-:ZhrDTGp. , ALم']ֻyvads)E[>,"TWhB:5I*O ӔґґvBnUfȘzt1"cuF3:PX~th0u x Ձls0^ KKn, d[va`#6ň-h֤fqhXQ

 aBX_SV2^_eڕb}չ:W=kkvL{N{53u~;(ei 6A=&![ʛdvv+g3l2xQl2ꞌw1/X݋~.r p4cpp4˷r}.F4R(u;6-nyW+ _:a88uO**W];2 5oR0:,kK.?ru Jh`Y~;vaA~k0A4i8k霵g-8k+{BI4&NOVNb\tX97>$a$4J_By2/p cSHCs?8설Ϲ-unK뺼ZNf lBe%섃e~fCIcXyB ?)iĩZcӚ⁤IF'?Fg-t?H#F Z3Y Ǫ/Q l Jq I#2lL҈-J'dc1Ic?D.S;l]Vb9RR%b9oV '!i4hVq@#N8iy\P҈%%d6ˠԑXa6Pf#_IBfCvBfC И kl }Ic'FN1tp љ,gD'g(Riij pm ̆:ۆ:lM4}emcR&{$99nLIXlXl,XNG7VeWT*;/#Tv.(b=M(5JI Bt iii`] !Q4)VjsqP=ӑR?bliiia#cYYufF'^ɹO# 6 `1Hc0X5SIÙ'+g9wuXgISPv294&[dr&d6鹱H#gk:rTcll0޿gp|MvʤQ~a/=/; t]֕jRғQ*39!_r{Rs(dU/ $ e)H5ҨCn??+81)&XGYYuVYgFgSWdLNBd%44!F*N‘/{h)K)#'%Xe҈ӀLF?T6J*drp@Vb-ZdXG4i,Xjr/#$am9C*vZN8YikU#fTUs傲F YVHCHCHCHCL29JV(Y)Y)Y tBR26$#+#+#+cC26ʌ:it҈'SiFuH;M:ٞ;` lH3j r6xUdlH.L!459"Mʲd5ټ'Y:6Ⓧ\dHcb-Xlϋ4VI;QZRS6N8hijRJVY̕P)5Bjd՜pR"lHeّFo-o[$+%+eR֠2W\)sdeA[8z G+c:Yudc0Vי>(%\uuS}p` *.!AVcAٮٮ5A,trrjd b0ϯuSLZ琌H*ʧt"\-"vvo=4ė?Bag=2xB'ܹ:p~nW#P4Nejdj?PaYHRH2ʓ$c?2u)Y @2Θ+c@+d6jlfͬ3W:k3W:k0\ j ?elf: tII2FY9SdlNVd5'S7j2W$\M6\-Z$I.\XgXLݪ_TB{񛯂N8 , FVMɪU#6LVIeNHRH2~=z I0uTfb͟PJJ:LKH;!S̕2WFVgL]lLFYuUg:Sɪ3u} ʒdg:IA$9S7asr#$I'Igܑ+gꜩ$9I쒓&Yŏg-!+tk'.Hrk,"xxw~wQs&zLT55J;*;,9ktF-ѹ}5I 2@tF9J@RJ{IRH2fd폐$$c7qdL":IR:#M)Yn_A4frO"$I#I#ɘDd́dȑUg&;3Id\IAd<#8eIGH$@fIIY9I:Sol$'INdP)5N˃ЩLm 3'Ӕ0BL 3)$)̤?B&6^R%I%IUBfbрp ww& eqT*III'Id'gƩR$cWtHI2-)@ g)L gƩ$I:38d&Ё$$$lN$c2IN6LNVwL@d&c"g$I.\$!9/r^xVX3YJhT6J; tI`dkRZUJ΍$[AH$[\L!I I 3)$)$)N$$Ieb(GYY$LIKrpsATV鞞>ؠIdlT sLONZ$39䏐@1,;9;9;I:I:$;dbct I:k?Ryd쏮T b'IN&v2sX2[".-r^HrU3fP~ߠPY t*;ȹdBs#Fέ3&rrr%4_`<g!g$%>IڿBe%4*wJ \psL^Qese slQoBHNΝ;Ir\(/gUJ Ď$m89;9;I#$g'g'IΓ$'<96bG'9OGHΓmc/\GH΋9/r^9/r^ʙoW; tNJɹs#&LpɹmκZv*Ͽ29 9 9 ,7+K{g:.( {7S6BrVrVr3ݿl'1#g#g#g?Br6rM\:叐Ar8"ɘ;9ym&Sf9r<9rvrvrvٙg'g'g̳d2ɴOrlϓLd'9<Ӿ̈́y1틜9/r^o\8+ŭ<?(Gh_i8T?IH΍[!4ДFi'/qLME@}QP ʿN8YY֟2%=K~PYYY!(90Sg;dFFF69sg;9wrGw:X󾊾!7J= 0~GVP|VDkK"Z4ՇTCShM4U Tj'Sd*L@2HTJ S d*L%1Kg,UrTnR}Y*(Ke, TA*RY K%cd,TRQX* KU` ,U*TʾRW*Ju^+v®Tɕ*R%WJ[t+nҭTjRVJY8+UcT~ʯRUJV*[T` RUJU*UTTBJRT*JERH*UETRT*JeP *=T RS*tJN)U6ʦTٔjRR]JJX)+bTRuR*GJH)#TRQ*8JG(U TaJRIQ*)J%E(T4RPJeA,(:TRP*I?'UJTJ{RiO*I='ZTwRNI:Z'UTsR=NI8'Tq*nRMI%6&ؤTSjjRM*IE4j&UͤT&dRL*Iu1.&ŤBT aRK|I/%RTےj[RmK*fI,%UTURJ*WI)>%էT RRJ@I($TcjLRIi1I5&$TEHRI*Ie#l$Չ:T' CRaH* av ;l`nC u66ivÆÆ†Æ 5l6 nfՆ U6Tm`KCXlP1bCņVQ*#R)D*H[L">ڇTRCnH !3rTΐRB_H ~!,T*RB*IH% $! TtnjRA*:HU UTVRA#HwKu T)*R@* H ZT j4?MOl4?MO4?0?30E?E.LSÜ0'?L$0>-̺ì0>Lü0>L\ D0s>̜ST0U>-Ls0>L0=ܰ,~t0=oÄp0=Lh3 0=LYSͿ”0G=Qä0)=Bw ,0}$03 6:4p03 6ü0o3L 5D033S S1T03̽ s/02L -d02̮ +tП?L '02L &Ä0C2̐ 3$ 0%2L S"02́ ä01r ,01Lk c m<0q14L >T SC051E \00thl006 00' |8=L Ck0c0 0E0L sÜ0'0L -$0/ B0/L ü0/ D0/ 3̽0U/L SB07/ Mdv;L 0.L t+;̯ ݰ0. 0.L -ÔФ:L sB0).L ,0 .̂ ô0-L{ B0-Ll L9d MԵ0u-L] s\0W-tZ09-F l9L? 0,7 BO0,t-3B0,L! Sœy8 $0I,L !aÚIvIvk%%٭99%LI5$Caa!&&f$$$5WIVIVIIk.,,92*4 S”0* sB0i*L B0K*ty Ӣ>К$$$$U IvIvIvIvIT%ɔdJ2%LkI$C!KUlllllVUJJJJo"""iz6s.͜g3jf 5;YC4fPӜԴl&5@DfO3Li4S}6ܞfnO貙Ӵlf4w;fN3]?i4& 9̈́fBN4iB6SnƏfM3Ǧcrl&4Y4,c3m6t\l4dy2MfbL31īif4/MfK۰ui6[-Mf6K3i9L_iz 6U*MfJ6LPi:63R)Mf J39i朴0aI3ɤi*if4Mi$4fI3i4"DaUêUuVխ[UZUZUZUZUZUXUXUXUXUXUfUͪU5VUZUjUŪU*V?7s0>p 0VjYղeU˪UMV5jZհaUêU Vխj̅hB4s!>cfCIvhf;4 W3gUUVU\[Vetn6'!eU˪U-#4fAW+h4=Df"حQ7I/NzqҪҪҪªªˆˆˆ5/NfUͪUU#FTQ1bUŪZ-5fJ5}sjYՒƔgWGhUêU i #FԍQ.FJ#((**# #jFԬIIJQ5jUUEEňl\nh7W9%CNsusͺH\n.R7mm6M㚦qMs \n;7ם3MBsO'\Yn,7Kͥ͵q楹ssi\n7W-EJsWi4T) o\m.6pk5fEmӫU÷FҴi47m4a"M k$ms\Zm.6Vk͵Zjsx\0Y4&tY)?vaN1qhSۮX@CVUmn1b<ͻJhS78R+nV9)S%ECJ287RL+f'Cn늳Ž_;9r=,+HqB8QLlU Vխ[UZUZUXUXUXUfU|_9 Q.Elj6=ykDqb8PL*ng (s9 YU**"{-Q0u.: m mPsPPPfC͆ U*6TW]Xkp.a :v6ą4xÆ4ViTii"N{N{,,_(HI4R!dFdFdFdi JJJJ$CPafG!C-_/ J<>fz4<v;a=ٽtK}K^aӣ\ҥ#N:⤽.uiK{]^ Q ՇTGGGGGGӣhxyyzzxkռV#|$ٯٯ 0<mml>gb +pytyTHՎTHՋS}]T/NT_PՋS8WpxqOY)+b)8Xfoۻ.>VNJ/d^_X{WYAXlG?G5/FJ#jدb,ZV7i_" uJ ڟ?PjC;vayԖ⋤\SXt샾ЪUb /,39Oy6 `U Vխ[UZULa]j؀_}{]~`fvo+7~4_џ\x|a EhpX8, ;0j>֏0շ63o5TZ;X#8,-KE!xZ>h(d]+FTT 6~aMr{45$>}a=wuӯIVs7eMN9sn~L 4ih>8|`wr>pMUVVVլZU}ΛM'ʦ/, <Ϳ>pݚӯ0S)g'L`}#::;54Ͳ7¾=Y+j`=G|1ټ |:2Io2wNLL>w!uVI:1CgV|38e1W}ܟ]70.m88:`p` |`n,.S8]6an8Z)))+׭ aVr ?;88E_6>,ǔÇ+r˺ǿҽ][~>. #FsܿsFH#_Fx5hm4o/?pqF=L}40jG ]Q4*_Q >/ _4l[=w݄l7颛VѝDΚvLQZ~ɎuctۻsL 7knhwr/\'ufyٝF뾾:"ܟ QR iڝta /Gߝu}uhz׹]/뮈}s#ݕSy`]!d}ށmk>pRm\>p%2f?ҿ.sNҼNv+:sbL,'f4$ISA?p;g?k &i@X~`PK׬ʩ$>? yx|Rɽt.H`ܿF0E00.ۅC[,i|?0,_'%@BpY'bw$o^us3ܰݰ]?>Եy/FwlQ~~}}d >p՚S ǶF<}wui 5O|{|>X7gմM'y)֌y['ְ }M֜i7>jfM}WMd@ӊ黊zoʦMV]]>G?pS\da|1jʵQr *&'UV ɳI'D% ۗ[=ɵA>U]?];$.\>GIA T?Eff]!b*^h$R'$ɳNv讓:yAO$iW`rLk'v7jgvҭ3@M>j _wfQ~N }X>4*ߎs+]sS'7߄o?woMg3 >_w{oN;z}~{?ٖOs!W\fz.{. <7`~F{nWzﭝ_Ɵ3O-3N3ѧKvO߷w;䧳~憶3޳&y w_!߉l;oz}8N>-?j~/uEu gJ"^+|9dW8_/ ?o8y9،^C?C7}An=~~d?=|~w< y^{`v5p}lpGϏ<;C3GL?3eϣ+}Z=~@>x~ι?sp}~w},>.!>42gφf6^w~;.8f>vgraaqw8mhб_l ]q!4R)~oX;Nؽݫѽ~o 2gᆵ[CH߸=pt.; 6aSpp >/Va=La.Hx`6a]8|OxMo|= wSxr87%/ݬ\+=}m3=C8pUQ;vBIIII]WJ6d^>&S?)c{$"8h(ݬͺݬ{麗Hv^X=ZUGu^7u^7u^7q#0 azt2C<~~!\@:N;N]7wٙ{V'J>+@i\'\ M8 ;00 Hititi ;mhJcвx>S\@.wC.=d u6mhаiC{ct!q7"LPTa..!!aUӪU-9/9/9r:?D؅ЪZ`WU z<4ЪU V5jZմeU˪:ثjc`-ZUfUaUaUaUiUSxjЪUMVjY2j6` 6UB8Q]hUii!tCV5lw4i.=l/w۽ Ux;n׳!<'vmw@۝$y=CN*C8 Sܔ{~0)|Zo8Y\@ 8 hna };-<-,wa!{.h?B " @oVoZ8,p߯C8C |~0^^^pa!{tv*L" *du5oNu!<~Y6t ,?!< p[PV!U*l(m(m(m!xvN64mhвeCˆwaCPpkpm_q< sm(mPnC݆ :xuдiCK@@:l谡C~5Mᆴ>_)<כ]͆qChCaC!ɐ96LIvIv64$9%9%9mhJ)xq .`zn= P!ɐdxnH2%LIv%=wiSs.I.=?0<Lk.zn[s =7<7 0=7ShϞu .-kϏEky>欧~4_y>Ujo{^){3{=2]mog~>?k2ν:/[۪2ݽ8/K}2|oC|e\]Vm~y^\WDcgPꙓainooK:M罚;{ivgsVy{Geyp|ޫ<^ޫw3 m/{uklp^4W7x m^U7q^}{ꙉx^^}z]ޫ߿x>^.<\ 2.=/ ~^f1[Wェzz>^]ޫ7WOx ^ޫ'|WWC傧υ8ߓczq>?ըWvռ?v{ ^ޫ7W!WoqWOx{6/ˮޫ-`=~t^= ^N<7;s!<o^nx|~,膻^{ ,uݼ^} ?>7 G^z˱ãI{QWoxypy1auCoWoWo8= &zùU^a nP^=ajd/+{Y1JDnFup,K ~ޫ7 a0HC{4t{>pzW=ޫ l_^}`X8-=ޫ\W=ޫ=ޫ{{W=wx\L+>ޫ}W;=ޫmbw#{saӚ^};x>0&pzW8mh x>`X^} 4R){w#{\x7\M'^}` ` %Mv}C¾C8K=ޫ& a pp axް 09]8A=~ޫ_^!~^a {Wo1^^!Wo_z! aCb^!$$$}{Wo8+zC*vnyސ"jzzz6M{݆5k?.\S w 1WoxlgS w뻩5{iUiUݪUMZVj_WoM~ޫ7L~ޫ7Ҡ{?7<WoW蹄py>-~ޫc?.v)^azn.`ṻ{sy^>ޫ7ĩTZ+:m 6E MZ6//oU{ޫ;{5/{ W8o7갪c!Sѩ|^aZUZU>^пW*У^OWc=Z=Z=<< GӣݣݣããӣӣˣˣGVJUzk^Z*VJKUگ~_=ޫ7\! >3uèLGGfnfK׽tGHv/]u/5tK7 y>Уa:?ޫ78xp2e$@i IiLINi,I.iݛҽ)ݛҽ)ݛҽ)}ιW7LI$$$$$$$$-I>$ɨ15|}}o{u<8Adx   pLޣ}K{u9>GhMs4WB ܷnW7Z[[[zhaiipYxYxYu>Ww8fkm^ݡipZ[[[xXxXxXxZxZxZxYxYxY:;xx-eA 7 7  <3x ?N O O "aa9H`R7^ݡZ 7OKu{uiLv^axN O / /]{a/-_.ZxiLuCZ[y`kVoVoVo \+o{uCVCVCVSVSVC8 0|y Va 'p(6F{u!U*eJYuYuYuYuY Y Y YMYMYMY-Y-Y-Y-Y:lfy`{u S(U*d6666mPnYM64mhвeCˆ?l!OOO_>}էUigH;C}yІ҆ u6mhа˭! igH;C:A:Ar߫^}`wqfof q;.tDž:oEhC)ɔdd..!aCCSSӆ$$$ -I<$ɨ15p7{c7{c8 {c 1Dz~k6)}{=wߍ^A7'|Ws.I{!}{p }{C8xf 0=`/N/s^s/챟{{`Vw|Ws6wn|WMsvϥ#-;Ҳ#-;Ҳ#ޫ?s.]-SxpN-p|Dshn ߂-[Hi4R)....!!!!!)) h8X]4nV.vѰ]4-iM1c.cxE!\}[)FJ#FFVխKK0aDê444M#V5jYՒ2eDFtXaUN?ModYvy!tq` `VLРݒ AFOvr 2{uLq2tppph)r+SeemmmpT8*&JDIGQrT9&j8Njsuu/e*i!??܎ڎڎڎڎ GQusz/Y%KGQrT9ՎjGQ(n.o.o.oﲮ˺.y ]8qp܅x9{Ǟx9{Ǟ8>υs\8>q\jW8\jW8q5亱jnƺqFZ7Hi8#g!r 9BNG-G-!K%2vr B2 !CtT B)d Y*!Kl!-d B!G#g9[VN>N>N>N>NѶ]\Pv;nwpv;nwpvoٟtr:RN.'eo'~||||8dJ+>Õ W2|,+dX W2|,p%bgçtt,'/#,'/'//v6vv&!N/N89NN#'FH'2B9PNn'Fh'ڋs|p|p¦ \ӅM¦ .l¦ .l¦taӅM6].lHM6}taGj#5{tSnHM7=rMo6tM7tn7o7oͯCn\r#q:Gr#q\ru.׹\ru~c=V8~ʩmRu~JOQ!4 #Fi(R4BiTF(Q4j#Fm֨#FG15'O9KTR1hRi4haj44ZFX-FKhk5^ZmkB0BhFQjFQyJZF*J֨5jZ֨5jxFGш?q?u FCЈ !FShj45hi4Z-F[hk5mB(4 B(4JR(5JRԨ4*JҨ4*JkZ֨5jZht4:c3Ͱo4þ Le)5 FChh45xH7a8$Ͱo7 FQ"5X!a(}(7b?_mnFQh B(4JdjFQz%SҨ XW4*ʀQklڀQedht x471ao {cư7\ao {cp0F18`ao {X#0F=a {X#|528`a kʮ474 Q0 ҀQjLR4`iT,}K2`[_mڀokl}FǀGߣ1|e1U2miL[e*Vp2miL'Vp2mdZ2VN%3mdZ2VN%3=LKfZ2ɴd%3=LKfZ2Ӓ̴d%3-iLKfZ2Ӓ|/,e+sr*-}J)-}[S[ַ x=}Gc껧ʥTC1}G(N}Siwp]..}ˀKߥwpn}a7 oL}S4`iҷ-}Kҷ-o^ַm}[{ x=}K#miHF6OYV;}CߡwK#mƧԗFڏCS;].}Kߥwn}[߭w }C7 }C7M}S7M7M}-}Kҷ-}Kַm}[ַm}[ߣ}GK_}|S.V2w;¾ *^.b 1S)czqTS)cXb,1KYb,1[-cbl/ΖjKb!Fb!F_axqR#H1R#H1R8%UIUR%FQb-FbiZq8b1G#xq>vlظѱq7:E2lC!I5nTnܨܸQqrFƍ7:6ntlظqp7*7nTjIZR-TK%cbl1[RmT[* 1B#xzV[>PNRne(S)UJRT%UQb%FQb-F^jZjTG#q8b1G;#PNRne(SYVJ5R TC!ՐjH5ĘbL1S)c1Ř^)ՒjIZR-TK%ՒjIRmT[-ՖjK 1B#1B#Ĉ08)UJRT)UJRT)UJURT%UIURT%UIURT-UKRT-UKRT-UKu:R1G#A]OzZӺu=i]OzZӺu=i]OzZ׏wKTS)ՔjJ5RMTS%ՒjIZR-TK%ՒjKRmT[-ՖjK B* B* B*JR*JR**J*J*JjZjZ:RTG#ՑHu:Rn_vۗݾe?R ߺ)r*r+C)ՐjH5Rq)BN!S)r \R-TK%ՒjIZRmT[-ՖjKRmT!UHRT!UHRT!UHRT)UK)d B)d YB%dIURT%UIURT-UKRT-UKRT-UKu:Ry)&Dce(SYV 9B!oOLe)RS)r*R)r 9R-ָB.!K%r BnT{]J![-r B!dHRE\J!C2L!S2L!S*R B%d YB%d YRU_J![l![l![>Wy!|C9K/e(SYV 9By)eB!C!8Wr2Gȳ/G#||)ǥʥP.e+e2!c]JC!r+9e2OSR)e^]K9KLe]VʼeBn!2o[ݗR9dCؗR9d!Cȼ]JS9̸2)s\Bָ2%s Yy)e.K方ǥen[R2g^JG#K)xsʩ\r+CRy2g_JGӗs>.r*ץP.e+e2q)0d2G^W<ȷɡʥܗ2y<ϕ\2/k]JKUK-[-y祔y˼eۥ9dc_J#!s4Bʜ2缔FHSKi9eۥ4B\2׾F(KKiey)2̝-s|nG#ٗG#K17q)r)2.e*Ks%oRne(SY }q)0eRaaPK[ʼlar(\ʭ e^R\aa!X#/ƹs]J#L#̼FFJ.#,#y)Raa+46ŽKimm}d!R!q)FFH#且FH#2.#帔SR2u)PFۥ4Bץ4BRJ##y)pppR.r^ʥʸ,e_J# #q)0040¨K _?(r*ץʸ,e_J-#q)M42ªKie}FFRaa4w_b_.\?}|_|/_>s~7~zx 8VWr"0 {S3]uyyovE+oE݂g/sݗG߻#۟9e]Gڸ^c:in:鹿瘮m mxksUU/?Y6=?/Or >_C;ǿ_ֹ-^ߎ|+\^\^%/~?? ^2}\}b~V/q, _6a?Ys_ݗƺvt5F~?^uM ?j|=_}x\_ܷzTBiƿ ūQ7\ߋ ?v} endstream endobj 46 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 51 0 obj << /Length 596 /Filter /FlateDecode >> stream xU[o0~WXKb]Z^Ӥn){&D!H¥R} 60Ve`;s ;vJ|,P*O5U Cɂ 00%A~w%jH[pQF/"CCQV$M84|bi>/A<ћK7g7Q!iDQZ~,rXMXgqVkEJz;`'^X`[WWǏq'3b^Xh4k1. w!Ptׂs^N9r)iS͋$"q`L̲"э#ȄLEU$hO dP=dL>gw;v{Rdʬz_XQfX^WX);7y uEۛs?}߿eq#ϫE!:@DjT[ml endstream endobj 47 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-7-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 53 0 R /BBox [0 0 432 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 54 0 R>> /ExtGState << /GS1 55 0 R /GS257 56 0 R /GS258 57 0 R >>/ColorSpace << /sRGB 58 0 R >>>> /Length 2068 /Filter /FlateDecode >> stream xXK _e²HIZ(lI hÇ458zQGec H-b7oˋw݅bJ)^tK=%E5X)ᷧ+2BRG؞kL#;ĚaR KTc&3sb8{`ɤ>hcKaXi9#1sP)qX\Y9-ٰj%*hdA#ǙbPttR%$sĜP& S2ޖYb24W̜PjS!ULL"rA{\h0I'v_3Σʉ0g;8dmNHMYF.&E 3!^m9$0.*yUno6tLΚV0s,u$~\.,ep$;tv^EvG;B2{zVYP n8xaVB9o8 ԃވhןGizQ8%ﲪ-NʪDmlnZ9wVݷ2&YP3BY6d8qIDnR$|E(/Mv0ks9d ޑ hGI;@,;~ j=Ay59 s}2x<3[!80R"p(X1֍:T JYF~4Om^44kx9 Z6BIQskgL+ejI*l+dl h";cZ$D(Cs!o #! 'it$s򶑅vLKj;@ym*Xd&;?E(m+H%G şƮ|4#$DxXO$b X s(ځ$;@$Ԫ0*u©{)@SB $|ul\ j(4 XPQV^`:u4eE #g AU3Tv:I*Wd͜sH钄,Mb~uD"<{oC /)@sIԟ bl[@hd&f.:OjҺF72^ z}~6ɗ~dp7M`3@&YLǭn~jZwos{j颠xݹdp,A\ndg?#y F*l [Z2AN|K"&+r\?&+3$11Y.ecnP BW_'n$u1y )ny"E]8WUخrFmtV]tdBLrA`a<]1`zҫ.̓jѥܲt n0ˇT%iv9n=n|TBd QQh'SnD*}=/ SKw;[xx=H}]ב>hh:*Q8?R~~[)孩ⱉxqW?0z~&h.|/>d!b񸥒}D[֖G躶=vJp{܇'~ͪ юf lt[kԬ=Jy02uM Ҟ$Ʌ!,:e^3ǗǍNn^ǽ2O^T?ئGN]haPI{%J4.+sW^YWˮ}X> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 63 0 obj << /Length 1159 /Filter /FlateDecode >> stream xڥWmo6_e&Q/CSlCڬ /`2%E_m$ `swH {&ض~Gz!#(M/_O&afvo&"+8fe5n*`Cx$SovMb{Gib/_4TɈ;vfmM Q,VS:f)鿳?#8%%;XBI+DivibPܨA#U)B^J3MU?1cA1 0v-u[i(=J8mŪX(Mr)!Vǃ-,տ `,T4ٺ.\ZجјK16E2M _fL{X]=, A;8L岭ZcC0L@= 66PH)[*zkw>?j/6zxd4vO3]'ѫ|p6.e9uAgXݹ$z mWn;Q8yqS/_O{^Txa֩pƜyp?m>7}/[|l9tN!~}wm$w\@쿚ILh_0[ Sm}PAXjI̸'um?6_5p/;co?@x 1<<ܜI?ቃOO G=+ԧ-7>$|09~܂ `2T^80qqx bCx4ȝ>es.u(;t|ze[#c3> /ExtGState << /GS1 69 0 R /GS257 70 0 R /GS258 71 0 R >>/ColorSpace << /sRGB 72 0 R >>>> /Length 3326 /Filter /FlateDecode >> stream xZK _1˰`h$HUbWeA@a0>zMǖ-i.t|s|yԏRY+e?|y˿})#_~_Yn[:3_κ*Gzr=K:^ڔ['6_9':,gbƹ2[JlQrZbRklfϤ||jK&[::6uŭK;[ /@.r7Vq^[hKny 4fs֣+ҋMނ\fzq;<9eHIq&fѳLz \<^dނ\\8bh:u{P.Z5*k.";*Q8u59_:8ZsmebG~eY^dQo_[`A69}6-(6W Kg'5==(^!KP£n@X®[H`Vg S U]t!u=!jIg}'N#V",Z]_)+$l/K>`Zsr1'wKEJC'3d7MQѣloѩnɒ:1i-g5l)baP&$+];3ិ{2EeԴ}q23׽E\%{ FjQ -3OE$&ML)TCxf^x@7xEd ,=ia}kG>!XX~#|%03#2wOk_-㯏M' WM6f>(2x4Ʃc͚_cMΎ/WS|w ޅ@u-xcc\KUnۤ4,q5s2bzJh%gH}`Ɨ]lTǤ;pNP4a͘U<69MJHA8kY3’sl=¢x`0d,DbF t 45(,6MSuxDf 5dSkF` Q޵q=^${ llM2ؠ_l-BulYslFv6AamCֺ\Mm002c?Ѽ0 t׋pӣ'Gc$(в-`D@DH+vZ1%H{+D~B{*>y#42`Pߠdl0m.M@)\%6 e|+IqTRbMyoVX@ uXuqp;*0 VhS=TL`<{ڱj5WT5 zlkv6b[۸LJ|S;=bPQ%vI>ww.Uegڡ6TشiB@b+]%e(Jl.AⶨEP|^.U pVo]ЯfTk%luIEu?*QU} 㮠IbY +-/K9MҢ<Wqx]τhYŹe*6S'_o0&1tC~<++6SF⫫lFtNޒֽavrϛ]П(/`Mδi&>/7mp{#_oxҷ~lrKJe]3yQE3j C·Kb-NWI"]Р}XP0i'cP3m>`LP3QC7Q5 å$` $[A(P ?yeۯȪbH+4BI#0iL`"L'^IcB5B= H h~W9گ - .RܕSH(ґي ͨl .33+-6 +Ff:`Lwo M8 9gCNg@T;4 yl, l3. /`u3ukC@G{65Lba340 '֛6LDh[>Se@L;=l Tf$#|ieȂ˴"hJ03sNF?){G a]]Ns :PXN 90evٛ!T/o0;$p11,{P)kQ6p/ztu8l)M'oI'aނ[;;0~D; U6P4f~6C.{ffXj7C5oЄ_yf,W3Dy34GE.%y.E@l)*%Jȱj)8Uܕ@s5ˊnR>@fȶQ [>AfHfqk=R?9 P 0JFeZ9YbRon|829^jֺ ObƟwneQf +C?렦G(w7?>7ҍ4,;)=^%ro]>Wu?鴨@y4}^ׄYV(z>c yv[gIi=IST;Y_,&xYʇ0Af&m@YWMnd%K2~Xګ{w/T᱾Bm,ݏt*?SYoJ } ,st˲^ǟm ['y,~C{FvЯ ;I*')=>Wʭ#9|n{dou?poدc퍇' tRٿE֓Ї[(l<Ԏ>E 7rIx賎{#W'x㡶q3 ֙&4x& ?Ͽ;s¯cqx箤˯-Ʒ*'GRëԫy/x?7.?' endstream endobj 74 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 79 0 obj << /Length 571 /Filter /FlateDecode >> stream x]o0+vJ=N.zc40"$NbmdHpC+9o w"׾ZK47b81Sx!7i0f3 [ t mI2]~]ð!Tɸx~4j!gxۃAfLk (rk;|D#чWsG\7Ln{scS_YM%3?NdxGa/ 5E}7H[^^^AKGq,h󢲽}Zȫ$N|vpkV6Mved6,bF#"і}t|׆O}YYTuK@\Hi:+7Z;DOue6r$y/]r~}$ۭ'Pgpyo[FޥM_*Rc8-%af0K!gv<}zҷ$'̖[I.Tb$jLmbb~%٥h8b 5tk#-^z endstream endobj 75 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/Diversity-Vignette_files/figure-latex/unnamed-chunk-8-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 81 0 R /BBox [0 0 432 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 82 0 R/F6 83 0 R>> /ExtGState << /GS1 84 0 R /GS2 85 0 R /GS257 86 0 R >>/ColorSpace << /sRGB 87 0 R >>>> /Length 1352 /Filter /FlateDecode >> stream xXM6W1{(/Q䱛.Z!ȡp6E춍Yl-;F=#-wT`26 IWd\uwki:0 "< EjJ`+q%ֽJfӈǖ ˆ16[:WƶL%ς=xuι0\p|r~w3.6MTӝ, qh2$'BvkpActѼs#!gU*{WkQ]_lo7$)z`5-K]Yy)bV^~_꿸i%|E#\ 5O7K`9}E]yNqHa9nXan<:0:TtDY @ziqդAwjx)?3O鸃 !AФX/a*06VEgbmFyˆ$Jtc:\?ndQl:{?\!_۷İHn1aᄻ'$ ~fcKƐ*dlIwg^ljxⒸH:RW pFsR, DX=8[_\حb5U56[?ؖ \-MQTt k^Kӯ-6Q]R=)gMKz 6[M6"6j_Wƶ&T)S?ws\~8jq.0Udz{'<6ljO}d]%FI;^pHT6ɸkEEm> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 92 0 obj << /Length 121 /Filter /FlateDecode >> stream x] @ > /ExtGState << /GS1 98 0 R /GS2 99 0 R /GS257 100 0 R >>/ColorSpace << /sRGB 101 0 R >>>> /Length 1388 /Filter /FlateDecode >> stream xXn7S1>:iHVrr(Hmc ;?$krjgp8ߐk0~=\TQMDp(&f|p7Gka2>¿Ûݠz% Fj S5yc=y^Ao;RSZ9T1w헖I(}VEǠ M+ҤNy״"MZbM]NxM/bGl" >KnxZOxӑ;ܯ*6}9M_bӟ}3a,{yS4 XZ v+ƆH1#G}^?AΉ98jAwxGY) 'q`넘$X+B8O0qg-r痯<V$HbnarSa*(2,AznB8ۍarձh tz(,qrr'L"m]JD2mdt_M%ڣ@T.NE M5%X84 Uzx`\I~, PBpm ` + kY_- G:E$2iUr _KזvlOv*Fqz^"~m$Y l_ůRЧп]DJF?:[ vcsGokN1_LlʼnV;ڳZqZRDq^MuTwl)Z.)i.>x7{t~M-?݇.='7|x . endstream endobj 103 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 125 0 obj << /Length1 1964 /Length2 22509 /Length3 0 /Length 23668 /Filter /FlateDecode >> stream xڴzct]vmUlc۶mv:vǶٱ13<3k~Vڼ^EJ(H+`dk`,jkDHVַad2010@ 9;;s؝N&NhRç`6vWr3fPlh ?66Ɣ.BvfNb0[ ohihiз1HIdl]? [ dPVQP)*)R}Vtu?.BJb4a% @LYQϫ'SҧOO?"JJr"`;8I_>M 3'';.zzWWW:SgG':[S:;);\m,V賜Nf%)sCcG?NPZS/bpGcHcZFIilD!g?9rWR\wLoe8;:9#1{?=3K&- #!*D+9x6ҶձsrsO<a).9"6FB֟ONN5Ֆ66-5112Su#g;zes{gc A[fj` kR?Kigk0ѷr4671|tw1898{{]`dn96&?SkR~P#[+w 40PcKJFژ? VVi_&RgsGQs7c#9s'CTr 'ϡ12_"?s`??gthhic`cKeYY?lBr5.ۘX 3 de#c@Ogcsv:@i$;^@//`Ы q~q > 120?2}M ;l7imoo3 o@7osyNs7Iok7I/sO;ŠNƪFn3wr0wdd??iGueag2qpY?8lOB,rY6LrҝUIƃOw` eJsi$Yo&UMQSȐ^+"g*ru.qL?N0<Hs9T17uEHoߍĔcMV.֏VNe!ACU ] w TO}k!ty_kgFwXÃΒ#߮>TƁ[󻽚kQShB{ l:?YOq*}~[^p[ڍF+67pV0ռ}Fp iħ#u_gZna!L{Umq3z 9tCr" ¸LR )~]So6 yN)ste$-MRiX$Lk@OT733*}6z]qHxC "N h<]{XJG]ayབྷiϦˈȨ~PR ny1hWY%:uF[BW5Ҭ':>&rCʿl$4e ZPYpK4O<&bڷJQSDvyN}gE44ڂoh\Yr\D#4LOx-rmƨd礆.Ey93"1 ݾoXE@B=$BW ԘfÅ iT}D`?򣅄+*̸q*iYH&cJ˷Ä;| 5RFr,I Omv+ӤE"a,ʨkzN#\MFЏ펼n=DuPڪ8{璇~hB6;Owm xc:㖢1Dy6R>h2 fʺZ9]!xnI-quՋ G_ؓP[(8x$.%iG馋Fokؒ"(I!EAyP@[T+DO&t#_"YIӡsE2rB\-J I/ۢ* &D} CC bC9}od͡ՋR9QeƏ USN1 ,OtVP4Pθ-"#u8J2+ .۰Օ-^>'{UA8RqU!mL#8?I1dbMO O.u,^:TCO[Hu*_w8P9D~C&JxDdD4ΌNlkv_*S|PC}p/o[_]{2G< Hں#ۉ2Ÿd~1ţP#ay1ub/MSiƈѯӕp`I0:@C;`<<|_{4Ds8ZTUYf| '֬"رb|7B)z {fɈ-ʼ SDQ7Y֥-9A8w?;پ7IrkI-sbJgc~[-v;qd0}kQsȒx#M+޺beA6y V5 9Jw;'G{8HTq}"XP j>`.X>C:t#k J]ОE~I{<_L7uLYs9G#IX &=G 緲^B?\Qn[G%ܢ(YTE-M>r0.\(hrG,``;_Z{j0oA:ۅK=mVŦL. ^FWb:t%2a>וO|܏ړD()J.+5SV ^pU{Cqɒ [UXicWh1C%Q0 ǴN3`Gtk/Z|%8A悇?o;HZT ǀ >k=`_tU]iE/V}Yrޥ(dnjSѲQ-v:|4z2 r+U['aݖGA:vK,͊ZĽQIFZrL!ҼZQKZwY4yU7t[_wdmPjpj [?1۬@)aa. y[L0{$0Sr^AO^EnӕCV8zҗSD|1 q~W}wVݜjEwf%[ol+-E5dknȜn){9|s+w? -ev_Qu{^Tg 3-J K6y > U *NORs Tz|u(KI=LvƜԃoD4sI@GlS*TJF??W3 ̡',W*'-SK5<?^$mwhPﶉ#߀/rKCêqJ+dnb,_Y'`XRO|RgF@fr/?LB}S"@,ouKj5D!XLʠ]\0jcbfTLt(e,x2۝}R 8]l=D_Tl# [b"U-vN25^W w]=iCHg\5Q`W{'SXZU)|J,HꆻNfz-6ғ#ᦅhg^Ŏnx#_<ԇǟ  ҃PbVͼ`Jة2'\ I,:ieIK޶b @ ~4>h !/b5<&iC`E@`Er(˩k!䪤@KdmzН*uIMl9?#d:FU筈+mDĄ,+ls7s-:,J~Nf)l%Y Bkwt[ﭼ33UqHA,G4aœoCc@pS̓  r);s9޶M}ͷ4EexH)`Pߍ7lMik9|ZTa!A)v/W?j.3IBl_$R/hU לTQCwM%rj8pH`_SӒA i,G)%TWų`"^"8CC@O+2cuXlV؏lk#Ym߶<ႢDpVr;jַTjawUP GISV)r2ʷ'LV T};5˜bgg#0Ih%[,FF[̦ e2w;hKgv%![|!N CxxC_r#o^E>nfO#WnSgO=*lx =^7+y*AJ%ztyh(C|])zY:mjKrf`*rStA'd+F&>x+k*GȂ~M4C*j+]~XZRK!c2έ3VP-: _1 ӑ_ ſLk}Oʛ_ z"  :Rࢱ=e@0zR {oxc՟Z׶ɕXp SۭBl}ޡ&b!7 iXg: 0$:<"f-q ]{ hS9ȻZ [*q?.yQt9:QvOHfB<QrvݕSNl9Z@Kkx+bF3^RXx_>JݥYHh^:˹ZVrll`;+ȯR%`j2hƪ0RҶvCg*%?g@m-+TÆ1xMj($Z@AVׇe`61áe:(PSoOǤF)GrhRlu RտPh~\着{XːR,B Cq8(AofiƷ[&L[7b=35` dJ1]j櫿"Bg_.f>9P 0#"8s͒1B̽ptOIRlGnX_H#0~4=*+tuBȻ"ʻŠ(_6FqE*]^\Y`[妏q&&GΖ]l:j$h. :;bqަ(/q4IFZBiV5v;Sa}Z^ڶLqcCiEg>f=ϑʦ+^]/Y_l`&Pz}o0bKnw / W j]&Pvf[~DԽ*U>?x8%a9uԖ1cA)- KcW#p'%&/1D'kU>Wu x _K1 q#]vb i =x|0 ΁{ًߙ7[\'\]RgvT? v]gv?1.ćt{fq-hKll>#_ H%`aؿewG\M!JJ_cyATSjM9N\T%-'4<ƴ"8Do췣eGzraA#h("$ PR&@fW+;T= ߳6Di;’`v~>_JVҎ3MC]3)]O=̽`wknGJ8>̍fAdTfV6@1_PUd(:S(Tzh|o\;H^Mm1P\f6msr`Z@pG0/A^23xD5AcBUB&&vDMJ(b 1hA<ę.|o넱eeeZ?T,j,IbhLU qf Wlx t~LX!ڈN7+'9Rw+>Z|c#ZFmIae~_>h353bM3"=?g~w UچrΔ4«2} Bԑ1!s_lJȕ.p͝p%r*H;f-uo]yA#* :LQnfM9?Cg~?T0f%|"p%RIX!!zE?ul1LV]kZZŇ.Ĺ*"g,Exte4u5<&Q[ .}K{L(=sBc~^i'-q Хsύ+#_d}C-OPD1N5 I=YM&h3 gL#xjx5=BpFvRJT-dnJ=i9P&_= ;y+C/S\I!9($ Qew/V]A,1+^Jrۣ4BDfU?ϤmDĎ )-|FUHeY%}1܀0a[Pм؁ǜYHb4^6^L"IED/u^d D@)>`4/)2RmYbT:A[IA^u-%o3;/**aҙ.Ld#Wu2<" 6JYO JR{" KתkmuKE>@Q R)MDe4RCZZ\JpOM%(і_~|)j_<0S@?4a[›n|ɉZ4^{tiH^2᧤]7m~Z(;s3u a1vMzB(އGiGc5CCz0x9Yi8 YP- 7t Fm΂xuKh62;Y\Q%TOc> ׇ<҆Rי*Y\4ޤdӡ)ƒumCk۾{u!Wh)ƃ"'FZu ؚ lO{> / \,3MGnPʵ@ؙ OHQ~|tLL(!,"]| ![̆Nq8c[kIRx?:'pQdOWMڅ ֣FtH T2OT˳XgDiUv[^[$>Ёucyh79lE^FUAּOE> o"Ȫ6un ֔3O ϲ܌+́Rxgenv#퉶Y)s; *7홶^]K=ec|}.(:&F1"oNEP;&|;b)>:z5>ji0.b7O\>6O}emg;FØ\/OfiX U)m('ɿ1ƒ n.uL3& ҁ7ί;b)bJ5rObqIpJ ]GdSbHb2o^gQn|&3nK%ѡf &#Q>s6gݣ#-+B^ulwP:u"ǐ*1KJ֥Dw9àC- 篂q%1Iqa#aA^[ |=0H=j!UE`ט-&{uξ[.Fr N%[KxvO7+zM߅,(naH! o6ڝAqӯ r<@%Ez6"T濦8`oeUA<嶒CdVe}!*E_sw𞭻uBx1SVi\PwN_|Fh(E`F΀fW:N-+}~`>41Ym%\+ F䓀Ļ~t+cD Q9eSڗwn>;A}@Q6?āhn`s:' UA`2v޳ c PX|L9P):sS/p})H'(^Q bJc=d.065ou1o:ozXȣr-SBy6VRar4ݡA;FANkR_퉺;Epī!/Vj"iiY>LᄰQf3x@%;+D3MHf'[&&֤g7*x$)"O8AkE}ɗZi DӔ%Ez k}9 `C@Ubf[^ mw99!ġkk| [*q,*Osȱ(a;‰!+~;vֵ W&#[eG2Q@կSQh=$BY'=[2 >ni01LTF"ti2X$UeeYe ~qWxwY\8-r<H"_|Cs"iH; /|(({|MRg̎JEYM*P|-A2_Rz4Jڭ*2O Kݰ|GaV,u=P \J R5 ڼ#*uht>wϼc̃+U(;R4M`Hcn $8+mNKNrz59loeddl@2㎘05E~TDN *^UՒd CLLP $,KfR1-/ =e-Oo\ d`f͑n΍@AyS"|k1+54TaDL Nr ObZ}H$6#L]zP݃B;r=AZXYfGL[w}uw?pୣ((mџT~ _o~%ɸ4Z%׫E#} G_B3V @͎C%MuE`UNZ.&L%v]'< XaӭE?лD~xx=BQ^N#Ґxvιhc3z3Pۧr{5Jl&q%HQGJFyΜ|8EU{-{R85 $4Q3D,cx_M0s~"^jG)AGstk=8WJi,{.\W18B e({|L/llȪ_(z\ VB_[J: '\(Nۉty oo@3] \[2$-u+T킻U/˥H/UԄNqW ׬M46'-,^e!'ZPw^aEPNi?)o|jhFSWZ(GjPQA bϸNʌykvٯtobmj3;@Q3hS7u8YU#%>Sg1W%`cPFx.!\ RIp,$izsI%.wfIjƢ.*J%P~%pbQvBjRȭm>1Җ)$ĨxeЯ)75wG1>AϪGxu0os1ˉ]aLtu ]ed@*L(QUh"&=oKk"~XF>[`S0{; Je!ދjcc&Zpf2Tf1`aV7)PV]ʡZ- ^y!h. Չ )6Η]A1aU0P6,hyo M3qtbHǸ?PU@8=¥Mo -9HP ..8Cπj'@jQ6OIJ[#-g]`Ǹ(/KP PYyH9(9$ESghWl98a2-dKIk; 38Er`%t=n*C$vϽ髴2 }^/4>Z9oMTH,?`[kK ٠3' s>BAJczN_i?XY ~v̕vdc|j,U.- =|nhLMktD;Ӄ֬r??(:t*'r} ޷2aQe F9Ϡ_l9ʦ^%H-p:K<5TӾ_EBJ=v/@TP%Tu~ōr#;ek "e)|!`KkY9]aI:rVyr7~L߀֚)-R7w K)WNx֋R V˃kG#3Deo*Ŷt&jFK+ܻ`&YQ_H{j03]<Ƭ@$v pak;c_eIctu 䪘8rk(gHK+: |i̛I{gDn;[ԲLc:G?R!؇5&g[oռN ,( ,)Q+c/䓯\ߚ7 qKXfbUBGv\KfH^+ȹBHș\rsyjD틈%D:ڭ9x gTlɸ5ҵ_4 (۞|#D9?a݃R-W&b>hlۈ9}`R$ۧWڎB*P4}6AZva q~`UJ,f %y6c et!D\U<ge00gg7pU"[Qac ` ,kȽcCU}9 3ބJ]veEN̈́J>cP|]JlN%Pqmw, a:<ͷ< 6}:>nǕ`-d֒vv r$XZy//__IMƲzY!yN:9:V=>w Y -MgA/2?vOR8c{F!՞̔'-e.lyh 5W=*=wռ~8.CE'A "<Ljl} <8n7bJzX`TAv\b[v{I E1O;;B *;;cd;&h2,+WFQhjBvhAިӄSF뫻6$MxߞePW)ߥ#g6Zy#;M/RY->*=s0RHt_1NY8P?4mZ6:ܶs(vL>GLvaoPOݒc)ȷΏ qIxj3?(zI٥F@Sxw'1 "nZ$z3/noI6EǓw|d lڷ>-q?ք#RZu0Orl$;.xL3$){QJh(|(EUDp'knpO>"ɹ|KDu`I$8yhuir%>H^+ d .Oq nnN!E~Nrb?>K}HLQ Tu#GZ.o5#ڑ%Of~ͼѴz`<D`&::&'Xg `ߴ(_kd!By$"d[vRW6M̅ʹ=;hA0Z;9=[![ܣ?kGW?-m[$VjDaOl8:ɪEX?iE:_NAW$DhPe!,Rnbd (`Bu'2ʯʏG j Tɂ'6Sn>a|1pM3/* ;%P\$8-{72W}b ߵ&7|59b4`, *2QbxA6x!5ry24cL4$2Fw;(>`b:=쌌.p!CY %'iN<nBI#?R}Հl)sBgpV2dyZϯ*-ٴnywD/ dJrucXL9j f**bv@W{{JV}~T<꽖PQpN*h+ )9ًx>=\.$MUVf큉@|ҫjHhoVm[e6iǟTD,L1'ؑ͡S~?`.jߤӎië’S/Eq_yLz 3ߔt `ّ+|F'hǹfÙ?2ʾF%6r./ѦmWKjCK;x~-r6cb:".x=UY۰V:yр'2HҺ n0E٤SvCrMѿyEZN_d,疥[?e!Ieaè&4tmn5IϞ|>}!ز' v AmFX @qw%pUlSRxrF!Pke GݖgI;U;ffdoM>wUB ":CGR#YE, '##Uefp^%Rr=jQи/Æ)9"bgO %ۃphu`PJqF6ty>K43Q {㹞A]W.x2B4)=Mm'_fAKfЭӱ|amڂk)чE u_shsx~ 2mQh/^ ]e@[? ,C`yoXuF0&| zϵ,B}= Ƀxqp*qC"wb#VϞtğZM[ Br5*lfn sLkcnřfϨ_Zoz=ln7ú?naWç$߹\WaÍ'0B_J_3UYd0D)&GIhZ"R1]BMӬ~k"Z6CΕ}9S9r+ eDes{6˟UZ^%hT]т2F ADŽ1XO v qkΏJ{4ŕTdO.>ɖȉ#P5_k]I*1 ,61`pV2;(.BV`(MB_U-3"@*0#e]G#XѴvt3kQM/(p x2Qy^\) N^3H8gˊ7,RD@-&22iLm'xh+ ?Rw 9E,m=F?Xv%4g,0:eG]OSfSJKucE1IXz]г\;#*_jIKjTv[,VR R[ P+=! 2 b*ш0W\6> icXnqsSH]%Gr4ګ][ R,dk(\8d"bG!{7ɦ{I0# ʇM J}~x&6({ *?iB^kR|N%ҌE>L;qœX7B^jŖ=A:BVbfUktfjey+r D W.Ps]ÑѢp~mcS2,k^K{P)=pf iG1@Sˮژ ?F *_A`hϒ>5KT[%*2bAHoV^Ѯ*#UIF[+rQN9o&X"2&sY- 7+.pTkxX*32H$yy6hwڒ-LIExL!<Q!L(]k]r: kPl`@0˻_,cg"6|2wh!9>xqZhz#M,";¾! --WЬA2!4= NsTc@X5!sqRĀJ{Enp<'|t9Jpv9^gϛqŽ R2Y^lÚ9 9cPzVꍆnH@Īz5R6eh6 w n<Nj5P=uiJy[][:B|WCbHyXBV +ҡ7-]M%U>)WGg -qpa#Ց c9сW՘z!z5ܲp ̓ >S?77pN{Km&IBW\NZHnL[w_ѣun45Q]!6rl,B \~0(\vP7_XUC˵7u_LOy&О% a|,!A_Rj,kI4ac%؎'8k s5\DGg~b4&VK19lBZ/;а]eW9~FfUHM"4g`n"*%))Gt 8~L%mbG T\ߗ+ 88!s\o;:8v"Gĸ0yZ9bηs6ZK Ƴ:tQ3¨nVGk^I9)F; gj%|CU?$N>Vl;6ƓQI_ F;raA^` ,<*$8ӨljMѪ4G%jmuc; @f}5\*TAqm 'nxJ@37S>xlJgKt幕aÜ'Z'I+ )hb xZK*n摪\ip6iO Tp"UD}`FTXȺm'X+cqAsa6oK:GMgp\NwO(3e`!/MŇdic@-*}=2mR({^ٙ;Ǥ" w l Gwj#rh%cݲӦusCSAaALG=.o53`#Soy!]?kٽVq4)("8/%9)1;bsc?ufOn獬m.K7lA!oƼoQV=4Z5w1o k7`Cv26Q8)+/Y ߼K{{rQ4dX[UD(6`EZ4w*%P+Qt m8lvpJ ^ݢ*7 ,Q9-/x, h{pTŐ,yGYуe<ZyGխrh[3,9ZIBިd|jK-ty٢G6p%Y𽶜OoTg7c`,~E!|`lCj6{db4kv%;@*Uf2m9`+OO-A}Iy\UZs ʪWmT;|*s)jY kNr41it;pDK<04K=RSDZ2oD} L 6ja &єyD&t2'6G 8u5MW'cn )k4> fmb(eHS/aYsW@I 3E9z5Ճ? @i6jW%2sler+(mvs)$6.[s/)jd$_F]L) endstream endobj 127 0 obj << /Length1 2429 /Length2 29393 /Length3 0 /Length 30790 /Filter /FlateDecode >> stream xڴUX]5 CpV8<@@p%www琯ww{穇*1e.TYAd 9302T@Fv, *@s#G+#33;<#d'n p9[L|,y)R@;`P:yYFe3ӛhgniys{8Z[8;ooQF5`dg eT`(ބjhadcԀZuU U* [`U{{pSUS(I)uUj@7E7u^qR6[K= *~+x+=ftQb"W;{\doK#\BB<E@ |*#2 `%HL? eTǃ8`$ O-_rFHaxAgq|By[ʐ:Ֆ`>L׬`R2O!=Z Q}W.R/"C(&~N¶ j[>aЈ2;Fў^5-wRxEd@eˢGIS4w7g{!h͏-ikB'G0eV8ӒM0Bћ J8kbK_P_0`E#LlB;I1:z[7c 3|\{͔hraFHoz00κ/bNC,Zb1B2{SoiRAF,iWl;a^C_L(`v8DɔBaB-3m+RGs5W16{˧57Kv[<\fpGQz$/ Qj#ob&5UVA#;PP*m["\Sз>d:RcM:ѫkOӉ->% (*vChhZ-:)xsvn8`M#w+4Ahc&"lM/"gRpuȻVEoPEɠ$ʅ;Y)wxbP,Q{:!'x$h|4^1Mkgr8>Y CE:h.~ܞ5@fqt \V :xɲ/@dg4 lEt@%ZF{7Kv_%V?;l l3FIXsG5epJUQאE'~児$r_Ȉd[ mfڣ{>r0YQ N }Zf{{QߎtJ F1kNa6FAWk^l<.>~'r\u̼Il8&sOI씯.Z{^{[ɚh[͐lm3Us> %1B9Ԭ*nq?f>,7 Gz,Z]V5 =MyiW 1XjF5ߖA>(u 3ʔ<tS.V#j2$@0J:3d9M/? 2}fH']x- S>a6ρoJ-z}  rJXϺxx,XSgOJ?ZqߧAR$ yii*}Yfsg;_~mSoylCRk_':$ ; cù`Ӭ7nƗ삏z{.͞!#+~Gr>YqLԐS\ʽA9GkgA)اuuẦH [UK(V51>(qsuWf4ޑ-TG`]|J.l,>`ȼ4E>wq~<pHyZX@g7s| yWrgއ["/뼄uz4*(Ί͈f"H/Z߰mziGG8-݅PA־(dt+tٰeAP䫎Z_mfR]Fk!()-ǛY2*5 2?m1Fa%= sdu<8"<gqOlČZ;;]WE"&8FcHgOXZba4&?˩ӏnGx.K~J A|; <m4 A"Tp] p3BMbU9mp%dPƭ'  +F3nr~QfP) E~`)R0¨oGAZE7 'Oepf#S&hrŸQ6sˤ%\_{jO3r# jfkA8ϼuS0ImK MOu6V"u uř +zͣ=kOT(NV9ciγt.ƨ0 qy-ȏ?Ӗm~,.W̬܂ K!(ƅ7˫Zoʼn)ea0>M./ k{~\IQwGKmV5M3 ז|q/2W74+Ӝ?]W))7d̘ٶ3"ɽf2n.y'wz /[)O\˙;Mhbeg}Uyb\Ka{w3"O~h shOZ ,X82Y{dt2X?36-;A-Lhlj93))wj]^(#PV=q+GZ-|̥ᇸ)}H ߘ=&#EɤgqVW;m4ͮQh2m a#n6"vTG Eav1w}бhOmN (lˑz&įzA#*, aɅAE>@>k eK Юl%8l-)R"vFj2Hg}QNrWYEW $50E+UGn&Vu:8aֶoK/| %YmU{$c 0Þh`caʐT%6^?( #{vWXJti7RfFAOs?BW&M:'>rP컦NN<= xFxP Tx ] QG1y -Bv7pvX$6WXNiԐ5b'JD}ri<+QŢSFB]3~ηR9+sE ruvDƓc߅REQ[E 9"X1,(_=Eԛ Ї4֦u h\D{$A 8&Hk =Ar Ouƶ,oiCdί{^roN{~9pb ѐ_醓o||"w\gg8+Zĕ-+Lx} Z$1*\ْ!jkj͹iY7$s5֗J/ "&ސ0`"jyԡikSQ>Z(Ƨ/)⍫hx/zqk{LS:y.kqAR.B:|bKQ;GБw*~H_6R.6Ǫu,`^++Z'(yS24-XkUWuU0!O=sեqDf j cPz.ͩݙIdA\ԓCH7nU=( 5W?(܎Fl_}rBJo{?QD9%:\͠MvMNO?B=V8^w̴o =%"/jv{\.t&ܒa$]H{S܃ ltӉ[ DsR)q:*d9ba䤍Zԝl@b? :`'n\nk"@Y_j;:-LL嵐n`S2 #W)fy2Q/KxNs->/RB4Cڐ$E(~JLWI%yYG*2?j;ܹ,R`X _k<rAyNbThOs֕Toc-OfX$V^P㪑6.G]]u&=4;a[6ʾ 6dCbS3Ũ!c0oLֻpK;RWS۫Oɩ72LT2NZӓ-gRTYaJ/%NKc+(әOIhr) =7gPD,o>* I\}1~GDյmx%iY؅)ݡ|Lɗ<3Me߇M8[w:^%ř W̗ۢU )uv&'X˭H\e_k>- #Mո!T[RUel0*@!wx=Kj1(MqIx|Ygjt$Ä]W} +l:;qB]4 gzT6y* IjjR'8ƭU={`1}3O隒ֺ2`OԌ?9ol@836c04"PlE_AO,&3Vr{U,{k=ρ.Fd w2{0CD%1gsyD$j[G~G*4S}zCd.K\5 OG]-Jېˣ; #+gz4spB•ƘŏzHtM3zߖ-ƝNbe{⹷aY̾@Z~o$ 6Nì#*sP-7s6z* "u[yN.[N>/ yAUcnDP vWɴDoOKЁ@+.,>D%rW#٬C Sgj3 :qHOSҵ."#ϋFZ7g}~(ău vEg+A#[x FPz^,O@Gg eqbA ^&Fᮀ ]]weF!2*!X2N{Υ|q7P$g]Ǹk6ROyӆGe09h6~{\B ]DŽC$[#Q- %d~mlW#}vEMeӂ*gy?9#eo| -_]jS 2CCMlJN9_*O>e6%lՀ{SKutF-49e>)۩t`"aEJw aϲE'IײCi 枽 Z-txHQwqf tQnca{/Cw>D&tg7(Pgٿfy0p .a B~v̲J2A~XY9(bKS4m|k9Lql<ܚ#vcp|H]}ۀoE^䄍5%sQ=& ] RL:oͶrG>@l۫W~ǂ!)` 7_J8 5 M1k y]E%3K@ͽJ~G;Ol 38(o%c%xFUBNCvɰ"<fDӛs* Pq.fɦh!N'SBOu X:_gQ%zY)~7u*ȿ!խX4VeWaƖoy;Hi_Vh{ fO4"8b_ڡ%Y\zp'L& #'ȩ*]Mq^KP4/TN#4zztJ^ȸt<g=sec"A s ䷜@Fٕ׽^aSsH0(*jt'lZ{9'êkfer!XsѬ/~(H\,._|5Y-;2S8pAf֜Oѕ3 eVNix L;XE!~n Ɯs/0Z# #\Ɇ) TK`p!(tǧnɳ=^M Ces(p, w]*\D"!qxoK5/0=(W%lXGX5`qKH ]צ2E[eK!s eY-+Cwp& ӺGya3, s!TNqNjᙡb5ኒ̱N$Chk0@i.펍͂9'F^O=+Í&1V r[3ANu'ᑶWpDvrΤlw8*m/ӻ>뷻$)rXVeK)O*RŨ5y0=9:ZykdcR@{(8NiL/ZU-Ơ&"B9KF34$[hN%|1"`dZߍ80sicG~ J5ױ"ת6dqK By4:?$/;;uCBm /.ӳ#:+vH>ў ϗ#mXsǫ6&Xi$_uQľ"B_ln?6ŕLyG5Nb))_7Db{oT8>q@;|l-Vg2 sUy7/׸T6ĹAO=NP ҇r(9,z7F>D.8;,<%~4b_􎔚ry| dρlM\WҫHzUp3`Y2F1nn9=бpu DW&h 4U9{K@4{"Sh;%Tiq./B\s&0.@ؒu0f仱_h bd=4-KxnV"xD)<#6k4N| ʀuƝ؈h\+וɛ9~x|}洼,Uݞo TzXeӧD}.WHKKDz=}(C)^V+e9ͽD>vb9K z;)w5X*E]d_ڱ) },{JG{ 3T` >Of^V?ûq;?bY$֎_,m6'-|fS 76}vMCj|Nx/$%'^-sA˷󑗬B])_gdž4r%^w$Q{r\-y(3zrϷ%;'9$Ь ~ yggkotq>,Z|!8MPiWq<4l ﺹ-#9Yt-̌\Yq.B{+4+ pSQ01R l[dώǙq/ltnڇY#heqg >ZW.U<$ḋ?Csqjwo/Qu1ꬪ%Chگ$<շ{"[-niT Uu-ctU*fli:mP-!h3t ۯ 6 f͚Y5Ry4X,ECpq%sn YR-~OXQKjC?,I?$]6Ta9TD#,#lVwɧqzLc;FC %;zH Ε4sXBb>YcN@Ħ2r6xhK1;?;,z<L zDE+F+,J  vWNtYM/ܥ "76ɝ<3seog!,إL֡'dQ2.JFs6]&G K\5keɏo7sok@粁EV'`rΪg b*E`7Zs@*>amד39/)1/N)tb9JOD8}J·Gu AmemKܑ+4MZ̍{Hɰhp;Lu헐I-ؗN0CDS[8^~h=R]㑉NO:U[VZ\nȖrZ4ucҪ6 а{;(C½s& +a1CXi;-fTCz|p$yX%HaȱsE\w:O+fr׭~T[!"m(kM֘8˅b=8 /Y.v7^{uUb2;Q=sSa1Vǥ?jeFp9m3:,!<<_ fo\C2h&L~"BD">-U1/|hs,OP Xj,DZU%Uq ^ cqTBN5sD[6õt"HsX:u=<Y.a1`W|h (Gū4\[MX柆moH½#o蝲UWn&wf)w<\ ԠlH2xn#YZ{V{6/OG0TnoI~/H+c>u، |zYT|-xHN8UꐢUF]_R9:hyo;!ɲ|^4I)Q&J |E`zC/Opv/*Xp 񥺬KV0_x&-Ʀ 1fC/<?[AX3g3u)$Dx`7u)8 o=zϫEGbX}<UIS?>K3{7'pLT걮J6BԔټ3\5u`xdfN%wgКxEr3>|C]eoKx_5UOv"nYCs`Q #%k) UYXu#Ӭ` !"Mq:k{!ܙZW%d97 EVIY %n \I~RQ*6ET, fA:g93{P.^IdKΈnIYz8QN݇w层! g'A?`ir舻y*`X2صx?2+Ht01*/~$$ 6 Z_ 9BNZovX*W3!5p}6^Lu}uMe0O\RBGiNt?Ogt* -Ä,$fr&Q%2sɨ""%BY6lO6stx'Fv=GՂo}å128%\ !3'Rg|>\4pYF auu" 赿/٠Lpת|7о5*<#-f %S+ ~k!LSJLA$Oe*\>N{d/PziC"D$,[4b!Oɢ#Zt"˨RogsRYlQ]Je,sjlxE;8:]/t$%q:&s`KK!Cbjv.h±i%H\T`յ$qm=Z?IԟKV`c"7X@=4 cإfs4„)V/ V3) KZ/&M|璳zDg}+rsLԇMnnǴIup_,kw, S$/gpE'DbֺH<m:|݁XG56>`nL}7#eLBSG VGL_u$.N95\,nlY]_'Hz *Ji׺oֺfyq"~P+ܻ=C7ٰQˌ5x:m;m2 N:ԓ{Tbڡ ɤs N DLdؖmˆ+w9+l?:ƺG煏Mtɱl^T]ZnA^ė&S`LqIXьblD-J6Jq5<T񳳐^R ;>+6Pj" uGFM|xP}nU$Av/+us.i;΂FPq89l"[7fxN*OLNj _Oz%$+$Aۗ.6LG)>C o;37ˁW7>f$z#-۱%ՎXOؐ 2ga>p uG1oI`qbRI٭9Lol"V¹:KĶ$0>@ ڣdc]Y1W X6zX/xyr>V4ҥπR8= WW@0q%y<J-#д sX0!yop7cJ/-%76]ןj)X{ÔSRTIҞ:| )A%/gZK=2k]ُh]!ɓnrw>WNҭ^f7 l2 ĥ9٢Q'VJ{?aݗTsk~7># ~UVEaj^/>ڤ#9GNS#aLȆ ܗ& 2`mz2$dH)*uD ] #0 tkb~<.矃ٲϽe4f)*.cͰ0;vFZ1foS؟{|aCNُuDMU;P {n*-M[6<2Ay FxLBT g&@ϘL>jL5S)劾 (n1Ė _"9S"Q !|o.91pHB8u|Rb =c G']^1zǠ~DKjB4!.XB1 f[n]snd; :Kݵ(tVS˪\޷Ok(__n񴭸 :Q;?E͎c_V?QgHa$b%H kM` F ŃC@ V=k5"iNL8D?bh^{SRT_'0uaG4 O>g`t_c.>Gxyւ*WH @_B' vE,L9 +=&0)hSvkom0>I? 8"$8&WFJ:7N˼o/Dz66 %.7~$3AV3HoDha u0OQuןVyvEn1ŦT&2RiɉË{lAXhmZv6bMʙ<.oqV˧=قsF'Bц3T3ײL*1c?RD}(Xi 26o)sk_O\9. +^]78 ~廿Yf]=Ք|1e+d88²ԿEP_9g6U'*hXzԕ=`ч a>D VY )u(V7.,$ rЯ8 Sh)яdk*H'UcFVr;Ltg6xԢUB|]OҒwbi%F wھ@=G7;=T`XdA4#61X'Vbt\F\}RQM~;Hj̧Ȉ--DTf+Q1=D02f%+]?K@{ߌ!8%w}:fu @fcdEZi s gl < L~ w5t 6llFAmkzV#ͶohWht. gF se1œIĉT垸(EHc}e*& Mw͵Wz'|+3hONC'$d|6;H˺!L\-owq[T@\򯾰c4y|%cn?=Q01c-"KC7k*m0#ֈj|| 9EӉ(ZHA/ӮWKK0R4zZZ@`% 8|?e ^%9,m(j |ctjS1 )AJJ jAm)6i5W+R㤆#>mZ?pdMV=)H3bPYРNPHX)Mw& R`V1a¼Kc,7qfu\Z*V@5g DbCT;ͫ\5cVJ( Y "N J=[0%0q$P(jH -8g/;F޼iGT<DMSqsI)sK/E 0@; Qy.Mߦ;⷏)>\(nm.#oQMAJp/1 4z1]`A t>tl]jΤ)Wi"hXlf{ #6g0^/I(R&J3&3y@wh#pԭ9hwVgԺJ<-ض5!<< ~F|%.d\*vo.|ԩI"+Я]SC?(|i Š|WCXW2M9`$fU_d{DŒNoU!)28z[֪-@j= Q;>ZU[Y+Wv vq 0Yf6>uFj̙-dt 7S}`ma#+\tR]c(>[uYbj0롭qU5,a.13#WW&{@Fu)gZBz5+v;ڠjLXW}[ka`C*%ѰCIpEQol.GXSh)8>75lEecLe-hQ@Pj@'R~ŴBWш=8lڞb"&9F\ T2q&s@gz {axzʥBƫ%K-F% `\d?G v4/Yz/0Gw8]B|G 6H>yʻ(- B;o=2LvMdc.SZS @K8?+Ƶ͸|9)ScRZ gm\ph %+ګIy6d!ZrȀί'q34){4ȓTCgK~S=-"YCx k_DAp:|-Ex⤔^u6n`_0--eeqA;<G Avnl {3w#w`ˠW6a&_ Fl`҈P'{Mrj-ߜB_~~h/[PԅbrJd,Nqg]X&.f'e{:viYԮ3'4eSE@.g=(~M ?Q]a^S)d @jh,_**1?Vo) {'1]lWVR.Z+Gz z9y j&d7o /nj193]#Gp/U{MV= w% qZl΄If䎨1d<[E@X[I>v|rXĹHю0z)5غ3)DT@""hS[| u˗C9EwBçAỮd=߬uj{vWw@,$X'X!^`ثM r0};`=ʴTEQRUܪHP}ps/#RE?Gm3WU*RT p鈥ˠ3e%h j.WL7L0c|S$㛐pG}K%-B8ˊ [uer?֑816jFǟ~^Oy}9!(Hj@Fg)s=%p;s"Rș+cͩ>m a ӤZXV7uy#\փW8ys^ĉC󽊴4Tـ#xoE 5z'\r #h ICF+p 6.KNN1>v%P57p&iJ.\#Ec1 E ö}ΧFaGzێs4<%mP(l4]Ttn#tgG7gmġ(ub~DZGtbքK\CӖVĵsg\CU?p`p]rƲ H|Nɳ_$ /]^qYiUTeRJZRaT,h?yC*]HzB98PgǠf v`DTтVfi`6٨4 rCdLL툳B+ˌezNV*Ub%kTĨ^VE|@z *wfS \Ϸ9ҬMAs&}Xͯt>*}ah)2v>/U#KwyalsOp(l>(u=Md|f]nBe߽b}3!^ވ"x癆PwO#DOחd0L)+BOpRWlYh@RuxjVaKU9Zng{A$=T ԒwXnMRDq?z=|^(6= b(%WJV%ڳ+!Dh녛Vݑeba{=P3u[(F1E u@78RME~*w)A2ry^%ApujP4π)Ja-;$(APB#27Pma${J\{ǭ D5ұb%KI_M}ʐY\ePn:S`HH -N%{#[&w _FRBXL|xg}\w6@E}AI(+B- O&D}I%>b7I>ӝɲ1N- T.`>זW)yW9@r@/\,JGΗhݼhУ:H)Py-5l(ug)ez~  v%)˻nc!8}ZsxGoHAs\G4a?\]΢RF]Z7NE7#D+^66j>s<* -ATT ^i6sp|":R# IlKϜ=p%`+TD 5pN&c?+:'-VDb8] 'w vĶ-1KGBM;f\'ꂖ4ʘ A+S1*XKm@՗*^`!NVs_ T~瞣"XJO V' XK yCy.D|:gL{1F+^elYWV/YQf";>Vebrp凬~i2|1m3n-?5ty {ɱ}󶵤 GC.aʾ TQtUYW5}K6bJ2 +H^q'Di=&#ܷ;݌cS/[0f|W /h!p~!iLL-{b}bѱqSy$yth=?lZqPȑ'9/y{K}Ɓ=m8hfGcL(/]ɟIQ=lئOEۻNnZ|l\C,}JfN5z צRiJ3o؀ F5R܃Z֤N5o]a88sሞ̲UGgbrQDpŮ]K&CGPrY@iFl̯\ڣ7i"[Pe@Be.D 7CV$r/LdCCn^WXa}AH]~!|Oރu9|c:7?ް M"+$Sy4!rw޼{Y-%!Gn,bۋDJzs8i~*Q1 X5(E2bDh[.U{+|2?K(sP3\,_0/rģ!;۵ˠFd''|K;$nv s19 fil-wk~\qWɶs/ NXKK;Xg 0W -v`7vjteYE@Jz:NtghZـ#]x(xH1]Ge7+?t_ţa`wF l m<Mb܆@!3$ۨVՕ21HNtwmݽ^^"a8x)u)e4_xMfw!7,G.ړ7Vxӥ(Q a+?+8{4MFBJUxo-]r G;lC 5Y]PRO{@+M1⫻8u+P2s9p:37ſQ[[{XDz<]@|:L*$̳q>{{N֖Ewfe)'kjk'FTLʾ?^ĕS+'eBSڇB-E$ s g"Ӟk=ѮѣI)|N"^^ޚ%[9QpB>r[5F4P Eq/]^AUEJiנ7U0z~w;i$S-E3WWw)Z}׭H]Œw$U%GNBr/KVӻ~7L>F=\ %4 m:|_JEN|ג>k؎8@v}UjH6F:>\_Bzɥ7Qma 8)1[Liap{ć'̈́Lx Xq MD3P.~t*(H4Tj <}rCg|D$ozݍSBxr9ٞY kw5bMcIv|8žP\<ܻr >dgyytjTmjIqQLh))v;2R?Vnqݣ|n1)[0md6WԌZuJ'ӣ s|E0?or'4gisiN ;pI^8VӽnRm<E -weW(-0kC@Bx*9%Ú^l*r}{Y*ऌ-a۵,v|'%2]-?M)+tj BJE-= @OqZKq0|+jcJW'ɴGVD]N*]{ Ru ^ _]&l|ĿS$7!& ? փh1YGLVfpy+ X}ߍdāA8HV '^pX MG9!'#=so=p*QCs)D:dE9~PՇHDքkf-&jf B#iX{S]/,yVs`=UvSg(iui-OYS~Bo,43 4 ]JӽYbܛھbF,QP2|yٙu32'z!ɮ&E;YsHi)HN3 V޷ӿ[o20M:u "Z(fjDpo/T xuJG8p@Kd*,%9祧L[;#ԪPs(5ANa;AJWa1=>Kz9xaINS}64fLTr!3`@/U?tehZc/GM^" кRNv;X#,pwϒg9kdb%Q, sN8RbXUpr1#KWFe&|6c]XS.)%0Bj ?h* 4-ˍ|⃨6qD1I;' qYo8`\߸ξb7XdY*aҘr4IG ~pQ5?%:&z9x|}}( > + $ALM*D@W8P}(g O 8M&Ut-5U]^k|ƭ.boȖnӱOr\m]8!)g` 󝢴1qxm>UٓerM[ ˠ&!b>p`dI DzOKz|_Y*i(Oǹŀ KorfwЩ=Ԯ5Vx@_k%jo~]u|/$N]̬>ٝxR/L̷T͙=BOBz btw349K!3#H3UM5n۞ݷ 5!$g*Y$H!1b:Ro03Ķkl#Fidxe"M;bW;ZU)8Kjo+ff W$?cgli}~ `nƥߝ3`Ww2A $$Bמ&at=:n V#JhG4ZW7mVYzf3ͭ%\Ke|,PK+":'ce[$y XG /@ZOWUgso*oiS P2,-(YgO} u` z9Uro,kLRRm`3dˡՐ\ a[x7F>]od &+- ʤB_0VMLfr? t_oY#Ԭނf]I^zasPk a7'YtKH->"vXBbn:TRClMDfv*k@ cΦ$<&+sqŮ@$r =wosC|Xm}I =Xhc "wy>Ά8I,8,Z;hV7\J(BJA f@6U*^BUD<*z>joX|ײy+ &s܃wƙfk6;q6wGq[-8 +sDJ[´S*??L?^ Ũ~=kC4aKx"xq }`{=F|}dΘhC)ھgƞvd i*?257@z߂3Gl"$e6.WHw/2QrM}7 itYn aPsc0=٤(hrY2Sdi%_T6i*UM&$-K 'l[v FOghñ mtl 0(jz|g'+LHW`cRYuȽ.J85Lq<,e࠲>pl Fm endstream endobj 129 0 obj << /Length1 1934 /Length2 21666 /Length3 0 /Length 22882 /Filter /FlateDecode >> stream xڴ{eTm6 Rwww)݋www(Z;gfޙs~+Us 'E;$1 'HFw*߃Np8@QW,ha ;:]@&8:!OZ{c@['Ͽqmlgd 5z?=K'',YB\E^}lٱepvwO>a1Y >&v66精'fΓl+[;7[`jakb{{F5[ gqW![gr0@9㟂5;>^vS~ArΎ. SB`X; w$4P{jbgk0"09MZ.@6_.?hmepp(Z8?;_ޖTjV}v?lcile rre_()"J/?q[c; [3 ;@`zvv`#{`jF?$Nr89ILLFFDK{؛lVZo{~ǿɜ&wwPgsGпsv[:w0za)9Z@7dgG;+\Ύ:L7(@[= ׬G33 ,ksߧ y-SCK| &KɹN˱42&rI@vR:Z/v-Nv;=~ /bJta뛣 ~}DyЊ5X@bt[@b}@A*+᫨VM˧ɶr'$%+Q*-70N ȇ*ڍ6@MA7ਾ3b)R JnVΑ ; P¹&nxR-OA!s\{4d9 s708j&JspDu!D"'4p?~L͠ZMl$ҚΣ1)Pe!5mb;B'tGҊt&S#ISH3p>֌IԫA_'w Y8j抒xr9ʂ(ًTܚo.qƈ§=y&j0,+Bx;ߴ"vGC,JMkIcdgDZ^U521ם+ HjBkD"Vhөdf?c',uՃ2E*?_FG '%7YēΜOkL4I{’~n-yR͇^st.w!#2WbOt3cie * Jok-5s/dN\Ns#P#^|6`5ӵG\:KpO@yN~M_./\JN7PkD|fNr~y-CZ(uJP|8ަ9BLE5z^̢Bn4,Sf|Ц:e78`u#æJ;ج k['ӌ{КIC]|o.u) E@PpUϬ,&^v5_"КA>oVӄHtmdo_X!}{]XˣBI8B!4`eYL"XN@P? ;e ba'\/cJio7p5s!35U>I՘j/UQ%]<{ ƬlyQ%ez43Jq'm!![%ꣽ8<>۞OGzݻM\ 헁6CHݒNUs[47Vζ6vIvpr T2;r;Twm%K~1)]ô`! ԽC=ѿ]gk͐^@~f_]ut @CGaJz~wJVEǵb0f2eTlɀ";7e> iQm#3F6,: e] "Vb%bflD>/Aݖ 7bt侺sx 6瑻9÷ ע9nL2,÷_ޚ:[pMr(V^ts.EMz'S~aNWnxM@^+#!ܹQw?>]W~zciqGO K.;K שX{kIpꗈemSyC1-9 B9-n9 Zp ,;9I'ZN :ysXTy!!Z&A_xj:(8OUgNE5O?U~3ώֵ;iÕ,OcM?7o>F?֫gjc9,o@䨾sm C5CIlgH> ׋tD/n-AzmsˇlǞ מ`e_^ϔH1glGTG Y2S6;0-eJ_TeqȗK abMj7J'XfNKzb?4&}jX@9U 13Rn+h}q55[Ƥł]k\sBTaT/%\b3j -u+Pr_:aDSl VV+JA%e?q,js"\H: v<.yp&A$R8_} h$Y!nk!hO;C;OM)~ԟ;m̃?4HBU6 7qv?Cr6 .I{H'AnS^:i.]V%O50h cGmNnEh-s1ͧ?ƴK,h&W1 !jjFHqH#{vLFhh).D[&QZRGbBbU;!MrWR '3MG^#7aP!Q5%Gl~mpp>|l@"h&0kN _7"4ϊpYw"M& De$˝PTqhi(CqvWŃsl.uuSuv dȖܝf}ˑ=E1̬#'afײg .+0(pVr)VE^*pOqdxLᚆ# 3F;N(Ul0uMdU=*28F;wU{zcx } u*8O(߭!CC<@E$-A6vhjAZMѾ8@9k:-Js7B:z#(> }QY(%1gӽKƫ_<Ƴ w}6⽟Fܜ3-)WS!263Kղ| ֢sn y%,KFѨb([xZB <҂l?2wH*XVI:ci#\ ;~{o-P[agAպ? @T;?o~#ii_{Eq:y7@llrPs8oZb`ǡc *ܞ %*Z3oADmNݯ \/ro9:<[mܫV,h/X$*WUo/7C1֞'c{J# f_@v( +HKؾ:sM"fFxX/֑)'7I.I^Vn  ˠqsHi[UJn j 1QRe-,PTӴt )>> x|=]WbWJ)geA^^nE%q 45ӟzޘ4%ș~kCb0a2& SP:+L\j5_uOqb .y) O% >]9RK7ɟB4-tXkL[w,==ϊggwݪ8mRVs z-,e׷`-JqP 4Q$Rb,VZC~DHm^)G>>ӉEz#'C},V{oyA#AO_.g/^Q S: \a1oLhd+{'оbJsb_gm3s|V,jd#J8% >liKвPA1]*"zv}ّ E -uF[B/sDSЙUmJ' HS% l0-I3?#zRvn{ _NyԸR i2\L!,|r]&eޠ7u /,;<`WV!q3{U0~leoMfM@z`gVzn2 w|#Nm&T^`T Vdkbҍw'Lۛ93xý \(R wY mu!O5|xqp2>n j0%֧Y dRW %fV\|``80v{tԯ"5-ԝ/{_ZsXry J9DUm,)FA--w|6 ΘSoNߣ! ;_$l6IP?-)TϕH<Ȩڎ`! ae.XPY9ͼ{be) = nwUlN؉~: ~~$_d`3S[l͐0\1JY?JZϯ+cpXM}aGi+WE3%T*8XIYi*0P,n*iݱ &$VEL<0 ×緼?(in]sr{s`m{f[EO|}7Lۀk@sT,협%4Pt(d}bk)2F 9F .ZL1mkN!-c݇ Qo27'amjrBq+h`")/$LpSPb,VԬMV_Qr|e@), d_lEkeI.frn=lu+gxtCAkeY.KKĚӚ72=gH=bЍ9m}D:zrLa{EV9mn˥1Oji1#ӾE ش[$K[`ԀԇAZ\/k%4X{OlW0"WtVqZ-"dA/xl=S7/ؿ_B1 ;qf?Gv`[ D;plClĞxChNA4~gx%ŕ@oܾfYT@;v J@z[O4Vnpl:LG?GV~mT`=ۜݥ{Kwda3d- s4C]J/)x~o'wz=X宙|2Ae&-O7[롆$4hvwEVcbr&S/LvTKĈ+۵ Kug]+ W߳ ˥iyR~9CƠַzWe] vs'-ސVzt P?&q55G_kу~(> F;TH4~%n9f]'e~;*:_S>ɍ{1 Ic+db#z뙖EZ cA/x&pƶSޛ*DLdDT@|P8X6!*[tQ:%E"Nad u}[£cM&Z95j'<1ǺfnO;D]kI0"?q ?o/ b/i$ 0 *$\y);{~TR%9BDΜot!ŨjIJ]g/иj(W 7,h3֭_D}vf 26zrş~eciV WS#6h[羺Հ:GdKk>ɢY'/|$x [;[?-|FcSʖ*t9{JoxҒdOFͱnQXxޔju~.,FRE§oD3:oKQt koN5%\g$aFƯR==FuPVAUJ`ۚW:2^䝜?Іd/L]>w߅T_h g+HL&,Jy[h|f-іvN#M)CYoC7Ճ3" RV1jaRFTvΝP<+lj2wv#ܑ)_3= *]Jk/ m_=N5WɃ[i$q`fݖ!w0^ +^-{Bо#ijH! 0 %ݖR`{#J5É t?/,“NBI0.VquؠA.g8¢ǣJW{*M W$6:|T'$>uGCT'X˨x::㸐U")96TΩTH-޸Lċ ?9%asc^f?f@@E '҆xXzk0oeRm| ^Un/Z/7zw^uۍh;ָee7'Kɬ,[Z edrT284$Kw "m[mJ85KLg ylN%~GI-˔ i:n-j'6k@/eIc )L  KjG .3 )H B6((w:ÿ{[21KZۥ%Ht&bYPW3~ϖ!Ĥc1$a{8Âo^}K8(cI{p3ÝB|.+t_ǫQŧ{5BrƢ `җ' # 2Bߜ?"Hͳ +-qk{RF;ה./8b6Wa̞1?K} $'gf !jb°cNlZjAJ¢P=650MŁI#cO}*5+{/춞zᛍk,;Ez=p/Zr2{뱍!&|,vo ܫTZ*/Y+lШ˽bnꉨ'"?=BK >Y3 ӓQ>Eu*n:"[*跱[TBh1M@x{ z1 sʿ?/1[6!׵`(9iU8az/>^"c5#UU{$!;:(>,Bxc=h|OJ%b h~M5qd21-3fQwHD,Q?تS ],QZA){0Eϙu1m!=9X|9_ )34+Ԃ(?v4i՘i:˕j^-gQ'Cگ˩t3)j5|U #NlG|8'{ޭs. e.% C$]iFj[0-^& `t><:)Dʣ=}V7A6ǿ, b%ۂx;?wx:722rdN sBO tJf /ʰd*Zg,"чeر#1a'6TD]M>qm@r~ߔV .䀤NPiQ&DhWK_bTI -EKԕmN҃q07u>VݹDnTG$l/#՗YN?N(3.!؈ăjʼn:EWMt@~ kl h& B&)lN]@>!K]rLDvONDYAUDXITῐ兛\! 9]ċ)B#.ڝ5 N'?KzcFirA׹tZ?`*0 0.SLFՅ4.X=b!@QZ 4Y2]ˌb٪#/Wn k>EU9nqM@-=G]}mob tE}mmAj!g*ጉ 3r'\U7rsf ZtawݝQϢvF4u]֜S 5s{ت5&d[ >d?ӂA M:-¥Ms4YnZ%: S]/ Q#lG8AYeJ?Bb8mf|jZ{IFC?}?ҍShkU:ܹՌe%`U=% K^I[Rzvcy7.Ȓsj^m)ǰN7c|̷:9{_eʪ?$bE_p&P)4괒r(GP`Jv 3%>9F0}HB">^N >(R_du +"""?(fs9i8|̍jy |@"VpQR927>a ؾ MRi8.o1ߎOL:{6B0SAPŃBꘌ"b~%>HYHlyZH8?D7 iJRaӆI_na `BʴIZ"Dt+.pNu?:͇lUvԿl!>KV3zVH ^_\#&30d>B~ 7=nv}~-L1jXѠl4@(# AR&77č.>L$T 6NN,n -ߍ3?Bg $wp:Cb:9!/UY+73'ꀪ& KW[r?`&1S=}_=t݃ 4m8*/C׸9;0t"c6Y!/ǵfB&XFz~֌}hlϻ[׷*& -1qdd59(Ry9抏5U5iΪl6:"24q@:xЊN,oA%d5rVnꂌY#zi|gn_eԭ FkAF"],eL|pK2nM%,fI>_y0l[^&ja`֧q*]8+֜9]:)J;[aز.WGso;ʧΕ:ZXj(%wAxlvY6p~b/96L"+<=UO) MH C2*%?m#bC:CSJiy=ŃM)x^ `v-KC轄AP<&-}tnpH T!bw*CG{,, !7GDK5CX8h,) D*q,lJNnikTTcw__{nlRƷȣ8S&!x_NZu?W#l1\юG_$k!lKkLlx'$4((8mW{)n Z UpK$^CB6: qxBty/w%BF>w1Q2s 9:%RXjxv@p0HC$F6T@Ȑ]l0SxBEKU*RnqI"E(o^m߈o"h?F O>LjHBZ"r m%ay<2$0dk/=ڧ1lW>$c1֢m224N=T(dOT]Ioï1S6Pazߪ$*~wL\kgeyvҋ3w 1cT WFZdU_>Y]*kհՉw]:sh$< N}:Kb˶9P -B蛓& i!rvfgLPRE$`2^5F\e}Szl\&2i3Q Y `X 9 tݞz}sA-tq# p'vw{/&@jx= j*{ iֲ"1h.I@gY7*)mlk [9 8#~6/, 6ʛsM+7 y)ͻ}7fiPd_)7 7 Apz'^GRZ|FoRޱ2fFeh{Dx_記tS&Ƙ<do/ ajbjw=$Rk(-A%?W$9c~fGG>Ϊ߁]Bk ]JYIs?6P/YWCK3 Bjه|%rYԌs>U <([0w.q40y|cRhR=At<{uMMqN)_7kC/}CzKфHVy rocݴ졝tsS'uEx({E7}=0UoVtz!)lc2 wޏ5.wf_nI,(IwIV(81v%GA[_\0F-IQktW(ΥduãˠD!ݭdS)AR\#A۽ޘ[d{i8 tcoESrΧx&$lV<m`4 TD$pGzF|0C^i= CRY$b҄dǪfZS, vY#ؼ0;Q Zϯ*-ٴn}Ja@xє2ŏ;Z?=^Z*}OVJ.sJ^Q6Rd "\~sN`F;AJv@1ıx!ӌ:)(2TnBNBAcRh{ń2-<ǔT @oԑe? -+}G KC3TY3su+Tmy>hӝu~R@GG%39M!\ѵ>Vd_H!V-<71!oٵ a.R6׆'KD9[fT8{vA{zyѺd^,V# aX2[5|s\>vDtZ&y wzD}tZ/9?Q< }ugpCO9`:=.O.ZɝBKB Blf-'3'Fkt8G4K +Q{E"g~}tHn|'yF.,6_c*fꞩMjo6bpvYG@c&͞y=oJA0M.YpW{[[R",p Pa4j_G+T< ҈^JHGzP ,,xבWֶ\j0E{Yg'!ŗ24B,w\)`j<,sC8=ζr^sX)cS:e80zoo ¦vPGyQ}in_| kl x[x`T PaKJuUcT\oEVzHCzn6 o0{_c9==Yt6]n# ;KS PmNuJ"_*:HZbsȦY+7qM~BIp!:sBC gy\ Y?W~`ዂ38{f lpB3T!d ͢jS]6!W#u:$_؅4=mSW O[h39t7"[̐!ZzhbWU+ӎ)AC̑ `0^f*<~=)& ܮuԡEbw1t0*).}[ z\ ;4VO m%QKO'pʱ^d#/:R뀤5Ǹ'Jj[턡u;Vα i.& ÑI$FϩI2C7|5沾uW=lRcPZWpo!kJR9t7D-׀3z T_GJ!'YTZ ĞK_DMo/mވ(У޺ } 3U-cB</o(]MӈVa&`lE Un9rC I9B-4n&;Θk ;p.fn:"|s?)C'uŔϘ˜ޜh#丘P*4",O^(_bX-ѻ;+|zQ;Onϸa8&&a`Bfҍt[10Dž\YϞx, RӅ`)|K-!<?TKh+5xxoGp_D>-krXM=TD%4߅Zk!m;lAp E˂sr7x_Ԉ-tQ2Ё"}^!0KTIǶP,5^)v#'_`"؞vNFw )EJUjh{-bxJД- 1$ߊ@mT`Gq|*SSv8> FnS  ;mo6p~ƳFM'u0&!+:F`6LIJ;L2I̠~P( `UeYc.\.yCg!SjiՌoq[W.҆tBDS)o%gis3t8 ,gtŖj1C?.{Z ҋD#׌ţ":;I݄Hf"dma2Th\R mG/8tø;t7DΓ]h2%|ps@YLw~X l+O[ V5 qkΊ(յ2Ҡ^Sg۫h#$]}@k"N۶vihx`FteK`z!;-Y>%H* (NG&}68zbaL# ƚPT<WR:k*6/%[{uscTّY4b Cۋq2/ЍjeX׷$NBFB/vA<^^m`,:p'Dy<j9֓} ANXycP' <Ǵ0U>?,!wDxtlL NjTҜKEgXKup& }vIHգ '\ɷDp}𗩬hIg %(tB wLw`V' !WxN(NHɨM)=(Fh?*s U$vu}1JBHaZ + <ګs&˯yh6Ι4(5daB}Ĵ2\U$t)ҌݴF]%1$w,2=N UBQ yTC€(,ao'oM( Vٞݑj}/ ӬMڥ+ouűeX2u&''EmN xH #Y|=[23cר^Qd7wmޛB;L7؊Fkqè=KW8s0=o Q<)>sa\|xG_^hN]Qg7ž4?@eBe:R3p"F.ȇ$\;SէE~BADJ= ~Js`(y茓לkr4r?ssr ih GD:IA+g"y<{)艇W3aBFHX%*.NVBd$*8t7~}NKvY{^2e`#A>/ѐ2 &( endstream endobj 131 0 obj << /Length1 1941 /Length2 23013 /Length3 0 /Length 24231 /Filter /FlateDecode >> stream xڴeT6 ݂;ŵ ] ww-ESܭ[яukFFv{ʝJR%UFS1PdWٱr3]llL,,b@#gK3lP4q~}`aᅧH퀎JS@lad@NΌFNjE dhin';#HE2F& 7'kK)@I r{Zh@vcdPjU%TTR*JLU]A@\DAM`HTڽoPP{y7./&$ V+Fߩ9l"X8;131893͙mO r?6 bg^Ng t gisq}/ӻ{/60rWNII`kdi 33y7t6rvq%{MNsqt!/+uQl|cFv.NddwD '{?=K&/ -)(>xv19;e' `yR ;S1{N'n^'glk;Cafigj.v.@i1[ft¿变>^ { r2r]>^T'gZ8] [ɿT34*l<@3xfHi%bc`d ?5oC#[K4/Mli@F6tt*Y:X]ڿF/bgn|o_"?+e> _4:9v2~|JRrJwl3Zڙ8FF, b}lS_`f9]}f G? 0xFF<f#^"w xMY@6?;?;?{twjCw9̎DN\fw^w^CG g\W!˿{?_Xd Դ4} ._xܽ9ޫ`egy?}C/>@yǯV)M&ˠ(yN*d ' psȀB-_2 @r}튴(bټ}O1U6%@`RȐ_RIF{(]1J P9m6vLWֺV8ڌhA83&ҨGdn0?{Dھ U_#Ux}jVQtG`LG荾bT~7Kh*yZ$Mtv,6I1i[2 ֢6 riGC5z{LmψwV(/#JZUb6ZaO >bkdsH"A7W@Ж|*@"SFJm 2jz GeYv~C$"b |gB76%*Uȷn5qWvX[)>mC/3Z ĵzԸk_ É( '#T= C]+xq#(~[=9F=9<%\ƓAch ]̏&3"LMy7~|6Tk(4ͭu +м#˜7{L$G`R e:`JYr*MIo7?3V~: 曦%4V}@WK=}gX.jA _!pR G.\$M+d)bM,&̂"/i+)LA= Rba'3lٱɑo_6bC *͹3 G3A;F^bg2v^k^*> {&"Z$;l~zqʜﵽu@X=DO!tmz~ґ%L4l!.1%E ƱLTYcғ\ms-L@TL|a6A}$/ZB^o=S3F^6Ou߫ŪB;9EWﮑl8ε͙ӗ;p1T E!,=a=q۴Ba(B`w5STcwrC`FF, ̝ \cHK1pIu{ Kb86L4_KSkg"*zn2fB q<|]םΏL)=k' ԉ$a6J sWSUz'^Fԕ4I]z;)e]i"Q>EI^ðjpZQ*{9m#J-vn>)TV/Zs0 ҟG#g7I5MOAFn\\">ҰYeB`U&Ep'HM&ǍeyG)Mdu&7b鹤/aNm?et 9 >KLe>Q#*]p+H{GII_jNO&ZCr.8D?h>P9bn|rUƄߠv&a"QFuA[f3߶cE>xKR)ՔBϊk t}X0= 7ELM3&qaW7U/'; lo>R(o8TiS+6N@v adX߂] S/E|)|&}UU !4GGrc\ɪWfyUn*< u&WbTiz]7WCylcĖz[US-zV= Seu<|65 X e>zUYD:a !hO"FUx^)2%}Z>E\gEwo\: p3t ;ʛB1}1y ǣ߄뫰UKL8,@z)GmQFA8@2%К)VeܡqE}_vabkŔϬ͌!J Bf8ccvjM5Rz{$sFdn!XG- Y%R0`A4O&>uqn#0]Gtg~gUʷ`AX#+,\@mˆ^%NR9w˺>E"ᄺTqQjk8U& %z|֛w{zw!12_AgI)sh>G/a@*Bcu=1i+Y:&j#~aNz8I3>y2(%@IS[<̛rY˛ԶQ=d==c_Qqࠁ`Ȗ;B_Z<kT~ZƷ</ RpY@/Pq'IiV \bV 4⺟xh(ŝm:46 5V%Mmz k΃b[ 'Wfr>% i^ kx0HoP ЌZp E~*SU LURCr$96>cbBj1ҟg%Dž^I%`gޘǐ vqBkw,IPvd8>A崏$6 wK { %s1r_Nmug^]1Zk)4dg3)HU/Fc`*ct2*Lɦbc5nu+)Kn6bd70MOf%їLI,TҖؾͭa|ȸT,-Г淂"O{ANUߞOq]Um<!56FsO']t-u"؛a{Vs OY!G>v0>Cz /q]̕+XPiuxRVU/bgO!zKh)Bs}qnosMp9)TR}r19[RӜoiR xRΩ5HZpxDIX͖+÷qCGb S,s h|Z֯B`@~ .8 EO/*Kki/];sw{q\!!ybPv"h5/hDB8{/{jNb] ({K!F<1Pc$0wOJ-LPdmnW~gGOdJ`J԰ gpP2Q PB*u;? >Fͫq% qNs/ 쎭.y, ZJF0m uP㐦@sc `D=(iNOtJ ۔+0][O,%RpPsp?Ĥm^")X~\:B,0G39=}w@ddzDID:If#`$C4J :O:]eF:OsE1RK1G<%>--ITaF?%_%WB~[|ݙ-ҭY5Hli`NS8Vwm*'K2Ɉ:iXŌm3;ILwiqYHWK:ܑ!D5 4Fz#M=<"'`4I4Vb.lį wV]_`H5:5=OTCߒnJKc >\L<O%Ϳ+#2euY%/4`\:? :JӨ~G^ϟ"a@y!SU6׏(O#,]鑬h_-Ծ^=S7z>(¢W$-V4ķv۟kzSgGFƭ9hջ&s]eK9Y]b櫗ߒǮڮ!FX&- _0;g23߭بٷ;@7K<0&5?PZQN) gtBJ##KHien B!!MIg%9Mgv-f GFeY^K+\Bdr儻ng)#j<-YOo8’m+6~vjR:n~|&Es |8${l?އͤ#GF‚')XG}2&EܒHF!q >b %d3% NHϖc\F Fv7ܸU&9 '@g'5-f{q>EWJX0!̭n=?4#[ .Fй"̈yoTNdJ#Hue3Cdɗ{/N}Hm uyo/v߃/S |<F 4UYPMJ^hiZ1B:Wo^.NS#^bC[-VkB*B\jB^?YHhN?bybnu1r||)%:J4[]`δ;NBgfbFjSq4M/9qF妩AN-q6ݼ<="sڗk]t2ЏdC)SW^~? =jF [lGBe'n>&{t@E#'CDwQUDE#ux]tAt*;` )Z~ @ʰb8e\UCX[wjR,%>h5)*o6ׇUzZQZf@Ϊm9+ %oK`>LQ^dK26mwO9keaG֎!ov k?,N z~MɾX\4f)Z0۾~{E*zTPnQ޹RN꡹-ʼnb)6&0Z֛"J{`V 2µ@D @f|{I(k8S^͵y9$A2?R>8nk^F8YJRLsOM5'6O*(xau :Ba=p뒂>!=Dh{P_\uv-oKmf 9h;Qfz: /n"7` M8WPvS'"`d2\q>RWo_*Ov,3=<ڳj =#)Ju4Mv77c?5A\&C arCgkڏ pq>ܳvA6HjebGG]n _R 潉Կ qKƲCgǾ\I7jJKZ)kN!db6Qm-n o/ M2=1i v/=Holk4 YT()>Ɂ# Y 䱾{~c k9UvFy^ (iE?xM!cNڲ_ I%rH(`%DQؘ\]d@Vv0vvkbEGCs/3}S)rZ9VLAᇼ`ʄd5H 3]JBBZ JлJ=U_0Qc9 f&cРIAN?iNzJӑ KLHU1xR/9xHw'6c!A!Q9 Ta!ol&'!4LpF}S80%Pd(mwT`&,?B} A_rX-" 脐{'Bsp uY[Eޜ%gX{{䯓Z{1ɣeݍ 2z,w,\Tj>m_,Y&`?Ue]l Hew(rĿ*ܗO\7" S\UH~i*i5=) ##̧vpSv߳x[,au:dLG7S@WN )^M_ l3 [@O@ލ5*!ݰDLS׫r'=|8*w䣾}ge&_ g>`xʛR 2 P<6Ro5`6麬}͑ vdoj7`8H뼬Zu2GuyxK6V*ђkg:M;+(heϿtU>"dLP D>Oq +=J,WHI"I(;iD;[1C9&>nK]˃2RLf_R3!LKy!4Jaf~ANePMMa$P+LOvf-.+\²:[fVXGF~FTX(ɸ,fEZ,W70gJ ok'%y,RVW O+ U8oy;Fr%-~mTM̹qF486Pޔю;=KZ3v}0͈Zx]$:ҳ|l+x+:O,gȿn!q#] 5m^?5y!P9!E؂1rRޮ]aY ɯݭ ZUՒfV=|?8Kb0~BPY,&p ;|'[ [@d|ΑAO:0q.P#+jPIvOjUVcNBIb>,j㫲m硯Nd-D;J=82Xl ݘXCΞXX@F:dɫgJ0mzeH綯M/0e9 /k(^mBU-YN~9 _9b/]}TnKjtKKG!Vr4/>ݮΞ% I#>L %R*͉XwFA)O.f=J0yzvve$+HmvW + T 100PJL |kҎ/GNie[lbb@JJ: N^n|C=[o _HTΞwUՋ6s"v qB49$K>\3StE#Q'`vj[|6@+AE!=󱪰WO\|'VG̊PDσ68m=WR@;:LͥZσa\ ѾU},3P4#)ʀpp>Ld/(p{hXwB]KƯhǐwp[C0%3:aLMOH;PRc"eY<lmukdFRAkܸM*_>Μa3R73\5P^n+E<\PFd+SoVyvk#+<_IL$i%T%iN:6I%ƍ"PgY8IGp/@=I^~c!<0L']ًd"Q6)"N@!1ta< Eѕ }t+4f6?8Gu/rDZS#^Wtz#nYPE`iCx[$c|ozT+ RȲ+#ҕ}2 =@{÷'B06טS:>S·I*dkGg0##IJә$e VRԦ дng`L*M. JUT߈D;J b^aJD 1(\.d´&<8sR,򍰻7~{L~*B0.tCC1G,TUMnuYhotyi`F>uQS(>V L5nߧfw"~Jjwo@nDZzr(I:pksa=!b}-[j=K۝\tq5ҏ͂_LLeb38SC.q2oō17/ MAPl|R/n7zOL՛:Pz`K\݀"5\YYJR#w.e@u Z.dԦhvS/.NP=C=VQ6zrfƕ_GwlY#+ >AjfkAd;Q]K"K:Y3}N/Fo9m@'52zX $f_599h͈aP3*֠R|] M[ DC089F6la#q;X]JsBB!3u-p˚ӘGK:YVOW6,ɏDb\]1-^ǕKh|v:@YicsSRoJ<|z+}3V FߨE f)tC#-}BVi&ks7fC=iLqTFE`~ bʩDY:L}hĺqm۳'wāP!ѓmަ,2l} }ǸKA o(Wg#7r( =X*Atmͽ-jKcI^.jֳ/^= pg*?}^NHp>߄~H9C{C~t~[djSRܹk01eMw84/vY3aBR{׬k2Iz:*9fvwʡXdcXS+_?ŠM͞(d-9&ۍ92]sy˯Oqml5t fEv1.C]mx@a -ԦnPCVfޏ;Vk+o;'Vą9K},yxgFZye'˭Bw7 rFq]G`0gjJ{pʦ:m۲5,$*kU`װa1dOsH047 B);R$h{J"AG1FCy.MѴJ}(?ݸH?D9ZJȇ"\!$y!g#NZOrSS$7n!.tiGz?F͈~Pʐ !Ʃt؇K"[[ U!oƵmtQ Ԃ "E;hC8Q뒂'v`gKK[̨'1t YsFdzM|j/eM~4Mq7ЈבYp!rH8lM,6CD28M~$s67/R{Tm[P$&i'7DCK%6WXk3k*suŐ5*e_3B"7&9UK:Pgê:!3(1PeX'bԒ=44پeOykjY+$ [}Ŏyb ˔x|[:|."iZ]pL ^v?b%]_I}˴Fcƙ3 ( 3/|v`x2!~홭 RϤq?h(H iU٥.?e]`0DLOE^jJtk'coWFCa JLJvF/yB?Hȉ+ˡ0,i"rѴ{tj("8MeX O;Ts[؈Dg:6Կ.'+@p9?[GN!$twOu]}5{g?:+f(VjHb]DJІ(Mlk&3Il-XUG2 ̢̋w-|.n>6s8(N8XOby!/Rg2Z onboHmW46R%h#Ҿ@G<ˈX=DzI)9e҆_6s׵j&K Zc]g'Md֘Uu0_?iTr g꛰[_1[{Lq!vL :NS%0Ъ(\vmt Kѵ}.•K⠙;{uUgYic^V<6Ȇ9W >Y_GG[Mq!lXfA)cmX$a Dޒat EP2|)s#骽WP'L%یbY-+?ۧzj8~eXR0TҊͽfFC8/9 AyAX4՞ps,CxmoCEt?ٓ`?ec<ْ& xMY+$K;HD`u=r[DƛSz­[+"Ckn`$#mmɚkyFW p;Z  MQ_-Phe V }ϕMQX6bqRS K&SU%ڎR\ %Qm]N*٭>xzW!yVXJLS@e'6-e H-HTv<u~UaQ+nӾ%\6t`u`6R}q*n2#I%<(E YV4w.m݆!gw"Dev%–;zA/ e̻: L v%0`="қK;QW6@Wz6о{_`J]ψ+e%J- 3ٍP, jlZ>ֺ1Qgsdf'©-At(K6rɢ^1X\AA1o'3&cHan#fֵjg7;iO:3Ro\@ggQ%Mp'hn+,'3G6 ,X2_e~\kE*2(P_?f YU^4cKR>\Qd19s!d/W] R=(5 76 ]%W_ -W}󂬧fwZG°A֔f=g76#h8) ZC0H%r-k$q7$H#QSAĆv4,z.<8L\Y}g[ ljm:4<w21be38 ٧qX=W(X?!ƙYd<>Sw,ˁB)$xd;HVH^Џk Wm:js -B%_¯60^6¢Ɛ%m -Tu=뒒K扽uɑQow~V<6i9pb1WoeZJw.E ,t< 8x&~`Mfe3D"bmPv.)m+A @f}D4"Pj}'RN fjÁp9dtTQ_  !*lkGysPp'2p^ǻ5'襒s_qtc rO50S ֶ4^\76; =AZ;OlmnUC30q@W# —o@yYIpz7nN]Lbs7<8C\ F#[<͚{h,CAB:f9҃ruwh W[Oͻ(AT7>Sh|kjE$+n h6dU41 91U=ř/%=cfg9|>Kݐ:|n{?5x;0H̱E)Y=qi C3e9бdZ<XL{iQI겑Qs P8b0.(FZT/7Pf-DeCQΏiZ eGe-btjؼM#yNh5IO20jvY=kPupS6^!̪P'LذażxY'3sq.>Jzx1c:qU3`0O[Pq =G]dٗf쌼EėٲC9؅>? hjt E{Wt_ВÃID z?76𑟶MEdl|n(_@/v\(sFz4L Ejλl67NXO7+@a|[gfbk^OM#ƌY3L"Y@1vdLyXTo9Aib&%I:^+л=)CBJ OҬECL3)ЬSՈ]ǀ*9g!TY!8 U九'0s`opmQ41DS/_%ˉ{YqX,- Gth01RzB%z'm9_Opqף9n~Ko[ރ$(ml($h7SF7MU=SuXCk&D[Htuդ684G}7q+VAv=rl8sDX$"5̖nUh߀;3{Dx oz53+ 3f7#E19@*DpDiُ#.yŅP)OS:=vya_k@@;uqI"uZ@5Ku5&1!|-I;Y@tb3|pl.52GGɾQ#l|=\bM5Tk:R z؝CS[5*G;fl-[(9)|Ķ5CrոCW^e;{e]~M 0q)@ӝ]$NpIUa2h9˘h #T_x> u`NH]Sju:𔻣(`:.AO*%zUOL HO7n{_ SdYIplIjGJ h`K:Ո ڕ$Gl lF'_y䨀4 '4X+Lhƚ~xUݮ1ӀH2L@Bk0&g;3qi'߬c?dbXcL%`W<.s)նIKɹǶny&E1] @L(5Vg6I%,Bl <;0IB|"7[m\ 8>D^8E|ahS~=|ǹ5VV+D?O,,#$6E g?< ]B^\#kX;K!k-_#]IjZVMamh@4ޅ7k@]~0g&:/fL&%gW*|СOJX4JC9YpQDYm?&g^;`&a]au ҩ 4^U*%OAj1ಂ맞i`=µ L@nWt0C2'Y:^fE|ȹ4D9<-7ӯ*_ԫE}CRyfQiJ[^٫x \]v I:n`2=ېĹ CjZxHpwlvC-s/N #grED"p^T ,S`0[ȃٓLM i+A֮%;Ci+wsDy [>v&L 58wWjb5(Н[Ee+XYZ߻m-|"~"gr&,#?"?>ބw}^#{dNsw@ؓ7+1Ir3)ށ%xWjՑ|)JI^*g I[,qzⷑMWc <(yH[Ȧ&mQe_ؘYѢ(`Bw}$߀n)wh"M2"+L1VKj>}B\J#1`C`HfY!ݭ3/KScYϚqME*Q2{ TM\sjl8-k65"a%,~׺e_'1 qs̮j6{>#V" H\+m[j .)ޔ#@ ˼ͬ`'#1p/>{V &C>!ʯ~0HS39{ Oi7\*5w9L"})8aAo*Drs%Dgo*NlʗC E˷p@){xӋ|ytd-LkQҠp>.̗s9< D57*#J2\H /Ptln& +e` fCŋ-q(kߴ \#OkD|+ͮQ$FZV SxrdpVÏP.Źbt(U~L}I16êqV3붢y@׈&Rufas ziT fuwER*}u;LGhQ60UoVtz!)lc2 yG=M_w`Z~T8?0!!7lp wP7NpM>i&08/jO2bQ.eϡi; IaɈr(6 uGAWUD7<=ΙW_7o2)֢K//%xFF;O-K} # ghtg dțI@54B,w\)`j<,sC ޡ.Srxk7}ZnFG -yjf=(=ݒC+?Qda;]G5`р0&&yCQ6|X@{4W6*✡>Ү1F&/&y)*DR.C aTX,gy/H*Dϟ<eB)ィv2SP7oDxg3&5\>NЊSɉ1jha+Cu?BL@&8 tS{a΃ip 8 1W#_vТXf5LTLY"5k)$%< ZN6{Ґ(ał`.lN7E?}+ ʦzinXbxHU(`g q!jGܔtg%{7cEՠOwP1A`MR#25fFGu<ƫ3?tR~S /'<8OAz_s2W[({0ƀl00c+"s%)V8GQ43uԥɄo@HEͱ|¦G ;S@on|4ɡz'f@بXbtӈ]pk+m HEoA`0ī.Œn^RE;_/7EiAQ{!q;覦@)mx[eŌ+=XMduhwJBcz-y;Y:&l՚%"{q}>*SN2RA>4QUj<70߰8`;̽-Ahgdkסbl汜dF7<n*ח]rRȴHAُfDF 5WhKM-H#95! (igkk]zlOWK⊅%%ɷsO޼QeAa-F& k "$.nPC>N'7;w>݂:/4+\2ZfIhI׎gXn7iהs1o!5]Nml쌡&ԢG[i~B. ؍[J7 Zh2AhWuf|h4x;XCs9T\0 \ŧ!6ARI "A9]{?\㒶QnT&R/ܚ@]~-Z,!KpBB)!> stream xڴeT\ͺ5 @pwwwиw .sv`@35UITM퍁v. L<9yy{;{f&z \ hbio'fpXM\@&&nr$r=@#5O 3dBol r-ԠQ{O'Ks 5XW-12wwٙd %` 01؛ԀZuUqU*5pUUS +tIuUՀv t5wPtyq5a5m%qfk0܀NΖ7 3jT3'{,\\x]]lfa pw>6q3bWߛ49'Ii H5mp?rJJr[#K; (` 4A @wu9RLw/ms&vΖ.Ywgv%U@gG/oRǎ@`aa0TT|b \<\[ٻy_oM],]b 2!]L#ab? `fd 4>܀'WߎD̜SKР ?ե2FꟃJ :v6S h 9gKFHߒwDW&7W*{'[#Y:KXzM,]L,Q_fi# ۙA{Ii-cg/h"M\@ $oFuQ %32ۙ؛ZڙX9FNNFL9`agx3FϠ]@)W`0 6 qE . `7d0JA,F?(q P?TS߈ TEUQj7H#?N" mc'И]lfE߈Tkacmӟ hR8~]lmam_U@ژ0to_ ?M@~7)w?+ij`+d Úl%0fղ?s5X13H?,A5bft}1? @'K?RE0,H$st6ŀ Zɟ /YAΖ%bbkwArq+$uw6w[Aҹ,q`u d# _ 1bח5PWy|d ;.ED=@Rѳde}8|#_/\\߷8 ,/؛[6NW@s3ВIZΘ& gRI&ؕhcټ%UOݘ* ⣈ j0f/WtRhf'ǎE;bX&ЯRHu+݋[0ly,u/Mw=`E /b8vЦix^VGl!d 娜g})w.N6[1d VMjXQnR!4W%B;j;յ"+:f՝ cGףUN6cSS&V[+Kͅsch4=Yp*UBNcDk9ާ@l怆28[X 6Prs.&I #T&w;\-11Vјo-ja_ ow\FsS̪GA7<_*%_p<{eMX};~3"wp1\??qZK5:GލqzW5:޽?@[H){f ȼ2~a(,bU-J៳ʧWyCN%^؆6MbThGշh"Sr0T lL FT8q>Lf\$~/wۡRۢ:1Ǖ Y7Yo w|裿f4w3W3?nB~#V KC}ZoW9M2N&Ph5rJ<<9Hf$AF+=m 8D~Ң-jfmIگf$.OjxM곖,DPk6F|2 -c^)@FrhV(R¥Rl՝8E1wa9&Jk6^m:g4Wb/oUI |% ͮwWgf"#pd=` \"ĥ -Ē=/FO` @cX"i_,_U\8]ggb[Xl;6nMqmԑN3,M#x>69aQ(XPl\KBiiI;%]TjZw! 1pN<|>vLJ&b< vK pdǒ,$Gl!\qȗ(Rռ&} 2Q!qwfX<qAǨ&9!7tc,W./m>֩ Ϻ@+&s%^b l,EZGQ"?9Ą$J=nIh33Wq:?b] ~aO@7s#Z!trqjg⨮)/>_B>Jec 6{>烂o=f͢*(@FԱBxZʋ8u-l}]=,nǗ6#2XQL|v `x^ٚ5[k'~wz%m;94@#|( =p8!$uO^) X|lݧgPnyNt">N~;<1WlP')QKp(~$^; :MZncZ ?e0WAC'#ڏr5g+h"]uxлQtt*͙dݳ7p5uf1*뜢}- $c}x n8 .<.2R6Y)>D(ள9~o~a_)qOZFblQHt٣{+)̦/&4l"\ĥ (Gn%ͧ7ˏYȎ dT1ܥ[[Æ'x'Nn[*FBneQ,Ww=IT+fO@)@ K>wũ"q/\<5,ۻ1}͡VqC.I5o^K,(j|2^Msި]_ }Y7r4%hgB 爸ĄŢ2 =ڴ/_<[.P"!2|pٯ`lzٟ_V,X! VYX4SH7G]L›L.R0tؒaJ: (MI .IUTL]`S(I CnǮوM&7KyBF4v%,@X =\m}|rh<;` 'r qE.іI$p d}Y?On̎ >kt 0jJqgo6ʡJ*O)8 5w:L#x "BGѬC,ET`E4&sv./ʾuئCKuҾ> duѴE{Lۮ(gi nr; B_lHeY9$a[N}GҰ.ڄI?56CDS,#^2?"+{ +q\cJ+SݬpCt95@@ޒFɨn(>gN5$1jgяqI >M-$5bWbUc pb95>^8 sԫc/R[YfGGWCrio!R7mg7JV'pT{g+>5P1,4` xh/Do &K'Iak,#_|]"ƠI-(d `Ql cEn%MnzMuMl0&ChCTz5Ob ɍkO a#o~ TWKkkCY%O.Q +dXL{ 5! T+~$X"iet?703 NA(#LFߛGM(Kxu^E8W+s^;R@)CFšMY2dw?@EVhh=Xlj0>0@LGJ>&BGo?Lv`J~jT{<вN#:V( 1c|; æBN7^]ꪋi_5W|vC3#]'GHe ^+7{Is=*|TԮ:dt8D4QQDnh [ЛUO09ynG,}A2BlTh0 dfT07/~*B)d;Ix*3߷iܙ|d >۩B&wg鄚(p; aM\}1Y5T=9;N78zwEb][$FDx }_@5\+.g3[[Ti&Xp4v>TyKQAX~p7E8ub+ ޒsL{_},R5&[~ ae0^Y&+IWj*_QH/ɧ Cܩb;ϏJÞ4h4g bRgU)QS]0 wH9ĺ=d O6tE#,o=VTYDyd,(MhJ ]yٸ8ɨѺU:7xt΢ uQ eX>ʩ5t1"ȳzvӋU#~tu67Z17t O7(崃&B2·S @g=eEu)hqJ8[A?9e@'ZAYf˕ghTflVl͎9FƤ v&/fr+H9qlF{\Tˇ_n '5Vq c)O #%O窔 VOSϚ9)\sߣMǗ/PXeL&en:'>f$<bA`-[KO.I&4uqH*RSL'5%;bB%Jz{r!#wv([<"bE[`e3{۰ ?9 Bӗ{ϒ*XvbyHex{;w/٠iM)@bCn6txg< sS1| , šܵ𸀎y/E;aoR5dS5{CB1%XY>SRh<}i[ٸIH0=ZQAZ+5yܽG6i?YAL['x,isw~3Hcz}\kat\V5IR{H9g͖mIǯ a`gV}F+iڛxjdҨdaD_+&ƃn :j'%\~j3d} 0m_x^(`jNA݉gΗn=ֽCe&T57 l=HA7&?’F!5||_ryKjѦ݇0&kHMuri9Zp%: BpDls|o ?qU7JXJ؏0QPҷGR8.|/-q||m#4wsPI^3MF,f7Vv^(S$:Y7cR~\; I~y $A9?S?]X 360y)hɼM^skC~~ >sLd/]n2la*P—휵ZPDm}uFg2=) G^F3=|ZP053 IyFf4p9>x{(KfZ'UDhyS.{^L049m3L:k1G;$@؝jו~gY0Q12h\UNoH8 m Ăs(gLQ}[sŲB{_p\oR,94z،9cyVjN9PCE+-|Lp>PiPGy1tY"[y\ [G{#;R'' (w{Gg*dڸW`$Kg)p/w#@1nx@u~Fl' ,¹P$!ݷUkK0;=ˣ5jd9F/c9ť\e,J :>YBa/ҳJ{%B!-l ̏R(~k]ҊF'28Χ9T+jR=A&3jY/i-]"_)T~m2ZH{4>z)^ ,Ŝ]Gd/q]!+AbP3xOEP*E3H`U ߶[)faF(іzgcQNi8ŁaՅ3@23_NIN>$+oZ pf+ǃB,` bL2Mdf_ПyŬni,Z hSQmmJH6: RB&D48UzFl>.$$W,_?T.MjAi:'s:s}"Ҏxf:V$T}> !]¨L١]*FHĜmtq2K7SjIQդ#:yK[/&8u= rX>&-`୒C[LȚuA2Hfwo> 9GHݑ7!vzzH<箏}BDgĽF8drXB) :PfDz6`8C EpČ%FLa,v,+o>vPtРg' bY0~Emô[da>r#*o0#i2qq[v\*Nl9љd]/nDQնMdu6rwU?@7GQP4rͼ$apH!Pg|B}dňbm,`~vq}ls`"&%bl$iq[eq6Pϛ(`pݱK3}1'r(ҕ=;_ GA>D}=r58vtZ )YM#6!6Ū7TRm_{Ehgvfy 4`O.8Z){"+¸qO=I1.W :Ûemһ m9fw9>+DL_ IKFKǘ4Z!P="֏*N{Lq*DY# do<|Ab%fC1sA??qJT[Wc.dT8(ʇiuqDXn?o. naIla"Ad~r[h6+cx%Js7D DPϋSٶ1>d&Yg87z**v #IBĵ3: 3Evb21|ar'K29] UL5KGKJg.,TDC-YL-V2|jdvAf2UŎR' 'R«)?=!Jjm)Vp?4ވr qwwK)\bތ}Z,ߢYΑ_Od0-aK: C0ˠ`²D7"~h&$A+FwyPMFOG,uөY.ԡ,89N{ ˄v)tXRuN LpU)%[rT$1g/u&\n\՝Ǣ wr=.K3Sځ-Z앸_6WnBw`4W;9}nU[7Pa |D%4QڊLCd![;/L**[XD \k!YM4=Y!/ Nc)d ,g'LYA@sHnq1]xyq1; =+vI΅\6J0$0f'1ٟg*\/ OVrmf&[E/ mVBmkGY\ddOZ&0i) e'?+gtsYj)VJ[JM|/dQ)Ճ1lEWMѿWGرfUJ0<ρ\3g,uv*s%Z Z?ۚdN+^uMSTpi.d>c^q_|$ځe$AI?s*e6V;4^RR1^ Ź׉$! sSCD'|f:bp)4܄~ 1|M)?*AP$*y0un;?źAu.7I~1ib)WL;-Y&}}/KTXKbYjz2P&”i7v%^.k1{]K3M0 Fn{CZb0 A,~Og}sf 31+\kr(r`ݽ hX NTM@ 9g_yPnM9qK1 `WqS#2'SL0$)R}ҌJ Y8?z-An4"<T /b򡛈:ڲ # P" &MфBl&8xMtCgq롼?s!9buyHkj ]2ڣڄ{  'zZXVRޑ;䎁B@Q)(Hf.&~7/Ïj!(E| U2b,IT sHC r築YqwrUUllg mғ9T0",'6KL&z#ѱK)&#Gl_3B{(9e_~#13쉗bTpr;YYM3*뻷CZƮٶNqԉK_>*,bܤ4J5k*<͊?$ ,MN(XYlɺG1ogl2Pyd.-as-$IlI3cK~&E7Y"}g}EGXڍWZYE$;%ee5ae_{H5%EU!kՄcP2OP;BEӣg` m$I$}DM# ^밈~ѩ7ДKȳpgSiXλ>;]Ӑ)CheD6}w dg!.w m,5ٱPdEO:y_qߖbۯXbŤSv!3v,.H }ľ^c&|#pb7 v<"zrs+֣X,#ayηA+3CJV:nw6=^89YfF,kw/$*׿Wֳ6n봌5qPL=gr&dMx;3aǴJqflX]q"?7 mB*4GZ- zq[ =lDXؑ4s(1+Oh2UX|5-tT?v4r%1$BI~4^W-y&#r9D?6z cOPzD܆[{cF6 URl lпa_0KE vs- y4jA/wS1E~ªpb!Z[q2(W#Q~D" ʹP wWbr|5A458H">ZQ H-s{0J$)_S Jkht ]lAL֏r-`w#߈"FZt·ߎl0hLAԉzQ˓V+.Wi”HR].xg:thp: ZE)ϱޗ=rsh:Իϕ$p~^`,bG\O.LGOCgjA"!x:ЩczmkV%*#k&0nS m1TݹBBʎEmFU(pz]xhq8%w9vmOksMS Q+P/1csk]PĽH׷@[_/ǚAJ{VoG#WxҘ|뵵[&^#eޯY DzR#{k, mXB۪^^z_5o4[he x͚*MnFEm`0 !x8~m)M֒kepAI3H甈XZ~:`^/*Odȗ+eAgwzi3Fl+LZ8hYbwY[w5[zj4= oj.;iC/*4!wuj(Wݯ\ 5d7_7\!ST×/ Đ+@7ΓZa2تr; AP4`6z3U9UB V{ @r9a{-Xm4_rV:f㐸V֩8 e=8V4liy_K6#Ϝ,B{:à"l)Unuו׺/A?0"Uv=Rb1 4T4}T7tQp2-û 8}u٣zD*ErG"udN?Sᭋ?v},yOܥdcw@ =!G8^j~^β0|<~, VHˡgإǕN[couĩ>U !"8v xh](VQ_\m1 aGVH#~񀸭Γxˆ/u%sC|K@}{)xmLnj=Eifu4s6U(3;E^a]E$"Qǝz㽈Z7t8N^N %EXUg r,4C|QC'Ճ넾Y(_7s"7jcd;-+WYˌdE1D^$|: ji,}Dxzg G\(#^lL'Fdgoat.x:Q\bTt]392,_`2LSc A(_|iJ$(w?k?m" 0(#k6;ʑqwdoC6W4l^|"ywsT:d f`,̞Y ?q+_"HsfJR4AJۿt3ͺn'j'GV=rA[B h+?SgvUE9/H#T|g4k':])@})@N~;D |4|̺$rvU\-jP\վ=Ľ%}xB׳'o?2"濠UwD dZMsGh}'[ ?=CzPta?lI[w)GJI~`M!{cҎ;7*.Żr6}uS_;>-aB+/5 dR6oqwp%֨~kT S9RE}( 9& ْĉT$FԦ H빴V<>P pˡѥL^1{3҈H;"ʆ8.gң{lp^ֻJ_Xp~YIl+l#ǯKXU%nkR8cLu3wLK܍jFjːcs-xksbE.{V Q>DRWC/!@ (3>K ia, m$$b㙻.1V_ V͘ FBϋ|7 Il#-Aܤj+RƗiH;&S!QϜH:L̄'oD&$p"|Cz ]MeNSĉ 93bFS <lȁV 3T$ GfvJhl2Jh0NIu?#y"s兦tpJ \"nR"RLA;s z Hłۚ|JQ.c!bq_A:>WaHq_skA{LƝ#YUS\n[Ǩ3e%bWGZ |訾ty$&C ᵴ 0tBl~ETw)|NjnR?-8m0 ibP<ݻ= &lkh.w$oF3g)zൃ+B͙/}R 3%1'& Oq2.uIF]ۛxFϒy}5UOZ_NQ?s-m5 a_nnk϶TYif/SKl7YЧ08v!7rd f~wLw $y)G@HingZ1 yU n/AXn{2@PsX0qs Jh:x1gDy~򂩨EB?f(͆ԓ_4ybbvg%d$jFڗRt[v{=eYrofmzc1zE+ 푚m$(-mq#1`: a~fFɯn[ ))l!ojPBB~N҄3K1Y1ګHAsJOR,t7l*WDCa29~ x hܼ}Mb[fwtZʉg%DAa<5W2d=ZD<3;p $wyo|S .91saUkIS1#a2o":rU"ݭq!D+frw6a];B&4 :'ϰX"p lMԤNI0ct`8TR칩03&~{A(X=:,đO6YbJU@1HF{ k'WZZ_ÎӺ B9=]:^@sa 89QK~;wnYt=E*pӯ7 Z$t!pwWN(7;곑& i^ƦJtqOWBopNf?d2CHfy'ڦ'I 6{94Ll -,+وl(-J&.yyCx4o଼qV$k:zQ}LM/=)T'A2}+bq]U3JZ~4Gؼ@NEƟ wsiVtbשh4b9e$J?x&;$g\YauXUm"\"#Z)Qω8 8_UӺblQPz`A&=Ih_92GF>zj*CJ`9ݐD,9>s?3j>!y SB /5t|/KtuSLX>7w#dqltшY)zz{RhuQWy9a5Ap(xDIuRLR%#SxJ$2 Fq/n /$Ru?G!\;s W]P_絺3:kY r)ׯMSt9,#7g; YMn;p4^`j϶|ϔ[^GԿUto$f]X:%FS|.\p}tg$M]BJn.GR2 +l/@#2h{ķAw([iuţLAy؍En5lZ{y|9x /,BC|ez2uײ,6g C/3kL_='ۀNZ6Qez,5!F&6: p{*߄Od)T k-⒜X(*V !@O,YZGTHbjcVALDϮ`Y{Ϩ|BÝ9zC%{[^jŨ d:w7 Al/g5o^N~bggݢA2 )َAMhE{ϏK/-Sǀ,xGG/WL9/A-1 wrkwVCh=·7kS=E;7NfƂìo^?MDs\StήbE?u7ZpYtJap~ԙ9X)szO|k Ԁ80Wo~vTه r>nb-$t3|͖1W#23$w[jssۑO G~w"О%/Cam0fQղ@ޘ(B/Z_gh W'~.1t^(k 1jYN+8}Dhᤘ<LW+M dLd_-wtHNÒA<X ' Nx; b[sgp|QMeɓP 0lJ#24 %YxFFVh0fw#9ԮI&)_0QW;88foN=d6`{Ý`{wU|GX9>P"ah`oDm Q[ "s(q }?B8옙JשoQ9LӀPy62cu9A|oe1Y^ܸu4eqpW)ӳ9[Ε*F(d"qie]1oVZw9h"2يO(2!4DP@AHYwJZ ɱljbaI9I  A/,G R®8ԖRR3 rY\87%C6jCYx6jі3xy M\V"}W /"-~Svk<>ٺ Ilv%"xC. .J?4^GCZf;8j+  Rvx4]{D5⻴p).:_W$o$BwX8|՘۞\/uFD֋J ع’L!Bąvֱ_"n3/,Q/$ni\ڻĒ>M"><3cu_@^pdJnOƀlz0Ǧ~L_48ZȻp|*r`sQPe?+zCTYH`? gcS^{NŐ W}j;_xACZtT58^֑؜m?ajFGd4LFJM׵G/؉lӊ%^qu$SBtd̻uZTDytT1Y~Q'kA5\&)1h$4Ro݁~wA/)^[xo(F hX|YnRf|n*s84v(뎜t{=ب\@9ЁX!| kV/e<'cdvoa#Qz)sW@vb _ :dMqMj=58"]E kLӑ*V8RUf8*OQ]Ade% vw7x=g^?<o4]ew#Eu4TvISZI0C*W GMwmn ױjޖ.0ӳSͻ$YtlNCT:i8Ca#I.W@j"ϐJ,{S -g,eE?ťE}:hRr8[nwB *HDW~`1 ȅUx~^廂qGAK8 JJX sGYiUaF b{eϲAB%8z@-o(|Is;?}*Y&&wEK$FO!97an_\/3z9 `3YxV᷷iASd8"~@T Q3Z,ܿ,T } oubFәݰJPnWbUYQh Se |N-qӰ[A.,$zЩp";e?%OOG'fep ZR~1'ٻ^~bJz!2uRg!i 7vQ6"ǺIzYm $/h9D%2nO֞㔖*,&%[zX4Q)դnߢk5*hyRuRm Nh"`> I?׸?:{ʑlsPA]1xfIkrѸՋ)Xd\xi<)_]sIv;O&tˌi<#d7 i8¹Xoͩ2jz;yɤJGQBֲ7Y??Ӧ5_1.=r۪MgɈ1UHgA( nd|d|aMwE+t'ceL$U9xܕt.8ip-EH0OsSMGUͲ''-&~Z{z璥 qfkdAy.8?K[K'{˛^Z!{n; (֬c2VЏ3'{Z)3Ӽn B6]Mo=əe͒JUgX<8c8g.w8|NB,g_o.\ ș4׷i aY;ݴ[{}EkzΨ3(R,@B Κ$F*4ST_u"ȾEE'k~<Ʈ9V( ƗS9*VĽ[njqȗM/b~*HB>@~`r/mƬިpg' dN&d|G/1@`nu|W~Bd(~»7/FԸ-e#g+uNo9h%-\%PD)uOT"Nޢ%" u@zpGWsZ$w aW6߀ Z2ڶ1͖UѪIR'eޙ!RbUy'_'-j:_pǤ]fL[ɠJG;lz8-(:l߯E:v,aSB=q†ŝ.G˽͏l4>MP&ڼ I8~>yuHcCxE.eXǣʵ˨EvEU_%˖eî-)ߊ|fnO,E2`|S֘89R0ޒJzY J4h @HDj(3T`tةsVs۪]Ԃ"Zwpc*/8ȋg z21wmAmĽ&4[_yjK#Mg3pM`3fiǵRRVRQ ;P~:V=1zAJ,Ot=M{GF,QnFP ɴ ,NV35,yNHs;w/Ŕzgh`%ҍoh)]u۵00X e-!&{ugc~xtX| .e# ^%+۟rZ'6~>7>l9{cU1HeX˂5^j,VLǓZ 8鱾tF,dq(#cJX3i/1UGF1PHwcӾw"gBGXD*^P=xbMύiSy F^%ES> @4 9xȌ*`{#`fC Mϟ)Z!& S׹rPH:o-4J2 a)Jg3Z1Chgzh8&!&5(+eb)wV'%l2@RRTVDo_ԛҸ\+x ʺO۬}e!'-J#LXa͐0J LZxM vq+l$}5X[-j\1q[ѿhJ#)#9G$Z&ɇMj/B}v' U3T;;> !m `\Д]GjcMwRdvyV.Eʕя!M7\z$n%  C"ZqxSu dbC Sau7M2PHB-CnlZc729~Оp)\οSw5OȀd'ͱocJJ7mFNˍ* UU 5@F`ʼn^؍t Tu.g@k ""Âqbz=6&LfbDх*SHMOW")*dt>M*Yl.y| ft;J-4hYwX%>DPS6#$0: tu;Ϩ|8'PEI|2*Kk7oe$Iy$|'āx)7e!0Pu <ꈟKQCX$q'E 8꺇Q@][}z%Y"l3 [öIw.Ds,'R{ёFFMrSׇ\#(Nِ=kKٚU>U&]h/\BČ !JN}F|C;7y׼^{r5}iB!B9ֱc18ܛ$C =xT7ah7u})&=/r ^Ap(ߤ™儸CR?lt`k vOcEen#,؀4ZNX_T ƻ-¦6f#CKlM$o(*|ǕwG jߟzKWL'&aL.=[] MQ(MU?g}C`,_Cd5+صCuJ쑤~>[Ğ>+$xj13t~ciEʡ#(OUzkgt>a$f3m}wӦ؀=)"Z8Cy^,v9ȔeZM |>5K KAzI9L'v'l 2Krk_7R]-'(}MqHH;˹ڷI>yuK6 dɢ;oIL7H[)\ᑽZi(sI t08h0j<Ծr|x6:%(EF 5~7Wpdf Ptܐ1"{“8WOPlvAVpԌe H ~V `{iH:'uu`V`da? , S8(U-NP6^Z(ĤsЂ`P$8`18C#Tk 7y%S+&c䷵ .s% %ӥf"^[ZP[bT;BBԾ֨ "-iBkPTcOZ+f,C"$5~̪_~Ln}*‡:.&t!fP! F+8uN}&}p}`r60(#hZ7Gmlto)"TK1,$4ro*EB]6S_ j3t18P*tÜ%v2t;^S ;V|1= DrpSn(HX,L~Y/VHL$"h.[@.B~b^+pgYײ>Fn7MfN?rhhe-"WxޥzBq㻾_O!QXsu)TRRO3F앾OZIju/I=ZP:ߢ/E[T=2~ .J%#4Qr{B0o1]q8P@FPo†'Լ=v# \H6yR+{ ex۸fFw/7kwɎY6 "A(A#%S%T.{dE{/n.8̱R2fq;ڵ]niHrsydgECNfO!zВo{E`n~tY0]Yi~>>y2TcrLjKmKD6d#>^/_ƥMPɐچ] VC4Wl%&^!94&f8i >,kpb)]{n2dV]8r@`ұʙWqz?7zQǨ܃Tdf "4#:l QJǠjl1Q8D [g$3zOa1c4w"s}%cM#^ gPD e8#_P*"+ I(f"R(f=z`/C!ĦXcg^$9Eڵ4C/ *O'NqnC Yl9 zRoga\!&'y l7W^PT5 8q*MS<@Tk%mҝ?eDMM RcLS;XG:jʲ㚜-k7,-4PftNp ┯c;gtf}z] EJ`UMU8SnyKr-YH9u ?M!oprt zi< s|r[(LUT{ |&TwȽZwtbÖR^f]J!Lhc\4*î"[%m}9>OjP֭Or6Hà[I{4M?CN/֊WetbB]u q(?ʾljN=O7ﶶ^sHYt&*ut7~FbvodZ5CI'R}F] A(+^UZqjALe CɴwO$Oؘ5[ Xǵ1} V{XCz)}{ï$~oJEOw1ƥ.[n' ;<۱P 3XBǟ`Rs׃rgc}"VT)MJ-04N8xM3I$?RbBBBQ$ǷT33D瞽 o,Ş{rh)v>^;yP±nCJr` J]kg)MÅI Qyi?HLL&;ੇZ|rdE/*{qrȾLo*}o8`>M]0Z?ۅu;n6tHjb* QG/sɘyiyaaY|dER;`veٶƁsNP",8 C`# ]]H}'znUT<@  6_צ endstream endobj 135 0 obj << /Length1 2471 /Length2 18853 /Length3 0 /Length 20333 /Filter /FlateDecode >> stream xڴcx>ƶL4m7vÉmvҠq6mhc1Ӟ~^{ϋ!'L'dlkqcg21I9XYEN6N@n@ `fd#Hm 1 t2Pq2 l Aj "bk`nj; HFc4=@$4P fV&[ P, PRPLM lgg\DUT%hB*b-@BUY ߔ 2.'"Iw & wFbC j`kO7+)?Tз OcmAt2+5Țmm;NcZW3|e?}X8m l@NNΎd7И_g9rOSUcm+f`Wol#[GsG'EḼ;^3sdrBRb*tudžDeA `ff0TXwDA}rupg߱uMmM~َA(% ) nFf 3+LŠ&x{L &@  [`lnsV'-_bo٦Ԡ=jlkc01:Ɓ]?ĝ T536r/PJ%o`m`?:sGqs7's'#/2 ٘ZtL,ҨQV?O/t4::عQAڠM %*Ds󏕘)``f66'hnL sv:^Qv6oѿA0q v'# `P@~+AeW@@0A fFAFǚD/`7w6D? Do_ ӿ B̀6YdAPuAPyg2 jX@m JӿR2C //&&PQvԠv hGdQ:sǔ_}guIζZ@ҿ*/'vrDϠs9:];.APo\@fPP (_7?e"y7w?4?Xnn zDMt2׿W?_¶nt\L:P8A]?`<ƿ84[^5 Hm)˟*$?)אXNj! 7ePJr$iaZn4'UL+ 0GVW Ȑ[+ >::z$B]V{R1.1t "VҬ}hD6e6ŭL{Q^nb \)or^2bqQ{SR՞L%T E|"$#9zctZ V#)Κ̧G)1'm +bF h@s+ 8Uo`;S?μcqGPNw]mMK]M-66n$5ÛnLKlz[Wx&7bܳkIO7U[.,~t!H($S} XJ! dͬޥizw%`?7)!AefA1 j:e@.TXpMFEQ?1e":`+x!J@,tLFe:‚*LV&)G`~Gz- bQRC6Fwv=v0$V=Nڊ-.c4Y ^*3\]4 YKdBS%9ǪtWn99\= w$@GMW~uaɏÛDi.x25J}1T j@T*q155nҜfw*G~WʔK3/h>=wR*^D"؉G\Gc5>z1V[;`Zrnk]nBoEN#gehPSĞ>L* JeԹ=[Rƍbc3,/>DARC{I4lK4*_0 ٩Mx>-Hžoh+Iߢ;zbZJn( \TYrYNwC?۟%NVZPI>c! nWz'I' F$Oōż ^ҳkSу3nR06]U :e`B˂>rC9<:uzYF5;VeB5m5 m݈Xؼr@uºLvk.L=[{l45Rr^zb OdᆠI*o\SRTJ3\=XVt 沎/6IQڴ˞dHt`vuQ_W./J:ֽ~F!Pk^ל P=,¿cC92مX2lz'$lC8*Bl*)$^<qCir*;KTf,_r VĦLy:Ȉ Me^ +'[Lo a ycz/R{0*-rMO)4űWkc=|Bn˷jx>ͭ>eᕁ'YU*l_ݚ}<;ecVyu&鬑m @,گӚY{e _0("Nn."G6TH&=n3 N՜)1yojDE߬uկՎ=hUiLPkqe!Z uQӾ~WęX.ySzq>$YA؋pu*“G}ʚԜl(u^85τDO&^=z=y](%4޾B]^`Wk\YW+0BFz6[Vd;an8uwa <͘G;Vn-^}M2x+Y>.UVDy!Syem=z5jt^:*z{{a9:jqib^x+}e/)=IY*3^\! t8k߯0~=0y :0[: v8+r'=̥Ȩ8HӬޅ5qpdE̙I;vA%'~7-wfK ӾD&T r_Z{cm {3|ނlEÆ'ң_\c[C@˺z8I.a2(E+s _s&깻'7O\0N.+ o B {E$ĐZHU~}8||q|E,nXJtf4LZi{wq[ S9>p` 0=AR%1oH䫑/Nj˝Qtդg׺ f!ßp^D ku9tޗ`X$~,2m%PzC6- CcO 'jd5 ` x!D7O3tvR^f~}H]Hx&^#.ֵ9&ɰsLT7~RWV(,N1_./ľH.YEJ0J yF+j+r$[e8Qϱ:`NEf|ރ/ݖ(yCUbkeQix`Djj1$m J8ɗG#j0aLr,SȒv$0d՛"3"!sv xH>ZQ\PD㲅rѦ@"S!#OTREľHp yҲz>ܬ yy|7Գ#&#[-wBBrc8FkFW{(e=%7 5פu0?~:H^չJL}Yǝ~[4W& K1 K_;t5v'Eu K%x>ZR$8 d?8RKT*܀98yP$+ubW;aőmc] P}oS4BzyU^4FB)~R> VcpV d*!XZ/|sk;Fl鐕%4 eK/x?<:LAX@?VqN}e:qIlLޱE ͳ>f#VIT`-q}]B'; a H\\krlЗ~p,oB?- xҹi\\Cx&l;@/ ip!ڞY~Y 鰺 6@DFh]w*94|B8'V{)tRDmM4¹z=FVY7ӐKA&% %r>cWBt>-޾™ㄺ~>criw5`/0!0o!o06ԾZGU $&%)|v҆8{`sH1pO˃|2>]N+kӒO^-bxX]zʁ'ⵐ >:伫q*d] 4VpoC i9sY_g9|*0~3> v)nGv6#OýV?JЧ_'bjWH):<ظz+RWv ]3wYӝ5L&Mѝ߸#lS6]k^t8H F\_ $@*wl3t| OF_ϟ}ƻURaNJ]_M;yQ\c_sMR#mt9cC2Rیf'/4 Rŭ۹ s|p,#uH1Sv3LNN5̋WebL􏰱q?##AIiFAkY> 6vsR>dyW +:}=(oV|o'Ì#Yn@\Qפ>:pP:[*\ KR3W#u^oT썌olϦ$ũ1'DOeD EnnǴ^I>5jf{J$ywf%3g*Vgz܆7"ByHܷQx/{KtJBդ e)iN\Q,[9qԔdxx.P, c q>4w.+uĕdJI9sWltay#s8udWYQc+YUs={ D]CX wl͉˹ unJ9;JWi!J5 M֥A67<|-pD'ӄabwqY)(X kioQwǑTb'Vh7nwwQ|Bq8s#&M* vM@sޒe5溶nad+ېgQ^Q`5~2A6Kr/M+bѲYY|^"Ѐ欆|w9Z(85Qxc/Pzb+1of&'NeL05kKM{Õ2fw!:Sb髍7:h$MF˻8?g`OIX[?Hsla!-.CĵoDWΟNQZ]͚7!,TKl6"GNs9J܃NY|}=h#%Z|o{EZJ Äp~72q>b9SqE!]Xvhs?luI95hFq,,Z#e~dĝ-XEmɰM[(zӁ_gwZ2Lb(/+3^HvQw֢o&3f?!RFX}[mm{vi=[,bd`SpЇ f_}=\H#[AZ0G^Hu2M}9"Ml5ѐzAIO[ݴ ^KJb!|Kd jB8i+UAl󤬒LB+~`WLKX{&|l#+{z;Vg nY"ϛY;,|Ah WE ]'WP&Uy%H;(.b_#&uU|IK>c5(e蠮c7;>I6}MΗ6R}ոy4VO$pދ~1VՊvJ-0m5[Bݣj?.8Jp.>hsx3oxo~G;ͭWdL%P@m3ωwx)Zbˏ}1&^)Ogk en'L 9 U(eFT幉DljK:?2gA 8]z{K_L)…iXʝ ;,Ê*[/3-|I8orB\4aJ%P[ûM}j| TJ?6>sU~XTuL+%Z=!+$CϵKr]| DWWw?'`. 1'3mNt~Jet^=g` u\E5ĵ zh#\zHvw/3t+<)#|M:ۢ٬bxs~_*O:$p31Kb | %^WYEcB?nl?Jq3h վRAv#1}t=.9E }"AsiGUcU9##mWI|70I!+M_e. G?t킇Eb/PM8#M b0@b]MU(tFt<>[m}nc4zN 3=v IQ#0?}*')۰GIفtL3wߋ o)*ͮBܲEnx@,A{f(5(TG*rX#眝#z(( V|aOedZ(>hY$ϝ&S؁̇ >x_qE$o0ZQ]H4K#ʘPF' /Q zZx:9V7UNn|8L+eVM1 ==4I@&^-={Ζ'%aOcegAܶoa-5nIYA&L{@z9oR1K#CV/Q@Uv+ +ʀŔMG@4U@!ZK$맢6Րf.q&pA@'9-J!ԠAN4L2wir>L$~WhPgLiZ 8^I?jyXd_ {eh12A=@tXeҐ͉{;u=|@Ѝ)f?0Vy\ǀ7TD!ܛdH,Mw S)ogf2\ji Br aad (OƧJD@/zN%E[J>N_ A"OS3b"盂y3.'&_AG: PqRIWB:ݹ4i5e\ő+2-z ,b%aFg>vTrOc h" @'Ilo+h]jF>ѲMK,_yr:y"{L XUٛ';grܹf C_ZoPVe~R1=||zmKZۤB'rhmy e6O|fy{ xi}YA.kE9 آ׆\5TB̨cڶc@AAs],?25mYrn5V}' h^eYc'(C HNTI*/hۺd>Tpt<81Zgdزnt`/䚱/7O͢ EK䲶|Ev|~%]ev uS1J >/+Wlkc݅"LՌly?QDEI*W0`;}WXr7kt#Z]J^ fz ;݋i#h#P|A{N+, t7()igW7 Fv[ŭ-#0]< ^YmhIv3b̶V&'#&SxB蹑2v1넰Q [꼛~[|T ! |!2zaMbzh;DvdЁ8QǨD D8lu?7)u 2jw<qbhQ~·⯞T޾}M?2޼(й$3xZq:{iբUK[7u4zjҭW($Tw_M8!(:4]j="?R0  :6uKĝn6Fg>jVEgNIOÞ j,xhF`UD_&; c=3=kMO /*U,}Dɱtɪ,ʷWVE}"C)4I3Rޖ@?Wt(-ݫ Lj2noa1#M[Hf%lAyWSPQ9 HF",95毽ڤ}b7`\I|g?} tla3aȍz2\~aM< G3[A0:bg`pdޟ$WCd@JO]Rn]~ONBs5Wv*6Ӵh?踺.Y(Y3FN@`˳GJDI=2ulkhUI\,ƀ2rg>[ A"vqUuttꝾM@e- Hz-~lõ~YQ TT[ui [:br=%j/گnCV{"=Q\,V&/lF"雚w.Ϊe(5p&S`a ̃atā,O, (<%bk{@T/diWi{ &zXWa4o4X:Bgڌ$|KB ܣ|4eoD3%Np1PtIzW W;AK0 ٽ-tH͔jzxÉȾYFN-."Iɛ=qtJj3E^@a?)P7q3фDAF ݜΏWqT6(6mk6n_8aҐaE3*[R*K%84EĨwUOG`ƾZ*EU!OZ&ȱ5If=H)QPP{*J$~V n%, }p̎ wԢoS5jx0y2˖%̾M `Nq^1TI: *<:HO-K 8]ۤ?Vb zqɠ VĹn}c]QN=bfJrL! v\ ۊoN[{r#4CoܷM'dt]Ib#;7$hb/XZ7Ye#)=]|ڄ.k]? !u!ՎKL؄./!HTy.UWT=8ju J΢;~~Xv -U+j1knf͐UU*Ry]{{ۖlB].Izmϯ?8a)w{(̻⎝M8; H5G(|AW酊,B$Z64]C1vtz`e݃hIA[R{#<_YQnΏMh '}"t m؏@֙9zfeڬU ñ"ov'[ú[KECطm.9 \0[饣3S>ˏjQ9tTnf0NQG,%:WyVy? eLؒXo#IK_QTXȩȓ(xBJifr{U4t㔼ďK9-?">l|ـɈW<4~CL&lݛN;/tY&ޱ}$e.C4Q}$:-䕥 zƅ iV~V{J /!&\ HQc4}s4]#ăyS| ;!(r.Z,3FQm:!6.NkYEiM͑f1x-޾"g&x p0͈в)V>Nh 02[ Oޙg{")K`l C{\`NӰjء-jw?-K7ʦp|=;R13=yo\2ӳ#<<τ6ppDySh~ 20;\j@l{װdwHrҎ #>jtg!^] RaR t W٘bg3II')9O5Y$k[&ΫL4e5G tSnCn鷛pqA{L2oZ3\trIW~&N5C:$o7>*7엟Qt b ي)Uz~|lg=uEGftmveJƣrO-HfJQ lt T #zn6xncim7DuL ƿ4~-!̾ZW_|(zCx>_2 Br킳e.V cXwCjEmGjl֩5>9H9Dd&v#vszMe1AEd|S\$iN 9]0fEGcPx> \-Cxj1VVe??S4=/+}䕟US٢;3A`e2d \AIqA@7J9#Sď2c A0pt^\Ш%#%bwf!jSE0` u5|[~{{toۛxam>sEl 9J;.vH8kxuGF!0i=MM@ʓd/-)o Umh o&˩ޡ|a#B*yLZ~} :^葿  M,,)Bh}n^E rFFGxn g>Q_pUeJ'+ &| 5Cݖ ia&t>^Zz0y`[ aC%Y=Z;kЃ]W[VTxf(!a讗^ˌ3#oה>կD?Iߖ9hyޣ霭qqx(smggc\|л _qfHƟqŘ 6nI-p`Op m<@GE]I%)1􄹂\\;xF:k.?%?B,Ef='D+dGF>aڵ{^iZꗍgbpŶa;m\b7\ٜ{5-x8Hs0XH?xzVZ78\$[RQVPsIؿ8DIՂ2 ˒"CAy!u%'n':}M#OD^SȎu* 89 $46%h1pEo)2r N{sthT'=H2zŜHe֯#rDXŅ>wꁱ`ɶ'nq%3d p 5<#G,5V. fʌ.OS|>7@ȬLdv2˺@hS`!C?^hza_ nq̱m -?\| Io̓S^?h^J}ZB-}Erl¬f"Q?EEt|s'ESс(tӱAZlA Qi_3r/_@Bk>VJznvwAWE4r7 3 ^&,Te?$ hK)eawm!:?aiÉelJ8roE\p(BQ~9̳X *okUMdfV_K%#.?-W[ CQys-KBB12-nJm2E/jx}@bt:j{YO_ [Ž/D/"Z@Ҩ.2A$KbfWcWOǟjuȝϟte~NS84Zߚ UK_6e(ҎP,m]>}2JG55e:s :PA<[PLU-\UK_[ skӂ$&Antckqzt]=#~Yzp ! FufA?P8gw P9>Qt4I3_A|HglGla/ںY#&aQnoV^Qp^<(Ik ]Fs1`i%:7T1HX%}ف8JD-y y5DP WCrqf=2Dayo :/5Pxr|58Max]0 VUS۷?r‡2-$C'D'hels#0й5A,+=Y6Mף#Fַƫ©4C6Db^.K66wav%0& {]i"Bdy,(8B^r3ٵoRCas3K$"{O#fΤS9ek/87ƣށH rWLX`0Op`ܸ endstream endobj 137 0 obj << /Length 844 /Filter /FlateDecode >> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qDŽ r Gէn8A{,쏘LEvDB``B9zK~;_q`>Wgy o.>ݫﭯAbZ%?6G_Nzy;9ڰoiܰ^]0zu\~3ݍܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1gT Hӆp1X:,p8}u 8alSM3?r>x\i"EܰpJMkl4\?ǚc:#?^YHwuprQF^odž1BЖEQ?1^׆ƨАԗ039+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrY׆}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *.MGZN(:p~7a?}]TyԟE}Ư%Vu'e% endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 808 /Length 3177 /Filter /FlateDecode >> stream xZrF}Ẉ[o)Wd;Jq I( {zdQMeyp0}di%3LZ,SQ1nj WN1)IɼL]d2 HFaJSEh`G# iB;3N20#m#l8eF`aƑvoq1bL{LcjUy62o|`r ~ \.bZDФ hɜgZk`0mᄇ+^ ଇI30&G <a 84# _r$Bceb, z3 ??& OxDA:,AoNEǬ!VH2HPA^ `1h5P>8) x( Hd*i0!)HR:IEg') L9BJh 4+JBP4Ԣ%"Q;qIňOOKMdNS2K)!gZ>hf'es#in~\N5oy`F|XTz\,@𪘔} ;Q08l+=Wl*]*}*Fk'_6e9mVL?.Ȳq>iG)2C8[1"Bl]@jLm_ 3h(2ZnUטBf`A6HE6a (yfء|/$yϗRHn: &\# ©B-֋kR2ʌؼ&Lx=Ѵlt9݋:Ӓ:ՎZ[W=auq\A+%AmZ>]p>TΫL}¦|v0=߽9]|/j6[SVǼEN >r"|~\줙MֲU'Fab6fb>c3b)_bhs,tIƣ)ؽG)p3Q-h&W.)z:?=) Ӳ9]6[ɣr\k2ɭn]#51QB*"˟ӏES<Wr~LpZϚ ƬL^9Ι̦4CVLI ;CZ;{r=_GQPp?|VΗ;jiqրu(q,x>^6x9;g)q d0$^>)1Ţ\ ,G|Nd9?l/^W78KX[~FmĴleYb?'|Ga}Yyd&~m $g̉odV\O`.S?*8} N~e*Hq5R_ ^TS7߬ѫ +nz`*ilB8iI.nF7ԸivXM7Ud|!~ct6we.D"1"ɿ E(oCM̻Qf {j !SqFENŌS*TT*I/դWk=Zqm|x1-z y߶6䐊e/2z+*.^|L\3_ٵd`;Ow1^6m>MǝmZ/n}k٪m>T(H[ʠu }i03hmk>u!d+Ib/IuO tK%}`P-3@64pA#gI$$$Nчlwmil];/ҪC#^9ځV !HmƘE E/ض](t++:̜d:2͌4 gu2*s̤ӗ]-ڤk3Xܥ42$?ifW{@#r^xCZt$dsh}DzY:{{3.T:@A$9XJ<նtV8J^F6K6:ڡжF*ۖ6*i\/SJ*T"#rpJѫCհ2-xu<>$2:G0|ՔH^Dڑn%PZ&tpCйXuhK5)VftMGg҈^H9*ضkmD`n9Sn&@5m!0X IE@:`yYwZ@gpNka/*fLe [,fٞ0nk Vm16FI+3ti*iPgѰ/2Շ?m+i ;Gb\ؤ{vb|js?L3UthNtcA;K ٝYQt4!ݗWϛ|Zӂ ޛbHa# 'yM[{|?O[C>^𣒗|g|+~k _~?m>)1T >/;Ѓ i^_OI85:F8! ZaAG> X4j9?[;jYc~~~ #zjuYM EN1g97T+?dfģS+|%)~@o^K&u8m} /8=;CáW0 p ͯa:Xx1% ov>qյtē VظG@) l?u,|lI|-.3Mߗgi>K]ޤ0mz OI8_zQߌѧN'Ӎ^'p@]XO"%AIc嶏K,J"kJs|5߰=Oޖ7یGp$kiCI0AB^$0m6H`&ٯM6 53Dml._ H˂C;&{ltFdx`̢>R::=XOe37{/F&_:V7zz[#b:=)EC ` ˼ Jߕd''ٝ|]h endstream endobj 138 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3FXҝA5(O)suߖcHQIܮQW Lڮ9ˊ6nK5NoغWi~r<d(Vu;_=85vѩֆu5CNmm悥+U=#)\][|, MHS"#p #>y| #:##0)%T\`YQqJƚ`ci|1Mَbo4m `2WQ/cW888sέ-./qJ;&\ k(d?F#h0\?Ipa]~9Vk?q1Bx.BzҬÀhƘ'g 2xk=6u2,bق6E0F,eL燆LY` YecODV3Μ蛳;zr֟P.O0{S3ux9(uF: }6,V|ƌV|gegV|F_+>O+>G|V|~+>C1 V|B|FB|/g)g1{!>_|&~'a9i0K!cB{XTK5;)NŽbPq> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z endstream endobj 141 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z6 endstream endobj 142 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R!ݪ70W?g_,ɝиYs{ ]7;׺v=ߩǡoݨM'opiT}IAu~\3;he?<{Q%(SVk-#&9sQ擾ݾk^!00j(+m$?Gwt>X.oTuþ{S_tpСtZ|I1?H/'BZV;ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCa endstream endobj 143 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQի C}͌6jo73o{q3fѭVO4cpuU sk/wOwquy_t}??p]AAu~\33cA}P>>%t;en>r8`S0Aj~vUk&Yos yv rOiHM0[7v,ܜǽJnkz~lNͿvt*amкq۸qۿ`J-ztH]{O|, MHS"#p #>y| #:##0)%T\`YQqJƚ`c2U{;5Ҵ!\,18"\aD E_sN[sS9)9^W$js7 GZ ׏p$uX}/S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7q/c?z~#袳rdbP)n endstream endobj 144 0 obj << /Length 702 /Filter /FlateDecode >> stream xuTn0+Cl m8(zu$:`K$Q4pufn}f)ɻ|tùA<]u6m;O޴\+$ޚv}qff86JJ$4?!>OJ>Pu!_dUiMBij[7H޾;n}Vb''w]ߴo7)Ʋ5@eY{Crs:2w%2xi>\u/֩;!~]YҀ endstream endobj 154 0 obj << /Producer (pdfTeX-1.40.24) /Author(\376\377\000J\000a\000s\000o\000n\000\040\000A\000n\000t\000h\000o\000n\000y\000\040\000V\000a\000n\000d\000e\000r\000\040\000H\000e\000i\000d\000e\000n)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000A\000n\000a\000l\000y\000s\000i\000s\000\040\000o\000f\000\040\000c\000l\000o\000n\000a\000l\000\040\000a\000b\000u\000n\000d\000a\000n\000c\000e\000\040\000a\000n\000d\000\040\000d\000i\000v\000e\000r\000s\000i\000t\000y)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Keywords() /CreationDate (D:20230929154911+02'00') /ModDate (D:20230929154911+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/CVE-2023-32700 patched) kpathsea version 6.3.4) >> endobj 139 0 obj << /Type /ObjStm /N 21 /First 173 /Length 825 /Filter /FlateDecode >> stream xڽKs0{v%Yc&4}$trPJu _Xw o> jQzk:+_gˑ-N̵NeQOsH`&!̏0\3yn пIky9~8J ɗf"aP4ZcytsߓQ v~fMs8WRy]%j,T3XX|sRMV+Lv,vntEۯ 4ZU'R6Z#LjՑa&2id:i6Sm({ފkTGט݋ƑnR>5O62ǘКlƿ-'MN (^[(M<ޘCDFsɚ~Dcqw!"SrwD^UX[JPe+*S/MwP*Ȯ"] Obxtd=m vM©`:Rع\-D%'aAW( endstream endobj 155 0 obj << /Type /XRef /Index [0 156] /Size 156 /W [1 3 1] /Root 153 0 R /Info 154 0 R /ID [ ] /Length 415 /Filter /FlateDecode >> stream xҹOTQOappTQDQWEP$&Rjb{+ bEBAab!҄hMv޻3,wF% 2mKDEDD;vqo d%n(Ȋ=6BQ_Xj`Clh_}&{~,z<0&hpL苻Egi8goj68 pJ* hLtWT22 .I/I=.O臫0: )svJ;0L]Gc~9<Qx c0R?mRzʫ' ^^VVꩲM){=pʛćG}c#LS,XT:ھqB endstream endobj startxref 246113 %%EOF alakazam/inst/doc/Files-Vignette.pdf0000644000176200001440000051045114505552732017113 0ustar liggesusers%PDF-1.5 % 12 0 obj << /Length 1901 /Filter /FlateDecode >> stream xYo6_!t/2P%C׵[! P P Lxl)WЗHǻ~wtxt'gOVY$2&Es%y2謌~_]MC=&%˸8[d7AjΑ+r<i*vO(Q㹡_n+aMeQ"7`R)Jr^$ &fJ80 K3Ak^:%#4 ^oahPH\w U 0J%&1%)硋x Dy][",b1pĊ*M^%\CfH #L0.2f ֘-lm:s|qt4f^Lfqg ϶[' ^N?eQL dMܽ7 x]؋`[Y ^`:V.&#k& C1^u)y$D$1%WayW!=Bn}Pi':|;GI~ D>G%q n+ڔ7vZ@Tf' Pt 7">()HrgwLh5 n~ DHTʈ.񎭥YgK P`Efʮ/Y;. NY]T( a)Jy|^7 3.4mAL CFJy|tAz +MۑbNћUmK^l@+x_wΠCjc? B%!G =">qIɲBoL31|CKO n2G&IL{=dD>lv0B32߯\#CÃv01cqێgD.$o۰",4Fh;m6h"$rD ,i5ti>gpK)v48 &RJwn+\g!YP6kAI y ^A"_oަmKo)r~٠їcG dYrRN38TղZ,I- ȲNGgR;ϡ(wU};'@vq=y={Tܒ{NSJLd/kZJ/i [Od00pPfs-ȷhDf"[pWD L[R@{Kp'/%'W/Y]DZv6L6$hM@̩AY5nZ`cfzI(H5-12?G swq޶؟1rȏ)g{D:-1EnfN=: ?Wʭ~9i fa\N={o!& .>ު< !^q7h=̽Y {AԾqb@Xgi\ < w9tf" ]}#)7!fCcwr o\ͧ{Q:B[&\i4 ?r #xWy\7vB!ywpq_.@\W^3^_^o endstream endobj 42 0 obj << /Length1 1801 /Length2 20844 /Length3 0 /Length 21986 /Filter /FlateDecode >> stream xڴstd=ܱmvfǶbtlfcfw/7jT {3ZNQ(0 ;gFf2ȎAdc `edffu9[Č<Ng WDG+337<@htp=@g#U{ rrf06rp-4) {GKs k|a`lF5`dg ag(>jhadcT5qeW5EƏU\AETEUM &*$TT~>T?|MWVRga{+oF >RAP[8;011893mjap9Z>@?¸ؙ~l gisMi!G҇}wMS\9EE93# ` 4A @o v9O.3]Oo#1#;omӿV,m;3Kl * rg Pǎ 9,l&3~v+N Gjk;Z,LnbϤfǵft7`[Nkfkd03qz[?.NF@ pL-M?cPY] kR 5xLfL fg- QF67?B4R?-$,݁&R_vig3~?&sdѰ3 ^4:988q?4e `PVv'Hdjig`e9:y3+;;壕M4 wqn$'I `R_03L  ,|d09u7`r_ _?Xd ԰4y#gGKwf)@o"" wO6N+7Nk4_^Y}o )/*f<Д\N ! ePx|5)l6Z*'oLv|}Ņr2ʻHierJf2ۈjc'ݏѬhRHu܊X1mݗP; :1cig Cd{Q>/W^}j 2-el"4S$׀JVY^t}Zm ΑVଂ;̐pDyi}" ۊ ƣNF91Ͷ16GzNqmqQ!njx%6$WiK^ M JHM! IouZ)<兾1'ıxe)jn܁sTFbWc6DԒ}gi%t03){|*| -??2P%6EHb=;_;oE[ps^Q a90\/H犋I.u0N u''¬FuOJwȑ5PfY?Wv6ʈVfA'r@X)|}T#GwaAYgzn| \#] Add/ rкtrk 0!DL|ȋ4?Ѳ)|uk)xɃޘ#Ky^%f3r$OkȤZվ Wv\J~>WFz%WX*3XZY,>پu~+$kƛ">>NvV0.|ʝ*6jZ {)Ze#?oc [+2r E)4RHFihR4R B74Yy9ԠyoR0sg $'и>ǜ J>ߘaW}lOG^eN.6P,3/Pc'jYX>ZҖ>,;&E3 j(b?KUg%4s\R{Dcg+|H@=qˍtЉeAeѺc.)텲/H*@.(B)1~p[Q3[G3gVգWrlBۥ5kN_)zbx-QeMf2?,] ez&wd$" iUP#]ic{v* <Q2' #T4IǦ?=iv'&IMm]s>K$*}HUĝ6ӗSɁp<˂^',R^9+=fnqٞSҞ_0j.,}d2\0'xwНgxwm2`E_G-<ݡy0 M"982YE}Ne )YDGvS!iR}fͳ#ІrL'KY.,R}*B%Ja)1+7<+OO{]e]Fq$><ŁDd JH#X"Bz_|g|:eye㬼!=zW8N` ,mty#MWыጹ>7Z}벮f?4G瀁_$zK>gZ un^HlWU+ьdSf ?h>[(j/cK`ԻxR'SuTu"olߤ`N3oZ[{T-,7 /ΨfKyeSAɯLolƅ=R'tG)Sژ_wD$)pmv7 +rTV(E2x"GDǨя63Fp_l6r\8ɒеhKtdʦ9V2+ {p/۴i=3t䟇ұ%VGTMʰKjR@3u+.&HNWq|K¥a}`7!gn(nt:վeEn @/ orѝ_ slw}{w-1 SZ?wf< o鑮))1!5B2<<3t[=Wԕ6|OA 8L]4'iEy۴/&ݷqmo]vO8([S/Yo<- ߏ;Lu!\32eך2MEl(r䜞֕#(IJy(O3G  EW~ ^XでCد}#Mf-.m>Y ?g*lf EESƞIW?Zs?f02d2ժ|i1~Dld&ˣa_} L-X*ӱ%Ҙ2VKX(]qkb8]-qsj탋:ȋby@Ų*%#IiӸG fCv̅54XX*x)>!TIfDu_ͧWk +ӑ,<GÈ)\$p6Y5D=ܓYtT[*tXcBdr],;+l Ǥ/R7ԏ|!OEhQg!abEցŨZγ@DK˭OķƟ $$理$2ĒEY,8N"W[bx5e&N\)LS͟~@L7?qBD 7a8^!@R)t?Cy+Z~co|Nr^P ٳơL(ʲe 6>OO+Ɯx1/ KwBhYNwߌs޲PG4 6J7l3;.E*ZԀ1܎ ip+肆bP_xN\/ TZ;-X2%%[:jht5 sR~Ay=ĺ't]_VP8DܟH&ټܖPWT5+ۃ$$9C:\f-`•)f;-j&syי_vi `eoMW}/RTݘp}:".`ź&O ^YMy^q&Ny}yե%"[i,$h [*}'-ϻhCE<)& |;^6jUN{"/']jOYcٶKw+ZfanE 4N}Ҟbq󫱻ひaW~ZyXA +OHB.=%洈 u,žҼKZm\աWB豄v*nvS*oN-/ʪC ˉ BWFۛɛ?*KO˲|~KMlBޢ ː @ ,s=Q# #M3`HjX`2q͐djqjEX 쫻vUˊ<%7x*IVVնx5 /$)llѿNnO8n̥s!R{mFfx1E"9[:\_K*¿0 'Д$Ib u4]tU^VTb*!ZƮm\MSfYpf /:`)h-lܜ nX]4Zk(߉M#w+$;%2Rs c/W6te0EFM2dꑕ(P:0nſy G˫?ٺi?>~6%.!Z=d[WWh*:O@[*<B6%5`h] W(xwuHMlÃIqQ.d:h# ;l_WA%8emIgB[c~齧 Scp2}*y3y =GE n18kh#O *cL*Y 33N5TG[4̪ސys.nݔT{PزCPg‘`f焐m]mbw LwG#f1Ie> $+.! 9ҵ5'b!F'o/jAGeJ7QټjT{kz:!ĮIFl",!2Oa tci3~\Dl~.xohl$ݦ̭B }]T5t3r}_Xu}JQ;\.ؒF+*dPg C-.2{ Yj ]PHHAݘo{$ 7bW*GY UbN2ko|-c"xz0sõj_ޅRrq-{ئ5-62 죮CH|O^cdC9FZH柋'SFOj%w .G K[/quxB6Y|+f&;~Or& ^'TZi_˴Jц-@ԊJ#ATlf%_ 2enq>_K=q=𸴧^%zGJHldGj BiL}nAIכMzшbuN;:ݨV d[cBX4A[`ГuF`Rr5ei "J~uUN$m.hQplnb{Ӿ$o}- 6>]|zGƟ/} DTB]R;b o_qaPG nOJ ɯU#R,G؍'] )>fyDqGfANۘ~ݓ53f 6jE MVZߕM'_c`/a;}Y5.MΩ6ti,gd2tk:vu 匪|jO#f?PYl S-~Q~^L+(uW '<0Y?D.g̀k5fl4LzK{D)sMdY61 !2jѼp;ͥ,P\4Uk} CM*կ댭Ql(:#f*>{; W;ͺo7Nʻ+_NhBZr1s5 q:yM_o#m>;c䧜:UrS͸mStH%[=/#PN~xqHn݊@{Sj(_zퟙ{kG'H2.|-Vw4"'[Y!qg lw7τ|&%ba;qmM ^IdKU:)2 *L .yς$7A^X:<90W]?( K0ܶ x͜X-̴ ZPXdEf}'ؙTf4Z2H=3qD Cƹ f+{zjd6GNꍈA2.`h3kGFT ;Ie}NJX]#yP6gʤf1#JϼY@묒!D׎^R}s,sA#pտ^y2Yb7E =ˠl05:!>rlRMj}IEv5sP LĩuϛnE߫gj 3 *άW-rFm ׬߲znm0 h> M6ϛMAK+5q~Y)QK*+lB4/u fb\8iC8~ihMj¾;{L¢䑢B69aIȘ",.{6$didrJ6UclkQ2]gSx—֎J);~ v)f?%zDڌ*\* [U,y/;h(5KS z`4\a!PY ,[)CkaG CD`/ ֗ |A#ͅ'}ʁq k qڇ&%.&3 ,L0bukV͜V q(c^nє7?5) )Ysꂪ֘.ugb,'2ߗHFJp{2jC""a*lw#N "=Һ ˾&]Ӂ70g'LhKmq/(+|t-mxca.Y ;h$~|,G+acev*lЕ %Iyr_t\05VP&Hk_-6Hyß^knsv{.,/m@`{ۓұA=݁휚a,ǐB}քN-ϕHr<?=L_$7]lsH3_gƭkDs |w`__ˇ<~I /%Wk&y?OΖ> 7[MEY<&OWLq#WCTmԻKxU:Tw<S d7lW/7;~ W0wۊa٭SMۄY8Ö~ﲩ0*QPv 6} P>\%!u,ɈXQbh%.ȇ{㨘ucPcd!LQgղ\d˜ɁwFP6AL6V6 N^pJ[AQ^9"}YT~\>=mjѷ7t uU LzY F$9dVd$5> 6ۈbWc[8{~7 APAe#hH*, r-\ObCɡ ;nO׃{~2$h36EfO]m&ᅡZe%M@3ɓA-Ъ*. ,pα8Q96"꥞X ]x4ޭ]Vev/ MR$O_zKy;\']`߶;k8r2h䅀qYZ7f,UW[pyQ[I&IA aF%b]〔P pFHOc?R,zc+%N_30m^ѕ@`?5DBG@Î@TD"hwCm#T! ~qf?8&s 'W/adc5DPQ_J gN/ zbuŦoüÚ#kf3%2 rkyT3/?~mǾI^09Ĺ1Mj1M'bHoYrC 6!f L+L,u$+>ᅯy*yfS0)BhP ^q9~ 4G~2s&Eb'<>PYspNp^lw@p^5ұVbV5^ QSŸpK}g#\{_ʑKHs+?6J6q]CjDCVP_n񠑭E7-h3\噔y z,"*:^ lX>Pz ԭt+'@p eȮOZ㬜x=,3ջ͂3T7xAu ?8BkTd~ހ"xASa*x[o:+hG9.ZAލ(^?abmgV ziRUqFAn,8quӤB z4bV~?3OZad5y{5O{~m CvM`\  M#+wz+6BDqm]׊[`qgUNv%`5Ta-H}hwB6"w+CUE%df!3K0 1@iwc5:] MGiBdG ;̝b}lKB*`%ŢR"H+fBE^KB|_DrѕSId06/'j%i6F_,]"T燻?:ItB4a_}8TH&,MB~:y>ړN.za^ fgQ7[C)^¿=v]Saxl82_iVB "&n!Fq^ YvF5_v=2ZD־_Tնcka70Fh*dپԙHrl _PPxDK /=kHrcN@Bs%`qTȟ"owc fLB"f3ؚ(PHVҜ%/M3TxF">4WJYީ~~%Hc Zb7dT^5p6hڍ#N8 mkCC1Sӎi]|dE >fQy[ WKY߿Xi#HSTan%̋o"6Bdy/,Yֽ8ќqZ6U7saE|s8ʊn4nN)~J׸;1Hh'u:IJ[$mP8?yc67v)jX#?AlQǐQBPJn rþ 5Q52Lrw>Tl\pvᙟgBCZ86Az"Nfov%S$vqJpObF4z8f4138\uEਭA1VBi¨NfBN{tJ "=Bj6Wt|k^ʎ-ZHZ[A.z]y6ꙢjzU.gY?"H"^0ٍY.g}x?Xμ{xƩQN\[*n!WP˜'9F zBl]8#Lgb9tLzq!=(G՛|H~c3Ls4 - %|`Vft̞|]˦n5ذ"(_B%юɈ.a?҂#hIytqfgzWd=I4@JԤHgu#6ֆ~=؜w\?#@o?HX<[GV$ͣ/"#k qҢJXf%?gWMP&Ms937z+%3^KϥF4kxX+r+Oq7`|%w,e}y/zIY* X2A!׉(`ٌ^h~_8|MNH1!:(j漛1 GbB[f` P:%خk]>^֣#Iw3 Q) 'klRt`b hW-ߗ/wMvm"N1%f$ wVކ"D"7}oS)U}gu=1 ^X5az1 hkƤ``O1;-8Z+-NU=`υ-[O/h.]h9 /XdT:o0f̚ePW7-.GeX7*9P#Q帵0[z3بFe4oD:}A; ?jQH 6xJ(?{ .)JNA۔s~ 6e#;Uy4i". 2 &\e%;Ցj״9>B?}t ߪ@ ~|){h&~:ߗ dʥРku`EB~5> VEjs} sŽ)6NKKy6|<\u9"ϐugf}(ÓG弪@՘$?䉦Y'c-?ΞF }V7)z^|V[Y ; zrb08[lʾBXhQޣV<'&n_5ƾ@M6Oh*E^K䜽]Lk*ðDVl }#..e}H"CQ='{$' co=於 Rf/6 ; :\դ'CU|uWOxkJn= |l@q!,q0aYI ҲqҨ i񱵮R.,}ǵJvXoLmHkCiրr!l.9:VjyaM壊=hZ.tH:8DyFþ< ^'O{,ߦBr֨4sF>Y~brFưm$ ;!vs~];ju 哮|-ƱyXuSx[kJ>,)╋" h<|rǂ) <=-̗ȸn-tnњ' Қ`VQ\c`2NsݝHȟjķU0# zR%&ද::"cX?pkcB |f u 璶|fwtv9Vuܣąh:K,σub3=siJqοpKmϷ{Aԟ?0]1NGr?Q; XQB#)c 5[0mJ#daG?w6xiֽ:o)YʈL4WƵVkE[Qܯѥh\_ǰIs3F2$6G!LhKuq VN+6Y8y]%Ct/Fwv#c8XZь mg#f C"KbZJ^zFlf -#~9ƀ?Ŗ]+A:/rA?2-_  g{2 G'(茐6Pİϧ5̤J$PM6Vo\X@0Z˚܈Cl7--nwzጴ;9W5y-}򍱾w 2p"4BD68Jdn[bncpI9o!J##܄VYaz'MCy >+oq^-NH*^K׷]05qvn}7OCQQkRob#GFlQ4ayf0Y{0(߉dhM0wu}Pmn1 &y0 ]Pe{=o&:gG! ,bY Ah7F:s2[AI.]'EXL&$K4Nʟk rڂ+͢IMJce2Pq+zឦ`HE92KAF5d :yfWkuF{v6C$fīO a&,)W#ظwAl'K^xک!=(|-$ :ǏX@]^֮gB"_%?o?YhܵLR /VBxSQ9rd0|bgrACxVz- J8]t(>; fh-ѬT70=^J| 'u#n&nk ݫ8k9yMɝPJ{~OuOX,ڬePzikpW6e-˶.jjٶee۶Vx^n$}wԮ7%wtBjwdzr0H ?:iH|fuV>d=TC6.U I^aeǤ{ZjiA _Cekhy>)Iir( !WNPD` Y!]VDD+3Q˃^Qmp0/+5\n ͣ$(})+:1$75S+"L||BOD2I0| CqU||Rg*>lpTgW7ӂH;DjpGb|%BӸ/]m* rLl-6BjjO4"M?//cة. iDXeV]*h |&+TǽӫQB"ϖי$yװs-r~s TUs80[љ/|xNךsǬ~OT8'ۘi7$]?ߛz6Hm"Jtmqa(ҸsR")MLg5IebAu9DP`8x[E UV:Go3Z6\TQ@|f8Sܦroшc /?yUm(j7B4!bs&Qһv>'#mL;brh BȆI^ًNqTl5ӕz#1Ȧ`&TA. sjqcGcdqufm\]{o'XXܑ*@:e- GfݝL0>4tF\^{Lp?@&x)x-W{N=OJ-w?_,HjTrkO^lQd>RgnY.AXXyآ}ZhTa{B]90ьN"[A XX&aO sF(S8ˑ(k m ψ9>W_Bwɳ8@-h?_>}ؕta!#P%Qs a* DG= ='ӵ&!/̄0F^䂷n\pǜ[>T_O|>gEس'e`ᰬ.ŧ=ߑڿ8%Iwx\0A]01}$=8>':AS 6gzxA. xW^%=Sg&*#ΨֈoSm'Ak^ot"dٝ⢶$@ ^2H:}5*0*˭տ#h1RN*ti8O="dSy4:`GB#aS)fEJSiu==HsmF&od{= ɂ]+]JLMV72J;V G4c5 V,B"wfJ3i +BZ U_άHޔZfUfU1!vg?= )ݩd؄" "O p`ѥ/g4 zɬ>5d|^Wf޼ MХ)\>;3&\Ţe(y\% 4|ΞT_Qcbzl5}r,cCQO'pFu͔pIl$< gbG2-.Zm ^s070;VWW} 8^Q^Oⱊ[rM)J#Txl\m&]n55ۻ>1 vP<顜 原~L7#BQɧt2#:ڝz6X2*k~,ھu^6ٗ19YS׳Jme泊~ tȤX03`۶|gC?m0T_y aYa8E:smgk DOmXKDW]gD(ۊT%ގ7EZגmȴWW@/7N=[[Yj#ݑ3tuS"} K d5K )/ ̼m@wX`T=.g!EoĽa e1. "~20ؒ7jo7 6psZ^ZHè5@GKz+,K-jJH(;c t+G^5Au- vd`Mߴj\d~4$. k_@˯#$ ůgH3Ź/+?of!R#&[A#P K.o4ÀP *I_!7n',ι7:rߔ*{Z 9MPrS@F uKXWxƇ1Z|j̉Qz d|;vX_ %(6i}3:C$6'.nܱx5$)H$D9'A .Y,e'))hk{ye^4#ɌJAbos-VQ%{sDZ an{䔏ސ1G6-)r 7#eȭlaR"G_[G˭(9ՂM~y%{-Q]j zLnW]wQy7ȿ!E0ZSl6ĂB5we^4z4qalH[̈,ZX!SAiwė“%zΙ藲\g3ȞQSP)1+0L|EZQ.^8 hkuNw~} q&·7UBe\(il, ҶrDTn*ZhD$$dpJ{F9X6AF7ƹE+רljW2'Dwtq~~E=5kav$ābQ GfBNg`VJ~蘫we=x~ra2z'v-Ikͱoǭo!@ FVXjVos.Y;;IZ+VA.gb] "wp4+ _Utq3 qq_Ǘͥ>pAnt5r=L  'ԖQ:zQ1BU "֖6U3vdG {(,X22`wg6s 5#(*8UȊpRyYP^bcKAȜϤ(WBsXFɏ%'/mnmw@[E=,ؕz;Vۀb,h?DyMYLJ%c+"|#T1$qNnėSӶ]41̊ b "' Zy~nS7z/& d7o ϘlGHI7rMh{ ZGHur.k~^4ovptRp(Aq,*MN9 Wz"轆zϊq|R+y7S=L <^ǡHSҏ2'.-!ntʂ(&Yd&#QMYɃrӝX[ ;NT+oQ'#$eғc e uDcdmK{&f%dSa%i~zX4WdWjG~t賩㉜F z72SsE~^yn|ِli\-O S~`̠3&ߜ$s!bGoBVPP2F\Y[L ~cK6(txaԼET9K0Rml-cyx74# )-!>)ñb@\MŦزur s\(B%5z;3Wcv WmB3x$*D968h1=' endstream endobj 44 0 obj << /Length1 2271 /Length2 27764 /Length3 0 /Length 29116 /Filter /FlateDecode >> stream xڴeX\۲5$8!8ݝ`X,k .޳9=<Ќ1kVZMAJ/ljg xr*vF f&z# Bh<N@fčHoJS;@6Rs2JvN`zc#75dn Ҽٻ;Z[`鏷@`203\߄j;hadc3*IEu%UvETUM]@LXAMTWUW zo 833.@G'?i3\lJy]]]̝ v 6St9Z>6 2}+'n gi98IKiV779 _' ?X9+$5 #ɛ!0K 4A @OU9;R{;ߘc؁,NYwsgd jro{O=\3D̜SK[ _ѥAfvߘQySS;;hȨ`~k &rI8(OM?MD-,$,݀J`_ri[ moHHټl{kKk /7[![0J**H߶Ndbgj 2szئ@3;G?`#0q2%F,F+Qo `T7zTYj|(Fo:ofiomffzn `4E3?[xśo̭ߨe21G(7v'{9soFo+h[?߿ob?vR:-ot|c1u|ϦWhLO<ª`G;k?LnLoMG7?ED 8Z2q0Kimb9d@&t;9)}D7- l愊Se#yql tE2#<"b(w[/,WIdz-̍X6nh_X1QF=K3y!82pݝQ#wy0ũ9/;#BK!⸦H@+ppϓ <ƫGZ|fR[ H?]9L&IPI1oltGrMĦL*i`VxJ/IV]W.W֎+&k@,,$sتH`k,Pž$"5 s=QG7,?qqaO t#@F_/\~^@$}r)uqyO^ܬmDM: ȓWJ(+e sl ,Io_c8q>r1( 2d[Ϗe 옛f(t,] {Wi#O)?Ԯ+\&K"mI3ئ^d|q#gb"S{E tpՎ=E|_]ph /cc|t?>jei"jNܯzj0ß̇a!x-(a)s S4Bo;}w|GmYw ԵaOԇ趆8Y-ȡulu" JyY9'ȧb)~4m=HΗ 2bθi|-ew6bBAhqnV@dXmͩ>[VaWdH,|S%ڳ rDx](X ؼ/0%TpK?sT)w/Q7[@IOf o#j2_SAԒPa$ZzLHMӮЃD){ K;7iq%9ؐgt)_LQi6QTr̴~n>I3|\J\LR)mADQĶ8Q]nr]mW^φU0(l{H7GeNþN (XtMy$?/jV7R/E):gS| _E:bɑ ]jeK,aZG U>1kB3joAH(Ѥ*>"s!CMٰr`Ž(I|2TQJcaCoّe]6i4DpY"m0ǼE 1^.\gcSj =uu3_E,u)m+a;L]p+{+hRdTIJUeHyX%ZJh^heVعϦ'X)כ7%rqqA$v,@a/?D/CnӣDxNֽJNLg]k~799bi)}7at 45fđ[v.y`y/K/u`Yh`:XS5x ynZ[!k ]O,lRleTdK^`fyI{S;vq.M7daZC[.zy^:R֘Ĵso<Вrm̿*"! I64|>&Z|i2yRäy1'cȵGu`z4f% /\Hг4Ke#ډ$:O;'ݥ4sy۪j8!wD+z#ػzju%dMaqF+jۊn|iZJI^vk7Џh0qmp" [v"F]F5#_cn "=wqmyt21wf„:+NM3גeĤt֨ȠR쾸{A W~ࣁy\{d/"qQgzvmONBXH(d`$x>PNZ^$!y[hcEtZ-րӇe#Z6i+pW{z53}*V{ey@3SX[9ȜUnUf+~!V!?sTu;jw]Shwrg,@xE܂:[9\P8dߧx;]y$愍ZU](g<_ be~v9 wgI109jr&Wnm8!_|3(Gh1ѷ%e<u@gp6 vUlގ1&ʦ0[DCKS=l~y\CΣf^6qԑtC#$?"+V!V|Yh(-)(= S":7n]MJyZG}G"vY_݁Z=ֵ(aHc ~w nN5*IYB;P2Țbsÿ%6+CҎnxFVOESOp iksZVЍfĞԑq\HvdL ׵\?4fРw& VOpj6|'(_&j/ OT /ftʄf$ ·wT+*1/7u*Q~wM^?ˣ̱%qr~UXmPFpHeEB0VqUyjE[!k+%B8OOt$]gp[.x:p5~88fb5U-Ȉw*~)^q-䆽BX A|y&zļ]Pf-:9) jyPB[xmǟxI[5tif=`T)Cpv^7{<]|@,,- R]mOAє¦=WEVarBt0q/dϥ T Zv'R#;0d{sF%k+FOdצ z8&N{uu6 &{DfnwĊ&{ao'3g2UjBevUz V^ߑ,c79,,G)ÔXm.*tY\SUsT쥁<}VʨEdg %8^Ar=Y/6`2f?uvgƢ!G"!-zSD.hMʟ9c/|!rwxSct_+iv\cNˋ;OYF^ >y3T&8t}88="ON܋ϗ=]xvżkC,u<^?y1R'eweNI~-D6NښU"^}[TG:_P3= C@n#*|˳n8]`L[bn_U+%ASL4ԴSMLpB($Қ3#L*Wnob1n'քPd5I嬿\/S a-\WkaHAxZ `@{~'6/D F~z{{L嫑{i) &YFbϹuFhAA%G0G<_?QVߙL= z4O 79<9ﶗi۸^JI5 Sp>QHx7ь-/%4^MY|UX>$>!^6N8+l$Gرkƫh5q?-q ToPҁCV9rkIѹ xz$SۣtLu]e7ZZ]]DuW.Ӄl6di_3Ϲxm ]_V^Yԭ~4 HWDI4)]`V?e,,MRb !\bԋyDh, }w j)i~ir&~E4M3y1tz( ?Kx4;k0hhhKߣiK]sGB{-\P;q^c[i!5`]I tŹ9M4YTņ}Zׁv)"O8nb94Чˇ;oHRm&SmMgz,q<"0wp&*4')6 Y+iyv0~D4H,R`o+數g10xLza؍'a[[\_+8gALgL wױ[1 ~H'MÇ.P=3nyҒqt@GW3>*mNVs9vviImsttKG㉴w1U>nB/$=drHe.Ё$KE)] #(RĒ.q%ѳd׈~KS dEk$KoU153 TE.? FswLmׂuRFǍeGL8%KA7kY7ְ̋Y" HA,B\fUa?귀( %źuSF>¨R]]5~qT/JYK$NӪ4 ɆfQlwWog(F룷-av|q(K]SiU6[g@X8b^K.PDŸYJn ?ЗWfW˅QJ:/+n8慠ޯK^9hݹcր_bcw;kc%3~b缽 I̳js ԕPĉC~ߐ(wo J;u8%PD-UB47讼[=>uײdjTr٢]s^Dѳ-!#^4 rpɿq.IUS.#n>Z̥kFqR8MO~b ^ Bԋ %}ctYeA׵<%' ˍ|UiSv 1|HnzD| U.+uZ>> }T6jQp_!ߝ̸ByJ~޼ʨ/eJ jTuuѳ:VlɎh[ܪCPHѢ!2.~[a<4>*8{kwOmXSWgaF\ `8]6Wt`~ɨ/YfAWG;JJWvL3-HfOJfsxsvBx^!?t{w(Oq6R[~ZiS6I5s/FZܻ 2~B zC0lfo2[!U$dz֕IT 38;/C-8-o9F"&NL&' d|,)BIVI؞ֻX,|S~\M0@NnD=(U$[q-m=V=_Yu tcͭ Vv$(vPBcE@6 $*̺z@mS+~ {ŶԝI}Ty=4ʉ !&@UzC&?Hux/k28"-bZ7٬ ˔ERЇ\(Ag [&p'~o*o~UH+:Me V@؟YKML8a )4"i@`c^! -OfƏ|8.ནsAޞ*hJYv)\:ZT_#Hm>ai8(똅Q1.= Zy%cmJS\燥%a*e-b]DҴ7o`]cr+B1Y(*"qp};"y得S>yQ'H 9ؙWq 6y8^x]QwUQ"`ڪžN;+gmږ',/\fǿ sqR9T>1n /=Tӵ|@2uD3x^X+h9rt$4QA5dGq(A8\UwKIZ0; Iu5dE3BOo0|>$)IJ<8Lm>l%fnjhԙ9$c~ߘ@؏ȻعC5Bg 4!k.cLe̠=E"ET\R |%&yR[m#͟^|d^hn%Eqq`_xM_o=6ֲS6Pr>UJw i,85),m.as8vV뾛;fB I2iyȳd7=75Qbi[Œ4J>g3 _֯/ P*Ymڊv4Dcnx꼤U;9Ϻof">wtc@?dVZA>ܢua6ꌥVvq:6hZ{,f@)5iub޸ws(LtLEo9ʒ54=@ڳc%OU֒EFˆ]s`ȫд7>@=MC3Y:"jjඡG^ŶKֲRg͌rȩC((OK滸 Ae%sX+K($0a ɗo<#З=Gf [/zS2J%Irl~#2޹}wjFMay co. h0Hwm)`\YW;+~>`]be'tPrHBѲMmr* C/ƭ V>XWΘ.ymR QoaF գ{&"HaP' Y96>T>!RlM0>Qdˢ HHHmawc͂&J6Y0ήW1-<]u\QT:pȨ i7< LR;Q[qf?nR"K pT݆֬,K4~jIjwOHPT < KĊh;σ B#ȏlA8Z%H  yDǐ̋1 Sn'Pk!B_kd (9ub7N=<_Qea9)H", _aZ#>9>A_4 ~VLәB۠q4M pǟ>2qw!QzYG[Ӟ QN7UۖSkpM"!-+錀@(H1mw, fM% a'Cj6V?aNj[>QE&VËmq*'度^j3G3e b>JN])CwNZ,Yt#(),Pz_0PwNJ*3Nt,>Nb}оɟmHf)NDۅ-4 iݯV*ozZD_q?c +i]mw)Hf-gZ#)$EP& =$s~j" Пninj$5>9w!Ie1UqH<#V|^|J| "uV1Σ#DB[UE1n:HGP^\wzB-̗!N 1!]$eE^!#@T@ޜyy"a"u vR 1HJ\{&P _<2zFnh,V2|#zE If$eV/бKr_KP93T{1r9NtYGxyQI Q vݻ(PG|.[Bd--#dG]5 N[sՇT~sEqi<`kCo2qۙ 3TT6G~Q\ݫ氒vhIwQB쐌9T{87Vā@gq0<;MA/IEպ^4槔&/D!JN[ VEf/t #};?ԋI($iC; t1a] >.r>Cl6OާUuyS*qhet+x̄8}OgxzAh |d8pS*4.9+X5?:&}f dz]=*G-zUê .fgl?!Fhs'29͠ Ycr;;z֟3;ՔZ*a)cʧXj4>hVk2{wCk-,սyn|;11bGnsYiQSUR5:yH'`yR{')Rʔ nՖَD(H{='|.=, MSCkN`'aS}o ?[(i{Km@M ixIkKQWQ #-gNֹThNZDB&K4t b07jG9-a ⤱90;A7ݫ+?"{sqVyӱzm,Ȳ맙_ ([un>\}kJgYA?ʦx>,, 5ʵQ3cDiMbj>y+!xԷܪ ~ZjE+W- y`\*n/PI5)ZX}s)}>ȥV@*0:L: U~K]/8\uzok |~7->QTcXKrTϛsywïe 8_^Y"}5K!]s(mώ/!IH" ?;(əܼ *u,td _&{إVz}5 *> Y;k*#'X[P_ ѩb,0|E!bqԽ=$ yن7,1S^-J165yσ0^>qg2.[lNso}L̪:&6(]KOUK<8'CXx+avkCW5OD/?`{DWt ^kI.yjbȚ4;"|k].V(,&Y'lGmD_έȓYb yMQqFdy2fBעơ㽈㷇}ts!W]'52sTdcYpz\fI̽\6V?Bbd誏E:Ė9JkTsD@0l%:J{_#~cUkྏZяA|2s;]FW.QE`=~`מ]y4[Y1]"r(OxʺUa"89fR/ݧt ]D$ԑՖ,PЍ? 4Taf%^s <~Ƙ=][j.Y& q-aWo I`΅P.o'Yxݳm7&OU#WષPAaĖ%SՇ"ݞ,R^x˗Ke|LPFk*qsO"}\ݠmAN/%/ UM0tX{iBd VG6@(Y qyw7}Wjc~൑=fHir /)˺:G,X*rP9-19PD!́7[Hۓ w|tv~ fm2\a&C 8Dӑ8TVY 'wH nիp4ԙud䲾g4ۗf=Bd48_?]^QOG{hpMKn8A };B#*S湌eūF "9,;YȲGƊ9s<2ݔ'H4LL`d9gTqBZ\OWʷלf8j¹!1jE|@ yx:Qd/`W8u^H#|)nfdγwiS&v%VS%I6a,Ƿl>qVcSӑ@RmT}h~ ҶMqI֨6i8D8c5O+?Şs Pbq>zMqGB YsN V tD>7tQN!{DBQph;+ ˹.of%>y{:b2D; {6|q4!93돃׸<:_{n^B)(56Mg]߮M\(pSzO#^ IZiq{<#6,Z>8P-%[Y}\~بB\ϯ7(Q|ެ)T<, G=ѣLʫjg*U?E!ļl•'Qq){}@pS/6`'pzJuk" uomzk֞@8oh=NG^g~[8%SFfx ]ܧمy% TuCz֐]'.*/qR%#)mPOf5XpRjPf +l;HMor?9AE2"yb)V$)k c05`'9kBJ(PªạH87HHT@oo#Dds8O.>͙}_娨t1j6[>iаr^J@.'dji*xC&!א'͍H<9g ljdnz8)tsoJcޞx1ɝHM:;Tp+ެ82l7:wKUfޅuZ&(*C= )Wqηo`&%VbH:`Pkpg?!űATVJ<"9QJSVȇ7G_ ͇E32„ 聿ue3aB*\i2[`rҙ;QYy^<k{BGpk@ Y#!a_qKND$V*h{ǻV5c_މE^3n<ͩ_VZ_ֲsQ}]Ѕ|:DXfUoN3[Y zr%5C#ـv;0]SinqHu3.< LT"&}Q<OKOWL=\ϥ)i#N'$.ČQȚHY'̺]HE%yiqz'Zg(SOZZ%Nb>3ZM],kwxqAنRѦNVb9nQ6Ԑy[(DBjD:>[ BE6.цzHSr9R2=R)fb)>ha ğ waZ s0''0b~EO6B1Fyfr6xV(#G؏YI?#,M~caH}IWt^',A džľI`\%P|*l7Vڇ兰h3=U.p q*d>Yw]7)xY:Z?FF7~KhK!]. ւ3n4'ev/NvsnQ`Nk㜚+a%۶mĶm۶Llv&vvl{o?tUV*o\m\2㪄_$3ƣ> dM=֕XѲ|b|x{dSL0 H{"=`Up|4.H3c2-ƒ5rC"}R8pYt1'C*n\7u%n)@i.^QKY A@L< 3uS7W5KIxh4?p2 x? 3R'PE|+787%JM?d%p*nW: ?O(t7FL"bWo3LzG/wZ{ϭʁ%yTW}5p$:6۳V_s2} _QE Xݾ*YJu^)dl^>(.5[4gB=@to] G\ IYXر+LZ i&D|4r?g.o[j71\JO1ť[D2eG9'M]ܝ[. ?m>d丷bn:HCwӛZ3G^2 o|W|I(ɡr3I7p/<VQ\m2|r "Nu!m UJ4;AeXP#ЂTbQ]qBgP],"#o\UU/<[HLH);qv*;oӘ;>wR%yl ZJ0tQ2x*}cηP=j 4΍w0=Џ碤u'Zj-3!^=gsU _~1EcmA*uplQ[g{ٸczO#:_? r>eRqly*R3[ =\_P7Io=@'BՒ)OYahlda_:"#[}6Zkl d$Tqlwα;{ M&h4眻ot݅,'@%|GH8O,V´i;Y&y!w[ՈWQ6al᳹OeLUvħ+hxQ4!Y߭(TH}0 0&+-ד5#qpD 6nFa׉N.8wŏp:N輜&Fwܾ'A̽".)u{ZKM-\m ifnʘ9Dh3k6yd}/EG2)$YY"Eqq7Rz"  ƘqI]%~ğ,]I=@[Zcͬp9&1_ 2~6rB֙ 1?v8ZW{4$NRR,j]mh ѡs?aTbg KtgrZ:e^!P?/ ߎmŅLUU} Aw=O=nD;iݨ*?r&!]GשG{O^)Huj^^mǿ<Ѧ% 7B4cҎ_ilHx^<% آJ2{T@1p{TݖF%/QtJKoj'kNHɼq^SgC69_s6*28Pqs͗ (p:[6ishW)6 XiOPgG%*i?TV% DsY~>O0>Ի"?jHM;N+f->%}䫆! @`Xi=.Ɇ gk_^R;[:& ^E' ),&? i9آ b8k@#H!1 @8΅UYYJ,vu !%zY36)W%*zYLYXS[>.6'T͑9fzk'[P< ߜ|Db·S̈́ZuEc}&i# S4!"rk!e 93P!\yHBo?B9RGꑨѳ/ƶ.Ra0?\ _RAmI[ tm9MV%Yc}3ꊮ:>.U5X`DKJ3f#!WO0/^QU~;ͤK{"}e-|S.gZH#FTxGp:4_UWϒ34VW.6 ~HJ- ɯ+Z@+ )B]Ȳ8f82\ҝ=fʈ;zh*嚥dr6IL8LV`~zKKr+scQB9]=q> /x e%uX.24B 8]ٰ>6ft7alW֒B[QRkۈF  #%G;Ds~sƶы" ˓r) 5c''Mɬxv"81T&{uZ`A{*x' -`N&hq>&+vU;VQ~qؤBˠmԀ8DZk_~ʡ_j9cq*op,3+h޿P`\3" Y9UP#Nw̝.S%%8t8Bt=bXf=\ G)x"\!Oϯʐ<޸55e1U l 6#B"^5#-V}iƸ).F2gz픻@78z)S6& "vdS7 eQĦB-l,|!ߵU헿3[л}?9k0}HqD`zpH0xHc}Ȃ,u/`zƟk.(^$k\ ߘ L q4CZfli2ٜGCjw^DmY'o+1͟RVyE~mRHcLE*TtCC )RJJKaf{tZY@.Z9|+n{>v]LQ(z~ 9OY] kPv>xl`PNP3[p1K1.DgSCّr < LAhV10hmvS,%Sv_øv@Ї;[WN P`jhjܰku[ѱhaN|_V'[.'@яa#<%qAD͎1PRZ66[wȘ-0e_$DFLnrk2_פUؾZMf2[ll]2"gq^LnLJ}''lX%~n=@gboktF_H%*L?eTdd9 fgɽy\ b>&ȎsepUs 0 Hƒs{0ڝƓQō)0'8ٶw O:{hw4ĨevOh']ss{5]ao_%TP!chu1]PGm =Y }wtuOW}'66$ZT%ݫʥU%R)zdf1.x|*UISxdd4.VIcotgs_\.N\+W}R9S.*bZBhZ܇anE?LT/*dkU@ߒ;cD^)wy^ 6 \(7#]2羯 bYR4I[ Q4%`"x8i*@~glMiT4Gpr-*ؿ ZwxWI#9>"QN=B(Xؽ6Ll7)}_E8jS@WȠGV? :ޜ2zN,ҌV|;E}V>sDU[;a]߾g(-]Ge)#(?GtO6\hm֩>pJ vz7f+ܽ4d mߕ_9șFcM˽O1'e|By4F]h#y}w]N RUy/G ~:$)z{ʁݙhglrb`EYgx𼆃._Zl玻Pބ }EgJl_\8=l5/!pǦ&PuGfο6ʕⷛZ6ad-Қif M{rjfAmz=*9d2Ծ9G1W}a)xi#$綶ƒ 8ci) S` Y1ƀ.O?V4i0"{C45.ڰfmP\I*Kj=pz8h\GrgÂo+Y-72S'q U >PR̟߳ÊL2uvJwFWHZ\!ZX7UyAJe𞕶(f,IԼ][1b~y@ 6Y L wH9$%5mD2h7qb/8xpZDABOsrұAM_骢(kqYY+ןEdpi")p%Hef&1|oو@Zpz(V^:B4 b2a{=#iD2b̘1ZѱwWz3 s&U5eX*>6C 5Ӄe@F_Z5+,sXwtOKiP ᜠyC~Bni CL< zKkЀmV4`t.a&#?;i_/XŢB3{ ]^`"$)QAsd̶2}K% T?T2Wv@|}# D=$ pokRa[ESF_bC]Z+vA$f ǛǺGJ1,iNp c>UdXJ7D& Zj;~#Ii9THÌG!Eʓ" V9S/ dpu13!˛Coech8olmq=&@kT=T)gн9\6 ڎAD/,8!ip+60k1h2NKՃutȃk)oןd SGw h[pSɺK7g:rÁ42 A7@=lZ~K& E)NуkX`dkgjxkK\ٮ0XBō+#c]Gؖڭ1$"|ko5&x).~OənŢi|8K^]rzyf8jg7j m[p-qpƌBOysaS!8{NrIO8U62m9c1.fz7*]$?Cq1Ŧ1 soY63n"' 6~?CMG L!{>_Jpy0XOn`CI r^j(\1K5QW N'UijpF|L_Wd>2pR2d0PCOvNb^- ȮNY:xD|siU쥀[i/.$PTrN|a&?\Yqi582 U5{"&4bAt2M "N> ;^ӶQ;pBp(/V Aj?.:DS%\ǚo`%+"ϖ7U5 S <gяF Aǚ*"~Ġ-q7x!^ޤ R^jڛs4Lg;O$V4onl:<^ub_)@[]N\ j 0IP5a@ ^N\vF/O n2 @_Jtϑ,ʮ#!8Y7zTAeU~1AnΔYm鈒mt~phЫ5gԾy U/X y Gz(sE jLsu5.DZ"Y#>L _Xo=Eo#ȥ5zw_^ NrK0 eݼFs?[#TLrs)b;JB*wEI2aZzZi Ĵ N/t? ; <hmz"͚tⰌ(iHk/RJ 'l5bOKNE5 4팢+vDC-M#ȁNCAP,V0Q+]l[u5oI6`o J`J{lfV>&9IZ}v `s!ɼz$.xnͷ:zѲø >/inO juBȂCDOKR@JAsNP HMV@HL6Ɏ8bkBD3l^tދME[Jp)gs֏:({: R ~']RJgAn]m`p„UMώG˵S7q z%?^>b˕DrYqKd0A".Sp6~t)gâ(sÜ;xLxd>\HEïw>[FBDYnN \8oɵ3N.ة}'$?=FJi%F^jYag>>fpqWxW~*zĒX03EάHBG cbB4lZ;M:9Z݈#ċlGmDVl2g+bW,n}t$ŬvvK2S~$,A&(ީP+ 1ӓ fQɞw QyQpqC+/z1Aw-TIoBD3'0BpuO脖1T}+.3V_U.+S7MU7}E4K>Aþ| w[茅 `tF_ v;6"ɗ"I,u5v~nuK9ՋRZ;J+tYj_Z~e}2l%RU^f57|'Fջ7G6al Z9z{}|d)F9w2fA=›EB*2O֜rtQ_,A '9iHAiyKK#Db_޽;w䆡SH/iELؐ XsߺISG9S d@18Ovil" pXa>{M\ +wa] E[*,!TC3?& X+A] Z-rW~#>2 H&[d#5}p=ҵagf e#!ƄjxBbL]R4~uEY^ednbwKWR6C&E+dšYJi[W¸ endstream endobj 46 0 obj << /Length1 1832 /Length2 19893 /Length3 0 /Length 21065 /Filter /FlateDecode >> stream xڴeT\۶5 !] wwwwwpww ܃Cpw}ιתUgcV"%TP43:21pddl mhf.ֆ&:XRRaG3 l7v``%mF@ladP%(99:}f@ʏa;{G 3s?9iid-D24ssښdrvnJ -hnhm 35ʢJq%yUeJ.vEXYEU "(" UU|m?T>|8 UTTe#da#@G_\nnntf.NtvftS1p9Z>@k_ĸؚ|l;]Xm6|Pw_`D8i; 2N((l -lΆ.Nto aG?5der2.d2k/C1C['?mlgdwF ӟ=K'+(')&B+xv9;'  `hRQ[a;Nу6`jakb{{zU[ `љ nlN_GGA= ca z9Ύ.@700vhq+o (Uʏ95Ma?ZIZb.r6@;XX{s1/;DojK:~5c[R)8,_ZFv}- A!`^mDmL,lLlCGGCX^`bex1~4 f9]}v6@/G _@oo"#"G9<8XY?#ݿ,z?Y?9Q?Ss5 ?G_Po.Ύ }x g$-ZH݋ @ ##}5S/݁ư+vMet|R+8"?-dv2\hoIS&89jt]DGR9%,mmcaΎhw"<yfTGkdeDNNPG(>9Pq)Hn =sdoO3ho(_FQV ETr PчvݱuK%rӃg k S3a$ʞ/F*6|rp>D9 + EO0R5wHnAS|GCQ ?] s0JT&vI N8B\GY}vI՘)l]R5WT[&!!h!:È/G $O͠\Ol$֜ͣ2˩`\63L;t KҊx.S=IӀP hI̛afoOZLKl| EI8癋19J}]:=55H~_,C^k7S%$Ep(^^DG{r3zMբXVp7t6k}M:8㢄Y W2)6o$L a OJ"+8SlhAt"b@{'>f ]zU{FN!=fGTϖ.?ZLq(kuGbV8w>>eL._E J\\jS4~u)ЄԄE1L<~L+ІWg16%SMhei-oG՜4Љi[- Al]v}smɱ|:t Sgυ nnD^3wY@wF2)P~ !nڅH&~S-VnQxb їgMDEIi߃iα3^oD-) nO2:;F[pqk+I AT'f ! C)nQkĚ EELHkL4: DFzB<.Jg6B|:\yuc4l/I梅b /Bk4v;fY BS`}ƥ /etmB cc[CwpIS3`jЊAɗENR*R9ePڳ1(H>/r96p+>T+sh8ETYXbX=Y N ԏ%BI)M Blm9M{/R249 0e_i1RWe~LL$蜟Wx@Agс_6'ф(Vƍ.g_S+FZx3 NxbD4dZ(>̌= O_^Mqt-o]Zl&6Ai^>1eU_Tѡ$˜m+՛-BʠrA'I5,RaYTva{_u;"J\:AnqT[c7I2A}&<XoB0w=,g'Xps\ۛwZ7!L[Y` SbڐlM!lIP^".ђPB)U˕VÇ-lNp*ʈS4/+N#͢RlMShjc?ILQ[SΘvGuB \6`(|L'\U#3!mw '/'šk AY##Mgنe{DFxf JEjaCbJ"$7/R@^-z_t$Œ8CUIçRYec dDݛdyKtF_{R4[S`f={V"-XRY%>YˉRَ1,fa#jZ1:of[*}H͗^* O[ƴjo}_sV׸5jL5H ~CdR+&+p5Y)5R<%&y2e8ؠO- x'I6KbLk/EQ鿎Lv"wY>>F'FiUe)uq}Bs4YfNkb\y2cA֓YR`V֍:8 og=#}?3mմS>ǣ.(n^Bf'*TTHpAj^%2:x\W\hbn1*lkҐrq ~;dC{Oi_];oL'yXь,NYŒ![vZ6ehX|"HNpWcNI@nexXGe )xg~Ӭ~1k͈+a GBR+% F/ j+OKfv#1eH9D+*K! #Ed"U aU3c %wXJ>Q˹ؠ>~]^f'^@xHIdԆ; si._sk嶇;vsx]y?;1Y<6˺aj#JH虸zߡZaTǴ7dxZ( u=lV=v1P؏LQcY\!Paj)LBSɑx8ǏR_&1+ jUi3%f~{U*/D,ߛl kHz EPxܓ^ZiCv7 yhd_p\WK>F=L I]CU(%;&9.jH { Gv ͘ā ^]Q&:a&ʲplB$~V) 4񖪱#xoOepi.g ڣSB*vBD%^$4]ҚHb?3)P+adLjbo- *qˢ'$,/ʑa101oq9Nle`beR,|}hGAT5VB;u~9_>Qv}b?Hgl+m_.ߔi”^t44,-3P&C.AY>cM2]TI"'_JR/Y:\V tev9nBl=ðQiyFdlBs#?fi`ZͣLtgU !y@뙤dDLc 0f^ ,zu-A{#*;Q`6.jU;ģAb#+9o^4PD|;wPVpZ":Z.m΋݊)z u88[==Xg-MHL4ywA UFɓ&J/i^fEY-*Ѵ &C\ ! H?z%hw8a1\f?!3ȫ,/2ۓP))B/ ,'+n:w¨;C4i~dGglu<^w3')d63AB$+ұȝ9:,Zg3‡CQ[ň*\;@ڄLnV2v"Ż|3yT,/~mQ`iGR&~btg nF Ano^_u5ܽwzDF_܊3 C!' p1w+{;nFQ۶T Jw`ZkfI2oEpLDLj"~<`i&W2Fј{E8bL-^?J/X^ajTcׅ#SޅF1yV%u̞1Sۺ9eh<6}M+\ưfĹ6\x&؊bGv L`f5<~}qpxc2 䐀r2ۀBVu}JTp UqBEy_A$I94M@l_Tmiғ1_#Z1(PWxd]BC݆+fS=O*Uw. _}_^*(HǯY"vParVkԙ]ϸEm̺LUHÝNx$>!Ec!1t5h*)ن;>J_[W3)fc^YA/?'cCנdT1Eհ:֗(a g%lP";BcHkwCLC8[|v;rzA/_ /~M~U!Ibٽ׀cЗ#/Y[Ef1u!O=Cd . pwyaޞ`-8'ӟ,.YLM{,IzўoMꞿnI M\^ʼn 8jp¨ &l!'ɫ`@Jؔ fYaEqSDj>.0INo]de6$/\pl0:api/0:$KfUƼ L)M<-FMQ?рɿ"x/Qv '5Yi{m;z""$S\>IvhbZ}%#;vjkeo{,H&r:+w\ʁ l胺ۡ{]ޫr<|ASɆe+-@u63B&9ecxIGc qK~I1*&%E=*hf8`YZEEq9m )Z8AHaϗ{{9ePe= «XK8Bf[< F b*@􇵷//ڥ 1Fyr&(\8H+3^Z Ͻy%ףNt+ C(*|z-8]q3/RmAr/_?ra:eUf4_:E#/g d[6dhhEG[ s)N;tk=]dSX{+.~~CtȿZbX77ZahJV5)sǧ  q. lH Uvw.oX_]Vʸu 6ϟ Ph񧣻Ky Xs xySʵqp©jUz 㘦S֊;Wc5dS)pWp#養-Fd0bڷ2NF Ӽky@!oE*twe9ۛT em@eZ?CtOU?VP5EG_QȴZᩛ6Hi3h$;1}:_|H>n!v:YDts`S4f͏H,T4c9j;ƏbAǶ~^Bz.Cډ F4D=hx}wJD"Na1EpwP1㽳1TnNIk<0""y%mE n54 ?y GXHXaDCM濵P|e|5 _FLmZ&>G0IG32@ V}ɥC=)GOw UT(s{\_ʛv}6!b^b=t.{Ǐ?4s\-!`IoGx7aQv3` ̬>-'5E QwǪ6hՇAj?o՗jIE9ke##9AJ2 pZE:J/ O=R4 yTjUgSr{SpE_'h.C:f> |Z1#pF@Wڃ^ ,a14W&\&kKRoD}=b\)@U G [XƀL>')5x*Z?.f )[^KgT$8LWӚ\3,{nd1gėqN E+bzKjڤ#KNW%iD1 ag R ~s034+Ud!6ܽtڦp1 zl[QXYS#gt e54o@T]b$:d~2*A) 9'^1\O0T? Kybq/8'nXI&5xb ;;zPى IVx EnXё" .slݹ7Xe@uJIUg&>mbƂt)to =" ٬@Ul"{ذo"r\f94!GLzvI;=f'^vB2}iO,JUWܒ ߵ 1E=aXfIk}XFMG6\&sՕ Tc,**FB5ETJF_3Eh,!M$@aemyH@c*h N_󜮎uǬWO9%)zjCq/ߋk' [*QTY~ UNE󲛷-]SlcjflAx ;KCN]_B܄;SB(ğY#8q錍c#[VJkf$-FqWQͯfgŃ7tH hhҝ]=Q'`{`"c 6#jGK"X[|  ZBM/Z|3Ɖ~z[@&],{Kͯ#T^Gɾ:k1\VL=W(Cxc*ؐC4M t/+0G{{F<3r$piRz*,pG1A&\Ty\55:5 k|}:89DEaXDJKQ F4q#\ylȯ%5a~tW HE_)%0cY!s,aEC8g(mfd^TNO\Ի %Rlg[$xܷBR#f$,Њhz;pC {jdCX.}h C'm zJ^Wf_SYO@q,*khN\tiMy}v2rv>C80dUh)zmɳIg;7 %1 o>ſDCdݱɲf "4_oK3sZ yzs3>|Ϲ[Pv>=O![n|_kU>;5vhBivksn_HBOs7W[]zlm yuz=Ϡ]Pր>*̈}Ž*~6XkR>Sp'QQ= =e "a wƫ,^@I[Z„UW3F=A%*Hn[ǷrAV|"+EDb؟RhFmV*<곒g=AcJ٧hh7l!2xIhoBaIMj$Eqڠmt z4zY y{%OpoU5zI rYAOD)\'zoϬ&5/g.;Mu$= ߛN5v<0#t4ם<`G&r1#fxn,F0FMY캳pYw_0AЇTw!Q+7[-UICϑjS:,+ NsTPO/͓Co'bFGӓM/x*nK ߅~ܤ@pKD:&="؃j}q;(*A)QA8 ~i~U$\נ:yET/}óʃYW'{9g3$d)z GinFI^l$7DhCLkh"C Ȁ; >I&== 4@𒦞:eMc4U4cBk*$M#7d1BYϥv/:S=M03H 3*@i k%Dָp:z"ʉKYW81{Խ2B<*O怡w%9(Jw/6] Oe4H8%K3\ kf;TťNFMg˾Rf>dv |%$=y3$NɳGvCg\Kf]Z he Y7_i'|C%? 9X UIDZFE'HZ*5+ mՌu$W9bh*WS6iFNT]GZ#?ynݯ c2zHs\[ 6{#E\ z-&P>WIS"!dӾjR͊<؂u;}Y;7qjoz[@( l~Ei .SS57m'm _-Yq!K dY~1`eSelie؀}>$GS2@k%!˄ZIь2yv ӆq^7ǤH8N?-Ll'WYմbo+*/h)׎}=e'<߼ݥjN?xn0E 12XFZ9{#XQ-\zʤ*B7:d6 $П_R;/RD.)cۤ Oh]ya})mʂ?=PJ)f,+A l}2/aٛv3udtk,<ۋej22ȓFX;D">Xza)wɌ۾V[6\`LH]5~753L_(-uQb厷GUH}߱'nZ ڢ$M7\G J(h/kR1r;_vCŦ ciUYo9fuBRgk-uFęVSP;є`%{*ٟxWnUZ +6XZZEW&N}k`LԧN5Jkw' ]Rz\ އ>uV; ,{CGtDE$Q̕wp@dz뺝~[2(Uyא &X]H,PO"OfH=$-la7)C!*<P9`Wl;"SN=Vrh޷ǓWZEs Ӿ)1LS#\~J>FGd0a\Msha}Hٚ7F)3tT*Ub#x - +aOO&3jh=1,xaqTixfLI̤&6E!Dޗ?x4di^i')FD˜ֈ! % "ob{ov0((SUίc3d$ͬݷy-yQ;ZB-;qӏ0eޣj%&:VZgjaK{ Kgl_L17D'BiKLN7i?g݅HD vs>tOB/GV n$>;Xq^ Hm$թ)YďҸ hd8v%mMBf,SFl4/ΟNHf_ZG!&-#n|kzC ` YK~.SO?K'0Z;Ԃ36New{QG-:scjMZ_f}XCV] an1^^{u&G)+^L%^ > 䱊ڽVO>uaO4/n+!$E'oHp**^q6A` c:M4S~"N,*Qs2 Zej04y S D5uy0+5%/i i Krcq,A+>EkLOqկC]J\^bul]#S[z:hΟ5Ѽ2⽒,ϚM7=nx gqag3 /])\]Sj%S |qsV҂wSyFZ[`3\i8>6 3R.`TNqtk&H^طUQ Jr]Y8X zd 9wL)j{E<~ ݷ(%"><ٓOp#^tUNE%\'43F[jF%ln9-HISQs"/+WIO&9=,X 8֢otbwP Hj%_oh| WQ~,xj1 Қܦ6WEҖkDwJTǰ4 a`TomC'pPdAć`ÂC}ʓ[-XHV`LtFN{@JM.Ãل<+#pkNIhl9 ԡ d!?c68w Vnn ^ԙ!MdE+LVُsN 7$ez3i\W%bvgw)I 7AX1oCY0L]Vp1n#@&LRT9}52cZ@@ _bXpϓhW $=8TIm0 g)"$A!6]>Nb}a07`9 jO#KkgޣЅNb^ 2*3x>`c v u|VwmPT> QH>zEnmϏ8;ul.;[SCeQ:LWSq(3ˇV@^k!@-5=u,F9MP15)b!&k&L^ v-Y:ٍM 25V!8#TjvRlMzil?.iJDOj8h6jY>t%\g:%=Cq_!!}wC$r:@rCn` دR1o9T$K4D¸Iw*!Ч Zazd;i!wz|43XN"Uݹ^s#$d8q$eh1/ˆ~ &; Mw5a dO%~_Da`֫b~,i BvC\\O+o$\\EM/H":NI95[#+ tyAEdkKoc:+k0=pR:8g>2;= )?_Vs{Ľ߬Oo`gd4 YQ&_W"\݄EaAk7>׼:y/AU5<6  覢Uб CO98Y: V$#T5!,&CT=^ rG/$NK>B8KMgXR~ #U.ÆdKH_wƛ|H5mYWo ~ZįrԈQ'OU5‡qe짶]Buݓ5=OLK%StCkcrҹ9ԏCD&iRLvtaV2Uůnl[C-+C m[\ ƽUԴ"hzGtQ/QnƘS)DU4rķ9+|N}^ʙD. Tzm}#RG%!xioW||XJhE]r8|Bw_t㸃s`ʱmgJv;`RgXʀ7Oh= GmO\}*S^ M>#Ca<o( s;ițXxӲxޒ1ZBڙ:ΰ$ & #-""=j)ZUø$tDY 6BxP~T^E~g:txy~,Qt0ZK=/ +kIUvgG-|?8YҎ{!zi^J̯䰳XS^EA /gh6vUSqWӖV51@g,dEunNCʊ4OuUcT\o&w>},IK_j|NŎ5f1 oد,'*\E$}NCەU.9R*`|)-t#=}^8u&\Xi֩tֺ!YJ$%2&dz[F/#Z8t8]wxF>i!w ܶ2gpvwd&Ogl95BG y >7ˡb]hcE3ᝐ|Eќoh〓yxZ߀f &1uok =Mtي8bWBfKʟKb);`$LhaeV s}(MmxU1N sydBaFۯ8eSjyG#`ܫB6_QZ/A)ai*GlاPs{v?@`mB7yRYzZma"8 'za-t'j췐y<L#[= &S'_ uDfZw]it6ڋ4vt5H'| %2={\/M\+TE?0E-:?:|/qT 5:ǢDצ;M--zY+5- 9q O gd>Lj+w—Z:]NhB8uw&{Q*`Bqvn= ;É`ԮSYb o&9B4W>܁#Z`~JK6 bL[]HM];MEEhBWnEBkclOؗ 4X4Bfel'ĆO"?ؠFc%.pe_(6ߛjbY Z,uY tŷu!HMrRWO_mW(}l%q I[$4 nYz{1ua?8YdZ< 7DZޗ 亩.hy_ljCvdpl|p#yK 40l7ˋSҸޭ5p2'Ԍ?XdⳌ+X}n@!P~yaQ[nNEa+M=.2O4#Owr\px(3Gӟ *)=2 j~M.pk#fP]hQ3!2%/}R&D*MiW*8R~7lM5uc|t|&&A5ֽ3fo KV@p71IѺ ?,T_kf|'k 借\.G(ii_%fJW=Tu*`e2"u'FAy'}Wؚi/6W+|?#t+G?K|8[ !&Eq]y윊OszŦ6`69+Aߘ1Uyq)ҽ(36EhhXz6N] {H5l  p_8C!8PBkb#͢injwh vę~RvJ1-+'r !, 0H`#:mcHX{Ok#ӯUluJaŐ[*]7fzKM$>' ~u.]: F9y0d5e9N> &^ɹY @&Ǥt;)i֔x@%xNB6%ώuC+S11S&8L:LGLVSm4`l4&Tڅ_% Ѓ|47|'vcUVc.@y (bIS2{nހ4"C>RӋ-sf}%2hn0`uA(T]cKtOtO fg7W_Z'a=c/vzvШ%ag!~ $zV41 aDą?SsنdD]³w@7Ctn6)n20 kNZfPc7aT|~Su>0COMcOZ@YL|i[b;})N)h4И #f/I˖6+At Uػ//E4dX a p&+V4 筲˙3ϣc7ua%ez+%aFՋU}1A9|[S=LTFhWPF^U(* sr<b+CVYߒ+=O9w endstream endobj 48 0 obj << /Length1 1898 /Length2 22742 /Length3 0 /Length 23934 /Filter /FlateDecode >> stream xڴeX۶6;S=] )ѵ>{ߕIrc|?,@Ç`:([G':C5H"bk`nj' ݟHRFc,=@Ch L&e:@EILQ (DEX()HD@UZgeSZO?bB bL `/nj`kW7+)_W8 w?1788(Ӈ}OL@13pWFAA`m`n110t2prv%Dʴ< \{ l=Q\s+/2G~Tdž/?Del&.6GZ[vS>Q:9:3micj(LmMَA()?"LNFt32c~#f#(mnxt4pޞT'c9}Ǹ]ɿT*ǜX&p rN-AϤW.qg++9k S646rO2QaK)g`m`_:sGqs7ߥ[.dB6VmKg>z1s|٘KіF6@GGnB `PRД/;1#[csS3;Lm tY 6N.;g'oܟ eg08 _qq ql>/ ## 7d0C#?GxgCLH,?+9.oa%'[K?Ld ݴ?&C;H@'Ga9L,,ټs?t-X$M$?-WXJl& oM#Ϸ­ݦP,m)l.H*_vb#\i1c֎wDb_ͫ9L Vn8mmNQBK3A#RPv]:h*?7gwƤa[;FotLdӦyuJ.e X&PYf0Z6&U$opŘ '[Ⱥ K$m_y$ț*[ƻ$_,>}GX{QW2+U/'!;ʳi_>CT b7\pS&\ZM1Ur "n+%pӧ%UE!(pިRd-E[+_,1ע͠6HGU\½DMp|i]T c5Z[C_wF|zS{wVM?b4C[i=(Ov>xy0kEh))D؆Pf00)h75o\aʚ {cD7RL@ӶTRC(1E,A/[ksO+`efY$j^߼q>!gWN\5ԟ,0r!I.u_ozv)ISWw`%jm;Lѷ,p%e#ā1 $#ʞ[rDvJ̋r?<=4w暷"eLqʚۊ赟:{)VDS!Q;V ZKLsU,^P*6SF,Z-4/o;$ ƺhd EW ΂cOat%}4"WƖX$2g  +M  ]<%u5i;no䪋rkrlB 1uF|Jʤ`f~ SM6ڢ+tV%6lZr6Al^X&prT)/#+)}^F}V6`Hx){9QTub.8J _i#'{5p> DKs%Ln]`ZԷ{hhqǢ9p2܍u}FTMZs-s4%Rtç ~+هAs0Ta|\{ª[_{ 7`؄V`aӛN!.'L†-ԧ/){[)n^얏U[Hh /󘘬gvN<:DQE4U^5J{K,Fcc;~RK޶;Bܘ!vyAC[W[Vt]h?ať*Yjo{g91ʅ{O|OnJ~zuC=KV4@~~?0?]b3j)Fu9,X%m$=g[:̒qa7,scb}7ŒI) +% ! yR܈hXVS^=Rɹl[u6Cc9bʃZǾߺũO|}Pu*aH7Pb=.Mɉd/ZOFJcShi=GN K[e`{U A `a`^[t&?1cPUXM|ų${`)T0"!Ђ8zܞRݯKΌDZ_97~NMuۀNa=#Za&.^ O_N 3|7=Z˃iރQ9PJcoP ZzU#@#X=&> scI `;:g֧VD$'6g3KCO@` ?XX?'tԒOCk_"Gɉ޵9^ouYX}eD-2R'vS$ibʉ+kDv$eܮ+?yuaj*DuB%B! fNyuYP\/8\%nHQ!OgP(ɱ²$U<yjZ1$qj?zNXufT.w$*/T[edjVٟt\v oi\׹8ׂk 8FO8{(23Lmpi0yH3Jz-MKNuMn >qV@Yvj5M`Tj`x()Tr .B_+o^CdeOA 1=lU Lwal) CPQ`ӏS~T߸4ͬrdt-ion٣# |9x3=tlz:qLW2<9u@x yl)`LQ-庘5~;䳷흙h95x׵ϕØCEGo]@U,~*+Kp-с&Tcc/X=҃qq0'rn/ 깃s>g{1W FH>wdXPߑ}ĮA4hy1M|lӴ!6KD=M?06pL_>V U!|>)}k<>_Ո#ëd(tCSCoZA[#CM#K dU$՚PS&ctȹ/xnGh4Ypn@' T\nIŨ2hP UzDhkQ]2 ȿ_lùH=n ^'4KIfB+IKe GSOh@YjПwuŰ?6-x_n>xzH;rʣ{ל$ѺQcrK,#;[ 2u3~;q~wC=4Q*L˴RwE,4gU_Ne'sJE+|`j/ZZ'/}ѹ>P\BC%>4GB;=zy2 ,5HAn!{{?x!Zj!>2#?  {\Č1W BDjYX$jW)ZI}Z+0魚1CZ?kFY9uv G P}\͊6L$3꯲6M=+M+2uĶ2GTUTX 1א)(DCjQ'CWްI^TŠபDŌl}Iߛ]4OF 5[b0[A귅Nc=$q(/`85'nme֭źUqpFjj4]S+I- Wuxa sW*q"?kx9nzkoi ×a6D# _lnyx\(lJ^^aaXea(x Ugφه?p%Dq]YuhhmbJ znR'Jr ׄ-؊`2d~e!.Syx"Bvϱh-%deTڛ|7^9dβ`8ΔV]E7혟M3bGh JAIP:H&e=NJ/ m*YaP)\JXuWxnO̾/>Fs1`󶼣OVJD P3՛vy[[<OmO R NEt8m@:ڠ"ClӬbU.@R;hbэ &*Bb5=}9^fN¸_3486VXvݳ۝Zb֌{Y~M3ZmEl/3+1N5T[=h'1~Kgݣ>4Fq_Tne+K ^!뭰 :!Uh ʓջw'"ZJMܞ>?]t_,8t({@0Rmf=ܺ>3Xu3.r+}9)hj~?` UA2=[ b-7.Uq 꺴L o 2-VˁKa3/>bDJo!eۤ"|IkKUc>#<-vv&hGY _D=K?+˭i Z%|?w`j5${5@I|cmY/Z~t+E|P)6N6IL$\7Z0;!(6MQz_pS=ɹnHF-ӊK!#^#sSF"+d.+*Z~p\,)/-Zg)h݋t]oˁ( mn̓z[u hY8Wd6٦Ʊ }wc*gɱʓ?IU H-QMnCbzidA#КӿT>.}qu=QؕMd;cxg0pޢ:~CہkY~]7 _o<'RFA1gmuޙ7&7=0HYf/J-/rte(d)xPaGIlO!^ZNHgx[ighS;xa01[&3MaN.9[-=<DGD6KXkCОh٧Zq<3.N ba1І?-w5_D69 Az($PGi7dDˆOQPQ˱5rtčP*CmQDtfߺxVʱS5{(G".2ɏQ֥} nl9r'DzsO >Rġvc#rh&]+EdQcҎfHu*_pɁ dD y(4kSxQmP$(ZՕ`ͧ0w##sPˋMLfXr sYhԸh ޡ]z~:cHF&ڄ^>*L+o ֊V] ix f(iژdkULT4JsztyFFTp'kĄc;2 8I_i9 nFy"RMb1÷:uem)۽Wׁqu*FǸ(7>DFl{ 궊~$zaƟ:US`|vz+5ɣUjH΁~S']\/ 8;ȅsT"cb=^nв"Rri#Yc'4@W邖ЕN2BO sށNpF˛ &qZ,>Sg:&Ulj-e"wc2V0j=Q yzQftMr{ wϗZ?Žf8x4ZBxn@@7EC p:eb BVoo!(iN5&B Z&vQɉYRh%0׳b5ؼ1ApYI?@&\늑xrZYJO+l4T+ t4QGY5ΒDŬ} ?c^*'Hn-:M6m r@M5vL(qZǝes,|?P =%$dJsyu7oRdV6+@^ldoՔ8+*9(|/a2nL5|Wéa;8Iʨα;dݒVk%^Qo.#/SQĆrwsBb\U>B4ttc@uƸ/OUXoz_ߕZ}b%{$[^AecJj+vd rg̏2S'ZVRWw6S.ULJI4f: "L5! G}%u`vhh~aV~`12 >dYSP$_ϦƐfu@%i}~,x[y?]%^ޮ? _L }+7]aW*OF1K6" lcէMi"GgZx ϧ3G)ѠO2߹Bj/]6zhF$۞=9>9EmbwˋMHzEޭ&œt(Y\&)Q\mDW\:,rA3QZSҜE*/|=5XrM[;n*CRz;(^A>r{jF^0nIUQ S$R 50׬\; Ǥ"5'|ʧ']m$mZ!.~5C~ttY͏G0\ B.zhfQ8Hx@oƶEWTn&1ᱲM. ̲w-FKĕ$i0/7:0$?!b)ȾM[)M%j" ώQGn%Hul7a0|F }}l8X'5 gPehRFeI.[E"9 *ϵZfQ_-/kRy n[} j8ES% -ad8iyn,q(Ώ t"v(w*A/:UO& :Βۭ W{ebg_|\)E|G1#4;$$BQAܼ_xFf:t4xcDZ ' _ DRt8 E3C޳ܨC`me_lү=7B&)^sS{No_UeZ˱(sܫtzI~sy7!X b&{y_<&X$:yvXq*V$/KaMJ g=rpXtDse O:HqhKt\ʘ&Om Ea )J3y-JdΦ}uD#wSQP B%%~SEX Ji%c}Mq]jcd›>:j:l m0qKL8gLXB*qoui8-$P(LDt_s4i&/Q,~Ep'zE 6?qz+W W.w%sh\gVW`}Ň`.OEJ/(t*ItO2#e[#Bs\tτ6ʴ8xD~KTavƒRD˩.ܼc*B:gB&2)l;rmA{\u7Omn!JH3=@厂.d{:9,ΐ\-u:l BV}fϼGxtT %T-{8\[h}i; Gmm<i lgW]kMPҗ2-2fKf"],WEܓL!î p@^˺8iVpWC#JS䂃b7}b(Ѵlx' R7;J.(臙=] }uR)g)"C5nӦ_žӞ}( rAѓɂTΪhCQ\:ɇ*54:] K4vS=&yguQc#nS'.#Fq,Iۿފ>nHHP[L+=U<]A:&h}9}PUph$McYFcZe(5MK-JOo@bvXa+OU ^.ZXYrs}%_߬]cQ q5B 0{TSsO=p7)=tɅ9][豰IWFn:) JH[,r~*INgP8ZHN$s0aB s ѼwO-;o_"tuϿx9YII}KsbAFeڞk#?c]"8{>~DgڄԘJV_sIRaӷozsCNàJe?3e HD x-.ͅ1גF6a{m,if펯t$ "`@t)Fѩ.HM_K'XB;h"y#BdRtޓ5vpGND22{փHa+`4)WVz?CG#Qfuu;?2ӖO)+`~>%Dnѓ%j!F쵝 wWbaBIH _@Hׇ0]j(%Fn.bKd#PwѨɴ==Fy(\djFfEi* 73N4~^hhni4XU*ơ29k7%Ny~i}ev% iw&Rn6My%ˋӕ#l= C"vnXL dEW\w;5!\8\@ϺȦ#f c)* C ruh>dsߋ7Wi^Q w;<(}RA `UC]^{ƒ]<0!|A_zggv~1)I t$hOL#|۸U-9TT(4]ݶ,(ϢI~fUi=P:޶ "߈N̒p9y2del~[(@~W&%fΜL't7 /6574qAD$*U`5X7-ܬBi]a|`K f ϯSJzös>e{'kfKJװ"|c_лikg7bM09ldnK3ƹid\''N$rHI})-K|]e@(z;G'΅jmu鏹k~M(]am]9kk3UhTL:` G}ֿ&uE!'q:Bwn|qsT? /GO ''wЯ<'/t[#ʱ hMB :dox'wM{J@j`~?6}=XhxQw t(Qs=턑7R%R$\x=dT{fpF-r} N'/2MmJS9If>\=K2qK%5ajopH&`$pݭ'ժQ||\]0GGj7uXg 6!!F eE*eĉEYFs l t4tl;G|?\]Q}Bbx8%3_茹)FQc!;i-FzBҠO[j{DAˇ^b"O*>bK dl`X+11\{uڧ/Vͳ$ T]n1O3KwFS_a# [v\Oi Gd(^=j(sm HI<6[h.Ĥǥu)齙߭>вk53L1XvYe֓mJ9%EY,PeL]Rky4dHU8kZx."ac 9:Q4qNϲ=!;U3ȤY]2l8S' f{qa}{K6U"mL2>oÛQòz||׳q zP6; }SKY[-|{ʌ{eݗ%7Y[Sz8IT/VE]CU+=񎇛/+_> 9 -:-i!Ă޹U.l# 8!5euޗ}/az.I\M2tãѷfmqbH*-zD$}M9HH'# vL/Zxa(2pf2N{o[PJ^w<@w*|RP.7U9b-**셥ȑQkCxб!^ȦģسRS:اxnI&0E btܫ"7 䣹v akx*I_$:<;3Csyb[eUX J]⑤Uv#R9Ԕ4vx<h0D_28UNN^d/:P|2j:vàޅ*KJW4N5whєR*GMvSM׫[JHvQqDy^1a71=s]F7$/#Hʖ]ST|bo-ṹI`+ JIpI#zH"PXXz}\Q9e^Օp6ŷ9wGM9LrAG@< LJs:0:A! QWD_]C5a787}"R 8YA ̶_!.a.SC:m%o NLMIciE>0={t>1ʅt|hz RGJ$Kּ#!!۸1\-3s*>íDQǹ@ : )wضP,-A(.BC*I9M5lgURT}5+0?%\ߦh>de#DhVV'IƀFݨ톈0e 0B)RE j8>Y{"G|n{W]z$*LrK;4L)yLO$}z_Y0kYc|ʊOjlּcr՗: ?s|YǗUY>43B~IX5g((8ekEO%ژ֜m̋džYUmU4 VmbhȤ|O ݣhRIكdZʐh 3_tGW^;閬 ȣvٽ4 Z k$ ӄUmg.l 5 #mXrU*mB^|2kkK1Ѻ,ꪙU8%󂊔M.~&b샒LGB,ysO7_ϩ7 GӰjJ #:Y7TY7Qm梏/2?vOR8c~ 'T9q[HCwHХlZO:J8ozw[v;kĀ| 6݃Ż\w"|U=L$i٧,B:Y%@"'X41>Ȋ. v+ PqE3jHD^d0 ^5l9J./>i:a,?߽EJS3jxT5޲_~H EՂ #ZEN hZ2E,FJGz,0.' wk_`'?nkd 7C'G-̊F;i)`P]ڞWօjW6 OBcR΅>o[ &SPJA@h1T0WchH[i-8`Wr0qTV)5\ fCHǨEXƾua =m1bѵx??w/J%0#C r}P߸!7h$n?Q]5CPQj~!_AItq3:uO^k' Ҋ=.hwn?q.m!,XU\KnKceCC*!Sv/`ElIo!Iq!7=%ІR(uYv:}˺ěKM1)쥨q<晱8MhRz 1SIiqq4SoUno*!F? n :JylKw-:1h*Tv'z$'PO#z _H1qB7y?Q:.W, XVq3f#qŋ^D<zשYi-{V?aGpʆs,V 4*/}r=1leEIj[!zB`OYI[Nשcv%H Pr4#*\=5'_='Vo">ou@_&%.,z;R٦j2P;EFϥ-C"r4)ՂSVSF*}{ +;ߍVMEmKrT%ŔѢ:i!&W8{s2 AJoJYG7%t;LPoOJZ7e*b`IJ Ƥ͙%? .Bvg {21Q|`6{CH#9M4>|=Xke ,Pp;^ gSGu+g-i6u{1.QX@j5 =Z]ZMEfj~Rg"?FtѹUCwFzF1,  W;4iv䮨,7bVPrPK >@CDs~g44VuVaUU$pۨEmT"&}BlEml<̤ ۀcؤA8ԩAY=$-D>Ci.BkAr pR5 G4Ќ`h,4kD˻{A?gR? ,l\Qd|sC 'CX|ThzŎ#,p Ϣ^|U8[+ O R\MuIv+n`S@5VVBR]kwзpl@"V/gv,>t/ pG*{nsP?&2P ǒ"dotAi m[ŽТMf\bGaFG[A;bo%CY.5+WoYaDI\8<9K[sW'Ldٜ|,ybYH 3~!\dץl-ŹBĖaduhqz47.V+xLw΋d*qۀ%Rߝ{e~_'X^jRTUw hh/ 9BNڡX%|Nv+&L]ꯖt2IB¸qbcG p Ó4`?KÙLvysw.r@+r\1m~w"ѻK("0sԜ[]3eا4ԳEy1M c= @]^ke?t6' hɩ}Q&9~0?Bm~*c<36ؘqb 7=~ FDַ8R_r,[ԉ{tF-mMa࣠-CJH=_ߓ}Tۧ<^Rp9  :LV]K%C3?0,V~=}8 Z>49 8ܓl̊qf8-u:pտ 0L^HGcbFd ^# 1#8 ؽD̜9{o0'Wǿ6:Pyy6hwڒ"& .O% 4E44<}oO8_PꏙJqb^';]I1]VJJ>^v$YTpVyuu\j̇4PNw?IZwWNK,#p@dɷ9>u x8ʝX/E^ YA/E <*_Ugld-bD&z8w;Ҵ+m4;ռFcƜ7kהpR/ wMd4ɽ5D|Bb_;?ْaCFL˲yVHg: >BVRUԘQH^\p8:=ja }}v֒Qe(=[uGN72`h vk+8/̝\'9*5l^^|: NtYȯ3jCJ$/;Ѣi1.⊾*XyBC [^ڧ(lYYZ5W[ (e&Fd',L`fn[vF v7&sW=ivV7~Vr|R@\2?QB.wtW}:gPОyQV[$kTe!`!e, zZraK_InM;CD̉ 是wAԡ~8MYoPcט2h8;~Ai=!8UG,R`g-'_(D`2? endstream endobj 50 0 obj << /Length1 2119 /Length2 16739 /Length3 0 /Length 18052 /Filter /FlateDecode >> stream xڴeT˶5 w !CK}~G\6gZUhy%#k -='@ZFRߊFAHKO CB"dw0wrLrvFzz h4dʮ6@_@ށ@ 21R|Y۸ڙ:DCҟlAZ@ I+C v0ȭ@S} c1@PQQT)ʩ+Q~Vr-BJ*baYeP Sh߄ ']FDY@ݟ5N@;{?C>R-":8p9;;Ӛ8;ZۙXOlmgZjG;L)i3C=ONˏV~$}%jZT\iyyiJ#A 4"[  hgC]v_+ӲpwӷrwGosنVfW,33l2"J4gE#c+Zӳ8C*be$dmiO>`mJڍͬtцN(!?&Lzt14C״131`oa43~|;v@O:0 >U]Cg:`4vq:ZX[oif#\R|ff.@#y3Cӿ;o.+ oʟce1wٟ+쏟|ihn0~㿄:iaq%3;XZYYXvv0pgm#_vH8:x`*+ NobcI tByF:!fqJg(e~67dfl/kh},h?Z@v?!ÇbjoXkhgPgo7ڙYc j!C?G?RNhۿ?b݀vkɒsuy{Vr6}$-(hNaQ&v?b\ÿ:g+ a ~|OX%;QAA{RΫ. 2т)EmI%ͳ*P'fW>~c%ED`8SV/UfP23[!TjSt@eH1q*Pi%97"v+D+#jd~"^N $Mg;hx>KN*%*l zzwQDەē~jo }$*ʍo־&&3;=&r17XwٶhfMP|!c:]R~ v.lS) 羜}1GgeaװHR&#uoW8+An 2MG?z G N!V<b:JQ=/+.wuy bypee7â8‚xq?X!798;ؗP|.T)?e8:ҰwY4^/$'cg.Ψ>Zs}-:X'Qi?ǐ)u|IdO6XbbJfxpO=|Os3w #38"b"t-b C$Yo%>Ht|gɾ;=VÐR.9kD1Qw{؇zfr%AcSn2p82ǙOg X;@J0?+GM80q(̵"x~WӧH?q Mcq`J'fdn i-V<\hBZeC&{Um>fOM¸,;@A3e* f=`9= Zwt9 `@112c yج4oz}+3xZֺ:#KREɟC{.#0)P]-ۘ8p\M}<5ӶYN W}=MuDEъQ7AAO?]\qk|C*k˕kկt%LZ%4ϝ@ھ2ٯNh€Kd2oq 7+%<55n-ť3ݍ%ҸsY{#A#/?yiwukJ#y@%&ksby4}_SQM4Nh: ;R`@׫#nK'D_&wde M?6t2# 3%TsNW=_|5&VSTX$pDDݏq8d3Dm0KlO^.|KaQ{Ɗ`zcq-wzԓ0yZ&D`L5!˜@ƞVtK(,ٲ__`mro(y0\:k3qɫ4<~pS yDqorTMdX_\@j7rS1!oJ \&A63""$/ź5&c5q6-4&tJjy[J&y;B{}[1~M=\z ถ[Fk jr$JLJAtuZk9U"ކِ<2(H[e'̷h)M;Gɘ"Kw| E&;㡩U*얓ӳ!^5b$$0׵g\ˌ]t76#ޓ3a aLI*u:>Rå՗(v`;,"c=~!oAç̈́~YldF -86S״~eO ن c_< i'@)+ZjΡa p8d0`zTt8n<#HO]k̶Am}B2?cАbl@Tgb< $W$º2Pt/fI) ҧ1Ks(L`4|i`V'߂sBkbQ9mg!Agۑ E͆l/6Wnr; (ys[Kݷ9ׁ!c.D% "݁ 8X Zh=|+T !ܢs{Rp/E5ĝ?D>lEMKD^Npaډ9Xzðm{9ywFdަæOH5ĜؘH! z]&RoE{!4)9Z\ՐDOsypaP1n%6b_ rM?[Hr u`^Gx3.=eW+>šHIm<5BUD,kb5 jA>=1SlU-@Iɥ;Idޭ {g'<-W/"lQ22a >䎨߇*Fr0r#>dBv GD9Mǽ3]ye2Z Za,85Y6¬-:ٓ˓dHB̯Eۯ@, „_M=RD~M4 o hg}Pݾke< q[ekuva Zh6 ƍ | ż~fQhElO&'r~yb&CAQUJ60#<5J.RryF+wsOïÎlJ7g0D62y>KEVD^sh%YY^*@C襞kf^,PL]WZۥ9W,왬NDq} 2.,ƳVt{Ccj[u%1ɉ[ /|@-:ViEh%p뇒 28ښDOkȨwX8k8 yJO,b |zZq&s*U/fW #DzWyRiB|G3 \{o: , #o}2Ye= ?<}@L|zJ2JPO,D %vrT &_;-;#C%c򖑜ngX8FU)y;`.\:-_m$8eF% j"ub X>a4EH9&P~-P/CH s뼰QSZJR7ۄz%1{Қ(f i'5gYo I|9)Y$yKzuD2RpW=e$qsjPŗ@mcc\8O/ [ vj@”H69j՛ q Xp#l\ցDKR7=jX s3W-l1L!LgWFO 5wįt;Ʌ 8n%t-ppiCw0;O:$8V*mj/ف0-jgDF <&;[4:/[@ *>wP=s = I|ιl`^5ש11 ;"DjW9{)\=C| QCawKl1tā9WM Ql=z]ٗ ϫ xB0`W5*6F%%MrC+u|Ⱥ։a2Fo%ˌ@vNCZ$Qc*$RE'ȴ7BI~o'[3o&D`٢D4i\{)gr>:B.;q2Ӆd\8]aĐؒəlfGwEz@5U7;1Ԗʙ^S_\̭Z\$õº ! iS4#vY7Z+rodL沧ۇf~gmʶ=RqyȽSa9m i'Phy;7`W^OKT=Y;!:g 7x}p^?QfR}=DP"=` w#b^W\~ >4ɯ92azy͹Z%٧p|m 0K+=t>^qV")X/5Xֶb>>&a: P{8B^QOKhmthUQtpy=h@l8IҖX[+򃱶rKr# r-a8%:MYXgFSpwi\7Sx|GAO3 [$̩Xe/悽lFN4!mˠA]EFlX@BGI}z*_DV0iȌ]OD˸T\h*5=l2ͶЋ _GI5$K*3jLxKk;z5Ŵiv!WUh yDwu,JgX=5/u7VmEl Se;oV8_oYPW%q(M9C5K%8Ep?e TI_:ڂ`)J ^ϳJwmgrN{J@CxSc$m{_[)vxg8܁Ū*&*|tf o.] d&l }T f"(TQ>T<2*ڱM$QJa"3Ybg=NnXE\ [u3"9LWwp^”斯NySܬVŠySoɦQ zgcKy,MbE- `SG's!|% [ҟi)HFoɶm]u _yuhk0 c֚WWiLgK`2"Lƾ$_<~=zӶGu>{e0'GK3t[x X3yk EXhS\]zchDfSq^&.^uw.cƗQw3QU$ހ DjhmW*=d}ۨQc}]!.m7=b6 ې[=`7X?rDc4w:7ҞyV,hs(IvB`B0b$Rkm Bͳ~FoRb[Hx dk/qTR ZKRo 0A¥/Ε4 y~b5=I؂ZsL '&KwԼz͞_EV*M"1 2&_ 1u@HM6ˆp04Y;]COs@R|hl6 ;{Wt w\{ R61KC_^\}PwYX[aFҷ4r؃f) m _ש:7D Ыݼ gj$ƖzQ⭏ SIZ}snNe=Ip}w, )v&"ɭ?khPC>AbF,U YyˍP Щ_ G.(wDN˳a2MTzl`"2YNuLRQ# *l1_z`-ތ38QeU(AyGZM 5a+۸% 11ސY{.-G%(J1[y-T73+]H]B%󥩠f3 l*өNͪ9QlӖ4R#Q~?(K|HIv093|i9"i(BUԥn&7 {Cίb甭miPCR|Ov֐ ]G'QUX_(sn9J#`RHE?QK0nZiTs‰1b1|T~f&CC"RԵOlSYcgn0zZT83ֲ,EuexZoo<:gKB|}1,y'b?`C$!:g7dzO5.]!;uL~;%vvyЬR[SeiA22xofLxFy%D~~:l@' _Z5S1!J-^s1G F[dWď$,mŬq)?VCn uB҆/<1ok}UIЊoh⅛? IJٔC$-ܙrs.H=yB32uLJRhE,asE$.Y}kgmaa:R]Ǖьu&L—`]7a2ƦtZ07V\CeA?N+ E.,Gd1g@m/ob'zOgWCxUe_uy^H̃<~5@Ē\vF0:gyUKXVmk_2Td;4(X3 X3c{%xDhs8iļec%^rG5RslTKfx0``fC/ xC9EbSUC9t:b+4v# Sn߈BK'C3ƧR<a$>7\jgޣ=_g. ^Od׶E,P\|*ϙ4h/ &Ϛr[_j6t@ {Df@7)N]Z3oVgeIG_A@(C++Bj^@Z/V}0e)sVAO$'מe~ 0_ 'l hCt8˧3Xfk7x}6_+mz-vVN'4jt驝VCDX@cTQCjAmf'SU1^fylo'D/m´}5:$qI|{0ágV`"G5kĖO* !h<#ɣKWFCV1rM|%}&G|A }w:@;azKʾ )&.hww͵..E8 R$B_EROVOa.I|Eča?ZJI?K{B)>yTGJ.A05?VΦGI,shڸN7A}|ۂZ)3s>Yd+'sf O4_Jejho[2;\f׫;hˁMsp! %&?֒0>GkfF4`cW>Ẁ7n?Ÿ͸SiZ(Txv8Y6|Am}H'y&7#uy 6aQYcB=+ 5会!3FhF\JN={%}䯢fK=5$Kf@g2 gX>XTF^إ s+l6Z%A.iZŸ". BUjw}}ڒIk ըVd F`|S` /v-^>p=k]d/ [?m!&+3N" \#8Rh5|v˽so0| >Gz/)/ wڎ7+}_z}ܒė>y_3׃vsONR[G%"RxԊR_8!xCa^/dÙZ}ZKR c-ctfBehS]K+p]/\տEml aVIy)aJG= 3{M/4 ]v~%-'ێEhL#$~ܘCԜnUU>{4&rTyJeFi44Af{*i;Mx*le'w 2)]e穂y$tyX1xc]g0Lo{lY rWr9l8'ۅ6 , ;g 9Bb`O5#NfɏQ"!5*mS,kflzp_:~:ypaQm& Ϗ:whzt iO0^;YO>̔+钍pf^oĭL 那 R)^;h~v֏eejd*(Y: kh[A ǮZ.[c@^y"Lu-ݫd^6,@ `%(`>J&5מɜq&6Wj~-aat\!hp/ؠt &9ۄO ֿ&UMێ.J.r]l$>(-5GǪG,>[URMj4X*6ͷ&Ekwe@̪ծI[Yae~`f<4:=AE: mf!8 "=q.Dϲ{[o:a^ytېy fˁE*ǤWUmV_my`8К4a'io7k9FPwDhDb%jڸVOMx`פnc:|QS=x%[$X@O7`Z–2;NwF[f{s=G%[/>cHV;~n"[7{}.IaCYsQXOG`rZܓRo7kS)HS%KB^ 1q[W >t~Gf)/W='!aqTXJ{OB… Rnʼ4-k76tp Y6LdVhJ:\r8箷Cz1c%qUU*.Ñ .=mS4"P<laqE+iZ@ܸt?,R9ȪJ *,"3$4娝BhhXSvxA4s-?.h}fKcW|pCNV&8m#cv,m;mC!cJn ~"blݏ,ZQk`;CvnyKUkMYy{2)iG3[ݯ<+lfeRZ6ȥץcJ2o w2۵<_ֽdR ɨMëӧnr*FH4=D%< NPH7c` .8Yf |(W^ }5Q ;ոa1oR!QϊBĦT.b_M.c4~DRzʱ4t_\="F E(MË)u={u~Gђ t-'bO}|hCnGv}ϘsApJ&2*}IK挶1 }^o%wh_?f<`%p܅  #1YZd΁r]*{a d9vI,$5@-:]+!:F8$=~B~Uc$Ț)AHv,Z9mNa2^CafH,( ٻ;yA>G_>\f\#)o K#6dI؈Ŧ{q,CXD4޷͚7(]J"yؐG]-KZI^:8}I oVsx`c{<~?nOG[rx_Z6e>g]ٸ {_ a!,soRz冯6ï,o&&kf)+rȱk͒ڬCop\NtUJIozOvǛ=(2?\=kinzO9S&)*eD;1|IFhK\kdٍ-b0*nP-24!f=|mo-)>bJr#d^R>0E{#zo)cv60b'  5%*6?}@GcrzĢ -5n}6x"Lnz7<+Jc1Xг8xi~iN!VwEiHV V %1`9mj$8qC`>]_؈Q-u, _uYKxU$gAC>ˆA~rp@RE`Z;:#sEl6Q ,Yߨ{VwG3^k9t='XH]m?RQp!sCM@TísՎ`VQ?vrŌj:[ySФU+#V]d[GquAiйt=X23S"7QgG=D %!/?bZTFӾIG7UP.2^. 0}拉eꙝG|Mh#b6[ ͯǿ(*r*1؆h{[T{Csv϶k>ݣ;ԥ6(O$C*Лdf|tLSmZ`]x_g~03)0?>a{gl l6i@bU1ԏnk\ZvBe_ײA/ Y>bb6҈0[V!!趋o`0M) ,3%Kzt}AKQ3Tb޷zǍa#E%9Z =Ղ8N.yJ޸Zֆa_&w}45|j1Q`.nšDXk0fӜiF|U? XM*vAL̤7d-䈘"CϞٕ:eHQKyMF1"tx'0PLjkQ~JK&&p v;, gw&Y_~G}7?ۣFplKm_؉Tu5&ݓ Cs"D2 =x½Iľ/?y^a5T3v.$݆pA ^ s7GǥzAEsk赥R6(:>R%7~HJ&Y~*1lb4ݩ`W9$ؼ"m(pхR)ZL˝C ZξeMq\ۉIM8څ >%Ȍ$Ÿ[ >P%fc۩h}O.! KN(䯞Q1EL@)ƍKfts;L;_w^'s).ec$Q?Huh6,3+U2 '҈bC$8cnΡd ?Y􈖗[fR9"g!:Ԙ;s_%# 3UxR?r;֋Blhy?T-UZS}zfƁCE^r2? ]qvpig N3 6do:CB-17hp^Ni(8<׌s$gɩDvH)+> W.sivmi8nQ2O1ns͏%AדD51(VkqrZe/roÑjDM*>x (Ӆ~'o84ҕ=}F(lmO{}o.( 4 jVߐ DRVۘJbfQ}yi-8%˹@Mnps5-iL4_ Id6 ߶ӑBQDZp?I,[,xNuՃ}Fx6'gJ endstream endobj 52 0 obj << /Length1 2201 /Length2 23130 /Length3 0 /Length 24499 /Filter /FlateDecode >> stream xڴxeT\۲5ݡ iwww% ,|w9`@3gUUV1TI^ dٻ330A f&z R hb3v8],.LLI=h0]<j㿀م Ҽ<,,]JO?" cS PVj=hilkԀZuUqU*  ". &&j|Ho nO837՟]oiN -]\x,\]@N SrlN@[_q7{o%_y(9+S3O_FV.+.δ;4))쌭].._ D][2=[o_c~b^m wrvq׉@-z?/N^XAZB\U^}Aݱgppybr`aa0(]3Ynys+{3?7su`TrtJ;7gt0%tM_oke|v6v\\4'gYeti{s_g4 do 03*\=\ v@nYzyhhV9YhdbjWEK-EMczl.=3' |}oF5I5iYE32̬ۛ-,c''cOx9`agx3A02؃\C.sQ/`qq{=MFm Ͱagfb02g]m`4d0Z';;t㝳|]8޵y8 2;lwwyu0~h@sYau?xNV[^+}A?{u~߇rΦ '?ދv|o]?{^Z?K}/jZ"odL (ރyxӳ3Ykde3Qj_{Y h 2 No +/.f8ВI5A+u (XMUK /֢ ٚm꧙О l.2/%lmmSQX742<(yfL'[teTNNpG>901hnT|5Q-6Vj\K",R,p(+[i#*CHQrՔFUF"_:`'Mz֤vzOmXUS ٲFt`}+ R-K89ˬU4<|r)f$[e^!7^R'yqS`}) i;>㓥\kRrTn{Zy&JM5Zs%-ᝀ֋O+Nc9`"8-eD R׎>&.⾝Y$r1\7?qg\XMKwhM) xkL{q@`ΝV/f (XִG+l7"sʦWwyB/6%^ن &1G ck~j!Qq0l$L ~,w|̺JZ(sۣVۡX5o'nQݳ3 Ug@MBnӄ0Zs%->F1 *8aF1߾r N6PX-RI}NG|Bԯs⿢ԚV8@N r7Hk^&qP 3I}Du7x Xg"I?k֫Fdz@ܮ b4Ƚs)TĥZw'MQ TJhfL^22-6Q^"9䜊hiD@e8jlKmeb ᑂYa(O˻7,UN/e1VPtoF|١'t cg"ʐy.rIZCv֬Q>Bu &~OKY 6%yy+)iJJ5-[Z^ k[`Lej_LJ",4YBj{٬a6Zn.Ϣ.Toмj%-~Qwtf盪pL~xDk}%B9Z-Wk7̩=ʢ5G]@,mܘD:yԍ 9Q [fCOT6ģcJԺt^8L\Ji*Ɔx\xy_Ĝt|5GM/Fρ)T9Ƿz]ym&_/6A˛LjѥA hpx߅͑ҨEyC.$Zڭk]AbuVyޙNݻNq1񸺮V&YwX X(FJI ("䃋! ̐kX !F5y J3[Vb(:+׭nS,C?zHF1Ykۜn&3wEHȒoRN Fv≠q1wdf WQ@#](/ѲjQbKr瑐GiuċqH[Og_tOq3g"r`p˝>W*KpDBN EgA$d0ƟR?SlLG8 %.k/[}RFi~ř3+4Ű*g%Hް`至 z/zv(}o.>ǹ8)dtٻv"Ԡ_afC8yjħ=n7)9#ȀJjndHݎQ=:lc`ACOTO1dJOgR̵l <0$S_a2YW>HK+'dy0AUHN.)ljg ɺO8_ܯʻȵY̞t_UJpj~܂Jrgt4oc"nP,p4FyZ g@N'ZأFUm#p…eub+uHbNmr$H mdNP%Sy"h=JgK:prLܘj_m !ᖼ= s2|xd~7gvTdjåȠO_Z`%:<""f56dkYpl, rH{آ3=5IzMN1N#́R@ Ga83gEe 4`+y>xb?d=-0ÒfPp5_}cpgуPGktGre7vzNecɇmNrw6*)މ0 Y`Wݬo336cC t8cIJl8c-]௄)NM:=ҭJX\ʱO5X ,Gu&VO̼$E==`쓂)vr'kZҌn8g6. rN 9a*[pla&Δ %shk7w$ 86Uhor=U.!c^J#Z68xTo*5^;&rB7{cizP.Q[9oT˜H eÔ̈n?bzƬ{\'Sx-qTጬ,c]9g5N"ɓ)/C7ݽ6ޯ7ch080*:y2+QB!kYoe$|ŕWޗEB7/@( mپj&@ ^{#B!>cK˄zu"95GB!\N+% 7sZ[&DuL*kMB&V.1A{Lދn=$+z_ hDq /8Xr/ѵH%L/sJ.˺Yz,S‹,6`vluyEPc:0 YD=*7|ml2cY,4;BE\l8BM&ewB遱Woylb/M4_m!YZcf`3|4@Yqm,az½f4Iv7[T}4F&vv`{bt(}_DGrH$iT!uS\NNej֯g7kVQKQZHNBGpCFBܢ~5~VM=] ߛaO{CP9jy$ƖޔL8ta}%<[$8$Ch|xW#j_)i|ÇuzqG V~sP;ی_+Nce.9C 7vY(W!"D+]?XYGsZ ÝL.tOOѺ ,}2"o8̓&e͡G~Rܬ\is[ &Җ^y$T|@5_ o2/ź1~-ث cpNLyV.DB> r4X+E]XX>kdAr Τrt\;V)[, hg40 rQA|#å|9M-F0Gɡ^UOGrNǏl5&XMpDuT"B>Uk?7gs,AΦ|? ]a8o 2 J[iPzJO itxA6K,K%?/!S_*O.Z]<}2aRup&YdBfݣ .2v5%l/6 N't5n }uF@׶JOQƤW#QmO[_\2s(.~Ϥb;3#zokYK~ɱfsK[ xId۱Ԃ2 x){sYYII'A[_?&ɭ;rc'.$-ܔrSYzVk)|@RtOW J#Rw1H$UmW q,lϼ,'Z&}S\^g*g]֏_>.M `h-BgR4ӻ)0cӢnӝD  X~3d Qs';>!}cG/;MO4_0֝*ں<#2"CyC+& i~@^ݛ +YDWZbžWt^u_[+Ba '\^`Ӆsr͗7>I  vqz,#Us9>6tc[gji uܼWQO&|U|/$A;g /3MeFu4xX\Z5Rxݝږ׃Z\ 6lez³hK@u'w[[ AW̰'WCʊ"Vm{vBӔxE<"d!8)epyy\!mUt6ѷ=҃jֵ2{]0)}n`l)UקåeY)A㔰j؏ߣ @Tv`Kf95$mVE#gu8W*7>KsfM1bCr8G"^|1,o$-%sGnU3k2ezhHgE5Ӧ/,p~ D^+YX郋߬lhDjVqH=dMz}oj?*%ԓVs* x9D췛lIΫC;'8H}e"?, ]l.H(8Ux8P iQ@S)L?b<ԨBvq Ђ8T#~I\,&Κf;r.oC|?ٳD^/s{0s`:8 O.`qx׎{h#Dr;IXUS]Z߅݌T#e&I|o@#dx %NX{l:&EVKXh^YXA[@4﹉">Ps\Ŭg^:Ȱ`3LQx!MXShKPȟ믍*mCV͗ٸ <_{+CwI Q*U5hD,ZZewS f_,{lAѿ~Y=VK~75z6@inhB%h2w8k0"}&w(/>jxGyD{`Ei'{7%A=q q~)Qn2fPϰ:q4[vTrH{r4-^溨23 eBtE//iSіO[VT(PFc{-S|P;tp!\n`FJAٚlLѳZA2J|oګw+O_<|fpq? 3@skTʍ e$AxKo $ Үꃘf WƷ0UȔPv#R$iw;.W!cR!%~c?St4[5q~SL (%Yj3^Ѐky>H V:GBi)eFu%7-qUu9l6fgiX5m&,[prKW댞G 4A ڎ؝YF؀vi.VFkisA,IZޕ#itj$'H Wڶb  y0KEVO&cM0qe$sG۩%"=kRDZHjv!I8x"uLll+u8pKf3K=ް,C;rGj6Z9b 7  EL"z$"9UDV@#iV |) 9^jfe-|ck`Q|K1ףA9(-zz59K5]кj]WT 0q̄Cj?^eOP-BΤE,>tqoVyr˥DzD()D_`-i-5S+d4MgPA]jN<&%ة J}$,`P`3;sh S''.K_8, cs H}6_>SkvOr#Â0c25".^G(VP.jϖ:'&v h>7GׅƲjMms dETxF ퟂﭡTs5W _|k{scw-9VQN彰}2eŶX7QK,[ ӕ¬BiFmۉD92YQC/&MM'ϟb'\ͺbD]"6}H%6 ~(8xD/ehtֈG?N̲ kh%"/>:):7I,އ8y3J5 i"Ih*㪥P>;}BRDQcKyFADoB<)qG9cgS驩UcŠ&=癖r@HKr]Y\<7' h¯P+rzՔn:Ocp_g*պ^5SȤf)0~q.+E墯a!qtÍ؈>bEM, R;ئ[;zIq4|w bpYelaNCh ܅͍9wYx[7|)j8S@*kaβ8[HY]uMꔊ49W}{ 8{בag"9?}h=~;DXSE [}݁9dM% ݫHрcIw?% *zN}wJkm=,lUK]iv~#>m}cm-1nc Vn~RɇMzaޡS9;+M9ܛ뎻j!켹r& -rBg@l7 Hd浅R+;mXYBL fvC.mk8|G0yTmWRRkͫU՝F"{!.$(vDC# Q4UrǧBs*oq KK?Nfá#ĎIh¢vM@ 4 [_g)X^ =g"KgOcF؇nn]Ō1+#QE& 2b}fK2< 5կ3n,Jd&ðrT#'^r)&U*Ӧ׋eR>X|| Nu>5p DlX7j<{xL3a_-s5$@|eo~ g`ȂOxpm1{|<51JӕHqϊK=ONI#JS< =y#[!s;סI *ѓ"C9ԎRip{~gm? %=9,86|r0j1.)*e({Dą/ v=?ͥ`(|`lhC@cwiX ɤ7 S` doxjU5nKUl!t 6o{FT`ΎTn9 4 &d:g)v|&fNv9ޭ=х8ɉuwD\\_q7U:#0CqFպpwluo-El}o;!K$0*g:k:7EY'/yb_W1~ߠw`d䠪 ц gBU;0TFlЧ!6\oxIDqĠ" *)}CgPB]{|E8^,RePkdCg/|Cf; Q?ΙLZJQ_ 'h?ioƕQБglW(J&Xa&gJ' RVoeaBOג 9QՊ;k,#V gѽB4{`Wm%vbIN@mV{u+l75iUګR։@i Di}FWhS=,)i 0<2ttCu{!@!( T/F{G3sB0`utĒ{-Hg6V,NW%Ot$NuyZfGܣ}NƞcRQPXv~, hұk,>Z f0q )? \45Wo'o`70}@v9oizN ] f%~ꓱ$s(OfnxKaѬ- S&= `sr V-vt߇(!Ⱥ :dw2z$!L\Ӷb;I]K.^^!*DJҗUEV3zSq|Gi '堨XUZ)lH1}`\c++fJ:H!wu58F% 66q+To{vBF;@z2]ԚQc5]*38읹E|}})ˑʃrJ[9zΞN&x\}U6`76)cOEE\?+)1@7韂-w@pʹ;26TmJC!rf#-SÓ: Ͱ-\ec"_ OV#wzjzBP(3'5'N_ݑșTjH0V|Koؐ5:B.jkx~+P@^ qͬNwtZWH6t$ŽHYB8BV;Mc9/H2xyPM=K&FU12y$E:F /&~ngMpKPIAң*7{1U-ABYƛ;&-Bk3{!k쭙4{8apO3AgAɄl,sݧTo@mP&j C̩'s($M`[wDhrˏ}o?ή %@]|?}KÊHi'v7d:+-Boq4/DQwaT&db}S#T vq|:zWb {N#V?4ׂdLmTѱ Z0{J9:)wecq ؘjPD9> FH6Ĉ>1"74] *OܗX'SgK[qp#{̓2@ /9Bf \"dY))0Gk/Xꗀ=08z"DG9z<)Fjg\]'ۍ<r¬㬵f\W] u2b4@۵TGP=&t%㭙=(L6EMكIbߛo8W1-xܓ(7BPxDƗynozl}\`^JR l$za ˩9 (l=|8P[xU 3m)QFt 0nhM{n`sU"9f\Xý4kGѢ6߮rفȇ|al;G3Gi+̜ Be_Ѩ8<9BI=&c8k0G>O:v;XHCPL~$ZɠezO:WG7dߓY'{~)!Hgj=N]Vp#.VG]:ݸ. ?KyƷɫgǗˤ״W L,ĸV.p6STwd&Q9#AO`ODX܎S"/d˒ZdÓY|k^~ _zȈ "we6-:qlh9y$1cěxm[f@ΐ`$M"4}̶yw t_a\Ѡ sp=]H\evUmwxqhE,s tս1_ϒg"Ɣ^"?3yz1 G~[\{7w$CR}Y%,"y$j\E0H{ZF%E ͖4vw\„c NF](zyEa}DN+䷎U| scocP+T^G ܋:kO9i,E80 qy_ǭ2yik_Ro2{xٕԗ:l-8Ci_dyȦ}YSKf6/yh0A]Z)^bd([\QZ(ʃ,:wđ!LzhάΖ"×"uh i+& ϶k{xi@u~@mKcbdltpvZ:[bIU~ ǥwب ,UI0N JEyŎ:?c5!=y/ *-[b#$VPi>sCŶ *n~ff mI0?U[iӘ欕ek[jÝ}XrU&%*JTdXv=͇Le&?vL6(i0*3l`nqYP*Y 5̛!X'Og,?F;)ixehbPn|nn8$P6XճXP?PX|o'eE)_$2~}fI;x=xe$Hs QFLܪ41;.<c=+wmuѦǏσ4FIFasmMD hRH<%FJfN-X58en$dq̤/Rapt/!>ψ!]G3sP7 x^#o|9lrB$BRHYGsʋ8vば 冋N+&Rgn]eL,IDX˷N4OHuCƌs vX$ޡp#͗ C T ġJ:i Gl6/t{[p󢐙QIH}]eNg$3:5Uzӓ/9'qssL^,&^^ljuQ!&=hKb.Z5`TFsȂFBh'^].xU i-*}"IۓeGJ20oCSd\zyVCA,za*I 7Oܖ'PmvO4(y8V+"V_w;4,>ǒܡQA&'3 0д}\`A Hx#(0EXA3^('a1q{c#aFS@_m6ϟ}Jm:{._O- 6_jt>r4Oxt}D}џ[^FvTqG;8/ .f.+Ў+0r!䔇SFA`W`c20랳Azl3eغ6Z1G(- ˬIP[/2 7'rA-_sqӧGIyUwkM &z+$(Ss֤O? (g5ŸH$z9?k'AaP{ْSVZ& $QAkyq|SLPW ,YB`j1D}`F`rqTgVhζ?dTd4sa";|8f_K7fA@t n-#K\~=}8 Z>F);}Y^t5P* )t@D^ 'M89!L[RzTz{vziMSrG6+"-ݞ =[d$Sh)h:tdu:5N>Ob' MHg/"^ W-5rHMnBZC\m'|FU", ,v|bٽ :[65 [$iJ˯OJ'6ˮzQ0#gD}~s瀐yڏ1W,a)X!h>a<="#r|qPԋ;P8y oԄiPT'A1Qݹoh > .(a$bq9+ 0S lk/ڊ(he&G'd!\LrbY`/8$l^_PJ@?ғCmU~oP,.9  z,2Bd{w)x}qǍJ[DX܅X߯-Rp c͜j{٦`oDTDT+6nooU|'77b ouf.S4 @T.=Cֵy6lgsL\whL"o_%@*K׏8+|7nqwqJ0w>VH01ŻWel0ˤ[D @sמWl~"kH9 ٧4GȌ,-L>),Az.Ө$?=Vv0Lb,3!GN}=Y,yU(z3{^Yx.^Nh2eCFa#g!5._*Gh߮zzՍxU:*$'*fwul FTyt@|~Fѕ'bJtKaej@2UKtPeMgoVySkj6Lk:z]64CT&P?hJQBRm[PV$Ǒ~f)cS!*gؼfw ["ɤIb[bzy7b\gr!\?{ic3LSa]*d*zq!"1EPgaRZCC癇8""k}~XZJ3;i!QsȞ qFwUlu_Ⱥ,rG{veh3tT#ȰÅ\_*)BYM O+Q\BtgZ{}MU r{p t&W'hieȯ[90/y _fUfJַ5eWyt1,.;%Zey^eroPT*}׈AM mc'~s_4 `.ϢhqNGQsY1Cr+b J힭9w]уoo^Rǟ鋬h|ώq_HOq` u a* '8@:F5Ӭ3Qζ:##T+K6-; m˾U);Xx3*S77cݎ!hRhFևƭJМ@$}f؉]+|.!5H܃L?%ZN:ٞ@CtD`sǸ` Pa k_U(UKڿ dő,Kڜݘ" ZBeZNFç#eZ Ot)Z`)wpt 1gx,=`_ښ1g[yoGp_D>-k #TUjDK -/)lE\qG\YVjuftZ},;P|`.cOQA-ĕ>9͇r8Q(mEJs f`9أuS.;,[!o583CU&+'[̒ _ mp ĻU/a_دt|QFrW&0YV`g0EW8.ZHύB{{&':!ud^A1xȼjxg 2]ë f"x l7-8-R.ѓb>4 Ue@V~_]7dX`NuaJihF͞;0 H!-J"eks);z0(H97.͛*eN?Vu*Rd&ruz.\ɏQx90gUbI$;#e2Z:O)V7Mr+`{)_$Nc@+Vq-%ֹh…~Zh!9_OE UV2ExemOzV7n vozyeMpzxOȔrԼn2e7`R Io?YQW,w(&7.$ygI@BT:ԓM&^-m6bgx#R21CO+T?`H摥NсV NUYECd#[Iui{چ~&WV%ki'^{kf֢s 4i'{x A*`m3s|#Ǔ8ͤZ/!V2–@˛Ҳd#kX;K!k-_"t)vJf֮d.;ՏYU ՇʚuXQdw!7dr+{O;[Ϝ/J-Џkly6d)  ҩ`P0c-E+Ȣ=)^ be+GA>H A%! @S]ja7t8~CBPmDߠ*꺳u(TSȑ)7N/U D7*{oԯ{m^2*]$]KJ9\VvX 95q aqK'd; S߳ƛwRtXJ}p[PqEΎnifș~P@"Gp5t`A QPLc&0!S SZ]"O@u3w6MH l*j.̜QU|bG.-Lf&3l8۞J1o}X5Eymr!$? ߂0jϧXH3z/#,x 7;:߅@ka$ջ]aN^cESk&i >$dH* <•aO_=`>JhN,zѼTym;c2kxS0O=CMf`>;ozAt=xT8zmX4W^J\ˉ]{CC [RL} ѣ㥿QQ3K1"| Г$xRrt2#SMU=RM/6'oZSZy qI#N,h@6X5X.;f'맆ޣ66Oւ=E)@"մS⩕R~E+M,I,Hdk'UW`zj՚Ç[qsׯ/r~B(ۈ;1oxΔ-qN #=D~R|5M FTL&;j2'w)]OSGo.VV'IK_6ntX`m߅\\Ֆ39+˼˪MQʁOw$^Ø]iIg/Z1/Fa2 &oe<Ŵ5?0P`O*^mdQ8G`dP[ `b? Y&?L}2E$b [ 8uXW1SZ2'd)fN ]'OPuVE{ R` ПO1*ߦbdIjVBx ՚$!Ӫ%ߊ7X~^bu*%lb36@/jGNjsƢ8>g/p v#($EgOF+O{G6|?S;m'ڼWV纎T$Ш!I h#0ʐ׎)fA0YaTmooFxX۞:q`PfX/4XIP{iIۛ`M^J8@rlUbpxxtjmp:x#Zٮ^:nJM7[-Bѷ z^mlӾkUlᄴzMoA&O y8PR >z;SqLECγr"c*N& 7[z'+jv)͠ ytO 5C z$dlӵ'Gֺbץَ+"#F_6vU#spWPVVӈkk'?Zuv Qyu6DVGHf3(c_N:h׵ibDT, 7CW??6`N"C,O)hicCfNiI $S>P"+-P| 2.I>Ee7n)N/#da?:kop#C9P*17UWAcpЀ(,3;%ꆇ);X%4b>4O8Q;?w"~^@DB\-`d#M7ޣwbQ+J b &=e)L,P+!_ 5vV&ju壚=fZl3c"z.)6LSUrux|^,`W8zUaK1q32@Xʔi>NXC^oT| _[́X֫ VԪR":l qx RDp rhڏrv gpovPT74p>Srҍi~R*cx[ 0ӤT`rywk)øԈdՎburVp'rP!R ֤e@kROZ&|&y;y& ދV@qX7GNR_AU7L !f"/:!O\򂼽7r|r\K 0~F3M*+R(Dz0#i$VԙV޾mlp9+ٷcGc; dpoy2]VmъOld BZH&d ʾfqrS+|T6Ao ?]HK,g q}*$*|4q}9U &ݠlׇ!kjVL!4+';vsF^@TI`|^ O8QNǾ ÈFO~ oP'x0ϓp0<++)L+b bdfG ;KmxN0r 1̼r`Lr83DMO> )`dmMِZ sOћG{ Pxi_ag+U6ǝnheM$R2u23]tq/|dXqE/Vt4'C[/ mXyqwyJ*/TY:Q)U•Eg& endstream endobj 54 0 obj << /Length1 2046 /Length2 14960 /Length3 0 /Length 16232 /Filter /FlateDecode >> stream xڵcxd'tSmvlb۶mcc7w>˱9U?P^VPڑ -#ccm@+h`if`c``%%8X 8쎦9CǏL{',)@ h pdn@F_@Çhmbf Hu731uSO?قtIC  3@N ka4PXM ,6e:@EIDQ ("DIQX))dE@UWeO?2""p;i?>C# SGG[.zz:'G:{:[˿)9\l-@K_q6) mfvIi1ʏ㿉} OM˿@15p+WZ^^`e`f66t4ptrex&9!/Ǖi[zxX;9c6}ن6fW,;Y33l2"Jʴ³5_ KH`k?6e66623w#'[zk3;'`c3:@;ДO1/[[` 8;3Q3W_Cw'kK oʟe!ݏgc߇* -6ο\YC@/,).&@+J07pe++CF@׿qH:9zma(^o Wb+8?'߈@o~0``Aߐٚa3eA bdd폸Mс?aE?92}qo]9 }gm,jfFߗ1p7sbشǿ>W7qed2\3˟dTÿO΋A 9:@+viƐ;<)[`O]2b)}K8woY8wu:i zKb䍑7gU: EN"#ɜ|ָ/c!(wd"(C PaLSdzKGh&ޙ`%lZNvZ8Hv}әC˗6?|"ox@$#PDxw9T261Exc貆$o$Cl3  \؊NNYBIrTǙ0BaAre3/6w67^"y~HtuvZћrJ=%Nʹy/G7DyhѴ`,w2[I\O[E޾4IDJWfk^ӄ$%O75$2aɠU{haSd&<$EwҤ R{` T:CD3L/׳16>*kʲ+ʓ/I/nKJB?VʩCI:yXf/ƯׄJ7ڇ.;˝}ͬ%IϯK4Lvh:@m2bP}mNIʜ"T 5LbNPAgwWxNXz{.-cXb=.AH|elhc`Ze.ۯ('+ep;arRE~ϼJ3?+ Q<j/;.$lG)5Rc)T45d aњ5v/XlKSyPq\n/8/Fkd."flE]x".J#1g<Fל1*scb,Y J5ܣLd3wkBHĦ$d\ŏ4CxަTE%9} #~RTnpy EdX\|~ 藈na'B,|r=ho: [i'V)Q1_Dnkl/SI%0 9GuVD6Id}/*vfT9xaISe?(~Tڝ(/'Lט>Sc|۪J8O҉J ZԳ!Ӌ =n\8:]#[  < Uu^lo*4 "bjD TjԶgÓ 2&‘Mf]:9L)NأS]%6{f UZhi?k):'2]nLZ۔}h+RRߥfD#&n1iatgo?_;hM'91k*|H^$|3*}I-+0Meo$F;GJ✶Uߊa0^Z8Ī5G<TyX(&do{"F" M7dOJx o߈X9}C!e48XbL$kb2/9c<n;3±CCeHV<_kBXFp {AŜJ ]1ErёKz.NoĖXſtMl.2Pm7K^`x|Nxpѹ Up"QxcP'oN߬p RKGZĝF%D4LHG+ o(50wUWW!˜*~ ,]${BCLjIy(]3nR&X柰|N+> UsQNe~])J`HF+nY~U>Ųc r @B6c[l 'YqD<:(5L?WeȕwM¹bhJtFkMړ+hgbC=e],^0@?3%eTH+8|$T̎ҍ\X>Ng"z5D  >kA7nM0Kػ6gF%ژ^2i1yӴJbp_O4O 39jÔD !jNa|DCh3PQ+qzEp n A5gfϺIt bה@nL _Nh0vMm߄²;-*THzs1!shj=!TjUZBgt-${l3]kp-u=70v\ Xku(QÓ [ja,GljX:hIsBziLgpӻQ. $fNFdK*U{Շ4d:e5\zGS!8o[m]Xk(Wu6I[[U?I:v@h3xS B(Ó~|k 8J1;v?jm3o΃c?;*eFd ѮK)BN_s|AV:ߌGwy:us:34 qmY.saSǝ :9{aVwƖKڟI`ғG~l`ս#FSPsrV;I"5L,pp:ȴJf(cI*&ԐDo#S*GH *Fxrr O֘r|HEJx%-.mr_TpAZTdEn3Kpn(7N|Fwܼ$qwKtM\m560I &6QDH^ '=Kw%z+3CWT^ tdI_L(QvŮ+c!ݐ=lאqNjM[#YpVw aI5gCr͏|c=1A=r rn"]ҍ^a].X#.,P<][%| #/SZG8y͵@B˔cĮ+[sre}q+v}#d魘Zɢa*6>:\P? v(i{!ǪחH0tW[e3[Go VoG1TWtՒ*/2iҬE~5-AT)#ĒM;H fPfg(‚cȁ-aL?;:sKn\\Bc>*>*uk҆Zo*h@{+bkt%ISaah=>bGSU8}5uȳ~nz=3{W@˗@$ƾ(6[ 0L t4lg8`F||פN󮓩#oWoʽ ]Grs&khrg4jN&d.'Cs 24U$Hol{rq^g_%>[^<(HO='Z㪎K ܽٱ/ b Ay+eWhJ f@,{MC,]HNQ} 0)ˤ`h\ނ^?kiaAK0 > :-֦E;sBЄ4r:v*Qp̘Z&b}x'=|7BQ ?\@Ӗ:5q:;Ǣ{YrMQ<[@寍;ڭ@<.γT1&ziŽ d\299|n f2a~^<Nion%q}ٛ?{?1,  ~MDYln,>v;WzY"TkOH_5O/&䟕%ӋFUL2 ]2CFsXD~އ^Ю7"<}7Vk`~uTN0Ђ 3l l, @*NfqŖĕsda 1y½=݃T>3 ݞneG ݧ{*^NP[8 \c-ؒ{tQdz%;0W$s?P(d`ɐVڶwr̖Jqo#.oDn&7}=:7D~7mŽ)ۤLq׊ $h0Rep`RyxdW ꃺ' 9t/һW |?ݍ:k7) tGh.>uBob T0m- n!d-N)+#!^Z詥&EXO6+I`8O=G5 ]EK}z+K NL3hEnQE1%9<;nhY"VPw&cCSyZ<^Ά,6t@ m_JT|Zg"o;tR;=>,^Sj-z)9?̤h_(2N3U~9ȑu hF ta&F"22eb.5eφͲ ŤZy!>kkTmn=w1$ggWv<bO>)}7J𼣄yOE.lUX#' +^_|MwC1gKek&tze Ij!J1ԝ'B9t˝cY_ۥM 2/2]נ3.:G M#ygFaVNǾHU:o%BջLpI9˿ȜʘZЬ%CIuV/g;qQ&'d7«,ʀٳLfGQ#e%oe#iTEGMmXplӴxJ*K )o2dTykpS]`PDy)j%{f "er^F-pțsfb߹=LXjh' ? ^7 :dr)0kwP& OܖLi(BfSdB_]JeVX؂p:- мۘgC9KhBzf2m;'P6Q>kdrjѹP)G JXٍ_v! ; &JvjU*fs~ZwdW,iPS4vO6_MEcSRZb7&Bԭ! eG  J$7i>|}zۃs-!^ SZcy,SVz'm} wJÙnqn5q2DNAl KHdALT>V|ܝB S 'j0QRMOx(fuίi*XtEXOsvΜ+h*`|uu)Z}×H|-+(~!WeXyØ$&#.v <:UfP+ss+u"Ծ+1g Ūj(^PNԐ\2TD A󢧆Yn j5)XgS&C#1l߈q@7/8ן[".OkHTFq3"U +T#舥FـU01go :o`!W 8펑9 RJM`BWNA=e'ײ9xUIf4ꌍJ|EۗP7I˚r-}pzjRP(^"rM=I~)ozme QXq)-ST)bs$IZݧ m"J eo>u{l2 t}LE>4 OsCء"x*0 &_1 |Og󚉒.&#bh_LC/Nghs8\z되 Sי0j1J8bR kE*= Od"πYzs;[x&1Sj('*L!n A`vw/$ Bd 7L"չST7WDt>U>XB|雫ch VP< /Ԡ#+"ᎣiBU7FwCkp^`*oB(s xk`ߌK y'- &~ߠ}Btux/ȫ" "FH ;.[?$+I#:ys~; SF]<~9k ^=,xo;[8EF(xEazGj(*|b-sm2{2{'OQѷє.t(ć}1+ջJK-K8O)w!z0C<1%|ɀRY\O! !ŝĆw]:[J:E@ SvlL*ٰ-.6ޥܒJ OEA@@ݠ5]]dJZ#p}g)* YiZ L\&Ih O ynr@JX):fMqEfD L*C^p}E&UK5pQd5Ff[ܿf[ZAe.0ԸJ (1, lL.@/v]Iۯ]eSX5Vx/I)xW_X[KҹmS'A*I|2EXě1\|5<^EF)h@5R q,VN,ٝ6,eHn:&1X>RR*Ӕ)@GR!ɈdL!<-BXa0Fu\bmӄQ4{qxbhޥL9Pyy&Ri.i=k#I$F {+v`ĕhtfgNt[)~ܦLL.bxwqؾSw}|T;[L][1\D 1Csn{\:ZS!Bi߫g#@J<n}F˷UˍRN&fjA%ܴ um'A ~LNx٦њǰ~cgp\`s+{>/si{?qp}n#Cx97Zxup~m0D!/ӤU~;/= HJmg!sjZvxTZR2a'''BxXE%Dks^:̃^3\ e9ѭBI![R),=QwPPca{.noo! WQ/(آsǖVJMM=U5oّ.CY  ~A3S 㴕*N˻6C,ˆȯ\Z D8 aS'0qmدpca{ ǬbQv>BbVb $MsKɧeW8w+J6~Y\p? -ںM[RP/y!\zFXHg!Ăk' R%lƊpjGll{3=_`&r U2X$G"m!_1 5]SN.A}ϰ2]Bw9Ft"HZ1e. q W*b~ݶweӡn}VBs[%鵻 &c9>/ obғPʝ^(F#@4N-LR(2:dhBt3nyNT%7ʹKNLgdxӘ1}}'N y?9!2KBd{u P?nZpd랳uYuVķ)7n9P\H?.像Uw5?ܞ&̂+:~#<85J]3>Fo՜"Z;廥$ ~R;j>iHXLAE{~V5^_g,U l?xщ1kjN@BtFqFݬnC)V'TjW#[?v<ڪS h!+r6e0H>ݙ vǨV9)o=L3nDB߲ i}] yXE~(G˩"Iw,< 6_"ttC~~v&+kw6.@½{J`xl~P5 1la\H `v!bqpQ5no;EsDWdJu>ti~eUU h]k3;^Iq4rRFruA^G40џM닷P0,Gb[ZJKOq3`1 >r=NX -ohyHoe֊dIdxcN' &_7|&={lnQ\?cK"}KLTߧvg8ɲ ; tB $ұ\sY&7 a?*!YҴ)k\/uw0}tx ՄpKYӵ_-v8. < gݣ?g$ݣT5f3z)?-Dt ?(rze4e.a 7U7FǒDlwJI9<s^9%2O*8,3_`ʃ: {"{j,e< fMPW7 ~U֑ -&lh.bp,+UzQ" ّxmMBOo4&KA! Xk⬉&q%:# _1?g][fuE_R5O|:;2n:)b?k4̺Hrnbj`WX{ i>kuj:ˌz$:H.:ĥ2 u9jȯoƵȥGE+8j*Dv NM:hp8P(:t|d8BىL.sJ L%&iŀN=f7"iG$R+&R9ݱt~r+t-=MQK;O85=b83ѼC4/=:l9.` أʕNR<]~vߑ5`X@& \цQȗn GImmgQz<v]"f=:FV/T* "1MrgALq3#b(U .c2K'ٸ<喫E\As$<3+[IϮE~A~"x†5T;cv=x/{Daf:m8^L o{t3^:*OY$Oy>+{uyNu dY>fKfn^t,IjXڀ.a㸦&-=ẅ́!6Ug(8,7#Óx {Rؗa^b'S0FF9oZFP'>e u ЦX1-qp`SN~ɖʠPG٠}э+ѹ< Zr&k{ܔ6cZ ',jB"&B[a- |uHSYWnySUe]U{gb4< endstream endobj 56 0 obj << /Length 844 /Filter /FlateDecode >> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qDŽ r Gէn8A{,쏘LEvDB``B9zK~;_q`>Wgy o.>ݫﭯAbZ%?6G_Nzy;9ڰoiܰ^]0zu\~3ݍܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1gT Hӆp1X:,p8}u 8alSM3?r>x\i"EܰpJMkl4\?ǚc:#?^YHwuprQF^odž1BЖEQ?1^׆ƨАԗ039+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrY׆}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *.MGZN(:p~7a?}]TyԟE}Ư%Vu'e% endstream endobj 57 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3FXҝA5(O)suߖcHQIܮQW Lڮ9ˊ6nK5NoغWi~r<d(Vu;_=85vѩֆu5CNmm悥+U=#)\][|, MHS"#p #>y| #:##0)%T\`YQqJƚ`ci|1Mَbo4m `2WQ/cW888sέ-./qJ;&\ k(d?F#h0\?Ipa]~9Vk?q1Bx.BzҬÀhƘ'g 2xk=6u2,bق6E0F,eL燆LY` YecODV3Μ蛳;zr֟P.O0{S3ux9(uF: }6,V|ƌV|gegV|F_+>O+>G|V|~+>C1 V|B|FB|/g)g1{!>_|&~'a9i0K!cB{XTK5;)NŽbPq> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z endstream endobj 59 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z6 endstream endobj 60 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$ݪ70W?g^,ɝظYs{ \wu{S<.7զ7u{R޺>f? Kw{KTQ/7SVk-&9sQ擾]׷HRP]s6o Ogw!X.o; cƮS_wСtZ|I1?H/GBZV ; ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:qw#/M endstream endobj 61 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R!ݪ70W?g_,ɝиYs{ ]7;׺v=ߩǡoݨM'opiT}IAu~\3;he?<{Q%(SVk-#&9sQ擾ݾk^!00j(+m$?Gwt>X.oTuþ{S_tpСtZ|I1?H/'BZV;ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCa endstream endobj 62 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQի C}͌6jo73o{q3fѭVO4cpuU sk/wOwquy_t}??p]AAu~\33cA}P>>%t;en>r8`S0Aj~vUk&Yos yv rOiHM0[7v,ܜǽJnkz~lNͿvt*amкq۸qۿ`J-ztH]{O|, MHS"#p #>y| #:##0)%T\`YQqJƚ`c2U{;5Ҵ!\,18"\aD E_sN[sS9)9^W$js7 GZ ׏p$uX}/S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7q/c?z~#袳rdbP)n endstream endobj 69 0 obj << /Producer (pdfTeX-1.40.24) /Author(\376\377\000E\000d\000e\000l\000\040\000A\000r\000o\000n)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000H\000o\000w\000\040\000t\000o\000\040\000r\000e\000a\000d\000\040\000a\000n\000d\000\040\000w\000r\000i\000t\000e\000\040\000f\000i\000l\000e\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Keywords() /CreationDate (D:20230929154914+02'00') /ModDate (D:20230929154914+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/CVE-2023-32700 patched) kpathsea version 6.3.4) >> endobj 2 0 obj << /Type /ObjStm /N 52 /First 397 /Length 2812 /Filter /FlateDecode >> stream xZ[s6~ׯc;&;錓ԉEblNeҥɯDʖT%}9߹ )XSi&gU,3Ǭ^23!`  U1UΤz&orˤUk&AbE`(Ce"s4Fy)+ BrB)IU&?akL 3«v fShd6h Bì`- Ԑ`N9nsF`rK^ઙWǼVLquO2oP"gtZü4)Y+ p:7z3Ɵ7 ؅qN?K7O%oW?mꮬ9G7wҡu9O?E B(p9#I@vT \ hFJ@/r4)]Uտmձ"ձ%yc!bQQSm39+X3~^-և/Y/yRQR1bJEEEM:_.F;`wTK^]`9`'KkeBWh3ZE&_,ZtS ,-(|V2*{L+L jf5y˶>*dhrK{)(bdym /t)=y@XzE-$X(|o(bc_x{v!byZGYfw^SN!Fh < aSj cwXLOt 5:}땢AhZ/uS,)UH0CH 8j2H7*롄x!_pL!4@1I<$"nI@2Iu cH'@WBlb5 = I[ bHj6ʨwdB 25RւR((V_"!ԉ (50q$.wp@;(%xRKxT6p:#?=}@pH%sF}1C[$DE<Srta@}+ VXdA^CAtpE}&W"gJw3гr>iۮi ;}qtWOq-f6l|5g:R> 50>8rdh>giփEY]][En<&Gլd9]yDW1?AHq=n4?)/x9T8opj߬7ߟU_.k +OSYe[5S[ĐG4@Sw/]g;R\Eh-h~J̀N]r-K}lm}?{ɛn9y_yWC@)z|_| Τ5uj'>>ڿzgX"nPJXS~ Pحt"S]5|b=W1>`???y`nfg1*zBraWXbU]b%?<*4CBn<fͬd;]ӕl瓦-gflϏVnu"aÞ1T <=]ݼ$Ursk<'ʹ nC ׅtqjl42}2Y!~ ʙ1{R ajlӢ_AnG8 %:6 ,oo";O؃܃vzz{-/;O}5NO2<޸Y / vޑ؈F]5r6.lCoWCyC] ܰlseMT.*JT[T[vkuQ|~Q,kPTJT[bQ7CIӒ*SR/nM{A&InIn\?Rl )[8aN_4A,p{YMZ>{s͐qI"'iËpȪGI lxۖ/ G拑?8{zz =k&gݸp oBLg4^Czy@ф,tkm>& _U7U6}r]̏md0|%h5մf,3ρ><<ݬEOY~%>-tUqܖu|̖1_F endstream endobj 70 0 obj << /Type /XRef /Index [0 71] /Size 71 /W [1 3 1] /Root 68 0 R /Info 69 0 R /ID [ ] /Length 203 /Filter /FlateDecode >> stream x=NadA[AUT/acIacCBAbAAB̆pT% group_by(clone_id) %>% do(CHANGEO=makeChangeoClone(., text_fields=c("sample_id", "c_call"), num_fields="duplicate_count")) ## ----eval=FALSE--------------------------------------------------------------- # # Build lineages # phylip_exec <- "~/apps/phylip-3.69/dnapars" # graphs <- lapply(clones$CHANGEO, buildPhylipLineage, # phylip_exec=phylip_exec, rm_temp=TRUE) ## ----echo=FALSE, warning=FALSE, message=FALSE--------------------------------- # Load data instead of running phylip graphs <- ExampleTrees ## ----eval=TRUE---------------------------------------------------------------- # Note, clones with only a single sequence will not be processed. # A warning will be generated and NULL will be returned by buildPhylipLineage # These entries may be removed for clarity graphs[sapply(graphs, is.null)] <- NULL # The set of tree may then be subset by node count for further # analysis, if desired. graphs <- graphs[sapply(graphs, vcount) >= 5] ## ----eval=TRUE, show=FALSE---------------------------------------------------- # Modify graph and plot attributes V(graph)$color <- categorical_pal(8)[1] V(graph)$label <- V(graph)$name E(graph)$label <- E(graph)$weight ## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- # Convert to phylo phylo <- graphToPhylo(graph) # Plot using ape plot(phylo, show.node.label=TRUE) ## ----eval=FALSE--------------------------------------------------------------- # # Read in Newick tree as phylo object # phylo <- ape::read.tree("example.tree") # # # Write tree file in Newick format # ape::write.tree(phylo, file="example.tree") ## ----eval=TRUE---------------------------------------------------------------- # Convert to graph object graph <- phyloToGraph(phylo, germline="Germline") alakazam/inst/doc/GeneUsage-Vignette.pdf0000644000176200001440000056536714505552734017736 0ustar liggesusers%PDF-1.5 % 9 0 obj << /Length 1705 /Filter /FlateDecode >> stream xXKo6WZ ː"`<mKR\Ivhp(ivv4EqÙof>..G?{\HY$b_BLq$I$"xh֏KœlR(zs醦1M_?_<|x qD2e)SƳTѦ1 %0Qm"łERGr2Ҥ=TվxPTT̓YHnKz8 gka0(PR{YojKBTa̅YW GD"B7ݻw۞>SUs{~hR@&i)j[ˮ6hfڻ||4:?%< TPkt;{4˸#'iZ髜V~MgD4(pru֒ʎ G@uNG@0aO6'mHL;8ypn2g1l*w閄]ip'Ԟl 2> CM}v7TwCWr149* c l`0UjИ5d1'uZ`l"s\4AҘ]hb@qh2s5xU'M2mvzg"A }a ª' &pFO!dYzǤ;bl Ŋ=_dTnMUВZOۯKiO`ݢfUW[ZʝOQ34,sͤh&.) WےQ*#1a2r: NHAmC=mDz-]B(HzX7#HB|.E(M$ WosM$u/ۤMi}tbcAY"RB/p e2D]Ut7mو;Vyg'o*,V%,,VKTtkܗ>B5zoI[Զ=b1<'nL=#tY5aƝB{eٕsVĬfVw8$% 3g4.ZSeKbZP!ܶD^ժ3ԩw8 Xm@wge|кO_Fz sK;}DAT,A|G`D]7/W0+Uiw:J N:;0朖D0aڷY˄Ok5"EtZ>sЀ3]hl1qTzJbőtQ2CTHN[>OA贷L2'2Ųή)0eWp`xTwmŕ& n5]m=,،vʒd[! ?{D$ĕYk?8V8^I{e#J Eid ,'A?v jݱSj7!p(k#ȋbn*K[]fϿZԎPz=w@fY6u[@Q*O } eR@Ff0 a(0 endstream endobj 29 0 obj << /Length 1888 /Filter /FlateDecode >> stream xY[o6~ϯ02PZ%ER)bk=u[=!˴U\J^dE" f4:CMp\?ѠY{ϫg/߅#7B\O7P" ŐysNXVČ禗]|}MFڇH.B@$M5>C^ `'rښL:Wpde!C2㿌_`/r5\\vXCoرfffYv%p ʢ^VP)Gt2HAHo nawLk65˓f,ʕ+`dU3긮$oAㄦyc<.3PݬvEARF1 V br݊)_pZom4{fS!U 9e2^qu<~H42C? ~Q![PDAlbCкfG$n 6!w#-V.eaԋtWu& 찍 f &i/tx(tٻ_ )ZzuCbmXFJJDZu$Q/1:px?S#X~y m*Aq"x!L{ ެn8;δDGa ffͅ:<5u`E'eA0}nI>ţ. mm-bL}1 ቈ[@^WiRx9OSNO儗|*&Ag}В*=)xh`΢lż\KL ! lxkUZўC3Hs9̖Y!J 3ȡ"{R _cG @ca ~HT$M(<٨J4@ eՂXT`^JBp'3]/$fxv1͝& fMo"*t&C3λͼת*=I>R2Jn&z\RV(RXIiU3 >owge< E qQXm^[1XU(lx,2],ɸxxGQuuEOby癦2О*i+u%Cٻ;u%:|1cwY<>>2 ے/^y`;bvݍ"i^^j-ZGaˤȊr4.moJKȟT > stream xWr0}+4L"Nyh'i%x ߰E-` )0Z:{v$AR>)|Dɐfά-0wQZPNŝkT_C<^L)UyX p4 э)<\`ٳ g30teFr0̰LDDZ]!⮘f(n\rKt5zza4Tbbua<ხՏZ+TrCT _=GQml.9aղ)~v0jeS|*[.nMMz}5JӥS>pT27LjR›!OUh8_%  , fMc|O.YV+<&'54;S)nܹ|l==uC{N|_7S)f &ښa/õ endstream endobj 26 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-3-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 36 0 R /BBox [0 0 540 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 37 0 R>> /ExtGState << /GS1 38 0 R /GS2 39 0 R /GS257 40 0 R /GS258 41 0 R >>/ColorSpace << /sRGB 42 0 R >>>> /Length 1833 /Filter /FlateDecode >> stream xX[o\5~_D(k+T PUJҪiKgnnPşkGw?6WwosF? œq6Ϟg^ny @=rW_#0qeڰݼ7\-gsKp[K`e뚹٤%T;nsKTLO/_(!`cLbuQ1s&cawU3R 2T8BjtR lKL*uS@H-`R 2T/B.H Lj †*~}. f3 T#նŤ f " qÉuvlt fg}b<;.]<ysA(7s`D0!p^tn-=&*@dm*$s@Gz+ ?VXhZ*mFG(,6ڃo ï ŶYZF-qƀǢfek a.B e5RpB [DYꊤ!|"ۄ+Pmm6Sl|%7ŷB ]Ёc$"4#E(-6ɯ覡fiI צa)yd %5n1ĸs-}X)02 )CW1Bx.cZHYwעSa4ޠp7lm.BCl1F @#>bņirւE-@'`=.5x=!p`.sv.z nSe`n\ 0 +')XWd _uXJ¤aGXK3 AVaVPs iH^t>wɋ}Ǘ|v+-t@P(WNDBj U9q_˷o.ikb=*#U1r P5 Wq?;bVX7wxG#ꋑG/i#w }Wmn;_w Mw\ܝ[pr Ձ뎻uno:~ͿrAtߟ?"}>&Xu(`X] i9Bጿe!׃-@ *`ZXY8FI۞<@ g;_E䚍/{=4;IQ?[3~H4Xu/AN~:5ٙ۫x}{j qssP{J fUn;ZrH**s?޼, sYPWY`_ P_$X,~} #н4mxIj?JOv٥~n6K[Ï6S$-swbn%QrܖwF_W[h-6_\.Bm%Pƺ> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 47 0 obj << /Length 1714 /Filter /FlateDecode >> stream xڥnF_A/j" i)ЇF^(&C&$,E"K cΝ!n\q7  L"3ı{d7Fp#ƭ9P}B4dp`¤2^RfM es;+ES2kr73rYedvٗ?/+RrS,&В(u2(ˡqXvx ̺M]43ia6\C{HSSM3\N c(8gy^L&uUhRm!6KU*[Dxa0"gKUH weCp(6MyqF-&kgTܱ{V=D́ZQHqj"Gf"DEphIjz b{=cu"fSs/F@$Ѡ6ӻ8VWv`>q|1pEkܶpN|r$DIS[F/n݂aRgڙ[0}Rp>շ 'BE)K[+JFS[Wzy M|a-)1:}@&F ]ok]>S #u=Dd;f8qiD*M+~\Mj%5\,M4 il \xzܿ1I  ?R(76?MYuQ/5)–Ugf@XrQ~"4jo3?Eo='!0Eyb|'(:&>@<5imPxjQv37ѦXL/!c.OՆcTJ [f%6(-u"b"6{"l ؚzdĠS KD ?QFЗAz0m>l3 ' 6$%"> /ExtGState << /GS1 52 0 R /GS2 53 0 R /GS257 54 0 R /GS258 55 0 R >>/ColorSpace << /sRGB 56 0 R >>>> /Length 1702 /Filter /FlateDecode >> stream xX[o\E ~_1/HPk*ࡪPUӖ Ǟ9>&gc3`0gGJ_7WqdzSsy\tF?o/h?7/^g^o< s}ƜN#XM6E=t96*އߘ7 6~ ΦLͫM~!?l΅ PJD`zwv$v1l_Tǹ`kP1Ja`Z)fZǵP>G[OgR xR d`R B*JT[LA% \s*SO:3J_m;uIҨ#AYZVlso=cWz_nNWvq^fKvCN}Rm.C(`V(gKvP}o 4M"=fJybE/Ʈ&O<\sBe[J 1+KԎ3U~^moxݥJ8\~_*J2RSVΖ''+B(j+,h8]:l+H&T SKpB]UGA\. ٕ uNb$WTYv5uvF2LAØn ޕEy_uMA7weu}ȏ +鬍z׆ gw~xo mJ'u/Fx0F~:wڵ+e?Yh#W#vh<+K2V-:~i.MQlg#l7ޣxAYyJ}uկ^R|́*ϵYKlRemtYJ !_h:4Ҡz 5B?AB,-+&j?fKك/2v7u8I7͎)`ߐDG-I p mL_\.AJ( xD{3C2`WzJo>ۗ;HoVխU:-Nh\q~u_Wo,֛Gn endstream endobj 58 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 62 0 obj << /Length 1481 /Filter /FlateDecode >> stream xYYoF~ׯ \k")&͋XPöكIS1 =f9vfvϗ7x 'pba "ʜ$]~mFŒht{<Wc۱ZC)YVc+$grZ8 4հ݀p4NϚ${u(p̓_?S9WAd 2xh:=@ 펍1aPjj}U/J#ijes՜2X,Sdj$e^=(1{>㥐xi( xo`*FVJ27wb=HH$ddV싯3] Ws퐦 9[\\%UʏZ;/CQ~%%]z0y j"H%SG!'CpЦGMy5.y<g =w\!lL E'KywO! OV0Ϫ$Ti Q-iK*PByiok}\V 1d'ٶS&x"ItDBC{2r|J <87FpYjI4d[/zTZ|;Ut9"0 "scF]8[@@wX0c>1#9!0q[1ʌʊpbԕYQu@P@0(B>3W]ߏ䅦 +L̯ZNl ~YCx fFO֥sՒɦu-%S/3%z!g#9ha 'ɢ&jQso)Dc˦I>N.Ma'GGq;/qK' gJ~4<:JO !$]AE5f=mC%2Y:_իJӔ>,S/WK.s`9]{}v"W&zݵ@բ:S^ӭQp^šmɪ'Vh3"i* ^ޢ2^]W!W _[P՜d!dwFQ 7(֌0]3bv/_u6ElJ8a endstream endobj 59 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-6-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 64 0 R /BBox [0 0 540 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 65 0 R>> /ExtGState << /GS1 66 0 R /GS2 67 0 R /GS257 68 0 R /GS258 69 0 R >>/ColorSpace << /sRGB 70 0 R >>>> /Length 2538 /Filter /FlateDecode >> stream xZKo ϯK{ُD ʛ5,{c-Yȣ<rpkX|d*:.}sp}wHC1E}O<:!!!E"|Z?yϧCxi::aCZ!1]{8,9%ġu qi9r]\|Tt*bW;yGc\ fAƍ>tqW0'n f1 }P0VA/mKGra'J1A t\\6R)RHIc2ݏELi K ;Ӕ}Ecœ/k&]aj:cJR> ImK4RM*H9z}x1GN#-ʲ' [sl*RR$Y2w#QV_<Ѱs6> R H(+_+C&bNB=y]|,!X23)ĕK ~br!Oʃߐ'taC^̳o\U'3O"}Jn\c@c|"E:٧C2/.zgs}2,1P!,s i jNH ; s4> R TNGb5s*VG$MӰ.Q }s 5' 5)8j(( O4/W!4Ζ[l mxϲ !1xKdj]l*7=Sj B, ;/U*Dǫm'}x{ٛL%`Gi>W%E bv ts[ \mbS&[)>d+uJv6c6(665y][9*WB,}krbNTt!o;CLǮ*gbʧHu& O̓Q*ɤp7h|^MngQ XFw\U,) R]mEN/[s.ڀzDR(3R)\866%ʾBbi}iOܡA":Y͓lc Hunś^}(-^r2zJb)IMJ^sXv~h4ƙS ϫ@DKMQ`Z 5S/ `x~Ѯ2WRl U֬j~]8P|$O_z_e2/B={ p6,G>)k" xwWD\ㄣ |z[Mrf=ɺK}j|!wyrOTVJћ+@ex^ߧ 7U7CldXH2bIN|Yo"9=K-r瓹ӎι~ޱٹh/;v2{NJ߰n".,jݐ Rj_ !ͽ2:Q==Rq]SeSp+Vו.ITQ2+&澕jH|YYs{,/O #ΛcyϾ#etE^EMEtC^C-PTD5}7Q!+M^F _-v0?@g7o>>◛O jO7WOⓟB*?EzF)*-Y_BbpgJGMy@|̱v7mG, ܄p6w[#.Ol$y1> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 76 0 obj << /Length 1252 /Filter /FlateDecode >> stream xX[oF~@Y0aMRmڗ0T\0$q{q"arwn9`#6q=G }b̖k.fp7oc;&cEDmSM` 9`D=>{8` G v""5d;;v$ƱA ]1J7Zk!9":q2Џed1'ȡv_=ôD}+qۡsGyXԹ|><:dBPGY\]+EZgyo\=s 7K1%MRԕKf"Sr ޠ׆n,tHk 6(JdRA+kwZי]Ĵ䪜 2Bc}ǪسG,+ӎAF8@T)wD(E4[UgY͙*G L<htL:_0 E>QN0bձp̧0/T.(Ơ`/F!M>rgrIAg`KEGAvn2 Yc8sX5! q@#ksAM O6`؀=Gst|q;rk@8L-ӶE(Gk~.-BRI4 qD. l_8C/5#rxnGk2gD>Vԕ|qrC`@M,n Nۊb-JY$Ɲew+"è@yW?:v}ƌɟD,vPɃ "ۥ!voo endstream endobj 73 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/GeneUsage-Vignette_files/figure-latex/unnamed-chunk-8-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 78 0 R /BBox [0 0 540 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 79 0 R>> /ExtGState << /GS1 80 0 R /GS2 81 0 R /GS257 82 0 R /GS258 83 0 R >>/ColorSpace << /sRGB 84 0 R >>>> /Length 2586 /Filter /FlateDecode >> stream xZ[o% ~?B/l;F]nHFEx,:E_99=>>vN>xlI᛫aq>~P7_sk }]]I |_E~y_v!e<X4Y.)|x 1]xNazJy P:qo |{K5(Z1MCWN&'zHQ/Jv!^P* 7t7h'PPzeY@;%urA4 =J C)+cǜ#+:LN* y^t_^]9^Y.u<̅C 1LcaZuD!ۤeL+R]tBߐ֖:iѥN JulRnp^o&ʼn]d vm6˼cJĖ MluUʭ—Qҷ[8a̋T8^oPn%TwWk:}gE[bj⨉*%M}ȡbJo:iAo|C }>yO 1]a!PAUP.&zJHn $WXz\Q=,.3#*&ېJ)2dΣ@04F:4pAO Q4H&V=$cLm‹i!`3#b;@>cI&<9J@~F1[c9U @ҟ<`w_EgϗijbosH/D ި[lP+Yul;94 9XUj Doѕ(F s,׆) DJe +NBfD 86B fmh+ŘUxXm:9)W^d9V0<ѮvV?Q.KM-K6 +Mb-UbU:Z子V񵐶J$66 Mb ӆz-SkNK ժV\EjEhH'PF ( HApW3쳶PN)d:pF砓Vc8s?}^uAoHkK47(HclRnp#&3\|͵L[kQJk욦kT^b-no]@2q*zИH򬇞w U ukҋ:2I3߸S"Yi s- z$[z!ӸF;鰪Qi\Ǻ1dK؁9-R7!]iΈҫ WQ;3rF<ֳD$Rx*>RZ嶞]T"eҫKVb4=J8Z \>51=uM4}6bO(qeS"_ю':kᲩqy_1DK i=`!>^*qgZDC6бzshQ\Q=U#&ֆ MrڪN (UN@7Q=,YOg^]7kvʅ^|v2 mƒ3G -iMq<~梼D_]#8_Vᷕ7В m]+|\P _3N܇]2ܼ9?(sX<δ+|Yꤟ>#U>zo+rDRMɿ!?)'$%̓m!6\2ߍ'L|ϫ9>PVGc4Oajϲo1Qϧ^NW'דy0l'C;r79;"^(sqou~N\qtN^/$_יy_tν ~]l~)mU Y%Tš_|D \] ,҉JPm[e~./YO_<5-K;j ˍݸD䇋 "W;<݇wT||^Q". 7oO R ?h_Fy";YMܭGiУBD=ӏwDz3 .ᚼ0w;#W6.Nt#_]FڛfkY Hr%Wʧ& (9M/Y߳TT~5]XAm|E n>$)ɯ]OQ'=6 µnL - ,ӺlIKFEH~FIn< ʛ$?+Vu&l9j/6zZ6W筼֍'Io>~ _;|R>)WY endstream endobj 86 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 105 0 obj << /Length1 2039 /Length2 22918 /Length3 0 /Length 24154 /Filter /FlateDecode >> stream xڴyct۶vܱ:fŶm8c۶mccwl'>7j53Wo PƉ +lkmhL'lke`gdd%#q:Yڈ:NcG3##,@htPr@'CUw; /hDgdژY>\Dl,̝`鏷0=@`hcۺ~-6#) )$U?8:O-"*jQ!yU1P UhQ-@^C'χw91U!U-E1&?k0\Wm.Js'';nWWWz3gG'z[3z;S5p:X>VlcN's1I_JV~8}ȝ]G#Ĵ94憎** -l66NNΎdO ſ D_ÿo¶+ӱ6t3qvGosƶ6NZXTg,l K~φN;6NnNY'$* dd0q?H*fc"bkmQ#Z|XmicjRS ?]7qcPwJo n RŔ?b?x{L 7XOGC O"X&?R6?*_l?_CJ1&6V),(w7RgC?DTQ hhdlK.dAz!3+ǎ%R3GV8t,Y:&}p`gK?Te%h.ۚXؘ`fcx2}PI 6N.;g'o쟍d0 qDF\#VR>b>b>b~D1 &L? 3``lo#?G"38NKG/~*?zOf9 ?2~p '5<\/%P&rNn_?CO¶nt:fN.X8__g94@ve֘'kjsHXt$Y%tmn^E'%tDgEoے!٨Ejx-#ΰt;4T4|caʖЃb%`b>>FWvݝQlI]Ly5ocR ̈i:kdɚS¥G *^S68"k?YYbZ%"/aj(/dghj 9Bs N䱖k_a"7+qgǡs7% ~ChRާ\W,A:TC'o5:[Xl Z;tpB\Edcf*DeZDeTydRt.kΎߏ9SY0/oțH.~DYɣ2lBriȈvbm侈'Gm(X{A]8K?h~ ivƈ3TЗp‶39ٓ\:`>> |4Dw8ZҬU]az 'REcņnr]& \Iḡ?Wu)jeNswOWzt>zpu;abl֚Z XܕFocu[-q7uj4}5+`Z$Nqm 0je7xik5s!vN>=k{qVߥ9#-8sWN)G!ܴtÙ%>GqKԱ6]Dx)T|[t,9Q#BB4VAj\w=7'[oN&`85*{o|NV]"`gU M%[>Gd&NqU|Kݜg>rp>T(Oh=u"l?Gwn R[r|CdG[ ~H@S4yUO4(+ W2 2ﲀn,S EQ8Bv2]Ȳ>ڽ:{YGh;ZE'ݖvr(J'-͋ $HZ' ͠Ҽ>x,m+peNw%r.B|<Znnpj[@<1ߨ\BC?].6:}TB, ~4$ + NajDF~CYȒI:h" UL}&3ZtOO9OE}F:Ŝv-,J⨜PN\5z 'L =dD ⍻}%*门l#^9)xpBQ`8>Ŕ 5u.q}<x٤oшtbW&ޘa0LzP ,F3R8wg"]vM$c&&VbL=/mfqhJ@ԏbttm'79HeTLCO(t=ZWj.}F׬y`DTۺZLlo*`uZ{P10re0}}*w b+f~MdG.rh $&gGt7G=Cr\(1Nv^h9ٺEBU#u'gi.cf^߶- `7oߴaI&^i6e}>JN5O:whb }l,܊R5G9<)\-q_^>`>l8( Q/$-zJhƱm](@ MoF%,u䧪ؿrČpk^$;vA>۽gG= KFڷ/, +"^Lhd'Z |M湚l-#캰)|y/w5vyx Wr/ҞFEcI^nmt(0L& ('iʡgг6Y051Npm./W* (EXӄKNxӟ78`u <,}^OM|sBe%-9 $=rnT i`B 81h10mT!?5BSJBgӤ|o ;zz)P}|2i1ʚ_Q5w*a s,?QSi@)og6Z0HO@v7Gc)E4 'N 7?EO#0W-'/[ h#* *Ua bſDm==;r/~'V,&Q\Sq6Aa8l@8/CS 8>.E~;Dy%|7#> :KjƼdK&Z!ׇAϼA9ZWN1: < oH*LՎ^y>&Iߒ%68lۆN|'rz;4>=$fbPB,a1O& f%fh[W +JH(](֎:]By) f>RԉGu%{u%nvGr4]\D@J~@[&֦fHi47Ri,5bQt;$p0|t4>YMMӠ )*J<߹OO;?q\#Χ}CLR=JZ)E \_ ltի^uUN u$9>~{AD.ر$HI>H%՞!/j:D,/_d}BcSHS籮Eyw68h75ӳٟO6``xjB&un$iwiOh27|晥dy׽_Ǖ?k{42PNJ]Ub};8h n{elȪH?D^6$͋0Ӻ#K5ބ K̽H$}F?_d_]5D88"g/o}WK2j~~`~w|O.SA#1kN迥:p`M7!ZJlc^GG6T?AudZtw},3%Ft'( PlR~ɼNMfd=3չ͈+ ̧ _ø՘kE-I*E\@\\=YOFTAicr 8 k#f r<1p!F|K7E~P?"OгP.Rªaqe vkh1Co=!?iJG>Ƨ(o߿>i@־X ät1 o4̇-C 6NNՌsGm刅B ylv]G* WTƳ@ѻ{un@ˤ\Za0Wo 0ESAb@\FzxR^Qo+‘oPY?'!, NZM= zqp¢Z`\I)Sllg;ywBT9!AQ_n!]Ι|g9n 3.IB}s$ǯ3)pQ&ٹAG C)u*Pvɦ,!Ij|>;񟘲)~gߜnK@Ip(::4rF@I樂 Lo斥>IPT?fm1˗:͞i.DZzB,Jo1t[r4wlMfx.p"ԟϳ0 ۗJ_2"L>=q29ef xKDBy}Y<1"@-=m'\OMYvkۯNIyqtDT_6qn7.3H&v^xC-C|Y*x?O N;^=bΉoIŢ# O~5-3F#T˜o԰K!i>ѵwJ :??ߧuޣ؝;m)b,: "ZmE L^~['6H/QW=S}n$;@dIT^:d&W^ -l%8+4R!o`~_Db[e_oK)'(Z$@[K >HQ};2l((ttЃ7\}E5=຃Gaq6Z4g<7nٮ¨YMI#T{;-Hu?>[I#X^B!+. A"}13<_GE[~KTD#Oۺ:,h"\>I?_(HuQ* /OZV.t3sNR| }c QFSWQ /d{1FbWg舝0=~$Us?uuzkS}?q %$d]Q/2M~ww5q'w_#q J^~|3t)]3-? L {)fGn/Ȍ /9 HLx6ߚ \J~ڊ$_7df`Y:؋hYP5=gglp^Kʘ pe@-]/i#FJɠMOPh:_?W! p>YبFQ`ҲgWpLFƶ̻\U,wyM"IWRTrz?DUX7Ge!,^d,*ƥOzpCWIjm=/kؾߍU³*~+&~Yz29gSk,$+bAp\9lj~Ꙭ-Ң79a/5sp2 6w>hh$1G۵mYN/W]>iZ d/tr5j:tPHrfL'RҘ*g6I3 'thQzCeof`'-cL}㶃$ C;lRMqR-i)0#DQ5zlr;o~E߀`{."thT@뒞[6f:~V=D$sZ_ $nf=8:XSnX/#RUS,%TUsMDu2J"Sn?Nx2\^9ܱ.(YQ7c"J Yj5Pr=&59/ Q:セ :6eMgy&<}xiI>3#dLuثKP~*H ANyGbKn䜇OjH&%z'h|>:h©Hvڦ ع[tGȇaX@l5J8 @>;ҹʯI֋0RS> %E>lHs'){^8Б>@>A: êC R>uBJFӪPhr؃RdD/Y_=wRv'>Wxn)JiCɜB7xGt*585cqcªw-"o;}ѢIb*\EwUb=ḏCc{wԃF$tg*p,]y6+zEz+SZ( Vc::l` rj3rEgF-\V_h^SQk``TοUI.caߢ~}'9uXuޏYHΪӍOBXbʇ3߆ݔ`~ur0ڪq v좸2ϚlZ >X9S*)K[Gt`0J_`x _-cRE%,wtY?(@¶Eln!e|&t؜hTU}+m9H. JΐwX2q"J퐸F&?TTk(5T AClpcFdA2#%V1Ɯ9X&B81YD17Dѝlu7oJ&6GM ?uoaښS(}~yQ|H(ǭQW^ ԑpyjhFISK ϤAW `b⾑ߍ `E%8oHrP@\MxM8cgoǙ̋Jai&.\irU;'OneX~'TGX麊uyMΤ[uBſ?˕:/FR\[xR懬_1F=v:m 7HK[uxwCm@2ͿTJX1 \hG4uX ?'zo,tVrE#!zV5_$dTQ׹Ă9Qk%y_9)2D㴔t=89U}#ֳ"c I XRnmSQʣs :r߈];W>nvCP,&kV8&42脂%Ԃ)`NoiSwݜl9;:zeQCАXI<7K.j{VŒj.8&^0 ⑶/Cwg7?=!,yWώuB10Zdaq§s@ޡ\f,[@ޢעOI"T0)c`XcRAu}%-n5:+@W<\dc`j y*McM+λ@h mi&;K=}dRfN{c[Ϧ yNdeS3t}^+m9iJ%lolZN Y[ 4Vzl2K;PYcnrJ63R'un?ÈV4Ԗ̯c? OV.nw˙=JB9̖5A%9T[L6&?o&:]99}Q}-J˫w䟑n9 ct" s ] C_`"'ld:N\$/1麴zfgXf& nIXص>z`s@ۘkS%6K]sK+3V:s]Y-636\)% ,i7mgf+Zj̄(Wʪz'G ~w9DZO)ÒU ɺ,ȨAo wˉ)ˀX}C0HmY'e,c:G]=cP'+[/JtJ _e76c\T^t_w in8zu9VXN\m%9F7b1h'a(Բ)ש7IBeLQZMB֍i7EcD]8wS+36Ru-sW26nMN߷,'8j&^4T8@!<ο!\!3J"z Zn@pCbc7\wEe>I)T_l^uP3v< qi=Nӫ ^=4ED䵡w/6qhZOebM 51/8 cy= Q|/ f%Yt݊g"&W*l7+@2 ,DR6i]!`shC]Ld1u<p .MX7gnFݽka>r 3ǐn^١m&waf(Gٶa)y3Ob=} 蠧'̗s fiCDrg$nm%cX4Crn{eyTpY ƁTjjr F;?+^(9T}Wɞ]ifYtT|T x rL}VpHYl?Ssh}xV!LS"tdfstRwߛ9`%FBT8kL[-9+Mɪv/ ;y!pZtX T;<\WS`yY"Xy{:q% ̠z}|wzgar73k ц.gLYtLʤ}D&'1}M00sҷxRsw~їr |!6$Oup'F 'hwL10`J ?_LByޑZۆ 'Qm~a+ !̤͸Sd4)Cһ3Bw}@vIeR¸GB2ԡV?Kq ނW^o\Ih9f>t޴L& etN)Acۖal7$m Yd,åx# _?wH-sꙁ*o5W#߁V_4R+ի!T>75&M,Oڀfh*hrH߽%uM>>S_w؎cܕBg5|]Oy(BZ!%UTpBXvFIH,z5r (M(tEl Õ3uK h_.mz.fƜg;_,$w0૰9e~>sL3]9X{:)`rI)m+'/\(eUW<]8ںx4܄wGH .YEZG8#XHZe VM4ot ]ux(aL^(٨\zC _GBff6 ܑջmEL󓲢H5[Rn޶k3wzQqbCWp]A-`K)Fk9WO:vXQ# S]ŖQ3ۋDk̈j;_r庥s%KmQvĦǍP!K~prucﳡYkY^rYn\KA!G߾t 0-/t׬FR; WXM6uH` ropvFj 2mgmǤ-k" )6eTxEQZ# 6 .{$G^(pK axCiK)3P%]/L,9WHφ,.^5k // S_WY{(!K K7M} Nf22fX %I*W_M;5ݽ@)Jq A-o.7x Ykߐ#J-11%E=eKPGrQ8t apE8*̼(f.~I 5O¿q蒑:iQ yJGp944"FZg2< iT=K2.a͎E~QFNWb{ Y/#6c脞ld+WF!0 fNNM~^ԅܧf=_ ŞHDE [ m-y ]l*%#~(o ,,1+ur 1'6/X3r>1z_C{A5wCw3±-5,Mdj+ wfnjXU|-!ueicK_nςP8P+@/>mD'G_er x9 C7ggX_dh0{qQv2 緕A36(8u BiI` Bc' *)$2UʄC]3m5Ò4Bwe t+>|ʯxxI#"@u)+"oi} GED2>5+BJ'͊zڪ?".i02 :'f&tm[-yӔ,eJfq"o: sl~J MYL>Bd}.]yI\TSt^ J43yil GT";6TA!N+A5KK-V*iZ}K~ qrOGao(f6J(YT iAڞ_M;/9Og=09~ ɫNڵ5丏߽l?(8'Ѥt9g3b(%z n0)SH$i0:Y8~0kXd 7Ѽ)*/֛1DT;|%GSfFxi!=lq,A6N:wцle9\N*kgi=M;aS{œWU+&fbWen M*bqy Qzkד4gKŦn鮛 }wWԐfv5&+{C\_1&td BD{JDqp$GX[՗e͙vmn[YCZuD-vnGܧL1bȎKYIZwX3CX%dҥ>d~|v~$0/X ?\OjYS3,np1ˣ v ]>&R{D)tr逎 sTcJV%,qq2jYFn}~"~'*DiC TĮo-~&cTϓ'&e\OՐ$v'_(k#YgLG9]G7/XrE/Wz>﬽ +KǬ#]l?zo}9עtSL 9] d-TǻCxZ:!.kLf.y/J҉0jfUKۃyDWO,m3lk%?cy@[3bp!DMp*> 'uz/R{f驄˾yd,'o(-''+*+M6'ĽȚTvxy&#Eb SI*(H^U:m3kTEGT9\ם|$qR$fw1QHp<z=*9Z> DnZj [UrʇS)lRvD%H3L59=. v`wKN4H(]rO#Q~_\v5P5R禱=@Po:JXg4q@i\o$/JUU?9`֬"5IV\#lZ #}Nc|k]ZOTyNyo1η{&W:КƪpMg})fzؕJ<2,Ul>f>hhJ?Bѩ`/c-)\ cb*\+tT9,֚ky/$CsUH^n89덭N;'bny#'OSńN?{W%Ep .yBGQs=rЋhm }jYY X^$NT4-P/uJF{|f[uunt#-p/~WaH| q6Cr֞aK&YWN~mr61|Kmb+$OAnp5$:[% NW^.~:9H$Ģ~Ī:y\ԃc0.5:d+-vȨn6&a&¯FuثO}r="ߖ&0>1 8ve'u*;pljPӲʖ*܄66 4ûwPw *6JyfΗQh1cmu 297x27hsC+R/fAa4QM(NլP<>p N\D7̆ VWNj?rNC1j]F{.- r8n\GIp&HS4ۖ3ט.dEP:\f[J%{闥\<;zA2JF|f2$Og \cM\=$@;4) 44aIubyM;d2&1.D1p!ml.x;%xx[1Er7YPLx5WF[tk~]vYNX}Ιi{FH7/7X . G!frR/c[BAHwM"b:fw9t]c,rߺTnW?·JT RfƚAmE+Qt0t?iaz,I͜Ӄ7 >_ɞ؞e0vYwN/,|g≺Uϡ.|,`x%mQEuyRUZ $*ЊS(zQǙ)Fɝ^No: ,nyU"Q,[3ᓒ;:098eɨe߆SEYAZqM|5N+M%}nDz5!˂^6,21gBhQ, l5 p`΂+j!άa}s{6Q^Å3DHó @W)dG>(m(:4f<+dn n{̀.z9 d}?Y\ I5 ?_|!i^vzV1?$X&uHݜd0Ss̊B|B|4l0@5N1hh%6 Ρ4[ |C8,dt1HsRP]AS#~7ClAP^XD"ŒcS?LPf9԰~I%~m鋣vg3rLs̾ ^ł}dpJ -L#㦺`mRąG}t/Pk;(]d| Mѹ)z`UĀӭE|*ex(3]C:Cz {_ٌ:#*9`׍fYtlrQ $\t1k~B8#3tp0s# ycH Oqs?zRf/+!)*!rmvK}٬,RtsB|Z"Ia|ӠkA2؛0[ݩ;.'ppB Z *ñX1R?㞡$K]f3AXIkU:޼ u1u_ВVъddEF͸مp>!hԔ,Q{+%P1Зn9cEֳ$(*c2.+Br`a\Wik;Pjuk N'u,'4Xo~ZcPC=}k1 T0(n2lyi8XCn/w 8̽ !"ss%`$grx #XM"116ݕ!KwSz5r7șUջ ~]{7;`M !]b5N邒L9x65AtÁ9\9jv/kR|1*nOhP?lNy6(% _(-鞩*e As~@( ^iݕ\%i1mSrkc-NsÿB8b/zRg~ߕ?NLD(EK] C5۠LA5DMI9-MH}B̧Lg9 {O^2V!"حYw9˧1 + n=O#}4WMl#ifg(Ї/>nefxyLжJTg.tac5-zG+#[3^ 9aƣmw$(C,FiӇգnZlcbi[8xjcŜUSU/KFOl^HBCAfH/qFX. endstream endobj 107 0 obj << /Length1 2562 /Length2 30573 /Length3 0 /Length 32060 /Filter /FlateDecode >> stream xڴeX\Ͷ5wCwwwwwqww'xCpK}@3fMsԬZɉTL L<9y;c{f&z3 \hj`/f pZM]A &&nxr$ Z4x䁮j^@f?@ŕ RBD,,]`w@ `loag(8xV*{ `PjUUT*J ĪnETUM] &&j$U~Uڃ[@ˋ i+33 p:X._(@B͝)tuuad`psqepp`p t $%_ ~ @h$E; @Bi/w e,]SR[ٻMAƮn.l_nοk/uPgz>~cn.im:ػX+#`ne YcVWU =H{WOp1qL!7uv-H'Wg/;6> Vf濵7ssdTrrJ;ft0N%o3o3H?GG q1v\݀~>/'gYFt\.mog9Ԡsj`o03*8F_$lmTGv4OrfKlgl_kV.V@3%+WSI/1h-lmǤHقftXlKS{ _a@oF )Eee;6ۛ:Y[X9^LY`ag0 ϰ\A!G7W?3 `0 6 qAF? (q83Qb0JAF? (*(qT PS@5 k#n2@L@MFtz2MlA6;?9@͛A6@P~s?XCYAm8wps+!(/"d_Ծ_ԏ_Dd q8/ fAƠhGM6&a@g+dcրprspG'_L R/A.4QwYNB\<Ibk̠jqtрԴ_nAAF 罠ϥ P .fA? +ZDӇ 4,ܠ )h8#_'//8Z6LCs3~ВIZΘj! 5fR:I/"}obLYh_Y\xzpR`y ̗|̖"(w[c,U ^yZGs#-*^;T;#fGeYpQwݝ{c2y0ĩ6Vԏ`t\-$zX؟!#' ]:܂D)sBqѦ~q^j ڐIzd[ 6z#x~$dϤu{z9Ա݁}_6Ddy1Zr(/Γ8 .Rhj&Ch͝qah)@$JV]|njb=l>oŷ\[DZh<>J8rJ Xp)a ۠d& jI@cW&-aIefM,mh'#-C5?1xQҸrQ7}͒ɱ&crz٤/Yϟ0|$Mʃߙ)R)XT%a;Qmi/ /VP Inh;=*y|/@a$$)k4'WQM [݆Ǯ㑤g>w< )?oaOP}S&0{ԩpujPtiuQZñ~E\~ bg"s( ,x^9% _ ;>AǕ_Oi K7g dnj 0Vfm rA@T.aγȷJz^AoһX1(n36r8_d9g"ʗEfS;3]G^ˤB4?ox-?!f&sPv\,X` [):ZЃSJڲiÉ1!.&Z iDnYj0 1QF>Q`l FV[r͉|R'GoJFK-OT%5k @2x9ST1kkث)94Ed-8r>fiK?%YIQ^ݲhwGmd[ʯ6> g#,= @@"}Xm/W]晋JD7|ո~it4TpI&0z&U·*oz|%эߗ9[&Q{0,8gņGAyUrƦQD@p:WD͍_g{Bd[sL׎X$^m5` ԬΓ"w0Dz*bp Lf*ჷ$u({* +DaVD!f9Azb9?Ӓsv/$!'Wo>9 ?Tx.6+x!e bJox :`"ͻQ+KU {S m&m||KieX EJaФwJeLskb93+}`;3 W/޵y.Ҙ%2:*Bovlǻɷ}w;-(:H3cȤ'+ዘ?T)yED%R檭I,qHaK.wx"if =V ` dt~bs*[)p#n<- 3=R0W6Lkj;&V0d8]AiN%2Y/OJ/pcI4 ՒO=hx/ާR1 r~>;uͷkI#DjR`N6x Mpe(kn77$ ~C%6 V,B\ʎs752*/u1ŌwB'>k+;#j}`i6"ٲv^cv*c9}OĶǍm8&*& FC.Ѣ<ǃAP*t%º|.U?1}J0 }W♋06)EYu 0Z=9sRrFd,"I kIU @lK}lu|J= 難"Hr`;W擡i#UCJQ5ϔeKj$Wlߒ? oŀpdώ@EmbtI%[RD pxEz& g U%z7v=8lhv0Ȇ^A KIo=K6wNfq7z ~QA6 c֡&Nox`MjcڟyNmޝDSV+&D3҅3%Rfr^a_PxbMB=<e]ђ(\?x W3YaDT`Պv{S/_՜@K+5lqãIxA+r!Yk5O223G޷G[ց 9#KzW_7լ;+ӆ ^ryF%ӵby>r+<]N-x%d&|Jgx#b]@9l@]jdɜ*~{O#݋U 5[ TyQ-)1&DʢlnocuQLc껔%8w/iv7IQR8o2 [ Wx1MM5/ jfo:F'+he{o]i'T Tx6:yB0qe+wJ =V޴vު ̒;Q.5ژ[vE胎'Z@*ـ}Zڹ]#8yVmckΡ|ܚn3⋿Vrn>-܄ٴ~$Fb~1=ϐ-UgǠnv)J5Ni^@i2Xomr̓{gahTfOVh{V"=< ޛp톻WUh9b?s&tp7]N1*r1pY23U>|T,I8.B-5o 0R; >km^ N->yy >K<̀߫!ah}qF\%JAv +f3ӏ<<&D2ފb`I8&up)X4VEe\61p ЀXֆ҈ͼTv)WBY]IESۨNH,? lT9|$YjAD=WEE+*Ҷ GAUݫ@hYp~ 7kXb7XԼHLb&B^U=jL=lY7IB,)#2ߩ,欅0/#*q8(7 ed08sأո!Ȑ2aۊkaK` pWGb)k`fKđr32m{O@5G%nYKΧۦh/K4AnQ' o(ZRh85dK;c|R_#GE< ^w[LvxX\=i Σã+PIWOQ ׈x؈u/Tɶ4lüJa ww3ci]w^G?3CfY}Eҗ۹ B6 q4vJjki̚ E Gq [>`6O`+ۍ'*ub?k *25ANkb޽)GU'Qz,-a{6wV5gL~FQ^1T6+A|^l*acjyF9Kws~{bF/h)۶>^ 7 o?˟XuO%}tP{1s(`-ޠeK ;϶ͧ1O{z6~_*Z"nHLzga~pW70^= !Z/J򳔻MGTa,b'q2 sd/"rφN g 馇~>_7 UVii&;1-x~vR6);W s31K>@"%C -*juH)Y%}PxDŽ!]uN}sK{V" a}(.8w|E5G֑7Esb h6ZfYiuUꇫaV/0ā{4 lK{!^˽ d ̆WOl?a]l98[yH ~lV@Ԛ}hǿyqoopڙm0]d$o۪yZ,v`<0YbO4N=Vgj#yGI)ۧMSNO֒U*lP[&orTwmVN`x Z0 M<[5'eV^'dX¶Iz$# % %a5!U.c?%̎ocgsFZ3N|]{G"O2Ϯ"dx"#·cǻ=!U="6t\ȿgȟ?]uHQ#OY}ivsp0-Bh0kf`l_;[Ķ4|f$qs=?[y'@oɄuwNwЃ1ɹ ~WPZ cT`|ɽ\;@S4!PR}pqCaKVi$^0 n8ӟK\J]#ʆek >'v-6S1]Ԏ2+D^冏XQi>@^&*xh:#1$0v^#"Htv2AQ|f&\ 5hܷҸcNNV#r> (V LT N%:4}P! j>̳}>WZ_IGQ-tu[b$DD"At!T;;q2!7z93IΪv6~um\}l2R/˺ScHŕcb3J~XK7z D}V=#(2sX> =})E-09}A9\)NnŴ#?kSlςkt;rtM⁺Ƥ؛Lasp-plGݻ"lv{ ߇"Rh `v$~b3!;WkNڬ]+x޸@䣮7jzO-KbQI8]dDL$umxF6-AMEgp k¥xy'g=Yuk@5灩R3f";XyhR\?Ѿh989=jr匝#S>vN"A'-yQ1MOpC*t0C;HgoS`{ʄ\H#.~57뤲zL[k;OU\ٯ3ުR:1>72qG9:H̱ ѩ{tupZN&dttnfsKaV>:vÜ-;W6m;ྫྷ,gK#!{`8=xa_ZGZ)IC>;Iïk(hYc?iC%AlA+5fݡ*-B2aq~%Q5U]W_))|֥w{q-~bXn=ᙫdlmҥ f|M=;Rstl1,^;xX}f9ې6;w]Rߍte2(Ea,:b 7R6% \]H!;aMq4K0(2sqAiMpLӳcaaLSBIϛ^dA? yKVA 1,6} qMg(^BueӺ_bƾ혩&b؞`ndUZ 2TJ船 eJkG4 xz#M1;{e'Cվ^A؅p.GR{j$2ؕ(PJgTЅy¶&AٽpEG;p(}132q5 , Zd5lߓo -,6K9?wn 72?Yu!0\69b*cӓ8,:q5-I5>*iHŒoVwlUscBU uKϞ] :mkUƜ+* *PG< 6bo_׷BW t?p5`x갇4 Xz[(UǤl_$˛jޫI\BʄNJ >-U@D3?O; d ^J ?^.-T=~:ʁ#9T`ᕪiUY&j-+$&%V68N xHJ+pwZ0:1 AO-ʂHYSC"s;Mdo>)[EJ fXZjH8iS|m=u;GNGfr.HZrEAkFܽՒ`hT7ĬZr2>va[:FyLǯ#bN*NPpEg2yQbym<9V/٭t54勰 9.0+ߠC 9ԼXW>uw~-澡Ը8$@!bf"vnMUk5 ې˾WM3dG nKZ%B^,+ yÆ}T~~OŠFdiB#<k{: mk*l!ZvAѝToI5'(#>L"'8/ǒ$XfC,pmFI~ٰ &w/Җh= ̮8 ?@ˑ/8~BR?&Dk( bPgg"Ջ5r*;NQ,*Ta"sr^ELecSpv}7A[3|`.HFp!?!>kw51v'?}r3-=`Xnշ7N3j[ ed %N(wG1ip>F\3Pl$p&$b]2!%T4ʯ :λJ;Fl]+e7qr1 GSC3feY*ÇWoSrW|dp m3VU䜇.kWpQSJ0!cl|lgd!"Z.iQπ`S} F 2GlxAq xKl}7\nAgyCxn9rkTM"8 ;sEO )U`_x*ߡ(O=A|e?>^; %# ISlY0BikGQrf7}j;S=B#|ʪ0~mFٲxֲku7>nZp{ ¨-J˻3|#OmX]+Lɦh65qD,^% I6@g3m*t, ~Ӥ[aԧK h ש;) [sǪH"_t=05܈`x u%b~2A ot=b;')N˲n6%ZX ?ِ }*T LB +=mtC]5gqewbVFY*qU"]?6~gBn?*`ֈf? ngG$ኃkdwbNro[d5B~bsuvًW#',7v%Ҿwrץy5|Vpj-7:?݈Sτ- h|noWXO4WT1 2o"וWɥiY{)*l1KqQTűij-0`8Vߓ!Vj׆o/xPoJ+9F eՉ@Ua: Qs1Ht΅ȸ1!8+#|S LnVepג-Òn0>/[=31 L*Z80<:\sq@CS&J$.Kem[W;Y!QAcc@Z= ӂ t&&;";&ΉNTLŏ_϶YUeU!)y`,dz`(1VƹZajɣvM0fwKu{N2@qzTXo)i. sSA& W#:r\'J"_֎P8GM Ї'BL΁nW&njD(Pݹf&rQ3 ߞՁ4=8m43YZy'Š]c"y0*ku70KiO=桹EXEF,8gj oW& ї:g_kiVGCAXgm,13`6XV%>Ɔ`R\M":/E 4C\X(3@3T]Y=f|a5{n^BǗ(-q!\4jET|n]$W+HF08USc[da>H<ē]pv2Xu)4ܸAx*I8o}eQhbTUq9oEc_ Ds &EPOx/Q[|M~ 61Z" %{bzw ~ 4۱Œ}%*X<e/טc7;E.Fwb3U9OxW]~h2IiBgdvɇ,E#'CAiŌ%bJ,8RF}Bsjоƪ^ea^åJgM~tipWtы : $7!\68p_'{sXRp&[!&X`iԨћ#:&Gp=W0`k%K]`#|Mug (R'mv ESb) "B @d!wMzbL6LG}/~bg kfԭ<6Q.Hث&!B &SD[wOg],3 M˕S,~sB s@c*"ȜDNYI@8TA`> fN燕PN­9v5Y%Ɯr(.9˽Yu>ؼi&6?sW:AsKnzS"tS;jl#|u]#POg :\$'cO=6-=F $עOև+E[~T6fFmÑbZnTBC!G@R;8D'$5忁}|\.'ͅ 9b1lYm@ĵAʢ]7꩒a{:8l^l-!wY Ǎ_ ЖXSF^! ЄV Xv[[r l$kras 2bX~q"3/k3kf &W׷szQϊ-#^Av&P&5u;l+^jJOF R gcue{LKۺNŌ dLdFcӹn>RbQLcP g kUNBKsK3$r#MG'J[nzתT28/QIػ+[[)) g<<}Pxk*`Z1wk͟R#ܓbNhơ Z?t@kwc4O<+p'F+ܾ ˵ꕆ|H;%TOd2!ԣ >WQUWTp@|fD޷ڲH:> ȝtgծJ.tHmkqP!rͿmywPtܜ9Egwc]gfځpO9tff( L( *Ƣ5 ob ŦvM.K+s̗~3TSCob>J<dy Fl#_;]Nس[5u -TgbYS(4 Wa{eW1"ב_0Jo{h+`(*Я~'ac{` i̻W_ATU?L&Ȼ r>xވH7Gѓi$Pm0fe8>1 0wzY5(vjvUm݅'LyF*Ɉ'Ge=\̄"1K)u GVNk@tbNe(CǪ4vPRN5(_헾vG)@@7L(4_tm2O;s*W#mjyWS՞FM)'MqE&0M>]OM Vm gxi?OIךWq<%ﻻA d+K>2N%9u h2Tm \^R/F ~Rqi9ގu &Ə(ϻQK@nΦXM`ݑX[N:d6"p\K.r3Ր5&qC ^p(*M SP1OBc)!pnQRD7q!] M쪮H07![eS&sn))O@Eљ(`>@Rɉ.ƙ2[\Η[q֓yo-/ε[/Q0t;^SDmpXogTo(s^o#7I"yBD+[GN_v Ɩ,ٽ(N,g/g酶H NOܮ<鿛oyD_wR|ϽViV/8Q~JnH'` IveD2Ą {Fw UJΏV C˦e.Nӊ>ދ>a_x }$@7|Za DZ7"./u$z}E|دi`g"iV*iFf_ݙ%c暣!Wʡ+8]GuiM]wBJ-OsoS0uB 0ӷexU|RV|0SE"F/\<_'k GH6}}J{Fbᦅ G'̑"`I`<L}wikjЛu?d&^~:4q]8k77آ{Z8eɻk~yBEhY:܊WݗwiZ R//o[|4N`bJwa=0*F7:r'="ZOsoAsWrw1d<-L2u~gاcfrtc7fV8ҩΊGJIC&S_k*U `^5v\>MaZFxLmvA ąlAylsmg@UZ+,{=y$ibC<t*=H1SH|HݙN|!҂a]E2%̿eME:ADfW"$)QA<Cy J7{0?bl%"agcTqآC3 ͌cUV6؄^-@ҷXK’/1 O{aw-5 XƮNwGd`2E,7 =f#=+y4+~!h`l*p 3C5`/{}y/?O[!ߕj &:jZV64am>tOJ0ϭt>[;Brt~CȦ5G5$T昻?`^MvVzS&f2qڡȖ4,b$n5Cθ3߾IXv/J_0 B<5m\lQR~WJP'!^zlb>&68`egN^$-*qֿ)z>4>?L*&LxMLA`?UgX|U/>݊g8I<[^d'D`l9r!^fƀ/D$z]p/hHO[Bx׶9, Hm۶m۶m۶m۶m~m;1"`7|=?'ư \I..ŷ^bE%Kы0Vz(pIg@]Ӣzy .F tM:+'lvbA)gJ yxEik$N?d f^(v<H ^ '0::ʳ_"ήo ~#>FIQϟnNJ1w}tM!r&Haո$ni:,?8[S"rE +tfCRh94x wKʸJXz7 dJ| 94J3VRiM BdXns. <Rh*_.kw{fkAmcJgwx2Gd^.'l\ brѺ!fY^o&L| aF156孧MαTe8A_B>}$c_@$UEIiDQyB +u-yK̓`]n-J`"L#m}MCF]&$=2 PYF[!hWܪۣW'^478HR^_cyo߯H\,_a3LJL)6#dI&B)F&jY[kj!|PFxѝًߩ MGj^wqb8aTdcn(2LfH5x;kT \߲\;41V*$ 4sʾtxRZ%%W@׵ab+TntC4orq{c7#l+B[:XwPl&63=ZLJ,{`ah0Nv MFqӮ,Q3lv2ap%[! ͛ƈynzv1W~(.H+%!_ɛ$A.>J)y=YdV.ibdwv`$h x#C4'HL;Xz(ήnߵ4E ?dP:}AVU' 0P:u͐ƻQk+វ!#wnR'drai\kT~,"w*۰Imw/0>L4V1ȎG1c^ w}`% Bkw|$ \, \feX²aҊXDVLH?K҈%J@%* h0sRb}?"cb-'[;3^?TD;ְ̢ ;J%'W-cx[VGOkӺǰ6 lrlhʤ R~ҋ\עe?r0?&L l .3xp `Uk5.o {Ћ܍Bɟuv ϽˎjE3UE-0RF y϶0^4@(hTeۜS+t6 4Nf2M'%Izt*Р͔ 2z1+w9˵io) /W?O6BzdSy,6S*c(]bR0;ճ ѤmVȝ=lҩY{,T7M]ЖƚLJ;cӾ3Kۋz2Jt4j} ȬQ3'3DA yB>YaOZl̕Ӌu=I=8r xWY0T $:C#:o0p;< ΈB1dqX}CHpo;uFiĺD{zhEb׫ X5͛7<~y=}}Y[sjw@fg$",mU7M$""9 5$K]'jfj'˘@z"B+)9G{Cϣ߃ĸԍyW2A[N'N6~<+H`_JnqIR 6t߽YRo @/*R퐫HT}@'ιm΁x}}K2esGuZo)ÕQv7qtvCRDn9u4q63X0|™y{həl: ?o}aύgu(%g/t6 ݴ|n0)sXMx+hK Q Ib@c†BeΊ iFHqLmJ9*Zy<  69KaEXQM~+uX/f?ܟd+< ǤZj\0ri"Ca#r0Tv^$ԯu>s)F1ݟciN+4<"vBZC;8o^} dcA9#t) Mwu:%#ے%c3^z{{ 0MȨ~J|SAѮITU'\/DȾ~_|#xH^2^F O t~yf#LGJ,#q~Qu\1aHPK&*=M $7 k0Lwvo{KGɦ{(fBUL:ǰI@1|J} ګ3偸sLҝh7@<4t, }8l7$?_C(1;%tLXWUʝ#zGgK\jernGs2/d|ܫF\,:uORǬwumkRљ"?Bo2tM{ʽ] XT(Dex\:)v{_o>RsP^-Gĸ@가G 8`dK0/7,D^)S^ax0S8+4 tl47z\e"o*+VY2%qm.䔎#5n %>=[o%~,d ]ʋif8|Z^[G$Xe}T&=MDQ*;Θ/"5$^_W&Z KPVc9\p#ݩafNRS~P9,:ۃGqZ. 7 /TxpWeH{Re(2Ƈ _um6&s)wŞ/$ԧEaa .[,KQiAցf\m֢f&דh_xB&^Fo!Pim{?W%sR^ }VF}S-gw#"0?N/OFڲ圿bpB.XR!_X@B8G٘"oDoHD&бTn\^*gF`ak5 wkz\9 9}Y,6!!lz&]ME}_rL׏5 /T{Xzt&ȆYצMJǐ\o#SOˊiX>!!Aj $KY밋ǞT@RLuD {F{^Ḛvn~MS"7'EL_R+),k{ֈ^t*r&s-@%3m¿b_ڷTrL9$>pD9.yH3;M!tJn|uR2ߝ 蹉CY9]B42/\4Y7DuQ,C)}ރ7{f+8m\VZ 6絰+3VnGܠ)i~u4\hrW\5x+aBxxR@$ ,޿m?\M6e1.^ISq1*> 5Sbzjؖ RNid~;49Ha6!*Qepoh׽ZP$7`->b[*Y[S5!,!>;yDܝ#~M(JDZV|uqN#řa{H 1DLuJoed EmYLƇ)ԑUH[qYؼoy]66 ݶ'BqjC T b]P6\čE1>L 6o ċ[oBĵj1@m+42tz~9x\ݕNDuP"" s3`1èwN@EhmCRkܕq#,X^0Q.-?,.!~7݆hxEe+Ɇ}aj)S/e+VV;(z §2"*.&d&6flP1z>s#o79toŻBEA|]Re4ԗ lDXȢaI{1s'256Ͽ`?4VN+pGL=''AtO.&6t#0WԽiۭFT\ma+YU\ZѴ8O+B@;{{ZZyK.SM>:ra ֒=}=0}"jY]mv# (pKkf1) Q R)<2bDn1a-l{X=Z*j4\1,3 U wc <$v3x8Q (A6iEXgOIraOd`:%Zm\씿y6szY1?sR9%V?kGIgoOEL({/`EN2 ^/|=qaduAp"p N@|4WʞXA١.8<ָu9\k|ZŌyLw#g:["قݱmPD3\kԡe7J.:phv#MO"OT,5A5e~Ѿ"mzI"'E߃7{{S%Uw~6=鴽w}<M+F9T,m@7j#8-Y'uW%5+4Inai-'ʝ~p=2ݒ] Obҋ<鷊pTSjB]-:nx2q:< QlM!n1qgZ#q<>wZAyQc$ݡ8PDɲtpdfO45e_P|;_3xSBexv\ՙ o[KS>{Y)-Ʀ9q+ z*$vR"@ԵT$s{Ux߉ՃKkͶw:Qj"ʓő\ڤaf<\ޖGƔ̲;Lx甉D#:+_.[k"d.?Weᳯ SOg5\Oe幨s*!E)tFK4!pyIE(9ǡ ݙ'7F 6ZP+$ Z\ CҚ>pc {\0R}ubCkE,M3%׬ v r@R?;=v|\ds?7*/̇a=6P~6_J:o?Rc)3vQE.v.@8Vc{vc{T"N%6xPZz{4CJL/$1:璥a)'ӯ.؋_ x%3[[bsOy7"@?sԼk0/[N)&_#3!Ǭ7p\fg+$+dl5%(lAoB\c iS7]UT"".p#ǨIo.Y%ob]H?a5 (f͙L[U)m_0g7.BLGE*a-t<;'y|5{¿?Kk]u;u Wd~oW2'"+\CQ+' $L 4 ,}s'[Zi`ʏ~Gx|WndYdi2l<{]V}֫Z1|/lLTyp:u?rƫǡ=0z"e+EH|W%:y1Ӷ xamQDxx"|fuW Յ^y'SP5It0HgY1$X?^,v}Zڮ x>+Ȧsuhvl~tMm5E_u@߫Aj;蜑3o*9z"G[d 5U cZׁBN?6 `YѨ0LQ+Iڄ/IǣF ⠐AWeQUR^ywϳm~/ 6r+!DdN%= ;8jun~raA ]pS Pkb&앑C\ek *7l Qd`ī^F.p9f{Z.7mjB&4@\e266<ي祁ΑIז%(םSPF2sUں ڻɿwNl35=/ FFT-h~0;3c!_I46o'273kT_JyboR=3V¾W#6N s[[1 H)}V4,ˎ9D*0X|z=p#g,!qD*”^ oT~e*HbW_/ 2eÞ*S nS.7#$Ϫ 3ye4Y"";_dUjޟ`q%#X#:[M!}n`!B,Y\[kO 48 nԩ%SeOH)I6C#we=RGl. |#XQ^ݤboɧ>_}0+]i3bl^P sRn&5'i2t$'d !ÑH@jz%LIͽ_2d4&&1*N7CׂaY#;[.nIxm`f>5>%5W=4u!Λ!d14u&:G~|ep"pRtTWZ[) :cճ &^zqmlLԛs|XaVb-CƔZ ybeX5U'^ˇZF9,q2_=dvUEd^wɃ)J:Ɣ]}8fC:eS*"3.tNjsgPS- aEm\{7l"h0j`sv(E G TU}C`unt "v¸.b෻Nulq/1׌t YtxE(|Bna_uR:eeuu(qm:e*b&/Y}O4Tz_> 6mrNի`DJ)гMᚠrn!~t#(Ҙ  x3/ RECǘekq$Nӭu}}ʩ,7JcNjq;U;i-O{i8~g<(K<ڻ>mzFaoMÑm$B,(oe[EQ `7k ؘͣ|2SRӪnnM?[LWP߂:g\UK'lLLIWy/OӛPwyxyOi}zD }r%@{w#3QKT)v;ChprhT|{:1w4 .C(a]^^;j>wd#rj۩"!54?DJSF= $ovuZff.S+J0ӶL@T};@U1{aQle6 9$gk?a[pym6nsqovT,v.妱'1;==PtNsƕw0ui o@j3M,%k=!4g҈@<^xB+wzI))[ Dب"*^sf5Px {Vr8PKϴI4s,uhkv#Gg+xiopW;ò(ſ` 4VlyM ǣо ˯г'mµǗ(P Q|Ģ~x`}N[XoJD'1#X=$*u8yw9fȄ|5m(/WK7Lm'*jr* rQEQ ;;jrq:}8LQB aRƿ?L];?)u& R0^M \Ev9 SPrפT8>/EZ/zCa.u5 p6g''jSya}^U]^Sut۝kKt@y5vYt3PM i9uT44d;X);]3ԭ70qC `sM [*Lg%[MM͇SZN7%3zWV#[k|tmj8݉aYYT4\Oڍ ^ⶓn!vN?DߔJѴzzmLD;ҷ[{WJV?!v%tqwŚw3aDat[PɸZ,tr5X񎦺= kgZa#dbpR8I@[Ic`\i\7ᧇh-j1|Yd($*Zω&B̵E;kg᫴CTM/$e擅k&w̹%m*:Ҳh##_w{"`SDYi1||%ֳ(qjʌJ'(#*CǒE/ IrzFا)6y8k%( X2+T"Њ*jᯉYXچ}E~z1Aԛ4Պ[0 P O:Z 1^ɸ5~DsRF|Mc<“\Նt&"q{qKf|",+{-,?-g T&Y,z׸_-,}rŬzqtB͌'"*xn\LܨU7fL,Kef d|en9t O2HSH[m_h*1cf 8s`Ap8ZQD8Wh~81ZJ Ff#5-Lj8ܶUBw dҔqcWO?7 F_$!:^~gfc^ F`'O$m^ЛAmRSZLհХh5R0䉗QSp˒Y-Ryxͭ\_r+fugN߲98Y64F&NQ9 (Bd66J;xO-]X(Q eqn,ƫ oPMOߖđu ŅX8TW9NőƤrTT?bLdo `S#QyU^Tv0*1uu0S,ٔ(V2xV/пQe:Pޭw嘇LF\mq{Vϐ7xJko,,3ŒdpTUŲ ,iJoAݣrT=TtۄgŁa[vdc@+؎e^>#S7VO3@?;""3 ,c/M!-vpv^_[0m\ qJGz&IPK, zET"EVE$<$jAHy&`nwF7P%=u8} `kkMF碻1 J;8$C)i%|ۈKKη V(0trkmҸEϿ҇Y4%qlM`r3ћ,Xcjnj4axtAYckWb/f T|?|ј<*%[6ַA M{C^7%kfL4)HnjyVxM.!dCuPD6S.'S8/%F,v43ƺ)R|=HM=XbcF|dN̝tuN:mb$Nȗ,ǀ\}98PC+p+2U̝p [JE VZz{ܻpq 5ѺI8cg&Br~|61SWMq{{Y0D$_/a%y?$3耹)z»WxD;PŽ'Lh(2qh77ޥ3S~>fFI+ԏ9!Gk^hJTN㸹;Iݫ-⏟ۉwg|`k,O@Z-T[DN=8O>6Gl)Q1HBqZ7tQ.I@1"!*WY4- XWC(Em"-ʫ~d-"Â9|{YngnOfJc׎Lu 4a&g4i_daA6R J/ڋ͙X/ s(LxtgG͊ilC|$H jmJ ܅, s/WQ X Ίp)SP_@DIdJ"*ISL蔺> mSzMt]׺Z` -v[Hohi:F8҉gT/,Hևo&o4Ëf"{.KOW.W v!b|ӎ4sCϜ /5BLԪZuOR:iaOƈ7!bnOd&ޠe|zzƿT|7x_G{V(gO{f× ,YIQ|y Ī'C} oZ'*\AwI 5>UUlBn_[9HfFUbgrf{N6YprE`KC)Äkg`acx.כ9V9h>@m>ճ]C( qXY?4%lU;rd?JTĦ"]q <|1`/+nORGn](Qw\L2rݦyPі:[CX K+)9^+ռS|/؆kG]hw O]CJKۙw ?jO0v L*RG,(+eO-_Vfr\߀%9@1G;Vspx~k҃*}]NA<0w!?P VF6`5n҈¬V9xƄOeSX?S{k2 /4{0:8ٔ=:6*khfSe sDNrhnLy endstream endobj 109 0 obj << /Length1 1861 /Length2 20602 /Length3 0 /Length 21823 /Filter /FlateDecode >> stream xڴeT\ݚ5 w)!8wkpw ݝx}tU.{V"'VR6s0J8ػ330UYUn&&6XrrQg+j P4u`b%HΟA3@jdPc(9қ|V@QG/g+ K׿=Xv[-16qpۛd N+=hilkp0*IEu%UjƪnETUM] &&j$U~?[>|&-WVVgf{f;F ohv PY:02zxx0X288[08Ol:mfoI%_ @h[$'E~IߞJg?rJJr;c+{Wg hF/@r1 ]l}=sŌ\7M]\\]0Ewͬ +HK} Ϟ^{WOp1qL"7uD>1O\_a;x[ٛ͑Q (-_.,& 4d;u3u07uY?/>.@ 02uv_O$/PU? h˨) %fk`l8Dc;+[)hm#f"a 4Sr5K_,n)O~?V/=3'>eijctq~?MUAk>#kmC:eNw,rGsάv@(+AGBI#e֢|z Rr?1["BSvAo7i-I)&g\J{tv1q4ۜ.m?47#D3޼>,Ѭx?-RNNh'V#,-0dX"#2(jJZ JM.5L($l ;"A7AQK/hc3dMSVz"*ױ1ł8ɉM6g asf-$2^䠤쾧jFiךF%_ E~ Xhh0zYJmȡb2}bGݒ<؅e'0'QlCamUq_G԰ʼYG8B&Zqu߄!R5m^/* #_Zβz&]d7ćw(-j*6XZM0qua3RdWћ5esmEF}attGD{;k|sQ!Yw./& ~QPpioz~,3@)*rw6/p^E8ӡl.T"-@om,{㇨"-0R͟\UEhK9}g~W/)Яsu}~ -ZWdItD|1)4Lтό/y8gQտݗ& (۔#p6xƁ;%_œY$ND\\-9 ق_i:A Nݡk-k/4;^*N [?Uv.(n{ ձ-k?ʀ ym?Kg(PVՉ ٢;6e\h*6bFFc%.0Q_PBڟ9Y(D nvH2*aо[.9papa+!%Zki0_[sKЍ$ lj έHE McOP^PMSoI/IW0brM٧*I|*EJ I@"KJ*uၔ ,lb00~8k;PDsz=.$6!mTFWEW?b"6siKg &؛%~FH7gʙsLd4BL*V#M`v/eՆw>vCӖ}?'[ igw_D@H4cŸ2\~ _qW7['89jAǸ˷`uwQFcڑ T}\ΉBӘ H}c3o!P? ߴz 3o3!QɂJwhk  >ȫ97Z&^tPw\W_֠@W8Ł@w(T5.K'6Twq-D".AdN]BNaYHʒe:۾;ӳTeQp0oh 0zsݠ!/OVM"U8 4Dn?h lF{yÜ~ M 7Ӭ _'D5Mň9z*/B U}s),}F&`EA`\C7Ӧ9WCp5H*, :cg0?#,=(G8~DH[D)*$z> l3<\,RJ 2X$p3[,XQ({zF|Ni[ W 1^zL,ЄwCa ̥lVB Fd`NԖ2L:%FMKŎE4A/E %B{A+E= "4a5; PFq1ĩ?ҶG/؄D7`rP eqC{gZ6[-Y(Qr~*sF YD3$MH"/7]c2αi _W7W>{!so/%Y}lznK/D)pn ~b=ebUМ?[*Bvq& 3.l?^R]p;4®h]QMȯ#ҖfaaWWb#h97m#5@}8а.e^'~V#t qҊB1wU]]?v\FZcPA u/Hb4  c@z{m@wz+y$2+[ʓSEdʪ/>OCe>TKŢcsx/BP.ȳLoK6~OF?˂ږ X6k(Ot]uLx\#6sӆN 7t@GV-w|5v0=Hu@MsTJ% D,y >[#,| ޞ~ىLo#!D{#38Nݨ13l !0rv^S2M}Sԓgmsv71P/u@_W^lSt98-5 l[lb@ M_%o4?[]}{x`;ϵw7OZ^YwBV?{:/쬡 .FbEbݣ&ܺ`Oj+ )[ NS m8Cc("u@G69G0)<цF'ePPa/PX 4GݖWS|yjP"gH^ؙa"Y|9`#}܀=7ɠL^$R8w+5.[H:jp*J*_G#6._UА cgT + $A,]z wrmnx)cqHzPu%mA Óm;qo6 '=:S_L_Y [8mގ{qP"b\\VZAmB;`m#D:p $,fiG ƈqO[-|Ìbj 2q6{c "yq`T\$mPnUMD tǚItVʢqRIQ:&?cרbmypm6 NN>HM~=7+A#X8dtmKdӏj!PЅٍ\{Rx}ROCIGԱ'N"*Cڢ ^~9?5<S*|8gF {JDڔs[L 0LT )#szB sZxaBH( N.g]4eSCkn,1T޻8QK0|pF5*D"u^/ći6+Ă8MbOi`Y8"dx,L\Ti+:#"T"H(&i4C0ٚm肱`hqOb:-(% Q H`F uS``љ:|=Ő|=iFgOSj*Ø[C"R:maA*{/DY- bǠ?/vه 4 b='q8浕jSq6s!N2ܦZԏ[d'iJ ),dFgjh4Vnߗ/+Vg!XyzR}X(QGkHL =Y2pGX(Қt)3UkN.l+.Ӧ'֘Rq-A"}TngƊF&""5$+F #P{i[Sr'Cjv1ضP6kO]( S]+"X[H3Ÿݭ@Uo:䊹kV63q11 .Tc=ssٶc>T̩+({jּMhb 669dţQO-`T*\8yϵ/)l8bf$eU1CU^WTIaGOиmZ7NdL92'KuCRvV`C|Ya8X? FDWg[s!1ys-Ln`r r5oĖ<% W`g3^cB>qXKifvS-%[<~\/ *bOT!4<u)sO<@wRGNJ@z$Jkibb `v@a/A fQ[a΍F 5T;M`^j$TWTT\Go"B*E %r&8Ĝzr&B7[0A[Eٮ؂tMه5' 03 "9L&=LF'?7].;B7l12̳kYl!] *.+圁:W؄D _xw*XKg,d8Y9Vf3U |Ϟf nf fK+JJjh~A9G7izo8kUcS ,lTn^IX Mpαa} _! w,HFXlp'YskFW@+p2?P !^j/f5ۛBrFH&r*oh,t  q[qUԠdssi0^dwUT]4a]_qlF~0ª8z[wG%ƤQoZ*٭ufepxS~=aϾmQ&J#\!!$6l϶J1`|&؃<ybE={H<~&\!A/*].̭U4LA%W( ȤWVS-_=[̹DoJ@͈;{=5 .B&@׈u9&EYzZE$ruBhT=rP(p&N-$館ůWPLbȲ3[KU)G_ %%,xG8Cj@l7)פ׆nKR?BȪٞi&&&$S`)ЈgnN9eY_!}`V |b_8ΆX$e"P%L2i&>L>okG,ʕצquqݪ0ƦEDƽ1!t õFnBvEdНR."d=t_=3K%*ԒEs/fFg|uP?ߖwY2 &G"7YW $d[ ͱ`Uv- l 1 掕-`z%5OۣބnA&W*yx޲ T4u9DdF`Ƕ4)LnzY5?ܸgz}-'-,2bSrm\H#*~=?+A͜담e3Bn  )E\s`5^G֪A>\M6KvPk-꜂T$:NZ 0ʼc4/݃.A a״QA b]S;BG,y` Z{H:t]8,o=Uus@PRRM}XB/^ӺeEy8nE`lj(-nZ{^-ˬDUX(9>$:Yp;΂t%5ioI~V*`C̹[KQhXjK0~{'mf *:7mPjAF.وEwEʳ[VOϷ׽368 K*=tWv2bssqw:f@Fң l(Ä+n6ǪҘѸ\O*7t} ')! )}I9>^7&c{AWYDS-,a`x b0w Ha=3 Z//<@CU S{\:)g{d{4NB,~l9/Eb hw-n) SFDLr57t)ь+xoQR|a1 eKއvt>_--!\]BaI0畁?Ћc?~V@P$wj4bmo9/=_p2dMJtxwZ/۬b A`BDaRt;/nxƊ;e2߶yb:i%0|O#1Aқ8*oU!' q0mV[nl qB7Vxc+z%*$ 9ޡ&6b5ƣ*Hl0 jJn~>1Ar,Bߎ%-prRVBdJaLφ QN0kThez,/Z߅u[ݝMv(9o v&jzrVmT(}W"c,|-r3S0c ddHhKbDOyA~s*&khA\dqW;)F%ȍ33No,\4rWZ% yCW%0^ D[@Moy % T>n&vƒ +ۅ,ӫܟ{mޒp+V/*<֡p ulX?VxA lށ`dxr9":*^= 52C"BŅK/նHLtVlka6!܊$89NMGDk& 2.8vFN" $Rܸq7EF<"\:vꁵh~Y)BBykFvGefڪ:x8usMՕLah%[ 0OSu,D2jnܴDI b%>":Ͽ}^#ޢo9N( yf8Δ7աں}7J)XI/[̾> K]: X3xmʣ= ҤyRԄܝftxj+gJ~D6tIU͆BQ-sװ0l?B 3OVL[h8( a oԓ?c3p>*,C'EQ)}yVuBdgN=Ѕ<)6弊;I5/ ډy/Ǫ~Xw55%Vt;+눰"t1x4."\o=G3$4n'A3o#gb+oj:ufs0M֩4']C.f7΢,:tK/ $+p-Ρ &Y8ׂ!)H$ٞ5gٔ0M][ߐN3l:tkby̢}\bxYS͞%Su~^pkXᥑ:9IL5FMIO5Vl#N-O!lF@4)i>^)b=g[suEtECtѨIڣmEFEѮHtep#8ܐIAIKg@my2/9މn3+XXHy[]׉y$_ˤ'0m.}>aV9!:s~;txNvsWJl(wjb`-i$pj/Xk~}Oc(t<{/ގFZbm20G%Yõl厄nk&;>Wn.A:yN~4гe=XjeWUA&"E[# FX"Ĝc̍*@8섂1uu}$?o?\2˄)6M.-2<@֫Ϙ.3+FZZ0dvx@F黌h2q1鮙~_Vii &J'D 3\CNۭ~`Y7}W|KmEQ)^t\uiGmqs] -U.jz֒.g!' R*гs\ƱK8HYi5GВ`? -^Yؖh6->ÞS /m/P\ ^PcHsኪv,ewE ;og]ƁI($w/ܕ;[QH:g3WෟsFn림B gXmR#N'2RIH-!Ȃ ^uW\Q1-F(]o1-`u&s 2UCUmn Z&vGoܜv4-oh*@7>~wd|oQ)Oqr&b r}%#k:ozK,YtE6rG<1:kH:q5i>\^oz2,IU>KVnԔ"9l'n&aZld~jx+nbFf vk2Ri׉iǕ.aMNRpc-fFAeHJ䤝`42sXA}F;ҿ8VF޿OfaB!,vMgn0a-EC]݈5҇1X[^ooJ%F#u<$?4s)g/ZGTn-Luu+)/whk4ziC*7jˠsXԼtʪ_IDǧ C1xU.M9|7 1I dU;(8݋PF2*I]zxgiЯ~O2ŞPN$<^\OCx֑TbNr5Z"V0Sl͍[bX\}F1u 1K4UE9s5ѡ#oK/-ߦs}}HY.)׎ʵ&ˌ,DƔz W0dSz 2EjK~#JU~kXu0;&qb$u!kJ°N?'—O+*%j9 U.^γBmt,EF*Lsue9|baP#by8~V~TlBpmȡM.ͽg\[ Ѳ [@f=. w-)3K qY#ߔuL-ֺBB>迧."=K[{z7iǞΛrSQ= ksFxV&v3K$a{;p!բ;wѡ5. ^kz.~Z^ "_ [؆׈/r;݀钣"f,yUw#LשQj-3 taJdԕ|‹wf;Pgc EJeTo$yQp/ )_f}tΥ#x[Ӏ8 I9~m*,Wӝ68xR{%R$+4SZvTW8w?-yu?SUJ?&gBVM ' [ʡb"w#X襰6H$^^]H *L<o-t|X _k_nzMĒ1|֣AXhӡBLXwJ޼~3f4?Lx)?e-m<+aʥH12~I{#"bOBSa 3M`Hj9/ VCe!Xu%C9Tk%f ^*_s:O1'Ra U.'/iׂ͌4n~!ug9/p;2ap|ݥ`I:V4੯~e%I t_* *Pwb(( qMUܸѮe̮YfOS]n`){z+T3,37)+1V^YG=!q 1i96K WOקT5e& fI oz $Ǵtt*,>mi*P8pQ0ښՑ,Uw9E_lïR* TռO?? ).݋9lCMޒP1|φf|^_|J9+kxv#>)qM6rahkW N$Οhܴp~@kTU3ǃ0!5Nԯ 4x>ԫ~ansWU|#ca.ZH̕I$`nE*i8 0f0UpžpOY#wX6"+4 W$.ڑk*]WGk?ny_>T꽣ڼJs:sLW ^p NB@YtyZ3-z#cd&1ޠr~@o|9n? '$&-쩫|}O&Od HN_W 6葛Z^Oo`JcZb^T-]bG,ٗ08ao,68udCg$󒧰NZ]0.Ϲr[V>B@j7.ST\a83doE0e3U93sݠ7ꅊέO{zVkx.Dez9bW: M:Tg!#nMF!?)@%'6@D}C0>H:* K%?zleYm/fî7Χ"~?X$-oAJ֠ϽŀI PRPJ?sؿPT8kP;Tz Q$j8 b!1am&]AQ?{Z7n3KdشccK6˄O\ j^쎚.okTڪt6۽8dSGJSFbͥ;/]!ηw@׶=.uGld@#V)Hkԯ.|Ubo\dԄ!^!~-q!;Y`tMw~^G% kލ&j&ɥ˨hR VIaXjzU*5x\7͢Zm}c*L?MJ2v%Y5*PӦ9SYy Q|f3Rz\/@4X]r3"b-U1HB!9\@SF*@`pxBwy~ ͪͧЛ}ޚd黫 r1fylE'1SANA^wk/Ƒ0]z`/m%v;u a@40ѵ d2WjH'޴Q Oa<U"'hC,JWe~|3j)P hypVpi>. БdqsDJL$Ttu)6`qU əqv6V&/L5B˙WiP[2uav5yOV#+ǘD/ǥ]yY0:0,ȣ폪;1S2MB?_twZi?z]ܚ!d#rELˑD%nYoi<6@5aeCNT)3|ltыWXjb˜s~`.Ipmpg0o5S.;s b<@V#UCY(Xؾ-ҟ𣖤KߣאPչ!͘hT]Qȗp0Bu+LiZ憑FV;ߵp0L8>~`" (CXcR eÈȴӯjYtMjS];x( j;c5} ڪb渂Xa˖,Nz%?K)UǕpCug 5ŝCj \HBbjdoXJ{v$9hVz)MNTh:#Y_-(*A |! Z(! zwp[2ɼʎٶܭV;eX8o=FeſM Jө#-B+`naWç$߹\W:R?LIZ}lc8zy9-8x H:e&߮] 0PqTlL|}&^n,\MI%!\;wu2[ D5B# ')>Hucǝj&kh~d8ܮ(9F7Rq4o_#9x]@\{\4/<y5%z 2jnLnIÀ)b=*/ _b:g:c(K⯂Y'U:09h1ḙFBHZثstDP+ +-s5:3htjsPG|F2>F =e'X]9}f,OQk6K$O9P)}S/;fQ]Lƕ:\;KDR^tCaAt{*ƾlE %X+K9Z wG('UA~X lAr!cEa*\pw@: .SGD@? '[^HJhN*%jv9J*hLVyEQ#CJYT.s(w0C0FRSxJ)))O"-T[+H'-[g?i[ 9Ѿ<+';{h |<fpXVe0<atBP_;R.>Kybj}~ܶ1&{/.1 bg2 `##νceW))3Egq)fVf8p`w-! 65nHћG{KHkZO֙J SlDtey~eTb9{jy:UZ׀]"4^*@CDJ7x/SQ\h?#Ao-N뙅 yDc%cٓi)O3PG!TSX<oL#&'4u痵=T&s/fx ,CJ(!ރt~Qm51p2dK=RsP1 ?=E؜$HgMR"0PRNrRSJ!8;s3ehՕP|Z?IO<%5ppӌiɬ]5hRu[VЦ"1ThԬ'JG顛b"q%d)jR̮<*@mpC&%ߣ0eKCd/DP^`Tk gֹ_v!RMIgjwޗD+ɆSCRmz}U-Q:!]sr]?@w_ؓi)UʭSj[Ri޼t5|Ljq&ViNh>fVVfTw6_$U‹~IϭM4ɜS#JU[XJx,qֳ81S1iJg|2y $\S956OF$/ZB?[4Wh~m=^ĵ./V⿬dqImT V(PFux)wZyi%YO՗mp`x܆~<;tVDh:QCw`.*<{碘vV/dvX endstream endobj 111 0 obj << /Length1 1852 /Length2 21900 /Length3 0 /Length 23120 /Filter /FlateDecode >> stream xڴeT5 šݡhV$8Kqw+VkqwBqח^}<|5"SRe53JځLl̬9y;[# ʉHEh@ʇHNS;@6RshJvN`&c#w7dn ҽ|ww4l1f%d ag(ع-v 1 `gPjU%TTR*JtUkϪjRqQ5 P S zߜ=o5.@G'˿mc6;{? `=? +ќ,,vր#1 w:+9K 7I_Nw*ߓߚ6 8?rJJr[#K2N@S |vvtC]G{_߸69Y:U0Yɋ*HKJ1ɽ $o'o=Qq9~/+ .R g;['nѝ5af 25˽=:(-_&Vt3`55iog03qz[NF.@x&wK|2O߮?Gځl@3D;$hs-?l-mohNK`hkd>K'IK7%_. 6z׿(-)w?/;eib :9|'?&~gEEiMEEW6ILL-Av.n;"عl6# 3w{n(7E``1 `1y_[XÁ9,K[|foͿA>B6V˿5b{/oB1 XI"- lʉkSe#yBT  f ENr#|bָV|?>^&땵β5a9`-t.Nv@b"zDgwDLU/UEhuo(1UI;<^Bal6QƤ-95[D|UiTuK^sx3?2˨ҝEVgc#0 p4 B8.G%iS\_մSI3RjcP)T52*e9 %kӳ}6=A't EmۉK$WGk0oh}H/R_f,Hj<zxk^F fO=Օ'_!;+O~$E([Ec߱S2(MiKߠ4b4!|j2e|`M3 #Ӗƻ–awS|S!r$0BμcY>5kCA)UMXuʆߏ[:qntxbZd&y K9dq9~-K#D E`,/kˊ-YJX)>E(P%m:`0kdd@kF'|;ͻ]Xe6ßaņDX^?Pv^U?@lr*Y$6j%!h_3SI!bE'E톅1vlF0jIĩQ(/ .t>~6ĨiBzM߅(>`m w Z ]V\L'|ػl G%,p_^ZwZ\G%dz $ge3ת3TV\Lu-eŹ(S=W& ȸh|:6bg܆_ddwҞxuzإEo:6R RegBff$ IP@ `25#QSBmE+SǍ4.cH?.q9_ߦӱ>fnHv@c޽o@rNhkC~2?` &{J]TǍ&~Y@'oǢp_nns[:&Q"J>؇K]"T XNy"f1b-XzVT4v I:krej dgA~ \ejET^N% ,Lm]u0&ㆿ=%YMm$OT&;'έWL }YˀutIm:كXA^a"(q(D䀒izLkqJ I>C+Q6ӦI,Ӽ]i|ּFvgO·3/瓙6"%q/97D*!A])JI}E?>`n c&7J%43U^KY[`wc:-Ũ$tvx#F$;r? #zjvu^{bBuvoÜG%.V:K |(XL.f6]8<&>AxikZy e[&Ct)})½6Mxg-U#QY+-#dcj1ԥOlEDBAO1m*R ٩[u&;Ua!  j)G>>m!$ȓnس-) Z+1B Q:jնK+ح9 cu7Ue ˰~kIlδQ/u4 i!fXe //]:)XQQ!Z nxh}S['d{jiIyP{3].YBkK-;W%aKfQ7+{w2-_HDnv7t9 \pZz#?s(aLd47N x+΅G RBsh$MfT"]xl;F:6)JMH.JP1@:ڄd { }x7c]hU?$>$w'JZ?F$sw1AP`dq xBCoC  \ea_raM fw ( FA}Ԁ*Y!i#jۆK5Yi_| AQ3/xHO(ooQc1P9F%n&HySwUu_q(ݨn8ʫn kj."tJ"␲ hǙ\BX,sMد[:^J;-\D}WʀxX; N* x|Wcs8YXόL0l^;~)#pT=z)$?NH gC󵗝!˰/ ~zZ!Wi\# ZG@5pP›;T>o> ]'#\݃)QIC&DdhJM˦?ϏÇ7{zoR Af=j8Xw-ŏr2|J(`atXw2.ymӠ~|=툴d@af`gl "}!\r.NEl2){N1ȁ؞-*HS YP#u Ճu0ψez;RGE *^ƆА|d$cܯl--j$yzbyAEY5H&ö "m3ޠ2cElؒƬKFTm;mŅF 8S9;)h"T ^m*?ɩ4d941)mf HoaDZo 0vU#.ǃT$BM'%򩫋wT\rO]FH0v09?υiWu6Z'˩7|,8Bd5\Y/#z\5t,R3j>N^$g, Z]C?TĘ.E/7aZf#FMz^ZP 9 ܺq -{^E+~'hE)쬰Җr$ w=$7p(sZՎ~h9!+_E<<|giR`x{rf$D1Օj%eɣ'*u~p#t~='l3N"qIB%"{鞫Im_%EIʼncqBW~3ICMRT S1+cǃ T[mMɺoF ?)߼ݜ6?D:o4_öt ~6C䲘Sp=h2!.CWz[wzBl=AE9>M'.Y1#I~|H.4ى )7 |*AFGn;4b&41{(9[3[O+(JNoZ{`u+F&#Qʩ«J{C 0A)+H@ńD*7Lϳϥ9mx^8 .n܎4^:<xljarc'aԇP<U^j!wH m_HYbŘ38QH}L[)(fE}Nؠ0c,xǗ}gSOKyFGSѕ>&NT+N*pF6♸weT S4ݵ+I ju( /Sۿ5?O@v~џnOf kX=v!Q4sZ 8dLU.xee.v^!Z,G8ow]䬷r CT!S ;#}Si 5eC$B[FeX95/ 6㊜N\h695WaPEE<Juc5ihqȹizQTƖO8ݕU+u)EmwRlqF` @"~H4Oв):˱z;;` YQ̫o ' +ZZ̮CA23Op9rjשCEP7S&ό8 ]m3&r}2l^\m܆fx9ksԥmɳ{`A~ܞq1&TI=Eb*T%b?# n` knO!M{t vH:CY5 .*$wrF CIeYL^=[h*V|L k$)v}Z[1-3Z7נAWF$`>7RS|_7oޒ1obsgJ>mA#jou]\wXhf<ل0VGRKMqd[gZRPצ?vGk(Z1Fe)tn]"_aEE،_;XddB G \4'c@d Yњ)3H0糄߬7ҡiPs̎L]:o}ֱLT(4|cJdnLC ʧV6~Qg*.==1Ϝ^OB"7Ԝ^ÍQݯ4y3.O b1sZb撻J32y3 ]z#J?UZcx8sü ,]SN7#7JlU4@?Abr,P4nI(ӚVI qO jRVHhȻ|+A$aei"ױgL˖(e!*8j+E1ci٤GV'F䔿k[NG%,^c%6jBA,9C$_cAO[K.!Wj!:[yCMbp͙G$HUe9Bxo2-pˌXt&OP|0[n3zTYd@SCƃk?wRS ~y_ W%;sF[4g4!Y2[᷋ qs*ir(,K кйM6 +ybۇ å׬Ğlh8x+!vErHG?O).UcBwԿLZ.߆]]5C "aF.)fb. dvXY6'{~3ZEJƂ&=H/u)"qMR:8Kȱ#5CwP4R]U$=Auh88}M)s:x$0/vjʵRy+Q!(mp̈..Z+~AUȏ]9G^?j@bbw:%aٚ4٦pp07Hmon;fka4uF_/~He#Yz.xhTx$ e"jqs-E-Ra'VoU>r!65<6pO\+yTq浅~%;uoqtB^2\8]& xL݀@2c4o{O_mTW0LSV:D~q2N b.RhקpۡhB!1ґ am TK|PdXN9(0V2 Я b"Cz { -TpBI/.R: dӍ}ARB՝N(u ;ߘxȆK$$E] 4i^uY3Ǖќ6͠xiߝnBTlLe1mZ 83]/ǻ/ia"m&N}Vۯܟ9= d;,JɜDa d $q5؁r;n'YK-iLYחXN聾2(,6޸nnx,MRil{q*a_~1:/s:-R𼕖z(Ӫga)9sUԇ3(a;4OAi$yw?m}z u4Գ配R9KqƢA^ '|ڪv~ DWç;O2J[^oR쇽"nO? Ѫ`>p]*yk>2±J0`zy|R&=Ƚ@]GY Y%Fm-Py{߶ў`u1m|md?Y*wK ‘W6aIyN|AþE/L{uK\?bW磨,<_8k8>9/Qت@b(,]+°_u5Rp*2X;cwrb9pV[q%kɘz[+?#.lREUV nSBGV\~ɣۢ;p,\q\G!w!ԝ$RBXE{-O',P{0T#Nhʺz7@-(X`EB{FK=.1uGcȅA&P)Lg>C߼ gPh7v|Q=|,weGjײ^ gOXy޻\8:.e4Kܽ?2Pe}2.I=l%~mcY&dž]m蝪)8d ΣE tr4uv]&8H?w~ BE҈; ވEC.V4e*ߒqv"ʒt%Z Z{Βc:8 5ژGCƔEj Iš$!5.|u8lĭ"",nPcl@CI+1[6]vĮOGly5.&DJ1CY~ngT^VZ B}n5% Wr[iSC̵\@O\zԻ BaƯc{QSHs)W; WjiuGƜ\H+^wD ';@nQ"[nb.ߧ#u. | TÎ?>+o{5BяF/A"cΦ.>"t)!9͂ƜH#\N]Qz E_J&g ;^5G0(6K\Y?Jk6[1( Z.l"`dd@T1w}ADE9$\ A7+fDza Xv'w=ۇ.ȯ45=&3"U|U9}S ^SeII1BoӍVDP^a/]a)}EYࢀǹӜ<-X -;e;8r7+ 9PlWfiԭcw*o Con :a9\`j꺓(K(_y#po2K?<%,jv: GIEK~\CgL[2T*:z X2:h%@t)L ߒO&D.Fq IߵYq-Mb W/Uphku.?dCSӛ"8n[hD52@RKȲl2]\d]$9dtр-iUX-,*+ n)o%jx*ӸKU_ GM[{]lt:EK.L MaE.J܇fh#Rh_MvH,mhrw@p(o )D}HƝ߼Iu+WY%Fuƻvm|vR1ԃ> *8_miн }ku5d?5ԅ?t巟rxq9Yz^ɔ|ҙu _+14)Yt8Q>K[KDr KaƩqy>ׂI #Jŷg["+TJgi#>X'ħ B+Ⱦa3*+k 4}cwq>90pb{l Ql\ӁDY4t6ӝCv5YzB Y#RYܲKf)>3hO}C"o }'W:uH#ꞑgF0m-] s2RLɽ_Z#] )XuשiP[/ʫBdlr;4ݞRc+Bn"SzUy-Vaq28&ad±čRyk=;R r%(+sެdjځ"z ޅug^F5XBK7r9`a\s}{~FT+鯉;}33l<oIgl{{Sic_Nŕz"0}- .w˱ޭrֆ iG;Q2PG \ZU%0@\k 6+DHs/Hv|"K,ƊjR'@ g !Qa =;fAMSLm+.D=5S04}8˒XƦ {-,^lw~ڿRI7$OgFK"<5֋)HجkbP9ea,WSȨ!w^Vd_y8ZلSZ7VVlCmO毟9 kp͜XwIIli_ .`0~.М#*eIʣJڑ832ɨ]a!PN TlLFF@3Y-&6-k-] bKW~5[~}>2˧M-Śfj QvrN{ԏ)*ɿ`X;}<ImБImZ.ftԆ8%YzU-,_Ovi477^?aʐ*_VwMZ)N `h&&ݬliw cҋ5hHDH%FNT-D"*uGcRk&c#s%8'gx zCDD壔XA]L>%AfC_̴Q[y>=㱤k^ÛBǠK{D&ɊhxܡpLOԍlǾ;U}Zmز _`*L%0h BVUԎB^]օPi{k%%vfn*##Iej` GBaZD^0A4Ye orPtI?EՎa#D<ƫO|8$I2CV"^ Oɕ`š%c(-H$Wr8r Ml!-$G1w7 w;qG`S 1[}-̴`קԙ,xVUL2@\όAJIcIѤ`cƟՙyU Bۏaݞ7\ ;PܫC'Л/,E0] D4loo$ydy[F` ͆[?7GWne!Sbi\%tިR}úrwjn| 96eVJ傲Aڢ"QGLp7/ *Y,hv./Kiix#9uN \>Vm&ͲN7l.ae:\ȨO }* "s'ohL+mxɴɣrL=i4f 1} _7euC/-%as ˚^kIyE#1S+]#5#)m6ru[kRPE .vsϻΑ1-i|r1]C@rmɮ3~3Gd4h4`-.ciҦ(V˼!gǸh),x*S :YqR.S928?4m͆LMJZ%6[kP>H;6ٸ:կlt^m)@ bMQ.؛ >xcZ8)KiWs2>)j!&˫yP"Du.\#wn&Po/o1ذ>N.Wf\Y"㊼UMM҃ҤESNI4F߻[բs ǤPm@0ۙ)쨴%qER);&sq. ܰH+IrȭS}t>kY]ISCy'5v Ό6E)_BR S ,[So FɐbN-x5 @e 8aϙ{NlɄuT{Gu:czE6Hsyl-Ņz_ i5ɥ^%!Mp[N77L=m,IЅi,JRڈ7h{j"8 jيrQ|KjQ9q6'<zEN7u0W /Hl"u%} 9ۮ a#\TNsc[j=v$mW{/_=_ns ~F92!+`)ꙃ%=7 lߒψѱDgRг\e1oS[VqMUGs4x=ɛǣ.3-Z ܺ`- +ǰlVyMUp{$(TO_"bxUTP1w/hGO|G8iM3ݽSX劬Z;_]ۭ8_@DTu|/ݶ 4?d MPDAQRv~, njO *fٕ#uיTDXLUv @~=GNvy5vԵ$K흩 #˰|JlO;{ϒ1)>9hkd'ozmz!e$x=Ç8e6^]g/p0AǔX!J]Q%5u7w ED읜gI/容ΰ[WHaJ[_*u`s l ы 좾؁Otq0ųsS%7n#Wi/E-XGVWd)׮(0Y"ȮTQ1*rzFc?~pe "J{˥:![|Ntӣ:KtcFatQiiν]R?Fpo `{FЎ{2f{77hꏕu&h1(z; c 8'Th`2S 5i{)>GOb4%s$ko-#.~}.]=5M'D?)FZ&{6Vb2F[el4LC~fKpY|UL쀵Xb-v^{pghR Ձ)ا-e|k8? 15<ۜX둜'(-+Z6lw2Pȫ%6@2LjOߏZ!Еzp8z'1y''^Jl0}R96U&+ o[l|CS \!imy9(OP{0ڪ^RR<ؒgibXTߝ=J+3YՎrv(q꯵*RDŽx%Aa{_*Ҝ((okH5N-k[%_H`Owuʿ9}.l'CS_*eŜGˡc4L!= UIP'8aKv1̟5޾LaP[:K[@ǚ؅0PԠ(\̈́Z}ߞJި]wߴ~ԦqT&E J0M識?l]Wʎ$$X[4,W E"hu;&\"%ElXAlֿLpxၹI8 [GgQ$X*%^^UF)=>=dYq;(a $,<^E'*Mt~N v˄QZGDF)Svթm/+ΫK[CIZW&_JRcšqUmy"&J+aş,/[./ĠB 3v:#G3`y*ӛTf2wg 3D,LHZF(cLU}7PPȬkBai ݰ@< _+#ߓpK97O%Tư]^Ocư (TڧO$w7~'˖@Q;GVP&=RA+%m3}Љb쟃b ./[5N^ 3-3@zb݌rA݅A ۳KN˱W/k('.m1Pm<@n +6,[y JFeFDQڨ`ö+)&4/GOH`="RYgq-l7W9)' #cQ};|%cHCtǡ96!u3r6 }ھ\J8!j?oP7ڶRY6F1Q xjVjCe.z:=aWW\ylr5xg5pq!Ct FQu:Dkd3P𒮲 x\5/W`c=I24-p1;R߬n6H$S4HHč-y$$Jߙ浾jﶕe7H_]X&ӗCI8F03Rq䲇.1ڍ5h% @|2&$Ff(.WN&V`r<{%}ӄ~s%RbYYn!c9kM>Y#Y [Xm5؛~} E3DC?^ 22B#XݝpJQ,oI؍N'&r*ۇ2vJ%BYVW%j$!A=yK27.d~q*`jl6D۵Trò\uzZvූG.(۫cFX Dkv%#1l-dwe&˚7UUKJ+$\J zD"0hHp~väkVTmI/w$""԰HDt B0b0`L`KN} eˌB &h*vi_fR2=v|, EдPC! ACv\^P-}Z«0ZR>~6ȩt a隩sg o1>k!ai; 82qdoTO U KgV}@ٳ[?71Й懸wwoeX'΢Wn% 8aԲ>!`q~НV*,Ϟ3ѳKV[M1 w霭qqEЮݴl\ǯJ6Xn0Hy%7])6`~uS,Y!mkaؔrTt|`b@ͳobpޙo;.',IxfhY%c0V#+ǘfT 7atD/4j!59sw"ԙÄ(-&cR9S(5EN(۽\? *Ui/L^_m."y%®KR/Mj&օyzXXGIGwsvM45Ǻ&-du%Ii3`= ce; (WI2CHbTRPGR%"*Xc]qL'ִccキsU-aG8* *]H5``< w{} DozH~][~*(\FLr_~?:|4' 3 v$`\O%e$Sم-&&5&6 *@_hy?G~<3xF[n#֜?>qNn*n\g>v-W{A `~K@jwрCYh*~Fpt"\Gy Gוf ƦCm J9_3dsl^73Y'GcW N1<1.gG0H̊qV#ElT[LjгW0^sڡ7Lpw(lpg7Lx&پƧwNiI!1lVQzr{q۔ˉ{YqX,- GhKF`h (0;&;bUċ#s8"S7%&FIPK[Ŝkಿ?wSBZ匾"S#I̱SU"͛Ju:$ 3_^r9rN$RI6~5XwНڹW:daUh^3o2wxUy 7n]-N-,{)8iu$ CYJb2S͞+cEPn"pa [c\!$cL)g&U+͇L vhuѽfAdI^{ Ni4む^82XQ#XMZ5W#Y`vӆb& 0 =7 AU0Wr6{vJqJV }G?НxdEu^>rN4je}ЕHHJajĊёc ý$/f& -r;Pb /OWr]5WzVKY[4O37eg<~?9lDjSj!FCsY^W{ 1մ:I`db= w/w&tO6WS!1 ;b.vk Űu;.QJCRuuJpkA`Yg#Pi`l gGl( hx5[oM}T endstream endobj 113 0 obj << /Length1 2723 /Length2 28146 /Length3 0 /Length 29701 /Filter /FlateDecode >> stream xڴuTߺ=LHH74l[n;~ϽGϹPO5׳8Ċ*tB c8Ι +'11)]l􌌬"@#gK3lP0q#@;#i 0T=L*"ə ڙ[)" {GKs 5X~W-L629Y[Lryh F6f@ PSSVH(+)PӃ ۃ-@TH^U THShoN WNSRRcbdq3N5s@elFoLr4 h t,_~o @h$,%8 lw71οk+G #reeFv@;#;p7Д_G=6K]^_M@vNNNYwgvTTdgG'cGOzBQ033C*fg*vB-%X'gkk;YڙVŞA(%?`9:& 3-L`|A3#'pvtxO04q: S] ]3TTj)5xLf g@Ps-%8#[K oT G[#Y:[M-M,Q_f)g# ٙ{Ii-}s9Hk;K-AQRABA?abv& SK;s3;<ll/&Hwq~o&;A_ qD .ؿ#Ab0HA? ;AF8OT F\FFL`%X|S(p/?'AB;i׀2x[v8 6du|Vy\ xbY ~.;ܫE:9?FJ5Տf7\5q.6[NVF qQFvͩE)\{v=?%R$m1k9}*ҔRb#J eb[%:ޭ?@GHTDx ).2L=O5 Mc㲦gl򉥍=}␰573rZzuʆ\?㷹 MET8rR+ۥd{/zZ&>}@3^ bi.6?-vP{*lz^6ʅz@HE3z$P@K*s: D)G/o3s0z`Kl^2`7ë) wa4Xؙ@Hyi\sE 5/cGm!V[J=M(8.@؛Ikp&R{5.$z'k0x .lk3@)oU25SeddknXVC~B^sl@J=<?fU̯߱sЫtq4μAiæVB20WK|@9 )ߜ\ro.}Q5u!800h.x/]#Dq+CUZw}L٥"^"ln&{.86,A՝d{ABViz!Gv"91%歟h P6D7>.Y d&n]ڥ=Y'2mH=?e0F@B"KJs7.&mSmfDHoic"!v?uOjö; -'CB–eO2E9.^ьj 0"؆'idRkkdk!v($ݻ}ԲgfLf;_Y2%.{Cj&1Xmr\MH X߾:"617.hѳ| 5yOXOqzU$)NV[\I?dm*ukJ j#6ۇu9&M7 $!`jNܭ/u #|/^ajSleoZǖuCgTo a54S 5_:n}%W?eWE]4}5gT+AP9="]#ZU"AR`xr7* htNPhv}+ګc,̝@OT@J<ͳN7s)G;Q?䮼}|DUv4+]N͌\%GƵ[Ă*r^j.m:"̞ۺNSg6DӢVIb",C~q̾EH+6x"utG=Fi6fCBh,P"rtڠ=;|GɺVu1H4D'xnZ> _ɞ_Y̎(IQG4J?V0lr}8gv@r?-^E>49ÈTJ$&ݭ1wlKLO7/@" T)|XX(9|Czgs̝r w@(ccq]k愤#cy:ԧg MVO@(Mz/WB]* 22r"QBRw`iRi`Q}"0>QJEK[4Wv\d87Wr.tC|p2DZxtq&ά`U^2|-/A|Ejж3/kZvLt-3l?'%dW`q~*@cݗl#1ɊL/%+;8co?IMNSXtsFڄ7'N2>mWG uOr6|ES#>de$FfOjԊMI;oZь y[g/В^ X[khH]N;` ѩ5uڸUA•%@~@DLcH}U^Kǁla!g=\VِXR҂uħZ93Η5"4l>51'rh:N !GlGaj57kKn0L\57Fa՟LIwFJl1`oXn ·,>0GP&?CxzgeV68%G1U]so`nbruFuFܐW|%ߡ0oetGWlADo~Țܞޭc}GR0)2ՁFyYV;9үWH$Gu(qm5&8rP{/R/xv(X"=C#<=7+ёq#Hf%6xPڑ2>mY5nD.p !P(wbE m iq9Z^]u(e+(v%Lz)+qYu`E nRD9OI-uO^Z&6%r(ůeA\B* )11ϫ*=i[d:&Mjهʓ]NtA(;}_\@;dKݞlZ>lZ+c<1G/D?UX)L\q7 ꘂZ$k,I|N^fk`S0<非e5$ \ױ!U'Ƕ\%$k>zm³kYֳ w/_5tL)>t0t 86phLEJ&V]#H}$`TUָIű[\xfN ]q|yVhkĀȅ^:ΓX7ɯkz 2`Qx!{!ryx@-Eh17֩V} FM 'c;&_/lwDFrM{_BgqMAeZOwDæ} LN6 E*Ȼw^t!G JD{$ s@ :`j[[9e nhʺV1$ܟT)j63!z? BmGoLCL K߈kn UNVǎ~ec=>Zv;.!bKwݜnث9`FGV2CFשĺkgLv^?K^WkH=Z)Y < Љ\̽{77G$r;'k8sOQ޺t2l|2`Tl9CS hG^2tpR 8XaLHd1O‚,\P|Ҋ"Ӭ*{P * :7Gh&F ,)კ/Qp%'*_"Z4 F) ;]:FމRf㟣]>`O{QZvl:yz`73E>=Pƾ@G?<66}T<C$mc5< uOwefjGBM,g 3&w8u'«,tjfk@S!q#g3p֔^jhH)B-`h1zxVm!/kqZ1'^Z{ԃ>d5k3rr 1k{M/-+ctTth:5Z3'όERUL=BL/\f긷AeճCHɠY,("Ke ͗݇Եw Q=黟AA_ ,Vǝ#{rmրniJFŃhsB^R*3ElOˎSd j;$r/vCnhCq&6HZqf)g%9ԳP\:-cJƙC5}.ztnf]sSO~ͯ/|iS5 Q*۟l9wv?/WDR=#3E &/~!"RW2<~oN8J4%rp+>y~7K^Hc3{)*Y4]r9 IwJh&NWځ^qIѶM2".SJ}@oPr*9ؗ}|O{Fޞ<,{(9XO"0If ;6oyVSEJ4K#FpzmQ'};Ty̨Yɑ<Βs]j_@t4y2"%G֋\NMQXH2,L|.G@G%oAT,xw Y ΰ x$SefA[a3B }[GRm-g6SZچ;LW^Ty݅YΗQFY;N$X1 gt4\QmLeubbEwޅ!ҽy:hFJts5k9˃8?nf5Tjd!ZڛQhӌ3/'Ej0l%Ա(8= sef`pp{ȲZqOs)ҮkhAn5$<( ~6y`ѼMZW!DU}Yu`Jm̀J;w.%8⾌>$aZu4s67ߗ+o= ػXET*P)tG$oaIa ҭN@1wvcJ+œxujqP8|Z?P*5UtKh#XWbr\wXH气6J71>d诈c7^hH mgHw3bm|q޾4ûbF`3anE&SgNdt_;7;cy-T[D!*i"23#xUqGhnA%ϷhYut_Zmh!Gz*K&wϟDm U`q}"MyaO?í[R[۵4wQ$:晄SBI έZ=y]vݽ"ais\X G_7d bYRյVS^  i!:'K 1ZKAl>Uts݊NQZw6e P-ӅlߒZ(xo]z6wPI8һwU|?4$ r'r>KnRhY[Zs#oInΨTnXӌɐlUj15kS]`#ǫz}.!3 tԺ?M"ez!LHZ O*-v=Ԩ¬qFDdqRylTI0>.k'"O=,m؈sM,~#VC:K~[1/wLubdcj-1EV}ߤNCem5хa*ʐiՌ<܎ :x` :-HW99:-4.oVk33/^kMH3Qo<(^t~A)XezdS;?%>a'LB6\}` |Ga%t%d_E텡!](Jaŀ'{- 25gî De=^VApKP%8~SBT"cwT8[ToOtDb"N[mr߹e.rs?54p0T UBA˨|P`$nџwl޾[++-}]6J*L)U2(%l)#ũrYN C fv_ /PчUu!?I"}xJ2߯":DWNDL%n=0n۠"e 1 I'O.wqazr_}/i'Hξ0Cq˓?|l%tT${yNiR9VM{Xd'LT:~Vzw.D8g N4'%n3׼9ێx<7K5q:aMlq >~X8v*?"f&W:M8.lBvuim6:.C\tIUfק~uHL~Sr+'KiS y|/ߟU21L {g؝UG_8oIqKkᴱnSi[J}A\vRU5miL@ P6/x8q_G.w!CϐXdl~~T'jJxtZY:t+FXvrGקC7Wl9n4NhYfE5]n[A?:_:[`QptK\ǮIy5Uz~9_gHDoZ}&&GO;m[.0Nuؤf^"G_1OZZZ=pY.+EcTR/-k}O0 F>rW[R/h{1ƶUY6)2X[|AqaydzɻL֏U ls>k\L6E\DܚDmHĕk5^g)y"Y¡]}fv4«8N_~f[UDB3BM`ƝI^}}ctEJFƑk{ ͼ &wKB3r1r1[ţ`QFƿ6S/,J֎l@hV?~ ]@}88 E9oE !~ZZL(5SU3ց62o5Rk&m6*`1oY?D_2%>E6DdHj-ߧ)N0uš=vyg+&,j@Vn<#Lz7/3F\&d@8#<_B gPJ]#?3AU!fRܠr!|%T.VB?C+I$:J("ߠ V @t8"Vڶw7ꖫOɏQh 7}yN}f;^"aE2qQA!^b1O2"JR9HŮC=^?uЕGKj!x7B(I罈OqY3M+65-!(HTr>W%ϡ5#-t+O!n/~ nTyLG5ϲ 3%݉w<ý0*dg4]1JJN%Ԯ1{h#FS%i k꣝ 4(+B>a(%cܧUΧlD"nUOG?ӹZ..T:^{V4/p>C4_Em1+G{DɥL}93S֏þ5]vWXOuwW.T? WKǧ\W8.Y٘] )r8)B)X$fB뽃hд̀qa_,qcoӃƦSY3L,vרwbՅ;PkUvZVtqTX1ԙL@k>MGZv,kY~!kIe:L f߃'+1.Taf ;Hp C5 9 tɝ6dJ]ٍ"wW5"b݂q6HE?UeQr8!Zjzrbɩv&|A5+1^r]\UĂ>s%|Џ7JzQ B 7@tMq`Ţ#0{~X13QWQ?MfAPK2K ;iL.4yc# "HǔCl4j I8!;)z).ݮM x]j7F~9nL0D-jqER{ OpCb#G ^1 {CDu,| crk5*6i_!~!S:kRɜ"q_kB ytU1ܥOCdgZ_F pZ[;?E1ƴD̘`{xQzۮi&^f9%o*]Zh=xɾ;1}}]Vok.?] ,+C^:x,AH@ˮk=q O%cqk;}AʼnhZ2ʤƭʷ ί},^sZǛQ޻)_Jܬ\\Sӆ@I9vɸE<ɞS !/ޕPDk Sn"笹/z7Tʣ2:zbUAf:: } DDY-0|IG8x2adX zh.Zn8t K3Phik1` I O`3Ͱ[-ӗPY'{7wWGqNە(Mrӱm۶mwl۶m۶m۶m̼ܗYRj*{ӥG͐cߔpS07R S0=ժz3h5i fkֹ{Omx. >O^W jh%6S=sZ0i5A6ft7KX#A[Uoau_MKn\>x[6p%T̃pԳ•:ڜb; kHf3o/2y\}EAQccvܴK#1tuM,۵'P㖳ݷ`8AD -“yeL@Ļl:`, a)ŵ"oEs<-մ6e$Ht Y x@q3O&YxۼBWԫ{ W۰j )us 2.&5Qol` oqY<3Q$BBK˦@x}Խ_BƋA#17܁Z*\ .ɞ6- 鳓:wrUo$+~2ؔJ6z:K$j. "][[Z"\J4/r΅X>G'btvv%@6乺=1:ũ+$rm/zTnO/ޒd :/ zŅQ 056\kfkY3ȥalD;^_}ꮨ5Vh'PQd"v44ԁgӲo5`ӷ1 6\W<=#W,},Ks.}iC Xio[`Js[_$.L.7> o;Mِw|&$O赍&f 8E8¦<]$$E9&yF0 f/>%Imb ^ ~s&]Km"9 nb[Vi$L%*ă `&xeɢ7`xqBK`-Z?<w^/O%^nmEV !4 Tf]1pG)>f[G`3 4KH_1$AI d b5BMT|۹yVG3v]e4l|u u ې͌HKdl bcAELѪP.Q8il3gʹ\M>i~~~qHy [Ρc"@}bii^?vWiQCsM4*{lzU0fkS/ADN3 L !*3+\p-qJ +aZ1pќq5fDo?)V:|[~<kZs B~LͮzF*!CҨ]0Úѯág!knD&Ld!$uc"F.^( .5vtZz=-J- _Y C<͑"2xo~M]?BsCS(UigӛYb$쨇1pt*s%Ų$QƮlRĊSabf~84 `7̉v> 3w]:0IqT?xo3}QXWG[d"2m"HQDg_Aȗ[a:p SLyoj[H$/YY:zy?8h/k{p:G0K6-'CR0zvXFA!z62WǁЬˢahp,(e*?"ҒqNACءXGy7 [(x4$Q{sgrdysvZU^ ߬UZ᷼LĪ Juܻތ ;&@n$)GkʽM31>Z>0 "#46cᢔuN(LC=:?Dq suPnuu\͗o7eRE0((h t/[$ۜ~^s50qUO5 B ¨(xkp~MZ( L)JK;]&U«CYʓ Rp(}mN%EӰ~c1kɏgNl~򷺨3AAlXQջP3=a=Xefkwf{s4D,5YzEJRo~@s<4Mc]31@XRVahR_ԑHnACoo3 x+{ cĨ{ǒJٕGaڎU-wnkub?'+q_sIqV"wJG$"GUAT"?z(Kh}`>DsJGP7E?As< ݣܱjohdء-D%]t_$)Pዬ &KإDWԡVIbp#ޫSd6Kwm'Z7[ث\8P " 4KuЄF#XoϞaN<&, # {N#,'ՙ8|;|6-lZ,8^)O dVQaE2o֞*Dr ~gPlτX^Ɇqq(B:l:I^>8su@T4V˸H=kcBlr&MௌnySvRW!Yivp4K~Ѽ1/ק#c0i?ϳW<˴1N3^&@ gg63x&! 3JmGczkh!D.v.*bϓW a&^p̷% 4ͫnqf$ji/W)@.&vB|+)3*ֺ  eg!>V'EbU(O*@?VvSnObBl! %}o ̢Y2 'vV:?E,Xwȋs]i~ B[wT\jtv~:<!XBu`N20_4@~?EP=JyMˢ.xRucPy.YmG =Em3:!DCG¢y S5D2D ;B4~o?~d^g2 :_ճÓ2iAH{cxP@ V쏍2ySgX{&S4h%ކivBo[>\FR\ֳM5o˷PM)yxD.^֙<ۺI*X(S8+Ǡ?6X 3H 7+yF#y[=9u;-l$=߄&%" 6/Mn?Ĵn } $D-i i6ښ&!K:@A &)Y02aQ4x}.5Cn5Md@{Fs=^1;Vٽ`!D]bh}0 dYF앾v8SjZïߔ%)SC'B/S_"$V/ԙ jṨ* 'Nn1+ \{Oe6vͯ;&N&"lmX"yqH#e3+&ShzTԯJ)T!S؟6[0}`A僉$d3YJE{=>YGi.Q=bf*KeÊMـF'ۋ@D>@[kbpn ^RxDJ;n?VJۨא"o;Utq+!QW ҧLsΥ Ce~CH4Fl;RhZӸD8{F,cdڍL=Lc`6ᡔBeH:C nW("뎲SZ䑠\HF59Ò aE *gRnjHY]xK\i!uD|2`5ؽJva]CN8:F 1.89 M]+<+:ߺ{]H7iun{¿cemRO 8Ic'owxV>yd@FS$v6 CR"clrчzWQԲA/ `U|IN|b42}IPqftć;Omܳbwu=XIp dWq愆;H!canB-4)/h Z]>T钦i5 -JKSā]ݎ*A_<3˿8VEiTup; 2߹:,m(a{&ǤbY~2Nl^jbLj3bMd+"gJ`36{)01KzYo`6NҒy_à^pm1.ɒU-+I5,ǃ .&ay ]XǎF;qH< rgGןn@*S]_\K= t4Q{<ؓxi|J4 MceBfwniYk}key2IҦ72h6PІ""Ѯ:QG8 [ʋH]Gw:ѫ|F;pq,V{oG2bӤKms .0u$:q~<Ilɿw#U+ A($kd垎JV4बјB$eG) ?;#M̋ {aJm)P"xS$m3ȂbOTD2-V}uEO]崙 3ܯ GN{yQȠ2rs=ظpy׊;*`dd`Iz#RjbzøL1ތ s/>A^6D%BzX+yk:iC2|ؕ2#:\wY;sltl(BT.K0ŵ=ɇYbAv!j:]KoLh+8-՝њ/"ˍݯe ЈVŷdÀ\dNcO+B[Q*Q-?2jGLBux/Y+<8 YV Xjr2"C/-Pqsȡ'MgA y01hAބ甘wgt'R--W`[ }V)dEǍ ~~ BMO70M{/ dk'f㐒bTkP`pGdvnFV,A gi)QS`2AF;`Z+ϫ$5M͘t0<[W*ƌ <׶'"z .Mhks'Y~N40ֻ:5aKJhz.^%$;-FO<F N!<)aWIΰkfrydjH65SP`FYsv&*?$ŦAupDG)TGH!(FHwzA 9(d/a v| wp@%'d󇾨Dvs^& !c`v4jJp#qn#$-[DeΞ$o8D]c*:&)'3OT-|$9t5,i PVwN$OHUD3Wy/[ӛ[$#4 !+w%MEД+`̆AuS%P^oZ',|nG$ 5!d[gZ{Ĵ֢N,Nj [BJ^]b* *G4&ͽAh՛IxHҺO~\*,'94* cfaQk;ERQz" n | 2[Z gT;&:"Е"|8ᥓLZ@q)Nr`΂]*?D'Zlq);QIԋo?Iqp|x:$#_kkSSꭁ\.;]2PN-/͇AX4#>hMj&k~?_&1VS` S3 AgcR"G]y^spChӺs7V@՝~T(YQiyԜ̡!N9Lwfc4U] Kno'~:Q{2y>9Ԡ]L2AI3TÔ+dgnvpб4t݊NmdUX᷁-,h>NǡRbP.Psҏ";wbن$DG~*$N`?=QՔCh gxaSxt>*M~0m*j̓α{?L,}]qwڗ1xZh+ضs/JCE} >5;Y G:Na{RN7*oNU`Q{ᗪavhXV6A %uDQbM}a><-Gu9)@ǟVsk' gWMo3}I/$QYcnO3Fo$5wjum Q~MPbwd#d4b}M6za Ȑ4l9 5ri`UݖV[39͘oeJ'_ (¯>4ܵR6^<=p9 /^Eht|a[J |wmz~'+3,37\ZQ3rF&;y$uA#K"ڛJUWkKaGr {ub/ \&&^h9_}Inoҹ!jD~}@8`WڹJW@G6YuJ+?jpjD-<3`}al| ̕ܨvؐ^PTŠ%/O&l!5?Ã=Ε !a3TUu6!-XpC EѬ]O N.` %I,z3բR4p~=UKci$Q2Iұo|b0buI, 2[eFG K Wm࣭f a( )R BSclw1lO4뮣ai6k2qnD+n4IHv.f:GZB xa5Ij2SQ@H[V1b@)^O&2n@HU Nye@uA]TrJj<x) {n̈́ÿӭB;xS|967-`s"ͧ?jF@ endstream endobj 115 0 obj << /Length1 2156 /Length2 16183 /Length3 0 /Length 17484 /Filter /FlateDecode >> stream xڴeX[Cp'xw@pww N!Aww :}oy)Y[gQ~PRe6JANL,|9yy0(dlci`cba@u;YAbN@>@‹H oJSgwm"Le9ֵhmp~;&ҸGxn(?wXή]>%_MX?'l>/G xQQd| ^Mac }[l'PD7hXЙ3<42.q}IpʙA1UsY֞[FEOT= JCT* aY*ؕ*k90v"fGX az:\TBNƣpiCnofhVwEjœ.ˉaKj_`CX!W܆H~-xnJգգk>83wԖwu/ &!G]osҝvZҧh;%zC«&YǠt'6TuxM's"|/X;TTXBzI)^ ySz2{!Fk(n ;ڌA1]jx[ *߰U>.y@{/7_XV`W p6sLRl4 `=GvBM RB *}~}x@z=]sYҞ w:4ϗ2::),YYېb cuc<Ovⱷ+nBRR"/SRb~N9^k6DfcD2NUPCI򔞐"M})Hm F,(eUb$HdwZf㮡2i3*(pH)#R*Qo=@V>+j28ydr(*/Wa378vbM-:)QQ f֐u^~g)x"8z0rz9xDIn:jG@UiEi#8PБ^GO}a+pHS|)[t>sROallO3F?تA[K)&R;USbs/NzUX(59 15(,М";'!x2Z!S>@p_=+#E蕎^f/LxtqtNs?mPa2`b&Wn1Рx[,Jj|)o.uʢB-*vaU{HSU.1q 4?R &K_Mtr>QVmE C:8Q(:!4; A=oh$~ gǥps)[ : Ue{)ΒmzEF-n1ul# u):ue̟ 4"̓MYyMg@/M#]" .rP6SPh֍+@ }SSuxݑ^/${m>4L>b3S[p{!-RWVHIa He>&jTqRE~PJؘy͆T&9 O®W}[kwq\՝'a993Aa9Pbꗎ 0$%B_fwPLM:<">X%1IŵxZGw[Ӆ}W l0 v>D- T2afpPJD}5o_jqLA8A2M : deg(8?PL)׺H1.%ޙȨ+EtɺNWg-UJ\ǴwVqUoiO*U=g5k:U~G2ߞ&DW/W,=e \aqm2S9YtgL%4\ Dq9`'yk^k`+BzmA]3̐lFSu.a ~ms} Pa ){<=weqiė l j`9Vx+R2Y{'"McauYc&}֦MZR/w|TMS9$[Pr| 2 ډwA嗘LT%& MpދV/es!_@dBF$$4)Y#?|cUg[Cb ^F "8@䀐k ! /'ɮQp޽UnVgv/U+*n{@+xK`;֋=_yLy@¢$LU/dQh8_Ns ߚq)~KiߑL 47"Y5[.m7@!i<5]d- $LpHU>(zvӓ08Ì$x{ vg;R.ڡ7Rl.8é+P!IMd%@l0 FqIQFQ/O1#A4g9Fll[Y؄B-]ҳ,jgBCIij7 \>"| /?% x0 F>@b}fOe>+hdNԹGiՆ*F\}X;i5%[t?3Єy^;$Su/n!'Bsb^ܵOvhNT!t>/FC՞xPX< ZMXXK 6D Gə9S}B/tߵufU$i9o{tͺ*=޳\zr ͳؤ% vx ; E'B:fp(sD'Q_"r!#fX1qYE2ٳDO/=q7z D}|Qo^MVGrvƪ=hj U71S7ENZ4* ze!nSv > Tم6SLf5uތm j!eR| Twg5^sFjڏrBG6[7f5)U~p/ϋ6 OEgp'm)BQL@9 .w۟?RZ(w>kA~{𹐔xd!Pkp7B*sljNi'H{}X<6#:,%^yMA=FהG* !t*>=[L(tl2`te/V bp=lerp*QAuϺ/2%SݰdTϲl#:rQ/TC{K ER.![JWXc"qrAPZ,a֛]*zBk{a/=;\Wy!&Ii G,W$әW{BJgc捈эg06 T32KvTiѱ0q7.j|vS?фcJ*g2`o1W`[<QƵaR }Ym{C_13Rd)+~']&喘U^ebռ):GVn<܇'$.')k: gϷ֔nZ\<,rTL緛c"$mC?$3s048{ *v5q\7]!1zoB`eB!;}ZO`MzvIM] ҿz0)D,_v7|6 |잧u[4%~"ƘzCQガy(u'~\*kN+ddMY;mIN5)AgSQ@ r-نU#x*^- %3ƛyH"GKΝ,-ΦhDJoΠzl}B –9ދ˂FIqe8SB\@$3 fҹ^+|JFYNBr"^0evUm_3r,f;{!Yv(/tKQN*c⎰Z \aNe#Ug)b7tx_ CِVIa" X̕2sΎ6kVQmޫnם-u[!KTfX;}E5â :VO:*J-_" 2k$% ƫqq]Pl`PKWx#nP6ѱ8޹J-ݕ fʨQ;!܅wNňfOqO-lAurr_l\~<˻kN5 |m>d'r *Zۜđdm;rtz({ 蕥gRY(xvI1sAACڟ6Q8VԎDW5zLpB?odQd irD<&~D2Aj t,Y~xSڍT0헵Н _i~on>MhY1nPl7eQa&^1TQKaw.7?Qꆃ(A0d7f(x Ԇ*;# TgSݕH<_LOZfW=gnꐩ]z1&Еws.>5ۙvt/P)uZQ>1fBJ|zmz&a+߮AFywT"ݽN4M+l4r$[#U98%̍}%" }\VR{Q2?-8/)4Q_]swChK! 6IH!߾@Ot+HJ]'D;Tz/mHͺG$iV ÉΦo!F5Ν;2/uEZtipWќ.?~=P |5,{oJsa T4̖gETr,PAZ~c 0[ojG@UHL=9𥖥\7a(I'aT sk{D7T? 9ߤ->!A{!uȜU$IIc`FJ2swk<>>&Uwю9O.iK/Nh7xP' Xx >%2 Ts%S0 E^_µ9>nbbٷi3|oRk8>oWX.nԒ1LM<0b[~:chn?ݍYHµ%%mҰd)PnHO:' ش΢ d./ :$O~ Jh"fH#G=*$7Zg*\QٟR@V ȱ򓟖sikK"Hé/r G$b_3@ڑ` 6]녗YGLC E$)TQI -uݛϘrPJ$م+{! jJ>$pAk\k:'Ts/ǎ%䧭D#jn%)xOXn?FyzBFLþ$З+ HwU z-;)Q"}ۻ-ȟmFݫ;Qd%%_n`ʑyI$Nuj82ʚ (4|gFZv hy\!*b2MJlT_,EJ7qQއH2TZ Ͷ5͝tk8b d9"v'\1-! n=Lɘc'$* ~^6P->pPQNvdj"[{Dt$ӿfJ3 Z .V-N">H7~kLs%$B1!DAֳ-8YQ ը zSk.0͓䐬>ȁ."3u4kb•3s<H!֔&S=|P;FzFv>,!^)?ګczޤ"Y3qT&[RrXM?Dپ%wZ$gppyB=0fJs"d{|+ NrRZ2 @"XmyQ>Ijutr`0?&<&B1QN[;#'#2ȅ4תn;k ĞvD wHQ!XIV:+1Aזvch)uL.(awUthto.VN&ݙ푍FԗAbi")06) "PVcY,>] .5&<942zb=+ϙ*-": `eJ:&_aFW  V?:tb'qxބekp8D<`!-]`1_&NN?&+Qamdi^ydlfR|4 o]~>~ /.YPkX.ĩ .J<Ϻ٘0N[η`5{\S̈u3L"X;[FRA "Q܊bL 䳿[%( GA>C+&ȸu\z аyM-p41v%˧30#\Ε`#6Fˆ]W4pe hL.PI98Yw nGTv-"{?Yޘy+{o=ZgIao Os+p2?lW8w}n: CT$rDH#Whi=rAsigJv=T@<_Q;= ]&)Ihƭ*u m\:pʂ>P#"~%m@L.4*hVH~vngb@3-"ƄfڡKD,NH*\QD|~N.")S g~("C[_{#t]82+z W~<gjDWvi[0:nDk9$ic??Q6l!Mo:2˦IZr&Ēnj6 ݷP(ؼ-x, x;6'k'or MP^maeyv捛0*'O ŬK-o-v4\X*}L#z#q[s cO ]h2P4VM :w azkNfב?Dq~! "qI: cerzȤIW5>gǪ!ra @"rm:m˘g$#$h^Hcǟ+PpYz-pnu^'`D6(T'>CX8w۔ 0gl#.tV5,4]Mڇi pq9U]8G7d #mz0O:UC잼FF G e7)ˮ(eZ ]'E^N:_ZΚ-^TgBa{箙|s$=fjC;/QOlL8f828˦J8}OMd&`́K۬Ŕ\/)']yh=몋f4Tm${C K~ŚfJnuCxW~j6X;<\8^>U 4hf['\ޏzf}%.S)'(aq[$3ڠ%K[smaz3@IӾ4MPݙ y*2}m)4INڅ *G@!zCJbT²*螺Z!-Dm?J\5ܚJ=.'E2PnҝTt]"mEcC0gVTZ <9ʔ0f`D6b7$o?fH I-1o4mC+E BJxv @j^W?fйqK䛏N7.7=Am|ml.sx}=HFM$-XP NuW(|iZ^(e: yYQ%wV0[o;Mn}xhK[nw43=zT7:,IKs7rr'8?On5S6J) %eַo9nUB%ٔS{QS|WAց(IS5ea,rQ4]VL߮|9ODpc$1kX]GN{v ֋Onpsp'FH4׈_kĬ]O/@! 1b'vr;kJ~H4RmO9-{a.l ˸.w=F)ajiJFSA~@"ࢥ>m-(pf Ue=|N_ԓ9ٱpVDeݥ޳  Qᢌ//fn.ĭYsGU)BL? Ԓ\.AROnf5'k7Lt06'Lv%a +}H9Ce>_ćsbm"];jSWv# lBtg(V[$^~a޷'c s<-A{~z=ωGFߵȉ翮icGp_j/VYs!ziMkɞѧV_xk5y)՗ԪB1&,FcϮaW8ľeyh~ qx^lr 'Wz,jaY>pnXwJ^ʃOIB!Y҃YU04ckq4asӘ9a7s~⒵ttlOyTf=,aam2fS[("9szxI8.Rxݑ!DlzX+iO){#b>;[GW;yM:x>J#V2..Emgr+Gg 'x'\^vة6hEݕ " ^?BE!Z5Ĉth@Z_kE)0905L1zyh!Ujd2Q{{Vr΂xb3 cnliǃ=QܨkNs W)%/(r=[< ASmx=})̓$4RUik1ߌZݜpF/ FS1N$\tߤ(~s%) |4/Of 2};E 9HG4Llˉ5`!q ]g8KXu88=fҭNMC@&[mCI5L*uO_Rh<쨎6'ckOhx&Ϥ D؂-ֶ]j~bp„ nR)z ֜== q)8͑-HjXzY/b9}? 5O?dC_vC/0*3C?ӤF|"=?!j+W*Khi BT ]DTYn1Wؔɻ OR BZPN\+K:x6 (u+Y\7S12}]`ˬCm2y9|ag*݂4ݥ<n5S 9\PmdFK) G>8dzjRK'_BS5pS }*Ԁ"g0\ـ[QaB?U;=z[E Lwo;<)!!M/;E((r5僎ʔ ցSC,HБEkS)4ȫbP~#[Fx:vyG_-5) :ڪdГrveΙ*ҡ@rU"VFx_;1ݠz嘉AuNjq'ĭZM#)npިI6 K4pYj έY7o Mz#8%p$]5z95Bl{(;7 gFГ4_JvgRvdfaʚƘ K5-LúWhtùQ$հ WtBUԗkL1N #d`Xo[74k.0&"(kw+za Z;D0ːe )"o f & *J \z8\rؿkw %za`C<è"6(nR髢o@EWUsi)Հ}!ho_C?eEi72p= Է?7Rؒ~@!A@.M{< M#z8.ا"Җe_.v%F5 _JN_0FpA *X{_-9mt=yI厇܇2qJO4#hP5õ)()W31Y ƌ^~Z4_XCkT|[/f}SY`R˿-I960BjF iU,Cs"OOKjS{Hor$J\nc 祻N?ZPTva.-cI60fBTЧd}38!2 92UkRLamkVwh_rA5}a8`ia5y;r,Pyv\ 7xZJæO0GK2j  P|Nԭ~4E$ؿTn+|rNއh'sB $fz|P(nDB_ F q8 :۩;P*d_@%[Ddw&lvej7 D_jƻxg!qO4v8 >N1Jۼΰ"|>]g;95=d! W_ ꙺ쭘;yRn1cxl1Ii;kЍIpl*H< J nc]{H&UKH婾ivg]0<2 6/0 -SGã^ hUOasFm>k׳NEWF4aIKx"61 &ﳒō3^6X,IӾP <ݺ'Ck(I&4ńӠ)8 Sebkqd$"(akrsс  52 \G=\5 FvWŸ@QQY[3:IJVCT51A 2_H":N󵫯6ze1}~nAJX}(ϴN!+1FAA6brY0c"'yx]SKbc-]:%|AC!Z#F!- U|d2f:- endstream endobj 117 0 obj << /Length 844 /Filter /FlateDecode >> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qDŽ r Gէn8A{,쏘LEvDB``B9zK~;_q`>Wgy o.>ݫﭯAbZ%?6G_Nzy;9ڰoiܰ^]0zu\~3ݍܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1gT Hӆp1X:,p8}u 8alSM3?r>x\i"EܰpJMkl4\?ǚc:#?^YHwuprQF^odž1BЖEQ?1^׆ƨАԗ039+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrY׆}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *.MGZN(:p~7a?}]TyԟE}Ư%Vu'e% endstream endobj 118 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3FXҝA5(O)suߖcHQIܮQW Lڮ9ˊ6nK5NoغWi~r<d(Vu;_=85vѩֆu5CNmm悥+U=#)\][|, MHS"#p #>y| #:##0)%T\`YQqJƚ`ci|1Mَbo4m `2WQ/cW888sέ-./qJ;&\ k(d?F#h0\?Ipa]~9Vk?q1Bx.BzҬÀhƘ'g 2xk=6u2,bق6E0F,eL燆LY` YecODV3Μ蛳;zr֟P.O0{S3ux9(uF: }6,V|ƌV|gegV|F_+>O+>G|V|~+>C1 V|B|FB|/g)g1{!>_|&~'a9i0K!cB{XTK5;)NŽbPq> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z endstream endobj 120 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z6 endstream endobj 121 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R!ݪ70W?g_,ɝиYs{ ]7;׺v=ߩǡoݨM'opiT}IAu~\3;he?<{Q%(SVk-#&9sQ擾ݾk^!00j(+m$?Gwt>X.oTuþ{S_tpСtZ|I1?H/'BZV;ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCa endstream endobj 122 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQի C}͌6jo73o{q3fѭVO4cpuU sk/wOwquy_t}??p]AAu~\33cA}P>>%t;en>r8`S0Aj~vUk&Yos yv rOiHM0[7v,ܜǽJnkz~lNͿvt*amкq۸qۿ`J-ztH]{O|, MHS"#p #>y| #:##0)%T\`YQqJƚ`c2U{;5Ҵ!\,18"\aD E_sN[sS9)9^W$js7 GZ ׏p$uX}/S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7q/c?z~#袳rdbP)n endstream endobj 123 0 obj << /Length 700 /Filter /FlateDecode >> stream xuTMo0+J!m0U !mTto4j{zv|tv ںQf|6'op݅uM{}ugfci"Amƃ}>,%rtPRJ(:X'Ab~oںT7h uSӌ]Acq`sy̟M.n? D`އщ7+d~4Wj7vw VRŪ,ׁk/bxO0+,F )1!Pp #]QxQTv)#ZBYLt/X^r<1u%pr_d9٢PSi0@WQ_Uh֩h諵"qFM]RrCpt39Âж~j3Fezp888Q:1bc7~}Hq('bĄ>^m# &zd}4)` "H,4%!%AQ߄B[B~)ҙ́ _)M?DM;豬;kyoQnNRd\Ӎ;WA} zoZZgbT$Z|U endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 810 /Length 3539 /Filter /FlateDecode >> stream x[is8_ npkj8׼Ik'-2gt8$M׿OEɖl'{LU68KbJ0̈́q0Ifd%)s6eB0y&4 ygYꙔ,ӖI2vtAShJ2 (˘RL(pRi1zk@3.xNW2 !j F24-3h32f47e3eǤMCHޡ3A"@[j@d 5pߤn`!`8P'e>0L3*2o !He u`x=L1#d2'Fk; 4eƧpT@y -S?G 4;b&R -@B L[%~`pYXY.YFPА<qsLVHRMv46t! T2ċIoO页BCT:O"o|d}P׌?*Sy~,O\4ŢYFtj\P񼘔g!eVpLнB?R"-K2RR@?oVgM(?+ e5))=OSlܰ%G LFI Ȏjt,?%rHK:A!dFDxb"Q&48DJ9{X WiJrHAt#ƩS$~!ϏgSݻhO:˪jQ6_e5łM~6+$oo*bNN\4pgœqǬXf{Ʃc=L -d{ IກʙDG`G46iZ464M_1Zd<tw4}Q,j9~S 0?bm E^]_ `#rR!wR+z8Λ;+m 3 1rm=ˋr\UsjAj\T Lİ嵤jWoJ1/9ILy]Hbhq>\LiS(sM?,6}~O< !'-OѢ.7y->/+,\-bV7\*T|j >.j~>+>M > 1'%XeLWp,*/Vi^|t(~4^}@%V|?9fyt7Ev)",R` K Md؆Ҷ|Oj=|!܍A~1(bЊ;mޮv(fogw#3REY8󵑲XS4sVrcʽ__4}HgJrJ\R2TtTM 7|.b}FɪqO`B-z'˻q6orNnKJ~6&e7>UPHW>ҥ @WZvNo ΀mÇJ {80j#봱斬UG T4t9gC*F ,MN`:I|6'YV[yjOpWRd"5SO2PkUB'Z)4F׉ tʊD0#"#moBvteG؇6zhMڇ i;c^E `8ZSmHT2AzQi gʑ!5V3r[vĐ %9D"cRΠ +::Q:#:u)zXgH<ԄŭBޫ d}%au#tfcj64K[-v OARZ%Ej[bmFi_G۵ɂ*Eb>JI(Bߐ(sjKе5rZp_J*/2c-Y"^={cDE[4]dU9l Dm h dFi :mߎ*)$loڢ1摚\;" `UdXC*cRx4(SKHY($D;d۬ *mR)gH3CSS`~ XGX quj;1/~$և0g1|tI4~k'۔*/ߧW?Ϟ^󅐣|Z3)o# GѩkMo'E9hĐF"CibM1.eic\1oO%9_%eocxk̿ "J0W^t''^ut5˫=eX87,z} >pl%->pl#_7w3@Mm>x_?^g|op,r97_bnz]ȵ.?zDsQoM>]ۖqw̛W?t4-Ͷ7Z@aX_|(@tQЏ'{8/6]@89yBJ-@]B>j¾BBt"Dڿjk|!''O@ƨ4eRЭ)d[Nk)vd>Gd aqYl*V4!| AX*QЍq;Em_@;b5?+;_嗳U٬ OE ^-&0^V&Pw>9Zc>l#oihg0K F^/UE?^c"2%*}^S 6~,^uNM~zDɬA 2}t3ì$mpvA薆ѡ[Ƅzʆ c@i9sOZۏ"\lvv},XWko6LtP]Oosb9ط/ p3<*!omAH 4u$hv2!۳iWZ+t[ʞK{`װ#H`kJn!mvwi,]i+Yx#n_wջ*% BXqwa,^ 1eXn!FfjlJJ{bM5$h8WNmb{W:Ҟǃyd̰:ԭt <@PT3gݪ#0rX_~Yzy_Uv]]ײ#L_gq~uK{MW͐ŭ/W|痳bDW,%NĐ-!ǦMr^6;,Tbz3dVFC+PH"S✼})NfW5>)6 O_G9V5-hYy92ZhteT4,[.(.&9jt|2)q>MudGЯwgY?Ő endstream endobj 132 0 obj << /Producer (pdfTeX-1.40.24) /Author(\376\377\000S\000u\000s\000a\000n\000n\000a\000\040\000M\000a\000r\000q\000u\000e\000z)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000G\000e\000n\000e\000\040\000u\000s\000a\000g\000e\000\040\000a\000n\000a\000l\000y\000s\000i\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Keywords() /CreationDate (D:20230929154916+02'00') /ModDate (D:20230929154916+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/CVE-2023-32700 patched) kpathsea version 6.3.4) >> endobj 130 0 obj << /Type /ObjStm /N 2 /First 13 /Length 113 /Filter /FlateDecode >> stream x34T0P046T02䲱wI-.)V04 qفC* RKsӹSLJKKr2RA"~`% RZ S V\` &$ endstream endobj 133 0 obj << /Type /XRef /Index [0 134] /Size 134 /W [1 3 1] /Root 131 0 R /Info 132 0 R /ID [<25625E7CDF850BCF9E157D76F1287CAF> <25625E7CDF850BCF9E157D76F1287CAF>] /Length 333 /Filter /FlateDecode >> stream x%7KDakXs9֜sb?G-,-Vdb;6""'~ I0WDD B4l&BlCJʆMjJ݇\HVI) i YnURn*  JTDe\lUBV[j Uܕs[6>h?t@'tA7@ɉm > 0.2LB`ZϨ-ͪ\XS[W/҂zg_g`p?!ҍT>~]I6N endstream endobj startxref 190634 %%EOF alakazam/inst/doc/Fastq-Vignette.R0000644000176200001440000000311714505552730016551 0ustar liggesusers## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- library(alakazam) library(dplyr) library(airr) db <- read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") ## ----------------------------------------------------------------------------- original_cols <- colnames(db) db <- readFastqDb(db, fastq_file, style="both", quality_sequence=TRUE) new_cols <- setdiff(colnames(db), original_cols) db[,new_cols] %>% head() ## ----------------------------------------------------------------------------- quality <- getPositionQuality(db, sequence_id="sequence_id", sequence="sequence_alignment", quality_num="quality_alignment_num") head(quality) ## ----fig.cap="Sequence quality per IMGT position for one sequence.", fig.asp=0.25---- min_pos <- min(quality$position) max_pos <- max(quality$position) ggplot(quality, aes(x=position, y=quality_alignment_num, color=nt)) + geom_point() + coord_cartesian(xlim=c(110,120)) + xlab("IMGT position") + ylab("Sequencing quality") + scale_fill_gradient(low = "light blue", high = "dark red") + scale_x_continuous(breaks=c(min_pos:max_pos)) + alakazam::baseTheme() ## ----------------------------------------------------------------------------- db <- maskPositionsByQuality(db, min_quality=70, sequence="sequence_alignment", quality="quality_alignment_num") alakazam/inst/doc/Diversity-Vignette.Rmd0000644000176200001440000001557514450010605017776 0ustar liggesusers--- title: 'Alakazam: Analysis of clonal abundance and diversity' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Diversity analysis} %\usepackage[utf8]{inputenc} --- The clonal diversity of the repertoire can be analyzed using the general form of the diversity index, as proposed by Hill in: Hill, M. Diversity and evenness: a unifying notation and its consequences. Ecology 54, 427-432 (1973). Coupled with resampling strategies to correct for variations in sequencing depth, as well as inference of complete clonal abundance distributions as described in: Chao A, et al. Rarefaction and extrapolation with Hill numbers: A framework for sampling and estimation in species diversity studies. Ecol Monogr. 2014 84:45-67. Chao A, et al. Unveiling the species-rank abundance distribution by generalizing the Good-Turing sample coverage theory. Ecology. 2015 96, 11891201. This package provides methods for the inference of a complete clonal abundance distribution (using the `estimateAbundance` function) along with two approaches to assess the diversity of these distributions: 1. Generation of a smooth diversity (D) curve over a range of diversity orders (q) using `alphaDiversity`, and 2. A significance test of the diversity (D) at a fixed diversity order (q). ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. Diversity calculation requires the `clone` field (column) to be present in the AIRR file, as well as an additional grouping column. In this example we will use the grouping columns `sample_id` and `c_call`. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) # Load example data data(ExampleDb) ``` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ## Generate a clonal abundance curve A simple table of the observed clonal abundance counts and frequencies may be generated using the `countClones` function either with or without copy numbers, where the size of each clone is determined by the number of sequence members: ```{r, eval=TRUE, warning=FALSE} # Partitions the data based on the sample column clones <- countClones(ExampleDb, group="sample_id") head(clones, 5) ``` You may also specify a column containing the abundance count of each sequence (usually copy numbers), that will including weighting of each clone size by the corresponding abundance count. Furthermore, multiple grouping columns may be specified such that `seq_freq` (unweighted clone size as a fraction of total sequences in the group) and `copy_freq` (weighted faction) are normalized to within multiple group data partitions. ```{r, eval=TRUE, warning=FALSE} # Partitions the data based on both the sample_id and c_call columns # Weights the clone sizes by the duplicate_count column clones <- countClones(ExampleDb, group=c("sample_id", "c_call"), copy="duplicate_count", clone="clone_id") head(clones, 5) ``` While `countClones` will report observed abundances, it will not provide confidence intervals. A complete clonal abundance distribution may be inferred using the `estimateAbundance` function with confidence intervals derived via bootstrapping. This output may be visualized using the `plotAbundanceCurve` function. ```{r, eval=TRUE, results='hide', warning=FALSE, fig.width=6, fig.height=4} # Partitions the data on the sample column # Calculates a 95% confidence interval via 200 bootstrap realizations curve <- estimateAbundance(ExampleDb, group="sample_id", ci=0.95, nboot=100, clone="clone_id") ``` ```{r, eval=TRUE, warning=FALSE, fig.width=6, fig.height=4} # Plots a rank abundance curve of the relative clonal abundances sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(curve, colors = sample_colors, legend_title="Sample") ``` ## Generate a diversity curve The function `alphaDiversity` performs uniform resampling of the input sequences and recalculates the clone size distribution, and diversity, with each resampling realization. Diversity (D) is calculated over a range of diversity orders (q) to generate a smooth curve. ```{r, eval=TRUE, results='hide'} # Compare diversity curve across values in the "sample" column # q ranges from 0 (min_q=0) to 4 (max_q=4) in 0.05 increments (step_q=0.05) # A 95% confidence interval will be calculated (ci=0.95) # 200 resampling realizations are performed (nboot=200) sample_curve <- alphaDiversity(ExampleDb, group="sample_id", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) # Compare diversity curve across values in the c_call column # Analyse is restricted to c_call values with at least 30 sequences by min_n=30 # Excluded groups are indicated by a warning message isotype_curve <- alphaDiversity(ExampleDb, group="c_call", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) ``` ```{r, eval=TRUE, fig.width=6, fig.height=4} # Plot a log-log (log_q=TRUE, log_d=TRUE) plot of sample diversity # Indicate number of sequences resampled from each group in the title sample_main <- paste0("Sample diversity") sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(sample_curve, colors=sample_colors, main_title=sample_main, legend_title="Sample") # Plot isotype diversity using default set of Ig isotype colors isotype_main <- paste0("Isotype diversity") plot(isotype_curve, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ``` ## View diversity tests at a fixed diversity order Significance testing across groups is performed using the delta of the bootstrap distributions between groups when running `alphaDiversity` for all values of `q` specified. ```{r, eval=TRUE, fig.width=6, fig.height=3} # Test diversity at q=0, q=1 and q=2 (equivalent to species richness, Shannon entropy, # Simpson's index) across values in the sample_id column # 200 bootstrap realizations are performed (nboot=200) isotype_test <- alphaDiversity(ExampleDb, group="c_call", min_q=0, max_q=2, step_q=1, nboot=100, clone="clone_id") # Print P-value table print(isotype_test@tests) # Plot results at q=0 and q=2 # Plot the mean and standard deviations at q=0 and q=2 plot(isotype_test, 0, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") plot(isotype_test, 2, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ``` alakazam/inst/doc/Files-Vignette.R0000644000176200001440000000133414505552731016535 0ustar liggesusers## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- # Set the file paths from inside the package directory # These files are smaller versions of the example databases previously mentioned changeo_file <- system.file("extdata", "example_changeo.tab.gz", package="alakazam") airr_file <- system.file("extdata", "example_airr.tsv.gz", package="alakazam") # Read in the data db_changeo <- alakazam::readChangeoDb(changeo_file) db_airr <- airr::read_rearrangement(airr_file) ## ----eval=FALSE, warning=FALSE, message=FALSE--------------------------------- # # Write the data to a tab-delimited file # alakazam::writeChangeoDb(db_changeo, "changeo.tsv") # airr::write_rearrangement(db_airr, "airr.tsv") alakazam/inst/doc/AminoAcids-Vignette.R0000644000176200001440000000642514505552720017506 0ustar liggesusers## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- # Load required packages library(alakazam) library(dplyr) # Subset example data data(ExampleDb) db <- ExampleDb[ExampleDb$sample_id == "+7d", ] ## ----eval=TRUE, warning=FALSE, fig.width=7.5, fig.height=6-------------------- db_props <- aminoAcidProperties(db, seq="junction", trim=TRUE, label="cdr3") # The full set of properties are calculated by default dplyr::select(db_props[1:3, ], starts_with("cdr3")) # Define a ggplot theme for all plots tmp_theme <- theme_bw() + theme(legend.position="bottom") # Generate plots for all four of the properties g1 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_length)) + tmp_theme + ggtitle("CDR3 length") + xlab("Isotype") + ylab("Amino acids") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g2 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_gravy)) + tmp_theme + ggtitle("CDR3 hydrophobicity") + xlab("Isotype") + ylab("GRAVY") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g3 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_basic)) + tmp_theme + ggtitle("CDR3 basic residues") + xlab("Isotype") + ylab("Basic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g4 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_acidic)) + tmp_theme + ggtitle("CDR3 acidic residues") + xlab("Isotype") + ylab("Acidic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) # Plot in a 2x2 grid gridPlot(g1, g2, g3, g4, ncol=2) ## ----eval=TRUE, warning=FALSE------------------------------------------------- db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3") dplyr::select(db_props[1:3, ], starts_with("cdr3")) ## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- # Load the relevant data objects from the seqinr package library(seqinr) data(aaindex) data(pK) h <- aaindex[["KIDA850101"]]$I p <- setNames(pK[["Murray"]], rownames(pK)) # Rename the hydrophobicity vector to use single-letter codes names(h) <- translateStrings(names(h), ABBREV_AA) db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3", hydropathy=h, pK=p) dplyr::select(db_props[1:3, ], starts_with("cdr3")) ## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- # Translate junction DNA sequences to amino acids and trim first and last codons cdr3 <- translateDNA(db$junction[1:3], trim=TRUE) # Grand average of hydrophobicity gravy(cdr3) # Average bulkiness bulk(cdr3) # Average polarity polar(cdr3) # Normalized aliphatic index aliphatic(cdr3) # Unnormalized aliphatic index aliphatic(cdr3, normalize=FALSE) # Normalized net charge charge(cdr3) # Unnormalized net charge charge(cdr3, normalize=FALSE) # Count of acidic amino acids # Takes a named list of regular expressions countPatterns(cdr3, nt=FALSE, c(ACIDIC="[DE]"), label="cdr3") alakazam/inst/doc/Lineage-Vignette.pdf0000644000176200001440000056207114505552740017421 0ustar liggesusers%PDF-1.5 % 12 0 obj << /Length 1343 /Filter /FlateDecode >> stream xXIoFWl܂qC qaȑ̘ʼnf$R\qk4™vv~~^Fq8A#}g:\܊?EjqSTe]fU9n0ҌyVJfR6g^qbߧ[ B0 Mi9Tz\_'qEڬ,X=Fe̐2A 8A8$[`ȈJ3Xw01ц  @t Ĕ2޻/XJiT1'o@Y GT+oBNc w|_rUWFn"^!ɫ\a}[G.=jt*3w/vq~ /Zb2ϊwCX0}Gqi#sL#yKxXv7+Uˢ+{^Eʺ٪N^ngh-!Ĵ_M vPC5nѦڕkYX :8(zV*mGmɽMp(klC4:b) C#]6B=" C6s3=UbWj[Љaˁix 8X)#Cx'*C7kY]ڬ̨qD(1 tP'(J$s yX{aQ@=wz!u($U@]GdS{ 8(>)RW֜-tTl R/(Kdt ޓ؜s:Kr̭A>ȳeYȲ}bKY k q|J׹,OMA4E:F"*d((_M+p k[gx[BtfGjiW،=@robO`T[UA=!}f)S7,X&Lj[SF8浨ףkvF=~ާuCq ぃ~Q[k RE]fCLM6]-w"c+lM7Ngfݙ~ {&kd{Tԓn ~/I`el9~=M~ۛ&#,: Ua@S% q endstream endobj 37 0 obj << /Length 2673 /Filter /FlateDecode >> stream xkޭ\>h$5K {Jb͇G3;CJ(wZr=3C]7/|ūt%Ȣ(XlVIJL\޻v}Ey~m盿N+$"/NS|_M8&MzUeXޭěmݘHa[e4 F56Ucetc i7=~#R <r}f#40( NDMBf,. K @יon\`XxDXX ovnt|O7PcTlBvl&f@0:ǭ)Ac)@Q$h^jt[!awQFCm\zXrnM+IMSdM֏̰}Qΰk{3-@Zvg<;+}D$YFn:P(;]Y[U W$#@|͖H1ᄮTёW;wxh.Z2cѴ}9Y`L6̎%S" L`>yCj `em=+gXۦ͎ڌMlQH**ES?ovٚRͱHJE*3G9~;S$uNO "/ <NOд59=CYؑy J#H|%2fQZ"2@ 0HQ: cz}oXA #7!#ủ-`}uBQ. HN=741>n;3,@E8Yb9 TA",][$Z)'EL:UBTؔxeh tG R_ޖtޜl'=D:O4U?SSQYǗ|W%2l2j9zIѹBD6h2yʺu:ٮR ?У' r2"0Usl&WQ)3ALA}>c.wg3dfjG9DyXצa +:(O]7P1k(WאT߁=qe>i =zд_}BQC%LËn0sأ j|J.Ѷ8O,{ c5RU;H@"IJBL3YpTR;TwWE6ځP׿=05@:mY\ 2;Celv`Ʉ߼3vfe&E$9+Bo1j#iU @X > stream xWmo6_! B^u&N!h3/*ӎ:Yr%Y<ږM( HsǻLC>O4tj%ltzS?! ufK2D$ y~jLU9/dRͮN7(7ؓz~bQ,=|rq;_R~j>}/b[kx`gG&^=*"fEUy{"ӵ:12tNCj :ތxEL7$t5cObt ݓߐdn1DVy&ݧ[+oVnY3eYT'9cC'Azt@ERYk9<;85zwY0)xȟL{Au(giQhN!nxL`T"f򋵿o.= v D bo)} #a ?>F 0Χ翅c^Ct4@ȷET^,%nzCDR"$㽯S$N8<|r݇)Mqz7u:b'!#׮,jpPWyD-Z6."tgDo|#ܤ6x$2W> qľ8˴-3ʅq(joBZjֲoc5ՠpx3yVW¸Ԫe!D8;^1l!Wvdͯ|6܏֣#?ȬFfag`Wk꼩F[렙o~U(LDN!kla#FX'}`RjuZ9(U[?̼0eeUX֏8R)Č9uck%֕I+(X#kb GaSdSmfи0 ue6n>Ftw'eQ!J e tq%4m݂',QƄ/ l`SN>蜬ҦW2ʠM{O0?4fu謧 9/vl endstream endobj 40 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp4qqpqs/Rbuild915ff495850cb/alakazam/vignettes/Lineage-Vignette_files/figure-latex/unnamed-chunk-6-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 46 0 R /BBox [0 0 540 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F7 47 0 R>> /ExtGState << >>/ColorSpace << /sRGB 48 0 R >>>> /Length 1553 /Filter /FlateDecode >> stream xWKo5KظMiVMx EP%h}Ι'7 .? baXk-ő[އwb%^?ŸO?~9$߇CRL)|}2 kĚ}#ǒ[w!\yHJK$4Ȉ9Lz @rd2c*%QQI5lc<+)jMg,IC6F$ϷLw6]t{*.+KlI1$@#qj 7ZD,qgß*ǥ)!Xfg <CLZ[0 B5 Iő>V Y`: U&8 =1K1ON lӽR=¾'YDI̖2T_֪(VudOEk ېR}-V}s0+ҁ>mja:=wλ6j?6͛tRnنvFRot`;}R5/mqHa[ <Hez Fzcn6dM76O5Aɂ+7dt`W_@*ayBZT&Uu[Nlum6ONӁ[57@;7Rer>Ǒ:2F'Ve?﷥n_l_Zc ?'>gv}uqUyvnq*i.I 4 yߟ#C g]^~ޝ.E~"]7r!ɝ ^x i晳SI/._|۷_U'E endstream endobj 50 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 54 0 obj << /Length 1238 /Filter /FlateDecode >> stream xXmo6_!d+ cCQ/e@iuͲ`,ѲVJr%{|QcvbI Qxw<gk8˩a#lĆm1!.[rlV"#j8Wzhf6M~6)rbDBSJPhB1PI|egjJr(;L/KD95?k+U!Q`z"Y_~"[&6z 2d|dX:J^3(v q 0r#Q;ڜ3LY Ee*GvtֽېTA긠y*EUɄNFbcU7$)x #WQn͎{-TdGiGpõOے.Ҩ㱐 lVG [լj껎a-ve}k{c^Q&)EQUQ^&Z|WhZdMӧrXuSݨI*ײU}-6LRnBSVWR׌zE,+h|ji׬,\mm'HFG.nN3͈YYfjv Q;krhrmC5z?=n2V%zi̋']ߞtOzDX7l&|> /ExtGState << >>/ColorSpace << /sRGB 60 0 R >>>> /Length 823 /Filter /FlateDecode >> stream xMo0 <&Jq)6`KV4G-G{Zz"mgQmT/=|CweMUqsï4vwI{昕2d \PeAH,!U& IĬ䠒-H5氅 uv Bψ v]ǰ{2Mcw/i,DjIh,U><4wWV'Tfgl2uXBR>Z9y)j{ hgܻnՐXbrvŝe heƱ\hh)5'M"e&͐K U7h,! HbF)B8v:SoތM~_D; O5(u=|&~J(ބ'vLM XDgjƼdO2ZV>cJ '|10̀hmL|i2zx2p%/{iDײ ~rIj ٕ3[.^LN&Ct (Q|SF[VƷIA0B<6=iqiLb4DeOyf|V~pwR56ѡ|<{X\?]{׮|\ĸ ad/#5ugSrÏȩo"5,|` pF ny?YyRՄtAgb`Be8IB<~GtBBE>> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 66 0 obj << /Length 1526 /Filter /FlateDecode >> stream xX[o6~ϯ=@È:-E=tE@˴E&5]z;ȑT9v$C:}ByG^{E~x(N >ћɻ;C`gpH '@;]Ѭ/իɗ野 m} ѣ `1o^|:KFkHf˚[hMVJ ^1s2̹].R2Y YۀGE)S^U|oVV&+(4T䂗Pul3avnJѲ6XLWˬmuBmX՛CY- q@7YeM+~tH& DKalZ[D˅%8+.ٖsTwA4M ۔-&Xm|s^e04Gi+tN˃ϣv1|Rn9V'%A@Z%w;J1ؽV?u .@fBmK.V&^6&Kճ+sZ2 Q_ ؉0X;>P^ b T}]OH6JQŗ˄B!Ѿ+[Qq] 䬛6 O{*ޡ)Jp3^V${q`Po"gZxZ+\a^ܥcDr P2 \W8 $u`_Bi) ި rF`Y"6f<*uSOvʥ5kطRw+Û C@nHwb '$ [*JW&ZQpRأHٺbW!0577 v3;89 /]I]|@&aiBP^+=rM 1! T ؉kqV*wf!C{bv"J:pјUX*Q;1ޕG(^0"W!ܗQ> stream xڽVK6WE,.zMH!Ai[]t$9r([td,ręo8> /ExtGState << >>/ColorSpace << /sRGB 75 0 R >>>> /Length 346 /Filter /FlateDecode >> stream xSMo@ﯘݷ,U 6`mR#&C~).4r؅yoe!ao6=- Fp+Ap#q{vE!)\&E k菀'f 6R GԵs}W~KFCIUbR8.n 7(%(wA( UNťNqf?;W4N-)aRYr\ts 5N IrI0&olˆYyMJ0νJUlRbAɥK%nWrqjECwҠ YEF]z:蝿Éc5}0ҭqҔ]{ endstream endobj 77 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 105 0 obj << /Length1 2096 /Length2 23972 /Length3 0 /Length 25266 /Filter /FlateDecode >> stream xڴuP[Mpw!{иww'\'CpK<3W4\kB/l 2Jxr [#;fz) Bhl 3r8-&&&nx $h 0T=j@ Lol 3~z{8Z[8JO'ӟh5`dg ag(ލjhadcT5qe'*. "&IVPj*Tyw./*$W埲]oif ۿ -y]@ 6St﯎@_q3}o_ l @h$ע{+߃?9mp_rJJr[#K;gɻ//Д_QG?52.z2]Oo#1#;/? _3KN/*˃޻c|br<.&37}HLEA瞧OO Gjk;Z,LtŞQ(-&m@gX0)פ131d03qz[_=\gG?9&C~P.mgpKO'dg03*߇3?$\lll2oqJl$a4Ut6WWev6zza;seRslұsg9g}MNN=()"K?򗓸 0rt4gzvv'(#=` 09"L"N `q&VE?`TZ!zFoz4ۛ齌?55-ﲬllFwvw {]{]{2\2\2Fwwϔҟ!wXd ԰4}Ag~?*@h'=гO3;'rzWɿ..os@w <Ȅ7*1仏xT)7q9L8=`F /`@tj]œ,U{7{uNSTb05`U*kOl&f/-k>4hgY+pVswDyj퀑nFC((.-i-W֠/nR<7 z_P`n)΃\Dlc!Ⲣ_ ŵllӕ̊+=I? ґ?9DV'FQrv~R=8c=l|oP}cFLV(SaK^M 9OHK!ƌhqZ.8ⅾ1#ıf.lj؂s]vV֐ "R$+rA7RѢɿ>)Io/}b>0\O犋IΧq7N亃 gaVq-:s *;l3g|,vl>zyk;8 4&#EV ŠPhQ\9 ]Y7Ýq:h ɚ:-s~3 PA>vU[%dPach=J[t EO ےOw?ʷڇ~5oJ9AP𴒿_YkQpbͭOk.hFIR"-ⓞ&] ́ݏ4H!ua<<&ԿΗhF8)8E$3Ŀ;x @AB0SLESa'jYX>XҔ<>/;&Eh?+a?IUe%4q,=3Ж|'}E轓ˌʬuTe}5hS_\P R(c #6-J 7V#aل~TV4:fPt"[ G%~7ɔY|LT5)/kwz( ^`Ndz*dY\ ch@ݾM_I}s{/x^W־G5ۦ9j[-swjʭo7ա:coJ qaL‚,l"֢f8n9Yv?GSp=-+=5y./}-~qiBP6 ;#P sŃjJޢGhp kltR ӓ(N+Զnzcb@/ZEeX=5?̕7l~[$6pm*횺9V:Q jD2Kq;<:UR*|$(aeœ:艫/H5s,R}L$uڢ 2?Fo*(PT n?hyQfX)kEY'tc{3YLzLҗ\v&do |žG7fޢɜ5]t/5E^S#jjf{&(XX}=C >DCCDx I>-Cn0T^yXwZY?Ժ3Dx~Xh>~Pb)u:1`F0bX̳plY|ɗ|9 v+@ UЄ2`2b,mOf B M#=neV}LUc/O3y"ۋ0Q"zAsҁ}<-0^7F|q{ V9fgKxxG"{!r ,jc1ϊj\{oO[2 $-vWS)rzGf`=gr*Z7ſQ fn~o^*Fm%۸7!9Ut0ؙtE{kVJ䌄Cߨπ{ڶ*gˌ1Fڲdcnvm?xfk Cjujt^ۡSqdN[5Ge\;َ/Ћ(`{Aj/GuwςBcvA;F[<yA˿E_#dz[dr5~4lfpQ^r >cT৕#sqP+qђEõHtiifJr쌈3$)P}DxXJݺ;&.emb#^[wߨLj- [n ;g1G s̡ӼZ0.[\tZ?z j5w_ hZ$xx\[W@c1us1L} y|:("}8\G7Uv݂H֮gM$Mf`2c|l~L}ÝHO= O{B9™r9HUaQ9)':} @ ,[x=v I\ǀ4aOT &XF>mr|J׈K SHoSR#oA3thr>TZ?DLdg{hɿMzoL>\rqoB¸CԲdd.3<s36NIH1Xܯ}{1 :Aiy[H>$ $Дi: k rE:/gw#̋_M{B;d=p0_%|DKVp\ -R{ЀN/Em&v1Aٻo+g-yan}Ơ,df=U멦`@_FGKmy\{Zdl!g猏CU1D_ ,'?n<RrS6/tEġccd+c§핶/?jCB)x0KӃ㪹1(QϐNU6N?tE;W pDmEDqM$Nw5N`ջ#F?[7-(rHA(iaʕwр9hq]TF(>##ȣd,]u7:%S # [-nQf^,qgSR<}SYI.*#>=S-sEmj?T%<͚+AkLՃ!.G@ L@>ҡul1} U%t aH3+d7^'HҼJlNx:Cxٻ{WDŽt}pם8=275RϣOي8p=A1% dQqШX۱o&ڂCH=ܜxͤ3Ru7e>8iFZXUjFY)49ä#ǿ!'0ss?8<;GwZ03Wr"B^ٸqQ,:u i벜4̪toc v"+dLK@Vc.YqOX1M2Ƌ*K]uob $|&`#|rCqbZIK:)J[)\VMIp tlyg?{I+N!w1pPEWMX ӡxaƦ-+l (%Pyōub4@KNOrA}@rDh UĤ,0MI_kS^s4Imj7!"(ܨpwyJVs wBlY}/x1P|傯Wqg+TtY1NK*>ZiYfcP(? ؕ]PᑺعAq ˖5%WOUUk^[}#0>Fgƣ?Ƽ.FY1oëː _>\暮XC2"R^ ٧\e .J*U>}f궶YwDΏN0^Aqȕ^_AF?>_Tĵ휪ڀ 1-&^3TP=hXn͓?bcnF6 ja[OMFg-'aM^mBܘ3XK #'UO>rIܢ)W/ 4Pvj{ũ5^U=TOvxh zc9/|ns<2^SgG+|cLඏ͞%u)u)Ɯ3oGb"1r0#0Q0 |KB ]M;'YyWjp;B.>㫀^O-i~W5JZ>o/%4I)rZRۖ西jvPV=tD}mǗÞ-%/;_eDerzu<~HhVrxil.,]d#u@p43%Y!%ϩMfADzr2dˈ+2*lO%gH?k$? *b䣿gMƤ[ÌJʝJSz^8;Y4]fh+ TxK~NmW`ΟI?B2bʰ3$a+edut"lN >A\he|6n+82>kf٥^d-tsqufа?bz_O,㓎0XjsԬwQBP^&h𸿉S@cV׎k8}>S+8JK̾O+e$j5vt^BֶK-TDjvn#w~ƱÅ;<4N-& 5|T]jbq6!)I@9l^N}3TRX"Dy$\/Qn'3`zx9 5+``2E0uDr h6Pui*,WGo!1SyDB JdFJ!Qh+whtZ$-WU^%Ҩ䱩L@Ո*ߓz*1zG{6M\dĔ؂2"dNda<ʥ&!5 sS@k*G.5BϼzԷ8MҞwV mu+˒TY=^3J7DUke3sHn)}+([ 4|VyA}Z~I̊]>t"i9u[~*Z^5,PՔzvY,L:oiDZ P)m6?@.25|w6[c鯣ҩRG j+6'mC4vMg$Ӻ ܿŝ+ T2ZD O흯!3A>YʫQO`[kjuxK=u~Xûڵps JƤ|Ɠ_{c"0p, ~RVEaP:P ǢnYhy}\jhZgmK7B`{㍎8;R᥺8LK4Q = ޹B)\c>?8[(TCꑇ^#B/&1iX2Xl2pb.e.:ůnzĞiз ҹSH1}gĝՕ0 =50 #8dEemdw2 pMH8<1^]VjI_sqx1P>ܥy|(Pv?t 교TŖ6Po:3%00hOCN4@s␵"=V0i3x^}g$ p$u"+vDzh33:smdΊvՉm/"zi*}@0 6J3)Ӓ 1Td0{27qWn@p4Kv *"3.{/ l꛲ ϞYn_Y3_o٪W31ePw59sإ/u75+|+ߦ*bdzPUsouVSxFy<_XU,!F ٯZdRm+9aM3']7HG)b֗Dߡ ,7ƗG3@~P3:2G-/'vn}=ھDYp5MX_u‚7ÕEVvT^Ì(W֋K[X[o}Zb $od`QK/䇴AS.)͌G$GIV}7ZcMCV6aҹۅT[qs֝^e:x$Z=( +zLQNd&$Y)򷤿EaHD1V͞/}ß)i@+b:-ł>|& ӆw'0 mzYDPh"sNe{Lg*E^7]qrڐ[0fg mm@ɍu5XM95b:N5+kf z [~xBDSt32*eD]>/`ky᭺NRwt^C8_H8Tl?"߯b)zIQ+ jAa N\8y&kDPE`!"Yt e]Q9[&eFF ֨zoI]3NiB4y[t:nwA=FDGZiL6}O lh-O,&98v"}J9:M-ϼoi=y8Ck+065giﷂ{; i͜+K̊ᑖ#^hIJ$"('٨!CF cK~vlQ}/;nC5!ȇ@Q23o!i3|ġ[z!/pGCINoȷWEA8D2L+5Q**{BjvJѐ_?w Ww%}q* buPx4AV2`Cǝos4u-wH(܁~P¼ddM@KB:%EeW@/1׶*mE,eG[$D(f0WAq1Vj\>uE"饩Zcm^ Cl =+?$wƜgt/xv@YIDKn>lRp0n5BfF {]yy 0CMwɖv1 YꠗOL IR,\Pjᚱ6:JYKpL{=,׎~poZ+V9A]^mx%1_tnrZD X[E!niY4}Di܄c% JnH鷫539V_ix2Y5qi~^pf0ϑs0 NihEA7! '3 &[|-2ȴ>t4h;0xoo-¬/W&hwvbT4Ĭ$fWMQhm^'yfG3bjѪ >BXb.H\ĚXkɑhͭw~-;(AD_(/aUZx,̶cA:*mqͺ'-ZkEZP/`DoNqTFwjgExCm% {UtTcFJۿj6l纡y7(#HGLa>2ìf5Gq1;W>X1z~g@yX9^/BVLpT zXL5OsL[bB;4( :Q4SH}%X ۳=J[kgVJPP6]\1txn7B!jJBe]>Z,o.W#aO!nDj CCd%h IŢ= Ȍ$$PV_!c3XlN<%h5Te<ݞkخ䅩(缳} Fw?'z)ȜJ(/= ]c)O Dß<''A_N"J#wmOhY&Y,鹜 i7i{y5)F0P'{BCDD%$v@=\L/rRwoG΀Dzp;I,pM<%9XфپXf;s&w eiQ#5~$؇Wa[[7ku:97+?ܣRbz8qR=%\P>H$EMja3e]jj0^o $#x ~3e8.Y)4XQkT^8)2FݜQo#-$?m\@Zn :.AD΁ gD kn\QXӣ8nёB2*њzKͥZNzx=];×.h-Ā  77 7!j'pl[mgeaLƌۯzKgl|y%,PGnyrqR;u8ذx uСf^V ²"Tc|ÍBH\4IЈ,8 Wۮܬ`()Y Lr7ؕ^Tf Tn oC]k$XLM;q?P$=o z%=Ctdɡܚ>4hka}Ъn傑"t3ܜH?[](oCˆp3818Njzi=. 얲n]Bzŏ!Erߨ1:}_>g)H6k>y+7U*驩cvz ,VS?ȌG2q `>U6t' s]"^_X0Nd[-8Є3s#_,h)Pibiͻ< b܆(~,NDHw*-'nҮGL4?uN {̌.cGLϖn2AdG(9c2v"Qo.n{ͬ['vC;)eoQo~m):3 st%y{1N3Jc ,Ş_n3Q%0D''Rk&a:XI=_2ob)m`Z,(4h0/V̟(iC'm7SoWZV^V?q+Lf#5T7Ҁ@>r9HJ!R.SQxjD{f弬8vAA>\T57QMԣwV.]*IMz aWi%I!n۰w_ٚԿ#0gx}YOx,d$PU hx {P 1vfVzL){ \/`|x-ׯbx]? /./v'ꄮW`h8[w=~Tn1-t0&9G>uXUy P؃ƕR`H^/<8&-#ڍhq!,b%q /@#)qcB}˙GҐ#yp.1~}׉@Oz-`sYשn1BvP7,y8fBv+g> ^jDbz2 E6%Y 1s1{zcMHp;*p+h:Io8mb"aQa7|rP]Tk4ߥ*4Q&.uB| |feD_vԺԊ |A8qt0i]Fbؗ`%3V6~I&/D`L^Ŧ)ns L;L5΂i%O/O{}P(cXn I H0&dwv sWMuRNS}3+G<)dh\e au;H5]&o߹ﷺfptJƨYJdJ!{3Te!%,_ iM[:HeAx͹mo=&ʧ9n~>_EHSbshɮRDp,S^T:sp !hL$fff!O Y0jCL ek$ZvnLՏJ‚,%o&*C|!~Δ7s"uq&2i+V_~ʛ`ԉu"mQ=g*WoDt۪をIxv>М k|jX} PӖzQu:2_Nl\^ϟ҂o1vOοCzMrv=fR *|paQJ!\aOv"U$d8]xˈ#H%nqueJ[>|ZƁ/Uz 宂FLC1RIz";i]Ak{b|" ͟o*<jS "KkĐӘGh 5\-Yo4+*ՒՀi=ps,1EDnw}8\t\2"I:~6=xѭ_"N(>M/a#^Fl2v3lGְs-\ɒng?¸,#k֏3sJ|DYݟ[ ˼2ӅϞe#^[AhRV^I_8;BPjB/hց6XEf;sn%OfW"fM[i8m'J#;xŔP%3(end&E؋!Q'| 1Īs$)C,RP(jM46V"MVƑu6BU,]doXWZ^M~8 WSRC+<2dW=\(]q "LٱXs /!S+ I ;>1<xҷ Iw}„:Bo1}B;ĸ hxݿuV,.E B{ٷh\B5%TV^*pL$:ڵ_Тsn (qUZ'W< E٫;}9H/a${503kP~iv콎tȌNI!Y Gے& 9Kj{4\] @;;Ȓ JQ(Q& OGߦI8ƇMl*ha VAdӼ G=oviY V/=v^ R,dk(\8d"bG#gϔGF,GX8&)wN.*^0Y_3VZ6:D{YbG$uuHym\6tSUY _9(%ƏsaUe& ]A9llx9ׄF邆[Ũ1׿(oH$6(%m JI(U_~X" e|+pFOŘtmEFml_ᄎ:z^0)UZڹ{LX?coܺNM.EB D鳵cmZGXcؚJ.$z5ǂ_^2X+ }KMUkpx9ܸ2xg(-ٿNх72n˛x B15GnߑGPFDCuv?;J_l`crDro"$Hذǹ5e=ZW&vh`,jV9yﳈ,W/x|t1z晽_I<^>#['n a JƃFhASZ:\)GbX ]l~.%Rj|͌ncp%W3q׼sZE$:s5"!oJITP(bs7fpD(5 H(k9C>T@JЃ7#PڜkaoMc Gt{,MS =<H_#?ߤpGU@pQq ͡%RuvwH(xtY8fR/pDWzsℑK>YHH |JSQ'<1C}ȼn`,:7*RC D!3X99Jd[Y^0hӢm5$! Or'#`Tz W>ݫ ?h0mYMOT7T6ݵ blrl,?a:wB=XƗ9\({l%00q wl}]C ytҦ囖WR^o·j7h5İS)Y_:[^+:(J+ǁD[ O> H%c]Ck4~[< 9J7 IRommĈ3#iKx?[#A-ћ6 O:j7yf<&q?ɂVy0qNw?O޽;etMMw?+o̽%Ym;;6fJ>CqSUUVF5Dޏbe{ m 2EtMs(CX|kjYRj7ei! w.⧧Mgl1VVLh' s#Zt00s->\qO:ā$PE:įDq#!7+:K["`Gdl9g-F(&:7 6P#XωX,VF~hhyi=b!>,omq;Fow DeXv'}yuj3nJ vkK>+EߠH>[^{N垃SyAZR,MԽhJ#LlߢS} OңgH9^_ з#. -grm鏗15!p//;./nQ Q$xw[tcJIʿ9 Wf-d`jXL gf[".ߩ^%E}&;rxEq04/9KGDtX1%rk/G@ QW|!4WIIR%!JԠ2^Yw @z}* 7% I@ sH/NP WR/(N ,pXtaŠ妦Xk)u #t3$dSZa)kн2aD#, .a hUA/ru!> 4fVܜrfah1Y2ב='[L䙿G2fjwOʼտ>G?l1m ?|<^`sa8DѪu``ƹlZUQ,2l5% tcmGxVl_5+ZBUcӍqAZ$~Mu2Z(Q#jjop olAV]CƎ=Kr~΢5*Gv9?G50UoVtz!)lc2 w(J63Y}aa˲xPoop#@\,b@H4^M DS_q2g|(EFPfeW 0ARsaZl'{훻qދgf"0_:v`zƯUU-zo_F囹I]NcR~}rI,ۋkrl,?a:ǒt;w&S2;9E g -H4m-Hw{~޴90S4DoiMQ(#Ъ"Gs;۰K>o_|UL쀵#}JGqus’]dM+.']ɭ?8A,7Ch?EDTÐ(D YOqMئ}$ށjCVD3 7h4B6fQHD 0ȿj߇Xz0"h6ZlUݧLMCQF;GtliXtr݉)K1qGB`~z&Io|k)+(_-' ]3 1ɽQU>zq: *mߥB3#?qߪ?:ES/EP.oaYۺFhoX^bwdl[= &6~7S\6hfﴧap)wv ag ˳,ؿQ㌴Wì YcXy9 }l1T$_eQ\YhyrAp|goʾtX_]O Rk`M|!2h :,Mcm J5j7R_-nw鋂`kWkV5w۰9b]Vy'y1V)wxO?5,qlq7KWLI=Ȭ-J:C6F\\kM_PTnG# 5=S~+<͓5O[ȣtU UJ1h%t:KHp@Вv 2]o@h#+SFB WA[6krڤ(euK"0jAC=nXX`-4DK٘>]DKRʘ҆{MZz~30}CDDwa"+2i@?&G "X,ڄިp'}U\|Ȝ܊`vro߻% k 髙AMy))rcH|_ǃA 1S'Y~cZ k Q@dڑ#p)t%]0,Y&ٶRF>6!}Jtq\vvL(F -+i~u$zY(=ϊYX#p}7 E54^Yg<,fVF^J ]3gF`2y m &7;kּ~˃ 0Q+{3\Cej"HNPEә =X."!,0X3j-rTdm0A0|o+w-HPX1ƆuP Pkħ3W$Ӭ452I'" 8U$|P*rJo+>x虎l11MZFiSrXJaOI#}F'mL)$ ⲋoGX:_=fZFUlsM< Ϊħt /{mCWI2&e=TD<̧r0_M٥/Տ #W?cb M<30 > ?f/x9A HUtY P3X/@jHN*rMNĦKChIÛ)Oi2 B&""oaGd79#N;frwwqW, &ai K{bh_slQRaS?r@rk0 3a#oizĠm*͎O,HT)4WŒ ̍DF VHw)W~<@*_[~>zŁ˧Rj(s-d AACڿVť+Ù xXyvygT5$:Rtx n_cqh NE'R:S^^gzJ}{| 63$}>:LJTȭ7ELf6~B+?. CݾЮMZ čJ_{$3wb>g@ rIjhm# owT67FS|{rEV ݣm'FW1 tU>ER /-yXΕ7 i;@R !f`de3yˏ^*Wtg0 8%׎*Z\x`+ut}J8BL_euZaydKU^V U=V ԥK<~V=V3/؊2JRI"҃dEEn=hRQTl7GdQRJUR?1j} t.ſӨCoTKcjE.O\}JvfruȤ{u,gG%1"%9U,(̚kCQyn_^ާ4|Ґ5 Y} #~p:÷:6% ڲ w&83)2D" ؙA,k7B_ I|7tf3iJ5+]n5[]Q[?!OX 8J^R]}D-HigIJcTSD'8N+ދ[8iqMDhsbWN Z Y,`["2Rs8 =fYb1q@-K&| d[TEuQyoĕ4]N'pAnYIP\'E6J7wkg:;NAG0*PF"^LWgOg1\3`a_VayU]'Yh:9n3Ye/cS]9Dܖn 㟍!8مf}; V#q#h@4J X00ڑb;T%D=f+XK^~!Wh;4fVqcM_dƏ{#\Oޞ㭩:Ro|IG =16Xf7zERjK+>_rPb'G]X 4 7"1rW*9~5czk?{J:R7qޜW}B>O6  HI|'P!V!jk5]2U3QBԘ,rX/A'aI8? ;őUꉣVDPޡIIo۲DTlj~0>w:ט= $f1dusxΫkc#o{,dąbl@CO;͚)tpN/Ŧ"p՘N&lK(@h!pSco!qz`^(xfַm`=Ntx@-:ZD~ (Lys!@Yf +cJ8J  endstream endobj 107 0 obj << /Length1 2587 /Length2 30712 /Length3 0 /Length 32208 /Filter /FlateDecode >> stream xڴeT\]5 ݽ [PKN஁`-xN]wwb.{u>c%( rrgbcf(*͜XԁfvfVVND** W-IqXs|Tf>@6?@dnvmt LL+gțY؃mfNyf%f2 lЂ@3+ hiHkdUT556@"6ۿ X+ X xA0=? * rkl`\g3=/'Yu & t%$x.m|̛;WI6N?.V/-Ҹt f' L怗+/& փj.Cm+ck ~+Dۀ|g_ Be89XL|4Wſ.QoV@ ĥy{@T|UºI0K;%("-ﲨAFNTq^[S',DPF󴙵BUvQqNg%F%:'^1.( +V `Jfٚ]0 ;wBc'Ě-Ϙʿqځ-yÒwY_:3rD" $|0DSKDL*v..AzHЈ1q'.uһnOɟ(㫞n.-%J/H*8PbxwE|قk\2N!u:f- >aGOCy7 )ޠAtbn ObǗ}^u*  &g. VfFUj'YUo79zkS+)*\J-wҠUw^ i$W|kKUa{ Og6 +8FX[W臘<$~q~ʌ?kVı"O4bxq\_5_p4ȋGYp\ ]O!r⏺觙e,07I%KjWedJ< |EjpQYuR>5B"8&2 V-#R5]uŕMDx~Z]l$٣QhU#.' \r@nwܛvb8 ×n^E:;kUO$Tq4 }.rR~ "]@?7t Ɨ@^N85 gA)0ŌW]}~p5RBdWB;#&Q6o_hu@>OΔݑTwARns݀D(>떸ށ[T)k#Zv˛W8Rvʛ6`JV i .KXy }3F!Q6z,7% hm_l8̊ebm"$aW)e`+_l?H+yo6Ŗ}ZɱU*9bAElyeـ2Nov1Hv6aC8 BʦWyQS=v׬Է̡p*MaCs+_*%7[F铒(A|qIRNOnGrkV:+.OI}1d-93 $x sF#//*v^v'n BTK,;~E®݊B=c?Cz`=+]$0/fV>Y:BQ&7мs {+a٥SuuF,;Fwҙ ؠ)Oߞ_khˈ4qtNPFmg&m#ӟ9ƲUAjaj[њZc"W۬uR9.exaZy Ox6?Y.I|x W%8DDf'dcByo>̛1czmm\)%'}R.kxe$]Ґ\LJPϏZrXq:aؼA;灺8,"ǩֈM"N j 5³d:2KA<]1{0F|֯(vB~Jc@#M8|MJZ/13"D,,q8C['RНTBAz;dmruvs&܎.F\t{ x HkC0jFstuEFT+hWE݊D' ֌j_wƺF0[_n0BO$q$(i T9)h\Q*#Q6=4QҺQTG@%rG}۵UǾ_յ 2 L{IeuٹXQOs2)4/]: h DC _%7ڿN?bYgLX 6Mtd.KA3I J~x;ap**O.$Z⪱Eqw[ ˪Tӡ>;/(q FsB`@"XtgQ_>.߸XdJE$D9͖xۿr&XPAS3c8-u ~&];D"d{nN:-W<]6i!Đn&l)P7|Hڽ’;ƇED#;GfRjw2Q:b!VBj<-v3is 4VԨO}y/3]M.G ^j$ABvIKdY8Jz!^۾ls S-Պf6i 1o8L੘(JTv>< ;MFࢬT~<>؛땔c7m)r4S]*9j]EIU^u 29Ι,q̵aɅ&>kwOlB'Tq~ yLj=$,v8洤-&~yY8P# )%j6j(ۖ*Q=o0Kahciǃhv -Z39䂋XGb*]O5e)jb.TTR7XZbʵƄǮnIQ>at慶Ku=9~q]bP_Rˉ:.wD&a5LaAb#R='X ^puh;p@s Lwbt:k`4_$iaWP12 Jw% ##}V#FQJEn)Wl᎝B1Od BfI/(m6G6j5iQ雃ˏ d09L$nT5:SOO(Dj;ŪC5sO(${ u)X,!7<Yy""WdiǗ*8nǙBwG6|Tq;ZO_< r(u%I(p} ZênO&:ld1:[LFF񵼪X3#D/,238|`VmkbIp^l@YŸϬMty7Rہ,۞K_ K9bVO6i[v g+m33dW1kE" | >tG8ڵ֍fG 0Bdd+f3q`3uXx%yppF_s+F-ŋ#C26J9dR΅opcD=sqfHkEM .^/dXw>gY!uS[[13K#CbNcH?8 PG/\qVߙSA<}5l%}* f[svmzvC0 Y ZKHHa/ϼhEGPLK4yYYR/ڬOvyHz)(3&Xn)όq1}Rͬu=cm(>?aaMJ?|>pP~ϴw%pa{?3=luapvZ o#iഊo6|] pZqK0 T)8v  t;hB/8ƿ"szt@z5Ok=xI+5e~@)x8~BvȄ|9wv,b7oQ>Ȑzqo{ߧq5R $v iKJIo9ـUJ7Cʣ\qf7OLħ>Jj>tNlueЌaߝhew~ A.C); l}/[1݅x;YHXy GT=Э^(Nv-S z/4_BKXG&ZZ4e (ۀ -ea1ɟrw- ?"Dо8’bM0c]'kv %(fӶEIwS pCgsw7G :"57 BVeo+TJh{|JZRk Q>BxU w~P OZ&l3Ұ=]udE{|@x,w}Z~s J,-햟5Z\cIZa$WfLGvD"J`zcʭ/6  5[ib_WE@q*WCK˂Lq8%lnk`!cX|<{΀P;"mg_;Ť;J\@'92BϹHlĀ+? okyzcS;Qm}ElC,E)*K y|󊢏)vbg #;OG<wܦ+7*X_KygIv]8&*J Lc fZFZ_}騖̇˿bȥ!f,rf:Xu,|`Gt F\Y `iԂW1G_hTK<*ȬU KXQNEAT+*o3ˀfd7m8Q3۸F܌[s:*YH/0]M_}}VANHa> Խ)ōZn|<N`]R/:Gu aX{&D-B_ўKv<RJHC=W&FxA|]ԘRa;h?î?Mҳkˊ (J r8)10NK2] >JM~vf\kxyAvI~o:Hr5x˔o$8~ծobz{Xjb8ѱpS[bei3'AYOkɱwd[3I}a#_Vt|2K[hk ΚlX$p}u&!(Qps*iIЯSql7|pgW+C~P @H~)ɳTBڕ]b(G n $frМ%.ΠVL׳7jEކvW_I f3)7UCG%-\TnUSjh+e{8cc^^g~A+Ck{g!!ӌ;71_Q8Su0-;בìbblkS96/.drrd:᪩{&rcFL4|yǯ*fj$V56&Ky&lIJ-LpG,u-V6!k ߬>m$FE'n=PBV"=b;[Xa* ~X1d.], ᖠjo⎛=m)'{k]xF)GlS= nO\GD oyoPս"/&yY~s\~_n*`\ FrLnd_> Q$(G!uA"A(c2Pl2"\=1]8gPd='|ocZtȝhC|{EO3W[gv<00x_:3Y(Z3;8ZjxJf#g&"th˼P^jM=LZ#ApD76 Ж%аfgr?CP\%HbrFK'(-b+u? :6uC~ROMX7KJ-]cIȂhL;e(v~쩻kI6+Rm(ڲ7"Q[V_fb@BWb;*h)#Z/Z(Wĺ+bVzŝ\:8\݄Dr3F,LM`Bdkeކ~F2_ ULR~_Cڜ@ *hiWj33Hh˦c+m7!_sʜGu6mwtF,`Yu4A>w~yrO̹9r~7RE1'HZK_o-MϡcΏU|G^;'@_L^# PEN0+!a, b]egC+|ӥ|&yDfqGVy"g7h~ 4yˇy@̹_Ok8[6·d9&ʼ Uel%_ KMޣN6jߋ3G1v֭V&' TsbڡI]>:6d04\|{>|BYIӜ~",w.x# t<J|V2[MmΎWS 2%49F Oٽhn4dI*<~ƈ > lS_McMIԇi-:O!א4~zuFb>u kvStVCWNYh&Ҽ[dGzLyd,. wk熐vP)ŕyؤfy,x};L1[$j/5Jo,J1W}'|XdYNPu;UBkh&!uJCE׌vD'\5vgcmoKLv`lexX%1.r3CDW70]9DIP(ṛ>S''fߡ Q,!hR*Xe*==A%&fB &HJJJ?8N=ґ$dLH=le'ǁ414=Žcqt"Dgh4Qg+sץSE0)Eb\5޸ -v H:<ܑ2_gY6l \ n?SUIRMKҢ D[d$a@b28 Jm/2gG'TݣlǕmA $30T4)fǞZ}Ff:Wm"lY WcIT 5Xd×tV纣RzD46؛Fv,2YE#|y;+kޟ#k|} K$ Z ٟǩzb֓s#kg}k%A=N;|[5ѥ%+X#1=3\F f\eCǽ9,܅5( @@(>>q+ Q驷$Ο5[F=$h~E[&Vbivߕ9IPB)CECkUVNsl + bi(a!ܐP.BO*(.([0,=Zz9 vʍTLd7)%hRq@̱T#YõC~=jŷws/Mk&zSK(U9B)}R{á3 `?q[= ++fήY~?>h gcé 7 ؽf.'.X婨bg*^mU;g G7s9ZE<8QP@+=B毉t. %^ мA>V?(`*MAF=!ϒ e,!EB6H7gTpU}ݓ(BdS`TQ|v6~b&0KX}eX&'3EĽ3 E )Cb}$̄Rc/ư?YH1mU,|mKkV?* xl GR`iYJIOugk/W%PבBtd hI`:P:hV|3/C(B;c >Jܿ/v)Y.LN WI+ Q7ϟ;<@4[3%OV9jIR8JG[$r'3m23^~g%yQ?KyYuʦǾWu.DcP:!d^|k6|.(9?*T IdvE_#udڗ2槰*OVLBRX^D;ƍGqlUꁙth‹ Mn7w#OcexV3ƇWz]oQ!RuѲq?o,}< $-r]X 486?hNH+nR9t̀4dxf@}>FutIq G0My9˞hH{·kZ?mIߐoJQ֐sVbJ$=0 D;R=Gv02B{%X?(tç($f #;A909RZ?>vnȊ/A;yZ& .L~)ǀIVٌ5lku{} jÉ?j&LR}v"h4mKqYA+V Lf|߶l_qN !6γkHHOZ+dDw45鮰(>hr1̪Ny*ŐۻJz%x3X## c)dCF.jEяڎΑ.0.2s!RDyJb_j]#^Ws9{V[nρHa}BjPiTi/뛲!cmb^ \Ɠ欈9s\rAJi:\Pٍ5')K }2a8|ld`GN$6ϖ+1~&;}*zA3C'uIl>1 H^,c GG9=8ꁙR^C&vќ{IounqP"c /M8,4|~zZ-<IN`oݴ21B[L`v t?htAøRP|ESS<h0SUxKҴ-0W }bԟUvmyاZ -`OBlTZlCʌ%"Dž^ ,ha h? w}Oh)$ Ff)V`+ڦwiї~0{Hb|~jg |lbSqlv G&"{' SsDCCΐ+3˦s 5"nDGgp8L*L";ZYbG!£;ET!N (< .!bu;)ǟmcÍC$c{Vj }+,;,־=;tXDKN,PjƌqX?|X~+*Q"zcloNTjzB׎yά񁲡 'sfq׈'@_ug9-⭊" ='ԕ ޢGM埕)+8*'Hڿ6Ķr9^]ں]4ma.l.|fYt?a,xދ,^~ƬR ݖ>YۆNiRGH!o',Ԕ%Km+rm˧ѦܾvJ1ϪrU_yV,1*]גN9Bf %}PƆH7qih컛Mx%a IQ!b8Q_櫦ߑg}5fNZ]3s2'c|k?Lhþ~Зr^ { %v,sEi͊.STCdB`hk,; %C&sA;8QNv*eԛKy6^ܼ]hdrP1\m.RǵntBhۣp?\ޒ͘PZh ";lkc;!SA;;e3~ntZ\@{£=f/QAoC^?ir6 5aݠ?@S8rĴ!ghE:Hrvՠtn.0U?VY_kw+-ɣ,xi8=tq9M0LPP5KK.bLI5}m4GJ zmey>FBr~e\R@GYο>VpSSF0*/KH`^}&;) {O2ɴ@GT=U )"l .;f\[.18A/G"d>I}# [G#$p‘ tgAKaVnj]HM*@Ek[ [7L~C}8pWZT 4 KV.wѿ tYUdyoX=0*90 ~%!dӞP6tiҎ,(kk(ej ^O|.yZ,laՍ'S79հ$/#|$."E6n6* U_)f MU}g|3jjӜf7 JhoћY( E{Շ*qpbh=Edu/'*h #S7=!7U6/HX&*bUUO:,=4X_`Ra -mnv{ͤѴK%| }_EQEB!N oE55+ !o N]2>کcgQeQ~NRHREŁ)XGc0'4[h_WĂ49j~ ժi0?},@JBC{gF9ܐPI6aHNJ])Jئk\ϲ0Auޅ0=+e|9*\>bO}ܻ"91 vM%{׈7#x&EuO!~u@#{Kq+` Ԝ'K+$JS̛;ÊsE{ ^;)sR֫7iC3VW z6Yd\rx%il/qm)^OZ*Ms, #ejmsb-z[XT [^=:qFH9` ,=5H X=>JK51g?MI%"]ʲk6mw:S/:?ڄIJō֚#] HPnC"*;}gAmpE9 $.AJuN旓&28ޢ R );5O!.-+\HhJʓt,GIX;?`lm3gi<84_QJ Ce&A+r5(*d V% m0p pP1$>U$eד^a@5a@=6BЈ>"#oiBSިQ-0)yjX Q]8'Pt*m$94P̛+Q&+$3*28| ^@}usc`>ydm<"tljbI@ 6]CR .Eg^3ؚvQг봊s$\6N W` 24Uв6,aeA8{R`xň:TnS߉oFMX'֟8 Sq̋v0"Ȫ L}*A{K_? :žK_DMo/mވ&h2}VHtgU֊a{])>K?xtDX66Yb Y@sa~`<:S\8vflEs-ϝR{T o-Y 0 +ϤНsp%>*Ȗ, P:l1lh= :0,LJ:7;kMܡ0qz#SJǧR"LՒ+2MJ=Y؍_@58; ߉wKM/0]\Re EfﻠUUg?ZM{Ai2NT8~bIqگ 4 )yeK TJXGII~.gi*P;.A!8ʓPuyVc c`9KVTъ=ll{]LSRB[i6cI.mSذ\©. -?˝p8,}φN$^?A.'iJ+32|w*G|u"'d3j*AU*-Zkb` Rʛ5aď5B':-8(F>hwFTT+DWw'Ael&o:x67ǵfzxE!$oWr5x.$zv)3z9^U]v8?t}u8(n1É}^c_l,oNTc|-t$dPk'|JCW#.5"&Gi/]6 M:x\2^Сm,xp$?ѩC#K]gStv_H'0껆xy l_SٸP:1Uc.u'{zJՆ^ް%XutP7;FT>X{1ZUH rH#uNJw+6|Hcà(tß`t!3mEU6a>89*5Rh1rԆrdɡ1{q B/TgSa4E &@VK2/iף7#efC7 c*T5(o4rڴTzPVqOJkp_PV{d* ksMUӵw%џliNs6>&"F)1{bh3s=4_p\+|Y[3Cmc*uHWg+vh 8i=.R u4-R F]&&i b•#lRH9`::b)^,~/Td9XI'G4skR0fI~uYRƓ=hz~3D:]|B%^s`vʓ2C0'}8jWsNs(`,ڎ΂Jq IIBŜT{\h̒TCU=,L4\K'iP>rF*6ߘlX9=Xɴu_-]苦b IyAw0Ǥ1hb.gMCu7a*>>hQDփ$a&jNGƥLhcM6,.N"-:c4rtL"~[lqZ79[00:4 frpK>dcEŤ8%_d˼Na/=ǨZNL3 y9W| GV_S5$QI\ +Qx`ᬗ>Pu(0EfQ9}}%:K#քlUdsd@v7q2-lǡ\<{.*{j>$(Rڀ+85O觅onI_^h&*%ڭ;v&yRWh D)č1gK3+]_xם@v!mMyh' &4;vzO,c{@A-0P­܁r{Wz'oJf 1׾J\9X.̓?'rWya[yl4 Q-n:ZarRN<9V]҉p?n?rf QFB'o\0yj⛁a+ 2Y'D,!op_ aD!lAd}Y@ )2aal\'=]\45)Յ- l>, ȵE ~ \,^cHV@z]mEi)Ǖ])Jb> w33iOHRuD⏀pֺyݽMђQno+$_4-pt?obp<4C@.)ftEzp_ (DЋ?dkJL7]{XNiN~ywR! 0N8u%$|\[; AdS2l*ƣih33"'-^4 szΒ xi%P]\{mC?8SNu |*KZ=2%`~s*c>G1Z~;GUlۘIkB$[g:ߦ~|Ѝ̧'+L4&^m򱷝09G~7 nm`}Ht8ӂ M8U-!TtS=ۿ9nqZ1\mQ.$52wu՞ 0Ez{7}Q|K2C|4zM\؇87ׅ+F=ߏQ<>j('{Ě*mF2 yrKtoomUms`lpVg,lR!p?^kq MHkWԷփJܴ]NfŲQ b|_-ň|kCŲgWOݏކ;$8 s|4 jXXh Yǔʆ%B~1DS_q2x\9@Y1bZd#d41LL\sv|cD'496ʿ3>S@m>,r0wK\r^'}~Gɼ:;}gOi$Y%uW湈KbXe~3۾][ґU[CŞ ЌES s9B^D i5Jk*Xھ!*0Rz\/@4X]ɉM];O Q~'E3g/=k..7`ޢsOVKjh,̄Q`n'}T;Xq*8Q47TLT ·_NOoi>8 'gအApc05*Y>qZ2pVeQ(Ѷ\h9&*=^E"u"sC 0<9^oKH˫|Tr:d&7I{D Ed/E>=Ie'0钧 ;3yeg'TR w-Ŏ̩E)+\*p`Z@G=z8QaN@g;<p]xk+aT8k%LPHx.l8,TC4ˎNƧN`$0N܇lAr!2g=Sȶs|54^V9o6E(OÊ@& J椪4gR]( 5J nPN%58g,M bC\\TmIF# cy×dpo_i1.Q9<ϓOHD#GTxӲxޒ1Zumkˌ lߓԇjOɠeE]ZB`2;=0AӜ FĂoDGSuĘw_%" 'D%ˬQc`4jbc 5Х*6B~1S"|;هKGΒy6q x4VďXO?TXn{ˢqh`dwѝ=g$Aŕ}Q&A/z1*sgE47"!FHo]* *^8-.rA)Q;DGF822;V6@WRH&w~CYR|QrWa><ܼoI6ljMz E$9Գ {ֲ\P꾀><F}W./nq1";<0}Qt'4"3\d6ۜj 8 q! :dd9_*6*R=,A|e;"[|uƓq{|l>S뺬:# |X:mq4!aڵ-·G8Yʤd[]|p#"ӿ ʥtXX1mVK#B)pZ<>{pyI B9na h)nRp֯yP?t|@h"/X߹vȱ]Wo"Q$uk?.l5ż]0 _^6:B>5Hw"%o14fչO E ~ \,_ZlpK^FbR{k +<|ᆰD-;^h6eq,U\\ztTJЙ8z1vz+ 4sY Rں\m:aw 񿕺}ܼ;:G-b^j-4eؚ#ݒbjd+% hfq5/܎n'zA#!> *<V@ҹNk~EGof[yaZM|jTvlAJvH#W$8-70# e<$ݚb4F2zbLئ!QO[lirߟz ^y8[of?0c""ezVPmws-ٴGLM"[wfvB~جYU18&; #qQ}cG kaKJ(N+>CxfC>GN%NP`22KѦź5 Ճe(➙ʦXk0pZ d&r{"rO/dq`?/-Yp ;7ɋ!"nXF!yx̑z;k,5r~lFɕr_IlSS }x~\+]C&Y9@GPbFB\-ae]0ZNfT{0keku.wZ0Ȱ=D834aZJd:I0NlhtoЬX-g Zm*ZU8`A/!=*lC [X@FN67#J-"^o\#}.m+à⦡Hi^HcLŚ͈yKX C)o(lW]dCfYk=8 P|@qT%;GH>eY VJ7?"EvbU ڦ#K+Dgpt1ykgA!`jKsR"4a*1 r+su[8qk]]Ʌ4g' ʁذPߴon2pX1Эӱ|P@NY4 օoZ6%BiuIXlohFPF]:<r@oG^ŵӖ'm-Dq}HVb{I!8TqjakdYIX\{P~rSsFFev{ mm!4@u#Tt}!@_o%KL>-H{FGEv& cPB.y<+p[e3|>_*_AVJIxR`/sevэE~n-ħ ރ_O'o|!!sռ8Z{5lwY1@DSł=9c˓v_C {n.5{ҴsW [3=(~Bn ڨ^g%wiwW+xU5]+zH#]O -@$l s/ӥj>TƟˈh[!)(eW"5άw3ܪ<6o٫5|kC`Όc&Mi Ƈ<(*$r.!KY,*$2dD`ΏgF&}ܻx@PC0|$Bdj1 OF5Ƿт!!BJvJ aC MNtg$4P|<˓up54Y|h%FmąS M#?n2CO@d6RnmzFqtٮZgDZ -Uc;Zވqs8W$*$&C8lT`N٫2L;f.بo~$z--nM].T:LWk߈]=U\ݛ٭0zv2}>(( QH7`;h\JV5\֫'iڈi&NAyQO Lcsrg r EgKǛ&-Ab@.80LBGW)=V[8 3.1 @hyЛkF}8%aTT+Umntv(9}q;tayعd +֐#N[mE B9ֈS U.[A7x})>Lhf a_`AclDejVj.Wh?'ͮ}b% 9Z:Q|ĝI/.ͽS*/qmN='L 4Ƶz>2gz냢t#Jj,S=%@EO|m@V!_swI'[^bϮN~d F u\[QY@JF]'L.\#@U_l!AU]qCzDXdIKW759覥(1cZeBC->M:dW6W|y4/ G zl5!6A_xcEGO ߮sc7ӣv͐GNTa@;~]N9&\a/mlA~FP+"?8<8\unA5 خc_dwۄ6PY:[3&1 {v~<9H/"){*3Tag‡( N-5j LJ[P%#)' |:M!Od"cspZmfPX15jp #W?cb M3ۘ2s"4.īa '] "Kz{Ctzz]jya~WK%vIO`bLȁ9QEpQ߷SV5%35E3jHD^d0 ^5b[8}-7i59AZ |G)_7gx{#5 nNc~A!7 qǔҿ) ثN 'J)/%;Mi/ͼmGB}n@v|^Ljgp6^*kS(5{RɮTnՒamǭZ! {oX/`HBV3N`ZqX VK&3\7!oucvC݋1DC1R{VDf28IZ2={9]HJxHYotMΌL<#ڼ~t6QJzH$K)$s:l i5^N0K' 94B9l 6>.o ūT9$Pj 6NOCa-e[-+Tn4ɇC,.,׽_d V9`葳?{O=B("v k{ES k$'5!E7p$UC7Gee& VUJwYB, wLǯf/Jh̶ӽ__".}=<#SИNtQbKt[j=m3-3G˞0n9#dOs] =^*;*RЭQp~N| /:lc!rz6eT Zr7OQkas)Tf4QJ; ѹe!6] !mjh=#yn"P\t*hlUDRw1q6ʖ$Jm m$NUlJ=?X2 ^Nyk kq1yqϷՠPSy'+! B۰㊟ .ϔr S.d05}°\,+ ep%z1yo9:w;m2O@v}Sz5;0+*( Z^xyM*4ot)BۤΆY`mLo=c&LGם &vR@0 HwRaZC*[h\<C%'!Yv%yP=0oEMXgf {?|l}h1N -k*܃ .! &iTu/F?5d-5Lz 4lˁ“+6wsYʔѕ<G`߇^vܱD{[wvVzWb}<&UBɻ͟[؜ {>)=ɹdGy%Ny|J  5rW.$* WUT lṭΥZxQG:'5 ɫ:_.[Շewhtx2&*JԀ]0w>o~Fo*UGͥ*®pY7z VbKimfI,M}Mr\=gJ,QxUbכ' q q>b͸sc@lyP'W:|HuP'5'm]> H1~cp6cS~g˖ܧx(5}ՂP ":;6_3I dO΂CP]6f=}n:tcD "jo)^uXbheQMޠX'hPt64[4_~zf6 6lFT9ߍiB.ZӓTL:nJ% r'*bSR=̵#J/KzlizrHM ż=г<`elZepy4iC3N{/̂sNqcE DVy"|nCB?(#@"lg"Tgm?<' h9I:́o_pC#jL=閃0;b&9p@)|T%ϔC#ա@,;YYUK83VGgODlf٣y=MD1O $n:q%!Tzx%oLzdolzɊ٥$COH5]z7hj$>ɶhGHan3 X(bbu%K3 wz{kv <)fJ % (%[u.zʮfaHz{\#s\F㬮=5?a0/W{郀X ކ)ڮ s-7dH*.iQR]N ԳhMBw$@zBV9  itHu׹2ۊiG}BR>yٰEe62=p6 Y:μ2߹H-]Y yuj qFAm@Tm M 9&\C-|d;&1WB#^϶ICU_ rs_0r詛b0x*M+n & LH4UQTC:=0N2Uیh@IpF܁EqЕuF9}Bf61z,o=.,2aVI/v.p[c_(/8gDZ{ o%r5U3${ aX z$INA+m@ NC$^PZ_g1 V#Mǡ=R> stream xڴ{eTm6 Rwww)݋www(Z;gfޙs~+Us 'E;$1 'HFw*߃Np8@QW,ha ;:]@&8:!OZ{c@['Ͽqmlgd 5z?=K'',YB\E^}lٱepvwO>a1Y >&v66精'fΓl+[;7[`jakb{{F5[ gqW![gr0@9㟂5;>^vS~ArΎ. SB`X; w$4P{jbgk0"09MZ.@6_.?hmepp(Z8?;_ޖTjV}v?lcile rre_()"J/?q[c; [3 ;@`zvv`#{`jF?$Nr89ILLFFDK{؛lVZo{~ǿɜ&wwPgsGпsv[:w0za)9Z@7dgG;+\Ύ:L7(@[= ׬G33 ,ksߧ y-SCK| &KɹN˱42&rI@vR:Z/v-Nv;=~ /bJta뛣 ~}DyЊ5X@bt[@b}@A*+᫨VM˧ɶr'$%+Q*-70N ȇ*ڍ6@MA7ਾ3b)R JnVΑ ; P¹&nxR-OA!s\{4d9 s708j&JspDu!D"'4p?~L͠ZMl$ҚΣ1)Pe!5mb;B'tGҊt&S#ISH3p>֌IԫA_'w Y8j抒xr9ʂ(ًTܚo.qƈ§=y&j0,+Bx;ߴ"vGC,JMkIcdgDZ^U521ם+ HjBkD"Vhөdf?c',uՃ2E*?_FG '%7YēΜOkL4I{’~n-yR͇^st.w!#2WbOt3cie * Jok-5s/dN\Ns#P#^|6`5ӵG\:KpO@yN~M_./\JN7PkD|fNr~y-CZ(uJP|8ަ9BLE5z^̢Bn4,Sf|Ц:e78`u#æJ;ج k['ӌ{КIC]|o.u) E@PpUϬ,&^v5_"КA>oVӄHtmdo_X!}{]XˣBI8B!4`eYL"XN@P? ;e ba'\/cJio7p5s!35U>I՘j/UQ%]<{ ƬlyQ%ez43Jq'm!![%ꣽ8<>۞OGzݻM\ 헁6CHݒNUs[47Vζ6vIvpr T2;r;Twm%K~1)]ô`! ԽC=ѿ]gk͐^@~f_]ut @CGaJz~wJVEǵb0f2eTlɀ";7e> iQm#3F6,: e] "Vb%bflD>/Aݖ 7bt侺sx 6瑻9÷ ע9nL2,÷_ޚ:[pMr(V^ts.EMz'S~aNWnxM@^+#!ܹQw?>]W~zciqGO K.;K שX{kIpꗈemSyC1-9 B9-n9 Zp ,;9I'ZN :ysXTy!!Z&A_xj:(8OUgNE5O?U~3ώֵ;iÕ,OcM?7o>F?֫gjc9,o@䨾sm C5CIlgH> ׋tD/n-AzmsˇlǞ מ`e_^ϔH1glGTG Y2S6;0-eJ_TeqȗK abMj7J'XfNKzb?4&}jX@9U 13Rn+h}q55[Ƥł]k\sBTaT/%\b3j -u+Pr_:aDSl VV+JA%e?q,js"\H: v<.yp&A$R8_} h$Y!nk!hO;C;OM)~ԟ;m̃?4HBU6 7qv?Cr6 .I{H'AnS^:i.]V%O50h cGmNnEh-s1ͧ?ƴK,h&W1 !jjFHqH#{vLFhh).D[&QZRGbBbU;!MrWR '3MG^#7aP!Q5%Gl~mpp>|l@"h&0kN _7"4ϊpYw"M& De$˝PTqhi(CqvWŃsl.uuSuv dȖܝf}ˑ=E1̬#'afײg .+0(pVr)VE^*pOqdxLᚆ# 3F;N(Ul0uMdU=*28F;wU{zcx } u*8O(߭!CC<@E$-A6vhjAZMѾ8@9k:-Js7B:z#(> }QY(%1gӽKƫ_<Ƴ w}6⽟Fܜ3-)WS!263Kղ| ֢sn y%,KFѨb([xZB <҂l?2wH*XVI:ci#\ ;~{o-P[agAպ? @T;?o~#ii_{Eq:y7@llrPs8oZb`ǡc *ܞ %*Z3oADmNݯ \/ro9:<[mܫV,h/X$*WUo/7C1֞'c{J# f_@v( +HKؾ:sM"fFxX/֑)'7I.I^Vn  ˠqsHi[UJn j 1QRe-,PTӴt )>> x|=]WbWJ)geA^^nE%q 45ӟzޘ4%ș~kCb0a2& SP:+L\j5_uOqb .y) O% >]9RK7ɟB4-tXkL[w,==ϊggwݪ8mRVs z-,e׷`-JqP 4Q$Rb,VZC~DHm^)G>>ӉEz#'C},V{oyA#AO_.g/^Q S: \a1oLhd+{'оbJsb_gm3s|V,jd#J8% >liKвPA1]*"zv}ّ E -uF[B/sDSЙUmJ' HS% l0-I3?#zRvn{ _NyԸR i2\L!,|r]&eޠ7u /,;<`WV!q3{U0~leoMfM@z`gVzn2 w|#Nm&T^`T Vdkbҍw'Lۛ93xý \(R wY mu!O5|xqp2>n j0%֧Y dRW %fV\|``80v{tԯ"5-ԝ/{_ZsXry J9DUm,)FA--w|6 ΘSoNߣ! ;_$l6IP?-)TϕH<Ȩڎ`! ae.XPY9ͼ{be) = nwUlN؉~: ~~$_d`3S[l͐0\1JY?JZϯ+cpXM}aGi+WE3%T*8XIYi*0P,n*iݱ &$VEL<0 ×緼?(in]sr{s`m{f[EO|}7Lۀk@sT,협%4Pt(d}bk)2F 9F .ZL1mkN!-c݇ Qo27'amjrBq+h`")/$LpSPb,VԬMV_Qr|e@), d_lEkeI.frn=lu+gxtCAkeY.KKĚӚ72=gH=bЍ9m}D:zrLa{EV9mn˥1Oji1#ӾE ش[$K[`ԀԇAZ\/k%4X{OlW0"WtVqZ-"dA/xl=S7/ؿ_B1 ;qf?Gv`[ D;plClĞxChNA4~gx%ŕ@oܾfYT@;v J@z[O4Vnpl:LG?GV~mT`=ۜݥ{Kwda3d- s4C]J/)x~o'wz=X宙|2Ae&-O7[롆$4hvwEVcbr&S/LvTKĈ+۵ Kug]+ W߳ ˥iyR~9CƠַzWe] vs'-ސVzt P?&q55G_kу~(> F;TH4~%n9f]'e~;*:_S>ɍ{1 Ic+db#z뙖EZ cA/x&pƶSޛ*DLdDT@|P8X6!*[tQ:%E"Nad u}[£cM&Z95j'<1ǺfnO;D]kI0"?q ?o/ b/i$ 0 *$\y);{~TR%9BDΜot!ŨjIJ]g/иj(W 7,h3֭_D}vf 26zrş~eciV WS#6h[羺Հ:GdKk>ɢY'/|$x [;[?-|FcSʖ*t9{JoxҒdOFͱnQXxޔju~.,FRE§oD3:oKQt koN5%\g$aFƯR==FuPVAUJ`ۚW:2^䝜?Іd/L]>w߅T_h g+HL&,Jy[h|f-іvN#M)CYoC7Ճ3" RV1jaRFTvΝP<+lj2wv#ܑ)_3= *]Jk/ m_=N5WɃ[i$q`fݖ!w0^ +^-{Bо#ijH! 0 %ݖR`{#J5É t?/,“NBI0.VquؠA.g8¢ǣJW{*M W$6:|T'$>uGCT'X˨x::㸐U")96TΩTH-޸Lċ ?9%asc^f?f@@E '҆xXzk0oeRm| ^Un/Z/7zw^uۍh;ָee7'Kɬ,[Z edrT284$Kw "m[mJ85KLg ylN%~GI-˔ i:n-j'6k@/eIc )L  KjG .3 )H B6((w:ÿ{[21KZۥ%Ht&bYPW3~ϖ!Ĥc1$a{8Âo^}K8(cI{p3ÝB|.+t_ǫQŧ{5BrƢ `җ' # 2Bߜ?"Hͳ +-qk{RF;ה./8b6Wa̞1?K} $'gf !jb°cNlZjAJ¢P=650MŁI#cO}*5+{/춞zᛍk,;Ez=p/Zr2{뱍!&|,vo ܫTZ*/Y+lШ˽bnꉨ'"?=BK >Y3 ӓQ>Eu*n:"[*跱[TBh1M@x{ z1 sʿ?/1[6!׵`(9iU8az/>^"c5#UU{$!;:(>,Bxc=h|OJ%b h~M5qd21-3fQwHD,Q?تS ],QZA){0Eϙu1m!=9X|9_ )34+Ԃ(?v4i՘i:˕j^-gQ'Cگ˩t3)j5|U #NlG|8'{ޭs. e.% C$]iFj[0-^& `t><:)Dʣ=}V7A6ǿ, b%ۂx;?wx:722rdN sBO tJf /ʰd*Zg,"чeر#1a'6TD]M>qm@r~ߔV .䀤NPiQ&DhWK_bTI -EKԕmN҃q07u>VݹDnTG$l/#՗YN?N(3.!؈ăjʼn:EWMt@~ kl h& B&)lN]@>!K]rLDvONDYAUDXITῐ兛\! 9]ċ)B#.ڝ5 N'?KzcFirA׹tZ?`*0 0.SLFՅ4.X=b!@QZ 4Y2]ˌb٪#/Wn k>EU9nqM@-=G]}mob tE}mmAj!g*ጉ 3r'\U7rsf ZtawݝQϢvF4u]֜S 5s{ت5&d[ >d?ӂA M:-¥Ms4YnZ%: S]/ Q#lG8AYeJ?Bb8mf|jZ{IFC?}?ҍShkU:ܹՌe%`U=% K^I[Rzvcy7.Ȓsj^m)ǰN7c|̷:9{_eʪ?$bE_p&P)4괒r(GP`Jv 3%>9F0}HB">^N >(R_du +"""?(fs9i8|̍jy |@"VpQR927>a ؾ MRi8.o1ߎOL:{6B0SAPŃBꘌ"b~%>HYHlyZH8?D7 iJRaӆI_na `BʴIZ"Dt+.pNu?:͇lUvԿl!>KV3zVH ^_\#&30d>B~ 7=nv}~-L1jXѠl4@(# AR&77č.>L$T 6NN,n -ߍ3?Bg $wp:Cb:9!/UY+73'ꀪ& KW[r?`&1S=}_=t݃ 4m8*/C׸9;0t"c6Y!/ǵfB&XFz~֌}hlϻ[׷*& -1qdd59(Ry9抏5U5iΪl6:"24q@:xЊN,oA%d5rVnꂌY#zi|gn_eԭ FkAF"],eL|pK2nM%,fI>_y0l[^&ja`֧q*]8+֜9]:)J;[aز.WGso;ʧΕ:ZXj(%wAxlvY6p~b/96L"+<=UO) MH C2*%?m#bC:CSJiy=ŃM)x^ `v-KC轄AP<&-}tnpH T!bw*CG{,, !7GDK5CX8h,) D*q,lJNnikTTcw__{nlRƷȣ8S&!x_NZu?W#l1\юG_$k!lKkLlx'$4((8mW{)n Z UpK$^CB6: qxBty/w%BF>w1Q2s 9:%RXjxv@p0HC$F6T@Ȑ]l0SxBEKU*RnqI"E(o^m߈o"h?F O>LjHBZ"r m%ay<2$0dk/=ڧ1lW>$c1֢m224N=T(dOT]Ioï1S6Pazߪ$*~wL\kgeyvҋ3w 1cT WFZdU_>Y]*kհՉw]:sh$< N}:Kb˶9P -B蛓& i!rvfgLPRE$`2^5F\e}Szl\&2i3Q Y `X 9 tݞz}sA-tq# p'vw{/&@jx= j*{ iֲ"1h.I@gY7*)mlk [9 8#~6/, 6ʛsM+7 y)ͻ}7fiPd_)7 7 Apz'^GRZ|FoRޱ2fFeh{Dx_記tS&Ƙ<do/ ajbjw=$Rk(-A%?W$9c~fGG>Ϊ߁]Bk ]JYIs?6P/YWCK3 Bjه|%rYԌs>U <([0w.q40y|cRhR=At<{uMMqN)_7kC/}CzKфHVy rocݴ졝tsS'uEx({E7}=0UoVtz!)lc2 wޏ5.wf_nI,(IwIV(81v%GA[_\0F-IQktW(ΥduãˠD!ݭdS)AR\#A۽ޘ[d{i8 tcoESrΧx&$lV<m`4 TD$pGzF|0C^i= CRY$b҄dǪfZS, vY#ؼ0;Q Zϯ*-ٴn}Ja@xє2ŏ;Z?=^Z*}OVJ.sJ^Q6Rd "\~sN`F;AJv@1ıx!ӌ:)(2TnBNBAcRh{ń2-<ǔT @oԑe? -+}G KC3TY3su+Tmy>hӝu~R@GG%39M!\ѵ>Vd_H!V-<71!oٵ a.R6׆'KD9[fT8{vA{zyѺd^,V# aX2[5|s\>vDtZ&y wzD}tZ/9?Q< }ugpCO9`:=.O.ZɝBKB Blf-'3'Fkt8G4K +Q{E"g~}tHn|'yF.,6_c*fꞩMjo6bpvYG@c&͞y=oJA0M.YpW{[[R",p Pa4j_G+T< ҈^JHGzP ,,xבWֶ\j0E{Yg'!ŗ24B,w\)`j<,sC8=ζr^sX)cS:e80zoo ¦vPGyQ}in_| kl x[x`T PaKJuUcT\oEVzHCzn6 o0{_c9==Yt6]n# ;KS PmNuJ"_*:HZbsȦY+7qM~BIp!:sBC gy\ Y?W~`ዂ38{f lpB3T!d ͢jS]6!W#u:$_؅4=mSW O[h39t7"[̐!ZzhbWU+ӎ)AC̑ `0^f*<~=)& ܮuԡEbw1t0*).}[ z\ ;4VO m%QKO'pʱ^d#/:R뀤5Ǹ'Jj[턡u;Vα i.& ÑI$FϩI2C7|5沾uW=lRcPZWpo!kJR9t7D-׀3z T_GJ!'YTZ ĞK_DMo/mވ(У޺ } 3U-cB</o(]MӈVa&`lE Un9rC I9B-4n&;Θk ;p.fn:"|s?)C'uŔϘ˜ޜh#丘P*4",O^(_bX-ѻ;+|zQ;Onϸa8&&a`Bfҍt[10Dž\YϞx, RӅ`)|K-!<?TKh+5xxoGp_D>-krXM=TD%4߅Zk!m;lAp E˂sr7x_Ԉ-tQ2Ё"}^!0KTIǶP,5^)v#'_`"؞vNFw )EJUjh{-bxJД- 1$ߊ@mT`Gq|*SSv8> FnS  ;mo6p~ƳFM'u0&!+:F`6LIJ;L2I̠~P( `UeYc.\.yCg!SjiՌoq[W.҆tBDS)o%gis3t8 ,gtŖj1C?.{Z ҋD#׌ţ":;I݄Hf"dma2Th\R mG/8tø;t7DΓ]h2%|ps@YLw~X l+O[ V5 qkΊ(յ2Ҡ^Sg۫h#$]}@k"N۶vihx`FteK`z!;-Y>%H* (NG&}68zbaL# ƚPT<WR:k*6/%[{uscTّY4b Cۋq2/ЍjeX׷$NBFB/vA<^^m`,:p'Dy<j9֓} ANXycP' <Ǵ0U>?,!wDxtlL NjTҜKEgXKup& }vIHգ '\ɷDp}𗩬hIg %(tB wLw`V' !WxN(NHɨM)=(Fh?*s U$vu}1JBHaZ + <ګs&˯yh6Ι4(5daB}Ĵ2\U$t)ҌݴF]%1$w,2=N UBQ yTC€(,ao'oM( Vٞݑj}/ ӬMڥ+ouűeX2u&''EmN xH #Y|=[23cר^Qd7wmޛB;L7؊Fkqè=KW8s0=o Q<)>sa\|xG_^hN]Qg7ž4?@eBe:R3p"F.ȇ$\;SէE~BADJ= ~Js`(y茓לkr4r?ssr ih GD:IA+g"y<{)艇W3aBFHX%*.NVBd$*8t7~}NKvY{^2e`#A>/ѐ2 &( endstream endobj 111 0 obj << /Length1 1925 /Length2 23106 /Length3 0 /Length 24282 /Filter /FlateDecode >> stream xڴeX[5{` ww  P8Np N|dӧwŘ6;ל (IELF I#+ @^AlefT9[lL,,Hb Vp;r"XXx(R [Û`P9@_@ht|sl,lAo)b`;w 3s?5T-[],@[,@fЀmF s)l Pi4$TRJjLo՜ELM]C ..i24Tپ7c(IWPQQ`e V izSTS_s'';>ffWWW&3gG'&_-`+۫WcmMdS[lA$;mZfw_aopSp#4@ǿr啕6@ ['-- 0 2[  C_.tQۓY{z]ĀΎ>1 5z?gfaMADQFRBMQmloݱerrs+O=qy> '6&b`7ՎH'n'';l+[OM5l-A2fB ` 7cs?3[#=vS#tAޞt'BbX;ۺ U] _VmOM)"m$hٴtVڀhOO;hcaF`/DmqͿ5X2iY)},\_F6N򽍥-wU5uD'ak 65qr@w$Y`x a03قRvNSҟ012xrFfEj,Ml ҩ |>EڔA/k- &*@T lM&tEdy:3魱#1·HW$2֕\XY֦֘n:: ^GG{D~uwkbhOP*!7uPPJЯ'RU,Ldg&lY!c&`-Lo3!)=KR2Mt<[,#=*ߩWhWQQη݆h \94V2ZtS'YZ'}0Ss!$ԵR| LɵѨj_lkdU9*˲u#PJ@U&g{?=iيBWa^*_gڑ9blt жY }")WnbNI (@=iSOoߏwW*ў\9JP6|xǿЏb>OCl gIEY 9M4[5T]y74|r71jTG*[d֑Fa =J-8B m&`T7جy69W_oSEV~oM׍&K#X =}'.i?C(9)oZ%I)k1f2C1 yN]LfB7L7V8 a ;-x߼c#Ϣ#lԚX 6թ3 G{v` N*TFf85O0Pw E 8:p-$A1"{" a!Lm4z~ѥeYFC\bz J%F1'LrT6H2S\n6hU M]76b4GI?cG;뼢UhAwVMjؽ8|զi; ǒ9‘J5=L Osmsf\#4zB ?sBv6&Wh7668]G_gyw3D57켒z-6;8EVoe3ZJ~X\~ Wǽw}I{䱙zzL@Zt:sbwvbO ݪ܏("CPMXb?Z2>X*FOBo΍,Y^%ni]-jT9myy5g)ƹ1WoBOAjA5ڷ(1eҞƙ4 ^I G+vԸ 7\//as>}ebvq˵ 1uGcvkQUz|\DkifYw09a՜gB)~uocAiZ)c`&t\ñߨ(זpG.9ZR (;uH$?E ?WLcg:%.mVR۵}՚X"X;Č4|^&QI1+8ow5sAq[Sf,p)cXFҕ9rՅ8c4KfCT|MCŶ|q ]#S8T 8zw D Z}L|Ӯh@2kU]3;~Zt8cCsS?];IU!m Wm(&h_#g&gO'U.^{'3ϒTlaFM oP_^]t5W-Bm,Jmd+q8Q ,SC~C& JkYܯ+;͑>řv<&2BnZVs.Y ƯԉZ uC/SE }U#MU3mטʕkQs%d%C69 Y:2Vg{R$/BTʒ hnqDVQ!` ʨC')u աaXα(1:#uډm n kI 7&g{fm~_ +ɢU{j' x;& j\CBWYr9w槓(\>)ym0dyhq`*Sw)&_Fj#jK_*y@>\]Ҹ)?;+5*"x5 nG ?u] H﫭-Qwͦ F[396oI :[;ڍwlل!gJfԏcȽ\m`dipfQMiڻV5ڢ]kbb]2DGDW-:Q 9"Q%_B?gڍ\!-Cnj4z!i|d642BO)5Ƨ4!K{Ƭ oS4=NxiThmV ?h3]n7\',k]S0 l&$q;*d m@vT3ݞ#uj7rg$"qs{ dqԠS+T׻^\٣<'rNX盔_,G*iLK# U@ nxZ =+:T=H e-kFZhf8!_(ul]"RRʹP FlzF&ޟ}{iۀIFwư6Ӗ޳T)ht[3jݔ>LZE]5QDOlHc}ɛ %zL!dÔ%^VìL& x" ޞ2\-6[W9CEdXKi{Wçо qS;HxY]û)' i)NOᓻ!3)d,Ӽ%uz 51^"ez1w& OX}ukqD_Bk Q}j8{3L7>1 _Y<9VUM{$^zkz?hIE3B|&Cl v&MlB/eF&o'n>,Vhʲ"y8DcUR5A6KO|up k% txmK:vِW  ?u N**^ h֙+ϖ@v% T㫄!1V6bS(Q5OKRA,9lpl6[+Pe0˯XX"5/+_  R5%L8Btǽghm:?w_rga+!s6c/g<'= Jh^i~p;$mTM|ջI8-Q= 9FIX}͏T]<[lIZBn_a '!YdE]>M5n|*춽!FvoP PQ3j̢Y\[EdC:׬mEp!$lemI9pmJ}z]gWʴ$=p&sibPf^w] )Z{E*Ǖc̒I0nIKnJHk?lX?䬝_-qJ*k$RnF#e3p 5r*JELfP9B2ILc?s$瑵 rVg6:'9;emFY?^l? 0>P=6&(i&B<yg)}/LPJ7OMR.,+Tw}Da@֑ë=[ a,)(C[!6"JAcN-O302՚'w&F*,l"3 .ZfAUKeN2W4DShevXz*?o/+Vorҁ%csS;C% '%Z*dHz#|l1|jg:5McxO!/)tWC<OixI6P8un6uP6#+ϔݰ܍}ye*&(铫Bhjo$Oǜ89 ?Z]*AժӫI{ 0YL'KZƝic*߷[ CSys Lk-h'5yp"^ǫY:1d5k=F^KOCpD(@T\`fn,.Xj ! 4&T_^nZT $O)AO-;FR h;&|w jV?8ߩ# X>`=ILS.aq K' ]c vߚ)UmKAxtB)nT,NF[ص q"@M|j*`(6 GZ0G޶L+;S4\ܝEyvr톔RWkq"S<;I`.I^l-YCr,pumȴǤb˩gۡLdۅ~W&ثa9}kn եue;#~xJLٺpۅUd3\HEbj ӔzNC]_Es\8<#dD'mL)kN:>q380%~ @Lr-YYS,iѦx:Bwlܚp*3PȤ#ӢIigNx rvJu2krOSⲤata?%j Z2{cd!Zl!_9Kg}Q<4hYN땢16fHĕ(\ED$y-|~ TL "YQ? :cÎMxz7EN* tg;F-5ߣ78Q@a M bl[3d3_yGmLaf84H1d&Kࢃ{$%]DN'Bi5(3|[$A_gu$fyUR0?_$R^$jȱq0>/`VgB`gS@0h Kԛ^21a 30$B!7^4$&ԙ*>yX%´ⲋ1]SAdT@NW + 7N3|\t'.<=BPá)2- ǍR!a7ӘKXz[ pNMaȤ%Ee(~ ܱOK^$gy"6ev*uAb.`5\mOGmj6яNV)=1'9_5^I^OQdhSIC2pMScKi&yTh0";E$s/ ցs#8ߍWbS6WtKόqwᡅJB wW*);UyU;;2 $TMtӑC5AZ97%L5W+:r'Mi@вT"/Ӫ8[aAl}uqi(tsgwiVE 5P%U_G n!}NYG(9(s Y o9WED͋dw>OGjR=8}_%nqV\`,f!M$a+XYfmeLBTLL5ZJ@_`';g쏌U̵LeғxĴ?A$\"T4P|*Rʅe~GQIE:1AwDwHDߊ~wE'rL=]S=jс;vM}D~H߼`P=1|tgK.{QT$/f ^Lʈ]6z'ȀPGXAf5ve p mVj'ǒEF$319G3kOhC&]%IrHIJ:`yEUϱ}V(da x?FLKb Yy;r q'b 6'8E|IB! XIo ^xq9Ba.~p<B--o(J:„&Ŵ$؎ftZMpNP1A5νNG%srsf{'=Nn8_᥿Y'E^sGW77гptxqaAJ]!rr|NSHB> k}"v]ΗrhWf#lqiSv'D]iTq o4 ;JLOﶯt XO3dlV-+CbA Z@_k#ThW'l9rr&_юfoz~'ek³* GV\SVh7o #Tx֏f$5tS,w9C|usEe X\Vm_JERc6ԙ5$S\E,ܕS4/ +g}ҪXKS$5Ċ"Ucr hՐTDU#x;X @%D|Km!&ue3/%Shz7\%!%v6b,tc:$A/&v \!A)/*NaKTe7d>;Q{貌Dggu`K`U3:~Mo9@uuk #W*2Pl5L"j n;n9cZٷi`} BN̷5̿T.mPg.ޱjztܨ ǤHb HXsuUUHqK3IL"儽E8ƚU. WT?f6e+̅FӢ^`)Qst&[; A^^?xZBi/(i.XYӜmeǶ-R-$// O\)DU $rDrQEiC$#8]yn`Mk`:jEhz,1C@[Our &X"vx83Ŕϒ;1 mVҒN/iEu-sHfl2).C-%%"eYW%\>2M`hgU:d|N h}ǧrҠع\+#ĐW[R|#ڟ$I6`IA_wyj 5켁R$uBd |:\|Q'XP{lʚ?2H6 EIS^-9&qri4ikIpMKqLovJdն궁JI>Nk_UA/]ؗ>wXbWp}+^ꊇR@ubhMtl4x)P4A+&$7>u(ȶUED$-fZQXdvm? ٤G 7"U+~ Q˵R^+t6AQPN,w 86 ]nɢ +l!UV~¨EBc(ҒrYlmSV#VVNd]ㆲԸ-T>=iLż2z^X a:HYI[thoWZnĿ]^QJk ^;QI2 "Q1%($l`mN9-y-_^߯W)O|{<oQƶLe(7l] sr*V3S^Řþqj`2Um Ay#.'z3UÍ#)+PȒ񒋰98츧cc3(*P͗2ҦuKlE _a)g,(O`Xn"Delu AyWŌ\κ<ㅩQawɽD)&g//;(5E11Hc~A;w v!i]sRB\0Q8!R],>7}x;d,걞 )_fT<O*)R1 Uc\VFŜn* !N:X39e}c)o 68 |=i*HrRu1}P3MLkc-;cQX)0  =tTnC$&GͰOK>ƎUL ⚟z:4N63YhvMq^|t~*}Pf \@I's@8^fS؇ '੖(<{2E5A cYo=×"EtJ=TYi 2Y4MuƇS fP1@.Qۡ)gw ꬧y3,kM *2#k Zi͢Pk۫t[5s`KFdlfMhf(PGΒ0C9sK:}l$y p@*L5 }!u)-R'!L\(.G 醜+q8ʬAmAksH1G/2c\SC(Y?6^ EC ŧ%+rL}0hU<>^.SG0sKsg5cj<)` Fv-m sOQ\V&$D+ $O.(xt:{?򰿄Q !vwK솸߃!w)]Vc&R&"rH^ AjDdڐ;K/V+X.v\Ag_O`X@;]9m#(]Sp1}ōaz{;,N(vA @њ$Ά 1CP(+/{M|˃ @5[\nuE_kTUxB,c )jl&ch́#s`cbjI&4z',2tиKNu|+FRF8 G8mHZKJќ`0Za(dRt {ė-7[9v 7 Ej-a ,Zy Ƣ3%,ю>GSXhe7qL =wYw(ҭv— A. 6<'] zg#.NշоtH<SZ?ۭ)sud-DN=d39X 2Nr ò'Yf{gwwx4U󋗿пjJY!r.c_]1Qb0~$ݪ)ְ-y\Ǖ]VMgE% %);-C`n=(T`Ù<u/iVPf" % -9VW*&d b97m8o2`RJBs[2~aDSdn>3ᶸ}!U&o1}9HiMݸrڙ^WiD<}(Xo I !|(ԧ-Kg.#\pX#yYG֕'UbXX6mBG'X;X ?S~W8cXV/ ˚tYD /S6j`,Ja_x0mc[% jζٓlOkmۮ&۶m=ߟ߰2X섛qn`ju ?7sA5I֓yAPb~ Z avmi~lBv4(8IqCcqs ?B!m@;ޮy;NfBk'"WL<~?DSql w3cp 1ԙ;oip)JeD廋ybF/[ Z)/%Qv- : ] GGlR*Xs:kA0EF\ɺjÐZN*\z=kCB~ 8K s/aG"W kYChJSA"L8}V2lvjtkw/6aVt N),-f$!<,_,zwS(y綞gy&Wqo9wIx4%/.qm1YF@V !8y~ٯ]PO8jO֛e(P厗vNmXsl6JC[+,PlG65$ݤ0q (" &%T! /J.4T46W[NP]X4ӷlp#vp{AN(0}<;} s9Z-%O\wL"{f= {}?B:ƧIƙ#7\׽'B ձm`37Z*ةOgB7jc? _"{G..•e"B:0g|)1Od@1+0Jdr#D\vljFyT.lw6%fsxlzrFryu-;& !ɉM:984V:,Gk%ژ (IC1&E7E"PPG}{SvxxA*Ji+tEDf("噿BhM4Reb a,S1+ :[HFd\X^&]DgD3"=%#Ldd4O^S7R>RS$|l#vK1c+aUB+eI*o @~ײ^I\xb?ZlI ?#^fX$T bo!SC $UAŭ`QuHy4nqٙ)u#|xo)cP5\LJ^Q8bxHPVrk@&hߧlzTsCE#ꖦ'VZ?!gk _&)\HwՅo7j.$%-8ϟmP\9(_uv:ҒawaaWC3αCI&AF` c3I-#gb(gB4]z'B;|gem׿ Lݞ,*fkit*4Mt7ifd7^!PE@S 2~[/KA!4>\ZU ewV_@߬1ҷbA|I̻We yE%8ٹi;-_;UpY[*P|%2x,.||5$Au$8Ga2g5a;|F s7&Mk: vu}o拏DȓzC"s5WTcF;< B]RܯHBf jLwp{j4˧6fGoֱHoʹ9[:>aKIф65fۓ)KA>qocmtckZ1:єd ӏ)q'T;hY  9?\F[OB8c)UuvQ"rai&|`>< 4p`;YpI  l^I0*];F%g?Y|#zl'S*t2+3o[A5\ewL)3yuVϏMrTEmcfyvQ幒z,y|,NKm:J@W&a}*Nۣa?5iBHR8 O M"^ K}6FKc*X~G*BW}~8y9 Jí8 ػ2Cqb'V;Ҟvss(.Q /K:']Rkbxu0TmmS?l 0%nﵙyd=/KJmBtLO^]\ /Sv%Wӝc~ZO=|5~:x+&c:4eF.ch(kK9(Tr^$D`$sbp|'[44hRC : k/z۰V[F;:R| \؁ nV5[lmYN){Xkڼ%y:}Of ^ګ!0CԊ?Y4"a7 HLC|B{Gktwv]Q3f]2TσZ -һ{PDؾ>@QrR (gn +^I_ҙA+C ݥdOi{ 7;31Dtnbf*玮չ „vjM JJP&VQQW;__+"y׆),0 + ~-t֘u W| S}na\-T#~#eD>8~n**õGZTDm͂=̧LC Z^JvCUpu1BR@Q(\X?rDb3M̐/XFrH.t(q@|lH=$_;lJTX]1hN XhwS1b ^MˮrdW][#v_h{o*,Z3Z"ڔCdymouxSRm%L[OmL9"OS>7b8aShCz-nqͧsR煰=Q"Cc@ާ x!}a\WTO?Sn`/K-9[M>2􀯷9.c5nnuwnhр]aY$lU3v>*9#<+i`CP'ۻڈZs_vjY_| :cھRgkN ek R9Nm?lcc!m72ቌ#e"qR M)~P+=GMEXc}q\y q 9[/=8S3󞖗U*? ׼`*ouG} ;ͺw~\륿ND>J,*[1F9:ZBavq#22(4ŵ?zȖ#Mk:DJ?Y;Wgg yYjCiWsb`;r@|۲!..ᪧZHvB\Eafv9t"$ X^:Ć"$$]8h;AnªjP 0Uf5';\\^lQ>lsV\*mx2g¹1}R6'p/E5\\qUz{]]z%,dͭ~D7@)>vCzZ#n~q(/r Мy˔^v%4RwQtRȠzܼ֫_ʖa3@`U7ޤZKĤfIQ1@W6+H 4t^2(?{A8zovsQ7[YܟICbT4 p96r3@д:&.S%OkJ_yJ ,Qטtm#g$ujZ7+ x^U*:+j_G`hqJb5'D>}#hYNW}bqnyluέPsvcٸ_uX$C~hk&;7䏓+\05=^#oq3BV{)g^;VOkJ*ak0?WOZuB~|/yS0=fR偐fo`WEZ OcFƺU){mVT'fiZ~#D>ZB7|JZ8ﳳۛǶIUm>~0 o!O!rr~M : h*(\ѻe"`z(ދ_ꍙXfvCl8,1!_g9YΦdQ݂`^Qظnfȶە}+D ~>T6LX0ЧUCS[5lbm#Lpҝ߹S2C_\@ƢdP (}BV -3P(h`t0')Thm%|AdK4E%?G}.%,ؕ< (`pdv^%T^p` F;y>oD<זFW1xwļ)]:91 _~4a-ҝڙ@IiG=P+; ܡ%EvӮƌrx_\v5d)O;0ONs?[ӕMڞ!x8C};'4COg|]ĵy +\fӰE,f1u*E\~( )L7Aw?:[ ,L[:o}BQfÊ<\p)6Q*z>/\TvӇh1+W,/5+gab ,63 98@ NRG9*B 0"(kGN{/ td˱Af7*4:4Vq&hϐ3At6U\Pi  k3D,c>c\(V;1hrrc5i֣on[{~HZf ۠-wPG0[mP d>Tqqx*or~ endstream endobj 113 0 obj << /Length1 2887 /Length2 30063 /Length3 0 /Length 31676 /Filter /FlateDecode >> stream xڴeT]M5=4  @pw{۝t`aZ2k֪]TYA( WPptpdafPZۙX()\&n֎&n@^@  `fAH.As7@fdP]LM\A@Kk (Dw6ߙ~G2dMl=]m&YFF'h vtL,u6@CMBU FJ\5"&=@JCMOu%=@Q4w 9X@We5P?VnnNLLn.NvSvx:@.@;?¸;t+E[\$5hH9p?{k7` 4/@ rOSuLW/m{f֮nXXwfDe$%ARǁDA `ee0T\| ]upt7wwbpvvʈ7Ȅf t0rto3o3H_'G'+@u5\܁7B`[Y.`ClT.5wt-@ A>Zvv&@L@1g+?'ݽjn.@-ksн/c}, ;߿W?_Ѣ^ @qފj[?.p7}^@3G30%UД<8ڲIPӝxⅿȀBmA9TҼiڔav?S?O]o(Hh2j(,UuT|IB?yc~N_eڳlk pi +!֤Odvθ8g\k.]FaofŧQleeĕz1%vK5FLUR~4߫ ېdsh˦?9΁n@]ړfȞ=ڧRГa]4VhȍkEP,_YxOҍoU D: \k S2V n&nN ~rz}&ʘwGi z[X /pgYI*C>+&KqK@=8 "մ ۘQ$\NϰjDt>^4*"C˜9RaW 0t[:IGNuXmi41;OZ)/ڣؗg޴ vRSZ*3d+_@~^{Q-Ϭ8bje8tߢI[ES|MO BjB'ڸ7~Ru}o0̮z) mF& Y "gUD"[d/]|&z d83",l>rZ \يzF[GAZcZ֎\tX/̗ B߼h/y͈^T ?M9͏ |7cCf]n爵 ۚ.: hXٳ6P`QPv2@QG[A;52HiFv.l#={&ف(_E_ ">!>f.OB9C7q^KU cdַtyB) T\X i#9!kLGlU=Ўf%SnYqmE⛶84vk{fS]O/ ō}JASĝT$`IU+u$dfF_\]M\¬6xYm ,qbh "X;[O@'su^]09>$nvN J/;9\MDpe(*HWѹ!]``vSQeQ]ꬪ[.[#}lpxBYjspTjo0k3oHiǖe0__~@&j9X`/1 g᧑֒:ގY?j}BVg̯G*3_^ &Qڤ8-FYlmM}Nuyv;L Sn~;xZtJۦT4gg Rhe|bU\SسR q!;7۽d‚?s CٻNMReR {G`.En/-Μ!lECZ]zK5[Wz&ckѱJu?p{+>3J/kl Cj0i79EeEkAq 7PYnq7.uS^[Y<ģYrµt-sn[aKc8\쟠V\u Yt! '~j{#I?` sMI/uI7>!_2=ͅƢƄ>":hz>)I +?NTl!@(9*9ـYiyR$6: }\g/ߙU'oqślEsTɆrK*< P,sSY]\ݻqc NvѲsɑ%ãMp.Ns_ v<ǣ.3~˫~~աim< d-PG:)u7~S ׽׏s ꎗH)6Z椒obki QI@;|FVz|w\G_ 2;zՍ\e@6.p7?J]"*Y*EPǨ V"p,)Cef{$ EF}nlnv_T_SxtU9zʁ G f*DdBgb!Qeφ$xr)VXaJ"(x_o&7- ?ALL.{b~n*kܾ7\uN͡_OT ! 2'r2oAW3qg;C,S,1/rx-?Ey i| 牴W7`յ_75]oQG= XbKV>O%S?6<3uWv;[-NjԶ f-04<33$!A SsM{S~T6DC hU:Wl! EM |SAajD\t:ř,Ѩʒ6&8:l""~iݕvLg\f ⳍS~18siR8щfCOƿV^XcDL{BJ 0] p^-Y?(<"^?E&e,u ^ٻLX~lLqķot?)BY~})"ar>tDS5,8o6ДǛTah @f_gu,Ή,bf IS UUinCv (g8A@UD׿Sgؐlxiٚr}SLym&7qHk%Ux!X4 1B*ϣI3sҭN4W=?㢳o쪳 =#T(N~s,y^&ƭ* 2C!"%Dx N|&%^w;|_ Exե2g.h/}F%qyAH|oj-ܩƫ!'G?ʄ3(AclCC s6&CϛN#o =Wj)əu`.d$BcP},B&Z OL|sNn&nyX1g">^ ָ W||ŒA*WC|NN IJ3s&i)V s-#CgwѶ!zu(Tdz?S G6p%e$1 '8B%f*9[|fwm@WxS/BMrY1i"{R mLf \`[ɣW+,! ծff)}AA+<_S0~e~wO(g1zӀvxsɉv] M2.ugvH:C'd [|>e)t[>m~ 2Ǚ& ( x}h*s~G԰wno99Wl^:5%&%neb.&UoB'4 8+@atrNaWJ*)ThQ0,MlEMfB:/sIکA1R S&75AzB)I&uPNVdy ++\X$Q< ~9s BTU@q=ay^o45o5a$=hxrqw۰'7{e$*ikO IN޽K9v`2ϵd, OwUZW R#J9zuKfc.q :|VU@ ʃBb6'^:&T&n=2Ibޱ|cVo뇖u/ :ab>rttI{UcOD=7m,#[JTu s 6DN Cw wSO)Ua1%4,N}I.B'9CstT6Be`놐s;4jJаc 滂]3;JFO]zA] nTsk2Ƥ7Vghs [rva5m쌖|w*, .2D]Qe¾lV}􀂫m,Sk7SW6)cS., 4ł 6Xdgtfc$K$buYؙJkGObFAf8 mdT,l 9P: o,چ%؏0\e(GvVDZ)"*̼lH=S)\F9scpi5{B,"zrq wJ5&Y649EXF%m cfhFQ8~Z&(c*awY-x۪2 d9^rL~9Rh_+&k2 QK1tɉ>!ܿDf]= )yk]0wl.NlqjX #ˇIatVFؒ/"srL=>U Űa3?Dxe\i%X ob5ðr׳t-nY52fP^H'}zl߳ٮ ))D_&F72 LzN&h O_ 쪨On-8ﰘیeR5+/d'bڔSsu*b'\Ԃ8-߯__DG,(V 7e:Ȧv=(9dmcZta-32pIWmIN6<ժ~m=FԫM%zԺ^'8 2OT8\όwXQ-{IR/WN] xÔSȢwmx%!9C~\3gnމEQ}sؙO>Rm\Y; Qj2Ql%6ʽxZ`ZY+O`fvJK_d<)4tyOKRu "ɹ{xiUOjr戰և5ۄ6ΓLf9kiDC; "S`~ja%T3])8T;E%z~-V'thȉR=uY)dps`%74fď֑P\0)iMz,?[~Q7u@U ⼈rj"Z%'L {`/lRǃ!dzOR@(4l!Qϝ"OcG`yL Vd&pF|x9F.Vק:4R;$Ч4`DθNp^t_zjɢw*:F >bmfdͥ;]m @Pw0gp F|'rPHJXD8Oz*B'(Ntm"ts م.QVjp L=G℆$<&hG/C[XK"ԊC#( ulɏ0͸^?ٟ`n ( Q{wF褁%o^g"e¤}U}=hg/);ñǨN w7Gs%Q#-G<+?w?ì`dcRQBC/!)O',`Z [Ǒl^άsй<(0j-nrxʵP0=,re<ʿFC˾,_܂G 'ܿD/$czj f1y 5"]BdoHf/a+ Ic[62U=6.{E?d#LgW.!bϙwxS"FSo>Av"]J]dOympe)>Mq5ŝCܝ-,mU]ižx;R>ukJej)"py&}78Xlfekߖy)Vb&p[UdO w݇L1USC1j!jq8B]U45K ӅJr(8!穌G](/︬|]HCfB<^CÜvDBBcbC0}eX.6a'> "L1\vR3XUz찐PrD$Kv F }? t}+BkMJ֚6T][lW2)XzQt)dం/ |ᧅ6+Dq͹Hiߚ8(r(lxktWHol]Ѡ>'itʼqKk/=A\2;օd3C.SC&%̥ XiMڑnY"s|t XZ"H!{Vu ;7dDi'uoPjh1IP'55 kˠz&žPe}\_k:T?hqo}5\}6W;%Ϧ]w[;ĝ^ǼZeF\h$%7|IV6?who>ŭ08goҫu+HPް$@+A2[ϋ^]BڗbECj.nЏaWm` GySp*G7Ε4ÒRmRs?ʂ#uoV4n$>3"4WzͶ!gc'vzqTK%k\ZG}%, ԁC# DI 5kԚ\k!| &3`kQ>"1܇ި 0LӲ FP5dX<&0J(3s +6龜Co<4cGI+GWz`*4X8xݪTL]7"(v!MyT8m2rE +ɭe@d}  r'G} 4eYG9H'u-X]fLjc]Iot@m6+Lg(yJKG5dBF (,w"#{&xFf&f~m+ˡЮd]N6%rʭ|h޹3C߄jYUAyCkif#ɷGMνF,i=5mڗF-!K}eg'a8qWFj+^ ɊM#Z3rP~:7 J>ic`[3Z0 E벃UyZC/W$2q/1G*" )҂Z'?70t|uVƩTG޳'vT/CXu2vW١ښW) ͏u 8pچrDf"Fzl %0`gh=qN隷f~/!q) q6%[y1}Bv-jKrzѨ91ToqrEl{pAgeƤJsغInDGCV,މE#!iR%n0(ѝk0*솺;^F9♷(hCBs?xT:ITM  `v>\ O)2B҉W޷? * dV6e y&9]Ek>lK"6GƆE?ٙÒ;}kl0&,SP_{ךx`E{ȖFܩ|{'O-.Ȕ6)p&jWsgF`>^UIkc.TSKOjlƹkǥ[RֺǘЗ̄ӆqDg~X '9D9=|/KI-Eޜ0uXq&xږEk;ld()r6ɪi EXkgJHmj`wV\|@s3JJ97JD W+[w$|m$'gXM^E>HS,̬, WsP7|AĒl 'T#A^'[euOɹW9OM4 Xh-jmrD/A7 t^s~D:Gsp hŊBxpO!앛iI9џ8fyd[P2<=DjySkWe;JFZk,[ YUXHސ2yc<|iq07 YyV1qf Pgk Έ=h5rsU.6Ƚ 8aYqly=wnzKNڠ4j1"q{hXӷ61r % b*~緂YGγ~9S*Vpfb|?0}K$IOu $j%΅c-v+3sUس{( @ #􍋃_uJy%[t~}S٩.dWς`,@T0GSPK{%U'BzPϞ dH &czYEO`ӥ|Pc_ yk]e*4{Wγ W }Z {O8TJG{2^fCpŠ+"D7pG\Wn7mRxHI?y@(9|='ǛΈU'a ^B$#1u-bQ`UO*NkD-mSc`FПE֡`^P`n*-jVᤠ>F{a _aR ک6io7Ɖr@.XE^UhFR][pdL+qyfau{>ّqV/iO8:Bm|u&V?L3,ZvzufHû:f\] zvJ3A; ^IzK+B"< -<ڰ/Jֹ橒~bMV )R9=wל⊯U?%̓94N&ܱr(+?I+G9Q,'nO?9q<}^ !ojX6?δ tIsSenwz)qcW{} [Jʝ/3lALK5#"6֣Tp#mق>\? vߙ]uvKwDo Wn-z׃̆۠?wGo wد.ȝ 6T}}zZTT]0Lo2+#4L.?8lA?Fٜm5ecl-J&J-g2S(O8Q]vHzjhI6Gqfs:N%KwoYZ׭ޒy P 00%ˀWGĭ[NAFGA8KՏ[ԍik퟈Ep8#?=Se=m>Éa"|g.ݼRoAauIUV3>.yD  qqYNgw˂ qCo2Rq̶"a:Hvxk@PuШ5,9肌JBY] 3;]nbH{U4n&&e|"3뤼v)B/nxՎ-WɐVp|5:8uE駭<煮 ٚ<1c6ü0 tjͺ)'ʫ֍ 0*m-jN4!wb6`"9igڽ9?LRШbb͈ѧ`+RD'rH~ox4i涇}7Բ;{(+!9o Yz96JDVF#7dnuR4ˬilJJ-T ܍ۖ!:_],ަ$%`ḛ:IK[`^d=˒__u;S;qɤYC*،=+?RI:ɰ9K֐LQ;Sl4:ᦴwt\d wgaU 9fV& ZD,ȋJ;.1. 6x"OB1+4Ke3#Fr$h;ʳ*LNo΂tXcC;yTgnD8a_z2NaNߪ%w` p؋T.ę l3=1xihh3CZu&SöLC{<] Ra~ppEoy]@6.kʛ дݰK7;nAg(κA@ cԒ`xUTg]R}(4~\qEĪ-kyжgO:LJa.м+l2/KMo~Բh>#%Jql+h 0MRjZ<(kB| (# zF(K',N;"ՏChb0s.#Hbf!஠F_8&RipZDQ5Po5.*n`Z\C{A 23&zee;9EmЕBhHYL}"Qh3)RuΌc% 1X PTg} k2Ckz(Ե~=T<ސ:4⳴vB Y-P `=ýn'b㔑#MPGґI3E@v([:bv4^G%_Ӗҿxb\I}~QYwMNbӼjR?1oHPjnSDdzq<] U!9>r紗/۷:>dq$~5CR5rުw1vU8 UEzSRlD=pWfcAem_% m۶m/۶m۶m۶m,zׇEQG:"Y1޾;@-$bzh b.~ܽEઌ!𚒧0S83^-5Dnl #QMI4]Q7y9S4@}˽D1ܒ'~ìN{_c\cG)>߃h~C4xR;~(F ˽MZ'Ф׿v3l'mvBfZp-U`" bP_3AƓ,U \f{_H &^oKcc^JUJ\ƃh7fOՆI^?you%ƚZ)=t7Ęy,^ۍ}׾h{h 7ų_"Y%/5fH)Kj0T68+؆M*`qrjCGGݾ%qn5½;y(E%Ab,$RB6\p w% $D8lcVh!8"۳%n\c\>gTB,p)1]Gsxq{ SBTeWGWRՇ\Qipo.:@<_WI0 vA H{{cpK y\[>ZRrVGNThIP"Y-Mnp?M|m׼EVx}mG^#I{yLFrF.So蠺?Ly^-2WG;8nY+h*GC>r P]C|1}BCI!hHl*O٢Qն+_u N .FJv+ȯ?DϤ?՗% 9ڥ@fXAl5bLL|]%x@IŠF~Z'W ^~>bO-0 9f`hz1Fwa|%EYj5Tqem!z)$*nOD!9<ېdD\5fP*T,mXVOّ_b|z!}}>3 o^A#@<'a22PKCi*S ` k P8i Qu<^ޚ~x%Iꋔǖ|4Kycuḅ7D]<4ˈgѷejBP?p0BzU@wcG-鎖1mUtnDcj8+\ Qy`CZknn҉wxpl62`{;k `7;5LMgؙnN?`\3پYHs43M\QQĹ&Kҋ 슩W`eRk1udۖ5SdtE.{,T#s`-jLqV{tw괜w#SX}}fwBLZb {]񨳘 ݰjKA9cKkL@ɂQ .AS]7%҃e/` ]~*]yipo4b,~_*K@y!^%#șu\R =ZFԬ4jc-,,B]3^S:s> 6i0ט:Oƅ`Ԛ`=}et-7H!gWؙxkjd1dh7G9 įzqm1*"w L>áPt"'ٖ1b+6;%mta?WY%,Ƞ[00/`M(Sڽ//!vxj􂜳7;+,FtN6W?9X1MJlL6>CιCt=!H!B]j>Hh%R$b%Sox2LXf"Cj=MEQ X= R|l?N`蛘:Fef7j)0YW|ZEU3BoeX:;B Ԧƺ+h>V~򛁟X`PÇh(v{|աӷAEjiw- ##߹1@Frt~Y<D;aoc{Gj.K 쟚'bpg20lo`#SS9P\SMRope)d~^v]Y߰goҵE, |aӨ)CT5_LVZmK0:N\VK̙w'SQaYC~rh- 8Wṱ}SϠfNP 5r썠 > SPL@kSLTR:&Jzϵɦ\&/kuj>ߌʟrWj OvL}z ~,[0 ]N4s _ݶjHLÀ3i|#j 9LRRUXߪ&OK@@n[WXxn6潲fOSY٠Sm:r©k9%AM~BUMyj(vж]vk RWr\q1+Ǩ'7s2YȜt㊎|;~"!RqЅPD;N,4wyf;twΗ"SL~^gېExlī k@4OUt?h_^2mٯ.DlOUyhTL\,:]x^E"X)*}B6=%p$nn_Qk {:L(R (&uo0\.bNiD"`lTGG <!do͂;q}29l K]=:^{OnfWe(MpCKLdp:4zp),XsrԧW42%gZ3eKVI >Oƅub(-?h}٭yJ`Ypy}DwKfȆ:ms9+??M ) ~b1 \V,+DmaM"?X$n tRWQ*".}T6M+]C%ao8 pDdՌyg+'-TUa+ ^c2_hW{uTr+?,C|j>塤(puȳY|5mWC+h0ƺvA0KM~f1!bs.s[?ig. H^$ܝ*$޲& s%xQQE2l=?KSr/> -UPFlu'og[T)bt-sHUnjBzZW֭NJn$ ֶWSَd=1,eKYp̤ /?$qlkOFoYJS 3TL&o#`y)SĨD‚eO8wP#Yʒ Kx y,۸^g[cLʡr:7{FH3M{'Zm LF:LrTΆ2Z1Mv Uv5sﰊ0ljoax@4=XKn*Y5{r2+d_0D?+$@v/Q@}'xR{d upOy C.+_n{f9&YlzK4G ?s˨bs\42\W"0pfb=*bv+y+~,awx=Ǣ{x*WHD9/i-8z|a< e(ӎQJ&*b(L£˰*n!ܓ)|nW2 ?hhvcMd琔4(kBjuGIZ1~] TgvCwm n}=/z!9ztyǬ{,x$yAXE$"7k_~fF%1\n7Ԏ{~jfJr P"3äN 3oУR@C0V(q wnwogfNSz%vNUz/e$gTҡ9;En{ D]iW8IfƋEF%cEIQh9[1w/% 環:~=4ٱwMP!2NFL|!9ӜR/&Wp g[QeKv3\GbyeP66?VK-Uc FBPXt.8.ΌB:G:R ^$JwOB/_EQB;ޝH&Zʋ(2ţ\'qk4hzP-@\+ܷ bR;N.8:t|gu@t@ޅp>_Vc!Vy$&Oy@ uwZ7;cnkP P&$Gs+|@qHA$FFr?ؤF duCEo"J@^9A\|&>cḂY-@0@dEߋǹɋ@@3ZAT8}`r'r)o2@A$ݩ=o0o߀5u?3$8G6$*n5dFL2Qpg0T97})6l%[cNؤrH:t˹b`>lϼ v[?1 D?SSC}k#'egqy!A-7_E[xTP /lY+,Wj,j,p>6W~A/߂\=q/oIŴq( SbCe6 N}j&a^uSS^Vp}gE韟-hL5Ũ"~#? @7,Df,կڡ $8 az-.}Ԑc۳ޣ 5Y Sd`TCٚ2cVO!T,:6 x(RX^\'3jr H 6ILVe2-"ZeڬP)t/pw1S@dp0??@ЎP%O!}.Js^%J?z*mc˨ M4GA6DFHPqoJz*}Ͷ>#.58͗MPK!=T4/C-Xv6Zʇ\Ro&i y~Xb$fP֨PM,GB\yնWARFue^ Eҭ.Ō0P0őaHBd҇$EӡYaݎ¿9>,Z!5@i8 _}[>=26i )Ke]*DRsW\xЛ$r[p<S{B"_z-- ;5ť1'-̗L4 m=9PF!m]|v!ˍQ4kCY⼹2TXQqn(IB7Q6.QjoQDHӅ#)3h wI ?S %] VtSu|<,Qtwlgꢗqx~P5Ni_J5ߥ PY#jsը]Hd;qi­v]7»%lJpis6LM.F!n0:C/?]hחn/ȴ#8esNF0I/Y[<#;A$;T%)ZiUh[.0W1uŞ d>{+`9^w%t*,OWs96=>k:9pDVPVg+m^=$S8K dqE(̪Y ІmJP!M*NTWFG<7Q$wyRxYIPnuY5pVKcQg!# N4tC4߱P_RT^ ,&Όa%w{0q+gi -xՒ-+ieO/#9"cI薔ﯶ؛3M]KZᛛ L|MT^ !d\<) 33z[.W?\V2]%V:qq-M#c?d\N$bώHos\6 ^d(v[\ك0aY?{A!!5L3'$~{>D :EB#E]v?dr-AkCεoj0w e⚓"kR&[ -HQ9UzV ]5[1U,= $T*\F0Qcg~7*>G@ 2:QKw֞(,^ 7FQ9_9ж׾VM_l=*{KD"&]#,wVWg~ jniQaW(ODy'Tqx8..9x qKeJk@H(ml-}b =sbB 6ز&ɒ5KTul~+xO"Q._SAa;V:ʚ8!SjG6E QPN|yd lY~_fe'BvXk3S09߂Eu>EYm@i`DvTq0Iͼ!ߣwfdPzUR.Rks$eAKYL d{%NG:?7:w^XhH/Ho|1,ծ<=kWdސKWYAwt!]JzS6v~>I%;x<[ˆZ&MEgGo?Ļ_չqepZ,Tj/ ׆h]4xzC^5Z5&#X͐U5Es*r*j|K+?g(l[eIYcNye^J+}OZ0 J%WXXy&B"V!-F+.*U31[J̱ВM>jXs@.܉0Um]HήMrR#k_Nu´o/mM[_9WCL _7˻d 'oaX#x^qqHТ{>zc˫L i-//"Q'´?ʠkw8f5Si #G=zCG Zw%5bH4g%\ :%Ax 1>ZaꘙNEHѵlYL VƧv`mys(k(oHws3n/fлk|#[ѧfxPMYh`~4IgfqbX&BuHK`)mTLeB2({Lf ETRf7.Gg3ȳ0<"t"CxSGLq 8boz 6/"\h.~ \G,ŗOQ p ]_7mu:`͓z+uA=V f|Ң5F7,l"Alm Yd"8 )J?\@@jS9"~oV-oVz k^l޲o5\&ex#u{\c]B@"JwD|eG[FŵH2@F*9ĵUZRu1Z i-@r Ec?Am5h+9㚸>.I;=bQ(! 1a~y{6q2F%Pt) OJ9xǟDFKK?訠+u#Pvh/)͔4]Dti6VWU26@Αgy~q,41'@nb-a`>Z^!N;9hޏN|lj(/7$i QBM96 CW䵥z!Bz6OSW-H% 8(85Kq$fqSKrh?\K w1V=Q:HM',t~ d{ &ڜ[Eyg@#>`h`xx%G-;Sm@հjjZ6TBN%M+mAVzӀ9dİ [oGS#g)z{$aW?@LiN!+1[ M՛-#.0+ Hp#^ yl` {Bq3ORATȔxgi4yr>KJ*^G xsS_\;BMZ_`.U>k7 pS:c =(ZO'ڈR{rI t_NOfW`J@^׊tgfP+(loN2 4.X7v]dB!7 .02gY2zJ81ʄs5VGX)ғH T9[Kꉹ7*]PXpwG4&:ߎ"f1D1 koZ2LlBDqGӾ O7sp:m%1qty3Px] f0<@[H>cn ,䳱( HݸFu#W}NdzbAG!yۈ'D[vԹHOzMj)"ݣX%S AՈK1h}2Ⱦ4u[201'`{7%Z"X f"eS$M:AY"ofTKL`Wvc\BR.0B}N o!QRS,:O37]%1{ O3uo5bpLkԘqCxכۙuG{Si)a+ p J! XEmWOэT!b[ qѻ9#ٶȖ1`}.R.WVmgNP;sy֘4rhbhMZ97N^hqMNy]2r2ƪ@2l4 g 1s-:6F7= q\+ݻ/WѴ  ea8)(Ux;Mz [y"rEwlêӵC|0E/߰}5Ⱥbܪhh0$vY?}Jo 5lc dzXOYoAƫ>QmSƇ""xa[ۜEi2,;{97?u_(|"4>4*3|T2yȶn{%h᯳zb Ȏ/˗Y|T[~J-닓sj4O7}8#_ FSMYXɱuWꮡ@Y2 7?E.cVR&L&.k!*B|nv3"3!sԿ_iI!]I[IˌdDJi;zx)Ɏd >MdJJV.bb7(G=$43Kvz@MDUlR. Ye mXC_ -Uw >΃ǔzL 7(Ky(/LjN0btws yk9c*U9kWƞ@r1R;klp ZuYPƒI T_>K)_F(Bu$HڝN?2Vs>m; m.1܈hJKMy)sB[G7W?F̧@TcQR'y "ݙNm;h (ZH|g,d821Y7>K4\fץqLW qdiHj]۴o~de2gǴUzkz*BjmˑT=sIUd1TiL&If Tx{q*>meύʝ(rR'j깩IJ3gf(lp!٫ Թ>*HJ4[+yai0颍ӎf&YI!p3kLF}lE]^mHFDF[ _sip#4to`RlS_Ѓn3fF(9ݹ" GQl/ys1Vc%: O?zv~mt܏ ' kUaAW x90oT5l/LȱAy%F~ g5hܹ=3PӛJ[b,~)p/7q'^ιA^EVƖU#7@PHAm)FL|U?sb z#|u#*cӿ^GsQ>.c3'IْlSITXUJ "_3VdZqł4Җ1[lJ'(;<8{H?*'@34=XMfbK&'=w{0]]֢n~:l=1Jhe 87*Seuʑ$-8n)$h9 ak7ɚ 6{2S@M9 K&F%9phobmK» w ="v/,˞ڃ݆ .&8o.X>-6OT ThOfDD"-lA^aɉeit2SJĒ2t'O97s/]n4 j *6`>Yzc?<1peFlAB+[#;ka-+Ҽg Աk f6*BҶv:}.{Mq/!hifkEqȎob+1 K0mQk} HW.4פdn,FS&]{Fn;j"#LDX/D> K_fb*SFgWjMHZAT(|OTnpnDK%lin <̔qWIL7QD$(O~K?n%;" zUP09+G4}g!G5o嬞2cr'fͤ)(BXdUsK];H,K蚛p0!D݀b*A[[Mx:0I -y,BjM$z#PB a]c=3^NZxMO^_ِآr|'}1mZO"y7ŧKiŝ)_ĈJ#K>JDž ؒ`/Zɒg3)%)6}`^K5d1z GSW4MSdgO?R{ endstream endobj 115 0 obj << /Length1 2308 /Length2 17547 /Length3 0 /Length 18948 /Filter /FlateDecode >> stream xڴeXk5܂K7\wonqwww'Cpw 4 3=s~/YꮺLYI l Ll̬y0$ 123r"SQ;!V`1XL!vVV>d*4t|UL @= @kP;AL^@H"ww'o1f ` 21+0B+-0Zۚ5@]URE JXo.jҌ QE5IP [ zoPT{j]ARMTM[YO 6 OF 7WWsG_ =? +hlo?5K+'+gk;!s&y+S I /k+_^{mOLJci< Ac/Ќ_qgG?9O4G] Z1M '+'ӿ"V?/1C Y'*!:<vvvJvvOO;  ͭ@fnlϢrpJU%˟d1k=sc['98:=o02 ]dKTڿ֔uG [wE yrI9*ikflge_c CVhgl?:+')+7&KL [ _?e:׏՟U?ש4|گ4EAFMBR/+I) d`;:#;ùnM !s# qXF< v߈"7z)x,AkLkLտ'EoSoAo`{^^-M8_3nl,W|-_Y2|m?+KW3pT|̧xZr3%vȁ"E~E`y~}dPUF[ROOv}|$Es52Vʻr ?seǷǏ:{٧^0Rۿù/8b`ttAA^pbEW Bz0tR ԴN3qC+''QѸ+AlZ\:zG# %ahtsS.Z )5fw ˖{LPJ2v$Bb/ o ]%$2sѻ< CZki[c܆,JgJa0$P~έl=.>bIvv((S+6Hes{k=SXh/tWbϸ[iklH~?܋'\SiQ;_^@rhm a?!!h0!߭`o@ҁ$q]6PZ03&Q..'w٩m&LP΄ mV):);+K0#,[G MO豼mm1i)*r|BRY!OX?C0zRB0dyfq*)% %$Ԅ049bu>H6R:ɪ%ed#tד}I΢ 2D`fh52]OϠsflvtd{)7 bk!NÞW|Iu6l]g}cJ@FrpşUS2pK =#1à3m})Dr 2Q'L?}/a^[vr8nB?Z1zW({[ט--Ur-7J;82ø-b͏)L/+,*뼵23Nڶ kB虐oc^?*3VlD>p$Fvju:)˝Ypͪ%ȗGb^"H跜d(󻢼)5[}܁e '|d,pAX3߈/~E o;=hvSu-۟9W ?32]!#;3[-qɽEBXiM'>Z 4cm+[x&9SDs|Ib):n} &0pJ Fs_O!^C/O@k9D}P=`gX;'rڸ$.7`ׅlFF?њ>L4Qv o/#ٚ蟛oqݓ IBg <]+fW3L!k 9af }gXKX^3fD9vy|Q#{k 1L_vj9].02=3W4=gzGoP$ ,Rxm[N"ENi,ۧe#ס3[(*Dod0$j ^>I+@7+h넬v QQvs98 2ȸs:k8DIn''b9ī{2c>>]^%izM=4 М:Ϙ y?; sy_2h'-b0ЛX3_:UvPvZ,[h]Q{uVoG9OԘ~iA"\ʹG(YdFK/: /Y8osdηۄd5Y y+%- [GI3zt206ͱFY?|:2K\ces [Tǰ3í$XȄCjj]"QG=_Ecsvsia?hiPl~2aJ3<+. *!#Q,]v wTau"h|J$GbL^ۆ8aUtS# -Q[,?9_UCAާ]2/ )^BO= k m|h>C.L/ruJ =/ZD2uuS10u-C=v/ۿ7~zЇv"*P>44 FIj~4)NQ9)G4q Vp2Ax/ՍL, RVnޙpol>2Dݠ W#&5p<݄1\6)=Ί227Mn鰏$1nX-*7w,ԣ237Tˡ뒊MWUd]ڐW~ zUUnOlJ%$t„h&X 4K)2Ul=Ih$)zVfab)PMn7'1r%Pt(3.e"Vݯ3yuDJE)Rފ"ތ8' Hf#Gm!!JP&/i-{k$)ݪ%Cϋ &GV< /{*np:lmQ4 |H\Jr5ؾcQ12 hE;e程x%51ՋA7XՂŇ]Ezd `JåuNZD"+G]:F2DI=*ߔl :(yZ42Jy0<<ߚס /UcSf[XɵԔYl~T?A˽_ٻQi(`UixoQI=Ϗnz+8hKvh|afex-Hb "҈6u}|LQ bڠJ/Z xMO.N z!ͭl=\DUr" Zw7b}ކL:E[($-LxԮF/]ڢ>aWGvǘj;sr:s;Tfn暍areK8_(bikMeMvns{J Q_W0x;cj0;2Xw֙,2~lD~kB}yI 8M L{ӽ?~r-(ŎRr*]_JU?ng2?Cw{n_V+".`/}}.+jnN*VG98Q RuiȶpģCS#$VTYRix7F0d&惭l*j/%k1Kr`HxuԴ/׷$)2W| Zá22[O0v! ~v(yw!%> h"!@c~^zOZ_S돏1rP+u ѬMy,)╼I[-‚pxB/yA9JFu( Nx։j0}%uX2W]?#*->Z"+ۓv}2 9#&kt!,B5(ofC*š7|C0*֧;0W <ɗLn١\ǤsGXLkV5۵46$_Cw|{D]yC9W +W #ftىZðD5Yt'bGkX[Wt]9#)Xߊu-wdh3^|}7Yw{LCO"KШ2q1,o:궞ti7!L*_E%f;b7i,BtO'%nSLEm[c\WTYޫJipF*DqӬAvU?dg1f-9E),D'i m6}kBK۸9"*ؙ޳ TK iMz_^DM"Z=9}DAo܍ nhCc f hվS"bqP6Y2%햗Uo} ck5^{/?g ޽2Bp U_S׽&ͣkpg5DԨ2|6o><gZrK6M[)qW+hi+n>{sk- xvKcږt,D:M |ka8d23b"Р>~8kL$l1 |h jJR*"u1|Q.0/nGDBNVmИQ drRbS %4 $%䙛`iWS{OMI7MG[a.LfS\ڏ@DQAn }+*H@;Ff(vzKr2 vo*<[7<[@c@HVol$9 @5(n:Cv"#?b!N73Vu٨8oo(Kb B ,a0L,9 }0ȽrUJu!`N<Z.:gqU߄(SM@)gRw)4^g*G]Mס د7nºߨ)l&8EBK=k(2&v-eסپ$lCwW*$Bwo[pY#]]][*eYLAv>񆈀nJ]*K>!GnR("[,[4SodzgΑkk&Jrxmg9 ċ>۳<GU%=VxXm:Voo$e*Vu4#Ap؍7K>Iꙵ=  s`DwTMFWh)WՇi}F6LEb ف1}'lQ/;Xlbw7X,{Ҧ0qؐd'h‸E͚vuM(axDo6c&wdIrt[p=Gϵ>}9Mv} (huh{hY* .~@H eD;nxh?F E+52iNx:[-V7LR`PxVaPJb< l@CGD}٭oK䆅Q HԒ02Iuyoܺ u<&s 2l+%>8oSL**w~QldTP+)'hxIc{[y\*k9__;NjOMc"&. ʕ]ob8j)?CUpQ?w5Υӝl"3Cp\Ao|PB&[PчXrx Ɵ_PL`YDr-6~c! ̼YY]0SW@!@]e.(S:p-L.,:R#،Gw|Y24$=c(HH 1XJ)YB{![[6{0$KE@q# xf4MAķp 5d  - }vJ} C &me7;V21`*߁m}&tz6Dِ(y'oD.T2 INЮ5n8p~KQ>jYVx>^ijx J==*r;< rD8 UZcGY^-*:xu(t~.mZy&wdY=n%!cOpLVr 8g߯vqw r87 US>d!wf>sQđR }˘=GsBŒkl_.{7F.#CU24C'rY]PfƝSN "ŧIW3 ba7/Ϧ4;ʙ#W9!wq~J,pZ .8e0xoM]x|5B#cISM- w !8ݕ?]@< "2fJ!2ȕeE rPX2JU(:y͙[[=·9޸E)ܗMMEs>c}݊:s=G P>zPc - ^w@5#FhJ:Lo>Z:YAY{rKVd\mPŧuaaM _5fq$1n!s+;&$Y6VIJ?:qoaEn[Xx([+NsHދVαmM=M;P\Îd+nAS_1@pʎLqi݁o7oyУ_в+iyk(~ F6Ӝ }sNϸB{V艮}N[oI\R,zx]|=q*7."uf?ع]HjLΛjщ9D_֑>]v!c@K$fUtQp2'UԖE!vZ{*kf-+'.O~"J'j,c6ZM&ף4!/$u ;~y J>|qxޔ[l:¨o0I~ KpT~FK"loGg^RȬXUAJEތ5z; }!sɼe7;TL,יN>;)ੇ\Ay!5@~̵n.\v>{6R*rbhGOv3f p3㦦 VΗl+Dj˂][h0 4r/xivvLoͯa^,I[~$.AkC65v=Pa{zP˦ V :[́+B3֋4l, CŠ+=wN!ܾoBBHA{*n;,놯# )lrMc-EAeLLsS- ݥI_+oj+X_etBZĤzhj{ƝR9 ilRN*J]sRqg.fp*åO yh(>w'Hp-bF,2PNNnj,ۥ0y\ 17?6hr⬔>m~ALG#/;Z.LO! ju >|K=Sn\f)]v`|7a:1$(%ڏmFkDr.^rH Brb bko].9 ! ┎x;6".3u``Fk'ZQhdze^IX<^ffH Gu_'Q,@5"dJ 4@MF122(TsS*k4ӿ]yKBېFzeEq2j+oABv!QX#ǙyOC o֪uط2`bZ0kX0JC—6,AaZCnz(4%ܳ.H a.Q7,9n'UH*N-лxӕB1.tH mjGkOI7s+՗(&3;cdž 4V_#yi`s>V^ ܻ';mL\0ާ@f/88pNp4#Bx~Q6@ػ/oph+.I/ ˳>W[#TȬ'S|q=Ep.NT>F5SSyM`?˜\X&kMPtB(i@&TꔻT5hbG8yaӃzmDzXqY㼈Amp endstream endobj 117 0 obj << /Length 844 /Filter /FlateDecode >> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qDŽ r Gէn8A{,쏘LEvDB``B9zK~;_q`>Wgy o.>ݫﭯAbZ%?6G_Nzy;9ڰoiܰ^]0zu\~3ݍܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1gT Hӆp1X:,p8}u 8alSM3?r>x\i"EܰpJMkl4\?ǚc:#?^YHwuprQF^odž1BЖEQ?1^׆ƨАԗ039+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrY׆}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *.MGZN(:p~7a?}]TyԟE}Ư%Vu'e% endstream endobj 118 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3FXҝA5(O)suߖcHQIܮQW Lڮ9ˊ6nK5NoغWi~r<d(Vu;_=85vѩֆu5CNmm悥+U=#)\][|, MHS"#p #>y| #:##0)%T\`YQqJƚ`ci|1Mَbo4m `2WQ/cW888sέ-./qJ;&\ k(d?F#h0\?Ipa]~9Vk?q1Bx.BzҬÀhƘ'g 2xk=6u2,bق6E0F,eL燆LY` YecODV3Μ蛳;zr֟P.O0{S3ux9(uF: }6,V|ƌV|gegV|F_+>O+>G|V|~+>C1 V|B|FB|/g)g1{!>_|&~'a9i0K!cB{XTK5;)NŽbPq> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z endstream endobj 120 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z6 endstream endobj 121 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R!ݪ70W?g_,ɝиYs{ ]7;׺v=ߩǡoݨM'opiT}IAu~\3;he?<{Q%(SVk-#&9sQ擾ݾk^!00j(+m$?Gwt>X.oTuþ{S_tpСtZ|I1?H/'BZV;ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCa endstream endobj 122 0 obj << /Length 845 /Filter /FlateDecode >> stream xuUMo@+H.ȲrhQի C}͌6jo73o{q3fѭVO4cpuU sk/wOwquy_t}??p]AAu~\33cA}P>>%t;en>r8`S0Aj~vUk&Yos yv rOiHM0[7v,ܜǽJnkz~lNͿvt*amкq۸qۿ`J-ztH]{O|, MHS"#p #>y| #:##0)%T\`YQqJƚ`c2U{;5Ҵ!\,18"\aD E_sN[sS9)9^W$js7 GZ ׏p$uX}/S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg3?f)O5[TT+&GUP#a#7q/c?z~#袳rdbP)n endstream endobj 123 0 obj << /Length 700 /Filter /FlateDecode >> stream xuTMo0+J!m0U !mTto4j{zv|tv ںQf|6'op݅uM{}ugfci"Amƃ}>,%rtPRJ(:X'Ab~oںT7h uSӌ]Acq`sy̟M.n? D`އщ7+d~4Wj7vw VRŪ,ׁk/bxO0+,F )1!Pp #]QxQTv)#ZBYLt/X^r<1u%pr_d9٢PSi0@WQ_Uh֩h諵"qFM]RrCpt39Âж~j3Fezp888Q:1bc7~}Hq('bĄ>^m# &zd}4)` "H,4%!%AQ߄B[B~)ҙ́ _)M?DM;豬;kyoQnNRd\Ӎ;WA} zoZZgbT$Z|U endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 813 /Length 3726 /Filter /FlateDecode >> stream x[ks8_AJvIL2Zen$QCQy̯E%ىު[e h@QHHEܺH#+#)"i'#\i$J 36BPC\Dkj"!"U$G*I#U Wi4PiH[$zL#!ti@Ӹ*RЛ=J,Ztp6RJ&fAK)+p + p(@2ƈ5:h4 7W`Ld$2hM: 2< )O8eEa0P% gb\C 6E9NBo*rb(C4$Πv^@&`e\+@JY+)k(q&R.Ɉ } $L;U $!Phj!<b?D LAU\dDZqR @UTΐNJI%敧 Ԑ^X%02D @+ZDRG)+`p\02 ֦R-ՑY9)?D %Sc ; a/M| SLށb溙_B+.wMK=O<"Am=yM{SUi_{k9v{9>Ignb<KI1uPkw~'vQ%U=A`RpfuE`"21uozY-2z؏hժ>zURqhD]gB>`?e3ٲeE|9<+g|G帘Oh {qrBc,xTxf-ٻbh,6էUUl`4;?i~Uc?,ؤ>,꜍j]M/.ͲQ!&h;q.ŒŘ7xi^擬Zͦ٪f夜(#}E6ʻNĝ"' CR]g/Ik51|O0h Z  S^ w0 /#Km˳H vxi3/"P^=evxmw"'2La}IUCDnL]3u&a-aM;}f;y7GIk%I/d(YP2$D%tRu􆒪UhoKJFmŲMfݛQͷv{H(Yך=JKJ^=nmR]Nzn$od#㾡G-;o`c ^؛9ɧVOu(܇I0klek?|m7\}n1{?vZU++k1_ ?uiDO_S[0S$_d,{NRIHi#M;! p.N$zu^:?aofWK4zLaH0.$Nrc#M5}Ji2߶. 4IN$՛6P'] |R%>=c )t_:H3TjmNm@#-}g6ߛ6}<<rZr *%fx]EkQ:Ē Gil"Yt)cil+@"jy'SԒ(/GG&RlZo{&M2^"pﯜ!m6,ҔPJHldCҩHP,' %(g;RB?1T)ݠ}b ,KI-蛴!StsS}e[$Hju=($iot!nC)QR6'RM/ӈ~doJ:) M]>a"i38zJ2e(!2`eH&DI 3Fҿ4Q2`u>Qi:icvž/v~ed#F 36f9bv MٌYbKV>/qI[ߚ^GL2<'iV G& 'zr.5Ɇd+K]RyZNAS!e?_ػtמi9vUr$^]\sp< zsE[B"XlWE9f1˩X2ŲsUs0>yǷ'o!kaImz1.{mz'5z}s6/@g8膑쏼*t>nHOY9:5OѡwґxZ 1ۍuc{EϿ xU˃y4K~lƯӞ;vB׿!`C̜7!އlExaU6>|Sz,}M}oB|BfSo 2p7< ~`XN4Ϩ \^={vAڸow!Wwv|5= f2Мo ䷬;޺sgvac1zc㐍`?r+b<'qfi#]ރ}d`;BQX%(6h F<ǎ?Gm z)~7lӜn&Y/Qg)g׶[5ysD{Ys+ҟGiy^}6Zhкݳ9BN;;MvaF]UъF>UwGik6Xzz==<δz>=ǹ[VߣgqУoѓXwдʴŃyUq<:zW̏048 a(Fttգ*Gtr`>5c7/7*&˼Z _0s18*YVq bV[xA/l1͇t8 -{0 ] (չWc-ւֿz͔ endstream endobj 133 0 obj << /Producer (pdfTeX-1.40.24) /Author(\376\377\000J\000a\000s\000o\000n\000\040\000A\000n\000t\000h\000o\000n\000y\000\040\000V\000a\000n\000d\000e\000r\000\040\000H\000e\000i\000d\000e\000n)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000R\000e\000c\000o\000n\000s\000t\000r\000u\000c\000t\000i\000o\000n\000\040\000o\000f\000\040\000I\000g\000\040\000l\000i\000n\000e\000a\000g\000e\000\040\000t\000r\000e\000e\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Keywords() /CreationDate (D:20230929154919+02'00') /ModDate (D:20230929154919+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/CVE-2023-32700 patched) kpathsea version 6.3.4) >> endobj 128 0 obj << /Type /ObjStm /N 5 /First 38 /Length 291 /Filter /FlateDecode >> stream xuMo0 >Iu(Hi}jCU4QǯoQ%DjdO<|N\YtB!y&!K=ƴ:u"E)ƶܓ뎭pSc\ j*L1,FL>m= ûm^:Sljf8b3frD+9i6^Ϻ7;֡!_jqƍ[( yaAvWupP${>i((ԋyQ{{}b endstream endobj 134 0 obj << /Type /XRef /Index [0 135] /Size 135 /W [1 3 1] /Root 132 0 R /Info 133 0 R /ID [<9256EAF7046C28B3826CBB816367A33D> <9256EAF7046C28B3826CBB816367A33D>] /Length 355 /Filter /FlateDecode >> stream x;Oas U(]*r[厂 Z8H&66_!$HLML`a4='sNg8""w']Ƅ@B<  c(X xBPYX/Pkx UP<ǟspV)[YJwm4e| ЦҕsC CJ2n>腄u 0<(|1L@{X)H$L4̨d"Y9ĞyMK >ukzNK_1_Ŏw} ]::?޿^{2 endstream endobj startxref 188886 %%EOF alakazam/inst/doc/GeneUsage-Vignette.Rmd0000644000176200001440000001642414060415570017660 0ustar liggesusers--- title: 'Alakazam: Gene usage analysis' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Gene usage analysis} %\usepackage[utf8]{inputenc} --- The 'alakazam' package provides basic gene usage quantification by either sequence count or clonal grouping; with or without consideration of duplicate reads/mRNA. Additionally, a set of accessory functions for sorting and parsing V(D)J gene names are also provided. ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). Gene usage analysis requires only the following columns: * `v_call` * `d_call` * `j_call` However, the optional clonal clustering (`clone_id`) and duplicate count (`duplicate_count`) columns may be used to quantify usage by different abundance criteria. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(dplyr) library(scales) # Subset example data data(ExampleDb) ``` ## Tabulate V(D)J allele, gene or family usage by sample The relative abundance of V(D)J alleles, genes or families within groups can be obtained with the function `countGenes`. To analyze differences in the V gene usage across different samples we will set `gene="v_call"` (the column containing gene data) and `groups="sample_id"` (the columns containing grouping variables). To quantify abundance at the gene level we set `mode="gene"`: ```{r, eval=TRUE, warning=FALSE} # Quantify usage at the gene level gene <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") head(gene, n=4) ``` In the resultant `data.frame`, the `seq_count` column is the number of raw sequences within each `sample_id` group for the given `gene`. `seq_freq` is the frequency of each `gene` within the given `sample_id`. Below we plot only the IGHV1 abundance by filtering on the `gene` column to only rows containing IGHV1 family genes. We extract the family portion of the gene name using the `getFamily` function. Also, we take advantage of the `sortGenes` function to convert the `gene` column to a factor with gene name lexicographically ordered in the factor levels (`method="name"`) for axis ordering using the `ggplot2` package. Alternatively, we could have ordered the genes by genomic position by passing `method="position"` to `sortGenes`. ```{r, eval=TRUE, warning=FALSE} # Assign sorted levels and subset to IGHV1 ighv1 <- gene %>% mutate(gene=factor(gene, levels=sortGenes(unique(gene), method="name"))) %>% filter(getFamily(gene) == "IGHV1") # Plot V gene usage in the IGHV1 family by sample g1 <- ggplot(ighv1, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("IGHV1 Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g1) ``` Alternatively, usage can be quantified at the allele (`mode="allele"`) or family level (`mode="family"`): ```{r, eval=TRUE, warning=FALSE} # Quantify V family usage by sample family <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") # Plot V family usage by sample g2 <- ggplot(family, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("Family Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g2) ``` ## Tabulating gene abundance using additional groupings The `groups` argument to `countGenes` can accept multiple grouping columns and will calculate abundance within each unique combination. In the examples below, groupings will be perform by unique sample and isotype pairs (`groups=c("sample_id", "c_call")`). Furthermore, instead of quantifying abundance by sequence count, we will quantify it by clone count (each clone will be counted only once regardless of how many sequences the clone represents). Clonal criteria are added by passing a value to the `clone` argument of `countGenes` (`clone="clone_id"`). For each clonal group, only the most common allele/gene/family will be considered for counting. ```{r, eval=TRUE, warning=FALSE} # Quantify V family clonal usage by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), clone="clone_id", mode="family") head(family, n=4) ``` The output `data.frame` contains the additional grouping column (`c_call`) along with the `clone_count` and `clone_freq` columns that represent the count of clones for each V family and the frequencies within the given `sample_id` and `c_call` pair, respectively. ```{r, eval=TRUE, warning=FALSE} # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family clonal usage by sample and isotype g3 <- ggplot(family, aes(x=gene, y=clone_freq)) + theme_bw() + ggtitle("Clonal Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g3) ``` Instead of calculating abundance by sequence or clone count, abundance can be calculated using copy numbers for the individual sequences. This is accomplished by passing a copy number column to the `copy` argument (`copy="duplicate_count"`). Specifying both `clone` and `copy` arguments is not meaningful and will result in the `clone` argument being ignored. ```{r, eval=TRUE, warning=FALSE} # Calculate V family copy numbers by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), mode="family", copy="duplicate_count") head(family, n=4) ``` The output `data.frame` includes the `seq_count` and `seq_freq` columns as previously defined, as well as the additional copy number columns `copy_count` and `copy_freq` reflected the summed copy number (`duplicate_count`) for each sequence within the given `gene`, `sample_id` and `c_call`. ```{r, eval=TRUE, warning=FALSE} # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family copy abundance by sample and isotype g4 <- ggplot(family, aes(x=gene, y=copy_freq)) + theme_bw() + ggtitle("Copy Number") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g4) ``` alakazam/inst/doc/AminoAcids-Vignette.Rmd0000644000176200001440000001733714060415570020030 0ustar liggesusers--- title: 'Alakazam: Amino acid physicochemical property analysis' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Amino acid property analysis} %\usepackage[utf8]{inputenc} --- The `alakazam` package includes a set of functions to analyze the physicochemical properties of Ig and TCR amino acid sequences. Of particular interest is the analysis of CDR3 properties, which this vignette will demonstrate. The same process can be applied to other regions simply by altering the sequence data column used. Wu YC, et al. High-throughput immunoglobulin repertoire analysis distinguishes between human IgM memory and switched memory B-cell populations. Blood 116, 1070-8 (2010). Wu YC, et al. The relationship between CD27 negative and positive B cell populations in human peripheral blood. Front Immunol 2, 1-12 (2011). ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(dplyr) # Subset example data data(ExampleDb) db <- ExampleDb[ExampleDb$sample_id == "+7d", ] ``` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ## Calculate the properties of amino acid sequences Multiple amino acid physicochemical properties can be obtained with the function `aminoAcidProperties`. The available properties are: * `length`: total amino acid count * `gravy`: grand average of hydrophobicity * `bulkiness`: average bulkiness * `polarity`: average polarity * `aliphatic`: normalized aliphatic index * `charge`: normalized net charge * `acidic`: acidic side chain residue content * `basic`: basic side chain residue content * `aromatic`: aromatic side chain content This example demonstrates how to calculate all of the available amino acid properties from DNA sequences found in the `junction` column of the previously loaded AIRR file. Translation of the DNA sequences to amino acid sequences is accomplished by default with the `nt=TRUE` argument. To reduce the junction sequence to the CDR3 sequence we specify the argument `trim=TRUE` which will strip the first and last codon (the conserved residues) prior to analysis. The prefix `cdr3` is added to the output column names using the `label="cdr3"` argument. ```{r, eval=TRUE, warning=FALSE, fig.width=7.5, fig.height=6} db_props <- aminoAcidProperties(db, seq="junction", trim=TRUE, label="cdr3") # The full set of properties are calculated by default dplyr::select(db_props[1:3, ], starts_with("cdr3")) # Define a ggplot theme for all plots tmp_theme <- theme_bw() + theme(legend.position="bottom") # Generate plots for all four of the properties g1 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_length)) + tmp_theme + ggtitle("CDR3 length") + xlab("Isotype") + ylab("Amino acids") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g2 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_gravy)) + tmp_theme + ggtitle("CDR3 hydrophobicity") + xlab("Isotype") + ylab("GRAVY") + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g3 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_basic)) + tmp_theme + ggtitle("CDR3 basic residues") + xlab("Isotype") + ylab("Basic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) g4 <- ggplot(db_props, aes(x=c_call, y=cdr3_aa_acidic)) + tmp_theme + ggtitle("CDR3 acidic residues") + xlab("Isotype") + ylab("Acidic residues") + scale_y_continuous(labels=scales::percent) + scale_fill_manual(name="Isotype", values=IG_COLORS) + geom_boxplot(aes(fill=c_call)) # Plot in a 2x2 grid gridPlot(g1, g2, g3, g4, ncol=2) ``` ### Obtaining properties individually A subset of the properties may be calculated using the `property` argument of `aminoAcidProperties`. For example, calculations may be restricted to only the grand average of hydrophobicity (`gravy`) index and normalized net charge (`charge`) by specifying `property=c("gravy", "charge")`. ```{r, eval=TRUE, warning=FALSE} db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3") dplyr::select(db_props[1:3, ], starts_with("cdr3")) ``` ### Using user defined scales Each property has a default scale setting, but users may specify alternate scales if they wish. The following example shows how to import and use the Kidera et al, 1985 hydrophobicity scale and the Murrary et al, 2006 pK values from the `seqinr` package instead of the defaults for calculating the GRAVY index and net charge. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load the relevant data objects from the seqinr package library(seqinr) data(aaindex) data(pK) h <- aaindex[["KIDA850101"]]$I p <- setNames(pK[["Murray"]], rownames(pK)) # Rename the hydrophobicity vector to use single-letter codes names(h) <- translateStrings(names(h), ABBREV_AA) db_props <- aminoAcidProperties(db, seq="junction", property=c("gravy", "charge"), trim=TRUE, label="cdr3", hydropathy=h, pK=p) dplyr::select(db_props[1:3, ], starts_with("cdr3")) ``` ### Getting vectors of individual properties The `aminoAcidProperties` function provides a convenient wrapper for calculating multiple properties at once from a `data.frame`. If a vector of a specific property is required this may be accomplished using one of the worker functions: * `gravy`: grand average of hydrophobicity * `bulk`: average bulkiness * `polar`: average polarity * `aliphatic`: aliphatic index * `charge`: net charge * `countPatterns`: counts the occurrence of patterns in amino acid sequences The input to each function must be a vector of amino acid sequences. ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Translate junction DNA sequences to amino acids and trim first and last codons cdr3 <- translateDNA(db$junction[1:3], trim=TRUE) # Grand average of hydrophobicity gravy(cdr3) # Average bulkiness bulk(cdr3) # Average polarity polar(cdr3) # Normalized aliphatic index aliphatic(cdr3) # Unnormalized aliphatic index aliphatic(cdr3, normalize=FALSE) # Normalized net charge charge(cdr3) # Unnormalized net charge charge(cdr3, normalize=FALSE) # Count of acidic amino acids # Takes a named list of regular expressions countPatterns(cdr3, nt=FALSE, c(ACIDIC="[DE]"), label="cdr3") ``` ## Default scales The following references were used for the default physicochemical scales: * Aliphatic index: Ikai AJ. Thermostability and aliphatic index of globular proteins. J Biochem 88, 1895-1898 (1980). * Bulkiness scale: Zimmerman JM, Eliezer N, Simha R. The characterization of amino acid sequences in proteins by statistical methods. J Theor Biol 21, 170-201 (1968). * Hydrophobicity scale: Kyte J, Doolittle RF. A simple method for displaying the hydropathic character of a protein. J Mol Biol 157, 105-32 (1982). * pK values: \url{http://emboss.sourceforge.net/apps/cvs/emboss/apps/iep.html} * Polarity scale: Grantham R. Amino acid difference formula to help explain protein evolution. Science 185, 862-864 (1974). alakazam/inst/doc/Topology-Vignette.R0000644000176200001440000001255414505552752017320 0ustar liggesusers## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- # Load required packages library(alakazam) library(igraph) library(dplyr) # Load example trees data(ExampleTrees) # Select one tree for example purposes graph <- ExampleTrees[[24]] # And add some annotation complexity to the tree V(graph)$sample_id[c(2, 7)] <- "-1h" V(graph)$c_call[c(2, 7)] <- "IGHM" # Make a list of example trees excluding multi-isotype trees graph_list <- ExampleTrees[sapply(ExampleTrees, function(x) !any(grepl(",", V(x)$c_call)))] ## ----eval=TRUE---------------------------------------------------------------- # Set node colors V(graph)$color[V(graph)$sample_id == "-1h"] <- "seagreen" V(graph)$color[V(graph)$sample_id == "+7d"] <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" # Set node labels V(graph)$label <- paste(V(graph)$sample_id, V(graph)$c_call, sep=", ") V(graph)$label[V(graph)$name == "Germline"] <- "" V(graph)$label[grepl("Inferred", V(graph)$name)] <- "" # Set node shapes V(graph)$shape <- "crectangle" V(graph)$shape[V(graph)$name == "Germline"] <- "circle" V(graph)$shape[grepl("Inferred", V(graph)$name)] <- "circle" # Set node sizes V(graph)$size <- 60 V(graph)$size[V(graph)$name == "Germline"] <- 30 V(graph)$size[grepl("Inferred", V(graph)$name)] <- 15 # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.05) # Plot the example tree plot(graph, layout=layout_as_tree, vertex.frame.color="grey", vertex.label.color="black", edge.label.color="black", edge.arrow.mode=0) # Add legend legend("topleft", c("Germline", "Inferred", "-1h", "+7d"), fill=c("black", "white", "seagreen", "steelblue"), cex=0.75) ## ----eval=TRUE---------------------------------------------------------------- # Consider all nodes getPathLengths(graph, root="Germline") ## ----eval=TRUE---------------------------------------------------------------- # Exclude nodes without an isotype annotation from step count getPathLengths(graph, root="Germline", field="c_call", exclude=NA) ## ----eval=TRUE---------------------------------------------------------------- # Summarize tree df <- summarizeSubtrees(graph, fields=c("sample_id", "c_call"), root="Germline") print(df[1:4]) print(df[c(1, 5:8)]) print(df[c(1, 9:12)]) ## ----eval=TRUE---------------------------------------------------------------- # Set sample colors sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") # Box plots of node outdegree by sample p1 <- plotSubtrees(graph_list, "sample_id", "outdegree", colors=sample_colors, main_title="Node outdegree", legend_title="Time", style="box", silent=TRUE) # Box plots of subtree size by sample p2 <- plotSubtrees(graph_list, "sample_id", "size", colors=sample_colors, main_title="Subtree size", legend_title="Time", style="box", silent=TRUE) # Violin plots of subtree path length by isotype p3 <- plotSubtrees(graph_list, "c_call", "pathlength", colors=IG_COLORS, main_title="Subtree path length", legend_title="Isotype", style="violin", silent=TRUE) # Violin plots of subtree depth by isotype p4 <- plotSubtrees(graph_list, "c_call", "depth", colors=IG_COLORS, main_title="Subtree depth", legend_title="Isotype", style="violin", silent=TRUE) # Plot in a 2x2 grid gridPlot(p1, p2, p3, p4, ncol=2) ## ----eval=TRUE---------------------------------------------------------------- # Count direct edges between isotypes tableEdges(graph, "c_call") ## ----eval=TRUE---------------------------------------------------------------- # Direct edges excluding germline and inferred nodes tableEdges(graph, "c_call", exclude=c("Germline", NA)) ## ----eval=TRUE---------------------------------------------------------------- # Count indirect edges walking through germline and inferred nodes tableEdges(graph, "c_call", indirect=TRUE, exclude=c("Germline", NA)) ## ----eval=TRUE---------------------------------------------------------------- # Test isotype relationships edge_test <- testEdges(graph_list, "c_call", nperm=10) # Print p-value table print(edge_test) # Plot null distributions for each annotation pair plotEdgeTest(edge_test, color="steelblue", main_title="Isotype Edges", style="hist") ## ----eval=TRUE---------------------------------------------------------------- # Use unweighted path length and do not exclude any nodes mrca_df <- getMRCA(graph, path="steps", root="Germline") # Print subset of the annotation data.frame print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ## ----eval=TRUE---------------------------------------------------------------- # Exclude nodes without an isotype annotation and use weighted path length mrca_df <- getMRCA(graph, path="distance", root="Germline", field="c_call", exclude=NA) # Print excluding sequence, label, color, shape and size annotations print(mrca_df[c("name", "sample_id", "c_call", "steps", "distance")]) ## ----eval=TRUE---------------------------------------------------------------- # Test isotype MRCA annotations mrca_test <- testMRCA(graph_list, "c_call", nperm=10) # Print p-value table print(mrca_test) # Plot null distributions for each annotation plotMRCATest(mrca_test, color="steelblue", main_title="Isotype MRCA", style="hist") alakazam/inst/doc/Diversity-Vignette.R0000644000176200001440000000664114505552727017470 0ustar liggesusers## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- # Load required packages library(alakazam) # Load example data data(ExampleDb) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Partitions the data based on the sample column clones <- countClones(ExampleDb, group="sample_id") head(clones, 5) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Partitions the data based on both the sample_id and c_call columns # Weights the clone sizes by the duplicate_count column clones <- countClones(ExampleDb, group=c("sample_id", "c_call"), copy="duplicate_count", clone="clone_id") head(clones, 5) ## ----eval=TRUE, results='hide', warning=FALSE, fig.width=6, fig.height=4------ # Partitions the data on the sample column # Calculates a 95% confidence interval via 200 bootstrap realizations curve <- estimateAbundance(ExampleDb, group="sample_id", ci=0.95, nboot=100, clone="clone_id") ## ----eval=TRUE, warning=FALSE, fig.width=6, fig.height=4---------------------- # Plots a rank abundance curve of the relative clonal abundances sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(curve, colors = sample_colors, legend_title="Sample") ## ----eval=TRUE, results='hide'------------------------------------------------ # Compare diversity curve across values in the "sample" column # q ranges from 0 (min_q=0) to 4 (max_q=4) in 0.05 increments (step_q=0.05) # A 95% confidence interval will be calculated (ci=0.95) # 200 resampling realizations are performed (nboot=200) sample_curve <- alphaDiversity(ExampleDb, group="sample_id", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) # Compare diversity curve across values in the c_call column # Analyse is restricted to c_call values with at least 30 sequences by min_n=30 # Excluded groups are indicated by a warning message isotype_curve <- alphaDiversity(ExampleDb, group="c_call", clone="clone_id", min_q=0, max_q=4, step_q=0.1, ci=0.95, nboot=100) ## ----eval=TRUE, fig.width=6, fig.height=4------------------------------------- # Plot a log-log (log_q=TRUE, log_d=TRUE) plot of sample diversity # Indicate number of sequences resampled from each group in the title sample_main <- paste0("Sample diversity") sample_colors <- c("-1h"="seagreen", "+7d"="steelblue") plot(sample_curve, colors=sample_colors, main_title=sample_main, legend_title="Sample") # Plot isotype diversity using default set of Ig isotype colors isotype_main <- paste0("Isotype diversity") plot(isotype_curve, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") ## ----eval=TRUE, fig.width=6, fig.height=3------------------------------------- # Test diversity at q=0, q=1 and q=2 (equivalent to species richness, Shannon entropy, # Simpson's index) across values in the sample_id column # 200 bootstrap realizations are performed (nboot=200) isotype_test <- alphaDiversity(ExampleDb, group="c_call", min_q=0, max_q=2, step_q=1, nboot=100, clone="clone_id") # Print P-value table print(isotype_test@tests) # Plot results at q=0 and q=2 # Plot the mean and standard deviations at q=0 and q=2 plot(isotype_test, 0, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") plot(isotype_test, 2, colors=IG_COLORS, main_title=isotype_main, legend_title="Isotype") alakazam/inst/doc/Lineage-Vignette.Rmd0000644000176200001440000002042214145427343017357 0ustar liggesusers--- title: 'Alakazam: Reconstruction of Ig lineage trees' author: "Jason Anthony Vander Heiden" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Lineage reconstruction} %\usepackage[utf8]{inputenc} --- Reconstruction of an Ig lineage requires the following steps: 1. Load an AIRR tab-delimited database file and select a clone 2. Preprocess the clone to remove gap characters and duplicate sequences 3. Run PHYLIP, parse the output, and modify the tree topology ## Example data A small example AIRR database, `ExampleDb`, is included in the `alakazam` package. Lineage reconstruction requires the following fields (columns) to be present in the AIRR file: * `sequence_id` * `sequence_alignment` * `germline_alignment` * `v_call` * `j_call` * `junction_length` * `clone_id` For details about the AIRR format, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Load required packages library(alakazam) library(igraph) library(dplyr) # Select a clone from the example database data(ExampleDb) sub_db <- subset(ExampleDb, clone_id == 3138) ``` ## Preprocess a clone Before a lineage can be constructed, the sequences must first be cleaned of gap (-, .) characters added by IMGT, duplicate sequences must be removed, and annotations must be combined for each cluster of duplicate sequences. Optionally, "ragged" ends of sequences (such as those that may occur from primer template switching) may also be cleaned by masking mismatched positions and the leading and trailing ends of each sequence. The function `makeChangeoClone` is a wrapper function which combines these steps and returns a `ChangeoClone` object which may then be passed into the lineage reconstruction function. Two arguments to `makeChangeoClone` control which annotations are retained following duplicate removal. Unique values appearing within columns given by the `text_fields` arguments will be concatenated into a single string delimited by a "," character. Values appearing within columns given by the `num_fields` arguments will be summed. ```{r, eval=TRUE} # This example data set does not have ragged ends # Preprocess clone without ragged end masking (default) clone <- makeChangeoClone(sub_db, text_fields=c("sample_id", "c_call"), num_fields="duplicate_count") # Show combined annotations clone@data[, c("sample_id", "c_call", "duplicate_count")] ``` ## Run PHYLIP Lineage construction uses the `dnapars` (maximum parsimony) application of the PHYLIP package. The function `buildPhylipLineage` performs a number of steps to execute `dnapars`, parse its output, and modify the tree topology to meet the criteria of an Ig lineage. This function takes as input a `ChangeoClone` object output by `makeChangeoClone` and returns an igraph `graph` object. The igraph `graph` object will contain clone annotations as graph attributes, sequence annotations as vertex attributes, and mutations along edges as edge attributes. The system call to `dnapars` requires a temporary folder to store input and output. This is created in the system temporary location (according to `base::tempfile`), and is not deleted by default (only because automatically deleting files is somewhat rude). In most cases, you will want to set `rm_temp=TRUE` to delete this folder. ```{r, eval=FALSE} # Run PHYLIP and parse output phylip_exec <- "~/apps/phylip-3.69/dnapars" graph <- buildPhylipLineage(clone, phylip_exec, rm_temp=TRUE) ``` ```{r, echo=FALSE, warning=FALSE, message=FALSE} # Load data instead of running phylip # Clone 3138 is at index 23 graph <- ExampleTrees[[23]] ``` ```{r, eval=TRUE, warning=FALSE, message=FALSE} # The graph has shared annotations for the clone data.frame(clone_id=graph$clone, junction_length=graph$junc_len, v_gene=graph$v_gene, j_gene=graph$j_gene) # The vertices have sequence specific annotations data.frame(sequence_id=V(graph)$name, c_call=V(graph)$c_call, duplicate_count=V(graph)$duplicate_count) ``` ## Plotting of the lineage tree Plotting of a lineage tree may be done using the built-in functions of the igraph package. The default edge and vertex labels are edge weights and sequence identifiers, respectively. ```{r, eval=TRUE} # Plot graph with defaults plot(graph) ``` The default layout and attributes are not very pretty. We can modify the graphical parameter in the usual igraph ways. A tree layout can be built using the `layout_as_tree` layout with assignment of the root position to the germline sequence, which is named "Germline" in the object returned by `buildPhylipLineage`. ```{r, eval=TRUE} # Modify graph and plot attributes V(graph)$color <- "steelblue" V(graph)$color[V(graph)$name == "Germline"] <- "black" V(graph)$color[grepl("Inferred", V(graph)$name)] <- "white" V(graph)$label <- V(graph)$c_call E(graph)$label <- "" # Remove large default margins par(mar=c(0, 0, 0, 0) + 0.1) # Plot graph plot(graph, layout=layout_as_tree, edge.arrow.mode=0, vertex.frame.color="black", vertex.label.color="black", vertex.size=40) # Add legend legend("topleft", c("Germline", "Inferred", "Sample"), fill=c("black", "white", "steelblue"), cex=0.75) ``` Which is much better. ## Batch processing lineage trees Multiple lineage trees may be generated at once, by splitting the Change-O data.frame on the clone column. ```{r, eval=TRUE, warning=FALSE, results="hide"} # Preprocess clones clones <- ExampleDb %>% group_by(clone_id) %>% do(CHANGEO=makeChangeoClone(., text_fields=c("sample_id", "c_call"), num_fields="duplicate_count")) ``` ```{r, eval=FALSE} # Build lineages phylip_exec <- "~/apps/phylip-3.69/dnapars" graphs <- lapply(clones$CHANGEO, buildPhylipLineage, phylip_exec=phylip_exec, rm_temp=TRUE) ``` ```{r, echo=FALSE, warning=FALSE, message=FALSE} # Load data instead of running phylip graphs <- ExampleTrees ``` ```{r, eval=TRUE} # Note, clones with only a single sequence will not be processed. # A warning will be generated and NULL will be returned by buildPhylipLineage # These entries may be removed for clarity graphs[sapply(graphs, is.null)] <- NULL # The set of tree may then be subset by node count for further # analysis, if desired. graphs <- graphs[sapply(graphs, vcount) >= 5] ``` ## Converting between graph, phylo, and newick formats While much of analysis in `alakazam` focuses on using `igraph` `graph` objects, R `phylo` objects are capable of being used by a rich set of phylogenetic analysis tools in R. Further, stand-alone phylogenetics programs typically import and export trees in Newick format. To convert to trees in `graph` format to `phylo` format, use `graphToPhylo`. These objects can now be used by functions detailed in other R phylogenetics packages such as `ape`. ```{r, eval=TRUE, show=FALSE} # Modify graph and plot attributes V(graph)$color <- categorical_pal(8)[1] V(graph)$label <- V(graph)$name E(graph)$label <- E(graph)$weight ``` ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Convert to phylo phylo <- graphToPhylo(graph) # Plot using ape plot(phylo, show.node.label=TRUE) ``` To import lineage trees as `phylo` objects from Newick files, use the `read.tree` function provided in the `ape` package. To export lineage trees as a Newick file, use the `write.tree` function provided in `ape`. ```{r, eval=FALSE} # Read in Newick tree as phylo object phylo <- ape::read.tree("example.tree") # Write tree file in Newick format ape::write.tree(phylo, file="example.tree") ``` To convert this `phylo` object to a `graph` object, use the `phyloToGraph` function with the germline sequence ID specified using the `germline` option. Note that while some of the nodes in more complex trees may rotate during this process, their topological relationships will remain the same. ```{r, eval=TRUE} # Convert to graph object graph <- phyloToGraph(phylo, germline="Germline") ``` alakazam/inst/doc/Fastq-Vignette.pdf0000644000176200001440000045442714505552731017140 0ustar liggesusers%PDF-1.5 % 8 0 obj << /Length 1677 /Filter /FlateDecode >> stream xkoH{UHOۋ8$ OUi:vJ9~'^ }x=;3;,|g, H(<8^D$(N bXYp>)չgq-Y0 &*nFXM!H A %NYRziUU)/U?i`͢$D),2ӀpxlG JD  G] 3Ɓ$$@ypO?EcE,5^DSaHpiw2ާS| z×NoK՞[ՖW,E]QW`S2w##Ht BrUnCNCl)o џP msuBSQ- \3zݛzi7jL]m?Uk-/:e(]$V/6}u Dx:!+6CB@?G~0XطOY\V95UvQ^5? *-n#3$]yOk\apquAE(h܊W *;QYΫnk$l._eQנ$vy;at8FtXCOB]a/V<+v})v{8%2tG-U۽?.\0lҩP]^@8TWvcXA9h)̢j![&yd.HK/ɰP$˨ZoNs&:O%atuL&VaRZ6jOI6 ;m@k}n䐺)ΊJl $k's| Lߛ?L̹]vW7ަyݭBp*/x,Dގ՛؀U~yǎudV,ߛoW}'G*}mt*c>=%5]{VJ7ځOڬa׊ۚy gOCBbDb<9.RIvI|g{~1'%NbDpD{Ei*ODs7&R8l7Ƶ**;+M̓yO=,@{TO9gl ;8oéSF<\negFo804`p9蠲Vu7uf1p_or* p-f\?`LoT H__C1! f9;1|w3/-b7gyf 2aW׺rkwC V댝3iݤr\jVn]j/*ˌ`f2zb&8ty$p$hp}em^ut1:?8}7dҵ2TPycae/b6alP?^'ڽtomj' %wn֎0mq|]^Yf4_ny3_vCCTc/0?*)ϑpxtL6<&*dj5+jUЫCX5Lk${8T5)I:KUX3jԾ"E=Gz 9 endstream endobj 26 0 obj << /Length 1485 /Filter /FlateDecode >> stream xX]o6}=XĐV>dbd i- DI_K%GqHtE{%E^&#?OG'疭m˜K# \6ʹKtQblXFIˇjMMӤ2+]R-_{~oT5`dP! FsZV7-bA~]Z&F1~eR%LHs|lK)ɸ,gdM357py |AV- !ns۶ 1fyhYqt2~-])OJ*4@_ilf#:K+ 1Ovi8dm#4qE@Z6=FJ1r\,`%ѻ-r:*zC?ms: _3 xb˫}j*fy=] &'J;cX71߼7ay3'CD}y|r,m!1[lTPt<_kYBt>%,Cx_Qx~7*Lu륺lW͂VB26lcq%@/&gS;LNS9 ]hB3E;݅f)4k_.4[9 l܃&K3ȓ[aIxN{;S+J_WuʫSV=!LbCܝ~Wÿ|j<Ń1JĨ}ވy3݂ |0ԯlk.,Eʄ/N4y'ipȍwF"mo⡝}JO T~ډcޭwtNUmwvQ@eHS6[$i: 8)Jt9{,Jmƥ,"Z\IE 񻟅<ѫ-^S6ڇ}en[B+/b9iɦK&K2UN a:3'iz*[]ٞ8&lVvĽ u h}?ShZnFw]yk^"#{>-lP:TtLdFl(:I\Lyܶ]ʺU۲ꕧjY.?IZҴYr#!wd21kNHZUKㆊm[Yz> /ExtGState << >>/ColorSpace << /sRGB 32 0 R >>>> /Length 6529 /Filter /FlateDecode >> stream x]MmQ_q0荿?$H A1@u!t"ĿU~ɻՃ~Ivk?}o_9?B|yxXǿ>{?{|_ι\o?{.QϿO[oo޼>*ԾAXb>ϧ[Do~z#xS NE)zlR|`>"bm|"H_,eA?X.׸M)e6OZ!m}l|oYvҗ91a;f Y 0kX#gn |aSdͰl)2|*ۄyC Շ],EkX{LW>l@ʊpz(XŠfEkX)&ܮyHኇ"S68Ǯx(Z)Z)b6)b>ec}([1,F(^|GHv"MH3MY~*)CyCmV>A`qX`A`EW#ի6vڡ"vlV>A`qX`6`>qYO1Yke1%^`YK31j lbiXb>+WB]Sf _XeS)RHR=W"E&Ȩlek"m}l|^y~7V>gwSX.M lbVXb>+Hcw(b>e3mGGR$xm6)b>ec}([1,FZG:cEy=1<یqXUج|`>"bm|^f?z"WaEƫ|9qʬkWaE`" [ÊQc9M)THTtHRMR>&Ȩlek"m}l|^s=V> uu©hIW`Ua" [ÊQym@>1#Eb#)ۀM\>&Ȩlek"(VrĤBV>Iau4暧"iK8U͊6l1+,FZsčy|`RR$N9OAzUHI)C8@`"W5!yᡈ&7ɤmֹ&+ =%k}͊E8a6`>x{ ^z> eu)穣{Iǯ6 lf 08Xb>+WiB1'E|#)2^(G*k܇ڤlmRİXj}0WuNJ6oqR~T~Udk*lV>A`qX`6}l|p%7bi>EZL2pQSFwRsE2և|P64,hcSҥ1;lRL*&")SsI2ևڬ|`>"bm|^787V>qyI;(H]|6Ζ͊6l1+,FZs1}1p%JUF/Rū0x!i#, Z(B30" gwJqʰ]Sʋjf16F b-P7/dZՉ\B&Rj' (f -\"KHXP-! }U֎ID,U12@rÌE$\JJ#v-%$jO<ͭ=RYF ϫef.%$,^(KÀˡ(+$\J"Ze,BKUap) +E@"Z(B3f;Zy\JuV(C)]$0 I"$1 5~D`嚭eaťcPh X ewwk=7:wh:5iilb6ύb%-ǁKb7ϟskɾd, mC-GE$j-v /xcl=hi-8lGHsӱ)L%TfA`Eߋ 6-dmmLz,zlSSNhƩR^9'm)q?vdox;2«6Z 5Gi `GBߋ7㕖w_Nt7}bݠ)%y,Px@6Ic$d_V0h \~n N1\*"b%;+QiYdW1TspPbsW^ѵ\̻DacpqfՁe.b`/mE0E4RͥRaVJɰQhoIR`WZdZ98XGr)$դ[?VԼRIىL"CD ТRvV=7W֑<uኴ:+f.%$,>j8Up.{px)C Gr)i|XaL aZ_&@R$0Eѧ~tg PIVW|0,o F`@D: !bp)\iuqI2lTcq xD .xK5"B3۱fD9Zu!&(tm`\BⅢ@"*AݔtK@aF3 Δh03,0"fB"9pSJ-KIDˍ̴([0&@R$0Evu~W\,[ìU$RKe la3 h)o~p"+MP tJɰ %0\ #1`@ E%VfN\M`imvߔHf\%,^`a@^Ji k2Xr@̙>A2Bep) +E@"Z(B3@,z=DKIWZaRiMrcWDKI ^)b"/ܙ+ʟ(.@ }Fi)݈\ krzTwDjZ#Pu0EdAZu CR`Yx60d4& E/9F bEfUmnsE0hspWL0\BⅢD0 hf)Jͥ$F5ql%U>}VI"$1 hzͮ M}niZ"tW}(}5ND0xh#, ZdppxLF"$M)~H=;Ju ӇtI"$1 hQ)spЛ]ovo.O2{a{ZaFگL"CD j]ps&rIe&0lņi2M8z>aPg/hRs[s[k9WlLL.%xH`@Drarri- 04TW{e.b҂L la3 hQhXT bqG}[2PU/DKIZ#-P7RB] c 3~V, Ja@ GK(_.6?ABR:+SkJIR`WZ*?8pg-7_Y5ءգ~}96;DKI ^)b"'%/T]s (Qbte.%$,^(KÀ*/<"bE"$+XY+f 3rA$\JrqDmqxrHӧ|7HfvwfT' HIafZ Y\BⅢD0 h[C΄4yw_#r>PjnI"$1 hzyo.6?p&:}T6; 1(K;1s q[8+$\JquDpTpx-!e%$&e++S0 ,s`.݆xh#, Z?8)^'bp)c"V᪔Bfbe16F bJd^B/|_+?fqFyF6B~|Gn6knDs㯊7yoYOdF#ۓS-5_e^6'o߾֣%Ή 4sm8*:j׀Vsg(q0pulQnalAjqݪ0qhմa㲷Ύ4;}]8sOv\M;#]IP{<ѽE`Pk{lpƏƆ1%{lpI=68{bGcWS[?;ymMA>/Añ׷4Nſ_<ì n0G7}9 OFj =wSGxT|W}zoegg.ܵLc.X@˺kyß"%Uϩ E?;lo8'ϙ?>J? } 8]↙̙ӛٜ+[8^g2 b4lεd OW izH>to3S=.:+'nn}Ā  Go!'F[ډkd[{dQAqykgb_s/$V?(sH23۠|cɌdq"j\-ع.[j2qs37N"[ډ\d%oqձW1Hf4 Yg:D-z̟[a@2{(9 A2-$hx/r"ݫ$3 #<'COz*Ԑ PvsɌ-Q}ǥhb8*h4?&[)9KSg,^?̀swG۟fqk?̀?̀.F~ endstream endobj 34 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 37 0 obj << /Length 625 /Filter /FlateDecode >> stream xڥTKo0 Wa20z1tX X ٩:QcQDYb)G4'3Ոb<: "+d@rIr^2O-\uT.U{gXˮe%?Ɵ.&! ƹ%+ uN dY ɋ(dp/'4@&X֯%R DP+! P,|`ZA YjMcs~#*}Zng"qTq&KkVc=*0!…n6&d2R/@TtԢl}"aNUD2T?hlU3|mu}Y5jHC7mjk3N'ڒjyT(%.B?z|yVVp\;?^`Sv)'LIۈ 3,nlz5"ܿ.s.]6ﻴAF߹ہpf2e|;JΙj> stream xڴuP>\Z]Cp]wkBqwwעc}kM&ysz~1SG7W?oj vWD {׿zfLILYNZJCI}@qd{+"? `}R)G ;kW'i^'0ŋ忦RKG ˿nĢhwҿeV@0t=ͭYJ%fK^?'gc | `7?x6!_9Z|3_%exP hĢ ?;_MY2uO2El*m P[ˁM߇^ޑEZ:6Y&6ҽϢ# ^^Xd?׸m$hqsqL]\LXg >@Ͽ~K _H%H([*{GF~XY,l? =? /=ÿ!{dȠ@v? Nfix|7urc ccq%S'b{?$oqq{yl\{t{G_G#-̓BmaiO+ua2ډ $)"_he SuiBq_[+'o,DwLѤ򴙵;) J8gZ[Zc|]oW孫ؚp\<1:: o81bK&xcpN=]zTTKi~;A?p-zzJYIq+kUu&6S4uWy~ $d {~z~ۅ ی VW\v?_\}bPIR|I/Dtf08e|J}I~~ J5u㕸٩u=Nȉ}%זҳǵ%jYÇrtGaĈl,#P3S@qcc]#s Q4 qZú-v@9Z뻕Vԥ 8z/_Stvpx3[<}]בCߏ}kj؆ t9WGb5ASsbkCQt"2=pt"v442QC5 $f)B̥7h/`fTC4}l"U17!N<oJs {su,hmYy>{3\L?C=An}nywLiyt,]* UhDxf:d3<I#K!_V>ݡUta4tr&b8 \HYDF1sU<y^  מל/hy>W G<^z[Rɰъس\F四z4,k;W\cD:|إA\At}[)_ L,_ lMa-7M7AAb<6fvD;m?8aD5FH;(cd Y2"-w`n_ ^`2ED~곀Cm:PJ7:ПZFmAcL<+'#;iRWdtQ1E5O3ߺX.8NsРb'!}{)Uc? F3SM6h]7O XgmdžRyᏑKr,Ӏ*G٪0B&žQ_\JY^.~>ܟ0n YKz`nymڋ 3~qU*m\Wk;CS۪ Nѭꊞ&WL8kjt\"swwbl$d૾e1ŋQ{s8=H aqO(%sL2ZXRJ$ Ş15wzx&9=n1l' =j._6='j~ o'_]ىNڎ&nx>_,zL#[:d˒7žsKUyܔR} Kt8e<3<&fYL]a4h$mab E1˓nj`"s poỷ0.(C` {јD$yBJ5ȥdxUDpD{A3U-Ga;j$[u䤳+!(EՔȵ-Z}xQ:{4(TM sjb")Ϊ-B3. 1{7?kQV6tD$!"w/%g8+[%/,Z<.!bx eZ *hcD/Fl ZR Q1`ȣ"ȢReۻI j`7p1u¿[^f莐%kΚB~9<) opҩn[<<+bE *Ƣ3,Rlke*cq1#,բS/x Y|T-\M& mtCUV2ğ _f΍\GNj CηQjdmJ|{ى7C}`V1M}}{7|0NlFQZ/=CDzbTyvrL{L)qpV^.27y^`ȩ) ]38vO2%boV0E3X^뻈>iEe:w=8&42ÿv2x94 N,;PEGYy+7JsQ5鞞 Dԗ8<NvR4+ 5LJp~ެyzIn^Ct=ZuDv񥰂~ ~*POCl B@JvU'3L 'j@d8SLb? 6܌ڎ Y 2RxȚ4t@qy7,{͟2{YZHg,N5m* t`O %6j52&RyHy^ͨV9J~3ԜH0BQU4YE]:,ڕnMj+bF:>.CJ`!M >q P=|GA.:p~k~P_)vO+[ح_e] ,|B!V5ox9hSzϨ[^&t0mv-ƿpHf;":%3~h9Y/sb*N jk*%-NZ ~yg%#]{jzte aI2 JQse f߃MJֹuKUia(r3FFCR%: hhWi< 8tFd^QKw/S nvcAS, 0puD@?\#~ej괄3bA,[$B1`571)98husY6N n 3,~C  )ЗG2i &qCGK#kZ)AIicEWD[BFRLl?̋ǢG`?OU}R3# 7Y` `@nN~U/3t+VZ/o_eEsJio=lRcMHCdü%fU`$؏ ڑFa}2mcq-ب뱸غVW_Κ§Afb.2gE{6vdܙRKޘ{!Qw$L691bKeN.'kMgwhhGy/9:lU}tj? -v{(TƂuЄ6\yS'%KV۱ [x,e~. JqHG pe$'JW=F#M=8v]Vr=/+y.¶OV}~^Wm >WkåhyTeh^eބ \MrN nQ1|e0)Ej gEvl?qhKXQqC5ʳT(m`kٜV³0=(2UN2!s;=須3XMY VMJA ѢRZTV;U Z<#R=RH$UMߡ w7yW~}2HnfLES^Z!:∶u HBf-&=m Q*ckVQ#<( tUJf U0v6&&-.L5--|16aoCQ@>EkIM4ޗ J'LxuqTgIHe܊VБPAJ,E*3Y)+s/[ p&JѥP?`rˠC(@EKPWA\Yԋ^q; K#$2dfGvaEjL(0ޚ#|ۮ/}Z跛&DO2-k yh_=f9Z璓-aWtfz$闝u4ָ&8,h&cKZ͐)a&60t^%L`-^n揆HNϿ$%F1,Ôx4|=ۏ~ JcJO"鶝咽 PWzWB&B>C\&HfdrGc·`|D5TbpTy.e*E56ZʉK;Z`ѻ?քaJ8(/{j #߆Ŭ) xVN ݙc@5> o,lFaOc /M?٩tTIlLPPF+WOOo" zW=MN!z~ Z\D#MGk%/ҥSLٿl]r8vԂtljYCL6 kmZxsѝ όxn^l:U1aGGm=<ͫϱ w(kH=>ű lW3d.h}2Q;q/, 蟄varz)a|AĉXXF7 H|}[65z9c7yi5 ǔd:W.jvlg c٫ae[4(s_>M/{l^!B󵙋v;hdErޜEs O;aЌp6SC?-<ܱiҕ*4 `ZLcP_w4^;P)Q5#,y`w{k5pJI{D7[η>G5/Ls폕\oz5P,&Yi fc#j_a:ccޔjߋ\ ?C)M߶FI `m9F{E$? _0M&1,l1y\fyk xaɔD鲇S![@^ܵ 4NVΓi9CEO/`V׶7q%[JBC\)1}vڼl6AOG zqk6AklKz3Ye'BV@|3:QPİF8ď( o7[! LA,r`Y$xSCˠ0$Mb[#꺶y:M 㔧kh\1b,L`3vigZ("'6[.-)* O{reVeMC/,ಜ8OK3>teֱ_E q4$qL0qYraE'8Y(f<9`k  8ۛƱ,Z \z2, guPYX J_3qU皨N$^%#oP]շͭ٨U;oi>Gjf}D3wi @PXydH y@}rZي25:d$f/(~_ۍй! 6 )wTրWkwpRJiǀ ĦVPΛ T]IM \@}MI*D% % hZ%``}L㞍JNdf!AӋpA>?9gw htemVzo,)r?r#1|i&v-%.o-cT|{|]2>IƄ`}t;!wʖF-8ݲ xeuc@̗$(Leh0۳/1VAW5=+9qV +ԃl.;]WT*Izd^[r=PCڙU0m-ip|З#b8tW:vŭy\jz j|7k,0O(1|F1Q+*(~лɢv#d,}_Ͷf:|GY3+c NxlO#)oe.\pcքz+U_"U-3_:*]u"V[z7нhS,35"%=:bb9N8 xoR.R}wr{Fʡc χb!m|ï ϭ O8\ڛq6]T,]j؃uܯ0'?Wd&=`J67>Ė Gp JDz'0,r/dREC +n%d"^DEfKQNMe~ҒklQy9WN)2"~7({ȏLpجD8ל1P}C&.W= 1 20+ׁ[p޼*bMNAi+Ѽc#)L EpM%]W2,F>oz\OVL-Gj*Йb 1Nhlj=Io2Sk/6/.u;0PZ2x8֞!|yY8K7b5Krjj qFEYזYc)"ɴCM1(S|z&!ޯzn=AdF0/S&JN` bŨoAR)CA0!o<>w⫳C|:A ."q640bԇ@PGHk3y,)NOe%$X3Ϋ vcip Ce-'I@c׈dwsʦoE 0>@ֱ/wj6u͍ݟfekG"5hMVl?4ry_"='-|6PU4uSf5%ksc}䌁`PK* =G6ș͉u=\,IeC qyz'btfBQpiRolyH cil/ZPv~7L#8.h UOdQ,q< S[R<:v1_"?-RZ4߲F}7û]PE/y&0#݋ymYn"E*de~6ǾOa&Lx5\0Y5+ʄW}k6Y8@ڈ, !G i0^o!itkNUܠBv5kW]]`ej뾙D)j5{ORs e>\pje0LyKvCԁNתͯC쇺ˣ_-"v w=-!r٠XS .a,Zt Y~ j?&qȧiU3IֻQ50T߀IVٕ~xt2ydʮܦ-P?.0ԆZpG;E0s&8<)“L~P>{4Da  05ZΝdJNǗ[t®[tԪR¹NC(]~ɷlqp4v$ 6Z;G@.Nѷokq}h^H>+,M6o1Az9){Q.I{Fl_X42WWZWN\A43ձ5^3nϝGtH0Ȕ'sXN5]Rl֯Em%g$/ -0A_>"  ds6Ge,%$Ok%~ا!^bsϼA)[#!ϑ֓4<3pXY鹿|Ԇ"ZpŬhJf3? R^Mˊ?7ܤֶQ;}Vx8ʔwy*gj.0d7)낄XNϗw#P'ce޳L-q`OXmJ=*PNTScvF'B۴|o*ƳABwW3GL !jgE<_t{ekV*S5z{ϔ IϬofZV/Yрcϩ,]oY^ vإ*Q*'A3EY&Niw ^:HSpAgڀ`C>vVg弢6Y7|,ز8a&4#7)\\c~LpnlѪ@ofNݱhfvOK2U7vSɦ^\5slÞ??iGN˰7Azʈ~ G|:ZC0Vb i; (eB?@ӊV'klfٍNBl+{KS[vvci{9өPL9vNDZG] +Vlzw\D`3woB8mIelJQ UkS, |HK&tUu{cn'aJwt..$C-+~[oc DBotQ}]IԱu; pԴLǔzYDƞG#qBYYmaf< Ӥb[CO%mH$l;j6f4o>?C O|XEɋo}IQ?`ciZq Gf.oyB~oo\~A@QH8(R^7K\7 @P#K<:sUWmAڲ5S ;-v 3>Hh&[JL5fκqgN%`N*JfR\zj ?2n._ JMW[ObFPמ0&q!4Hۢ8bS" uQ?M"WK0v_jCfjf/LAH<1-#~ ` 2cю2*/BpsOiu]aw {}n'!T}V,*u,5^'/uBӿgg{f F8|Q֐S/2\tю&Ph +0^4r'rXO-4zރ|ħb*.&ݷl0mpOΧW R:c^~]Yu?O4d 8|w7L;vCOũ1a8 y}2)}FCVu2G{rג16}9?v{PZOc[VrwPQ)M7S5?ٹe0)\NEϔNV5lf,#}F#riJGB)p֠gK'DTsV6xb&F͚\6(!RఖnĮvVeIqplf/ 0|Hho&i9^7ȦMOٸR+sd~O J~sRW5={X `Ґ??uh! >xCmAbUJNSWqXmspw5L! <gCIɏ=m@- DLm%ɈX/܈F/e܈Rԉ>n&r]諘S yjlqQ4DFOb-lg"JG?;F]f{ݍ?LD}B ܶh gO?anSMr=j{bɦLđi$h(e0eJgNZ/gmk8Fo=X%v_Ukc.^f O+a۫PJSS\T21]=e!Yp=ɇIc] .uK0y0Fio"agၗ7<`᭑*$j_Y$'B|_*dy4NKe>yŃ͒H]HPBH9oUhu5%ff៦iWR}32EmKKվ, -‚=x^a:Ty@z԰/AYG*Ц[+;B G$M0jd$Uڃvp=5aq ߋ ةx.d4q1Q&YiYZZ2\yPhϭTs_V&ȟׅڶdY?N-q 쇴KD\2FFɋt^yiqBvdI3M_X兕.?M5P=|hIWlk֖|ygfW씒TCr׍.&^BnL#~ D^›ckX^ĐgCa6p {!O2RdD`cu0?cBq> vƙ"oxH!M:χv"VY⁤q'WaA |jQ^f4o8mӊ\lBNGrPQ涟xIL sIS& |"lkR9Ɉr(ǂJ0-ord[rX_ &E_["7hMtBǁOVlјm5Y.i{S| ;1tUxݢ]10Jeah_FhJtxle`K~uB]Iid;س7$ıAS  (d'6U?{|4v~qE8tVU4iW r~R/4ۆdt @Cu%餳%Ogi ps6˘Po{$Hւ~HDό`1It/saybTBK*>"'R*E4 ~e2Zcg$)Pu6Ce \*jZcq\ TG(o 6?&D>l*EҋvM*^ϝm%|Ԁ԰\ T(IqsŅHcֈkk9_XC{pQCv{wO.4 3GV:6|r @Iݭf@@U}b5MvePju [UOڡNzS"U󣄴i"U_ʗ{pe}g#Ehd^1 }_ 2lEgd5ʉvK ,@x;&2L~=L( ]Pi}(wY`}TDV{OvvYy H .XG}AYÿDa$ ag/d+,gg~}cm oeeI)j."ClR'qܪmd#YV&IsH*I2V,zFlTNS&g xYkpĽkb pF80D9P_1E))hkoS.Ktcv4HQUI,.,NRY>YH}bh Z7Cvm;F_3=/HҫXb*%%I)s2ڧV@)T]u(< ]5nֱ .CZbI\x`^a\GMO̐ g9L7}7ح2xCt)U^w2MN`RL`Az0H+*0~VZidЋo+V^Sk*?gs^Ë\biz+i'A=﷥T?jbM@ 9btz\kb>u OG\ نs0@u_.{ {otMP_Rw~ 9/[irc֨#Ʃ`6Ai)J-pYT`9-ЏT{e|T[ǫf"җIuP >LZW>#6S+Η[/ϟ~K8d5~.U>=X,,Np(!~p^?ӣD"0kSu6{*⠙Nr1)ہKC!7Ar$p7<ӿ@Ͷ kgosnu4̍{n]&#ʩ"f1,owF]<:0ktfY3DM;$͊}@N>EU6@N0ݙ]>OݮSj"~ͧcD"U%35MNI(8m5Ptq29 (KyGZ,%[(yG?ZfGN-W߰k&er\{js~xXTj2ů pyX4%iЄOߊTɶ&Jc yqBrтk%qroahCNt'|Lnx ELOTM_>a(?ͪf4Ewn'"%+jK =i(ưoKG@ 3*9+I>DRrmVJsгK 5A(,Lvփc:Q]2 Se2h~CI"vCTva/%ˍSw(/u*,SC ՃMBm:g`ȎG{!͢g ~?mJWx v'œi!z-T+jL?Dc-!Y@yY$w`wyox <@ x\4>"П1f^ab,c9C"~[]mjfpG؃9l"n'@ȋq>t.!'B5{E!-|#Xe,4vv,%Cӎ+ ]Nҷѹ! Qx}No)N1&R~]:BLBD4rk1fc]wP=L!k:{NPJK+\AY7DIZqZ$HF˫UW ҉ps10ZcI w%$4Mc:]Q3n4f~v ofv6;`_2!\4e?kfz`uׯI>L]y.. &[ =݉G$9_G;A엍_.9vB0H+yOE<^0"ŽƺnTKWm rϢMONՔx֢[:'.Yڞ*+!568=^ZR ھ娙t@.{ӛ]s%3k{j~X?*ǢieK㸉#Ѫ{[5~ GΟ'$z! Ww-=  GMZ>]ŘFD%H _Y2p;sa}k+d/dQ~2r?Mϔ3%+ߢķ־~۪"ScoUH:^obEj8墺|.$MH/l:륈3D x>߿ e͕tyLJ1TjlP,.'(Smۢʙ>~^ ffxG{ DPuE3ŰcXoCԪ{KF:v d@}TѻϨ2uN^7rK?V"eB1azLGO.6n(؍*/D q+ 9DZ[jnTv֟RAo*=ASDwXm {|&z?*Skk~ou> UOX`()EԑбGct(_kK$7h}y]@2[ǕY]de\)3NoI/l 袡G4jP 6zS=Cz|Šk]&m,UZ.[Q)3W~*@M"`aʶҔyU H . &:UWwI"@\[58B{*ΝnrKIT_qN9%C[2P- M݀8qyy1YFˬ!o }˰ݟqNQZKM? eE0|=Ԉlq-JGѡ ۼ2yФ(\ګy>XBJGa|\~z~WIu^lITL l5 $7h 8U񙢏}gv.VƴM@N{]P3Kdn;̎wE.9`HL}z7 ~~=ҝw\P_bjvR-|:ﵑcjce?nGŒEʟdz n-xr:OA^hDjkvin*tE5U]Ƞޗ#PaFz_0gq($4^|x@ ~i']OZP[M^`_Ψ&cb[@|dzR96kv Pќg而+ksy<@ϝh׌Xי){9dՠ,60E*4L ځ-=_5ђu%.jqGkn>r*6J\26߯_]pRa#TOkj 59e {/ ^U#C?K+U0GV[ 0y=SY7 mQЪHQ rKGiXB תD3 "'ܼzٽ}#(z8\.,`]ؾzc5>9o\_PS<&[P H.>UkeCP{Py@Tq)/bJIʤ"Ƴ* SN}v&f;*ی߂̠*?,8]?C1]K'voԦɰ~Ruޘ?<bx] |״%saa22~$E͎UxHMY >Z+4<0ԴKc7;YQ&*zYk]Q5iIi/as,F}btOa)ЏشOltkح@>lRKZeCL_Rw.Nhu\C̍su fATZ.zw2GFߏ`._fe`I_ly} _i$8?ahzAܖWlsс4x[;J=Ƀ3._ج7V3" 7Gn> e% jN>@!ztы,|Fz -rZq6UmD7Z@ 7]|= fԭZ̡a 7$gΩfi^6s9H7[Ěp.`f+38= .z .[.|*Wwh@𿴸S[0fnWb$P9AE;?Ab/0,ѹKd'Ѳ-=*1cuژR2%e!&G9BCwge 633+3RSi oiF{f\{1Æڝ0 =ayeSb&9Pќfdl"a~61?gq!Z?>!sUuoYjgOb$(,':M+0aCpwp+f4_Mُw@}bJqqJz~XO;F;tJOÁ:8Bxf[x)rwDuYF׫BȮn5>lKH7Nn2H1Z Bw[]NuI_/hr DNH%5WEd'y{ >AzCGɸI9J|>'F^ .x߷>[koUс#?> FXhqkAK3?lk ::dj6pᦝ~_:&vb,,F'4 ߎ@ҩӭ7oqR7 wҼ@-šBcdXߧޟHB :[zb@%_;lV:Wz<-rީ v/fCyo͡d3>+TSoGHl^dU"$=@~CziO~ .ҥ c$P9zvwN+:UDБ<RmU]tҰϿ FĒf.~^~Z4<6 vk?L؉ݜuGTB>*TOJle  Tʂ")x %;5gxبXr20(qz58ę92B0^Vk3Gp3JiYS{=[oC45KLKa)[|>90ϐZ@de"@luG3Ѥu~S^G wF"5ܚ;Xψ8ĔYAuu$~P71Ɨauԁa3VŒdˍ&Wj}ID.bG+K*\Ig0%9;WdůaeDrRޕح4N"lq씢Ydx+Sq4F1h<%b=/U9K0nvXWTe30\kG$HLқ )I Q, fg;9]hغRfޑQv'g͝|}t l<JHȌ4?dLs6Q~Mo2 㨇yuI4sq/.K*pxEgpSUzJڡZOW%r9f;*査2q9< !eir{k|X& ֗E^!*${{R$m; '&C#v 篴gG6?vPQ,WSba̵OK"}9(e MS(3 EERiT`S!H>7V*̣$ip > stream xڴuX>L7H72twwww7C0H4HwKwwIJwt ps`Xk9P PTRwv4sbceRZ;̬HTT I m*WW VV>$* zUZ̽J@ @kPuv3NֶN@W go w &ߑ~{3,=mfNyf%f@0ژ9X@]@F]EKU53_\$44dbʚR6#@FKCOM+kFwWJRbzRl,k< 7i+3jV gǿhm`~OOOfkw703Ț/~6nOg=tw'vm= Iok+_^{mwLn@1sWQUUhf:9Ynӿd@K  JVŝ_+3t3߉97]@7{3uK$,'-ɤxNLJίqb{OLR `.+k7퓴}Caedi.,ZN@9Ȭ`+ zYذN׾6`e~ y`;FHl<K[ 몿9Y92_K@Q{=NK3u%h9iKAHzfm?&:liAfuZڂ-lnr99Y;_Hrx`bZZ;_?_/EAOCUM_vRNΖNv.nd \\_Ŷz,f'g r!(7Eo`,RA<? "qX nS(T^hA?蕧L?5zzY8;NG?l,_+X@VP`O"l]lNxWѿw^ 핺쯶N(?W_h#e] [4t?w`}w@6N_737Jl?^cً~nΠ=Ǵ_zf U~u19z`=P(A^*۫߿W??ŝ|89XL|wků3/_ؿn[HK!vae 'a+qu`2&;%Ɂ"EEΊF>R8<%UM\YWzO&%6ͬPMNw([W9ٞ5C>}"ܰ}5ֳx鵈NE8 ~ǎ6[1-sڅ.E%E{ﺾuoօL AOI\n-I4DPK0PX 7)A cj򝞨JPJA=%zfuH@2 >3HA[&S6]Ӓ)Bd[̣f°,HR)_ T6nYэ1I+OBJY ps RkefTz@RM{xlrC9E#֝K$ v^JH#[sYm|QnTKVuFaðcl- B?.q9=[NL[i#7}]ӓ䚕ftQ%'4/;ѴҕVg%YzHkWmcSʐw nqsI Y/rxS?6[|ة_hº~jL5ɰ?k>!-!Nб{\$ b[G$9?5O@ϘvuԘv $FE͙e$g|uHU J8P}O65o_Lׇ+9SE.B\T`>N=3+LJ쾋D15hk,WôG_2XȦCΜy1 WzY s&y m];U HU]̅ mWkx6[buh֭3X29-xSW}$!&@g_ʓ[ju}Clg*gnUu /4 eF\ -Qv#@kh_5Nf%[u:-u卵Rs;8ygwns0-T(?lY'OP"` Xd `3L`t"@Dʾ[kUIv(䣶W&en+eSnE;(~>]ͨDuMy} bzzjzF?6gX4җ*ґ 6XQ$Vu44?VbJb( XtY΂A*lc~OmKRb$Gg#lC7k8˦pk"ƃWPQ6=<"js(gip+i\epIwL&ѱܮ [Tfs؅w'$#i> -1gu^U8~ qZYB7)+N 2sv>Bж?Y& ;-X*rQA͵X}]CrgL5yϾ|@sAy2+. +F)V5~V k{pg`gp[5ƕ9LگًlfCbVa7 ex;J7LCSz*7'@n*Ш|"A }"|&(;iNo5qv/Yf_`Ϫ4DL"d/ `6^oR$ݖsMw%7,:|u[n(NQKgE)l&>oɚO@$!&X*̮ŃA*]]e04a8 xk^nN\֞ŻU}{`i\-Adcx" H!E fB~X(-Y΢h)K?}tD}rW^ =ŝsch1@a;ĹƎcM\UL9"o[! 趤G㋲ԝ%}:)$GéЖBsi z}K/] !UK1 ]JRl3ɤ_$=tKA iiZϣ&7()׷$JE [bʅ-zY(ܵ;W$(P[\ƖbCPF H&еa5ܳsDl}'2IO!v@yqƗb7pN_ld 5u9LE1mŇhaӎx$P=K%icHVR%*& O:^~ $)Iu3s\ 1o2PۧsgNڡa5q6_pnVVxrd0c0[)5x s3輑{o4PYIؕ>_5YrK~Tեwb;qC.,3I^Ce%ҷ^V ˜ddo*C/0qvKd4> :q\Bl>hg' .0 Ξ&k "{Y ;gu&c)MI&fwIT95>l&/v*k*"q trܾ4ݍ匃ت@)27z P;:8b|6 u6 fV:KS5oM|Qޑ,%8aV@ bUX~E m_iu]YV4ڙ[[8۳ Ԛyz2Y=+va֮BG#eK(h;jx:`aΊMs8M!RG)99H3\$ɚHm [爯&:} 醀ۑ.s-yKԺHZF!JX RH\(~L͌~(6!MDnռgk<G YmI%bh}@R.d\5}mM(<8Lz C$LOw\&޻H5u\Y[7baik-ݯqٜ(̘|A["qϸFz(ٮ,RS>eVSSCM&7xoO%vHד=$+nU7H$lT*J5PQe u#wY_$[7D5*PRل1޽#Ui.R=7O ? ]Ͷcbfu,e>mM]{+0ri,M*~BDű`،U(7)VLjT)/y׽B1xz(1*MRKJ[61(,|4:,ʊzX#jO.SuaYq0t"/FcSHZ^O" ¶ikPq{|҇CZ_{#mcB DEtY]Eu*컑w\^BۡZ䏰vnOwgF^C7^V6.hPy9֏dz;=Nu׶dS_G8q_H[e:FMJ[28KPq &Ov _Hƭ}8('K LXzlzkۋwLkknIX]JU]N;S]ڢc/Jdƙ][V,/Xftr:Mgf4%A!"Y|;5M&T+[K,@i*}7פ󥏄_l]:S3 "pa*d⹟lyYkBE+#+ n : ˅#^緼ںi3?b#ٮ|0 DOCh>zlV:ylH-6?]г|Ba\v@u'vbIGΉL!*jㅅxڥͫfu)JE6˸+iHѼ7sTCw}CiexMԏğa-=]=GZוmU9js -]e!.P|ޖ筇y-bPM 3cYTNcM~9FRH[/T0=@F"o9{ߓ/T_#I64Y5L`& S)<9p([sqz䂘[GcL7jAtNvH S;hCz[=Lrw]7K[ 4F=8uKK@hQkh Js\6Hfb.8LO;r!O;Gg_\aE﨡1=8 GҶvDO21uxEfVk[f,uI|@wj%>TY'"qݑ[0#bMpᱜ_gs\]U#z,h*8I$'N n u%ϼ`:BV>[#u0szZgA:o" p7Dטk'T$J>D^Uƪ|z3=kegD$v8)uZjה*7Xp NEib:?~R&vʧ&o.Xņ!|e$|0"6^I!{bIoC̓(8ܞ?O];gTG5OUO NvTYa?=53QL xޠ|Lwn1XDf /l+jxgNkl0/l9VnD(9^YqqvbTşļ JUcT C$ӼhoO2hT?EZju{Hd6w/ᦈ_p/4Pn7 aPYj+,㎶ ̈́w"af x?-&U} >GtuMviuZb+&Yh/@kÍ+ۥXI`L+=T R =( =>&1fgK!)5L)fl"%)9-sOZ1D8ionDíVaQ9zBn̙ov_J5IginFkJrn=:e/dʚuu`<(Ɣ-LmT ֏jCgӘS_+lDNMP1QHgXaʬywit@H֬3ȷZR0v`Y躓cFL[$є{)woSEYc'O;`{1`WFG<"@(vu`+u X^)λTKrAO"9Ͻ \p~ ]DIQD_ηX64%j|:Pm} k}>-5CZ2 ]W6:3>}Ku0S+8Ctl&: #"vV$S<8½%p̧xkP) en% '8l"`XAvK\'vX4KO`y,[8P) ZA>I˵Bi[gf7%vd\d/?ǩYS]ir>BBċ%[8[ VG!KH&?m_D>f95@TDwT&vy:tO3pseEfΆN C {ۏE3+P3ݵ̿w"--ɤ'zg^7W&W7J0S4ArE3 H狐X4]8yxM;`Bn[)kM1*iHbs1_ q #px+VoYbf}GKYz jU1 X*?{jm!4ЊpyHVcFbǤ򡳸=m huLFܽ033 a%xXb)™ lD@(,llwy e3# J+N3q%A3KJޯ}^KlMyn5}\t03O6yS'=9OҤ`~xGb =LY$/qz7t)\a7)(Zvh#h檬0^ffPȶ7³XS!5ІٍwGii&5Wa{ձ?`1 uPBވv 6+A깉l^yZHPܨ:wUyW^C$,Tpv,J^3``ˣa I\昅 |F3K*t2c b`T< kf3culkF+N? V"f>&2=^j(cFf>e[0/-լ9pę+RـeTwdŸqTuO|X?F8iTZ>ƾ58G%r5?ΊTA;#%fXLj=B/Пb2W,΍b)`A _֌"|z"_p_ǯӴjV Ǥ{`Sǵt6 ~u 15t\γӨ,e]GP!: (I"CQ64"q{$nTFis*fW ^,3uጢ%5S@Z>-᧫PD/VhZ/ng?dΚS#E \ҿܜl!-Ƽa@0;( 9;O C0$j8R|JYh9/qisŕ2{Ò`7RI?8髾6՝4{eS!,m30SjoժV6MQs#7h?I2PDfN8:iY$zar~p[Kn4W\5t"?|]X Ž n ۰)+-y)`=WD8<tyluC `]ӰZbϊx%{^= BLɡ-Dd5bUidYufꡃW2c1}%մ1f9C2eX7gv;.'S4OL1}ԐWPMZ7,i\ZHaӻFlK%U@QǦ 0f{aw~#RQ MYRi{/*$j/R_:zY wsI9'2eG#1)(ڏ}$S6e4q˪7cCxʌgEqro Qzk0Gq1Q>pAAM(z*&\(ژ|Ob[:6mxjՆIB{OnhГZi `6(4 'R[Zܵ( }~G8hJvMea漏-uߗ"<[\#P 䰒cuC_jENVȢ5j֊ԡ+bC;@Whş<شT=x1I7 LP.!@ ?h.SHmE?Ey)[`۫n/$OhE.y@ORw&L,Ty*y%"haA'>xljMк1@ mdM+;c!4bq0PmUc٥g)=Rm_ [Mg(f5 azОOKp(,e";:P=X9"Jfτ` ]_E'S1.X}4:PB/l*An᧲P2…oi!^;>%:oA`ʵ{xv_찷&ְ\nOY :.utv;pۤ; дCw/|at7|y?ސx 36"N;N}NUˮuo{$!O'Ջвx7h靰m3X][fk,UHm&.OPjMS S=ZݧCZWH$_DR͋RwDT@<쾢'.-5̲{l}*w]'p}cqOkeھQ+'ni&VE;7GNigc播Oyk3Z؍Amᙋ1%-soa;^~]Z nEHiɓx~Y O\NX5,GHf$d1DJj!a=sGs0 =zRY2rkm yǂ~)3N~#,@8p"*ӅwQ4H2M[Hzn@"zCzcD߷]6Z#Raq(#=6s0'RA':\V[Pz0ޭ4dW5E8jN<* f Py {^ ZG?Mhzџc<Ҫ00/LQ^ Ю&,w4l(d$+&&Ʃ7YssMiVIҞmC>YҮ%a|RSU|tXd.sQ8ӆ9r'$Zf}4;#vMKTAU+\2%r7A'M5RzYr1`?~lAs31#Tr)a_[:x9!O#^tAH?%)OަywLb(qO)#4ϕm?/ p"x@rIvJ<XD*p(\*G|1;"OLMNZv4WGgcp3(tlv x;ǧC86˴oy8TV[EޯI(UfR֤<ԃ7 dR .|`c]%&I 3\ve4O"‹d/"]YHjdABgL (RnKl4Q1o=('wxF*Z@`Rl11rA7 ,R~?o>J=iWP0=AtF2 Xy|k`}놭:Ί5%qN`SDko4][]9l(]klE>g@U푙nI!s29a8.qvsBM̒;S'Q!U7 ߱AD+sv9}y(MCl b qE:7ezQ?̻.<%RÃ~Қ0"$W%_.MzX/̕8X>)*n=at}|U{&!//?^Y)is~'HϭeF8PP7G4bѤ#nVN:f?_[#xN.̝a~^\eb]]'`*)x&?^>0A/{̢rt9~)oW~#'̵)-!0iX0N$nO7Z7f]erUQB:~[&$e֒%qKlzm۶m۶m۶m۶m6v0Ȉ:d>O~_&|uW@=;Kr(=kQ_/=C.I#〶bj#ѯ4ƀ \9r$.fO̠4 #O LDr0]< )Sb_b U/3[[k@t?{?੉R޽ZZXY s_Bjk'L=6d-Fcw%lF: /IRD=)xƘPK2t];xBtD9)&Qp}Y*'';ެ5ۊ3(f\Ae%PCw<݇!N9F7*hfi0:ﶿ_N / ڼvm=η;-@Dnq `&46~_E`q u!!>bYBU& 9 1)ߺ[>yQ$;2Ӣ?NyĆxSaA-nBSkx +VIZ4#Qx7KmEt\t3de4RDi\:D Sl,A;IU$+H/'AȲ\PBTUBpGq 3/$Qs|$<.3j <-`k:JS%*3U8tw&0$(D(Eб^iRe"8i/8kw/ uU7CR弬!: Wr=%qb27jfo1Al9ûer >y/%>`epbkdR;a Wo 69 ?KlR/gb嵻P5cFPy|`I,n6NK@uW9yȡэnK{IJ(dgaWؒpR7gcz^>ܒsWbҙQɨMLGpp>t /Sڱ{ם>7Xlw^3/gh%(]L"Y;'d8)HPweEvMGiە'R@_SboW)vo @B2ho|{\--&~N-Ԅ6ARSIܬn8$f)!~(XʴVfnq!s}0{$&ȇG,tιI]r.A1tJ:n2]G^'L}²^l%XXp*ȜйZ3̣/WYrf;+;'"`̼@u&n Orh;m1M}eR͕ \߭1U#~}9BEͱS luFQcvU K{pm7D8$Ma6|:-Boyjj;PKK[|=~r VW_Nύ;!ЕKWTnñnGaTO>iSCiu5sTs-B3mt8醝r+ntV`iߨ zdXڬ漥p0!} [R`971psz|(1b+o`ڦ*7{ YSelP-kaiL3XR淄W0O=yڬC3>F%#-~?q%myLFW&n-|Ń"܃7xʂ-Y3$ɜEak_]ص5'L/Z'kyWC W;֠PmU:"'mKx~ a W{s?{ {4~=8Tq>$ն-OQ$ټR ewl+(Q KP99+ G%pP}TiH^AH),͚Z?-i(kh6zISqvoQ+"i5D?c^t^I 4m4CF/1t77>ɓN7M%aضmKzOyx m'pŽĴc= ۛg Ŕf d &Md o?Z#J4~"ޑUT;B+6p_ ad|x0x X-P$qw=8R18J88l `]dx:8QD NA.4DOU=2!';"* VקC cJW8--,Ƒ;2FS+q8$́P2%Q(QQzrt n}\Zl=+S0Z. nm0x7μ<+9[m5(&Ȋ ݵWRbt^DO[ctZ;ěV"ІHTymD6IL?BW~UWyx:ϝ>],r'Eܕ7y_3sjy}| mP19_@y57kfrv3Ŷ3jx!/GK8GaM#~ %aa_uZu}n@( 7#wJ9I˞U뢐x:F Q>12Z9nɛgp%s{[ZgS|eBtpK/zlWy!֗W/7oӓcR29 _L@(tcz襳i+$9|(^^8W,QԌ  ;ˆ?o8+c{'` [)6NPs84F ؈ބ4x!J=rfyw.pV:"z$- ڹǒT{·`ssHISNI5A#ɅHO8TJe U?^ٻ>y EЗ0Zi"/Z)܇HpۥsyWbtéSY&p-={*#uϣag;<_CRPbY"PNm?wB;Bqan'[B(V_]f[y>{mǸ/a2$Dˢ=W_> ExnMi^XwK43Mu~lWp0qHl+@f6HUV[eS3fhIgD(,$4Ŷg#$$|t_A"j`s2ſnvm>M- j5\j+cڛ.u7J]ʱza׬128A jlmV,&Y3p9 I_BY,`|b 4\屵94чЧ .arȓ^z[N IW3!< C;VmE誖Y96\n'Xc\ AԤ)gY4n.L⢱r%Ey!z pY%ch3H/;YDط=ɯts ryð4Jv"#yw|W%sE^JUm R+"hb?엚q D(z>r)[0T&$9Er+bmf` f<.+ /X&溶&(՗$2ڏ nA09[}V5$j hN<σ>KO&p+{O5GDy/ jID"p֣LŪK0ޣi%Z:>/bT Zձ; @$f4?hHyőrc F/hfvj(yjzP݂fXO\Kݔ6D׸\=PK @ EdJʹTHlK4W;$(GQJDCi%Ahި $X/c$7'XRDg~`Q|;4Z9Zx'h5>p== s .:l}HނG m=%ڿyx(J;z7u^:Ļt~K&uΉ,!X; ݇YbB>S}. c!{:C-`FmEe|,BnX#ju&& "7:#iyISGfшF:A^e| %?] -}Oa7AC&gdW?;aF֧v@ I>OFnq(GrV}^skBˬF)vD+[_U8z-l،C?$]{@d,0L("Nڑ*4|S]ubG'j$`l2YYa9;JL}E7=UIf.:O2‡Ȑ ؍YR9euB_c2SÐ%Em\}c3IXڝ`)uKs|2BC.Y8`%_JoҮ6&B>RS~C+==;;}}@]MGвoA}Ȓً ҵx|NZIEwqQ&!`M+5  HJXO,uj3L5?a$˽pAջYŝYQPSZҰw>193jAo0;S:E! Td7seQdrk+@`x}y֡SU [_gP Y;L[CN&kEȊjѣ Caze_[pVT{s!s5dgogO nCVS_E9 bx2b 0Vꔵ@eu(69[ܵ"np@f>xEJN}uxFU}}D}qpq0 0ƻ_W+T Oj^9Ga&\)RVUރ=rX,5,"5ki{L]/Bģz9DUo I%9,&@y rvV/ Xdn5Цo\LN~A;mf'-.$t̖IyóDLP5<+xiicM-B--MYR%30Vr &wRzz_Ė]SVb?"ziE<;늌rƤ{z?c1 f\bn:B!MP)ZQ݀6]I-uuDxY8SbaA|r)):mä6ha8w'Y}l8*4BB2®"gc0C4b#Lw2~t PV"<"*ͼ]L|'7%!}7WgY5Ydu¡yL\߷>G{5!s6qB$`['Kn:Jz 1L,J@ύt8c^{pn/*'6ӨSA>UV3ֈx2m f MM;l C?뢄V7r`i| %2EU{Pֽ \|6ϭ<9 Ӂz{fʍ d{Exl[4L 0O|Wn/(C RM%:3O0LctI;q0J4#MPJ&@&TGyv/D{S&%ʔԫb8M>31nhl+~C~s銚Ɖ|Ldm*V1|z"n"4]9%Q5-ft e9Vp6z|j3K.|P1O(#=L \!FgZ 0Wjyx` ƺ)V>aM E[*AoK;OdOP'JX/"y3 Dap0|iqͪM.y]7YwCzsʾ"śͷ:? 1?g!\?EdzEsn,<->D(@wԗ1618l$EKEޣJ=H ^g_6̃Vd@x*?GLi/dv=It4Oȭ,2L=> YtK-{pY43'20]{""+S;C -Zc ՚Ki?^B9-o|xlo=KtG5Ox|e5hTyb#|!f ڼfFg]> ePp>'qyBɾDf[SI $ kڵU.wScZ@gu ,6~x?b7-![4R5DNpF#yt55G$f_]fe3?4Yб?r*&FyaK.cH͡$d F(aH"d핸y6@G5錌ݑmT::TPMqpMP!Nt?t#6R $v*HVl|+֜Bέ( oO>>ʪ8Щc޽Ob1ITΦK2* x@^,#EwjB%"_9QC$nV7 ¨VJ cͮ>dO9WĒ ~a-{ k4dFQ֑ԓ`9"~[rj\Ўכ ~neځvvMLB.o\*FM0WJvUf ƧYBV.Fj)eA kU@s!ҧ'B^?sjՒXNb2/ 92I"ڧnw m ,S]]Y q~T  o ELtR3E gMBy YYjbQҺ)P7BުkjNuFH.q?r/mcynq_Be `7&E2QUGQbZdsbjVI{Z+ue!=ӛW$.#ͩYOOANߩ8΋䩹Xjǚsi#ta!z"nFlqmWK86*T~[h"caJȯ{˽kyD߼%tc>7J\Ry]kHFxWsJ&rΏ $|u~.r^`bOTZ_(uq*LG}9pJnTW,B{Jdj/p5JC<Ƅ۵ih֪0?cj]4_HBp" 2jgEasn}L$& Z+_ˋc*CLeVgzm;4x :^NKE؞o~ aC2%c-J drIE_q7}5ɍB7-%*~NA0p_Y^ u!s+m\wp3 엶k_))Mݝ(S<44 0$>!y_8>-d1-pC|eJN)YڛçW5Kt;D}4(Vݍ>L_czMaʑ2$v~ʥ7B:ך=>QSQR"=%r軕46X~ZsU9Q q@CgGĢGD&j3m?V8gW$KT[9=S7Mn*lW 3FNƆ}]~؊0&/ݓUch/Bjf *|ntx7QKձvHI?znmO1\Sd ̀a%zT/JD|YaMrG}ϞKNߥ+#g|)rlJfqa -YῠopWla_Fu? 7V=mNt?‚7d8@/~KuiЬ_M =4 /tiJɻBh[P=2z̴-':ilM/m9ع{Ex?V ^x]SA5 V{(.8u -y1}^z fy1'4 &LM! h4D2Wf13Xs8ۈ 7Az"}2D"bz-)Ó-#gW1VVx'&4{?\3mUu$aKNO\?m^B)Y"+ӓ]#99d"ѠU u&ACk*Dlf%gE$oG&BTa!y+(X-Eʊyں]p`OOQ6 Dו~>W^19ɲhSO(/S:Ojw*6>9rKEüG}"Gj!&nh;RM?cKb8ksrJ1uKKrLώIϒLnqwz)^2ujGr&$HgZLO!i8װ-)UC#b'&l5hKϰ4lr"duBѸHxhG U¬t~Q(seC3S7UP-B^`(=d~oO5)llM7ޘB(gݺ45Ṳ|e AˈõdZ0+hMuXHvЊf /r'@jvGT)lCBn $$+Lg"T|twB0)0jXH]w,zywJ!fa,E)ohHw0 5~|lL) GOSjR0+6c|UV3G0 zOh<Կewh4p% ˚ t( y\ $֚ύMl6%p!PԠ,?%.4 Qߎ {3f<5L2g[9OKiI~.: +ߕS BLus ĥW,\הU쫽wyx \{|fџjK߻C+p[eە]:|p?o_wB{"ݔ% ?O,vԭCP9LlI?0QՔ}8;!(盷f\)aZfъH27a9􄯎̨ OR.Wa=B׭N$=+cDn ϸKhQPߣj ߽p?ep 8 ۚn(QFǷOoKv2` Ӯ||KsO: `=91;oh}1*զqH3mߘCYSCFO,G“ȜD hL Qe5v ~2f uḽ{0( <lo -#UdB.x 9R&O?UW~~;sGu cYൽi_ԀCӧ63ˍ,MV`]+`el]|xK9d[as5̿;4p1F:σ&ȩh.EF?<BETW0I 02p)`R4(MQRqt  9nnAtDbE\=ms.^On)%dt0X* qw*{#GHR5XL ?ò[upԬzZ!,?g >ZEO< ӊ=8Ʉ 1:J_x}qb!$L]@!npJ 듯{e._~HOUNJ|k&,Sf<5 H=сL<0ٹ} ޤ8-*Aqݨ(=CD;C G̦ɳ{Fw׆YiވE:S2`ШD@ʜo<w<*.]h{Nc8#v鰬@aZps2JW?IPdH/yn!p%ck`JOq`%4}ZQ~qAN7ʔGɚ Clr vA21B/^qI>$L5|H-_fG[Cr/_,ߩ&U!g#Xz9yq2/K:⛐ڮw^H0J9{" P0yWGI1WA?ɷ 36g TMNtE`q:w:l1B[mV$:ZE g\0@LS_ߔ,c/~t)Y ,#@4`mS wڜ) nOS(e{60ڮ tx20ܨ9&_BJD>ɐ7-ClMKx`;K:'&dM@[!'$AH 3͞//c{#dNLe(ɏx{zS忈}ΫQ+O"'93ߧ B&6ẇ[s=Mg#j^ƽ\Lwf;nTmH9hyqKF6iZ42pO%3$[Ja8(P;ɳޫdiMU Jbrv|׮c/* XIZS"L [U0Pe18 Rh,OXƂYYs!k Ǔ.Ar T5ifKt/'&GQߥ'e~t[SɳN! &fS h! 3ld.e`Y Rjadm6מ(IUVjm{5lv~\m^qJO׈1yS2P R}7&!Яu Kd&3YF5䓶4gtp]Hg?K endstream endobj 58 0 obj << /Length1 1861 /Length2 20602 /Length3 0 /Length 21823 /Filter /FlateDecode >> stream xڴeT\ݚ5 w)!8wkpw ݝx}tU.{V"'VR6s0J8ػ330UYUn&&6XrrQg+j P4u`b%HΟA3@jdPc(9қ|V@QG/g+ K׿=Xv[-16qpۛd N+=hilkp0*IEu%UjƪnETUM] &&j$U~?[>|&-WVVgf{f;F ohv PY:02zxx0X288[08Ol:mfoI%_ @h[$'E~IߞJg?rJJr;c+{Wg hF/@r1 ]l}=sŌ\7M]\\]0Ewͬ +HK} Ϟ^{WOp1qL"7uD>1O\_a;x[ٛ͑Q (-_.,& 4d;u3u07uY?/>.@ 02uv_O$/PU? h˨) %fk`l8Dc;+[)hm#f"a 4Sr5K_,n)O~?V/=3'>eijctq~?MUAk>#kmC:eNw,rGsάv@(+AGBI#e֢|z Rr?1["BSvAo7i-I)&g\J{tv1q4ۜ.m?47#D3޼>,Ѭx?-RNNh'V#,-0dX"#2(jJZ JM.5L($l ;"A7AQK/hc3dMSVz"*ױ1ł8ɉM6g asf-$2^䠤쾧jFiךF%_ E~ Xhh0zYJmȡb2}bGݒ<؅e'0'QlCamUq_G԰ʼYG8B&Zqu߄!R5m^/* #_Zβz&]d7ćw(-j*6XZM0qua3RdWћ5esmEF}attGD{;k|sQ!Yw./& ~QPpioz~,3@)*rw6/p^E8ӡl.T"-@om,{㇨"-0R͟\UEhK9}g~W/)Яsu}~ -ZWdItD|1)4Lтό/y8gQտݗ& (۔#p6xƁ;%_œY$ND\\-9 ق_i:A Nݡk-k/4;^*N [?Uv.(n{ ձ-k?ʀ ym?Kg(PVՉ ٢;6e\h*6bFFc%.0Q_PBڟ9Y(D nvH2*aо[.9papa+!%Zki0_[sKЍ$ lj έHE McOP^PMSoI/IW0brM٧*I|*EJ I@"KJ*uၔ ,lb00~8k;PDsz=.$6!mTFWEW?b"6siKg &؛%~FH7gʙsLd4BL*V#M`v/eՆw>vCӖ}?'[ igw_D@H4cŸ2\~ _qW7['89jAǸ˷`uwQFcڑ T}\ΉBӘ H}c3o!P? ߴz 3o3!QɂJwhk  >ȫ97Z&^tPw\W_֠@W8Ł@w(T5.K'6Twq-D".AdN]BNaYHʒe:۾;ӳTeQp0oh 0zsݠ!/OVM"U8 4Dn?h lF{yÜ~ M 7Ӭ _'D5Mň9z*/B U}s),}F&`EA`\C7Ӧ9WCp5H*, :cg0?#,=(G8~DH[D)*$z> l3<\,RJ 2X$p3[,XQ({zF|Ni[ W 1^zL,ЄwCa ̥lVB Fd`NԖ2L:%FMKŎE4A/E %B{A+E= "4a5; PFq1ĩ?ҶG/؄D7`rP eqC{gZ6[-Y(Qr~*sF YD3$MH"/7]c2αi _W7W>{!so/%Y}lznK/D)pn ~b=ebUМ?[*Bvq& 3.l?^R]p;4®h]QMȯ#ҖfaaWWb#h97m#5@}8а.e^'~V#t qҊB1wU]]?v\FZcPA u/Hb4  c@z{m@wz+y$2+[ʓSEdʪ/>OCe>TKŢcsx/BP.ȳLoK6~OF?˂ږ X6k(Ot]uLx\#6sӆN 7t@GV-w|5v0=Hu@MsTJ% D,y >[#,| ޞ~ىLo#!D{#38Nݨ13l !0rv^S2M}Sԓgmsv71P/u@_W^lSt98-5 l[lb@ M_%o4?[]}{x`;ϵw7OZ^YwBV?{:/쬡 .FbEbݣ&ܺ`Oj+ )[ NS m8Cc("u@G69G0)<цF'ePPa/PX 4GݖWS|yjP"gH^ؙa"Y|9`#}܀=7ɠL^$R8w+5.[H:jp*J*_G#6._UА cgT + $A,]z wrmnx)cqHzPu%mA Óm;qo6 '=:S_L_Y [8mގ{qP"b\\VZAmB;`m#D:p $,fiG ƈqO[-|Ìbj 2q6{c "yq`T\$mPnUMD tǚItVʢqRIQ:&?cרbmypm6 NN>HM~=7+A#X8dtmKdӏj!PЅٍ\{Rx}ROCIGԱ'N"*Cڢ ^~9?5<S*|8gF {JDڔs[L 0LT )#szB sZxaBH( N.g]4eSCkn,1T޻8QK0|pF5*D"u^/ći6+Ă8MbOi`Y8"dx,L\Ti+:#"T"H(&i4C0ٚm肱`hqOb:-(% Q H`F uS``љ:|=Ő|=iFgOSj*Ø[C"R:maA*{/DY- bǠ?/vه 4 b='q8浕jSq6s!N2ܦZԏ[d'iJ ),dFgjh4Vnߗ/+Vg!XyzR}X(QGkHL =Y2pGX(Қt)3UkN.l+.Ӧ'֘Rq-A"}TngƊF&""5$+F #P{i[Sr'Cjv1ضP6kO]( S]+"X[H3Ÿݭ@Uo:䊹kV63q11 .Tc=ssٶc>T̩+({jּMhb 669dţQO-`T*\8yϵ/)l8bf$eU1CU^WTIaGOиmZ7NdL92'KuCRvV`C|Ya8X? FDWg[s!1ys-Ln`r r5oĖ<% W`g3^cB>qXKifvS-%[<~\/ *bOT!4<u)sO<@wRGNJ@z$Jkibb `v@a/A fQ[a΍F 5T;M`^j$TWTT\Go"B*E %r&8Ĝzr&B7[0A[Eٮ؂tMه5' 03 "9L&=LF'?7].;B7l12̳kYl!] *.+圁:W؄D _xw*XKg,d8Y9Vf3U |Ϟf nf fK+JJjh~A9G7izo8kUcS ,lTn^IX Mpαa} _! w,HFXlp'YskFW@+p2?P !^j/f5ۛBrFH&r*oh,t  q[qUԠdssi0^dwUT]4a]_qlF~0ª8z[wG%ƤQoZ*٭ufepxS~=aϾmQ&J#\!!$6l϶J1`|&؃<ybE={H<~&\!A/*].̭U4LA%W( ȤWVS-_=[̹DoJ@͈;{=5 .B&@׈u9&EYzZE$ruBhT=rP(p&N-$館ůWPLbȲ3[KU)G_ %%,xG8Cj@l7)פ׆nKR?BȪٞi&&&$S`)ЈgnN9eY_!}`V |b_8ΆX$e"P%L2i&>L>okG,ʕצquqݪ0ƦEDƽ1!t õFnBvEdНR."d=t_=3K%*ԒEs/fFg|uP?ߖwY2 &G"7YW $d[ ͱ`Uv- l 1 掕-`z%5OۣބnA&W*yx޲ T4u9DdF`Ƕ4)LnzY5?ܸgz}-'-,2bSrm\H#*~=?+A͜담e3Bn  )E\s`5^G֪A>\M6KvPk-꜂T$:NZ 0ʼc4/݃.A a״QA b]S;BG,y` Z{H:t]8,o=Uus@PRRM}XB/^ӺeEy8nE`lj(-nZ{^-ˬDUX(9>$:Yp;΂t%5ioI~V*`C̹[KQhXjK0~{'mf *:7mPjAF.وEwEʳ[VOϷ׽368 K*=tWv2bssqw:f@Fң l(Ä+n6ǪҘѸ\O*7t} ')! )}I9>^7&c{AWYDS-,a`x b0w Ha=3 Z//<@CU S{\:)g{d{4NB,~l9/Eb hw-n) SFDLr57t)ь+xoQR|a1 eKއvt>_--!\]BaI0畁?Ћc?~V@P$wj4bmo9/=_p2dMJtxwZ/۬b A`BDaRt;/nxƊ;e2߶yb:i%0|O#1Aқ8*oU!' q0mV[nl qB7Vxc+z%*$ 9ޡ&6b5ƣ*Hl0 jJn~>1Ar,Bߎ%-prRVBdJaLφ QN0kThez,/Z߅u[ݝMv(9o v&jzrVmT(}W"c,|-r3S0c ddHhKbDOyA~s*&khA\dqW;)F%ȍ33No,\4rWZ% yCW%0^ D[@Moy % T>n&vƒ +ۅ,ӫܟ{mޒp+V/*<֡p ulX?VxA lށ`dxr9":*^= 52C"BŅK/նHLtVlka6!܊$89NMGDk& 2.8vFN" $Rܸq7EF<"\:vꁵh~Y)BBykFvGefڪ:x8usMՕLah%[ 0OSu,D2jnܴDI b%>":Ͽ}^#ޢo9N( yf8Δ7աں}7J)XI/[̾> K]: X3xmʣ= ҤyRԄܝftxj+gJ~D6tIU͆BQ-sװ0l?B 3OVL[h8( a oԓ?c3p>*,C'EQ)}yVuBdgN=Ѕ<)6弊;I5/ ډy/Ǫ~Xw55%Vt;+눰"t1x4."\o=G3$4n'A3o#gb+oj:ufs0M֩4']C.f7΢,:tK/ $+p-Ρ &Y8ׂ!)H$ٞ5gٔ0M][ߐN3l:tkby̢}\bxYS͞%Su~^pkXᥑ:9IL5FMIO5Vl#N-O!lF@4)i>^)b=g[suEtECtѨIڣmEFEѮHtep#8ܐIAIKg@my2/9މn3+XXHy[]׉y$_ˤ'0m.}>aV9!:s~;txNvsWJl(wjb`-i$pj/Xk~}Oc(t<{/ގFZbm20G%Yõl厄nk&;>Wn.A:yN~4гe=XjeWUA&"E[# FX"Ĝc̍*@8섂1uu}$?o?\2˄)6M.-2<@֫Ϙ.3+FZZ0dvx@F黌h2q1鮙~_Vii &J'D 3\CNۭ~`Y7}W|KmEQ)^t\uiGmqs] -U.jz֒.g!' R*гs\ƱK8HYi5GВ`? -^Yؖh6->ÞS /m/P\ ^PcHsኪv,ewE ;og]ƁI($w/ܕ;[QH:g3WෟsFn림B gXmR#N'2RIH-!Ȃ ^uW\Q1-F(]o1-`u&s 2UCUmn Z&vGoܜv4-oh*@7>~wd|oQ)Oqr&b r}%#k:ozK,YtE6rG<1:kH:q5i>\^oz2,IU>KVnԔ"9l'n&aZld~jx+nbFf vk2Ri׉iǕ.aMNRpc-fFAeHJ䤝`42sXA}F;ҿ8VF޿OfaB!,vMgn0a-EC]݈5҇1X[^ooJ%F#u<$?4s)g/ZGTn-Luu+)/whk4ziC*7jˠsXԼtʪ_IDǧ C1xU.M9|7 1I dU;(8݋PF2*I]zxgiЯ~O2ŞPN$<^\OCx֑TbNr5Z"V0Sl͍[bX\}F1u 1K4UE9s5ѡ#oK/-ߦs}}HY.)׎ʵ&ˌ,DƔz W0dSz 2EjK~#JU~kXu0;&qb$u!kJ°N?'—O+*%j9 U.^γBmt,EF*Lsue9|baP#by8~V~TlBpmȡM.ͽg\[ Ѳ [@f=. w-)3K qY#ߔuL-ֺBB>迧."=K[{z7iǞΛrSQ= ksFxV&v3K$a{;p!բ;wѡ5. ^kz.~Z^ "_ [؆׈/r;݀钣"f,yUw#LשQj-3 taJdԕ|‹wf;Pgc EJeTo$yQp/ )_f}tΥ#x[Ӏ8 I9~m*,Wӝ68xR{%R$+4SZvTW8w?-yu?SUJ?&gBVM ' [ʡb"w#X襰6H$^^]H *L<o-t|X _k_nzMĒ1|֣AXhӡBLXwJ޼~3f4?Lx)?e-m<+aʥH12~I{#"bOBSa 3M`Hj9/ VCe!Xu%C9Tk%f ^*_s:O1'Ra U.'/iׂ͌4n~!ug9/p;2ap|ݥ`I:V4੯~e%I t_* *Pwb(( qMUܸѮe̮YfOS]n`){z+T3,37)+1V^YG=!q 1i96K WOקT5e& fI oz $Ǵtt*,>mi*P8pQ0ښՑ,Uw9E_lïR* TռO?? ).݋9lCMޒP1|φf|^_|J9+kxv#>)qM6rahkW N$Οhܴp~@kTU3ǃ0!5Nԯ 4x>ԫ~ansWU|#ca.ZH̕I$`nE*i8 0f0UpžpOY#wX6"+4 W$.ڑk*]WGk?ny_>T꽣ڼJs:sLW ^p NB@YtyZ3-z#cd&1ޠr~@o|9n? '$&-쩫|}O&Od HN_W 6葛Z^Oo`JcZb^T-]bG,ٗ08ao,68udCg$󒧰NZ]0.Ϲr[V>B@j7.ST\a83doE0e3U93sݠ7ꅊέO{zVkx.Dez9bW: M:Tg!#nMF!?)@%'6@D}C0>H:* K%?zleYm/fî7Χ"~?X$-oAJ֠ϽŀI PRPJ?sؿPT8kP;Tz Q$j8 b!1am&]AQ?{Z7n3KdشccK6˄O\ j^쎚.okTڪt6۽8dSGJSFbͥ;/]!ηw@׶=.uGld@#V)Hkԯ.|Ubo\dԄ!^!~-q!;Y`tMw~^G% kލ&j&ɥ˨hR VIaXjzU*5x\7͢Zm}c*L?MJ2v%Y5*PӦ9SYy Q|f3Rz\/@4X]r3"b-U1HB!9\@SF*@`pxBwy~ ͪͧЛ}ޚd黫 r1fylE'1SANA^wk/Ƒ0]z`/m%v;u a@40ѵ d2WjH'޴Q Oa<U"'hC,JWe~|3j)P hypVpi>. БdqsDJL$Ttu)6`qU əqv6V&/L5B˙WiP[2uav5yOV#+ǘD/ǥ]yY0:0,ȣ폪;1S2MB?_twZi?z]ܚ!d#rELˑD%nYoi<6@5aeCNT)3|ltыWXjb˜s~`.Ipmpg0o5S.;s b<@V#UCY(Xؾ-ҟ𣖤KߣאPչ!͘hT]Qȗp0Bu+LiZ憑FV;ߵp0L8>~`" (CXcR eÈȴӯjYtMjS];x( j;c5} ڪb渂Xa˖,Nz%?K)UǕpCug 5ŝCj \HBbjdoXJ{v$9hVz)MNTh:#Y_-(*A |! Z(! zwp[2ɼʎٶܭV;eX8o=FeſM Jө#-B+`naWç$߹\W:R?LIZ}lc8zy9-8x H:e&߮] 0PqTlL|}&^n,\MI%!\;wu2[ D5B# ')>Hucǝj&kh~d8ܮ(9F7Rq4o_#9x]@\{\4/<y5%z 2jnLnIÀ)b=*/ _b:g:c(K⯂Y'U:09h1ḙFBHZثstDP+ +-s5:3htjsPG|F2>F =e'X]9}f,OQk6K$O9P)}S/;fQ]Lƕ:\;KDR^tCaAt{*ƾlE %X+K9Z wG('UA~X lAr!cEa*\pw@: .SGD@? '[^HJhN*%jv9J*hLVyEQ#CJYT.s(w0C0FRSxJ)))O"-T[+H'-[g?i[ 9Ѿ<+';{h |<fpXVe0<atBP_;R.>Kybj}~ܶ1&{/.1 bg2 `##νceW))3Egq)fVf8p`w-! 65nHћG{KHkZO֙J SlDtey~eTb9{jy:UZ׀]"4^*@CDJ7x/SQ\h?#Ao-N뙅 yDc%cٓi)O3PG!TSX<oL#&'4u痵=T&s/fx ,CJ(!ރt~Qm51p2dK=RsP1 ?=E؜$HgMR"0PRNrRSJ!8;s3ehՕP|Z?IO<%5ppӌiɬ]5hRu[VЦ"1ThԬ'JG顛b"q%d)jR̮<*@mpC&%ߣ0eKCd/DP^`Tk gֹ_v!RMIgjwޗD+ɆSCRmz}U-Q:!]sr]?@w_ؓi)UʭSj[Ri޼t5|Ljq&ViNh>fVVfTw6_$U‹~IϭM4ɜS#JU[XJx,qֳ81S1iJg|2y $\S956OF$/ZB?[4Wh~m=^ĵ./V⿬dqImT V(PFux)wZyi%YO՗mp`x܆~<;tVDh:QCw`.*<{碘vV/dvX endstream endobj 60 0 obj << /Length1 1926 /Length2 23027 /Length3 0 /Length 24251 /Filter /FlateDecode >> stream xڴsX>mMneۘl5ieM5ٶm[<'mϾ~~Gk"'VT23:330dl m9镁f.ֆ&&68rrG3lP0v`b#HmJ@ladP휜 >@[3 [ "fH[ٹ9YY mM r y;`476ؙT51e 5G`{{;"&AWj*~m?U?|qSRRcfs3d'q`7WSG;̝y\jnps|< bkQNgst ka uq[iQ(Hcn,hkhkal0KPMqqtC_*M/v'ӵ1tں8y6ylc;[' 'g#?/*}Tǖ/?Dey\Lfnvǐٚ|vS>Q:99z0s(L-lMLŞQ(%?"̀&t76gy#f#(= ca xy9Ύ.@*1sL,?Fc].ekj[_VcOMl=&@S8Fy;珑g+ m,=L4R9ZIhhllwiK9~̿5-~?/= ;> QbQ?|2Br"wl535s  =>f1&@`kwq9i(;Q/qs ع>%afb0Yf-?b[~eo`G"Dvy94\ Y>"{=?_fVqvjX||hD]ck??z sgcb(.3++X};?tí3f\+V0SI_S:b%}[4w(P5NVG7߶X϶Ī%]C_9_<$1u $9Z%lsqΞ(wdy`qi(=uT)ϓ2&nL2f* H(䋒XY0;6gv&lHnĘtUHّJS3tLJ =X"#½+ޫWjVZ.Cbg)-K5Sq"&j.¥%2d :lJ+Uj7F"*oL.>y&t2j ;QP7w$P9ހxE)7P9 k#e Јu^bnKwoQ r,GWeُ_RG@  2S_'_fa[YV"g b5@k3#UgS i&zBon0f]dF1нD9Gqnm,$2n׆k|('sH)4Ľ1|噘qQrݦ/[nX1N _8~aGO +Ahc˝څm,!^AŀԐ(0€ba"$whG'C$wZ#ow |qkQ>4/l/A W =HyZKo*:z`[l͚ruIywwXZ7P9mu@XDQ4]dZA TlE%Y$3$+* e8m!U,x pAW:E8E&S,*x*Bbdx3(ynYԄ7$[Yijp\ vo7A $ЗݠMU6(ݯ e74BF HUs ;nюΌ0CUL\K4 >xvw0#U8Y'Kwk>r,Ͳ[UNe3Fy¿/lhEٲُţ<]hWU] r*]t/2I|QçرhF[ A?JW ~)`-(xޖ=L:w (ے[]0BwҰm#DSfa#_5n/si'ivޯVuۉHK/?ظxwjb#Ki P"UWXO~R\^YcpꍂӚ%^~M)گ+m)4u+  Eh-'XkY,Vi DbORv#E2ÚF 2YPM"n,N,] R{%^uU&*g3!Vt h,566Т=Ѣ:E+3L=TPkE܎WBkһ~f f[VKT{3K3-w/̮ MÑ脇4ؔ\w sƶ`;F1!Tq-V.6|Wcq$ѷV'3PPR{ڥxz'_IawQz)H\Dq̔/_58n=6&9v>!k}%zW,ȊlqB~I n3!BkhnaiCZV)ٗ$eK]<ޥz\GBMHSoWUau"6]1+<]/n|8;Q ~ֶ.rxw`s:6n92$: R >TzUUj0$ׯ]<Ɲ,ݕn`'h.W*:-^嗡&Ls>/w57Chdgj-}|4ԟ|P 1&a׭q&Tz/4^SkIp' wY7g|5_?puhM_\LSZ[v_Ly~<[j7:zh1@݀'Xx@b`YՆ9;iT I 3޾C!V쭒ZM{ CW 6kѽb D#xfH F^.aZD~Aš_srY Lffo#Fx3udьJH;7j^<-̄lqy\Q$r5bÖ1oʇZnr%30Vʼnh,gJe22*0Qݿb7HYVJOsҝS]7Ic"ee\d,oMAn0y_z,rem]uvMncֳ0nD6N/HƑHʿrY[FZB*STJ<kȜ 2FHF"KJFJOR4ҾEeřgh҉SMf +d2AM8XSS{? I9jaX'% :sb̓?ZuyK7͠XmYJs؅yh> }ƙ~_4H_.٠'SY63OX0ྏRo*g anl0U<U?HӅv_&-@M`ɀE/j:1cX[5m *[wnLoO4M;Ur5oCJf5r24%tҾ)^5bFt0; 4pNtgz}=n™(CүqP>^O/pdHʱL$U)mZu5Z<ϤT轼 M};6 dJ*n|y"?U^˟zAxz9mŕRÈ]1uGd|u~vc<]bȔb\5GsH`Ù'G;*lhTb5gTCT|l)tǼ}3I'C[W$`JR\gDThnE4 6\T=ɺʾSx?ϞέOe׎}u¹TcJ֗`"p8fG͎6s"Nyk=Cpt3 f|~ O Wxk>^40 vbo,Oɽ~R~DxVFp{*_N7c>dM ^2^zYTw.""X( G嗲+51] 3%8|Vuҽu ;lr,0hеpX,-)p,:68&]9m7 }pZy6{':R=o;ih "|aQ1Uh~dqS6]*#rO"gDe!y:vqJⰬ.eaGA޵?fVi2n=Z2bWEԶ-Jpޒy FgCԄ _;nXPؚ '"1a9,AEiMD)[YQJk[3#|% iڋ9L e#O曋 C9+d6Hр!mD!FiG]b_d&Rkh2ܤ&dԟ%\[9n Œ5.pײE1pt ۲yJsBREo0_Z(M`̔V7MY?<&%#c4b_`W 5A3VjJNR[S{A9GW !%]׵5^vBNA]%d-1H2iX165~(P]gΩ e5ҭbzԂDžA\/c$^V9w͊:*w5fR'IKB?ߥ&mK@ h$Ji*\Hgs(.#;Q富&>9ET7?gQkGzJ'eXpQIzs)P*SpsӂB,bЕZ*4F#Lj->ZWO{i{gƴBv;8Ysd8 ?˧ e&GF?u~ɊE"HAJIiB]KDUcSczca184y."i_ιHF6c.W3VhGbuOZ09_'+όrD_CLg)0ˇ$fQQjzCt"%~Lz^3L*^~eV(oJ/(kdzDޤk#'N^͋nL4F6د}A.`bhk԰{6* LsRx=]ۆ?KS/E$1]`k$UhWGG`VWw$@'Y{j!G~uxg*v݀Ke<răgI"B id"?pgَ:92_,;F:ԪdjjXdz^*+Ue=4;'EŬۢr'ΰA綷pmG\?).Ȁj$2q4a&Rwyotm?MfkH򊡗C }A J$IX3=~2`_A,tdG/(5>Z&]Z<$ك6h3<{RJȴ>}>wcnG:>g>hgR/`VQ`KS3$xI4ȂX ̱μy =Ml$[jJ0* MLH'j؉]Y畾pnW ^/c|ҀL؇ߵtCNqV.RZj-yT߽HA1CZ7M(-{Cŵr|0A@+ > !#>%,oDS$JDC A"~6  Bu2h76'x\Z#6Sj œ53Dx'cRW!J'4Su/"0ΞSC{*^/xh#.-y$߻bnRI| V t] \@hsZKұt˜A> E!G*/IF`?/OB5ʨԳe ^`Ze#lϠ+h+A=_'3Ҳsm\{,ԉ+S^"B0N(טBS›]/ZI ]s qo+٠ʆtWU'd\_ ,4mFoŠ̌ߟ\%0.H(928$hoJ'(?ix[=HZdkBOÅ QU5=l\pһSZFe- 4V X登M*/k6訧75l5>˳ %JMA \mYu5D5R~{+N|8.7~a)o0R4 $1VbTts.qX9k ,Z{Pp CRJpsY?=ZIeBZza`(!"Fk^]Yf.!>lƐ\ִ]s}(TCwvd딨Db\Tp#sʃ* \\dϻ9Rr~ٖiUձQ"9iFb]+Ntls+_j-09 ÿ Unx5K}Y,bÝ\]=bw}nvsc.Gi6po4}2/A$ߒ $OwܐLS?Bz̯pӗO }Ah!Rm N՜kes#R>sz˳j i> i }T~ү6&6BWGO/Qr~RY˘ 0-D>:I'" QzC #KTVd(<\LL@߈lH.^,RznHXz*hb%~㙚IZcnK\_&h#BP%_T=Vt,>eE(gfN[{;s' Pn,ew۷ZO$R}֋nkelY4-0 lun}"s63-(-% FLOmnk1cSX_I@A(#2,d3@}L(40\?-vvH_<3a9,| ɫ  HCYb _{6Zwo WbQԗ<[L*b [ N\*"OE_zR㛭-!E֪W1PzGDIw㤪y4;~Ea]L\$,wshHKpq$}N\{ֽ*+<㉫~^g`utSϣhio--7 ǙceU9$?rvTAiA]c8=hQ=[wReˑJ0E]Yv}I΃V* iO#U'H<&7Au'fnd|$ѩOc=a÷\骡1w':ם9Sgv'(w)K۪G?D`3^5k%8(WIW+[V47svd)ɮ0Cz]6tY$wXۘ~EG2޷:HDm 'OM>͋IVh v+qGU1X=>ᆤ&58Rq__*@adAғxQ{8ןqU]2*Pe4Q`K~ؒe?$~u8쎳?ca{""ursc@T`5lh7-daDA~-ųK> 3X)vf!|c&U@({uşyōe'2-VdlZYfkw(Y){%M4YdBotL ϩ״Fy[u[!zu|0EH5Ű'aM[kÝbY^S4u+gw]ç9r_5Z zi\qeVeYNا\ ) oʏn+7b( ЪM\-;͡]) I1Xz=WmM_9%^'5%)@y#57#eJ .?%ܑ9 sk9?#[;xiJ9^jKoC.x׬ᴊ}̃  &ilBS!mT׻ -on}ϐd%@+EKzb#+֖!3<1ȳ"C9|6MPGkX;qYՃ,nߠqk PO(8Zՙ&^(Pbw[Nt/W>9Z8meTP`Gp)*Oҽ01T2k>Sy'?e8ן7jdCZ*8ހbcZm^r?!I[sY;9]ٶbۃ.Fڌ1wl}c&hy3%7_XԭǻuE,߯ 63K!RQ}4~1ĭ᪻zf/)3Dž q>=ϭIS+3g_\t3hOU1Q-̵7øK4[R|I8U h6Pz4rzmnI;2ki7=Yo'.%wv_ڀT"HâasXM32^ChX^@q蝩 鎟2oL mE isڪ}&˲uNi&;i b ~\sܛ a!f0`T]&n%ND} NJ 5ZЧ_._F}ISQ9"Mjuy@z)pL)}]页sSg&r>,/+9Ї{-|v4h cId$m\897n$ L_SF%.̇ g(v*m'`,;WD&NB 6SGz,8,!Nޒ޹AG3dĝ16|m2<˵d_k/_,x{`4z@TltlΈ5[ !"pc5p)`IMNx%t5j`c`5ef߂u27T.6_0ʲLX˴p)l̗RmFl tSbx|V{MRT$U:tU3P dwbi /}/2T ~3)r43#/h*@ 3 m*U)5eP"Jzr*-0aНzѧX(2l-D5ٟ뻿7sr:vhzo muu[cflgM~ F,IG6͋@tkL)%k/UTEF])+Y'U1,ǵǗ| b(;ߚ5fK,|+fcbD ,NnnE({b*dJf}ՆUt 'dhKyY2sZ%Vֶw fj7$Jb+aȒWsDH2s !(uV݆1g^Ǖ#wn3`s(UICeK֝3]?8n(q[GV6e!dH$CwaK oFjː~)TF7 y"BǁWkq@W3XR ^Y Nq6m_ic Uffˡ}`t-q$d8 8,* f[f}!hZ9*,ҔJg͇xG}MF>d+ )A]0TiV6OM^03՗. TˋeT)0ɋJY^_ Sou{va89l'BtxƥFL$)KqϘ"Fph_Pk#y17۟Wx!mSWYq=%y E1A_bE~~7X?椆 DvE0 (MKE?3qb wbei=w.'xŕ$ŝ|m:W&Х;;Uyíjr|NbTPJI++STiM\1;0?u&,-sӿM-*r\{"G 8@e.(GfIxOKv<-ݵ-K=)!3!7lUF$Pp=]ml7pS2v޼GIHéOSc=_5T2\J;d'E ^Y /p E6qFq "a ,WbhTr~|צNm G9 jdsp{1  N a gǪԺ?Լ%E+'xSjp:V>b'BEL<^MJ(L&BTBe;| > *_ڟq~ n1_LPPa61bԊySZσ%}e(6;~il"iR{La-ls! bw6j!w~7{IRNThmx#:!aOt`Bh]jYv(yGZW79m)-2Vb4tJ7ſ;qVC1Q:]׸d:[\2CH/방Xe$T_A*b |[Y}(\apqN\3|SH c#w.\Q~p .P[|ԱXR/iGPVTgFEo,(tcN7\ ҚOE+tMLL\ݝUw`qC*ɒM$M8[%pNjM{2`!{ x`~8Umܪ؟!ZlYW6 3&l59?^*1"Lox} 6v3b}OKr= L`jGYm8̺4Cj5q%> ,W,>tw5惫-MrsF!UV58d=4q]$4\bX/c^xmŲo 0 XwkC\2:$;$ IIXID'9A2>  #|!$kqV1ZB%d/sϏi(jp`^߳K tX|x𗩬hIg]ǵȻtք,5hXYLc,sAlsRgh8vF:[8hdA"`Nɰj.?N zesf^rsB/I<?GzvKgb$$Wh7$ VffY<8G#m_j˜d\[OlfG\s^$a ʗb ~`T|qټ~+z1z/&$w4F`D?Cؼ.}R?p1(bkO<թp;t_4qp*qC"wb#] BjqQ*yvwp_{͐O^:0.tOc>; lb\*h dS'n tϦ2qNe j4?S0-'zm =O `7< P= &?pNxW0_v%)G ᢚҨs+åʪfR֣8FG#GK衖|}eT`/(0{ɠQ,UjXć旬k1h£`Bͺ8eU"p 2v+AW.αoUA-Oxd-7^vVUP+-Sq2ɚ̰>P j?S2Xhғ=_ E_vGЭu4[!;=|AVKY$bFHo]$! ncE <$ȋq#[~Ƞ?thmbj&7՟401rĭ%djRb ):Re0:#a GH}fG'Xsjar^]>o]q^r8#=1mΓLF>ψα_iqݏ$ х؍ >>lKƮ) CC :u4f1:tHa5#Qjb dțIDƞP7mg!2ʙݔvM7(nSȯ5,Frq~ 4[Kcm>Lɐ͉&SY,47Z!d4llL䵟FRRhsH i bN 4dckXo{T5Z~D2NvrL,p7}ioIy> JHA7faN " (JMCZq|ko@ǐ3w:jfVHK3Q3.>䓤vQ$v2RJpsYp(i'~ %: fB bhBx U#г !Şli{ݚ@S:(kɰ&@HwFyZo.phVM_C0pRo )onYj[9d:Hu@H9tt  4Bs Y.Pȋ$N#>w,P!MoR&pGfJڻ+mM@E#:_ndYe_#[V3竹Cx7$} r'-%V<$xq*e]RǓ(d$txLzC,$[VFjŎlJrsӄ_onfCC3_򥊩9EP-#%fŽ?ndV^ fj>S&+U?箣SA^mT;}{C)G8Lqmϗ֩k(CF u ^1G2$7=P>\4Mr+`{)_$NbC!_8~L -P><Sí/mB,#j|]i7@5ve<-z>'qܟn.H51ߝ{:~T VvOJeo^`yujT'O: _s :-+ Ν0=^ s)Rch1$*PoAaK`SmE}~:qHc}2"oUUp[Ee͜Gb1͔LY),nRoYPL|l)#;"yP"oN%uO7պo6E jc x0/;Aw]Q{ǪfZS, [!& Cw24D# S2?V>oըmkn^K+S*Kbu3h`|nIYN7v4 2wPFa/``34X"~g7Wnǃof ȕ;LzB)m=eS01B j*@¸I#t8A0Kc_v1MF|C˘ym8$[GeȿSRf6\B(@GV ,`1 tDzHma\*A,̨_9kb'Oq21Rmx}RSIe+`E` nױ)Lq.nkٓfîS6_#xS[<^Z2,wxzpdl'@.CzNB~6t.GهB8E@ay\m&)<)a2`- S`9Eq9,6zZE{ZGkOJi͠㎙;HDP"D'X`OGqyʩ^dțAԻ؅kh1^k X>1/S u!Sa4 qҠvݭ7QsVlFK.$ƪ~fhȻss;E1Od aR8JPKk&teu;I5$XibuZOP:/sW 5w;S UKٽq Miإef>Xɨ|(Hᾄ3e!x^e17Q!e0.6y{sjQB}JYv}>805L=ȝx_ ŀxA]aq%~"/D:,<2} *` iFiV#HP K-vīhG4gιgs]xSx4(oU\Ɨ;=cݲG >^Aի`c[kKaE%-ؑ`%2ǎ`\5 o%qKa!MswxyŅhZgP$drH&V-,0@S DhkPFעdEm(ss$?LEkWϦg^}s})-ɀ=נ݈9]0Ɨq71!jRkziqO^/p}8BOK Ǥ<2Af iz-5Cm~;+E~b_&!aQ"&zU6kŋ ^>T :4<¼v 6v4O&U4> 4fV>Bŷ[a1kC/Vc?,v3[ {w/L[/"@bhƦsɺM:q'&h~R`~rL䟟n8*hΆZXTvÞmEmg#kːp)1zR| ϞzN(·AVzܠ5Sc,m N'|k 3V{4Y {ZgGC'XLk]c ZϣSluJaŐ[]r:A1~/tl۴ywMP'ƴ[R06Wh2$z lB`h扲^8?NXZ]cRO)GT1FŜ84M1+W=5.EgY %Ht~&c/]8fx#z1Jc1#Cɱ#-h/'y7&jL `Ed9_8D0T5l)֧DRx$M{{DogpjQBfҾ1(c`9`[)B*2@FlSLq{!#eT&h^)8)XѠCPIE#s.}b BJ]i'F['"pMVX.MK6j^a+ ,1٠Vzן\J{dMI Q _+ꏴG/I O9W8B|-Z0EX;i%B-(\&/v>.yjOm lrNcF72g")gۑdeO_!K%^x:m2.`u,2fo wU@iͪyqF}CRyb1u<.ݨ(b%QTњ+u6^Մ2̯X<_<@_jK6_̚wn*$=:E@>^/uvdP_.> stream xڴuXݺ=Lt7nX4,AF[AS:>gwqb9|Lb s4ɝr2=\̬H@3w[;nPp#XY2@'+i 0(4}l:*͝ :Y:) gW[k58~W- 7y̜,Jeh 9́6fV@ ҐRȨhj3 kx8;\ #@RLYS fhih tf(k+IiiJ^ tuрPZiqwwgabpsgZ3;;O r?]pnWߛP:'ItK NM , \EUUE;n0Z  \+3t 03spK\_+[on&"x𜘔@`uݽ]OLR<<vvv+xH,%@`nH哴ra?smrv+['K[z8h9ٺx$'lBcX@†w巙,C3`e ?<wW`ߎDHl<K[ w ?圬@L?#@ARKhĢ r?zI{88(9[3suJ ru4s/7Res7'~&؂=\&6n' _|f `PԒT|F0)' 5`j v..x- N8{@H7 "/ `x,/EHX 6`5 pM#^p?\EbA'EHt>#6v,l` 1+ r/=? ߈ pr8:ŏ,!%C7r0s+՟`rV2~AWX[ VWfnEn"~?~R 8Om.p-'y# _b^7d$3kߡlA_ c[\Cmo966p_[S7z\p7[/ p^ǟw U䀋Ł/?j+]?_ X<(} Z Q2AoVu7h@+[\ zs?~m@ E@]ZsdyTL,5i|"rL'dP(5MHQ(0%ĩD:e-zRMt,P)UJlw!p|*U~(Q$lSU+Rgb)!qφW/uUWka=:)K|fePH8"lCshn btAX/ܨV'Fݔb@|KH\L$Tǯ垻t*o!W2ysg|}.x4}L7,֪֞Aև_q'0ZIyk@Z7SKZ #}_ZBKHUHS`:+zD%g wYDI>#)k7&B94(w`%`1?s:?R>{q~Xhh[,T#7bVͫ@e \0uػB]no߿p̊_Uċ>M#Qq-/`yyIB4 @f\o__Z7_1vhqI=Mꈖ͡#gʄFL02''_W2.- HQZf>|3~<"-2vn ~??LA=772<з1}cfXv1T~bm+4Fz߷$ /ilx\EC#jрWZ6poneU)]oIX.bƲYe~pTwhI`C):\f] L g QU|qMN7{_[>ae;yK1xyʝv"+SݐN֪lƦc_?)p&JmㆸVi3H|PLȏX|pYqЯ(8]2dWO[uۍ@^3e1J1Bҹ9iz5^1m!pg_cH}Ɩ(0/_^Z|Ui$'.9EX\xlvxߑYۚ\쏍8b9P/@KKފMzŗSd'V(K$[lU[zlcB/ |Rk*QE+]dmʥ:,OygKf"M=AC_5yp[KҤoL3|1SU1긨<1"K}?Hs@DUK74 "Vjc(3v!!vU,8HF >tzJ5ss៥SqDX|t[Gw/8.Rkؽ0[/ĥW׻D|90qYzwC[xz|'G4>*TqVe5@*9DD.:rMCr׊(@JșBäDAJf#3d0Ye(uz0pFZiuow= \ c? >gϨka6<6j'<)(Xǐר6Us6{>e";?̇-=, .VHo"Ƀ%s_ dnPF^7G%[Yxȏɲk~/>rbUǵ<'!B+=u5ĔíhF6U@1\U¶/jĒO.)j*0cM/%a,P \1"p9/5*\z3~n_))@?}ԩDQgΩ#@.\B)$ME?pzE" Ĉ;R;ÁR0^^Ȍ*hԶL,ۻj+rXUu<ۧsָ"Ց4nInġљ!&W5ڽ Qa"ac%OBy]IdCgQIߢkf[QbёDx^ͿftE.|1T?-oM;?uDힸ ~Mb9w^3W̔}iuI{~m]ߒ@yƋm>״EI=)A=nrO'"x0/?قsͭz ,`ى힘]Mr( ҸDOrۋmb7l?ј;:Tح0vb̈́`?SVP1n7zatPIj-^i D Y]|i}uqskzhe|{[̩W p;7+&p5}D{&賃tHeP^y=NQI^t ՋSfhb/VaN,鷰=)Nd%El"'Wcd,Z}(RN E-Sj1C*UD;Wa&~s_a~;AtǜŕMX5Q31o NG]yQ6{(-5Bg@Я"gݸ(D7HmЛPr#'pp~8$[z飭x#pYY>WU|$xe$<__ygM.+R ׳ڏ 5&a*@ω7e6I?jH*pr,ёPS?ZdT52o=T{u:< ГFƔGr  q8!lMtpD tNNq轶ʄfMyãO*K EMjB }`-QzE_M,<=*EZ&BU䘇뜧_ݮQͮ0R+U{9tQ;zZF/#6Wfe1`+9Sk&/@,Xu#&ci$6\evhqq !3g\wct#\ zU5bL4wo V?@6bNZʅPWijf K1(QR>nZ'bc/&B㵋GMqaF8B&wQdQEfw;$EIB@?qx!*ʇۂ7:ҽˎ8)/vՄc03Y?HN 5Ӟ~ڠ6 8J􀼖KC2cz_#0~")_lFXWF~ !gl* :VHɵH]`džYȟP~CV"ܛUleďx,YF4h'/o?Dʬl 97f;`S<  ?5yP7Qy?QxiP{I !]hlfCIyuZ}65@/gZnҢ 3WCb+&a leX^}~ktgIȭU_5Ïӷ DG0Jl,n6d7{I U(g%[3 mthO53E cH\te\ ՚6F/mĂ˖䏶osgzu=b\tsx2bغOsɨK&*αBIU#HEl5HazB,..Z]d0:g\+zkbt}KMȇɇBi!%J;+1xssYNu&QLl*#>l[L<]vxB}fPϚD'_dA{=E6*-H-` (JdsKcJ9/6!vV{ۭďh+\}-EW|TBb5ٝdEq+Sįƨ~J.A63`Td`h)(GJ1yGS0"=5.6*e3vKKfw(ȳDײе@ng7a^GOeKI>s,GUW'NSѱ{E4}/Ki"ݦ [EQH~|VpM"4(k5ʜhmXGzkXc`6i%Mb ߊ"^Nۯ}!-] GeHy 1 ԏsL$O۱}Yԉ!Dxu`Xt[y;pPc hzgK]װr9645zr3F4وߓZQXa`*VZg}dhr۴Pf`lKF otlTIw]Dn̢?럳1)GCד59u"HJ-WͅH^dTQ41COߥX1e:R,,DC}g!HI Asr܆5m`Z^lvy8WʞɲYKUZ#?"|};.w%3F-NNPR2ʹf48֑v-QG'|q8)Z 6^Z%ےr<Jno4ccUڿ}6D"jI I t!:ACZi" b}u&+ahǶcs]I̜VڔW(S>0dg@ Sۦjhv}Y8xbF} }=egZC?*ZZDa73㙻wUR92v r vo7ߍy~\* mEVʗ"Tk+ yīSuU).Mh} XE1n&_N[ȃSp 8n?, m͚$ Z7/f3^hA/>z_iBaifK;G gۅ79]I+}8RJWtZ%>oQlNnpBv2[3S_оԨȘcS8*! }ৰL$,WYGf:oADؓ/-e^N] j~}a|~Z]'VbV!G1 .u2RX}*>`‴FSRظ[W:}bw @^x-h ER[CIR#ͪ25# F%qb6i +]Zj'q^8,-R759tnpxh"٧ׇ3׌^IW4ć[ ֤x:hAuGA%vwRN(! }E0=!-B<]綷aQS] -vri$, 0MOߺxl)ѵ- 7-л6# /hփd>I0Ǎi-sl?'q[Vaq֡^rg*#Ռ4W;Fw?. .9۝USV*|||.#"J6xxJGp1wPɢ}?\v#)[YB[#{ʃKU^,}^fvs PD7j:)= QP}-زᛵڝ 2+!U(sh1 ÎMHQdĖ^()й(h%N}$$ mIAs=x؆댂s0d7LtbqO聜/TȚ+}O;fAG5l\:=]Ep6]ouahBC[գ>AruuxRyp/d{qvLbS|! k(?$9k"UB":W5ڊ#b(fG$˧N鹳< ^Qf6D+]s5'َDW%FD!d8k"@xIE #'~ 4/DCc4A~%!|X^621sQAn:g^1YT K=ybn ܽDdX](/9h U7d5~1Z 3'g*<53kMGI4̋?IMPbwY K7,E&#z(2ԋP)Sc  /|hLqڧ~vmyjxӽ2JSU.e/!ڲUBK葏+A&^ڗI]Hҡϱ#Ͼy>a[6u1l&{|i^䵲/f@HQV$U:<Vx>bN#T>bmތ-ryׂYA 5MY>-Wx܏{=2ͼ;u紵ex?ins1qfKxg!Cww.唗rD'';oM9aE+o3ہS|<ȞT7ܮC! (*0wt*Ɵ*)>6 ={&}Tq&'=X5Q !z\(w߰@͉Uѯ'fT R#x׻ky͝3EFT]Vj~c(lE0(ׂY]'2ms|sw'3ҘD}q[mTF94[Q?#R LRr\qd-o*|Nh')d~Nϊg>z)l0 CQMJQu!/}'ǐL]"v _@Vwkb\rt|Pa`RT3ѯL#g@=#T۠SLȽdWT*eRt^" EV}JB}E,MD5VJ);t%M47w%瑑5g n|EA0Ӌ؞r&*hO# Y)3%?ټG7^0^b[ .7ʦb'Zϟea@dZaL6R=P[|'A&3*feC:SlF*>Ӓ>@gўyVH/?aٙB}?{>iQ{S~-av`O1OazhvLc(`,gDmqlxyr>͋R"_qPC#P?}6b9+Űgѻg/w AvAhcVRj6&( %Q+D豨h'gYR?䃢NEVcC/fxYUtZl`}' =-Q\Tԣ}yC\ "8 ~e%:hO{ttף˖z?~YǺn f) ۲θMq:#CdKZןBK8`GHCMc0IR rw=L'H?1`cL(|Hـp-[8ecdjRV_0$ۛ1 Ovkr#XgF|p%^ƬimYu:I%a鮫xY @d[2h1pdS% WK]$fsyE^X;{E{X8B]-}U}sgEAy15dUϒMz-ljEldkWM/, %BwK|mt+DkQL;2p"0_# ^W).hG>a{PA#YDYvTG%>"+9҄/c~^ĉ+$CUb'S)A:#pg%;5_ M" ń*?g3Ңo8NzH"yTxJHIk>Z%Þ)DrvY20KIK7眆pEHI.*5`' }/3D랻,骳ÏC젺N/#f9v5cUXp'5J'uǯMU BػD<2d|"{NH(Kb_k~]SaQԱFv@gY;/EWEgU%~(KV +|6aW~D!*[Ih9k3]IV rjͨ[ˤ YFleWEEF)⟏}diAL_˶n@'TcĬd*5#Od-cg+J ;btG4wBō0Δyhwj'cQ1B-OᆃOh,Jo5ꊅ& BFR !(ƈ"x}$h|J_ S z4:]&e'-B`̡M -TɄp1߀MgѼ `-@(P]?en@Z cQ-^2&u6;UO᧴GĀCC:f /Uko{uyNXsseQ})KJOگS9Y>ԵEFoKv%60>Z>5A )j/\j yD7p쬧qKCn%?6)=Z)+C-_xL{;vviF&(܍wc 7Pᜃ;uX/3 ۞RRueuh~,'UGi 1(' CW>݂6i cQ5w;S UKBv+a8h̦kJGFn ٖnŠEXRF`&Z$_-."qGuץC Xui;>[߇Vj;rNUD.38= RfVkŻ>}5T:$yX ,a| sY ᓂ̐%of@ QdQ>/9ޚ(z ı[נnmv>9/!M!e'CitҗXa{֑Xns).!@QdzL"&161\d/#Q5wO>֙02Lէͷ>( ^ěM[VÑw K]ʷDsI3S4Ue)ΫZq'#O KjOrEutMr x(0Qĝ b*\GpspP,i[wV5Y4{_6' Mf0Tİm|(Nܮ`"Kh:xr1>a#y[!UԼ;8|8NXX?%Dx45J}Pe~`9Zu -O?2ۙznt}K)|@;^'@i ]9T`D n5L'}.FvVt-rRyF"/0G>38%@7+A l ފk5tf6Hn i5qb b=6{okrygn"&Cx5KJ#x30;"0HزUqĪl;P&sB=z!rr(;*LNPˮe>);{ EV<kp#E'4R+ZI m8"|?[EX^X lD^Zy˲;Vfl}_^`1`v" kN@5'^7TH1 4;s.>;3h EW%䋤Vbܾձ|DuqL6sjyXhg6a PzDyL>JJ웺t K|&#EQxa FYp[ 0Xc۴|xy^7+dž-| hG7 [NtY]ڊރ2]]zhRo8wI٣WHV4=[XXX2Eq|D;xѲȈE]zՍmxx@dws8<>͑:Vi0e=zdW-}YHs`3J">߮ Զ8'i8׺{\m:Cv2>L;aECzܻl+:P۪N|4K JsǯC{+(K|ت'C]aieqi% 5::(?#ۿj"8QU!ͬm3|s{@n_#%w8uO x^S\0s6Ei?`dqdYz(n3JFI)KDUhjrHѶBD`SPKM^# -5"!fG.uRq89Ka*ɺ*!; +Ġ}?c[~#>$kru>0|V8LSmHMH0;`v .F8P{"UP_7֡};U Fl|.du_gQȽȺи; 6 &qrt(N!a"vpW0*]Ez;k,5Z<7qV1\O[hslV>(nbLuAD_Oyѧf uʶ)PvvHxQj5̚|q.JEH6-&8P#/<ą/x ] x˛7a j@{B=;zf6ՐVCA3Q'efsP$YHu4J)&TWs-3C~,D9#d*>ZM UV%tDk+Y?"٧بӸ|5`H.R;Y|m~1 yIܐ qM;.)4ܸS\eTSKVo}>K!a)o- &) I!|Jѧ|-ЌF$OΒ$'g!;JWyx,@BtQ% Yyach69#-Oov! *VydMK ɉ${uh10\ZCq/\o9ʼnWmFoCs w>ODd(ҟL+_9=eP`K#*$v[TuU؂ۚ߬,uOL{X>, \igYo'K5M6x LTy4FS~^T51uw&{Q*`Bqv- c:gR+_y&&_w/Plt4*hwuO3{GBKgFQQYk!a۪tKzŢsIY86a_c\IWVh"󽂟;+6q N8\9dх:N5Bލyx&4^ ,q5{5v|"!JModl"q*YI"8ca6{y 0shQ::NUs|NJ y|:*˪ [%Ud 6+["!JzcX>ܙ w1OԼql鉔2'}x“Ig~䏩1$8Cx zE>|8/Rl5IGwqXG,2%n9WNgt".']q;ͫJ83ǪH9Cg v*+A~)d-L;bTa6]7!d2K-Sv j(4鋺`V2*+mvFk>934Rvy 8+-|̥gBDscr ´%R0tlg ?n+Q2>z-$R'Ě//Ő'IϨE>Xp\*qE#7M֗4!_83hjy9`͕}®⹱7>XH#Hj8<{h0 MflY0\~9\܏emր@ir@!2`oPcuqd Ȯ+Cxn~ʔtv My 96P_BN#+YS,HhE!bxvf}lP1-]`5vU:~W FJk\PWxyO@G(EX@mݺvM ֍YOdUQKe CI4}@t-;=h{]6"D;9>H[aqsm@a1Yz.w=%m%.N4T7VqJs-j cFX㥗ABoM yfJaaj$.YAۗZ7.0Agh {mQtȏ]CٙwlVIa\?ZjvKw.s+†DgzRKmn9mayT+ߧRBDudd / Ь֝ |d&"y= a-~gж)f@azPw?WO}T)a`D1S`ոhzݾ]QDa7_jN~2ƾ.eeR-l?K0v Rwq6nUGZJapwokܓN ySFJ^g3q[-Rd\Gym.ݷBwۙQˆ2OUD,@S X]\e~C1z':IF4Pɦ sd)$L(=Qata&[x@ ±!khB-/{*[?SZ?LؾcǽBJunA!mKjbrEC9$cOP`75m!%~w 2%x2{M3&Ǻj6!D0M+J$ޞݶrd)) CIm Ni7ˍ%߆Kȴ &;`\01+BkE3kjAzB :z1=zjd& vL40|4JUQyYՑR*EE:̌b2qb5'f^j([hS:lj_jQb60]"HA~7Wa=m9rF@U GXwFVL#JLY J!mi׆%FbI#gzJipXO[[]΄5ܮAB=:Nt^>DҋTWq{^2+pWzgJC F6^bHvTМ/V!pbiM[^;ɜS!pdd>E;u2Hxe5~Uhvޘ}(kOTQ [)$Oe7PɂY0ڤ W+k }.O o0wgk0Ҧ]*GWym\ L ZP5|&͎tF}geo%Ǫ϶?6ogYыZkG6mݧBVS˝eE"*˖Yn[jZ5i;PPح Otk4 PQ6LK_iu1cOoNӺIש"cmDS RNDo/[E$-+19((-E2Q$p*rfJV\Ezs,F=fOҁ#l1 a۪tKzŢrUT+Z5"rX 7ߞ^턎`?=Ft*kkT`cq=${Ւނ`5Y( ;_i4pbڀ UjhMZt(6OʛH$_ʺvk4$֨/)~8ƳmWs{U+JlDP¬zL&0PšLˑsk{:Z `ر@G78 T2׉$c;|!FlgձM)r@9X+Ϧ8ߚgP3`iD7xo[䭟7 Xngqsܤ)9-6BvQ2əG @+:6.61|Cq,hC1%*3hYX>$!aU0_r= z[3AF̠JbSʁWE\D9~Vv]VtGWm)?y݀IiSK5A/K'w CtŔҢԦĒCu2];928e R 8`<0XZ/b}zByzaQ5F P˯ZQ찶!d<6hO2@p"+2AuMJ*VwVGz?w1oLF~c A5 nn?G䦉2FS61AmdOĄe/<k9v OM&GQ;i6%1O &GS鱲 1aɺTW;94`Ţ?᭻t:>wMm-Dr̘s^g.sN# `C!}rdÉ 4ڼR6T@-k~ʡ;&H,KwߟmFhi(7]φRFApçEb.ҟuŝJ^=*hk4Ea5Cy\}_YS0s#G_o%λ{ۯbpCRp{._*l4:LE4=V̳Ss-_chhqYӔw%0R.,EqB^χEedbij EujwnSLJ_H4}q{5yAewb;@&N\ 59/ɭt G2sSʕ4̤fȡܿ)U2ߝA/ ]wMUvOp!V0)tJ3\ttY=SfJ1j@s %5siz_|p[%7hVq3K2G~f{f6mFJBOiֳԟLb9핊/W:::tQ;ԑA3֣OY Si\e0C tSI:qJqF+ٵ o,1r6B\Ri.&nYpJ-{ķ|%tpB#,ίRI?4֜BVNCV2wJy,tt7I`MqّIݧ%Xck C_nG*qLF%pt닮:/^^BXx(6a"T]j@]8XOU7o٠i 1> reӵym2! ['4c=Yn1Aŷik4dtYuKT@ŹS_^-{kHy+p scga"ۂ/%wz,αY%Oj vOXyT!ȳ.x͓mD\QAT"n*VPo|"Li66` ".]wcydc H{!,&"cpV]F ی!z-scM jPhKw+' nYHG'ĹRV^%Pvg$}T$d50Ct{亢KZ1@1|2TgSQ#LHO {m=.T @čmJ.(ǜ)NMg54<5'R0aˊ0+Q%L{JStk}1; B{bZau}7LߎV]GLq߇X`N!2/57R 0> F2V_?J)krG=?A s^O'v`va)ZmR;҆&TN[e Wc9 bKz zދP)ȜLT{ Ϟ+A{MqnUNS3sc?!8H~ta3^m!b~`_MiPƹv5et uuQX=L$EuKVܒ#%9U,ugU<  ר؆GF_nu^("Fn*9z˄a9@69dp']=%9WzTm75zHnF m_}x>'a&O񼫛nMbkx۞dqGyʥ!Lӱ#Uw'$?oԱJAz{YB'ڗZБD%10[ /#Nb ~If̲:q(dg"˥ =´$s!Vc3@OHOK@Lsޜ-3 O`T&[EQ~ PQ.6 ݆{6(51>F!Oym*RK_Q>)[( hbzx-$믟n0'7m~'1 d8#:̆4O1袧,7\sijOn 0&y o"z>QXcb  ̄5P#ĚEuW򾻹$;)1[J6V7Ɗ?hI˻l:Y'쥸q6Gj"&N7" "S@/ Fy QQTLsa/?  Kx9Zdo(Ju;y|qVm)lSn[᳽~5V@A"T#͉ $6t3E%S. Jı+G\" b!-_hf,-9E{V};Qj^Dor9ޢ4C^wMj zTe]ۛ%I C`=xلar\F̌G'?= crVJjpćEJ|Iǔ^NމڟILð/nNĸτ4Xe5N٦¶"D:wd{iw]x1ǷLy+ewz ʭD>iR{*i'U?XR9P! endstream endobj 64 0 obj << /Length 844 /Filter /FlateDecode >> stream xmUMo@Wla_BZX& Q+K62 5fI`x;fͳضߺItճ;סqT}s=ùֵA= }vu[Uyk֍I{wQ/5qDŽ r Gէn8A{,쏘LEvDB``B9zK~;_q`>Wgy o.>ݫﭯAbZ%?6G_Nzy;9ڰoiܰ^]0zu\~3ݍܥ: ل0%1 " 0Z{q́0R0r0QK5<T`,if,1gT Hӆp1X:,p8}u 8alSM3?r>x\i"EܰpJMkl4\?ǚc:#?^YHwuprQF^odž1BЖEQ?1^׆ƨАԗ039+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrY׆}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *.MGZN(:p~7a?}]TyԟE}Ư%Vu'e% endstream endobj 65 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3FXҝA5(O)suߖcHQIܮQW Lڮ9ˊ6nK5NoغWi~r<d(Vu;_=85vѩֆu5CNmm悥+U=#)\][|, MHS"#p #>y| #:##0)%T\`YQqJƚ`ci|1Mَbo4m `2WQ/cW888sέ-./qJ;&\ k(d?F#h0\?Ipa]~9Vk?q1Bx.BzҬÀhƘ'g 2xk=6u2,bق6E0F,eL燆LY` YecODV3Μ蛳;zr֟P.O0{S3ux9(uF: }6,V|ƌV|gegV|F_+>O+>G|V|~+>C1 V|B|FB|/g)g1{!>_|&~'a9i0K!cB{XTK5;)NŽbPq> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z endstream endobj 67 0 obj << /Length 841 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N)$̛3njNelܬ=WW\?;׺v=ݩqhY]jwOҺ=po]IAu~\3F;;=}kPQ/7SVk-8s擸]׷QPP]sݛ麟;l,j7O4uc׿x;P:XTv~{pjS! j֝ƍKWjY׫{FR^wwPG*X$D F @F@k} 89@FJuFF#`R0Jt 5 5553Tg_c.\Y7ь1O*ezl,d mY50ymȋ,aYʘ8 xA} /Y1<*T71މf 97g19w(g1?\֟`g Yg 9LsQ.(ulgYˊx/V|V|&٭ V|N+>cv+>7+>S} ~!>_Sϔ+>cB|&LOr`B,&+jwRP{x${y儢 1~g|sGӿNu]>~?,5(z6 endstream endobj 68 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0+J! ᫊"RVmk N7R!ݪ70W?g_,ɝиYs{ ]7;׺v=ߩǡoݨM'opiT}IAu~\3;he?<{Q%(SVk-#&9sQ擾ݾk^!00j(+m$?Gwt>X.oTuþ{S_tpСtZ|I1?H/'BZV;ݛ ZԲW/{FR^ww?U4H6!L@@B@q\s *G|F/+>㹴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq G潪N$p|eO_:q;:'dE_kCa endstream endobj 75 0 obj << /Producer (pdfTeX-1.40.24) /Author(\376\377\000S\000u\000s\000a\000n\000n\000a\000\040\000M\000a\000r\000q\000u\000e\000z)/Title(\376\377\000A\000l\000a\000k\000a\000z\000a\000m\000:\000\040\000U\000s\000i\000n\000g\000\040\000s\000e\000q\000u\000e\000n\000c\000i\000n\000g\000\040\000q\000u\000a\000l\000i\000t\000y\000\040\000s\000c\000o\000r\000e\000s)/Subject()/Creator(\376\377\000L\000a\000T\000e\000X\000\040\000v\000i\000a\000\040\000p\000a\000n\000d\000o\000c)/Keywords() /CreationDate (D:20230929154913+02'00') /ModDate (D:20230929154913+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022/CVE-2023-32700 patched) kpathsea version 6.3.4) >> endobj 2 0 obj << /Type /ObjStm /N 58 /First 440 /Length 2823 /Filter /FlateDecode >> stream xY[s6~ׯc;& r37I;ۤhD~@ZVvic;*XSi&&S R%a"fINŌL4j$2f`2f֢0 *Hg!eJ2!A~UʤeB͈gV2ïLi0U$Lb|c|_vgX( 5 iX"fR *IXV`HDX̴4v  T0"#`&df0^0aObt2#m:KzJT DTl#b) 4V`f]) ewOtE|Zq=yײFMf\k8/&egW1 z Ƒh> BWW^6:Xtu3)'# ~|%4Uj#E~iH(𛎣& ;b[?i1!tfps*"R({P@v%BF5jC_]t%6JdeU]B H(!vQO6)|mP)M8ʲlI:!cyv_7)%+BQVuS/ xureqmVIwRKMsO`ON!cLf:3!, =o؏M+-{Y4Yzu"qdti8ej#2QDTmϋSѕ|ğOi]Da}ۖ| ]e3^nwe5),74h0$>)!-[!'-o Ẫƻ|7Y/;^Oys.q1V|U2d+0"1Zd@&#eW wnCSaqW&ݎ{|GS~29|t%z8QqOENŌ:IOչhZ!茊g1rHŲs^З!iKŸZy/q0Q?CIUn5PuWJE*Vc+,$}k4PFu9aPj+#j)$]Qä1,2$TG)8*;] .'4G뵡&צu;W@*pW$ԞBeLGzA7]HY$ӂ*h(m1|R܍MW) !& "] !4/ 6ҰiؾWCB6ZvM'hS֌Jߒ)(ִ_'󃫯\G] NΪ;;DI\"8F AZH_R Ucf d2Si3"QQ&MTl$YL-o 1k2XX;][K7]N=S9*IY__ye}ݗN#4t[Ae0Qd.B[RyBSelIpX"-D D)M?puCZ1՝ ӕYB?lI0C֞·$%_^K$iA0nF XD7v('P>z(IyhMyoi:goY>i]M@PӖiOA50>)BY뮬p8_~zg=bf*tya 7061Ⱦ 3@!GS#x_ ~ gq=[~w_w )) E/89! x/z xL 0k`VM ɮLě֥6LuJ~07ۓ3p^vnca'F|)S$I>!oBR*7M>DE7NI]\[|\OHz)8wA9_nt»jٮrS 'k@ q?%SmZ98!BoG7 P"{el;,Ã뜅{`،D%Yv1qF6W g}K$ݱH]G$ kn0 iMOE&lڎ ?ÇK9Zzmr=0y6Dю1=Y޷T۪t~UoWoKl[Ul*ת@u"۪&.U~Uws9Tmk􆦦Tg5}`ͧ{ߖ.~4uO]=ʄi5] ;Ft?V\W#C1}pulu#u?R>22hn{yMbGn(@^ty;g8]~@."RZ:\v_ݴق<󝳼pX՟{Eݖt5 hp1̼;Y9+-VDۊvy@kfw BmaئXozn%yH֫zFVwUخ}j߶:_-׍ endstream endobj 76 0 obj << /Type /XRef /Index [0 77] /Size 77 /W [1 3 1] /Root 74 0 R /Info 75 0 R /ID [<89173405A65033111897CB4CF4EB9D23> <89173405A65033111897CB4CF4EB9D23>] /Length 210 /Filter /FlateDecode >> stream x9RBqq_}wU L=701~|S=5H_~E2$aTvJp '0 Gp gòU Yy LÌը ,Z PUhC66a av=YHvnFjHNw?o^@m\;=Gf endstream endobj startxref 153418 %%EOF alakazam/inst/doc/Files-Vignette.Rmd0000644000176200001440000000500314060415570017046 0ustar liggesusers--- title: "Alakazam: How to read and write files" author: "Edel Aron" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{File input and output} %\usepackage[utf8]{inputenc} --- As part of the Immcantation suite of tools, the `alakazam` package includes a set of built-in functions capable of reading and writing tab-delimited database files created by [Change-O](https://changeo.readthedocs.io/en/stable/) into R data.frames. However, due to differences in how certain values and sequences are handled, `alakazam::readChangeoDb` and `alakazam::writeChangeoDb` will not properly read in [AIRR](https://docs.airr-community.org) formatted files. These files should instead be loaded using the functions included in the `airr` package (`airr::read_rearrangement` and `airr::write_rearrangement`). You can read more about how we use both data standards [here](https://immcantation.readthedocs.io/en/stable/datastandards.html) and [here](https://changeo.readthedocs.io/en/stable/standard.html). *Please note that the default file format for all functions in Immcantation is the AIRR-C format as of Immcantation v4.0.0, which corresponds to alakazam v1.0.0.* ## Reading data Small example databases for both the Change-O format (`ExampleDbChangeo`) and the AIRR format (`ExampleDb`) are included in the `alakazam` package. For specific details about the latter, visit the [AIRR Community documentation site](https://docs.airr-community.org/en/stable/datarep/rearrangements.html). ```{r, eval=TRUE, warning=FALSE, message=FALSE} # Set the file paths from inside the package directory # These files are smaller versions of the example databases previously mentioned changeo_file <- system.file("extdata", "example_changeo.tab.gz", package="alakazam") airr_file <- system.file("extdata", "example_airr.tsv.gz", package="alakazam") # Read in the data db_changeo <- alakazam::readChangeoDb(changeo_file) db_airr <- airr::read_rearrangement(airr_file) ``` ## Writing data ```{r, eval=FALSE, warning=FALSE, message=FALSE} # Write the data to a tab-delimited file alakazam::writeChangeoDb(db_changeo, "changeo.tsv") airr::write_rearrangement(db_airr, "airr.tsv") ``` alakazam/inst/doc/GeneUsage-Vignette.R0000644000176200001440000000664414505552733017351 0ustar liggesusers## ----eval=TRUE, warning=FALSE, message=FALSE---------------------------------- # Load required packages library(alakazam) library(dplyr) library(scales) # Subset example data data(ExampleDb) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Quantify usage at the gene level gene <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="gene") head(gene, n=4) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Assign sorted levels and subset to IGHV1 ighv1 <- gene %>% mutate(gene=factor(gene, levels=sortGenes(unique(gene), method="name"))) %>% filter(getFamily(gene) == "IGHV1") # Plot V gene usage in the IGHV1 family by sample g1 <- ggplot(ighv1, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("IGHV1 Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g1) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Quantify V family usage by sample family <- countGenes(ExampleDb, gene="v_call", groups="sample_id", mode="family") # Plot V family usage by sample g2 <- ggplot(family, aes(x=gene, y=seq_freq)) + theme_bw() + ggtitle("Family Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) plot(g2) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Quantify V family clonal usage by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), clone="clone_id", mode="family") head(family, n=4) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family clonal usage by sample and isotype g3 <- ggplot(family, aes(x=gene, y=clone_freq)) + theme_bw() + ggtitle("Clonal Usage") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g3) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Calculate V family copy numbers by sample and isotype family <- countGenes(ExampleDb, gene="v_call", groups=c("sample_id", "c_call"), mode="family", copy="duplicate_count") head(family, n=4) ## ----eval=TRUE, warning=FALSE------------------------------------------------- # Subset to IGHM and IGHG for plotting family <- filter(family, c_call %in% c("IGHM", "IGHG")) # Plot V family copy abundance by sample and isotype g4 <- ggplot(family, aes(x=gene, y=copy_freq)) + theme_bw() + ggtitle("Copy Number") + theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1)) + ylab("Percent of repertoire") + xlab("") + scale_y_continuous(labels=percent) + scale_color_brewer(palette="Set1") + geom_point(aes(color=sample_id), size=5, alpha=0.8) + facet_grid(. ~ c_call) plot(g4) alakazam/inst/doc/Fastq-Vignette.Rmd0000644000176200001440000000650214312061635017066 0ustar liggesusers--- title: 'Alakazam: Using sequencing quality scores' author: "Susanna Marquez" date: '`r Sys.Date()`' output: pdf_document: dev: pdf fig_height: 4 fig_width: 7.5 highlight: pygments toc: yes toc_depth: 3 md_document: fig_height: 4 fig_width: 7.5 preserve_yaml: no toc: yes toc_depth: 3 html_document: fig_height: 4 fig_width: 7.5 highlight: pygments theme: readable toc: yes toc_depth: 3 geometry: margin=1in fontsize: 11pt vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteIndexEntry{Fastq} %\usepackage[utf8]{inputenc} --- The `alakazam` package includes a set of functions to inspect the sequencing quality. ## Example data Load example data: ```{r, eval=TRUE, warning=FALSE, message=FALSE} library(alakazam) library(dplyr) library(airr) db <- read_rearrangement(system.file("extdata", "example_quality.tsv", package="alakazam")) fastq_file <- system.file("extdata", "example_quality.fastq", package="alakazam") ``` ## Load quality scores This method allows to add the quality scores to the repertoire `data.frame` as strings. ```{r} original_cols <- colnames(db) db <- readFastqDb(db, fastq_file, style="both", quality_sequence=TRUE) new_cols <- setdiff(colnames(db), original_cols) db[,new_cols] %>% head() ``` The function `readFastq` takes as main inputs a repertoire `data.frame` (`db`) and a path to the corresponding `.fastq` file (`fastq_file`). The sequencing quality scores will be merged into the `data.frame` by `sequence_id`. The newly added columns are: `r paste(new_cols, collapse=", ")`. The other fields, contain the ASCII quality scores in the form of a vector, where values are comma separated, and `-` or `.` positions have value `" "` (blank). After loading the quality scores with `readFastqDb`, `getPositionQuality` can be used to generate a `data.frame` of sequencing quality values per position. ```{r} quality <- getPositionQuality(db, sequence_id="sequence_id", sequence="sequence_alignment", quality_num="quality_alignment_num") head(quality) ``` ```{r, fig.cap="Sequence quality per IMGT position for one sequence.", fig.asp=0.25} min_pos <- min(quality$position) max_pos <- max(quality$position) ggplot(quality, aes(x=position, y=quality_alignment_num, color=nt)) + geom_point() + coord_cartesian(xlim=c(110,120)) + xlab("IMGT position") + ylab("Sequencing quality") + scale_fill_gradient(low = "light blue", high = "dark red") + scale_x_continuous(breaks=c(min_pos:max_pos)) + alakazam::baseTheme() ``` You can add use the quality `data.frame` to complement analysis performed with other tools from the Immcantation framework. For example, you could inspect the sequencing quality of novel polymorphisms identified with `tigger`, or the sequencing quality in mutated/unmutated regions. ## Mask low quality positions Use `maskPositionsByQuality` to mask low quality positions. Positions with a sequencing quality < `min_quality` will be replaced with an 'N'. A message will show the number of sequences in `db` that had at least one position masked. ```{r} db <- maskPositionsByQuality(db, min_quality=70, sequence="sequence_alignment", quality="quality_alignment_num") ``` alakazam/inst/extdata/0000755000176200001440000000000014007007324014437 5ustar liggesusersalakazam/inst/extdata/example_airr.tsv.gz0000644000176200001440000056730314007007324020302 0ustar liggesusersR`example_airr.tsv]85z)TX"/22UM?N̙z-`lG&d)++c_ǿy\ǟ_ˢ|O?_ſ9Ճ?Op۟ NM,??O_/'ǟ_4WOn?7|[<*6g|!J?K$<*'/_<қq|<r8^<OH?5pU>a' 'ÇN pV>9/K8 Hxᑊӷh`Kՙ94lp8 ;>cǂ،/iTZl0/Y y ?[fD:uLDXb˯ v;P|8_y:bwZUE7:۟2rbxƟ>,O~`pl3` "E="/J[5 Rg!oO;' `L@+z$xշ\F{Q~wp8Dq $:ߧa/@_Xd?$ck)\ oBJ}t@M%6P&#vd!š<˽JARӽ`$AR{.[>{oKg Vô{ /´l&y+WrɁS9rNf9:aii9ZHp1 /z EG6AWӴ0cwLm\paKmAA!>1[1fDRVG!4 ![QK6;{η{|ˎD/E<} )i˂yHLn(:ZKr/)܇EB,< -<:㦔{cd°2XvVvJuR>GL^0ԂL?['۩' GX2GBǂxZhާgגKKbm/N[^W Ұ*)VIQ9>)ESGҗLg|t#N"d}<l\-?Ε} moYzx&n:[xT{Gޟk}. @;S,K.@$m]91}{]y-ѡŨQYeDt|m'}RgI/q$ꕒ:uȠ9@+CM6xǨcH=R1@6bhP\4/_}<ǃ@s#ՇY_b(9x+-eqKNzX%tm8Z8*Q1 oknW=2m`'X`+n9XBZ݂t)p<~w>ٮ:CE,|KTj`bB~_(h9RlkNc$x&ʱlrGv,HƆhՠ!⎼"Xgк~ht G-, I] qO巑I=xhWPP^5FrhRMsl5琬mЪjpmY1NK!4VuFjQ@ f4>~\,sۘсe! <5^-c;.G{2 1fV Q)uyI~ ?!pr r<}!ay:9 1 >LXK|XB& /w<$4K<%YHr!ĝ'#>u%yy-&;ųb`iGz-i]r,cB0hx9VCïd+J+BtX)Gr9I K0uy d}9X&RIqV$9㡖26ܓ=_ЪtIt!dA_/oujooro30Rӕ[baT DuRS*u-bUR| )/>q kU|o?oMe\eL̻hYԧCEK%PnjZ!!fBWU*|URjWsE}$<))^)y̜O7 cG]ӯvvi-Qġ_lhZTh,$wIZt\BTgi$P utu5M݌\ɲo@1pE_._yYwRG;휝.<h)X%,@IF B] [e9ː n;gRܰ2+f*3RLު=z۔).kYLQ 7FN\Gq-Ͳކv{ȧN݈m'^|S깽9h{|vGj,CuNǝ;r& %|ݕ{ u'?~  W).1y ~ƷCQ=ys|nY/}cEBNpv%'j>AnŬя' 3[!CA>US=fR]WGωh\ '.;HMѢ7 MH?ׇn_(MKzu&t;PaTf]v3-)Zt7ˎ}^qAtb\}TҚnۍҋHbbOA鮈!pb )_e{1L#|0tj02?Π 3RBMhKNk&A\:!VaB!NAݴ)BjpqQKAxeT#VX4Y)n\ѓ BmfE}uAI|k 1[Pw6 BqwjT (SrX2vD,5J`WVYX(?BMDA.%Yh1ڪV[r{ea:Qmkq|"Ms`L^ i`"; ˥IWvF c!4vBo!s-<9$e׹VAL^ a _D/0VMvEEʤ5B8Yp^DKBg5GjAw#'=vKV(\>QAͰ~RE%dc?ckO%>ȼFGEdj" N6>EtHʦ1c.ނ!с G'j]_¨\`<,>3,16>]OONH\j%h9M5nF:iN쌊4(rW{SGRdSdN'+2 OIjxt&0+%D:ab2֮szh9$#Q֪qw[*"qU EE'oHkJv6 `'Jm]vI '&oHCl]1>ZF\H|{,/Nu?UI:Qnt:̰OРqOq,^C)ӆ#ƣNEH*Ң .H"7Ec8DPVabw|Z SN0լ/t_ZC4|AþgDF-|"7091` Wr{A(cC߃f͡Dԍ%>*Q ([m)PKdpIY o̢)l `F` z8 MxiĹQY 1(A_^nz/XiDYwL(;֍;GD}·hbg{Uwuc#n^6IXՌb5QN+1qicYNvHA_^T-m($np7ܼF ՝ݖN u `f^|a$җq h1#/:`$ā@"}( yZnuI?.]%\1v#"7m]Rj;B.JxAzeg[Rw?V8ưTݻ/}R4|QrẽBgE>Nit7D6vn1VRVξPɩ;U(fx\  KZDw7?V9U5q0 .-YfL Ơ&hr@[CN}L2 RShP2RzzNS!'"-%$}r*SRI ޥ GiX9< 7'2TP;oA\{]#xfaˏ^JB >=v0l\݋ օldH{6j 0}F119jUz$<:FM/nFwҺhB~FzF_҆gij}htVs`$9TmDۂh6M5{j2Yvu, _R4V\A*E&`CrR5ՐuόLWM'+'q8hТbw<*y'F-ۖ9i)¸S[GX YyJ)/8*F&℃ hBrW~e833fq.)%T/GD$Vz(H+j ͅ㦝*MGm}Md3<{]F}{<YO iU4:|kXXP]4BxXKoo,[^%XZ.NS7 x}9?d^6xTӘKm""/5$z;j(t?@{mEi(22A ?ŧ)Dh2Y@YgYn{`ZПc*VN xp 7 jA,f7 Y~WWo>ݣ giOZIxs ; ڳ@M tsLJ/BCy9+2v <R^~ ðH0l34$yT>?}2["QT{1gR@RQ]^v-7BO17:"E n!4%q*ĚE# "\k^,Dj8'.nPNj.5cx .qoraCpXe3VRc\Ityc6fZ_Q$*JӮCI通Ter ЙQYVm|Xp Khm7n7Y&7F*{J ~GޙXZ8y.`(o K 0hǩM_ UqthӀ]3WԌZM-_,dq>b$Gn՛~N*a<9鯝ôߵ3p?kP4K\SOV}tyZR; $通Tz7|W-Q?#9@7҈ϊ: ;-x+B4)^xw|L]`[7"ש/:י vN3通AcQ|yp8l79[ y(;A`{=db0{QSy:aԌ-pRǏJ)f֊{gπ#6L}Gmn~Ǣ8qXq}\yߣCwFiæ4 %wg'&Lw'ϊĽ~/}h#9y3R kśKxOwCrt`:&U9mƫ|ut"A*n 1$aU#vP̥j$d;GN˫^|fz˖8B_B/"@JRg|A7NNjqo1s;yhx{x@ἅ&0Znxx^u}F\)df"ԠG@%xgόZ8(;&wE컦a~ߒJS7L*[syP&Χ|>7}:@*N8z楋0ԛ4f1N.[]y,Nk~UY ,e I`Ҁv4) ,KASG 1%I?$ h/ܨH74`>W hrvf&g/}&S%W8 lRd4\S&n{^oJiOym%3(bp,.bYke{_Wl"_[͔֩+:;XLӒw55v;2jb<0I@5ź~a VL"יy C!5'\6>X~Pa/\bvz'#N$4PNڿ'_򌟜F=C$T '!SKgtnt@M? TWGK*>={efE- okK֝;A䡴i>>1g1M_9~Qx*v14\^a=?٬^ ~e>9@ڏ+;ei Ea[~XD9[=lK OF;P凕=({h!S g|LehJ_? @5l>.>䎑g*z}r}gqƄ>VC*`Om:[mN.MSkh|BdiĘE5HRQtS^w1F2nn}#갚Ui?|AJ:jÖ 4DU5+z_Dםn#IuX窿+vJ̵)T*-zZdWK$?-bKKoz%xC]J(#t.(˪ %1ø;\ǢwA٧a5?Ҥ"߫B|:jo.LyַkTi>QM`f]-jM.~ݨh 3YRpl& S,+&ĿaʌS~X3_H< hR9&"EIDh4 (= Z\ה]T4.ƍ (⥉Ό kS60̇ukHAla }MouuFnc6 Tbq}60X`QV[Y\7J}Qfm7;x3xf a#nK73?"JLrpR} 7:bx:@L`N1dP#1^&7ټb1cN-1 l &ēi`&vHJ=CKѡ &J>xIk\l#:MÀ7!#։Q[TYתm 5<1htVU9-X-eN)9(/N?fWNG{r.e0Ot/]ܥU sBanzE~yVATS׼pFE&1Uy蕈!SY) `I7R/QlASեSkنǾ]k9*G4ME^vI!ɱ<-IUc(єqjҭ%o *8HUYwj1 R6DR 4`% $b|l-Qz<niX? ;*8$$(ܛ5}9g{sӑUc=?Bt~s۝qC$"4D AIh>>HZ*gK|q)x]8qh <Z  7Z G&{Z@cJ==XDQfs7nصE`& oyUP]K/$dv(]j;W{/vFccV1yh<* P`9.a)7ˎ}/Okr`fӆfj~x$HbE(+5qDSοN1@>dc+KI2q~dT0mZulI/V3i y.f|i $azRBBߚPjW|BMbtoo5(牤Hq3UjdCm(Es|oAU)h-/ #1xEz= jVfac5hj0>RzLVٹ^_~ Q أ'0hkeE1Vԇt̹>{u/M ^Izz|ߜX& rhZ*г-6"6c(D7NwTN[*1 $VHKD#]M]B }p5bdXز3>ٙ(#;7*;CcS1Cc4ّgj9]K30toKK= vKY܌Y;YyRU,Dst~9Ae[h.*{h/PhvZ"FA[ަD+AE?Ai> ڢ6XMYzdV{[t ~^2+o/ذO|%R5 /.& ًn칐ox s2;Af,} dv ̥\EyO;׾^lh.YPyo}p |ԯP%e"I~()mq~6d]lOiRn2C85Nx6CйD]D?9#!sh`$[p#nA㮼Zh,3v6$RvCeE6 WlNvm(*Ss8M͐sAlE+#{ewݑ];+/"oS9Զh];y]֫}Smin#D)h ZmㅕW%֢_4oL\GΗ-([fH\wG!U+蕯y7JT N hEKXpST̚y!@)D5Ya NWM+l@ZOiS-oDpYKq^%f`%vR3BS u~ӷFߋ|dp,qCY9ET+1 v ;n 4aW70mYA}?rUNu h+x{Q;ZܕuNxdA1PW-L\-Ki`jÖ&-CIf p7p-Y ~YW'N&;Mv/7Nw yh&!y0}M{@iLIg:bd4% pِͥ"eY͞.rdG sqV.#d4e~墇!0ՉkzB.8щ+wyRؚKrj|AI,Xܵ3呠PARP| (:IdEA$ᶠBA a)h&El|rI$iVGBY#w!jI7~[ VtJ=~PR;(u?HǛ wS.$\ zoP9&!`'I(w08Aj.\j(, dU+j[ϰݯ:dV] iXbn ∣5")puV͜<:\sN/@&!I`:!X 2IUM|"΀#4,!; KgTqhǕ 8J1}a; |=&gF0} ҟQu܏foދL1<~X,Bb_')m nKlK:H.iT鶴t;xK7t[^'"i-B4C(C(MxUtJB2Ti`H5ymi7 Cx1J8~ Uk71qmJ^ĩBց`txZK8%¨hLޖVMX(wiu|.;@4 a`֪RuK`tٕ=f_^N\xm aYC OCgZ?ݕ8})$@lR?|[I6z9qCi[/-T6A`]'IǺNK8x+DQ['{%JqgAЁ3VH8HZ#;זy !+ 0iJu)ASquR_ߣ7èQE k\=R9~t8ZMpZ/ \$5?vǝl+5 ɨ0mt)&~; cgJ:Ͳ_vN ?#й$qŤojQ EۡIc"U4u>p"4E&,?l>KrNyRȢa^Yuz%0 Z> 6D#I.]z KR? )\q,}#z" @=\av!_9c۾?:z ;uz^S!T4+ äxR%0Ό˨YtLL_'Fw>;+ru>rA$>ڡR@Rkt u2M Dw_OfXQ_F@rB hzR&.`\peDE"fB̄8SQ)f"N@b!apj8* HFeJx^oRA rVqnQ"5+V!lP)~\Z̑腥F664DcUCU2u=ќӣ.u>稫QF]zNsG4a[C3uܮO ܴ-9L'!Hӻ#Hv03؀Ts aϯ*Ct7ma`akeMj}04yWMp/VDքǎUM؜fmވD4U!H=̹5O{ϭ2Ⱦ8kx"8E!e!71TB#4㖭-qy$Ӿ vߗvYe92bEYj{!tfjL2'Lmqȶ;h' Z7:stpٔl$6[z}юI #R"(lM<WC#h%Ht+":= @ ^㔐I險B3X`GAŞ 8ވJĬJ8Q;!^,<ŠЩkE0h 1t›P:&Au$Tql}?<;JŦm(4 QT?>KꯖNqRttB\i5 i{IHP2Py`,PDLUlUd{"v@HL_AJǜ5ُ׊~Ǎʀ'UUᢊpkժ~2p3젚chEO޳Nu,"Ĕ^FiCR[ue>冇ԱX @)4A'848//)bЅ gCnM忝XiQ$A}(%:џe?ύ'DVU6q}4 f pSKkX\4!Dq:Br&Y9?D N ,CkI$zIaq΢hUe sڜ **"Tpv)n(5軈.>Z!h+)8'Ӆm r eņ\<)n? ~˿ݭ}3yb$07A`Tw. Yg6rq}J|]djcJ?6[)N UDEr˪ ~.Eyg/RN!O0龜z`z!S EZ;HoM/GnztӋ^~Kr=$=eq*QY(.:&AFs\KZ|w.?Y9eU%,˹K* *DlJן\Ss6აON7zq4g\ZtR^~& FUR <.NIaDaVE4!bes=kqs̐n -DYт%I_E73$l #0 ˯w_ hq *ͧbV* jԳNK/ %ʛB2ۛUnXڍ~R؊~E,_lnN4Y #@PB=#ܔp4niّ[>ӂp:x\w𠓧†uLwעNN)#AazhRD0ʾ6bB%hRF0E;]u33< _٬b5p:za~G < <:pfP^pZp"ʵ;ݞ{9{t[0'SHoEQ {>GOMI1$&:0Z2ysFl_cP~KeT7'gT?:tS@.SՓHZ/`ʙJcscL1 akxbZa:(a-ita^098^2'CK+1֝kz'dz>@Όb!S< H@bͷr;j^hs| X2hu%C2/9A"ylV&\q.\)mos<: 83'zε|^"i4aatiHM_KQKsc8@G`I\ݨ㭱?@~pLD*:xP䏨v]) 2a`"C÷ӕP9~BYL/&K^ҁ3 \^i$VC)s"3y )Ky jjE`k >O> 'r;vq}C෷p\ Amyp8!rw=Cd (pi{t00Lǭ=0j̛.{mܿ>KKN ?IJ8fM6믮| c\]].z&9ԏ'g<8V:8m${U2% 6QwX.bk K$顓fmJŧ汔tL]ϗiG3 c<6?gǪdy vL#kHuhwu1WSQ HRl}f פ@/+D,O,O,R8RDR$SEV]2ĝYyو뛎qWkVk?Kݫ\_TiE8K!Ug3  &gF"qY_Kنv{AX>lGHI|>)e<"Q)w/nY 8nRcX 4ŵ~_%[-;xP8>#$|ӥE]-oEጵI)rt؜OniFdr7tp'lzB!a\5H}iߠq&.k_}N>7[|21+{M( 1 FM,4->itDY*(3xZfuPM)UU2. a4|MPiƛpr41mE~4sIbj%R\eAB3f@v ),%y-(&q,FոN-D|z~|Nf?I4O#vfOh< Q֫5;4jҔEU`lo}l.Jh-cǤ2 ^,01WS廊?.ZtW*po%%eqI4YB _E+. bKb A}pŃ(F W` V=φg>r&>j1HkC)&QfUH&9'pĚ6vhl. 4N{B CNChz\ ap@4H5\Qҵy4 /iD,n1 2I>-?䓡)\a*T̨Ȅ\0 +^uȄO\"B*}W JѲ ewtV[@K1j \xYBp 8Чq`bK[!m, -tNg+6;STR9# ,<@l)](:ͥdSYp_eG+@J}weH.蒤caְrQnv9XҒ,SzGz4bS ۭefR{3Y͆1ɩUgRjoi%GjqCgYtNPܒVxf~YW)q`yF-ny1ۊ΋ Z<xlzv(vaZc%V($uii0 HKsm&؈v @Q6G¢1f "'+RZ%y]IVD=DFdN0 t:Hǡ%7&|x04 #:T6Z}6h&h`w dzu ٰGhzYQs)чR`'WUrK]gO9j>0@IYFDQwF'M>6z[l6%{iI6h<՚pkL:͞UCUJF4Oc*`iȏJzUjD4fbKST<=z6ۍԢ3n̺eUWێntLGh;4D }7k7A< 1t ~ BMZ\zE 0|q qm q3I_rqXIA,P7IT܀<9_ V>hL췶H[W2``">gNI47 +‡BM~xZ~ =([v<ȣܶ;-XYn7w[ľ>*64]^^z)vn'/S=Qob'yisOǝ>>XR #<<5C~.l_C^~q>܀ :ވH(5 uz:x=碐stUgi{qk{u`k^w;ͽp8\r~<~^?y:7'zms q%vrS#c_Yr-6e9B BNPDI d^O&C٤\G֏q }pL#HXyE(YZ`c*.{ldu:{&=e9 #}H/WYT;>\ڏo'ڥ4dN6=}}tfr;@V +^(~dQPӖ*ѽ=)SٌIQ~MA342ݩtQ=be3C!\6[SWy88K~ht͘ >;RB|H_0t~ǚ+1'AͿ8ywLs4|Okv΋j'(~楧S|/ZLYYH %0jɰ/-O:N"L[K vjz!‹ō0&T5{95} q#C~@[bw,|_ZM}pcp/1n?0?vj:h~kL9&M휚>]<'X)8:nt8ݮx^<RӐxEm`Ƌ媅>CW-ÊӴ5X)*yjCP Y8e4H΍ ZYŀ̘hC.q#qT^ۇ|!o~GLzl3M A6֤D m_QOek^e٨uuiA+upwUu $Q%7gSpl7r9-@n/qpJAA]l`q84 84Sjnv/36%E1G1r˷%m"C% ե Z_4Y<~>ҔŽ$*>pHVYLSPtyq(/ 8á)g,"gJ1M"%)!Z6[M*mh2옳{$.|9t / xR٢pURbUߖ0kvlAA ov5Ӎ)0$)6WW\0yEFḬ[cS;xoGQNt"-͢vt6|va\8*V"(\Du $+p6,8hɏRp*D [ DZF'}@]/u %[{x$=J4LէQq5JEvWbbG.:ߞ]Dc*k % am6NO\ y4;g mޮA{9>wŖ" .ٿGYMSJ``7R'- ܀XkۦOo6޶iX9ś7j,]`˚{њc+U;+P츧B̒G}4>󰌂K,(r,'|n:nqmܵy!F"„5 ϥZZxsX>k8tu{d󰌃ç`Ʒ:nfMWlL <KF;!.N-'N.idh5>j#:q\S ab 4mm$\|"ea{4U|bzeA9 ^NƣM!;h\q^_?j1@ k@S84 $6ǟe,ȳ Kp(-6ގ"bYaGk.ڎjCyAdHҫ%\l{:!sUcN8u.7 M J!5>\9 s?? n' J $5kҞ9S=%)颧z?A_+2"&|=>7 =J`.uYB;SpWHCEFVPVߴf7̻pcVBn,|67:hK7lƦEµwW{[N,UBSY]{s5kcɖtCS_Ma7!m8>tZ<p}!f{/{1fYa 5۪ڎxE`yu9K:v!%nz]=%SpƶR̡=ѓ[gp{|)^QP4 ,j(k `BP3B_g%k A jcZ#=tVrHJ7J='Y;Ϭk[,4;wf 7Ͳ: '{#1ڗe$!qmќb=fk0OXx\a!לD0ÞĂt?~ut_SwbؚB׊[f%U\:t JsU%+mek*4 40@|?)/0L_AQ6ĪʰߵjT]  B=A,X$jߐ>9|Ǒo4Jrbt%(&JʕmTzou'4 *pX.h]jIiX8Hc~Bp?()7n5 ~tI%1-)ɏU(eEӴbBEjH:5lmVQ0l'6>yՐ婎!{cymyC3OV㳜֯K:uB/tMM&f= u؉:߅lzӡs68C~@s A -vb!h9Z@leBoj7qgzf03)~G9j8/<.t(%xg r@3\$?\$. ۬脨Ʀqb>Y;`n!o@n/"|ʜ/sS -oצ^jw&WAKO$%0Fma> S}T?_jpYpJٓO W;$? gA6 #VO22\xZ B'% *Ai[X6aS@ՐBs_սzy~5Hf_ N*=NA/X;7`^Eb0GU1A|UɭCU/ߪ*}`Xzwnz{TEa MKDWԦ%.t#jП C%"G2|t1rb!2'>vG9\ŗbWGEփ6 .huZ>h0`/7}PJzٯGRo$jV&l]ᗧ3čmX MS;a|XzlRmJe6Ւy^®t&*W;Ph fo:hk$Ys!M{5@xA1Lҹf@ cL,~)vP+"qTuZ/1ɲ谯Ygį/ׂ K-P_yOKAUuLmlǘz#=϶\rB5 ( ̽f2ϯƓt .(-^3N=ra[ΐEkHzȐǛe>JeLll?Zuz9G"j{kߌ]&<  j$TMCաi o$5v;$-/3*I5;;RhD.GP/k|zwV܌Ή9#}O0kT*v#WtXRĀ)Hz+h>t ꓈NV2!W UՁ)UYTP'xF=T#jF]:t(3ZXf 2ͩNͽ|ayB.1/|iesɃBJO<C5 :+O@7^._7$"ɃD*t6GBϙL$d5t 6$>9#20MU\ >^z8J:=TiN;B2ӻ($%'d-hf( ~9 ~l=_( o2ס졚?Į;ϻu1\D]fif4'ж{NJ=T:-7VZ!:?eMUטƢDީɥy9U [\kO9杜AVrrpY7/<QX9/s\Vd"h?*sk[2|Z dz* AV?=_D.usHXf;CEblu's&3sv_%pnFT'%rw/3F6P!|VZB\.=T:P ݶ)6X :!ՁCpSnt4| M9Oȏ_ ,ʫ_s&`ٰ>6:U+)[f>ՐcQ::JU/EJ9C5{ ]~ILǎoTPvk\az3VRf3u,ZusN~:DqZzѲ%IG}@tJ?^O5^|çH\x D-ҵ9gCu6J ’ӂ>WCFg;;=}~ q~9oۉ^{8U'ħ&sL9D8|N{۩|)cŻޭ6~vEa(jH5i钋Y=1w8Dߥ >BUeYWPbH**$(D XB`$ l 093T|.Kؠp=W:ZNRç'ICU@۫#3@Se!ݷY*Tqd䚌c/M0(1(sMÚ%[\KU[,԰y͐ḿ00Y9g8tHk.c@Bbª/4a.^SqPj!6pֺ:O7Sq+DhaA ٓ3n1Ϡpdl6:vZT1Ix*?gC*5zw_s2ۡ׃P|q$!p2wwe ,= G1 ;?e8hB!d%Bӳap&?G&K>U_ͺo>k>KjolGqpxncr ׃`]䋦~q3# \Igr0 ko.ܮ;DŽ7h8UARec2  lk7(sU8%nnvovkՉOΙPrbmaZ"l-8 P%3鮠&,m0xQMށ+@UÐ5X,1%>Yoң4 \:'$JQ,ft»\o )",SGԜ\Rgw0.]%ͣl}8Evd(ƉT@*6"\R[PC .Ksdhk+HK`@Ovfo憯72Cza_}>#%|;1)vc{Z>nQU0!PќG'>hQt Z@ƀ]lvj!g-aQjǼ3\TO%#2.f-,cPpf'Ҧ*1[;'ed ;H7Mt,[)?dg[G)G*NZ\mBN+9E0g~[B3.Á@Ҭo'世2<%hI|. O<lzf=|`"d^l㒮]t;{jqeI.nsF3nc'{2F`ʷ# xinyQ[Gu|d hQRk|{p3{h[ݵun@,I<~x GRqc&-ދ>"ο [q-l۲ٜ?gKBtApļѯ;яL8ru~~35l.3h.ak%ʡSFjxKH\;9b}_e}:ĺ7 <zžpCj*ڀĆ}oK>\k}|lM]/I5p}"D_z5"qoKa+k"S/Id:zg∏ u". 3~qy@b%S]6Їtu,(UD.VN\ȝNMσ(HWա\`B` T2j*T[U&}ѫ^uVu+U },8/j AڍաDvDڍzn&!|.v}h2$;bP8~@77ɿm@F2`|\X.]^NNrOb`Ǘ0LLI7χ_ִIeg ipHwi!)[cM3dNtjde6a6^Ng6V(X X b)#Wjk*yT`ۊ _a38s6:oݫijcmt l-ϵ-9GOr 7׵d#3!5oD#6 w'㦻~`zWlhW]5E细. ;w WEkjJϘ< >JF4 yC%휆qW?@TsA:] G޾ʊCA8)Vo$%VZ2@G }yuv(@ YIb %ewS~;6_֙j~6u3͟&7QR*0D*ɀImR/oh?f$Po8aC ߄cIç4jza0o?'|[pYAA@v{C1&.aW\oɷa_e- ʑ!:͛ÚsJ%6t=\t:Ǔ%Bm%3lbO7Iȓ}I-(ƻWLZP;+iѬw-n"Ms]0־?ϬƬogϬ2kL󠒔5q,-zp]-%z 1UYzcb' o5x v=՗u-.e(FE4Loiā8'/^.,gUPM` +LQ>c]9XdYeGw ml*ؙ6KmF;f螝0};jmj a!zf0eͣNCZ@>՚%x2YINg並K1q؛Ү>V=>v? 1>m3Ղz)߽iQȕQTR GTWeAo@}5Mmut̍ݜKZo._a4Ҟ"J -O,i%,; 9U-MYL QPPBnu~k}8+&GRrzW.M8'bi朩(v{4x iج= Jh^δuLBREYゑWٞ,3NnWꉐ!mDs[d8ca͟ZOjIVdN7ro48FN[7j>1zͥ>8q~)|9d㑦y.=]V-s򑃨sj.Fˢ9:oҕot 2!a| }CPǨwRSmp&`4%]i 8=-B#3WB[q2b]ݾYoӇvczjDvZvg,\,:=?lꢰuHY:b[݄x}ZOC/qʓnh|;F3Wt.nf?YF.T2 nͩVPN1TP4n.-B| j'hd,\ h$}oN 3 Dm[t>7I: z&ˮiSQo,AQ"|Ѧ@!uؓWr}:.a3\>r ^tix1%bސЬz]mM9=!lDȲ dvĮ=}|ID!?j;~/hO@Y Up|H 7H='h?XLWBߪv+uTU D!8#Lf-S<ʝX`cw:uV?WߏN߇oNH[6dK}@$3#viѷlCd# A9Øjklщ&N(&'t߳c0=x 2ad  zsZ*F}&z \g;L:|\W9k ZVRG?#Nd`%V8~>'ҳ,I]JikFjj))Y<tK#sdqۮ^Y(:Ѳ5az =:@aa43^0}ޅoo09aTzsR73V/UV) 5Au$:%.B]7Z Z";Lw)nzOُlO_BىG =hUȾJS:Nj_$~_yy`FHS1ao YH|Ґl~ #&A[FvtqfH'zyV?~znV5‘Jn6ŐN7,ٵ.'SixzCzc'V[)w6'*8': vG0Em,W'Fp@H)&+hF4mm8}àL#8$yzϑĝ{Hb\ͥ;.!{KTa'lOˉYmҬ_aSV~H|L+fT8?!pLXFO4s|1ϛX_oxĴ?h$0 EJ:Z)QL]K# $m6ڗ˧fЃ=bq"q;3I41ƥSӦǀ-=޶:{4x:*yvҁ̂9@@<]Aά4L2+mqYm 0ZqOM]¥9pi(FmJF4; GמPle:46&P0Aq89HJMJU2MJ^-S 2ҷ pYܾ e,Məa ҷ2xIJ*RwQoոYrDB&$qm>)'),qx 0U^iv&cĞ;|9`~E.sQDc-> `DS|Xvˍ!ՍֳI+>I;ba?n2|#ׇmo{j8swFփhGYv4|S2 7aoYwWk nr~q\sB~ynzpYkpD_ӒxyXFRs)X!J},'.ܪ? ss;$G+yżzFBCfX.<<,aXVTWb{׻,Kۡ?ʒe?Ƥ{x">^Yr 妳B:?e lHFk]=cW+YG;nWJGhqP u˓i Nʻ7ԡ>Oqξ_BDzmMYEt,qڑPHb 4/5h&u! H=Nj-nw=P|D˯Õ*۸J?i͵Mgp8~ h>4c"?$2O {Sh]JPs *agYds(Oy/k̉#axQrb#$͋C1E䣛,Hjh@4TB"]7Y?{~<[{`֡c[@ʴe[ 5 `2ſˆ#Mh[8IE0aSr!1vKd jQB{?U]"iIн#Q,(,i!zA d@g^^}]MeShAV4,֦ϚhZ Xi+V"#z_G!mO;D_@ 4 4?^[4p[<݄EװX:%9x wGLw+DR'1kW?hVaбS{#+ w,&͋YLu #-]o O󏋝yOM&)Gм4i4Ox@Tu= TW{q CM8?Uʆ57eqӫ &Zvo9aË *Oѻ $hSr6UMoK"OT3!T篍3O[i>eemrjf*06[ hk2EC|)y_ y!"͓_AޠZ;8JQ%^a(S%}!]Tl=s̴3]]b݄M{[ .ݪIl"&e @b yd氁1W&Migo/ 9Tbʲ>kS$'[aS? -a ,koG( . ɠPCP& } P>P2"5cױ{a14KD!ṹ} "f눓,N8ͭX"KDH2t^k_]6?gdc,lBО>ߘ$́(y4^JFN ^ى˰§!9C |lɛvmHX7kˉ>o@s}BL'j2Mk`l^cVcUԎ$!?yZ2A.[&#N_=jbZݢfxΉ]闆/ 1"7="O!@#4!A_>í|WlouwD/LDԎxI;o\vĹ6qjKR>%L#>k~ NR^ ME?=|)<޸:{nWv]]Vj%28Sp>8l vM2{Nx~57WP8>^{ (zB)VɳcCNzxZ%BM0!2 jJJZޙ"~$Nkz p JJ$P(z w§GhZs 1l>E!Jb6)K7E9)FvT%ɾ|x%KP@%x'íXcQhcy epR ̳-">T)~>%𿋿нԏ-\W3C sy1J`Y=V_TN,S$Y=Jgkv8*6nO~CP{M29^޵>R[J`yiddR b̳Py尥9GǺ W4K7K"piɓۦ#VHn1#N>|]m=ӢK0"+`K Q>!5:JTj񫧸 cE5jKh 0^mM};+@yigeh~޿^{ΈƃpTOk3_wE8>{1Vϙ`eJ[Gt4^K@/̗:E'_e9 F 8h:4zUqD9.?*4.ޞFB0$>9HȩA0iؗd+IF[qH$+ egkV6Bhm.3+ cf;feրR 9d$ O0Ltc@ ӡ!v+<|q` {<.v&w<-DM:y&qZ;P~B0-b $Ȗr B#146Gp9 F>`d\w`tIfƽdbl[>ڽWiYi c\YLmGp5e'KMQ?B궽[cXG3Oke^)ciQ_؝r0,= |bId}4Hx9ER/0*PJZAie:[9 izҞ=(`:s ̄v_:;3k"ʃ9͌c/4hfiw+9QX6t%wAK7_MK\-Δ**FL)E;=}˸o!AL׎$řU#ߊܨߨvXE/3 a35 gv~Gu$/GcLh4nWq33U:~Ce6[g[$&F"V-c^H48v&'’p%5N?Z'ێ8J6 `7:vkav-0\M[|* 24*w Wq3DZ2n0ٮ,y.wðMs$E*46AG ^~ѭt{t{F=qtSOǹAEeDaDl,Y_UiO>@,bl5FV.n[WIkF>jmp.@qPK n ?JZ,% 3XhP"ܭv|0FK= ոoy=v qqyde!2vdZ\lXm!!nAFG)sa1/_ˣ៩bfy%O#)9#=&В9P83X=GMDXx,"@YA7bo4$"Fjx.V:_جs]؆?˧+Z(ۦ(+g\8ҙ"='xfOIn١ڡDz_Q Pu +JS30G6|5v-=0|_u\9U)7T7 e*[YVȇIOlʏ[п|kEIO[?č/x x _LFgJXNvz >TB4ɘS ;>p?60 /{`08ne5=\Yyٳyyqu sdUEuQOb>!⛽e0!P+4+G>ǭ 7C=SjЫ,-/tn7<`ߒcIHCW3aXqWMrՇ\I(h\'G|lMXw$h=M$b.U6I^|2=N=~!L={B?CVԙ˃y>y \\ pyYůu(Dp4lt0|E 5=w jIu{K1`S$5{7PtHtû%&& v.yZ7*7_ʼ|a#;հBeް;!O>4@*d$6ol9冟sL2W>HMbF$]tm=4R+fp@Ӱ|*h.AoiySP$ g(E ]JE{yŤyg< 1U GL'a[eR|:j8ݷsz>3ȸLL}{Z#2f"avbLh2ϒANsSڿ/?6!hµ`4 bO=73|t2xieNyl R-¸dx- &y)ԊΕ K.g $n=9yNw͗$ <>[Keܑ~sS)~]`7xL~52n.vgmߏ N^A3av+wn 3C ?:{Ύw%5CGiq񞹒=a&)nT2\W0IgW8k8*Lgy>n?>_)9AQ{,D Ȱ9:*##$%8 3F,_lDn&N.]mB8,m~&2 /Sm4o aoVcC8͐H(nbzYJk8 F񥹝`^ [<0ݯga/Cq3`ѓP`p ^ p\BtI MKUؾHQKI|4"Yo 6]5~~w3I]!|.Ps:fzf?AC1Xb+wg;!,U$'8H(G(8tH 2N2pk3s/[`"!xCuC3cq.aх6GN b.| ז] 0ols8vRlYD^ڛM(,jmlŅJszHm6YWwe,t;Uظrj&vxK &OǽS=cu+-ێ+` VZgT̲ BCJ}O<>sem)9Wr6l^vwZKsn02(w= fwvwO'ک44غP0[]ߞgKzK=|KŔi{i)^;Q,v7띉}:Ƃ=  3i̚>P>&]'\ 0!hh BmN`'Y,pىE-E ], J3$&Msϴ-|XX>ݒGW{R<`m)J(n[cc6 RnCbJ'pmyjPMcAd)|2àtڝ(-#[ѫMl /XNb&6LzؾRKqtqt Y75| #] .D@&E8`S)}VjH(n1;SmEpM l?ڕe Ԧ&栣:iӪ2udtd$-5Wj }_ &Owy|y+PC:㐕qϒa0-f3Q@/|nm\qu@l"XFt`.p`®+?9ά!bLٵ}?" 2W*3[3´PaB4WMQ@ZҬok(?dZvlJ Y#7>YRh?I_=<{+Dl:l`ǮW.d{y_ldY(yޓ'ٗ<\`;k]{{lw ~ng{={^a醗)΋sF(ND'fQON+Yۤxy(FVPtz(n/b3m‘QND@ن튙͙[%3r Ͽ:7mwYz MeP.ޘn";C1 0;(y7`Ԁo<77َqO$}]MED"ԠPٛ/r}טj%џ{$~0^ʳ b$B1gxvEQM%V'X6ʃ,>,D~sdͧGOJbJb)YrVJvJPce"l6,c` 4Di:aiG%4(7ѩ3gUǝ>qSR4o`iBd?#܍|X]x׺q+tkg}D (d}QGU!\s$۹h}eztվO}xZU7Wc9^y*ww iyNAxq؏htT>N臭>UCR>WW:sj՞=W3W'~^$PY,S7P㢀1#&hbJ{o5B9d?uPT}SA&F,\Ϋ>DhdTyp>"{tu$}5A/ߛmg;ڑl` vi5*vuh)1Tj~wZy:u<=oiТHn EӬ/zaf>'=߫_?<{ 33p$ۗ- l4aX`` 6Y껞ų39z6ڛ" /^͚M <.-vhk1NNᛒo=\%4|w(!Y3uuR1)'!z| SGb*x4 H?V@p@Dr MBDD6,C A@T H#R%rHVrue2lv~{ FdH9Kl7VAEjP0EExq-"ʢnojV,\ImKv@u<,!Z$%fOnꭑef[φk"E>6D kC4t-AY19e|Uu-,xIŅq &Ƙ _c1<\ )VgFU+X2R.rr|Qj(k3xN]J%w*کˉN*W)CNR(;RaggFh; >M63<0hy|-z)+.ޏe u0'kQ.Bk?KǴK}{EK6qv? 7%~3zgy Fa`~p3z)ĥǂZ.rm@PZEti؟G%T&Ŗ43LY=ReD%]Ր>UN6S,aO‘.) ᰓshUwDÜSJ: "&/9>*]%|>:C8>e,Վ؋wA[rȃ>#0ŁOB$]h8zFA4@^сm X]>n:'ePEЀE‰;9Bpͣ$mǏ[I`;a=Sָ$n,KYReFnذڸU[]a_#fw 9F=$.G0DCL ~'ICm (>~ Od3RZ?j-ǪrH\gdO4N]O $E.?#m!+#6+W8we,-ەZ޼h BIF t܈X,vf&?N>IGKO.NV+xNj-Gte:hd5%GEMkXNZUQBwf)/x=`(rA|gӖ N֞ ձ}Kn~āPD[%R !H^ km~`?!G]NRhm~" _mzeo6B*mI m[.).%H`h󯍉/qŞ! ,v7P0Yi5W G6D/^ ^-.<;j /C^xj@I1Dʕ ˧CZ: $f w!  37QbN\gc- dwt.~6V\iJFeljݝnj,wMRhĆlsP0ب4g"kfb\:ZlNUdTbX٣7GOaioVb>FA`J*9g_};907q[5p(e}01clZ Q9w$p-Bw$,YHw`SЛ=BB-KaC&#jS@=Dl#sO}'?C c j|3c&'zcN=AOq ($mpaӪwa˧Qe)@I4(^7W/26t$y"Z5{y<Ʊnű= h[0_&yҮm@K7Wlb!8x[yCIF4}~D.?fwčvc]TVEgnג:ȵțG/F ס?oj~v3yM82_i^l|a\yXB`;l 44 62fJp.w2dlK+vKxb>PL.c[b s0B>M7{իysؙ1šq&$ҘD jOCVГ?=$ѿ'm"׾Y2}1r _g>myd|ȞKn|QOR41y|QXMB #IrwQl3=`Ş҂L'~=!)!WA3=[iI% zs4}ܽE (?{[BĎ[ uh^~vO 䯗'?~{vɾ}ˢ腾1vh32ljоd+,JNMsP鰽aNC~r! O%R6:$1{>K{bx־ĠGqxj)~Sc<kp(zx :vxC@R{ycf;;P\e#Ehgd5t&6P'l$PT+\ɏh[43̌*o5mպsF9{4ˍoY2U #EX4 t>a@ W)kK=mm $ci{!`FΞ_ YŮA^B:$ ۮD$%UߒԾ#LR8_@'~QaN鄡(u=1lBɅd!և7*q w_mW:㟍u>?#ք<}Qf?v" ОjU+DP9vCzN~ӷ?/jTEՐM$ 'ܟ-x:^4=?{ﶧ6D _*s H5t!>Wd|@Z$ChWy-:sæ,q!0-lJvpX.39q8xR =g{^p4/? ރGv'g=YB+OcX_Gfnr{j+=w|ysWw %GciP[ZeYcv OZ<62^{|ћ5| O /5>8a4o^#G3C? |Y^`L,Hy_7Jk`q|%;P?BOow|&Gk7G?9^όm[RiV7ou)lT/dѢD`/i0 1 (O+*L1RTwD0 E#I*euB)5ECXriEC&F&JG"4DtqWG4#tgpeVqcs$L!$:;,٣Mg]7[Ó,e6&!1yRLًu4;aOaRRDD]9*fīJAWPÃP<&0"~3&!GL{RH\vw#." R"OՂ(5O\sPG9jQsY ?W0R\{0A&f%f/<$!ITihuet 5 ߛ5FV#|E 8AqRbOLVT'#/7~;{Lu;!hRqvU ~Ya[5 D/oR< lZo~>G~ { Q| Ji~^<$S )6$uр[dL2_a~E'HL˗65HI~"E͙ΔZ;y9 \uF;2xQ!48Y^*k@7qʽ/4d6zc+(`(L-]J}hw6 2C$A  8ղ4.858\ty^Ӏ>i}:ޢOP[UqE_B;֘5a>\S- _m3#C>LF%.)ڽqnfL$ ށӜ>i`>=&0򼡘&2nmfOa=\OC{y}·ּ?'"%\F(ʸ/u&Qʩ/n['y}fjnqL}NӠ|3CvǗ*cV&XD3%,e{+(2I*SvQt0'AZ)όAnipt?ݧ :i:fHSFeeg]{,hMA `,U-Ʒ') %Щ_ I_Uv$tQ( |Pt!eE+"*G]Rϼ?qi8I8}~F@ >۟磔FoNYތb;NGaRu{cj!TWD\ (dՇXe 9>-ͥYqLp_4 Wſy3 Q 껀iұIHme&i~z~O,)/)+(؉畧օօ Ku"OwJ_iN(wԩW%>i`ӹUۛpB(=N9M=2 @ou^VXYX^o\''!nUo-4MbC_k15BD~0Ld_ w}>inG}ҧHRY-Sh7=^wPsI d@ƒ=hx>^51K1v%UúI4JYQ ZO#wi>?J3,VYf20E_<9+yL4MyBxQe\(8%8i2a84oPu6@pޮs@3Z{CYv~͔ 6>(~Fb(nHӶu]݌~e;4HӃhN4wky<.kp:Y@4 ٯj0`8VF]xfbe]늫`^:f/!W;*0=N3@kLI7)́\5Sdx% 2X"gtFb2=Om;M Βޏ/QESԘ{ g;B3N|n3jf2 bzs>0Suo d[}>(]Zfa94d5^Ljjz]G7]G'襀jJӷXMXvdlfQ&X"-7b OuSx|=}L%s0nWa{Jve>(K&fI#3bZakv1_ntv r^nk 8up;S]^h6Ӡ"Ⳃ"E@QrDʸ9f]I] $bq dM <;N_1)kfY¯wbO-u¾qQ$}ɸQue" *J!8L4( !p L\0"\6ڶ׫3jLjԧpv5m=F֌6pI̹+; H=|=}=xyzMǷ֛0phvk(%P_K ƕzv-XE.kZPh QD,4i@1sz{ ƃ,˞x -PVgRgyY7<[N"!+ _:P\[.x@(V4"MCG^@Z#?2w@o\jy,ڹ*DAr@"i Z?VOB}xy$ fr WxxH}jsh. @jk40`i'P,Jq n !N!kqQ_,W6Piczzcr\|G{r(\Yq-F~c/Ut;2 '\)|4{|^<0k PozW2՝AV&r پx Ҟ+LOn i!4[{'j员v q{b(Ş|>\5AK(U,`̎-ӭ?pv_/ŝlmh $צʔ̞\zQ ^,)Z }py$&S\HE55l0`V(bIc*xl0+ǤY9njy9|s?z (au-!q n;-J=cscwH<˦3EɰB}9"!*e=lIeNe@ ҵbV-~|6nle5SRh ~s7C1G:Ae\\ 磮ķ %=:Ahd+Į\>3<3Y {0BvD;xQx;U\+x;FnW9'T\TH{ՙ0z>{W#ᙉͯ9ೈ 唗59dz:QYI[AU.@;*P~>|!YQk'7 դy^ =>& Jɦ-BsG*[ҿEA xWMoik!A.Zg>(XLJQ:ӧ1N@7k=+3d&<-6hO4tIX|g$c4-Wڑ&+tkn̳X֗(xAL < % #F$}MIPJtWԫ' x %qa>B qh (x-lvG*DnxZ̉=Ok邫Vu;; Aʂov%H(z,XxE IKp,whsw'aw9Gj)9wr|=|0eL8>Nޢ*sRq IV'?dﭜl`]-I0 5=1_8 zꞃ[sNf'2fe{.^,AV]wq${?~l}埾Uy~`=e)eyuS_è\cSz9iC2:]iݞO_uTCʃ&C{:* o,,W[oxCY{V!$pzxJ7lg[I_YJ {kCHnQ,k5.kj>%P0 o9r<ԼpAUG*xS{=^=727_3@҆ oD3 DO3叴i%N@#RYvS7h~YG$SHp8-wdm<" tw;آФjF\evƤ˯nlofF ޙCvpk"͒ۉf"caԋ'!1lURIGA'W6>amz<)@+3;ff{|)}5ts2 >ٻa[\SEf,UO;4,txLzjsr,<ҵ3az0ܾ+`C3)>|,qߎόQNS)nY͖Ц'F;c8:8Šc7n(A֔}h].?^GXUq~=<#mxJz<30y2̴kn f0{2FLI%&'?'XE4noCtG)rr$vgul?.K6^SL[J/Yij7G8btAvsJ76oJϛBepc'hyy#/Tl\~̌7?x M١bC!iFYoҎ4y3 `т3gF?^ޑiLٲ HiP&OB>ʔV`+\L& {L*&`.&TqIҰhkSiۉS^E{GyD.p ꜞtnrM;u5a0V>' 3Aot/,zbUI +~$o^- 3x}ܣŲf*p=;{vٳ}s/{7|haRlZfKJ/A_tOGi,H{X=D=s-TԂAɎZbJT{k.Mޅ_fn?@e}<^K"NC7 gڅt9 *蓷3/ ~"nFiwy=} zq*H'|UGeDgɪn1)ϊcg+4l1hHUNU5nk5kkP+\aPspjj2q2 !8ݷdjm?\>9l]~Κ ٿOV!Hr)ȦUQ*jP[Ų"N9e7-,ɒ4XWz/15,5 30&E_ԧzi7 3 J G"~*+}oeXtם,=zo`ϟ????}?4`~~ %U+Ɣ!<^RaKMϛ6 } $~X$o)'_/wϻyy{yϝkL>vUE$mZ/(JK"  D"YX<(>ۤ,V `NuMI r VvUwWO`BO-7l[iۙ=^yW~w-i?H u,)2PD*=rwC̽2 ,+;Xy2h,r }0'yҼ埁4I\~gui~$Fօyv!(KN2I]"T1楮k2֢H +Ϛu.8J+] 95l##%;= E6ߴհg@v;c_t~.ߍ<Wp$9wDt_?[]qa@BT ԉ!zpUk%2JS؈_R͓36>z=}eڢ?.%?^[@MP ȯZE:7R_%ߏ15i3fޞ;Es']~|Ax)gy>zI{T;Q*hpIu'ѡ^zN[B_9~G? IY8#Uhd&M}u9s߁IT3!5!/ Y^sY;x/l{rlH Jgpe^=d˭*?&M94T1Ⱥ1x `נ΁90T(Kamռa o7@;#Zw<;'9]1eÀ\f~&P >#[*P=;zU! K](w"c*Bf1B!f4Eώ0<4 ۛҙ#os_nwTvw{4-{3-{3;;fOݩ!dq*ŸYבsdqyԵU3AMpoF`=kb_W~EWU7r; Xӛ5Jm_>YnecjP5r+D՛`H6VP׍ئXvNSdR) P}uۭW3EB[1S]|.ENjOtg0oQbS#pUqǀy~œN UǩI^Լg{`hGвjaN {]zI;O_X%3ɢ6"v`I+"ty+BVfM_؛m#ˤf>zi5XV+D9sJ JZ3|a4 syμ#We~zԺ:(˦u6ZB+֤FX9ɗiS]5m656 Vj;9ݷp]o1O.? ^2pB]v&dq&?Xhf:ji_ H].ُ0xl$sx)y>a'&T> &X#/ӖN6SL u%N adpHp1xyoFKP] T 8IvVWdt^SKbBkpC~2тpuIhQ,>JjW~uKD|ҫ{ŒgFSIiCӃ<ϋ<=߮ _AR0p(1t1dA{LJſ7N"yۻǶd>. ސ=|.|lM͸<_? ITOk"_O7|G)ܦ ԂweSY _]l^S6,1'Nd&a fkM5S{~@=>zi0),=%"u".;Z0j DIt(-$o"@Fo'ﻸ=y{xL8+O|+/54h1F3p@pz|&%*>ө{S>lcvLvWMX u{͋,T[}~m#Ot8HSQn8XMy+| =>)I*>=Al SxlA(2d" 5^qAMP%_`tun~`2ƃAӹHUh5czdt m|1]W^|l @˼xZ%lϖiitŀBIE(gUmRe "%i7S DLn6w/>o|=7v.pwz8X,AAy%"ix۠.@jw5MN~<- /s(wiLcDZZ|=>2{|#Mm>#9ٶ-XP5=ɟ M ?"D=Yz?ƒnwg GR<fʮN z|Jޮ%>` l&˳д wb~?YGX$MY.{K٘mj> .3}!킫yT6&Wug).JJw1X0;]2Id z|fۮI$}2'~8N>udɳ?m-k45K&.=f/? ̴x }BɃO+ g>ΞlI2s\W$2~IgNvb\`Yٺzp4-cM i)( l 99ɶ9aN}cV5'J˰"DQ2 rc=F_ܬ  Sxdh=O XxН.wG0lݦswc+q΋]4х.Ae""p8F]0EЎ+gpcMYz`B@CW 6~#֯Uz/jJ-.5\;t?, `mл0U'C7>B؅Gρɯ!Lv7/ %"ˆˀ%FUddO g2Y3>ș?/ǣy?Ӻ%Noj@ M2NotSAk2DCHr+)(CM!ـ uWUl (-e͜>~Bs1d2Τ!vQt֤h:k+:Cp`ڷB9M)d},&U3 W3=:uZ6"$C7;XvNw '׌*3'W+e|}IZX!<6=oMIFu+3eWn*/7t >RDMgqTmJ#U,ŕ/62HQ`-]W uqxäMUڴ6:1c( KOj%]wD ԐG Q!̋@F̫ l[1"-%v~A1,OF6Fd.V F=acp[C/Yb3nUa8@2mDB#6c+H46PE$t N$aV@k 6H8RBJ9'A#:}خE’gNyX-bCy4jPzxQ c[Pwa12 E)Vp"OĤ2L"(bA\/d<6ӷoOߞ=}yf2~yN=}{w%n7ӷPxy=wD_}o:J{1޷o\pןcJPXxxgUG˓`> ^ 6_m0tPw\R7$qG˅bnh~mn7'{aGUORއ"ؖCM+IfI7S6i: RUt!!~ Hѷ_nFEx"Q$&,8ƒu#݊:[?O,| yqO4lvǾr\ò\@-qp(|]<zL#ߌ,#7]eǟ渮5 3i~H5/̀i~ons l ~w6#!c."j=d!w2Mb̓f(,Y-ſ@#!>F1]4@G@H͢EL'~ii?T[u1ue7:Bv9xcL?iTe+4# eOgqm^ueGLsqbXQW 7F1`iadXAQ%CӵFj+ەqA,Z-mI:{u;6v mIiL{5CVl *nC: COSL]1&I*ǂNV.i=CmPpy@< Eи )`x5kgzm%'RJ+H8d]xyyqcH88˭bZᙷd0&nh1tb/f\{g`%;kcv=L 5Ox< H8;<˵^w'GK C&5 (xq8b!rp`&;9XQ3]36Lin0]`SF]ubdV(7nSy#Fbdbt7vFwGԾͿmHAd;l][o3;˻d.ێڌLnpIy 엥\kD[_㔮ᰞ/]uq=?*Goe 7R+Vti= ~gt ~RN_CC4/]T@>5L_yݟj_9s 'ۋ7=TBB PL3v~Ld g,ϲ=Y)$dițܻ!J @Ў0ֲM;ڝ6kz=z|wb*{YWۄ4fB +Ui6x`d-.SST#%kZ-kZ4mk{Gꬅh×RNĝ<ȁ~\=1'Z'sRgQ@uӮU!;b!&#SzX6,JWxT8R@HTK@+jC1I  7 #ߏS %ވJ)x'k?_ ꍥ-_^" VA],0#(Ca d1&?w禩.b5Xd".+PƆSd}aA- ߧ c!Wba&Ah+ i &Pq{!CY m4 ƛf_kzې޻_?ׂ`w-&]|XObbwlLRmpby->{'&W6k(+11eʕ:&yv >ӧ4LܜP6hG9m7^DS&fM ppR@z PG,HtQ pg^q(+j]E{].Zo]4/ ~iK\̯_8AK_ʥA 8$L_A_FB9!G}ȶG@,0#Ki Q1 ^d)&AGv*d+AϭnB:Ƥ+Ƅa-/虋'  4݃ߓ@Q+T Ǭ+փ[4v1Gx+U[ΞJ/6ףvs༗~^xȭkxy8_b?JϚism n(?:; [Ǽg6,y? d%A#%AK_fYP cYy]yzѦ4dDvm{& Z@g'c#DQhsT CEJd ӀYj-`DŃY8,.Y8XK7aa`M^3t2ЇNXi`<&sp N-}r>rTγR[7rLR sh*j4\NkE?Y+h em3+ ' ?٭6Sw p -O;0m&(ȁwk}^LL;K֌\߾`[F5RJ l~}śr}ʼ_| 7g[bkۉ~q7~q&6zf_qVb^)N[yIZG)' 1pwJ^ GRJj@@B@7aCӰ՘؃՘Kڰ1Wt"аᶇMS-7z@|Ɵhz2/X-g&c _ J ]/ۣ ]pu$BPdPKVfStX.Ԁ$/;mIX:mb? sIN["h9uAmh6=18^Ѯi2֪mvr5c.~>W_Azy}0?Ri ش&7 7[Zږ[Qa3_Q$\m 4vE&-Z94xPyQYDZ^@ L ͬQT:TLw ; ykA2*ͰEȹ@.m|"떢F ahPiH4 L *sƥ,^nP0*2cj4))`s)#&"]]wwt޽3ON0­s*3 }lv ,NY j;|;|; =Txz{ D7ju[1DVGw抋#|<~W?O<@EU6nH4[g:ˏ&;|AA-&[53N*6ƴ,oÏ=WH+!.*BOPHNx[zP:rXGp+j|5ȟ&P/\e~`%c/-q,DG*"?E<^J/>݆"xuP3+7 e}^f9@>zP/6ԪAr ~a:)h+@m_N֐R-l엘JzCd?~p8&+}@N_Qp77,y&kZaj(sR/3cKy]# `ީL?LJƭQ)ck5e7Fr><@(s!|Ο@,A ̞ JPYRe/3D\wj(wŸwb.;|j7;n`=[^\y ğM0P?ف33J٪?E? 3* \W~x6#S 5+0يҵb3nq}ʭ9?+P*LWcb@<t\c)& ( !4)qRdLL\]_,MJ?سZ+H9;+I8#ҒΛH2bDD*i.l ˙˞$kI&7xv_7Ge{گ0y5|Xꋽ`,|mTa<'w'EldZ&])#b^p>O& k\E AxL£JՁ%<@ `6v\g9Fi7Dw]\EhH^gC'aE< \UCVdeO;1 PQMc z{:l/tK8 &YqoV*E 0WI|eWT|@)UO&CcG|ЍZĮLT -Θq߆io,,)-UhO8Ɔv.?Dk? 0HRD0-*MIa$5m'bԋw;\O BM?)qsJ$\u;{%bspPABc Ω`B3R/KwA_>~|ߎ6C\Q  K9;I7zbۤ\2hiP@Z; =_ X,О6T"@V? >TA-z:'U@F-h;d'ԈSuWAXШBEW2xԴUZ\tJx(u#:_I6QэtEbDe-A_"M[K)唐 EdWL#&Mr#q]xĎ\/xmR:eeʀW@MqM[TŶA` hm4Xod*7im. Oƌe!,+HmvX W4DXZ5M%Q TKM!8| 5,]"~ Hn4iC ^TB"ʯ  2A"lV*a`$Pқk4 r=˪>SY Z ecպ~k]`$W>_<- >ǝ2>ٟb.)h0qxa;v!9X5p+-n篚1+nucUEKM +n0mT9y85Q*EpLGnPӖV] Z: 12ά7 n!q*ddZ髾 '1?j/ݧS`pܚ57 ph=ϼ?6PxyH&B⨼I=p7% j Rn;i&9$ٺKkP?X@[#j(XVC)S{{ ;H<_(8ʏϞ=ໃS1[`y!x{ \oww00c d{Ů91[5شW゛㠃]toca\/wM('WEb vF$cl/xͦ0 xi%˺):%gGEv$ɎTێGvd.v$)n+9Qʦ>2ebGv)v,tQ 0i{16"L,'70W1Qa"&3pro&DU10c8uœϛL1߮`ˁ!}'#u -\PV8q= !6*ǫ)D_-_έ.ˋEEv+%^Fg&k9Y!Lñ١ F}Z Ѣeyp \QhFhJo< 6W&VN|(Ky@4=}1>S6Ax,\ 8&,w8Iz[<ܓr)ǡź (? ?pU|Y5M&.!xQ+5s|=y|sE™#H:MLN_S=nIԩI=>gؿYotRs!"$XVkYX/uosiߌZu =IaVՎ;'/o/gʿ.9yLۘs8Q+◔iWo@-Gc˾I}G36_ݮvo[#^+)/vEb(4;bG' ,bvaIWd ަ9]\f넺@oZg.=jlQ470t Q]898c2M0MLx[OădH%G!#kRx1zZ'= |\{A5_?wjVLn:V &>Dſև幆hΧЌ·|U6f&عc7KG B`:bG"X:u &S@/37qGGOֹ34OdǪ竫Dy޾g>dz_!_VVQ)d`7 Z!'m2dcO=ϓ;+k])X/.xo/sH96APd;AʙD7ai:d~L#,HG0m0ZXXګ:;yIֺ;RMz?1}&n>y@͒XT'%h}܉>kS y&m@Rp#)JS_|\$xAFrWKktB+pٵ~J+$#]6i1HkdE:u}Fg.X{`1.%/&C|:L̺sq.D{Ѵ$㽅"#%==E'~"~I©NDJ Ūf #J`L=nDMnh!ff Mm/4΢8Ї*񆠞$4)2C& 5x?0?~էWwt'Wjh4l})#^@YSF`j7n#iq7tn4n.b:w20pCE*mI/t e SNxeC#P n'a_J͊u+oS>Dg1iL(eF9cߗ8THrȎ {Wuh*8E @d@vLT< ]hO//^8 ;꛺Wb5RMqXM cuXnL+){GȪNZ9=V:eƁ06-XF'ix$t`ybdtY~KF;bܫ~V-tXc, /4XYAXW{93:Ure*7sGf ,WY@q,[;PT}`Me+>T(6h} =rcbOյuؿ4Jx]cpW챚KU^`3gn|2ἓ|94s٣@S9EN?nU"k&'C(X0] na tmΌ̙A#14zʟH znYM8sx=r;nFי>Andv|-h_\֍!ˠ5fRQuA W5P,tQ;*^3rnÄ1W~ch^]c5#\9Mi__q/~ɬDž"%i ]1 ~ ׯOk|llh))Kʕ%"Ӳ7 ]=dk~)hL 2fzoG|n}9NRwzdvӔ&W6ݴNn4=M8mwy2[7F=P:QPQuDhR0N`:b%U\ퟎǁΣ2 GUT=#%!WeRRwfQFЃ5'yMH"TP?.knAuݞ.F džTKD@cИ$E9G{tJt:?Iv{K5~ʍh#$%s: ĘN* ]7LQ`^rO4p..v8M ve(@>٘ K=ĂDtqCZ|بK@Ū%ѯ\e2$6<'{:L<=8v#>suG;>E4\h% tBb[͞i{mN90"anVg*zOZM$|pxzp68 :i,yv&߾Jo;6orqb6UweQ;%E'avWP.ȍ}xzp{xxip=K1>XxTބF }CfS}ؼ9V$w'iԩͨwC> $9+hA÷mx.[sr\m45ᩯX)25MkfY YFY)ٔ)Y)[~HO1~(|+ Q) ׋ҷ.r|g !5b e'w |!xLw5-j+A-W/aܳ{G/xmm![fL[ m} ŁhCY*7.WYDBnį~u_bu`{:ܻ $G٫v @ g{X 3F@w@sh?O>wZ>*_C O9 !,{q *D+DThl\_PQѸ OwA^8cmfw0X7m={x<fp~1:3'Hu![Ji2j'? iŤT}<3jK}bRIŤaaRoLU.&V Wس@Rv ]K4|Tao? !IݬD>!Pg1x|0!Ә|+w٦CvqF3:Wi(ޜHI9$ew~I{EAk@G=I`lR<nhfD Mf%@X\c{q]+σg^^e+ Ol4CgD{/tiUB:PGa31>Ѣ]%VMQ6{]K[fv+wYiX0ضLZx{Y6g>NIұ}ȡ }ޜ] Elsz\ Aaj+|I"0zR{4 ӝ25 hssXw+ 9H_iYwk+J9 ! 9>iD_@$d3sõjrN/>)ZFj&/, z0 gς`j})jSj M"SYw#b5/OCIe #;֜n'b ҟ 96X|**T1uؑ[ L%#E+p0q/ sym, Υq݇ I8ۋe~dg4ۚ5J8 )&Dqv;̸Z5=*xJ3]8NViAT'=Ή'1sPqxIwƆ >^A, 5ԀKWدрD3@gny۔;AANju'+P&x?֏1֭Z?;GV`z p{\,)2W)!hAZ^[=x\-)_[h?޲_\/EO&dx㓴LXɶ}d{tq!!AQpAJ(P_1YVB |g D@ݖR<>MvrFn Wm < q!Г,q JG+#lË/_f-些hq!|<{ G\"#m,nDj{V t9d> zmc+#dЭVD8ZXezLJ³c b~D@>f}#îxd\N'/¨kU'O%*]m >rZxR.v,Y׀JLWR)y[窲510J]"z}<yޒvN .&W^zOmvq?,mp~8mX89ϱ\N;1 |QYs.Ɋ=dO;`iRmU-:7צ߷8 `X-\9SWxB6Rf;f~ ,`4v 2&498TŒdz`Jm 8ЍV-Qim$ߢok+)&fr[ ^?+ȏcK`KދܟS.ʣ VV pۉưCQ@n!K*7 2-r $- [ژWRaO'>~23ėxCQѳ`#`,yv/hsf1MrdC@4c6A9 4>Ѽ{o=f VhUh4B8 W9O5 H,0 %YMc2 4VԘycBrG$5QdÎ׀{^Il,(]%)K/PfR%HH-sJ0 ݽd ,۟_YWP&  `zo`n}x/瑅O`5#j: }5$εf CRdh{vl u:ޟKtm<ΔEQ%P9ɺKj.XV#:.J{+:2cIRF?Tp}+><ȾaaV?Pػ%F U +ρ5#x'$^!qߜ}n+bJ3%ޏA!R=JwGy0Ip|&[e05u8YeԠd*Sbb*\e/}.6Kь=+_K?ᒑ}[evŰ8Ye*H #p /x$kDMU#OiNT*BJ R |>p7;LkBV/j3jt'+wcn6SejH<'Uuzt"Kk=lXZR!WŨXy~I7[xHTݻW},RZu݅}֊nb1nE}@1=(({ʮ!QSn}}.foZ>* Fe0qAbOd!4cd^J<{ݫI?U?Qf!4715U`<`~'{SU~Ij`Yp:i{NA( beBtxd ]aڻEsIm],M͓r-x{nY&zNN.M4j$זz0kXZtK;0;w@?|;?0_eZظq\(/)k-c>qvۣ6~,=ڢ݊iqzu"~4Q۵{?~o+8yTb"ߑzdS")̑tmLI>"1pa;& HdL QTuq%͂  ,UT߉D]Ivpu@3 G݀&ê4'bb~A֯ #nh X@}[0\|$-JP=Ҁߍ@_fo On//Mz)W]5'J^kp7a3ADr"%}by2d 1 /=Zs"TI.\_K_v)y\69 8Y&py~LL%KhxƆL<9VgiAjo/I %핼_6oG::A;& B[-zBp#z\-g4&I =[+7nԌqaP&l^+L9?Mj1_Q50e_UW7kOa4EQd?k%JbJӢ5e湼l/9yRlEF=SDfJ72 sg敓D~?Z>l+Yc*H[XoBW/b>`xkeEOEi o$Do"@oц_D\Κ"/s]r{E|cv|y(~_GvvVhKö:`+ 2okvb &|`EY(-!( (-N y~yOo5{ߤIf~2fS OTZaϚ"~gE~$PKGx K<:7H]Ia{2˒^X.n1YX;㳠(B(]' dӝBϊ@vz@۪1]0Vx c_)"Pa'=~VGGnҕn\Õ;syi?T|/JCJ~7J/N|_ܿ&?Ј/,(cNol}n|] y5 yF7c&-kGq 9mFA QnR%iW4wj$(1F5O~NӪCiU󯂤Eɪ'9j>r퇠aI5)Y]6\#f7CJΖC>L/B tvj}8F*.G^Zy^3%Z<-P`aO]TªHNIɋn;+<޻"m|HZ͛~^*-6|QP ~S.Pڨqߡ6@p/ t88G G[ N :AN7,zݐs 4HZ>F(-N s.zy~/2A䜱ܥQm*B!Fz eldXy "^yዴ`oPRIPZAb&}.:Ef;d5q-Q7[Ζh=lG.<<0}7+1)^.c'::$-JsPALΗn+OIJUGMg-UZ(_;Tm<ڄwɹl+pd^b< x lo.w|HZ2m#tZ`åloNI{ Ex*Bϱn'h \7 ?翤4(o=N,'S7G3Hؑ }i!u'&&c.^ }^?xbS%hυ6N1f,`Wq ʗ>,/nk? _w&Q(-O l!,?Np?uکg`{}s1Jc9*9݁$$^n*A c8&δt:33ӈ^BrnԍJ&v?.^ VKȄJ]ݭfivR˃漰`v;{6LOx9҆ς2 Oe>+-|V-ݯ㈺1'c, kFab.E1xvK쎝U.JժumFwP \O\q6.v?"v9=5TZnɰ}\2?iS1qdo*8A 6h@#=򳻶b Ƈnxz$Awmc֔crZrN%d3[rPr\bN(p-љm{XzlEe1CBeɰ6o=u9*jѺDMiVfDF]~kks}jȵۯV?ʭ,!5TKSaGťӞ,y2$@G~Zk}{_ %U2:Vb\6Js]֯Īax7oxg4SܧX6LҷHux#7▕|OƩ=¬9%tXIݻ.'eyFWҹ?GAw1v n@v2\ xW{+ϋsd,>Yk6UE4Vm/!Y'H#2~8 (< nʼ|h]!Ee7P-`{Od@qvlo]!襆jTAPNOyhOH7+Mh:}#j1 ju*\&Ű?aI/4SmrkJq%tf_ D 4ܑIx= [I_nnG )Ph%ud )4bB?b0 k`P<3UVGBû3pX*Ya%~!+hp4q^NyVAK Z>S6K>!c2a70BY!},} *9Ӊoҝqbk*u4UӘ,A)ЇRNCdv?(OPѢMʉKzvMKYL=Cz2h38fGB F{q, x*m VӋª}6&jܵSp]1*J0K(=EC?0?GNYNT8I4-duQ/-dWKS<|+*z4,ԈORjm[H.>Z%1گ!->-Lh2Z՟l<@es/H|4EE}enH~패^X}^ 8= f5~$m_` "g¹\bK"Ye&0-P* gq T4e_ۿ*g.Poa 37c&zҎqsP4Bi:D^[iE2fgn&qh)z/R_ TҨfݪV0K 6uju䠀|sK%Fz⥖+Bi˪i}P=>T0;90Zt<-.*CG=xmÒ<|wR~>ds 7lgkɏ@P._(v`Z>~Yȁ 7ow8IyY[]0q!)20݆CV`R:Y > Rjr:'q[j-P p>zɁ.=]e}Q/=!mòw3 l&YLr`M:kA&Ct=rfnDbb"~Z"HSn1Uq.y|&v7d_$gVP@j;'#gՌDXp*$U[ﳚ&#N_e'/1@NFv2ђk&gzDhe'";ىNDDĄdo=g'";ىNDv"k'xs,v":4Dd'";-O=D]mDdWD_i"+";ىȮ}d ǬR BYƈ\x@m14q:R78Dm k8&N/1.xp.51YGw9ïf0ӄm)v̡XêojêIX}E0rⰩ8S~yl}cB=8yt>R~+:P lz:RpVY: ![OzHG.WMD?M /0I˵Zׄ2Ԅi6Qiw:Qe#ߠ[7F_n z-`\~ >ӻVCИUܠ@-F(uUI6g<;|YEY*vVyY߿J6.i#S Muc\PtԌ DuefG6kC=It!XIJxX䡚 $iJPOeqoC÷( }k0jd5'r*}zy/_m*V5U׼+p PCx2:Fm/>/ƣ=FnPORRW{k>ePx@ N/,Ղ*:n:!V,TlKf;=iuLHFa.|<\',q6nAqbR0WŅZZ|@^ :Ɠ Boi{~y_%dz|Vz<9cH) 0K!iY;&.(#-~83rBJg]'fbHC Q1pQea>HQtv>BC g钊 4rT bxa?KP=:4r@ _mhmGUІXj G`kϷ} :۝m8 3y 5gܕ3:V~DҙM5"A5Xﲲɝd\L&*yv!G"/yjNhА&hE uDT/ 9xz:t/LxTXM)Lo41f|2RIzF8[áwm*\vCSXh|̍sQ ~ZlbVSщQN*1A/z+umsEudJ2+$Y@xutú7|zuԧ`}E\`?X>hQ]\|/I]cL)5=RV7iu,֕BL1lנ6|%ڨ*駇3TV5gQS6{.I"I4j$H)IBtR>Vpָь-j܌C-VVsScZF%u} O5C+iʞ8NhW|mrחR XPw p4c0D„UN6pMJ?D^$zϧm>棿%=nEK; նG}`E%Uvy&ZdcMf^#>KL 2VSAA(ɨ̎QpLN OGr< XVgumoq-6/{O=DwZ'ˮ0beɮOba-B]]d8MэClE1<; ݿ]t]"^Btk3[tm:D&>?>qGNYQ1m7Ht#ӀeEw͈98LS:Eo@e]`8s!y\ VpW$f !jm7a_o]?F sh[Q 2[kD86p ܌ttk-RTIj+ch&0(xAs*rھ=={7Ƽ=;14q;6b:Q\;{lʨ?u m&am5|S+MXf!3B]e'xvAPk:@l %BvW,TeuiL_;G[@' p7F=cH!is,b=CVHZ)wq8$ MiNKPeiöJQE"F:Vh.Y:#[MwN)E u \j1L{p5^ u\݇Nwp&R`Y!-Wl="{/+NrIR^. 4Za/]j7j_57gXǘLŅnGhS1.o'n_vE<".{ZKϑ,J?3]X:Y,3U{d-ʞCR¨rV^JwK<1. Al5jd^Ό2 : -Y߰~.:ݡH؉[w%rYլ/q xn/uFؼs+"^t*?t|fz2G8Qdaݻ;.QC4̕s]ƳN$?H:F*rSuy$" : q x,U5QmҩU,T͉M[_xJ}8eJ9FsOjraXeeq8t,^y04iHW uv -N Kazx\.-=C Fu8# QP w)#9(I), T8qߦ}#MO6-8kXRɃZ%6$-HOiqR`JzN[>n_>† u^a&ыQǣGZ76`>@IUr^{9ܳ2l@ZcrԲ'r(dk.tq{(e<8f#>˙nCNjw5܍d绨}r}K0)mn["J/ǟH l{:HeH7;"\ 4J/{^fq4#̛˞2u=k9!o. ;:Fñ}$yk!+3)A5zU#Mс\p-[9xl)EDWQK5%23toSGW]q#Ƅ8a'PEݥnD5$q09Pg%8NZl~I++7WvI;Mͥeʜ rsQ5Ҩ{Lz$/Gbr\܋LC,Orw޼_6PJ껁Y4$0S-VO76(V ZHf*>$5HfNIﯯq>TVIP d"<_BIW'tY${9m_: yټ\ \%}Ð+A7tų\S  9?Nye+z+|ߩ2.^1^΁ 95Lxl"[`dU<2r< r4M\y#s9fm{@Q HXG %I]3pBa$#|+,ixP-&K8)1f4 9<$JֵnRӼfʫ)e(z0VDAuK>cΛ ?w3(܆'q(r 1uLh퇟[xc w/jn޹6>MLځm Lě9md$Xxp/XE\h.C}kQn.yˮyUJofT.~x,&:+ ĤraL'AΊ9ߜS^Gi␼AŽMXqSl&C5e wox iЄ7+ o"$"poVmw+2kcArR܇IG0'BR^|..$syX7Н2ۍYԊ4NG_|J(LdjUZ"SϋXPXEw\hJчQ Q9VB%n(I7T$xߤP'G0x"ߏHH_D2SM?U^,*|LIzh O5۾Q-p,TR%DY\{/?,<~ hw4&ęNɡ ݒhuH0N8.ZpL vÁhʹF8pzOYl%6h}M "J.y.O2L7 61C 3\|B~y)DYiu&+IpOX.`+Cxxl (MxEmqޑ'5;EVV-eIƎec@3Qbf"Oδ98^zl٩KZ upk]nt`W@rTM&|#4 0ix0'Fzgxx'@ui)w{z#,7Z`-DY1yQC586f$/6rFux8%})a)36 H/vFz@|dg3Ra;Ӓۘ%bZi-oZJ}> 3uE9rGN{>^ |yNS]N;zװ5(]x䦯οtfv :>:㣃]}ѵf`tEUw<dsE.Kz.U6efY*RgE,fAL86JSY>b% !>b63Z(X fgM Fn[Sp>fi,zZGpk"SC,1$ĥ$WPz,h_;٧TjbKs|pL!$UR\!Zsqi*LS~s"I4(> 6q_0K_a;KYj,|Z?9䎝*C]R)=s~U`M!]cwvrzfd'n/hrp,p _A[<$MN>°㇑.ԃcLNm`vrӨ 3A')v&h_zm Qvǯ>d j *ޭ˵q3HAB݊BƗ7ǃƃhzR]A &^e)\5w8 Ikm~Vb^H.#8U [ik^ɫGULC?9/^rjE3o5s}ZUB'hjLDU}DEˤƑShQklfFiW:>Y,s ay`, `LBL˥i7q`(kzhrdn׭@=2'.txGʦ[H-\[EPMqHo:c e`n(Ȳz'Xhlhg|ɍB ǃ1dx9k|,$m  4S5t$6h,ɯ6g}BKZOb6-cY6caM2eֱa<ȠAPX4ExևA(~W_O >]_qjA@jd)}\Y;xB#kK\smw$/GR'Pe]$]Vky;q^tx?1h w_ BOgy:Tp~o$ӱYΨpo{-K'1l*3hVN"[?VGr\R #S5tWv!SkZ^,i<\D\\lFPv7 f~#,~)~u?UXZ%C?|cZÍ-hʛF2d@r\ES7X,D듼1='1 =ΥC?lyq!#n9BӁߙs^_; ؄BVR_:HQt6Bߜ`ә ꭠq j/r!Myy|MTL 0G҄vSOXrIl >ǰs"7Vxz x3%p-bUa9Dv`+_Sh 2'B:nSӔ h}C=HLn< U=z `Pcv{%H(:G g^jk!xIr߮8pE/Аφ*2~F@Chulei>;\.XrryOIVU"]a !>4ШeGؽPcR! rB&4S9^lT5+q>ݽ¬:<"yeGl(­^1éT?Ɛ|e~Аvl\~Lar{&&wdfU΄pebV."=vؑ0,4Y`ѵyTB?Cs:we:h$h=U?Uޤ 'HY Ib* 7˖刡JEԻZ^S=vi dYct/n!UYflC3wb}Ђn/6R.:yyr%rĦ$'Mą*~rmc:c.j2ypWk쎤A%ccťgiaM0bm]N26PuV=Cc7 uCiwn_‡ NDKIe:ɡcZga:P2Km`4w&<qk+odv JbD9/߬Ov<57Qv*dqb߲~jY}8- . *=t4][ղ8g, X˖MZ룋#g-zkc+wQ ΖFG2qdajZEy&;kCJ{!/cbrDqV2q Aá&TjR\(:u 0k×: + xXhJ-]0X9?Q63i@2nZo{VM[;NM3 ih`YqpG0Z2M|Z 4̃x6N# Kkol-c/K^#jŸD] 'qZcwbG;j`qjJzOa2B7l[{Swx>e5ҟNX 4Oq֧.OM䖗~AP~yڋw8+6^D10h/1V<'^-do!$@RO|2 u yf X:!uqz=;C郘w@K)#Nz' .*,J7Ȭoa`=~ᮢ\! Pki(sF/XhZ,|]BfS, \m`LwvW]bNNμnBwn~;w CUv!O%aիbe*Dج.uP>;;ZFϻwV,~ 'os<|rCe"Wo6mձ/ҁ%vn} ثt!Z(0ӄaVx`Ahq* FDLm {%ao#lcF<6=}] laeaX(/Tu2 Œ!]Zi ԑy,\N3Bjt WpvӤTUkZaU˚/fa½va ]`h`twy3bS$+.Z؈*4=">?h%߁?mڒa" xrJYt,ߝdp!yd^ 2p+0ꄺvVaT(:*ȡIRa鎨E>nkC`Qe4~ܿ*+$S(ם+qV@L^f* :,__t]eOJ}kUV,\N/+ر H)CY}N,4'J !E+> psYf)/x\DtA&~C#]=a=4BSFX@܏-}rBc"(IF>9`8M\تrřӨتF0|5 Ag\.hV^mb჈<~7<PCc.{)$^Hk/ElbCBt4H}}(]0wy/<=SUL\nUp1nry(Dx;m c 0D~܊I_fԃWG'ln8Qi1WFfzHGAc&p#hy@>gb Lnh?熝 ӑ X2 Ajŀ V؂+ 3V@!wJj_֗jQzF*޵]k)UiB{Gm?ϩFyv ,U{ICbH`*ك7nNm89 D 0^w#|[Xfnͻ j}>}+xS k:?>:'GЂ3J_g/@m~ܥf _ۙ ֑ Ej>CFǎG5KPlW q]˭"45n yⴓ&DPxB;TڍH6㑒td<8UτodOn"81R\/롥x;*DfQxuh>F@@@SU6]Lձpr)>`Ʀet ] Yu )GZVrt]]~tl CT)Rmyec֊m)G+Vl؈[[\H"KGl}تVtoI^rFpk}:r@m]Ib޻EH*taXěXq\GTY$X$Lv2CC>laCAZ;_kQZ Lh,ɡ;/{y5{TWlTLcgdhL^耇NL^nLD}BDvd0EzoSU v%n-: JY@m 9V88!\TžNW; `rШ`1t ߏGz^< HUqZscxQ/GqH<^Z*Aw81pw9gydn+{tF%3ʙ]ǙPDH(aXctRh)5_#ץ^¯s @Z`K)%ETEʆ(4hS̈́̂MO>4ȏҙRaih8Wy.߷/NUTPYb<pf+x\![d= [L޷K1~v!4b&ƇtK1oCRL1"AVL!o0_g>F6r``%W%̪5gN؇?m/7NI5~ZsB7f?zVI+iRA9Uu7 s"ڪ*VP᯸s-]jof7vrZa%1*5 Tn]Zm{wrީXEJՁN6T}O;;KSI de^N 29ԽWU!k+Lb~[}ͱԮ%TjZ9 ,DsN/ˬ8el-MgEOA`Ե~m9PfOzxMYCG$u),s/˛[Sc+sSIS-2ꄐ2<|@(%" g jf }k-?r!R'erǭf>Ј]%,0SNP'h؀O82'kt?l2-x.U؞ )f,7ه;}EDGr~p(Y"KLMF.8)sTb}VB(Ifg]ey DAK5;O!x)mJ(C C ޫbbrb>Y aBU~q]M3AޡC[,Q^ˁ]ǏUJWw3s%kL( )'4e0OK|§]w%MtT7+( Y6}t W Sڰ%)UQ๫6@7akLpv5}9=L}88 SΝ ,Vcd%6%^p4=\6\ RXʛOiEXc|JYmWN GKd@ t̺G6 myNJNe ;[B]g鹭&T) Sq'3 sk-'\);8m &'FJ3- ^.T9B0 O@$A\ጇk| o)D?T[0;KC>x)4bzQч@ ;hJ_OũC&ݾS]RVu| u42e缠D M_O&mET洐¬MLa>|2 = :x/6 QQJJ.rp{'+գh4~@:b 8 &r]kD^l1gaߪcV|X5[U*WgbiUL*x/L/HGJ9`*@)Se r'y*@Y=P^@w"ekq_2pQ%;rE6FG6\cZ%+3spB*`}lNoZ A_}UYz頯T 6?׿Rڶ5=Bd ~- Y[@Eb JȺ '*;O;-s `V;SH[NC%iX8#p|%kK >J.&L/(fDSe GL;O7(:.oE5K/B^"sT ^~h#%:-wߖ+^)QIU]k޵TI 2,0 p0*cg@FTrbN zYf۳GJq/H2YϠ#縨$c_:S<2h3$`V~gٰ5%L.xd/g= 9~_.ȷ@^Z׮ ˘ت"B, 2_QSݮs@'Ep~`dFKdu.>pj~m U?1T)ZjӨX pfѬJ4w!'тTSI(X1J5e xll%Fԥf/$5`9l dEs!4dJS7}eӗ8fPnhevI0XLO0I`{zD+ 1*!tKK|X`u:X1@!آV}Vs:h<1"5T9ƫsdU:|3>&Vh0IAUlj/˞[j~ LM] 23oUݩ[^_wɎW]PB9)gr.zՉ& AP]+$U[r,,ÜyZ]*@ɭ -8A62+qP 7mwi\J%%y/%kՑ<)Êo>@UhG£q $0jܚ7`.&|}>IY-ReOR ה qP0)*)R2B>$YZQLP(8s, ͑QcT^812Rei"h ơ$>e6$t#uM-e-I{DI~Jr_$\=lj]7GiJ, (9.1(N ]ao=r!*Vge'EBs\&ة0W%'7X*`#td @Z yC5i}S `hL nӺϒ"0_.H<."fC.ތ`̌84V`"vu7hp,9\B2זܱ3Onfy'[@荵jj2Z^"B< N*~ if7ԼGOEKU{ꃤWD γ9~Eci"rjRp1o̦MemZC_Ch _Cא/YCPY/$*^i{~lO'ȴ _L$zZCxI<J֠OZ>!E<4;9~;r| 3x,| z&I&^T]dXEAwMIz!w "L$*  X֚QCI O <|A2Oz ְDh# )vjs*dJv.UTLZ!15'RRIudPc/;/@oj1^,欗&mǚ}pDG~ ڸ1.2YĬ) wxA^*Sɮthnb>\@A4, ?\CFwEIuM0IhaePr0|yk-/29dhB]H䭽;ptHRIk‚fŒ+1q4\{427@* x7 S=WlWΛծEys¤|;h,&u6E#t#D(a;Mļ|}qw"6u c *_rƺ1ރTv6UiEu, myZG@|CQ.Ԭ92?&t>t .}<}  Wz+5=`Y$"$E9j nvLq )/w"ʚZ~W2m[m4^*JiAyH1 nY26Y:YyuhK' ZQ/t®h*mb(iC#*{m&|[AߪY#%aF ZWpCOCg.^E5 i{W"u:#9o_rd!ƖP^:N$,8Rkʂ35Jw҂(i\Py+}t*^Q5~!I@]˾q+ȁE:zZΕowQN9׬`y6yl8|C#5} hf~95rLe 5\&=x}&4=PjZ-.HT}Nrݪ(|{8h;T9^ZUB5}'b|cTOGeרѨLwbZ]JHlhqM-rQFig sx MGN=iJ[lo?.v9L㋰TN 8Q?8yW 8Cm^SEbrGh]U971M4c"f9;ӕ >9 c]؊cyG.3a69 ,OAhG1-m",Y;qo@5RK~6'xqLтb3n>6NhzjâQO@4of4 #㘣q:q.ҍ>8yEZs YE{k|׵ǿ;3X5,.kXAšP kQB4e}1L$`IےD~xx^qA`_@eX:ǝY18nyʥ`^c*L&}wܿrYpBRE?3%˿E/Smkތ<v4$RU'SތEy5l*2dWT49Yt~Q^CWv:V;GUk볕ICe"Yvc*#9v`:0b[(t<E*z{jiELj[wn]q1KJ <$u"W22ӟ>> 'mIjCb090ߥCʇTzaD)߉g. 2}ˋ11b(ʍQޑnE6hxc#bE9ګY8d|uĦz/&aQb6͡#aG%ܨPȊ,g8T<*VZbDyIa>JHן翐Q16_˱SsȮO1߸;3qv$x$kyV+ciH ɼ:^.XR;f4wy<|W17v<'@=*3t 9MEpB츨`f TZJ.1a0NAf1kzܧ^r <ߊ)(> "TH1b~y|J8,Cy78(1L8q0T?gvOՐI%ʞ)D C AG49,ÅX#;}MСO{5JoU xZ!*J5k4cS-ѦY5 `K ӑkT'D#6K~FksӔb_J:7GPJj<~`a!wj߉ZVPڪf>0y($7;Q @AT`,b֎|Ci-=M_d5G(YMEc]Ѭ?(5ҥi'X?$9-c% j2x\J.8X.G$jQCGfFZ ]59슷f3i5RZ fe'8a4)E83ޢ!ֹ7lT4\*"蒪i&܌j}6n=! .=YzgjI3bkAc̓^7Wa OiHV/$f'^Zo/%y#ź2TP[(fc0\8|K*VbwrĸP8jBΫnU/Oi)7~q uD)f~Eu'}paJgr!oAh c:o 7對OcyX&o4ai^Xo*ޘA:`DdM&s$OuMpL9#Pn=~9&P';e Bϻxӑc7M`y:9v]XqL$(c_O$,,m-K2Ja] "捹4Jmmr>hiɪ._uȿP6^eS;rD9q]=OsdCBj1?l{9~HX;rlwrD\69B,`KWLJ2 N\  =Ad%vjڜ w'ׁ̂"19 iM1cKGvxL1jbgnE"թ$EDZ)xfj}jyB,wd'/4 2_F઄ +` 1J#-7.E7oEw@%.}\/z;sq>7Ƿ'FH/c*hC ِo5 Y0)i0ؿEGQП5̖( A!?{<ʗ˝8HI+-F OXk*O^-K>YϮI>$'pmGdF(Q4^YD4]B1lPy/=670h R:GYy k:Gd1f5 EqDKEV4"!Ge0%,[n &L4ieۭqܪMQSbM[x'z|@#z8Dw-1Xvbl4a)\!rbuoS7Km)&'tHhDfL%Sgnص4c.վ x@jOPmW-M(g_꜋m.O ,#< 0s.!|M{p̊<7mW3͢q{<0$Ǖ0)&֡ E *YO*!/ ҿlÖa}U36 g6" uT~"?DDt$b(z\[e_;Eܡ'cי A($):RJS=Hrv˽{/^rnwq{r˽?\ =ddz7.\I\I0M'Y[ ;1 4PPE6 w樤`rt8W26ʄ+#{8򺛢vE4:Jr O|x"$r'Y#`2;cBo0#ܪ,%{Ǖcq\&ݏqX F7j0%2NSN 2|CVK Ho@{5kGh~W=& -8~6gM`IHC?`6Q{˞_73T:) I 1~+Cb .%hLc4hqfn ҅ۆY0 =L.O*wT]'u σxDU_>G2x`w| Yo syHLCf50u]续8 W&mB eK0lc{-]sLj m۶9miu: Uit`:xY}H<S0YDxAVWjwTe1jċ$ j`!7BY:ec_&;VR8GUN+:ꋿ-X^TgRV/*M0?a=Qq@(z*8ڬ4g+5FMM!j%2RX,Wf:}hY{!H̃Dլhu8(cI,B,ih eU2_p--V"`֤+oB_uzիS"PJV+iM*ieFZuWZJZiM֮fFbS Y-VFEX5n>ގ}H =S@+4$K׵>s ֫uM+,bɖZ׽eU5aL١O"hW))nv ]\.Zk8[Qf;Da" zKCg(CYV BEE <[-m4oZsAýgDƈ-|ÿ"{KyKP^~ټ姀^K(&^> m_~Psz} չYouvF6q[k4fi$ϫ TaKm; Y!0% e ҅fCJ:O+\J>wZ"y!>ފپnSv^]$4+uCltEB6Z0ݨG$T+\y~Vˁ$ s-y)ۃ~icQݤk^ɽ̎䵅Q ڥWo-}Y.e Lۃt8% $o[$+ f b3ಶq+_;iEtWH'SsWPQ ea-F!MQe&75ށa IckODS)DLuu_Ÿa«gQ^x_ք+; JyfYg!I遚T{iT䀕m޷js nY!s?.;Y9䌚/++a|E1k`M"CF %aI6ADN2"i4= ?y4.nEK.}|1gu&&sa% Mgbaj 4pU|jk%ٚڮ wqXKhaX?ۮy5y? ^'8~>rwn\m_o,X~c[Af%3r8Axlt {]a)ikr =~$uⳂ.!~T*ϸ>3o L[@#u~Fro+?3 FYLfJ~ٴSZ}0B3gF2=4EI)xҮx4]KzfwwPgB5"P8g#zb/Je?BB]AE\pχ0)e\sw yoMlS۴&]a5ea3LSE^7Qx)}Ok0)=zpB5bo׌v>xj0=P2mO0g$mߵ޿pMWpDi}J] ZL@;C=*}hd8ᛗ/l Ewܶ>5 @" omw)}hgzEp@MꢤPWl !ȁ+gށa>sdȣM,xeTJtKQ1N0 )2@:km;>E+gۆWLC 2hWtZUpF/5(ct%쳑(a\~WvPij{=YDBL(vY~lhs-Q.bg5҈b|$fSg 9{Uҍ|` `_3՘ D2t)ULIİAYi& Of^5VicM GwM''Pk5"EDI-S/1V3n)XMjnQR4/-xЇ~ZGJ_ƕCdi=6%)= __|0ښt23ÿ^金 QΜVӕ~IXMjw"`UxXmv%=lQҲ7eQ˄z9`hXi"iMU^$Jjjdռ~zH5[t@T[6iNq&ZLWOj7ӠsR)(yx8oju>\.<2(/)A@#;* LeǦ^,3;`ɂӕ2n68ͶKxhk[C%6LCJJncEbQӍt#ߛKv:a&hmtݭ¸U tX{$D|pt D'jɌvٿx*p=D!rMAI5(%Pl}=J ~W%Pr[AvMžfX֚895 x/2o {Զ/®Lo=k\l# VLU]Aq#00 ?b@BIܒ,bF=ZНkGfŽ*enL!E tNIiFv'5ꍸ6|V"q "X&p`"#q@1.bM86v}xbΫ|{w dcw^5>: f<t th5)u>`iQy xkhD*V&nL1yկRq 4]6dgy y|Zfӆ6{aQ= n':/Gk49^H FnCn>V"!+f8$ 45kF0OIS,jK(%\,cB#NxMyW[uJjfGZdH9m-B?2{|e`w"$d,"9c/'E㦹Nj7JUq XH!$.L7y}zRe"/&d`A omfD#(c"({&`EΣKX]\\ș)ff?c}ة +I~KrAav%?jd^c<snx`^\P~1iXZ fGtREjXuM^d +wn7a˙ 8KW&1_T RJ*S4^KxF}//^<~^'au˒j?3E0;~-ÊCmak3B֕(m}00a `>s98Z;=<`7p670D}/ kųC5_P}A@Z|^mwZ8àWC/1eщbj0VAv-dleSB=t ߦ J?nj"pg@N|6~'>'c5+W"?X续i[ w i\>4Sh?y[k(RPZ~"g[rN&0@ ME $jיh0 Sm`Lָ2ķK4 ѤQmF?T#ӆp]DCy4RAHh=b9V hm$)NBnƫZ >aqyL F< {&J~_ҝ4YJCMfLY!Q$v7g% Xڜ(\$~kG!訅2l)xuiԄ=;|F*߿dy!F` ˡy_Z Ӏ览ZLu( pEմ;gyJ}c5[4 ph3RF}w@%lpÄwH8A:w*bM= yu@QC> ^k&P Eo R0W (M WntRJh=mٺ 1m;`L9aFVӻlp>X*u8W6'ܾcP@ ݿv'dP9fu~_GuM xg6C@va~Njc}{\{Z 8\pq{+Y 5.7qH{QpJG`m"Es8Vl}ZŠff9'Ka@ L";KLKь;^iq)ij3XѼ:7߲&TlfNyNB|)u>++ܭ9aMxM0' z [>Z҆w6|y _ͤlobN?J95:r~NjCwxۜjѓa%6kR5ӎo[n(zH})Eb3Đ51"ˤ-)Z[ 4UM:N$} Avs#S( ?~rMyh&/aя> ҸgGrM㞽)`9jZ(B@!'e$F4;9N5v?iv af-v+'3G36շ/'B;;FԐ93r9vM͎MYn1l-Q ))(˷ ;L(ѦL3g0t*,o>L4F`lP8UEM K,]+2z3̨Mݤt{Ѯ=hWvحQkfb-wZ`U!x(Z0 } m%piiKncJ' i >j2{fghK2sԄh0ǽ,rTXcʡ.w=z V;f˷ p@dn s^uO"^p]i*] $G#GE HisT%B@a_G @o6Yfh͊jMсj_NwM.'^%@ly4gk7Tr6"P} pVm 7GwE@/S_mƤ:s$QPasI%0'|J=߫T{"7 (7!⃸p Ɔ4iR#xUgkrI3Y-D(%'Sxa)H46hRt\(<+z+]۲f!}a!~UNjh{*I~z*ALJÛ˾ g 9zL"e!?A[NЏ#cjlYǓ#Nm TOg.(n;8ʟko!oa#7 aj*mФg3oITT 6Z%D*C*C*\i!R +kW].Q !_4rqm#y^X`9U/%J-COS$P0 %#7޶51l7_?I@=\(Np@GYQiZ;"t`~4n1OWaTߚT@MdWz/#"۴NJ=hګ{!/NԦRӈ(-298RGo#`E9ѲX|λN|!?d::>:=Hm".0cD b#iτg>u 5~2bNN7Ḩ֡etGhYS%.[w 6e~!q  $3%e7tQ, )'ɜ|yMDS6QCS FN*9x~7ZBa~0* `b^0vn~4n_Pu?$FOyIgݫ._u97%huxݏoRH|<ݐ`W۸s1q.m: :aouw'b/ݢZb$BulsZ JhX%4L.EmMQ}*Ki9)( 595H O."!YG uD!4Em^AoL_ F\?;67TQzUS,- ZIrjN0d5Bz&yr$-s;uؠ#L pUYy5*Js†hQt0"+ .e5P}:rbnY(tNE^.H/^ C#,0(veĐX/© r.K `i ;ÂmF}k9*:]7]QNjH5MP]j@V$h-"hIbїc1)Z=:Dhi<2y? V~(haѹhC[:dc PazEpDC1ޞ54ua9m亷,(g-,2IᔷTw Tps=G*#u*JP]"\A'ԉzFPYg7]~ )>vBmڜ8ꭴimj Z1ps4z-BqFל^CY#¸1h"B[`:T3^;;ץ^b]"uEוӯ+OL&]W>+ה}}{!Wk_S)^E>PBԊukS)ݻpp,V_=zzS.\O>i֔ۧ 'ܧ$*:-?f]?a]u)+s+q5O4I/g7|%3#IәC1mgݍue/UNmekף롚U҆]ZCE))Z q|[ۗ<' xx}hIf8˃QnͯDUr>$&z%gjVݚrK9auaEpRWT/|ExX}.>NU~(d:'6E`Ņ"S%}=C iQ*3}fz̖?)$(B\϶|Rf8%PJ.DaHxs_O>=ehq Iu sIWQV~#|߇SgY(s!uKq`UTDy5!-X^?|Ũqg}|Ŧp0PAZbmL I({=.ҒI[rG𕸈ˊxp(!d?*ZA+ `*)[$i9h2\3fԠ'N ?Tp:6uʤ`SO#WڜRljʦa[K:[BP4#0J1 >J<*%#D;&J@4pruݖC'(coWܺ?gs4.H5d/;q;rj~l91j.}! ;x?:!.@Ճ3Y<3Kd Pm^ûRK{Y}5k 8dHh*k+4:;$1`OXne+pjypjygH4TZ6iSjڌURi mj4i]WE6Ui8l* 0D04alޢ:la/ɤٗw^J#0G*UxIi<} !ڬkRJ_1+^C4|}HTlvBYlVM*nGۮ$B;4+IK;)9^1Q= tݔmoo?<KLo:Pwzeږ`YDy[yjZvhԸ;Fw7XK^umuE{/?=QI!L*Ahje^D4x3"\d]aI'n, \ehUӛ mtS Sx+bj3tm=F"3]-}0\t8 An:EXRtltv!q[#!Wn /QA\x5ns>_#< z|:;y >3R{u(>(z#tެvZyx<+b/8%!``ih? pa+x8UQ5(6:Af$ƫQPy^ꮟ4 [Nsiڢ-ןm7gA'y7xڸ **lBI0"#͆n2,˔? +SxM]j, m$e4!{K0Hɫ803~$ϏGu^G+4Wq/}Z<,`qMXRo۝S~>BUUbN#X0E#kIqc+ n~N=Rٛa3҉B`Cy_c\mjq`Ç<.y58]m-fa‡ jqm1N!>x1m݊C¸i7Ϯ/!3h/e,h2_p, sy+Yߏ[9ER4 6#)MIL?^AARQhzOoF_B<}c[ q%1ʱcVqc9NWmYBEe%f3_T甀/C2S1EGʼQcWDfĔ0+l,sVaId sں}:FUuuB: J2LϠnW2NSKx<xP?Qqy8K=v"YDF;{l]T|⬣VotY<c*E1*G1mFd#/a`w`i[ƣ-ޭayVp-p 7ӢaCPƜ ,m%a&mu{E} i)80뙔iUd*e,-Xަ xQ{~Vz6@4?6h5g,qqCskypD5,$x ToVX^" B"p5dE#vIG; GXp6]KY`=M,ARX&>SU4cD#Oa]7)(5crs |Jxlo*E#x*enbgF"zحaV3*r B 0\9^P$A$v7fCIPMG3y]oB..u-7tWDxj xf$HnH:AZ9R " ۝7aVc 3& HλE| )EYUqbw<ըD|*P?3u4\)%_.چxx"Lh8i8Dea*tb"(n谈O.]d$4AuZ\b-1Hs+;]24MK&}A~w|\Bs!g}7sBz )=Ye;f.f$ɵZo+Wht! zC~'tg:E^4K0qOb7w=%GTʥFĸDh Pu'=U2ZKׂů_ ZKfs٥ݳv=p ZlٳpՕ/~s ?9HK1d1~74jb |bFo?a] 7^m~+i~xܔɎDQꨏj;Aѱ"5/׾#D02ӃU$znjb&ɔUliXXKK^t)5~5 >)O'eD7|>[cH¬8'}b_IC- 3!g%~MIxZbewTʕSVj9ϕ^bw~mkl琼nKqH|E:^C'h UfԄRƞA$x“7M[&-ͩ(Wuׇ:4̩CYp,FɎITQ)QHGjK魟WBp͠rqi&c&}"SKUԲfE]%۔ ()Uas(u}F}Zy8x^%?'A?(̄!(<^̠ϻckccK}cFYiCB(I!$'\*A(!"׼nQX(3I{1C+E݅ha+ŃȌ_)BR\).3cxFVEIGQ=-x0=<_ᙑTf?:s^?(rUb  _0E1 he Ex/,n{=xd\`_sD"([R7n<_ Xas y_gyc91o|տ~ϛ/IPtko~gپϼVD"A\حs=4;N0굲y_WaT.2 B/30GtD+9בu')õl 7G_3쥹t+/Y).BՑ+_)J1J~Q0#V .SJ1-Bb[nuA<Ί19}K!̱R|<3L|,Wl"w! Jz"h5ot=5,?,ddҒxD 0h " !2 R!A磵?AF(y,VX -IL@2ia lF%%q?)]2s%DCҐo4eg}x#+;ΟƝ)<'d0902mF@ ح·RO,Ϋi !i Y`:c?~qLnT k`mꕜQ[k`.N.fLvx>guVe",]diE҅"m*K8,DQ~RrB\Y5i5|--n0ҽH? XAYφXù(C)`f8!p a)[BӁ9( )Ja1Js`QKKA?2'W8Ï]QG.;)W 5t_EE_AKI÷z/&@"! EHh$Y$%znDF  4;Gφ.fDlɦ_Rk@[wx^A ):0L"88qm)ч>ٯVbڞ@XiŬ|{hи+/<8h*UW+~/=#p}2$TF/, fGpF5H}͍U`y=0Tq^9]|8_bvmδيr^KM-7n0Ҽ[liî[iX*p7Td'oC S8k]Pśˊu=ފ} <s0;ZckXF40J5cxwm['8Jl2J*FY*"1y &%U&;evHWP)̕BtPI*{a{ 9ICi Zt?^iG+㹵84Wڻ-vUꔗ?-*mTZ"duY΁GC'o`| }U3+re8WIJqRc]EBp촣|-ُ! yZ^S,BPƹ#A]^|xb.P5O&^rWVJʊpRS& aI!4i;D' u(C`"^w%I1/_f0!ݽ=u8!5j.&ф$E1SNVy1.I9џЫ$:Q (_@L^Q%oq* :"?mVO,!J]+9! ر벴ܸha,x<MqזGY4Zr^\q`'rUA6 Nrmݰ4O"G̏?1k2!>ihD9WeQ޻'3Ѣ׼~B>/B&zخ*g| ztcxTTl]M:raU`@,6XD BaÂ[5Β`z q>Iyjl{ D2,fwHt`\l[hDb0O <{, /XKGqwÅ9ڋM"[qn݊C;{z] VۿR7ݵ}iC=] UM{3%H=څ. O)EQOCRQDlsgϤuNNQoԃIǂ3EW$#f&&+nԻ=H)@ש44oe/ IR'(կ_Ӿ!*xpګ0;, 1a* [">׸K.-VUCFMUeNJz0;!qߓ}KNCHֽ|XU/힤< Χ+b$ޜOגwp?(%k1ʮ;HsTƍyċTҖBZ>/GO*Fd#sCU_oá Ng<%*IDrF(ujzFkBTsK %O;mߏWy󓥵%0)kvi";VZa% -ᐹ:]i]߿os%Vp~nUU0+.èWsX\|6fjZГxceN7Ubs/G0܏5!xҀТ{V$9* ڭT˥/*+->4[Vr|=YB9p t#vO aU< mq5DgubYPq"C zx~Vb_LS B5.n!(6`Tk60_Gryӷ.!o kMIk,+%ZB&U 'K):/jN5He#E4vġ ,OwL vAÅX|}q' .,4c:cMRWߠbpP >iu-ºPkv .ıs`dž;iQJYgaNV:$jeYzW\!^'b$̮f4\Ths*_d^aviXQ(zV/PLC0jq/ڊ Eb(Gs<3̨n7Ftz}CʏoGwWo+?`0ATZU{q@SƐ^x`B lZ|*p5R\sMgn:MwZpǂ0[ފC`bns\7IU8u$9w[Pjб~Oc==7+3UBrM:p6 9)F$'#43{+qiQ^-ڳpX?)JUxŦΒGWpvKR,*{u(a6b4 ڽIEt^+z;<r(m܄A%^D.(FӿSYx+xBfrm-RQQײ $w/+Zj-527-hcVn #w% x$QGQ(Itܚa C]Nqj X ar0e+'ft};~w*2}Q6Z|jP^NXm m&MfzD0M[j-NRU7uzb0ZH]9b8b` RP*puR-m ueRK'qL-VhfmhZSDC^rs9K"E40vpVq%Gׂ1pA ָR[GU`R6euNfN!rPC=%~:YEK0cNGURx'Y"f9Yj ?Men_cDX*1hZ@ lr̩XPB%ĩ!(OsȽ_Y @δFCT/ݫ};.Vo CSipaTHRi#hAznzDH] ~z:B-Lۋpp.+4:e:N=xNUU)TZ靕¢+(`AQb=UV~A4:) @T|H}iv%P1HuD?(a Jr\zPA;uXp{ܵo)P%7Cl1y.Wy}f[MJ-8 vQkpcQGp")~\kr*pTên5M4tTqA#="Ƈ~UZU}ZH/eTZ))6#5+d Iflb2TդE-īv67u^HZ @ DU[r$$$}aaoHwyx )3z[AHބP eG >х=_Q;ޛk͊Yd[*V?E1 NiEż\(XSC6ӥGr{|#N2ϼ~/[xa|ǘ_-p (WՄ{}x_+yL+2pN(px3_aLsFe4_>x|VǍTX8A0so<ȳۉbM4O9cJ~A$ÖzA7?Ogz|1<܉> qZҴ4dPסj#zd/Mu}ճwWqՇ N=5g[wﳍF]xe'Nߜ&H3IpQ&^YG"F  4#U7Ɓ1ë`ޮsJ!EG&Hɳ7Iw@h ^9xfok^wpO|V糧Q,|Ti\PKcfyR:m)Xl d~<3Bx2u !%_UaP~ T'  XlOۓ:3`N9Ie; =:>jrO~(z@sB?v쬯!EtA'o  O PWTWӹ*wLptfQ5=(,3 (u1p6!Fap([5ɻ ;]ZJp}xIw.D]' -B\D՛t/>y~?ˉө|Z K2:L/pnq'wC* M9YĂ NAD,ҌhƳiH3ь'`*4`$Bb "gBbA<̫Cc!sux|w7+=LO:G7"p8J;6 9,rJlj,(/$;̇BB.OA, >|!Up y!AE~^`?qAj؇Í;'qkֽ`p>\V.?N_:Tr͞>ոA5 K4k!ĸV O ~b!$yV^8W$A4}׊+Ž5y\#3aW=(&Qk/ɸ&B}#X! %} 9o9|{Kv潮*H(ˊbNS*t%0_GB&RvsN_&RvpC{N,bJ zLOJn4{҇>E'rW|6aaovXf"R@Z0![Gޡcyh+N LCU!u09F8 % vR:1 ' _)q-8*<9GLFo6"N7e> %H/ bH^^(Ei.#zkXL!OHtL BT 8Pl/lru RTpCKʨZu<Y''f@sZ|r3@p3 uB!: jDɳŐSD T!`*s*Rwr5OuDlGyTG6+(0Tw7 llepv. %9UoA|[Yេ vw"SQxET?,+3Ů7pğMl-X `-ϳ.xl?suܿ'~1v1e7Mr=(K݁%uṆuaЈ+'ٚI*1)QmT;[:Y`F>1 ZgW-V:E#Y_N&*}FFΡG`{*55iw=堪˩(G >g.$Q,̪0_!ѧ?w@#HC,pjF"wxa,67L[e.3:C`g?f}k0Uxqe5˜noPWwj>_ u*k`qvƻMuUu*Ed"B^1YAO|:kzumeKz,K*XKzxYu3YnoWngv5N-Je1BȔaO9g ^FLj6ܰY89D7\%Ge-DK_+A`3p 4LÇt/ف-p\o*P G;応i"'=Qxex C2ȑGjhXmcތ~ENIq}o)m2ff+Z94SAǔ7%pA8a\.w?[5Q?R BYkΰ+}d=??3ElZ|S|L\ 9˗&!9nz+lO`xq\C*0zM Å.x[ޢ:gSrBU;*D[J+|C0@ L,TN1YFVgg徎(= m;_;%fn;6PV8Wt{]-nw# + GQ;V )·1Cd |0כH 0 a9{8@v$ٝӷ: 7YmFNk Wi 9ElWPkm:>N'<\gcwqށ`hK(T@˓Rg%ۉ, Kb^vR o {Tڕ{zw7eBfZ Oz~-:b '=p>@ХBUl_/nYX)ץ ps`&_fKr?m8hn.j3?:!E}7rKSjJkp\WQ*=h8$~wU؎X4A;cf&͓6g\Z](2N2Is{Ŧ{5\Y+}^6%2-qXC}qa@][vD^%o6^+ڼLuRQD& }qM_ >_ $힘=dY*ȌI?;?/=]K)Vy0/n{d27DJ&qzOGw=hJJ7.§1;zvY` $3ﻯ=|,x;'z=:LSg.Ǎ+Emt&1xIL Ts{XmBh%>:"4#Emez@Z`Su`;t&Sg'kc jNtpyEF6%!4 O ՠV+ӵ dbf5XZ52=+`f)s`: jEkmUm//FD;CpWl[`f,-[3P\ȲnX!,%ooosFXCԁJ_xFeAc].9(ibAumt"~|PyvqtfOR @`t30Z{yǴ|8$*[UL+ բj5uQ>o/V,̠ظI`_“Eoebu h%QѱR|ezܼ'ܷOہNLAyK,ɡ`o(H2ԛ9\UuHFOj&pc|u>ձrFjڹ^&o)䀁RhN b(OyY|h2 9v( .nI57Hk?.%P1հ%iOӋN;QGۘ:jUr'HkF4R;Oﻗ頺 /zIPF/4Ɉ^ߡJOBi3%uK eN,!JܤWл!aθ@2>ph$_o16_")fIu+1A̢߭#̘ߒ~o vxK|V3vU':uOè pDyjaK՟ X7|~0-+M pWtãC >Uk8~7]Ekډ$#Ҳ@@Y%GɃ9r WNt(|@/=T~Ꮗ׀ FY=Ǧ!OMR(qyy_{æ?"(` _Pr`y9Ҏ`@K诇QFBHe>jkqr> X/vVl UQYJl.v!dMi1CL$1d^kk1~(h8}%4x4E!HrZ5>tAT5XqoAQʽ\C]^8fymjZ乸Ž"8c^%*I]%@"aij]u6s[v:QNX >~\,7Rsѱf(lB/Gīt]sabDR--x 9zo/uf h)ĺ ;PDݱ ȩfxԚC\mM@^8 C[S{P=B!0vz;zآ ;TddPpx5GOcMikfX!=]ˍ''I.6Qa9< CC/7MTt0PdZPiMV'A\7 N/\nD ; Рt.JOѽw0 D"y1(0趨2suw,6]ժ(ibW*KI5H PMNH'.u:)M'eTRH52W(sD!Q7QHLXy˿?^`H#p~YUaLc_Ghs.興"zӷx_^k+ǀ̘فh[=<; S<#~m45:i GRj|̢VWb B㙯Za8'r.x 񕼊lTnoxS^. aX+`$V< PwCWr[1,}v3t܉xt cV{Uw\Ν_M٥GK\hDRx&#>ؠR%lJ0T,iaW =KۅY|g\j&#=w[0U@aadQ4<Qpn\<*n0 *+K\1:VW18 Ż)/VfmEW$rejW؊R&,,k/H^jƓVyQл~vܱ&`,cAihZ0ny^ Cfce _oNZ].݁c# Bݛ 14~c$PM$̻!5AJԣ qsCrŤgK¡8B :pj&)`.?fŬM0Zsaŏ6LvjWߩ1xlUF$k2f2&b.xu08* ǯ?Ljc.LLRk*f*&k.'w*'|hs1qXzb9 Hb\k(SNb&f'c1\,j._ݾ=Řz.0.eM5SG?Ծeu"}ȡ_%+HsLe,oIb.jvQd"ƅe8؎pC(hǹ'hnƹZTyc6v}\/Ձݪ˼L ^ 7d¯d-}FmL;]jKDAu$QO8Q]Q~'C__?v7p) >G껮Qߦ=@\c_WÃ/vVv ,=vyNvy锐裯LQIC;j7b&w=1^k@LEE 'G %{uko*M$  뭺/otwQYA]8.Ruբ;ay%rc;~M[?V۷eu#6xD>U&DQ6/xvYm-0SS=QMV&[D ,Z..IM{;!edbLeUg]A*bh`gj {>=U[zw?2"=(k7bɕ}|&}zfQ݅_ Ի{Ğ-,d1v1W b*,Baxu=?*Ee.}HgB,]:WGg,JFB\!G#^V!FF#3aƓ^;@Z wD;vI )("Ǒ0EȰ仍^q 3&9"8勼E>}:*m WYQZ89UAh)*-'nP:vŐoUISNX)p;ăMH˲ ?f>лaUC"*X 9\??TNO5Ė}y~:9t 4䚆X>A+O/609ΜvZI'yEk`<}0v٣|\1__MB{x\D| YaWə>)@G* >o]bZ Tܱlcu $ ;^-wr a;y O5B۸e7eWQ1WTYw5@|Csr|?:Vy`R&H~VpYq_1-TXC.).^uFa t+EX+m~ot\MeF E-@ҡtHA1I፤ U gAJiL ,'Ȉ"qADkYtMf^5HiN{\ jz_ψWUZ6!Z"Ja -Z(ACVs ~[@&:v]迚~WWv~vm}#^9ڌ%垴9̺9,{\4v=(+lBH]lRM`u7A7Ώ˅cV7t i^# wtU ` se7uUa7j!cB6 E<Цds_L ب)E;(]`*(A8+jKk*`Fr[7%N+ׂ' Di2&2)9`EtTL]Ӻ ^_d.O\A\@BvBB }c#QA7HoY&ϧ=#Nhޕo|cvcoU,z_k ܠ$¦7TCom+woh#S=UմXHjZ{*CCF@Q\ÅA/jf5f7vVUA@WD&4zjL:VAV/Ɛ`싐/!tt+[ \3T!SVCc{="铞p?6˖0!?09<۾Y[nd3 [: ذ)݅GǙo ӓۊE3?V őpjDjChjt>~Z9#_BA9eZOP% D(ߍMZ_,VI F@DeBh\:֯L?y9iSi5IY7a髒3|apDPMX~]r&;%pT&ӄ>VgEh,0!LqlK.!-/HVq *_Q*l߂Un?e*MW :Xt;FSZ%b~ӵ>l-Bh;iw#Bu?j|>_DD}Ig^N;XL^v<mwQۃ2p_?w!5#;?\qWl9N.bW{X6aT:6#R[פ:]`Tyr)Wp#P*7Vʺcj5aQS׍R݆'Aeg:6$HJcPTM>lq#+Eqi95;wiY$h{B7FwN9@@b|b0:q@]ns!I.ٕ]QloJճX$ȝi _#8EqnqLOG `3 o-;NSipA%<_8wz-Oqn'Dǹɪ-$Q2 {" Sk+E3<6]fpALdrZw8K㔢 i=8MyvQ7Y aa,W`XQxqCS=(ӎQ($΁-M!`%YA%ސA͈{]ͷfۻ"0̬ǪNdG@PZc+/ y +AuVmV>Z>sF&#]J)Vħn|ŗjRK|UWdFVr'(_[iȪ4Y3"ns+ܳ@33ς(9YE|Q JM#\ECWyg Vڪ6v\< B6+3%<μv`7N!N]|8E3%pSFxq04W[ <-@D!,lw20@ѕl3] =He^& U&SP=>+&%)*pTN`|Ka$p&ʒ3 Ə>B!ʐ蚃o̹/L>f f?N_7kڨ>t+xѕ _=~fPhh?BB@o|*9<,+3FZghhkMdZk@`YE5'4FCdhy!ΧL||Y& [&Sa&mb\c3߼ά$Lj93[H$421,0/528qXG(aP?R('C"K^J81H"Lw+3IIRA{dT^v{TծM(CO}^y0@^([: qŋ&P4YVZ Q2W\\uWo7U'F隣znrTZ#aWPSc{v]t^d'Z]}>BL;\bݬ$!2n1͐a D@Rz9V5 hP U~|=jz_XH-w{|CvXj]mhO *C`5O+cU+pª^d{[ \D]X+`@SSJHf_ZRonRb;ϻ܇FܫgG@}w8kzo]{V'vݧ>XZoj? kZ/jDjJhJETez&"{xTnZŰ[:nU۰+Lz (Pvi¯9*$¿O Zhv jfşX,45T&б3a.o7̀p*fO_[ovv&k>hm'; :zU$+ov.2$4ߤmx]EQ;hdl'u%~UWYww;(} [̀+۴`5PCkp&_jɜ_D9i\oC`⟻qu:0ο;u֐yh7!hjo>@LMå֊+V?;ƽV'WV,ϊ?DswK,ۂw.b}G#NUUy%+#.mnql}+cWֻ'f{gg#~: LTUAE6TmϠŭa|m1A߂5#f1} JAynZd ;، Ku nud&(EuD֚kn4ʘk d |m@y'ik~{zpUsU"WyȬa~+yl%j$!r"QJ"io $蒾!Ml,@()_YL5wd`/DޟIv<טqwM6H;EegfVcx1#g!ddzj5\xJ}?_"?yn}B'BT IvQVXM0}4dYQ{!xˊce`\u]{ݹ qÓº{.|BV~[=;AZmwV"YH-PۼbĠ=Ӂxx@<+,C"9$(Crr~nň.01 *A-}:~acb:|zމ1nso|xXD, !2$,K =|MseWe™V'`n*m<}_D⽵.yλx+yur9qV٭[e8uYen*UQ<#(>eo*Uv);VL=wYȻuܭ[y {]]­UvV٭[eew_UvV٭[e ew)6܃3WnRv^bjbeGUdBM}eJ+|zF)STkMu1ͦzLY#?рV+qRuZ٘Ҭ/a!4 J+]uS-4u7oLIdRd(V!ke[^O,rT%?e*PU B{^MEDMeFF8HTz)9}<}Dk~5eM Tu9f,Q6:HQ]9@k b vS?O"9%ĕ%ɸ ыQ̿ Mt~KOnX` 5<pedYB515N3_?3M/WhǫL^U'/![(o&(VTP;"*d|FrLkؐUVC Gx_4 ў4-iRQbFDlyd3qԬ揬9 [@? )3QhGfksq=渖[f@eKd>?3 AHM}-TFȫ}5 ~v\㚃{5<9t$`Gsgjz83tAkzXlQxs99PXs`AsdS]jkH_Xs`́5XsA(çlZIjXk5Y&Y_X{e3\|'jXs0’kњ^!X0?ԬI&EZŋXk`A5H"9f䊏g| I/BI k~I-u"H`][O$(kP fdn̚kj?́#$Brr9+kfn$<8s5QՁ\cP:%=\5ą̈,kTk!|>}`̚ k7ج7:Y7ׅe&/D$Tl뉦3 ŀ] D|Kox&XnmϿiyjY`M# M`b 6dm ?2`D>@|Xs0GԬ9`8'>2aAenY`ԍ6k[eI`ÕvLui]xpA;v:rWDn`C͚e&L+b< Pۅeeg킵 `Яa`> 3V Ng+070&]̵{0+yJlv1b1 CÎMu su?=A9VڃIكIĖOݳ5_"-~607ЊsZ!i_h#5wv8xCZk &` Fݒ oOHPtɚk9i_@x,`"X`AWhbs4Ld3®f `rX]~{73@f^T!hB͚阂 lrjxƕ&Aؕ'&aZӾY4F8p84]'Y*~cke&b%|>g} 5Y/4NAj"L"c5}>_݌JVLBj$@Q/4R(&^&7/,⽘IHfIVجHnj2/P9YI3@2bF7$σ ,BtŠEhň7L:wM5kѿur9:E؟ \aop N;q>?=oD?.%Q';f QdvPs7n枥Zbe|*_%?Zfpsij0wKW^UUg``iMqXY3N~<M٢nfENJ4t r5?V˧m~~ə'd{N"LBtUHy| 6%=g:yX*%}Ω )?2^&*17&YYo #lv w}^/ҋOKRɋ"R-)_u@6 rJڻIHYTC@S/Ln?'/{QXv*U Z<HBjma Be@n {!irJqvX%:s;NVoZ*]a Xd;aC_ ;O`CŐ~C'|+}I;z+VoztGx'xwi['4y[o5j#jy=G [o5j)i<vmc5V[}^\%?VGQf5zER /*X/?WWVm 0nHi|r+TAIzoߩ{$z ºmR 7lU>EGWNv/Weʾ}+V?{S2"n}5DSV!UuC67~fVf| lfտ^ey.ߊHT.?xEQY&ˢ.+FG#FewyT'^m4Rv5K?_zn}(")|vNcE>(+nn.Ti:>V|}V-xs@.6GЪOpvAU+UX>տgy(_;+U[ư tE\ -־24 FDoy|Y "h-Ï F-ە6ZSFCiSnŖl r D'kZvG[HL]Okk:.Cq0s[xң[ZǴ8D)9a aE KL,]CX 1s &"n!K` $1`7gBLB'γxx.j)j>xt=xbZZ[fjrgZg&:+4}sY{b$ع2]]NrU#aШJL0>+ԂWA@6+1Axx+=t?d`)ڸ?j0A=kEEuC#Wؔ\$j"3AY"33' fdV^md^e*2Yy&-p* 2#ѡgrU9$*?UƁ-:\Wsڥ+лI].?Q ! /Lm?'k&/Rv>\\ 8ZUQQW$ XiQG;wһמDnIoh~RI8|/U#woVR?]X͟Vf=X ~9;V[ݷStorxm!mC4HzQE%`1jdTTe,>F1rL$^`)u&_,@ `c`ϻRJȽ 1j?Aؾd^XͦR7:Ճ jB-;&+2\ A+Voz *﮽˛kUުUyVSg~V[**Ϟ~.*"cD~y|VRi@?"bV 2# {k粒㪼u[Oە7UA*?Ex|W~,_NA+V䯉|*;y_ [o # zd`UުUyVS}n g.R5=yU͔dC%Gqg>د@&M"VGyS@숽wĖFvu 6wy?uVgg=|Gi!|䑁5_TTCKEz4b*pݮ$'1jk%;̤? ƎiAYugʚՄcP s3NG~ XշE~ǏF*s@GQ˕9jltFwltjVN{H& |||mUnmRcymfxj/@RiHʯTR:& $*ߦd |5bCd[AFVDO:ΓFLx>'G΃BzփoᡍŃ^>|}R6ھIi<#eeg6Bon_)8J޹'kM82Y?}`$lϾKcl#ٵy\)Ukgڃ9{7qus~䌃/N$9𾮀]@~ԝ-2_+?`? ?p'UlVo֨ЬO]exOyܟ]3~Z2lM{&kM&[kMVݛNxcAd'1΂UV.] V[hWtQ}v}b?ǯ) \b^?w8?g?gpo'Sb[t8⸏{qC{~/D,R?WP0 DO3OL>Io\t.[<×įjn=SM~oP6}"_ @]<<ܛm0B꧎zg͎=pqOS>{ ߗ{~0g޾> W5~zW.@{7I|_-b98$RGEhD,"2K%C8|qV7Žs}UL XGY%:Mk+ϑ'*$0Oۿ' -hwkH{{^G{'R~wA#bm2ukݝkn{>rTlb{R=ʕڳo: ˋ{EW`A??m9d0cOd u]F%jHk"lE wC/K ]?o>ޞ|mX.؞my>Y#п&Y7|+?mbmhJwij{U\3=5h z4QakA/AYޛ0Mx&H7hݯpXdװj|_ rRlaYl?>O\8<䟱lj< s+3o1!|↸g\-7iM1 oWu[L2ePlgm)|m*;[xvװٛJ ۹F{sLhLbt)[ Գo7/#L,QÔe z%}pD-ٖэ/*KZM"=Y$ Fԯ,_/e=d&?ۻ'RLHUK}//.-' `rO>(~?bSkN{)i7\y {4k5O5ù!{@aƁBſy$c6rW |xbOӼoKK 151ΉfAp q7?>ak ~^υdW *ݳy5*Mӓ#XCruW΀}H_3WC[^W}mnZUe۪ +Ɉ:s( tLaŕ$Sʆ6qĤHf́Cue;3m9pЗrۡVRW?W0_ j1,@hGkz8zH=%ڿ65YߤA.eں~7׌QxM]8|dͮޞW Vv]ѣ+z6\beo+W5E!FC.Q<]._=] p?؂1LR; +p)"ĭϸÔϿ- ~ڬyiIy4n4 f(?%~yWⷯ@_+kA|?y-Ih }/ }QU[s@nZE;s[jZqD+".uiRV,6ᯜ2-*;ۡ>/f9 ps! |`ݻRfw]]{{& JM_4sC kט1(Yj.,))ϒKgmkwF%Wf6z {hkW=C;;ZcRgclu:bj]T rױj<m?;O zwew險7{O`[ |{g% W 'Vy8ޛ_;p%K|B[,QӾ`Ѯ`%7@QwDZF[|_1|?;tK\rx} Ñj}@46"~Ъ@4KȺ>m~@xxx|]x5+ם;E^Uw~9ݯ#\flG.r ݷ$Awtݧ@ ꍫpܧʑaNWeH3wp'~b?t7zdqK:V x\R2/o{J'SU.{|OU {p: #<|U@s6H4Ӛ@k Ú*:7q]UxWWU>hݽk6gj N.n|22zɦ@wX 71YuCu|m,{B J=Ds=LWmpoyo#>/Kx%~UJ^9kB?0ݑFY䮧k:V s^_t5Z KCE~<7hOœ;9eFo(D5H,bQO@]ОTj!ײdSG;̼h1906Y KNk;<I#6a m#x:RGSup$b!wdٌ_se2wlx}m}ucMlpj[a3ٮL.`;خW MsԱeneUmS{}kRBSx^y֟+|An ÉF󠼶igFuN C{X5D3swI.**۔%?L?(y2mJ6?$Iuwн\ LT@+6qAhHnƧJi3c» Lv?dZd&bO:6> jEەb)OӿUyH>PſT /Mhw0hx$4@l^Bٞfr2oH1DrVt_|_ OO~~s] —&h`B.UxmͻO p+ke{ۊ陾``>a۵C;l;>kۭշِkw=(1Iۮ@=,}]~>I3w^.;>5F eh?*NhʱZnL 0%x1";Y[W4SuM%v}. VkIenc8xsAw8*a 6*!!nX]C>sn#|D6 4*,<-54+Jxuy76kWg3 upK>@m3Y &<ѓJoD2^Gjy2LJj+#Q׊Yx^)1#r F;;>މL;)| c1x5Fh65;l3 -i[2W4"؝ޫvJ`s8w` v{aT߰vp\םzoL`wg;O Xo;^Q:*> ۱Ռ~Uv!YNܼG]Ǫ|O=^rN;nTUxә{77$vw!Xt.WއZ1Lw#`MPc^EBle|Um2;MʓP*z:5$nw{2X2zɦp^uy3Hs@?i2=)dSg?{';Ui[42zFGlup}lHw}p'+li<_Id4AW_K:At„Bpsתjչ0hLZ@]Ǫao,{+;>c޺:ޢǏcޕ?}kލMMzPb[&UlI=J== =I=KObOgWx* .W+x:2d%2.ȩWQ:SHQ`|A(t rn+rAx8Nm=–Hwq#)Lw%2SR{'e[,Bc߼'?L6^>υV|}pܟ ]ΰܧ}#s'Ib_~_r27 Vy>??X.OҴm?rϖ#ނ-)-SZէh>w`p4gmRZ?j čLI#1c4~I3pӜkBl U/)HiΎӜi-9=iΔF|U:)nt9_v"~y?Nn44IZG-^Mh-kGȁ~.rP/D+ );ZF廃Xq b$~ .BuF*n<h5fADBvm(SKd%R5`]n*vu $HͽB^xO6kEx [*F>PܶUCDo`5$UAt^;m.2iú_x%l("Ͱ)FFRDdQj ZNuK,s'ъcT]>ɕ38Է/kP!#@Pꞈ{y9?h`խP2Ne'x,;,;,;,;>{sJp}2X/NjB%/ڕL#ðg*IhތvdzՉTg珼e$d]G~]vV~;18ԛҥLycPԵowϿ^TN6fu%z]鏭nJ>?gLc<̓FL$E`"HiΛM鬺L'"ى ௜7{,;=Zlè Br'iS,iUl\)@n%+JTώVU*|Ԋ)j0)`~,6w/vpO'n~?9[~Ovsi\ofД H 'e$=pݗgEbTܙ]G:(tP0 ^X~jC$@=ÿm?o_ӡ[R(Q6;FX6O R_fAM;cv}bRv'}#?Inn-v. @fbX< ~ľE sDԃQh3VwCPT`*ۯq"/r#4:%?T`V*PH~ݕ9~~#! _@ p?? +;ۓV>3#CH''6in%F:d1 HgvWXnм7H{Zci U#i3h|qsn}ϥ&hߍՔ]E=o)㏼̧ݱ톸h:P8]HpB`V,hx%@ `ÌB_>+#J !p1HoEChCtцBRY.p \ @{@ZR.h*X~G&`B8JUb+{9y/&u1!Ӓo!Lr9B9[>9ӌ`_{ Wp!q/ϐ,ߓw* e8?~$}nthVħ?SL;*֞CT] φ$|\Hib@T;oQuT?)GNu?1e_Ft<|mҝឬ^pπ{p_U1po\|WeF| ݥƘK AGFc~A>{Xk>F2u=F2{~ Oc$c/?gM#d#m~uT6W1MmQ1 /xN?LjAg^""Fƽ:kLO؍Wᏹ~{'{ݽaδi?=3=h?ڇiJۭ$)=UfBGu6S4L`1yJ[x[h<6vfc@S8@>?'2>/JW zp_XO#*O3ׇ_ Dc~mM-{K&O( =T(AFMjG/ 4ՎҠ,iи2 d4%FHzi{?;D]E>Ǽ 0dʔ%aE=so=)Hͻā+IZ 983!#P->cJһ1HfiO3-|sWO'R |q&AJ'gA~C~7غM ?O@~Av:J@~"iߤG^A}tB^F[xćH~ ,ɩc޴>zz 7INWpPx[u ]=j@ [nrQOO߇_g ȯ[ ?ωu{?woo8j|߯_Հ¾ \zקjJ&?e=? O~'[ӯU0Nr̖&ua3d?%7qw/.?6ʄ+wvXJ+k}<9+L'? אF[zd?up2p0o$o )@_w#YH85C+&;?߹O| 4|og4?a^ ?!:=o:?A~珛rf䟂h@~__;;F^&?{{uw#_'s~z.3>y_LжQf| Jv? O7ά'xϣuuCX5>^og 0  byOo{:)ׯ1hoҷp ~oEaq'UlOP{5g|6aW/ϒ WF ?-WJVoHDݝ|t?{@K?Gg/}w>*dY#9U@hat?|go[HQKŗDN.(ݙvn;6(mж,ˑH|g_˷Vm'xF ŕXkka*\/_/e+XMBϪIX^N(d*|?L3CoC46_~)?LôS WRr&ayp%tXS:ea<ygoz޿dz'G=O;s@hWC)L} σw 7/!߬"n_.76^?v3~<_:'=#<7HtL}i>܆&A|'G|s}C >^~tα|. ??Yy Z dkּwЙχ7V=q㫶*[j |τgsLB|볺qYX/}?Lt.e,vܸG,Jf1\ֵm#ѶmouLk(ZbdwU]^'a 68} 1mG0ǐ`'cy|o㛘Ufl;7 ߣ 淓oE#Txp6ér 1| OO\ڼF3$<:P2!AZ껓Jwlvx ݧ6/?|2U'Ox&ݰL]ov j v >?=Ot5XF L}{.O!~i"QO4 Znjݠ,ng woT^X*بcicZ&HfǮIU]ʻ!ۮE]٥+'=ŮC|lT=vO|Y_J  5@ 8KIUGqR}NZA&҃J2 D*+` 0>eGA @  B,[A Lvj7.6kEGr ntM['CgVZ'DK̟XVBX.q1$ǐUَL"p KVfΘ`/ brqb?SX\5[nßȯ9F PZ*Ha{'l|ɛwpғΓ#]y~j{`ʽt<(d\4j {5Jz +ot /z 굂IAO P,v >Eů:/INhiu`x ;ħ[Xx)?_'v|=HO6hp_ ~ՎE9ȿ=ZcKE5b@߽dMv]勪>?/v?s9):T'ݛ2q7CJ{|om=@ _%`ovVvzWa7+@=@?]ۗK *44dkKcfHe 򍙽wK~e7&-~iL^+rWFP\W(ߕTӕfWzd݁IWF ]p_0[QWe2~r\ѩ} 4H]wq\'.SrF~.Vj#UK$ `8Kɳ.K"xXlOAJ=[F89= n%oުߐr9i9@ ˁ[|S/ͷ/_Nۗ߱B;..7y_nлpXptg`w9嫓qJيD*V 7v,e?Lo7|_НsFwо,\w%ҍF]\~\{x-7u-B#FۀXrĠih"j=_ŮVy3w/Wat>nv߯m&K.mJg5Yښ v@,ח7 eeQVS [ -n*&*MTΦwY@9$q+n{5r G?߯krLeB/ٚdCÍ>dNwlk}z]݁;wxo|goh7)"ڷhw";Nc4ځvhB;Y-闥` mٰ]îRet *pO+'5 ;tEٞˊ~>>鞒TO1zO,:~+Qb,#ؽ ?< qkS}S5~E`AvI{~ ) H@E)[GjB  NYc%\o6׵Qku\TNC U$@ _vծ,j~ U$L(rC"_H$ @w Zd$kiKjkNHQFk7u PK4,6~Kn9fIs?-H0#(=&~'c$7Q\[uOq܂ߜ'؍g-~cyG)EM)5SՁ?h:(;Eu]a~㮊:gg=U^FUZLA_$f=\QaaxTRMW&RO 3N;>p(Lw{S拓\|V>?y9;]\AP |-]I10?0%&FDn JypQhP+dy]z(^APۊ]:%ydM_nW𓧞~Q=OsDŸ$:_EW'`x:c4pbM7sMئAJ ⻽ңuy@ dV8K*Vaouܠu܎k r rmK:nY.MtbY ;'gVrR/.N8O)q4x|s?5`_њư=`AOu$C@`{+ߙnT *X%*x]e[Fi[2'?C  }AuV}0'/4<# j ړd2?y) }IÇqOf)OHu9?v͇r"aD3/sڧLQ$Mc.q,EBB&T~° \h)/ ZK3ȃ.P. Ae( _38b+ k- c+Vh=V"!* QSh!)\3TNZV,( *ʠ2 y zL%I-Թ_W yXI)3 u~֛іPTy֗V1T*q"">J YK0^(%^8RЇCP>@3Ur"Tj7/䒎W \RPY(Œ'٪:L20i, w@&ʓ{ތ%q W,:]y[}>ɒ&R$Kj0yEOADiyB8U RK!))V@(BH kl߈)!R<@)+wi[`.P\0G֧}j LPz:AUq?0WqK i}2XfHۇa [UoQGe2Ab1q-=Тa ͚% +%9DZf ]~`,YH,kgÂF+.%C8廊$U+_#DA4sǯ) D#8/-KΊs3]03%'CΨ6N;8J%Fa]0oc7\lW ex~"?ek[tAno-ݧ=>ٸ$廑{T _|;b޷+wGpﺹo ~fKZw,Kv33aߵ<;?I`әw+y{۾zNht|e @F>GL5S*1VK3aᵦ;,<>IbgZ$U&%1t|;%7׫åIuQr#J(?;QC4nOIn{Aٕ/ЂhedSkJxܔ:2*ud ;2*tdwd"#QkZ6 yca3(vv._/c/*WCR{ߥŭfė\7rmp\J[ֿd7b OJ܂8016o<  +Ȃj{ZVh3m5i 4jS܈mʿ[ܣEأ,ߣr!ơGޣUPG ˸%߼U@}ZMg9o|9^~ۍٔNLZxDB֍c f6è X[Qm"Xe7ЭۘxSnZw7,++[:3C~vwɉ~Uou7466 v`7ح>tgwv2`7]nk* p1W^7k~k{/o{x3CCeKwg@}H7^UÀa =xbGK9xAbs\s0񏍿x\:xE|C2p1zɮBݪ=o=7$߷[~ׅ~/@$Mto n9#ya+Dȯ(" W{ce7ڬ.[}27W = 6_Q!Ol㐂F!OlEIo`ɛSd hI֜vnubqG5/$zίh(W 'wb z,e0?!Y/c4n8ݸ^(Vy{~ʰd``gF^"7orטR~H׶y^&ׂ!sJK%J?߻|U: d~Y_j(IfLK%40'T  %㶊|i2RN7KsK7|RZa</ ӽ,(۽U"`,* *Q=rZU)+&LâAzրUi݋-5 Y"1׈?ZN&q!gAX yclq㱚JZ(N5JҵdY_W`=wb|?>Yx Wn3ISK>9/AX^NۋsHu?(մDHׇ AL\$F D"1YV2#CHf{n6ĴzF& #H B$n+vutć 6xUI0̢ uONxo_~ a*NQSH$R$4zQPoߞ[=HX t]zGҪvqPhp|7kWoѮ|Я`ɣߴ%is&|x tKi4<ԝw TmH,kH*ބA7$4X@:@A#xF݁t>WgtHVy/oJ4nRXqי ?yYl9 cĈfy78K|Mn0|wVܟ<;G^w{9G@8[j'O^t{'%z0$Ո 4Wʩ9Bo_ ,ԱVAڏAu?F~)Y D" 7i3Fiڌj3Ffl+Otȡ0͎( (DNJdů ig5ۖB,EE;!2X[0wThI .HtnI5tL;]vy։m'6b=߽_l݋Ї S#k!jVB!5Ā_,Xo!p tD38HE .B{#yKBx@HtX^a'Q6IҹLeYz(^5@"p)HHS"&P_BHoa,eI iD8r|pq"pzx'xu80偵cw}g_xS`ҸQuI"-4W7Ҿ5-V C(QAh7_W-6yo"#k仦&w^Sӟ*ӓQcO'C"*$nisC4$7d*4Qi"+G@ʸ߼c]~SE ldR;2៱H LH]_&n=w|ot@6[Uvպ( mWinH(8n|WjArŮa­W$o\o3Ngџ&L%鹂ҼT"٭~Bc Rx}8/~+SAp~oH9qyp7?jɯ 7b |+[Еw_$?LZ@knAx,o1'/Wxd> ߲|z^1+l1k ?Gh~j"NüżQ?ד.:'kyW0_v XWT?ѰzZ@?h3=&6ok~i^R|:JU 8pD /gqb'w2 8d<8x|m4isL%W} xqɕ¿}x D||*Hd@<SD*!~@ x0~ڌW9|5cU;c-R4 x>k,Ifىců8@T΃Cq>zh׌y}|`yAH^ 揀skbgFV#h /\60M0^sj!^{Ÿ_cmDe> N<<('?wG`nx0g0 gԢ2)`<3 OConؗ߰;/ (߫pӏ?C7fN%7Sp^'yp~(,א~}ZU!1u}dT}\7rڛIJ)*sMޜA ѥ7#:g3(6fИ?!5 L dC,7O1'ʍY`,>YH<'SF\/g;vT.t/~%UDYh,с'ofdXL !;&4į#^5V~::`80N, 03I_~"˦XfIIS9$--$$8m'|~ _p9r+$WH̯]Î=lnubz8OJdMyYm P%&9lh\YqֈJv*V 8)Hgw.vwaCcaӑ^8,܄ih\ZȇUG. ׇˏ|.|p@>IwK9}`;諒lK6d[ؓC~̏HA/Uy 5 y-~iuK|eK%&aǴgZ 4"B3!PM`&3tkvǝT!eRK^?V5s"9Fe|ωʡbg:_(XM_)+CZ؄NYK{<w05Bh_??x)p6㑻8zT8DٿZŝ}-;Vz=\|d^؟Ib_\dSNyq&x%?U@~v)aJ{ T2!nB+P`]Wͅ]L *V 0}4-alakazam/inst/extdata/example_quality.tsv0000644000176200001440000000403214007007324020377 0ustar liggesuserssequence_id sequence rev_comp productive v_call d_call j_call sequence_alignment germline_alignment junction junction_aa v_cigar d_cigar j_cigar stop_codon vj_in_frame locus junction_length np1_length np2_length v_sequence_start v_sequence_end v_germline_start v_germline_end d_sequence_start d_sequence_end d_germline_start d_germline_end j_sequence_start j_sequence_end j_germline_start j_germline_end consensus_count duplicate_count c_call CGCTTTTCGGATTGGAA GGCTTTCTGAGAGTCATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCACCTGCAGGAGTCGGGCCCAGGACTGGTGACGCCTTCGGAGACCCTGTCCCTCAGTTGCACTGTCTCTGGTGGCTCCATCAGTCGCCACTACTGGAACTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGACTATTTATTATAGTGGGGGTAGTGGGACAACCTACTCCAACCCGTCCCTCAAGAGTCGACTCACCATATCGGTAGAGACGTCCAAGAATCAGATCTCCCTGAAGTTGAGGTCTGTGACCGCCGCAGACACGGCTGTGTATCACTGTGCGAGAGGAACCGACTTGGTTACGGGAGTTATTGACCCCTTTGACTACTGGGGCCAGGGAATCCTGGTCAGCGTCTCCTCAGGGAGTGCATCCGCCCCAACCCTTTTCCC FALSE TRUE IGHV4-39*01 IGHD3-10*01 IGHJ4*02 CAGCTGCACCTGCAGGAGTCGGGCCCA...GGACTGGTGACGCCTTCGGAGACCCTGTCCCTCAGTTGCACTGTCTCTGGTGGCTCCATCAG-......-----TCGCCACTACTGGAACTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGACTATTTATTATAGT.........GGGGGTACCTACTCCAACCCGTCCCTCAAG...AGTCGACTCACCATATCGGTAGAGACGTCCAAGAATCAGATCTCCCTGAAGTTGAGGTCTGTGACCGCCGCAGACACGGCTGTGTATCACTGTGCGAGAGGAACCGACTTGGTTACGGGAGTTATTGACCCCTTTGACTACTGGGGCCAGGGAATCCTGGTCAGCGTCTCCTCAG CAGCTGCAGCTGCAGGAGTCGGGCCCA...GGACTGGTGAAGCCTTCGGAGACCCTGTCCCTCACCTGCACTGTCTCTGGTGGCTCCATCAGC......AGTAGTAGTTACTACTGGGGCTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGAGTATCTATTATAGT.........GGGAGCACCTACTACAACCCGTCCCTCAAG...AGTCGAGTCACCATATCCGTAGACACGTCCAAGAACCAGTTCTCCCTGAAGCTGAGCTCTGTGACCGCCGCAGACACGGCTGTGTATTACTGTGCGAGANNNNNNNNNNTGGTTCGGGGAGTTATTNNNNNCTTTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAG TGTGCGAGAGGAACCGACTTGGTTACGGGAGTTATTGACCCCTTTGACTACTGG CARGTDLVTGVIDPFDYW 93S8=1X28=1X23=2X26=6I1=1X1=2X8=2X44=1X3=1X12=1X1=1X1=9D6=1X22=1X10=1X5=1X11=1X3=1X11=1X4=1X30=1X11= 403S9N5=2X10= 425S4N23=1X8=1X11= FALSE TRUE IGH 54 10 5 94 393 1 318 404 420 10 26 426 469 5 48 12 1 IGHMalakazam/inst/extdata/example_changeo.tab.gz0000644000176200001440000000441314007007324020667 0ustar liggesusers0_example_changeo.tab\Ks8>kŜSKʲ MRKjOݪU/!Ta1$}_d~첵3fAe)/+jomr6x\W߫_7jncwk=l͟ϔyx\gfOZz`7nwųeV-9h} v&ҥ&J֢u ҆p{{kno`czG`CiS7|";m-<\t8?ΕCqu/|FcH)vsߠ{Gnh,GD]|<ݺM: RKt|:tH| uH& O'z[|62d{vxTMuQş+5) R@~Y_' F#abbME:3P@kB |BzX4|+o Ui$vE f7rGҿ DZēm$'p:MI-ѡaga6C9ӎ&YS 9$ϘD-I%F9z澁8'ɲ7!3"ZU(\ZGr1Us!u+2\>t2'XN.k'9A(OTw,c#j{E5j[v̸8/-)bB11`~\oiE>y *ucpQ`Ɨ2Y>IcЧp\(R `-p?S0R. |u`Ɨ2vZm9̗(+m^a bb=i}i &xic te9JrIt\30S9V҃t|L_*&y=.Z 4M4 eL>78Ʒy2~^]JAL5lR+(6# ( \fƢp\|򲹰`ڔ|鍰|*edKjzY& Z8 RR/"BgX|NztFӉS8#uFUͻxGmW5k%E\teh\6Yr.}j K_&1^Wzjz*)-Gb V` 09dFlN.zc |wK. x+ors Ӟ<2BÒy.[t\N+)~fNs?B5[]gNƛBR?+ TN;ރث:>Jdx;]D1{‹1x+pOJ#wy g̹gEvE-hYc${ƟSbv)_ZDqZ4uNyBES:hBpxdK4CbZs\ZSќ:#(}<\\P++y%]^f.~LpɗC+C\9|vG|r|U%]2寑)GdXɔ㲘Cf]d'.~a'zN4]kp|Uxl6&A$3} c)a ])޿#Wa"}ŏoG?72E]W6'%m `,Lõ>m%aY];:5dO6~Ww鰅n4xxn0z2Bi TϭdXV(x{~߯һݯP 5unmmz uVny yPw uA_Ke@/na㯏 al0ŸwT~U`IS^;{OUة{IiӣWcalakazam/inst/extdata/example_quality.fastq0000644000176200001440000000203714007007324020704 0ustar liggesusers@CGCTTTTCGGATTGGAA|C_CALL=IGHM|CONSCOUNT=12|DUPCOUNT=1 GGCTTTCTGAGAGTCATGGATCTCATGTGCAAGAAAATGAAGCACCTGTGGTTCTTCCTCCTGCTGGTGGCGGCTCCCAGATGGGTCCTGTCCCAGCTGCACCTGCAGGAGTCGGGCCCAGGACTGGTGACGCCTTCGGAGACCCTGTCCCTCAGTTGCACTGTCTCTGGTGGCTCCATCAGTCGCCACTACTGGAACTGGATCCGCCAGCCCCCAGGGAAGGGGCTGGAGTGGATTGGGACTATTTATTATAGTGGGGGTAGTGGGACAACCTACTCCAACCCGTCCCTCAAGAGTCGACTCACCATATCGGTAGAGACGTCCAAGAATCAGATCTCCCTGAAGTTGAGGTCTGTGACCGCCGCAGACACGGCTGTGTATCACTGTGCGAGAGGAACCGACTTGGTTACGGGAGTTATTGACCCCTTTGACTACTGGGGCCAGGGAATCCTGGTCAGCGTCTCCTCAGGGAGTGCATCCGCCCCAACCCTTTTCCC + {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{]{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ alakazam/inst/CITATION0000644000176200001440000000411013667727155014164 0ustar liggesusersbibentry(bibtype = "Article", style = "citation", header = "To cite the alakazam package in publications, please use:", title = "Change-O: a toolkit for analyzing large-scale B cell immunoglobulin repertoire sequencing data.", author = c(person("Namita T.", "Gupta"), person("Jason A.", "Vander Heiden"), person("Mohamed", "Uduman"), person("Daniel", "Gadala-Maria"), person("Gur", "Yaari"), person("Steven H.", "Kleinstein")), year = 2015, journal = "Bioinformatics", pages = "1-3", doi = "10.1093/bioinformatics/btv359") bibentry(bibtype = "Article", style = "citation", header = "To cite the Ig-specific lineage reconstruction and diversity methods, please use:", title = "B cells populating the multiple sclerosis brain mature in the draining cervical lymph nodes.", author = c(person("Joel N. H.", "Stern"), person("Gur", "Yaari"), person("Jason A.", "Vander Heiden"), person("George", "Church"), person("William F.", "Donahue"), person("Rogier Q.", "Hintzen"), person("Anita J.", "Huttner"), person("Jon D.", "Laman"), person("Rashed M.", "Nagra"), person("Alyssa", "Nylander"), person("David", "Pitt"), person("Sriram", "Ramanan"), person("Bilal A.", "Siddiqui"), person("Francois", "Vigneault"), person("Steven H.", "Kleinstein"), person("David A.", "Hafler"), person("Kevin C.", "O'Connor")), year = 2014, journal = "Science Translational Medicine", number = 248, volume = 6, pages = "248ra107", doi = "10.1126/scitranslmed.3008879")